3#include "ch32_usb_endpoint.hpp"
5#include "libxr_time.hpp"
15 return reinterpret_cast<volatile uint8_t*
>(
16 reinterpret_cast<volatile uint8_t*
>(&USBHSD->UEP0_TX_CTRL) +
17 static_cast<int>(ep_num) * 4);
22 return reinterpret_cast<volatile uint8_t*
>(
23 reinterpret_cast<volatile uint8_t*
>(&USBHSD->UEP0_TX_CTRL) +
24 static_cast<int>(ep_num) * 4 + 1);
29 return reinterpret_cast<volatile uint16_t*
>(
30 reinterpret_cast<volatile uint8_t*
>(&USBHSD->UEP0_TX_LEN) +
31 static_cast<int>(ep_num) * 4);
36 if (ep_num == USB::Endpoint::EPNumber::EP0)
return &USBHSD->UEP0_DMA;
37 return reinterpret_cast<volatile uint32_t*
>(
38 reinterpret_cast<volatile uint32_t*
>(&USBHSD->UEP1_TX_DMA) +
39 (
static_cast<int>(ep_num) - 1));
44 if (ep_num == USB::Endpoint::EPNumber::EP0)
return &USBHSD->UEP0_DMA;
45 return reinterpret_cast<volatile uint32_t*
>(
46 reinterpret_cast<volatile uint32_t*
>(&USBHSD->UEP1_RX_DMA) +
47 (
static_cast<int>(ep_num) - 1));
52 *GetTxLenAddr(ep_num) = value;
56 uint32_t buffer_size,
bool double_buffer)
58 uint8_t* buf_base =
reinterpret_cast<uint8_t*
>(buffer);
59 uint8_t* buf_alt = buf_base + buffer_size / 2;
62 if (ep_num == USB::Endpoint::EPNumber::EP0)
64 USBHSD->UEP0_DMA = (uint32_t)buf_base;
68 *GetTxDmaAddr(ep_num) = (uint32_t)buf_base;
69 if (double_buffer) *GetRxDmaAddr(ep_num) = (uint32_t)buf_alt;
72 int idx =
static_cast<int>(ep_num);
73 if (double_buffer && ep_num != USB::Endpoint::EPNumber::EP0)
74 USBHSD->BUF_MODE |= (1 << idx);
76 USBHSD->BUF_MODE &= ~(1 << idx);
80 uint32_t buffer_size,
bool double_buffer)
82 uint8_t* buf_base =
reinterpret_cast<uint8_t*
>(buffer);
83 uint8_t* buf_alt = buf_base + buffer_size / 2;
85 if (ep_num == USB::Endpoint::EPNumber::EP0)
87 USBHSD->UEP0_DMA = (uint32_t)buf_base;
91 *GetRxDmaAddr(ep_num) = (uint32_t)buf_base;
92 if (double_buffer) *GetTxDmaAddr(ep_num) = (uint32_t)buf_alt;
95 int idx =
static_cast<int>(ep_num);
96 if (double_buffer && ep_num != USB::Endpoint::EPNumber::EP0)
97 USBHSD->BUF_MODE |= (1 << idx);
99 USBHSD->BUF_MODE &= ~(1 << idx);
106 case USB::Endpoint::EPNumber::EP0:
107 USBHSD->ENDP_CONFIG |= USBHS_UEP0_T_EN;
109 case USB::Endpoint::EPNumber::EP1:
110 USBHSD->ENDP_CONFIG |= USBHS_UEP1_T_EN;
112 case USB::Endpoint::EPNumber::EP2:
113 USBHSD->ENDP_CONFIG |= USBHS_UEP2_T_EN;
115 case USB::Endpoint::EPNumber::EP3:
116 USBHSD->ENDP_CONFIG |= USBHS_UEP3_T_EN;
118 case USB::Endpoint::EPNumber::EP4:
119 USBHSD->ENDP_CONFIG |= USBHS_UEP4_T_EN;
121 case USB::Endpoint::EPNumber::EP5:
122 USBHSD->ENDP_CONFIG |= USBHS_UEP5_T_EN;
124 case USB::Endpoint::EPNumber::EP6:
125 USBHSD->ENDP_CONFIG |= USBHS_UEP6_T_EN;
127 case USB::Endpoint::EPNumber::EP7:
128 USBHSD->ENDP_CONFIG |= USBHS_UEP7_T_EN;
130 case USB::Endpoint::EPNumber::EP8:
131 USBHSD->ENDP_CONFIG |= USBHS_UEP8_T_EN;
133 case USB::Endpoint::EPNumber::EP9:
134 USBHSD->ENDP_CONFIG |= USBHS_UEP9_T_EN;
136 case USB::Endpoint::EPNumber::EP10:
137 USBHSD->ENDP_CONFIG |= USBHS_UEP10_T_EN;
139 case USB::Endpoint::EPNumber::EP11:
140 USBHSD->ENDP_CONFIG |= USBHS_UEP11_T_EN;
142 case USB::Endpoint::EPNumber::EP12:
143 USBHSD->ENDP_CONFIG |= USBHS_UEP12_T_EN;
145 case USB::Endpoint::EPNumber::EP13:
146 USBHSD->ENDP_CONFIG |= USBHS_UEP13_T_EN;
148 case USB::Endpoint::EPNumber::EP14:
149 USBHSD->ENDP_CONFIG |= USBHS_UEP14_T_EN;
151 case USB::Endpoint::EPNumber::EP15:
152 USBHSD->ENDP_CONFIG |= USBHS_UEP15_T_EN;
163 case USB::Endpoint::EPNumber::EP0:
164 USBHSD->ENDP_CONFIG &= ~USBHS_UEP0_T_EN;
166 case USB::Endpoint::EPNumber::EP1:
167 USBHSD->ENDP_CONFIG &= ~USBHS_UEP1_T_EN;
169 case USB::Endpoint::EPNumber::EP2:
170 USBHSD->ENDP_CONFIG &= ~USBHS_UEP2_T_EN;
172 case USB::Endpoint::EPNumber::EP3:
173 USBHSD->ENDP_CONFIG &= ~USBHS_UEP3_T_EN;
175 case USB::Endpoint::EPNumber::EP4:
176 USBHSD->ENDP_CONFIG &= ~USBHS_UEP4_T_EN;
178 case USB::Endpoint::EPNumber::EP5:
179 USBHSD->ENDP_CONFIG &= ~USBHS_UEP5_T_EN;
181 case USB::Endpoint::EPNumber::EP6:
182 USBHSD->ENDP_CONFIG &= ~USBHS_UEP6_T_EN;
184 case USB::Endpoint::EPNumber::EP7:
185 USBHSD->ENDP_CONFIG &= ~USBHS_UEP7_T_EN;
187 case USB::Endpoint::EPNumber::EP8:
188 USBHSD->ENDP_CONFIG &= ~USBHS_UEP8_T_EN;
190 case USB::Endpoint::EPNumber::EP9:
191 USBHSD->ENDP_CONFIG &= ~USBHS_UEP9_T_EN;
193 case USB::Endpoint::EPNumber::EP10:
194 USBHSD->ENDP_CONFIG &= ~USBHS_UEP10_T_EN;
196 case USB::Endpoint::EPNumber::EP11:
197 USBHSD->ENDP_CONFIG &= ~USBHS_UEP11_T_EN;
199 case USB::Endpoint::EPNumber::EP12:
200 USBHSD->ENDP_CONFIG &= ~USBHS_UEP12_T_EN;
202 case USB::Endpoint::EPNumber::EP13:
203 USBHSD->ENDP_CONFIG &= ~USBHS_UEP13_T_EN;
205 case USB::Endpoint::EPNumber::EP14:
206 USBHSD->ENDP_CONFIG &= ~USBHS_UEP14_T_EN;
208 case USB::Endpoint::EPNumber::EP15:
209 USBHSD->ENDP_CONFIG &= ~USBHS_UEP15_T_EN;
220 case USB::Endpoint::EPNumber::EP0:
221 USBHSD->ENDP_CONFIG |= USBHS_UEP0_R_EN;
223 case USB::Endpoint::EPNumber::EP1:
224 USBHSD->ENDP_CONFIG |= USBHS_UEP1_R_EN;
226 case USB::Endpoint::EPNumber::EP2:
227 USBHSD->ENDP_CONFIG |= USBHS_UEP2_R_EN;
229 case USB::Endpoint::EPNumber::EP3:
230 USBHSD->ENDP_CONFIG |= USBHS_UEP3_R_EN;
232 case USB::Endpoint::EPNumber::EP4:
233 USBHSD->ENDP_CONFIG |= USBHS_UEP4_R_EN;
235 case USB::Endpoint::EPNumber::EP5:
236 USBHSD->ENDP_CONFIG |= USBHS_UEP5_R_EN;
238 case USB::Endpoint::EPNumber::EP6:
239 USBHSD->ENDP_CONFIG |= USBHS_UEP6_R_EN;
241 case USB::Endpoint::EPNumber::EP7:
242 USBHSD->ENDP_CONFIG |= USBHS_UEP7_R_EN;
244 case USB::Endpoint::EPNumber::EP8:
245 USBHSD->ENDP_CONFIG |= USBHS_UEP8_R_EN;
247 case USB::Endpoint::EPNumber::EP9:
248 USBHSD->ENDP_CONFIG |= USBHS_UEP9_R_EN;
250 case USB::Endpoint::EPNumber::EP10:
251 USBHSD->ENDP_CONFIG |= USBHS_UEP10_R_EN;
253 case USB::Endpoint::EPNumber::EP11:
254 USBHSD->ENDP_CONFIG |= USBHS_UEP11_R_EN;
256 case USB::Endpoint::EPNumber::EP12:
257 USBHSD->ENDP_CONFIG |= USBHS_UEP12_R_EN;
259 case USB::Endpoint::EPNumber::EP13:
260 USBHSD->ENDP_CONFIG |= USBHS_UEP13_R_EN;
262 case USB::Endpoint::EPNumber::EP14:
263 USBHSD->ENDP_CONFIG |= USBHS_UEP14_R_EN;
265 case USB::Endpoint::EPNumber::EP15:
266 USBHSD->ENDP_CONFIG |= USBHS_UEP15_R_EN;
277 case USB::Endpoint::EPNumber::EP0:
278 USBHSD->ENDP_CONFIG &= ~USBHS_UEP0_R_EN;
280 case USB::Endpoint::EPNumber::EP1:
281 USBHSD->ENDP_CONFIG &= ~USBHS_UEP1_R_EN;
283 case USB::Endpoint::EPNumber::EP2:
284 USBHSD->ENDP_CONFIG &= ~USBHS_UEP2_R_EN;
286 case USB::Endpoint::EPNumber::EP3:
287 USBHSD->ENDP_CONFIG &= ~USBHS_UEP3_R_EN;
289 case USB::Endpoint::EPNumber::EP4:
290 USBHSD->ENDP_CONFIG &= ~USBHS_UEP4_R_EN;
292 case USB::Endpoint::EPNumber::EP5:
293 USBHSD->ENDP_CONFIG &= ~USBHS_UEP5_R_EN;
295 case USB::Endpoint::EPNumber::EP6:
296 USBHSD->ENDP_CONFIG &= ~USBHS_UEP6_R_EN;
298 case USB::Endpoint::EPNumber::EP7:
299 USBHSD->ENDP_CONFIG &= ~USBHS_UEP7_R_EN;
301 case USB::Endpoint::EPNumber::EP8:
302 USBHSD->ENDP_CONFIG &= ~USBHS_UEP8_R_EN;
304 case USB::Endpoint::EPNumber::EP9:
305 USBHSD->ENDP_CONFIG &= ~USBHS_UEP9_R_EN;
307 case USB::Endpoint::EPNumber::EP10:
308 USBHSD->ENDP_CONFIG &= ~USBHS_UEP10_R_EN;
310 case USB::Endpoint::EPNumber::EP11:
311 USBHSD->ENDP_CONFIG &= ~USBHS_UEP11_R_EN;
313 case USB::Endpoint::EPNumber::EP12:
314 USBHSD->ENDP_CONFIG &= ~USBHS_UEP12_R_EN;
316 case USB::Endpoint::EPNumber::EP13:
317 USBHSD->ENDP_CONFIG &= ~USBHS_UEP13_R_EN;
319 case USB::Endpoint::EPNumber::EP14:
320 USBHSD->ENDP_CONFIG &= ~USBHS_UEP14_R_EN;
322 case USB::Endpoint::EPNumber::EP15:
323 USBHSD->ENDP_CONFIG &= ~USBHS_UEP15_R_EN;
331CH32EndpointOtgHs::CH32EndpointOtgHs(EPNumber ep_num, Direction dir,
333 : Endpoint(ep_num, dir, buffer), hw_double_buffer_(double_buffer), dma_buffer_(buffer)
335 map_otg_hs_[EPNumberToInt8(GetNumber())][
static_cast<uint8_t
>(dir)] =
this;
337 if (dir == Direction::IN)
339 SetTxDmaBuffer(GetNumber(), dma_buffer_.addr_, dma_buffer_.size_, double_buffer);
343 SetRxDmaBuffer(GetNumber(), dma_buffer_.addr_, dma_buffer_.size_, double_buffer);
346 if (dir == Direction::IN)
348 SetTxLen(GetNumber(), 0);
349 *GetTxControlAddr(GetNumber()) = USBHS_UEP_T_RES_NAK;
353 *GetRxControlAddr(GetNumber()) = USBHS_UEP_R_RES_NAK;
364 ep_cfg.double_buffer =
true;
368 if (ep_cfg.double_buffer)
373 ep_cfg.double_buffer =
false;
376 if (ep_cfg.max_packet_size >
GetBuffer().size_)
381 *GetRxControlAddr(
GetNumber()) = USBHS_UEP_R_RES_NAK;
382 *GetTxControlAddr(
GetNumber()) = USBHS_UEP_T_RES_NAK;
407 *GetTxControlAddr(
GetNumber()) = USBHS_UEP_T_RES_NAK;
408 *GetRxControlAddr(
GetNumber()) = USBHS_UEP_R_RES_NAK;
417 return ErrorCode::BUSY;
421 if (buffer.
size_ < size)
423 return ErrorCode::NO_BUFF;
442 last_transfer_size_ = size;
448 auto addr = GetTxControlAddr(
GetNumber());
450 *addr = USBHS_UEP_T_RES_ACK |
451 (*addr & (~(USBHS_UEP_T_RES_MASK | USBHS_UEP_T_TOG_MDATA))) |
452 (tog0_ ? USBHS_UEP_T_TOG_DATA1 : 0);
456 auto addr = GetRxControlAddr(
GetNumber());
458 *addr = USBHS_UEP_R_RES_ACK |
459 (*addr & (~(USBHS_UEP_R_RES_MASK | USBHS_UEP_R_TOG_MDATA))) |
460 (tog0_ ? USBHS_UEP_R_TOG_DATA1 : 0);
468 return ErrorCode::OK;
475 return ErrorCode::BUSY;
481 *GetTxControlAddr(
GetNumber()) |= USBHS_UEP_T_RES_STALL;
485 *GetRxControlAddr(
GetNumber()) |= USBHS_UEP_R_RES_STALL;
488 return ErrorCode::OK;
495 return ErrorCode::FAILED;
501 *GetTxControlAddr(
GetNumber()) &= ~USBHS_UEP_T_RES_STALL;
505 *GetRxControlAddr(
GetNumber()) &= ~USBHS_UEP_R_RES_STALL;
508 return ErrorCode::OK;
511void CH32EndpointOtgHs::TransferComplete(
size_t size)
521 (*GetTxControlAddr(
GetNumber()) & ~USBHS_UEP_T_RES_MASK) | USBHS_UEP_T_RES_NAK;
523 USBHSD->INT_FG = USBHS_UIF_TRANSFER;
525 size = last_transfer_size_;
529 (USBHSD->INT_ST & USBHS_UIS_TOG_OK) != USBHS_UIS_TOG_OK)
538 *GetRxControlAddr(
GetNumber()) = USBHS_UEP_R_RES_ACK;
541 OnTransferCompleteCallback(
true, size);
void Close() override
关闭端点(软禁用/资源复位) Close (soft disable)
ErrorCode Stall() override
停止端点传输 Stop endpoint transfer
ErrorCode ClearStall() override
清除端点停止状态 Clear endpoint stop status
ErrorCode Transfer(size_t size) override
传输数据 Transfer data
void Configure(const Config &cfg) override
二次初始化/配置端点协议参数(由Pool/Manager分配后调用) Configure endpoint protocol parameters (call after pool allocation...
void SwitchBuffer() override
切换缓冲区 Switch buffer
原始数据封装类。 A class for encapsulating raw data.
size_t size_
数据大小(字节)。 The size of the data (in bytes).
void * addr_
数据存储地址。 The storage address of the data.
EPNumber
端点号 / Endpoint number
@ OUT
输出方向 / OUT direction
Direction GetDirection() const
获取端点方向 Get endpoint direction
bool UseDoubleBuffer() const
是否使用双缓冲区 / Use double buffer
Config & GetConfig()
获取当前配置 Get endpoint config
EPNumber GetNumber() const
获取端点号 Get endpoint number
virtual void SetActiveBlock(bool active_block)
设置当前活动缓冲区 Set active buffer
void SetState(State state)
设置端点状态 Set endpoint state
State GetState() const
获取端点状态 Get endpoint state
RawData GetBuffer() const
获取端点缓冲区 Get endpoint buffer