Skip to content

Commit 58d552d

Browse files
committed
update(class/cdc/usbd_cdc_ecm): support transfer api for enet & wireless without lwip
1 parent d0edc30 commit 58d552d

File tree

4 files changed

+69
-49
lines changed

4 files changed

+69
-49
lines changed

class/cdc/usb_cdc.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -524,7 +524,7 @@ struct cdc_ncm_ndp16 {
524524
int_ep, /* bEndpointAddress */ \
525525
0x03, /* bmAttributes */ \
526526
0x08, 0x00, /* wMaxPacketSize */ \
527-
0x10, /* bInterval */ \
527+
0x05, /* bInterval */ \
528528
0x09, /* bLength */ \
529529
USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
530530
(uint8_t)(bFirstInterface + 1), /* bInterfaceNumber */ \
@@ -596,7 +596,7 @@ eth_statistics, wMaxSegmentSize, wNumberMCFilters, bNumberPowerFilters, str_idx)
596596
int_ep, /* bEndpointAddress */ \
597597
0x03, /* bmAttributes */ \
598598
0x10, 0x00, /* wMaxPacketSize */ \
599-
0x10, /* bInterval */ \
599+
0x05, /* bInterval */ \
600600
0x09, /* bLength */ \
601601
USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType */ \
602602
(uint8_t)(bFirstInterface + 1), /* bInterfaceNumber */ \

class/cdc/usbd_cdc_ecm.c

Lines changed: 56 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,21 @@
77
#include "usbd_cdc_ecm.h"
88

99
#define CDC_ECM_OUT_EP_IDX 0
10-
#define CDC_ECM_IN_EP_IDX 1
11-
#define CDC_ECM_INT_EP_IDX 2
10+
#define CDC_ECM_IN_EP_IDX 1
11+
#define CDC_ECM_INT_EP_IDX 2
12+
13+
/* Ethernet Maximum Segment size, typically 1514 bytes */
14+
#define CONFIG_CDC_ECM_ETH_MAX_SEGSZE 1536U
1215

1316
/* Describe EndPoints configuration */
1417
static struct usbd_endpoint cdc_ecm_ep_data[3];
1518

19+
#ifdef CONFIG_USBDEV_CDC_ECM_USING_LWIP
1620
static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_cdc_ecm_rx_buffer[CONFIG_CDC_ECM_ETH_MAX_SEGSZE];
1721
static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_cdc_ecm_tx_buffer[CONFIG_CDC_ECM_ETH_MAX_SEGSZE];
22+
#endif
1823
static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_cdc_ecm_notify_buf[16];
1924

20-
volatile uint8_t *g_cdc_ecm_rx_data_buffer = NULL;
2125
volatile uint32_t g_cdc_ecm_rx_data_length = 0;
2226
volatile uint32_t g_cdc_ecm_tx_data_length = 0;
2327

@@ -68,8 +72,10 @@ void usbd_cdc_ecm_send_notify(uint8_t notifycode, uint8_t value, uint32_t *speed
6872
break;
6973
}
7074

71-
if (bytes2send) {
72-
usbd_ep_start_write(0, cdc_ecm_ep_data[CDC_ECM_INT_EP_IDX].ep_addr, g_cdc_ecm_notify_buf, bytes2send);
75+
if (usb_device_is_configured(0)) {
76+
if (bytes2send) {
77+
usbd_ep_start_write(0, cdc_ecm_ep_data[CDC_ECM_INT_EP_IDX].ep_addr, g_cdc_ecm_notify_buf, bytes2send);
78+
}
7379
}
7480
}
7581

@@ -93,11 +99,11 @@ static int cdc_ecm_class_interface_request_handler(uint8_t busid, struct usb_set
9399
* bit3 Broadcast
94100
* bit4 Multicast
95101
*/
96-
if (g_current_net_status == 0) {
97-
g_current_net_status = 1;
98-
usbd_cdc_ecm_send_notify(CDC_ECM_NOTIFY_CODE_NETWORK_CONNECTION, CDC_ECM_NET_CONNECTED, NULL);
99-
}
100-
102+
#ifdef CONFIG_USBDEV_CDC_ECM_USING_LWIP
103+
g_connect_speed_table[0] = 100000000; /* 100 Mbps */
104+
g_connect_speed_table[1] = 100000000; /* 100 Mbps */
105+
usbd_cdc_ecm_set_connect(true, g_connect_speed_table);
106+
#endif
101107
break;
102108
default:
103109
USB_LOG_WRN("Unhandled CDC ECM Class bRequest 0x%02x\r\n", setup->bRequest);
@@ -117,10 +123,11 @@ void cdc_ecm_notify_handler(uint8_t busid, uint8_t event, void *arg)
117123
g_current_net_status = 0;
118124
g_cdc_ecm_rx_data_length = 0;
119125
g_cdc_ecm_tx_data_length = 0;
120-
g_cdc_ecm_rx_data_buffer = NULL;
121126
break;
122127
case USBD_EVENT_CONFIGURED:
123-
usbd_ep_start_read(0, cdc_ecm_ep_data[CDC_ECM_OUT_EP_IDX].ep_addr, &g_cdc_ecm_rx_buffer[g_cdc_ecm_rx_data_length], usbd_get_ep_mps(busid, cdc_ecm_ep_data[CDC_ECM_OUT_EP_IDX].ep_addr));
128+
#ifdef CONFIG_USBDEV_CDC_ECM_USING_LWIP
129+
usbd_cdc_ecm_start_read(g_cdc_ecm_rx_buffer, CONFIG_CDC_ECM_ETH_MAX_SEGSZE);
130+
#endif
124131
break;
125132

126133
default:
@@ -132,14 +139,8 @@ void cdc_ecm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes)
132139
{
133140
(void)busid;
134141

135-
g_cdc_ecm_rx_data_length += nbytes;
136-
137-
if (nbytes < usbd_get_ep_mps(0, ep)) {
138-
g_cdc_ecm_rx_data_buffer = g_cdc_ecm_rx_buffer;
139-
usbd_cdc_ecm_data_recv_done(g_cdc_ecm_rx_buffer, g_cdc_ecm_rx_data_length);
140-
} else {
141-
usbd_ep_start_read(0, ep, &g_cdc_ecm_rx_buffer[g_cdc_ecm_rx_data_length], usbd_get_ep_mps(0, ep));
142-
}
142+
g_cdc_ecm_rx_data_length = nbytes;
143+
usbd_cdc_ecm_data_recv_done(g_cdc_ecm_rx_data_length);
143144
}
144145

