remove intf malloc

This commit is contained in:
sakumisu
2022-10-20 21:22:08 +08:00
parent 731f206254
commit dca8b4cfed
36 changed files with 178 additions and 247 deletions

View File

@@ -66,14 +66,14 @@ CherryUSB Device Stack has the following functions
CherryUSB Device Stack resource usage (GCC 10.2 with -O2): CherryUSB Device Stack resource usage (GCC 10.2 with -O2):
| file | FLASH (Byte) | No Cache RAM (Byte) | RAM (Byte) | Heap (Byte) | | file | FLASH (Byte) | No Cache RAM (Byte) | RAM (Byte) | Heap (Byte) |
|:-------------:|:--------------:|:-------------------------:|:-------------:|:---------------------------------:| |:-------------:|:--------------:|:-------------------------:|:-------------:|:----------------:|
|usbd_core.c | 3263 | 384 | 17 | 0 | |usbd_core.c | 3263 | 384 | 17 | 0 |
|usbd_cdc.c | 490 | 0 | 0 | sizeof(struct usbd_interface) * x | |usbd_cdc.c | 490 | 0 | 0 | 0 |
|usbd_msc.c | 2772 | 128 + 512(default) | 16 | sizeof(struct usbd_interface) * x | |usbd_msc.c | 2772 | 128 + 512(default) | 16 | 0 |
|usbd_hid.c | 501 | 0 | 0 | sizeof(struct usbd_interface) * x | |usbd_hid.c | 501 | 0 | 0 | 0 |
|usbd_audio.c | 1208 | 0 | 4 | sizeof(struct usbd_interface) * x | |usbd_audio.c | 1208 | 0 | 4 | 0 |
|usbd_video.c | 2272 | 0 | 82 | sizeof(struct usbd_interface) * x | |usbd_video.c | 2272 | 0 | 82 | 0 |
## Host Stack Overview ## Host Stack Overview

View File

@@ -65,14 +65,14 @@ CherryUSB Device 协议栈当前实现以下功能:
CherryUSB Device 协议栈资源占用说明GCC 10.2 with -O2 CherryUSB Device 协议栈资源占用说明GCC 10.2 with -O2
| file | FLASH (Byte) | No Cache RAM (Byte) | RAM (Byte) | Heap (Byte) | | file | FLASH (Byte) | No Cache RAM (Byte) | RAM (Byte) | Heap (Byte) |
|:-------------:|:--------------:|:-------------------------:|:-------------:|:---------------------------------:| |:-------------:|:--------------:|:-------------------------:|:-------------:|:----------------:|
|usbd_core.c | 3263 | 384 | 17 | 0 | |usbd_core.c | 3263 | 384 | 17 | 0 |
|usbd_cdc.c | 490 | 0 | 0 | sizeof(struct usbd_interface) * x | |usbd_cdc.c | 490 | 0 | 0 | 0 |
|usbd_msc.c | 2772 | 128 + 512(default) | 16 | sizeof(struct usbd_interface) * x | |usbd_msc.c | 2772 | 128 + 512(default) | 16 | 0 |
|usbd_hid.c | 501 | 0 | 0 | sizeof(struct usbd_interface) * x | |usbd_hid.c | 501 | 0 | 0 | 0 |
|usbd_audio.c | 1208 | 0 | 4 | sizeof(struct usbd_interface) * x | |usbd_audio.c | 1208 | 0 | 4 | 0 |
|usbd_video.c | 2272 | 0 | 82 | sizeof(struct usbd_interface) * x | |usbd_video.c | 2272 | 0 | 82 | 0 |
## Host 协议栈简介 ## Host 协议栈简介

View File

@@ -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; intf->class_interface_handler = audio_class_interface_request_handler;
#if CONFIG_USBDEV_AUDIO_VERSION < 0x0200 #if CONFIG_USBDEV_AUDIO_VERSION < 0x0200
intf->class_endpoint_handler = audio_class_endpoint_request_handler; intf->class_endpoint_handler = audio_class_endpoint_request_handler;

View File

