|
43 | 43 | #define CDC2_MSC_TEMPLATE_MSC_DESC_OFFSET (9) |
44 | 44 | #define CDC2_MSC_TEMPLATE_CDC_DESC_OFFSET (9 + 23 + 8) |
45 | 45 | #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) |
46 | 53 | #define CDC_HID_TEMPLATE_CDC_DESC_OFFSET (49) |
47 | 54 | #define CDC_TEMPLATE_CDC_DESC_OFFSET (9) |
48 | 55 | #define CDC_DESC_OFFSET_INTR_INTERVAL (34) |
|
65 | 72 | #define CDC_IFACE_NUM_ALONE (0) |
66 | 73 | #define CDC_IFACE_NUM_WITH_MSC (1) |
67 | 74 | #define CDC2_IFACE_NUM_WITH_CDC (2) |
| 75 | +#define CDC3_IFACE_NUM_WITH_CDC (4) |
68 | 76 | #define CDC2_IFACE_NUM_WITH_MSC (3) |
| 77 | +#define CDC3_IFACE_NUM_WITH_MSC (5) |
69 | 78 | #define CDC_IFACE_NUM_WITH_HID (1) |
70 | 79 | #define MSC_IFACE_NUM_WITH_CDC (0) |
71 | 80 | #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 |
493 | 502 | } |
494 | 503 | #endif |
495 | 504 |
|
| 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 | + |
496 | 530 | case USBD_MODE_CDC_HID: |
497 | 531 | usbd->hid->desc = d + n; |
498 | 532 | 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 * |
973 | 1007 | break; |
974 | 1008 | #endif |
975 | 1009 |
|
| 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 | + |
976 | 1025 | case USBD_MODE_CDC_HID: |
977 | 1026 | cdc_desc[0] = usbd->usbd_config_desc + CDC_HID_TEMPLATE_CDC_DESC_OFFSET; |
978 | 1027 | break; |
|
0 commit comments