diff options
| author | sakumisu <[email protected]> | 2023-03-11 19:06:13 +0800 |
|---|---|---|
| committer | sakumisu <[email protected]> | 2023-03-11 19:06:13 +0800 |
| commit | 66c46a3eb2bbe3b9f91d11b0f94bc51bbabe7631 (patch) | |
| tree | a1cbf67c01d0fd952f82099a602f2146f71cff48 | |
| parent | 79f0a1989ed7d39fd38b724a0e450bf7931604f6 (diff) | |
update printer driver and demo
| -rw-r--r-- | class/printer/usbd_printer.c | 14 | ||||
| -rw-r--r-- | class/printer/usbd_printer.h | 4 | ||||
| -rw-r--r-- | demo/printer_template.c | 163 |
3 files changed, 171 insertions, 10 deletions
diff --git a/class/printer/usbd_printer.c b/class/printer/usbd_printer.c index bdc5984c..1de7a79a 100644 --- a/class/printer/usbd_printer.c +++ b/class/printer/usbd_printer.c @@ -8,6 +8,7 @@ struct printer_cfg_priv { uint8_t *device_id; + uint8_t device_id_len; uint8_t port_status; } usbd_printer_cfg; @@ -19,7 +20,8 @@ static int printer_class_interface_request_handler(struct usb_setup_packet *setu switch (setup->bRequest) { case PRINTER_REQUEST_GET_DEVICE_ID: - + memcpy(*data, usbd_printer_cfg.device_id, usbd_printer_cfg.device_id_len); + *len = usbd_printer_cfg.device_id_len; break; case PRINTER_REQUEST_GET_PORT_SATTUS: @@ -46,18 +48,14 @@ static void printer_notify_handler(uint8_t event, void *arg) } } -struct usbd_interface *usbd_printer_alloc_intf(void) +struct usbd_interface *usbd_printer_init_intf(struct usbd_interface *intf, const uint8_t *device_id, uint8_t device_id_len) { - struct usbd_interface *intf = usb_malloc(sizeof(struct usbd_interface)); - if (intf == NULL) { - USB_LOG_ERR("no mem to alloc intf\r\n"); - return NULL; - } - intf->class_interface_handler = printer_class_interface_request_handler; intf->class_endpoint_handler = NULL; intf->vendor_handler = NULL; intf->notify_handler = printer_notify_handler; + usbd_printer_cfg.device_id = device_id; + usbd_printer_cfg.device_id_len = device_id_len; return intf; }
\ No newline at end of file diff --git a/class/printer/usbd_printer.h b/class/printer/usbd_printer.h index 7f691dfc..b2bbdf49 100644 --- a/class/printer/usbd_printer.h +++ b/class/printer/usbd_printer.h @@ -12,8 +12,8 @@ extern "C" { #endif -/* Alloc printer interface driver */ -struct usbd_interface *usbd_printer_alloc_intf(void); +/* Init printer interface driver */ +struct usbd_interface *usbd_printer_init_intf(struct usbd_interface *intf, const uint8_t *device_id, uint8_t device_id_len); #ifdef __cplusplus } diff --git a/demo/printer_template.c b/demo/printer_template.c new file mode 100644 index 00000000..9561933b --- /dev/null +++ b/demo/printer_template.c @@ -0,0 +1,163 @@ +#include "usbd_core.h" +#include "usb_printer.h" + +/*!< endpoint address */ +#define PRINTER_IN_EP 0x81 +#define PRINTER_IN_EP_SIZE 0x40 +#define PRINTER_OUT_EP 0x02 +#define PRINTER_OUT_EP_SIZE 0x40 + +#define USBD_VID 0x5A5A +#define USBD_PID 0xA5A5 +#define USBD_MAX_POWER 100 +#define USBD_LANGID_STRING 0x0409 + +/*!< config descriptor size */ +#define USB_CONFIG_SIZE (32) + +/*!< global descriptor */ +static const uint8_t printer_descriptor[] = { + USB_DEVICE_DESCRIPTOR_INIT(USB_2_0, 0x00, 0x00, 0x00, USBD_VID, USBD_PID, 0x0000, 0x01), + USB_CONFIG_DESCRIPTOR_INIT(USB_CONFIG_SIZE, 0x01, 0x01, USB_CONFIG_SELF_POWERED, USBD_MAX_POWER), + USB_INTERFACE_DESCRIPTOR_INIT(0x00, 0x00, 0x02, 0x07, 0x01, 0x02, 0x00), + USB_ENDPOINT_DESCRIPTOR_INIT(PRINTER_IN_EP, 0x02, PRINTER_IN_EP_SIZE, 0x00), + USB_ENDPOINT_DESCRIPTOR_INIT(PRINTER_OUT_EP, 0x02, PRINTER_OUT_EP_SIZE, 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 + /////////////////////////////////////// + 0x2A, /* 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 */ + 'P', 0x00, /* wcChar10 */ + 'R', 0x00, /* wcChar11 */ + 'I', 0x00, /* wcChar12 */ + 'N', 0x00, /* wcChar13 */ + 'T', 0x00, /* wcChar14 */ + ' ', 0x00, /* wcChar15 */ + 'D', 0x00, /* wcChar16 */ + 'E', 0x00, /* wcChar17 */ + 'M', 0x00, /* wcChar18 */ + 'O', 0x00, /* wcChar19 */ + /////////////////////////////////////// + /// 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 +}; + +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t read_buffer[PRINTER_OUT_EP_SIZE]; +USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t write_buffer[PRINTER_IN_EP_SIZE]; + +void usbd_configure_done_callback(void) +{ + /* setup first out ep read transfer */ + usbd_ep_start_read(PRINTER_OUT_EP, read_buffer, PRINTER_OUT_EP_SIZE); +} + +void usbd_printer_bulk_out(uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual out len:%d\r\n", nbytes); + // for (int i = 0; i < 100; i++) { + // printf("%02x ", read_buffer[i]); + // } + // printf("\r\n"); + /* setup next out ep read transfer */ + usbd_ep_start_read(PRINTER_OUT_EP, read_buffer, PRINTER_OUT_EP_SIZE); +} + +void usbd_printer_bulk_in(uint8_t ep, uint32_t nbytes) +{ + USB_LOG_RAW("actual in len:%d\r\n", nbytes); + + if ((nbytes % PRINTER_IN_EP_SIZE) == 0 && nbytes) { + /* send zlp */ + usbd_ep_start_write(PRINTER_IN_EP, NULL, 0); + } else { + } +} + +/*!< endpoint call back */ +struct usbd_endpoint printer_out_ep = { + .ep_addr = PRINTER_OUT_EP, + .ep_cb = usbd_printer_bulk_out +}; + +struct usbd_endpoint printer_in_ep = { + .ep_addr = PRINTER_IN_EP, + .ep_cb = usbd_printer_bulk_in +}; + +struct usbd_interface intf0; + +static const uint8_t printer_device_id[] = +{ + 0x00, 51, + 'M','F','G',':','C','B','M',';', + 'C','M','D',':','G','D','I',';', + 'M','D','L',':','C','B','M','1','0','0','0',';', + 'C','L','S',':','P','R','I','N','T','E','R',';', + 'M','O','D','E',':','G','D','I',';' +}; + +void printer_init(void) +{ + usbd_desc_register(printer_descriptor); + usbd_add_interface(usbd_printer_init_intf(&intf0), printer_device_id, sizeof(printer_device_id)); + usbd_add_endpoint(&printer_out_ep); + usbd_add_endpoint(&printer_in_ep); + + usbd_initialize(); +} |
