diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/usbstack/usb_core.c | 57 |
1 files changed, 38 insertions, 19 deletions
diff --git a/firmware/usbstack/usb_core.c b/firmware/usbstack/usb_core.c index 7b80d0bcab..a5865da9f9 100644 --- a/firmware/usbstack/usb_core.c +++ b/firmware/usbstack/usb_core.c | |||
@@ -729,7 +729,26 @@ static void request_handler_interface(struct usb_ctrlrequest* req) | |||
729 | } | 729 | } |
730 | } | 730 | } |
731 | 731 | ||
732 | static void request_handler_endpoint(struct usb_ctrlrequest* req) | 732 | static void request_handler_endoint_drivers(struct usb_ctrlrequest* req) |
733 | { | ||
734 | bool handled = false; | ||
735 | control_handler_t control_handler = NULL; | ||
736 | |||
737 | if(EP_NUM(req->wIndex) < USB_NUM_ENDPOINTS) | ||
738 | control_handler = ep_data[EP_NUM(req->wIndex)].control_handler[EP_DIR(req->wIndex)]; | ||
739 | |||
740 | if(control_handler) | ||
741 | handled = control_handler(req, response_data); | ||
742 | |||
743 | if (!handled) { | ||
744 | /* nope. flag error */ | ||
745 | logf("usb bad req %d",req->bRequest); | ||
746 | usb_drv_stall(EP_CONTROL,true,true); | ||
747 | usb_core_ack_control(req); | ||
748 | } | ||
749 | } | ||
750 | |||
751 | static void request_handler_endpoint_standard(struct usb_ctrlrequest* req) | ||
733 | { | 752 | { |
734 | switch (req->bRequest) { | 753 | switch (req->bRequest) { |
735 | case USB_REQ_CLEAR_FEATURE: | 754 | case USB_REQ_CLEAR_FEATURE: |
@@ -755,24 +774,24 @@ static void request_handler_endpoint(struct usb_ctrlrequest* req) | |||
755 | usb_drv_recv(EP_CONTROL,NULL,0); | 774 | usb_drv_recv(EP_CONTROL,NULL,0); |
756 | usb_drv_send(EP_CONTROL,response_data,2); | 775 | usb_drv_send(EP_CONTROL,response_data,2); |
757 | break; | 776 | break; |
758 | default: { | 777 | default: |
759 | bool handled; | 778 | request_handler_endoint_drivers(req); |
760 | control_handler_t control_handler; | 779 | break; |
761 | 780 | } | |
762 | control_handler= | 781 | } |
763 | ep_data[EP_NUM(req->wIndex)].control_handler[EP_CONTROL]; | 782 | |
764 | if (!control_handler) | 783 | static void request_handler_endpoint(struct usb_ctrlrequest* req) |
765 | break; | 784 | { |
766 | 785 | switch(req->bRequestType & USB_TYPE_MASK) { | |
767 | handled=control_handler(req, response_data); | 786 | case USB_TYPE_STANDARD: |
768 | if (!handled) { | 787 | request_handler_endpoint_standard(req); |
769 | /* nope. flag error */ | 788 | break; |
770 | logf("usb bad req %d",req->bRequest); | 789 | case USB_TYPE_CLASS: |
771 | usb_drv_stall(EP_CONTROL,true,true); | 790 | request_handler_endoint_drivers(req); |
772 | usb_core_ack_control(req); | 791 | break; |
773 | } | 792 | case USB_TYPE_VENDOR: |
774 | break; | 793 | default: |
775 | } | 794 | break; |
776 | } | 795 | } |
777 | } | 796 | } |
778 | 797 | ||