APM:Libraries
usb.h
Go to the documentation of this file.
1 #ifndef USB_STM32_H
2 #define USB_STM32_H
3 
4 #include <hal_types.h>
5 #include <gpio_hal.h>
6 #include <usart.h>
7 
8 #include <stdbool.h>
9 
10 #ifdef __cplusplus
11  extern "C" {
12 #endif
13 
14 
15 #include "../STM32_USB_Driver/usb_bsp.h"
16 #include "../STM32_USB_Driver/usb_regs.h"
17 #include "../STM32_USB_Driver/usbd_conf.h"
18 #include "../STM32_USB_Driver/usbd_usr.h"
19 #include "../STM32_USB_Driver/usbd_desc.h"
20 #include "../STM32_USB_Driver/usbd_cdc_core.h"
21 #include "../STM32_USB_Driver/usbd_ioreq.h"
22 #include "../STM32_USB_Driver/usbd_req.h"
23 #include "../STM32_USB_Driver/usbd_core.h"
24 
25 #include "../STM32_USB_Driver/ring_buff.h"
26 #include "../STM32_USB_Driver/min_max.h"
27 
28 #ifdef __cplusplus
29  }
30 #endif
31 
32 
33 
34 #define USBD_MANUFACTURER_STRING "RevoMini"
35 #define USBD_PRODUCT_FS_STRING "3DR Virtual COM"
36 #define USBD_SERIALNUMBER_FS_STRING "00000000050C"
37 #define USBD_CONFIGURATION_FS_STRING "VCP Config"
38 #define USBD_INTERFACE_FS_STRING "VCP Interface"
39 
40 #define USBD_VID 0x26ac
41 #define USBD_PID 0x0011
42 #define USBD_LANGID_STRING 0x409
43 
44 #define USB_RXFIFO_SIZE 256
45 #define USB_TXFIFO_SIZE 256
46 
47 
48 
49 #define USB_IRQ OTG_FS_IRQn
50 #define USB_AF GPIO_AF_OTG1_FS
51 #define USB_CLOCK RCC_AHB2Periph_OTG_FS
52 
53 
54 /* USB D-/D+ (DM/DP) */
55 #define DM_PIN_PORT _GPIOA //PA11
56 #define DM_PIN_PIN 11
57 #define DP_PIN_PORT _GPIOA //PA12
58 #define DP_PIN_PIN 12 //PA12
59 
60 
61 /* Exported typef ------------------------------------------------------------*/
62 /* The following structures groups all needed parameters to be configured for the
63  ComPort. These parameters can modified on the fly by the host through CDC class
64  command class requests. */
65 typedef struct
66 {
67  uint32_t bitrate;
68  uint8_t format;
69  uint8_t paritytype;
70  uint8_t datatype;
71 } LINE_CODING;
72 
73 /* USB Attribute Data Structure */
74 typedef struct {
75  uint8_t preempt_prio; /* pre-emption priority for the IRQ channel */
76  uint8_t sub_prio; /* subpriority level for the IRQ channel */
77  uint8_t use_present_pin;
79  uint16_t present_pin;
80 // char *description;
81 // char *manufacturer;
82 // char *serial_number;
83 // char *configuration;
84 // char *interface;
85 } usb_attr_t;
86 
87 #define I_USB_CLEAR 1
88 #define I_USB_CONNECTED 2
89 #define I_USB_GETATTR 3
90 #define I_USB_SETATTR 4
91 
92 #ifdef __cplusplus
93  extern "C" {
94 #endif
95 
96 
98 
99 /* functions */
100 int usb_open(void);
101 int usb_close(void);
102 int usb_ioctl(int request, void * ctl);
103 int usb_read(void * buf, unsigned int nbytes);
104 void usb_default_attr(usb_attr_t *attr);
105 int usb_configure(usb_attr_t * attr);
106 void usb_setParams(usb_attr_t * attr);
107 
109 
110 void USB_OTG_BSP_mDelay (const uint32_t msec);
111 
112 extern uint8_t is_usb_connected(usb_attr_t *attr);
113 uint8_t is_usb_opened();
114 void reset_usb_opened();
115 
116 int usb_write(const uint8_t *buf, unsigned int nbytes);
117 int usb_read(void * buf, unsigned int nbytes);
118 uint32_t usb_data_available(void);
119 uint16_t usb_tx_space(void);
120 
121 void usb_reset_rx();
122 void usb_reset_tx();
123 bool usb_get_dtr();
124 
125 static inline uint8_t usb_putc(uint8_t b){ return usb_write(&b, 1); }
126 //uint8_t usb_getc(void);
127 static inline uint8_t usb_getc(void){ uint8_t c; usb_read(&c, 1); return c; }
128 
129 
130 uint16_t usb_tx_pending(void);
131 
132 
133 static inline void usb_disconnect(){
134 // (__IO USB_OTG_GREGS *)(USB_OTG_FS_BASE_ADDR + USB_OTG_CORE_GLOBAL_REGS_OFFSET)->GCCFG = 0;
135 // (__IO USB_OTG_GREGS *)(USB_OTG_HS_BASE_ADDR + USB_OTG_CORE_GLOBAL_REGS_OFFSET)->GCCFG = 0;
136 
137 // USB_OTG_dev.regs.GREGS->GCCFG = 0;
138 
139 
140  USB_OTG_DCTL_TypeDef dctl, dctl0;
141 
142 // dctl.d32 = USB_OTG_READ_REG32(&USB_OTG_FS_regs.DEV->DCTL);
143  dctl.d32 = USB_OTG_dev.regs.DREGS->DCTL;
144 
145  dctl0=dctl;
146 
147  /* Disconnect device for 20ms */
148  dctl.b.sftdiscon = 1;
149 // USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.DEV->DCTL, dctl.d32);
150  USB_OTG_dev.regs.DREGS->DCTL = dctl.d32;
151 
152  USB_OTG_BSP_mDelay(250);
153 
154  USB_OTG_dev.regs.DREGS->DCTL = dctl0.d32;
155 }
156 
157 #define DEFAULT_CONFIG 0
158 #define OTHER_CONFIG 1
159 
160 #ifdef __cplusplus
161  }
162 #endif
163 
164 void USB_OTG_BSP_uDelay (const uint32_t usec);
165 
166 
167 /* Get the total number of data/space bytes available */
168 unsigned VCP_DataAvail(void);
169 unsigned VCP_SpaceAvail(void);
170 
171 /* Get the number of contiguous data/space bytes available */
172 unsigned VCP_DataAvailContig(void);
173 unsigned VCP_SpaceAvailContig(void);
174 
175 /* Get/put data from/to contiguous area */
176 unsigned VCP_GetContig(void* buff, unsigned max_len);
177 unsigned VCP_PutContig(void const* buff, unsigned len);
178 
179 /* Get/put as much as possible */
180 unsigned VCP_Get(void* buff, unsigned max_len);
181 unsigned VCP_Put(void const* buff, unsigned len);
182 
183 /* Returns pointer to contiguous input data area */
184 static inline uint8_t const* VCP_DataPtr(void){ return USB_Rx_Buffer + USB_Rx_buff_tail; }
185 
186 /* Returns pointer to contiguous output free space area */
187 static inline uint8_t* VCP_SpacePtr(void) { return USB_Tx_Buffer + USB_Tx_buff_head; }
188 
189 /* Mark data as read */
190 void VCP_MarkRead(unsigned sz);
191 
192 /* Mark space as written */
193 void VCP_MarkWritten(unsigned sz);
194 
195 int usb_periphcfg(FunctionalState state);
196 
197 
198 void VCP_SetUSBTxBlocking(uint8_t Mode);
199 void OTG_FS_IRQHandler(void);
200 
201 
202 /*
203  * Descriptors and other paraphernalia
204  */
205 
206 /* Descriptor types */
207 
208 #define USB_DESCRIPTOR_TYPE_DEVICE 0x01
209 #define USB_DESCRIPTOR_TYPE_CONFIGURATION 0x02
210 #define USB_DESCRIPTOR_TYPE_STRING 0x03
211 #define USB_DESCRIPTOR_TYPE_INTERFACE 0x04
212 #define USB_DESCRIPTOR_TYPE_ENDPOINT 0x05
213 
214 /* Descriptor structs and declaration helpers */
215 
216 #define USB_DESCRIPTOR_STRING_LEN(x) (2 + (x << 1))
217 
218 #define USB_DESCRIPTOR_STRING(len) \
219  struct { \
220  uint8_t bLength; \
221  uint8_t bDescriptorType; \
222  uint16_t bString[len]; \
223  } __packed
224 
225 typedef struct usb_descriptor_device {
226  uint8_t bLength;
228  uint16_t bcdUSB;
229  uint8_t bDeviceClass;
233  uint16_t idVendor;
234  uint16_t idProduct;
235  uint16_t bcdDevice;
236  uint8_t iManufacturer;
237  uint8_t iProduct;
238  uint8_t iSerialNumber;
241 
243  uint8_t bLength;
245  uint16_t wTotalLength;
246  uint8_t bNumInterfaces;
248  uint8_t iConfiguration;
249  uint8_t bmAttributes;
250  uint8_t bMaxPower;
252 
253 typedef struct usb_descriptor_interface {
254  uint8_t bLength;
258  uint8_t bNumEndpoints;
262  uint8_t iInterface;
264 
265 typedef struct usb_descriptor_endpoint {
266  uint8_t bLength;
269  uint8_t bmAttributes;
270  uint16_t wMaxPacketSize;
271  uint8_t bInterval;
273 
274 typedef struct usb_descriptor_string {
275  uint8_t bLength;
277  uint8_t bString[];
279 
280 /* Common values that go inside descriptors */
281 
282 #define USB_CONFIG_ATTR_BUSPOWERED 0b10000000
283 #define USB_CONFIG_ATTR_SELF_POWERED 0b11000000
284 
285 #define USB_EP_TYPE_INTERRUPT 0x03
286 #define USB_EP_TYPE_BULK 0x02
287 
288 #define USB_DESCRIPTOR_ENDPOINT_IN 0x80
289 #define USB_DESCRIPTOR_ENDPOINT_OUT 0x00
290 
291 /*
292  * USB module core
293  */
294 
295 #ifndef USB_ISR_MSK
296 /* Handle CTRM, WKUPM, SUSPM, ERRM, SOFM, ESOFM, RESETM */
297 #define USB_ISR_MSK 0xBF00
298 #endif
299 
300 
301 typedef enum usb_dev_state {
308 } usb_dev_state;
309 
310 
311 // Encapsulates global state formerly handled by usb_lib/
312 /*
313 typedef struct usblib_dev {
314  uint32_t irq_mask;
315  void (**ep_int_in)(void);
316  void (**ep_int_out)(void);
317  usb_dev_state state;
318  usb_dev_state prevState;
319  rcc_clk_id clk_id;
320 } usblib_dev;
321 */
322 
323 #endif
uint8_t bmAttributes
Definition: usb.h:269
unsigned VCP_Get(void *buff, unsigned max_len)
uint8_t bInterfaceSubClass
Definition: usb.h:260
#define __packed
Definition: hal_types.h:43
uint8_t USB_Tx_Buffer[]
void VCP_SetUSBTxBlocking(uint8_t Mode)
Definition: usb.c:789
struct usb_descriptor_device usb_descriptor_device
uint8_t bDescriptorType
Definition: usb.h:227
uint16_t present_pin
Definition: usb.h:79
uint8_t bDescriptorType
Definition: usb.h:255
uint8_t iManufacturer
Definition: usb.h:236
unsigned VCP_PutContig(void const *buff, unsigned len)
Definition: usb.c:564
uint8_t bDeviceClass
Definition: usb.h:229
uint8_t bInterfaceNumber
Definition: usb.h:256
int usb_open(void)
Definition: usb.c:674
USB_OTG_CORE_HANDLE USB_OTG_dev
struct usb_descriptor_config_header usb_descriptor_config_header
struct usb_descriptor_endpoint usb_descriptor_endpoint
uint8_t format
Definition: usb.h:68
uint8_t bAlternateSetting
Definition: usb.h:257
void USB_OTG_BSP_mDelay(const uint32_t msec)
Definition: usb.c:393
Definition: usb.h:74
void usb_default_attr(usb_attr_t *attr)
Definition: usb.c:296
uint8_t bLength
Definition: usb.h:275
static uint8_t usb_getc(void)
Definition: usb.h:127
uint8_t iProduct
Definition: usb.h:237
uint32_t bitrate
Definition: usb.h:67
uint8_t paritytype
Definition: usb.h:69
uint8_t iInterface
Definition: usb.h:262
unsigned VCP_GetContig(void *buff, unsigned max_len)
Definition: usb.c:625
uint8_t USB_Rx_Buffer[]
uint16_t usb_tx_pending(void)
Definition: usb.c:780
void usb_reset_tx()
Definition: usb.c:776
uint16_t usb_tx_space(void)
Definition: usb.c:784
uint16_t idProduct
Definition: usb.h:234
static void usb_disconnect()
Definition: usb.h:133
static uint8_t * VCP_SpacePtr(void)
Definition: usb.h:187
void reset_usb_opened()
Definition: usb.c:795
int usb_periphcfg(FunctionalState state)
Definition: usb.c:314
usb_dev_state
Definition: usb.h:301
void usb_setParams(usb_attr_t *attr)
Definition: usb.c:365
unsigned VCP_SpaceAvail(void)
Definition: usb.c:575
void OTG_FS_IRQHandler(void)
Definition: usb.c:168
struct usb_descriptor_interface usb_descriptor_interface
__IO uint32_t DCTL
Definition: usb_regs.h:116
struct _USB_OTG_DCTL_TypeDef::@66 b
void USB_OTG_BSP_uDelay(const uint32_t usec)
Definition: usb.c:751
uint16_t idVendor
Definition: usb.h:233
unsigned VCP_Put(void const *buff, unsigned len)
unsigned VCP_DataAvail(void)
Definition: usb.c:609
unsigned VCP_SpaceAvailContig(void)
Definition: usb.c:556
void USB_OTG_BSP_DisableInterrupt()
Definition: usb.c:388
uint8_t is_usb_connected(usb_attr_t *attr)
Definition: usb.c:705
static int state
Definition: Util.cpp:20
uint8_t bLength
Definition: usb.h:226
uint32_t usb_data_available(void)
Definition: usb.c:764
void VCP_MarkRead(unsigned sz)
Definition: usb.c:618
int usb_close(void)
Definition: usb.c:688
void VCP_MarkWritten(unsigned sz)
Definition: usb.c:549
uint8_t bMaxPacketSize0
Definition: usb.h:232
uint8_t bNumEndpoints
Definition: usb.h:258
struct usb_descriptor_string usb_descriptor_string
uint32_t USB_Rx_buff_tail
uint8_t preempt_prio
Definition: usb.h:75
static uint8_t const * VCP_DataPtr(void)
Definition: usb.h:184
uint8_t bNumConfigurations
Definition: usb.h:239
uint8_t bDescriptorType
Definition: usb.h:276
uint16_t wMaxPacketSize
Definition: usb.h:270
int usb_write(const uint8_t *buf, unsigned int nbytes)
Definition: usb.c:756
uint8_t bInterfaceProtocol
Definition: usb.h:261
const gpio_dev * present_port
Definition: usb.h:78
uint8_t bInterval
Definition: usb.h:271
uint8_t bEndpointAddress
Definition: usb.h:268
uint16_t bcdUSB
Definition: usb.h:228
uint8_t bDescriptorType
Definition: usb.h:267
uint8_t sub_prio
Definition: usb.h:76
void usb_reset_rx()
Definition: usb.c:772
bool usb_get_dtr()
Definition: usb.c:768
uint8_t datatype
Definition: usb.h:70
int usb_ioctl(int request, void *ctl)
Definition: usb.c:716
uint8_t bDeviceProtocol
Definition: usb.h:231
int usb_configure(usb_attr_t *attr)
Definition: usb.c:350
uint8_t bDeviceSubClass
Definition: usb.h:230
uint8_t is_usb_opened()
Definition: usb.c:794
int usb_read(void *buf, unsigned int nbytes)
Definition: usb.c:760
static uint8_t usb_putc(uint8_t b)
Definition: usb.h:125
unsigned VCP_DataAvailContig(void)
Definition: usb.c:636
uint8_t bConfigurationValue
Definition: usb.h:247
uint8_t bInterfaceClass
Definition: usb.h:259
USB_OTG_CORE_REGS regs
Definition: usb_core.h:299
uint16_t bcdDevice
Definition: usb.h:235
uint8_t use_present_pin
Definition: usb.h:77
uint8_t iSerialNumber
Definition: usb.h:238
uint32_t USB_Tx_buff_head
USB_OTG_DREGS * DREGS
Definition: usb_regs.h:225