diff --git a/class/msc/usbd_msc.c b/class/msc/usbd_msc.c index 26ca70bf..45df1b3c 100644 --- a/class/msc/usbd_msc.c +++ b/class/msc/usbd_msc.c @@ -85,6 +85,28 @@ static int msc_storage_class_interface_request_handler(struct usb_setup_packet * void msc_storage_notify_handler(uint8_t event, void *arg) { switch (event) { + case USBD_EVENT_INIT: +#ifdef CONFIG_USBDEV_MSC_THREAD + g_usbd_msc.usbd_msc_mq = usb_osal_mq_create(1); + if (g_usbd_msc.usbd_msc_mq == NULL) { + USB_LOG_ERR("No memory to alloc for g_usbd_msc.usbd_msc_mq\r\n"); + } + g_usbd_msc.usbd_msc_thread = usb_osal_thread_create("usbd_msc", CONFIG_USBDEV_MSC_STACKSIZE, CONFIG_USBDEV_MSC_PRIO, usbdev_msc_thread, NULL); + if (g_usbd_msc.usbd_msc_thread == NULL) { + USB_LOG_ERR("No memory to alloc for g_usbd_msc.usbd_msc_thread\r\n"); + } +#endif + break; + case USBD_EVENT_DEINIT: +#ifdef CONFIG_USBDEV_MSC_THREAD + if (g_usbd_msc.usbd_msc_mq) { + usb_osal_mq_delete(g_usbd_msc.usbd_msc_mq); + } + if (g_usbd_msc.usbd_msc_thread) { + usb_osal_thread_delete(g_usbd_msc.usbd_msc_thread); + } +#endif + break; case USBD_EVENT_RESET: usbd_msc_reset(); break; @@ -888,16 +910,6 @@ struct usbd_interface *usbd_msc_init_intf(struct usbd_interface *intf, const uin return NULL; } -#ifdef CONFIG_USBDEV_MSC_THREAD - g_usbd_msc.usbd_msc_mq = usb_osal_mq_create(1); - if (g_usbd_msc.usbd_msc_mq == NULL) { - return NULL; - } - g_usbd_msc.usbd_msc_thread = usb_osal_thread_create("usbd_msc", CONFIG_USBDEV_MSC_STACKSIZE, CONFIG_USBDEV_MSC_PRIO, usbdev_msc_thread, NULL); - if (g_usbd_msc.usbd_msc_thread == NULL) { - return NULL; - } -#endif return intf; } diff --git a/core/usbd_core.c b/core/usbd_core.c index fd36019c..2768419d 100644 --- a/core/usbd_core.c +++ b/core/usbd_core.c @@ -1202,19 +1202,28 @@ bool usb_device_is_configured(void) int usbd_initialize(void) { - return usb_dc_init(); + int ret; + + ret = usb_dc_init(); + usbd_class_event_notify_handler(USBD_EVENT_INIT, NULL); + return ret; } int usbd_deinitialize(void) { g_usbd_core.intf_offset = 0; usb_dc_deinit(); + usbd_class_event_notify_handler(USBD_EVENT_DEINIT, NULL); return 0; } __WEAK void usbd_event_handler(uint8_t event) { switch (event) { + case USBD_EVENT_INIT: + break; + case USBD_EVENT_DEINIT: + break; case USBD_EVENT_RESET: break; case USBD_EVENT_CONNECTED: diff --git a/core/usbd_core.h b/core/usbd_core.h index 85d53677..ca70fc69 100644 --- a/core/usbd_core.h +++ b/core/usbd_core.h @@ -38,6 +38,8 @@ enum usbd_event_type { USBD_EVENT_SET_INTERFACE, /** USB interface selected */ USBD_EVENT_SET_REMOTE_WAKEUP, /** USB set remote wakeup */ USBD_EVENT_CLR_REMOTE_WAKEUP, /** USB clear remote wakeup */ + USBD_EVENT_INIT, /** USB init done when call usbd_initialize */ + USBD_EVENT_DEINIT, /** USB deinit done when call usbd_deinitialize */ USBD_EVENT_UNKNOWN };