145146
void cdc_ecm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes)
@@ -150,6 +151,7 @@ void cdc_ecm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes)
150151
/* send zlp */
151152
usbd_ep_start_write(0, ep, NULL, 0);
152153
} else {
154+
usbd_cdc_ecm_data_send_done(g_cdc_ecm_tx_data_length);
153155
g_cdc_ecm_tx_data_length = 0;
154156
}
155157
}
@@ -160,49 +162,58 @@ void cdc_ecm_int_in(uint8_t busid, uint8_t ep, uint32_t nbytes)
160162
(void)ep;
161163
(void)nbytes;
162164

163-
if (g_current_net_status == 1) {
164-
g_current_net_status = 2;
165-
usbd_cdc_ecm_send_notify(CDC_ECM_NOTIFY_CODE_NETWORK_CONNECTION, CDC_ECM_NET_CONNECTED, g_connect_speed_table);
165+
if (g_current_net_status == 2) {
166+
g_current_net_status = 3;
167+
usbd_cdc_ecm_send_notify(CDC_ECM_NOTIFY_CODE_CONNECTION_SPEED_CHANGE, 0, g_connect_speed_table);
168+
} else {
169+
g_current_net_status = 0;
166170
}
167171
}
168172

169173
int usbd_cdc_ecm_start_write(uint8_t *buf, uint32_t len)
170174
{
175+
if (!usb_device_is_configured(0)) {
176+
return -USB_ERR_NODEV;
177+
}
178+
171179
if (g_cdc_ecm_tx_data_length > 0) {
172180
return -USB_ERR_BUSY;
173181
}
174182

175183
g_cdc_ecm_tx_data_length = len;
176184

177185
USB_LOG_DBG("txlen:%d\r\n", g_cdc_ecm_tx_data_length);
178-
return usbd_ep_start_write(0, cdc_ecm_ep_data[CDC_ECM_IN_EP_IDX].ep_addr, buf, g_cdc_ecm_tx_data_length);
186+
return usbd_ep_start_write(0, cdc_ecm_ep_data[CDC_ECM_IN_EP_IDX].ep_addr, buf, len);
179187
}
180188

181-
void usbd_cdc_ecm_start_read_next(void)
189+
int usbd_cdc_ecm_start_read(uint8_t *buf, uint32_t len)
182190
{
191+
if (!usb_device_is_configured(0)) {
192+
return -USB_ERR_NODEV;
193+
}
194+
183195
g_cdc_ecm_rx_data_length = 0;
184-
g_cdc_ecm_rx_data_buffer = NULL;
185-
usbd_ep_start_read(0, cdc_ecm_ep_data[CDC_ECM_OUT_EP_IDX].ep_addr, g_cdc_ecm_rx_buffer, usbd_get_ep_mps(0, cdc_ecm_ep_data[CDC_ECM_OUT_EP_IDX].ep_addr));
196+
usbd_ep_start_read(0, cdc_ecm_ep_data[CDC_ECM_OUT_EP_IDX].ep_addr, buf, len);
186197
}
187198

