ACwing FC firmware
STM32WB55: attitude IEKF, altitude Kalman filter, flight core, protocol v2
Loading...
Searching...
No Matches
usbd_conf.c
Go to the documentation of this file.
1
13#include "usbd_conf.h"
14#include "usbd_core.h"
15#include "usbd_cdc.h"
16#include "hw_conf.h"
17#include "stm32wbxx_ll_crs.h"
18#include "stm32wbxx_ll_rcc.h"
19#include "stm32wbxx_ll_hsem.h"
20#include "stm32wbxx_ll_bus.h"
21
22PCD_HandleTypeDef hpcd_USB_FS;
23
24/* ------------------------------------------------------------------ clocks */
25static void clk48_on(void)
26{
27 /* keep HSI48 on for us: CPU2 checks this semaphore before turning it off */
28 while (LL_HSEM_1StepLock(HSEM, CFG_HW_CLK48_CONFIG_SEMID)) { }
29 while (LL_HSEM_1StepLock(HSEM, CFG_HW_RCC_SEMID)) { }
30 LL_RCC_HSI48_Enable();
31 while (!LL_RCC_HSI48_IsReady()) { }
32 LL_RCC_SetUSBClockSource(LL_RCC_USB_CLKSOURCE_HSI48);
33 LL_HSEM_ReleaseLock(HSEM, CFG_HW_RCC_SEMID, 0);
34
35 /* CRS: trim HSI48 on the 1 kHz USB SOF */
36 LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_CRS);
37 LL_CRS_SetSyncDivider(LL_CRS_SYNC_DIV_1);
38 LL_CRS_SetSyncPolarity(LL_CRS_SYNC_POLARITY_RISING);
39 LL_CRS_SetSyncSignalSource(LL_CRS_SYNC_SOURCE_USB);
40 LL_CRS_SetReloadCounter(__LL_CRS_CALC_CALCULATE_RELOADVALUE(48000000u, 1000u));
41 LL_CRS_SetFreqErrorLimit(34u);
42 LL_CRS_EnableAutoTrimming();
43 LL_CRS_EnableFreqErrorCounter();
44}
45
46/* ------------------------------------------------------------------ MSP */
47void HAL_PCD_MspInit(PCD_HandleTypeDef *pcd)
48{
49 if (pcd->Instance != USB) return;
50 /* PA11/PA12 are set to AF10 (USB) by MX_GPIO_Init */
51 clk48_on();
52 __HAL_RCC_USB_CLK_ENABLE();
53 HAL_PWREx_EnableVddUSB();
54 /* below configMAX_SYSCALL_INTERRUPT_PRIORITY: the callbacks use no RTOS call, but keep it safe */
55 HAL_NVIC_SetPriority(USB_LP_IRQn, 6, 0);
56 HAL_NVIC_EnableIRQ(USB_LP_IRQn);
57}
58
59void HAL_PCD_MspDeInit(PCD_HandleTypeDef *pcd)
60{
61 if (pcd->Instance != USB) return;
62 __HAL_RCC_USB_CLK_DISABLE();
63 HAL_NVIC_DisableIRQ(USB_LP_IRQn);
64}
65
66void USB_LP_IRQHandler(void) { HAL_PCD_IRQHandler(&hpcd_USB_FS); }
67
68/* ------------------------------------------------------------------ PCD -> USBD */
69void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *pcd) { USBD_LL_SetupStage((USBD_HandleTypeDef *)pcd->pData, (uint8_t *)pcd->Setup); }
70void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *pcd, uint8_t ep) { USBD_LL_DataOutStage((USBD_HandleTypeDef *)pcd->pData, ep, pcd->OUT_ep[ep].xfer_buff); }
71void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *pcd, uint8_t ep) { USBD_LL_DataInStage((USBD_HandleTypeDef *)pcd->pData, ep, pcd->IN_ep[ep].xfer_buff); }
72void HAL_PCD_SOFCallback(PCD_HandleTypeDef *pcd) { USBD_LL_SOF((USBD_HandleTypeDef *)pcd->pData); }
73void HAL_PCD_ResetCallback(PCD_HandleTypeDef *pcd)
74{
75 USBD_LL_SetSpeed((USBD_HandleTypeDef *)pcd->pData, USBD_SPEED_FULL);
76 USBD_LL_Reset((USBD_HandleTypeDef *)pcd->pData);
77}
78void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *pcd) { USBD_LL_Suspend((USBD_HandleTypeDef *)pcd->pData); }
79void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *pcd) { USBD_LL_Resume((USBD_HandleTypeDef *)pcd->pData); }
80void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *pcd, uint8_t ep) { USBD_LL_IsoOUTIncomplete((USBD_HandleTypeDef *)pcd->pData, ep); }
81void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *pcd, uint8_t ep) { USBD_LL_IsoINIncomplete((USBD_HandleTypeDef *)pcd->pData, ep); }
82void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *pcd) { USBD_LL_DevConnected((USBD_HandleTypeDef *)pcd->pData); }
83void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *pcd) { USBD_LL_DevDisconnected((USBD_HandleTypeDef *)pcd->pData); }
84
85/* ------------------------------------------------------------------ USBD_LL */
86static USBD_StatusTypeDef st(HAL_StatusTypeDef h)
87{
88 return h == HAL_OK ? USBD_OK : (h == HAL_BUSY ? USBD_BUSY : USBD_FAIL);
89}
90
91USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev)
92{
93 hpcd_USB_FS.pData = pdev;
94 pdev->pData = &hpcd_USB_FS;
95 hpcd_USB_FS.Instance = USB;
96 hpcd_USB_FS.Init.dev_endpoints = 8;
97 hpcd_USB_FS.Init.speed = PCD_SPEED_FULL;
98 hpcd_USB_FS.Init.phy_itface = PCD_PHY_EMBEDDED;
99 hpcd_USB_FS.Init.Sof_enable = DISABLE;
100 hpcd_USB_FS.Init.low_power_enable = DISABLE;
101 hpcd_USB_FS.Init.lpm_enable = DISABLE;
102 hpcd_USB_FS.Init.battery_charging_enable = DISABLE;
103 if (HAL_PCD_Init(&hpcd_USB_FS) != HAL_OK) return USBD_FAIL;
104
105 /* packet memory: 8 × 8-byte BTABLE, then the endpoint buffers */
106 HAL_PCDEx_PMAConfig(&hpcd_USB_FS, 0x00, PCD_SNG_BUF, 0x18);
107 HAL_PCDEx_PMAConfig(&hpcd_USB_FS, 0x80, PCD_SNG_BUF, 0x58);
108 HAL_PCDEx_PMAConfig(&hpcd_USB_FS, CDC_IN_EP, PCD_SNG_BUF, 0xC0);
109 HAL_PCDEx_PMAConfig(&hpcd_USB_FS, CDC_OUT_EP, PCD_SNG_BUF, 0x110);
110 HAL_PCDEx_PMAConfig(&hpcd_USB_FS, CDC_CMD_EP, PCD_SNG_BUF, 0x100);
111 return USBD_OK;
112}
113
114USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev) { return st(HAL_PCD_DeInit((PCD_HandleTypeDef *)pdev->pData)); }
115USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev) { return st(HAL_PCD_Start((PCD_HandleTypeDef *)pdev->pData)); }
116USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev) { return st(HAL_PCD_Stop((PCD_HandleTypeDef *)pdev->pData)); }
117
118USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, uint8_t ep, uint8_t type, uint16_t mps)
119{
120 return st(HAL_PCD_EP_Open((PCD_HandleTypeDef *)pdev->pData, ep, mps, type));
121}
122USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep) { return st(HAL_PCD_EP_Close((PCD_HandleTypeDef *)pdev->pData, ep)); }
123USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep) { return st(HAL_PCD_EP_Flush((PCD_HandleTypeDef *)pdev->pData, ep)); }
124USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep) { return st(HAL_PCD_EP_SetStall((PCD_HandleTypeDef *)pdev->pData, ep)); }
125USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep) { return st(HAL_PCD_EP_ClrStall((PCD_HandleTypeDef *)pdev->pData, ep)); }
126
127uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep)
128{
129 PCD_HandleTypeDef *h = (PCD_HandleTypeDef *)pdev->pData;
130 return (ep & 0x80u) ? h->IN_ep[ep & 0x7Fu].is_stall : h->OUT_ep[ep & 0x7Fu].is_stall;
131}
132
133USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t addr)
134{
135 return st(HAL_PCD_SetAddress((PCD_HandleTypeDef *)pdev->pData, addr));
136}
137
138USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep, uint8_t *buf, uint32_t size)
139{
140 return st(HAL_PCD_EP_Transmit((PCD_HandleTypeDef *)pdev->pData, ep, buf, size));
141}
142
143USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep, uint8_t *buf, uint32_t size)
144{
145 return st(HAL_PCD_EP_Receive((PCD_HandleTypeDef *)pdev->pData, ep, buf, size));
146}
147
148uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep)
149{
150 return HAL_PCD_EP_GetRxCount((PCD_HandleTypeDef *)pdev->pData, ep);
151}
152
153void USBD_LL_Delay(uint32_t ms) { HAL_Delay(ms); }
154
155/* ------------------------------------------------------------------ static memory */
156void *USBD_static_malloc(uint32_t size)
157{
158 static uint32_t mem[(sizeof(USBD_CDC_HandleTypeDef) / 4u) + 1u];
159 return size <= sizeof mem ? mem : NULL;
160}
161void USBD_static_free(void *p) { (void)p; }
static uint32_t addr(uint16_t sect)
Definition log_store.c:49
uint16_t ms
Definition log_task.c:42
uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep)
Definition usbd_conf.c:148
void HAL_PCD_MspInit(PCD_HandleTypeDef *pcd)
Definition usbd_conf.c:47
void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *pcd)
Definition usbd_conf.c:78
USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev)
Definition usbd_conf.c:91
void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *pcd)
Definition usbd_conf.c:69
void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *pcd)
Definition usbd_conf.c:82
uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep)
Definition usbd_conf.c:127
void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *pcd, uint8_t ep)
Definition usbd_conf.c:70
USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep, uint8_t *buf, uint32_t size)
Definition usbd_conf.c:143
USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep, uint8_t *buf, uint32_t size)
Definition usbd_conf.c:138
USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev)
Definition usbd_conf.c:115
USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t addr)
Definition usbd_conf.c:133
void HAL_PCD_SOFCallback(PCD_HandleTypeDef *pcd)
Definition usbd_conf.c:72
static USBD_StatusTypeDef st(HAL_StatusTypeDef h)
Definition usbd_conf.c:86
void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *pcd, uint8_t ep)
Definition usbd_conf.c:80
void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *pcd)
Definition usbd_conf.c:83
USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep)
Definition usbd_conf.c:124
void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *pcd, uint8_t ep)
Definition usbd_conf.c:81
USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep)
Definition usbd_conf.c:122
void USBD_static_free(void *p)
Definition usbd_conf.c:161
USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep)
Definition usbd_conf.c:123
USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev)
Definition usbd_conf.c:114
void USB_LP_IRQHandler(void)
Definition usbd_conf.c:66
void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *pcd)
Definition usbd_conf.c:79
static void clk48_on(void)
Definition usbd_conf.c:25
USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev)
Definition usbd_conf.c:116
void HAL_PCD_MspDeInit(PCD_HandleTypeDef *pcd)
Definition usbd_conf.c:59
void * USBD_static_malloc(uint32_t size)
Definition usbd_conf.c:156
void HAL_PCD_ResetCallback(PCD_HandleTypeDef *pcd)
Definition usbd_conf.c:73
void USBD_LL_Delay(uint32_t ms)
Definition usbd_conf.c:153
void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *pcd, uint8_t ep)
Definition usbd_conf.c:71
USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep)
Definition usbd_conf.c:125
USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, uint8_t ep, uint8_t type, uint16_t mps)
Definition usbd_conf.c:118
PCD_HandleTypeDef hpcd_USB_FS
Definition usbd_conf.c:22
Configuration of the ST USB device library (third_party/st_usb) for the ACwing FC firmware: one CDC i...