7
7
#include "usbd_cdc_ecm.h"
8
8
9
9
#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
12
15
13
16
/* Describe EndPoints configuration */
14
17
static struct usbd_endpoint cdc_ecm_ep_data [3 ];
15
18
19
+ #ifdef CONFIG_USBDEV_CDC_ECM_USING_LWIP
16
20
static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_cdc_ecm_rx_buffer [CONFIG_CDC_ECM_ETH_MAX_SEGSZE ];
17
21
static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_cdc_ecm_tx_buffer [CONFIG_CDC_ECM_ETH_MAX_SEGSZE ];
22
+ #endif
18
23
static USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t g_cdc_ecm_notify_buf [16 ];
19
24
20
- volatile uint8_t * g_cdc_ecm_rx_data_buffer = NULL ;
21
25
volatile uint32_t g_cdc_ecm_rx_data_length = 0 ;
22
26
volatile uint32_t g_cdc_ecm_tx_data_length = 0 ;
23
27
@@ -68,8 +72,10 @@ void usbd_cdc_ecm_send_notify(uint8_t notifycode, uint8_t value, uint32_t *speed
68
72
break ;
69
73
}
70
74
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
+ }
73
79
}
74
80
}
75
81
@@ -93,11 +99,11 @@ static int cdc_ecm_class_interface_request_handler(uint8_t busid, struct usb_set
93
99
* bit3 Broadcast
94
100
* bit4 Multicast
95
101
*/
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
101
107
break ;
102
108
default :
103
109
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)
117
123
g_current_net_status = 0 ;
118
124
g_cdc_ecm_rx_data_length = 0 ;
119
125
g_cdc_ecm_tx_data_length = 0 ;
120
- g_cdc_ecm_rx_data_buffer = NULL ;
121
126
break ;
122
127
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
124
131
break ;
125
132
126
133
default :
@@ -132,14 +139,8 @@ void cdc_ecm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes)
132
139
{
133
140
(void )busid ;
134
141
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 );
143
144
}
144
145
145
146
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)
150
151
/* send zlp */
151
152
usbd_ep_start_write (0 , ep , NULL , 0 );
152
153
} else {
154
+ usbd_cdc_ecm_data_send_done (g_cdc_ecm_tx_data_length );
153
155
g_cdc_ecm_tx_data_length = 0 ;
154
156
}
155
157
}
@@ -160,49 +162,58 @@ void cdc_ecm_int_in(uint8_t busid, uint8_t ep, uint32_t nbytes)
160
162
(void )ep ;
161
163
(void )nbytes ;
162
164
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 ;
166
170
}
167
171
}
168
172
169
173
int usbd_cdc_ecm_start_write (uint8_t * buf , uint32_t len )
170
174
{
175
+ if (!usb_device_is_configured (0 )) {
176
+ return - USB_ERR_NODEV ;
177
+ }
178
+
171
179
if (g_cdc_ecm_tx_data_length > 0 ) {
172
180
return - USB_ERR_BUSY ;
173
181
}
174
182
175
183
g_cdc_ecm_tx_data_length = len ;
176
184
177
185
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 );
179
187
}
180
188
181
- void usbd_cdc_ecm_start_read_next ( void )
189
+ int usbd_cdc_ecm_start_read ( uint8_t * buf , uint32_t len )
182
190
{
191
+ if (!usb_device_is_configured (0 )) {
192
+ return - USB_ERR_NODEV ;
193
+ }
194
+
183
195
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 );
186
197
}
187
198
188
199
#ifdef CONFIG_USBDEV_CDC_ECM_USING_LWIP
189
200
struct pbuf * usbd_cdc_ecm_eth_rx (void )
190
201
{
191
202
struct pbuf * p ;
192
203
193
- if (g_cdc_ecm_rx_data_buffer == NULL ) {
204
+ if (g_cdc_ecm_rx_data_length == 0 ) {
194
205
return NULL ;
195
206
}
196
207
p = pbuf_alloc (PBUF_RAW , g_cdc_ecm_rx_data_length , PBUF_POOL );
197
208
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 );
199
210
return NULL ;
200
211
}
201
212
usb_memcpy (p -> payload , (uint8_t * )g_cdc_ecm_rx_buffer , g_cdc_ecm_rx_data_length );
202
213
p -> len = g_cdc_ecm_rx_data_length ;
203
214
204
215
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 );
206
217
return p ;
207
218
}
208
219
@@ -250,13 +261,24 @@ struct usbd_interface *usbd_cdc_ecm_init_intf(struct usbd_interface *intf, const
250
261
return intf ;
251
262
}
252
263
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 )
254
277
{
255
- memcpy ( g_connect_speed_table , speed , 8 ) ;
278
+ ( void ) len ;
256
279
}
257
280
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 )
259
282
{
260
- (void )buf ;
261
283
(void )len ;
262
284
}
0 commit comments