@@ -334,6 +334,7 @@ static void usbd_event_handler(uint8_t busid, uint8_t event)
334334 ep_tx_busy_flag = false;
335335 /* setup first out ep read transfer */
336336 usbd_ep_start_read (busid , WINUSB_OUT_EP , read_buffer , 2048 );
337+ usbd_ep_start_read (busid , CDC_OUT_EP , read_buffer , 2048 );
337338 break ;
338339 case USBD_EVENT_SET_REMOTE_WAKEUP :
339340 break ;
@@ -369,6 +370,30 @@ void usbd_winusb_in(uint8_t busid, uint8_t ep, uint32_t nbytes)
369370 }
370371}
371372
373+ void usbd_cdc_acm_out (uint8_t busid , uint8_t ep , uint32_t nbytes )
374+ {
375+ USB_LOG_RAW ("actual out len:%d\r\n" , nbytes );
376+ // for (int i = 0; i < 100; i++) {
377+ // printf("%02x ", read_buffer[i]);
378+ // }
379+ // printf("\r\n");
380+ usbd_ep_start_write (busid , CDC_IN_EP , read_buffer , nbytes );
381+ /* setup next out ep read transfer */
382+ usbd_ep_start_read (busid , CDC_OUT_EP , read_buffer , 2048 );
383+ }
384+
385+ void usbd_cdc_acm_in (uint8_t busid , uint8_t ep , uint32_t nbytes )
386+ {
387+ USB_LOG_RAW ("actual in len:%d\r\n" , nbytes );
388+
389+ if ((nbytes % usbd_get_ep_mps (busid , ep )) == 0 && nbytes ) {
390+ /* send zlp */
391+ usbd_ep_start_write (busid , CDC_IN_EP , NULL , 0 );
392+ } else {
393+ ep_tx_busy_flag = false;
394+ }
395+ }
396+
372397struct usbd_endpoint winusb_out_ep1 = {
373398 .ep_addr = WINUSB_OUT_EP ,
374399 .ep_cb = usbd_winusb_out
@@ -381,12 +406,12 @@ struct usbd_endpoint winusb_in_ep1 = {
381406
382407static struct usbd_endpoint cdc_out_ep = {
383408 .ep_addr = CDC_OUT_EP ,
384- .ep_cb = NULL
409+ .ep_cb = usbd_cdc_acm_out
385410};
386411
387412static struct usbd_endpoint cdc_in_ep = {
388413 .ep_addr = CDC_IN_EP ,
389- .ep_cb = NULL
414+ .ep_cb = usbd_cdc_acm_in
390415};
391416
392417struct usbd_interface winusb_intf ;
@@ -416,4 +441,26 @@ void winusbv2_init(uint8_t busid, uintptr_t reg_base)
416441 usbd_add_endpoint (busid , & cdc_in_ep );
417442
418443 usbd_initialize (busid , reg_base , usbd_event_handler );
444+ }
445+
446+ volatile uint8_t dtr_enable = 0 ;
447+
448+ void usbd_cdc_acm_set_dtr (uint8_t busid , uint8_t intf , bool dtr )
449+ {
450+ if (dtr ) {
451+ dtr_enable = 1 ;
452+ } else {
453+ dtr_enable = 0 ;
454+ }
455+ }
456+
457+ void cdc_acm_data_send_with_dtr_test (uint8_t busid )
458+ {
459+ if (dtr_enable ) {
460+ memset (& write_buffer [10 ], 'a' , 2038 );
461+ ep_tx_busy_flag = true;
462+ usbd_ep_start_write (busid , CDC_IN_EP , write_buffer , 2048 );
463+ while (ep_tx_busy_flag ) {
464+ }
465+ }
419466}
0 commit comments