pass event data to usb_acknowledge

rockbox-gerrit-noreply--- via rockbox-cvs <[email protected]>
Newsgroups gmane.comp.systems.archos.rockbox.cvs
Message-ID <[email protected]>
commit 1951c17e0bc0822960f536587c1272ed5d9b64bf
Author: mojyack <[email protected]>
Date:   Thu Jan 15 16:46:03 2026 +0900

    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

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 <stdint.h>
+
 #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)
-- 
rockbox-cvs mailing list
[email protected]
https://lists.haxx.se/mailman/listinfo/rockbox-cvs
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.