diff options
Diffstat (limited to 'firmware/usbstack/usb_core.c')
-rw-r--r-- | firmware/usbstack/usb_core.c | 40 |
1 files changed, 20 insertions, 20 deletions
diff --git a/firmware/usbstack/usb_core.c b/firmware/usbstack/usb_core.c index 1e22ead63b..250544f202 100644 --- a/firmware/usbstack/usb_core.c +++ b/firmware/usbstack/usb_core.c | |||
@@ -397,7 +397,7 @@ void usb_core_handle_transfer_completion( | |||
397 | (struct usb_ctrlrequest*)event->data); | 397 | (struct usb_ctrlrequest*)event->data); |
398 | break; | 398 | break; |
399 | default: | 399 | default: |
400 | handler = ep_data[ep].completion_handler[event->dir>>7]; | 400 | handler = ep_data[ep].completion_handler[EP_DIR(event->dir)]; |
401 | if(handler != NULL) | 401 | if(handler != NULL) |
402 | handler(ep,event->dir,event->status,event->length); | 402 | handler(ep,event->dir,event->status,event->length); |
403 | break; | 403 | break; |
@@ -451,17 +451,17 @@ static void usb_core_set_serial_function_id(void) | |||
451 | usb_string_iSerial.wString[0] = hex[id]; | 451 | usb_string_iSerial.wString[0] = hex[id]; |
452 | } | 452 | } |
453 | 453 | ||
454 | int usb_core_request_endpoint(int dir, struct usb_class_driver* drv) | 454 | int usb_core_request_endpoint(int type, int dir, struct usb_class_driver* drv) |
455 | { | 455 | { |
456 | int ret, ep; | 456 | int ret, ep; |
457 | 457 | ||
458 | ret = usb_drv_request_endpoint(dir); | 458 | ret = usb_drv_request_endpoint(type, dir); |
459 | 459 | ||
460 | if (ret==-1) | 460 | if (ret==-1) |
461 | return -1; | 461 | return -1; |
462 | 462 | ||
463 | ep = ret & 0x7f; | 463 | dir = EP_DIR(ret); |
464 | dir = ret >> 7; | 464 | ep = EP_NUM(ret); |
465 | 465 | ||
466 | ep_data[ep].completion_handler[dir] = drv->transfer_complete; | 466 | ep_data[ep].completion_handler[dir] = drv->transfer_complete; |
467 | ep_data[ep].control_handler[dir] = drv->control_request; | 467 | ep_data[ep].control_handler[dir] = drv->control_request; |
@@ -475,8 +475,8 @@ void usb_core_release_endpoint(int ep) | |||
475 | 475 | ||
476 | usb_drv_release_endpoint(ep); | 476 | usb_drv_release_endpoint(ep); |
477 | 477 | ||
478 | dir = ep >> 7; | 478 | dir = EP_DIR(ep); |
479 | ep &= 0x7f; | 479 | ep = EP_NUM(ep); |
480 | 480 | ||
481 | ep_data[ep].completion_handler[dir] = NULL; | 481 | ep_data[ep].completion_handler[dir] = NULL; |
482 | ep_data[ep].control_handler[dir] = NULL; | 482 | ep_data[ep].control_handler[dir] = NULL; |
@@ -512,13 +512,14 @@ static void allocate_interfaces_and_endpoints(void) | |||
512 | 512 | ||
513 | static void control_request_handler_drivers(struct usb_ctrlrequest* req) | 513 | static void control_request_handler_drivers(struct usb_ctrlrequest* req) |
514 | { | 514 | { |
515 | int i; | 515 | int i, interface = req->wIndex; |
516 | bool handled=false; | 516 | bool handled=false; |
517 | |||
517 | for(i=0;i<USB_NUM_DRIVERS;i++) { | 518 | for(i=0;i<USB_NUM_DRIVERS;i++) { |
518 | if(drivers[i].enabled && | 519 | if(drivers[i].enabled && |
519 | drivers[i].control_request && | 520 | drivers[i].control_request && |
520 | drivers[i].first_interface <= (req->wIndex) && | 521 | drivers[i].first_interface <= interface && |
521 | drivers[i].last_interface > (req->wIndex)) | 522 | drivers[i].last_interface > interface) |
522 | { | 523 | { |
523 | handled = drivers[i].control_request(req, response_data); | 524 | handled = drivers[i].control_request(req, response_data); |
524 | if(handled) | 525 | if(handled) |
@@ -528,7 +529,7 @@ static void control_request_handler_drivers(struct usb_ctrlrequest* req) | |||
528 | if(!handled) { | 529 | if(!handled) { |
529 | /* nope. flag error */ | 530 | /* nope. flag error */ |
530 | logf("bad req:desc %d:%d", req->bRequest, req->wValue>>8); | 531 | logf("bad req:desc %d:%d", req->bRequest, req->wValue>>8); |
531 | usb_drv_stall(EP_CONTROL, true,true); | 532 | usb_drv_stall(EP_CONTROL, true, true); |
532 | usb_core_ack_control(req); | 533 | usb_core_ack_control(req); |
533 | } | 534 | } |
534 | } | 535 | } |
@@ -730,15 +731,13 @@ static void request_handler_endpoint(struct usb_ctrlrequest* req) | |||
730 | switch (req->bRequest) { | 731 | switch (req->bRequest) { |
731 | case USB_REQ_CLEAR_FEATURE: | 732 | case USB_REQ_CLEAR_FEATURE: |
732 | if (req->wValue==USB_ENDPOINT_HALT) { | 733 | if (req->wValue==USB_ENDPOINT_HALT) { |
733 | usb_drv_stall(req->wIndex & 0xf, false, | 734 | usb_drv_stall(EP_NUM(req->wIndex), false, EP_DIR(req->wIndex)); |
734 | (req->wIndex & USB_DIR_IN)!=0); | ||
735 | } | 735 | } |
736 | usb_core_ack_control(req); | 736 | usb_core_ack_control(req); |
737 | break; | 737 | break; |
738 | case USB_REQ_SET_FEATURE: | 738 | case USB_REQ_SET_FEATURE: |
739 | if (req->wValue==USB_ENDPOINT_HALT) { | 739 | if (req->wValue==USB_ENDPOINT_HALT) { |
740 | usb_drv_stall(req->wIndex & 0xf,true, | 740 | usb_drv_stall(EP_NUM(req->wIndex), true, EP_DIR(req->wIndex)); |
741 | (req->wIndex & USB_DIR_IN)!=0); | ||
742 | } | 741 | } |
743 | usb_core_ack_control(req); | 742 | usb_core_ack_control(req); |
744 | break; | 743 | break; |
@@ -747,8 +746,8 @@ static void request_handler_endpoint(struct usb_ctrlrequest* req) | |||
747 | response_data[1]=0; | 746 | response_data[1]=0; |
748 | logf("usb_core: GET_STATUS"); | 747 | logf("usb_core: GET_STATUS"); |
749 | if(req->wIndex>0) { | 748 | if(req->wIndex>0) { |
750 | response_data[0]=usb_drv_stalled(req->wIndex & 0xf, | 749 | response_data[0]=usb_drv_stalled(EP_NUM(req->wIndex), |
751 | (req->wIndex & USB_DIR_IN)!=0); | 750 | EP_DIR(req->wIndex)); |
752 | } | 751 | } |
753 | if(!usb_drv_send(EP_CONTROL,response_data,2)) | 752 | if(!usb_drv_send(EP_CONTROL,response_data,2)) |
754 | usb_core_ack_control(req); | 753 | usb_core_ack_control(req); |
@@ -757,7 +756,8 @@ static void request_handler_endpoint(struct usb_ctrlrequest* req) | |||
757 | bool handled; | 756 | bool handled; |
758 | control_handler_t control_handler; | 757 | control_handler_t control_handler; |
759 | 758 | ||
760 | control_handler=ep_data[req->wIndex & 0xf].control_handler[0]; | 759 | control_handler= |
760 | ep_data[EP_NUM(req->wIndex)].control_handler[EP_CONTROL]; | ||
761 | if (!control_handler) | 761 | if (!control_handler) |
762 | break; | 762 | break; |
763 | 763 | ||
@@ -835,9 +835,9 @@ void usb_core_transfer_complete(int endpoint,int dir,int status,int length) | |||
835 | void usb_core_control_request(struct usb_ctrlrequest* req) | 835 | void usb_core_control_request(struct usb_ctrlrequest* req) |
836 | { | 836 | { |
837 | struct usb_transfer_completion_event_data* completion_event = | 837 | struct usb_transfer_completion_event_data* completion_event = |
838 | &ep_data[0].completion_event; | 838 | &ep_data[EP_CONTROL].completion_event; |
839 | 839 | ||
840 | completion_event->endpoint=0; | 840 | completion_event->endpoint=EP_CONTROL; |
841 | completion_event->dir=0; | 841 | completion_event->dir=0; |
842 | completion_event->data=(void*)req; | 842 | completion_event->data=(void*)req; |
843 | completion_event->status=0; | 843 | completion_event->status=0; |