Skip to content

Commit 3491b36

Browse files
committed
update(demo): wait done in linkoutput_fn for rndis & ecm, retransmission in lwip costs too much time
Signed-off-by: sakumisu <[email protected]>
1 parent 6516a47 commit 3491b36

File tree

2 files changed

+80
-38
lines changed

2 files changed

+80
-38
lines changed

demo/cdc_ecm_template.c

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,17 @@
1717
#endif
1818

1919
/*!< endpoint address */
20-
#define CDC_IN_EP 0x81
21-
#define CDC_OUT_EP 0x02
22-
#define CDC_INT_EP 0x83
20+
#define CDC_IN_EP 0x81
21+
#define CDC_OUT_EP 0x02
22+
#define CDC_INT_EP 0x83
2323

2424
#define USBD_VID 0xFFFF
2525
#define USBD_PID 0xFFFF
2626
#define USBD_MAX_POWER 100
2727
#define USBD_LANGID_STRING 1033
2828

2929
/*!< config descriptor size */
30-
#define USB_CONFIG_SIZE (9 + CDC_ECM_DESCRIPTOR_LEN)
30+
#define USB_CONFIG_SIZE (9 + CDC_ECM_DESCRIPTOR_LEN)
3131

3232
#ifdef CONFIG_USB_HS
3333
#define CDC_MAX_MPS 512
@@ -38,7 +38,7 @@
3838
#define CDC_ECM_ETH_STATISTICS_BITMAP 0x00000000
3939

4040
/* str idx = 4 is for mac address: aa:bb:cc:dd:ee:ff*/
41-
#define CDC_ECM_MAC_STRING_INDEX 4
41+
#define CDC_ECM_MAC_STRING_INDEX 4
4242

