adding subclass & protocol to class driver structure

This commit is contained in:
hathach 2020-04-14 18:00:59 +07:00
parent 57ffa94a52
commit 593fe154ec
No known key found for this signature in database
GPG Key ID: 2FA891220FBFD581
3 changed files with 57 additions and 20 deletions

View File

@ -139,6 +139,7 @@ typedef enum
TUSB_REQ_RCPT_OTHER TUSB_REQ_RCPT_OTHER
} tusb_request_recipient_t; } tusb_request_recipient_t;
// https://www.usb.org/defined-class-codes
typedef enum typedef enum
{ {
TUSB_CLASS_UNSPECIFIED = 0 , TUSB_CLASS_UNSPECIFIED = 0 ,
@ -176,6 +177,12 @@ typedef enum
MISC_PROTOCOL_IAD = 1 MISC_PROTOCOL_IAD = 1
}misc_protocol_type_t; }misc_protocol_type_t;
typedef enum
{
APP_SUBCLASS_USBTMC = 0x03,
APP_SUBCLASS_DFU_RUNTIME = 0x01
} app_subclass_type_t;
typedef enum typedef enum
{ {
DEVICE_CAPABILITY_WIRELESS_USB = 0x01, DEVICE_CAPABILITY_WIRELESS_USB = 0x01,

View File

@ -73,8 +73,11 @@ enum { DRVID_INVALID = 0xFFu };
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
// Class Driver // Class Driver
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
typedef struct { typedef struct
{
uint8_t class_code; 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 (* init ) (void);
void (* reset ) (uint8_t rhport); void (* reset ) (uint8_t rhport);
@ -90,6 +93,9 @@ static usbd_class_driver_t const _usbd_driver[] =
#if CFG_TUD_CDC #if CFG_TUD_CDC
{ {
.class_code = TUSB_CLASS_CDC, .class_code = TUSB_CLASS_CDC,
.subclass = CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL,
.protocol = 0xFF, // all protocols
.init = cdcd_init, .init = cdcd_init,
.reset = cdcd_reset, .reset = cdcd_reset,
.open = cdcd_open, .open = cdcd_open,
@ -103,6 +109,9 @@ static usbd_class_driver_t const _usbd_driver[] =
#if CFG_TUD_MSC #if CFG_TUD_MSC
{ {
.class_code = TUSB_CLASS_MSC, .class_code = TUSB_CLASS_MSC,
.subclass = MSC_SUBCLASS_SCSI,
.protocol = MSC_PROTOCOL_BOT,
.init = mscd_init, .init = mscd_init,
.reset = mscd_reset, .reset = mscd_reset,
.open = mscd_open, .open = mscd_open,
@ -116,6 +125,9 @@ static usbd_class_driver_t const _usbd_driver[] =
#if CFG_TUD_HID #if CFG_TUD_HID
{ {
.class_code = TUSB_CLASS_HID, .class_code = TUSB_CLASS_HID,
.subclass = 0xFF, // all subclass
.protocol = 0xFF, // all protocol
.init = hidd_init, .init = hidd_init,
.reset = hidd_reset, .reset = hidd_reset,
.open = hidd_open, .open = hidd_open,
@ -129,6 +141,9 @@ static usbd_class_driver_t const _usbd_driver[] =
#if CFG_TUD_MIDI #if CFG_TUD_MIDI
{ {
.class_code = TUSB_CLASS_AUDIO, .class_code = TUSB_CLASS_AUDIO,
.subclass = AUDIO_SUBCLASS_CONTROL,
.protocol = AUDIO_PROTOCOL_V1,
.init = midid_init, .init = midid_init,
.open = midid_open, .open = midid_open,
.reset = midid_reset, .reset = midid_reset,
@ -142,6 +157,9 @@ static usbd_class_driver_t const _usbd_driver[] =
#if CFG_TUD_VENDOR #if CFG_TUD_VENDOR
{ {
.class_code = TUSB_CLASS_VENDOR_SPECIFIC, .class_code = TUSB_CLASS_VENDOR_SPECIFIC,
.subclass = 0xFF, // all subclass
.protocol = 0xFF, // all protocol
.init = vendord_init, .init = vendord_init,
.reset = vendord_reset, .reset = vendord_reset,
.open = vendord_open, .open = vendord_open,
@ -153,12 +171,11 @@ static usbd_class_driver_t const _usbd_driver[] =
#endif #endif
#if CFG_TUD_USBTMC #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, .class_code = TUSB_CLASS_APPLICATION_SPECIFIC,
//.subclass_code = TUD_USBTMC_APP_SUBCLASS .subclass = APP_SUBCLASS_USBTMC,
.protocol = 0xFF, // all protocol
.init = usbtmcd_init_cb, .init = usbtmcd_init_cb,
.reset = usbtmcd_reset_cb, .reset = usbtmcd_reset_cb,
.open = usbtmcd_open_cb, .open = usbtmcd_open_cb,
@ -171,8 +188,10 @@ static usbd_class_driver_t const _usbd_driver[] =
#if CFG_TUD_DFU_RT #if CFG_TUD_DFU_RT
{ {
.class_code = TUD_DFU_APP_CLASS, .class_code = TUSB_CLASS_APPLICATION_SPECIFIC,
//.subclass_code = TUD_DFU_APP_SUBCLASS .subclass = APP_SUBCLASS_DFU_RUNTIME,
.protocol = DFU_PROTOCOL_RT,
.init = dfu_rtd_init, .init = dfu_rtd_init,
.reset = dfu_rtd_reset, .reset = dfu_rtd_reset,
.open = dfu_rtd_open, .open = dfu_rtd_open,
@ -183,11 +202,14 @@ static usbd_class_driver_t const _usbd_driver[] =
}, },
#endif #endif
#if CFG_TUD_NET #if CFG_TUD_NET
#if CFG_TUD_NET != OPT_NET_EEM #if CFG_TUD_NET != OPT_NET_EEM
/* RNDIS management interface */ /* RNDIS management interface */
{ {
.class_code = TUD_RNDIS_ITF_CLASS, .class_code = TUD_RNDIS_ITF_CLASS,
.subclass = TUD_RNDIS_ITF_SUBCLASS,
.protocol = TUD_RNDIS_ITF_PROTOCOL,
.init = netd_init, .init = netd_init,
.reset = netd_reset, .reset = netd_reset,
.open = netd_open, .open = netd_open,
@ -196,10 +218,14 @@ static usbd_class_driver_t const _usbd_driver[] =
.xfer_cb = netd_xfer_cb, .xfer_cb = netd_xfer_cb,
.sof = NULL, .sof = NULL,
}, },
#endif #endif
/* CDC-ECM management interface; CDC-EEM data interface */ /* CDC-ECM management interface; CDC-EEM data interface */
{ {
.class_code = TUSB_CLASS_CDC, .class_code = TUSB_CLASS_CDC,
.subclass = CDC_COMM_SUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL,
.protocol = 0x00,
.init = netd_init, .init = netd_init,
.reset = netd_reset, .reset = netd_reset,
#if CFG_TUD_NET == OPT_NET_EEM #if CFG_TUD_NET == OPT_NET_EEM
@ -212,10 +238,14 @@ static usbd_class_driver_t const _usbd_driver[] =
.xfer_cb = netd_xfer_cb, .xfer_cb = netd_xfer_cb,
.sof = NULL, .sof = NULL,
}, },
/* RNDIS/CDC-ECM data interface */ /* 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, .class_code = TUSB_CLASS_CDC_DATA,
.subclass = 0x00,
.protocol = 0x00,
.init = netd_init_data, .init = netd_init_data,
.reset = NULL, .reset = NULL,
.open = netd_open_data, .open = netd_open_data,
@ -224,8 +254,8 @@ static usbd_class_driver_t const _usbd_driver[] =
.xfer_cb = netd_xfer_cb, .xfer_cb = netd_xfer_cb,
.sof = NULL, .sof = NULL,
}, },
#endif
#endif #endif
#endif
}; };
enum { USBD_CLASS_DRIVER_COUNT = TU_ARRAY_SIZE(_usbd_driver) }; enum { USBD_CLASS_DRIVER_COUNT = TU_ARRAY_SIZE(_usbd_driver) };

View File

@ -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, // Interface number, number of endpoints, EP string index, USB_TMC_PROTOCOL*, bulk-out endpoint ID,
// bulk-in endpoint ID // bulk-in endpoint ID
#define TUD_USBTMC_IF_DESCRIPTOR(_itfnum, _bNumEndpoints, _stridx, _itfProtocol) \ #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 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_IF_DESCRIPTOR_LEN 9u
#define TUD_USBTMC_BULK_DESCRIPTORS(_epout, _epin, _bulk_epsize) \ #define TUD_USBTMC_BULK_DESCRIPTORS(_epout, _epin, _bulk_epsize) \
/* Endpoint Out */ \ /* Endpoint Out */ \
7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_bulk_epsize), 0u, \ 7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_bulk_epsize), 0u, \
/* Endpoint In */ \ /* Endpoint In */ \
7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_BULK, U16_TO_U8S_LE(_bulk_epsize), 0u 7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_BULK, U16_TO_U8S_LE(_bulk_epsize), 0u
#define TUD_USBTMC_BULK_DESCRIPTORS_LEN (7u+7u) #define TUD_USBTMC_BULK_DESCRIPTORS_LEN (7u+7u)
/* optional interrupt endpoint */ \ /* optional interrupt endpoint */ \
// _int_pollingInterval : for LS/FS, expressed in frames (1ms each). 16 may be a good number? // _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 ) \ #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) #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 */ #define TUD_RNDIS_ITF_PROTOCOL 0xFF /* CDC_COMM_PROTOCOL_MICROSOFT_RNDIS */
#else #else
/* Windows 7+ */ /* 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_SUBCLASS 0x01
#define TUD_RNDIS_ITF_PROTOCOL 0x03 #define TUD_RNDIS_ITF_PROTOCOL 0x03
#endif #endif