libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
LibXR::STM32Endpoint Class Reference
Inheritance diagram for LibXR::STM32Endpoint:
[legend]
Collaboration diagram for LibXR::STM32Endpoint:
[legend]

Public Member Functions

void Configure (const Config &cfg) override
 二次初始化/配置端点协议参数(由Pool/Manager分配后调用) Configure endpoint protocol parameters (call after pool allocation)
 
void Close () override
 关闭端点(软禁用/资源复位) Close (soft disable)
 
ErrorCode Transfer (size_t size) override
 传输数据 Transfer data
 
ErrorCode Stall () override
 停止端点传输 Stop endpoint transfer
 
ErrorCode ClearStall () override
 清除端点停止状态 Clear endpoint stop status
 
size_t MaxTransferSize () const override
 返回最大可传输字节数 Return the maximum transferable size at this time
 
- Public Member Functions inherited from LibXR::USB::Endpoint
 Endpoint (EPNumber number, Direction dir, RawData buffer)
 构造函数 Constructor
 
 ~Endpoint ()=default
 析构函数 Destructor
 
 Endpoint (const Endpoint &)=delete
 
Endpointoperator= (const Endpoint &)=delete
 
EPNumber GetNumber () const
 获取端点号 Get endpoint number
 
Direction AvailableDirection () const
 获取允许配置的端点方向 Get allowed endpoint direction
 
Direction GetDirection () const
 获取端点方向 Get endpoint direction
 
uint8_t GetAddress () const
 获取端点地址(方向 + 号) Get endpoint address (dir + num)
 
State GetState () const
 获取端点状态 Get endpoint state
 
void SetState (State state)
 设置端点状态 Set endpoint state
 
Type GetType () const
 获取端点类型 Get endpoint type
 
uint16_t MaxPacketSize () const
 获取最大包长 Get max packet size
 
bool IsStalled () const
 是否挂起 / Is endpoint stalled
 
bool UseDoubleBuffer () const
 是否使用双缓冲区 / Use double buffer
 
RawData GetBuffer () const
 获取端点缓冲区 Get endpoint buffer
 
void SetOnTransferCompleteCallback (Callback< ConstRawData & > cb)
 设置传输完成回调 / Set transfer complete callback
 
void SetActiveLength (uint16_t len)
 
size_t GetActiveLength ()
 
virtual ErrorCode TransferZLP ()
 传输空包 Transfer zero length packet
 
void OnTransferCompleteCallback (bool in_isr, size_t actual_transfer_size)
 

Data Fields

PCD_HandleTypeDef * hpcd_
 
stm32_usb_dev_id_t id_
 

Additional Inherited Members

- Public Types inherited from LibXR::USB::Endpoint
enum class  Direction : uint8_t { OUT = 0 , IN = 1 , BOTH = 2 }
 端点方向 Endpoint direction More...
 
enum class  EPNumber : uint8_t {
  EP0 = 0 , EP1 = 1 , EP2 = 2 , EP3 = 3 ,
  EP4 = 4 , EP5 = 5 , EP6 = 6 , EP7 = 7 ,
  EP8 = 8 , EP9 = 9 , EP10 = 10 , EP11 = 11 ,
  EP12 = 12 , EP13 = 13 , EP14 = 14 , EP15 = 15 ,
  EP_MAX_NUM = 16 , EP_AUTO = 0xFE , EP_INVALID = 0xFF
}
 端点号 / Endpoint number More...
 
enum class  Type : uint8_t { CONTROL = 0 , ISOCHRONOUS = 1 , BULK = 2 , INTERRUPT = 3 }
 端点类型 Endpoint type More...
 
enum class  State : uint8_t {
  DISABLED , IDLE , BUSY , STALLED ,
  ERROR
}
 端点状态 Endpoint state More...
 
- Static Public Member Functions inherited from LibXR::USB::Endpoint
static constexpr uint8_t EPNumberToInt8 (EPNumber ep)
 端点号转换为uint8_t / Convert endpoint number to uint8_t
 
