1#include "stm32_usbx.hpp"
3#if defined(HAL_PCD_MODULE_ENABLED) && defined(LIBXR_SYSTEM_ThreadX)
5#include "app_azure_rtos_config.h"
6#include "ux_device_descriptors.h"
10static uint8_t usbx_memory[UX_DEVICE_APP_MEM_POOL_SIZE];
11static UX_SLAVE_CLASS_CDC_ACM_PARAMETER cdc_acm_param;
12STM32VirtualUART *STM32VirtualUART::instance_ =
nullptr;
13extern "C" void usbx_dcd_stm32_initialize(ULONG dcd_io, ULONG parameter);
15extern "C" void USBD_CDC_ACM_Activate(
void *cdc_instance)
17 if (STM32VirtualUART::instance_)
19 STM32VirtualUART::instance_->cdc_acm_ =
20 static_cast<UX_SLAVE_CLASS_CDC_ACM *
>(cdc_instance);
24extern "C" void USBD_CDC_ACM_Deactivate(
void *cdc_instance)
27 if (STM32VirtualUART::instance_)
29 STM32VirtualUART::instance_->cdc_acm_ =
nullptr;
33STM32VirtualUART::STM32VirtualUART(PCD_HandleTypeDef *hpcd, ULONG tx_stack_size,
34 UINT tx_priority, ULONG rx_stack_size,
35 UINT rx_priority, uint32_t tx_queue_size,
37 : UART(&_read_port, &_write_port),
38 tx_stack_size_(tx_stack_size),
39 rx_stack_size_(rx_stack_size),
40 tx_priority_(tx_priority),
41 rx_priority_(rx_priority),
42 buffer_size_(buffer_size),
43 rx_buff_(new uint8_t[buffer_size]),
44 tx_buff_(new uint8_t[buffer_size]),
46 _read_port(buffer_size),
47 _write_port(tx_queue_size, buffer_size)
50 ux_system_initialize(usbx_memory, UX_DEVICE_APP_MEM_POOL_SIZE, UX_NULL, 0);
53 ULONG fs_length, str_length, lang_length;
54 UCHAR *fs_desc = USBD_Get_Device_Framework_Speed(USBD_FULL_SPEED, &fs_length);
55 UCHAR *str_desc = USBD_Get_String_Framework(&str_length);
56 UCHAR *lang_desc = USBD_Get_Language_Id_Framework(&lang_length);
59 ux_device_stack_initialize(NULL, 0, fs_desc, fs_length, str_desc, str_length, lang_desc,
63 cdc_acm_param.ux_slave_class_cdc_acm_instance_activate = USBD_CDC_ACM_Activate;
64 cdc_acm_param.ux_slave_class_cdc_acm_instance_deactivate = USBD_CDC_ACM_Deactivate;
67 ux_device_stack_class_register(_ux_system_slave_class_cdc_acm_name,
68 ux_device_class_cdc_acm_entry, 1, 0, &cdc_acm_param);
70 usbx_dcd_stm32_initialize(
reinterpret_cast<ULONG
>(hpcd->Instance),
71 reinterpret_cast<ULONG
>(hpcd));
73 tx_stack_mem_ =
new uint8_t[tx_stack_size_];
74 rx_stack_mem_ =
new uint8_t[rx_stack_size_];
76 ASSERT(tx_stack_mem_ && rx_stack_mem_);
81 STM32VirtualUART::instance_ =
this;
83 static CHAR thread_name_tx_[8] =
"usbx_tx";
84 static CHAR thread_name_rx_[8] =
"usbx_rx";
86 tx_thread_create(&tx_thread_, thread_name_tx_, &STM32VirtualUART::TxThreadEntry,
87 ULONG(
this), tx_stack_mem_, tx_stack_size_, tx_priority_, tx_priority_,
88 TX_NO_TIME_SLICE, TX_AUTO_START);
90 tx_thread_create(&rx_thread_, thread_name_rx_, &STM32VirtualUART::RxThreadEntry,
91 ULONG(
this), rx_stack_mem_, rx_stack_size_, rx_priority_, rx_priority_,
92 TX_NO_TIME_SLICE, TX_AUTO_START);
97STM32VirtualUART::~STM32VirtualUART()
99 tx_thread_terminate(&tx_thread_);
100 tx_thread_delete(&tx_thread_);
101 tx_thread_terminate(&rx_thread_);
102 tx_thread_delete(&rx_thread_);
110ErrorCode STM32VirtualUART::SetConfig(UART::Configuration config)
113 return ErrorCode::OK;
116ErrorCode STM32VirtualUART::ReadFun(ReadPort &port)
120 return ErrorCode::EMPTY;
123ErrorCode STM32VirtualUART::WriteFun(WritePort &port)
125 auto *uart = CONTAINER_OF(&port, STM32VirtualUART, _write_port);
127 uart->write_sem_.Post();
128 return ErrorCode::EMPTY;
131void STM32VirtualUART::RxLoop()
140 ULONG actual_len = 0;
142 _ux_device_class_cdc_acm_read(cdc_acm_, rx_buff_, buffer_size_, &actual_len);
143 if (status == UX_SUCCESS && actual_len > 0)
145 read_port_->queue_data_->PushBatch(rx_buff_, actual_len);
146 read_port_->ProcessPendingReads(
false);
151void STM32VirtualUART::TxLoop()
162 if (write_sem_.Wait() != ErrorCode::OK)
167 if (write_port_->queue_info_->Pop(info) == ErrorCode::OK)
169 if (write_port_->queue_data_->PopBatch(tx_buff_, info.data.size_) == ErrorCode::OK)
173 _ux_device_class_cdc_acm_write(cdc_acm_, tx_buff_, info.data.size_, &actual);
174 write_port_->Finish(
false,
175 (status == UX_SUCCESS && actual == info.data.size_)
183 info.op.UpdateStatus(
false, ErrorCode::FAILED);
189void STM32VirtualUART::RxThreadEntry(ULONG arg)
191 static_cast<STM32VirtualUART *
>(
reinterpret_cast<void *
>(arg))->RxLoop();
194void STM32VirtualUART::TxThreadEntry(ULONG arg)
196 static_cast<STM32VirtualUART *
>(
reinterpret_cast<void *
>(arg))->TxLoop();
ErrorCode(* ReadFun)(ReadPort &port)
Function pointer type for read operations.
ErrorCode(* WriteFun)(WritePort &port)
Function pointer type for write operations.