From dfc88605c435ace75a7e723350320243caa08bdd Mon Sep 17 00:00:00 2001 From: Mahyar Koshkouei Date: Mon, 28 Mar 2022 19:43:53 +0100 Subject: [PATCH] Use window on LCD Signed-off-by: Mahyar Koshkouei --- src/main.c | 63 +++++++++++++++++++++++++++++++++++++++--------- src/mk_ili9225.c | 26 +++++++++----------- 2 files changed, 64 insertions(+), 25 deletions(-) diff --git a/src/main.c b/src/main.c index 661e5a4..0ac6ef5 100644 --- a/src/main.c +++ b/src/main.c @@ -148,7 +148,7 @@ void core1_lcd_draw_line(const uint_fast8_t line) [pixels_buffer[x] & 3]; } - mk_ili9225_set_address(line + 15, 0xDB - 30); + //mk_ili9225_set_address(line + 15, 0xDB - 30); //mk_ili9225_set_x(line + 15); #if USE_DMA mk_ili9225_write_pixels_start(); @@ -194,7 +194,8 @@ void main_core1(void) #endif /* Set LCD window to DMG size. */ - //mk_ili9225_set_window(15, LCD_HEIGHT+15, 29, LCD_WIDTH+29); + mk_ili9225_set_window(15, LCD_HEIGHT + 15 - 1, + 30, LCD_WIDTH + 30 - 1); while(1) { @@ -232,8 +233,8 @@ void lcd_draw_line(struct gb_s *gb, const uint8_t pixels[LCD_WIDTH], cmd.data = line; //__atomic_store_n(&lcd_line_busy, 1, __ATOMIC_SEQ_CST); - //__aeabi_memcpy4(pixels_buffer, pixels, LCD_WIDTH / 4); - memcpy(pixels_buffer, pixels, LCD_WIDTH); + __aeabi_memcpy4(pixels_buffer, pixels, LCD_WIDTH / 4); + //memcpy(pixels_buffer, pixels, LCD_WIDTH); multicore_fifo_push_blocking(cmd.full); } @@ -314,6 +315,9 @@ int main(void) } while(HEDLEY_LIKELY(gb.gb_frame == 0)); frames++; + + /* Required since we do not know whether a button remains + * pressed over a serial connection. */ gb.direct.joypad = 0xFF; input = getchar_timeout_us(0); if(input == PICO_ERROR_TIMEOUT) @@ -341,29 +345,35 @@ int main(void) #endif case 'c': { + static ili9225_color_mode_e mode = ILI9225_COLOR_MODE_FULL; union core_cmd cmd; + + mode = !mode; cmd.cmd = CORE_CMD_IDLE_SET; - cmd.data = ILI9225_COLOR_MODE_FULL; + cmd.data = mode; multicore_fifo_push_blocking(cmd.full); break; } case 'i': { - union core_cmd cmd; - cmd.cmd = CORE_CMD_IDLE_SET; - cmd.data = ILI9225_COLOR_MODE_8COLOR; - multicore_fifo_push_blocking(cmd.full); + gb.direct.interlace = !gb.direct.interlace; break; } case 'b': { uint64_t end_time; + uint32_t diff; + uint32_t fps; + end_time = time_us_64(); + diff = end_time-start_time; + fps = frames/diff; printf("Frames: %u\n" - "Time: %llu us\n", - frames, end_time-start_time); + "Time: %lu us\n" + "FPS: %lu\n", + frames, diff, fps); stdio_flush(); frames = 0; start_time = time_us_64(); @@ -371,11 +381,42 @@ int main(void) } case '\n': + case '\r': { gb.direct.joypad_bits.start = 0; break; } + case '\b': + { + gb.direct.joypad_bits.select = 0; + break; + } + + case '8': + { + gb.direct.joypad_bits.up = 0; + break; + } + + case '2': + { + gb.direct.joypad_bits.down = 0; + break; + } + + case '4': + { + gb.direct.joypad_bits.left= 0; + break; + } + + case '6': + { + gb.direct.joypad_bits.right = 0; + break; + } + case 'z': { gb.direct.joypad_bits.a = 0; diff --git a/src/mk_ili9225.c b/src/mk_ili9225.c index f242def..dfc091f 100644 --- a/src/mk_ili9225.c +++ b/src/mk_ili9225.c @@ -387,21 +387,19 @@ unsigned mk_ili9225_init(void) { MK_ILI9225_REG_DRIVER_OUTPUT_CTRL, 0x011C }, /* Set LCD inversion to disabled. */ { MK_ILI9225_REG_LCD_AC_DRIVING_CTRL, 0x0100 }, - /* Use BGR mode (swap blue with red). - * Increment vertical and horizontal address. - * Use vertical image. - * FIXME: Why is BGR enabled? */ - { MK_ILI9225_REG_ENTRY_MODE, 0x0008 }, + /* Increment vertical and horizontal address. + * Use vertical image. */ + { MK_ILI9225_REG_ENTRY_MODE, 0x0018 }, /* Turn off all display outputs. */ { MK_ILI9225_REG_DISPLAY_CTRL, 0x0000 }, /* Set porches to 8 lines. */ - { MK_ILI9225_REG_BLANK_PERIOD_CTRL, 0x0808 }, + { MK_ILI9225_REG_BLANK_PERIOD_CTRL, 0x0808 }, /* Use 1-clock delay to gate output and edge. */ - { MK_ILI9225_REG_FRAME_CYCLE_CTRL, 0x1100 }, + { MK_ILI9225_REG_FRAME_CYCLE_CTRL, 0x1100 }, /* Ignore RGB interface settings. */ - { MK_ILI9225_REG_INTERFACE_CTRL, 0x0000 }, + { MK_ILI9225_REG_INTERFACE_CTRL, 0x0000 }, /* Set oscillation frequency to 266.6 kHz. */ - { MK_ILI9225_REG_OSC_CTRL, 0x0701 }, + { MK_ILI9225_REG_OSC_CTRL, 0x0701 }, /* Set VCI recycling to 2 clocks. */ { MK_ILI9225_REG_VCI_RECYCLING, 0x0020 }, /* Initialise RAM Address to 0x0 px. */ @@ -409,7 +407,7 @@ unsigned mk_ili9225_init(void) { MK_ILI9225_REG_RAM_ADDR_SET2, 0x0000 }, /* Set scanning position to full screen. */ - { MK_ILI9225_REG_GATE_SCAN_CTRL, 0x0000 }, + { MK_ILI9225_REG_GATE_SCAN_CTRL, 0x0000 }, /* Set end scan position to 219 + 1 px (0xDB). */ { MK_ILI9225_REG_VERT_SCROLL_CTRL1, 0x00DB }, /* Set start scan position to 0 px. */ @@ -422,10 +420,10 @@ unsigned mk_ili9225_init(void) /* Set partial screen driving start to 0 px. */ { MK_ILI9225_REG_PART_DRIVING_POS2, 0x0000 }, /* Set window to 176 x 220 px (full screen). */ - { MK_ILI9225_REG_HORI_WIN_ADDR1, 0x00AF }, - { MK_ILI9225_REG_HORI_WIN_ADDR2, 0x0000 }, - { MK_ILI9225_REG_VERT_WIN_ADDR1, 0x00DB }, - { MK_ILI9225_REG_VERT_WIN_ADDR2, 0x0000 }, + { MK_ILI9225_REG_HORI_WIN_ADDR1, 0x00AF }, + { MK_ILI9225_REG_HORI_WIN_ADDR2, 0x0000 }, + { MK_ILI9225_REG_VERT_WIN_ADDR1, 0x00DB }, + { MK_ILI9225_REG_VERT_WIN_ADDR2, 0x0000 }, /* Gamma curve data. */ { MK_ILI9225_REG_GAMMA_CTRL1, 0x0000 },