From dca8b4cfedd94b34207cacd3f6c43e7e354d34d2 Mon Sep 17 00:00:00 2001 From: sakumisu <1203593632@qq.com> Date: Thu, 20 Oct 2022 21:22:08 +0800 Subject: [PATCH] remove intf malloc --- README.md | 16 ++--- README_zh.md | 16 ++--- class/audio/usbd_audio.c | 8 +-- class/audio/usbd_audio.h | 4 +- class/cdc/usbd_cdc.c | 8 +-- class/cdc/usbd_cdc.h | 4 +- class/dfu/usbd_dfu.c | 8 +-- class/dfu/usbd_dfu.h | 4 +- class/hid/usbd_hid.c | 64 +------------------ class/hid/usbd_hid.h | 4 +- class/msc/usbd_msc.c | 8 +-- class/msc/usbd_msc.h | 6 +- class/video/usbd_video.c | 13 ++-- class/video/usbd_video.h | 9 +-- class/wireless/usbd_rndis.c | 11 ++-- class/wireless/usbd_rndis.h | 6 +- demo/audio_v1_mic_multichan_template.c | 7 +- .../audio_v1_mic_speaker_multichan_template.c | 10 ++- demo/audio_v2_mic_multichan_template.c | 7 +- .../audio_v2_mic_speaker_multichan_template.c | 10 ++- demo/audio_v2_speaker_multichan_template.c | 7 +- demo/cdc_acm_hid_msc_template.c | 20 +++--- demo/cdc_acm_msc_template.c | 11 ++-- demo/cdc_acm_multi_template.c | 26 +++++--- demo/cdc_acm_template.c | 8 ++- demo/cdc_rndis_template.c | 8 ++- demo/cmsis-dap_v2.1_tempate.c | 6 +- demo/dfu_with_st_tool_template.c | 20 +++--- demo/hid_custom_inout_template.c | 11 +--- demo/hid_keyboard_template.c | 4 +- demo/hid_mouse_template.c | 11 +--- demo/midi_template.c | 8 +-- demo/msc_ram_template.c | 11 +--- demo/video_static_mjpeg_template.c | 7 +- demo/winusb1.0_template.c | 9 +-- docs/source/api/api_device.rst | 35 +++++----- 36 files changed, 178 insertions(+), 247 deletions(-) diff --git a/README.md b/README.md index c4445e51..aee4c636 100644 --- a/README.md +++ b/README.md @@ -66,14 +66,14 @@ CherryUSB Device Stack has the following functions: CherryUSB Device Stack resource usage (GCC 10.2 with -O2): -| file | FLASH (Byte) | No Cache RAM (Byte) | RAM (Byte) | Heap (Byte) | -|:-------------:|:--------------:|:-------------------------:|:-------------:|:---------------------------------:| -|usbd_core.c | 3263 | 384 | 17 | 0 | -|usbd_cdc.c | 490 | 0 | 0 | sizeof(struct usbd_interface) * x | -|usbd_msc.c | 2772 | 128 + 512(default) | 16 | sizeof(struct usbd_interface) * x | -|usbd_hid.c | 501 | 0 | 0 | sizeof(struct usbd_interface) * x | -|usbd_audio.c | 1208 | 0 | 4 | sizeof(struct usbd_interface) * x | -|usbd_video.c | 2272 | 0 | 82 | sizeof(struct usbd_interface) * x | +| file | FLASH (Byte) | No Cache RAM (Byte) | RAM (Byte) | Heap (Byte) | +|:-------------:|:--------------:|:-------------------------:|:-------------:|:----------------:| +|usbd_core.c | 3263 | 384 | 17 | 0 | +|usbd_cdc.c | 490 | 0 | 0 | 0 | +|usbd_msc.c | 2772 | 128 + 512(default) | 16 | 0 | +|usbd_hid.c | 501 | 0 | 0 | 0 | +|usbd_audio.c | 1208 | 0 | 4 | 0 | +|usbd_video.c | 2272 | 0 | 82 | 0 | ## Host Stack Overview diff --git a/README_zh.md b/README_zh.md index d19d5207..2efcfeaf 100644 --- a/README_zh.md +++ b/README_zh.md @@ -65,14 +65,14 @@ CherryUSB Device 协议栈当前实现以下功能: CherryUSB Device 协议栈资源占用说明(GCC 10.2 with -O2): -| file | FLASH (Byte) | No Cache RAM (Byte) | RAM (Byte) | Heap (Byte) | -|:-------------:|:--------------:|:-------------------------:|:-------------:|:---------------------------------:| -|usbd_core.c | 3263 | 384 | 17 | 0 | -|usbd_cdc.c | 490 | 0 | 0 | sizeof(struct usbd_interface) * x | -|usbd_msc.c | 2772 | 128 + 512(default) | 16 | sizeof(struct usbd_interface) * x | -|usbd_hid.c | 501 | 0 | 0 | sizeof(struct usbd_interface) * x | -|usbd_audio.c | 1208 | 0 | 4 | sizeof(struct usbd_interface) * x | -|usbd_video.c | 2272 | 0 | 82 | sizeof(struct usbd_interface) * x | +| file | FLASH (Byte) | No Cache RAM (Byte) | RAM (Byte) | Heap (Byte) | +|:-------------:|:--------------:|:-------------------------:|:-------------:|:----------------:| +|usbd_core.c | 3263 | 384 | 17 | 0 | +|usbd_cdc.c | 490 | 0 | 0 | 0 | +|usbd_msc.c | 2772 | 128 + 512(default) | 16 | 0 | +|usbd_hid.c | 501 | 0 | 0 | 0 | +|usbd_audio.c | 1208 | 0 | 4 | 0 | +|usbd_video.c | 2272 | 0 | 82 | 0 | ## Host 协议栈简介 diff --git a/class/audio/usbd_audio.c b/class/audio/usbd_audio.c index 6755b83d..4baab5a4 100644 --- a/class/audio/usbd_audio.c +++ b/class/audio/usbd_audio.c @@ -373,14 +373,8 @@ static void audio_notify_handler(uint8_t event, void *arg) } } -struct usbd_interface *usbd_audio_alloc_intf(void) +struct usbd_interface *usbd_audio_init_intf(struct usbd_interface *intf) { - struct usbd_interface *intf = usb_malloc(sizeof(struct usbd_interface)); - if (intf == NULL) { - USB_LOG_ERR("no mem to alloc intf\r\n"); - return NULL; - } - intf->class_interface_handler = audio_class_interface_request_handler; #if CONFIG_USBDEV_AUDIO_VERSION < 0x0200 intf->class_endpoint_handler = audio_class_endpoint_request_handler; diff --git a/class/audio/usbd_audio.h b/class/audio/usbd_audio.h index 723e8666..420e88ce 100644 --- a/class/audio/usbd_audio.h +++ b/class/audio/usbd_audio.h @@ -12,8 +12,8 @@ extern "C" { #endif -/* Alloc audio interface driver */ -struct usbd_interface *usbd_audio_alloc_intf(void); +/* Init audio interface driver */ +struct usbd_interface *usbd_audio_init_intf(struct usbd_interface *intf); void usbd_audio_open(uint8_t intf); void usbd_audio_close(uint8_t intf); diff --git a/class/cdc/usbd_cdc.c b/class/cdc/usbd_cdc.c index 8c9ee5a8..2f4977f4 100644 --- a/class/cdc/usbd_cdc.c +++ b/class/cdc/usbd_cdc.c @@ -90,14 +90,8 @@ static void cdc_notify_handler(uint8_t event, void *arg) } } -struct usbd_interface *usbd_cdc_acm_alloc_intf(void) +struct usbd_interface *usbd_cdc_acm_init_intf(struct usbd_interface *intf) { - struct usbd_interface *intf = usb_malloc(sizeof(struct usbd_interface)); - if (intf == NULL) { - USB_LOG_ERR("no mem to alloc intf\r\n"); - return NULL; - } - intf->class_interface_handler = cdc_acm_class_interface_request_handler; intf->class_endpoint_handler = NULL; intf->vendor_handler = NULL; diff --git a/class/cdc/usbd_cdc.h b/class/cdc/usbd_cdc.h index 8cd88270..b4f5d993 100644 --- a/class/cdc/usbd_cdc.h +++ b/class/cdc/usbd_cdc.h @@ -12,8 +12,8 @@ extern "C" { #endif -/* Alloc cdc acm interface driver */ -struct usbd_interface *usbd_cdc_acm_alloc_intf(void); +/* Init cdc acm interface driver */ +struct usbd_interface *usbd_cdc_acm_init_intf(struct usbd_interface *intf); /* Setup request command callback api */ void usbd_cdc_acm_set_line_coding(uint8_t intf, struct cdc_line_coding *line_coding); diff --git a/class/dfu/usbd_dfu.c b/class/dfu/usbd_dfu.c index 10c33a48..3042e4df 100644 --- a/class/dfu/usbd_dfu.c +++ b/class/dfu/usbd_dfu.c @@ -477,14 +477,8 @@ static void dfu_notify_handler(uint8_t event, void *arg) } } -struct usbd_interface *usbd_dfu_alloc_intf(void) +struct usbd_interface *usbd_dfu_init_intf(struct usbd_interface *intf) { - struct usbd_interface *intf = usb_malloc(sizeof(struct usbd_interface)); - if (intf == NULL) { - USB_LOG_ERR("no mem to alloc intf\r\n"); - return NULL; - } - intf->class_interface_handler = dfu_class_interface_request_handler; intf->class_endpoint_handler = NULL; intf->vendor_handler = NULL; diff --git a/class/dfu/usbd_dfu.h b/class/dfu/usbd_dfu.h index 1cc4510b..9081d0dd 100644 --- a/class/dfu/usbd_dfu.h +++ b/class/dfu/usbd_dfu.h @@ -12,8 +12,8 @@ extern "C" { #endif -/* Alloc dfu interface driver */ -struct usbd_interface *usbd_dfu_alloc_intf(void); +/* Init dfu interface driver */ +struct usbd_interface *usbd_dfu_init_intf(struct usbd_interface *intf); /* Interface functions that need to be implemented by the user */ uint8_t *dfu_read_flash(uint8_t *src, uint8_t *dest, uint32_t len); diff --git a/class/hid/usbd_hid.c b/class/hid/usbd_hid.c index 1f47bb3f..b2659bdf 100644 --- a/class/hid/usbd_hid.c +++ b/class/hid/usbd_hid.c @@ -6,62 +6,6 @@ #include "usbd_core.h" #include "usbd_hid.h" -static int hid_custom_request_handler(struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) -{ - USB_LOG_DBG("HID Custom request: " - "bRequest 0x%02x\r\n", - setup->bRequest); - - if (((setup->bmRequestType & USB_REQUEST_DIR_MASK) == USB_REQUEST_DIR_IN) && - setup->bRequest == USB_REQUEST_GET_DESCRIPTOR) { - uint8_t value = (uint8_t)(setup->wValue >> 8); - uint8_t intf_num = (uint8_t)setup->wIndex; - - usb_slist_t *i; - struct usbd_interface *match_intf = NULL; - - usb_slist_for_each(i, &usbd_intf_head) - { - struct usbd_interface *intf = usb_slist_entry(i, struct usbd_interface, list); - - if (intf->intf_num == intf_num) { - match_intf = intf; - break; - } - } - - if (match_intf == NULL) { - return -2; - } - - switch (value) { - case HID_DESCRIPTOR_TYPE_HID: - USB_LOG_INFO("get HID Descriptor\r\n"); - // *data = (uint8_t *)match_intf->hid_descriptor; - // *len = match_intf->hid_descriptor[0]; - break; - - case HID_DESCRIPTOR_TYPE_HID_REPORT: - USB_LOG_INFO("get Report Descriptor\r\n"); - *data = (uint8_t *)match_intf->hid_report_descriptor; - *len = match_intf->hid_report_descriptor_len; - break; - - case HID_DESCRIPTOR_TYPE_HID_PHYSICAL: - USB_LOG_INFO("get PHYSICAL Descriptor\r\n"); - - break; - - default: - return -2; - } - - return 0; - } - - return -1; -} - static int hid_class_interface_request_handler(struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) { USB_LOG_DBG("HID Class request: " @@ -105,14 +49,8 @@ static int hid_class_interface_request_handler(struct usb_setup_packet *setup, u return 0; } -struct usbd_interface *usbd_hid_alloc_intf(const uint8_t *desc, uint32_t desc_len) +struct usbd_interface *usbd_hid_init_intf(struct usbd_interface *intf, const uint8_t *desc, uint32_t desc_len) { - struct usbd_interface *intf = usb_malloc(sizeof(struct usbd_interface)); - if (intf == NULL) { - USB_LOG_ERR("no mem to alloc intf\r\n"); - return NULL; - } - intf->class_interface_handler = hid_class_interface_request_handler; intf->class_endpoint_handler = NULL; intf->vendor_handler = NULL; diff --git a/class/hid/usbd_hid.h b/class/hid/usbd_hid.h index d065cf45..9c1be362 100644 --- a/class/hid/usbd_hid.h +++ b/class/hid/usbd_hid.h @@ -12,8 +12,8 @@ extern "C" { #endif -/* Alloc hid interface driver */ -struct usbd_interface *usbd_hid_alloc_intf(const uint8_t *desc, uint32_t desc_len); +/* Init hid interface driver */ +struct usbd_interface *usbd_hid_init_intf(struct usbd_interface *intf, const uint8_t *desc, uint32_t desc_len); /* Register desc api */ void usbd_hid_descriptor_register(uint8_t intf_num, const uint8_t *desc); diff --git a/class/msc/usbd_msc.c b/class/msc/usbd_msc.c index 2ca1a837..9655c951 100644 --- a/class/msc/usbd_msc.c +++ b/class/msc/usbd_msc.c @@ -912,14 +912,8 @@ static void usbd_msc_thread(void *argument) } #endif -struct usbd_interface *usbd_msc_alloc_intf(const uint8_t out_ep, const uint8_t in_ep) +struct usbd_interface *usbd_msc_init_intf(struct usbd_interface *intf, const uint8_t out_ep, const uint8_t in_ep) { - struct usbd_interface *intf = usb_malloc(sizeof(struct usbd_interface)); - if (intf == NULL) { - USB_LOG_ERR("no mem to alloc intf\r\n"); - return NULL; - } - intf->class_interface_handler = msc_storage_class_interface_request_handler; intf->class_endpoint_handler = NULL; intf->vendor_handler = NULL; diff --git a/class/msc/usbd_msc.h b/class/msc/usbd_msc.h index 53ec4692..824b4844 100644 --- a/class/msc/usbd_msc.h +++ b/class/msc/usbd_msc.h @@ -12,8 +12,10 @@ extern "C" { #endif -/* Alloc msc interface driver */ -struct usbd_interface *usbd_msc_alloc_intf(const uint8_t out_ep, const uint8_t in_ep); +/* Init msc interface driver */ +struct usbd_interface *usbd_msc_init_intf(struct usbd_interface *intf, + const uint8_t out_ep, + const uint8_t in_ep); void usbd_msc_get_cap(uint8_t lun, uint32_t *block_num, uint16_t *block_size); int usbd_msc_sector_read(uint32_t sector, uint8_t *buffer, uint32_t length); diff --git a/class/video/usbd_video.c b/class/video/usbd_video.c index fbb2beec..be27bba5 100644 --- a/class/video/usbd_video.c +++ b/class/video/usbd_video.c @@ -742,14 +742,11 @@ void usbd_video_probe_and_commit_controls_init(uint32_t dwFrameInterval, uint32_ usbd_video_cfg.commit.bMaxVersion = 0; } -struct usbd_interface *usbd_video_alloc_intf(uint32_t dwFrameInterval, uint32_t dwMaxVideoFrameSize, uint32_t dwMaxPayloadTransferSize) +struct usbd_interface *usbd_video_init_intf(struct usbd_interface *intf, + uint32_t dwFrameInterval, + uint32_t dwMaxVideoFrameSize, + uint32_t dwMaxPayloadTransferSize) { - struct usbd_interface *intf = usb_malloc(sizeof(struct usbd_interface)); - if (intf == NULL) { - USB_LOG_ERR("no mem to alloc intf\r\n"); - return NULL; - } - intf->class_interface_handler = video_class_interface_request_handler; intf->class_endpoint_handler = NULL; intf->vendor_handler = NULL; @@ -780,7 +777,7 @@ uint32_t usbd_video_mjpeg_payload_fill(uint8_t *input, uint32_t input_len, uint8 picture_pos += usbd_video_cfg.probe.dwMaxPayloadTransferSize - 2; } } - uvc_header[1] ^=1; + uvc_header[1] ^= 1; *out_len = (input_len + 2 * packets); return packets; } \ No newline at end of file diff --git a/class/video/usbd_video.h b/class/video/usbd_video.h index cbb54d71..75d7f9ed 100644 --- a/class/video/usbd_video.h +++ b/class/video/usbd_video.h @@ -12,10 +12,11 @@ extern "C" { #endif -/* Alloc video interface driver */ -struct usbd_interface *usbd_video_alloc_intf(uint32_t dwFrameInterval, - uint32_t dwMaxVideoFrameSize, - uint32_t dwMaxPayloadTransferSize); +/* Init video interface driver */ +struct usbd_interface *usbd_video_init_intf(struct usbd_interface *intf, + uint32_t dwFrameInterval, + uint32_t dwMaxVideoFrameSize, + uint32_t dwMaxPayloadTransferSize); void usbd_video_open(uint8_t intf); void usbd_video_close(uint8_t intf); diff --git a/class/wireless/usbd_rndis.c b/class/wireless/usbd_rndis.c index 2479bb0b..6b58d937 100644 --- a/class/wireless/usbd_rndis.c +++ b/class/wireless/usbd_rndis.c @@ -529,14 +529,11 @@ int usbd_rndis_eth_tx(struct pbuf *p) return usbd_ep_start_write(rndis_ep_data[RNDIS_IN_EP_IDX].ep_addr, g_rndis_tx_buffer, g_rndis_tx_data_length); } #endif -struct usbd_interface *usbd_rndis_alloc_intf(uint8_t out_ep, uint8_t in_ep, uint8_t int_ep, uint8_t mac[6]) +struct usbd_interface *usbd_rndis_init_intf(struct usbd_interface *intf, + const uint8_t out_ep, + const uint8_t in_ep, + const uint8_t int_ep, uint8_t mac[6]) { - struct usbd_interface *intf = (struct usbd_interface *)usb_malloc(sizeof(struct usbd_interface)); - if (intf == NULL) { - USB_LOG_ERR("no mem to alloc intf\r\n"); - return NULL; - } - memcpy(usbd_rndis_cfg.mac, mac, 6); rndis_ep_data[RNDIS_OUT_EP_IDX].ep_addr = out_ep; diff --git a/class/wireless/usbd_rndis.h b/class/wireless/usbd_rndis.h index 05ed53ae..d9f9f646 100644 --- a/class/wireless/usbd_rndis.h +++ b/class/wireless/usbd_rndis.h @@ -12,7 +12,11 @@ extern "C" { #endif -struct usbd_interface *usbd_rndis_alloc_intf(uint8_t out_ep, uint8_t in_ep, uint8_t int_ep, uint8_t mac[6]); +/* Init rndis interface driver */ +struct usbd_interface *usbd_rndis_init_intf(struct usbd_interface *intf, + const uint8_t out_ep, + const uint8_t in_ep, + const uint8_t int_ep, uint8_t mac[6]); #ifdef CONFIG_USBDEV_RNDIS_USING_LWIP struct pbuf *usbd_rndis_eth_rx(void); diff --git a/demo/audio_v1_mic_multichan_template.c b/demo/audio_v1_mic_multichan_template.c index 7d077a3b..276ae32e 100644 --- a/demo/audio_v1_mic_multichan_template.c +++ b/demo/audio_v1_mic_multichan_template.c @@ -173,11 +173,14 @@ static struct usbd_endpoint audio_in_ep = { .ep_addr = AUDIO_IN_EP }; +struct usbd_interface intf0; +struct usbd_interface intf1; + void audio_init() { usbd_desc_register(audio_descriptor); - usbd_add_interface(usbd_audio_alloc_intf()); - usbd_add_interface(usbd_audio_alloc_intf()); + usbd_add_interface(usbd_audio_init_intf(&intf0)); + usbd_add_interface(usbd_audio_init_intf(&intf1)); usbd_add_endpoint(&audio_in_ep); usbd_audio_add_entity(0x02, AUDIO_CONTROL_FEATURE_UNIT); diff --git a/demo/audio_v1_mic_speaker_multichan_template.c b/demo/audio_v1_mic_speaker_multichan_template.c index 48047ac8..b5152a3f 100644 --- a/demo/audio_v1_mic_speaker_multichan_template.c +++ b/demo/audio_v1_mic_speaker_multichan_template.c @@ -193,12 +193,16 @@ static struct usbd_endpoint audio_out_ep = { .ep_addr = AUDIO_OUT_EP }; +struct usbd_interface intf0; +struct usbd_interface intf1; +struct usbd_interface intf2; + void audio_init() { usbd_desc_register(audio_descriptor); - usbd_add_interface(usbd_audio_alloc_intf()); - usbd_add_interface(usbd_audio_alloc_intf()); - usbd_add_interface(usbd_audio_alloc_intf()); + usbd_add_interface(usbd_audio_init_intf(&intf0)); + usbd_add_interface(usbd_audio_init_intf(&intf1)); + usbd_add_interface(usbd_audio_init_intf(&intf2)); usbd_add_endpoint(&audio_in_ep); usbd_add_endpoint(&audio_out_ep); diff --git a/demo/audio_v2_mic_multichan_template.c b/demo/audio_v2_mic_multichan_template.c index af6256cc..ab8cef22 100644 --- a/demo/audio_v2_mic_multichan_template.c +++ b/demo/audio_v2_mic_multichan_template.c @@ -174,11 +174,14 @@ static struct usbd_endpoint audio_in_ep = { .ep_addr = AUDIO_IN_EP }; +struct usbd_interface intf0; +struct usbd_interface intf1; + void audio_init() { usbd_desc_register(audio_descriptor); - usbd_add_interface(usbd_audio_alloc_intf()); - usbd_add_interface(usbd_audio_alloc_intf()); + usbd_add_interface(usbd_audio_init_intf(&intf0)); + usbd_add_interface(usbd_audio_init_intf(&intf1)); usbd_add_endpoint(&audio_in_ep); usbd_audio_add_entity(0x01, AUDIO_CONTROL_CLOCK_SOURCE); diff --git a/demo/audio_v2_mic_speaker_multichan_template.c b/demo/audio_v2_mic_speaker_multichan_template.c index 17b28a69..805a9632 100644 --- a/demo/audio_v2_mic_speaker_multichan_template.c +++ b/demo/audio_v2_mic_speaker_multichan_template.c @@ -262,12 +262,16 @@ static struct usbd_endpoint audio_in_ep = { .ep_addr = AUDIO_IN_EP }; +struct usbd_interface intf0; +struct usbd_interface intf1; +struct usbd_interface intf2; + void audio_init() { usbd_desc_register(audio_descriptor); - usbd_add_interface(usbd_audio_alloc_intf()); - usbd_add_interface(usbd_audio_alloc_intf()); - usbd_add_interface(usbd_audio_alloc_intf()); + usbd_add_interface(usbd_audio_init_intf(&intf0)); + usbd_add_interface(usbd_audio_init_intf(&intf1)); + usbd_add_interface(usbd_audio_init_intf(&intf2)); usbd_add_endpoint(&audio_in_ep); usbd_add_endpoint(&audio_out_ep); diff --git a/demo/audio_v2_speaker_multichan_template.c b/demo/audio_v2_speaker_multichan_template.c index dc103558..c1de77cf 100644 --- a/demo/audio_v2_speaker_multichan_template.c +++ b/demo/audio_v2_speaker_multichan_template.c @@ -182,11 +182,14 @@ static struct usbd_endpoint audio_out_ep = { .ep_addr = AUDIO_OUT_EP }; +struct usbd_interface intf0; +struct usbd_interface intf1; + void audio_init() { usbd_desc_register(audio_descriptor); - usbd_add_interface(usbd_audio_alloc_intf()); - usbd_add_interface(usbd_audio_alloc_intf()); + usbd_add_interface(usbd_audio_init_intf(&intf0)); + usbd_add_interface(usbd_audio_init_intf(&intf1)); usbd_add_endpoint(&audio_out_ep); usbd_audio_add_entity(0x01, AUDIO_CONTROL_CLOCK_SOURCE); diff --git a/demo/cdc_acm_hid_msc_template.c b/demo/cdc_acm_hid_msc_template.c index 13b97cdc..58afd7e9 100644 --- a/demo/cdc_acm_hid_msc_template.c +++ b/demo/cdc_acm_hid_msc_template.c @@ -291,25 +291,23 @@ struct usbd_endpoint cdc_in_ep = { .ep_cb = usbd_cdc_acm_bulk_in }; -/* function ------------------------------------------------------------------*/ -/** - * @brief msc ram init - * @pre none - * @param[in] none - * @retval none - */ +struct usbd_interface intf0; +struct usbd_interface intf1; +struct usbd_interface intf2; +struct usbd_interface intf3; + void cdc_acm_hid_msc_descriptor_init(void) { usbd_desc_register(cdc_acm_hid_msc_descriptor); - usbd_add_interface(usbd_cdc_acm_alloc_intf()); - usbd_add_interface(usbd_cdc_acm_alloc_intf()); + usbd_add_interface(usbd_cdc_acm_init_intf(&intf0)); + usbd_add_interface(usbd_cdc_acm_init_intf(&intf1)); usbd_add_endpoint(&cdc_out_ep); usbd_add_endpoint(&cdc_in_ep); - usbd_add_interface(usbd_msc_alloc_intf(MSC_OUT_EP, MSC_IN_EP)); + usbd_add_interface(usbd_msc_init_intf(&intf2, MSC_OUT_EP, MSC_IN_EP)); - usbd_add_interface(usbd_hid_alloc_intf(hid_mouse_report_desc, HID_MOUSE_REPORT_DESC_SIZE)); + usbd_add_interface(usbd_hid_init_intf(&intf3, hid_mouse_report_desc, HID_MOUSE_REPORT_DESC_SIZE)); usbd_add_endpoint(&hid_in_ep); /*!< init mouse report data */ diff --git a/demo/cdc_acm_msc_template.c b/demo/cdc_acm_msc_template.c index 82c741a5..f322c925 100644 --- a/demo/cdc_acm_msc_template.c +++ b/demo/cdc_acm_msc_template.c @@ -145,15 +145,18 @@ struct usbd_endpoint cdc_in_ep = { .ep_cb = usbd_cdc_acm_bulk_in }; -/* function ------------------------------------------------------------------*/ +struct usbd_interface intf0; +struct usbd_interface intf1; +struct usbd_interface intf2; + void cdc_acm_msc_init(void) { usbd_desc_register(cdc_msc_descriptor); - usbd_add_interface(usbd_cdc_acm_alloc_intf()); - usbd_add_interface(usbd_cdc_acm_alloc_intf()); + usbd_add_interface(usbd_cdc_acm_init_intf(&intf0)); + usbd_add_interface(usbd_cdc_acm_init_intf(&intf1)); usbd_add_endpoint(&cdc_out_ep); usbd_add_endpoint(&cdc_in_ep); - usbd_add_interface(usbd_msc_alloc_intf(MSC_OUT_EP, MSC_IN_EP)); + usbd_add_interface(usbd_msc_init_intf(&intf2, MSC_OUT_EP, MSC_IN_EP)); usbd_initialize(); } diff --git a/demo/cdc_acm_multi_template.c b/demo/cdc_acm_multi_template.c index 334ebc10..68eb4e41 100644 --- a/demo/cdc_acm_multi_template.c +++ b/demo/cdc_acm_multi_template.c @@ -187,28 +187,36 @@ struct usbd_endpoint cdc_in_ep4 = { .ep_cb = usbd_cdc_acm_bulk_in }; -/* function ------------------------------------------------------------------*/ +struct usbd_interface intf0; +struct usbd_interface intf1; +struct usbd_interface intf2; +struct usbd_interface intf3; +struct usbd_interface intf4; +struct usbd_interface intf5; +struct usbd_interface intf6; +struct usbd_interface intf7; + void cdc_acm_multi_init(void) { usbd_desc_register(cdc_descriptor); - usbd_add_interface(usbd_cdc_acm_alloc_intf()); - usbd_add_interface(usbd_cdc_acm_alloc_intf()); + usbd_add_interface(usbd_cdc_acm_init_intf(&intf0)); + usbd_add_interface(usbd_cdc_acm_init_intf(&intf1)); usbd_add_endpoint(&cdc_out_ep1); usbd_add_endpoint(&cdc_in_ep1); - usbd_add_interface(usbd_cdc_acm_alloc_intf()); - usbd_add_interface(usbd_cdc_acm_alloc_intf()); + usbd_add_interface(usbd_cdc_acm_init_intf(&intf2)); + usbd_add_interface(usbd_cdc_acm_init_intf(&intf3)); usbd_add_endpoint(&cdc_out_ep2); usbd_add_endpoint(&cdc_in_ep2); - usbd_add_interface(usbd_cdc_acm_alloc_intf()); - usbd_add_interface(usbd_cdc_acm_alloc_intf()); + usbd_add_interface(usbd_cdc_acm_init_intf(&intf4)); + usbd_add_interface(usbd_cdc_acm_init_intf(&intf5)); usbd_add_endpoint(&cdc_out_ep3); usbd_add_endpoint(&cdc_in_ep3); - usbd_add_interface(usbd_cdc_acm_alloc_intf()); - usbd_add_interface(usbd_cdc_acm_alloc_intf()); + usbd_add_interface(usbd_cdc_acm_init_intf(&intf6)); + usbd_add_interface(usbd_cdc_acm_init_intf(&intf7)); usbd_add_endpoint(&cdc_out_ep4); usbd_add_endpoint(&cdc_in_ep4); diff --git a/demo/cdc_acm_template.c b/demo/cdc_acm_template.c index 050d4ccd..2fa76058 100644 --- a/demo/cdc_acm_template.c +++ b/demo/cdc_acm_template.c @@ -144,12 +144,14 @@ struct usbd_endpoint cdc_in_ep = { .ep_cb = usbd_cdc_acm_bulk_in }; -/* function ------------------------------------------------------------------*/ +struct usbd_interface intf0; +struct usbd_interface intf1; + void cdc_acm_init(void) { usbd_desc_register(cdc_descriptor); - usbd_add_interface(usbd_cdc_acm_alloc_intf()); - usbd_add_interface(usbd_cdc_acm_alloc_intf()); + usbd_add_interface(usbd_cdc_acm_init_intf(&intf0)); + usbd_add_interface(usbd_cdc_acm_init_intf(&intf1)); usbd_add_endpoint(&cdc_out_ep); usbd_add_endpoint(&cdc_in_ep); usbd_initialize(); diff --git a/demo/cdc_rndis_template.c b/demo/cdc_rndis_template.c index a056e472..f9e974a4 100644 --- a/demo/cdc_rndis_template.c +++ b/demo/cdc_rndis_template.c @@ -161,14 +161,16 @@ void usbd_configure_done_callback(void) #endif /* RT_USING_LWIP */ -/* function ------------------------------------------------------------------*/ +struct usbd_interface intf0; +struct usbd_interface intf1; + void cdc_rndis_init(void) { #ifdef RT_USING_LWIP rt_usbd_rndis_init(); #endif usbd_desc_register(cdc_descriptor); - usbd_add_interface(usbd_rndis_alloc_intf(CDC_OUT_EP, CDC_IN_EP, CDC_INT_EP, mac)); - usbd_add_interface(usbd_rndis_alloc_intf(CDC_OUT_EP, CDC_IN_EP, CDC_INT_EP, mac)); + usbd_add_interface(usbd_rndis_init_intf(&intf0, CDC_OUT_EP, CDC_IN_EP, CDC_INT_EP, mac)); + usbd_add_interface(usbd_rndis_init_intf(&intf1, CDC_OUT_EP, CDC_IN_EP, CDC_INT_EP, mac)); usbd_initialize(); } diff --git a/demo/cmsis-dap_v2.1_tempate.c b/demo/cmsis-dap_v2.1_tempate.c index 6e51a432..627efb8d 100644 --- a/demo/cmsis-dap_v2.1_tempate.c +++ b/demo/cmsis-dap_v2.1_tempate.c @@ -261,6 +261,8 @@ static struct usbd_endpoint dap_in_ep = { }; struct usbd_interface dap_interface; +struct usbd_interface intf1; +struct usbd_interface intf2; void daplink_init(void) { @@ -273,8 +275,8 @@ void daplink_init(void) usbd_add_endpoint(&dap_in_ep); /*!< cdc acm */ - usbd_add_interface(usbd_cdc_acm_alloc_intf()); - usbd_add_interface(usbd_cdc_acm_alloc_intf()); + usbd_add_interface(usbd_cdc_acm_init_intf(&intf1)); + usbd_add_interface(usbd_cdc_acm_init_intf(&intf2)); usbd_add_endpoint(&cdc_out_ep); usbd_add_endpoint(&cdc_in_ep); diff --git a/demo/dfu_with_st_tool_template.c b/demo/dfu_with_st_tool_template.c index 4cb397d5..7d168242 100644 --- a/demo/dfu_with_st_tool_template.c +++ b/demo/dfu_with_st_tool_template.c @@ -1,9 +1,9 @@ #include "usbd_core.h" #include "usbd_dfu.h" -#define USBD_VID 0x0483 -#define USBD_PID 0xDF11 -#define USBD_MAX_POWER 100 +#define USBD_VID 0x0483 +#define USBD_PID 0xDF11 +#define USBD_MAX_POWER 100 #define USBD_LANGID_STRING 1033 #define FLASH_DESC_STR "@Internal Flash /0x08000000/16*001Ka,112*01Kg" @@ -134,23 +134,19 @@ const uint8_t dfu_flash_descriptor[] = { 0x01, 0x00, #endif - 0x00}; + 0x00 +}; void usbd_configure_done_callback(void) { /* no out ep, do nothing */ } -/* function ------------------------------------------------------------------*/ -/** - * @brief dfu flash init - * @pre none - * @param[in] none - * @retval none - */ +struct usbd_interface intf0; + void dfu_flash_init(void) { usbd_desc_register(dfu_flash_descriptor); - usbd_add_interface(usbd_dfu_alloc_intf()); + usbd_add_interface(usbd_dfu_init_intf(&intf0)); usbd_initialize(); } diff --git a/demo/hid_custom_inout_template.c b/demo/hid_custom_inout_template.c index c1e80212..493a49e3 100644 --- a/demo/hid_custom_inout_template.c +++ b/demo/hid_custom_inout_template.c @@ -194,17 +194,12 @@ static struct usbd_endpoint custom_out_ep = { .ep_addr = HIDRAW_OUT_EP }; -/* function ------------------------------------------------------------------*/ -/** - * @brief hid custom init - * @pre none - * @param[in] none - * @retval none - */ +struct usbd_interface intf0; + void hid_custom_keyboard_init(void) { usbd_desc_register(hid_descriptor); - usbd_add_interface(usbd_hid_alloc_intf(hid_custom_report_desc, HID_CUSTOM_REPORT_DESC_SIZE)); + usbd_add_interface(usbd_hid_init_intf(&intf0, hid_custom_report_desc, HID_CUSTOM_REPORT_DESC_SIZE)); usbd_add_endpoint(&custom_in_ep); usbd_add_endpoint(&custom_out_ep); diff --git a/demo/hid_keyboard_template.c b/demo/hid_keyboard_template.c index 4b41bbfb..662cae11 100644 --- a/demo/hid_keyboard_template.c +++ b/demo/hid_keyboard_template.c @@ -193,10 +193,12 @@ static struct usbd_endpoint hid_in_ep = { .ep_addr = HID_INT_EP }; +struct usbd_interface intf0; + void hid_keyboard_init(void) { usbd_desc_register(hid_descriptor); - usbd_add_interface(usbd_hid_alloc_intf(hid_keyboard_report_desc, HID_KEYBOARD_REPORT_DESC_SIZE)); + usbd_add_interface(usbd_hid_init_intf(&intf0, hid_keyboard_report_desc, HID_KEYBOARD_REPORT_DESC_SIZE)); usbd_add_endpoint(&hid_in_ep); usbd_initialize(); diff --git a/demo/hid_mouse_template.c b/demo/hid_mouse_template.c index 971ab1f0..718ab20a 100644 --- a/demo/hid_mouse_template.c +++ b/demo/hid_mouse_template.c @@ -211,17 +211,12 @@ static struct usbd_endpoint hid_in_ep = { .ep_addr = HID_INT_EP }; -/* function ------------------------------------------------------------------*/ -/** - * @brief hid mouse init - * @pre none - * @param[in] none - * @retval none - */ +struct usbd_interface intf0; + void hid_mouse_init(void) { usbd_desc_register(hid_descriptor); - usbd_add_interface(usbd_hid_alloc_intf(hid_mouse_report_desc, HID_MOUSE_REPORT_DESC_SIZE)); + usbd_add_interface(usbd_hid_init_intf(&intf0, hid_mouse_report_desc, HID_MOUSE_REPORT_DESC_SIZE)); usbd_add_endpoint(&hid_in_ep); usbd_initialize(); diff --git a/demo/midi_template.c b/demo/midi_template.c index b4ee0be9..c58b3b28 100644 --- a/demo/midi_template.c +++ b/demo/midi_template.c @@ -138,8 +138,8 @@ void usbd_midi_bulk_in(uint8_t ep, uint32_t nbytes) { } -struct usbd_interface midi_cmd_intf; -struct usbd_interface midi_data_intf; +struct usbd_interface intf0; +struct usbd_interface intf1; struct usbd_endpoint midi_out_ep = { .ep_addr = MIDI_OUT_EP, @@ -154,8 +154,8 @@ struct usbd_endpoint midi_in_ep = { void midi_init(void) { usbd_desc_register(midi_descriptor); - usbd_add_interface(&midi_cmd_intf); - usbd_add_interface(&midi_data_intf); + usbd_add_interface(&intf0); + usbd_add_interface(&intf1); usbd_add_endpoint(&midi_out_ep); usbd_add_endpoint(&midi_in_ep); diff --git a/demo/msc_ram_template.c b/demo/msc_ram_template.c index b7e5e0eb..ebd34fce 100644 --- a/demo/msc_ram_template.c +++ b/demo/msc_ram_template.c @@ -123,17 +123,12 @@ int usbd_msc_sector_write(uint32_t sector, uint8_t *buffer, uint32_t length) return 0; } -/* function ------------------------------------------------------------------*/ -/** - * @brief msc ram init - * @pre none - * @param[in] none - * @retval none - */ +struct usbd_interface intf0; + void msc_ram_init(void) { usbd_desc_register(msc_ram_descriptor); - usbd_add_interface(usbd_msc_alloc_intf(MSC_OUT_EP, MSC_IN_EP)); + usbd_add_interface(usbd_msc_init_intf(&intf0, MSC_OUT_EP, MSC_IN_EP)); usbd_initialize(); } diff --git a/demo/video_static_mjpeg_template.c b/demo/video_static_mjpeg_template.c index af4f77b9..a9c4b020 100644 --- a/demo/video_static_mjpeg_template.c +++ b/demo/video_static_mjpeg_template.c @@ -173,11 +173,14 @@ static struct usbd_endpoint video_in_ep = { .ep_addr = VIDEO_IN_EP }; +struct usbd_interface intf0; +struct usbd_interface intf1; + void video_init() { usbd_desc_register(video_descriptor); - usbd_add_interface(usbd_video_alloc_intf(INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE)); - usbd_add_interface(usbd_video_alloc_intf(INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE)); + usbd_add_interface(usbd_video_init_intf(&intf0, INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE)); + usbd_add_interface(usbd_video_init_intf(&intf1, INTERVAL, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE)); usbd_add_endpoint(&video_in_ep); usbd_initialize(); diff --git a/demo/winusb1.0_template.c b/demo/winusb1.0_template.c index aa208fff..afe4bb72 100644 --- a/demo/winusb1.0_template.c +++ b/demo/winusb1.0_template.c @@ -206,8 +206,6 @@ void usbd_winusb_in(uint8_t ep, uint32_t nbytes) { } -struct usbd_interface winusb_intf; - struct usbd_endpoint winusb_out_ep = { .ep_addr = WINUSB_OUT_EP, .ep_cb = usbd_winusb_out @@ -218,16 +216,15 @@ struct usbd_endpoint winusb_in_ep = { .ep_cb = usbd_winusb_in }; +struct usbd_interface intf0; + void daplink_winusb_init(void) { usbd_desc_register(winusb_descriptor); usbd_msosv1_desc_register(&msosv1_desc); - usbd_add_interface(&winusb_intf); + usbd_add_interface(&intf0); usbd_add_endpoint(&winusb_out_ep); usbd_add_endpoint(&winusb_in_ep); usbd_initialize(); - - /* setup first out ep read transfer */ - usbd_ep_start_read(WINUSB_OUT_EP, read_buffer, 2048); } \ No newline at end of file diff --git a/docs/source/api/api_device.rst b/docs/source/api/api_device.rst index 6b32c446..3b2f2674 100644 --- a/docs/source/api/api_device.rst +++ b/docs/source/api/api_device.rst @@ -4,7 +4,7 @@ 设备协议栈主要负责枚举和驱动加载,枚举这边就不说了,驱动加载,也就是接口驱动加载,主要是依靠 `usbd_add_interface` 函数,记录传入的接口驱动保存到链表中,当主机进行类请求时就可以查找链表进行访问了。 在调用 `usbd_desc_register` 以后需要进行接口注册和端点注册,口诀如下: -- 有多少个接口就调用多少次 `usbd_add_interface`,参数填相关 `xxx_alloc_intf`, 如果没有支持的,手动创建一个填入 +- 有多少个接口就调用多少次 `usbd_add_interface`,参数填相关 `xxx_init_intf`, 如果没有支持的,手动创建一个填入 - 有多少个端点就调用多少次 `usbd_add_endpoint`,当中断完成时,会调用到注册的端点回调中。 CORE @@ -109,7 +109,7 @@ usbd_add_interface void usbd_add_interface(struct usbd_interface *intf); -- **intf** 接口驱动句柄,通常从不同 class 的 `xxx_alloc_intf` 函数获取 +- **intf** 接口驱动句柄,通常从不同 class 的 `xxx_init_intf` 函数获取 usbd_add_endpoint """""""""""""""""""""""""""""""""""" @@ -156,17 +156,17 @@ usbd_initialize CDC ACM ----------------- -usbd_cdc_acm_alloc_intf +usbd_cdc_acm_init_intf """""""""""""""""""""""""""""""""""" -``usbd_cdc_acm_alloc_intf`` 用来申请一个 USB CDC ACM 类接口,并实现该接口相关的函数。 +``usbd_cdc_acm_init_intf`` 用来初始化 USB CDC ACM 类接口,并实现该接口相关的函数。 - ``cdc_acm_class_request_handler`` 用来处理 USB CDC ACM 类 Setup 请求。 - ``cdc_notify_handler`` 用来处理 USB CDC 其他中断回调函数。 .. code-block:: C - struct usbd_interface *usbd_cdc_acm_alloc_intf(void); + struct usbd_interface *usbd_cdc_acm_init_intf(struct usbd_interface *intf); - **return** 接口句柄 @@ -236,10 +236,10 @@ CDC_ACM_DESCRIPTOR_INIT HID ----------------- -usbd_hid_alloc_intf +usbd_hid_init_intf """""""""""""""""""""""""""""""""""" -``usbd_hid_alloc_intf`` 用来申请一个 USB HID 类接口,并实现该接口相关的函数: +``usbd_hid_init_intf`` 用来初始化 USB HID 类接口,并实现该接口相关的函数: - ``hid_class_request_handler`` 用来处理 USB HID 类的 Setup 请求。 - ``hid_custom_request_handler`` 用来处理 USB HID 获取报告描述符请求。 @@ -247,7 +247,7 @@ usbd_hid_alloc_intf .. code-block:: C - struct usbd_interface *usbd_hid_alloc_intf(const uint8_t *desc, uint32_t desc_len); + struct usbd_interface *usbd_hid_init_intf(struct usbd_interface *intf, const uint8_t *desc, uint32_t desc_len); - **desc** 报告描述符 - **desc_len** 报告描述符长度 @@ -255,9 +255,9 @@ usbd_hid_alloc_intf MSC ----------------- -usbd_msc_alloc_intf +usbd_msc_init_intf """""""""""""""""""""""""""""""""""" -``usbd_msc_alloc_intf`` 用来申请一个 MSC 类接口,并实现该接口相关函数,并且注册端点回调函数。(因为 msc bot 协议是固定的,所以不需要用于实现,因此端点回调函数自然不需要用户实现)。 +``usbd_msc_init_intf`` 用来初始化 MSC 类接口,并实现该接口相关函数,并且注册端点回调函数。(因为 msc bot 协议是固定的,所以不需要用于实现,因此端点回调函数自然不需要用户实现)。 - ``msc_storage_class_request_handler`` 用于处理 USB MSC Setup 中断请求。 - ``msc_storage_notify_handler`` 用于实现 USB MSC 其他中断回调函数。 @@ -267,7 +267,7 @@ usbd_msc_alloc_intf .. code-block:: C - struct usbd_interface *usbd_msc_alloc_intf(const uint8_t out_ep, const uint8_t in_ep); + struct usbd_interface *usbd_msc_init_intf(struct usbd_interface *intf, const uint8_t out_ep, const uint8_t in_ep); - **out_ep** out 端点地址 - **in_ep** in 端点地址 @@ -315,16 +315,16 @@ usbd_msc_sector_write UAC ----------------- -usbd_audio_alloc_intf +usbd_audio_init_intf """""""""""""""""""""""""""""""""""" -``usbd_audio_alloc_intf`` 用来申请一个 USB Audio 类接口,并实现该接口相关的函数: +``usbd_audio_init_intf`` 用来初始化 USB Audio 类接口,并实现该接口相关的函数: - ``audio_class_request_handler`` 用于处理 USB Audio Setup 中断请求。 - ``audio_notify_handler`` 用于实现 USB Audio 其他中断回调函数。 .. code-block:: C - struct usbd_interface *usbd_audio_alloc_intf(void); + struct usbd_interface *usbd_audio_init_intf(struct usbd_interface *intf); - **class** 类的句柄 - **intf** 接口句柄 @@ -425,16 +425,17 @@ usbd_audio_set_pitch UVC ----------------- -usbd_video_alloc_intf +usbd_video_init_intf """""""""""""""""""""""""""""""""""" -``usbd_video_alloc_intf`` 用来申请一个 USB Video 类接口,并实现该接口相关的函数: +``usbd_video_init_intf`` 用来初始化 USB Video 类接口,并实现该接口相关的函数: - ``video_class_request_handler`` 用于处理 USB Video Setup 中断请求。 - ``video_notify_handler`` 用于实现 USB Video 其他中断回调函数。 .. code-block:: C - struct usbd_interface *usbd_video_alloc_intf(uint32_t dwFrameInterval, + struct usbd_interface *usbd_video_init_intf(struct usbd_interface *intf, + uint32_t dwFrameInterval, uint32_t dwMaxVideoFrameSize, uint32_t dwMaxPayloadTransferSize);