1#include "stm32_usb_dev.hpp"
3#if defined(HAL_PCD_MODULE_ENABLED)
7stm32_usb_dev_id_t STM32USBDeviceGetID(PCD_HandleTypeDef *hpcd)
9 for (
int i = 0; i < STM32_USB_DEV_ID_NUM; i++)
11 if (STM32USBDevice::map_[i] && STM32USBDevice::map_[i]->hpcd_ == hpcd)
13 return static_cast<stm32_usb_dev_id_t
>(i);
16 return STM32_USB_DEV_ID_NUM;
19extern "C" void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) { UNUSED(hpcd); }
21extern "C" void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd)
23 auto id = STM32USBDeviceGetID(hpcd);
25 ASSERT(
id < STM32_USB_DEV_ID_NUM);
27 auto usb = STM32USBDevice::map_[id];
34#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
35 SCB_InvalidateDCache_by_Addr(hpcd->Setup,
42extern "C" void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd)
44 auto id = STM32USBDeviceGetID(hpcd);
46 ASSERT(
id < STM32_USB_DEV_ID_NUM);
48 auto usb = STM32USBDevice::map_[id];
59extern "C" void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
61 auto id = STM32USBDeviceGetID(hpcd);
63 ASSERT(
id < STM32_USB_DEV_ID_NUM);
65 auto usb = STM32USBDevice::map_[id];
74extern "C" void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)
76 auto id = STM32USBDeviceGetID(hpcd);
78 ASSERT(
id < STM32_USB_DEV_ID_NUM);
80 auto usb = STM32USBDevice::map_[id];
89extern "C" void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) { UNUSED(hpcd); }
91extern "C" void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) { UNUSED(hpcd); }
93#if (defined(USB_OTG_FS))
95STM32USBDeviceOtgFS::STM32USBDeviceOtgFS(
96 PCD_HandleTypeDef *hpcd,
size_t rx_fifo_size,
97 const std::initializer_list<LibXR::RawData> RX_EP_CFGS,
98 const std::initializer_list<EPInConfig> TX_EP_CFGS,
101 const std::initializer_list<const USB::DescriptorStrings::LanguagePack *> LANG_LIST,
102 const std::initializer_list<
const std::initializer_list<USB::ConfigDescriptorItem *>>
104 :
STM32USBDevice(hpcd, STM32_USB_OTG_FS, RX_EP_CFGS.size() + TX_EP_CFGS.size(),
105 packet_size, vid, pid, bcd, LANG_LIST, CONFIGS)
107 ASSERT(RX_EP_CFGS.size() > 0 && RX_EP_CFGS.size() <= STM32Endpoint::EP_OTG_FS_MAX_SIZE);
108 ASSERT(TX_EP_CFGS.size() > 0 && TX_EP_CFGS.size() <= STM32Endpoint::EP_OTG_FS_MAX_SIZE);
109 ASSERT(64 * RX_EP_CFGS.size() <= rx_fifo_size);
111 auto rx_cfgs_itr = RX_EP_CFGS.begin();
112 auto tx_cfgs_itr = TX_EP_CFGS.begin();
114 auto ep0_in =
new STM32Endpoint(USB::Endpoint::EPNumber::EP0, id_, hpcd_,
115 USB::Endpoint::Direction::IN, (*tx_cfgs_itr).fifo_size,
116 (*tx_cfgs_itr).buffer);
120 USB::Endpoint::Direction::OUT, rx_fifo_size, (*rx_cfgs_itr));
129 size_t fifo_used_size = rx_fifo_size;
131 for (; rx_cfgs_itr != RX_EP_CFGS.end(); rx_cfgs_itr++)
133 auto ep =
new STM32Endpoint(rx_ep_index, id_, hpcd_, USB::Endpoint::Direction::OUT,
134 rx_fifo_size, (*rx_cfgs_itr));
135 USB::EndpointPool::Put(ep);
141 for (; tx_cfgs_itr != TX_EP_CFGS.end(); tx_cfgs_itr++)
143 auto ep =
new STM32Endpoint(tx_ep_index, id_, hpcd_, USB::Endpoint::Direction::IN,
144 (*tx_cfgs_itr).fifo_size, (*tx_cfgs_itr).buffer);
145 USB::EndpointPool::Put(ep);
147 fifo_used_size += (*tx_cfgs_itr).fifo_size;
150 if (fifo_used_size > USB_OTG_FS_TOTAL_FIFO_SIZE)
156ErrorCode STM32USBDeviceOtgFS::SetAddress(uint8_t address,
159 HAL_StatusTypeDef ans = HAL_OK;
161 if (context == USB::DeviceCore::Context::SETUP)
163 ans = HAL_PCD_SetAddress(hpcd_, address);
165 return (ans == HAL_OK) ? ErrorCode::OK : ErrorCode::FAILED;
170#if (defined(USB_OTG_HS))
172STM32USBDeviceOtgHS::STM32USBDeviceOtgHS(
173 PCD_HandleTypeDef *hpcd,
size_t rx_fifo_size,
174 const std::initializer_list<LibXR::RawData> RX_EP_CFGS,
175 const std::initializer_list<EPInConfig> TX_EP_CFGS,
178 const std::initializer_list<const USB::DescriptorStrings::LanguagePack *> LANG_LIST,
179 const std::initializer_list<
const std::initializer_list<USB::ConfigDescriptorItem *>>
182 hpcd, STM32_USB_OTG_HS, RX_EP_CFGS.size() + TX_EP_CFGS.size(), packet_size, vid,
183 pid, bcd, LANG_LIST, CONFIGS,
184 hpcd->Init.speed == PCD_SPEED_HIGH ? USB::Speed::HIGH : USB::Speed::FULL)
186 ASSERT(RX_EP_CFGS.size() > 0 && RX_EP_CFGS.size() <= STM32Endpoint::EP_OTG_HS_MAX_SIZE);
187 ASSERT(TX_EP_CFGS.size() > 0 && TX_EP_CFGS.size() <= STM32Endpoint::EP_OTG_HS_MAX_SIZE);
188 ASSERT(64 * RX_EP_CFGS.size() <= rx_fifo_size);
190 auto rx_cfgs_itr = RX_EP_CFGS.begin();
191 auto tx_cfgs_itr = TX_EP_CFGS.begin();
193 auto ep0_in =
new STM32Endpoint(USB::Endpoint::EPNumber::EP0, id_, hpcd_,
194 USB::Endpoint::Direction::IN, (*tx_cfgs_itr).fifo_size,
195 (*tx_cfgs_itr).buffer);
199 USB::Endpoint::Direction::OUT, rx_fifo_size, (*rx_cfgs_itr));
208 size_t fifo_used_size = rx_fifo_size;
210 for (; rx_cfgs_itr != RX_EP_CFGS.end(); rx_cfgs_itr++)
212 auto ep =
new STM32Endpoint(rx_ep_index, id_, hpcd_, USB::Endpoint::Direction::OUT,
213 rx_fifo_size, (*rx_cfgs_itr));
214 USB::EndpointPool::Put(ep);
220 for (; tx_cfgs_itr != TX_EP_CFGS.end(); tx_cfgs_itr++)
222 auto ep =
new STM32Endpoint(tx_ep_index, id_, hpcd_, USB::Endpoint::Direction::IN,
223 (*tx_cfgs_itr).fifo_size, (*tx_cfgs_itr).buffer);
224 USB::EndpointPool::Put(ep);
226 fifo_used_size += (*tx_cfgs_itr).fifo_size;
229 if (fifo_used_size > USB_OTG_HS_TOTAL_FIFO_SIZE)
235ErrorCode STM32USBDeviceOtgHS::SetAddress(uint8_t address,
238 HAL_StatusTypeDef ans = HAL_OK;
240 if (context == USB::DeviceCore::Context::SETUP)
242 ans = HAL_PCD_SetAddress(hpcd_, address);
244 return (ans == HAL_OK) ? ErrorCode::OK : ErrorCode::FAILED;
250STM32USBDeviceDevFs::STM32USBDeviceDevFs(
251 PCD_HandleTypeDef *hpcd,
const std::initializer_list<EPConfig> EP_CFGS,
254 const std::initializer_list<const USB::DescriptorStrings::LanguagePack *> LANG_LIST,
255 const std::initializer_list<
const std::initializer_list<USB::ConfigDescriptorItem *>>
257 :
STM32USBDevice(hpcd, STM32_USB_FS_DEV, EP_CFGS.size() * 2, packet_size, vid, pid,
258 bcd, LANG_LIST, CONFIGS)
260 ASSERT(EP_CFGS.size() > 0 && EP_CFGS.size() <= hpcd->Init.dev_endpoints);
262 auto cfgs_itr = EP_CFGS.begin();
264 ASSERT(cfgs_itr->double_buffer ==
false);
266 size_t buffer_offset = 0x20;
269 USB::Endpoint::EPNumber::EP0, id_, hpcd_, USB::Endpoint::Direction::OUT,
270 buffer_offset, (*cfgs_itr).hw_buffer_size2,
false, (*cfgs_itr).buffer2);
272 buffer_offset += (*cfgs_itr).hw_buffer_size2;
275 USB::Endpoint::EPNumber::EP0, id_, hpcd_, USB::Endpoint::Direction::IN,
276 buffer_offset, (*cfgs_itr).hw_buffer_size1,
false, (*cfgs_itr).buffer1);
278 buffer_offset += (*cfgs_itr).hw_buffer_size1;
286 while (cfgs_itr != EP_CFGS.end())
288 if (cfgs_itr->double_buffer)
290 ASSERT(cfgs_itr->buffer1.size_ % 2 == 0);
293 cfgs_itr->double_buffer_is_in ? USB::Endpoint::Direction::IN
294 : USB::Endpoint::Direction::OUT,
295 buffer_offset, (*cfgs_itr).hw_buffer_size1,
296 (*cfgs_itr).double_buffer, (*cfgs_itr).buffer1);
297 USB::EndpointPool::Put(ep);
299 buffer_offset += (*cfgs_itr).hw_buffer_size1 * 2;
304 ASSERT(cfgs_itr->buffer1.size_ % 2 == 0);
305 ASSERT(cfgs_itr->buffer2.size_ % 2 == 0);
307 auto ep_in =
new STM32Endpoint(ep_index, id_, hpcd_, USB::Endpoint::Direction::IN,
308 buffer_offset, (*cfgs_itr).hw_buffer_size1,
false,
309 (*cfgs_itr).buffer1);
310 USB::EndpointPool::Put(ep_in);
311 buffer_offset += (*cfgs_itr).hw_buffer_size1;
312 auto ep_out =
new STM32Endpoint(ep_index, id_, hpcd_, USB::Endpoint::Direction::OUT,
313 buffer_offset, (*cfgs_itr).hw_buffer_size2,
false,
314 (*cfgs_itr).buffer2);
315 USB::EndpointPool::Put(ep_out);
316 buffer_offset += (*cfgs_itr).hw_buffer_size2;
323 ASSERT(buffer_offset <= 512);
326ErrorCode STM32USBDeviceDevFs::SetAddress(uint8_t address,
329 HAL_StatusTypeDef ans = HAL_OK;
331 if (context == USB::DeviceCore::Context::STATUS_IN)
333 ans = HAL_PCD_SetAddress(hpcd_, address);
335 return (ans == HAL_OK) ? ErrorCode::OK : ErrorCode::FAILED;
Context
控制传输状态枚举 / Control transfer context enum
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
static constexpr EPNumber NextEPNumber(EPNumber ep)
获取下一个端点号 / Get the next endpoint number
void SetEndpoint0(Endpoint *ep0_in, Endpoint *ep0_out)
设置端点0的IN/OUT对象 / Set Endpoint 0 IN/OUT objects
USB 标准请求 SETUP 包(固定8字节) Standard USB setup packet (8 bytes)