summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2022-05-06 17:07:51 +0800
committersakumisu <[email protected]>2022-05-06 17:07:51 +0800
commit8e0e772992125498e525ee12025dee65b7ca5afa (patch)
tree5b620b04463e47a3e66149f76cd6342374875de2
parent33c0c2f02c087df62688ac3a2b95e825367376ea (diff)
add cdc composite template
-rw-r--r--demo/cdc_acm_msc_template.c201
-rw-r--r--demo/cdc_acm_multi_template.c221
2 files changed, 422 insertions, 0 deletions
diff --git a/demo/cdc_acm_msc_template.c b/demo/cdc_acm_msc_template.c
new file mode 100644
index 00000000..78ec824a
--- /dev/null
+++ b/demo/cdc_acm_msc_template.c
@@ -0,0 +1,201 @@
+#include "usbd_core.h"
+#include "usbd_cdc.h"
+#include "usbd_msc.h"
+
+/*!< endpoint address */
+#define CDC_IN_EP 0x81
+#define CDC_OUT_EP 0x02
+#define CDC_INT_EP 0x83
+
+#define MSC_IN_EP 0x85
+#define MSC_OUT_EP 0x04
+
+#define USBD_VID 0xFFFF
+#define USBD_PID 0xFFFF
+#define USBD_MAX_POWER 100
+#define USBD_LANGID_STRING 1033
+
+/*!< config descriptor size */
+#define USB_CONFIG_SIZE (9 + CDC_ACM_DESCRIPTOR_LEN + MSC_DESCRIPTOR_LEN)
+
+/*!< global descriptor */
+static const uint8_t cdc_msc_descriptor[] = {
+ USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01),
+ USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x03, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER),
+ CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, 0x02),
+ MSC_DESCRIPTOR_INIT(0x02, MSC_OUT_EP, MSC_IN_EP, 0x00),
+ ///////////////////////////////////////
+ /// string0 descriptor
+ ///////////////////////////////////////
+ USB_LANGID_INIT(USBD_LANGID_STRING),
+ ///////////////////////////////////////
+ /// string1 descriptor
+ ///////////////////////////////////////
+ 0x14, /* bLength */
+ USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */
+ 'C', 0x00, /* wcChar0 */
+ 'h', 0x00, /* wcChar1 */
+ 'e', 0x00, /* wcChar2 */
+ 'r', 0x00, /* wcChar3 */
+ 'r', 0x00, /* wcChar4 */
+ 'y', 0x00, /* wcChar5 */
+ 'U', 0x00, /* wcChar6 */
+ 'S', 0x00, /* wcChar7 */
+ 'B', 0x00, /* wcChar8 */
+ ///////////////////////////////////////
+ /// string2 descriptor
+ ///////////////////////////////////////
+ 0x26, /* bLength */
+ USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */
+ 'C', 0x00, /* wcChar0 */
+ 'h', 0x00, /* wcChar1 */
+ 'e', 0x00, /* wcChar2 */
+ 'r', 0x00, /* wcChar3 */
+ 'r', 0x00, /* wcChar4 */
+ 'y', 0x00, /* wcChar5 */
+ 'U', 0x00, /* wcChar6 */
+ 'S', 0x00, /* wcChar7 */
+ 'B', 0x00, /* wcChar8 */
+ ' ', 0x00, /* wcChar9 */
+ 'C', 0x00, /* wcChar10 */
+ 'D', 0x00, /* wcChar11 */
+ 'C', 0x00, /* wcChar12 */
+ ' ', 0x00, /* wcChar13 */
+ 'D', 0x00, /* wcChar14 */
+ 'E', 0x00, /* wcChar15 */
+ 'M', 0x00, /* wcChar16 */
+ 'O', 0x00, /* wcChar17 */
+ ///////////////////////////////////////
+ /// string3 descriptor
+ ///////////////////////////////////////
+ 0x16, /* bLength */
+ USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */
+ '2', 0x00, /* wcChar0 */
+ '0', 0x00, /* wcChar1 */
+ '2', 0x00, /* wcChar2 */
+ '2', 0x00, /* wcChar3 */
+ '1', 0x00, /* wcChar4 */
+ '2', 0x00, /* wcChar5 */
+ '3', 0x00, /* wcChar6 */
+ '4', 0x00, /* wcChar7 */
+ '5', 0x00, /* wcChar8 */
+ '6', 0x00, /* wcChar9 */
+#ifdef CONFIG_USB_HS
+ ///////////////////////////////////////
+ /// device qualifier descriptor
+ ///////////////////////////////////////
+ 0x0a,
+ USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER,
+ 0x00,
+ 0x02,
+ 0x02,
+ 0x02,
+ 0x01,
+ 0x40,
+ 0x01,
+ 0x00,
+#endif
+ 0x00
+};
+
+/*!< class */
+usbd_class_t cdc_class;
+/*!< interface one */
+usbd_interface_t cdc_cmd_intf;
+/*!< interface two */
+usbd_interface_t cdc_data_intf;
+
+/* function ------------------------------------------------------------------*/
+void usbd_cdc_acm_out(uint8_t ep)
+{
+ uint8_t data[64];
+ uint32_t read_byte;
+
+ usbd_ep_read(ep, data, 64, &read_byte);
+ for (uint8_t i = 0; i < read_byte; i++) {
+ printf("%02x ", data[i]);
+ }
+ printf("\r\n");
+ printf("read len:%d\r\n", read_byte);
+ usbd_ep_read(ep, NULL, 0, NULL);
+}
+
+void usbd_cdc_acm_in(uint8_t ep)
+{
+ printf("in\r\n");
+}
+
+/*!< endpoint call back */
+usbd_endpoint_t cdc_out_ep = {
+ .ep_addr = CDC_OUT_EP,
+ .ep_cb = usbd_cdc_acm_out
+};
+
+usbd_endpoint_t cdc_in_ep = {
+ .ep_addr = CDC_IN_EP,
+ .ep_cb = usbd_cdc_acm_in
+};
+
+/* function ------------------------------------------------------------------*/
+void cdc_acm_msc_init(void)
+{
+ usbd_desc_register(cdc_msc_descriptor);
+ /*!< add interface */
+ usbd_cdc_add_acm_interface(&cdc_class, &cdc_cmd_intf);
+ usbd_cdc_add_acm_interface(&cdc_class, &cdc_data_intf);
+ /*!< interface add endpoint */
+ usbd_interface_add_endpoint(&cdc_data_intf, &cdc_out_ep);
+ usbd_interface_add_endpoint(&cdc_data_intf, &cdc_in_ep);
+
+ usbd_msc_class_init(MSC_OUT_EP, MSC_IN_EP);
+
+ usbd_initialize();
+}
+
+volatile uint8_t dtr_enable = 0;
+
+void usbd_cdc_acm_set_dtr(bool dtr)
+{
+ if (dtr) {
+ dtr_enable = 1;
+ } else {
+ dtr_enable = 0;
+ }
+}
+
+void cdc_acm_data_send_with_dtr_test(void)
+{
+ if (dtr_enable) {
+ uint8_t data_buffer[10] = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x31, 0x32, 0x33, 0x34, 0x35 };
+ usbd_ep_write(CDC_IN_EP, data_buffer, 10, NULL);
+ }
+}
+
+#define BLOCK_SIZE 512
+#define BLOCK_COUNT 10
+
+typedef struct
+{
+ uint8_t BlockSpace[BLOCK_SIZE];
+} BLOCK_TYPE;
+
+BLOCK_TYPE mass_block[BLOCK_COUNT];
+
+void usbd_msc_get_cap(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
+{
+ *block_num = 1000; //Pretend having so many buffer,not has actually.
+ *block_size = BLOCK_SIZE;
+}
+int usbd_msc_sector_read(uint32_t sector, uint8_t *buffer, uint32_t length)
+{
+ if (sector < 10)
+ memcpy(buffer, mass_block[sector].BlockSpace, length);
+ return 0;
+}
+
+int usbd_msc_sector_write(uint32_t sector, uint8_t *buffer, uint32_t length)
+{
+ if (sector < 10)
+ memcpy(mass_block[sector].BlockSpace, buffer, length);
+ return 0;
+} \ No newline at end of file
diff --git a/demo/cdc_acm_multi_template.c b/demo/cdc_acm_multi_template.c
new file mode 100644
index 00000000..e89c06d9
--- /dev/null
+++ b/demo/cdc_acm_multi_template.c
@@ -0,0 +1,221 @@
+#include "usbd_core.h"
+#include "usbd_cdc.h"
+
+/*!< endpoint address */
+#define CDC_IN_EP 0x81
+#define CDC_OUT_EP 0x01
+#define CDC_INT_EP 0x85
+
+#define CDC_IN_EP2 0x82
+#define CDC_OUT_EP2 0x02
+#define CDC_INT_EP2 0x86
+
+#define CDC_IN_EP3 0x83
+#define CDC_OUT_EP3 0x03
+#define CDC_INT_EP3 0x87
+
+#define CDC_IN_EP4 0x84
+#define CDC_OUT_EP4 0x04
+#define CDC_INT_EP4 0x88
+
+#define USBD_VID 0xFFFF
+#define USBD_PID 0xFFFF
+#define USBD_MAX_POWER 100
+#define USBD_LANGID_STRING 1033
+
+/*!< config descriptor size */
+#define USB_CONFIG_SIZE (9 + CDC_ACM_DESCRIPTOR_LEN * 4)
+
+/*!< global descriptor */
+static const uint8_t cdc_descriptor[] = {
+ USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0xEF, 0x02, 0x01, USBD_VID, USBD_PID, 0x0100, 0x01),
+ USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x08, 0x01, USB_CONFIG_BUS_POWERED, USBD_MAX_POWER),
+ CDC_ACM_DESCRIPTOR_INIT(0x00, CDC_INT_EP, CDC_OUT_EP, CDC_IN_EP, 0x02),
+ CDC_ACM_DESCRIPTOR_INIT(0x02, CDC_INT_EP2, CDC_OUT_EP2, CDC_IN_EP2, 0x02),
+ CDC_ACM_DESCRIPTOR_INIT(0x04, CDC_INT_EP3, CDC_OUT_EP3, CDC_IN_EP3, 0x02),
+ CDC_ACM_DESCRIPTOR_INIT(0x06, CDC_INT_EP4, CDC_OUT_EP4, CDC_IN_EP4, 0x02),
+ ///////////////////////////////////////
+ /// string0 descriptor
+ ///////////////////////////////////////
+ USB_LANGID_INIT(USBD_LANGID_STRING),
+ ///////////////////////////////////////
+ /// string1 descriptor
+ ///////////////////////////////////////
+ 0x14, /* bLength */
+ USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */
+ 'C', 0x00, /* wcChar0 */
+ 'h', 0x00, /* wcChar1 */
+ 'e', 0x00, /* wcChar2 */
+ 'r', 0x00, /* wcChar3 */
+ 'r', 0x00, /* wcChar4 */
+ 'y', 0x00, /* wcChar5 */
+ 'U', 0x00, /* wcChar6 */
+ 'S', 0x00, /* wcChar7 */
+ 'B', 0x00, /* wcChar8 */
+ ///////////////////////////////////////
+ /// string2 descriptor
+ ///////////////////////////////////////
+ 0x26, /* bLength */
+ USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */
+ 'C', 0x00, /* wcChar0 */
+ 'h', 0x00, /* wcChar1 */
+ 'e', 0x00, /* wcChar2 */
+ 'r', 0x00, /* wcChar3 */
+ 'r', 0x00, /* wcChar4 */
+ 'y', 0x00, /* wcChar5 */
+ 'U', 0x00, /* wcChar6 */
+ 'S', 0x00, /* wcChar7 */
+ 'B', 0x00, /* wcChar8 */
+ ' ', 0x00, /* wcChar9 */
+ 'C', 0x00, /* wcChar10 */
+ 'D', 0x00, /* wcChar11 */
+ 'C', 0x00, /* wcChar12 */
+ ' ', 0x00, /* wcChar13 */
+ 'D', 0x00, /* wcChar14 */
+ 'E', 0x00, /* wcChar15 */
+ 'M', 0x00, /* wcChar16 */
+ 'O', 0x00, /* wcChar17 */
+ ///////////////////////////////////////
+ /// string3 descriptor
+ ///////////////////////////////////////
+ 0x16, /* bLength */
+ USB_DESCRIPTOR_TYPE_STRING, /* bDescriptorType */
+ '2', 0x00, /* wcChar0 */
+ '0', 0x00, /* wcChar1 */
+ '2', 0x00, /* wcChar2 */
+ '2', 0x00, /* wcChar3 */
+ '1', 0x00, /* wcChar4 */
+ '2', 0x00, /* wcChar5 */
+ '3', 0x00, /* wcChar6 */
+ '4', 0x00, /* wcChar7 */
+ '5', 0x00, /* wcChar8 */
+ '6', 0x00, /* wcChar9 */
+#ifdef CONFIG_USB_HS
+ ///////////////////////////////////////
+ /// device qualifier descriptor
+ ///////////////////////////////////////
+ 0x0a,
+ USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER,
+ 0x00,
+ 0x02,
+ 0x02,
+ 0x02,
+ 0x01,
+ 0x40,
+ 0x01,
+ 0x00,
+#endif
+ 0x00
+};
+
+/*!< class */
+usbd_class_t cdc_class;
+/*!< interface one */
+usbd_interface_t cdc_cmd_intf;
+/*!< interface two */
+usbd_interface_t cdc_data_intf;
+
+/* function ------------------------------------------------------------------*/
+void usbd_cdc_acm_bulk_out(uint8_t ep)
+{
+ uint8_t data[64];
+ uint32_t read_byte;
+
+ usbd_ep_read(ep, data, 64, &read_byte);
+ for (uint8_t i = 0; i < read_byte; i++) {
+ printf("%02x ", data[i]);
+ }
+ printf("\r\n");
+ printf("read len:%d\r\n", read_byte);
+ usbd_ep_read(ep, NULL, 0, NULL);
+}
+
+void usbd_cdc_acm_bulk_in(uint8_t ep)
+{
+ printf("in\r\n");
+}
+
+/*!< endpoint call back */
+usbd_class_t cdc_class1;
+usbd_interface_t cdc_cmd_intf1;
+usbd_interface_t cdc_data_intf1;
+
+usbd_endpoint_t cdc_out_ep1 = {
+ .ep_addr = CDC_OUT_EP,
+ .ep_cb = usbd_cdc_acm_bulk_out
+};
+
+usbd_endpoint_t cdc_in_ep1 = {
+ .ep_addr = CDC_IN_EP,
+ .ep_cb = usbd_cdc_acm_bulk_in
+};
+
+usbd_class_t cdc_class2;
+usbd_interface_t cdc_cmd_intf2;
+usbd_interface_t cdc_data_intf2;
+
+usbd_endpoint_t cdc_out_ep2 = {
+ .ep_addr = CDC_OUT_EP2,
+ .ep_cb = usbd_cdc_acm_bulk_out
+};
+
+usbd_endpoint_t cdc_in_ep2 = {
+ .ep_addr = CDC_IN_EP2,
+ .ep_cb = usbd_cdc_acm_bulk_in
+};
+
+usbd_class_t cdc_class3;
+usbd_interface_t cdc_cmd_intf3;
+usbd_interface_t cdc_data_intf3;
+
+usbd_endpoint_t cdc_out_ep3 = {
+ .ep_addr = CDC_OUT_EP3,
+ .ep_cb = usbd_cdc_acm_bulk_out
+};
+
+usbd_endpoint_t cdc_in_ep3 = {
+ .ep_addr = CDC_IN_EP3,
+ .ep_cb = usbd_cdc_acm_bulk_in
+};
+
+usbd_class_t cdc_class4;
+usbd_interface_t cdc_cmd_intf4;
+usbd_interface_t cdc_data_intf4;
+
+usbd_endpoint_t cdc_out_ep4 = {
+ .ep_addr = CDC_OUT_EP4,
+ .ep_cb = usbd_cdc_acm_bulk_out
+};
+
+usbd_endpoint_t cdc_in_ep4 = {
+ .ep_addr = CDC_IN_EP4,
+ .ep_cb = usbd_cdc_acm_bulk_in
+};
+
+/* function ------------------------------------------------------------------*/
+void cdc_acm_multi_init(void)
+{
+ usbd_desc_register(cdc_descriptor);
+
+ usbd_cdc_add_acm_interface(&cdc_class1, &cdc_cmd_intf1);
+ usbd_cdc_add_acm_interface(&cdc_class1, &cdc_data_intf1);
+ usbd_interface_add_endpoint(&cdc_data_intf1, &cdc_out_ep1);
+ usbd_interface_add_endpoint(&cdc_data_intf1, &cdc_in_ep1);
+
+ usbd_cdc_add_acm_interface(&cdc_class2, &cdc_cmd_intf2);
+ usbd_cdc_add_acm_interface(&cdc_class2, &cdc_data_intf2);
+ usbd_interface_add_endpoint(&cdc_data_intf2, &cdc_out_ep2);
+ usbd_interface_add_endpoint(&cdc_data_intf2, &cdc_in_ep2);
+
+ usbd_cdc_add_acm_interface(&cdc_class3, &cdc_cmd_intf3);
+ usbd_cdc_add_acm_interface(&cdc_class3, &cdc_data_intf3);
+ usbd_interface_add_endpoint(&cdc_data_intf3, &cdc_out_ep3);
+ usbd_interface_add_endpoint(&cdc_data_intf3, &cdc_in_ep3);
+
+ usbd_cdc_add_acm_interface(&cdc_class4, &cdc_cmd_intf4);
+ usbd_cdc_add_acm_interface(&cdc_class4, &cdc_data_intf4);
+ usbd_interface_add_endpoint(&cdc_data_intf4, &cdc_out_ep4);
+ usbd_interface_add_endpoint(&cdc_data_intf4, &cdc_in_ep4);
+
+ usbd_initialize();
+} \ No newline at end of file