]> mj.ucw.cz Git - home-hw.git/blob - Src/usbdev.c
Avoid endpoint collisions
[home-hw.git] / Src / usbdev.c
1 #include "stm32f1xx.h"
2 #include "stm32f1xx_hal.h"
3
4 #include "util.h"
5 #include "usb.h"
6
7 /*** Descriptors ***/
8
9 #define DESC_U16(x) ((x) & 0xff), ((x) >> 8)
10
11 enum desc_string {
12   DESC_STR_NONE = 0,
13   DESC_STR_MANUFACTURER,
14   DESC_STR_PRODUCT,
15   DESC_STR_SERIAL,
16   DESC_STR_CONFIGURATION,
17   DESC_STR_INTERFACE,
18 };
19
20 static const byte desc_device[] = {
21   18,                           // bLength
22   USB_DESC_TYPE_DEVICE,         // bDescriptorType
23   DESC_U16(0x0200),             // bcdUSB
24   0x00,                         // bDeviceClass
25   0x00,                         // bDeviceSubClass
26   0x00,                         // bDeviceProtocol
27   USB_MAX_EP0_SIZE,             // bMaxPacketSize
28   DESC_U16(0x4242),             // idVendor
29   DESC_U16(0x0001),             // idProduct
30   DESC_U16(0x0200),             // bcdDevice
31   DESC_STR_MANUFACTURER,        // iManufacturer
32   DESC_STR_PRODUCT,             // iProduct
33   DESC_STR_SERIAL,              // iSerialNumber
34   USB_NUM_CONFIGURATIONS,       // bNumConfigurations
35 };
36
37 static const byte desc_config[] = {
38   // Configuration descriptor
39   9,                            // bLength
40   USB_DESC_TYPE_CONFIGURATION,  // bDescriptorType
41   32,                           // wTotalLength
42   0,
43   0x01,                         // bNumInterfaces
44   0x01,                         // bConfigurationValue
45   DESC_STR_CONFIGURATION,       // iConfiguration
46   0xc0,                         // bmAttributes: bus-powered, supports remote wakeup
47   0x32,                         // Max power: 100 mA
48   // Interface descriptor
49   9,                            // bLength
50   USB_DESC_TYPE_INTERFACE,      // bDescriptorType
51   0x00,                         // bInterfaceNumber
52   0x00,                         // bAlternateSetting
53   0x02,                         // bNumEndpoints
54   0xff,                         // bInterfaceClass: vendor-defined
55   0x00,                         // bInterfaceSubClass
56   0x00,                         // nInterfaceProtocol
57   DESC_STR_INTERFACE,           // iInterface
58   // End-point descriptor
59   7,                            // bLength
60   USB_DESC_TYPE_ENDPOINT,       // bDescriptorType
61   0x01,                         // bEndpointAddress
62   USB_EP_TYPE_BULK,             // bmAttributes
63   0x40, 0x00,                   // wMaxPacketSize
64   0x00,                         // bInterval: unused
65   // End-point descriptor
66   7,                            // bLength
67   USB_DESC_TYPE_ENDPOINT,       // bDescriptorType
68   0x82,                         // bEndpointAddress
69   USB_EP_TYPE_BULK,             // bmAttributes
70   0x40, 0x00,                   // wMaxPacketSize
71   0x00,                         // bInterval: unused
72 };
73
74 static const char * const desc_string[] = {
75   NULL,                         // DESC_STR_NONE
76   "United Computer Wizards",    // DESC_STR_MANUFACTURER
77   "Mysterious Gadget",          // DESC_STR_PRODUCT
78   "00000042",                   // DESC_STR_SERIAL
79   "Default Configuration",      // DESC_STR_CONFIGURATION
80   "Default Interface",          // DESC_STR_INTERFACE
81 };
82
83 static const byte desc_languages[] = {
84   4,                            // bLength
85   USB_DESC_TYPE_STRING,         // bDescriptorType
86   DESC_U16(1033),               // English
87 };
88
89 /*** Callbacks ***/
90
91 static byte usb_rx_buf[64];
92 static byte usb_tx_buf[64];
93
94 void usb_dev_reset(struct usb *usb)
95 {
96   usb->desc_device = desc_device;
97   usb->desc_device_len = sizeof(desc_device);
98   usb->desc_config = desc_config;
99   usb->desc_config_len = sizeof(desc_config);
100   usb->desc_string = desc_string;
101   usb->desc_string_items = sizeof(desc_string) / sizeof(desc_string[0]);
102   usb->desc_languages = desc_languages;
103   usb->desc_languages_len = sizeof(desc_languages);
104 }
105
106 void usb_dev_configure(struct usb *usb)
107 {
108   usb_ep_open(usb, 0x01, USB_EP_TYPE_BULK, 64);
109   usb_ep_open(usb, 0x82, USB_EP_TYPE_BULK, 64);
110   usb_ep_receive(usb, 0x01, usb_rx_buf, 64);
111 }
112
113 void usb_dev_unconfigure(struct usb *usb)
114 {
115   usb_ep_close(usb, 0x01);
116   usb_ep_close(usb, 0x82);
117 }
118
119 bool usb_dev_setup_hook(struct usb *usb, struct setup_request *setup)
120 {
121   return false;
122 }
123
124 void usb_dev_ctl_recv_done(struct usb *usb)
125 {
126 }
127
128 void usb_dev_ctl_send_done(struct usb *usb)
129 {
130 }
131
132 void usb_dev_recv_done(struct usb *usb, byte epnum)
133 {
134   if (epnum == 0x01)
135     {
136       usb_tx_buf[0]++;
137       usb_ep_send(usb, 0x82, usb_tx_buf, 33);
138     }
139 }
140
141 void usb_dev_send_done(struct usb *usb, byte epnum)
142 {
143   usb_ep_receive(usb, 0x01, usb_rx_buf, 64);
144 }