diff options
author | Aidan MacDonald <amachronic@protonmail.com> | 2021-09-20 01:05:39 +0100 |
---|---|---|
committer | Aidan MacDonald <amachronic@protonmail.com> | 2021-10-16 21:14:42 +0100 |
commit | dff8320a5d04d74d8a08a81d9e6f6ed296d672ce (patch) | |
tree | 6794d4f98756771543d9838a315e95089bdd394a /firmware/usbstack | |
parent | b69d43c247994c846da75c4b35d4351fbf96984d (diff) | |
download | rockbox-dff8320a5d04d74d8a08a81d9e6f6ed296d672ce.tar.gz rockbox-dff8320a5d04d74d8a08a81d9e6f6ed296d672ce.zip |
usb: add request data argument to all control request handlers
Change-Id: I237143fa0d95c914b8e25ed22f8acde96ec00551
Diffstat (limited to 'firmware/usbstack')
-rw-r--r-- | firmware/usbstack/usb_class_driver.h | 2 | ||||
-rw-r--r-- | firmware/usbstack/usb_core.c | 50 | ||||
-rw-r--r-- | firmware/usbstack/usb_hid.c | 4 | ||||
-rw-r--r-- | firmware/usbstack/usb_hid.h | 2 | ||||
-rw-r--r-- | firmware/usbstack/usb_serial.c | 4 | ||||
-rw-r--r-- | firmware/usbstack/usb_serial.h | 2 | ||||
-rw-r--r-- | firmware/usbstack/usb_storage.c | 4 | ||||
-rw-r--r-- | firmware/usbstack/usb_storage.h | 2 |
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) | |||
172 | static int usb_core_num_interfaces; | 172 | static int usb_core_num_interfaces; |
173 | 173 | ||
174 | typedef void (*completion_handler_t)(int ep, int dir, int status, int length); | 174 | typedef void (*completion_handler_t)(int ep, int dir, int status, int length); |
175 | typedef bool (*control_handler_t)(struct usb_ctrlrequest* req, | 175 | typedef bool (*control_handler_t)(struct usb_ctrlrequest* req, void* reqdata, |
176 | unsigned char* dest); | 176 | unsigned char* dest); |
177 | 177 | ||
178 | static struct | 178 | static struct |
@@ -262,7 +262,7 @@ static struct usb_class_driver drivers[USB_NUM_DRIVERS] = | |||
262 | #endif | 262 | #endif |
263 | }; | 263 | }; |
264 | 264 | ||
265 | static void usb_core_control_request_handler(struct usb_ctrlrequest* req); | 265 | static void usb_core_control_request_handler(struct usb_ctrlrequest* req, void* reqdata); |
266 | 266 | ||
267 | static unsigned char response_data[256] USB_DEVBSS_ATTR; | 267 | static 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 | ||
563 | static void control_request_handler_drivers(struct usb_ctrlrequest* req) | 563 | static 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 | ||
586 | static void request_handler_device_get_descriptor(struct usb_ctrlrequest* req) | 586 | static 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 | ||
721 | static void request_handler_device(struct usb_ctrlrequest* req) | 721 | static 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 | ||
771 | static void request_handler_interface_standard(struct usb_ctrlrequest* req) | 771 | static 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 | ||
802 | static void request_handler_interface(struct usb_ctrlrequest* req) | 802 | static 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 | ||
819 | static void request_handler_endoint_drivers(struct usb_ctrlrequest* req) | 819 | static 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 | ||
838 | static void request_handler_endpoint_standard(struct usb_ctrlrequest* req) | 838 | static 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 | ||
871 | static void request_handler_endpoint(struct usb_ctrlrequest* req) | 871 | static 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 */ |
889 | static void usb_core_control_request_handler(struct usb_ctrlrequest* req) | 889 | static 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() */ |
750 | bool usb_hid_control_request(struct usb_ctrlrequest *req, unsigned char *dest) | 750 | bool 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); | |||
32 | void usb_hid_init(void); | 32 | void usb_hid_init(void); |
33 | void usb_hid_disconnect(void); | 33 | void usb_hid_disconnect(void); |
34 | void usb_hid_transfer_complete(int ep, int dir, int status, int length); | 34 | void usb_hid_transfer_complete(int ep, int dir, int status, int length); |
35 | bool usb_hid_control_request(struct usb_ctrlrequest* req, unsigned char* dest); | 35 | bool usb_hid_control_request(struct usb_ctrlrequest* req, void* reqdata, unsigned char* dest); |
36 | 36 | ||
37 | void usb_hid_send(usage_page_t usage_page, int id); | 37 | void 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() */ |
280 | bool usb_serial_control_request(struct usb_ctrlrequest* req, unsigned char* dest) | 280 | bool 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); | |||
30 | void usb_serial_init(void); | 30 | void usb_serial_init(void); |
31 | void usb_serial_disconnect(void); | 31 | void usb_serial_disconnect(void); |
32 | void usb_serial_transfer_complete(int ep,int dir, int status, int length); | 32 | void usb_serial_transfer_complete(int ep,int dir, int status, int length); |
33 | bool usb_serial_control_request(struct usb_ctrlrequest* req, unsigned char *dest); | 33 | bool usb_serial_control_request(struct usb_ctrlrequest* req, void* reqdata, unsigned char *dest); |
34 | 34 | ||
35 | void usb_serial_send(const unsigned char *data, int length); | 35 | void 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() */ |
676 | bool usb_storage_control_request(struct usb_ctrlrequest* req, unsigned char* dest) | 676 | bool 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); | |||
30 | void usb_storage_disconnect(void); | 30 | void usb_storage_disconnect(void); |
31 | void usb_storage_init(void); | 31 | void usb_storage_init(void); |
32 | void usb_storage_transfer_complete(int ep,int dir,int state,int length); | 32 | void usb_storage_transfer_complete(int ep,int dir,int state,int length); |
33 | bool usb_storage_control_request(struct usb_ctrlrequest* req, unsigned char* dest); | 33 | bool usb_storage_control_request(struct usb_ctrlrequest* req, void* reqdata, unsigned char* dest); |
34 | #ifdef HAVE_HOTSWAP | 34 | #ifdef HAVE_HOTSWAP |
35 | void usb_storage_notify_hotswap(int volume,bool inserted); | 35 | void usb_storage_notify_hotswap(int volume,bool inserted); |
36 | #endif | 36 | #endif |