diff --git a/src/common/tusb_types.h b/src/common/tusb_types.h index c37c19ba..70d0db94 100644 --- a/src/common/tusb_types.h +++ b/src/common/tusb_types.h @@ -139,6 +139,7 @@ typedef enum TUSB_REQ_RCPT_OTHER } tusb_request_recipient_t; +// https://www.usb.org/defined-class-codes typedef enum { TUSB_CLASS_UNSPECIFIED = 0 , @@ -176,6 +177,12 @@ typedef enum MISC_PROTOCOL_IAD = 1 }misc_protocol_type_t; +typedef enum +{ + APP_SUBCLASS_USBTMC = 0x03, + APP_SUBCLASS_DFU_RUNTIME = 0x01 +} app_subclass_type_t; + typedef enum { DEVICE_CAPABILITY_WIRELESS_USB = 0x01, diff --git a/src/device/usbd.c b/src/device/usbd.c index 9d15ea4a..06fe1f23 100644 --- a/src/device/usbd.c +++ b/src/device/usbd.c @@ -73,8 +73,11 @@ enum { DRVID_INVALID = 0xFFu }; //--------------------------------------------------------------------+ // Class Driver //--------------------------------------------------------------------+ -typedef struct { +typedef struct +{ uint8_t class_code; + uint8_t subclass; // 0xFF support all values of subclass + uint8_t protocol; // 0xFF support all values of protocol void (* init ) (void); void (* reset ) (uint8_t rhport); @@ -90,6 +93,9 @@ static usbd_class_driver_t const _usbd_driver[] = #if CFG_TUD_CDC { .class_code = TUSB_CLASS_CDC, + .subclass = CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL, + .protocol = 0xFF, // all protocols + .init = cdcd_init, .reset = cdcd_reset, .open = cdcd_open, @@ -103,6 +109,9 @@ static usbd_class_driver_t const _usbd_driver[] = #if CFG_TUD_MSC { .class_code = TUSB_CLASS_MSC, + .subclass = MSC_SUBCLASS_SCSI, + .protocol = MSC_PROTOCOL_BOT, + .init = mscd_init, .reset = mscd_reset, .open = mscd_open, @@ -116,6 +125,9 @@ static usbd_class_driver_t const _usbd_driver[] = #if CFG_TUD_HID { .class_code = TUSB_CLASS_HID, + .subclass = 0xFF, // all subclass + .protocol = 0xFF, // all protocol + .init = hidd_init, .reset = hidd_reset, .open = hidd_open, @@ -129,6 +141,9 @@ static usbd_class_driver_t const _usbd_driver[] = #if CFG_TUD_MIDI { .class_code = TUSB_CLASS_AUDIO, + .subclass = AUDIO_SUBCLASS_CONTROL, + .protocol = AUDIO_PROTOCOL_V1, + .init = midid_init, .open = midid_open, .reset = midid_reset, @@ -142,6 +157,9 @@ static usbd_class_driver_t const _usbd_driver[] = #if CFG_TUD_VENDOR { .class_code = TUSB_CLASS_VENDOR_SPECIFIC, + .subclass = 0xFF, // all subclass + .protocol = 0xFF, // all protocol + .init = vendord_init, .reset = vendord_reset, .open = vendord_open, @@ -153,12 +171,11 @@ static usbd_class_driver_t const _usbd_driver[] = #endif #if CFG_TUD_USBTMC - // Presently USBTMC is the only defined class with the APP_SPECIFIC class code. - // We maybe need to add subclass codes here, or a callback to ask if a driver can - // handle a particular interface. { - .class_code = TUD_USBTMC_APP_CLASS, - //.subclass_code = TUD_USBTMC_APP_SUBCLASS + .class_code = TUSB_CLASS_APPLICATION_SPECIFIC, + .subclass = APP_SUBCLASS_USBTMC, + .protocol = 0xFF, // all protocol + .init = usbtmcd_init_cb, .reset = usbtmcd_reset_cb, .open = usbtmcd_open_cb, @@ -171,8 +188,10 @@ static usbd_class_driver_t const _usbd_driver[] = #if CFG_TUD_DFU_RT { - .class_code = TUD_DFU_APP_CLASS, - //.subclass_code = TUD_DFU_APP_SUBCLASS + .class_code = TUSB_CLASS_APPLICATION_SPECIFIC, + .subclass = APP_SUBCLASS_DFU_RUNTIME, + .protocol = DFU_PROTOCOL_RT, + .init = dfu_rtd_init, .reset = dfu_rtd_reset, .open = dfu_rtd_open, @@ -183,11 +202,14 @@ static usbd_class_driver_t const _usbd_driver[] = }, #endif - #if CFG_TUD_NET -#if CFG_TUD_NET != OPT_NET_EEM +#if CFG_TUD_NET + #if CFG_TUD_NET != OPT_NET_EEM /* RNDIS management interface */ { .class_code = TUD_RNDIS_ITF_CLASS, + .subclass = TUD_RNDIS_ITF_SUBCLASS, + .protocol = TUD_RNDIS_ITF_PROTOCOL, + .init = netd_init, .reset = netd_reset, .open = netd_open, @@ -196,10 +218,14 @@ static usbd_class_driver_t const _usbd_driver[] = .xfer_cb = netd_xfer_cb, .sof = NULL, }, -#endif + #endif + /* CDC-ECM management interface; CDC-EEM data interface */ { .class_code = TUSB_CLASS_CDC, + .subclass = CDC_COMM_SUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL, + .protocol = 0x00, + .init = netd_init, .reset = netd_reset, #if CFG_TUD_NET == OPT_NET_EEM @@ -212,10 +238,14 @@ static usbd_class_driver_t const _usbd_driver[] = .xfer_cb = netd_xfer_cb, .sof = NULL, }, + /* RNDIS/CDC-ECM data interface */ -#if CFG_TUD_NET != OPT_NET_EEM + #if CFG_TUD_NET != OPT_NET_EEM { .class_code = TUSB_CLASS_CDC_DATA, + .subclass = 0x00, + .protocol = 0x00, + .init = netd_init_data, .reset = NULL, .open = netd_open_data, @@ -224,8 +254,8 @@ static usbd_class_driver_t const _usbd_driver[] = .xfer_cb = netd_xfer_cb, .sof = NULL, }, -#endif #endif +#endif }; enum { USBD_CLASS_DRIVER_COUNT = TU_ARRAY_SIZE(_usbd_driver) }; diff --git a/src/device/usbd.h b/src/device/usbd.h index dbc94bc3..7b04ef9a 100644 --- a/src/device/usbd.h +++ b/src/device/usbd.h @@ -291,23 +291,23 @@ TU_ATTR_WEAK bool tud_vendor_control_complete_cb(uint8_t rhport, tusb_control_re // Interface number, number of endpoints, EP string index, USB_TMC_PROTOCOL*, bulk-out endpoint ID, // bulk-in endpoint ID #define TUD_USBTMC_IF_DESCRIPTOR(_itfnum, _bNumEndpoints, _stridx, _itfProtocol) \ -/* Interface */ \ + /* Interface */ \ 0x09, TUSB_DESC_INTERFACE, _itfnum, 0x00, _bNumEndpoints, TUD_USBTMC_APP_CLASS, TUD_USBTMC_APP_SUBCLASS, _itfProtocol, _stridx #define TUD_USBTMC_IF_DESCRIPTOR_LEN 9u #define TUD_USBTMC_BULK_DESCRIPTORS(_epout, _epin, _bulk_epsize) \ -/* Endpoint Out */ \ -7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_bulk_epsize), 0u, \ -/* Endpoint In */ \ -7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_BULK, U16_TO_U8S_LE(_bulk_epsize), 0u + /* Endpoint Out */ \ + 7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_bulk_epsize), 0u, \ + /* Endpoint In */ \ + 7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_BULK, U16_TO_U8S_LE(_bulk_epsize), 0u #define TUD_USBTMC_BULK_DESCRIPTORS_LEN (7u+7u) /* optional interrupt endpoint */ \ // _int_pollingInterval : for LS/FS, expressed in frames (1ms each). 16 may be a good number? #define TUD_USBTMC_INT_DESCRIPTOR(_ep_interrupt, _ep_interrupt_size, _int_pollingInterval ) \ -7, TUSB_DESC_ENDPOINT, _ep_interrupt, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_ep_interrupt_size), 0x16 + 7, TUSB_DESC_ENDPOINT, _ep_interrupt, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_ep_interrupt_size), 0x16 #define TUD_USBTMC_INT_DESCRIPTOR_LEN (7u) @@ -377,7 +377,7 @@ TU_ATTR_WEAK bool tud_vendor_control_complete_cb(uint8_t rhport, tusb_control_re #define TUD_RNDIS_ITF_PROTOCOL 0xFF /* CDC_COMM_PROTOCOL_MICROSOFT_RNDIS */ #else /* Windows 7+ */ - #define TUD_RNDIS_ITF_CLASS 0xE0 + #define TUD_RNDIS_ITF_CLASS TUSB_CLASS_WIRELESS_CONTROLLER #define TUD_RNDIS_ITF_SUBCLASS 0x01 #define TUD_RNDIS_ITF_PROTOCOL 0x03 #endif