summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2025-05-08 10:03:44 +0800
committersakumisu <[email protected]>2025-05-08 22:30:52 +0800
commite0289d79f90f81f134eb60c0ac28cde80af65b09 (patch)
tree69b5d23956b42d057a32e6b03c712692d31390db
parent6516a470c8440b7a8010e6293520386ce99a8c03 (diff)
update(demo): wait done in linkoutput_fn for rndis & ecm, retransmission in lwip costs too much time
Signed-off-by: sakumisu <[email protected]>
-rw-r--r--demo/cdc_ecm_template.c62
-rw-r--r--demo/cdc_rndis_template.c76
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 (dnserv_init(IP_ADDR_ANY, 53, dns_query_proc)) {}
-}
+ while (dhserv_init(&dhcp_config)) {
+ }
-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 <rtthread.h>
#include <rtdevice.h>
@@ -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)