1#include "stm32_usb_dev.hpp"
3#include "stm32_dcache.hpp"
4#if defined(HAL_PCD_MODULE_ENABLED)
8stm32_usb_dev_id_t STM32USBDeviceGetID(PCD_HandleTypeDef* hpcd)
10 for (
int i = 0; i < STM32_USB_DEV_ID_NUM; i++)
12 if (STM32USBDevice::map_[i] && STM32USBDevice::map_[i]->hpcd_ == hpcd)
14 return static_cast<stm32_usb_dev_id_t
>(i);
17 return STM32_USB_DEV_ID_NUM;
20extern "C" void HAL_PCD_SOFCallback(PCD_HandleTypeDef* hpcd) { UNUSED(hpcd); }
22extern "C" void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef* hpcd)
24 auto id = STM32USBDeviceGetID(hpcd);
26 if (
id >= STM32_USB_DEV_ID_NUM)
31 auto usb = STM32USBDevice::map_[id];
38 if (STM32USBUsesDma(hpcd))
43 usb->GetEndpoint0In()->SetState(USB::Endpoint::State::IDLE);
44 usb->GetEndpoint0Out()->SetState(USB::Endpoint::State::IDLE);
49extern "C" void HAL_PCD_ResetCallback(PCD_HandleTypeDef* hpcd)
51 auto id = STM32USBDeviceGetID(hpcd);
53 if (
id >= STM32_USB_DEV_ID_NUM)
58 auto usb = STM32USBDevice::map_[id];
69extern "C" void HAL_PCD_SuspendCallback(PCD_HandleTypeDef* hpcd)
71 auto id = STM32USBDeviceGetID(hpcd);
73 if (
id >= STM32_USB_DEV_ID_NUM)
78 auto usb = STM32USBDevice::map_[id];
87extern "C" void HAL_PCD_ResumeCallback(PCD_HandleTypeDef* hpcd)
89 auto id = STM32USBDeviceGetID(hpcd);
91 if (
id >= STM32_USB_DEV_ID_NUM)
96 auto usb = STM32USBDevice::map_[id];
105extern "C" void HAL_PCD_ConnectCallback(PCD_HandleTypeDef* hpcd) { UNUSED(hpcd); }
107extern "C" void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef* hpcd) { UNUSED(hpcd); }
109#if (defined(USB_OTG_FS))
112 PCD_HandleTypeDef* hpcd,
size_t rx_fifo_size,
113 const std::initializer_list<LibXR::RawData> RX_EP_CFGS,
114 const std::initializer_list<EPInConfig> TX_EP_CFGS,
117 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
118 const std::initializer_list<
const std::initializer_list<USB::ConfigDescriptorItem*>>
121 :
STM32USBDevice(hpcd, STM32_USB_OTG_FS, RX_EP_CFGS.size() + TX_EP_CFGS.size(),
122 packet_size, vid, pid, bcd, LANG_LIST, CONFIGS, uid)
124 ASSERT(RX_EP_CFGS.size() > 0 && RX_EP_CFGS.size() <= STM32Endpoint::EP_OTG_FS_MAX_SIZE);
125 ASSERT(TX_EP_CFGS.size() > 0 && TX_EP_CFGS.size() <= STM32Endpoint::EP_OTG_FS_MAX_SIZE);
126 ASSERT(64 * RX_EP_CFGS.size() <= rx_fifo_size);
128 auto rx_cfgs_itr = RX_EP_CFGS.begin();
129 auto tx_cfgs_itr = TX_EP_CFGS.begin();
139 (*tx_cfgs_itr).buffer);
148 size_t fifo_used_size = rx_fifo_size;
150 for (; rx_cfgs_itr != RX_EP_CFGS.end(); rx_cfgs_itr++)
153 rx_fifo_size, (*rx_cfgs_itr));
160 for (; tx_cfgs_itr != TX_EP_CFGS.end(); tx_cfgs_itr++)
163 (*tx_cfgs_itr).fifo_size, (*tx_cfgs_itr).buffer);
166 fifo_used_size += (*tx_cfgs_itr).fifo_size;
169 if (fifo_used_size > USB_OTG_FS_TOTAL_FIFO_SIZE)
178 HAL_StatusTypeDef ans = HAL_OK;
182 ans = HAL_PCD_SetAddress(hpcd_, address);
189#if (defined(USB_OTG_HS))
192 PCD_HandleTypeDef* hpcd,
size_t rx_fifo_size,
193 const std::initializer_list<LibXR::RawData> RX_EP_CFGS,
194 const std::initializer_list<EPInConfig> TX_EP_CFGS,
197 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
198 const std::initializer_list<
const std::initializer_list<USB::ConfigDescriptorItem*>>
202 hpcd, STM32_USB_OTG_HS, RX_EP_CFGS.size() + TX_EP_CFGS.size(), packet_size, vid,
203 pid, bcd, LANG_LIST, CONFIGS, uid,
204 hpcd->Init.speed == PCD_SPEED_HIGH ? USB::Speed::HIGH : USB::Speed::
FULL)
206 ASSERT(RX_EP_CFGS.size() > 0 && RX_EP_CFGS.size() <= STM32Endpoint::EP_OTG_HS_MAX_SIZE);
207 ASSERT(TX_EP_CFGS.size() > 0 && TX_EP_CFGS.size() <= STM32Endpoint::EP_OTG_HS_MAX_SIZE);
208 ASSERT(64 * RX_EP_CFGS.size() <= rx_fifo_size);
210 auto rx_cfgs_itr = RX_EP_CFGS.begin();
211 auto tx_cfgs_itr = TX_EP_CFGS.begin();
221 (*tx_cfgs_itr).buffer);
230 size_t fifo_used_size = rx_fifo_size;
232 for (; rx_cfgs_itr != RX_EP_CFGS.end(); rx_cfgs_itr++)
235 rx_fifo_size, (*rx_cfgs_itr));
242 for (; tx_cfgs_itr != TX_EP_CFGS.end(); tx_cfgs_itr++)
245 (*tx_cfgs_itr).fifo_size, (*tx_cfgs_itr).buffer);
248 fifo_used_size += (*tx_cfgs_itr).fifo_size;
251 if (fifo_used_size > USB_OTG_HS_TOTAL_FIFO_SIZE)
260 HAL_StatusTypeDef ans = HAL_OK;
264 ans = HAL_PCD_SetAddress(hpcd_, address);
271#if defined(USB_BASE) || defined(USB_DRD_FS)
272STM32USBDeviceDevFs::STM32USBDeviceDevFs(
273 PCD_HandleTypeDef* hpcd,
const std::initializer_list<EPConfig> EP_CFGS,
276 const std::initializer_list<const USB::DescriptorStrings::LanguagePack*> LANG_LIST,
277 const std::initializer_list<
const std::initializer_list<USB::ConfigDescriptorItem*>>
280 :
STM32USBDevice(hpcd, STM32_USB_FS_DEV, EP_CFGS.size() * 2, packet_size, vid, pid,
281 bcd, LANG_LIST, CONFIGS, uid)
283 ASSERT(EP_CFGS.size() > 0 && EP_CFGS.size() <= hpcd->Init.dev_endpoints);
285 auto cfgs_itr = EP_CFGS.begin();
287#if defined(PMA_START_ADDR)
288 size_t buffer_offset = PMA_START_ADDR;
290 size_t buffer_offset = BTABLE_ADDRESS + hpcd_->Init.dev_endpoints * 8U;
295 (*cfgs_itr).hw_buffer_size2, (*cfgs_itr).buffer2);
297 buffer_offset += (*cfgs_itr).hw_buffer_size2;
301 (*cfgs_itr).hw_buffer_size1, (*cfgs_itr).buffer1);
303 buffer_offset += (*cfgs_itr).hw_buffer_size1;
311 while (cfgs_itr != EP_CFGS.end())
313 if (cfgs_itr->hw_buffer_size2 == 0)
315 ASSERT(cfgs_itr->buffer1.size_ % 2 == 0);
317 ep_index, id_, hpcd_,
320 buffer_offset, (*cfgs_itr).hw_buffer_size1, (*cfgs_itr).buffer1);
323 buffer_offset += (*cfgs_itr).hw_buffer_size1;
328 ASSERT(cfgs_itr->buffer1.size_ % 2 == 0);
329 ASSERT(cfgs_itr->buffer2.size_ % 2 == 0);
332 buffer_offset, (*cfgs_itr).hw_buffer_size1,
333 (*cfgs_itr).buffer1);
335 buffer_offset += (*cfgs_itr).hw_buffer_size1;
337 buffer_offset, (*cfgs_itr).hw_buffer_size2,
338 (*cfgs_itr).buffer2);
340 buffer_offset += (*cfgs_itr).hw_buffer_size2;
347 ASSERT(buffer_offset <= LIBXR_STM32_USB_PMA_SIZE);
350ErrorCode STM32USBDeviceDevFs::SetAddress(uint8_t address,
353 HAL_StatusTypeDef ans = HAL_OK;
357 ans = HAL_PCD_SetAddress(hpcd_, address);
只读原始数据视图 / Immutable raw data view
STM32 USB 端点实现 / STM32 USB endpoint implementation.
STM32 USB 设备核心实现 / STM32 USB device core implementation.
STM32USBDeviceOtgFS(PCD_HandleTypeDef *hpcd, size_t rx_fifo_size, const std::initializer_list< LibXR::RawData > RX_EP_CFGS, const std::initializer_list< EPInConfig > TX_EP_CFGS, USB::DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid, uint16_t bcd, const std::initializer_list< const USB::DescriptorStrings::LanguagePack * > LANG_LIST, const std::initializer_list< const std::initializer_list< USB::ConfigDescriptorItem * > > CONFIGS, ConstRawData uid={nullptr, 0})
构造 OTG FS 设备对象 / Construct OTG FS device object
ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context) override
设置设备地址(由子类实现) Set device address (implemented by derived class).
STM32USBDeviceOtgHS(PCD_HandleTypeDef *hpcd, size_t rx_fifo_size, const std::initializer_list< LibXR::RawData > RX_EP_CFGS, const std::initializer_list< EPInConfig > TX_EP_CFGS, USB::DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid, uint16_t bcd, const std::initializer_list< const USB::DescriptorStrings::LanguagePack * > LANG_LIST, const std::initializer_list< const std::initializer_list< USB::ConfigDescriptorItem * > > CONFIGS, ConstRawData uid={nullptr, 0})
构造 OTG HS 设备对象 / Construct OTG HS device object
ErrorCode SetAddress(uint8_t address, USB::DeviceCore::Context context) override
设置设备地址(由子类实现) Set device address (implemented by derived class).
Context
控制传输上下文 / Control transfer context
@ STATUS_IN_ARMED
STATUS IN ZLP armed, but not yet completed.
@ STATUS_IN_COMPLETE
IN status stage completed.
PacketSize0
控制端点0最大包长度枚举 Packet size for endpoint 0 (bMaxPacketSize0)
EPNumber
端点号 Endpoint number
static constexpr uint8_t EPNumberToInt8(EPNumber ep)
端点号转换为 uint8_t / Convert endpoint number to uint8_t
@ OUT
输出方向 / OUT direction
static constexpr EPNumber NextEPNumber(EPNumber ep)
获取下一个端点号 / Get the next endpoint number
ErrorCode Put(Endpoint *ep)
登记一个端点到池中 / Register an endpoint into the pool
void SetEndpoint0(Endpoint *ep0_in, Endpoint *ep0_out)
设置端点0的IN/OUT对象 / Set Endpoint 0 IN/OUT objects
LibXR 命名空间 / LibXR namespace.
void STM32_InvalidateDCacheByAddr(const void *addr, size_t size)
失效指定内存范围覆盖的 D-Cache cache line Invalidates D-Cache lines covering the specified memory range
ErrorCode
定义错误码枚举 / Defines an enumeration for error codes
@ FAILED
操作失败 / Operation failed
@ OK
操作成功 / Operation successful
USB 标准请求 SETUP 包(固定8字节) Standard USB setup packet (8 bytes)