static constexpr uint8_t EPNumberToAddr (EPNumber ep, Direction dir)
 端点号转换为端点地址 / Convert endpoint number to endpoint address
 
static constexpr EPNumber AddrToEPNumber (uint8_t addr, Direction &dir)
 端点地址转换为端点号 / Convert endpoint address to endpoint number
 
static constexpr EPNumber NextEPNumber (EPNumber ep)
 获取下一个端点号 / Get the next endpoint number
 
- Protected Member Functions inherited from LibXR::USB::Endpoint
ConfigGetConfig ()
 获取当前配置 Get endpoint config
 
virtual void SwitchBuffer ()
 切换缓冲区 Switch buffer
 
virtual void SetActiveBlock (bool active_block)
 设置当前活动缓冲区 Set active buffer
 

Detailed Description

Definition at line 14 of file stm32_usb_ep.hpp.

Member Function Documentation

◆ ClearStall()

ErrorCode STM32Endpoint::ClearStall ( )
overridevirtual

清除端点停止状态 Clear endpoint stop status

Returns
ErrorCode

Implements LibXR::USB::Endpoint.

Definition at line 289 of file stm32_usb_ep.cpp.

290{
291 if (GetState() != State::STALLED)
292 {
293 return ErrorCode::FAILED;
294 }
295
296 uint8_t addr = EPNumberToAddr(GetNumber(), GetDirection());
297
299 {
301 return ErrorCode::OK;
302 }
303
304 if (HAL_PCD_EP_ClrStall(hpcd_, addr) == HAL_OK)
305 {
307 return ErrorCode::OK;
308 }
309 else
310 {
312 return ErrorCode::FAILED;
313 }
314}
@ EP0
端点0 / Endpoint 0
static constexpr uint8_t EPNumberToAddr(EPNumber ep, Direction dir)
端点号转换为端点地址 / Convert endpoint number to endpoint address
Definition ep.hpp:104
Direction GetDirection() const
获取端点方向 Get endpoint direction
Definition ep.hpp:186
EPNumber GetNumber() const
获取端点号 Get endpoint number
Definition ep.hpp:174
@ STALLED
挂起 / Stalled
void SetState(State state)
设置端点状态 Set endpoint state
Definition ep.hpp:220
State GetState() const
获取端点状态 Get endpoint state
Definition ep.hpp:212

◆ Close()

void STM32Endpoint::Close ( )
overridevirtual

关闭端点(软禁用/资源复位) Close (soft disable)

Implements LibXR::USB::Endpoint.

Definition at line 183 of file stm32_usb_ep.cpp.

184{
185 uint8_t addr = EPNumberToAddr(GetNumber(), GetDirection());
186 HAL_PCD_EP_Close(hpcd_, addr);
188}
@ DISABLED
禁用 / Disabled

◆ Configure()

void STM32Endpoint::Configure ( const Config & cfg)
overridevirtual

二次初始化/配置端点协议参数(由Pool/Manager分配后调用) Configure endpoint protocol parameters (call after pool allocation)

Implements LibXR::USB::Endpoint.

Definition at line 73 of file stm32_usb_ep.cpp.

