Skip to content

Commit ff91b05

Browse files
committed
stm32/usb: Support up to 3 VCP interfaces on USB device peripheral.
To enable define MICROPY_HW_USB_CDC_NUM to 3.
1 parent 0c29502 commit ff91b05

File tree

7 files changed

+85
-2
lines changed

7 files changed

+85
-2
lines changed

ports/stm32/usb.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,18 @@ STATIC mp_obj_t pyb_usb_mode(size_t n_args, const mp_obj_t *pos_args, mp_map_t *
309309
}
310310
mode = USBD_MODE_CDC2_MSC;
311311
#endif
312+
#if MICROPY_HW_USB_CDC_NUM >= 3
313+
} else if (strcmp(mode_str, "3xVCP") == 0) {
314+
if (args[2].u_int == -1) {
315+
pid = USBD_PID_CDC3;
316+
}
317+
mode = USBD_MODE_CDC3;
318+
} else if (strcmp(mode_str, "3xVCP+MSC") == 0) {
319+
if (args[2].u_int == -1) {
320+
pid = USBD_PID_CDC3_MSC;
321+
}
322+
mode = USBD_MODE_CDC3_MSC;
323+
#endif
312324
} else if (strcmp(mode_str, "CDC+HID") == 0 || strcmp(mode_str, "VCP+HID") == 0) {
313325
if (args[2].u_int == -1) {
314326
pid = USBD_PID_CDC_HID;
@@ -386,6 +398,9 @@ const pyb_usb_vcp_obj_t pyb_usb_vcp_obj[MICROPY_HW_USB_CDC_NUM] = {
386398
#if MICROPY_HW_USB_CDC_NUM >= 2
387399
{{&pyb_usb_vcp_type}, &usb_device.usbd_cdc_itf[1]},
388400
#endif
401+
#if MICROPY_HW_USB_CDC_NUM >= 3
402+
{{&pyb_usb_vcp_type}, &usb_device.usbd_cdc_itf[2]},
403+
#endif
389404
};
390405

391406
STATIC void pyb_usb_vcp_init0(void) {

ports/stm32/usb.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
#define USBD_PID_MSC (0x9803)
3939
#define USBD_PID_CDC2_MSC (0x9804)
4040
#define USBD_PID_CDC2 (0x9805)
41+
#define USBD_PID_CDC3 (0x9806)
42+
#define USBD_PID_CDC3_MSC (0x9807)
4143

4244
typedef enum {
4345
PYB_USB_STORAGE_MEDIUM_NONE = 0,

ports/stm32/usbd_conf.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,11 @@ USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev, int high_speed) {
385385
if (pdev->id == USB_PHY_HS_ID) {
386386
// Set LL Driver parameters
387387
pcd_hs_handle.Instance = USB_OTG_HS;
388+
#if MICROPY_HW_USB_CDC_NUM == 3
389+
pcd_hs_handle.Init.dev_endpoints = 8;
390+
#else
388391
pcd_hs_handle.Init.dev_endpoints = 6;
392+
#endif
389393
pcd_hs_handle.Init.use_dedicated_ep1 = 0;
390394
pcd_hs_handle.Init.ep0_mps = 0x40;
391395
pcd_hs_handle.Init.dma_enable = 0;
@@ -431,13 +435,21 @@ USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev, int high_speed) {
431435
HAL_PCD_Init(&pcd_hs_handle);
432436

433437
// We have 1024 32-bit words in total to use here
438+
#if MICROPY_HW_USB_CDC_NUM == 3
439+
HAL_PCD_SetRxFiFo(&pcd_hs_handle, 328);
440+
#else
434441
HAL_PCD_SetRxFiFo(&pcd_hs_handle, 464);
442+
#endif
435443
HAL_PCD_SetTxFiFo(&pcd_hs_handle, 0, 32); // EP0
436444
HAL_PCD_SetTxFiFo(&pcd_hs_handle, 1, 256); // MSC / HID
437445
HAL_PCD_SetTxFiFo(&pcd_hs_handle, 2, 8); // CDC CMD
438446
HAL_PCD_SetTxFiFo(&pcd_hs_handle, 3, 128); // CDC DATA
439447
HAL_PCD_SetTxFiFo(&pcd_hs_handle, 4, 8); // CDC2 CMD
440448
HAL_PCD_SetTxFiFo(&pcd_hs_handle, 5, 128); // CDC2 DATA
449+
#if MICROPY_HW_USB_CDC_NUM == 3
450+
HAL_PCD_SetTxFiFo(&pcd_hs_handle, 6, 8); // CDC3 CMD
451+
HAL_PCD_SetTxFiFo(&pcd_hs_handle, 7, 128); // CDC3 DATA
452+
#endif
441453
}
442454
#endif // MICROPY_HW_USB_HS
443455

ports/stm32/usbd_conf.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939

4040
#include "py/mpconfig.h"
4141

42-
#define USBD_MAX_NUM_INTERFACES 4
42+
#define USBD_MAX_NUM_INTERFACES 5
4343
#define USBD_MAX_NUM_CONFIGURATION 1
4444
#define USBD_MAX_STR_DESC_SIZ 0x100
4545
#if MICROPY_HW_USB_SELF_POWERED

ports/stm32/usbdev/class/inc/usbd_cdc_msc_hid.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@
1919
#endif
2020

2121
// Should be maximum of possible config descriptors that might be configured
22-
#if MICROPY_HW_USB_CDC_NUM == 2
22+
#if MICROPY_HW_USB_CDC_NUM == 3
23+
// Maximum is MSC+CDC+CDC+CDC
24+
#define MAX_TEMPLATE_CONFIG_DESC_SIZE (9 + 23 + (8 + 58) + (8 + 58) + (8 + 58))
25+
#elif MICROPY_HW_USB_CDC_NUM == 2
2326
// Maximum is MSC+CDC+CDC
2427
#define MAX_TEMPLATE_CONFIG_DESC_SIZE (9 + 23 + (8 + 58) + (8 + 58))
2528
#else

ports/stm32/usbdev/class/inc/usbd_cdc_msc_hid0.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,11 @@
3939
// Convenience macros for supported mode combinations
4040
#define USBD_MODE_CDC (USBD_MODE_IFACE_CDC(0))
4141
#define USBD_MODE_CDC2 (USBD_MODE_IFACE_CDC(0) | USBD_MODE_IFACE_CDC(1))
42+
#define USBD_MODE_CDC3 (USBD_MODE_IFACE_CDC(0) | USBD_MODE_IFACE_CDC(1) | USBD_MODE_IFACE_CDC(2))
4243
#define USBD_MODE_CDC_HID (USBD_MODE_IFACE_CDC(0) | USBD_MODE_IFACE_HID)
4344
#define USBD_MODE_CDC_MSC (USBD_MODE_IFACE_CDC(0) | USBD_MODE_IFACE_MSC)
4445
#define USBD_MODE_CDC2_MSC (USBD_MODE_IFACE_CDC(0) | USBD_MODE_IFACE_CDC(1) | USBD_MODE_IFACE_MSC)
46+
#define USBD_MODE_CDC3_MSC (USBD_MODE_IFACE_CDC(0) | USBD_MODE_IFACE_CDC(1) | USBD_MODE_IFACE_CDC(2) | USBD_MODE_IFACE_MSC)
4547
#define USBD_MODE_HID (USBD_MODE_IFACE_HID)
4648
#define USBD_MODE_MSC (USBD_MODE_IFACE_MSC)
4749
#define USBD_MODE_MSC_HID (USBD_MODE_IFACE_MSC | USBD_MODE_IFACE_HID)

ports/stm32/usbdev/class/src/usbd_cdc_msc_hid.c

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,13 @@
4343
#define CDC2_MSC_TEMPLATE_MSC_DESC_OFFSET (9)
4444
#define CDC2_MSC_TEMPLATE_CDC_DESC_OFFSET (9 + 23 + 8)
4545
#define CDC2_MSC_TEMPLATE_CDC2_DESC_OFFSET (9 + 23 + (8 + 58) + 8)
46+
#define CDC3_TEMPLATE_CDC_DESC_OFFSET (9 + 8)
47+
#define CDC3_TEMPLATE_CDC2_DESC_OFFSET (9 + (8 + 58) + 8)
48+
#define CDC3_TEMPLATE_CDC3_DESC_OFFSET (9 + (8 + 58) + (8 + 58) + 8)
49+
#define CDC3_MSC_TEMPLATE_MSC_DESC_OFFSET (9)
50+
#define CDC3_MSC_TEMPLATE_CDC_DESC_OFFSET (9 + 23 + 8)
51+
#define CDC3_MSC_TEMPLATE_CDC2_DESC_OFFSET (9 + 23 + (8 + 58) + 8)
52+
#define CDC3_MSC_TEMPLATE_CDC3_DESC_OFFSET (9 + 23 + (8 + 58) + (8 + 58) + 8)
4653
#define CDC_HID_TEMPLATE_CDC_DESC_OFFSET (49)
4754
#define CDC_TEMPLATE_CDC_DESC_OFFSET (9)
4855
#define CDC_DESC_OFFSET_INTR_INTERVAL (34)
@@ -65,7 +72,9 @@
6572
#define CDC_IFACE_NUM_ALONE (0)
6673
#define CDC_IFACE_NUM_WITH_MSC (1)
6774
#define CDC2_IFACE_NUM_WITH_CDC (2)
75+
#define CDC3_IFACE_NUM_WITH_CDC (4)
6876
#define CDC2_IFACE_NUM_WITH_MSC (3)
77+
#define CDC3_IFACE_NUM_WITH_MSC (5)
6978
#define CDC_IFACE_NUM_WITH_HID (1)
7079
#define MSC_IFACE_NUM_WITH_CDC (0)
7180
#define HID_IFACE_NUM_WITH_CDC (0)
@@ -493,6 +502,31 @@ int USBD_SelectMode(usbd_cdc_msc_hid_state_t *usbd, uint32_t mode, USBD_HID_Mode
493502
}
494503
#endif
495504

505+
#if MICROPY_HW_USB_CDC_NUM >= 3
506+
case USBD_MODE_CDC3: {
507+
n += make_cdc_desc(d + n, 1, CDC_IFACE_NUM_ALONE);
508+
n += make_cdc_desc_ep(d + n, 1, CDC2_IFACE_NUM_WITH_CDC, CDC_CMD_EP(1), CDC_OUT_EP(1), CDC_IN_EP(1));
509+
n += make_cdc_desc_ep(d + n, 1, CDC3_IFACE_NUM_WITH_CDC, CDC_CMD_EP(2), CDC_OUT_EP(2), CDC_IN_EP(2));
510+
usbd->cdc[0]->iface_num = CDC_IFACE_NUM_ALONE;
511+
usbd->cdc[1]->iface_num = CDC2_IFACE_NUM_WITH_CDC;
512+
usbd->cdc[2]->iface_num = CDC3_IFACE_NUM_WITH_CDC;
513+
num_itf = 6;
514+
break;
515+
}
516+
517+
case USBD_MODE_CDC3_MSC: {
518+
n += make_msc_desc(d + n);
519+
n += make_cdc_desc(d + n, 1, CDC_IFACE_NUM_WITH_MSC);
520+
n += make_cdc_desc_ep(d + n, 1, CDC2_IFACE_NUM_WITH_MSC, CDC_CMD_EP(1), CDC_OUT_EP(1), CDC_IN_EP(1));
521+
n += make_cdc_desc_ep(d + n, 1, CDC3_IFACE_NUM_WITH_MSC, CDC_CMD_EP(2), CDC_OUT_EP(2), CDC_IN_EP(2));
522+
usbd->cdc[0]->iface_num = CDC_IFACE_NUM_WITH_MSC;
523+
usbd->cdc[1]->iface_num = CDC2_IFACE_NUM_WITH_MSC;
524+
usbd->cdc[2]->iface_num = CDC3_IFACE_NUM_WITH_MSC;
525+
num_itf = 7;
526+
break;
527+
}
528+
#endif
529+
496530
case USBD_MODE_CDC_HID:
497531
usbd->hid->desc = d + n;
498532
n += make_hid_desc(d + n, hid_info);
@@ -973,6 +1007,21 @@ static uint8_t *USBD_CDC_MSC_HID_GetCfgDesc(USBD_HandleTypeDef *pdev, uint16_t *
9731007
break;
9741008
#endif
9751009

1010+
#if MICROPY_HW_USB_CDC_NUM >= 3
1011+
case USBD_MODE_CDC3:
1012+
cdc_desc[0] = usbd->usbd_config_desc + CDC3_TEMPLATE_CDC_DESC_OFFSET;
1013+
cdc_desc[1] = usbd->usbd_config_desc + CDC3_TEMPLATE_CDC2_DESC_OFFSET;
1014+
cdc_desc[2] = usbd->usbd_config_desc + CDC3_TEMPLATE_CDC3_DESC_OFFSET;
1015+
break;
1016+
1017+
case USBD_MODE_CDC3_MSC:
1018+
cdc_desc[0] = usbd->usbd_config_desc + CDC3_MSC_TEMPLATE_CDC_DESC_OFFSET;
1019+
cdc_desc[1] = usbd->usbd_config_desc + CDC3_MSC_TEMPLATE_CDC2_DESC_OFFSET;
1020+
cdc_desc[2] = usbd->usbd_config_desc + CDC3_MSC_TEMPLATE_CDC3_DESC_OFFSET;
1021+
msc_desc = usbd->usbd_config_desc + CDC3_MSC_TEMPLATE_MSC_DESC_OFFSET;
1022+
break;
1023+
#endif
1024+
9761025
case USBD_MODE_CDC_HID:
9771026
cdc_desc[0] = usbd->usbd_config_desc + CDC_HID_TEMPLATE_CDC_DESC_OFFSET;
9781027
break;

0 commit comments

Comments
 (0)