summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/usbstack/usb_core.c57
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
732static void request_handler_endpoint(struct usb_ctrlrequest* req) 732static 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
751static 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) 783static 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