|
@@ -146,21 +146,13 @@ int dma_ch = -1; // DMAチャンネル
|
|
|
dma_channel_config dma_conf; // DMA設定
|
|
dma_channel_config dma_conf; // DMA設定
|
|
|
volatile bool dma_in_prgress = false; // DMA転送中フラグ
|
|
volatile bool dma_in_prgress = false; // DMA転送中フラグ
|
|
|
|
|
|
|
|
-// ワンショットタイマー遅延呼び出し用
|
|
|
|
|
-int64_t schedule_deferred_call(alarm_id_t id, void *user_data)
|
|
|
|
|
-{
|
|
|
|
|
- // DMA転送中フラグを落とす
|
|
|
|
|
- dma_in_prgress = false;
|
|
|
|
|
- return 0;
|
|
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
// DMA割り込み
|
|
// DMA割り込み
|
|
|
void dma_irq_handler()
|
|
void dma_irq_handler()
|
|
|
{
|
|
{
|
|
|
dma_channel_acknowledge_irq0(dma_ch);
|
|
dma_channel_acknowledge_irq0(dma_ch);
|
|
|
- // 遅延を入れないと死ぬ
|
|
|
|
|
- // ワンショットタイマーで20マイクロ秒後にフラグを落とす
|
|
|
|
|
- add_alarm_in_us(20, schedule_deferred_call, NULL, true);
|
|
|
|
|
|
|
+ // DMA転送中のフラグを落とす
|
|
|
|
|
+ dma_in_prgress = false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
uint8_t *string_line_buffer[2]; // 1行バッファ
|
|
uint8_t *string_line_buffer[2]; // 1行バッファ
|
|
@@ -196,6 +188,11 @@ void draw_font_in_buffer(font_gryph_t *gryph, int x, int y)
|
|
|
// 文字列描画用DMA設定関数
|
|
// 文字列描画用DMA設定関数
|
|
|
void configure_dma_channel(void)
|
|
void configure_dma_channel(void)
|
|
|
{
|
|
{
|
|
|
|
|
+ // DMA用のダブルバッファを確保しておく
|
|
|
|
|
+ size_t line_buffer_size = TFT_WIDTH * pfn->get_max_font_height() * TFT_BYTES_PER_PIXEL;
|
|
|
|
|
+ string_line_buffer[0] = (uint8_t *)malloc(line_buffer_size);
|
|
|
|
|
+ string_line_buffer[1] = (uint8_t *)malloc(line_buffer_size);
|
|
|
|
|
+
|
|
|
dma_ch = dma_claim_unused_channel(true);
|
|
dma_ch = dma_claim_unused_channel(true);
|
|
|
dma_conf = dma_channel_get_default_config(dma_ch);
|
|
dma_conf = dma_channel_get_default_config(dma_ch);
|
|
|
channel_config_set_transfer_data_size(&dma_conf, DMA_SIZE_16);
|
|
channel_config_set_transfer_data_size(&dma_conf, DMA_SIZE_16);
|
|
@@ -239,7 +236,12 @@ void render_string(const char *str, int x, int y)
|
|
|
return;
|
|
return;
|
|
|
|
|
|
|
|
// 前のDMAを待つ
|
|
// 前のDMAを待つ
|
|
|
- while(dma_in_prgress);
|
|
|
|
|
|
|
+ while(dma_in_prgress) {
|
|
|
|
|
+ // SSPのTX FIFOが空になるまで待つ
|
|
|
|
|
+ while(!(spi_get_hw(SPI_PORT)->sr & 1));
|
|
|
|
|
+ // 少し間を空けないと死ぬ
|
|
|
|
|
+ sleep_us(20);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
// SST77xxコマンド発行
|
|
// SST77xxコマンド発行
|
|
|
uint8_t cmd_param[4] = {0,0,0,0};
|
|
uint8_t cmd_param[4] = {0,0,0,0};
|
|
@@ -252,7 +254,7 @@ void render_string(const char *str, int x, int y)
|
|
|
sst7735_send_cmd(SSTCMD_RASET); // Row Address Set
|
|
sst7735_send_cmd(SSTCMD_RASET); // Row Address Set
|
|
|
sst7735_send_data8(cmd_param, 4);
|
|
sst7735_send_data8(cmd_param, 4);
|
|
|
sst7735_send_cmd(SSTCMD_RAMWR); // RAM RW mode
|
|
sst7735_send_cmd(SSTCMD_RAMWR); // RAM RW mode
|
|
|
- sleep_us(50);
|
|
|
|
|
|
|
+ sleep_us(20);
|
|
|
|
|
|
|
|
gpio_put(TFT_DC, TFT_DATA);
|
|
gpio_put(TFT_DC, TFT_DATA);
|
|
|
spi_set_format (SPI_PORT, 16, SPI_CPOL_1 , SPI_CPHA_1,SPI_MSB_FIRST );
|
|
spi_set_format (SPI_PORT, 16, SPI_CPOL_1 , SPI_CPHA_1,SPI_MSB_FIRST );
|
|
@@ -306,13 +308,10 @@ int main()
|
|
|
// フォントが正しく読み込めたかチェック
|
|
// フォントが正しく読み込めたかチェック
|
|
|
if (pfn->isValid()) {
|
|
if (pfn->isValid()) {
|
|
|
printf("Font loaded successfully.\n");
|
|
printf("Font loaded successfully.\n");
|
|
|
-
|
|
|
|
|
- size_t line_buffer_size = TFT_WIDTH * pfn->get_max_font_height() * TFT_BYTES_PER_PIXEL;
|
|
|
|
|
- string_line_buffer[0] = (uint8_t *)malloc(line_buffer_size);
|
|
|
|
|
- string_line_buffer[1] = (uint8_t *)malloc(line_buffer_size);
|
|
|
|
|
|
|
|
|
|
// render_string()を使用する前にかならずconfigure_dma_channel()を呼ぶこと
|
|
// render_string()を使用する前にかならずconfigure_dma_channel()を呼ぶこと
|
|
|
configure_dma_channel();
|
|
configure_dma_channel();
|
|
|
|
|
+
|
|
|
int x = 0, y = 0;
|
|
int x = 0, y = 0;
|
|
|
while (true) {
|
|
while (true) {
|
|
|
back_color = TFT_COLOR_BLACK;
|
|
back_color = TFT_COLOR_BLACK;
|