74{
75 ASSERT(cfg.direction == Direction::IN || cfg.direction == Direction::OUT);
76
77 uint8_t addr = EPNumberToAddr(GetNumber(), cfg.direction);
78 uint8_t type = static_cast<uint8_t>(cfg.type);
79 auto& ep_cfg = GetConfig();
80 size_t packet_size_limit = 0;
81
82 ep_cfg = cfg;
83
84 switch (cfg.type)
85 {
86 case Type::BULK:
87#if defined(PCD_SPEED_HIGH_IN_FULL)
88 if (hpcd_->Init.speed == PCD_SPEED_FULL ||
89 hpcd_->Init.speed == PCD_SPEED_HIGH_IN_FULL)
90#else
91 if (hpcd_->Init.speed == PCD_SPEED_FULL)
92#endif
93 {
94 packet_size_limit = 64;
95 }
96 else
97 {
98 packet_size_limit = 512;
99 }
100 break;
101 case Type::INTERRUPT:
102#if defined(PCD_SPEED_HIGH_IN_FULL)
103 if (hpcd_->Init.speed == PCD_SPEED_FULL ||
104 hpcd_->Init.speed == PCD_SPEED_HIGH_IN_FULL)
105#else
106 if (hpcd_->Init.speed == PCD_SPEED_FULL)
107#endif
108 {
109 packet_size_limit = 64;
110 }
111 else
112 {
113 packet_size_limit = 1024;
114 }
115 break;
117#if defined(PCD_SPEED_HIGH_IN_FULL)
118 if (hpcd_->Init.speed == PCD_SPEED_FULL ||
119 hpcd_->Init.speed == PCD_SPEED_HIGH_IN_FULL)
120#else
121 if (hpcd_->Init.speed == PCD_SPEED_FULL)
122#endif
123 {
124 packet_size_limit = 1023;
125 }
126 else
127 {
128 packet_size_limit = 1024;
129 }
130 break;
131 case Type::CONTROL:
132 packet_size_limit = 64;
133 break;
134 default:
135 break;
136 }
137
138#if defined(USB_OTG_FS) || defined(USB_OTG_HS)
139 if (packet_size_limit > fifo_size_)
140 {
141 packet_size_limit = fifo_size_;
142 }
143#endif
144
145#if defined(USB_BASE)
146 if (packet_size_limit > hw_buffer_size_)
147 {
148 packet_size_limit = hw_buffer_size_;
149 }
150#endif
151
152 auto buffer = GetBuffer();
153
154 if (packet_size_limit > buffer.size_)
155 {
156 packet_size_limit = buffer.size_;
157 }
158
159 size_t max_packet_size = cfg.max_packet_size;
160
161 if (max_packet_size > packet_size_limit)
162 {
163 max_packet_size = packet_size_limit;
164 }
165
166 ep_cfg.max_packet_size = max_packet_size;
167
168 if (max_packet_size < 8)
169 {
170 max_packet_size = 8;
171 }
172
173 if (HAL_PCD_EP_Open(hpcd_, addr, max_packet_size, type) == HAL_OK)
174 {
176 }
177 else
178 {
180 }
181}
@ IN
输入方向 / IN direction
@ OUT
输出方向 / OUT direction
Config & GetConfig()
获取当前配置 Get endpoint config
Definition ep.hpp:365
@ ISOCHRONOUS
等时端点 / Isochronous
@ BULK
批量端点 / Bulk
@ INTERRUPT
中断端点 / Interrupt
@ CONTROL
控制端点 / Control
RawData GetBuffer() const
获取端点缓冲区 Get endpoint buffer
Definition ep.hpp:256

◆ MaxTransferSize()

size_t STM32Endpoint::MaxTransferSize ( ) const
overridevirtual

返回最大可传输字节数 Return the maximum transferable size at this time

默认为最大包长,可在支持 FIFO 优化的平台中重载为动态剩余容量。 Default equals MaxPacketSize; override for FIFO-aware implementation.

Reimplemented from LibXR::USB::Endpoint.

Definition at line 316 of file stm32_usb_ep.cpp.

317{
319 {
320 return MaxPacketSize();
321 }
322 else
323 {
324 return GetBuffer().size_;
325 }
326}
size_t size_
数据大小(字节)。 The size of the data (in bytes).
uint16_t MaxPacketSize() const
获取最大包长 Get max packet size
Definition ep.hpp:232

◆ Stall()

ErrorCode STM32Endpoint::Stall ( )
overridevirtual

停止端点传输 Stop endpoint transfer

Returns
ErrorCode

