summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2025-02-16 20:29:05 +0800
committersakumisu <[email protected]>2025-02-16 20:29:05 +0800
commit68434ccf7d17061b83b890404d10f17ccc9d41a3 (patch)
treef1dd26db34887ceb22554da38eaf29c8e67f34a1
parent17a591f719650ffe66ef1460df62062d93bdd461 (diff)
update(demo): add cdc simple transfer for winusb2.0+cdc demo
Signed-off-by: sakumisu <[email protected]>
-rw-r--r--demo/winusb2.0_cdc_template.c51
1 files changed, 49 insertions, 2 deletions
diff --git a/demo/winusb2.0_cdc_template.c b/demo/winusb2.0_cdc_template.c
index 9107be34..34e646ef 100644
--- a/demo/winusb2.0_cdc_template.c
+++ b/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) {
+ }
+ }
} \ No newline at end of file