From e0289d79f90f81f134eb60c0ac28cde80af65b09 Mon Sep 17 00:00:00 2001 From: sakumisu <1203593632@qq.com> Date: Thu, 8 May 2025 10:03:44 +0800 Subject: [PATCH] update(demo): wait done in linkoutput_fn for rndis & ecm, retransmission in lwip costs too much time Signed-off-by: sakumisu <1203593632@qq.com> --- demo/cdc_ecm_template.c | 62 +++++++++++++++++++------------- demo/cdc_rndis_template.c | 76 +++++++++++++++++++++++++++------------ 2 files changed, 90 insertions(+), 48 deletions(-) diff --git a/demo/cdc_ecm_template.c b/demo/cdc_ecm_template.c index b573323e..d6ab4e04 100644 --- a/demo/cdc_ecm_template.c +++ b/demo/cdc_ecm_template.c @@ -17,9 +17,9 @@ #endif /*!< endpoint address */ -#define CDC_IN_EP 0x81 -#define CDC_OUT_EP 0x02 -#define CDC_INT_EP 0x83 +#define CDC_IN_EP 0x81 +#define CDC_OUT_EP 0x02 +#define CDC_INT_EP 0x83 #define USBD_VID 0xFFFF #define USBD_PID 0xFFFF @@ -27,7 +27,7 @@ #define USBD_LANGID_STRING 1033 /*!< config descriptor size */ -#define USB_CONFIG_SIZE (9 + CDC_ECM_DESCRIPTOR_LEN) +#define USB_CONFIG_SIZE (9 + CDC_ECM_DESCRIPTOR_LEN) #ifdef CONFIG_USB_HS #define CDC_MAX_MPS 512 @@ -38,7 +38,7 @@ #define CDC_ECM_ETH_STATISTICS_BITMAP 0x00000000 /* str idx = 4 is for mac address: aa:bb:cc:dd:ee:ff*/ -#define CDC_ECM_MAC_STRING_INDEX 4 +#define CDC_ECM_MAC_STRING_INDEX 4 #ifdef CONFIG_USBDEV_ADVANCE_DESC static const uint8_t device_descriptor[] = { @@ -210,7 +210,7 @@ const uint8_t mac[6] = { 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }; #define IP_ADDR0 (uint8_t)192 #define IP_ADDR1 (uint8_t)168 #define IP_ADDR2 (uint8_t)7 -#define IP_ADDR3 (uint8_t)100 +#define IP_ADDR3 (uint8_t)1 /*NETMASK*/ #define NETMASK_ADDR0 (uint8_t)255 @@ -219,16 +219,16 @@ const uint8_t mac[6] = { 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }; #define NETMASK_ADDR3 (uint8_t)0 /*Gateway Address*/ -#define GW_ADDR0 (uint8_t)192 -#define GW_ADDR1 (uint8_t)168 -#define GW_ADDR2 (uint8_t)7 -#define GW_ADDR3 (uint8_t)1 +#define GW_ADDR0 (uint8_t)0 +#define GW_ADDR1 (uint8_t)0 +#define GW_ADDR2 (uint8_t)0 +#define GW_ADDR3 (uint8_t)0 const ip_addr_t ipaddr = IPADDR4_INIT_BYTES(IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3); const ip_addr_t netmask = IPADDR4_INIT_BYTES(NETMASK_ADDR0, NETMASK_ADDR1, NETMASK_ADDR2, NETMASK_ADDR3); const ip_addr_t gateway = IPADDR4_INIT_BYTES(GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3); -#define NUM_DHCP_ENTRY 3 +#define NUM_DHCP_ENTRY 3 static dhcp_entry_t entries[NUM_DHCP_ENTRY] = { /* mac ip address subnet mask lease time */ @@ -248,27 +248,41 @@ static dhcp_config_t dhcp_config = { static bool dns_query_proc(const char *name, ip_addr_t *addr) { - if (strcmp(name, "rndis.cherry") == 0 || strcmp(name, "www.rndis.cherry") == 0) { - addr->addr = *(uint32_t *)ipaddr; + if (strcmp(name, "cdc_ecm.cherry") == 0 || strcmp(name, "www.cdc_ecm.cherry") == 0) { + addr->addr = ipaddr.addr; return true; } return false; } +volatile bool cdc_ecm_tx_done = false; + +void usbd_cdc_ecm_data_send_done(uint32_t len) +{ + cdc_ecm_tx_done = true; // suggest you to use semaphore in os +} + +void usbd_cdc_ecm_data_recv_done(uint32_t len) +{ +} + static struct netif cdc_ecm_netif; //network interface /* Network interface name */ #define IFNAME0 'E' #define IFNAME1 'X' -static err_t linkoutput_fn(struct netif *netif, struct pbuf *p) +err_t linkoutput_fn(struct netif *netif, struct pbuf *p) { - static int ret; + int ret; + cdc_ecm_tx_done = false; ret = usbd_cdc_ecm_eth_tx(p); - if (ret == 0) + if (ret == 0) { + while (!cdc_ecm_tx_done) { + } return ERR_OK; - else + } else return ERR_BUF; } @@ -288,8 +302,8 @@ err_t cdc_ecm_if_init(struct netif *netif) err_t cdc_ecm_if_input(struct netif *netif) { - static err_t err; - static struct pbuf *p; + err_t err; + struct pbuf *p; p = usbd_cdc_ecm_eth_rx(); if (p != NULL) { @@ -318,13 +332,11 @@ void cdc_ecm_lwip_init(void) while (!netif_is_up(netif)) { } - while (dhserv_init(&dhcp_config)) {} + while (dhserv_init(&dhcp_config)) { + } - while (dnserv_init(IP_ADDR_ANY, 53, dns_query_proc)) {} -} - -void usbd_cdc_ecm_data_recv_done(uint32_t len) -{ + while (dnserv_init(IP_ADDR_ANY, 53, dns_query_proc)) { + } } void cdc_ecm_input_poll(void) diff --git a/demo/cdc_rndis_template.c b/demo/cdc_rndis_template.c index 64da832c..b3d78673 100644 --- a/demo/cdc_rndis_template.c +++ b/demo/cdc_rndis_template.c @@ -182,7 +182,7 @@ const uint8_t mac[6] = { 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }; #define IP_ADDR0 (uint8_t)192 #define IP_ADDR1 (uint8_t)168 #define IP_ADDR2 (uint8_t)7 -#define IP_ADDR3 (uint8_t)100 +#define IP_ADDR3 (uint8_t)1 /*NETMASK*/ #define NETMASK_ADDR0 (uint8_t)255 @@ -191,16 +191,16 @@ const uint8_t mac[6] = { 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }; #define NETMASK_ADDR3 (uint8_t)0 /*Gateway Address*/ -#define GW_ADDR0 (uint8_t)192 -#define GW_ADDR1 (uint8_t)168 -#define GW_ADDR2 (uint8_t)7 -#define GW_ADDR3 (uint8_t)1 +#define GW_ADDR0 (uint8_t)0 +#define GW_ADDR1 (uint8_t)0 +#define GW_ADDR2 (uint8_t)0 +#define GW_ADDR3 (uint8_t)0 const ip_addr_t ipaddr = IPADDR4_INIT_BYTES(IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3); const ip_addr_t netmask = IPADDR4_INIT_BYTES(NETMASK_ADDR0, NETMASK_ADDR1, NETMASK_ADDR2, NETMASK_ADDR3); const ip_addr_t gateway = IPADDR4_INIT_BYTES(GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3); -#define NUM_DHCP_ENTRY 3 +#define NUM_DHCP_ENTRY 3 static dhcp_entry_t entries[NUM_DHCP_ENTRY] = { /* mac ip address subnet mask lease time */ @@ -221,12 +221,19 @@ static dhcp_config_t dhcp_config = { static bool dns_query_proc(const char *name, ip_addr_t *addr) { if (strcmp(name, "rndis.cherry") == 0 || strcmp(name, "www.rndis.cherry") == 0) { - addr->addr = *(uint32_t *)ipaddr; + addr->addr = ipaddr.addr; return true; } return false; } +volatile bool rndis_tx_done = false; + +void usbd_rndis_data_send_done(uint32_t len) +{ + rndis_tx_done = true; // suggest you to use semaphore in os +} + #ifdef RT_USING_LWIP #include #include @@ -240,13 +247,11 @@ static rt_err_t rt_usbd_rndis_control(rt_device_t dev, int cmd, void *args) case NIOCTL_GADDR: /* get mac address */ - if (args) - { + if (args) { uint8_t *mac_dev = (uint8_t *)args; rt_memcpy(mac_dev, mac, 6); mac_dev[5] = ~mac_dev[5]; /* device mac can't same as host. */ - } - else + } else return -RT_ERROR; break; @@ -265,12 +270,16 @@ struct pbuf *rt_usbd_rndis_eth_rx(rt_device_t dev) rt_err_t rt_usbd_rndis_eth_tx(rt_device_t dev, struct pbuf *p) { - return usbd_rndis_eth_tx(p); -} + int ret; -void usbd_rndis_data_recv_done(uint32_t len) -{ - eth_device_ready(&rndis_dev); + rndis_tx_done = false; + ret = usbd_rndis_eth_tx(p); + if (ret == 0) { + while (!rndis_tx_done) { + } + return RT_EOK; + } else + return -RT_ERROR; } void rndis_lwip_init(void) @@ -282,7 +291,22 @@ void rndis_lwip_init(void) eth_device_init(&rndis_dev, "u0"); eth_device_linkchange(&rndis_dev, RT_FALSE); + + while (!netif_is_up(rndis_dev.netif)) { + } + + while (dhserv_init(&dhcp_config)) { + } + + while (dnserv_init(IP_ADDR_ANY, 53, dns_query_proc)) { + } } + +void usbd_rndis_data_recv_done(uint32_t len) +{ + eth_device_ready(&rndis_dev); +} + #else #include "netif/etharp.h" #include "lwip/init.h" @@ -297,12 +321,15 @@ static struct netif rndis_netif; //network interface err_t linkoutput_fn(struct netif *netif, struct pbuf *p) { - static int ret; + int ret; + rndis_tx_done = false; ret = usbd_rndis_eth_tx(p); - if (ret == 0) + if (ret == 0) { + while (!rndis_tx_done) { + } return ERR_OK; - else + } else return ERR_BUF; } @@ -322,8 +349,8 @@ err_t rndisif_init(struct netif *netif) err_t rndisif_input(struct netif *netif) { - static err_t err; - static struct pbuf *p; + err_t err; + struct pbuf *p; p = usbd_rndis_eth_rx(); if (p != NULL) { @@ -352,13 +379,16 @@ void rndis_lwip_init(void) while (!netif_is_up(netif)) { } - while (dhserv_init(&dhcp_config)) {} + while (dhserv_init(&dhcp_config)) { + } - while (dnserv_init(IP_ADDR_ANY, 53, dns_query_proc)) {} + while (dnserv_init(IP_ADDR_ANY, 53, dns_query_proc)) { + } } void usbd_rndis_data_recv_done(uint32_t len) { + } void rndis_input_poll(void)