188199
#ifdef CONFIG_USBDEV_CDC_ECM_USING_LWIP
189200
struct pbuf *usbd_cdc_ecm_eth_rx(void)
190201
{
191202
struct pbuf *p;
192203

193-
if (g_cdc_ecm_rx_data_buffer == NULL) {
204+
if (g_cdc_ecm_rx_data_length == 0) {
194205
return NULL;
195206
}
196207
p = pbuf_alloc(PBUF_RAW, g_cdc_ecm_rx_data_length, PBUF_POOL);
197208
if (p == NULL) {
198-
usbd_cdc_ecm_start_read_next();
209+
usbd_cdc_ecm_start_read(g_cdc_ecm_rx_buffer, CONFIG_CDC_ECM_ETH_MAX_SEGSZE);
199210
return NULL;
200211
}
201212
usb_memcpy(p->payload, (uint8_t *)g_cdc_ecm_rx_buffer, g_cdc_ecm_rx_data_length);
202213
p->len = g_cdc_ecm_rx_data_length;
203214

204215
USB_LOG_DBG("rxlen:%d\r\n", g_cdc_ecm_rx_data_length);
205-
usbd_cdc_ecm_start_read_next();
216+
usbd_cdc_ecm_start_read(g_cdc_ecm_rx_buffer, CONFIG_CDC_ECM_ETH_MAX_SEGSZE);
206217
return p;
207218
}
208219

@@ -250,13 +261,24 @@ struct usbd_interface *usbd_cdc_ecm_init_intf(struct usbd_interface *intf, const
250261
return intf;
251262
}
252263

253-
void usbd_cdc_ecm_set_connect_speed(uint32_t speed[2])
264+
void usbd_cdc_ecm_set_connect(bool connect, uint32_t speed[2])
265+
{
266+
if (connect) {
267+
g_current_net_status = 2;
268+
memcpy(g_connect_speed_table, speed, 8);
269+
usbd_cdc_ecm_send_notify(CDC_ECM_NOTIFY_CODE_NETWORK_CONNECTION, CDC_ECM_NET_CONNECTED, NULL);
270+
} else {
271+
g_current_net_status = 1;
272+
usbd_cdc_ecm_send_notify(CDC_ECM_NOTIFY_CODE_NETWORK_CONNECTION, CDC_ECM_NET_DISCONNECTED, NULL);
273+
}
274+
}
275+
276+
__WEAK void usbd_cdc_ecm_data_recv_done(uint32_t len)
254277
{
255-
memcpy(g_connect_speed_table, speed, 8);
278+
(void)len;
256279
}
257280

258-
__WEAK void usbd_cdc_ecm_data_recv_done(uint8_t *buf, uint32_t len)
281+
__WEAK void usbd_cdc_ecm_data_send_done(uint32_t len)
259282
{
260-
(void)buf;
261283
(void)len;
262284
}

class/cdc/usbd_cdc_ecm.h

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,15 @@
1212
extern "C" {
1313
#endif
1414

15-
/* Ethernet Maximum Segment size, typically 1514 bytes */
16-
#define CONFIG_CDC_ECM_ETH_MAX_SEGSZE 1514U
17-
1815
/* Init cdc ecm interface driver */
1916
struct usbd_interface *usbd_cdc_ecm_init_intf(struct usbd_interface *intf, const uint8_t int_ep, const uint8_t out_ep, const uint8_t in_ep);
2017

21-
/* Setup request command callback api */
22-
void usbd_cdc_ecm_set_connect_speed(uint32_t speed[2]);
18+
void usbd_cdc_ecm_set_connect(bool connect, uint32_t speed[2]);
2319

24-
/* Api for eth only without any net stack */
25-
uint8_t *usbd_cdc_ecm_get_tx_buffer(void);
26-
void usbd_cdc_ecm_send_done(void);
20+
void usbd_cdc_ecm_data_recv_done(uint32_t len);
21+
void usbd_cdc_ecm_data_send_done(uint32_t len);
2722
int usbd_cdc_ecm_start_write(uint8_t *buf, uint32_t len);
28-
void usbd_cdc_ecm_data_recv_done(uint8_t *buf, uint32_t len);
29-
void usbd_cdc_ecm_start_read_next(void);
23+
int usbd_cdc_ecm_start_read(uint8_t *buf, uint32_t len);
3024

3125
#ifdef CONFIG_USBDEV_CDC_ECM_USING_LWIP
3226
#include "lwip/netif.h"

demo/cdc_ecm_template.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
#include "usbd_core.h"
77
#include "usbd_cdc_ecm.h"
88

9+
#ifndef CONFIG_USBDEV_CDC_ECM_USING_LWIP
10+
#error "Please enable CONFIG_USBDEV_CDC_ECM_USING_LWIP for this demo"
11+
#endif
12+
913
/*!< endpoint address */
1014
#define CDC_IN_EP 0x81
1115
#define CDC_OUT_EP 0x02
@@ -222,12 +226,12 @@ void cdc_ecm_lwip_init(void)
222226
while (!netif_is_up(netif)) {
223227
}
224228

225-
// while (dhserv_init(&dhcp_config)) {}
229+
while (dhserv_init(&dhcp_config)) {}
226230

227-
// while (dnserv_init(&ipaddr, PORT_DNS, dns_query_proc)) {}
231+
while (dnserv_init(&ipaddr, PORT_DNS, dns_query_proc)) {}
228232
}
229233

230-
void usbd_cdc_ecm_data_recv_done(uint8_t *buf, uint32_t len)
234+
void usbd_cdc_ecm_data_recv_done(uint32_t len)
231235
{
232236
}
233237

0 commit comments

Comments
 (0)