summaryrefslogtreecommitdiff
path: root/firmware/usbstack/usb_core.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/usbstack/usb_core.c')
-rw-r--r--firmware/usbstack/usb_core.c40
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
454int usb_core_request_endpoint(int dir, struct usb_class_driver* drv) 454int 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
513static void control_request_handler_drivers(struct usb_ctrlrequest* req) 513static 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)
835void usb_core_control_request(struct usb_ctrlrequest* req) 835void 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;