From bb0df2740e251ce1046afcfdb2cad2657c881d0c Mon Sep 17 00:00:00 2001 From: Jacob Potter Date: Sat, 31 Oct 2020 11:03:55 -0600 Subject: Add CDC NCM driver --- src/device/usbd.c | 13 +++++++++++++ src/device/usbd.h | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) (limited to 'src/device') diff --git a/src/device/usbd.c b/src/device/usbd.c index 90edc3dde..2edcf79f3 100644 --- a/src/device/usbd.c +++ b/src/device/usbd.c @@ -220,6 +220,19 @@ static usbd_class_driver_t const _usbd_driver[] = .sof = NULL }, #endif + + #if CFG_TUD_NCM + { + DRIVER_NAME("NCM") + .init = ncmd_init, + .reset = ncmd_reset, + .open = ncmd_open, + .control_request = ncmd_control_request, + .control_complete = ncmd_control_complete, + .xfer_cb = ncmd_xfer_cb, + .sof = NULL + }, + #endif }; enum { BUILTIN_DRIVER_COUNT = TU_ARRAY_SIZE(_usbd_driver) }; diff --git a/src/device/usbd.h b/src/device/usbd.h index 0a446fdc2..45caa7871 100644 --- a/src/device/usbd.h +++ b/src/device/usbd.h @@ -671,6 +671,39 @@ TU_ATTR_WEAK bool tud_vendor_control_complete_cb(uint8_t rhport, tusb_control_re TUD_BTH_PRI_ITF(_itfnum, _stridx, _ep_evt, _ep_evt_size, _ep_evt_interval, _ep_in, _ep_out, _ep_size) \ TUD_BTH_ISO_ITFS(_itfnum + 1, _ep_in + 1, _ep_out + 1, __VA_ARGS__) + +//------------- CDC-NCM -------------// + +// Length of template descriptor +#define TUD_CDC_NCM_DESC_LEN (8+9+5+5+13+6+7+9+9+7+7) + +// CDC-ECM Descriptor Template +// Interface number, description string index, MAC address string index, EP notification address and size, EP data address (out, in), and size, max segment size. +#define TUD_CDC_NCM_DESCRIPTOR(_itfnum, _desc_stridx, _mac_stridx, _ep_notif, _ep_notif_size, _epout, _epin, _epsize, _maxsegmentsize) \ + /* Interface Association */\ + 8, TUSB_DESC_INTERFACE_ASSOCIATION, _itfnum, 2, TUSB_CLASS_CDC, CDC_COMM_SUBCLASS_NETWORK_CONTROL_MODEL, 0, 0,\ + /* CDC Control Interface */\ + 9, TUSB_DESC_INTERFACE, _itfnum, 0, 1, TUSB_CLASS_CDC, CDC_COMM_SUBCLASS_NETWORK_CONTROL_MODEL, 0, _desc_stridx,\ + /* CDC-NCM Header */\ + 5, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_HEADER, U16_TO_U8S_LE(0x0110),\ + /* CDC-NCM Union */\ + 5, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_UNION, _itfnum, (uint8_t)((_itfnum) + 1),\ + /* CDC-ECM Functional Descriptor */\ + 13, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_ETHERNET_NETWORKING, _mac_stridx, 0, 0, 0, 0, U16_TO_U8S_LE(_maxsegmentsize), U16_TO_U8S_LE(0), 0, \ + /* CDC-ECM Functional Descriptor */\ + 6, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_NCM, U16_TO_U8S_LE(0x0100), 0, \ + /* Endpoint Notification */\ + 7, TUSB_DESC_ENDPOINT, _ep_notif, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_ep_notif_size), 1,\ + /* CDC Data Interface (default inactive) */\ + 9, TUSB_DESC_INTERFACE, (uint8_t)((_itfnum)+1), 0, 0, TUSB_CLASS_CDC_DATA, 0, 1, 0,\ + /* CDC Data Interface (alternative active) */\ + 9, TUSB_DESC_INTERFACE, (uint8_t)((_itfnum)+1), 1, 2, TUSB_CLASS_CDC_DATA, 0, 1, 0,\ + /* Endpoint In */\ + 7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0,\ + /* Endpoint Out */\ + 7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0 + + #ifdef __cplusplus } #endif -- cgit v1.3.1 From 226efdcec0d880feb4af3995129b85fae9b8ddb8 Mon Sep 17 00:00:00 2001 From: Jacob Potter Date: Thu, 5 Nov 2020 18:14:56 -0700 Subject: Reduce excessive poll rate on interrupt endpoint --- src/device/usbd.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/device') diff --git a/src/device/usbd.h b/src/device/usbd.h index 45caa7871..c547ceeee 100644 --- a/src/device/usbd.h +++ b/src/device/usbd.h @@ -693,7 +693,7 @@ TU_ATTR_WEAK bool tud_vendor_control_complete_cb(uint8_t rhport, tusb_control_re /* CDC-ECM Functional Descriptor */\ 6, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_NCM, U16_TO_U8S_LE(0x0100), 0, \ /* Endpoint Notification */\ - 7, TUSB_DESC_ENDPOINT, _ep_notif, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_ep_notif_size), 1,\ + 7, TUSB_DESC_ENDPOINT, _ep_notif, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_ep_notif_size), 50,\ /* CDC Data Interface (default inactive) */\ 9, TUSB_DESC_INTERFACE, (uint8_t)((_itfnum)+1), 0, 0, TUSB_CLASS_CDC_DATA, 0, 1, 0,\ /* CDC Data Interface (alternative active) */\ -- cgit v1.3.1 From 3158b323d8d701f70b80dca986f8b0e8e60eba97 Mon Sep 17 00:00:00 2001 From: Jacob Potter Date: Sun, 3 Jan 2021 15:16:54 -0700 Subject: Adapt to new control xfer callback --- src/class/cdc/cdc_ncm_device.c | 12 +++--------- src/class/cdc/cdc_ncm_device.h | 3 +-- src/device/usbd.c | 3 +-- 3 files changed, 5 insertions(+), 13 deletions(-) (limited to 'src/device') diff --git a/src/class/cdc/cdc_ncm_device.c b/src/class/cdc/cdc_ncm_device.c index 4698fa9c2..a8983dd91 100644 --- a/src/class/cdc/cdc_ncm_device.c +++ b/src/class/cdc/cdc_ncm_device.c @@ -292,14 +292,6 @@ uint16_t ncmd_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint1 return drv_len; } -// Invoked when class request DATA stage is finished. -bool ncmd_control_complete(uint8_t rhport, tusb_control_request_t const * request) -{ - (void) rhport; - (void) request; - return true; -} - static void ncm_report() { if (ncm_interface.report_state == REPORT_SPEED) { @@ -317,8 +309,10 @@ static void ncm_report() // Handle class control request // return false to stall control endpoint (e.g unsupported request) -bool ncmd_control_request(uint8_t rhport, tusb_control_request_t const * request) +bool ncmd_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request) { + if ( stage != CONTROL_STAGE_SETUP ) return true; + switch ( request->bmRequestType_bit.type ) { case TUSB_REQ_TYPE_STANDARD: diff --git a/src/class/cdc/cdc_ncm_device.h b/src/class/cdc/cdc_ncm_device.h index 1c767cad2..e6c7237b1 100644 --- a/src/class/cdc/cdc_ncm_device.h +++ b/src/class/cdc/cdc_ncm_device.h @@ -77,8 +77,7 @@ void tud_ncm_link_state_cb(bool state); void ncmd_init (void); void ncmd_reset (uint8_t rhport); uint16_t ncmd_open (uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len); -bool ncmd_control_request (uint8_t rhport, tusb_control_request_t const * request); -bool ncmd_control_complete (uint8_t rhport, tusb_control_request_t const * request); +bool ncmd_control_xfer_cb (uint8_t rhport, uint8_t stage, tusb_control_request_t const * request); bool ncmd_xfer_cb (uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes); #ifdef __cplusplus diff --git a/src/device/usbd.c b/src/device/usbd.c index e2110b7a8..c6124263f 100644 --- a/src/device/usbd.c +++ b/src/device/usbd.c @@ -217,8 +217,7 @@ static usbd_class_driver_t const _usbd_driver[] = .init = ncmd_init, .reset = ncmd_reset, .open = ncmd_open, - .control_request = ncmd_control_request, - .control_complete = ncmd_control_complete, + .control_xfer_cb = ncmd_control_xfer_cb, .xfer_cb = ncmd_xfer_cb, .sof = NULL }, -- cgit v1.3.1