Просмотр исходного кода

update(demo): add cdc simple transfer for winusb2.0+cdc demo

Signed-off-by: sakumisu <1203593632@qq.com>
sakumisu 11 месяцев назад
Родитель
Сommit
68434ccf7d
1 измененных файлов с 49 добавлено и 2 удалено
  1. 49 2
      demo/winusb2.0_cdc_template.c

+ 49 - 2
demo/winusb2.0_cdc_template.c

@@ -334,6 +334,7 @@ static void usbd_event_handler(uint8_t busid, uint8_t event)
             ep_tx_busy_flag = false;
             /* setup first out ep read transfer */
             usbd_ep_start_read(busid, WINUSB_OUT_EP, read_buffer, 2048);
+            usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048);
             break;
         case USBD_EVENT_SET_REMOTE_WAKEUP:
             break;
@@ -369,6 +370,30 @@ void usbd_winusb_in(uint8_t busid, uint8_t ep, uint32_t nbytes)
     }
 }
 
+void usbd_cdc_acm_out(uint8_t busid, uint8_t ep, uint32_t nbytes)
+{
+    USB_LOG_RAW("actual out len:%d\r\n", nbytes);
+    // for (int i = 0; i < 100; i++) {
+    //     printf("%02x ", read_buffer[i]);
+    // }
+    // printf("\r\n");
+    usbd_ep_start_write(busid, CDC_IN_EP, read_buffer, nbytes);
+    /* setup next out ep read transfer */
+    usbd_ep_start_read(busid, CDC_OUT_EP, read_buffer, 2048);
+}
+
+void usbd_cdc_acm_in(uint8_t busid, uint8_t ep, uint32_t nbytes)
+{
+    USB_LOG_RAW("actual in len:%d\r\n", nbytes);
+
+    if ((nbytes % usbd_get_ep_mps(busid, ep)) == 0 && nbytes) {
+        /* send zlp */
+        usbd_ep_start_write(busid, CDC_IN_EP, NULL, 0);
+    } else {
+        ep_tx_busy_flag = false;
+    }
+}
+
 struct usbd_endpoint winusb_out_ep1 = {
     .ep_addr = WINUSB_OUT_EP,
     .ep_cb = usbd_winusb_out
@@ -381,12 +406,12 @@ struct usbd_endpoint winusb_in_ep1 = {
 
 static struct usbd_endpoint cdc_out_ep = {
     .ep_addr = CDC_OUT_EP,
-    .ep_cb = NULL
+    .ep_cb = usbd_cdc_acm_out
 };
 
 static struct usbd_endpoint cdc_in_ep = {
     .ep_addr = CDC_IN_EP,
-    .ep_cb = NULL
+    .ep_cb = usbd_cdc_acm_in
 };
 
 struct usbd_interface winusb_intf;
@@ -416,4 +441,26 @@ void winusbv2_init(uint8_t busid, uintptr_t reg_base)
     usbd_add_endpoint(busid, &cdc_in_ep);
 
     usbd_initialize(busid, reg_base, usbd_event_handler);
+}
+
+volatile uint8_t dtr_enable = 0;
+
+void usbd_cdc_acm_set_dtr(uint8_t busid, uint8_t intf, bool dtr)
+{
+    if (dtr) {
+        dtr_enable = 1;
+    } else {
+        dtr_enable = 0;
+    }
+}
+
+void cdc_acm_data_send_with_dtr_test(uint8_t busid)
+{
+    if (dtr_enable) {
+        memset(&write_buffer[10], 'a', 2038);
+        ep_tx_busy_flag = true;
+        usbd_ep_start_write(busid, CDC_IN_EP, write_buffer, 2048);
+        while (ep_tx_busy_flag) {
+        }
+    }
 }