@@ -12,8 +12,8 @@
extern "C" { extern "C" {
#endif #endif
/* Alloc audio interface driver */ /* Init audio interface driver */
struct usbd_interface *usbd_audio_alloc_intf(void); struct usbd_interface *usbd_audio_init_intf(struct usbd_interface *intf);
void usbd_audio_open(uint8_t intf); void usbd_audio_open(uint8_t intf);
void usbd_audio_close(uint8_t intf); void usbd_audio_close(uint8_t intf);

View File

@@ -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_interface_handler = cdc_acm_class_interface_request_handler;
intf->class_endpoint_handler = NULL; intf->class_endpoint_handler = NULL;
intf->vendor_handler = NULL; intf->vendor_handler = NULL;

View File

@@ -12,8 +12,8 @@
extern "C" { extern "C" {
#endif #endif
/* Alloc cdc acm interface driver */ /* Init cdc acm interface driver */
struct usbd_interface *usbd_cdc_acm_alloc_intf(void); struct usbd_interface *usbd_cdc_acm_init_intf(struct usbd_interface *intf);
/* Setup request command callback api */ /* Setup request command callback api */
void usbd_cdc_acm_set_line_coding(uint8_t intf, struct cdc_line_coding *line_coding); void usbd_cdc_acm_set_line_coding(uint8_t intf, struct cdc_line_coding *line_coding);

View File

@@ -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_interface_handler = dfu_class_interface_request_handler;
intf->class_endpoint_handler = NULL; intf->class_endpoint_handler = NULL;
intf->vendor_handler = NULL; intf->vendor_handler = NULL;

View File

@@ -12,8 +12,8 @@
extern "C" { extern "C" {
#endif #endif
/* Alloc dfu interface driver */ /* Init dfu interface driver */
struct usbd_interface *usbd_dfu_alloc_intf(void); struct usbd_interface *usbd_dfu_init_intf(struct usbd_interface *intf);
/* Interface functions that need to be implemented by the user */ /* Interface functions that need to be implemented by the user */
uint8_t *dfu_read_flash(uint8_t *src, uint8_t *dest, uint32_t len); uint8_t *dfu_read_flash(uint8_t *src, uint8_t *dest, uint32_t len);

View File

@@ -6,62 +6,6 @@
#include "usbd_core.h" #include "usbd_core.h"
#include "usbd_hid.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) static int hid_class_interface_request_handler(struct usb_setup_packet *setup, uint8_t **data, uint32_t *len)
{ {
USB_LOG_DBG("HID Class request: " 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; 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_interface_handler = hid_class_interface_request_handler;
intf->class_endpoint_handler = NULL; intf->class_endpoint_handler = NULL;
intf->vendor_handler = NULL; intf->vendor_handler = NULL;

View File

@@ -12,8 +12,8 @@
extern "C" { extern "C" {
#endif #endif
/* Alloc hid interface driver */ /* Init hid interface driver */
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);
/* Register desc api */ /* Register desc api */
void usbd_hid_descriptor_register(uint8_t intf_num, const uint8_t *desc); void usbd_hid_descriptor_register(uint8_t intf_num, const uint8_t *desc);

View File

@@ -912,14 +912,8 @@ static void usbd_msc_thread(void *argument)
} }
#endif #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_interface_handler = msc_storage_class_interface_request_handler;
intf->class_endpoint_handler = NULL; intf->class_endpoint_handler = NULL;
intf->vendor_handler = NULL; intf->vendor_handler = NULL;

View File

@@ -12,8 +12,10 @@
extern "C" { extern "C" {
#endif #endif
/* Alloc msc interface driver */ /* Init msc interface driver */
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);
void usbd_msc_get_cap(uint8_t lun, uint32_t *block_num, uint16_t *block_size); 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); int usbd_msc_sector_read(uint32_t sector, uint8_t *buffer, uint32_t length);

View File

@@ -742,14 +742,11 @@ void usbd_video_probe_and_commit_controls_init(uint32_t dwFrameInterval, uint32_
usbd_video_cfg.commit.bMaxVersion = 0; 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_interface_handler = video_class_interface_request_handler;
intf->class_endpoint_handler = NULL; intf->class_endpoint_handler = NULL;
intf->vendor_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; picture_pos += usbd_video_cfg.probe.dwMaxPayloadTransferSize - 2;
} }
} }
uvc_header[1] ^=1; uvc_header[1] ^= 1;
*out_len = (input_len + 2 * packets); *out_len = (input_len + 2 * packets);
return packets; return packets;
} }

View File

@@ -12,10 +12,11 @@
extern "C" { extern "C" {
#endif #endif
/* Alloc video interface driver */ /* Init video interface driver */
struct usbd_interface *usbd_video_alloc_intf(uint32_t dwFrameInterval, struct usbd_interface *usbd_video_init_intf(struct usbd_interface *intf,
uint32_t dwMaxVideoFrameSize, uint32_t dwFrameInterval,
uint32_t dwMaxPayloadTransferSize); uint32_t dwMaxVideoFrameSize,
uint32_t dwMaxPayloadTransferSize);
void usbd_video_open(uint8_t intf); void usbd_video_open(uint8_t intf);
void usbd_video_close(uint8_t intf); void usbd_video_close(uint8_t intf);

View File

@@ -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); return usbd_ep_start_write(rndis_ep_data[RNDIS_IN_EP_IDX].ep_addr, g_rndis_tx_buffer, g_rndis_tx_data_length);
} }
#endif #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); memcpy(usbd_rndis_cfg.mac, mac, 6);
rndis_ep_data[RNDIS_OUT_EP_IDX].ep_addr = out_ep; rndis_ep_data[RNDIS_OUT_EP_IDX].ep_addr = out_ep;

View File

@@ -12,7 +12,11 @@
extern "C" { extern "C" {
#endif #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 #ifdef CONFIG_USBDEV_RNDIS_USING_LWIP
struct pbuf *usbd_rndis_eth_rx(void); struct pbuf *usbd_rndis_eth_rx(void);

View File

@@ -173,11 +173,14 @@ static struct usbd_endpoint audio_in_ep = {
.ep_addr = AUDIO_IN_EP .ep_addr = AUDIO_IN_EP
}; };
struct usbd_interface intf0;
struct usbd_interface intf1;
void audio_init() void audio_init()
{ {
usbd_desc_register(audio_descriptor); usbd_desc_register(audio_descriptor);
usbd_add_interface(usbd_audio_alloc_intf()); usbd_add_interface(usbd_audio_init_intf(&intf0));
usbd_add_interface(usbd_audio_alloc_intf()); usbd_add_interface(usbd_audio_init_intf(&intf1));
usbd_add_endpoint(&audio_in_ep); usbd_add_endpoint(&audio_in_ep);
usbd_audio_add_entity(0x02, AUDIO_CONTROL_FEATURE_UNIT); usbd_audio_add_entity(0x02, AUDIO_CONTROL_FEATURE_UNIT);

View File

@@ -193,12 +193,16 @@ static struct usbd_endpoint audio_out_ep = {
.ep_addr = AUDIO_OUT_EP .ep_addr = AUDIO_OUT_EP
}; };
struct usbd_interface intf0;
struct usbd_interface intf1;
struct usbd_interface intf2;
void audio_init() void audio_init()
{ {
usbd_desc_register(audio_descriptor); usbd_desc_register(audio_descriptor);
usbd_add_interface(usbd_audio_alloc_intf()); usbd_add_interface(usbd_audio_init_intf(&intf0));
usbd_add_interface(usbd_audio_alloc_intf()); usbd_add_interface(usbd_audio_init_intf(&intf1));
usbd_add_interface(usbd_audio_alloc_intf()); usbd_add_interface(usbd_audio_init_intf(&intf2));
usbd_add_endpoint(&audio_in_ep); usbd_add_endpoint(&audio_in_ep);
usbd_add_endpoint(&audio_out_ep); usbd_add_endpoint(&audio_out_ep);

View File

@@ -174,11 +174,14 @@ static struct usbd_endpoint audio_in_ep = {
.ep_addr = AUDIO_IN_EP .ep_addr = AUDIO_IN_EP
}; };
struct usbd_interface intf0;
struct usbd_interface intf1;
void audio_init() void audio_init()
{ {
usbd_desc_register(audio_descriptor); usbd_desc_register(audio_descriptor);
usbd_add_interface(usbd_audio_alloc_intf()); usbd_add_interface(usbd_audio_init_intf(&intf0));
usbd_add_interface(usbd_audio_alloc_intf()); usbd_add_interface(usbd_audio_init_intf(&intf1));
usbd_add_endpoint(&audio_in_ep); usbd_add_endpoint(&audio_in_ep);
usbd_audio_add_entity(0x01, AUDIO_CONTROL_CLOCK_SOURCE); usbd_audio_add_entity(0x01, AUDIO_CONTROL_CLOCK_SOURCE);

View File

@@ -262,12 +262,16 @@ static struct usbd_endpoint audio_in_ep = {
.ep_addr = AUDIO_IN_EP .ep_addr = AUDIO_IN_EP
}; };
struct usbd_interface intf0;
struct usbd_interface intf1;
struct usbd_interface intf2;
void audio_init() void audio_init()
{ {
usbd_desc_register(audio_descriptor); usbd_desc_register(audio_descriptor);
usbd_add_interface(usbd_audio_alloc_intf()); usbd_add_interface(usbd_audio_init_intf(&intf0));
usbd_add_interface(usbd_audio_alloc_intf()); usbd_add_interface(usbd_audio_init_intf(&intf1));
usbd_add_interface(usbd_audio_alloc_intf()); usbd_add_interface(usbd_audio_init_intf(&intf2));
usbd_add_endpoint(&audio_in_ep); usbd_add_endpoint(&audio_in_ep);
usbd_add_endpoint(&audio_out_ep); usbd_add_endpoint(&audio_out_ep);

View File

@@ -182,11 +182,14 @@ static struct usbd_endpoint audio_out_ep = {
.ep_addr = AUDIO_OUT_EP .ep_addr = AUDIO_OUT_EP
}; };
struct usbd_interface intf0;
struct usbd_interface intf1;
void audio_init() void audio_init()
{ {
usbd_desc_register(audio_descriptor); usbd_desc_register(audio_descriptor);
usbd_add_interface(usbd_audio_alloc_intf()); usbd_add_interface(usbd_audio_init_intf(&intf0));
usbd_add_interface(usbd_audio_alloc_intf()); usbd_add_interface(usbd_audio_init_intf(&intf1));
usbd_add_endpoint(&audio_out_ep); usbd_add_endpoint(&audio_out_ep);
usbd_audio_add_entity(0x01, AUDIO_CONTROL_CLOCK_SOURCE); usbd_audio_add_entity(0x01, AUDIO_CONTROL_CLOCK_SOURCE);

View File

@@ -291,25 +291,23 @@ struct usbd_endpoint cdc_in_ep = {
.ep_cb = usbd_cdc_acm_bulk_in .ep_cb = usbd_cdc_acm_bulk_in
}; };
/* function ------------------------------------------------------------------*/ struct usbd_interface intf0;
/** struct usbd_interface intf1;
* @brief msc ram init struct usbd_interface intf2;
* @pre none struct usbd_interface intf3;
* @param[in] none
* @retval none
*/
void cdc_acm_hid_msc_descriptor_init(void) void cdc_acm_hid_msc_descriptor_init(void)
{ {
usbd_desc_register(cdc_acm_hid_msc_descriptor); usbd_desc_register(cdc_acm_hid_msc_descriptor);
usbd_add_interface(usbd_cdc_acm_alloc_intf()); usbd_add_interface(usbd_cdc_acm_init_intf(&intf0));
usbd_add_interface(usbd_cdc_acm_alloc_intf()); usbd_add_interface(usbd_cdc_acm_init_intf(&intf1));
usbd_add_endpoint(&cdc_out_ep); usbd_add_endpoint(&cdc_out_ep);
usbd_add_endpoint(&cdc_in_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); usbd_add_endpoint(&hid_in_ep);
/*!< init mouse report data */ /*!< init mouse report data */

View File

@@ -145,15 +145,18 @@ struct usbd_endpoint cdc_in_ep = {
.ep_cb = usbd_cdc_acm_bulk_in .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) void cdc_acm_msc_init(void)
{ {
usbd_desc_register(cdc_msc_descriptor); usbd_desc_register(cdc_msc_descriptor);
usbd_add_interface(usbd_cdc_acm_alloc_intf()); usbd_add_interface(usbd_cdc_acm_init_intf(&intf0));
usbd_add_interface(usbd_cdc_acm_alloc_intf()); usbd_add_interface(usbd_cdc_acm_init_intf(&intf1));
usbd_add_endpoint(&cdc_out_ep); usbd_add_endpoint(&cdc_out_ep);
usbd_add_endpoint(&cdc_in_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(); usbd_initialize();
} }

View File

@@ -187,28 +187,36 @@ struct usbd_endpoint cdc_in_ep4 = {
.ep_cb = usbd_cdc_acm_bulk_in .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) void cdc_acm_multi_init(void)
{ {
usbd_desc_register(cdc_descriptor); usbd_desc_register(cdc_descriptor);
usbd_add_interface(usbd_cdc_acm_alloc_intf()); usbd_add_interface(usbd_cdc_acm_init_intf(&intf0));
usbd_add_interface(usbd_cdc_acm_alloc_intf()); usbd_add_interface(usbd_cdc_acm_init_intf(&intf1));
usbd_add_endpoint(&cdc_out_ep1); usbd_add_endpoint(&cdc_out_ep1);
usbd_add_endpoint(&cdc_in_ep1); usbd_add_endpoint(&cdc_in_ep1);
usbd_add_interface(usbd_cdc_acm_alloc_intf()); usbd_add_interface(usbd_cdc_acm_init_intf(&intf2));
usbd_add_interface(usbd_cdc_acm_alloc_intf()); usbd_add_interface(usbd_cdc_acm_init_intf(&intf3));
usbd_add_endpoint(&cdc_out_ep2); usbd_add_endpoint(&cdc_out_ep2);
usbd_add_endpoint(&cdc_in_ep2); usbd_add_endpoint(&cdc_in_ep2);
usbd_add_interface(usbd_cdc_acm_alloc_intf()); usbd_add_interface(usbd_cdc_acm_init_intf(&intf4));
usbd_add_interface(usbd_cdc_acm_alloc_intf()); usbd_add_interface(usbd_cdc_acm_init_intf(&intf5));
usbd_add_endpoint(&cdc_out_ep3); usbd_add_endpoint(&cdc_out_ep3);
usbd_add_endpoint(&cdc_in_ep3); usbd_add_endpoint(&cdc_in_ep3);
usbd_add_interface(usbd_cdc_acm_alloc_intf()); usbd_add_interface(usbd_cdc_acm_init_intf(&intf6));
usbd_add_interface(usbd_cdc_acm_alloc_intf()); usbd_add_interface(usbd_cdc_acm_init_intf(&intf7));
usbd_add_endpoint(&cdc_out_ep4); usbd_add_endpoint(&cdc_out_ep4);
usbd_add_endpoint(&cdc_in_ep4); usbd_add_endpoint(&cdc_in_ep4);

View File

@@ -144,12 +144,14 @@ struct usbd_endpoint cdc_in_ep = {
.ep_cb = usbd_cdc_acm_bulk_in .ep_cb = usbd_cdc_acm_bulk_in
}; };
/* function ------------------------------------------------------------------*/ struct usbd_interface intf0;
struct usbd_interface intf1;
void cdc_acm_init(void) void cdc_acm_init(void)
{ {
usbd_desc_register(cdc_descriptor); usbd_desc_register(cdc_descriptor);
usbd_add_interface(usbd_cdc_acm_alloc_intf()); usbd_add_interface(usbd_cdc_acm_init_intf(&intf0));
usbd_add_interface(usbd_cdc_acm_alloc_intf()); usbd_add_interface(usbd_cdc_acm_init_intf(&intf1));
usbd_add_endpoint(&cdc_out_ep); usbd_add_endpoint(&cdc_out_ep);
usbd_add_endpoint(&cdc_in_ep); usbd_add_endpoint(&cdc_in_ep);
usbd_initialize(); usbd_initialize();

View File

@@ -161,14 +161,16 @@ void usbd_configure_done_callback(void)
#endif /* RT_USING_LWIP */ #endif /* RT_USING_LWIP */
/* function ------------------------------------------------------------------*/ struct usbd_interface intf0;
struct usbd_interface intf1;
void cdc_rndis_init(void) void cdc_rndis_init(void)
{ {
#ifdef RT_USING_LWIP #ifdef RT_USING_LWIP
rt_usbd_rndis_init(); rt_usbd_rndis_init();
#endif #endif
usbd_desc_register(cdc_descriptor); 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_init_intf(&intf0, 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(&intf1, CDC_OUT_EP, CDC_IN_EP, CDC_INT_EP, mac));
usbd_initialize(); usbd_initialize();
} }

View File

@@ -261,6 +261,8 @@ static struct usbd_endpoint dap_in_ep = {
}; };
struct usbd_interface dap_interface; struct usbd_interface dap_interface;
struct usbd_interface intf1;
struct usbd_interface intf2;
void daplink_init(void) void daplink_init(void)
{ {
@@ -273,8 +275,8 @@ void daplink_init(void)
usbd_add_endpoint(&dap_in_ep); usbd_add_endpoint(&dap_in_ep);
/*!< cdc acm */ /*!< cdc acm */
usbd_add_interface(usbd_cdc_acm_alloc_intf()); usbd_add_interface(usbd_cdc_acm_init_intf(&intf1));
usbd_add_interface(usbd_cdc_acm_alloc_intf()); usbd_add_interface(usbd_cdc_acm_init_intf(&intf2));
usbd_add_endpoint(&cdc_out_ep); usbd_add_endpoint(&cdc_out_ep);
usbd_add_endpoint(&cdc_in_ep); usbd_add_endpoint(&cdc_in_ep);

View File

@@ -1,9 +1,9 @@
#include "usbd_core.h" #include "usbd_core.h"
#include "usbd_dfu.h" #include "usbd_dfu.h"
#define USBD_VID 0x0483 #define USBD_VID 0x0483
#define USBD_PID 0xDF11 #define USBD_PID 0xDF11
#define USBD_MAX_POWER 100 #define USBD_MAX_POWER 100
#define USBD_LANGID_STRING 1033 #define USBD_LANGID_STRING 1033
#define FLASH_DESC_STR "@Internal Flash /0x08000000/16*001Ka,112*01Kg" #define FLASH_DESC_STR "@Internal Flash /0x08000000/16*001Ka,112*01Kg"
@@ -134,23 +134,19 @@ const uint8_t dfu_flash_descriptor[] = {
0x01, 0x01,
0x00, 0x00,
#endif #endif
0x00}; 0x00
};
void usbd_configure_done_callback(void) void usbd_configure_done_callback(void)
{ {
/* no out ep, do nothing */ /* no out ep, do nothing */
} }
/* function ------------------------------------------------------------------*/ struct usbd_interface intf0;
/**
* @brief dfu flash init
* @pre none
* @param[in] none
* @retval none
*/
void dfu_flash_init(void) void dfu_flash_init(void)
{ {
usbd_desc_register(dfu_flash_descriptor); usbd_desc_register(dfu_flash_descriptor);
usbd_add_interface(usbd_dfu_alloc_intf()); usbd_add_interface(usbd_dfu_init_intf(&intf0));
usbd_initialize(); usbd_initialize();
} }

View File

@@ -194,17 +194,12 @@ static struct usbd_endpoint custom_out_ep = {
.ep_addr = HIDRAW_OUT_EP .ep_addr = HIDRAW_OUT_EP
}; };
/* function ------------------------------------------------------------------*/ struct usbd_interface intf0;
/**
* @brief hid custom init
* @pre none
* @param[in] none
* @retval none
*/
void hid_custom_keyboard_init(void) void hid_custom_keyboard_init(void)
{ {
usbd_desc_register(hid_descriptor); 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_in_ep);
usbd_add_endpoint(&custom_out_ep); usbd_add_endpoint(&custom_out_ep);

View File

@@ -193,10 +193,12 @@ static struct usbd_endpoint hid_in_ep = {
.ep_addr = HID_INT_EP .ep_addr = HID_INT_EP
}; };
struct usbd_interface intf0;
void hid_keyboard_init(void) void hid_keyboard_init(void)
{ {
usbd_desc_register(hid_descriptor); 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_add_endpoint(&hid_in_ep);
usbd_initialize(); usbd_initialize();

View File

@@ -211,17 +211,12 @@ static struct usbd_endpoint hid_in_ep = {
.ep_addr = HID_INT_EP .ep_addr = HID_INT_EP
}; };
/* function ------------------------------------------------------------------*/ struct usbd_interface intf0;
/**
* @brief hid mouse init
* @pre none
* @param[in] none
* @retval none
*/
void hid_mouse_init(void) void hid_mouse_init(void)
{ {
usbd_desc_register(hid_descriptor); 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_add_endpoint(&hid_in_ep);
usbd_initialize(); usbd_initialize();

View File

@@ -138,8 +138,8 @@ void usbd_midi_bulk_in(uint8_t ep, uint32_t nbytes)
{ {
} }
struct usbd_interface midi_cmd_intf; struct usbd_interface intf0;
struct usbd_interface midi_data_intf; struct usbd_interface intf1;
struct usbd_endpoint midi_out_ep = { struct usbd_endpoint midi_out_ep = {
.ep_addr = MIDI_OUT_EP, .ep_addr = MIDI_OUT_EP,
@@ -154,8 +154,8 @@ struct usbd_endpoint midi_in_ep = {
void midi_init(void) void midi_init(void)
{ {
usbd_desc_register(midi_descriptor); usbd_desc_register(midi_descriptor);
usbd_add_interface(&midi_cmd_intf); usbd_add_interface(&intf0);
usbd_add_interface(&midi_data_intf); usbd_add_interface(&intf1);
usbd_add_endpoint(&midi_out_ep); usbd_add_endpoint(&midi_out_ep);
usbd_add_endpoint(&midi_in_ep); usbd_add_endpoint(&midi_in_ep);

View File

@@ -123,17 +123,12 @@ int usbd_msc_sector_write(uint32_t sector, uint8_t *buffer, uint32_t length)
return 0; return 0;
} }
/* function ------------------------------------------------------------------*/ struct usbd_interface intf0;
/**
* @brief msc ram init
* @pre none
* @param[in] none
* @retval none
*/
void msc_ram_init(void) void msc_ram_init(void)
{ {
usbd_desc_register(msc_ram_descriptor); 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(); usbd_initialize();
} }

View File

@@ -173,11 +173,14 @@ static struct usbd_endpoint video_in_ep = {
.ep_addr = VIDEO_IN_EP .ep_addr = VIDEO_IN_EP
}; };
struct usbd_interface intf0;
struct usbd_interface intf1;
void video_init() void video_init()
{ {
usbd_desc_register(video_descriptor); usbd_desc_register(video_descriptor);
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_alloc_intf(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_add_endpoint(&video_in_ep);
usbd_initialize(); usbd_initialize();

View File

@@ -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 = { struct usbd_endpoint winusb_out_ep = {
.ep_addr = WINUSB_OUT_EP, .ep_addr = WINUSB_OUT_EP,
.ep_cb = usbd_winusb_out .ep_cb = usbd_winusb_out
@@ -218,16 +216,15 @@ struct usbd_endpoint winusb_in_ep = {
.ep_cb = usbd_winusb_in .ep_cb = usbd_winusb_in
}; };
struct usbd_interface intf0;
void daplink_winusb_init(void) void daplink_winusb_init(void)
{ {
usbd_desc_register(winusb_descriptor); usbd_desc_register(winusb_descriptor);
usbd_msosv1_desc_register(&msosv1_desc); 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_out_ep);
usbd_add_endpoint(&winusb_in_ep); usbd_add_endpoint(&winusb_in_ep);
usbd_initialize(); usbd_initialize();
/* setup first out ep read transfer */
usbd_ep_start_read(WINUSB_OUT_EP, read_buffer, 2048);
} }

View File

@@ -4,7 +4,7 @@
设备协议栈主要负责枚举和驱动加载,枚举这边就不说了,驱动加载,也就是接口驱动加载,主要是依靠 `usbd_add_interface` 函数,记录传入的接口驱动保存到链表中,当主机进行类请求时就可以查找链表进行访问了。 设备协议栈主要负责枚举和驱动加载,枚举这边就不说了,驱动加载,也就是接口驱动加载,主要是依靠 `usbd_add_interface` 函数,记录传入的接口驱动保存到链表中,当主机进行类请求时就可以查找链表进行访问了。
在调用 `usbd_desc_register` 以后需要进行接口注册和端点注册,口诀如下: 在调用 `usbd_desc_register` 以后需要进行接口注册和端点注册,口诀如下:
- 有多少个接口就调用多少次 `usbd_add_interface`,参数填相关 `xxx_alloc_intf`, 如果没有支持的,手动创建一个填入 - 有多少个接口就调用多少次 `usbd_add_interface`,参数填相关 `xxx_init_intf`, 如果没有支持的,手动创建一个填入
- 有多少个端点就调用多少次 `usbd_add_endpoint`,当中断完成时,会调用到注册的端点回调中。 - 有多少个端点就调用多少次 `usbd_add_endpoint`,当中断完成时,会调用到注册的端点回调中。
CORE CORE
@@ -109,7 +109,7 @@ usbd_add_interface
void usbd_add_interface(struct usbd_interface *intf); void usbd_add_interface(struct usbd_interface *intf);
- **intf** 接口驱动句柄,通常从不同 class 的 `xxx_alloc_intf` 函数获取 - **intf** 接口驱动句柄,通常从不同 class 的 `xxx_init_intf` 函数获取
usbd_add_endpoint usbd_add_endpoint
"""""""""""""""""""""""""""""""""""" """"""""""""""""""""""""""""""""""""
@@ -156,17 +156,17 @@ usbd_initialize
CDC ACM 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_acm_class_request_handler`` 用来处理 USB CDC ACM 类 Setup 请求。
- ``cdc_notify_handler`` 用来处理 USB CDC 其他中断回调函数。 - ``cdc_notify_handler`` 用来处理 USB CDC 其他中断回调函数。
.. code-block:: C .. 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** 接口句柄 - **return** 接口句柄
@@ -236,10 +236,10 @@ CDC_ACM_DESCRIPTOR_INIT
HID 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_class_request_handler`` 用来处理 USB HID 类的 Setup 请求。
- ``hid_custom_request_handler`` 用来处理 USB HID 获取报告描述符请求。 - ``hid_custom_request_handler`` 用来处理 USB HID 获取报告描述符请求。
@@ -247,7 +247,7 @@ usbd_hid_alloc_intf
.. code-block:: C .. 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** 报告描述符
- **desc_len** 报告描述符长度 - **desc_len** 报告描述符长度
@@ -255,9 +255,9 @@ usbd_hid_alloc_intf
MSC 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_class_request_handler`` 用于处理 USB MSC Setup 中断请求。
- ``msc_storage_notify_handler`` 用于实现 USB MSC 其他中断回调函数。 - ``msc_storage_notify_handler`` 用于实现 USB MSC 其他中断回调函数。
@@ -267,7 +267,7 @@ usbd_msc_alloc_intf
.. code-block:: C .. 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 端点地址 - **out_ep** out 端点地址
- **in_ep** in 端点地址 - **in_ep** in 端点地址
@@ -315,16 +315,16 @@ usbd_msc_sector_write
UAC 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_class_request_handler`` 用于处理 USB Audio Setup 中断请求。
- ``audio_notify_handler`` 用于实现 USB Audio 其他中断回调函数。 - ``audio_notify_handler`` 用于实现 USB Audio 其他中断回调函数。
.. code-block:: C .. code-block:: C
struct usbd_interface *usbd_audio_alloc_intf(void); struct usbd_interface *usbd_audio_init_intf(struct usbd_interface *intf);
- **class** 类的句柄 - **class** 类的句柄
- **intf** 接口句柄 - **intf** 接口句柄
@@ -425,16 +425,17 @@ usbd_audio_set_pitch
UVC 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_class_request_handler`` 用于处理 USB Video Setup 中断请求。
- ``video_notify_handler`` 用于实现 USB Video 其他中断回调函数。 - ``video_notify_handler`` 用于实现 USB Video 其他中断回调函数。
.. code-block:: C .. 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 dwMaxVideoFrameSize,
uint32_t dwMaxPayloadTransferSize); uint32_t dwMaxPayloadTransferSize);