From 1951c17e0bc0822960f536587c1272ed5d9b64bf Mon Sep 17 00:00:00 2001 From: mojyack Date: Thu, 15 Jan 2026 16:46:03 +0900 Subject: [PATCH] pass event data to usb_acknowledge add second argument to usb_acknowledge. it can be used for more appropriate connection tracking that does not rely on timeout in the future. Change-Id: I8a44366b7c7a1f944524c4ba8ecd6d9673746a65 --- apps/audio_thread.c | 2 +- apps/gui/usb_screen.c | 4 ++-- apps/gui/usb_screen.h | 6 ++++-- apps/iap/iap-core.c | 2 +- apps/main.c | 4 ++-- apps/misc.c | 15 ++++++++------- apps/playlist.c | 2 +- apps/plugin.h | 2 +- apps/plugins/announce_status.c | 2 +- apps/plugins/battery_bench.c | 2 +- apps/plugins/tagcache/tagcache.c | 2 +- apps/plugins/test_usb.c | 2 +- apps/tagcache.c | 2 +- bootloader/echoplayer.c | 2 +- bootloader/gigabeat-s.c | 2 +- bootloader/imx233.c | 2 +- bootloader/ipod-s5l87xx.c | 2 +- bootloader/main-pp.c | 2 +- bootloader/ondavx747.c | 2 +- bootloader/sansaconnect.c | 2 +- bootloader/x1000/gui.c | 2 ++ bootloader/x1000/utils.c | 3 ++- bootloader/xduoox3.c | 2 +- docs/PLUGIN_API | 3 ++- firmware/backlight.c | 2 +- firmware/export/usb.h | 6 +++--- firmware/scroll_engine.c | 2 +- firmware/storage.c | 2 +- firmware/target/arm/ipod/piezo.c | 2 +- .../tms320dm320/sansa-connect/avr-sansaconnect.c | 2 +- firmware/target/arm/usb-tcc.c | 2 +- firmware/usb.c | 7 ++++--- uisimulator/common/sim_tasks.c | 4 ++-- 33 files changed, 54 insertions(+), 46 deletions(-) diff --git a/apps/audio_thread.c b/apps/audio_thread.c index 74f18454cc..c58d509875 100644 --- a/apps/audio_thread.c +++ b/apps/audio_thread.c @@ -101,7 +101,7 @@ static void NORETURN_ATTR audio_thread(void) case SYS_USB_CONNECTED: LOGFQUEUE("audio < SYS_USB_CONNECTED"); voice_stop(); - usb_acknowledge(SYS_USB_CONNECTED_ACK); + usb_acknowledge(SYS_USB_CONNECTED_ACK, ev.data); usb_wait_for_disconnect(&audio_queue); break; } diff --git a/apps/gui/usb_screen.c b/apps/gui/usb_screen.c index e16428e1e5..6d57a09b08 100644 --- a/apps/gui/usb_screen.c +++ b/apps/gui/usb_screen.c @@ -248,7 +248,7 @@ static void usb_screens_draw(struct usb_screen_vps_t *usb_screen_vps_ar) } } -void gui_usb_screen_run(bool early_usb) +void gui_usb_screen_run(bool early_usb, intptr_t seqnum) { #ifdef SIMULATOR /* the sim allows toggling USB fast enough to overflow viewportmanagers stack */ static bool in_usb_screen = false; @@ -297,7 +297,7 @@ void gui_usb_screen_run(bool early_usb) font_disable_all(); } - usb_acknowledge(SYS_USB_CONNECTED_ACK); + usb_acknowledge(SYS_USB_CONNECTED_ACK, seqnum); while (1) { diff --git a/apps/gui/usb_screen.h b/apps/gui/usb_screen.h index 321c396fc9..6ee467988d 100644 --- a/apps/gui/usb_screen.h +++ b/apps/gui/usb_screen.h @@ -21,10 +21,12 @@ #ifndef _USB_SCREEN_H_ #define _USB_SCREEN_H_ +#include + #ifdef USB_NONE -#define gui_usb_screen_run(early_usb) do {} while(0) +#define gui_usb_screen_run(early_usb, seqnum) do {} while(0) #else -extern void gui_usb_screen_run(bool early_usb); +extern void gui_usb_screen_run(bool early_usb, intptr_t seqnum); #endif #endif diff --git a/apps/iap/iap-core.c b/apps/iap/iap-core.c index da58d49ff8..a9ed8c6c4b 100644 --- a/apps/iap/iap-core.c +++ b/apps/iap/iap-core.c @@ -404,7 +404,7 @@ static void iap_thread(void) /* Ack USB thread */ case SYS_USB_CONNECTED: { - usb_acknowledge(SYS_USB_CONNECTED_ACK); + usb_acknowledge(SYS_USB_CONNECTED_ACK, ev.data); break; } } diff --git a/apps/main.c b/apps/main.c index 70f4cb5b04..c25847430f 100644 --- a/apps/main.c +++ b/apps/main.c @@ -618,7 +618,7 @@ static void init(void) (mmc_remove_request() == SYS_HOTSWAP_EXTRACTED)) #endif { - gui_usb_screen_run(true); + gui_usb_screen_run(true, button_get_data()); mounted = true; /* mounting done @ end of USB mode */ } #ifdef HAVE_USB_POWER @@ -675,7 +675,7 @@ static void init(void) #ifndef USB_NONE usb_start_monitoring(); while(button_get(true) != SYS_USB_CONNECTED) {}; - gui_usb_screen_run(true); + gui_usb_screen_run(true, button_get_data()); #elif !defined(DEBUG) && !(CONFIG_STORAGE & STORAGE_RAMDISK) sleep(HZ*5); #endif diff --git a/apps/misc.c b/apps/misc.c index 778e524b91..39936f2b36 100644 --- a/apps/misc.c +++ b/apps/misc.c @@ -656,24 +656,25 @@ long default_event_handler_ex(long event, void (*callback)(void *), void *parame } break; case SYS_USB_CONNECTED: + { + intptr_t seqnum = button_get_data(); if (callback != NULL) callback(parameter); - { - system_flush(); + system_flush(); #ifdef BOOTFILE #if !defined(USB_NONE) && !defined(USB_HANDLED_BY_OF) - check_bootfile(false); /* gets initial size */ + check_bootfile(false); /* gets initial size */ #endif #endif - gui_usb_screen_run(false); + gui_usb_screen_run(false, seqnum); #ifdef BOOTFILE #if !defined(USB_NONE) && !defined(USB_HANDLED_BY_OF) - check_bootfile(true); + check_bootfile(true); #endif #endif - system_restore(); - } + system_restore(); return SYS_USB_CONNECTED; + } case SYS_POWEROFF: case SYS_REBOOT: diff --git a/apps/playlist.c b/apps/playlist.c index e06d36e605..1543fad262 100644 --- a/apps/playlist.c +++ b/apps/playlist.c @@ -1882,7 +1882,7 @@ static void dc_thread_playlist(void) } case SYS_USB_CONNECTED: - usb_acknowledge(SYS_USB_CONNECTED_ACK); + usb_acknowledge(SYS_USB_CONNECTED_ACK, ev.data); usb_wait_for_disconnect(&playlist_queue); break; } diff --git a/apps/plugin.h b/apps/plugin.h index 0f63dbe839..20190846c5 100644 --- a/apps/plugin.h +++ b/apps/plugin.h @@ -948,7 +948,7 @@ struct plugin_api { /* usb */ bool (*usb_inserted)(void); - void (*usb_acknowledge)(long id); + void (*usb_acknowledge)(long id, intptr_t seqnum); #ifdef USB_ENABLE_HID void (*usb_hid_send)(usage_page_t usage_page, int id); #endif diff --git a/apps/plugins/announce_status.c b/apps/plugins/announce_status.c index cd0482f500..f71d25af6f 100644 --- a/apps/plugins/announce_status.c +++ b/apps/plugins/announce_status.c @@ -435,7 +435,7 @@ void thread(void) switch (ev.id) { case SYS_USB_CONNECTED: - rb->usb_acknowledge(SYS_USB_CONNECTED_ACK); + rb->usb_acknowledge(SYS_USB_CONNECTED_ACK, ev.data); in_usb = true; break; case SYS_USB_DISCONNECTED: diff --git a/apps/plugins/battery_bench.c b/apps/plugins/battery_bench.c index cc242c169f..fc67b306b0 100644 --- a/apps/plugins/battery_bench.c +++ b/apps/plugins/battery_bench.c @@ -491,7 +491,7 @@ static void thread(void) { case SYS_USB_CONNECTED: in_usb_mode = true; - rb->usb_acknowledge(SYS_USB_CONNECTED_ACK); + rb->usb_acknowledge(SYS_USB_CONNECTED_ACK, ev.data); break; case SYS_USB_DISCONNECTED: in_usb_mode = false; diff --git a/apps/plugins/tagcache/tagcache.c b/apps/plugins/tagcache/tagcache.c index 483d2fbaf9..c5ee21e870 100644 --- a/apps/plugins/tagcache/tagcache.c +++ b/apps/plugins/tagcache/tagcache.c @@ -979,7 +979,7 @@ static void thread(void) switch (ev.id) { case SYS_USB_CONNECTED: - rb->usb_acknowledge(SYS_USB_CONNECTED_ACK); + rb->usb_acknowledge(SYS_USB_CONNECTED_ACK, ev.data); logenabled = false; break; case SYS_USB_DISCONNECTED: diff --git a/apps/plugins/test_usb.c b/apps/plugins/test_usb.c index 28ef8f7e5f..11c058757a 100644 --- a/apps/plugins/test_usb.c +++ b/apps/plugins/test_usb.c @@ -58,7 +58,7 @@ static void main_loop(void) state = "connected"; logf("test_usb: connect ack %ld", *rb->current_tick); DEBUGF("test_usb: connect ack %ld\n", *rb->current_tick); - rb->usb_acknowledge(SYS_USB_CONNECTED_ACK); + rb->usb_acknowledge(SYS_USB_CONNECTED_ACK, ev.data); break; case SYS_USB_DISCONNECTED: diff --git a/apps/tagcache.c b/apps/tagcache.c index 443f18b7a4..8b6a46d937 100644 --- a/apps/tagcache.c +++ b/apps/tagcache.c @@ -5357,7 +5357,7 @@ static void tagcache_thread(void) case SYS_USB_CONNECTED: logf("USB: TagCache"); - usb_acknowledge(SYS_USB_CONNECTED_ACK); + usb_acknowledge(SYS_USB_CONNECTED_ACK, ev.data); usb_wait_for_disconnect(&tagcache_queue); break ; } diff --git a/bootloader/echoplayer.c b/bootloader/echoplayer.c index 113c457f5f..6f742aec50 100644 --- a/bootloader/echoplayer.c +++ b/bootloader/echoplayer.c @@ -470,7 +470,7 @@ void main(void) case SYS_USB_CONNECTED: go_active(); - usb_acknowledge(SYS_USB_CONNECTED_ACK); + usb_acknowledge(SYS_USB_CONNECTED_ACK, button_get_data()); break; } } diff --git a/bootloader/gigabeat-s.c b/bootloader/gigabeat-s.c index 2829241b9b..831f854dc8 100644 --- a/bootloader/gigabeat-s.c +++ b/bootloader/gigabeat-s.c @@ -123,7 +123,7 @@ static void handle_usb(int connect_timeout) /* Got the message - wait for disconnect */ printf("Bootloader USB mode"); - usb_acknowledge(SYS_USB_CONNECTED_ACK); + usb_acknowledge(SYS_USB_CONNECTED_ACK, button_get_data()); while (1) { diff --git a/bootloader/imx233.c b/bootloader/imx233.c index efe19bf0c2..bb8189cf6e 100644 --- a/bootloader/imx233.c +++ b/bootloader/imx233.c @@ -96,7 +96,7 @@ static void usb_mode(int connect_timeout) adc_init(); /* ack the SYS_USB_CONNECTED polled from the button queue */ - usb_acknowledge(SYS_USB_CONNECTED_ACK); + usb_acknowledge(SYS_USB_CONNECTED_ACK, button_get_data()); while(1) { diff --git a/bootloader/ipod-s5l87xx.c b/bootloader/ipod-s5l87xx.c index 3a53f612b0..0558d8da5b 100644 --- a/bootloader/ipod-s5l87xx.c +++ b/bootloader/ipod-s5l87xx.c @@ -129,7 +129,7 @@ static void usb_mode(void) printf("Bootloader USB mode"); /* Ack the SYS_USB_CONNECTED polled from the button queue */ - usb_acknowledge(SYS_USB_CONNECTED_ACK); + usb_acknowledge(SYS_USB_CONNECTED_ACK, button_get_data()); while(1) { diff --git a/bootloader/main-pp.c b/bootloader/main-pp.c index f2bfa48157..0bd4dcbca0 100644 --- a/bootloader/main-pp.c +++ b/bootloader/main-pp.c @@ -230,7 +230,7 @@ static int handle_usb(int connect_timeout) printf("Bootloader USB mode"); usb = USB_HANDLED; - usb_acknowledge(SYS_USB_CONNECTED_ACK); + usb_acknowledge(SYS_USB_CONNECTED_ACK, ev.data); #if defined(SANSA_E200) && defined(HAVE_BOOTLOADER_USB_MODE) /* E200 misses unplug randomly probably fine for other targets too but needs tested */ diff --git a/bootloader/ondavx747.c b/bootloader/ondavx747.c index 9309b78f88..b32a2ab151 100644 --- a/bootloader/ondavx747.c +++ b/bootloader/ondavx747.c @@ -75,7 +75,7 @@ static void usb_mode(void) /* Got the message - wait for disconnect */ show_splash(0, "Bootloader USB mode"); - usb_acknowledge(SYS_USB_CONNECTED_ACK); + usb_acknowledge(SYS_USB_CONNECTED_ACK, button_get_data()); while (1) { diff --git a/bootloader/sansaconnect.c b/bootloader/sansaconnect.c index 65ca9ff3d7..c8cfecbc61 100644 --- a/bootloader/sansaconnect.c +++ b/bootloader/sansaconnect.c @@ -196,7 +196,7 @@ static void handle_usb(int connect_timeout) if (button_get_w_tmo(HZ/2) == SYS_USB_CONNECTED) { printf("Bootloader USB mode"); - usb_acknowledge(SYS_USB_CONNECTED_ACK); + usb_acknowledge(SYS_USB_CONNECTED_ACK, button_get_data()); while (button_get_w_tmo(HZ/2) != SYS_USB_DISCONNECTED) { storage_spin(); diff --git a/bootloader/x1000/gui.c b/bootloader/x1000/gui.c index a15f315a44..a235618e70 100644 --- a/bootloader/x1000/gui.c +++ b/bootloader/x1000/gui.c @@ -34,6 +34,7 @@ static bool lcd_inited = false; extern bool is_usb_connected; +extern intptr_t usb_connection_seqnum; void clearscreen(void) { @@ -134,6 +135,7 @@ int get_button(int timeout) case SYS_USB_CONNECTED: case SYS_USB_DISCONNECTED: is_usb_connected = (btn == SYS_USB_CONNECTED); + usb_connection_seqnum = button_get_data(); break; #ifdef HAVE_SCREENDUMP case BL_SCREENSHOT: diff --git a/bootloader/x1000/utils.c b/bootloader/x1000/utils.c index 8d296b234b..fecf7908d1 100644 --- a/bootloader/x1000/utils.c +++ b/bootloader/x1000/utils.c @@ -38,6 +38,7 @@ * Handled by the gui code since that's how events are delivered * TODO: this is an ugly kludge */ bool is_usb_connected = false; +intptr_t usb_connection_seqnum = 0; static bool screenshot_enabled = false; @@ -71,7 +72,7 @@ void usb_mode(void) return; splashf(0, "USB mode"); - usb_acknowledge(SYS_USB_CONNECTED_ACK); + usb_acknowledge(SYS_USB_CONNECTED_ACK, usb_connection_seqnum); while(is_usb_connected) get_button(TIMEOUT_BLOCK); diff --git a/bootloader/xduoox3.c b/bootloader/xduoox3.c index a8d9fc4a1d..4a680664e0 100644 --- a/bootloader/xduoox3.c +++ b/bootloader/xduoox3.c @@ -105,7 +105,7 @@ static void usb_mode(void) /* Got the message - wait for disconnect */ show_splash(0, "Bootloader USB mode"); - usb_acknowledge(SYS_USB_CONNECTED_ACK); + usb_acknowledge(SYS_USB_CONNECTED_ACK, button_get_data()); while(1) { button = button_get_w_tmo(HZ/2); diff --git a/docs/PLUGIN_API b/docs/PLUGIN_API index 7c43225970..f8bf383896 100644 --- a/docs/PLUGIN_API +++ b/docs/PLUGIN_API @@ -2996,9 +2996,10 @@ void unregister_storage_idle_func(void (*function)(void), bool run) \param run \description -void usb_acknowledge(long id) +void usb_acknowledge(long id, intptr_t seqnum) \group usb \param id + \param seqnum \description void usb_hid_send(usage_page_t usage_page, int id) diff --git a/firmware/backlight.c b/firmware/backlight.c index f3d82d7050..e28793253b 100644 --- a/firmware/backlight.c +++ b/firmware/backlight.c @@ -605,7 +605,7 @@ void backlight_thread(void) #endif /* HAVE_REMOTE_LCD/ HAVE_REMOTE_LCD_AS_MAIN */ #endif /* !SIMULATOR */ case SYS_USB_CONNECTED: - usb_acknowledge(SYS_USB_CONNECTED_ACK); + usb_acknowledge(SYS_USB_CONNECTED_ACK, ev.data); break; #ifdef BACKLIGHT_DRIVER_CLOSE diff --git a/firmware/export/usb.h b/firmware/export/usb.h index 13271652f9..2770c0d07b 100644 --- a/firmware/export/usb.h +++ b/firmware/export/usb.h @@ -70,8 +70,8 @@ * mass storage mode, it will require exclusive access to the disk and ask all * threads to release any file handle and stop using the disks. It does so by * broadcasting a SYS_USB_CONNECTED message, which threads must acknowledge using - * usb_acknowledge(SYS_USB_CONNECTED_ACK). They must not access the disk until - * SYS_USB_DISCONNECTED is broadcast. To ease waiting, threads can call + * usb_acknowledge(SYS_USB_CONNECTED_ACK, ev.data). They must not access the disk + * until SYS_USB_DISCONNECTED is broadcast. To ease waiting, threads can call * usb_wait_for_disconnect() or usb_wait_for_disconnect_w_tmo() on their waiting * queue. * @@ -198,7 +198,7 @@ void usb_attach(void); void usb_start_monitoring(void) INIT_ATTR; void usb_close(void); /* acknowledge usb connection, typically with SYS_USB_CONNECTED_ACK */ -void usb_acknowledge(long id); +void usb_acknowledge(long id, intptr_t seqnum); /* block the current thread until SYS_USB_DISCONNECTED has been broadcast */ void usb_wait_for_disconnect(struct event_queue *q); /* same as usb_wait_for_disconnect() but with a timeout, returns 1 on timeout */ diff --git a/firmware/scroll_engine.c b/firmware/scroll_engine.c index c39e9f0be9..79609e5b63 100644 --- a/firmware/scroll_engine.c +++ b/firmware/scroll_engine.c @@ -89,7 +89,7 @@ static bool scroll_process_message(int delay) case SYS_TIMEOUT: return false; case SYS_USB_CONNECTED: - usb_acknowledge(SYS_USB_CONNECTED_ACK); + usb_acknowledge(SYS_USB_CONNECTED_ACK, ev.data); usb_wait_for_disconnect(&scroll_queue); sync_display_ticks(); return true; diff --git a/firmware/storage.c b/firmware/storage.c index 341c007f7e..5134e0f0e3 100644 --- a/firmware/storage.c +++ b/firmware/storage.c @@ -236,7 +236,7 @@ static void NORETURN_ATTR storage_thread(void) storage_event_send(CONFIG_STORAGE, ev.id, (intptr_t)&bdcast); usb_mode = ev.id == SYS_USB_CONNECTED; if (usb_mode) { - usb_acknowledge(SYS_USB_CONNECTED_ACK); + usb_acknowledge(SYS_USB_CONNECTED_ACK, ev.data); } else { bdcast = CONFIG_STORAGE; diff --git a/firmware/target/arm/ipod/piezo.c b/firmware/target/arm/ipod/piezo.c index 898f12dd24..40a685c489 100644 --- a/firmware/target/arm/ipod/piezo.c +++ b/firmware/target/arm/ipod/piezo.c @@ -108,7 +108,7 @@ static void piezo_thread(void) /*logf("USB: Piezo core");*/ piezo_hw_stop(); queue_clear(&piezo_queue); - usb_acknowledge(SYS_USB_CONNECTED_ACK); + usb_acknowledge(SYS_USB_CONNECTED_ACK, ev.data); usb_wait_for_disconnect(&piezo_queue); break ; #endif diff --git a/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c b/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c index 0d9e9722c8..a7b982b645 100644 --- a/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c +++ b/firmware/target/arm/tms320dm320/sansa-connect/avr-sansaconnect.c @@ -838,7 +838,7 @@ void avr_thread(void) if (ev.id == SYS_USB_CONNECTED) { /* Allow USB to gain exclusive storage access */ - usb_acknowledge(SYS_USB_CONNECTED_ACK); + usb_acknowledge(SYS_USB_CONNECTED_ACK, ev.data); disk_access_available = false; } else if (ev.id == SYS_USB_DISCONNECTED) diff --git a/firmware/target/arm/usb-tcc.c b/firmware/target/arm/usb-tcc.c index 0083655434..ba055b4cb7 100644 --- a/firmware/target/arm/usb-tcc.c +++ b/firmware/target/arm/usb-tcc.c @@ -747,7 +747,7 @@ void usb_test(void) usb_init(); usb_start_monitoring(); - usb_acknowledge(SYS_USB_CONNECTED_ACK); + usb_acknowledge(SYS_USB_CONNECTED_ACK, 0); while (1) { sleep(HZ); diff --git a/firmware/usb.c b/firmware/usb.c index 4c0505daca..514284320a 100644 --- a/firmware/usb.c +++ b/firmware/usb.c @@ -765,9 +765,9 @@ void usb_start_monitoring(void) #endif /* USB_STATUS_BY_EVENT */ #endif /* USB_FULL_INIT */ -void usb_acknowledge(long id) +void usb_acknowledge(long id, intptr_t seqnum) { - queue_post(&usb_queue, id, 0); + queue_post(&usb_queue, id, seqnum); } void usb_init(void) @@ -901,9 +901,10 @@ bool usb_inserted(void) return false; } -void usb_acknowledge(long id) +void usb_acknowledge(long id, intptr_t seqnum) { (void)id; + (void)seqnum; } void usb_init(void) diff --git a/uisimulator/common/sim_tasks.c b/uisimulator/common/sim_tasks.c index 6ac2376316..8a02aa5c80 100644 --- a/uisimulator/common/sim_tasks.c +++ b/uisimulator/common/sim_tasks.c @@ -203,9 +203,9 @@ void usb_start_monitoring(void) { } -void usb_acknowledge(long id) +void usb_acknowledge(long id, intptr_t seqnum) { - queue_post(&sim_queue, id, 0); + queue_post(&sim_queue, id, seqnum); } void usb_wait_for_disconnect(struct event_queue *q)