aboutsummaryrefslogtreecommitdiff
path: root/ports/stm32/usbdev/class
diff options
context:
space:
mode:
authorDamien George2019-05-30 17:16:15 +1000
committerDamien George2019-05-31 11:35:42 +1000
commitff91b05cfa8154d1a4d098423dfa95d14ade4271 (patch)
tree3d965b612fd01991a975b533049a36c599195413 /ports/stm32/usbdev/class
parent0c29502ad995cfacc3b11f26a135707a06b8c27d (diff)
stm32/usb: Support up to 3 VCP interfaces on USB device peripheral.
To enable define MICROPY_HW_USB_CDC_NUM to 3.
Diffstat (limited to 'ports/stm32/usbdev/class')
-rw-r--r--ports/stm32/usbdev/class/inc/usbd_cdc_msc_hid.h5
-rw-r--r--ports/stm32/usbdev/class/inc/usbd_cdc_msc_hid0.h2
-rw-r--r--ports/stm32/usbdev/class/src/usbd_cdc_msc_hid.c49
3 files changed, 55 insertions, 1 deletions
diff --git a/ports/stm32/usbdev/class/inc/usbd_cdc_msc_hid.h b/ports/stm32/usbdev/class/inc/usbd_cdc_msc_hid.h
index f20485a7c..d4a218a4a 100644
--- a/ports/stm32/usbdev/class/inc/usbd_cdc_msc_hid.h
+++ b/ports/stm32/usbdev/class/inc/usbd_cdc_msc_hid.h
@@ -19,7 +19,10 @@
#endif
// Should be maximum of possible config descriptors that might be configured
-#if MICROPY_HW_USB_CDC_NUM == 2
+#if MICROPY_HW_USB_CDC_NUM == 3
+// Maximum is MSC+CDC+CDC+CDC
+#define MAX_TEMPLATE_CONFIG_DESC_SIZE (9 + 23 + (8 + 58) + (8 + 58) + (8 + 58))
+#elif MICROPY_HW_USB_CDC_NUM == 2
// Maximum is MSC+CDC+CDC
#define MAX_TEMPLATE_CONFIG_DESC_SIZE (9 + 23 + (8 + 58) + (8 + 58))
#else
diff --git a/ports/stm32/usbdev/class/inc/usbd_cdc_msc_hid0.h b/ports/stm32/usbdev/class/inc/usbd_cdc_msc_hid0.h
index 1cb879180..63fe8ecef 100644
--- a/ports/stm32/usbdev/class/inc/usbd_cdc_msc_hid0.h
+++ b/ports/stm32/usbdev/class/inc/usbd_cdc_msc_hid0.h
@@ -39,9 +39,11 @@
// Convenience macros for supported mode combinations
#define USBD_MODE_CDC (USBD_MODE_IFACE_CDC(0))
#define USBD_MODE_CDC2 (USBD_MODE_IFACE_CDC(0) | USBD_MODE_IFACE_CDC(1))
+#define USBD_MODE_CDC3 (USBD_MODE_IFACE_CDC(0) | USBD_MODE_IFACE_CDC(1) | USBD_MODE_IFACE_CDC(2))
#define USBD_MODE_CDC_HID (USBD_MODE_IFACE_CDC(0) | USBD_MODE_IFACE_HID)
#define USBD_MODE_CDC_MSC (USBD_MODE_IFACE_CDC(0) | USBD_MODE_IFACE_MSC)
#define USBD_MODE_CDC2_MSC (USBD_MODE_IFACE_CDC(0) | USBD_MODE_IFACE_CDC(1) | USBD_MODE_IFACE_MSC)
+#define USBD_MODE_CDC3_MSC (USBD_MODE_IFACE_CDC(0) | USBD_MODE_IFACE_CDC(1) | USBD_MODE_IFACE_CDC(2) | USBD_MODE_IFACE_MSC)
#define USBD_MODE_HID (USBD_MODE_IFACE_HID)
#define USBD_MODE_MSC (USBD_MODE_IFACE_MSC)
#define USBD_MODE_MSC_HID (USBD_MODE_IFACE_MSC | USBD_MODE_IFACE_HID)
diff --git a/ports/stm32/usbdev/class/src/usbd_cdc_msc_hid.c b/ports/stm32/usbdev/class/src/usbd_cdc_msc_hid.c
index bfb5d3058..d982fe8e6 100644
--- a/ports/stm32/usbdev/class/src/usbd_cdc_msc_hid.c
+++ b/ports/stm32/usbdev/class/src/usbd_cdc_msc_hid.c
@@ -43,6 +43,13 @@
#define CDC2_MSC_TEMPLATE_MSC_DESC_OFFSET (9)
#define CDC2_MSC_TEMPLATE_CDC_DESC_OFFSET (9 + 23 + 8)
#define CDC2_MSC_TEMPLATE_CDC2_DESC_OFFSET (9 + 23 + (8 + 58) + 8)
+#define CDC3_TEMPLATE_CDC_DESC_OFFSET (9 + 8)
+#define CDC3_TEMPLATE_CDC2_DESC_OFFSET (9 + (8 + 58) + 8)
+#define CDC3_TEMPLATE_CDC3_DESC_OFFSET (9 + (8 + 58) + (8 + 58) + 8)
+#define CDC3_MSC_TEMPLATE_MSC_DESC_OFFSET (9)
+#define CDC3_MSC_TEMPLATE_CDC_DESC_OFFSET (9 + 23 + 8)
+#define CDC3_MSC_TEMPLATE_CDC2_DESC_OFFSET (9 + 23 + (8 + 58) + 8)
+#define CDC3_MSC_TEMPLATE_CDC3_DESC_OFFSET (9 + 23 + (8 + 58) + (8 + 58) + 8)
#define CDC_HID_TEMPLATE_CDC_DESC_OFFSET (49)
#define CDC_TEMPLATE_CDC_DESC_OFFSET (9)
#define CDC_DESC_OFFSET_INTR_INTERVAL (34)
@@ -65,7 +72,9 @@
#define CDC_IFACE_NUM_ALONE (0)
#define CDC_IFACE_NUM_WITH_MSC (1)
#define CDC2_IFACE_NUM_WITH_CDC (2)
+#define CDC3_IFACE_NUM_WITH_CDC (4)
#define CDC2_IFACE_NUM_WITH_MSC (3)
+#define CDC3_IFACE_NUM_WITH_MSC (5)
#define CDC_IFACE_NUM_WITH_HID (1)
#define MSC_IFACE_NUM_WITH_CDC (0)
#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
}
#endif
+ #if MICROPY_HW_USB_CDC_NUM >= 3
+ case USBD_MODE_CDC3: {
+ n += make_cdc_desc(d + n, 1, CDC_IFACE_NUM_ALONE);
+ 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));
+ 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));
+ usbd->cdc[0]->iface_num = CDC_IFACE_NUM_ALONE;
+ usbd->cdc[1]->iface_num = CDC2_IFACE_NUM_WITH_CDC;
+ usbd->cdc[2]->iface_num = CDC3_IFACE_NUM_WITH_CDC;
+ num_itf = 6;
+ break;
+ }
+
+ case USBD_MODE_CDC3_MSC: {
+ n += make_msc_desc(d + n);
+ n += make_cdc_desc(d + n, 1, CDC_IFACE_NUM_WITH_MSC);
+ 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));
+ 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));
+ usbd->cdc[0]->iface_num = CDC_IFACE_NUM_WITH_MSC;
+ usbd->cdc[1]->iface_num = CDC2_IFACE_NUM_WITH_MSC;
+ usbd->cdc[2]->iface_num = CDC3_IFACE_NUM_WITH_MSC;
+ num_itf = 7;
+ break;
+ }
+ #endif
+
case USBD_MODE_CDC_HID:
usbd->hid->desc = d + n;
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 *
break;
#endif
+ #if MICROPY_HW_USB_CDC_NUM >= 3
+ case USBD_MODE_CDC3:
+ cdc_desc[0] = usbd->usbd_config_desc + CDC3_TEMPLATE_CDC_DESC_OFFSET;
+ cdc_desc[1] = usbd->usbd_config_desc + CDC3_TEMPLATE_CDC2_DESC_OFFSET;
+ cdc_desc[2] = usbd->usbd_config_desc + CDC3_TEMPLATE_CDC3_DESC_OFFSET;
+ break;
+
+ case USBD_MODE_CDC3_MSC:
+ cdc_desc[0] = usbd->usbd_config_desc + CDC3_MSC_TEMPLATE_CDC_DESC_OFFSET;
+ cdc_desc[1] = usbd->usbd_config_desc + CDC3_MSC_TEMPLATE_CDC2_DESC_OFFSET;
+ cdc_desc[2] = usbd->usbd_config_desc + CDC3_MSC_TEMPLATE_CDC3_DESC_OFFSET;
+ msc_desc = usbd->usbd_config_desc + CDC3_MSC_TEMPLATE_MSC_DESC_OFFSET;
+ break;
+ #endif
+
case USBD_MODE_CDC_HID:
cdc_desc[0] = usbd->usbd_config_desc + CDC_HID_TEMPLATE_CDC_DESC_OFFSET;
break;