diff --git a/cherryusb_config_template.h b/cherryusb_config_template.h index 4c2c5a0a..4cea5509 100644 --- a/cherryusb_config_template.h +++ b/cherryusb_config_template.h @@ -148,8 +148,6 @@ #define CONFIG_USBDEV_MAX_BUS 1 // for now, bus num must be 1 except hpm ip -#define USBD_IRQHandler USBD_IRQHandler -#define USBD_BASE (0) #define CONFIG_USBDEV_EP_NUM 4 /* ================ USB Host Port Configuration ==================*/ diff --git a/core/usbd_core.c b/core/usbd_core.c index c02f0e5e..ecaee117 100644 --- a/core/usbd_core.c +++ b/core/usbd_core.c @@ -62,9 +62,11 @@ USB_NOCACHE_RAM_SECTION struct usbd_core_priv { struct usbd_tx_rx_msg tx_msg[USB_EP_IN_NUM]; struct usbd_tx_rx_msg rx_msg[USB_EP_OUT_NUM]; - void (*event_handler)(uint8_t event); + void (*event_handler)(uint8_t busid, uint8_t event); } g_usbd_core[CONFIG_USBDEV_MAX_BUS]; +struct usbd_bus g_usbdev_bus[CONFIG_USBDEV_MAX_BUS]; + static void usbd_class_event_notify_handler(uint8_t busid, uint8_t event, void *arg); static void usbd_print_setup(struct usb_setup_packet *setup) @@ -493,9 +495,9 @@ static bool usbd_std_device_req_handler(uint8_t busid, struct usb_setup_packet * case USB_REQUEST_SET_FEATURE: if (value == USB_FEATURE_REMOTE_WAKEUP) { if (setup->bRequest == USB_REQUEST_SET_FEATURE) { - g_usbd_core[busid].event_handler(USBD_EVENT_SET_REMOTE_WAKEUP); + g_usbd_core[busid].event_handler(busid, USBD_EVENT_SET_REMOTE_WAKEUP); } else { - g_usbd_core[busid].event_handler(USBD_EVENT_CLR_REMOTE_WAKEUP); + g_usbd_core[busid].event_handler(busid, USBD_EVENT_CLR_REMOTE_WAKEUP); } } else if (value == USB_FEATURE_TEST_MODE) { #ifdef CONFIG_USBDEV_TEST_MODE @@ -532,7 +534,7 @@ static bool usbd_std_device_req_handler(uint8_t busid, struct usb_setup_packet * } else { g_usbd_core[busid].configuration = value; usbd_class_event_notify_handler(busid, USBD_EVENT_CONFIGURED, NULL); - g_usbd_core[busid].event_handler(USBD_EVENT_CONFIGURED); + g_usbd_core[busid].event_handler(busid, USBD_EVENT_CONFIGURED); } *len = 0; break; @@ -952,22 +954,22 @@ static void usbd_class_event_notify_handler(uint8_t busid, uint8_t event, void * void usbd_event_connect_handler(uint8_t busid) { - g_usbd_core[busid].event_handler(USBD_EVENT_CONNECTED); + g_usbd_core[busid].event_handler(busid, USBD_EVENT_CONNECTED); } void usbd_event_disconnect_handler(uint8_t busid) { - g_usbd_core[busid].event_handler(USBD_EVENT_DISCONNECTED); + g_usbd_core[busid].event_handler(busid, USBD_EVENT_DISCONNECTED); } void usbd_event_resume_handler(uint8_t busid) { - g_usbd_core[busid].event_handler(USBD_EVENT_RESUME); + g_usbd_core[busid].event_handler(busid, USBD_EVENT_RESUME); } void usbd_event_suspend_handler(uint8_t busid) { - g_usbd_core[busid].event_handler(USBD_EVENT_SUSPEND); + g_usbd_core[busid].event_handler(busid, USBD_EVENT_SUSPEND); } void usbd_event_reset_handler(uint8_t busid) @@ -992,7 +994,7 @@ void usbd_event_reset_handler(uint8_t busid) usbd_ep_open(busid, &ep0); usbd_class_event_notify_handler(busid, USBD_EVENT_RESET, NULL); - g_usbd_core[busid].event_handler(USBD_EVENT_RESET); + g_usbd_core[busid].event_handler(busid, USBD_EVENT_RESET); } void usbd_event_ep0_setup_complete_handler(uint8_t busid, uint8_t *psetup) @@ -1199,14 +1201,24 @@ bool usb_device_is_configured(uint8_t busid) return g_usbd_core[busid].configuration; } -int usbd_initialize(uint8_t busid, void (*event_handler)(uint8_t event)) +int usbd_initialize(uint8_t busid, uint32_t reg_base, void (*event_handler)(uint8_t busid, uint8_t event)) { int ret; + struct usbd_bus *bus; + + if (busid > CONFIG_USBDEV_MAX_BUS) { + USB_LOG_ERR("bus overflow\r\n"); + while (1) { + } + } + + bus = &g_usbdev_bus[busid]; + bus->reg_base = reg_base; g_usbd_core[busid].event_handler = event_handler; ret = usb_dc_init(busid); usbd_class_event_notify_handler(busid, USBD_EVENT_INIT, NULL); - g_usbd_core[busid].event_handler(USBD_EVENT_INIT); + g_usbd_core[busid].event_handler(busid, USBD_EVENT_INIT); return ret; } @@ -1215,6 +1227,6 @@ int usbd_deinitialize(uint8_t busid) g_usbd_core[busid].intf_offset = 0; usb_dc_deinit(busid); usbd_class_event_notify_handler(busid, USBD_EVENT_DEINIT, NULL); - g_usbd_core[busid].event_handler(USBD_EVENT_DEINIT); + g_usbd_core[busid].event_handler(busid, USBD_EVENT_DEINIT); return 0; } diff --git a/core/usbd_core.h b/core/usbd_core.h index 8fafa2db..0014d967 100644 --- a/core/usbd_core.h +++ b/core/usbd_core.h @@ -74,6 +74,17 @@ struct usb_descriptor { const struct usb_bos_descriptor *bos_descriptor; }; +struct usbd_bus { + uint8_t busid; + uint32_t reg_base; +}; + +extern struct usbd_bus g_usbdev_bus[]; + +#ifdef USBD_IRQHandler +#error USBD_IRQHandler is obsolete, please call USBD_IRQHandler(xxx) in your irq +#endif + #ifdef CONFIG_USBDEV_ADVANCE_DESC void usbd_desc_register(uint8_t busid, const struct usb_descriptor *desc); #else @@ -87,7 +98,7 @@ void usbd_add_interface(uint8_t busid, struct usbd_interface *intf); void usbd_add_endpoint(uint8_t busid, struct usbd_endpoint *ep); bool usb_device_is_configured(uint8_t busid); -int usbd_initialize(uint8_t busid, void (*event_handler)(uint8_t event)); +int usbd_initialize(uint8_t busid, uint32_t reg_base, void (*event_handler)(uint8_t busid, uint8_t event)); int usbd_deinitialize(uint8_t busid); #ifdef __cplusplus diff --git a/core/usbh_core.c b/core/usbh_core.c index 3845e94a..673660f1 100644 --- a/core/usbh_core.c +++ b/core/usbh_core.c @@ -17,6 +17,8 @@ usb_slist_t g_bus_head = USB_SLIST_OBJECT_INIT(g_bus_head); USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t ep0_request_buffer[CONFIG_USBHOST_MAX_BUS][CONFIG_USBHOST_REQUEST_BUFFER_LEN]; USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX struct usb_setup_packet g_setup_buffer[CONFIG_USBHOST_MAX_BUS][CONFIG_USBHOST_MAX_EXTHUBS + 1][CONFIG_USBHOST_MAX_EHPORTS]; +struct usbh_bus g_usbhost_bus[CONFIG_USBHOST_MAX_BUS]; + /* general descriptor field offsets */ #define DESC_bLength 0 /** Length offset */ #define DESC_bDescriptorType 1 /** Descriptor type offset */ @@ -633,24 +635,10 @@ errout: return ret; } -struct usbh_bus *usbh_alloc_bus(uint8_t busid, uint32_t reg_base) +static void usbh_bus_init(struct usbh_bus *bus, uint8_t busid, uint32_t reg_base) { - struct usbh_bus *bus; struct usbh_hub *hub; - if (busid > CONFIG_USBHOST_MAX_BUS) { - USB_LOG_ERR("bus overflow\r\n"); - while (1) { - } - } - - bus = usb_malloc(sizeof(struct usbh_bus)); - if (bus == NULL) { - USB_LOG_ERR("No memory to alloc bus\r\n"); - while (1) { - } - } - memset(bus, 0, sizeof(struct usbh_bus)); bus->busid = busid; bus->hcd.hcd_id = busid; @@ -674,12 +662,22 @@ struct usbh_bus *usbh_alloc_bus(uint8_t busid, uint32_t reg_base) usb_slist_init(&bus->hub_list); usb_slist_add_tail(&bus->hub_list, &hub->list); usb_slist_add_tail(&g_bus_head, &bus->list); - - return bus; } -int usbh_initialize(struct usbh_bus *bus) +int usbh_initialize(uint8_t busid, uint32_t reg_base) { + struct usbh_bus *bus; + + if (busid > CONFIG_USBHOST_MAX_BUS) { + USB_LOG_ERR("bus overflow\r\n"); + while (1) { + } + } + + bus = &g_usbhost_bus[busid]; + + usbh_bus_init(bus, busid, reg_base); + #ifdef __ARMCC_VERSION /* ARM C Compiler */ extern const int usbh_class_info$$Base; extern const int usbh_class_info$$Limit; @@ -698,14 +696,17 @@ int usbh_initialize(struct usbh_bus *bus) return 0; } -int usbh_deinitialize(struct usbh_bus *bus) +int usbh_deinitialize(uint8_t busid) { + struct usbh_bus *bus; + + bus = &g_usbhost_bus[busid]; + usbh_hub_deinitialize(bus); usb_slist_init(&bus->hub_list); usb_slist_remove(&g_bus_head, &bus->list); - usb_free(bus); return 0; } diff --git a/core/usbh_core.h b/core/usbh_core.h index 1944c400..ef59650a 100644 --- a/core/usbh_core.h +++ b/core/usbh_core.h @@ -216,6 +216,11 @@ static inline void usbh_int_urb_fill(struct usbh_urb *urb, urb->arg = arg; } +extern struct usbh_bus g_usbhost_bus[]; +#ifdef USBH_IRQHandler +#error USBH_IRQHandler is obsolete, please call USBH_IRQHandler(xxx) in your irq +#endif + /** * @brief Submit an control transfer to an endpoint. * This is a blocking method; this method will not return until the transfer has completed. @@ -256,9 +261,8 @@ int usbh_get_string_desc(struct usbh_hubport *hport, uint8_t index, uint8_t *out */ int usbh_set_interface(struct usbh_hubport *hport, uint8_t intf, uint8_t altsetting); -struct usbh_bus *usbh_alloc_bus(uint8_t busid, uint32_t reg_base); -int usbh_initialize(struct usbh_bus *bus); -int usbh_deinitialize(struct usbh_bus *bus); +int usbh_initialize(uint8_t busid, uint32_t reg_base); +int usbh_deinitialize(uint8_t busid); void *usbh_find_class_instance(const char *devname); int lsusb(int argc, char **argv); diff --git a/demo/audio_v1_mic_multichan_template.c b/demo/audio_v1_mic_multichan_template.c index 00e3a585..43e5f07b 100644 --- a/demo/audio_v1_mic_multichan_template.c +++ b/demo/audio_v1_mic_multichan_template.c @@ -1,8 +1,6 @@ #include "usbd_core.h" #include "usbd_audio.h" -#define CONFIG_USBDEV_DEMO_BUS 0 - #define USBD_VID 0xffff #define USBD_PID 0xffff #define USBD_MAX_POWER 100 @@ -150,7 +148,7 @@ const uint8_t audio_v1_descriptor[] = { volatile bool tx_flag = 0; volatile bool ep_tx_busy_flag = false; -static void usbd_event_handler(uint8_t event) +static void usbd_event_handler(uint8_t busid, uint8_t event) { switch (event) { case USBD_EVENT_RESET: @@ -207,25 +205,25 @@ struct audio_entity_info audio_entity_table[] = { .ep = AUDIO_IN_EP }, }; -void audio_v1_init(void) +void audio_v1_init(uint8_t busid, uint32_t reg_base) { - usbd_desc_register(CONFIG_USBDEV_DEMO_BUS, audio_v1_descriptor); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_audio_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf0, 0x0100, audio_entity_table, 1)); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_audio_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf1, 0x0100, audio_entity_table, 1)); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &audio_in_ep); + usbd_desc_register(busid, audio_v1_descriptor); + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf0, 0x0100, audio_entity_table, 1)); + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf1, 0x0100, audio_entity_table, 1)); + usbd_add_endpoint(busid, &audio_in_ep); - usbd_initialize(CONFIG_USBDEV_DEMO_BUS, usbd_event_handler); + usbd_initialize(busid, reg_base, usbd_event_handler); } USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[AUDIO_IN_PACKET]; -void audio_test() +void audio_test(uint8_t busid) { while (1) { if (tx_flag) { memset(write_buffer, 'a', AUDIO_IN_PACKET); ep_tx_busy_flag = true; - usbd_ep_start_write(CONFIG_USBDEV_DEMO_BUS, AUDIO_IN_EP, write_buffer, AUDIO_IN_PACKET); + usbd_ep_start_write(busid, AUDIO_IN_EP, write_buffer, AUDIO_IN_PACKET); while (ep_tx_busy_flag) { if (tx_flag == false) { break; diff --git a/demo/audio_v1_mic_speaker_multichan_template.c b/demo/audio_v1_mic_speaker_multichan_template.c index c4468060..57fdfdc0 100644 --- a/demo/audio_v1_mic_speaker_multichan_template.c +++ b/demo/audio_v1_mic_speaker_multichan_template.c @@ -1,8 +1,6 @@ #include "usbd_core.h" #include "usbd_audio.h" -#define CONFIG_USBDEV_DEMO_BUS 0 - #define USBD_VID 0xffff #define USBD_PID 0xffff #define USBD_MAX_POWER 100 @@ -149,7 +147,7 @@ volatile bool tx_flag = 0; volatile bool rx_flag = 0; volatile bool ep_tx_busy_flag = false; -static void usbd_event_handler(uint8_t event) +static void usbd_event_handler(uint8_t busid, uint8_t event) { switch (event) { case USBD_EVENT_RESET: @@ -179,7 +177,7 @@ void usbd_audio_open(uint8_t busid, uint8_t intf) if (intf == 1) { rx_flag = 1; /* setup first out ep read transfer */ - usbd_ep_start_read(CONFIG_USBDEV_DEMO_BUS, AUDIO_OUT_EP, read_buffer, AUDIO_OUT_PACKET); + usbd_ep_start_read(busid, AUDIO_OUT_EP, read_buffer, AUDIO_OUT_PACKET); printf("OPEN1\r\n"); } else { tx_flag = 1; @@ -201,7 +199,7 @@ void usbd_audio_close(uint8_t busid, uint8_t intf) void usbd_audio_out_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) { USB_LOG_RAW("actual out len:%d\r\n", nbytes); - usbd_ep_start_read(CONFIG_USBDEV_DEMO_BUS, AUDIO_OUT_EP, read_buffer, AUDIO_OUT_PACKET); + usbd_ep_start_read(busid, AUDIO_OUT_EP, read_buffer, AUDIO_OUT_PACKET); } void usbd_audio_in_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) @@ -233,24 +231,24 @@ struct audio_entity_info audio_entity_table[] = { .ep = AUDIO_OUT_EP }, }; -void audio_v1_init(void) +void audio_v1_init(uint8_t busid, uint32_t reg_base) { - usbd_desc_register(CONFIG_USBDEV_DEMO_BUS, audio_v1_descriptor); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_audio_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf0, 0x0100, audio_entity_table, 2)); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_audio_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf1, 0x0100, audio_entity_table, 2)); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_audio_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf2, 0x0100, audio_entity_table, 2)); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &audio_in_ep); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &audio_out_ep); + usbd_desc_register(busid, audio_v1_descriptor); + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf0, 0x0100, audio_entity_table, 2)); + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf1, 0x0100, audio_entity_table, 2)); + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf2, 0x0100, audio_entity_table, 2)); + usbd_add_endpoint(busid, &audio_in_ep); + usbd_add_endpoint(busid, &audio_out_ep); - usbd_initialize(CONFIG_USBDEV_DEMO_BUS, usbd_event_handler); + usbd_initialize(busid, reg_base, usbd_event_handler); } -void audio_v1_test(void) +void audio_v1_test(uint8_t busid) { if (tx_flag) { memset(write_buffer, 'a', AUDIO_IN_PACKET); ep_tx_busy_flag = true; - usbd_ep_start_write(CONFIG_USBDEV_DEMO_BUS, AUDIO_IN_EP, write_buffer, AUDIO_IN_PACKET); + usbd_ep_start_write(busid, AUDIO_IN_EP, write_buffer, AUDIO_IN_PACKET); while (ep_tx_busy_flag) { if (tx_flag == false) { break; diff --git a/demo/audio_v2_mic_multichan_template.c b/demo/audio_v2_mic_multichan_template.c index 5a120316..d5ea0c7a 100644 --- a/demo/audio_v2_mic_multichan_template.c +++ b/demo/audio_v2_mic_multichan_template.c @@ -1,8 +1,6 @@ #include "usbd_core.h" #include "usbd_audio.h" -#define CONFIG_USBDEV_DEMO_BUS 0 - #define USBD_VID 0xffff #define USBD_PID 0xffff #define USBD_MAX_POWER 100 @@ -161,7 +159,7 @@ static const uint8_t mic_default_sampling_freq_table[] = { volatile bool tx_flag = 0; -static void usbd_event_handler(uint8_t event) +static void usbd_event_handler(uint8_t busid, uint8_t event) { switch (event) { case USBD_EVENT_RESET: @@ -226,17 +224,17 @@ struct audio_entity_info audio_entity_table[] = { .ep = AUDIO_IN_EP }, }; -void audio_v2_init(void) +void audio_v2_init(uint8_t busid, uint32_t reg_base) { - usbd_desc_register(CONFIG_USBDEV_DEMO_BUS, audio_v2_descriptor); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_audio_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf0, 0x0200, audio_entity_table, 2)); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_audio_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf1, 0x0200, audio_entity_table, 2)); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &audio_in_ep); + usbd_desc_register(busid, audio_v2_descriptor); + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf0, 0x0200, audio_entity_table, 2)); + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf1, 0x0200, audio_entity_table, 2)); + usbd_add_endpoint(busid, &audio_in_ep); - usbd_initialize(CONFIG_USBDEV_DEMO_BUS, usbd_event_handler); + usbd_initialize(busid, reg_base, usbd_event_handler); } -void audio_v2_test(void) +void audio_v2_test(uint8_t busid) { if (tx_flag) { } diff --git a/demo/audio_v2_mic_speaker_multichan_template.c b/demo/audio_v2_mic_speaker_multichan_template.c index 9d73607a..af5eae1b 100644 --- a/demo/audio_v2_mic_speaker_multichan_template.c +++ b/demo/audio_v2_mic_speaker_multichan_template.c @@ -1,8 +1,6 @@ #include "usbd_core.h" #include "usbd_audio.h" -#define CONFIG_USBDEV_DEMO_BUS 0 - #define USBD_VID 0xffff #define USBD_PID 0xffff #define USBD_MAX_POWER 100 @@ -231,7 +229,7 @@ USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[AUDIO_IN_PACKET]; volatile bool tx_flag = 0; volatile bool rx_flag = 0; -static void usbd_event_handler(uint8_t event) +static void usbd_event_handler(uint8_t busid, uint8_t event) { switch (event) { case USBD_EVENT_RESET: @@ -261,7 +259,7 @@ void usbd_audio_open(uint8_t busid, uint8_t intf) if (intf == 1) { rx_flag = 1; /* setup first out ep read transfer */ - usbd_ep_start_read(CONFIG_USBDEV_DEMO_BUS, AUDIO_OUT_EP, read_buffer, AUDIO_OUT_PACKET); + usbd_ep_start_read(busid, AUDIO_OUT_EP, read_buffer, AUDIO_OUT_PACKET); USB_LOG_RAW("OPEN1\r\n"); } else { tx_flag = 1; @@ -307,7 +305,7 @@ void usbd_audio_set_sampling_freq(uint8_t busid, uint8_t ep, uint32_t sampling_f void usbd_audio_iso_out_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) { USB_LOG_RAW("actual out len:%d\r\n", nbytes); - usbd_ep_start_read(CONFIG_USBDEV_DEMO_BUS, AUDIO_OUT_EP, read_buffer, AUDIO_OUT_PACKET); + usbd_ep_start_read(busid, AUDIO_OUT_EP, read_buffer, AUDIO_OUT_PACKET); } void usbd_audio_iso_in_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) @@ -343,19 +341,19 @@ struct audio_entity_info audio_entity_table[] = { .ep = AUDIO_IN_EP }, }; -void audio_v2_init(void) +void audio_v2_init(uint8_t busid, uint32_t reg_base) { - usbd_desc_register(CONFIG_USBDEV_DEMO_BUS, audio_v2_descriptor); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_audio_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf0, 0x0200, audio_entity_table, 4)); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_audio_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf1, 0x0200, audio_entity_table, 4)); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_audio_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf2, 0x0200, audio_entity_table, 4)); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &audio_in_ep); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &audio_out_ep); + usbd_desc_register(busid, audio_v2_descriptor); + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf0, 0x0200, audio_entity_table, 4)); + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf1, 0x0200, audio_entity_table, 4)); + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf2, 0x0200, audio_entity_table, 4)); + usbd_add_endpoint(busid, &audio_in_ep); + usbd_add_endpoint(busid, &audio_out_ep); - usbd_initialize(CONFIG_USBDEV_DEMO_BUS, usbd_event_handler); + usbd_initialize(busid, reg_base, usbd_event_handler); } -void audio_v2_test(void) +void audio_v2_test(uint8_t busid) { if (tx_flag) { } diff --git a/demo/audio_v2_speaker_multichan_template.c b/demo/audio_v2_speaker_multichan_template.c index 4124f7dd..9babd992 100644 --- a/demo/audio_v2_speaker_multichan_template.c +++ b/demo/audio_v2_speaker_multichan_template.c @@ -1,8 +1,6 @@ #include "usbd_core.h" #include "usbd_audio.h" -#define CONFIG_USBDEV_DEMO_BUS 0 - #define USBD_VID 0xffff #define USBD_PID 0xffff #define USBD_MAX_POWER 100 @@ -175,7 +173,7 @@ USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[AUDIO_OUT_PACKET]; volatile bool rx_flag = 0; -static void usbd_event_handler(uint8_t event) +static void usbd_event_handler(uint8_t busid, uint8_t event) { switch (event) { case USBD_EVENT_RESET: @@ -204,7 +202,7 @@ void usbd_audio_open(uint8_t busid, uint8_t intf) { rx_flag = 1; /* setup first out ep read transfer */ - usbd_ep_start_read(CONFIG_USBDEV_DEMO_BUS, AUDIO_OUT_EP, read_buffer, AUDIO_OUT_PACKET); + usbd_ep_start_read(busid, AUDIO_OUT_EP, read_buffer, AUDIO_OUT_PACKET); USB_LOG_RAW("OPEN\r\n"); } @@ -224,7 +222,7 @@ void usbd_audio_get_sampling_freq_table(uint8_t busid, uint8_t ep, uint8_t **sam void usbd_audio_iso_out_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) { USB_LOG_RAW("actual out len:%d\r\n", nbytes); - usbd_ep_start_read(CONFIG_USBDEV_DEMO_BUS, AUDIO_OUT_EP, read_buffer, AUDIO_OUT_PACKET); + usbd_ep_start_read(busid, AUDIO_OUT_EP, read_buffer, AUDIO_OUT_PACKET); } static struct usbd_endpoint audio_out_ep = { @@ -244,17 +242,17 @@ struct audio_entity_info audio_entity_table[] = { .ep = AUDIO_OUT_EP }, }; -void audio_v2_init(void) +void audio_v2_init(uint8_t busid, uint32_t reg_base) { - usbd_desc_register(CONFIG_USBDEV_DEMO_BUS, audio_v2_descriptor); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_audio_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf0, 0x0200, audio_entity_table, 2)); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_audio_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf1, 0x0200, audio_entity_table, 2)); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &audio_out_ep); + usbd_desc_register(busid, audio_v2_descriptor); + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf0, 0x0200, audio_entity_table, 2)); + usbd_add_interface(busid, usbd_audio_init_intf(busid, &intf1, 0x0200, audio_entity_table, 2)); + usbd_add_endpoint(busid, &audio_out_ep); - usbd_initialize(CONFIG_USBDEV_DEMO_BUS, usbd_event_handler); + usbd_initialize(busid, reg_base, usbd_event_handler); } -void audio_v2_test(void) +void audio_v2_test(uint8_t busid) { if (rx_flag) { } diff --git a/demo/cdc_acm_hid_msc_template.c b/demo/cdc_acm_hid_msc_template.c index 096f079c..f316a196 100644 --- a/demo/cdc_acm_hid_msc_template.c +++ b/demo/cdc_acm_hid_msc_template.c @@ -3,8 +3,6 @@ #include "usbd_cdc.h" #include "usbd_hid.h" -#define CONFIG_USBDEV_DEMO_BUS 0 - /*!< endpoint address */ #define CDC_IN_EP 0x81 #define CDC_OUT_EP 0x02 @@ -240,7 +238,7 @@ volatile bool ep_tx_busy_flag = false; #define CDC_MAX_MPS 64 #endif -static void usbd_event_handler(uint8_t event) +static void usbd_event_handler(uint8_t busid, uint8_t event) { switch (event) { case USBD_EVENT_RESET: @@ -255,7 +253,7 @@ static void usbd_event_handler(uint8_t event) break; case USBD_EVENT_CONFIGURED: /* setup first out ep read transfer */ - usbd_ep_start_read(CONFIG_USBDEV_DEMO_BUS, CDC_OUT_EP, read_buffer, 2048); + usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048); break; case USBD_EVENT_SET_REMOTE_WAKEUP: break; @@ -271,7 +269,7 @@ void usbd_cdc_acm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes) { USB_LOG_RAW("actual out len:%d\r\n", nbytes); /* setup next out ep read transfer */ - usbd_ep_start_read(CONFIG_USBDEV_DEMO_BUS, CDC_OUT_EP, read_buffer, 2048); + usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048); } void usbd_cdc_acm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) @@ -280,7 +278,7 @@ void usbd_cdc_acm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) if ((nbytes % CDC_MAX_MPS) == 0 && nbytes) { /* send zlp */ - usbd_ep_start_write(CONFIG_USBDEV_DEMO_BUS, CDC_IN_EP, NULL, 0); + usbd_ep_start_write(busid, CDC_IN_EP, NULL, 0); } else { ep_tx_busy_flag = false; } @@ -302,19 +300,19 @@ struct usbd_interface intf1; struct usbd_interface intf2; struct usbd_interface intf3; -void cdc_acm_hid_msc_descriptor_init(void) +void cdc_acm_hid_msc_descriptor_init(uint8_t busid, uint32_t reg_base) { - usbd_desc_register(CONFIG_USBDEV_DEMO_BUS, cdc_acm_hid_msc_descriptor); + usbd_desc_register(busid, cdc_acm_hid_msc_descriptor); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_cdc_acm_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf0)); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_cdc_acm_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf1)); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &cdc_out_ep); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &cdc_in_ep); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf0)); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf1)); + usbd_add_endpoint(busid, &cdc_out_ep); + usbd_add_endpoint(busid, &cdc_in_ep); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_msc_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf2, MSC_OUT_EP, MSC_IN_EP)); + usbd_add_interface(busid, usbd_msc_init_intf(busid, &intf2, MSC_OUT_EP, MSC_IN_EP)); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_hid_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf3, hid_mouse_report_desc, HID_MOUSE_REPORT_DESC_SIZE)); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &hid_in_ep); + usbd_add_interface(busid, usbd_hid_init_intf(busid, &intf3, hid_mouse_report_desc, HID_MOUSE_REPORT_DESC_SIZE)); + usbd_add_endpoint(busid, &hid_in_ep); /*!< init mouse report data */ mouse_cfg.buttons = 0; @@ -322,7 +320,7 @@ void cdc_acm_hid_msc_descriptor_init(void) mouse_cfg.x = 0; mouse_cfg.y = 0; - usbd_initialize(CONFIG_USBDEV_DEMO_BUS, usbd_event_handler); + usbd_initialize(busid, reg_base, usbd_event_handler); } /** @@ -331,12 +329,12 @@ void cdc_acm_hid_msc_descriptor_init(void) * @param[in] none * @retval none */ -void hid_mouse_test(void) +void hid_mouse_test(uint8_t busid) { /*!< move mouse pointer */ mouse_cfg.x += 10; mouse_cfg.y = 0; - int ret = usbd_ep_start_write(CONFIG_USBDEV_DEMO_BUS, HID_INT_EP, (uint8_t *)&mouse_cfg, 4); + int ret = usbd_ep_start_write(busid, HID_INT_EP, (uint8_t *)&mouse_cfg, 4); if (ret < 0) { return; } @@ -356,12 +354,12 @@ void usbd_cdc_acm_set_dtr(uint8_t busid, uint8_t intf, bool dtr) } } -void cdc_acm_data_send_with_dtr_test(void) +void cdc_acm_data_send_with_dtr_test(uint8_t busid) { if (dtr_enable) { memset(&write_buffer[10], 'a', 2038); ep_tx_busy_flag = true; - usbd_ep_start_write(CONFIG_USBDEV_DEMO_BUS, CDC_IN_EP, write_buffer, 2048); + usbd_ep_start_write(busid, CDC_IN_EP, write_buffer, 2048); while (ep_tx_busy_flag) { } } diff --git a/demo/cdc_acm_msc_template.c b/demo/cdc_acm_msc_template.c index 44d9283a..fc5ad51c 100644 --- a/demo/cdc_acm_msc_template.c +++ b/demo/cdc_acm_msc_template.c @@ -2,8 +2,6 @@ #include "usbd_cdc.h" #include "usbd_msc.h" -#define CONFIG_USBDEV_DEMO_BUS 0 - /*!< endpoint address */ #define CDC_IN_EP 0x81 #define CDC_OUT_EP 0x02 @@ -251,7 +249,7 @@ volatile bool ep_tx_busy_flag = false; #define CDC_MAX_MPS 64 #endif -static void usbd_event_handler(uint8_t event) +static void usbd_event_handler(uint8_t busid, uint8_t event) { switch (event) { case USBD_EVENT_RESET: @@ -266,7 +264,7 @@ static void usbd_event_handler(uint8_t event) break; case USBD_EVENT_CONFIGURED: /* setup first out ep read transfer */ - usbd_ep_start_read(CONFIG_USBDEV_DEMO_BUS, CDC_OUT_EP, read_buffer, 2048); + usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048); break; case USBD_EVENT_SET_REMOTE_WAKEUP: break; @@ -282,7 +280,7 @@ void usbd_cdc_acm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes) { USB_LOG_RAW("actual out len:%d\r\n", nbytes); /* setup next out ep read transfer */ - usbd_ep_start_read(CONFIG_USBDEV_DEMO_BUS, CDC_OUT_EP, read_buffer, 2048); + usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048); } void usbd_cdc_acm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) @@ -291,7 +289,7 @@ void usbd_cdc_acm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) if ((nbytes % CDC_MAX_MPS) == 0 && nbytes) { /* send zlp */ - usbd_ep_start_write(CONFIG_USBDEV_DEMO_BUS, CDC_IN_EP, NULL, 0); + usbd_ep_start_write(busid, CDC_IN_EP, NULL, 0); } else { ep_tx_busy_flag = false; } @@ -312,20 +310,20 @@ struct usbd_interface intf0; struct usbd_interface intf1; struct usbd_interface intf2; -void cdc_acm_msc_init(void) +void cdc_acm_msc_init(uint8_t busid, uint32_t reg_base) { #ifdef CONFIG_USBDEV_ADVANCE_DESC - usbd_desc_register(CONFIG_USBDEV_DEMO_BUS, &cdc_msc_descriptor); + usbd_desc_register(busid, &cdc_msc_descriptor); #else - usbd_desc_register(CONFIG_USBDEV_DEMO_BUS, cdc_msc_descriptor); + usbd_desc_register(busid, cdc_msc_descriptor); #endif - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_cdc_acm_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf0)); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_cdc_acm_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf1)); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &cdc_out_ep); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &cdc_in_ep); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_msc_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf2, MSC_OUT_EP, MSC_IN_EP)); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf0)); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf1)); + usbd_add_endpoint(busid, &cdc_out_ep); + usbd_add_endpoint(busid, &cdc_in_ep); + usbd_add_interface(busid, usbd_msc_init_intf(busid, &intf2, MSC_OUT_EP, MSC_IN_EP)); - usbd_initialize(CONFIG_USBDEV_DEMO_BUS, usbd_event_handler); + usbd_initialize(busid, reg_base, usbd_event_handler); } volatile uint8_t dtr_enable = 0; @@ -339,12 +337,12 @@ void usbd_cdc_acm_set_dtr(uint8_t busid, uint8_t intf, bool dtr) } } -void cdc_acm_data_send_with_dtr_test(void) +void cdc_acm_data_send_with_dtr_test(uint8_t busid) { if (dtr_enable) { memset(&write_buffer[10], 'a', 2038); ep_tx_busy_flag = true; - usbd_ep_start_write(CONFIG_USBDEV_DEMO_BUS, CDC_IN_EP, write_buffer, 2048); + usbd_ep_start_write(busid, CDC_IN_EP, write_buffer, 2048); while (ep_tx_busy_flag) { } } diff --git a/demo/cdc_acm_multi_template.c b/demo/cdc_acm_multi_template.c index 5c78fec8..a8e4709a 100644 --- a/demo/cdc_acm_multi_template.c +++ b/demo/cdc_acm_multi_template.c @@ -1,8 +1,6 @@ #include "usbd_core.h" #include "usbd_cdc.h" -#define CONFIG_USBDEV_DEMO_BUS 0 - /*!< endpoint address */ #define CDC_IN_EP 0x81 #define CDC_OUT_EP 0x01 @@ -127,7 +125,7 @@ volatile bool ep_tx_busy_flag = false; #define CDC_MAX_MPS 64 #endif -static void usbd_event_handler(uint8_t event) +static void usbd_event_handler(uint8_t busid, uint8_t event) { switch (event) { case USBD_EVENT_RESET: @@ -142,10 +140,10 @@ static void usbd_event_handler(uint8_t event) break; case USBD_EVENT_CONFIGURED: /* setup first out ep read transfer */ - usbd_ep_start_read(CONFIG_USBDEV_DEMO_BUS, CDC_OUT_EP, read_buffer, 2048); - usbd_ep_start_read(CONFIG_USBDEV_DEMO_BUS, CDC_OUT_EP2, read_buffer, 2048); - usbd_ep_start_read(CONFIG_USBDEV_DEMO_BUS, CDC_OUT_EP3, read_buffer, 2048); - usbd_ep_start_read(CONFIG_USBDEV_DEMO_BUS, CDC_OUT_EP4, read_buffer, 2048); + usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048); + usbd_ep_start_read(busid, CDC_OUT_EP2, read_buffer, 2048); + usbd_ep_start_read(busid, CDC_OUT_EP3, read_buffer, 2048); + usbd_ep_start_read(busid, CDC_OUT_EP4, read_buffer, 2048); break; case USBD_EVENT_SET_REMOTE_WAKEUP: break; @@ -161,7 +159,7 @@ void usbd_cdc_acm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes) { USB_LOG_RAW("actual out len:%d\r\n", nbytes); /* setup next out ep read transfer */ - usbd_ep_start_read(CONFIG_USBDEV_DEMO_BUS, CDC_OUT_EP, read_buffer, 2048); + usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048); } void usbd_cdc_acm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) @@ -225,29 +223,29 @@ struct usbd_interface intf5; struct usbd_interface intf6; struct usbd_interface intf7; -void cdc_acm_multi_init(void) +void cdc_acm_multi_init(uint8_t busid, uint32_t reg_base) { - usbd_desc_register(CONFIG_USBDEV_DEMO_BUS, cdc_descriptor); + usbd_desc_register(busid, cdc_descriptor); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_cdc_acm_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf0)); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_cdc_acm_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf1)); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &cdc_out_ep1); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &cdc_in_ep1); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf0)); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf1)); + usbd_add_endpoint(busid, &cdc_out_ep1); + usbd_add_endpoint(busid, &cdc_in_ep1); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_cdc_acm_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf2)); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_cdc_acm_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf3)); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &cdc_out_ep2); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &cdc_in_ep2); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf2)); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf3)); + usbd_add_endpoint(busid, &cdc_out_ep2); + usbd_add_endpoint(busid, &cdc_in_ep2); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_cdc_acm_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf4)); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_cdc_acm_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf5)); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &cdc_out_ep3); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &cdc_in_ep3); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf4)); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf5)); + usbd_add_endpoint(busid, &cdc_out_ep3); + usbd_add_endpoint(busid, &cdc_in_ep3); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_cdc_acm_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf6)); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_cdc_acm_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf7)); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &cdc_out_ep4); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &cdc_in_ep4); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf6)); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf7)); + usbd_add_endpoint(busid, &cdc_out_ep4); + usbd_add_endpoint(busid, &cdc_in_ep4); - usbd_initialize(CONFIG_USBDEV_DEMO_BUS, usbd_event_handler); + usbd_initialize(busid, reg_base, usbd_event_handler); } \ No newline at end of file diff --git a/demo/cdc_acm_template.c b/demo/cdc_acm_template.c index 428bdddd..c4896a9c 100644 --- a/demo/cdc_acm_template.c +++ b/demo/cdc_acm_template.c @@ -1,8 +1,6 @@ #include "usbd_core.h" #include "usbd_cdc.h" -#define CONFIG_USBDEV_DEMO_BUS 0 - /*!< endpoint address */ #define CDC_IN_EP 0x81 #define CDC_OUT_EP 0x02 @@ -112,7 +110,7 @@ volatile bool ep_tx_busy_flag = false; #define CDC_MAX_MPS 64 #endif -static void usbd_event_handler(uint8_t event) +static void usbd_event_handler(uint8_t busid, uint8_t event) { switch (event) { case USBD_EVENT_RESET: @@ -127,7 +125,7 @@ static void usbd_event_handler(uint8_t event) break; case USBD_EVENT_CONFIGURED: /* setup first out ep read transfer */ - usbd_ep_start_read(CONFIG_USBDEV_DEMO_BUS, CDC_OUT_EP, read_buffer, 2048); + usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048); break; case USBD_EVENT_SET_REMOTE_WAKEUP: break; @@ -147,7 +145,7 @@ void usbd_cdc_acm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes) // } // printf("\r\n"); /* setup next out ep read transfer */ - usbd_ep_start_read(CONFIG_USBDEV_DEMO_BUS, CDC_OUT_EP, read_buffer, 2048); + usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048); } void usbd_cdc_acm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) @@ -156,7 +154,7 @@ void usbd_cdc_acm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes) if ((nbytes % CDC_MAX_MPS) == 0 && nbytes) { /* send zlp */ - usbd_ep_start_write(CONFIG_USBDEV_DEMO_BUS, CDC_IN_EP, NULL, 0); + usbd_ep_start_write(busid, CDC_IN_EP, NULL, 0); } else { ep_tx_busy_flag = false; } @@ -176,19 +174,19 @@ struct usbd_endpoint cdc_in_ep = { static struct usbd_interface intf0; static struct usbd_interface intf1; -void cdc_acm_init(void) +void cdc_acm_init(uint8_t busid, uint32_t reg_base) { const uint8_t data[10] = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30 }; memcpy(&write_buffer[0], data, 10); memset(&write_buffer[10], 'a', 2038); - usbd_desc_register(CONFIG_USBDEV_DEMO_BUS, cdc_descriptor); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_cdc_acm_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf0)); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_cdc_acm_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf1)); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &cdc_out_ep); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &cdc_in_ep); - usbd_initialize(CONFIG_USBDEV_DEMO_BUS, usbd_event_handler); + usbd_desc_register(busid, cdc_descriptor); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf0)); + usbd_add_interface(busid, usbd_cdc_acm_init_intf(busid, &intf1)); + usbd_add_endpoint(busid, &cdc_out_ep); + usbd_add_endpoint(busid, &cdc_in_ep); + usbd_initialize(busid, reg_base, usbd_event_handler); } volatile uint8_t dtr_enable = 0; @@ -202,11 +200,11 @@ void usbd_cdc_acm_set_dtr(uint8_t busid, uint8_t intf, bool dtr) } } -void cdc_acm_data_send_with_dtr_test(void) +void cdc_acm_data_send_with_dtr_test(uint8_t busid) { if (dtr_enable) { ep_tx_busy_flag = true; - usbd_ep_start_write(CONFIG_USBDEV_DEMO_BUS, CDC_IN_EP, write_buffer, 2048); + usbd_ep_start_write(busid, CDC_IN_EP, write_buffer, 2048); while (ep_tx_busy_flag) { } } diff --git a/demo/cdc_ecm_template.c b/demo/cdc_ecm_template.c index cd450202..5b778ae0 100644 --- a/demo/cdc_ecm_template.c +++ b/demo/cdc_ecm_template.c @@ -230,7 +230,7 @@ void cdc_ecm_input_poll(void) cdc_ecm_if_input(&cdc_ecm_netif); } -static void usbd_event_handler(uint8_t event) +static void usbd_event_handler(uint8_t busid, uint8_t event) { switch (event) { case USBD_EVENT_RESET: @@ -263,12 +263,12 @@ struct usbd_interface intf1; * sudo ifconfig enxaabbccddeeff up * sudo dhcpclient enxaabbccddeeff */ -void cdc_ecm_init(void) +void cdc_ecm_init(uint8_t busid, uint32_t reg_base) { cdc_ecm_lwip_init(); - usbd_desc_register(0, cdc_ecm_descriptor); - usbd_add_interface(0, usbd_cdc_ecm_init_intf(0, &intf0, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP)); - usbd_add_interface(0, usbd_cdc_ecm_init_intf(0, &intf1, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP)); - usbd_initialize(0, usbd_event_handler); + usbd_desc_register(busid, cdc_ecm_descriptor); + usbd_add_interface(busid, usbd_cdc_ecm_init_intf(&intf0, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP)); + usbd_add_interface(busid, usbd_cdc_ecm_init_intf(&intf1, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP)); + usbd_initialize(busid, reg_base, usbd_event_handler); } \ No newline at end of file diff --git a/demo/cdc_rndis_template.c b/demo/cdc_rndis_template.c index df9beb64..6d87e6e4 100644 --- a/demo/cdc_rndis_template.c +++ b/demo/cdc_rndis_template.c @@ -263,7 +263,7 @@ void rndis_input_poll(void) } #endif /* RT_USING_LWIP */ -static void usbd_event_handler(uint8_t event) +static void usbd_event_handler(uint8_t busid, uint8_t event) { switch (event) { case USBD_EVENT_RESET: @@ -294,15 +294,15 @@ static void usbd_event_handler(uint8_t event) struct usbd_interface intf0; struct usbd_interface intf1; -void cdc_rndis_init(void) +void cdc_rndis_init(uint8_t busid, uint32_t reg_base) { #ifdef RT_USING_LWIP rt_usbd_rndis_init(); #else rndis_lwip_init(); #endif - usbd_desc_register(0, cdc_descriptor); - usbd_add_interface(0, usbd_rndis_init_intf(&intf0, CDC_OUT_EP, CDC_IN_EP, CDC_INT_EP, mac)); - usbd_add_interface(0, usbd_rndis_init_intf(&intf1, CDC_OUT_EP, CDC_IN_EP, CDC_INT_EP, mac)); - usbd_initialize(0, usbd_event_handler); + usbd_desc_register(busid, cdc_descriptor); + usbd_add_interface(busid, usbd_rndis_init_intf(&intf0, CDC_OUT_EP, CDC_IN_EP, CDC_INT_EP, mac)); + usbd_add_interface(busid, usbd_rndis_init_intf(&intf1, CDC_OUT_EP, CDC_IN_EP, CDC_INT_EP, mac)); + usbd_initialize(busid, reg_base, usbd_event_handler); } diff --git a/demo/dfu_with_st_tool_template.c b/demo/dfu_with_st_tool_template.c index 37d627b9..393c2720 100644 --- a/demo/dfu_with_st_tool_template.c +++ b/demo/dfu_with_st_tool_template.c @@ -137,7 +137,7 @@ const uint8_t dfu_flash_descriptor[] = { 0x00 }; -static void usbd_event_handler(uint8_t event) +static void usbd_event_handler(uint8_t busid, uint8_t event) { switch (event) { case USBD_EVENT_RESET: @@ -164,9 +164,9 @@ static void usbd_event_handler(uint8_t event) struct usbd_interface intf0; -void dfu_flash_init(void) +void dfu_flash_init(uint8_t busid, uint32_t reg_base) { - usbd_desc_register(0, dfu_flash_descriptor); - usbd_add_interface(0, usbd_dfu_init_intf(&intf0)); - usbd_initialize(0, usbd_event_handler); + usbd_desc_register(busid, dfu_flash_descriptor); + usbd_add_interface(busid, usbd_dfu_init_intf(&intf0)); + usbd_initialize(busid, reg_base, usbd_event_handler); } diff --git a/demo/hid_custom_inout_template.c b/demo/hid_custom_inout_template.c index eb25732a..ac3b0660 100644 --- a/demo/hid_custom_inout_template.c +++ b/demo/hid_custom_inout_template.c @@ -1,8 +1,6 @@ #include "usbd_core.h" #include "usbd_hid.h" -#define CONFIG_USBDEV_DEMO_BUS 0 - /*!< hidraw in endpoint */ #define HIDRAW_IN_EP 0x81 #define HIDRAW_IN_EP_SIZE 64 @@ -171,7 +169,7 @@ USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t send_buffer[HIDRAW_IN_EP_SIZE]; /*!< hid state ! Data can be sent only when state is idle */ static volatile uint8_t custom_state; -static void usbd_event_handler(uint8_t event) +static void usbd_event_handler(uint8_t busid, uint8_t event) { switch (event) { case USBD_EVENT_RESET: @@ -186,7 +184,7 @@ static void usbd_event_handler(uint8_t event) break; case USBD_EVENT_CONFIGURED: /* setup first out ep read transfer */ - usbd_ep_start_read(CONFIG_USBDEV_DEMO_BUS, HIDRAW_OUT_EP, read_buffer, HIDRAW_OUT_EP_SIZE); + usbd_ep_start_read(busid, HIDRAW_OUT_EP, read_buffer, HIDRAW_OUT_EP_SIZE); break; case USBD_EVENT_SET_REMOTE_WAKEUP: break; @@ -207,9 +205,9 @@ static void usbd_hid_custom_in_callback(uint8_t busid, uint8_t ep, uint32_t nbyt static void usbd_hid_custom_out_callback(uint8_t busid, uint8_t ep, uint32_t nbytes) { USB_LOG_RAW("actual out len:%d\r\n", nbytes); - usbd_ep_start_read(CONFIG_USBDEV_DEMO_BUS, HIDRAW_OUT_EP, read_buffer, 64); + usbd_ep_start_read(busid, HIDRAW_OUT_EP, read_buffer, 64); read_buffer[0] = 0x02; /* IN: report id */ - usbd_ep_start_write(CONFIG_USBDEV_DEMO_BUS, HIDRAW_IN_EP, read_buffer, nbytes); + usbd_ep_start_write(busid, HIDRAW_IN_EP, read_buffer, nbytes); } static struct usbd_endpoint custom_in_ep = { @@ -231,12 +229,12 @@ static struct usbd_endpoint custom_out_ep = { */ struct usbd_interface intf0; -void hid_custom_init(void) +void hid_custom_init(uint8_t busid, uint32_t reg_base) { - usbd_desc_register(CONFIG_USBDEV_DEMO_BUS, hid_descriptor); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_hid_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf0, hid_custom_report_desc, HID_CUSTOM_REPORT_DESC_SIZE)); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &custom_in_ep); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &custom_out_ep); + usbd_desc_register(busid, hid_descriptor); + usbd_add_interface(busid, usbd_hid_init_intf(busid, &intf0, hid_custom_report_desc, HID_CUSTOM_REPORT_DESC_SIZE)); + usbd_add_endpoint(busid, &custom_in_ep); + usbd_add_endpoint(busid, &custom_out_ep); - usbd_initialize(CONFIG_USBDEV_DEMO_BUS, usbd_event_handler); + usbd_initialize(busid, usbd_event_handler); } diff --git a/demo/hid_keyboard_template.c b/demo/hid_keyboard_template.c index c5940aea..36291a06 100644 --- a/demo/hid_keyboard_template.c +++ b/demo/hid_keyboard_template.c @@ -1,8 +1,6 @@ #include "usbd_core.h" #include "usbd_hid.h" -#define CONFIG_USBDEV_DEMO_BUS 0 - #define USBD_VID 0xffff #define USBD_PID 0xffff #define USBD_MAX_POWER 100 @@ -174,7 +172,7 @@ static const uint8_t hid_keyboard_report_desc[HID_KEYBOARD_REPORT_DESC_SIZE] = { 0xc0 // END_COLLECTION }; -static void usbd_event_handler(uint8_t event) +static void usbd_event_handler(uint8_t busid, uint8_t event) { switch (event) { case USBD_EVENT_RESET: @@ -217,23 +215,23 @@ static struct usbd_endpoint hid_in_ep = { struct usbd_interface intf0; -void hid_keyboard_init(void) +void hid_keyboard_init(uint8_t busid, uint32_t reg_base) { - usbd_desc_register(CONFIG_USBDEV_DEMO_BUS, hid_descriptor); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_hid_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf0, hid_keyboard_report_desc, HID_KEYBOARD_REPORT_DESC_SIZE)); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &hid_in_ep); + usbd_desc_register(busid, hid_descriptor); + usbd_add_interface(busid, usbd_hid_init_intf(busid, &intf0, hid_keyboard_report_desc, HID_KEYBOARD_REPORT_DESC_SIZE)); + usbd_add_endpoint(busid, &hid_in_ep); - usbd_initialize(CONFIG_USBDEV_DEMO_BUS, usbd_event_handler); + usbd_initialize(busid, reg_base, usbd_event_handler); } USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[64]; -void hid_keyboard_test(void) +void hid_keyboard_test(uint8_t busid) { const uint8_t sendbuffer[8] = { 0x00, 0x00, HID_KBD_USAGE_A, 0x00, 0x00, 0x00, 0x00, 0x00 }; memcpy(write_buffer, sendbuffer, 8); - int ret = usbd_ep_start_write(CONFIG_USBDEV_DEMO_BUS, HID_INT_EP, write_buffer, 8); + int ret = usbd_ep_start_write(busid, HID_INT_EP, write_buffer, 8); if (ret < 0) { return; } diff --git a/demo/hid_mouse_template.c b/demo/hid_mouse_template.c index 1aef2ad2..9659f7d7 100644 --- a/demo/hid_mouse_template.c +++ b/demo/hid_mouse_template.c @@ -1,8 +1,6 @@ #include "usbd_core.h" #include "usbd_hid.h" -#define CONFIG_USBDEV_DEMO_BUS 0 - /*!< endpoint address */ #define HID_INT_EP 0x81 #define HID_INT_EP_SIZE 4 @@ -196,7 +194,7 @@ static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX struct hid_mouse mouse_cfg; /*!< hid state ! Data can be sent only when state is idle */ static volatile uint8_t hid_state = HID_STATE_IDLE; -static void usbd_event_handler(uint8_t event) +static void usbd_event_handler(uint8_t busid, uint8_t event) { switch (event) { case USBD_EVENT_RESET: @@ -235,13 +233,13 @@ static struct usbd_endpoint hid_in_ep = { struct usbd_interface intf0; -void hid_mouse_init(void) +void hid_mouse_init(uint8_t busid, uint32_t reg_base) { - usbd_desc_register(CONFIG_USBDEV_DEMO_BUS, hid_descriptor); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_hid_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf0, hid_mouse_report_desc, HID_MOUSE_REPORT_DESC_SIZE)); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &hid_in_ep); + usbd_desc_register(busid, hid_descriptor); + usbd_add_interface(busid, usbd_hid_init_intf(busid, &intf0, hid_mouse_report_desc, HID_MOUSE_REPORT_DESC_SIZE)); + usbd_add_endpoint(busid, &hid_in_ep); - usbd_initialize(CONFIG_USBDEV_DEMO_BUS, usbd_event_handler); + usbd_initialize(busid, reg_base, usbd_event_handler); /*!< init mouse report data */ mouse_cfg.buttons = 0; @@ -256,7 +254,7 @@ void hid_mouse_init(void) * @param[in] none * @retval none */ -void hid_mouse_test(void) +void hid_mouse_test(uint8_t busid) { int counter = 0; while (counter < 1000) { @@ -264,7 +262,7 @@ void hid_mouse_test(void) mouse_cfg.x += 40; mouse_cfg.y += 0; - int ret = usbd_ep_start_write(CONFIG_USBDEV_DEMO_BUS, HID_INT_EP, (uint8_t *)&mouse_cfg, 4); + int ret = usbd_ep_start_write(busid, HID_INT_EP, (uint8_t *)&mouse_cfg, 4); if (ret < 0) { return; } diff --git a/demo/midi_template.c b/demo/midi_template.c index a4271b8f..08c89650 100644 --- a/demo/midi_template.c +++ b/demo/midi_template.c @@ -1,8 +1,6 @@ #include "usbd_core.h" #include "usb_midi.h" -#define CONFIG_USBDEV_DEMO_BUS 0 - #define MIDI_OUT_EP 0x02 #define MIDI_IN_EP 0x81 @@ -148,7 +146,7 @@ const uint8_t midi_descriptor[] = { 0x00 }; -static void usbd_event_handler(uint8_t event) +static void usbd_event_handler(uint8_t busid, uint8_t event) { switch (event) { case USBD_EVENT_RESET: @@ -194,13 +192,13 @@ struct usbd_endpoint midi_in_ep = { .ep_cb = usbd_midi_bulk_in }; -void midi_init(void) +void midi_init(uint8_t busid, uint32_t reg_base) { - usbd_desc_register(CONFIG_USBDEV_DEMO_BUS, midi_descriptor); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, &intf0); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, &intf1); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &midi_out_ep); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &midi_in_ep); + usbd_desc_register(busid, midi_descriptor); + usbd_add_interface(busid, &intf0); + usbd_add_interface(busid, &intf1); + usbd_add_endpoint(busid, &midi_out_ep); + usbd_add_endpoint(busid, &midi_in_ep); - usbd_initialize(CONFIG_USBDEV_DEMO_BUS, usbd_event_handler); + usbd_initialize(busid, reg_base, usbd_event_handler); } \ No newline at end of file diff --git a/demo/msc_ram_template.c b/demo/msc_ram_template.c index c2b8318a..369e39d8 100644 --- a/demo/msc_ram_template.c +++ b/demo/msc_ram_template.c @@ -1,8 +1,6 @@ #include "usbd_core.h" #include "usbd_msc.h" -#define CONFIG_USBDEV_DEMO_BUS 0 - #define MSC_IN_EP 0x81 #define MSC_OUT_EP 0x02 @@ -97,7 +95,7 @@ const uint8_t msc_ram_descriptor[] = { 0x00 }; -static void usbd_event_handler(uint8_t event) +static void usbd_event_handler(uint8_t busid, uint8_t event) { switch (event) { case USBD_EVENT_RESET: @@ -153,10 +151,10 @@ int usbd_msc_sector_write(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t * struct usbd_interface intf0; -void msc_ram_init(void) +void msc_ram_init(uint8_t busid, uint32_t reg_base) { - usbd_desc_register(CONFIG_USBDEV_DEMO_BUS, msc_ram_descriptor); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_msc_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf0, MSC_OUT_EP, MSC_IN_EP)); + usbd_desc_register(busid, msc_ram_descriptor); + usbd_add_interface(busid, usbd_msc_init_intf(busid, &intf0, MSC_OUT_EP, MSC_IN_EP)); - usbd_initialize(CONFIG_USBDEV_DEMO_BUS, usbd_event_handler); + usbd_initialize(busid, reg_base, usbd_event_handler); } diff --git a/demo/msc_storage_template.c b/demo/msc_storage_template.c index f6f86e6f..42f1971b 100644 --- a/demo/msc_storage_template.c +++ b/demo/msc_storage_template.c @@ -1,8 +1,6 @@ #include "usbd_core.h" #include "usbd_msc.h" -#define CONFIG_USBDEV_DEMO_BUS 0 - #ifdef __RT_THREAD_H__ #define MSC_IN_EP 0x81 @@ -108,7 +106,7 @@ struct usbd_interface intf0; #define BLOCK_COUNT 0x1024U * 0x1024U static rt_device_t blk_dev = RT_NULL; -static void usbd_event_handler(uint8_t event) +static void usbd_event_handler(uint8_t busid, uint8_t event) { switch (event) { case USBD_EVENT_RESET: @@ -151,7 +149,7 @@ int usbd_msc_sector_write(uint8_t busid, uint8_t lun, uint32_t sector, uint8_t * return 0; } -void msc_storage_init(void) +void msc_storage_init(uint8_t busid, uint32_t reg_base) { rt_err_t res; @@ -161,9 +159,9 @@ void msc_storage_init(void) res = rt_device_open(blk_dev, RT_DEVICE_OFLAG_RDWR); RT_ASSERT(res == RT_EOK); - usbd_desc_register(CONFIG_USBDEV_DEMO_BUS, msc_storage_descriptor); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_msc_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf0, MSC_OUT_EP, MSC_IN_EP)); + usbd_desc_register(busid, msc_storage_descriptor); + usbd_add_interface(busid, usbd_msc_init_intf(busid, &intf0, MSC_OUT_EP, MSC_IN_EP)); - usbd_initialize(CONFIG_USBDEV_DEMO_BUS, usbd_event_handler); + usbd_initialize(busid, reg_base, usbd_event_handler); } #endif \ No newline at end of file diff --git a/demo/mtp_template.c b/demo/mtp_template.c deleted file mode 100644 index 873532db..00000000 --- a/demo/mtp_template.c +++ /dev/null @@ -1,193 +0,0 @@ -#include "usbd_core.h" -#include "usbd_mtp.h" - -#define WCID_VENDOR_CODE 0x01 - -__ALIGN_BEGIN const uint8_t WCID_StringDescriptor_MSOS[18] __ALIGN_END = { - /////////////////////////////////////// - /// MS OS string descriptor - /////////////////////////////////////// - 0x12, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - /* MSFT100 */ - 'M', 0x00, 'S', 0x00, 'F', 0x00, 'T', 0x00, /* wcChar_7 */ - '1', 0x00, '0', 0x00, '0', 0x00, /* wcChar_7 */ - WCID_VENDOR_CODE, /* bVendorCode */ - 0x00, /* bReserved */ -}; - -__ALIGN_BEGIN const uint8_t WINUSB_WCIDDescriptor[40] __ALIGN_END = { - /////////////////////////////////////// - /// WCID descriptor - /////////////////////////////////////// - 0x28, 0x00, 0x00, 0x00, /* dwLength */ - 0x00, 0x01, /* bcdVersion */ - 0x04, 0x00, /* wIndex */ - 0x01, /* bCount */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* bReserved_7 */ - - /////////////////////////////////////// - /// WCID function descriptor - /////////////////////////////////////// - 0x00, /* bFirstInterfaceNumber */ - 0x01, /* bReserved */ - /* MTP */ - 'M', 'T', 'P', 0x00, 0x00, 0x00, 0x00, 0x00, /* cCID_8 */ - /* */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* cSubCID_8 */ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* bReserved_6 */ -}; - -struct usb_msosv1_descriptor msosv1_desc = { - .string = (uint8_t *)WCID_StringDescriptor_MSOS, - .string_len = 18, - .vendor_code = WCID_VENDOR_CODE, - .compat_id = (uint8_t *)WINUSB_WCIDDescriptor, - .compat_id_len = sizeof(WINUSB_WCIDDescriptor), - .comp_id_property = NULL, - .comp_id_property_len = 0, -}; - -/*!< endpoint address */ -#define CDC_IN_EP 0x81 -#define CDC_OUT_EP 0x02 -#define CDC_INT_EP 0x83 - -#define USBD_VID 0xFFFE -#define USBD_PID 0xFFFF -#define USBD_MAX_POWER 100 -#define USBD_LANGID_STRING 1033 - -/*!< config descriptor size */ -#define USB_CONFIG_SIZE (9 + MTP_DESCRIPTOR_LEN) - -#ifdef CONFIG_USB_HS -#define MTP_MAX_MPS 512 -#else -#define MTP_MAX_MPS 64 -#endif - -const uint8_t mtp_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_1, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0201, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), - MTP_DESCRIPTOR_INIT(0x00, CDC_OUT_EP, CDC_IN_EP, CDC_INT_EP, MTP_MAX_MPS, 0x02), - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x26, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'M', 0x00, /* wcChar10 */ - 'T', 0x00, /* wcChar11 */ - 'P', 0x00, /* wcChar12 */ - ' ', 0x00, /* wcChar13 */ - 'D', 0x00, /* wcChar14 */ - 'E', 0x00, /* wcChar15 */ - 'M', 0x00, /* wcChar16 */ - 'O', 0x00, /* wcChar17 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '1', 0x00, /* wcChar3 */ - '0', 0x00, /* wcChar4 */ - '3', 0x00, /* wcChar5 */ - '1', 0x00, /* wcChar6 */ - '0', 0x00, /* wcChar7 */ - '0', 0x00, /* wcChar8 */ - '0', 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x02, - 0x02, - 0x01, - 0x40, - 0x01, - 0x00, -#endif - 0x00 -}; - -const uint8_t bos_descriptor[] = { - 0x05, 0x0f, 0x16, 0x00, 0x02, - 0x07, 0x10, 0x02, 0x06, 0x00, 0x00, 0x00, - 0x0a, 0x10, 0x03, 0x00, 0x0f, 0x00, 0x01, 0x01, 0xf4, 0x01 -}; - -void usbd_event_handler(uint8_t event) -{ - switch (event) { - case USBD_EVENT_RESET: - break; - case USBD_EVENT_CONNECTED: - break; - case USBD_EVENT_DISCONNECTED: - break; - case USBD_EVENT_RESUME: - break; - case USBD_EVENT_SUSPEND: - break; - case USBD_EVENT_CONFIGURED: - break; - case USBD_EVENT_SET_REMOTE_WAKEUP: - break; - case USBD_EVENT_CLR_REMOTE_WAKEUP: - break; - - default: - break; - } -} - -struct usbd_interface intf0; - -struct usb_bos_descriptor bos_desc = { - .string = bos_descriptor, - .string_len = 22 -}; - -void mtp_init(void) -{ - usbd_desc_register(mtp_descriptor); - usbd_msosv1_desc_register(&msosv1_desc); - usbd_bos_desc_register(&bos_desc); - usbd_add_interface(usbd_mtp_init_intf(&intf0, CDC_OUT_EP, CDC_IN_EP, CDC_INT_EP)); - usbd_initialize(); -} \ No newline at end of file diff --git a/demo/printer_template.c b/demo/printer_template.c deleted file mode 100644 index 9d50360c..00000000 --- a/demo/printer_template.c +++ /dev/null @@ -1,184 +0,0 @@ -#include "usbd_core.h" -#include "usb_printer.h" - -/*!< endpoint address */ -#define PRINTER_IN_EP 0x81 -#define PRINTER_IN_EP_SIZE 0x40 -#define PRINTER_OUT_EP 0x02 -#define PRINTER_OUT_EP_SIZE 0x40 - -#define USBD_VID 0x5A5A -#define USBD_PID 0xA5A5 -#define USBD_MAX_POWER 100 -#define USBD_LANGID_STRING 0x0409 - -/*!< config descriptor size */ -#define USB_CONFIG_SIZE (32) - -/*!< global descriptor */ -static const uint8_t printer_descriptor[] = { - USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0000, 0x01), - USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_SELF_POWERED, USBD_MAX_POWER), - USB_INTERFACE_DESCRIPTOR_INIT(0x00, 0x00, 0x02, 0x07, 0x01, 0x02, 0x00), - USB_ENDPOINT_DESCRIPTOR_INIT(PRINTER_IN_EP, 0x02, PRINTER_IN_EP_SIZE, 0x00), - USB_ENDPOINT_DESCRIPTOR_INIT(PRINTER_OUT_EP, 0x02, PRINTER_OUT_EP_SIZE, 0x00), - /////////////////////////////////////// - /// string0 descriptor - /////////////////////////////////////// - USB_LANGID_INIT(USBD_LANGID_STRING), - /////////////////////////////////////// - /// string1 descriptor - /////////////////////////////////////// - 0x14, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - /////////////////////////////////////// - /// string2 descriptor - /////////////////////////////////////// - 0x2A, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - 'C', 0x00, /* wcChar0 */ - 'h', 0x00, /* wcChar1 */ - 'e', 0x00, /* wcChar2 */ - 'r', 0x00, /* wcChar3 */ - 'r', 0x00, /* wcChar4 */ - 'y', 0x00, /* wcChar5 */ - 'U', 0x00, /* wcChar6 */ - 'S', 0x00, /* wcChar7 */ - 'B', 0x00, /* wcChar8 */ - ' ', 0x00, /* wcChar9 */ - 'P', 0x00, /* wcChar10 */ - 'R', 0x00, /* wcChar11 */ - 'I', 0x00, /* wcChar12 */ - 'N', 0x00, /* wcChar13 */ - 'T', 0x00, /* wcChar14 */ - ' ', 0x00, /* wcChar15 */ - 'D', 0x00, /* wcChar16 */ - 'E', 0x00, /* wcChar17 */ - 'M', 0x00, /* wcChar18 */ - 'O', 0x00, /* wcChar19 */ - /////////////////////////////////////// - /// string3 descriptor - /////////////////////////////////////// - 0x16, /* bLength */ - USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */ - '2', 0x00, /* wcChar0 */ - '0', 0x00, /* wcChar1 */ - '2', 0x00, /* wcChar2 */ - '2', 0x00, /* wcChar3 */ - '1', 0x00, /* wcChar4 */ - '2', 0x00, /* wcChar5 */ - '3', 0x00, /* wcChar6 */ - '4', 0x00, /* wcChar7 */ - '5', 0x00, /* wcChar8 */ - '6', 0x00, /* wcChar9 */ -#ifdef CONFIG_USB_HS - /////////////////////////////////////// - /// device qualifier descriptor - /////////////////////////////////////// - 0x0a, - USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x02, - 0x02, - 0x01, - 0x40, - 0x01, - 0x00, -#endif - 0x00 -}; - -USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[PRINTER_OUT_EP_SIZE]; -USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[PRINTER_IN_EP_SIZE]; - -void usbd_event_handler(uint8_t event) -{ - switch (event) { - case USBD_EVENT_RESET: - break; - case USBD_EVENT_CONNECTED: - break; - case USBD_EVENT_DISCONNECTED: - break; - case USBD_EVENT_RESUME: - break; - case USBD_EVENT_SUSPEND: - break; - case USBD_EVENT_CONFIGURED: - /* setup first out ep read transfer */ - usbd_ep_start_read(PRINTER_OUT_EP, read_buffer, PRINTER_OUT_EP_SIZE); - break; - case USBD_EVENT_SET_REMOTE_WAKEUP: - break; - case USBD_EVENT_CLR_REMOTE_WAKEUP: - break; - - default: - break; - } -} - -void usbd_printer_bulk_out(uint8_t ep, uint32_t nbytes) -{ - USB_LOG_RAW("actual out len:%d\r\n", nbytes); - // for (int i = 0; i < 100; i++) { - // printf("%02x ", read_buffer[i]); - // } - // printf("\r\n"); - /* setup next out ep read transfer */ - usbd_ep_start_read(PRINTER_OUT_EP, read_buffer, PRINTER_OUT_EP_SIZE); -} - -void usbd_printer_bulk_in(uint8_t ep, uint32_t nbytes) -{ - USB_LOG_RAW("actual in len:%d\r\n", nbytes); - - if ((nbytes % PRINTER_IN_EP_SIZE) == 0 && nbytes) { - /* send zlp */ - usbd_ep_start_write(PRINTER_IN_EP, NULL, 0); - } else { - } -} - -/*!< endpoint call back */ -struct usbd_endpoint printer_out_ep = { - .ep_addr = PRINTER_OUT_EP, - .ep_cb = usbd_printer_bulk_out -}; - -struct usbd_endpoint printer_in_ep = { - .ep_addr = PRINTER_IN_EP, - .ep_cb = usbd_printer_bulk_in -}; - -struct usbd_interface intf0; - -static const uint8_t printer_device_id[] = -{ - 0x00, 51, - 'M','F','G',':','C','B','M',';', - 'C','M','D',':','G','D','I',';', - 'M','D','L',':','C','B','M','1','0','0','0',';', - 'C','L','S',':','P','R','I','N','T','E','R',';', - 'M','O','D','E',':','G','D','I',';' -}; - -void printer_init(void) -{ - usbd_desc_register(printer_descriptor); - usbd_add_interface(usbd_printer_init_intf(&intf0, printer_device_id, sizeof(printer_device_id))); - usbd_add_endpoint(&printer_out_ep); - usbd_add_endpoint(&printer_in_ep); - - usbd_initialize(); -} diff --git a/demo/video_static_mjpeg_template.c b/demo/video_static_mjpeg_template.c index 40d0d365..7d6b2d39 100644 --- a/demo/video_static_mjpeg_template.c +++ b/demo/video_static_mjpeg_template.c @@ -2,8 +2,6 @@ #include "usbd_video.h" #include "pic_data.h" -#define CONFIG_USBDEV_DEMO_BUS 0 - #define VIDEO_IN_EP 0x81 #ifdef CONFIG_USB_HS @@ -143,7 +141,7 @@ const uint8_t video_descriptor[] = { 0x00 }; -static void usbd_event_handler(uint8_t event) +static void usbd_event_handler(uint8_t busid, uint8_t event) { switch (event) { case USBD_EVENT_RESET: @@ -198,29 +196,29 @@ static struct usbd_endpoint video_in_ep = { struct usbd_interface intf0; struct usbd_interface intf1; -void video_init() +void video_init(uint8_t busid, uint32_t reg_base) { - usbd_desc_register(CONFIG_USBDEV_DEMO_BUS, video_descriptor); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_video_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf0, INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE)); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, usbd_video_init_intf(CONFIG_USBDEV_DEMO_BUS, &intf1, INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE)); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &video_in_ep); + usbd_desc_register(busid, video_descriptor); + usbd_add_interface(busid, usbd_video_init_intf(busid, &intf0, INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE)); + usbd_add_interface(busid, usbd_video_init_intf(busid, &intf1, INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE)); + usbd_add_endpoint(busid, &video_in_ep); - usbd_initialize(CONFIG_USBDEV_DEMO_BUS, usbd_event_handler); + usbd_initialize(busid, reg_base, usbd_event_handler); } USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t packet_buffer[10 * 1024]; -void video_test() +void video_test(uint8_t busid) { uint32_t out_len; uint32_t packets; memset(packet_buffer, 0, 10 * 1024); while (1) { if (tx_flag) { - packets = usbd_video_mjpeg_payload_fill(CONFIG_USBDEV_DEMO_BUS, (uint8_t *)jpeg_data, sizeof(jpeg_data), packet_buffer, &out_len); + packets = usbd_video_mjpeg_payload_fill(busid, (uint8_t *)jpeg_data, sizeof(jpeg_data), packet_buffer, &out_len); #if 0 iso_tx_busy = true; - usbd_ep_start_write(CONFIG_USBDEV_DEMO_BUS, VIDEO_IN_EP, packet_buffer, out_len); + usbd_ep_start_write(busid, VIDEO_IN_EP, packet_buffer, out_len); while (iso_tx_busy) { if (tx_flag == 0) { break; @@ -231,7 +229,7 @@ void video_test() for (uint32_t i = 0; i < packets; i++) { if (i == (packets - 1)) { iso_tx_busy = true; - usbd_ep_start_write(CONFIG_USBDEV_DEMO_BUS, VIDEO_IN_EP, &packet_buffer[i * MAX_PAYLOAD_SIZE], out_len - (packets - 1) * MAX_PAYLOAD_SIZE); + usbd_ep_start_write(busid, VIDEO_IN_EP, &packet_buffer[i * MAX_PAYLOAD_SIZE], out_len - (packets - 1) * MAX_PAYLOAD_SIZE); while (iso_tx_busy) { if (tx_flag == 0) { break; @@ -239,7 +237,7 @@ void video_test() } } else { iso_tx_busy = true; - usbd_ep_start_write(CONFIG_USBDEV_DEMO_BUS, VIDEO_IN_EP, &packet_buffer[i * MAX_PAYLOAD_SIZE], MAX_PAYLOAD_SIZE); + usbd_ep_start_write(busid, VIDEO_IN_EP, &packet_buffer[i * MAX_PAYLOAD_SIZE], MAX_PAYLOAD_SIZE); while (iso_tx_busy) { if (tx_flag == 0) { break; diff --git a/demo/winusb1.0_template.c b/demo/winusb1.0_template.c index 42b5e79f..9fb19199 100644 --- a/demo/winusb1.0_template.c +++ b/demo/winusb1.0_template.c @@ -1,8 +1,6 @@ #include "usbd_core.h" #include "usbd_cdc.h" -#define CONFIG_USBDEV_DEMO_BUS 0 - #define WCID_VENDOR_CODE 0x17 #define DOUBLE_WINUSB 0 @@ -336,7 +334,7 @@ USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[2048]; volatile bool ep_tx_busy_flag = false; -static void usbd_event_handler(uint8_t event) +static void usbd_event_handler(uint8_t busid, uint8_t event) { switch (event) { case USBD_EVENT_RESET: @@ -351,9 +349,9 @@ static void usbd_event_handler(uint8_t event) break; case USBD_EVENT_CONFIGURED: /* setup first out ep read transfer */ - usbd_ep_start_read(CONFIG_USBDEV_DEMO_BUS, WINUSB_OUT_EP, read_buffer, 2048); + usbd_ep_start_read(busid, WINUSB_OUT_EP, read_buffer, 2048); #if DOUBLE_WINUSB == 1 - usbd_ep_start_read(CONFIG_USBDEV_DEMO_BUS, WINUSB_OUT_EP2, read_buffer, 2048); + usbd_ep_start_read(busid, WINUSB_OUT_EP2, read_buffer, 2048); #endif break; case USBD_EVENT_SET_REMOTE_WAKEUP: @@ -373,9 +371,9 @@ void usbd_winusb_out(uint8_t busid, uint8_t ep, uint32_t nbytes) // printf("%02x ", read_buffer[i]); // } // printf("\r\n"); - usbd_ep_start_write(CONFIG_USBDEV_DEMO_BUS, WINUSB_IN_EP, read_buffer, nbytes); + usbd_ep_start_write(busid, WINUSB_IN_EP, read_buffer, nbytes); /* setup next out ep read transfer */ - usbd_ep_start_read(CONFIG_USBDEV_DEMO_BUS, WINUSB_OUT_EP, read_buffer, 2048); + usbd_ep_start_read(busid, WINUSB_OUT_EP, read_buffer, 2048); } void usbd_winusb_in(uint8_t busid, uint8_t ep, uint32_t nbytes) @@ -384,7 +382,7 @@ void usbd_winusb_in(uint8_t busid, uint8_t ep, uint32_t nbytes) if ((nbytes % WINUSB_EP_MPS) == 0 && nbytes) { /* send zlp */ - usbd_ep_start_write(CONFIG_USBDEV_DEMO_BUS, WINUSB_IN_EP, NULL, 0); + usbd_ep_start_write(busid, WINUSB_IN_EP, NULL, 0); } else { ep_tx_busy_flag = false; } @@ -411,9 +409,9 @@ void usbd_winusb_out2(uint8_t busid, uint8_t ep, uint32_t nbytes) // printf("%02x ", read_buffer[i]); // } // printf("\r\n"); - usbd_ep_start_write(CONFIG_USBDEV_DEMO_BUS, WINUSB_IN_EP2, read_buffer, nbytes); + usbd_ep_start_write(busid, WINUSB_IN_EP2, read_buffer, nbytes); /* setup next out ep read transfer */ - usbd_ep_start_read(CONFIG_USBDEV_DEMO_BUS, WINUSB_OUT_EP2, read_buffer, 2048); + usbd_ep_start_read(busid, WINUSB_OUT_EP2, read_buffer, 2048); } void usbd_winusb_in2(uint8_t busid, uint8_t ep, uint32_t nbytes) @@ -422,7 +420,7 @@ void usbd_winusb_in2(uint8_t busid, uint8_t ep, uint32_t nbytes) if ((nbytes % WINUSB_EP_MPS) == 0 && nbytes) { /* send zlp */ - usbd_ep_start_write(CONFIG_USBDEV_DEMO_BUS, WINUSB_IN_EP2, NULL, 0); + usbd_ep_start_write(busid, WINUSB_IN_EP2, NULL, 0); } else { ep_tx_busy_flag = false; } @@ -442,17 +440,17 @@ struct usbd_interface intf1; #endif -void winusb_init(void) +void winusb_init(uint8_t busid, uint32_t reg_base) { - usbd_desc_register(CONFIG_USBDEV_DEMO_BUS, winusb_descriptor); - usbd_msosv1_desc_register(CONFIG_USBDEV_DEMO_BUS, &msosv1_desc); - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, &intf0); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &winusb_out_ep1); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &winusb_in_ep1); + usbd_desc_register(busid, winusb_descriptor); + usbd_msosv1_desc_register(busid, &msosv1_desc); + usbd_add_interface(busid, &intf0); + usbd_add_endpoint(busid, &winusb_out_ep1); + usbd_add_endpoint(busid, &winusb_in_ep1); #if DOUBLE_WINUSB == 1 - usbd_add_interface(CONFIG_USBDEV_DEMO_BUS, &intf1); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &winusb_out_ep2); - usbd_add_endpoint(CONFIG_USBDEV_DEMO_BUS, &winusb_in_ep2); + usbd_add_interface(busid, &intf1); + usbd_add_endpoint(busid, &winusb_out_ep2); + usbd_add_endpoint(busid, &winusb_in_ep2); #endif - usbd_initialize(CONFIG_USBDEV_DEMO_BUS, usbd_event_handler); + usbd_initialize(busid, reg_base, usbd_event_handler); } \ No newline at end of file diff --git a/docs/source/quick_start/img/stm32_13.png b/docs/source/quick_start/img/stm32_13.png index d350a776..f12fad75 100644 Binary files a/docs/source/quick_start/img/stm32_13.png and b/docs/source/quick_start/img/stm32_13.png differ diff --git a/docs/source/quick_start/img/stm32_18.png b/docs/source/quick_start/img/stm32_18.png index 3c3800c1..456df189 100644 Binary files a/docs/source/quick_start/img/stm32_18.png and b/docs/source/quick_start/img/stm32_18.png differ diff --git a/docs/source/quick_start/img/stm32_19.png b/docs/source/quick_start/img/stm32_19.png index 625b9504..a796dc75 100644 Binary files a/docs/source/quick_start/img/stm32_19.png and b/docs/source/quick_start/img/stm32_19.png differ diff --git a/docs/source/quick_start/index.rst b/docs/source/quick_start/index.rst index c6315cb5..28dd4fc2 100644 --- a/docs/source/quick_start/index.rst +++ b/docs/source/quick_start/index.rst @@ -99,8 +99,6 @@ USB Device 移植要点 .. code-block:: C // 以下细节如有出入,请对照 stm32xxx.h 文件修改 - #define USBD_IRQHandler OTG_HS_IRQHandler // pa11/pa12 引脚使用 OTG_FS_IRQHandler - #define USBD_BASE (0x40040000UL) // pa11/pa12 引脚一般使用 50000000UL,STM32F7/H7 使用 0x40080000UL #define CONFIG_USBDEV_EP_NUM 6 // pa11/pa12 引脚使用 4 #define CONFIG_USB_DWC2_RAM_SIZE 4096 // pa11/pa12 引脚使用 1280 @@ -108,8 +106,6 @@ USB Device 移植要点 .. code-block:: C - #define USBD_IRQHandler USB_LP_CAN1_RX0_IRQHandler - #define USBD_BASE (0x40005C00UL) #define CONFIG_USBDEV_EP_NUM 8 #define CONFIG_USBDEV_FSDEV_PMA_ACCESS 2 @@ -118,13 +114,16 @@ USB Device 移植要点 .. figure:: img/stm32_10.png .. figure:: img/stm32_11.png -- 拷贝 **xxx_msp.c** 中的 **HAL_PCD_MspInit** 函数中的内容到 **usb_dc_low_level_init** 函数中,屏蔽 st 生成的 usb 中断函数和 usb 初始化 +- 拷贝 **xxx_msp.c** 中的 **HAL_PCD_MspInit** 函数中的内容到 **usb_dc_low_level_init** 函数中,屏蔽 st 生成的 usb 初始化 .. figure:: img/stm32_12.png -.. figure:: img/stm32_13.png .. figure:: img/stm32_14.png -- 调用 template 的内容初始化,就可以使用了 +- 在中断函数中调用 `USBH_IRQHandler`,并传入 `busid` + +.. figure:: img/stm32_13.png + +- 调用 template 的内容初始化,并填入 `busid` 和 USB IP 的 `reg base`, `busid` 从 0 开始,不能超过 `CONFIG_USBDEV_MAX_BUS` .. figure:: img/stm32_15.png @@ -152,9 +151,8 @@ USB Host 移植要点 #define CONFIG_USBHOST_PIPE_NUM 12 - 拷贝 **xxx_msp.c** 中的 `HAL_HCD_MspInit` 函数中的内容到 `usb_hc_low_level_init` 函数中,屏蔽 st 生成的 usb 初始化 -- 在中断函数中调用 `USBH_IRQHandler`,并传入 bus 句柄 -- 调用 `usbh_alloc_bus` 创建 bus, `busid` 从 0 开始,不能超过 `CONFIG_USBHOST_MAX_BUS` -- 调用 `usbh_initialize` 即可 +- 在中断函数中调用 `USBH_IRQHandler`,并传入 `busid` +- 调用 `usbh_initialize` 并填入 `busid` 和 USB IP 的 `reg base`, `busid` 从 0 开始,不能超过 `CONFIG_USBHOST_MAX_BUS` - 启动线程 .. figure:: img/stm32_18.png diff --git a/docs/source/quick_start/other_chip.rst b/docs/source/quick_start/other_chip.rst index f17602df..1c28b6c1 100644 --- a/docs/source/quick_start/other_chip.rst +++ b/docs/source/quick_start/other_chip.rst @@ -8,15 +8,11 @@ USB Device 移植要点 - 拷贝 CherryUSB 源码到工程目录下,并按需添加源文件和头文件路径,其中 `usbd_core.c` 和 `usb_dc_xxx.c` 为必须添加项。而 `usb_dc_xxx.c` 是芯片所对应的 USB IP dcd 部分驱动,如果不知道自己芯片属于那个 USB IP,参考 **port** 目录下的不同 USB IP 的 readme。如果使用的 USB IP 没有支持,只能自己实现了 - 拷贝 `cherryusb_config_template.h` 文件到自己工程目录下,命名为 `usb_config.h`,并添加相应的目录头文件路径 -- 在 `usb_config.h` 中添加 `USBD_IRQHandler=xxxx` 、 `CONFIG_USBDEV_EP_NUM=x` 以及 `USBD_BASE=0xxxxx` 三个常规 porting 需要的宏 - -.. note:: 上述三个宏仅对 fsdev、musb、dwc2 有效,因为这 3 个是通用 IP - -.. note:: 为了适配后续多 port,建议中断名称不要使用宏来替换,自行在真实的中断中调用 `USBD_IRQHandler` - 实现 `usb_dc_low_level_init` 函数(该函数主要负责 USB 时钟、引脚、中断的初始化)。该函数可以放在你想要放的任何参与编译的 c 文件中。如何进行 USB 的时钟、引脚、中断等初始化,请自行根据你使用的芯片原厂提供的源码中进行添加。 - 描述符的注册、class的注册、接口的注册、端点中断的注册。不会的参考 demo 下的 template -- 调用 `usbd_initialize` 初始化 usb 硬件 +- 调用 `usbd_initialize` 并填入 `busid` 和 USB IP 的 `reg base`, `busid` 从 0 开始,不能超过 `CONFIG_USBDEV_MAX_BUS` +- 在中断函数中调用 `USBD_IRQHandler`,并传入 `busid`, 如果你的 SDK 中中断入口已经存在 `USBD_IRQHandler` ,请更改 USB 协议栈中的名称 - 编译使用。各个 class 如何使用,参考 demo 下的 template USB Host 移植要点 @@ -27,9 +23,8 @@ USB Host 移植要点 - 拷贝 CherryUSB 源码到工程目录下,并按需添加源文件和头文件路径,其中 `usbh_core.c` 、 `usb_hc_xxx.c` 以及 **osal** 目录下源文件(根据不同的 os 选择对应的源文件)为必须添加项。而 `usb_hc_xxx.c` 是芯片所对应的 USB IP dcd 部分驱动,如果不知道自己芯片属于那个 USB IP,参考 **port** 目录下的不同 USB IP 的 readme。如果使用的 USB IP 没有支持,只能自己实现了 - 拷贝 `cherryusb_config_template.h` 文件到自己工程目录下,命名为 `usb_config.h`,并添加相应的目录头文件路径 - 实现 `usb_hc_low_level_init` 函数(该函数主要负责 USB 时钟、引脚、中断的初始化)。该函数可以放在你想要放的任何参与编译的 c 文件中。如何进行 USB 的时钟、引脚、中断等初始化,请自行根据你使用的芯片原厂提供的源码中进行添加。 -- 调用 `usbh_alloc_bus` 创建 bus,填入 USB IP 的基地址, `busid` 从 0 开始,不能超过 `CONFIG_USBHOST_MAX_BUS` -- 在中断函数中调用 `USBH_IRQHandler`,并传入 bus 句柄, 如果你的 SDK 中中断入口已经存在 `USBH_IRQHandler` ,请更改 USB 协议栈中的名称 -- 调用 `usbh_initialize` +- 调用 `usbh_initialize` 并填入 `busid` 和 USB IP 的 `reg base`, `busid` 从 0 开始,不能超过 `CONFIG_USBHOST_MAX_BUS` +- 在中断函数中调用 `USBH_IRQHandler`,并传入 `busid`, 如果你的 SDK 中中断入口已经存在 `USBH_IRQHandler` ,请更改 USB 协议栈中的名称 - 如果使用的是 GCC ,需要在链接脚本(ld)中添加如下代码: .. code-block:: C diff --git a/port/dwc2/usb_dc_dwc2.c b/port/dwc2/usb_dc_dwc2.c index c64b4b18..7111056d 100644 --- a/port/dwc2/usb_dc_dwc2.c +++ b/port/dwc2/usb_dc_dwc2.c @@ -51,14 +51,6 @@ #endif // clang-format on -#ifndef USBD_IRQHandler -#error "please define USBD_IRQHandler in usb_config.h" -#endif - -#ifndef USBD_BASE -#error "please define USBD_BASE in usb_config.h" -#endif - #ifndef CONFIG_USB_DWC2_RAM_SIZE #error "please define CONFIG_USB_DWC2_RAM_SIZE in usb_config.h, only support 1280 or 4096" #endif @@ -142,6 +134,8 @@ #error "Unsupported CONFIG_USB_DWC2_RAM_SIZE value" #endif +#define USBD_BASE (g_usbdev_bus[0].reg_base) + #define USB_OTG_GLB ((USB_OTG_GlobalTypeDef *)(USBD_BASE)) #define USB_OTG_DEV ((USB_OTG_DeviceTypeDef *)(USBD_BASE + USB_OTG_DEVICE_BASE)) #define USB_OTG_PCGCCTL *(__IO uint32_t *)((uint32_t)USBD_BASE + USB_OTG_PCGCCTL_BASE) @@ -581,7 +575,7 @@ int usb_dc_init(uint8_t busid) USB_OTG_GLB->GAHBCFG &= ~USB_OTG_GAHBCFG_GINT; /* This is vendor register */ - USB_OTG_GLB->GCCFG = usbd_get_dwc2_gccfg_conf(); + USB_OTG_GLB->GCCFG = usbd_get_dwc2_gccfg_conf(USBD_BASE); ret = dwc2_core_init(); @@ -997,7 +991,7 @@ int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t return 0; } -void USBD_IRQHandler(void) +void USBD_IRQHandler(uint8_t busid) { uint32_t gint_status, temp, ep_idx, ep_intr, epint, read_count, daintmask; gint_status = dwc2_get_glb_intstatus(); diff --git a/port/dwc2/usb_dwc2_reg.h b/port/dwc2/usb_dwc2_reg.h index f45ba8c2..c1775f93 100644 --- a/port/dwc2/usb_dwc2_reg.h +++ b/port/dwc2/usb_dwc2_reg.h @@ -1706,6 +1706,6 @@ typedef struct #define USB_UNMASK_HALT_HC_INT(chnum) (USB_OTG_HC(chnum)->HCINTMSK |= USB_OTG_HCINTMSK_CHHM) #define CLEAR_HC_INT(chnum, __INTERRUPT__) (USB_OTG_HC(chnum)->HCINT = (__INTERRUPT__)) -uint32_t usbd_get_dwc2_gccfg_conf(void); -uint32_t usbh_get_dwc2_gccfg_conf(void); +uint32_t usbd_get_dwc2_gccfg_conf(uint32_t reg_base); +uint32_t usbh_get_dwc2_gccfg_conf(uint32_t reg_base); #endif diff --git a/port/dwc2/usb_glue_at.c b/port/dwc2/usb_glue_at.c index bbd979a1..270237cc 100644 --- a/port/dwc2/usb_glue_at.c +++ b/port/dwc2/usb_glue_at.c @@ -10,7 +10,7 @@ * */ -uint32_t usbd_get_dwc2_gccfg_conf(void) +uint32_t usbd_get_dwc2_gccfg_conf(uint32_t reg_base) { #ifdef CONFIG_USB_HS return ((1 << 16) | (1 << 21)); @@ -28,7 +28,7 @@ uint32_t usbd_get_dwc2_gccfg_conf(void) #endif } -uint32_t usbh_get_dwc2_gccfg_conf(void) +uint32_t usbh_get_dwc2_gccfg_conf(uint32_t reg_base) { #ifdef CONFIG_USB_DWC2_ULPI_PHY return ((1 << 16) | (1 << 21)); diff --git a/port/dwc2/usb_glue_gd.c b/port/dwc2/usb_glue_gd.c index 4123ce5d..61331ce3 100644 --- a/port/dwc2/usb_glue_gd.c +++ b/port/dwc2/usb_glue_gd.c @@ -8,7 +8,7 @@ * */ -uint32_t usbd_get_dwc2_gccfg_conf(void) +uint32_t usbd_get_dwc2_gccfg_conf(uint32_t reg_base) { #ifdef CONFIG_USB_HS return 0; @@ -17,7 +17,7 @@ uint32_t usbd_get_dwc2_gccfg_conf(void) #endif } -uint32_t usbh_get_dwc2_gccfg_conf(void) +uint32_t usbh_get_dwc2_gccfg_conf(uint32_t reg_base) { #ifdef CONFIG_USB_DWC2_ULPI_PHY return 0; diff --git a/port/dwc2/usb_glue_st.c b/port/dwc2/usb_glue_st.c index d4a199f6..869d92b0 100644 --- a/port/dwc2/usb_glue_st.c +++ b/port/dwc2/usb_glue_st.c @@ -11,13 +11,13 @@ * */ -uint32_t usbd_get_dwc2_gccfg_conf(void) +uint32_t usbd_get_dwc2_gccfg_conf(uint32_t reg_base) { #ifdef CONFIG_USB_HS return 0; #else #if __has_include("stm32h7xx.h") || __has_include("stm32f7xx.h") || __has_include("stm32l4xx.h") -#define USB_OTG_GLB ((USB_OTG_GlobalTypeDef *)(USBD_BASE)) +#define USB_OTG_GLB ((USB_OTG_GlobalTypeDef *)(reg_base)) /* B-peripheral session valid override enable */ USB_OTG_GLB->GOTGCTL |= USB_OTG_GOTGCTL_BVALOEN; USB_OTG_GLB->GOTGCTL |= USB_OTG_GOTGCTL_BVALOVAL; @@ -28,13 +28,13 @@ uint32_t usbd_get_dwc2_gccfg_conf(void) #endif } -uint32_t usbh_get_dwc2_gccfg_conf(void) +uint32_t usbh_get_dwc2_gccfg_conf(uint32_t reg_base) { #ifdef CONFIG_USB_DWC2_ULPI_PHY return 0; #else #if __has_include("stm32h7xx.h") || __has_include("stm32f7xx.h") || __has_include("stm32l4xx.h") -#define USB_OTG_GLB ((USB_OTG_GlobalTypeDef *)(USBD_BASE)) +#define USB_OTG_GLB ((USB_OTG_GlobalTypeDef *)(reg_base)) /* B-peripheral session valid override enable */ USB_OTG_GLB->GOTGCTL &= ~USB_OTG_GOTGCTL_BVALOEN; USB_OTG_GLB->GOTGCTL &= ~USB_OTG_GOTGCTL_BVALOVAL; diff --git a/port/dwc2/usb_hc_dwc2.c b/port/dwc2/usb_hc_dwc2.c index 2c371290..ae9ddd30 100644 --- a/port/dwc2/usb_hc_dwc2.c +++ b/port/dwc2/usb_hc_dwc2.c @@ -472,7 +472,7 @@ int usb_hc_init(struct usbh_bus *bus) USB_OTG_GLB->GAHBCFG &= ~USB_OTG_GAHBCFG_GINT; /* This is vendor register */ - USB_OTG_GLB->GCCFG = usbh_get_dwc2_gccfg_conf(); + USB_OTG_GLB->GCCFG = usbh_get_dwc2_gccfg_conf(bus->hcd.reg_base); ret = dwc2_core_init(bus); @@ -1115,9 +1115,12 @@ static void dwc2_port_irq_handler(struct usbh_bus *bus) USB_OTG_HPRT = hprt0_dup; } -void USBH_IRQHandler(struct usbh_bus *bus) +void USBH_IRQHandler(uint8_t busid) { uint32_t gint_status, chan_int; + struct usbh_bus *bus; + + bus = &g_usbhost_bus[busid]; gint_status = dwc2_get_glb_intstatus(bus); if ((USB_OTG_GLB->GINTSTS & 0x1U) == USB_OTG_MODE_HOST) { /* Avoid spurious interrupt */ diff --git a/port/ehci/usb_glue_aic.c b/port/ehci/usb_glue_aic.c index a6fb401f..9008a820 100644 --- a/port/ehci/usb_glue_aic.c +++ b/port/ehci/usb_glue_aic.c @@ -10,7 +10,7 @@ #include "usbh_core.h" #include "usb_ehci_priv.h" -extern void USBH_IRQHandler(struct usbh_bus *bus); +extern void USBH_IRQHandler(uint8_t busid); const uint8_t aic_irq_table[] = { USB_HOST0_EHCI_IRQn, @@ -63,7 +63,7 @@ void usb_hc_low_level_init(struct usbh_bus *bus) /* register interrupt callback */ aicos_request_irq(aic_irq_table[bus->hcd.hcd_id], (irq_handler_t)USBH_IRQHandler, - 0, "usb_host_ehci", bus); + 0, "usb_host_ehci", bus->hcd.hcd_id); aicos_irq_enable(aic_irq_table[bus->hcd.hcd_id]); } diff --git a/port/ehci/usb_glue_bouffalo.c b/port/ehci/usb_glue_bouffalo.c index 90993153..4a50a230 100644 --- a/port/ehci/usb_glue_bouffalo.c +++ b/port/ehci/usb_glue_bouffalo.c @@ -32,7 +32,7 @@ #define USB_SOF_TIMER_MASK_AFTER_RESET_HS (0x44C) #define USB_SOF_TIMER_MASK_AFTER_RESET_FS (0x2710) -extern void USBH_IRQHandler(struct usbh_bus *bus); +extern void USBH_IRQHandler(uint8_t busid); static void bflb_usb_phy_init(void) { @@ -89,7 +89,7 @@ void usb_hc_low_level_init(struct usbh_bus *bus) bflb_usb_phy_init(); - bflb_irq_attach(37, USBH_IRQHandler, NULL); + bflb_irq_attach(37, USBH_IRQHandler, 0); bflb_irq_enable(37); /* enable device-A for host */ diff --git a/port/ehci/usb_glue_hpm.c b/port/ehci/usb_glue_hpm.c index afbef86e..e57075f5 100644 --- a/port/ehci/usb_glue_hpm.c +++ b/port/ehci/usb_glue_hpm.c @@ -11,14 +11,8 @@ #error "hpm ehci must config CONFIG_USB_EHCI_HCOR_OFFSET to 0x140" #endif -#if defined(CONFIG_USB_EHCI_PRINT_HW_PARAM) || !defined(CONFIG_USB_EHCI_PORT_POWER) -#error "hpm ehci must enable CONFIG_USB_EHCI_PORT_POWER and disable CONFIG_USB_EHCI_PRINT_HW_PARAM" -#endif - -struct usbh_bus *hpm_usb_bus0; - -#ifdef HPM_USB1_BASE -struct usbh_bus *hpm_usb_bus1; +#if !defined(CONFIG_USB_EHCI_PORT_POWER) +#error "hpm ehci must enable CONFIG_USB_EHCI_PORT_POWER" #endif const uint8_t hpm_irq_table[] = { @@ -78,18 +72,18 @@ uint8_t usbh_get_port_speed(struct usbh_bus *bus, const uint8_t port) return 0; } -extern void USBH_IRQHandler(struct usbh_bus *bus); +extern void USBH_IRQHandler(uint8_t busid); void isr_usbh0(void) { - USBH_IRQHandler(hpm_usb_bus0); + USBH_IRQHandler(0); } SDK_DECLARE_EXT_ISR_M(IRQn_USB0, isr_usbh0) #ifdef HPM_USB1_BASE void isr_usbh1(void) { - USBH_IRQHandler(hpm_usb_bus1); + USBH_IRQHandler(1); } SDK_DECLARE_EXT_ISR_M(IRQn_USB1, isr_usbh1) #endif diff --git a/port/ehci/usb_glue_intel.c b/port/ehci/usb_glue_intel.c index a66ee53a..74ed3786 100644 --- a/port/ehci/usb_glue_intel.c +++ b/port/ehci/usb_glue_intel.c @@ -11,7 +11,7 @@ static int ehci_slot; static int ehci_function; static int ehci_vector; -extern void USBH_IRQHandler(struct usbh_bus *bus); +extern void USBH_IRQHandler(uint8_t busid); void ehci_pci_scan(int bus, int slot, int fun, int vector) { @@ -38,7 +38,7 @@ void usb_hc_low_level_init(struct usbh_bus *bus) "USBirq", RTEMS_INTERRUPT_SHARED, USBH_IRQHandler, - (void *)bus); + (void *)0); if (sc != RTEMS_SUCCESSFUL) { printf("USB install isr falied,%s\n", rtems_status_text(sc)); diff --git a/port/ehci/usb_hc_ehci.c b/port/ehci/usb_hc_ehci.c index a213ca9d..f15b1a61 100644 --- a/port/ehci/usb_hc_ehci.c +++ b/port/ehci/usb_hc_ehci.c @@ -1309,10 +1309,13 @@ static void ehci_scan_periodic_list(struct usbh_bus *bus) } } -void USBH_IRQHandler(struct usbh_bus *bus) +void USBH_IRQHandler(uint8_t busid) { uint32_t usbsts; + struct usbh_bus *bus; + bus = &g_usbhost_bus[busid]; + usbsts = EHCI_HCOR->usbsts & EHCI_HCOR->usbintr; EHCI_HCOR->usbsts = usbsts; diff --git a/port/fsdev/usb_dc_fsdev.c b/port/fsdev/usb_dc_fsdev.c index 68f4f37e..16843e26 100644 --- a/port/fsdev/usb_dc_fsdev.c +++ b/port/fsdev/usb_dc_fsdev.c @@ -7,14 +7,6 @@ #define PMA_ACCESS CONFIG_USBDEV_FSDEV_PMA_ACCESS #include "usb_fsdev_reg.h" -#ifndef USBD_IRQHandler -#error "please define USBD_IRQHandler in usb_config.h" -#endif - -#ifndef USBD_BASE -#error "please define USBD_BASE in usb_config.h" -#endif - #ifndef CONFIG_USB_FSDEV_RAM_SIZE #define CONFIG_USB_FSDEV_RAM_SIZE 512 #endif @@ -23,7 +15,7 @@ #define CONFIG_USBDEV_EP_NUM 8 #endif -#define USB ((USB_TypeDef *)USBD_BASE) +#define USB ((USB_TypeDef *)g_usbdev_bus[0].reg_base) #define USB_BTABLE_SIZE (8 * CONFIG_USBDEV_EP_NUM) @@ -309,7 +301,7 @@ int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t return 0; } -void USBD_IRQHandler(void) +void USBD_IRQHandler(uint8_t busid) { uint16_t wIstr, wEPVal; uint8_t ep_idx; diff --git a/port/musb/usb_dc_musb.c b/port/musb/usb_dc_musb.c index 256f387b..f8c0d9c3 100644 --- a/port/musb/usb_dc_musb.c +++ b/port/musb/usb_dc_musb.c @@ -13,15 +13,7 @@ #define HWREGB(x) \ (*((volatile uint8_t *)(x))) -#ifndef USBD_IRQHandler -#error "please define USBD_IRQHandler in usb_config.h" -#endif - -#ifndef USBD_BASE -#error "please define USBD_BASE in usb_config.h" -#endif - -#define USB_BASE USBD_BASE +#define USB_BASE (g_usbdev_bus[0].reg_base) #if defined(CONFIG_USB_MUSB_SUNXI) #define MUSB_FADDR_OFFSET 0x98 @@ -775,7 +767,7 @@ static void handle_ep0(void) } } -void USBD_IRQHandler(void) +void USBD_IRQHandler(uint8_t busid) { uint32_t is; uint32_t txis; @@ -796,7 +788,7 @@ void USBD_IRQHandler(void) if (is & USB_IS_RESET) { memset(&g_musb_udc, 0, sizeof(struct musb_udc)); g_musb_udc.fifo_size_offset = USB_CTRL_EP_MPS; - usbd_event_reset_handler(); + usbd_event_reset_handler(0); HWREGH(USB_BASE + MUSB_TXIE_OFFSET) = USB_TXIE_EP0; HWREGH(USB_BASE + MUSB_RXIE_OFFSET) = 0; diff --git a/port/musb/usb_hc_musb.c b/port/musb/usb_hc_musb.c index 8434b28b..6ff0dffa 100644 --- a/port/musb/usb_hc_musb.c +++ b/port/musb/usb_hc_musb.c @@ -850,7 +850,7 @@ void handle_ep0(struct usbh_bus *bus) } } -void USBH_IRQHandler(struct usbh_bus *bus) +void USBH_IRQHandler(uint8_t busid) { uint32_t is; uint32_t txis; @@ -861,7 +861,10 @@ void USBH_IRQHandler(struct usbh_bus *bus) struct usbh_urb *urb; uint8_t ep_idx; uint8_t old_ep_idx; + struct usbh_bus *bus; + bus = &g_usbhost_bus[busid]; + is = HWREGB(USB_BASE + MUSB_IS_OFFSET); txis = HWREGH(USB_BASE + MUSB_TXIS_OFFSET); rxis = HWREGH(USB_BASE + MUSB_RXIS_OFFSET); diff --git a/port/nuvoton/usb_dc_usbfs.c b/port/nuvoton/usb_dc_usbfs.c index d33d4d5a..45960f1a 100644 --- a/port/nuvoton/usb_dc_usbfs.c +++ b/port/nuvoton/usb_dc_usbfs.c @@ -2,10 +2,6 @@ #include "NuMicro.h" #include "usbd_core.h" -#ifndef USBD_IRQHandler -#define USBD_IRQHandler USBD_IRQHandler -#endif - #ifndef USBD_EPNUM #define USBD_EPNUM 8 #endif @@ -292,7 +288,7 @@ int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t return 0; } -void USBD_IRQHandler(void) +void USBD_IRQHandler(uint8_t busid) { uint32_t int_flag = USBD_GET_INT_FLAG(); uint32_t bus_state = USBD_GET_BUS_STATE(); diff --git a/port/pusb2/usb_dc_pusb2.c b/port/pusb2/usb_dc_pusb2.c index 843df9cf..b47ec1fe 100644 --- a/port/pusb2/usb_dc_pusb2.c +++ b/port/pusb2/usb_dc_pusb2.c @@ -468,7 +468,7 @@ int usbd_ep_start_read(uint8_t busid, const uint8_t ep, uint8_t *data, uint32_t return pusb2_dc_ep_read_write(ep, (uintptr)data, data_len); } -void USBD_IRQHandler(void) +void USBD_IRQHandler(uint8_t busid) { FPUsb2InterruptHandler(&g_pusb2_udc.pusb2); }