You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
323 lines
8.1 KiB
323 lines
8.1 KiB
#ifndef USB_STM32_H |
|
#define USB_STM32_H |
|
|
|
#include <hal_types.h> |
|
#include <gpio_hal.h> |
|
#include <usart.h> |
|
|
|
#include <stdbool.h> |
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
|
|
|
|
#include "../STM32_USB_Driver/usb_bsp.h" |
|
#include "../STM32_USB_Driver/usb_regs.h" |
|
#include "../STM32_USB_Driver/usbd_conf.h" |
|
#include "../STM32_USB_Driver/usbd_usr.h" |
|
#include "../STM32_USB_Driver/usbd_desc.h" |
|
#include "../STM32_USB_Driver/usbd_cdc_core.h" |
|
#include "../STM32_USB_Driver/usbd_ioreq.h" |
|
#include "../STM32_USB_Driver/usbd_req.h" |
|
#include "../STM32_USB_Driver/usbd_core.h" |
|
|
|
#include "../STM32_USB_Driver/ring_buff.h" |
|
#include "../STM32_USB_Driver/min_max.h" |
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
|
|
|
|
|
|
#define USBD_MANUFACTURER_STRING "RevoMini" |
|
#define USBD_PRODUCT_FS_STRING "3DR Virtual COM" |
|
#define USBD_SERIALNUMBER_FS_STRING "00000000050C" |
|
#define USBD_CONFIGURATION_FS_STRING "VCP Config" |
|
#define USBD_INTERFACE_FS_STRING "VCP Interface" |
|
|
|
#define USBD_VID 0x26ac |
|
#define USBD_PID 0x0011 |
|
#define USBD_LANGID_STRING 0x409 |
|
|
|
#define USB_RXFIFO_SIZE 256 |
|
#define USB_TXFIFO_SIZE 256 |
|
|
|
|
|
|
|
#define USB_IRQ OTG_FS_IRQn |
|
#define USB_AF GPIO_AF_OTG1_FS |
|
#define USB_CLOCK RCC_AHB2Periph_OTG_FS |
|
|
|
|
|
/* USB D-/D+ (DM/DP) */ |
|
#define DM_PIN_PORT _GPIOA //PA11 |
|
#define DM_PIN_PIN 11 |
|
#define DP_PIN_PORT _GPIOA //PA12 |
|
#define DP_PIN_PIN 12 //PA12 |
|
|
|
|
|
/* Exported typef ------------------------------------------------------------*/ |
|
/* The following structures groups all needed parameters to be configured for the |
|
ComPort. These parameters can modified on the fly by the host through CDC class |
|
command class requests. */ |
|
typedef struct |
|
{ |
|
uint32_t bitrate; |
|
uint8_t format; |
|
uint8_t paritytype; |
|
uint8_t datatype; |
|
} LINE_CODING; |
|
|
|
/* USB Attribute Data Structure */ |
|
typedef struct { |
|
uint8_t preempt_prio; /* pre-emption priority for the IRQ channel */ |
|
uint8_t sub_prio; /* subpriority level for the IRQ channel */ |
|
uint8_t use_present_pin; |
|
const gpio_dev *present_port; |
|
uint16_t present_pin; |
|
// char *description; |
|
// char *manufacturer; |
|
// char *serial_number; |
|
// char *configuration; |
|
// char *interface; |
|
} usb_attr_t; |
|
|
|
#define I_USB_CLEAR 1 |
|
#define I_USB_CONNECTED 2 |
|
#define I_USB_GETATTR 3 |
|
#define I_USB_SETATTR 4 |
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
|
|
|
|
extern USB_OTG_CORE_HANDLE USB_OTG_dev; |
|
|
|
/* functions */ |
|
int usb_open(void); |
|
int usb_close(void); |
|
int usb_ioctl(int request, void * ctl); |
|
int usb_read(void * buf, unsigned int nbytes); |
|
void usb_default_attr(usb_attr_t *attr); |
|
int usb_configure(usb_attr_t * attr); |
|
void usb_setParams(usb_attr_t * attr); |
|
|
|
void USB_OTG_BSP_DisableInterrupt(); |
|
|
|
void USB_OTG_BSP_mDelay (const uint32_t msec); |
|
|
|
extern uint8_t is_usb_connected(usb_attr_t *attr); |
|
uint8_t is_usb_opened(); |
|
void reset_usb_opened(); |
|
|
|
int usb_write(const uint8_t *buf, unsigned int nbytes); |
|
int usb_read(void * buf, unsigned int nbytes); |
|
uint32_t usb_data_available(void); |
|
uint16_t usb_tx_space(void); |
|
|
|
void usb_reset_rx(); |
|
void usb_reset_tx(); |
|
bool usb_get_dtr(); |
|
|
|
static inline uint8_t usb_putc(uint8_t b){ return usb_write(&b, 1); } |
|
//uint8_t usb_getc(void); |
|
static inline uint8_t usb_getc(void){ uint8_t c; usb_read(&c, 1); return c; } |
|
|
|
|
|
uint16_t usb_tx_pending(void); |
|
|
|
|
|
static inline void usb_disconnect(){ |
|
// (__IO USB_OTG_GREGS *)(USB_OTG_FS_BASE_ADDR + USB_OTG_CORE_GLOBAL_REGS_OFFSET)->GCCFG = 0; |
|
// (__IO USB_OTG_GREGS *)(USB_OTG_HS_BASE_ADDR + USB_OTG_CORE_GLOBAL_REGS_OFFSET)->GCCFG = 0; |
|
|
|
// USB_OTG_dev.regs.GREGS->GCCFG = 0; |
|
|
|
|
|
USB_OTG_DCTL_TypeDef dctl, dctl0; |
|
|
|
// dctl.d32 = USB_OTG_READ_REG32(&USB_OTG_FS_regs.DEV->DCTL); |
|
dctl.d32 = USB_OTG_dev.regs.DREGS->DCTL; |
|
|
|
dctl0=dctl; |
|
|
|
/* Disconnect device for 20ms */ |
|
dctl.b.sftdiscon = 1; |
|
// USB_OTG_WRITE_REG32(&USB_OTG_FS_regs.DEV->DCTL, dctl.d32); |
|
USB_OTG_dev.regs.DREGS->DCTL = dctl.d32; |
|
|
|
USB_OTG_BSP_mDelay(250); |
|
|
|
USB_OTG_dev.regs.DREGS->DCTL = dctl0.d32; |
|
} |
|
|
|
#define DEFAULT_CONFIG 0 |
|
#define OTHER_CONFIG 1 |
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
|
|
void USB_OTG_BSP_uDelay (const uint32_t usec); |
|
|
|
|
|
/* Get the total number of data/space bytes available */ |
|
unsigned VCP_DataAvail(void); |
|
unsigned VCP_SpaceAvail(void); |
|
|
|
/* Get the number of contiguous data/space bytes available */ |
|
unsigned VCP_DataAvailContig(void); |
|
unsigned VCP_SpaceAvailContig(void); |
|
|
|
/* Get/put data from/to contiguous area */ |
|
unsigned VCP_GetContig(void* buff, unsigned max_len); |
|
unsigned VCP_PutContig(void const* buff, unsigned len); |
|
|
|
/* Get/put as much as possible */ |
|
unsigned VCP_Get(void* buff, unsigned max_len); |
|
unsigned VCP_Put(void const* buff, unsigned len); |
|
|
|
/* Returns pointer to contiguous input data area */ |
|
static inline uint8_t const* VCP_DataPtr(void){ return USB_Rx_Buffer + USB_Rx_buff_tail; } |
|
|
|
/* Returns pointer to contiguous output free space area */ |
|
static inline uint8_t* VCP_SpacePtr(void) { return USB_Tx_Buffer + USB_Tx_buff_head; } |
|
|
|
/* Mark data as read */ |
|
void VCP_MarkRead(unsigned sz); |
|
|
|
/* Mark space as written */ |
|
void VCP_MarkWritten(unsigned sz); |
|
|
|
int usb_periphcfg(FunctionalState state); |
|
|
|
|
|
void VCP_SetUSBTxBlocking(uint8_t Mode); |
|
void OTG_FS_IRQHandler(void); |
|
|
|
|
|
/* |
|
* Descriptors and other paraphernalia |
|
*/ |
|
|
|
/* Descriptor types */ |
|
|
|
#define USB_DESCRIPTOR_TYPE_DEVICE 0x01 |
|
#define USB_DESCRIPTOR_TYPE_CONFIGURATION 0x02 |
|
#define USB_DESCRIPTOR_TYPE_STRING 0x03 |
|
#define USB_DESCRIPTOR_TYPE_INTERFACE 0x04 |
|
#define USB_DESCRIPTOR_TYPE_ENDPOINT 0x05 |
|
|
|
/* Descriptor structs and declaration helpers */ |
|
|
|
#define USB_DESCRIPTOR_STRING_LEN(x) (2 + (x << 1)) |
|
|
|
#define USB_DESCRIPTOR_STRING(len) \ |
|
struct { \ |
|
uint8_t bLength; \ |
|
uint8_t bDescriptorType; \ |
|
uint16_t bString[len]; \ |
|
} __packed |
|
|
|
typedef struct usb_descriptor_device { |
|
uint8_t bLength; |
|
uint8_t bDescriptorType; |
|
uint16_t bcdUSB; |
|
uint8_t bDeviceClass; |
|
uint8_t bDeviceSubClass; |
|
uint8_t bDeviceProtocol; |
|
uint8_t bMaxPacketSize0; |
|
uint16_t idVendor; |
|
uint16_t idProduct; |
|
uint16_t bcdDevice; |
|
uint8_t iManufacturer; |
|
uint8_t iProduct; |
|
uint8_t iSerialNumber; |
|
uint8_t bNumConfigurations; |
|
} __packed usb_descriptor_device; |
|
|
|
typedef struct usb_descriptor_config_header { |
|
uint8_t bLength; |
|
uint8_t bDescriptorType; |
|
uint16_t wTotalLength; |
|
uint8_t bNumInterfaces; |
|
uint8_t bConfigurationValue; |
|
uint8_t iConfiguration; |
|
uint8_t bmAttributes; |
|
uint8_t bMaxPower; |
|
} __packed usb_descriptor_config_header; |
|
|
|
typedef struct usb_descriptor_interface { |
|
uint8_t bLength; |
|
uint8_t bDescriptorType; |
|
uint8_t bInterfaceNumber; |
|
uint8_t bAlternateSetting; |
|
uint8_t bNumEndpoints; |
|
uint8_t bInterfaceClass; |
|
uint8_t bInterfaceSubClass; |
|
uint8_t bInterfaceProtocol; |
|
uint8_t iInterface; |
|
} __packed usb_descriptor_interface; |
|
|
|
typedef struct usb_descriptor_endpoint { |
|
uint8_t bLength; |
|
uint8_t bDescriptorType; |
|
uint8_t bEndpointAddress; |
|
uint8_t bmAttributes; |
|
uint16_t wMaxPacketSize; |
|
uint8_t bInterval; |
|
} __packed usb_descriptor_endpoint; |
|
|
|
typedef struct usb_descriptor_string { |
|
uint8_t bLength; |
|
uint8_t bDescriptorType; |
|
uint8_t bString[]; |
|
} usb_descriptor_string; |
|
|
|
/* Common values that go inside descriptors */ |
|
|
|
#define USB_CONFIG_ATTR_BUSPOWERED 0b10000000 |
|
#define USB_CONFIG_ATTR_SELF_POWERED 0b11000000 |
|
|
|
#define USB_EP_TYPE_INTERRUPT 0x03 |
|
#define USB_EP_TYPE_BULK 0x02 |
|
|
|
#define USB_DESCRIPTOR_ENDPOINT_IN 0x80 |
|
#define USB_DESCRIPTOR_ENDPOINT_OUT 0x00 |
|
|
|
/* |
|
* USB module core |
|
*/ |
|
|
|
#ifndef USB_ISR_MSK |
|
/* Handle CTRM, WKUPM, SUSPM, ERRM, SOFM, ESOFM, RESETM */ |
|
#define USB_ISR_MSK 0xBF00 |
|
#endif |
|
|
|
|
|
typedef enum usb_dev_state { |
|
USB_UNCONNECTED, |
|
USB_ATTACHED, |
|
USB_POWERED, |
|
USB_SUSPENDED, |
|
USB_ADDRESSED, |
|
USB_CONFIGURED |
|
} usb_dev_state; |
|
|
|
|
|
// Encapsulates global state formerly handled by usb_lib/ |
|
/* |
|
typedef struct usblib_dev { |
|
uint32_t irq_mask; |
|
void (**ep_int_in)(void); |
|
void (**ep_int_out)(void); |
|
usb_dev_state state; |
|
usb_dev_state prevState; |
|
rcc_clk_id clk_id; |
|
} usblib_dev; |
|
*/ |
|
|
|
#endif
|
|
|