Parcourir la source

remove intf malloc

sakumisu il y a 3 ans
Parent
commit
dca8b4cfed

+ 8 - 8
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
 

+ 8 - 8
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 协议栈简介
 

+ 1 - 7
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;

+ 2 - 2
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);

+ 1 - 7
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;

+ 2 - 2
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);

+ 1 - 7
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;

+ 2 - 2
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);

+ 1 - 63
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;

+ 2 - 2
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);

+ 1 - 7
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;

+ 4 - 2
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);

+ 5 - 8
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;
 }

+ 5 - 4
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);

+ 4 - 7
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;

+ 5 - 1
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);

+ 5 - 2
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);

+ 7 - 3
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);
 

+ 5 - 2
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);

+ 7 - 3
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);
 

+ 5 - 2
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);

+ 9 - 11
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 */

+ 7 - 4
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();
 }

+ 17 - 9
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);
 

+ 5 - 3
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();

+ 5 - 3
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();
 }

+ 4 - 2
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);
 

+ 8 - 12
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();
 }

+ 3 - 8
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);
 

+ 3 - 1
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();

+ 3 - 8
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();

+ 4 - 4
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);
 

+ 3 - 8
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();
 }

+ 5 - 2
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();

+ 3 - 6
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);
 }

+ 18 - 17
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);