Gnuk->NeuG
[gnuk/neug.git] / src / usb_lld.h
1 #define USB_DEVICE_DESCRIPTOR_TYPE              0x01
2 #define USB_CONFIGURATION_DESCRIPTOR_TYPE       0x02
3 #define USB_STRING_DESCRIPTOR_TYPE              0x03
4 #define USB_INTERFACE_DESCRIPTOR_TYPE           0x04
5 #define USB_ENDPOINT_DESCRIPTOR_TYPE            0x05
6
7 #define STANDARD_ENDPOINT_DESC_SIZE             0x09
8
9 /* endpoints enumeration */
10 #define ENDP0       ((uint8_t)0)
11 #define ENDP1       ((uint8_t)1)
12 #define ENDP2       ((uint8_t)2)
13 #define ENDP3       ((uint8_t)3)
14 #define ENDP4       ((uint8_t)4)
15 #define ENDP5       ((uint8_t)5)
16 #define ENDP6       ((uint8_t)6)
17 #define ENDP7       ((uint8_t)7)
18
19 /* EP_TYPE[1:0] EndPoint TYPE */
20 #define EP_BULK        (0x0000) /* EndPoint BULK        */
21 #define EP_CONTROL     (0x0200) /* EndPoint CONTROL     */
22 #define EP_ISOCHRONOUS (0x0400) /* EndPoint ISOCHRONOUS */
23 #define EP_INTERRUPT   (0x0600) /* EndPoint INTERRUPT   */
24
25 enum RECIPIENT_TYPE
26 {
27   DEVICE_RECIPIENT,     /* Recipient device    */
28   INTERFACE_RECIPIENT,  /* Recipient interface */
29   ENDPOINT_RECIPIENT,   /* Recipient endpoint  */
30   OTHER_RECIPIENT
31 };
32
33 enum DESCRIPTOR_TYPE
34 {
35   DEVICE_DESCRIPTOR = 1,
36   CONFIG_DESCRIPTOR,
37   STRING_DESCRIPTOR,
38   INTERFACE_DESCRIPTOR,
39   ENDPOINT_DESCRIPTOR
40 };
41
42 #define REQUEST_DIR       0x80  /* Mask to get request dir  */
43 #define REQUEST_TYPE      0x60  /* Mask to get request type */
44 #define STANDARD_REQUEST  0x00  /* Standard request         */
45 #define CLASS_REQUEST     0x20  /* Class request            */
46 #define VENDOR_REQUEST    0x40  /* Vendor request           */
47 #define RECIPIENT         0x1F  /* Mask to get recipient    */
48
49 #define USB_SETUP_SET(req) ((req & REQUEST_DIR) == 0)
50 #define USB_SETUP_GET(req) ((req & REQUEST_DIR) != 0)
51
52 struct Descriptor
53 {
54   const uint8_t *Descriptor;
55   uint16_t Descriptor_Size;
56 };
57
58 enum
59 {
60   USB_UNSUPPORT = 0,
61   USB_SUCCESS = 1,
62 };
63
64 struct usb_device_method
65 {
66   void (*reset) (void);
67   void (*ctrl_write_finish) (uint8_t req, uint8_t req_no,
68                              uint16_t value, uint16_t index, uint16_t len);
69   int (*setup) (uint8_t req, uint8_t req_no,
70                 uint16_t value, uint16_t index, uint16_t len);
71   int (*get_descriptor) (uint8_t desc_type, uint16_t index, uint16_t value);
72   int (*event) (uint8_t event_type, uint16_t value);
73   int (*interface) (uint8_t cmd, uint16_t interface, uint16_t value);
74 };
75
76 enum {
77   USB_EVENT_ADDRESS,
78   USB_EVENT_CONFIG,
79   USB_EVENT_SUSPEND,
80   USB_EVENT_WAKEUP,
81   USB_EVENT_STALL,
82 };
83
84 enum {
85   USB_SET_INTERFACE,
86   USB_GET_INTERFACE,
87   USB_QUERY_INTERFACE,
88 };
89
90 extern void USB_Cable_Config (int NewState);
91
92 extern const struct usb_device_method Device_Method;
93
94 extern const struct Descriptor Device_Descriptor;
95 extern const struct Descriptor Config_Descriptor;
96 extern const struct Descriptor String_Descriptors[];
97
98 enum DEVICE_STATE
99 {
100   UNCONNECTED,
101   ATTACHED,
102   POWERED,
103   SUSPENDED,
104   ADDRESSED,
105   CONFIGURED
106 };
107
108 extern uint32_t bDeviceState;
109
110 #define STM32_USB_IRQ_PRIORITY     11
111
112 extern void usb_lld_init (uint8_t feature);
113
114 extern void usb_lld_to_pmabuf (const void *src, uint16_t addr, size_t n);
115
116 extern void usb_lld_from_pmabuf (void *dst, uint16_t addr, size_t n);
117
118 extern void usb_lld_stall_tx (int ep_num);
119
120 extern void usb_lld_stall_rx (int ep_num);
121
122 extern int usb_lld_tx_data_len (int ep_num);
123
124 extern void usb_lld_txcpy (const void *src, int ep_num, int offset, size_t len);
125
126 extern void usb_lld_tx_enable (int ep_num, size_t len);
127
128 extern void usb_lld_write (uint8_t ep_num, const void *buf, size_t len);
129
130 extern void usb_lld_rx_enable (int ep_num);
131
132 extern int usb_lld_rx_data_len (int ep_num);
133
134 extern void usb_lld_rxcpy (uint8_t *dst, int ep_num, int offset, size_t len);
135
136 extern void usb_lld_reset (void);
137
138 extern void usb_lld_setup_endpoint (int ep_num, int ep_type, int ep_kind,
139                                     int ep_rx_addr, int ep_tx_addr,
140                                     int ep_rx_memory_size);
141
142 extern void usb_lld_set_configuration (uint8_t config);
143
144 extern uint8_t usb_lld_current_configuration (void);
145
146 extern void usb_lld_set_feature (uint8_t feature);
147
148 extern void usb_lld_set_data_to_send (const void *p, size_t len);
149
150 extern inline void usb_lld_set_data_to_recv (void *p, size_t len)
151 {
152   usb_lld_set_data_to_send ((const void *)p, len);
153 }
154
155 extern void usb_lld_prepare_shutdown (void);
156 extern void usb_lld_shutdown (void);
157
158 extern void usb_interrupt_handler (void);