1#include "stm32_usb.hpp"
3#if defined(HAL_PCD_MODULE_ENABLED) && !defined(LIBXR_SYSTEM_ThreadX)
9int8_t libxr_stm32_virtual_uart_init(
void)
12 USBD_CDC_SetTxBuffer(STM32VirtualUART::map[0]->usb_handle_,
14 USBD_CDC_SetRxBuffer(STM32VirtualUART::map[0]->usb_handle_,
19int8_t libxr_stm32_virtual_uart_deinit(
void) {
return (USBD_OK); }
21int8_t libxr_stm32_virtual_uart_control(uint8_t cmd, uint8_t *pbuf, uint16_t len)
29int8_t libxr_stm32_virtual_uart_receive(uint8_t *pbuf, uint32_t *Len)
34 SCB_InvalidateDCache_by_Addr(pbuf, *Len);
40 USBD_CDC_ReceivePacket(STM32VirtualUART::map[0]->usb_handle_);
45int8_t libxr_stm32_virtual_uart_transmit(uint8_t *pbuf, uint32_t *Len, uint8_t epnum)
61 if (uart->
write_port_->queue_info_->Pop(current_info) != ErrorCode::OK)
70 uart->write_size_ = current_info.data.
size_;
71 uart->writing_ =
true;
74 USBD_CDC_SetTxBuffer(uart->usb_handle_, uart->tx_buffer_.
ActiveBuffer(),
75 current_info.data.
size_);
77 SCB_CleanDCache_by_Addr(
reinterpret_cast<uint32_t *
>(uart->tx_buffer_.
ActiveBuffer()),
80 USBD_CDC_TransmitPacket(uart->usb_handle_);
86 if (uart->
write_port_->queue_info_->Peek(next_info) != ErrorCode::OK)
92 next_info.data.
size_) != ErrorCode::OK)
104extern "C" void STM32_USB_ISR_Handler_F1(
void)
106 if (STM32VirtualUART::map[0] ==
nullptr)
111 auto p_data_class =
reinterpret_cast<USBD_CDC_HandleTypeDef *
>(
112 STM32VirtualUART::map[0]->usb_handle_->pClassData);
114 if (p_data_class ==
nullptr)
119 if (STM32VirtualUART::map[0]->writing_ && p_data_class->TxState == 0)
121 STM32VirtualUART::map[0]->writing_ =
false;
122 libxr_stm32_virtual_uart_transmit(STM32VirtualUART::map[0]->tx_buffer_.ActiveBuffer(),
123 &STM32VirtualUART::map[0]->write_size_, 0);
128ErrorCode STM32VirtualUART::WriteFun(
WritePort &port)
132 reinterpret_cast<USBD_CDC_HandleTypeDef *
>(uart->usb_handle_->pClassData);
136 if (p_data_class ==
nullptr)
138 port.queue_info_->Pop(info);
140 port.
Finish(
false, ErrorCode::INIT_ERR, info, 0);
141 return ErrorCode::INIT_ERR;
146 return ErrorCode::FULL;
149 if (port.queue_info_->Peek(info) != ErrorCode::OK)
151 return ErrorCode::EMPTY;
158 return ErrorCode::EMPTY;
164 if (!uart->writing_ && p_data_class->TxState == 0)
166 if (p_data_class->TxState == 0)
169 uart->tx_buffer_.
Switch();
170 port.queue_info_->Pop(uart->write_info_active_);
173 uart->write_size_ = info.data.
size_;
174 uart->writing_ =
true;
177 USBD_CDC_SetTxBuffer(uart->usb_handle_, uart->tx_buffer_.
ActiveBuffer(),
180 SCB_CleanDCache_by_Addr(
reinterpret_cast<uint32_t *
>(uart->tx_buffer_.
ActiveBuffer()),
183 USBD_CDC_TransmitPacket(uart->usb_handle_);
187 return ErrorCode::FAILED;
189 return ErrorCode::FAILED;
192ErrorCode STM32VirtualUART::ReadFun(
ReadPort &port)
195 return ErrorCode::EMPTY;
198STM32VirtualUART::STM32VirtualUART(USBD_HandleTypeDef &usb_handle, uint8_t *tx_buffer,
199 uint8_t *rx_buffer, uint32_t tx_queue_size)
200 :
UART(&_read_port, &_write_port),
201 usb_handle_(&usb_handle),
202 tx_buffer_(
RawData(tx_buffer, APP_TX_DATA_SIZE)),
203 rx_buffer_(
RawData(rx_buffer, APP_RX_DATA_SIZE)),
204 _write_port(tx_queue_size, APP_TX_DATA_SIZE),
205 _read_port(APP_RX_DATA_SIZE)
209 static USBD_CDC_ItfTypeDef usbd_cdc_itf = Apply<USBD_CDC_ItfTypeDef>();
211 USBD_CDC_RegisterInterface(usb_handle_, &usbd_cdc_itf);
216 USBD_CDC_ReceivePacket(usb_handle_);
222 return ErrorCode::OK;
size_t size_
数据大小(字节)。 The size of the data (in bytes).
uint8_t * PendingBuffer()
获取备用缓冲区的指针 Returns the pending (inactive) buffer
void EnablePending()
手动启用 pending 状态 Manually sets the pending state to true
bool HasPending() const
判断是否有待切换的缓冲区 Checks whether a pending buffer is ready
void Switch()
切换到备用缓冲区(若其有效) Switches to the pending buffer if it's valid
uint8_t * ActiveBuffer()
获取当前正在使用的缓冲区指针 Returns the currently active buffer
ErrorCode PushBatch(const Data *data, size_t size)
批量推入数据 / Pushes multiple elements into the queue
ErrorCode PopBatch(Data *data, size_t size)
批量弹出数据 / Pops multiple elements from the queue
void MarkAsRunning()
标记操作为运行状态。 Marks the operation as running.
原始数据封装类。 A class for encapsulating raw data.
ReadPort class for handling read operations.
virtual void ProcessPendingReads(bool in_isr)
Processes pending reads.
ErrorCode SetConfig(UART::Configuration config)
设置 UART 配置 / Sets the UART configuration
通用异步收发传输(UART)基类 / Abstract base class for Universal Asynchronous Receiver-Transmitter (UART)
ReadPort * read_port_
读取端口 / Read port
WritePort * write_port_
写入端口 / Write port
WritePort class for handling write operations.
void Finish(bool in_isr, ErrorCode ans, WriteInfoBlock &info, uint32_t size)
更新写入操作的状态。 Updates the status of the write operation.
ErrorCode(* ReadFun)(ReadPort &port)
Function pointer type for read operations.
ErrorCode(* WriteFun)(WritePort &port)
Function pointer type for write operations.
UART 配置结构体 / UART configuration structure.