summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAidan MacDonald <amachronic@protonmail.com>2021-09-20 01:05:39 +0100
committerAidan MacDonald <amachronic@protonmail.com>2021-10-16 21:14:42 +0100
commitdff8320a5d04d74d8a08a81d9e6f6ed296d672ce (patch)
tree6794d4f98756771543d9838a315e95089bdd394a
parentb69d43c247994c846da75c4b35d4351fbf96984d (diff)
downloadrockbox-dff8320a5d04d74d8a08a81d9e6f6ed296d672ce.tar.gz
rockbox-dff8320a5d04d74d8a08a81d9e6f6ed296d672ce.zip
usb: add request data argument to all control request handlers
Change-Id: I237143fa0d95c914b8e25ed22f8acde96ec00551
-rw-r--r--firmware/usbstack/usb_class_driver.h2
-rw-r--r--firmware/usbstack/usb_core.c50
-rw-r--r--firmware/usbstack/usb_hid.c4
-rw-r--r--firmware/usbstack/usb_hid.h2
-rw-r--r--firmware/usbstack/usb_serial.c4
-rw-r--r--firmware/usbstack/usb_serial.h2
-rw-r--r--firmware/usbstack/usb_storage.c4
-rw-r--r--firmware/usbstack/usb_storage.h2
8 files changed, 38 insertions, 32 deletions
diff --git a/firmware/usbstack/usb_class_driver.h b/firmware/usbstack/usb_class_driver.h
index 0ee08579e4..bffc994d9e 100644
--- a/firmware/usbstack/usb_class_driver.h
+++ b/firmware/usbstack/usb_class_driver.h
@@ -80,7 +80,7 @@ struct usb_class_driver {
80 able to handle it, it should ack the request, and return true. Otherwise 80 able to handle it, it should ack the request, and return true. Otherwise
81 it should return false. 81 it should return false.
82 Optional function */ 82 Optional function */
83 bool (*control_request)(struct usb_ctrlrequest* req, unsigned char *dest); 83 bool (*control_request)(struct usb_ctrlrequest* req, void* reqdata, unsigned char *dest);
84 84
85#ifdef HAVE_HOTSWAP 85#ifdef HAVE_HOTSWAP
86 /* Tells the driver that a hotswappable disk/card was inserted or 86 /* Tells the driver that a hotswappable disk/card was inserted or
diff --git a/firmware/usbstack/usb_core.c b/firmware/usbstack/usb_core.c
index 4bc0443477..9ece4fc796 100644
--- a/firmware/usbstack/usb_core.c
+++ b/firmware/usbstack/usb_core.c
@@ -172,7 +172,7 @@ static int usb_no_host_callback(struct timeout *tmo)
172static int usb_core_num_interfaces; 172static int usb_core_num_interfaces;
173 173
174typedef void (*completion_handler_t)(int ep, int dir, int status, int length); 174typedef void (*completion_handler_t)(int ep, int dir, int status, int length);
175typedef bool (*control_handler_t)(struct usb_ctrlrequest* req, 175typedef bool (*control_handler_t)(struct usb_ctrlrequest* req, void* reqdata,
176 unsigned char* dest); 176 unsigned char* dest);
177 177
178static struct 178static struct
@@ -262,7 +262,7 @@ static struct usb_class_driver drivers[USB_NUM_DRIVERS] =
262#endif 262#endif
263}; 263};
264 264
265static void usb_core_control_request_handler(struct usb_ctrlrequest* req); 265static void usb_core_control_request_handler(struct usb_ctrlrequest* req, void* reqdata);
266 266
267static unsigned char response_data[256] USB_DEVBSS_ATTR; 267static unsigned char response_data[256] USB_DEVBSS_ATTR;
268 268
@@ -449,7 +449,7 @@ void usb_core_handle_transfer_completion(
449 ((struct usb_ctrlrequest*)event->data[0])->bRequest); 449 ((struct usb_ctrlrequest*)event->data[0])->bRequest);
450 450
451 usb_core_control_request_handler( 451 usb_core_control_request_handler(
452 (struct usb_ctrlrequest*)event->data[0]); 452 (struct usb_ctrlrequest*)event->data[0], event->data[1]);
453 break; 453 break;
454 default: 454 default:
455 handler = ep_data[ep].completion_handler[EP_DIR(event->dir)]; 455 handler = ep_data[ep].completion_handler[EP_DIR(event->dir)];
@@ -560,7 +560,7 @@ static void allocate_interfaces_and_endpoints(void)
560} 560}
561 561
562 562
563static void control_request_handler_drivers(struct usb_ctrlrequest* req) 563static void control_request_handler_drivers(struct usb_ctrlrequest* req, void* reqdata)
564{ 564{
565 int i, interface = req->wIndex & 0xff; 565 int i, interface = req->wIndex & 0xff;
566 bool handled = false; 566 bool handled = false;
@@ -571,7 +571,7 @@ static void control_request_handler_drivers(struct usb_ctrlrequest* req)
571 drivers[i].first_interface <= interface && 571 drivers[i].first_interface <= interface &&
572 drivers[i].last_interface > interface) 572 drivers[i].last_interface > interface)
573 { 573 {
574 handled = drivers[i].control_request(req, response_data); 574 handled = drivers[i].control_request(req, reqdata, response_data);
575 if(handled) 575 if(handled)
576 break; 576 break;
577 } 577 }
@@ -583,7 +583,7 @@ static void control_request_handler_drivers(struct usb_ctrlrequest* req)
583 } 583 }
584} 584}
585 585
586static void request_handler_device_get_descriptor(struct usb_ctrlrequest* req) 586static void request_handler_device_get_descriptor(struct usb_ctrlrequest* req, void* reqdata)
587{ 587{
588 int size; 588 int size;
589 const void* ptr = NULL; 589 const void* ptr = NULL;
@@ -662,7 +662,7 @@ static void request_handler_device_get_descriptor(struct usb_ctrlrequest* req)
662 662
663 default: 663 default:
664 logf("ctrl desc."); 664 logf("ctrl desc.");
665 control_request_handler_drivers(req); 665 control_request_handler_drivers(req, reqdata);
666 break; 666 break;
667 } 667 }
668 668
@@ -718,7 +718,7 @@ static void usb_core_do_clear_feature(int recip, int recip_nr, int feature)
718 } 718 }
719} 719}
720 720
721static void request_handler_device(struct usb_ctrlrequest* req) 721static void request_handler_device(struct usb_ctrlrequest* req, void* reqdata)
722{ 722{
723 switch(req->bRequest) { 723 switch(req->bRequest) {
724 case USB_REQ_GET_CONFIGURATION: { 724 case USB_REQ_GET_CONFIGURATION: {
@@ -744,7 +744,7 @@ static void request_handler_device(struct usb_ctrlrequest* req)
744 } 744 }
745 case USB_REQ_GET_DESCRIPTOR: 745 case USB_REQ_GET_DESCRIPTOR:
746 logf("usb_core: GET_DESC %d", req->wValue >> 8); 746 logf("usb_core: GET_DESC %d", req->wValue >> 8);
747 request_handler_device_get_descriptor(req); 747 request_handler_device_get_descriptor(req, reqdata);
748 break; 748 break;
749 case USB_REQ_CLEAR_FEATURE: 749 case USB_REQ_CLEAR_FEATURE:
750 break; 750 break;
@@ -768,7 +768,7 @@ static void request_handler_device(struct usb_ctrlrequest* req)
768 } 768 }
769} 769}
770 770
771static void request_handler_interface_standard(struct usb_ctrlrequest* req) 771static void request_handler_interface_standard(struct usb_ctrlrequest* req, void* reqdata)
772{ 772{
773 switch (req->bRequest) 773 switch (req->bRequest)
774 { 774 {
@@ -794,19 +794,19 @@ static void request_handler_interface_standard(struct usb_ctrlrequest* req)
794 usb_drv_send(EP_CONTROL, response_data, 2); 794 usb_drv_send(EP_CONTROL, response_data, 2);
795 break; 795 break;
796 default: 796 default:
797 control_request_handler_drivers(req); 797 control_request_handler_drivers(req, reqdata);
798 break; 798 break;
799 } 799 }
800} 800}
801 801
802static void request_handler_interface(struct usb_ctrlrequest* req) 802static void request_handler_interface(struct usb_ctrlrequest* req, void* reqdata)
803{ 803{
804 switch(req->bRequestType & USB_TYPE_MASK) { 804 switch(req->bRequestType & USB_TYPE_MASK) {
805 case USB_TYPE_STANDARD: 805 case USB_TYPE_STANDARD:
806 request_handler_interface_standard(req); 806 request_handler_interface_standard(req, reqdata);
807 break; 807 break;
808 case USB_TYPE_CLASS: 808 case USB_TYPE_CLASS:
809 control_request_handler_drivers(req); 809 control_request_handler_drivers(req, reqdata);
810 break; 810 break;
811 case USB_TYPE_VENDOR: 811 case USB_TYPE_VENDOR:
812 default: 812 default:
@@ -816,7 +816,7 @@ static void request_handler_interface(struct usb_ctrlrequest* req)
816 } 816 }
817} 817}
818 818
819static void request_handler_endoint_drivers(struct usb_ctrlrequest* req) 819static void request_handler_endoint_drivers(struct usb_ctrlrequest* req, void* reqdata)
820{ 820{
821 bool handled = false; 821 bool handled = false;
822 control_handler_t control_handler = NULL; 822 control_handler_t control_handler = NULL;
@@ -826,7 +826,7 @@ static void request_handler_endoint_drivers(struct usb_ctrlrequest* req)
826 ep_data[EP_NUM(req->wIndex)].control_handler[EP_DIR(req->wIndex)]; 826 ep_data[EP_NUM(req->wIndex)].control_handler[EP_DIR(req->wIndex)];
827 827
828 if(control_handler) 828 if(control_handler)
829 handled = control_handler(req, response_data); 829 handled = control_handler(req, reqdata, response_data);
830 830
831 if(!handled) { 831 if(!handled) {
832 /* nope. flag error */ 832 /* nope. flag error */
@@ -835,7 +835,7 @@ static void request_handler_endoint_drivers(struct usb_ctrlrequest* req)
835 } 835 }
836} 836}
837 837
838static void request_handler_endpoint_standard(struct usb_ctrlrequest* req) 838static void request_handler_endpoint_standard(struct usb_ctrlrequest* req, void* reqdata)
839{ 839{
840 switch (req->bRequest) { 840 switch (req->bRequest) {
841 case USB_REQ_CLEAR_FEATURE: 841 case USB_REQ_CLEAR_FEATURE:
@@ -863,19 +863,19 @@ static void request_handler_endpoint_standard(struct usb_ctrlrequest* req)
863 usb_drv_send(EP_CONTROL, response_data, 2); 863 usb_drv_send(EP_CONTROL, response_data, 2);
864 break; 864 break;
865 default: 865 default:
866 request_handler_endoint_drivers(req); 866 request_handler_endoint_drivers(req, reqdata);
867 break; 867 break;
868 } 868 }
869} 869}
870 870
871static void request_handler_endpoint(struct usb_ctrlrequest* req) 871static void request_handler_endpoint(struct usb_ctrlrequest* req, void* reqdata)
872{ 872{
873 switch(req->bRequestType & USB_TYPE_MASK) { 873 switch(req->bRequestType & USB_TYPE_MASK) {
874 case USB_TYPE_STANDARD: 874 case USB_TYPE_STANDARD:
875 request_handler_endpoint_standard(req); 875 request_handler_endpoint_standard(req, reqdata);
876 break; 876 break;
877 case USB_TYPE_CLASS: 877 case USB_TYPE_CLASS:
878 request_handler_endoint_drivers(req); 878 request_handler_endoint_drivers(req, reqdata);
879 break; 879 break;
880 case USB_TYPE_VENDOR: 880 case USB_TYPE_VENDOR:
881 default: 881 default:
@@ -886,7 +886,7 @@ static void request_handler_endpoint(struct usb_ctrlrequest* req)
886} 886}
887 887
888/* Handling USB requests starts here */ 888/* Handling USB requests starts here */
889static void usb_core_control_request_handler(struct usb_ctrlrequest* req) 889static void usb_core_control_request_handler(struct usb_ctrlrequest* req, void* reqdata)
890{ 890{
891#ifdef HAVE_USB_CHARGING_ENABLE 891#ifdef HAVE_USB_CHARGING_ENABLE
892 timeout_cancel(&usb_no_host_timeout); 892 timeout_cancel(&usb_no_host_timeout);
@@ -904,13 +904,13 @@ static void usb_core_control_request_handler(struct usb_ctrlrequest* req)
904 904
905 switch(req->bRequestType & USB_RECIP_MASK) { 905 switch(req->bRequestType & USB_RECIP_MASK) {
906 case USB_RECIP_DEVICE: 906 case USB_RECIP_DEVICE:
907 request_handler_device(req); 907 request_handler_device(req, reqdata);
908 break; 908 break;
909 case USB_RECIP_INTERFACE: 909 case USB_RECIP_INTERFACE:
910 request_handler_interface(req); 910 request_handler_interface(req, reqdata);
911 break; 911 break;
912 case USB_RECIP_ENDPOINT: 912 case USB_RECIP_ENDPOINT:
913 request_handler_endpoint(req); 913 request_handler_endpoint(req, reqdata);
914 break; 914 break;
915 case USB_RECIP_OTHER: 915 case USB_RECIP_OTHER:
916 logf("unsupported recipient"); 916 logf("unsupported recipient");
diff --git a/firmware/usbstack/usb_hid.c b/firmware/usbstack/usb_hid.c
index 16dddb7db1..c7dc81e4c1 100644
--- a/firmware/usbstack/usb_hid.c
+++ b/firmware/usbstack/usb_hid.c
@@ -747,8 +747,10 @@ static int usb_hid_get_report(struct usb_ctrlrequest *req, unsigned char** dest)
747} 747}
748 748
749/* called by usb_core_control_request() */ 749/* called by usb_core_control_request() */
750bool usb_hid_control_request(struct usb_ctrlrequest *req, unsigned char *dest) 750bool usb_hid_control_request(struct usb_ctrlrequest *req, void *reqdata, unsigned char *dest)
751{ 751{
752 (void)reqdata;
753
752 unsigned char *orig_dest = dest; 754 unsigned char *orig_dest = dest;
753 switch (req->bRequestType & USB_TYPE_MASK) 755 switch (req->bRequestType & USB_TYPE_MASK)
754 { 756 {
diff --git a/firmware/usbstack/usb_hid.h b/firmware/usbstack/usb_hid.h
index 917992cd35..41e6662e29 100644
--- a/firmware/usbstack/usb_hid.h
+++ b/firmware/usbstack/usb_hid.h
@@ -32,7 +32,7 @@ void usb_hid_init_connection(void);
32void usb_hid_init(void); 32void usb_hid_init(void);
33void usb_hid_disconnect(void); 33void usb_hid_disconnect(void);
34void usb_hid_transfer_complete(int ep, int dir, int status, int length); 34void usb_hid_transfer_complete(int ep, int dir, int status, int length);
35bool usb_hid_control_request(struct usb_ctrlrequest* req, unsigned char* dest); 35bool usb_hid_control_request(struct usb_ctrlrequest* req, void* reqdata, unsigned char* dest);
36 36
37void usb_hid_send(usage_page_t usage_page, int id); 37void usb_hid_send(usage_page_t usage_page, int id);
38 38
diff --git a/firmware/usbstack/usb_serial.c b/firmware/usbstack/usb_serial.c
index c96936f1d4..fad62787ec 100644
--- a/firmware/usbstack/usb_serial.c
+++ b/firmware/usbstack/usb_serial.c
@@ -277,11 +277,13 @@ int usb_serial_get_config_descriptor(unsigned char *dest, int max_packet_size)
277} 277}
278 278
279/* called by usb_core_control_request() */ 279/* called by usb_core_control_request() */
280bool usb_serial_control_request(struct usb_ctrlrequest* req, unsigned char* dest) 280bool usb_serial_control_request(struct usb_ctrlrequest* req, void* reqdata, unsigned char* dest)
281{ 281{
282 bool handled = false; 282 bool handled = false;
283 283
284 (void)dest; 284 (void)dest;
285 (void)reqdata;
286
285 if (req->wIndex != control_interface) 287 if (req->wIndex != control_interface)
286 { 288 {
287 return false; 289 return false;
diff --git a/firmware/usbstack/usb_serial.h b/firmware/usbstack/usb_serial.h
index f1a603c4a3..c4c0e78724 100644
--- a/firmware/usbstack/usb_serial.h
+++ b/firmware/usbstack/usb_serial.h
@@ -30,7 +30,7 @@ void usb_serial_init_connection(void);
30void usb_serial_init(void); 30void usb_serial_init(void);
31void usb_serial_disconnect(void); 31void usb_serial_disconnect(void);
32void usb_serial_transfer_complete(int ep,int dir, int status, int length); 32void usb_serial_transfer_complete(int ep,int dir, int status, int length);
33bool usb_serial_control_request(struct usb_ctrlrequest* req, unsigned char *dest); 33bool usb_serial_control_request(struct usb_ctrlrequest* req, void* reqdata, unsigned char *dest);
34 34
35void usb_serial_send(const unsigned char *data, int length); 35void usb_serial_send(const unsigned char *data, int length);
36 36
diff --git a/firmware/usbstack/usb_storage.c b/firmware/usbstack/usb_storage.c
index 947006c1ec..717c2e5f22 100644
--- a/firmware/usbstack/usb_storage.c
+++ b/firmware/usbstack/usb_storage.c
@@ -673,11 +673,13 @@ void usb_storage_transfer_complete(int ep,int dir,int status,int length)
673} 673}
674 674
675/* called by usb_core_control_request() */ 675/* called by usb_core_control_request() */
676bool usb_storage_control_request(struct usb_ctrlrequest* req, unsigned char* dest) 676bool usb_storage_control_request(struct usb_ctrlrequest* req, void* reqdata, unsigned char* dest)
677{ 677{
678 bool handled = false; 678 bool handled = false;
679 679
680 (void)dest; 680 (void)dest;
681 (void)reqdata;
682
681 switch (req->bRequest) { 683 switch (req->bRequest) {
682 case USB_BULK_GET_MAX_LUN: { 684 case USB_BULK_GET_MAX_LUN: {
683 *tb.max_lun = storage_num_drives() - 1; 685 *tb.max_lun = storage_num_drives() - 1;
diff --git a/firmware/usbstack/usb_storage.h b/firmware/usbstack/usb_storage.h
index 3591d285d8..af17689110 100644
--- a/firmware/usbstack/usb_storage.h
+++ b/firmware/usbstack/usb_storage.h
@@ -30,7 +30,7 @@ void usb_storage_init_connection(void);
30void usb_storage_disconnect(void); 30void usb_storage_disconnect(void);
31void usb_storage_init(void); 31void usb_storage_init(void);
32void usb_storage_transfer_complete(int ep,int dir,int state,int length); 32void usb_storage_transfer_complete(int ep,int dir,int state,int length);
33bool usb_storage_control_request(struct usb_ctrlrequest* req, unsigned char* dest); 33bool usb_storage_control_request(struct usb_ctrlrequest* req, void* reqdata, unsigned char* dest);
34#ifdef HAVE_HOTSWAP 34#ifdef HAVE_HOTSWAP
35void usb_storage_notify_hotswap(int volume,bool inserted); 35void usb_storage_notify_hotswap(int volume,bool inserted);
36#endif 36#endif