From ee3cd7b60c1e580a8179b769c82429d7d662fd6a Mon Sep 17 00:00:00 2001 From: Lephenixnoir Date: Sun, 5 Feb 2023 15:41:52 +0100 Subject: [PATCH] gint/usb: add alignment test, remove unit_size parameters --- assets-fx/img/opt_gint_usb.png | Bin 4550 -> 10060 bytes src/gint/dump.c | 4 +- src/gint/usb.c | 114 ++++++++++++++++++++++++++------- src/gint/usbtrace.c | 20 +++--- 4 files changed, 103 insertions(+), 35 deletions(-) diff --git a/assets-fx/img/opt_gint_usb.png b/assets-fx/img/opt_gint_usb.png index 63f43e48abd7782b75275ac1468ea0669237c566..dc345b7107143fb0c436577837a87f0c5cc70bbc 100644 GIT binary patch literal 10060 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 BANBwM delta 4543 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 #include #include +#include #include #include #include @@ -20,6 +21,7 @@ #include #include +#include #include #define USB SH7305_USB @@ -31,6 +33,11 @@ static int log_pos; static int const log_lines = _(8,15); static int volatile log_interrupt = 0; +struct alignment_write_data { + uint32_t al4_shbuf[4]; + uint8_t al4_shbuf_size[4]; +}; + static void reset_logger(void) { memset(log_buffer, 0, LOG_SIZE); @@ -263,13 +270,29 @@ static void draw_pipes(void) #endif } -static void draw_tests(void) +static void draw_tests(GUNUSED struct alignment_write_data *data) { +#ifdef FX9860G + dprint(1, 8, C_BLACK, "1: Screenshot"); + dprint(1, 14, C_BLACK, "2: Async screenshot"); + dprint(1, 20, C_BLACK, "3: Send text"); + dprint(1, 26, C_BLACK, "4: Send USB log"); + dprint(1, 32, C_BLACK, "5: FIFO alignm. test"); +#endif + #ifdef FXCG50 row_print(1, 1, "[1]: Take screenshot (fxlink API)"); row_print(2, 1, "[2]: Take screenshot (asynchronous)"); row_print(3, 1, "[3]: Send some text (fxlink API)"); row_print(4, 1, "[4]: Send some logs (fxlink API)"); + row_print(5, 1, "[5]: Pipe write alignment tests"); + + /* for(int i = 0; i < 4; i++) { + int col = 1 + 20 * (i & 1); + int row = 7 + (i/2); + row_print(row, col, "%08x(%d)", + data->al4_shbuf[i], data->al4_shbuf_size[i]); + } */ #endif } @@ -294,7 +317,7 @@ static void screenshot_async_2(void) { int pipe = usb_ff_bulk_output(); GUNUSED int rc = usb_write_async(pipe, gint_vram, _(1024, 396*224*2), - 4, true, GINT_CALL(screenshot_async_3)); + true, GINT_CALL(screenshot_async_3)); USB_LOG("write_async 2: %d\n", rc); } static void screenshot_async(void) @@ -311,11 +334,49 @@ static void screenshot_async(void) if(!usb_fxlink_fill_header(&header, "gintctl", "asyncscreen", data_size)) return; - GUNUSED int rc = usb_write_async(pipe, &header, sizeof header, 4, - false, GINT_CALL(screenshot_async_2)); + GUNUSED int rc = usb_write_async(pipe, &header, sizeof header, false, + GINT_CALL(screenshot_async_2)); USB_LOG("write_async 1: %d\n", rc); } +static void alignment_write_tests(GUNUSED struct alignment_write_data *data) +{ + GALIGNED(4) static char const str[] = + "Alright let's get usb_pipe_write4 and usb_pipe_flush4 out of the way " + "so we can move on to IN pipes.\n"; + + for(int i = 0; i < 1; i++) { + char const *text = str; + int size = 96; + + int pipe = usb_ff_bulk_output(); + usb_fxlink_header_t header; + usb_fxlink_fill_header(&header, "fxlink", "text", size); + usb_write_sync(pipe, &header, sizeof header, false); + + // int j = 0; + while(size > 0) { + int s = rand() % 9; + s = max(s, 1); + s = min(s, size); + USB_LOG("%d bytes remain, doing %d\n", size, s); + + usb_write_sync(pipe, text, s, false); + text += s; + size -= s; + + /* if(j < 4) { + extern asyncio_op_t pipe_transfers[10]; + data->al4_shbuf[i] = pipe_transfers[5].shbuf; + data->al4_shbuf_size[i] = pipe_transfers[5].shbuf_size; + } + j++; */ + } + + usb_commit_sync(pipe); + } +} + //--- // Main function //--- @@ -327,8 +388,11 @@ void gintctl_gint_usb(void) int open = usb_is_open(); GUNUSED int scroll0=0, scroll2=0, maxscroll2=0; + struct alignment_write_data awd = { 0 }; + reset_logger(); usb_set_log(usb_logger); + srand(0xc0ffee); while(key != KEY_EXIT) { @@ -346,10 +410,13 @@ void gintctl_gint_usb(void) if(tab == 1) draw_context(); if(tab == 2) maxscroll2 = draw_log(scroll2); if(tab == 3) draw_pipes(); - if(tab == 4) draw_tests(); + if(tab == 4) draw_tests(&awd); #ifdef FXCG50 - row_title("USB 2.0 function module and communication"); + if(tab == 2) + row_title("USB logs (SHIFT+7 to save to file)"); + else + row_title("USB 2.0 function module and communication"); fkey_menu(1, "REGS"); fkey_menu(2, "CTX"); fkey_menu(3, "LOG"); @@ -358,13 +425,12 @@ void gintctl_gint_usb(void) fkey_action(6, open ? "CLOSE" : "OPEN"); #endif -// dprint_opt(DWIDTH - 8, DHEIGHT - 6, C_BLACK, C_NONE, DTEXT_RIGHT, -// DTEXT_BOTTOM, "Interrupts: %d", usb_interrupt_count); - dfont(old_font); dupdate(); - key = getkey_opt(GETKEY_DEFAULT, &log_interrupt).key; + key_event_t ev; + ev = getkey_opt(GETKEY_DEFAULT, &log_interrupt); + key = ev.key; /* Scroll down log automatically at the cost of a redraw */ if(log_interrupt == 1 && tab == 2) @@ -376,9 +442,7 @@ void gintctl_gint_usb(void) if(key == KEY_F2) tab = 1; if(key == KEY_F3) tab = 2; if(key == KEY_F4) tab = 3; - - if(tab == 2 && key == KEY_F5) - gint_world_switch(GINT_CALL(save_logger)); + if(key == KEY_F5) tab = 4; if(key == KEY_F6) { @@ -403,36 +467,40 @@ void gintctl_gint_usb(void) scroll2 = max(scroll2 - scroll_speed, 0); if(tab == 2 && key == KEY_DOWN) scroll2 = min(scroll2 + scroll_speed, maxscroll2); + if(tab == 2 && ev.shift && key == KEY_7) + gint_world_switch(GINT_CALL(save_logger)); - if(key == KEY_1 && usb_is_open()) { + if(tab == 4 && key == KEY_1 && usb_is_open()) { // extern prof_t usb_cpu_write_prof; // usb_cpu_write_prof = prof_make(); -// uint32_t time = prof_exec({ + uint32_t time = prof_exec({ usb_fxlink_screenshot(true); -// }); + }); -// USB_LOG("Screenshot: %d us\n", time); + USB_LOG("Screenshot: %d us\n", time); // USB_LOG("Spent CPU writing: %d us\n", prof_time(usb_cpu_write_prof)); } - if(key == KEY_2 && usb_is_open()) screenshot_async(); - if(key == KEY_3 && usb_is_open()) { + if(tab == 4 && key == KEY_2 && usb_is_open()) screenshot_async(); + if(tab == 4 && key == KEY_3 && usb_is_open()) { GALIGNED(4) char str[] = "Hi! This is gintctl!"; usb_fxlink_text(str, 0); } - if(key == KEY_4 && usb_is_open()) { + if(tab == 4 && key == KEY_4 && usb_is_open()) { uint32_t time = prof_exec({ int pipe = usb_ff_bulk_output(); int data_size = _(1024, 396*224*2); usb_fxlink_header_t header; usb_fxlink_fill_header(&header, "gintctl", "dmascreen", data_size); - usb_write_sync(pipe, &header, sizeof header, 4, false); -// usb_write_sync(pipe, (void *)0xfe200000, _(1024, 396*224*2), 4, true); - usb_write_sync(pipe, gint_vram, _(1024, 396*224*2), 4, true); + usb_write_sync(pipe, &header, sizeof header, false); +// usb_write_sync(pipe, (void *)0xfe200000, _(1024, 396*224*2), true); + usb_write_sync(pipe, gint_vram, _(1024, 396*224*2), true); usb_commit_sync(pipe); }); USB_LOG("DMA screenshot: %d us\n", time); } + if(tab == 4 && key == KEY_5 && usb_is_open()) + alignment_write_tests(&awd); } } diff --git a/src/gint/usbtrace.c b/src/gint/usbtrace.c index 6112dfd..c150fc6 100644 --- a/src/gint/usbtrace.c +++ b/src/gint/usbtrace.c @@ -265,7 +265,7 @@ static void execute_tracer(void) case COMMAND_WRITE_ASYNC_TEXT_HEADER:{ usb_fxlink_header_t h; usb_fxlink_fill_header(&h, "fxlink", "text", text_size); - usb_write_async(usb_ff_bulk_output(), &h, sizeof h, 1, false, + usb_write_async(usb_ff_bulk_output(), &h, sizeof h, false, GINT_CALL_NULL); break;} @@ -277,27 +277,27 @@ static void execute_tracer(void) sh.width = htole32(DWIDTH); sh.height = htole32(DHEIGHT); sh.pixel_format = htole32(USB_FXLINK_IMAGE_RGB565); - usb_write_async(usb_ff_bulk_output(), &h, sizeof h, 4, false, + usb_write_async(usb_ff_bulk_output(), &h, sizeof h, false, GINT_CALL_NULL); - usb_write_async(usb_ff_bulk_output(), &sh, sizeof sh, 4, false, + usb_write_async(usb_ff_bulk_output(), &sh, sizeof sh, false, GINT_CALL_NULL); break;} case COMMAND_WRITE_ASYNC_SHORT_TEXT: sprintf(text, text_fmt, ++text_count); - usb_write_async(usb_ff_bulk_output(), text, text_size, 1, false, + usb_write_async(usb_ff_bulk_output(), text, text_size, false, GINT_CALL_NULL); break; case COMMAND_WRITE_ASYNC_VRAM: - usb_write_async(usb_ff_bulk_output(), image, image_size, 4, false, + usb_write_async(usb_ff_bulk_output(), image, image_size, false, GINT_CALL_NULL); break; case COMMAND_WRITE_SYNC_TEXT_HEADER:{ usb_fxlink_header_t h; usb_fxlink_fill_header(&h, "fxlink", "text", text_size); - usb_write_sync(usb_ff_bulk_output(), &h, sizeof h, 1, false); + usb_write_sync(usb_ff_bulk_output(), &h, sizeof h, false); break;} case COMMAND_WRITE_SYNC_IMAGE_HEADER:{ @@ -308,17 +308,17 @@ static void execute_tracer(void) sh.width = htole32(DWIDTH); sh.height = htole32(DHEIGHT); sh.pixel_format = htole32(USB_FXLINK_IMAGE_RGB565); - usb_write_sync(usb_ff_bulk_output(), &h, sizeof h, 4, false); - usb_write_sync(usb_ff_bulk_output(), &sh, sizeof sh, 4, false); + usb_write_sync(usb_ff_bulk_output(), &h, sizeof h, false); + usb_write_sync(usb_ff_bulk_output(), &sh, sizeof sh, false); break;} case COMMAND_WRITE_SYNC_SHORT_TEXT: sprintf(text, text_fmt, ++text_count); - usb_write_sync(usb_ff_bulk_output(), text, text_size, 1, false); + usb_write_sync(usb_ff_bulk_output(), text, text_size, false); break; case COMMAND_WRITE_SYNC_VRAM: - usb_write_sync(usb_ff_bulk_output(), image, image_size, 4, false); + usb_write_sync(usb_ff_bulk_output(), image, image_size, false); break; case COMMAND_COMMIT_ASYNC: