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