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.c70
1 files changed, 53 insertions, 17 deletions
diff --git a/firmware/usbstack/usb_core.c b/firmware/usbstack/usb_core.c
index 801325b692..2a3cc1c525 100644
--- a/firmware/usbstack/usb_core.c
+++ b/firmware/usbstack/usb_core.c
@@ -663,10 +663,31 @@ static void request_handler_device_get_descriptor(struct usb_ctrlrequest* req)
663 } 663 }
664} 664}
665 665
666static void request_handler_device(struct usb_ctrlrequest* req) 666static void usb_core_do_set_addr(uint8_t address)
667{ 667{
668 int i; 668 logf("usb_core: SET_ADR %d", address);
669 usb_address = address;
670 usb_state = ADDRESS;
671}
672
673static void usb_core_do_set_config(uint8_t config)
674{
675 logf("usb_core: SET_CONFIG");
676 if(config) {
677 usb_state = CONFIGURED;
678 for(int i = 0; i < USB_NUM_DRIVERS; i++)
679 if(drivers[i].enabled && drivers[i].init_connection)
680 drivers[i].init_connection();
681 }
682 else
683 usb_state = ADDRESS;
684 #ifdef HAVE_USB_CHARGING_ENABLE
685 usb_charging_maxcurrent_change(usb_charging_maxcurrent());
686 #endif
687}
669 688
689static void request_handler_device(struct usb_ctrlrequest* req)
690{
670 switch(req->bRequest) { 691 switch(req->bRequest) {
671 case USB_REQ_GET_CONFIGURATION: { 692 case USB_REQ_GET_CONFIGURATION: {
672 logf("usb_core: GET_CONFIG"); 693 logf("usb_core: GET_CONFIG");
@@ -676,20 +697,9 @@ static void request_handler_device(struct usb_ctrlrequest* req)
676 break; 697 break;
677 } 698 }
678 case USB_REQ_SET_CONFIGURATION: { 699 case USB_REQ_SET_CONFIGURATION: {
679 logf("usb_core: SET_CONFIG");
680 usb_drv_cancel_all_transfers(); 700 usb_drv_cancel_all_transfers();
681 if(req->wValue) { 701 usb_core_do_set_config(req->wValue);
682 usb_state = CONFIGURED;
683 for(i = 0; i < USB_NUM_DRIVERS; i++)
684 if(drivers[i].enabled && drivers[i].init_connection)
685 drivers[i].init_connection();
686 }
687 else
688 usb_state = ADDRESS;
689 usb_drv_send(EP_CONTROL, NULL, 0); 702 usb_drv_send(EP_CONTROL, NULL, 0);
690#ifdef HAVE_USB_CHARGING_ENABLE
691 usb_charging_maxcurrent_change(usb_charging_maxcurrent());
692#endif
693 break; 703 break;
694 } 704 }
695 case USB_REQ_SET_ADDRESS: { 705 case USB_REQ_SET_ADDRESS: {
@@ -697,9 +707,8 @@ static void request_handler_device(struct usb_ctrlrequest* req)
697 logf("usb_core: SET_ADR %d", address); 707 logf("usb_core: SET_ADR %d", address);
698 usb_drv_send(EP_CONTROL, NULL, 0); 708 usb_drv_send(EP_CONTROL, NULL, 0);
699 usb_drv_cancel_all_transfers(); 709 usb_drv_cancel_all_transfers();
700 usb_address = address; 710 usb_drv_set_address(address);
701 usb_drv_set_address(usb_address); 711 usb_core_do_set_addr(address);
702 usb_state = ADDRESS;
703 break; 712 break;
704 } 713 }
705 case USB_REQ_GET_DESCRIPTOR: 714 case USB_REQ_GET_DESCRIPTOR:
@@ -913,6 +922,21 @@ void usb_core_transfer_complete(int endpoint, int dir, int status, int length)
913 } 922 }
914} 923}
915 924
925void usb_core_handle_notify(long id, intptr_t data)
926{
927 switch(id)
928 {
929 case USB_NOTIFY_SET_ADDR:
930 usb_core_do_set_addr(data);
931 break;
932 case USB_NOTIFY_SET_CONFIG:
933 usb_core_do_set_config(data);
934 break;
935 default:
936 break;
937 }
938}
939
916/* called by usb_drv_int() */ 940/* called by usb_drv_int() */
917void usb_core_control_request(struct usb_ctrlrequest* req) 941void usb_core_control_request(struct usb_ctrlrequest* req)
918{ 942{
@@ -928,6 +952,18 @@ void usb_core_control_request(struct usb_ctrlrequest* req)
928 usb_signal_transfer_completion(completion_event); 952 usb_signal_transfer_completion(completion_event);
929} 953}
930 954
955void usb_core_notify_set_address(uint8_t addr)
956{
957 logf("notify set addr received %ld", current_tick);
958 usb_signal_notify(USB_NOTIFY_SET_ADDR, addr);
959}
960
961void usb_core_notify_set_config(uint8_t config)
962{
963 logf("notify set config received %ld", current_tick);
964 usb_signal_notify(USB_NOTIFY_SET_CONFIG, config);
965}
966
931#ifdef HAVE_USB_CHARGING_ENABLE 967#ifdef HAVE_USB_CHARGING_ENABLE
932void usb_charging_enable(int state) 968void usb_charging_enable(int state)
933{ 969{