libxr 1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
stm32_usb.cpp
1#include "stm32_usb.hpp"
2
3#ifdef HAL_PCD_MODULE_ENABLED
4
5using namespace LibXR;
6
7STM32VirtualUART *STM32VirtualUART::map[1];
8
9int8_t libxr_stm32_virtual_uart_init(void)
10{
11 STM32VirtualUART *uart = STM32VirtualUART::map[0];
12 USBD_CDC_SetTxBuffer(STM32VirtualUART::map[0]->usb_handle_, uart->tx_buffer_, 0);
13 USBD_CDC_SetRxBuffer(STM32VirtualUART::map[0]->usb_handle_, uart->rx_buffer_);
14 return (USBD_OK);
15}
16
17int8_t libxr_stm32_virtual_uart_deinit(void) { return (USBD_OK); }
18
19int8_t libxr_stm32_virtual_uart_control(uint8_t cmd, uint8_t *pbuf, uint16_t len)
20{
21 UNUSED(cmd);
22 UNUSED(pbuf);
23 UNUSED(len);
24 return (USBD_OK);
25}
26
27int8_t libxr_stm32_virtual_uart_receive(uint8_t *pbuf, uint32_t *Len)
28{
29 STM32VirtualUART *uart = STM32VirtualUART::map[0];
30
31 uart->read_port_.queue_data_->PushBatch(pbuf, *Len);
32 uart->read_port_.ProcessPendingReads();
33
34 USBD_CDC_ReceivePacket(STM32VirtualUART::map[0]->usb_handle_);
35
36 return (USBD_OK);
37}
38
39int8_t libxr_stm32_virtual_uart_transmit(uint8_t *pbuf, uint32_t *Len, uint8_t epnum)
40{
41 UNUSED(epnum);
42 UNUSED(pbuf);
43
44 STM32VirtualUART *uart = STM32VirtualUART::map[0];
45
47 if (uart->write_port_.queue_info_->Pop(info) != ErrorCode::OK)
48 {
49 return USBD_OK;
50 }
51
52 uart->write_port_.write_size_ = *Len;
53 info.op.UpdateStatus(true, ErrorCode::OK);
54
55 if (uart->write_port_.queue_info_->Peek(info) != ErrorCode::OK)
56 {
57 return USBD_OK;
58 }
59
60 if (uart->write_port_.queue_data_->PopBatch(uart->tx_buffer_, info.size) !=
61 ErrorCode::OK)
62 {
63 ASSERT(false);
64 return USBD_OK;
65 }
66
67#if defined(STM32F1)
68 uart->write_size_ = info.size;
69 uart->writing_ = true;
70#endif
71
72 USBD_CDC_SetTxBuffer(uart->usb_handle_, uart->tx_buffer_, info.size);
73 USBD_CDC_TransmitPacket(uart->usb_handle_);
74
75 info.op.MarkAsRunning();
76
77 return (USBD_OK);
78}
79
80#if defined(STM32F1)
81extern "C" void STM32_USB_ISR_Handler_F1(void)
82{
83 if (STM32VirtualUART::map[0] == nullptr)
84 {
85 return;
86 }
87
88 auto p_data_class = reinterpret_cast<USBD_CDC_HandleTypeDef *>(
89 STM32VirtualUART::map[0]->usb_handle_->pClassData);
90
91 if (p_data_class == nullptr)
92 {
93 return;
94 }
95
96 if (STM32VirtualUART::map[0]->writing_ && p_data_class->TxState == 0)
97 {
98 STM32VirtualUART::map[0]->writing_ = false;
99 libxr_stm32_virtual_uart_transmit(STM32VirtualUART::map[0]->tx_buffer_,
100 &STM32VirtualUART::map[0]->write_size_, 0);
101 }
102}
103#endif
104
105#endif
ErrorCode PushBatch(const void *data, size_t size)
批量推入多个元素 (Push multiple elements into the queue).
Definition queue.hpp:175
void UpdateStatus(bool in_isr, Args &&...args)
Updates operation status based on type.
Definition libxr_rw.hpp:207
ReadPort read_port_
读取端口 / Read port
Definition uart.hpp:51
LibXR Color Control Library / LibXR终端颜色控制库
Definition esp_gpio.hpp:8
constexpr auto min(T1 a, T2 b) -> typename std::common_type< T1, T2 >::type
计算两个数的最小值