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.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/firmware/usbstack/usb_core.c b/firmware/usbstack/usb_core.c
index 130111cdfe..e4ecc90e63 100644
--- a/firmware/usbstack/usb_core.c
+++ b/firmware/usbstack/usb_core.c
@@ -168,6 +168,7 @@ static const struct usb_string_descriptor* const usb_strings[] =
168 168
169static int usb_address = 0; 169static int usb_address = 0;
170static bool initialized = false; 170static bool initialized = false;
171static bool drivers_connected = false;
171static enum { DEFAULT, ADDRESS, CONFIGURED } usb_state; 172static enum { DEFAULT, ADDRESS, CONFIGURED } usb_state;
172 173
173#ifdef HAVE_USB_CHARGING_ENABLE 174#ifdef HAVE_USB_CHARGING_ENABLE
@@ -413,12 +414,16 @@ void usb_core_init(void)
413void usb_core_exit(void) 414void usb_core_exit(void)
414{ 415{
415 int i; 416 int i;
416 for(i = 0; i < USB_NUM_DRIVERS; i++) 417 if(drivers_connected)
417 if(drivers[i].enabled && drivers[i].disconnect != NULL) 418 {
418 { 419 for(i = 0; i < USB_NUM_DRIVERS; i++)
419 drivers[i].disconnect(); 420 if(drivers[i].enabled && drivers[i].disconnect != NULL)
420 drivers[i].enabled = false; 421 {
421 } 422 drivers[i].disconnect();
423 drivers[i].enabled = false;
424 }
425 drivers_connected = false;
426 }
422 427
423 if(initialized) { 428 if(initialized) {
424 usb_drv_exit(); 429 usb_drv_exit();
@@ -676,12 +681,19 @@ static void usb_core_do_set_addr(uint8_t address)
676 681
677static void usb_core_do_set_config(uint8_t config) 682static void usb_core_do_set_config(uint8_t config)
678{ 683{
679 logf("usb_core: SET_CONFIG"); 684 logf("usb_core: SET_CONFIG %d",config);
680 if(config) { 685 if(config) {
681 usb_state = CONFIGURED; 686 usb_state = CONFIGURED;
687
688 if(drivers_connected)
689 for(int i = 0; i < USB_NUM_DRIVERS; i++)
690 if(drivers[i].enabled && drivers[i].disconnect != NULL)
691 drivers[i].disconnect();
692
682 for(int i = 0; i < USB_NUM_DRIVERS; i++) 693 for(int i = 0; i < USB_NUM_DRIVERS; i++)
683 if(drivers[i].enabled && drivers[i].init_connection) 694 if(drivers[i].enabled && drivers[i].init_connection)
684 drivers[i].init_connection(); 695 drivers[i].init_connection();
696 drivers_connected = true;
685 } 697 }
686 else 698 else
687 usb_state = ADDRESS; 699 usb_state = ADDRESS;
@@ -718,7 +730,6 @@ static void request_handler_device(struct usb_ctrlrequest* req)
718 } 730 }
719 case USB_REQ_SET_ADDRESS: { 731 case USB_REQ_SET_ADDRESS: {
720 unsigned char address = req->wValue; 732 unsigned char address = req->wValue;
721 logf("usb_core: SET_ADR %d", address);
722 usb_drv_send(EP_CONTROL, NULL, 0); 733 usb_drv_send(EP_CONTROL, NULL, 0);
723 usb_drv_cancel_all_transfers(); 734 usb_drv_cancel_all_transfers();
724 usb_drv_set_address(address); 735 usb_drv_set_address(address);
@@ -906,6 +917,7 @@ static void usb_core_control_request_handler(struct usb_ctrlrequest* req)
906/* called by usb_drv_int() */ 917/* called by usb_drv_int() */
907void usb_core_bus_reset(void) 918void usb_core_bus_reset(void)
908{ 919{
920 logf("usb_core: bus reset");
909 usb_address = 0; 921 usb_address = 0;
910 usb_state = DEFAULT; 922 usb_state = DEFAULT;
911#ifdef HAVE_USB_CHARGING_ENABLE 923#ifdef HAVE_USB_CHARGING_ENABLE