From dff8320a5d04d74d8a08a81d9e6f6ed296d672ce Mon Sep 17 00:00:00 2001 From: Aidan MacDonald Date: Mon, 20 Sep 2021 01:05:39 +0100 Subject: usb: add request data argument to all control request handlers Change-Id: I237143fa0d95c914b8e25ed22f8acde96ec00551 --- firmware/usbstack/usb_class_driver.h | 2 +- firmware/usbstack/usb_core.c | 50 ++++++++++++++++++------------------ firmware/usbstack/usb_hid.c | 4 ++- firmware/usbstack/usb_hid.h | 2 +- firmware/usbstack/usb_serial.c | 4 ++- firmware/usbstack/usb_serial.h | 2 +- firmware/usbstack/usb_storage.c | 4 ++- 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 { able to handle it, it should ack the request, and return true. Otherwise it should return false. Optional function */ - bool (*control_request)(struct usb_ctrlrequest* req, unsigned char *dest); + bool (*control_request)(struct usb_ctrlrequest* req, void* reqdata, unsigned char *dest); #ifdef HAVE_HOTSWAP /* 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) static int usb_core_num_interfaces; typedef void (*completion_handler_t)(int ep, int dir, int status, int length); -typedef bool (*control_handler_t)(struct usb_ctrlrequest* req, +typedef bool (*control_handler_t)(struct usb_ctrlrequest* req, void* reqdata, unsigned char* dest); static struct @@ -262,7 +262,7 @@ static struct usb_class_driver drivers[USB_NUM_DRIVERS] = #endif }; -static void usb_core_control_request_handler(struct usb_ctrlrequest* req); +static void usb_core_control_request_handler(struct usb_ctrlrequest* req, void* reqdata); static unsigned char response_data[256] USB_DEVBSS_ATTR; @@ -449,7 +449,7 @@ void usb_core_handle_transfer_completion( ((struct usb_ctrlrequest*)event->data[0])->bRequest); usb_core_control_request_handler( - (struct usb_ctrlrequest*)event->data[0]); + (struct usb_ctrlrequest*)event->data[0], event->data[1]); break; default: handler = ep_data[ep].completion_handler[EP_DIR(event->dir)]; @@ -560,7 +560,7 @@ static void allocate_interfaces_and_endpoints(void) } -static void control_request_handler_drivers(struct usb_ctrlrequest* req) +static void control_request_handler_drivers(struct usb_ctrlrequest* req, void* reqdata) { int i, interface = req->wIndex & 0xff; bool handled = false; @@ -571,7 +571,7 @@ static void control_request_handler_drivers(struct usb_ctrlrequest* req) drivers[i].first_interface <= interface && drivers[i].last_interface > interface) { - handled = drivers[i].control_request(req, response_data); + handled = drivers[i].control_request(req, reqdata, response_data); if(handled) break; } @@ -583,7 +583,7 @@ static void control_request_handler_drivers(struct usb_ctrlrequest* req) } } -static void request_handler_device_get_descriptor(struct usb_ctrlrequest* req) +static void request_handler_device_get_descriptor(struct usb_ctrlrequest* req, void* reqdata) { int size; const void* ptr = NULL; @@ -662,7 +662,7 @@ static void request_handler_device_get_descriptor(struct usb_ctrlrequest* req) default: logf("ctrl desc."); - control_request_handler_drivers(req); + control_request_handler_drivers(req, reqdata); break; } @@ -718,7 +718,7 @@ static void usb_core_do_clear_feature(int recip, int recip_nr, int feature) } } -static void request_handler_device(struct usb_ctrlrequest* req) +static void request_handler_device(struct usb_ctrlrequest* req, void* reqdata) { switch(req->bRequest) { case USB_REQ_GET_CONFIGURATION: { @@ -744,7 +744,7 @@ static void request_handler_device(struct usb_ctrlrequest* req) } case USB_REQ_GET_DESCRIPTOR: logf("usb_core: GET_DESC %d", req->wValue >> 8); - request_handler_device_get_descriptor(req); + request_handler_device_get_descriptor(req, reqdata); break; case USB_REQ_CLEAR_FEATURE: break; @@ -768,7 +768,7 @@ static void request_handler_device(struct usb_ctrlrequest* req) } } -static void request_handler_interface_standard(struct usb_ctrlrequest* req) +static void request_handler_interface_standard(struct usb_ctrlrequest* req, void* reqdata) { switch (req->bRequest) { @@ -794,19 +794,19 @@ static void request_handler_interface_standard(struct usb_ctrlrequest* req) usb_drv_send(EP_CONTROL, response_data, 2); break; default: - control_request_handler_drivers(req); + control_request_handler_drivers(req, reqdata); break; } } -static void request_handler_interface(struct usb_ctrlrequest* req) +static void request_handler_interface(struct usb_ctrlrequest* req, void* reqdata) { switch(req->bRequestType & USB_TYPE_MASK) { case USB_TYPE_STANDARD: - request_handler_interface_standard(req); + request_handler_interface_standard(req, reqdata); break; case USB_TYPE_CLASS: - control_request_handler_drivers(req); + control_request_handler_drivers(req, reqdata); break; case USB_TYPE_VENDOR: default: @@ -816,7 +816,7 @@ static void request_handler_interface(struct usb_ctrlrequest* req) } } -static void request_handler_endoint_drivers(struct usb_ctrlrequest* req) +static void request_handler_endoint_drivers(struct usb_ctrlrequest* req, void* reqdata) { bool handled = false; control_handler_t control_handler = NULL; @@ -826,7 +826,7 @@ static void request_handler_endoint_drivers(struct usb_ctrlrequest* req) ep_data[EP_NUM(req->wIndex)].control_handler[EP_DIR(req->wIndex)]; if(control_handler) - handled = control_handler(req, response_data); + handled = control_handler(req, reqdata, response_data); if(!handled) { /* nope. flag error */ @@ -835,7 +835,7 @@ static void request_handler_endoint_drivers(struct usb_ctrlrequest* req) } } -static void request_handler_endpoint_standard(struct usb_ctrlrequest* req) +static void request_handler_endpoint_standard(struct usb_ctrlrequest* req, void* reqdata) { switch (req->bRequest) { case USB_REQ_CLEAR_FEATURE: @@ -863,19 +863,19 @@ static void request_handler_endpoint_standard(struct usb_ctrlrequest* req) usb_drv_send(EP_CONTROL, response_data, 2); break; default: - request_handler_endoint_drivers(req); + request_handler_endoint_drivers(req, reqdata); break; } } -static void request_handler_endpoint(struct usb_ctrlrequest* req) +static void request_handler_endpoint(struct usb_ctrlrequest* req, void* reqdata) { switch(req->bRequestType & USB_TYPE_MASK) { case USB_TYPE_STANDARD: - request_handler_endpoint_standard(req); + request_handler_endpoint_standard(req, reqdata); break; case USB_TYPE_CLASS: - request_handler_endoint_drivers(req); + request_handler_endoint_drivers(req, reqdata); break; case USB_TYPE_VENDOR: default: @@ -886,7 +886,7 @@ static void request_handler_endpoint(struct usb_ctrlrequest* req) } /* Handling USB requests starts here */ -static void usb_core_control_request_handler(struct usb_ctrlrequest* req) +static void usb_core_control_request_handler(struct usb_ctrlrequest* req, void* reqdata) { #ifdef HAVE_USB_CHARGING_ENABLE timeout_cancel(&usb_no_host_timeout); @@ -904,13 +904,13 @@ static void usb_core_control_request_handler(struct usb_ctrlrequest* req) switch(req->bRequestType & USB_RECIP_MASK) { case USB_RECIP_DEVICE: - request_handler_device(req); + request_handler_device(req, reqdata); break; case USB_RECIP_INTERFACE: - request_handler_interface(req); + request_handler_interface(req, reqdata); break; case USB_RECIP_ENDPOINT: - request_handler_endpoint(req); + request_handler_endpoint(req, reqdata); break; case USB_RECIP_OTHER: 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) } /* called by usb_core_control_request() */ -bool usb_hid_control_request(struct usb_ctrlrequest *req, unsigned char *dest) +bool usb_hid_control_request(struct usb_ctrlrequest *req, void *reqdata, unsigned char *dest) { + (void)reqdata; + unsigned char *orig_dest = dest; switch (req->bRequestType & USB_TYPE_MASK) { 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); void usb_hid_init(void); void usb_hid_disconnect(void); void usb_hid_transfer_complete(int ep, int dir, int status, int length); -bool usb_hid_control_request(struct usb_ctrlrequest* req, unsigned char* dest); +bool usb_hid_control_request(struct usb_ctrlrequest* req, void* reqdata, unsigned char* dest); void usb_hid_send(usage_page_t usage_page, int id); 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) } /* called by usb_core_control_request() */ -bool usb_serial_control_request(struct usb_ctrlrequest* req, unsigned char* dest) +bool usb_serial_control_request(struct usb_ctrlrequest* req, void* reqdata, unsigned char* dest) { bool handled = false; (void)dest; + (void)reqdata; + if (req->wIndex != control_interface) { 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); void usb_serial_init(void); void usb_serial_disconnect(void); void usb_serial_transfer_complete(int ep,int dir, int status, int length); -bool usb_serial_control_request(struct usb_ctrlrequest* req, unsigned char *dest); +bool usb_serial_control_request(struct usb_ctrlrequest* req, void* reqdata, unsigned char *dest); void usb_serial_send(const unsigned char *data, int length); 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) } /* called by usb_core_control_request() */ -bool usb_storage_control_request(struct usb_ctrlrequest* req, unsigned char* dest) +bool usb_storage_control_request(struct usb_ctrlrequest* req, void* reqdata, unsigned char* dest) { bool handled = false; (void)dest; + (void)reqdata; + switch (req->bRequest) { case USB_BULK_GET_MAX_LUN: { *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); void usb_storage_disconnect(void); void usb_storage_init(void); void usb_storage_transfer_complete(int ep,int dir,int state,int length); -bool usb_storage_control_request(struct usb_ctrlrequest* req, unsigned char* dest); +bool usb_storage_control_request(struct usb_ctrlrequest* req, void* reqdata, unsigned char* dest); #ifdef HAVE_HOTSWAP void usb_storage_notify_hotswap(int volume,bool inserted); #endif -- cgit v1.2.3