Implements LibXR::USB::Endpoint.

Definition at line 269 of file stm32_usb_ep.cpp.

270{
271 if (GetState() != State::IDLE)
272 {
273 return ErrorCode::BUSY;
274 }
275
276 uint8_t addr = EPNumberToAddr(GetNumber(), GetDirection());
277 if (HAL_PCD_EP_SetStall(hpcd_, addr) == HAL_OK)
278 {
280 return ErrorCode::OK;
281 }
282 else
283 {
285 return ErrorCode::FAILED;
286 }
287}

◆ Transfer()

ErrorCode STM32Endpoint::Transfer ( size_t size)
overridevirtual

传输数据 Transfer data

Parameters
size传输大小 / Transfer size
Returns
ErrorCode

Implements LibXR::USB::Endpoint.

Definition at line 190 of file stm32_usb_ep.cpp.

191{
192 if (GetState() == State::BUSY)
193 {
194 return ErrorCode::BUSY;
195 }
196
197 bool is_in = GetDirection() == Direction::IN;
198 auto ep_addr = EPNumberToAddr(GetNumber(), GetDirection());
199
200 PCD_EPTypeDef* ep = is_in ? &hpcd_->IN_ep[ep_addr & EP_ADDR_MSK]
201 : &hpcd_->OUT_ep[ep_addr & EP_ADDR_MSK];
202
203 auto buffer = GetBuffer();
204
205 if (buffer.size_ < size)
206 {
207 return ErrorCode::NO_BUFF;
208 }
209
210 ep->xfer_buff = reinterpret_cast<uint8_t*>(buffer.addr_);
211
212 if (UseDoubleBuffer() && GetDirection() == Direction::IN && size > 0)
213 {
214 SwitchBuffer();
215 }
216
217 ep->xfer_len = size;
218 ep->xfer_count = 0U;
219 ep->is_in = is_in ? 1U : 0U;
220 ep->num = ep_addr & EP_ADDR_MSK;
221
222#if defined(USB_OTG_FS) || defined(USB_OTG_HS)
223 if (hpcd_->Init.dma_enable == 1U)
224 {
225 ep->dma_addr = reinterpret_cast<uint32_t>(ep->xfer_buff);
226
227#if defined(__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)
228 if (is_in == true)
229 {
230 SCB_CleanDCache_by_Addr(reinterpret_cast<uint32_t*>(buffer.addr_),
231 static_cast<int32_t>(size));
232 }
233#endif
234 }
235#endif
236
237#if defined(USB_BASE)
238 if (is_in)
239 {
240 ep->xfer_fill_db = 1U;
241 ep->xfer_len_db = size;
242 }
243#endif
244
246
247#if defined(USB_OTG_FS) || defined(USB_OTG_HS)
248 auto ans = USB_EPStartXfer(hpcd_->Instance, ep, hpcd_->Init.dma_enable);
249#else
250 auto ans = USB_EPStartXfer(hpcd_->Instance, ep);
251 if (size == 0 && GetNumber() == USB::Endpoint::EPNumber::EP0 &&
253 {
254 OnTransferCompleteCallback(false, 0);
255 }
256#endif
257
258 if (ans == HAL_OK)
259 {
260 return ErrorCode::OK;
261 }
262 else
263 {
265 return ErrorCode::FAILED;
266 }
267}
bool UseDoubleBuffer() const
是否使用双缓冲区 / Use double buffer
Definition ep.hpp:248
virtual void SwitchBuffer()
切换缓冲区 Switch buffer
Definition ep.hpp:372

Field Documentation

◆ hpcd_

PCD_HandleTypeDef* LibXR::STM32Endpoint::hpcd_

Definition at line 36 of file stm32_usb_ep.hpp.

◆ id_

stm32_usb_dev_id_t LibXR::STM32Endpoint::id_

Definition at line 44 of file stm32_usb_ep.hpp.


The documentation for this class was generated from the following files: