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 +#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) { }