summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2024-01-14 18:49:05 +0800
committersakumisu <[email protected]>2024-01-14 18:49:41 +0800
commitb773cecd2eff3d71250c00064d240c13e1c6d1d6 (patch)
tree638d154eb765150712f825483d0f88704f1abed7
parentc4a65146e83a670c0fdaa239f4f7894db9ee19bd (diff)
add ecm device write and read api
-rw-r--r--class/cdc/usbd_cdc_ecm.c33
-rw-r--r--class/cdc/usbd_cdc_ecm.h12
-rw-r--r--demo/cdc_ecm_template.c2
3 files changed, 37 insertions, 10 deletions
diff --git a/class/cdc/usbd_cdc_ecm.c b/class/cdc/usbd_cdc_ecm.c
index 86198f92..d9be91d4 100644
--- a/class/cdc/usbd_cdc_ecm.c
+++ b/class/cdc/usbd_cdc_ecm.c
@@ -157,6 +157,30 @@ void cdc_ecm_int_in(uint8_t ep, uint32_t nbytes)
}
}
+uint8_t *usbd_cdc_ecm_get_tx_buffer(void)
+{
+ return g_cdc_ecm_tx_buffer;
+}
+
+int usbd_cdc_ecm_start_write(uint32_t length)
+{
+ if (g_cdc_ecm_tx_data_length > 0) {
+ return -USB_ERR_BUSY;
+ }
+
+ g_cdc_ecm_tx_data_length = length;
+
+ USB_LOG_DBG("txlen:%d\r\n", g_cdc_ecm_tx_data_length);
+ return usbd_ep_start_write(cdc_ecm_ep_data[CDC_ECM_IN_EP_IDX].ep_addr, g_cdc_ecm_tx_buffer, g_cdc_ecm_tx_data_length);
+}
+
+void usbd_cdc_ecm_start_read_next(void)
+{
+ g_cdc_ecm_rx_data_length = 0;
+ g_cdc_ecm_rx_data_buffer = NULL;
+ usbd_ep_start_read(cdc_ecm_ep_data[CDC_ECM_OUT_EP_IDX].ep_addr, g_cdc_ecm_rx_buffer, CDC_ECM_MAX_PACKET_SIZE);
+}
+
#ifdef CONFIG_USBDEV_CDC_ECM_USING_LWIP
struct pbuf *usbd_cdc_ecm_eth_rx(void)
{
@@ -167,16 +191,14 @@ struct pbuf *usbd_cdc_ecm_eth_rx(void)
}
p = pbuf_alloc(PBUF_RAW, g_cdc_ecm_rx_data_length, PBUF_POOL);
if (p == NULL) {
+ usbd_cdc_ecm_start_read_next();
return NULL;
}
memcpy(p->payload, (uint8_t *)g_cdc_ecm_rx_buffer, g_cdc_ecm_rx_data_length);
p->len = g_cdc_ecm_rx_data_length;
USB_LOG_DBG("rxlen:%d\r\n", g_cdc_ecm_rx_data_length);
- g_cdc_ecm_rx_data_length = 0;
- g_cdc_ecm_rx_data_buffer = NULL;
- usbd_ep_start_read(cdc_ecm_ep_data[CDC_ECM_OUT_EP_IDX].ep_addr, g_cdc_ecm_rx_buffer, CDC_ECM_MAX_PACKET_SIZE);
-
+ usbd_cdc_ecm_start_read_next();
return p;
}
@@ -201,8 +223,7 @@ int usbd_cdc_ecm_eth_tx(struct pbuf *p)
g_cdc_ecm_tx_data_length = p->tot_len;
- USB_LOG_DBG("txlen:%d\r\n", g_cdc_ecm_tx_data_length);
- return usbd_ep_start_write(cdc_ecm_ep_data[CDC_ECM_IN_EP_IDX].ep_addr, g_cdc_ecm_tx_buffer, g_cdc_ecm_tx_data_length);
+ return usbd_cdc_ecm_start_write(g_cdc_ecm_tx_data_length);
}
#endif
diff --git a/class/cdc/usbd_cdc_ecm.h b/class/cdc/usbd_cdc_ecm.h
index 8381b1a5..9859fe7c 100644
--- a/class/cdc/usbd_cdc_ecm.h
+++ b/class/cdc/usbd_cdc_ecm.h
@@ -14,17 +14,23 @@ extern "C" {
/* Ethernet Maximum Segment size, typically 1514 bytes */
#define CONFIG_CDC_ECM_ETH_MAX_SEGSZE 1514U
-#define CONFIG_USBDEV_CDC_ECM_USING_LWIP
/* Init cdc ecm interface driver */
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);
/* Setup request command callback api */
void usbd_cdc_ecm_set_connect_speed(uint32_t speed[2]);
-void usbd_cdc_ecm_data_recv_done(void);
+
+/* Api for eth only without any net stack */
+uint8_t *usbd_cdc_ecm_get_tx_buffer(void);
+void usbd_cdc_ecm_send_done(void);
+int usbd_cdc_ecm_start_write(uint32_t length);
+void usbd_cdc_ecm_data_recv_done(uint8_t *buf, uint32_t len);
+void usbd_cdc_ecm_start_read_next(void);
#ifdef CONFIG_USBDEV_CDC_ECM_USING_LWIP
-#include <lwip/pbuf.h>
+#include "lwip/netif.h"
+#include "lwip/pbuf.h"
struct pbuf *usbd_cdc_ecm_eth_rx(void);
int usbd_cdc_ecm_eth_tx(struct pbuf *p);
#endif
diff --git a/demo/cdc_ecm_template.c b/demo/cdc_ecm_template.c
index 8eb6d03f..87300078 100644
--- a/demo/cdc_ecm_template.c
+++ b/demo/cdc_ecm_template.c
@@ -221,7 +221,7 @@ void cdc_ecm_lwip_init(void)
// while (dnserv_init(&ipaddr, PORT_DNS, dns_query_proc)) {}
}
-void usbd_cdc_ecm_data_recv_done(void)
+void usbd_cdc_ecm_data_recv_done(uint8_t *buf, uint32_t len)
{
}