Paparazzi UAS  v6.0_unstable-41-g5cfda00-dirty
Paparazzi is a free software Unmanned Aircraft System.
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
usb_ser_hw.c File Reference

CDC USB device driver for STM32 architecture (STM32F1, STM32F4) More...

#include <stdlib.h>
#include <libopencm3/stm32/rcc.h>
#include <libopencm3/stm32/gpio.h>
#include <libopencm3/cm3/nvic.h>
#include <libopencm3/cm3/systick.h>
#include <libopencm3/usb/usbd.h>
#include <libopencm3/usb/cdc.h>
#include <libopencm3/cm3/scb.h>
#include <libopencm3/stm32/desig.h>
#include <libopencm3/stm32/otg_fs.h>
#include "mcu_periph/usb_serial.h"
#include "mcu_periph/sys_time_arch.h"
+ Include dependency graph for usb_ser_hw.c:

Go to the source code of this file.

Data Structures

struct  fifo_t
 

Macros

#define MAX_PACKET_SIZE   64
 
#define VCOM_FIFO_SIZE   256
 
#define TX_TIMEOUT_CNT   20
 

Functions

void fifo_init (fifo_t *fifo, uint8_t *buf)
 
bool fifo_put (fifo_t *fifo, uint8_t c)
 
bool fifo_get (fifo_t *fifo, uint8_t *pc)
 
bool fifo_peek (fifo_t *fifo, uint8_t *pc, uint8_t ofs)
 
int fifo_avail (fifo_t *fifo)
 
int fifo_free (fifo_t *fifo)
 
static int cdcacm_control_request (usbd_device *usbd_dev, struct usb_setup_data *req, uint8_t **buf, uint16_t *len, void(**complete)(usbd_device *usbd_dev, struct usb_setup_data *req))
 CDC device control request (from libopencm3 examples) More...
 
static void cdcacm_data_rx_cb (usbd_device *usbd_dev, uint8_t ep)
 RX callback for CDC device (from libopencm3 examples) More...
 
static void suspend_cb (void)
 
static void cdcacm_set_config (usbd_device *usbd_dev, uint16_t wValue)
 Set configuration and control callbacks for CDC device (from libopencm3 examples) More...
 
int VCOM_putchar (int c)
 Writes one character to VCOM port fifo. More...
 
int VCOM_getchar (void)
 Reads one character from VCOM port. More...
 
int VCOM_peekchar (int ofs)
 Reads one character from VCOM port without removing it from the queue. More...
 
bool VCOM_check_free_space (uint16_t len)
 Checks if buffer free in VCOM buffer. More...
 
int VCOM_check_available (void)
 Checks if data available in VCOM buffer. More...
 
void VCOM_event (void)
 Poll usb (required by libopencm3). More...
 
void VCOM_send_message (void)
 Send data from fifo right now. More...
 
static int usb_serial_check_free_space (struct usb_serial_periph *p, long *fd, uint16_t len)
 
static void usb_serial_transmit (struct usb_serial_periph *p, long fd, uint8_t byte)
 
static void usb_serial_transmit_buffer (struct usb_serial_periph *p, long fd, uint8_t *data, uint16_t len)
 
static void usb_serial_send (struct usb_serial_periph *p, long fd)
 
static int usb_serial_char_available (struct usb_serial_periph *p)
 
static uint8_t usb_serial_getch (struct usb_serial_periph *p)
 
void VCOM_init (void)
 

Variables

static uint8_t txdata [VCOM_FIFO_SIZE]
 
static uint8_t rxdata [VCOM_FIFO_SIZE]
 
static fifo_t txfifo
 
static fifo_t rxfifo
 
int tx_timeout
 
usbd_device * my_usbd_dev
 
static const struct
usb_device_descriptor 
dev
 
static const struct
usb_endpoint_descriptor 
comm_endp []
 
static const struct
usb_endpoint_descriptor 
data_endp []
 
