@@ -46,10 +46,13 @@ static TaskHandle_t s_task_handle = NULL;
4646/*!< config descriptor size */
4747#define USB_CONFIG_SIZE (9 + CDC_ACM_DESCRIPTOR_LEN * 4)
4848
49+ #define CDC_FS_MAX_MPS 64
50+ #define CDC_HS_MAX_MPS 512
51+
4952#ifdef CONFIG_USB_HS
50- #define CDC_MAX_MPS 512
53+ #define CDC_MAX_MPS CDC_HS_MAX_MPS
5154#else
52- #define CDC_MAX_MPS 64
55+ #define CDC_MAX_MPS CDC_FS_MAX_MPS
5356#endif
5457
5558typedef struct {
@@ -68,26 +71,42 @@ static ep_status_t s_ep_status[CDC_ACM_CHANNEL_NUM] = {
6871#endif
6972};
7073
74+ #define ALIGN_UP (num , align ) (((num) + ((align) - 1)) & ~((align) - 1))
75+
76+ #define WRITE_BUFFER_SIZE ALIGN_UP(ALIGN_UP(2048, CDC_MAX_MPS), CONFIG_USB_ALIGN_SIZE)
77+
7178#if CONFIG_EXAMPLE_CHERRYUSB_SET_READ_BUFFER_SIZE_MPS
72- #define READ_BUFFER_SIZE CDC_MAX_MPS
79+ #define READ_BUFFER_SIZE ALIGN_UP( CDC_MAX_MPS, CONFIG_USB_ALIGN_SIZE)
7380#else
74- #define READ_BUFFER_SIZE 2048
81+ #define READ_BUFFER_SIZE WRITE_BUFFER_SIZE
7582#endif
83+
84+ static uint32_t s_mps = CDC_MAX_MPS ;
7685static DRAM_DMA_ALIGNED_ATTR uint8_t read_buffer [CDC_ACM_CHANNEL_NUM ][READ_BUFFER_SIZE ];
77- static DRAM_DMA_ALIGNED_ATTR uint8_t write_buffer [CDC_ACM_CHANNEL_NUM ][2048 ];
86+ static DRAM_DMA_ALIGNED_ATTR uint8_t write_buffer [CDC_ACM_CHANNEL_NUM ][WRITE_BUFFER_SIZE ];
7887
7988#ifdef CONFIG_USBDEV_ADVANCE_DESC
8089static const uint8_t device_descriptor [] = {
8190 USB_DEVICE_DESCRIPTOR_INIT (USB_2_0 , 0xEF , 0x02 , 0x01 , USBD_VID , USBD_PID , 0x0100 , 0x01 )
8291};
8392
84- static const uint8_t config_descriptor [] = {
93+ static const uint8_t config_descriptor_fs [] = {
8594 USB_CONFIG_DESCRIPTOR_INIT (USB_CONFIG_SIZE , INTERFACES_NUM , 0x01 , USB_CONFIG_BUS_POWERED , USBD_MAX_POWER ),
86- CDC_ACM_DESCRIPTOR_INIT (0x00 , CDC_INT_EP , CDC_OUT_EP , CDC_IN_EP , CDC_MAX_MPS , 0x02 ),
95+ CDC_ACM_DESCRIPTOR_INIT (0x00 , CDC_INT_EP , CDC_OUT_EP , CDC_IN_EP , CDC_FS_MAX_MPS , 0x02 ),
8796#ifdef CONFIG_EXAMPLE_CHERRYUSB_CDC_ACM_TWO_CHANNEL
88- CDC_ACM_DESCRIPTOR_INIT (0x02 , CDC_INT_EP1 , CDC_OUT_EP1 , CDC_IN_EP1 , CDC_MAX_MPS , 0x02 ),
97+ CDC_ACM_DESCRIPTOR_INIT (0x02 , CDC_INT_EP1 , CDC_OUT_EP1 , CDC_IN_EP1 , CDC_FS_MAX_MPS , 0x02 ),
98+ #endif
99+ };
100+
101+ #ifdef CONFIG_USB_HS
102+ static const uint8_t config_descriptor_hs [] = {
103+ USB_CONFIG_DESCRIPTOR_INIT (USB_CONFIG_SIZE , INTERFACES_NUM , 0x01 , USB_CONFIG_BUS_POWERED , USBD_MAX_POWER ),
104+ CDC_ACM_DESCRIPTOR_INIT (0x00 , CDC_INT_EP , CDC_OUT_EP , CDC_IN_EP , CDC_HS_MAX_MPS , 0x02 ),
105+ #ifdef CONFIG_EXAMPLE_CHERRYUSB_CDC_ACM_TWO_CHANNEL
106+ CDC_ACM_DESCRIPTOR_INIT (0x02 , CDC_INT_EP1 , CDC_OUT_EP1 , CDC_IN_EP1 , CDC_HS_MAX_MPS , 0x02 ),
89107#endif
90108};
109+ #endif
91110
92111static const uint8_t device_quality_descriptor [] = {
93112 ///////////////////////////////////////
@@ -122,7 +141,14 @@ static const uint8_t *device_descriptor_callback(uint8_t speed)
122141
123142static const uint8_t * config_descriptor_callback (uint8_t speed )
124143{
125- return config_descriptor ;
144+ #ifdef CONFIG_USB_HS
145+ if (speed >= USB_SPEED_HIGH ) {
146+ s_mps = CDC_HS_MAX_MPS ;
147+ return config_descriptor_hs ;
148+ }
149+ s_mps = CDC_FS_MAX_MPS ;
150+ #endif
151+ return config_descriptor_fs ;
126152}
127153
128154static const uint8_t * device_quality_descriptor_callback (uint8_t speed )
@@ -270,14 +296,22 @@ static void usbd_cdc_acm_bulk_out(uint8_t busid, uint8_t ep, uint32_t nbytes)
270296 if (ep_status -> write_len == 0 ) {
271297 memcpy (write_buffer [i ], read_buffer [i ], nbytes );
272298 ep_status -> write_len = nbytes ;
299+ #if CONFIG_EXAMPLE_CHERRYUSB_SET_READ_BUFFER_SIZE_MPS
300+ usbd_ep_start_read (0 , ep , read_buffer [i ], s_mps );
301+ #else
273302 usbd_ep_start_read (0 , ep , read_buffer [i ], sizeof (read_buffer [0 ]));
303+ #endif
274304 } else {
275305 ep_status -> read_len = nbytes ;
276306 ep_status -> rx_busy_flag = false;
277307 }
278308 xTaskNotifyFromISR (s_task_handle , NOTIFY_EP_BIT , eSetBits , & HPTaskAwoken );
279309 } else {
280- usbd_ep_start_read (0 , ep_status -> rx_addr , read_buffer [i ], sizeof (read_buffer [i ]));
310+ #if CONFIG_EXAMPLE_CHERRYUSB_SET_READ_BUFFER_SIZE_MPS
311+ usbd_ep_start_read (0 , ep , read_buffer [i ], s_mps );
312+ #else
313+ usbd_ep_start_read (0 , ep , read_buffer [i ], sizeof (read_buffer [i ]));
314+ #endif
281315 }
282316 break ;
283317 }
@@ -291,7 +325,7 @@ static void usbd_cdc_acm_bulk_in(uint8_t busid, uint8_t ep, uint32_t nbytes)
291325{
292326 BaseType_t HPTaskAwoken = pdFALSE ;
293327 ESP_EARLY_LOGI (TAG , "ep 0x%02X actual in len:%d" , ep , nbytes );
294- if ((nbytes % CDC_MAX_MPS ) == 0 && nbytes ) {
328+ if ((nbytes % s_mps ) == 0 && nbytes ) {
295329 usbd_ep_start_write (0 , ep , NULL , 0 );
296330 } else {
297331 for (size_t i = 0 ; i < CDC_ACM_CHANNEL_NUM ; i ++ ) {
@@ -354,7 +388,12 @@ static void cdc_acm_init(void)
354388 usbd_add_endpoint (0 , & cdc_out_ep1 );
355389 usbd_add_endpoint (0 , & cdc_in_ep1 );
356390#endif
357- usbd_initialize (0 , ESP_USBD_BASE , usbd_event_handler );
391+
392+ #if CONFIG_EXAMPLE_USB_DEVICE_RHPORT_HS
393+ usbd_initialize (0 , ESP_USB_HS0_BASE , usbd_event_handler );
394+ #else
395+ usbd_initialize (0 , ESP_USB_FS0_BASE , usbd_event_handler );
396+ #endif
358397}
359398
360399void usbd_cdc_acm_set_dtr (uint8_t busid , uint8_t intf , bool dtr )
@@ -389,7 +428,11 @@ void cdc_acm_task(void *arg)
389428
390429 ep_status -> read_len = 0 ;
391430 ep_status -> rx_busy_flag = true;
431+ #if CONFIG_EXAMPLE_CHERRYUSB_SET_READ_BUFFER_SIZE_MPS
432+ usbd_ep_start_read (0 , ep_status -> rx_addr , read_buffer [i ], s_mps );
433+ #else
392434 usbd_ep_start_read (0 , ep_status -> rx_addr , read_buffer [i ], sizeof (read_buffer [0 ]));
435+ #endif
393436 }
394437 }
395438 for (size_t i = 0 ; i < sizeof (s_ep_status ) / sizeof (s_ep_status [0 ]); i ++ ) {
@@ -408,7 +451,11 @@ void cdc_acm_task(void *arg)
408451 if (ep_status -> rx_busy_flag == false) {
409452 if (ep_status -> read_len == 0 ) {
410453 ep_status -> rx_busy_flag = true;
454+ #if CONFIG_EXAMPLE_CHERRYUSB_SET_READ_BUFFER_SIZE_MPS
455+ usbd_ep_start_read (0 , ep_status -> rx_addr , read_buffer [i ], s_mps );
456+ #else
411457 usbd_ep_start_read (0 , ep_status -> rx_addr , read_buffer [i ], sizeof (read_buffer [i ]));
458+ #endif
412459 }
413460 }
414461 }
0 commit comments