4343
#ifdef CONFIG_USBDEV_ADVANCE_DESC
4444
static const uint8_t device_descriptor[] = {
@@ -228,7 +228,7 @@ const ip_addr_t ipaddr = IPADDR4_INIT_BYTES(IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADD
228228
const ip_addr_t netmask = IPADDR4_INIT_BYTES(NETMASK_ADDR0, NETMASK_ADDR1, NETMASK_ADDR2, NETMASK_ADDR3);
229229
const ip_addr_t gateway = IPADDR4_INIT_BYTES(GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
230230

231-
#define NUM_DHCP_ENTRY 3
231+
#define NUM_DHCP_ENTRY 3
232232

233233
static dhcp_entry_t entries[NUM_DHCP_ENTRY] = {
234234
/* mac ip address subnet mask lease time */
@@ -248,27 +248,41 @@ static dhcp_config_t dhcp_config = {
248248

249249
static bool dns_query_proc(const char *name, ip_addr_t *addr)
250250
{
251-
if (strcmp(name, "rndis.cherry") == 0 || strcmp(name, "www.rndis.cherry") == 0) {
252-
addr->addr = *(uint32_t *)ipaddr;
251+
if (strcmp(name, "cdc_ecm.cherry") == 0 || strcmp(name, "www.cdc_ecm.cherry") == 0) {
252+
addr->addr = ipaddr.addr;
253253
return true;
254254
}
255255
return false;
256256
}
257257

258+
volatile bool cdc_ecm_tx_done = false;
259+
260+
void usbd_cdc_ecm_data_send_done(uint32_t len)
261+
{
262+
cdc_ecm_tx_done = true; // suggest you to use semaphore in os
263+
}
264+
265+
void usbd_cdc_ecm_data_recv_done(uint32_t len)
266+
{
267+
}
268+
258269
static struct netif cdc_ecm_netif; //network interface
259270

260271
/* Network interface name */
261272
#define IFNAME0 'E'
262273
#define IFNAME1 'X'
263274

264-
static err_t linkoutput_fn(struct netif *netif, struct pbuf *p)
275+
err_t linkoutput_fn(struct netif *netif, struct pbuf *p)
265276
{
266-
static int ret;
277+
int ret;
267278

279+
cdc_ecm_tx_done = false;
268280
ret = usbd_cdc_ecm_eth_tx(p);
269-
if (ret == 0)
281+
if (ret == 0) {
282+
while (!cdc_ecm_tx_done) {
283+
}
270284
return ERR_OK;
271-
else
285+
} else
272286
return ERR_BUF;
273287
}
274288

@@ -288,8 +302,8 @@ err_t cdc_ecm_if_init(struct netif *netif)
288302

289303
err_t cdc_ecm_if_input(struct netif *netif)
290304
{
291-
static err_t err;
292-
static struct pbuf *p;
305+
err_t err;
306+
struct pbuf *p;
293307

294308
p = usbd_cdc_ecm_eth_rx();
295309
if (p != NULL) {
@@ -318,13 +332,11 @@ void cdc_ecm_lwip_init(void)
318332
while (!netif_is_up(netif)) {
319333
}
320334

321-
while (dhserv_init(&dhcp_config)) {}
322-
323-
while (dnserv_init(IP_ADDR_ANY, 53, dns_query_proc)) {}
324-
}
335+
while (dhserv_init(&dhcp_config)) {
336+
}
325337

326-
void usbd_cdc_ecm_data_recv_done(uint32_t len)
327-
{
338+
while (dnserv_init(IP_ADDR_ANY, 53, dns_query_proc)) {
339+
}
328340
}
329341

330342
void cdc_ecm_input_poll(void)

demo/cdc_rndis_template.c

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ const ip_addr_t ipaddr = IPADDR4_INIT_BYTES(IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADD
200200
const ip_addr_t netmask = IPADDR4_INIT_BYTES(NETMASK_ADDR0, NETMASK_ADDR1, NETMASK_ADDR2, NETMASK_ADDR3);
201201
const ip_addr_t gateway = IPADDR4_INIT_BYTES(GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
202202

203-
#define NUM_DHCP_ENTRY 3
203+
#define NUM_DHCP_ENTRY 3
204204

205205
static dhcp_entry_t entries[NUM_DHCP_ENTRY] = {
206206
/* mac ip address subnet mask lease time */
@@ -221,12 +221,19 @@ static dhcp_config_t dhcp_config = {
221221
static bool dns_query_proc(const char *name, ip_addr_t *addr)
222222
{
223223
if (strcmp(name, "rndis.cherry") == 0 || strcmp(name, "www.rndis.cherry") == 0) {
224-
addr->addr = *(uint32_t *)ipaddr;
224+
addr->addr = ipaddr.addr;
225225
return true;
226226
}
227227
return false;
228228
}
229229

230+
volatile bool rndis_tx_done = false;
231+
232+
void usbd_rndis_data_send_done(uint32_t len)
233+
{
234+
rndis_tx_done = true; // suggest you to use semaphore in os
235+
}
236+
230237
#ifdef RT_USING_LWIP
231238
#include <rtthread.h>
232239
#include <rtdevice.h>
@@ -240,13 +247,11 @@ static rt_err_t rt_usbd_rndis_control(rt_device_t dev, int cmd, void *args)
240247
case NIOCTL_GADDR:
241248

242249
/* get mac address */
243-
if (args)
244-
{
250+
if (args) {
245251
uint8_t *mac_dev = (uint8_t *)args;
246252
rt_memcpy(mac_dev, mac, 6);
247253
mac_dev[5] = ~mac_dev[5]; /* device mac can't same as host. */
248-
}
249-
else
254+
} else
250255
return -RT_ERROR;
251256

252257
break;
@@ -265,12 +270,16 @@ struct pbuf *rt_usbd_rndis_eth_rx(rt_device_t dev)
265270

266271
rt_err_t rt_usbd_rndis_eth_tx(rt_device_t dev, struct pbuf *p)
267272
{
268-
return usbd_rndis_eth_tx(p);
269-
}
273+
int ret;
270274

271-
void usbd_rndis_data_recv_done(uint32_t len)
272-
{
273-
eth_device_ready(&rndis_dev);
275+
rndis_tx_done = false;
276+
ret = usbd_rndis_eth_tx(p);
277+
if (ret == 0) {
278+
while (!rndis_tx_done) {
279+
}
280+
return RT_EOK;
281+
} else
282+
return -RT_ERROR;
274283
}
275284

276285
void rndis_lwip_init(void)
@@ -282,7 +291,22 @@ void rndis_lwip_init(void)
282291
eth_device_init(&rndis_dev, "u0");
283292

284293
eth_device_linkchange(&rndis_dev, RT_FALSE);
294+
295+
while (!netif_is_up(rndis_dev.netif)) {
296+
}
297+
298+
while (dhserv_init(&dhcp_config)) {
299+
}
300+
301+
while (dnserv_init(IP_ADDR_ANY, 53, dns_query_proc)) {
302+
}
285303
}
304+
305+
void usbd_rndis_data_recv_done(uint32_t len)
306+
{
307+
eth_device_ready(&rndis_dev);
308+
}
309+
286310
#else
287311
#include "netif/etharp.h"
288312
#include "lwip/init.h"
@@ -297,12 +321,15 @@ static struct netif rndis_netif; //network interface
297321

298322
err_t linkoutput_fn(struct netif *netif, struct pbuf *p)
299323
{
300-
static int ret;
324+
int ret;
301325

326+
rndis_tx_done = false;
302327
ret = usbd_rndis_eth_tx(p);
303-
if (ret == 0)
328+
if (ret == 0) {
329+
while (!rndis_tx_done) {
330+
}
304331
return ERR_OK;
305-
else
332+
} else
306333
return ERR_BUF;
307334
}
308335

@@ -322,8 +349,8 @@ err_t rndisif_init(struct netif *netif)
322349

323350
err_t rndisif_input(struct netif *netif)
324351
{
325-
static err_t err;
326-
static struct pbuf *p;
352+
err_t err;
353+
struct pbuf *p;
327354

328355
p = usbd_rndis_eth_rx();
329356
if (p != NULL) {
@@ -352,13 +379,16 @@ void rndis_lwip_init(void)
352379
while (!netif_is_up(netif)) {
353380
}
354381

355-
while (dhserv_init(&dhcp_config)) {}
382+
while (dhserv_init(&dhcp_config)) {
383+
}
356384

357-
while (dnserv_init(IP_ADDR_ANY, 53, dns_query_proc)) {}
385+
while (dnserv_init(IP_ADDR_ANY, 53, dns_query_proc)) {
386+
}
358387
}
359388

360389
void usbd_rndis_data_recv_done(uint32_t len)
361390
{
391+
362392
}
363393

364394
void rndis_input_poll(void)

0 commit comments

Comments
 (0)