summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAidan MacDonald <amachronic@protonmail.com>2021-09-20 01:59:52 +0100
committerAidan MacDonald <amachronic@protonmail.com>2021-10-16 21:14:42 +0100
commit77731c3579e6311edf729de7899bfcbfd735ffa5 (patch)
tree28fc70b193322543186ba5a4924c2ae4a70ce046
parent82efb1150e2c47b13857cc705b46fba4a57a9cf5 (diff)
downloadrockbox-77731c3579e6311edf729de7899bfcbfd735ffa5.tar.gz
rockbox-77731c3579e6311edf729de7899bfcbfd735ffa5.zip
usb: port usb_core control request handling to new API
Change-Id: I3850c9cfcb87831e56884c83e31f728590b76f83
-rw-r--r--firmware/usbstack/usb_core.c108
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)
729static void request_handler_device(struct usb_ctrlrequest* req, void* reqdata) 730static 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
827static void request_handler_endoint_drivers(struct usb_ctrlrequest* req, void* reqdata) 825static 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() */