struct {
struct usb_cdc_header_descriptor header
 
struct
usb_cdc_call_management_descriptor 
call_mgmt
 
struct usb_cdc_acm_descriptor acm
 
struct usb_cdc_union_descriptor cdc_union
 
cdcacm_functional_descriptors
 
static const struct
usb_interface_descriptor 
comm_iface []
 
static const struct
usb_interface_descriptor 
data_iface []
 
static const struct usb_interface ifaces []
 
static const struct
usb_config_descriptor 
config
 
static char serial_no [25]
 
static const char * usb_strings []
 
uint8_t usbd_control_buffer [128]
 
static bool usb_connected
 
struct usb_serial_periph usb_serial
 

Detailed Description

CDC USB device driver for STM32 architecture (STM32F1, STM32F4)

Definition in file usb_ser_hw.c.


Data Structure Documentation

struct fifo_t

Definition at line 52 of file usb_ser_hw.c.

Data Fields
uint8_t * buf
int head
size_t size
int tail

Macro Definition Documentation

#define MAX_PACKET_SIZE   64

Definition at line 46 of file usb_ser_hw.c.

Referenced by cdcacm_data_rx_cb(), cdcacm_set_config(), and VCOM_send_message().

#define TX_TIMEOUT_CNT   20

Definition at line 50 of file usb_ser_hw.c.

Referenced by VCOM_putchar().

#define VCOM_FIFO_SIZE   256

Definition at line 48 of file usb_ser_hw.c.

Referenced by fifo_avail(), fifo_free(), fifo_get(), fifo_peek(), and fifo_put().

Function Documentation

static int cdcacm_control_request ( usbd_device *  usbd_dev,
struct usb_setup_data *  req,
uint8_t **  buf,
uint16_t len,
void(**)(usbd_device *usbd_dev, struct usb_setup_data *req)  complete 
)
static

CDC device control request (from libopencm3 examples)

Definition at line 233 of file usb_ser_hw.c.

Referenced by cdcacm_set_config().

+ Here is the caller graph for this function:

static void cdcacm_data_rx_cb ( usbd_device *  usbd_dev,
uint8_t  ep 
)
static

RX callback for CDC device (from libopencm3 examples)

Definition at line 276 of file usb_ser_hw.c.

References fifo_put(), and MAX_PACKET_SIZE.

Referenced by cdcacm_set_config().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void cdcacm_set_config ( usbd_device *  usbd_dev,
uint16_t  wValue 
)
static

Set configuration and control callbacks for CDC device (from libopencm3 examples)

Definition at line 303 of file usb_ser_hw.c.

References cdcacm_control_request(), cdcacm_data_rx_cb(), MAX_PACKET_SIZE, and suspend_cb().

Referenced by VCOM_init().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static int fifo_avail ( fifo_t fifo)

Definition at line 367 of file usb_ser_hw.c.

References fifo_t::head, fifo_t::tail, and VCOM_FIFO_SIZE.

Referenced by fifo_free(), fifo_peek(), VCOM_check_available(), and VCOM_event().

+ Here is the caller graph for this function:

static int fifo_free ( fifo_t fifo)

Definition at line 373 of file usb_ser_hw.c.

References fifo_avail(), and VCOM_FIFO_SIZE.

Referenced by VCOM_check_free_space().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static bool fifo_get ( fifo_t fifo,
uint8_t pc 
)

Definition at line 349 of file usb_ser_hw.c.

References fifo_t::buf, fifo_t::head, fifo_t::tail, and VCOM_FIFO_SIZE.

Referenced by VCOM_getchar(), and VCOM_send_message().

+ Here is the caller graph for this function:

void fifo_init ( fifo_t fifo,
uint8_t buf 
)

Definition at line 322 of file usb_ser_hw.c.

References fifo_t::buf, fifo_t::head, and fifo_t::tail.

Referenced by VCOM_init().

+ Here is the caller graph for this function:

bool fifo_peek ( fifo_t fifo,
uint8_t pc,
uint8_t  ofs 
)

Definition at line 378 of file usb_ser_hw.c.

References fifo_t::buf, fifo_avail(), fifo_t::tail, and VCOM_FIFO_SIZE.

Referenced by VCOM_peekchar().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static bool fifo_put ( fifo_t fifo,
uint8_t  c 
)

Definition at line 331 of file usb_ser_hw.c.

References fifo_t::buf, fifo_t::head, fifo_t::tail, and VCOM_FIFO_SIZE.

Referenced by cdcacm_data_rx_cb(), and VCOM_putchar().

+ Here is the caller graph for this function:

static void suspend_cb ( void  )
static

Definition at line 294 of file usb_ser_hw.c.

Referenced by cdcacm_set_config().

+ Here is the caller graph for this function:

static int usb_serial_char_available ( struct usb_serial_periph p)
static

Definition at line 555 of file usb_ser_hw.c.

References VCOM_check_available().

Referenced by VCOM_init().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static int usb_serial_check_free_space ( struct usb_serial_periph p,
long *  fd,
uint16_t  len 
)
static

Definition at line 526 of file usb_ser_hw.c.

References VCOM_check_free_space().

Referenced by VCOM_init().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static uint8_t usb_serial_getch ( struct usb_serial_periph p)
static

Definition at line 560 of file usb_ser_hw.c.

References VCOM_getchar().

Referenced by VCOM_init().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void usb_serial_send ( struct usb_serial_periph p,
long  fd 
)
static

Definition at line 550 of file usb_ser_hw.c.

References VCOM_send_message().

Referenced by VCOM_init().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void usb_serial_transmit ( struct usb_serial_periph p,
long  fd,
uint8_t  byte 
)
static

Definition at line 533 of file usb_ser_hw.c.

References VCOM_putchar().

Referenced by main_periodic_task(), and VCOM_init().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

static void usb_serial_transmit_buffer ( struct usb_serial_periph p,
long  fd,
uint8_t data,
uint16_t  len 
)
static

Definition at line 540 of file usb_ser_hw.c.

References VCOM_putchar().

Referenced by VCOM_init().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

int VCOM_check_available ( void  )

Checks if data available in VCOM buffer.

Returns
nonzero if char is available in the queue, zero otherwise

Definition at line 459 of file usb_ser_hw.c.

References fifo_avail().

Referenced by dfu_command_event(), event_usb_serial(), ReadUsbBuffer(), tunnel_event(), and usb_serial_char_available().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

bool VCOM_check_free_space ( uint16_t  len)

Checks if buffer free in VCOM buffer.

Returns
TRUE if len bytes are free

Definition at line 450 of file usb_ser_hw.c.

References FALSE, fifo_free(), and TRUE.

Referenced by dfu_command_event(), tunnel_event(), usb_serial_check_free_space(), and VCOM_putchar().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void VCOM_event ( void  )

Poll usb (required by libopencm3).

VCOM_event() should be called from main/module event function

Definition at line 468 of file usb_ser_hw.c.

References fifo_avail(), my_usbd_dev, tx_timeout, and VCOM_send_message().

Referenced by event_usb_serial(), main(), and mcu_event().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

int VCOM_getchar ( void  )

Reads one character from VCOM port.

Returns
character read, or -1 if character could not be read

Definition at line 425 of file usb_ser_hw.c.

References fifo_get().

Referenced by dfu_command_event(), event_usb_serial(), ReadUsbBuffer(), tunnel_event(), and usb_serial_getch().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void VCOM_init ( void  )
int VCOM_peekchar ( int  ofs)

Reads one character from VCOM port without removing it from the queue.

Parameters
ofsposition to read
Returns
character read, or -1 if character could not be read

Definition at line 438 of file usb_ser_hw.c.

References fifo_peek().

Referenced by dfu_command_event().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

int VCOM_putchar ( int  c)

Writes one character to VCOM port fifo.

Since we don't really have an instant feeedback from USB driver if the character was written, we always return c if we are connected.

Parameters
[in]ccharacter to write
Returns
character to be written, -1 if not usb is not connected

Definition at line 397 of file usb_ser_hw.c.

References fifo_put(), sys_time_usleep(), tx_timeout, TX_TIMEOUT_CNT, VCOM_check_free_space(), and VCOM_send_message().

Referenced by cmd_execute(), periodic_usb_serial(), tunnel_event(), usb_serial_parse_packet(), usb_serial_transmit(), and usb_serial_transmit_buffer().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

void VCOM_send_message ( void  )

Send data from fifo right now.

Only if usb is connected.

Definition at line 487 of file usb_ser_hw.c.

References fifo_get(), MAX_PACKET_SIZE, and my_usbd_dev.

Referenced by cmd_execute(), usb_serial_parse_packet(), usb_serial_send(), VCOM_event(), and VCOM_putchar().

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

Variable Documentation

const { ... } cdcacm_functional_descriptors
Initial value:
= {
.header = {
.bFunctionLength = sizeof(struct usb_cdc_header_descriptor),
.bDescriptorType = CS_INTERFACE,
.bDescriptorSubtype = USB_CDC_TYPE_HEADER,
.bcdCDC = 0x0110,
},
.call_mgmt = {
.bFunctionLength =
sizeof(struct usb_cdc_call_management_descriptor),
.bDescriptorType = CS_INTERFACE,
.bDescriptorSubtype = USB_CDC_TYPE_CALL_MANAGEMENT,
.bmCapabilities = 0,
.bDataInterface = 1,
},
.acm = {
.bFunctionLength = sizeof(struct usb_cdc_acm_descriptor),
.bDescriptorType = CS_INTERFACE,
.bDescriptorSubtype = USB_CDC_TYPE_ACM,
.bmCapabilities = 0,
},
.cdc_union = {
.bFunctionLength = sizeof(struct usb_cdc_union_descriptor),
.bDescriptorType = CS_INTERFACE,
.bDescriptorSubtype = USB_CDC_TYPE_UNION,
.bControlInterface = 0,
.bSubordinateInterface0 = 1,
}
}
const struct usb_endpoint_descriptor comm_endp[]
static
Initial value:
= {{
.bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT,
.bEndpointAddress = 0x83,
.bmAttributes = USB_ENDPOINT_ATTR_INTERRUPT,
.wMaxPacketSize = 16,
.bInterval = 255,
}
}

Definition at line 96 of file usb_ser_hw.c.

const struct usb_interface_descriptor comm_iface[]
static
Initial value:
= {{
.bLength = USB_DT_INTERFACE_SIZE,
.bDescriptorType = USB_DT_INTERFACE,
.bInterfaceNumber = 0,
.bAlternateSetting = 0,
.bNumEndpoints = 1,
.bInterfaceClass = USB_CLASS_CDC,
.bInterfaceSubClass = USB_CDC_SUBCLASS_ACM,
.bInterfaceProtocol = USB_CDC_PROTOCOL_AT,
.iInterface = 0,
.endpoint = comm_endp,
.extralen = sizeof(cdcacm_functional_descriptors)
}
}
static const struct usb_endpoint_descriptor comm_endp[]
Definition: usb_ser_hw.c:96
static const struct @7 cdcacm_functional_descriptors

Definition at line 158 of file usb_ser_hw.c.

const struct usb_config_descriptor config
static
Initial value:
= {
.bLength = USB_DT_CONFIGURATION_SIZE,
.bDescriptorType = USB_DT_CONFIGURATION,
.wTotalLength = 0,
.bNumInterfaces = 2,
.bConfigurationValue = 1,
.iConfiguration = 0,
.bmAttributes = 0x80,
.bMaxPower = 0x32,
.interface = ifaces,
}
static const struct usb_interface ifaces[]
Definition: usb_ser_hw.c:191

Definition at line 200 of file usb_ser_hw.c.

Referenced by dshotStart(), and msdStart().

const struct usb_endpoint_descriptor data_endp[]
static
Initial value:
= {{
.bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT,
.bEndpointAddress = 0x01,
.bmAttributes = USB_ENDPOINT_ATTR_BULK,
.wMaxPacketSize = MAX_PACKET_SIZE,
.bInterval = 1,
}, {
.bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT,
.bEndpointAddress = 0x82,
.bmAttributes = USB_ENDPOINT_ATTR_BULK,
.wMaxPacketSize = MAX_PACKET_SIZE,
.bInterval = 1,
}
}
#define MAX_PACKET_SIZE
Definition: usb_ser_hw.c:46

Definition at line 106 of file usb_ser_hw.c.

const struct usb_interface_descriptor data_iface[]
static
Initial value:
= {{
.bLength = USB_DT_INTERFACE_SIZE,
.bDescriptorType = USB_DT_INTERFACE,
.bInterfaceNumber = 1,
.bAlternateSetting = 0,
.bNumEndpoints = 2,
.bInterfaceClass = USB_CLASS_DATA,
.bInterfaceSubClass = 0,
.bInterfaceProtocol = 0,
.iInterface = 0,
.endpoint = data_endp,
}
}
static const struct usb_endpoint_descriptor data_endp[]
Definition: usb_ser_hw.c:106

Definition at line 176 of file usb_ser_hw.c.

const struct usb_device_descriptor dev
static
Initial value:
= {
.bLength = USB_DT_DEVICE_SIZE,
.bDescriptorType = USB_DT_DEVICE,
.bcdUSB = 0x0200,
.bDeviceClass = USB_CLASS_CDC,
.bDeviceSubClass = 0,
.bDeviceProtocol = 0,
.bMaxPacketSize0 = MAX_PACKET_SIZE,
.idVendor = 0x1d50,
.idProduct = 0x603d,
.bcdDevice = 0x0200,
.iManufacturer = 1,
.iProduct = 2,
.iSerialNumber = 3,
.bNumConfigurations = 1,
}
#define MAX_PACKET_SIZE
Definition: usb_ser_hw.c:46

Definition at line 74 of file usb_ser_hw.c.

Referenced by dl_parse_msg(), firmware_parse_msg(), gps_mtk_event(), gps_nmea_event(), gps_sirf_event(), gps_skytraq_event(), gps_ubx_event(), ins_event_check_and_handle(), multi_ranger_boot_device(), parse_ins_msg(), send_airspeed(), send_gps(), send_gps_int(), send_gps_lla(), send_i2c_err(), send_uart_err(), telemetry_intermcu_repack(), v4l2_capture_thread(), v4l2_init(), VCOM_init(), and xsens_parser_event().

const struct usb_interface ifaces[]
static
Initial value:
= {{
.num_altsetting = 1,
.altsetting = comm_iface,
}, {
.num_altsetting = 1,
.altsetting = data_iface,
}
}
static const struct usb_interface_descriptor data_iface[]
Definition: usb_ser_hw.c:176
static const struct usb_interface_descriptor comm_iface[]
Definition: usb_ser_hw.c:158

Definition at line 191 of file usb_ser_hw.c.

usbd_device* my_usbd_dev

Definition at line 72 of file usb_ser_hw.c.

Referenced by VCOM_event(), VCOM_init(), and VCOM_send_message().

uint8_t rxdata[VCOM_FIFO_SIZE]
static

Definition at line 59 of file usb_ser_hw.c.

Referenced by VCOM_init().

fifo_t rxfifo
static

Definition at line 62 of file usb_ser_hw.c.

char serial_no[25]
static

Definition at line 213 of file usb_ser_hw.c.

int tx_timeout

Definition at line 70 of file usb_ser_hw.c.

Referenced by VCOM_event(), VCOM_init(), and VCOM_putchar().

uint8_t txdata[VCOM_FIFO_SIZE]
static

Definition at line 58 of file usb_ser_hw.c.

Referenced by VCOM_init().

fifo_t txfifo
static

Definition at line 61 of file usb_ser_hw.c.

bool usb_connected
static

Definition at line 291 of file usb_ser_hw.c.

struct usb_serial_periph usb_serial

Definition at line 523 of file usb_ser_hw.c.

Referenced by VCOM_init().

const char* usb_strings[]
static
Initial value:
= {
"Paparazzi UAV",
"CDC Serial STM32",
}
static char serial_no[25]
Definition: usb_ser_hw.c:213

Definition at line 216 of file usb_ser_hw.c.

uint8_t usbd_control_buffer[128]

Definition at line 227 of file usb_ser_hw.c.