diff --git a/class/audio/usbd_audio.c b/class/audio/usbd_audio.c index e5563693..6931b290 100644 --- a/class/audio/usbd_audio.c +++ b/class/audio/usbd_audio.c @@ -373,8 +373,14 @@ static void audio_notify_handler(uint8_t event, void *arg) } } -void usbd_audio_add_interface(usbd_class_t *devclass, usbd_interface_t *intf) +struct usbd_interface *usbd_audio_alloc_intf(void) { + 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_handler = audio_class_request_handler; #if CONFIG_USBDEV_AUDIO_VERSION < 0x0200 intf->custom_handler = audio_custom_request_handler; @@ -383,7 +389,8 @@ void usbd_audio_add_interface(usbd_class_t *devclass, usbd_interface_t *intf) #endif intf->vendor_handler = NULL; intf->notify_handler = audio_notify_handler; - usbd_class_add_interface(devclass, intf); + + return intf; } void usbd_audio_add_entity(uint8_t entity_id, uint16_t bDescriptorSubtype) diff --git a/class/audio/usbd_audio.h b/class/audio/usbd_audio.h index 11aa771d..723e8666 100644 --- a/class/audio/usbd_audio.h +++ b/class/audio/usbd_audio.h @@ -12,7 +12,8 @@ extern "C" { #endif -void usbd_audio_add_interface(usbd_class_t *devclass, usbd_interface_t *intf); +/* Alloc audio interface driver */ +struct usbd_interface *usbd_audio_alloc_intf(void); 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 c134b1b8..403c2850 100644 --- a/class/cdc/usbd_cdc.c +++ b/class/cdc/usbd_cdc.c @@ -17,7 +17,7 @@ static int cdc_acm_class_request_handler(struct usb_setup_packet *setup, uint8_t struct cdc_line_coding line_coding; bool dtr, rts; - uint8_t intf = LO_BYTE(setup->wIndex); + uint8_t intf_num = LO_BYTE(setup->wIndex); switch (setup->bRequest) { case CDC_REQUEST_SET_LINE_CODING: @@ -41,31 +41,31 @@ static int cdc_acm_class_request_handler(struct usb_setup_packet *setup, uint8_t /*******************************************************************************/ memcpy(&line_coding, *data, setup->wLength); USB_LOG_DBG("Set intf:%d linecoding <%d %d %s %s>\r\n", - intf, + intf_num, line_coding.dwDTERate, line_coding.bDataBits, parity_name[line_coding.bParityType], stop_name[line_coding.bCharFormat]); - usbd_cdc_acm_set_line_coding(intf, &line_coding); + usbd_cdc_acm_set_line_coding(intf_num, &line_coding); break; case CDC_REQUEST_SET_CONTROL_LINE_STATE: { dtr = (setup->wValue & 0x0001); rts = (setup->wValue & 0x0002); USB_LOG_DBG("Set intf:%d DTR 0x%x,RTS 0x%x\r\n", - intf, + intf_num, dtr, rts); - usbd_cdc_acm_set_dtr(intf, dtr); - usbd_cdc_acm_set_rts(intf, rts); + usbd_cdc_acm_set_dtr(intf_num, dtr); + usbd_cdc_acm_set_rts(intf_num, rts); } break; case CDC_REQUEST_GET_LINE_CODING: - usbd_cdc_acm_get_line_coding(intf, &line_coding); + usbd_cdc_acm_get_line_coding(intf_num, &line_coding); memcpy(*data, &line_coding, 7); *len = 7; USB_LOG_DBG("Get intf:%d linecoding %d %d %d %d\r\n", - intf, + intf_num, line_coding.dwDTERate, line_coding.bCharFormat, line_coding.bParityType, @@ -90,13 +90,20 @@ static void cdc_notify_handler(uint8_t event, void *arg) } } -void usbd_cdc_add_acm_interface(usbd_class_t *devclass, usbd_interface_t *intf) +struct usbd_interface *usbd_cdc_acm_alloc_intf(void) { + 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_handler = cdc_acm_class_request_handler; intf->custom_handler = NULL; intf->vendor_handler = NULL; intf->notify_handler = cdc_notify_handler; - usbd_class_add_interface(devclass, intf); + + return intf; } __WEAK void usbd_cdc_acm_set_line_coding(uint8_t intf, struct cdc_line_coding *line_coding) diff --git a/class/cdc/usbd_cdc.h b/class/cdc/usbd_cdc.h index 0684e90e..8cd88270 100644 --- a/class/cdc/usbd_cdc.h +++ b/class/cdc/usbd_cdc.h @@ -12,8 +12,8 @@ extern "C" { #endif -/* Register api */ -void usbd_cdc_add_acm_interface(usbd_class_t *devclass, usbd_interface_t *intf); +/* Alloc cdc acm interface driver */ +struct usbd_interface *usbd_cdc_acm_alloc_intf(void); /* 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 3e5c6f5a..3df0aeda 100644 --- a/class/dfu/usbd_dfu.c +++ b/class/dfu/usbd_dfu.c @@ -43,7 +43,6 @@ static void dfu_notify_handler(uint8_t event, void *arg) { switch (event) { case USBD_EVENT_RESET: - break; default: @@ -51,12 +50,18 @@ static void dfu_notify_handler(uint8_t event, void *arg) } } -void usbd_dfu_add_interface(usbd_class_t *devclass, usbd_interface_t *intf) +struct usbd_interface *usbd_dfu_alloc_intf(void) { + 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_handler = dfu_class_request_handler; intf->custom_handler = NULL; intf->vendor_handler = NULL; intf->notify_handler = dfu_notify_handler; - usbd_class_add_interface(devclass, intf); -} + return intf; +} \ No newline at end of file diff --git a/class/dfu/usbd_dfu.h b/class/dfu/usbd_dfu.h index 8850c969..701eb201 100644 --- a/class/dfu/usbd_dfu.h +++ b/class/dfu/usbd_dfu.h @@ -12,7 +12,8 @@ extern "C" { #endif -void usbd_dfu_add_interface(usbd_class_t *devclass, usbd_interface_t *intf); +/* Alloc dfu interface driver */ +struct usbd_interface *usbd_dfu_alloc_intf(void); #ifdef __cplusplus } diff --git a/class/hid/usbd_hid.c b/class/hid/usbd_hid.c index a0bb9cd8..b969318f 100644 --- a/class/hid/usbd_hid.c +++ b/class/hid/usbd_hid.c @@ -6,32 +6,6 @@ #include "usbd_core.h" #include "usbd_hid.h" -struct usbd_hid { - const uint8_t *hid_descriptor; - const uint8_t *hid_report_descriptor; - uint32_t hid_report_descriptor_len; - uint8_t intf_num; - uint8_t report; - uint8_t idle_state; - uint8_t protocol; - - usb_slist_t list; -}; - -static usb_slist_t usbd_hid_head = USB_SLIST_OBJECT_INIT(usbd_hid_head); - -static void usbd_hid_reset(void) -{ - usb_slist_t *i; - usb_slist_for_each(i, &usbd_hid_head) - { - struct usbd_hid *hid_intf = usb_slist_entry(i, struct usbd_hid, list); - hid_intf->report = 0; - hid_intf->idle_state = 0; - hid_intf->protocol = 0; - } -} - static int hid_custom_request_handler(struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) { USB_LOG_DBG("HID Custom request: " @@ -43,33 +17,34 @@ static int hid_custom_request_handler(struct usb_setup_packet *setup, uint8_t ** uint8_t value = (uint8_t)(setup->wValue >> 8); uint8_t intf_num = (uint8_t)setup->wIndex; - struct usbd_hid *current_hid_class = NULL; usb_slist_t *i; - usb_slist_for_each(i, &usbd_hid_head) - { - struct usbd_hid *hid_class = usb_slist_entry(i, struct usbd_hid, list); + struct usbd_interface *match_intf = NULL; - if (hid_class->intf_num == intf_num) { - current_hid_class = hid_class; + 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 (current_hid_class == NULL) { + if (match_intf == NULL) { return -2; } switch (value) { case HID_DESCRIPTOR_TYPE_HID: USB_LOG_INFO("get HID Descriptor\r\n"); - *data = (uint8_t *)current_hid_class->hid_descriptor; - *len = current_hid_class->hid_descriptor[0]; + // *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 *)current_hid_class->hid_report_descriptor; - *len = current_hid_class->hid_report_descriptor_len; + *data = (uint8_t *)match_intf->hid_report_descriptor; + *len = match_intf->hid_report_descriptor_len; break; case HID_DESCRIPTOR_TYPE_HID_PHYSICAL: @@ -93,50 +68,33 @@ static int hid_class_request_handler(struct usb_setup_packet *setup, uint8_t **d "bRequest 0x%02x\r\n", setup->bRequest); - struct usbd_hid *current_hid_class = NULL; - usb_slist_t *i; - uint8_t intf = LO_BYTE(setup->wIndex); - - usb_slist_for_each(i, &usbd_hid_head) - { - struct usbd_hid *hid_class = usb_slist_entry(i, struct usbd_hid, list); - if (hid_class->intf_num == intf) { - current_hid_class = hid_class; - break; - } - } - - if (current_hid_class == NULL) { - return -2; - } + uint8_t intf_num = LO_BYTE(setup->wIndex); switch (setup->bRequest) { case HID_REQUEST_GET_REPORT: - current_hid_class->report = usbh_hid_get_report(intf, LO_BYTE(setup->wValue), HI_BYTE(setup->wValue)); /*report id ,report type*/ - *data = (uint8_t *)¤t_hid_class->report; + /* report id ,report type */ + (*data)[0] = usbh_hid_get_report(intf_num, LO_BYTE(setup->wValue), HI_BYTE(setup->wValue)); *len = 1; break; case HID_REQUEST_GET_IDLE: - current_hid_class->idle_state = usbh_hid_get_idle(intf, LO_BYTE(setup->wValue)); - *data = (uint8_t *)¤t_hid_class->idle_state; + (*data)[0] = usbh_hid_get_idle(intf_num, LO_BYTE(setup->wValue)); *len = 1; break; case HID_REQUEST_GET_PROTOCOL: - current_hid_class->protocol = usbh_hid_get_protocol(intf); - *data = (uint8_t *)¤t_hid_class->protocol; + (*data)[0] = usbh_hid_get_protocol(intf_num); *len = 1; break; case HID_REQUEST_SET_REPORT: - usbh_hid_set_report(intf, LO_BYTE(setup->wValue), HI_BYTE(setup->wValue), *data, *len); /*report id ,report type,report,report len*/ - current_hid_class->report = **data; + /* report id ,report type, report, report len */ + usbh_hid_set_report(intf_num, LO_BYTE(setup->wValue), HI_BYTE(setup->wValue), *data, *len); break; case HID_REQUEST_SET_IDLE: - usbh_hid_set_idle(intf, LO_BYTE(setup->wValue), HI_BYTE(setup->wIndex)); /*report id ,duration*/ - current_hid_class->idle_state = HI_BYTE(setup->wIndex); + /* report id, duration */ + usbh_hid_set_idle(intf_num, LO_BYTE(setup->wValue), HI_BYTE(setup->wIndex)); break; case HID_REQUEST_SET_PROTOCOL: - usbh_hid_set_protocol(intf, LO_BYTE(setup->wValue)); /*protocol*/ - current_hid_class->protocol = LO_BYTE(setup->wValue); + /* protocol */ + usbh_hid_set_protocol(intf_num, LO_BYTE(setup->wValue)); break; default: @@ -147,60 +105,22 @@ static int hid_class_request_handler(struct usb_setup_packet *setup, uint8_t **d return 0; } -static void hid_notify_handler(uint8_t event, void *arg) +struct usbd_interface *usbd_hid_alloc_intf(const uint8_t *desc, uint32_t desc_len) { - switch (event) { - case USBD_EVENT_RESET: - usbd_hid_reset(); - break; - default: - break; - } -} - -int usbd_hid_alloc(uint8_t intf) -{ - struct usbd_hid *hid_class = usb_malloc(sizeof(struct usbd_hid)); - - if (hid_class == NULL) { - USB_LOG_ERR("no memory to alloc hid_class\r\n"); - return -1; + 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; } - memset(hid_class, 0, sizeof(struct usbd_hid)); - hid_class->intf_num = intf; - usb_slist_add_tail(&usbd_hid_head, &hid_class->list); - return 0; -} - -void usbd_hid_add_interface(usbd_class_t *devclass, usbd_interface_t *intf) -{ intf->class_handler = hid_class_request_handler; intf->custom_handler = hid_custom_request_handler; intf->vendor_handler = NULL; - intf->notify_handler = hid_notify_handler; - usbd_class_add_interface(devclass, intf); - usbd_hid_alloc(intf->intf_num); -} + intf->notify_handler = NULL; -void usbd_hid_descriptor_register(uint8_t intf_num, const uint8_t *desc) -{ - // usbd_hid_cfg.hid_descriptor = desc; -} - -void usbd_hid_report_descriptor_register(uint8_t intf_num, const uint8_t *desc, uint32_t desc_len) -{ - usb_slist_t *i; - usb_slist_for_each(i, &usbd_hid_head) - { - struct usbd_hid *hid_class = usb_slist_entry(i, struct usbd_hid, list); - - if (hid_class->intf_num == intf_num) { - hid_class->hid_report_descriptor = desc; - hid_class->hid_report_descriptor_len = desc_len; - return; - } - } + intf->hid_report_descriptor = desc; + intf->hid_report_descriptor_len = desc_len; + return intf; } __WEAK uint8_t usbh_hid_get_report(uint8_t intf, uint8_t report_id, uint8_t report_type) diff --git a/class/hid/usbd_hid.h b/class/hid/usbd_hid.h index 5b8ef1a9..d065cf45 100644 --- a/class/hid/usbd_hid.h +++ b/class/hid/usbd_hid.h @@ -12,8 +12,8 @@ extern "C" { #endif -/* Register api */ -void usbd_hid_add_interface(usbd_class_t *devclass, usbd_interface_t *intf); +/* Alloc hid interface driver */ +struct usbd_interface *usbd_hid_alloc_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/hub/usbd_hub.c b/class/hub/usbd_hub.c index a01312b8..7300dcd8 100644 --- a/class/hub/usbd_hub.c +++ b/class/hub/usbd_hub.c @@ -70,13 +70,4 @@ static void hub_notify_handler(uint8_t event, void *arg) default: break; } -} - -void usbd_hub_add_interface(usbd_class_t *devclass, usbd_interface_t *intf) -{ - intf->class_handler = NULL; - intf->custom_handler = hub_custom_request_handler; - intf->vendor_handler = NULL; - intf->notify_handler = hub_notify_handler; - usbd_class_add_interface(devclass, intf); -} +} \ No newline at end of file diff --git a/class/hub/usbd_hub.h b/class/hub/usbd_hub.h index 02ce0226..297098a2 100644 --- a/class/hub/usbd_hub.h +++ b/class/hub/usbd_hub.h @@ -12,8 +12,6 @@ extern "C" { #endif -void usbd_hub_add_interface(usbd_class_t *devclass, usbd_interface_t *intf); - #ifdef __cplusplus } #endif diff --git a/class/msc/usbd_msc.c b/class/msc/usbd_msc.c index 66b2200d..8552f4e8 100644 --- a/class/msc/usbd_msc.c +++ b/class/msc/usbd_msc.c @@ -22,7 +22,7 @@ #define MSD_IN_EP_IDX 1 /* Describe EndPoints configuration */ -static usbd_endpoint_t mass_ep_data[2]; +static struct usbd_endpoint mass_ep_data[2]; /* MSC Bulk-only Stage */ enum Stage { @@ -822,7 +822,7 @@ static bool SCSI_CBWDecode(uint32_t nbytes) return ret; } -static void mass_storage_bulk_out(uint8_t ep, uint32_t nbytes) +void mass_storage_bulk_out(uint8_t ep, uint32_t nbytes) { switch (usbd_msc_cfg.stage) { case MSC_READ_CBW: @@ -849,7 +849,7 @@ static void mass_storage_bulk_out(uint8_t ep, uint32_t nbytes) } } -static void mass_storage_bulk_in(uint8_t ep, uint32_t nbytes) +void mass_storage_bulk_in(uint8_t ep, uint32_t nbytes) { switch (usbd_msc_cfg.stage) { case MSC_DATA_IN: @@ -911,23 +911,26 @@ static void usbd_msc_thread(void *argument) } #endif -static usbd_interface_t msc_intf = { - .class_handler = msc_storage_class_request_handler, - .vendor_handler = NULL, - .notify_handler = msc_storage_notify_handler, -}; - -void usbd_msc_class_init(uint8_t out_ep, uint8_t in_ep) +struct usbd_interface *usbd_msc_alloc_intf(const uint8_t out_ep, const uint8_t in_ep) { - usbd_class_add_interface(NULL, &msc_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; + } - mass_ep_data[0].ep_addr = out_ep; - mass_ep_data[0].ep_cb = mass_storage_bulk_out; - mass_ep_data[1].ep_addr = in_ep; - mass_ep_data[1].ep_cb = mass_storage_bulk_in; + intf->class_handler = msc_storage_class_request_handler; + intf->custom_handler = NULL; + intf->vendor_handler = NULL; + intf->notify_handler = msc_storage_notify_handler; - usbd_interface_add_endpoint(&msc_intf, &mass_ep_data[0]); - usbd_interface_add_endpoint(&msc_intf, &mass_ep_data[1]); + mass_ep_data[MSD_OUT_EP_IDX].ep_addr = out_ep; + mass_ep_data[MSD_OUT_EP_IDX].ep_cb = mass_storage_bulk_out; + mass_ep_data[MSD_IN_EP_IDX].ep_addr = in_ep; + mass_ep_data[MSD_IN_EP_IDX].ep_cb = mass_storage_bulk_in; + + usbd_add_endpoint(&mass_ep_data[MSD_OUT_EP_IDX]); + usbd_add_endpoint(&mass_ep_data[MSD_IN_EP_IDX]); memset((uint8_t *)&usbd_msc_cfg, 0, sizeof(struct usbd_msc_cfg_priv)); @@ -935,7 +938,7 @@ void usbd_msc_class_init(uint8_t out_ep, uint8_t in_ep) if (usbd_msc_cfg.scsi_blk_size > CONFIG_USBDEV_MSC_BLOCK_SIZE) { USB_LOG_ERR("msc block buffer overflow\r\n"); - return; + return NULL; } #ifdef CONFIG_USBDEV_MSC_THREAD msc_sem = usb_osal_sem_create(1); @@ -945,4 +948,6 @@ void usbd_msc_class_init(uint8_t out_ep, uint8_t in_ep) return; } #endif -} + + return intf; +} \ No newline at end of file diff --git a/class/msc/usbd_msc.h b/class/msc/usbd_msc.h index 0e286c2c..d22e099d 100644 --- a/class/msc/usbd_msc.h +++ b/class/msc/usbd_msc.h @@ -12,7 +12,12 @@ extern "C" { #endif -void usbd_msc_class_init(uint8_t out_ep, uint8_t in_ep); +/* Alloc msc interface driver */ +struct usbd_interface *usbd_msc_alloc_intf(const uint8_t out_ep, const uint8_t in_ep); + +void mass_storage_bulk_out(uint8_t ep, uint32_t nbytes); +void mass_storage_bulk_in(uint8_t ep, uint32_t nbytes); + 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_write(uint32_t sector, uint8_t *buffer, uint32_t length); diff --git a/class/mtp/usbd_mtp.c b/class/mtp/usbd_mtp.c index 717a6b04..d3062169 100644 --- a/class/mtp/usbd_mtp.c +++ b/class/mtp/usbd_mtp.c @@ -21,7 +21,7 @@ struct mtp_cfg_priv { #define MSD_IN_EP_IDX 1 /* Describe EndPoints configuration */ -static usbd_endpoint_t mtp_ep_data[2]; +static struct usbd_interface mtp_ep_data[2]; static int mtp_class_request_handler(struct usb_setup_packet *setup, uint8_t **data, uint32_t *len) { diff --git a/class/printer/usbd_printer.c b/class/printer/usbd_printer.c index 24b8fa88..24e16c98 100644 --- a/class/printer/usbd_printer.c +++ b/class/printer/usbd_printer.c @@ -46,12 +46,18 @@ static void printer_notify_handler(uint8_t event, void *arg) } } -void usbd_printer_add_interface(usbd_class_t *devclass, usbd_interface_t *intf) +struct usbd_interface *usbd_printer_alloc_intf(void) { + 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_handler = printer_class_request_handler; intf->custom_handler = NULL; intf->vendor_handler = NULL; intf->notify_handler = printer_notify_handler; - usbd_class_add_interface(devclass, intf); -} + return intf; +} \ No newline at end of file diff --git a/class/printer/usbd_printer.h b/class/printer/usbd_printer.h index 933b7d9a..7f691dfc 100644 --- a/class/printer/usbd_printer.h +++ b/class/printer/usbd_printer.h @@ -12,7 +12,8 @@ extern "C" { #endif -void usbd_printer_add_interface(usbd_class_t *devclass, usbd_interface_t *intf); +/* Alloc printer interface driver */ +struct usbd_interface *usbd_printer_alloc_intf(void); #ifdef __cplusplus } diff --git a/class/video/usbd_video.c b/class/video/usbd_video.c index 578f8a89..ac847400 100644 --- a/class/video/usbd_video.c +++ b/class/video/usbd_video.c @@ -17,12 +17,8 @@ struct usbd_video_cfg_priv { struct video_probe_and_commit_controls commit; uint8_t power_mode; uint8_t error_code; - uint8_t vcintf; - uint8_t vsintf; struct video_entity_info info[3]; } usbd_video_cfg = { - .vcintf = 0xff, - .vsintf = 0xff, .info[0] = { .bDescriptorSubtype = VIDEO_VC_INPUT_TERMINAL_DESCRIPTOR_SUBTYPE, .bEntityId = 0x01, .wTerminalType = VIDEO_ITT_CAMERA }, .info[1] = { .bDescriptorSubtype = VIDEO_VC_OUTPUT_TERMINAL_DESCRIPTOR_SUBTYPE, .bEntityId = 0x03, .wTerminalType = 0x00 }, .info[2] = { .bDescriptorSubtype = VIDEO_VC_PROCESSING_UNIT_DESCRIPTOR_SUBTYPE, .bEntityId = 0x02, .wTerminalType = 0x00 }, @@ -672,13 +668,13 @@ static int video_class_request_handler(struct usb_setup_packet *setup, uint8_t * uint8_t intf_num = (uint8_t)setup->wIndex; uint8_t entity_id = (uint8_t)(setup->wIndex >> 8); - if (usbd_video_cfg.vcintf == intf_num) { /* Video Control Interface */ + if (intf_num == 0) { /* Video Control Interface */ if (entity_id == 0) { return usbd_video_control_request_handler(setup, data, len); /* Interface Control Requests */ } else { return usbd_video_control_unit_terminal_request_handler(setup, data, len); /* Unit and Terminal Requests */ } - } else if (usbd_video_cfg.vsintf == intf_num) { /* Video Stream Inteface */ + } else if (intf_num == 1) { /* Video Stream Inteface */ return usbd_video_stream_request_handler(setup, data, len); /* Interface Stream Requests */ } return -1; @@ -707,21 +703,6 @@ static void video_notify_handler(uint8_t event, void *arg) } } -void usbd_video_add_interface(usbd_class_t *devclass, usbd_interface_t *intf) -{ - intf->class_handler = video_class_request_handler; - intf->custom_handler = NULL; - intf->vendor_handler = NULL; - intf->notify_handler = video_notify_handler; - usbd_class_add_interface(devclass, intf); - - if (usbd_video_cfg.vcintf == 0xff) { - usbd_video_cfg.vcintf = intf->intf_num; - } else if (usbd_video_cfg.vsintf == 0xff) { - usbd_video_cfg.vsintf = intf->intf_num; - } -} - void usbd_video_probe_and_commit_controls_init(uint32_t dwFrameInterval, uint32_t dwMaxVideoFrameSize, uint32_t dwMaxPayloadTransferSize) { usbd_video_cfg.probe.hintUnion.bmHint = 0x01; @@ -761,6 +742,23 @@ 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 *intf = usb_malloc(sizeof(struct usbd_interface)); + if (intf == NULL) { + USB_LOG_ERR("no mem to alloc intf\r\n"); + return NULL; + } + + intf->class_handler = video_class_request_handler; + intf->custom_handler = NULL; + intf->vendor_handler = NULL; + intf->notify_handler = video_notify_handler; + + usbd_video_probe_and_commit_controls_init(dwFrameInterval, dwMaxVideoFrameSize, dwMaxPayloadTransferSize); + return intf; +} + uint32_t usbd_video_mjpeg_payload_fill(uint8_t *input, uint32_t input_len, uint8_t *output, uint32_t *out_len) { uint32_t packets; diff --git a/class/video/usbd_video.h b/class/video/usbd_video.h index 4e47d5b3..f7ed4008 100644 --- a/class/video/usbd_video.h +++ b/class/video/usbd_video.h @@ -12,11 +12,13 @@ extern "C" { #endif -void usbd_video_add_interface(usbd_class_t *devclass, usbd_interface_t *intf); +/* Alloc video interface driver */ +struct usbd_interface *usbd_video_alloc_intf(uint32_t dwFrameInterval, + uint32_t dwMaxVideoFrameSize, + uint32_t dwMaxPayloadTransferSize); void usbd_video_open(uint8_t intf); void usbd_video_close(uint8_t intf); -void usbd_video_probe_and_commit_controls_init(uint32_t dwFrameInterval, uint32_t dwMaxVideoFrameSize, uint32_t dwMaxPayloadTransferSize); uint32_t usbd_video_mjpeg_payload_fill(uint8_t *input, uint32_t input_len, uint8_t *output, uint32_t *out_len); void usbd_video_mjpeg_payload_header_toggle(uint8_t *output, uint32_t packets); diff --git a/core/usbd_core.c b/core/usbd_core.c index f8a3f6f8..bc1ba7fb 100644 --- a/core/usbd_core.c +++ b/core/usbd_core.c @@ -51,7 +51,7 @@ USB_NOCACHE_RAM_SECTION struct usbd_core_cfg_priv { #endif } usbd_core_cfg; -static usb_slist_t usbd_intf_head = USB_SLIST_OBJECT_INIT(usbd_intf_head); +usb_slist_t usbd_intf_head = USB_SLIST_OBJECT_INIT(usbd_intf_head); static struct usb_msosv1_descriptor *msosv1_desc; static struct usb_msosv2_descriptor *msosv2_desc; @@ -585,7 +585,7 @@ static int usbd_class_request_handler(struct usb_setup_packet *setup, uint8_t ** if ((setup->bmRequestType & USB_REQUEST_RECIPIENT_MASK) == USB_REQUEST_RECIPIENT_INTERFACE) { usb_slist_for_each(i, &usbd_intf_head) { - usbd_interface_t *intf = usb_slist_entry(i, struct usbd_interface, list); + struct usbd_interface *intf = usb_slist_entry(i, struct usbd_interface, list); if (intf->class_handler && (intf->intf_num == (setup->wIndex & 0xFF))) { return intf->class_handler(setup, data, len); @@ -594,7 +594,7 @@ static int usbd_class_request_handler(struct usb_setup_packet *setup, uint8_t ** } else if ((setup->bmRequestType & USB_REQUEST_RECIPIENT_MASK) == USB_REQUEST_RECIPIENT_ENDPOINT) { usb_slist_for_each(i, &usbd_intf_head) { - usbd_interface_t *intf = usb_slist_entry(i, struct usbd_interface, list); + struct usbd_interface *intf = usb_slist_entry(i, struct usbd_interface, list); if (intf->custom_handler && (intf->intf_num == ((setup->wIndex >> 8) & 0xFF))) { return intf->custom_handler(setup, data, len); @@ -656,7 +656,7 @@ static int usbd_vendor_request_handler(struct usb_setup_packet *setup, uint8_t * usb_slist_for_each(i, &usbd_intf_head) { - usbd_interface_t *intf = usb_slist_entry(i, struct usbd_interface, list); + struct usbd_interface *intf = usb_slist_entry(i, struct usbd_interface, list); if (intf->vendor_handler && !intf->vendor_handler(setup, data, len)) { return 0; @@ -684,7 +684,7 @@ static int usbd_custom_request_handler(struct usb_setup_packet *setup, uint8_t * usb_slist_t *i; usb_slist_for_each(i, &usbd_intf_head) { - usbd_interface_t *intf = usb_slist_entry(i, struct usbd_interface, list); + struct usbd_interface *intf = usb_slist_entry(i, struct usbd_interface, list); if (intf->custom_handler && (intf->intf_num == (setup->wIndex & 0xFF))) { return intf->custom_handler(setup, data, len); @@ -741,7 +741,7 @@ static void usbd_class_event_notify_handler(uint8_t event, void *arg) usb_slist_t *i; usb_slist_for_each(i, &usbd_intf_head) { - usbd_interface_t *intf = usb_slist_entry(i, struct usbd_interface, list); + struct usbd_interface *intf = usb_slist_entry(i, struct usbd_interface, list); if (intf->notify_handler) { intf->notify_handler(event, arg); @@ -952,25 +952,17 @@ void usbd_bos_desc_register(struct usb_bos_descriptor *desc) bos_desc = desc; } -void usbd_class_register(usbd_class_t *devclass) -{ - // usb_slist_add_tail(&usbd_class_head, &devclass->list); - // usb_slist_init(&devclass->intf_list); -} - -void usbd_class_add_interface(usbd_class_t *devclass, usbd_interface_t *intf) +void usbd_add_interface(struct usbd_interface *intf) { static uint8_t intf_offset = 0; intf->intf_num = intf_offset; usb_slist_add_tail(&usbd_intf_head, &intf->list); - usb_slist_init(&intf->ep_list); intf_offset++; } -void usbd_interface_add_endpoint(usbd_interface_t *intf, usbd_endpoint_t *ep) +void usbd_add_endpoint(struct usbd_endpoint *ep) { - usb_slist_add_tail(&intf->ep_list, &ep->list); if (ep->ep_addr & 0x80) { usbd_core_cfg.in_ep_cb[ep->ep_addr & 0x7f] = ep->ep_cb; } else { diff --git a/core/usbd_core.h b/core/usbd_core.h index 0e48531f..10c3bb1f 100644 --- a/core/usbd_core.h +++ b/core/usbd_core.h @@ -44,13 +44,14 @@ typedef int (*usbd_request_handler)(struct usb_setup_packet *setup, uint8_t **da typedef void (*usbd_endpoint_callback)(uint8_t ep, uint32_t nbytes); typedef void (*usbd_notify_handler)(uint8_t event, void *arg); -typedef struct usbd_endpoint { - usb_slist_t list; +extern usb_slist_t usbd_intf_head; + +struct usbd_endpoint { uint8_t ep_addr; usbd_endpoint_callback ep_cb; -} usbd_endpoint_t; +}; -typedef struct usbd_interface { +struct usbd_interface { usb_slist_t list; /** Handler for USB Class specific commands*/ usbd_request_handler class_handler; @@ -60,23 +61,19 @@ typedef struct usbd_interface { usbd_request_handler custom_handler; /** Handler for USB event notify commands */ usbd_notify_handler notify_handler; + const uint8_t *hid_report_descriptor; + uint32_t hid_report_descriptor_len; uint8_t intf_num; - usb_slist_t ep_list; -} usbd_interface_t; - -typedef struct usbd_class { - usb_slist_t list; - const char *name; - usb_slist_t intf_list; -} usbd_class_t; +}; void usbd_desc_register(const uint8_t *desc); void usbd_msosv1_desc_register(struct usb_msosv1_descriptor *desc); void usbd_msosv2_desc_register(struct usb_msosv2_descriptor *desc); void usbd_bos_desc_register(struct usb_bos_descriptor *desc); -void usbd_class_register(usbd_class_t *devclass); -void usbd_class_add_interface(usbd_class_t *devclass, usbd_interface_t *intf); -void usbd_interface_add_endpoint(usbd_interface_t *intf, usbd_endpoint_t *ep); + +void usbd_add_interface(struct usbd_interface *intf); +void usbd_add_endpoint(struct usbd_endpoint *ep); + bool usb_device_is_configured(void); void usbd_configure_done_callback(void); int usbd_initialize(void); diff --git a/demo/audio_v1_mic_multichan_template.c b/demo/audio_v1_mic_multichan_template.c index 24f9fe05..4a99e28f 100644 --- a/demo/audio_v1_mic_multichan_template.c +++ b/demo/audio_v1_mic_multichan_template.c @@ -161,15 +161,11 @@ void usbd_audio_close(uint8_t intf) tx_flag = 0; } -static usbd_class_t audio_class; -static usbd_interface_t audio_control_intf; -static usbd_interface_t audio_stream_intf; - void usbd_audio_iso_callback(uint8_t ep, uint32_t nbytes) { } -static usbd_endpoint_t audio_in_ep = { +static struct usbd_endpoint audio_in_ep = { .ep_cb = usbd_audio_iso_callback, .ep_addr = AUDIO_IN_EP }; @@ -177,9 +173,10 @@ static usbd_endpoint_t audio_in_ep = { void audio_init() { usbd_desc_register(audio_descriptor); - usbd_audio_add_interface(&audio_class, &audio_control_intf); - usbd_audio_add_interface(&audio_class, &audio_stream_intf); - usbd_interface_add_endpoint(&audio_stream_intf, &audio_in_ep); + usbd_add_interface(usbd_audio_alloc_intf()); + usbd_add_interface(usbd_audio_alloc_intf()); + usbd_add_endpoint(&audio_in_ep); + usbd_audio_add_entity(0x02, AUDIO_CONTROL_FEATURE_UNIT); usbd_initialize(); diff --git a/demo/audio_v1_mic_speaker_multichan_template.c b/demo/audio_v1_mic_speaker_multichan_template.c index 0a34c038..87dd3895 100644 --- a/demo/audio_v1_mic_speaker_multichan_template.c +++ b/demo/audio_v1_mic_speaker_multichan_template.c @@ -154,18 +154,13 @@ void usbd_audio_close(uint8_t intf) } } -static usbd_class_t audio_class; -static usbd_interface_t audio_control_intf; -static usbd_interface_t audio_stream_intf; -static usbd_interface_t audio_stream_intf2; - #ifdef CONFIG_USB_HS #define AUDIO_OUT_EP_MPS 512 #else #define AUDIO_OUT_EP_MPS 64 #endif -USB_MEM_ALIGNX uint8_t out_buffer[AUDIO_OUT_EP_MPS]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t out_buffer[AUDIO_OUT_EP_MPS]; void usbd_configure_done_callback(void) { @@ -182,12 +177,12 @@ void usbd_audio_in_callback(uint8_t ep, uint32_t bytes) { } -static usbd_endpoint_t audio_in_ep = { +static struct usbd_endpoint audio_in_ep = { .ep_cb = usbd_audio_in_callback, .ep_addr = AUDIO_IN_EP }; -static usbd_endpoint_t audio_out_ep = { +static struct usbd_endpoint audio_out_ep = { .ep_cb = usbd_audio_out_callback, .ep_addr = AUDIO_OUT_EP }; @@ -195,11 +190,12 @@ static usbd_endpoint_t audio_out_ep = { void audio_init() { usbd_desc_register(audio_descriptor); - usbd_audio_add_interface(&audio_class, &audio_control_intf); - usbd_audio_add_interface(&audio_class, &audio_stream_intf); - usbd_audio_add_interface(&audio_class, &audio_stream_intf2); - usbd_interface_add_endpoint(&audio_stream_intf, &audio_in_ep); - usbd_interface_add_endpoint(&audio_stream_intf2, &audio_out_ep); + usbd_add_interface(usbd_audio_alloc_intf()); + usbd_add_interface(usbd_audio_alloc_intf()); + usbd_add_interface(usbd_audio_alloc_intf()); + usbd_add_endpoint(&audio_in_ep); + usbd_add_endpoint(&audio_out_ep); + usbd_audio_add_entity(0x02, AUDIO_CONTROL_FEATURE_UNIT); usbd_audio_add_entity(0x05, AUDIO_CONTROL_FEATURE_UNIT); diff --git a/demo/audio_v2_mic_multichan_template.c b/demo/audio_v2_mic_multichan_template.c index 04890d69..af6256cc 100644 --- a/demo/audio_v2_mic_multichan_template.c +++ b/demo/audio_v2_mic_multichan_template.c @@ -160,10 +160,6 @@ void usbd_audio_close(uint8_t intf) tx_flag = 0; } -static usbd_class_t audio_class; -static usbd_interface_t audio_control_intf; -static usbd_interface_t audio_stream_intf; - void usbd_configure_done_callback(void) { /* no out ep, do nothing */ @@ -173,7 +169,7 @@ void usbd_audio_iso_in_callback(uint8_t ep, uint32_t nbytes) { } -static usbd_endpoint_t audio_in_ep = { +static struct usbd_endpoint audio_in_ep = { .ep_cb = usbd_audio_iso_in_callback, .ep_addr = AUDIO_IN_EP }; @@ -181,9 +177,10 @@ static usbd_endpoint_t audio_in_ep = { void audio_init() { usbd_desc_register(audio_descriptor); - usbd_audio_add_interface(&audio_class, &audio_control_intf); - usbd_audio_add_interface(&audio_class, &audio_stream_intf); - usbd_interface_add_endpoint(&audio_stream_intf, &audio_in_ep); + usbd_add_interface(usbd_audio_alloc_intf()); + usbd_add_interface(usbd_audio_alloc_intf()); + usbd_add_endpoint(&audio_in_ep); + usbd_audio_add_entity(0x01, AUDIO_CONTROL_CLOCK_SOURCE); usbd_audio_add_entity(0x03, AUDIO_CONTROL_FEATURE_UNIT); diff --git a/demo/audio_v2_mic_speaker_multichan_template.c b/demo/audio_v2_mic_speaker_multichan_template.c index 4b2909e0..17b28a69 100644 --- a/demo/audio_v2_mic_speaker_multichan_template.c +++ b/demo/audio_v2_mic_speaker_multichan_template.c @@ -230,18 +230,13 @@ void usbd_audio_set_sampling_freq(uint8_t entity_id, uint8_t ep_ch, uint32_t sam } } -static usbd_class_t audio_class; -static usbd_interface_t audio_control_intf; -static usbd_interface_t audio_stream_intf; -static usbd_interface_t audio_stream_intf2; - #ifdef CONFIG_USB_HS #define AUDIO_OUT_EP_MPS 512 #else #define AUDIO_OUT_EP_MPS 64 #endif -USB_MEM_ALIGNX uint8_t out_buffer[AUDIO_OUT_EP_MPS]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t out_buffer[AUDIO_OUT_EP_MPS]; void usbd_configure_done_callback(void) { @@ -257,12 +252,12 @@ void usbd_audio_iso_in_callback(uint8_t ep, uint32_t nbytes) { } -static usbd_endpoint_t audio_out_ep = { +static struct usbd_endpoint audio_out_ep = { .ep_cb = usbd_audio_iso_out_callback, .ep_addr = AUDIO_OUT_EP }; -static usbd_endpoint_t audio_in_ep = { +static struct usbd_endpoint audio_in_ep = { .ep_cb = usbd_audio_iso_in_callback, .ep_addr = AUDIO_IN_EP }; @@ -270,11 +265,12 @@ static usbd_endpoint_t audio_in_ep = { void audio_init() { usbd_desc_register(audio_descriptor); - usbd_audio_add_interface(&audio_class, &audio_control_intf); - usbd_audio_add_interface(&audio_class, &audio_stream_intf); - usbd_audio_add_interface(&audio_class, &audio_stream_intf2); - usbd_interface_add_endpoint(&audio_stream_intf, &audio_out_ep); - usbd_interface_add_endpoint(&audio_stream_intf2, &audio_in_ep); + usbd_add_interface(usbd_audio_alloc_intf()); + usbd_add_interface(usbd_audio_alloc_intf()); + usbd_add_interface(usbd_audio_alloc_intf()); + usbd_add_endpoint(&audio_in_ep); + usbd_add_endpoint(&audio_out_ep); + usbd_audio_add_entity(0x01, AUDIO_CONTROL_CLOCK_SOURCE); usbd_audio_add_entity(0x03, AUDIO_CONTROL_FEATURE_UNIT); usbd_audio_add_entity(0x05, AUDIO_CONTROL_CLOCK_SOURCE); diff --git a/demo/audio_v2_speaker_multichan_template.c b/demo/audio_v2_speaker_multichan_template.c index c1c5fe41..dc103558 100644 --- a/demo/audio_v2_speaker_multichan_template.c +++ b/demo/audio_v2_speaker_multichan_template.c @@ -159,17 +159,13 @@ void usbd_audio_close(uint8_t intf) rx_flag = 0; } -static usbd_class_t audio_class; -static usbd_interface_t audio_control_intf; -static usbd_interface_t audio_stream_intf; - #ifdef CONFIG_USB_HS #define AUDIO_OUT_EP_MPS 512 #else #define AUDIO_OUT_EP_MPS 64 #endif -USB_MEM_ALIGNX uint8_t out_buffer[AUDIO_OUT_EP_MPS]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t out_buffer[AUDIO_OUT_EP_MPS]; void usbd_configure_done_callback(void) { @@ -181,7 +177,7 @@ void usbd_audio_iso_out_callback(uint8_t ep, uint32_t nbytes) { } -static usbd_endpoint_t audio_out_ep = { +static struct usbd_endpoint audio_out_ep = { .ep_cb = usbd_audio_iso_out_callback, .ep_addr = AUDIO_OUT_EP }; @@ -189,9 +185,10 @@ static usbd_endpoint_t audio_out_ep = { void audio_init() { usbd_desc_register(audio_descriptor); - usbd_audio_add_interface(&audio_class, &audio_control_intf); - usbd_audio_add_interface(&audio_class, &audio_stream_intf); - usbd_interface_add_endpoint(&audio_stream_intf, &audio_out_ep); + usbd_add_interface(usbd_audio_alloc_intf()); + usbd_add_interface(usbd_audio_alloc_intf()); + usbd_add_endpoint(&audio_out_ep); + usbd_audio_add_entity(0x01, AUDIO_CONTROL_CLOCK_SOURCE); usbd_audio_add_entity(0x03, AUDIO_CONTROL_FEATURE_UNIT); diff --git a/demo/cdc_acm_hid_msc_template.c b/demo/cdc_acm_hid_msc_template.c index 4784b665..0f0ce420 100644 --- a/demo/cdc_acm_hid_msc_template.c +++ b/demo/cdc_acm_hid_msc_template.c @@ -223,12 +223,6 @@ struct hid_mouse { int8_t wheel; }; -/*!< class */ -static usbd_class_t hid_class; - -/*!< interface */ -static usbd_interface_t hid_intf; - /*!< mouse report */ static struct hid_mouse mouse_cfg; @@ -250,18 +244,11 @@ static void usbd_hid_int_callback(uint8_t ep, uint32_t nbytes) } /*!< endpoint call back */ -static usbd_endpoint_t hid_in_ep = { +static struct usbd_endpoint hid_in_ep = { .ep_cb = usbd_hid_int_callback, .ep_addr = HID_INT_EP }; -/*!< class */ -usbd_class_t cdc_class; -/*!< interface one */ -usbd_interface_t cdc_cmd_intf; -/*!< interface two */ -usbd_interface_t cdc_data_intf; - USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[2048]; USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[2048] = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30 }; @@ -299,12 +286,12 @@ void usbd_cdc_acm_bulk_in(uint8_t ep, uint32_t nbytes) } /*!< endpoint call back */ -usbd_endpoint_t cdc_out_ep = { +struct usbd_endpoint cdc_out_ep = { .ep_addr = CDC_OUT_EP, .ep_cb = usbd_cdc_acm_bulk_out }; -usbd_endpoint_t cdc_in_ep = { +struct usbd_endpoint cdc_in_ep = { .ep_addr = CDC_IN_EP, .ep_cb = usbd_cdc_acm_bulk_in }; @@ -320,20 +307,15 @@ void cdc_acm_hid_msc_descriptor_init(void) { usbd_desc_register(cdc_acm_hid_msc_descriptor); - /*!< add interface */ - usbd_cdc_add_acm_interface(&cdc_class, &cdc_cmd_intf); - usbd_cdc_add_acm_interface(&cdc_class, &cdc_data_intf); - /*!< interface add endpoint */ - usbd_interface_add_endpoint(&cdc_data_intf, &cdc_out_ep); - usbd_interface_add_endpoint(&cdc_data_intf, &cdc_in_ep); + usbd_add_interface(usbd_cdc_acm_alloc_intf()); + usbd_add_interface(usbd_cdc_acm_alloc_intf()); + usbd_add_endpoint(&cdc_out_ep); + usbd_add_endpoint(&cdc_in_ep); - usbd_msc_class_init(MSC_OUT_EP, MSC_IN_EP); - /*!< add interface */ - usbd_hid_add_interface(&hid_class, &hid_intf); - /*!< interface add endpoint */ - usbd_interface_add_endpoint(&hid_intf, &hid_in_ep); - /*!< register report descriptor */ - usbd_hid_report_descriptor_register(1, hid_mouse_report_desc, HID_MOUSE_REPORT_DESC_SIZE); + usbd_add_interface(usbd_msc_alloc_intf(MSC_OUT_EP, MSC_IN_EP)); + + usbd_add_interface(usbd_hid_alloc_intf(hid_mouse_report_desc, HID_MOUSE_REPORT_DESC_SIZE)); + usbd_add_endpoint(&hid_in_ep); /*!< init mouse report data */ mouse_cfg.buttons = 0; diff --git a/demo/cdc_acm_msc_template.c b/demo/cdc_acm_msc_template.c index 3e6b1a5d..82c741a5 100644 --- a/demo/cdc_acm_msc_template.c +++ b/demo/cdc_acm_msc_template.c @@ -98,13 +98,6 @@ static const uint8_t cdc_msc_descriptor[] = { 0x00 }; -/*!< class */ -usbd_class_t cdc_class; -/*!< interface one */ -usbd_interface_t cdc_cmd_intf; -/*!< interface two */ -usbd_interface_t cdc_data_intf; - USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[2048]; USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[2048] = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30 }; @@ -142,12 +135,12 @@ void usbd_cdc_acm_bulk_in(uint8_t ep, uint32_t nbytes) } /*!< endpoint call back */ -usbd_endpoint_t cdc_out_ep = { +struct usbd_endpoint cdc_out_ep = { .ep_addr = CDC_OUT_EP, .ep_cb = usbd_cdc_acm_bulk_out }; -usbd_endpoint_t cdc_in_ep = { +struct usbd_endpoint cdc_in_ep = { .ep_addr = CDC_IN_EP, .ep_cb = usbd_cdc_acm_bulk_in }; @@ -156,14 +149,11 @@ usbd_endpoint_t cdc_in_ep = { void cdc_acm_msc_init(void) { usbd_desc_register(cdc_msc_descriptor); - /*!< add interface */ - usbd_cdc_add_acm_interface(&cdc_class, &cdc_cmd_intf); - usbd_cdc_add_acm_interface(&cdc_class, &cdc_data_intf); - /*!< interface add endpoint */ - usbd_interface_add_endpoint(&cdc_data_intf, &cdc_out_ep); - usbd_interface_add_endpoint(&cdc_data_intf, &cdc_in_ep); - - usbd_msc_class_init(MSC_OUT_EP, MSC_IN_EP); + usbd_add_interface(usbd_cdc_acm_alloc_intf()); + usbd_add_interface(usbd_cdc_acm_alloc_intf()); + 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_initialize(); } diff --git a/demo/cdc_acm_multi_template.c b/demo/cdc_acm_multi_template.c index eb5d5c53..334ebc10 100644 --- a/demo/cdc_acm_multi_template.c +++ b/demo/cdc_acm_multi_template.c @@ -108,13 +108,6 @@ static const uint8_t cdc_descriptor[] = { 0x00 }; -/*!< class */ -usbd_class_t cdc_class; -/*!< interface one */ -usbd_interface_t cdc_cmd_intf; -/*!< interface two */ -usbd_interface_t cdc_data_intf; - USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[4][2048]; USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[4][2048] = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30 }; @@ -154,59 +147,42 @@ void usbd_cdc_acm_bulk_in(uint8_t ep, uint32_t nbytes) } } -/*!< endpoint call back */ -usbd_class_t cdc_class1; -usbd_interface_t cdc_cmd_intf1; -usbd_interface_t cdc_data_intf1; - -usbd_endpoint_t cdc_out_ep1 = { +struct usbd_endpoint cdc_out_ep1 = { .ep_addr = CDC_OUT_EP, .ep_cb = usbd_cdc_acm_bulk_out }; -usbd_endpoint_t cdc_in_ep1 = { +struct usbd_endpoint cdc_in_ep1 = { .ep_addr = CDC_IN_EP, .ep_cb = usbd_cdc_acm_bulk_in }; -usbd_class_t cdc_class2; -usbd_interface_t cdc_cmd_intf2; -usbd_interface_t cdc_data_intf2; - -usbd_endpoint_t cdc_out_ep2 = { +struct usbd_endpoint cdc_out_ep2 = { .ep_addr = CDC_OUT_EP2, .ep_cb = usbd_cdc_acm_bulk_out }; -usbd_endpoint_t cdc_in_ep2 = { +struct usbd_endpoint cdc_in_ep2 = { .ep_addr = CDC_IN_EP2, .ep_cb = usbd_cdc_acm_bulk_in }; -usbd_class_t cdc_class3; -usbd_interface_t cdc_cmd_intf3; -usbd_interface_t cdc_data_intf3; - -usbd_endpoint_t cdc_out_ep3 = { +struct usbd_endpoint cdc_out_ep3 = { .ep_addr = CDC_OUT_EP3, .ep_cb = usbd_cdc_acm_bulk_out }; -usbd_endpoint_t cdc_in_ep3 = { +struct usbd_endpoint cdc_in_ep3 = { .ep_addr = CDC_IN_EP3, .ep_cb = usbd_cdc_acm_bulk_in }; -usbd_class_t cdc_class4; -usbd_interface_t cdc_cmd_intf4; -usbd_interface_t cdc_data_intf4; - -usbd_endpoint_t cdc_out_ep4 = { +struct usbd_endpoint cdc_out_ep4 = { .ep_addr = CDC_OUT_EP4, .ep_cb = usbd_cdc_acm_bulk_out }; -usbd_endpoint_t cdc_in_ep4 = { +struct usbd_endpoint cdc_in_ep4 = { .ep_addr = CDC_IN_EP4, .ep_cb = usbd_cdc_acm_bulk_in }; @@ -216,25 +192,25 @@ void cdc_acm_multi_init(void) { usbd_desc_register(cdc_descriptor); - usbd_cdc_add_acm_interface(&cdc_class1, &cdc_cmd_intf1); - usbd_cdc_add_acm_interface(&cdc_class1, &cdc_data_intf1); - usbd_interface_add_endpoint(&cdc_data_intf1, &cdc_out_ep1); - usbd_interface_add_endpoint(&cdc_data_intf1, &cdc_in_ep1); + usbd_add_interface(usbd_cdc_acm_alloc_intf()); + usbd_add_interface(usbd_cdc_acm_alloc_intf()); + usbd_add_endpoint(&cdc_out_ep1); + usbd_add_endpoint(&cdc_in_ep1); - usbd_cdc_add_acm_interface(&cdc_class2, &cdc_cmd_intf2); - usbd_cdc_add_acm_interface(&cdc_class2, &cdc_data_intf2); - usbd_interface_add_endpoint(&cdc_data_intf2, &cdc_out_ep2); - usbd_interface_add_endpoint(&cdc_data_intf2, &cdc_in_ep2); + usbd_add_interface(usbd_cdc_acm_alloc_intf()); + usbd_add_interface(usbd_cdc_acm_alloc_intf()); + usbd_add_endpoint(&cdc_out_ep2); + usbd_add_endpoint(&cdc_in_ep2); - usbd_cdc_add_acm_interface(&cdc_class3, &cdc_cmd_intf3); - usbd_cdc_add_acm_interface(&cdc_class3, &cdc_data_intf3); - usbd_interface_add_endpoint(&cdc_data_intf3, &cdc_out_ep3); - usbd_interface_add_endpoint(&cdc_data_intf3, &cdc_in_ep3); + usbd_add_interface(usbd_cdc_acm_alloc_intf()); + usbd_add_interface(usbd_cdc_acm_alloc_intf()); + usbd_add_endpoint(&cdc_out_ep3); + usbd_add_endpoint(&cdc_in_ep3); - usbd_cdc_add_acm_interface(&cdc_class4, &cdc_cmd_intf4); - usbd_cdc_add_acm_interface(&cdc_class4, &cdc_data_intf4); - usbd_interface_add_endpoint(&cdc_data_intf4, &cdc_out_ep4); - usbd_interface_add_endpoint(&cdc_data_intf4, &cdc_in_ep4); + usbd_add_interface(usbd_cdc_acm_alloc_intf()); + usbd_add_interface(usbd_cdc_acm_alloc_intf()); + usbd_add_endpoint(&cdc_out_ep4); + usbd_add_endpoint(&cdc_in_ep4); usbd_initialize(); } \ No newline at end of file diff --git a/demo/cdc_acm_template.c b/demo/cdc_acm_template.c index 5eb5b67e..050d4ccd 100644 --- a/demo/cdc_acm_template.c +++ b/demo/cdc_acm_template.c @@ -93,15 +93,8 @@ static const uint8_t cdc_descriptor[] = { 0x00 }; -/*!< class */ -usbd_class_t cdc_class; -/*!< interface one */ -usbd_interface_t cdc_cmd_intf; -/*!< interface two */ -usbd_interface_t cdc_data_intf; - -uint8_t read_buffer[2048]; -uint8_t write_buffer[2048] = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30 }; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[2048]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[2048] = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30 }; volatile bool ep_tx_busy_flag = false; @@ -141,12 +134,12 @@ void usbd_cdc_acm_bulk_in(uint8_t ep, uint32_t nbytes) } /*!< endpoint call back */ -usbd_endpoint_t cdc_out_ep = { +struct usbd_endpoint cdc_out_ep = { .ep_addr = CDC_OUT_EP, .ep_cb = usbd_cdc_acm_bulk_out }; -usbd_endpoint_t cdc_in_ep = { +struct usbd_endpoint cdc_in_ep = { .ep_addr = CDC_IN_EP, .ep_cb = usbd_cdc_acm_bulk_in }; @@ -155,13 +148,10 @@ usbd_endpoint_t cdc_in_ep = { void cdc_acm_init(void) { usbd_desc_register(cdc_descriptor); - /*!< add interface */ - usbd_cdc_add_acm_interface(&cdc_class, &cdc_cmd_intf); - usbd_cdc_add_acm_interface(&cdc_class, &cdc_data_intf); - /*!< interface add endpoint */ - usbd_interface_add_endpoint(&cdc_data_intf, &cdc_out_ep); - usbd_interface_add_endpoint(&cdc_data_intf, &cdc_in_ep); - + usbd_add_interface(usbd_cdc_acm_alloc_intf()); + usbd_add_interface(usbd_cdc_acm_alloc_intf()); + usbd_add_endpoint(&cdc_out_ep); + usbd_add_endpoint(&cdc_in_ep); usbd_initialize(); } diff --git a/demo/hid_custom_inout_template.c b/demo/hid_custom_inout_template.c index c8f8a717..4570b57f 100644 --- a/demo/hid_custom_inout_template.c +++ b/demo/hid_custom_inout_template.c @@ -172,12 +172,6 @@ void usbd_configure_done_callback(void) usbd_ep_start_read(HIDRAW_OUT_EP, read_buffer, 64); } -/*!< class */ -static usbd_class_t hid_class; - -/*!< interface one */ -static usbd_interface_t hid_intf_1; - static void usbd_hid_custom_in_callback(uint8_t ep, uint32_t nbytes) { USB_LOG_RAW("actual in len:%d\r\n", nbytes); @@ -193,12 +187,12 @@ static void usbd_hid_custom_out_callback(uint8_t ep, uint32_t nbytes) usbd_ep_start_read(HIDRAW_OUT_EP, read_buffer, 64); } -static usbd_endpoint_t custom_in_ep = { +static struct usbd_endpoint custom_in_ep = { .ep_cb = usbd_hid_custom_in_callback, .ep_addr = HIDRAW_IN_EP }; -static usbd_endpoint_t custom_out_ep = { +static struct usbd_endpoint custom_out_ep = { .ep_cb = usbd_hid_custom_out_callback, .ep_addr = HIDRAW_OUT_EP }; @@ -213,14 +207,9 @@ static usbd_endpoint_t custom_out_ep = { void hid_custom_keyboard_init(void) { usbd_desc_register(hid_descriptor); - /*!< add interface ! the first interface */ - usbd_hid_add_interface(&hid_class, &hid_intf_1); - /*!< interface0 add endpoint ! the first endpoint */ - usbd_interface_add_endpoint(&hid_intf_1, &custom_in_ep); - /*!< interface0 add endpoint ! the second endpoint */ - usbd_interface_add_endpoint(&hid_intf_1, &custom_out_ep); - /*!< register report descriptor interface 0 */ - usbd_hid_report_descriptor_register(0, hid_custom_report_desc, HID_CUSTOM_REPORT_DESC_SIZE); + usbd_add_interface(usbd_hid_alloc_intf(hid_custom_report_desc, HID_CUSTOM_REPORT_DESC_SIZE)); + usbd_add_endpoint(&custom_in_ep); + usbd_add_endpoint(&custom_out_ep); usbd_initialize(); } diff --git a/demo/hid_keyboard_template.c b/demo/hid_keyboard_template.c index fc8387ea..e4fc04f9 100644 --- a/demo/hid_keyboard_template.c +++ b/demo/hid_keyboard_template.c @@ -177,9 +177,6 @@ void usbd_configure_done_callback(void) /* no out ep, do nothing */ } -static usbd_class_t hid_class; -static usbd_interface_t hid_intf; - #define HID_STATE_IDLE 0 #define HID_STATE_BUSY 1 @@ -196,7 +193,7 @@ void usbd_hid_int_callback(uint8_t ep, uint32_t nbytes) } } -static usbd_endpoint_t hid_in_ep = { +static struct usbd_endpoint hid_in_ep = { .ep_cb = usbd_hid_int_callback, .ep_addr = 0x81 }; @@ -204,9 +201,8 @@ static usbd_endpoint_t hid_in_ep = { void hid_keyboard_init(void) { usbd_desc_register(hid_descriptor); - usbd_hid_add_interface(&hid_class, &hid_intf); - usbd_interface_add_endpoint(&hid_intf, &hid_in_ep); - usbd_hid_report_descriptor_register(0, hid_keyboard_report_desc, HID_KEYBOARD_REPORT_DESC_SIZE); + usbd_add_interface(usbd_hid_alloc_intf(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 9e443712..e44c2da5 100644 --- a/demo/hid_mouse_template.c +++ b/demo/hid_mouse_template.c @@ -188,12 +188,6 @@ struct hid_mouse { int8_t wheel; }; -/*!< class */ -static usbd_class_t hid_class; - -/*!< interface */ -static usbd_interface_t hid_intf; - /*!< mouse report */ static struct hid_mouse mouse_cfg; @@ -217,7 +211,7 @@ static void usbd_hid_int_callback(uint8_t ep, uint32_t nbytes) } /*!< endpoint call back */ -static usbd_endpoint_t hid_in_ep = { +static struct usbd_endpoint hid_in_ep = { .ep_cb = usbd_hid_int_callback, .ep_addr = 0x81 }; @@ -232,12 +226,8 @@ static usbd_endpoint_t hid_in_ep = { void hid_mouse_init(void) { usbd_desc_register(hid_descriptor); - /*!< add interface */ - usbd_hid_add_interface(&hid_class, &hid_intf); - /*!< interface add endpoint */ - usbd_interface_add_endpoint(&hid_intf, &hid_in_ep); - /*!< register report descriptor */ - usbd_hid_report_descriptor_register(0, hid_mouse_report_desc, HID_MOUSE_REPORT_DESC_SIZE); + usbd_add_interface(usbd_hid_alloc_intf(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 6bf8c0f8..b4ee0be9 100644 --- a/demo/midi_template.c +++ b/demo/midi_template.c @@ -1,7 +1,7 @@ #include "usbd_core.h" #include "usb_midi.h" -USB_DESC_SECTION const uint8_t midi_descriptor[] = { +const uint8_t midi_descriptor[] = { USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0100, 0x01), USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x02, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER), // Standard AC Interface Descriptor @@ -130,37 +130,34 @@ USB_DESC_SECTION const uint8_t midi_descriptor[] = { 0x00 }; -void usbd_midi_bulk_out(uint8_t ep) +void usbd_midi_bulk_out(uint8_t ep, uint32_t nbytes) { } -void usbd_midi_bulk_in(uint8_t ep) +void usbd_midi_bulk_in(uint8_t ep, uint32_t nbytes) { } -usbd_class_t midi_class; -usbd_interface_t midi_cmd_intf; -usbd_interface_t midi_data_intf; +struct usbd_interface midi_cmd_intf; +struct usbd_interface midi_data_intf; -usbd_endpoint_t midi_out_ep = { +struct usbd_endpoint midi_out_ep = { .ep_addr = MIDI_OUT_EP, .ep_cb = usbd_midi_bulk_out }; -usbd_endpoint_t midi_in_ep = { +struct usbd_endpoint midi_in_ep = { .ep_addr = MIDI_IN_EP, .ep_cb = usbd_midi_bulk_in }; - void midi_init(void) { usbd_desc_register(midi_descriptor); - - usbd_class_add_interface(&midi_class, &midi_cmd_intf); - usbd_class_add_interface(&midi_class, &midi_data_intf); - usbd_interface_add_endpoint(&midi_data_intf, &midi_out_ep); - usbd_interface_add_endpoint(&midi_data_intf, &midi_in_ep); + usbd_add_interface(&midi_cmd_intf); + usbd_add_interface(&midi_data_intf); + usbd_add_endpoint(&midi_out_ep); + usbd_add_endpoint(&midi_in_ep); usbd_initialize(); } \ No newline at end of file diff --git a/demo/msc_ram_template.c b/demo/msc_ram_template.c index e6698158..b7e5e0eb 100644 --- a/demo/msc_ram_template.c +++ b/demo/msc_ram_template.c @@ -133,7 +133,7 @@ int usbd_msc_sector_write(uint32_t sector, uint8_t *buffer, uint32_t length) void msc_ram_init(void) { usbd_desc_register(msc_ram_descriptor); - usbd_msc_class_init(MSC_OUT_EP, MSC_IN_EP); + usbd_add_interface(usbd_msc_alloc_intf(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 c71e4879..8b25e119 100644 --- a/demo/video_static_mjpeg_template.c +++ b/demo/video_static_mjpeg_template.c @@ -154,10 +154,6 @@ void usbd_video_close(uint8_t intf) tx_flag = 0; } -static usbd_class_t video_class; -static usbd_interface_t video_control_intf; -static usbd_interface_t video_stream_intf; - volatile bool iso_tx_busy = false; void usbd_video_iso_callback(uint8_t ep, uint32_t nbytes) @@ -165,7 +161,7 @@ void usbd_video_iso_callback(uint8_t ep, uint32_t nbytes) iso_tx_busy = false; } -static usbd_endpoint_t video_in_ep = { +static struct usbd_endpoint video_in_ep = { .ep_cb = usbd_video_iso_callback, .ep_addr = VIDEO_IN_EP }; @@ -173,11 +169,8 @@ static usbd_endpoint_t video_in_ep = { void video_init() { usbd_desc_register(video_descriptor); - usbd_video_add_interface(&video_class, &video_control_intf); - usbd_video_add_interface(&video_class, &video_stream_intf); - usbd_interface_add_endpoint(&video_stream_intf, &video_in_ep); - - usbd_video_probe_and_commit_controls_init(CAM_FPS, MAX_FRAME_SIZE, MAX_PAYLOAD_SIZE); + usbd_add_interface(usbd_video_alloc_intf(CAM_FPS, 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 b211e237..aa208fff 100644 --- a/demo/winusb1.0_template.c +++ b/demo/winusb1.0_template.c @@ -190,7 +190,7 @@ const uint8_t winusb_descriptor[] = { #define WINUSB_OUT_EP_MPS 64 #endif -uint8_t read_buffer[2048]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[2048]; void usbd_configure_done_callback(void) { @@ -206,15 +206,14 @@ void usbd_winusb_in(uint8_t ep, uint32_t nbytes) { } -usbd_class_t winusb_class; -usbd_interface_t winusb_intf; +struct usbd_interface winusb_intf; -usbd_endpoint_t winusb_out_ep = { +struct usbd_endpoint winusb_out_ep = { .ep_addr = WINUSB_OUT_EP, .ep_cb = usbd_winusb_out }; -usbd_endpoint_t winusb_in_ep = { +struct usbd_endpoint winusb_in_ep = { .ep_addr = WINUSB_IN_EP, .ep_cb = usbd_winusb_in }; @@ -223,9 +222,9 @@ void daplink_winusb_init(void) { usbd_desc_register(winusb_descriptor); usbd_msosv1_desc_register(&msosv1_desc); - usbd_class_add_interface(&winusb_class, &winusb_intf); - usbd_interface_add_endpoint(&winusb_intf, &winusb_out_ep); - usbd_interface_add_endpoint(&winusb_intf, &winusb_in_ep); + usbd_add_interface(&winusb_intf); + usbd_add_endpoint(&winusb_out_ep); + usbd_add_endpoint(&winusb_in_ep); usbd_initialize(); diff --git a/docs/source/api/api_device.rst b/docs/source/api/api_device.rst index 3500eee1..c991c40f 100644 --- a/docs/source/api/api_device.rst +++ b/docs/source/api/api_device.rst @@ -1,13 +1,11 @@ 设备协议栈 ========================= -关于设备协议栈 API 的实现过程,有兴趣的可以看我的 B 站视频。设备协议栈的 API 使用了大量的链表,如何使用相关 API,参考下面一张图,并且总结如下: +设备协议栈主要负责枚举和驱动加载,枚举这边就不说了,驱动加载,也就是接口驱动加载,主要是依靠 `usbd_add_interface` 函数,记录传入的接口驱动保存到链表中,当主机进行类请求时就可以查找链表进行访问了。 +在调用 `usbd_desc_register` 以后需要进行接口注册和端点注册,口诀如下: -- 有多少个 class 就调用多少次 `usbd_class_register` -- 每个 class 有多少个接口就调用多少次 `usbd_class_add_interface`,已经支持的 class 接口就调用对应的 `usbd_xxx_class_add_interface` -- 每个接口有多少个端点就调用多少次 `usbd_interface_add_endpoint` - -.. figure:: img/api_device1.png +- 有多少个接口就调用多少次 `usbd_add_interface`,参数填各个 class alloc出来的 intf,如果没有 alloc 的intf 表示不需要加载。 +- 有多少个端点就调用多少次 `usbd_add_endpoint`,当中断完成时,会调用到注册的端点回调中。 CORE ----------------- @@ -19,11 +17,10 @@ CORE .. code-block:: C - typedef struct usbd_endpoint { - usb_slist_t list; + struct usbd_endpoint { uint8_t ep_addr; usbd_endpoint_callback ep_cb; - } usbd_endpoint_t; + }; - **list** 端点的链表节点 - **ep_addr** 端点地址(带方向) @@ -38,7 +35,7 @@ CORE .. code-block:: C - typedef struct usbd_interface { + struct usbd_interface { usb_slist_t list; /** Handler for USB Class specific commands*/ usbd_request_handler class_handler; @@ -48,9 +45,10 @@ CORE usbd_request_handler custom_handler; /** Handler for USB event notify commands */ usbd_notify_handler notify_handler; + uint8_t *hid_report_descriptor; + uint8_t *hid_report_descriptor_len; uint8_t intf_num; - usb_slist_t ep_list; - } usbd_interface_t; + }; - **list** 接口的链表节点 - **class_handler** class setup 请求回调函数 @@ -60,23 +58,6 @@ CORE - **intf_num** 当前接口偏移 - **ep_list** 端点的链表节点 -类结构体 -"""""""""""""""""""""""""""""""""""" - -类结构体主要用于挂载接口链表。后期可能会删除,因为这个部分跟接口其实是有关系的。 - -.. code-block:: C - - typedef struct usbd_class { - usb_slist_t list; - const char *name; - usb_slist_t intf_list; - } usbd_class_t; - -- **list** 类的链表节点 -- **name** 类的名称 -- **intf_list** 接口的链表节点 - usbd_desc_register """""""""""""""""""""""""""""""""""" @@ -132,29 +113,26 @@ usbd_class_register - **devclass** USB 设备类的句柄 -usbd_class_add_interface +usbd_add_interface """""""""""""""""""""""""""""""""""" -``usbd_class_add_interface`` 用来给 USB 设备类增加接口,并将接口信息挂载在类的链表上。 +``usbd_add_interface`` 添加一个接口驱动。 .. code-block:: C - void usbd_class_add_interface(usbd_class_t *devclass, usbd_interface_t *intf); + void usbd_add_interface(struct usbd_interface *intf); -- **devclass** USB 设备类的句柄 - **intf** USB 设备接口的句柄 -usbd_interface_add_endpoint +usbd_add_endpoint """""""""""""""""""""""""""""""""""" -``usbd_interface_add_endpoint`` 用来给 USB 接口增加端点,并将端点信息挂载在接口的链表上。 +``usbd_add_endpoint`` 添加一个端点中断完成回调函数。 .. code-block:: C - void usbd_interface_add_endpoint(usbd_interface_t *intf, usbd_endpoint_t *ep); + void usbd_add_endpoint(struct usbd_endpoint *ep);; - -- **intf** USB 设备接口的句柄 - **ep** USB 设备端点的句柄 usb_device_is_configured @@ -191,20 +169,19 @@ usbd_initialize CDC ACM ----------------- -usbd_cdc_add_acm_interface +usbd_cdc_acm_alloc_intf """""""""""""""""""""""""""""""""""" -``usbd_cdc_add_acm_interface`` 用来给 USB CDC ACM 类添加接口,并实现该接口相关的函数。 +``usbd_cdc_acm_alloc_intf`` 用来申请一个 USB CDC ACM 类接口,并实现该接口相关的函数。 - ``cdc_acm_class_request_handler`` 用来处理 USB CDC ACM 类 Setup 请求。 - ``cdc_notify_handler`` 用来处理 USB CDC 其他中断回调函数。 .. code-block:: C - void usbd_cdc_add_acm_interface(usbd_class_t *devclass, usbd_interface_t *intf); + struct usbd_interface *usbd_cdc_acm_alloc_intf(void); -- **devclass** 类的句柄 -- **intf** 接口句柄 +- **return** 接口句柄 usbd_cdc_acm_set_line_coding """""""""""""""""""""""""""""""""""" @@ -213,13 +190,22 @@ usbd_cdc_acm_set_line_coding .. code-block:: C - void usbd_cdc_acm_set_line_coding(uint8_t intf, uint32_t baudrate, uint8_t databits, uint8_t parity, uint8_t stopbits); + void usbd_cdc_acm_set_line_coding(uint8_t intf, struct cdc_line_coding *line_coding); - **intf** 控制接口号 -- **baudrate** 波特率 -- **databits** 数据位 -- **parity** 校验位 -- **stopbits** 停止位 +- **line_coding** 串口配置 + +usbd_cdc_acm_get_line_coding +"""""""""""""""""""""""""""""""""""" + +``usbd_cdc_acm_get_line_coding`` 用来获取串口进行配置,如果仅使用 USB 而不用 串口,该接口不用用户实现,使用默认。 + +.. code-block:: C + + void usbd_cdc_acm_get_line_coding(uint8_t intf, struct cdc_line_coding *line_coding); + +- **intf** 控制接口号 +- **line_coding** 串口配置 usbd_cdc_acm_set_dtr """""""""""""""""""""""""""""""""""" @@ -263,10 +249,10 @@ CDC_ACM_DESCRIPTOR_INIT HID ----------------- -usbd_hid_add_interface +usbd_hid_alloc_intf """""""""""""""""""""""""""""""""""" -``usbd_hid_add_interface`` 用来给 USB HID 类添加接口,并实现该接口相关的函数: +``usbd_hid_alloc_intf`` 用来申请一个 USB HID 类接口,并实现该接口相关的函数: - ``hid_class_request_handler`` 用来处理 USB HID 类的 Setup 请求。 - ``hid_custom_request_handler`` 用来处理 USB HID 获取报告描述符请求。 @@ -274,30 +260,17 @@ usbd_hid_add_interface .. code-block:: C - void usbd_hid_add_interface(usbd_class_t *devclass, usbd_interface_t *intf); + struct usbd_interface *usbd_hid_alloc_intf(const uint8_t *desc, uint32_t desc_len); -- **devclass** 类的句柄 -- **intf** 接口句柄 - -usbd_hid_report_descriptor_register -"""""""""""""""""""""""""""""""""""""""""""" - -``usbd_hid_report_descriptor_register`` 用来注册 hid 报告描述符。 - -.. code-block:: C - - void usbd_hid_report_descriptor_register(uint8_t intf_num, const uint8_t *desc, uint32_t desc_len); - -- **intf_num** 当前 hid 报告描述符所在接口偏移 - **desc** 报告描述符 - **desc_len** 报告描述符长度 MSC ----------------- -usbd_msc_class_init +usbd_msc_alloc_intf """""""""""""""""""""""""""""""""""" -``usbd_msc_class_init`` 用来给 MSC 类添加接口,并实现该接口相关函数,并且注册端点回调函数。(因为 msc bot 协议是固定的,所以不需要用于实现,因此端点回调函数自然不需要用户实现)。 +``usbd_msc_alloc_intf`` 用来申请一个 MSC 类接口,并实现该接口相关函数,并且注册端点回调函数。(因为 msc bot 协议是固定的,所以不需要用于实现,因此端点回调函数自然不需要用户实现)。 - ``msc_storage_class_request_handler`` 用于处理 USB MSC Setup 中断请求。 - ``msc_storage_notify_handler`` 用于实现 USB MSC 其他中断回调函数。 @@ -307,7 +280,7 @@ usbd_msc_class_init .. code-block:: C - void usbd_msc_class_init(uint8_t out_ep, uint8_t in_ep); + struct usbd_interface *usbd_msc_alloc_intf(const uint8_t out_ep, const uint8_t in_ep); - **out_ep** out 端点地址 - **in_ep** in 端点地址 @@ -355,16 +328,16 @@ usbd_msc_sector_write UAC ----------------- -usbd_audio_add_interface +usbd_audio_alloc_intf """""""""""""""""""""""""""""""""""" -``usbd_audio_add_interface`` 用来给 USB Audio 类添加接口,并实现该接口相关的函数: +``usbd_audio_alloc_intf`` 用来申请一个 USB Audio 类接口,并实现该接口相关的函数: - ``audio_class_request_handler`` 用于处理 USB Audio Setup 中断请求。 - ``audio_notify_handler`` 用于实现 USB Audio 其他中断回调函数。 .. code-block:: C - void usbd_audio_add_interface(usbd_class_t *devclass, usbd_interface_t *intf); + struct usbd_interface *usbd_audio_alloc_intf(void); - **class** 类的句柄 - **intf** 接口句柄 @@ -465,31 +438,22 @@ usbd_audio_set_pitch UVC ----------------- -usbd_video_add_interface +usbd_video_alloc_intf """""""""""""""""""""""""""""""""""" -``usbd_video_add_interface`` 用来给 USB Video 类添加接口,并实现该接口相关的函数: +``usbd_video_alloc_intf`` 用来申请一个 USB Video 类接口,并实现该接口相关的函数: - ``video_class_request_handler`` 用于处理 USB Video Setup 中断请求。 - ``video_notify_handler`` 用于实现 USB Video 其他中断回调函数。 .. code-block:: C - void usbd_video_add_interface(usbd_class_t *devclass, usbd_interface_t *intf); + struct usbd_interface *usbd_video_alloc_intf(uint32_t dwFrameInterval, + uint32_t dwMaxVideoFrameSize, + uint32_t dwMaxPayloadTransferSize); - **class** 类的句柄 - **intf** 接口句柄 -usbd_video_probe_and_commit_controls_init -"""""""""""""""""""""""""""""""""""""""""""""""""""""""" - -``usbd_video_probe_and_commit_controls_init`` 初始化视频传输每帧最大传输长度。 - -.. code-block:: C - - void usbd_video_probe_and_commit_controls_init(uint32_t dwFrameInterval, uint32_t dwMaxVideoFrameSize, uint32_t dwMaxPayloadTransferSize); - -- **value** 为1 表示开启 stream 传输,为0 相反 - usbd_video_open """"""""""""""""""""""""""""""""""""