diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/usbstack/usb_core.c | 108 |
1 files changed, 52 insertions, 56 deletions
diff --git a/firmware/usbstack/usb_core.c b/firmware/usbstack/usb_core.c index 9afaf5c336..5e87b0ad69 100644 --- a/firmware/usbstack/usb_core.c +++ b/firmware/usbstack/usb_core.c | |||
@@ -587,7 +587,7 @@ static void control_request_handler_drivers(struct usb_ctrlrequest* req, void* r | |||
587 | if(!handled) { | 587 | if(!handled) { |
588 | /* nope. flag error */ | 588 | /* nope. flag error */ |
589 | logf("bad req:desc %d:%d", req->bRequest, req->wValue >> 8); | 589 | logf("bad req:desc %d:%d", req->bRequest, req->wValue >> 8); |
590 | usb_drv_stall(EP_CONTROL, true, true); | 590 | usb_drv_control_response(USB_CONTROL_STALL, NULL, 0); |
591 | } | 591 | } |
592 | } | 592 | } |
593 | 593 | ||
@@ -659,7 +659,7 @@ static void request_handler_device_get_descriptor(struct usb_ctrlrequest* req, v | |||
659 | } | 659 | } |
660 | else { | 660 | else { |
661 | logf("bad string id %d", index); | 661 | logf("bad string id %d", index); |
662 | usb_drv_stall(EP_CONTROL, true, true); | 662 | ptr = NULL; |
663 | } | 663 | } |
664 | break; | 664 | break; |
665 | 665 | ||
@@ -671,7 +671,7 @@ static void request_handler_device_get_descriptor(struct usb_ctrlrequest* req, v | |||
671 | default: | 671 | default: |
672 | logf("ctrl desc."); | 672 | logf("ctrl desc."); |
673 | control_request_handler_drivers(req, reqdata); | 673 | control_request_handler_drivers(req, reqdata); |
674 | break; | 674 | return; |
675 | } | 675 | } |
676 | 676 | ||
677 | if(ptr) { | 677 | if(ptr) { |
@@ -681,8 +681,9 @@ static void request_handler_device_get_descriptor(struct usb_ctrlrequest* req, v | |||
681 | if (ptr != response_data) | 681 | if (ptr != response_data) |
682 | memcpy(response_data, ptr, length); | 682 | memcpy(response_data, ptr, length); |
683 | 683 | ||
684 | usb_drv_recv_nonblocking(EP_CONTROL, NULL, 0); | 684 | usb_drv_control_response(USB_CONTROL_ACK, response_data, length); |
685 | usb_drv_send(EP_CONTROL, response_data, length); | 685 | } else { |
686 | usb_drv_control_response(USB_CONTROL_STALL, NULL, 0); | ||
686 | } | 687 | } |
687 | } | 688 | } |
688 | 689 | ||
@@ -729,49 +730,46 @@ static void usb_core_do_clear_feature(int recip, int recip_nr, int feature) | |||
729 | static void request_handler_device(struct usb_ctrlrequest* req, void* reqdata) | 730 | static void request_handler_device(struct usb_ctrlrequest* req, void* reqdata) |
730 | { | 731 | { |
731 | switch(req->bRequest) { | 732 | switch(req->bRequest) { |
732 | case USB_REQ_GET_CONFIGURATION: { | 733 | case USB_REQ_GET_CONFIGURATION: |
733 | logf("usb_core: GET_CONFIG"); | 734 | logf("usb_core: GET_CONFIG"); |
734 | response_data[0] = (usb_state == ADDRESS ? 0 : 1); | 735 | response_data[0] = (usb_state == ADDRESS ? 0 : 1); |
735 | usb_drv_recv_nonblocking(EP_CONTROL, NULL, 0); | 736 | usb_drv_control_response(USB_CONTROL_ACK, response_data, 1); |
736 | usb_drv_send(EP_CONTROL, response_data, 1); | 737 | break; |
737 | break; | 738 | case USB_REQ_SET_CONFIGURATION: |
738 | } | 739 | usb_drv_cancel_all_transfers(); |
739 | case USB_REQ_SET_CONFIGURATION: { | 740 | usb_core_do_set_config(req->wValue); |
740 | usb_drv_cancel_all_transfers(); | 741 | usb_drv_control_response(USB_CONTROL_ACK, NULL, 0); |
741 | usb_core_do_set_config(req->wValue); | 742 | break; |
742 | usb_drv_send(EP_CONTROL, NULL, 0); | 743 | case USB_REQ_SET_ADDRESS: |
743 | break; | 744 | /* NOTE: We really have no business handling this and drivers |
744 | } | 745 | * should just handle it themselves. We don't care beyond |
745 | case USB_REQ_SET_ADDRESS: { | 746 | * knowing if we've been assigned an address yet, or not. */ |
746 | unsigned char address = req->wValue; | 747 | usb_drv_control_response(USB_CONTROL_ACK, NULL, 0); |
747 | usb_drv_send(EP_CONTROL, NULL, 0); | 748 | usb_drv_cancel_all_transfers(); |
748 | usb_drv_cancel_all_transfers(); | 749 | usb_drv_set_address(req->wValue); |
749 | usb_drv_set_address(address); | 750 | usb_core_do_set_addr(req->wValue); |
750 | usb_core_do_set_addr(address); | 751 | break; |
751 | break; | ||
752 | } | ||
753 | case USB_REQ_GET_DESCRIPTOR: | 752 | case USB_REQ_GET_DESCRIPTOR: |
754 | logf("usb_core: GET_DESC %d", req->wValue >> 8); | 753 | logf("usb_core: GET_DESC %d", req->wValue >> 8); |
755 | request_handler_device_get_descriptor(req, reqdata); | 754 | request_handler_device_get_descriptor(req, reqdata); |
756 | break; | 755 | break; |
757 | case USB_REQ_CLEAR_FEATURE: | ||
758 | break; | ||
759 | case USB_REQ_SET_FEATURE: | 756 | case USB_REQ_SET_FEATURE: |
760 | if(req->wValue==USB_DEVICE_TEST_MODE) { | 757 | if(req->wValue==USB_DEVICE_TEST_MODE) { |
761 | int mode = req->wIndex >> 8; | 758 | int mode = req->wIndex >> 8; |
762 | usb_drv_send(EP_CONTROL, NULL, 0); | 759 | usb_drv_control_response(USB_CONTROL_ACK, NULL, 0); |
763 | usb_drv_set_test_mode(mode); | 760 | usb_drv_set_test_mode(mode); |
761 | } else { | ||
762 | usb_drv_control_response(USB_CONTROL_STALL, NULL, 0); | ||
764 | } | 763 | } |
765 | break; | 764 | break; |
766 | case USB_REQ_GET_STATUS: | 765 | case USB_REQ_GET_STATUS: |
767 | response_data[0] = 0; | 766 | response_data[0] = 0; |
768 | response_data[1] = 0; | 767 | response_data[1] = 0; |
769 | usb_drv_recv_nonblocking(EP_CONTROL, NULL, 0); | 768 | usb_drv_control_response(USB_CONTROL_ACK, response_data, 2); |
770 | usb_drv_send(EP_CONTROL, response_data, 2); | ||
771 | break; | 769 | break; |
772 | default: | 770 | default: |
773 | logf("bad req:desc %d:%d", req->bRequest, req->wValue); | 771 | logf("bad req:desc %d:%d", req->bRequest, req->wValue); |
774 | usb_drv_stall(EP_CONTROL, true, true); | 772 | usb_drv_control_response(USB_CONTROL_STALL, NULL, 0); |
775 | break; | 773 | break; |
776 | } | 774 | } |
777 | } | 775 | } |
@@ -782,24 +780,24 @@ static void request_handler_interface_standard(struct usb_ctrlrequest* req, void | |||
782 | { | 780 | { |
783 | case USB_REQ_SET_INTERFACE: | 781 | case USB_REQ_SET_INTERFACE: |
784 | logf("usb_core: SET_INTERFACE"); | 782 | logf("usb_core: SET_INTERFACE"); |
785 | usb_drv_send(EP_CONTROL, NULL, 0); | 783 | usb_drv_control_response(USB_CONTROL_ACK, NULL, 0); |
786 | break; | 784 | break; |
787 | 785 | ||
788 | case USB_REQ_GET_INTERFACE: | 786 | case USB_REQ_GET_INTERFACE: |
789 | logf("usb_core: GET_INTERFACE"); | 787 | logf("usb_core: GET_INTERFACE"); |
790 | response_data[0] = 0; | 788 | response_data[0] = 0; |
791 | usb_drv_recv_nonblocking(EP_CONTROL, NULL, 0); | 789 | usb_drv_control_response(USB_CONTROL_ACK, response_data, 1); |
792 | usb_drv_send(EP_CONTROL, response_data, 1); | ||
793 | break; | ||
794 | case USB_REQ_CLEAR_FEATURE: | ||
795 | break; | ||
796 | case USB_REQ_SET_FEATURE: | ||
797 | break; | 790 | break; |
798 | case USB_REQ_GET_STATUS: | 791 | case USB_REQ_GET_STATUS: |
799 | response_data[0] = 0; | 792 | response_data[0] = 0; |
800 | response_data[1] = 0; | 793 | response_data[1] = 0; |
801 | usb_drv_recv_nonblocking(EP_CONTROL, NULL, 0); | 794 | usb_drv_control_response(USB_CONTROL_ACK, response_data, 2); |
802 | usb_drv_send(EP_CONTROL, response_data, 2); | 795 | break; |
796 | case USB_REQ_CLEAR_FEATURE: | ||
797 | case USB_REQ_SET_FEATURE: | ||
798 | /* TODO: These used to be ignored (erroneously). | ||
799 | * Should they be passed to the drivers instead? */ | ||
800 | usb_drv_control_response(USB_CONTROL_STALL, NULL, 0); | ||
803 | break; | 801 | break; |
804 | default: | 802 | default: |
805 | control_request_handler_drivers(req, reqdata); | 803 | control_request_handler_drivers(req, reqdata); |
@@ -819,12 +817,12 @@ static void request_handler_interface(struct usb_ctrlrequest* req, void* reqdata | |||
819 | case USB_TYPE_VENDOR: | 817 | case USB_TYPE_VENDOR: |
820 | default: | 818 | default: |
821 | logf("bad req:desc %d", req->bRequest); | 819 | logf("bad req:desc %d", req->bRequest); |
822 | usb_drv_stall(EP_CONTROL, true, true); | 820 | usb_drv_control_response(USB_CONTROL_STALL, NULL, 0); |
823 | break; | 821 | break; |
824 | } | 822 | } |
825 | } | 823 | } |
826 | 824 | ||
827 | static void request_handler_endoint_drivers(struct usb_ctrlrequest* req, void* reqdata) | 825 | static void request_handler_endpoint_drivers(struct usb_ctrlrequest* req, void* reqdata) |
828 | { | 826 | { |
829 | bool handled = false; | 827 | bool handled = false; |
830 | control_handler_t control_handler = NULL; | 828 | control_handler_t control_handler = NULL; |
@@ -839,7 +837,7 @@ static void request_handler_endoint_drivers(struct usb_ctrlrequest* req, void* r | |||
839 | if(!handled) { | 837 | if(!handled) { |
840 | /* nope. flag error */ | 838 | /* nope. flag error */ |
841 | logf("usb bad req %d", req->bRequest); | 839 | logf("usb bad req %d", req->bRequest); |
842 | usb_drv_stall(EP_CONTROL, true, true); | 840 | usb_drv_control_response(USB_CONTROL_STALL, NULL, 0); |
843 | } | 841 | } |
844 | } | 842 | } |
845 | 843 | ||
@@ -850,14 +848,14 @@ static void request_handler_endpoint_standard(struct usb_ctrlrequest* req, void* | |||
850 | usb_core_do_clear_feature(USB_RECIP_ENDPOINT, | 848 | usb_core_do_clear_feature(USB_RECIP_ENDPOINT, |
851 | req->wIndex, | 849 | req->wIndex, |
852 | req->wValue); | 850 | req->wValue); |
853 | usb_drv_send(EP_CONTROL, NULL, 0); | 851 | usb_drv_control_response(USB_CONTROL_ACK, NULL, 0); |
854 | break; | 852 | break; |
855 | case USB_REQ_SET_FEATURE: | 853 | case USB_REQ_SET_FEATURE: |
856 | logf("usb_core: SET FEATURE (%d)", req->wValue); | 854 | logf("usb_core: SET FEATURE (%d)", req->wValue); |
857 | if(req->wValue == USB_ENDPOINT_HALT) | 855 | if(req->wValue == USB_ENDPOINT_HALT) |
858 | usb_drv_stall(EP_NUM(req->wIndex), true, EP_DIR(req->wIndex)); | 856 | usb_drv_stall(EP_NUM(req->wIndex), true, EP_DIR(req->wIndex)); |
859 | 857 | ||
860 | usb_drv_send(EP_CONTROL, NULL, 0); | 858 | usb_drv_control_response(USB_CONTROL_ACK, NULL, 0); |
861 | break; | 859 | break; |
862 | case USB_REQ_GET_STATUS: | 860 | case USB_REQ_GET_STATUS: |
863 | response_data[0] = 0; | 861 | response_data[0] = 0; |
@@ -866,12 +864,11 @@ static void request_handler_endpoint_standard(struct usb_ctrlrequest* req, void* | |||
866 | if(req->wIndex > 0) | 864 | if(req->wIndex > 0) |
867 | response_data[0] = usb_drv_stalled(EP_NUM(req->wIndex), | 865 | response_data[0] = usb_drv_stalled(EP_NUM(req->wIndex), |
868 | EP_DIR(req->wIndex)); | 866 | EP_DIR(req->wIndex)); |
869 | 867 | ||
870 | usb_drv_recv_nonblocking(EP_CONTROL, NULL, 0); | 868 | usb_drv_control_response(USB_CONTROL_ACK, response_data, 2); |
871 | usb_drv_send(EP_CONTROL, response_data, 2); | ||
872 | break; | 869 | break; |
873 | default: | 870 | default: |
874 | request_handler_endoint_drivers(req, reqdata); | 871 | request_handler_endpoint_drivers(req, reqdata); |
875 | break; | 872 | break; |
876 | } | 873 | } |
877 | } | 874 | } |
@@ -883,12 +880,12 @@ static void request_handler_endpoint(struct usb_ctrlrequest* req, void* reqdata) | |||
883 | request_handler_endpoint_standard(req, reqdata); | 880 | request_handler_endpoint_standard(req, reqdata); |
884 | break; | 881 | break; |
885 | case USB_TYPE_CLASS: | 882 | case USB_TYPE_CLASS: |
886 | request_handler_endoint_drivers(req, reqdata); | 883 | request_handler_endpoint_drivers(req, reqdata); |
887 | break; | 884 | break; |
888 | case USB_TYPE_VENDOR: | 885 | case USB_TYPE_VENDOR: |
889 | default: | 886 | default: |
890 | logf("bad req:desc %d", req->bRequest); | 887 | logf("bad req:desc %d", req->bRequest); |
891 | usb_drv_stall(EP_CONTROL, true, true); | 888 | usb_drv_control_response(USB_CONTROL_STALL, NULL, 0); |
892 | break; | 889 | break; |
893 | } | 890 | } |
894 | } | 891 | } |
@@ -920,12 +917,11 @@ static void usb_core_control_request_handler(struct usb_ctrlrequest* req, void* | |||
920 | case USB_RECIP_ENDPOINT: | 917 | case USB_RECIP_ENDPOINT: |
921 | request_handler_endpoint(req, reqdata); | 918 | request_handler_endpoint(req, reqdata); |
922 | break; | 919 | break; |
923 | case USB_RECIP_OTHER: | 920 | default: |
924 | logf("unsupported recipient"); | 921 | logf("unsupported recipient"); |
925 | usb_drv_stall(EP_CONTROL, true, true); | 922 | usb_drv_control_response(USB_CONTROL_STALL, NULL, 0); |
926 | break; | 923 | break; |
927 | } | 924 | } |
928 | //logf("control handled"); | ||
929 | } | 925 | } |
930 | 926 | ||
931 | /* called by usb_drv_int() */ | 927 | /* called by usb_drv_int() */ |