ACwing FC firmware
STM32WB55: attitude IEKF, altitude Kalman filter, flight core, protocol v2
Loading...
Searching...
No Matches
usb_cdc.c
Go to the documentation of this file.
1
5#include "usb_cdc.h"
6#include "usb_link.h"
7#include "usbd_core.h"
8#include "usbd_cdc.h"
9#include "usbd_desc.h"
10
11static USBD_HandleTypeDef s_dev;
12static uint8_t s_rx[CDC_DATA_FS_MAX_PACKET_SIZE];
13static uint8_t s_tx[2048]; /* one transfer per pump: ~200 kB/s at the LogTask's 10 ms */
14static USBD_CDC_LineCodingTypeDef s_line = { 115200u, 0u, 0u, 8u };
15
16static int8_t itf_init(void)
17{
18 USBD_CDC_SetTxBuffer(&s_dev, s_tx, 0);
19 USBD_CDC_SetRxBuffer(&s_dev, s_rx);
20 return USBD_OK;
21}
22
23static int8_t itf_deinit(void) { return USBD_OK; }
24
25static int8_t itf_control(uint8_t cmd, uint8_t *p, uint16_t len)
26{
27 (void)len;
28 /* line coding is stored and echoed only: the PC tools open the port at any baud rate */
29 if (cmd == CDC_SET_LINE_CODING) {
30 s_line.bitrate = (uint32_t)p[0] | ((uint32_t)p[1] << 8) | ((uint32_t)p[2] << 16) | ((uint32_t)p[3] << 24);
31 s_line.format = p[4]; s_line.paritytype = p[5]; s_line.datatype = p[6];
32 } else if (cmd == CDC_SET_CONTROL_LINE_STATE) {
33 /* no data stage: p is the setup request, wValue bit 0 = DTR (port opened by a program) */
34 const USBD_SetupReqTypedef *req = (const USBD_SetupReqTypedef *)(const void *)p;
35 usbl_set_dtr((uint8_t)(req->wValue & 1u));
36 } else if (cmd == CDC_GET_LINE_CODING) {
37 p[0] = (uint8_t)s_line.bitrate; p[1] = (uint8_t)(s_line.bitrate >> 8);
38 p[2] = (uint8_t)(s_line.bitrate >> 16); p[3] = (uint8_t)(s_line.bitrate >> 24);
39 p[4] = s_line.format; p[5] = s_line.paritytype; p[6] = s_line.datatype;
40 }
41 return USBD_OK;
42}
43
44/* USB interrupt: bytes from the PC */
45static int8_t itf_receive(uint8_t *buf, uint32_t *len)
46{
47 usbl_rx_isr(buf, *len);
48 USBD_CDC_SetRxBuffer(&s_dev, s_rx);
49 USBD_CDC_ReceivePacket(&s_dev);
50 return USBD_OK;
51}
52
53static int8_t itf_tx_done(uint8_t *buf, uint32_t *len, uint8_t ep)
54{
55 (void)buf; (void)len; (void)ep;
56 return USBD_OK;
57}
58
59static USBD_CDC_ItfTypeDef s_itf = { itf_init, itf_deinit, itf_control, itf_receive, itf_tx_done };
60
61int usb_cdc_init(void)
62{
63 if (USBD_Init(&s_dev, &ACW_FS_Desc, DEVICE_FS) != USBD_OK) return -1;
64 if (USBD_RegisterClass(&s_dev, &USBD_CDC) != USBD_OK) return -1;
65 if (USBD_CDC_RegisterInterface(&s_dev, &s_itf) != USBD_OK) return -1;
66 if (USBD_Start(&s_dev) != USBD_OK) return -1;
67 return 0;
68}
69
70uint8_t usb_cdc_configured(void) { return (uint8_t)(s_dev.dev_state == USBD_STATE_CONFIGURED); }
71
72void usb_cdc_pump(void)
73{
74 const uint8_t cfg = usb_cdc_configured();
75 usbl_set_configured(cfg); /* ARM is refused while a host is connected */
76 if (!cfg) {
77 usbl_tx_flush(); /* nobody listening: drop what was queued */
78 return;
79 }
80 USBD_CDC_HandleTypeDef *h = (USBD_CDC_HandleTypeDef *)s_dev.pClassData;
81 if (!h || h->TxState != 0u) return; /* previous transfer still running */
82 const uint32_t n = usbl_tx_peek(s_tx, sizeof s_tx);
83 if (!n) return;
84 USBD_CDC_SetTxBuffer(&s_dev, s_tx, n);
85 if (USBD_CDC_TransmitPacket(&s_dev) == USBD_OK) usbl_tx_consume(n);
86}
uint32_t n
Definition calib_mgr.c:35
static void cmd(uint8_t port, const uint8_t *c, uint32_t n, uint8_t armed, uint32_t now)
Definition log_task.c:222
static int8_t itf_control(uint8_t cmd, uint8_t *p, uint16_t len)
Definition usb_cdc.c:25
static USBD_HandleTypeDef s_dev
Definition usb_cdc.c:11
void usb_cdc_pump(void)
Definition usb_cdc.c:72
static uint8_t s_tx[2048]
Definition usb_cdc.c:13
uint8_t usb_cdc_configured(void)
enumerated by a host
Definition usb_cdc.c:70
int usb_cdc_init(void)
0 = started
Definition usb_cdc.c:61
static int8_t itf_init(void)
Definition usb_cdc.c:16
static int8_t itf_receive(uint8_t *buf, uint32_t *len)
Definition usb_cdc.c:45
static uint8_t s_rx[CDC_DATA_FS_MAX_PACKET_SIZE]
Definition usb_cdc.c:12
static USBD_CDC_LineCodingTypeDef s_line
Definition usb_cdc.c:14
static int8_t itf_deinit(void)
Definition usb_cdc.c:23
static USBD_CDC_ItfTypeDef s_itf
Definition usb_cdc.c:59
static int8_t itf_tx_done(uint8_t *buf, uint32_t *len, uint8_t ep)
Definition usb_cdc.c:53
USB CDC (virtual COM port) binding of the USB link (telemetry/usb_link.h).
#define DEVICE_FS
Definition usbd_conf.h:24
USBD_DescriptorsTypeDef ACW_FS_Desc
Definition usbd_desc.c:31
USB descriptors of the ACwing FC (see usbd_desc.c).