5#include "libxr_def.hpp"
7#include "usb/core/desc_cfg.hpp"
26 static constexpr const char* DEFAULT_CONTROL_INTERFACE_STRING =
"XRUSB CDC Control";
27 static constexpr const char* DEFAULT_DATA_INTERFACE_STRING =
"XRUSB CDC Data";
122 static_assert(
sizeof(
CDCLineCoding) == 7,
"LineCoding结构必须7字节");
140 const char* control_interface_string = DEFAULT_CONTROL_INTERFACE_STRING,
141 const char* data_interface_string = DEFAULT_DATA_INTERFACE_STRING)
152 switch (local_interface_index)
281 static constexpr uint8_t COMM_INTERFACE = 0;
282 static constexpr uint8_t DATA_INTERFACE = 1;
286 desc_block_.
iad = {8,
287 static_cast<uint8_t
>(DescriptorType::IAD),
288 static_cast<uint8_t
>(COMM_INTERFACE + start_itf_num),
298 static_cast<uint8_t
>(DescriptorType::INTERFACE),
299 static_cast<uint8_t
>(COMM_INTERFACE + start_itf_num),
314 desc_block_.cdc_callmgmt = {
317 static_cast<uint8_t
>(DATA_INTERFACE + start_itf_num)};
327 static_cast<uint8_t
>(COMM_INTERFACE + start_itf_num),
328 static_cast<uint8_t
>(DATA_INTERFACE + start_itf_num)};
333 static_cast<uint8_t
>(DescriptorType::INTERFACE),
334 static_cast<uint8_t
>(DATA_INTERFACE + start_itf_num),
344 static_cast<uint8_t
>(DescriptorType::ENDPOINT),
352 static_cast<uint8_t
>(DescriptorType::ENDPOINT),
362 static_cast<uint8_t
>(DescriptorType::ENDPOINT),
373 SetData(
RawData{
reinterpret_cast<uint8_t*
>(&desc_block_),
sizeof(desc_block_)});
499 uint16_t wLength, uint16_t wIndex,
615 uint8_t bFunctionLength = 5;
616 DescriptorType bDescriptorType = DescriptorType::CS_INTERFACE;
623 uint8_t bFunctionLength = 5;
624 DescriptorType bDescriptorType = DescriptorType::CS_INTERFACE;
632 uint8_t bFunctionLength = 4;
633 DescriptorType bDescriptorType = DescriptorType::CS_INTERFACE;
640 uint8_t bFunctionLength = 5;
641 DescriptorType bDescriptorType = DescriptorType::CS_INTERFACE;
659 bool Inited() {
return inited_; }
661 Endpoint* GetDataInEndpoint() {
return ep_data_in_; }
665 Endpoint* GetCommInEndpoint() {
return ep_comm_in_; }
通用回调包装,支持动态参数传递 / Generic callback wrapper supporting dynamic argument passing
static Callback Create(CallableType fun, BoundArgType arg)
创建回调对象并绑定回调函数与参数 / Create a callback instance with bound function and argument
常量原始数据封装类。 A class for encapsulating constant raw data.
原始数据封装类。 A class for encapsulating raw data.
@ NO_PARITY
无校验 / No parity
USB CDC ACM (Abstract Control Model) 设备类实现 USB CDC ACM (Abstract Control Model) device class implemen...
void SetOnSetControlLineStateCallback(LibXR::Callback< bool, bool > cb)
设置控制线路状态变更回调 Set control line state change callback
virtual void BindEndpoints(EndpointPool &endpoint_pool, uint8_t start_itf_num, bool) override
初始化CDC设备 Initialize CDC device
LibXR::Callback< bool, bool > on_set_control_line_state_cb_
Protocol
CDC协议代码 / CDC protocol codes.
@ AT_COMMAND
AT命令协议 / AT Command protocol.
size_t GetMaxConfigSize() override
获取最大配置描述符大小 Get maximum configuration descriptor size
Endpoint::EPNumber data_in_ep_num_
数据IN端点号 / Data IN endpoint number
uint8_t itf_comm_in_num_
通信接口号 / Communication interface number
CDCNotification
CDC通知类型 / CDC notification types.
@ RESPONSE_AVAILABLE
响应可用通知 / Response available
@ NETWORK_CONNECTION
网络连接通知 / Network connection
@ AUX_JACK_HOOK_STATE
辅助插槽状态通知 / Aux jack hook state
@ RING_DETECT
响铃检测通知 / Ring detect
void SetOnSetLineCodingCallback(LibXR::Callback< LibXR::UART::Configuration > cb)
设置线路编码变更回调 Set line coding change callback
Endpoint::EPNumber comm_ep_num_
通信端点号 / Communication endpoint number
Class
USB设备类代码 / USB device class codes.
@ COMM
通信设备类 / Communications device class
@ DATA
数据接口类 / Data interface class
virtual void OnDataInComplete(bool in_isr, ConstRawData &data)=0
数据IN端点传输完成处理 Handle data IN endpoint transfer completion
CDCBase(Endpoint::EPNumber data_in_ep_num=Endpoint::EPNumber::EP_AUTO, Endpoint::EPNumber data_out_ep_num=Endpoint::EPNumber::EP_AUTO, Endpoint::EPNumber comm_ep_num=Endpoint::EPNumber::EP_AUTO, const char *control_interface_string=DEFAULT_CONTROL_INTERFACE_STRING, const char *data_interface_string=DEFAULT_DATA_INTERFACE_STRING)
CDC构造函数 CDC constructor.
Subclass
CDC子类代码 / CDC subclass codes.
@ DIRECT_LINE_CONTROL_MODEL
直接控制模型(CDC-DCM) / Direct Control Model (CDC-DCM)
@ ABSTRACT_CONTROL_MODEL
抽象控制模型(CDC-ACM) / Abstract Control Model (CDC-ACM)
Endpoint * ep_comm_in_
通信IN端点 / Communication IN endpoint
bool inited_
初始化标志 / Initialization flag
Endpoint * ep_data_in_
数据IN端点 / Data IN endpoint
const char * GetInterfaceString(size_t local_interface_index) const override
返回本类暴露的第 N 个接口字符串 Return the string for the Nth local interface exposed by this class.
static void OnDataOutCompleteStatic(bool in_isr, CDCBase *self, ConstRawData &data)
数据OUT端点传输完成静态回调 Static callback for data OUT endpoint transfer completion
bool OwnsEndpoint(uint8_t ep_addr) const override
可选:端点归属判定 / Optional: endpoint ownership
static constexpr uint16_t CDC_CONTROL_LINE_DTR
DTR控制位 / DTR control bit.
ClassRequest
CDC类特定请求 / CDC class-specific requests.
@ SEND_BREAK
发送BREAK信号 / Send BREAK signal
@ GET_LINE_CODING
获取当前线路编码 / Get current line coding
@ SET_CONTROL_LINE_STATE
设置控制线路状态 / Set control line state
@ SET_LINE_CODING
设置串行线路编码 / Set line coding parameters
DescriptorSubtype
CDC功能描述符子类型定义 / CDC functional descriptor subtypes.
@ ACM
抽象控制模型描述符 / Abstract control model descriptor
@ CALL_MANAGEMENT
呼叫管理功能描述符 / Call management functional descriptor
@ HEADER
头功能描述符 / Header functional descriptor
@ UNION
联合功能描述符 / Union functional descriptor
LibXR::Callback< LibXR::UART::Configuration > on_set_line_coding_cb_
线路编码变更回调 / Line coding change callback
bool IsRtsSet() const
检查RTS状态 Check RTS state
Endpoint::EPNumber data_out_ep_num_
数据OUT端点号 / Data OUT endpoint number
uint16_t control_line_state_
控制线路状态 / Control line state
ErrorCode OnClassRequest(bool in_isr, uint8_t bRequest, uint16_t wValue, uint16_t wLength, uint16_t wIndex, DeviceClass::ControlTransferResult &result) override
处理类特定请求 Handle class-specific requests
virtual void OnDataOutComplete(bool in_isr, ConstRawData &data)=0
数据OUT端点传输完成处理 Handle data OUT endpoint transfer completion
bool HasIAD() override
检查是否包含IAD Check if IAD is present
static void OnDataInCompleteStatic(bool in_isr, CDCBase *self, ConstRawData &data)
数据IN端点传输完成静态回调 Static callback for data IN endpoint transfer completion
CDCLineCoding line_coding_
当前线路编码 / Current line coding
ErrorCode OnClassData(bool in_isr, uint8_t bRequest, LibXR::ConstRawData &data) override
处理类请求数据阶段 Handle class request data stage
Endpoint * ep_data_out_
数据OUT端点 / Data OUT endpoint
const char * control_interface_string_
控制接口字符串 / Control interface string
ErrorCode SendSerialState()
发送串行状态通知 Send serial state notification
static constexpr uint16_t CDC_CONTROL_LINE_RTS
RTS控制位 / RTS control bit.
virtual void UnbindEndpoints(EndpointPool &endpoint_pool, bool) override
反初始化CDC设备 Deinitialize CDC device
size_t GetInterfaceCount() override
获取接口数量 Get number of interfaces
const char * data_interface_string_
数据接口字符串 / Data interface string
bool IsDtrSet() const
检查DTR状态 Check DTR state
void SetData(RawData data)
设置内部数据缓存 / Set internal data cache
USB 设备类接口基类 / USB device class interface base.
uint8_t GetInterfaceStringIndex(size_t local_interface_index) const
返回已分配的接口字符串索引 Return the assigned USB string index for a local interface.
USB 端点基类 / USB Endpoint base class.
EPNumber
端点号 Endpoint number
@ EP_AUTO
自动分配端点号 / Auto allocate
uint8_t GetAddress() const
获取端点地址(方向 + 号) / Get endpoint address (dir + num)
@ OUT
输出方向 / OUT direction
void SetActiveLength(uint16_t len)
设置当前活动缓冲区有效长度 / Set active buffer valid length
void SetOnTransferCompleteCallback(Callback< ConstRawData & > cb)
设置传输完成回调 / Set transfer complete callback
virtual void Configure(const Config &cfg)=0
配置端点协议参数 / Configure endpoint protocol parameters
@ INTERRUPT
中断端点 / Interrupt
virtual void Close()=0
关闭端点 / Close endpoint
uint16_t MaxPacketSize() const
获取最大包长 / Get max packet size
State GetState() const
获取端点状态 / Get endpoint state
virtual ErrorCode Transfer(size_t size)=0
启动一次传输 / Start a transfer
RawData GetBuffer() const
获取当前可用于传输的缓冲区 / Get current transfer buffer
USB端点池类 / USB endpoint pool class.
ErrorCode Get(Endpoint *&ep_info, Endpoint::Direction direction, Endpoint::EPNumber ep_num=Endpoint::EPNumber::EP_AUTO)
分配端点 / Allocate endpoint
ErrorCode Release(Endpoint *ep_info)
回收端点 / Release endpoint
@ NOT_SUPPORT
不支持 | Not supported
@ OK
操作成功 | Operation successful
@ ARG_ERR
参数错误 | Argument error
UART 配置结构体 / UART configuration structure.
uint8_t stop_bits
停止位长度 / Number of stop bits
Parity parity
校验模式 / Parity mode
uint8_t data_bits
数据位长度 / Number of data bits
uint32_t baudrate
波特率 / Baud rate
CDC描述符块结构 CDC descriptor block structure.
InterfaceDescriptor data_intf
数据接口描述符 / Data interface descriptor
uint8_t bSlaveInterface0
从接口号 / Slave interface number
EndpointDescriptor data_ep_out
数据OUT端点描述符 / Data OUT endpoint descriptor
uint16_t bcdCDC
CDC规范版本 / CDC specification version.
uint8_t bmCapabilities
呼叫管理能力 / Call management capabilities
InterfaceDescriptor comm_intf
通信接口描述符 / Communication interface descriptor
uint8_t bDataInterface
数据接口号 / Data interface number
EndpointDescriptor comm_ep
通信端点描述符 / Communication endpoint descriptor
uint8_t bMasterInterface
主接口号 / Master interface number
EndpointDescriptor data_ep_in
数据IN端点描述符 / Data IN endpoint descriptor
IADDescriptor iad
接口关联描述符 / Interface association descriptor
CDC线路编码参数结构体 CDC line coding parameters structure.
uint32_t dwDTERate
波特率(小端格式) / Baud rate (little-endian)
uint8_t bCharFormat
停止位:0=1位,1=1.5位,2=2位 / Stop bits: 0=1, 1=1.5, 2=2
uint8_t bDataBits
数据位:5,6,7,8或16 / Data bits: 5,6,7,8 or 16
串行状态通知结构体 Serial state notification structure
uint16_t wLength
数据长度(固定为2)| Data length (fixed to 2)
uint16_t wIndex
接口号 / Interface number
uint16_t serialState
串行状态位图 / Serial state bitmap
uint8_t bmRequestType
请求类型(固定为 0xA1) / Request type (fixed to 0xA1)
uint16_t wValue
值(固定为 0) / Value (fixed to 0)
端点描述符(7 字节)/ Endpoint descriptor (7 bytes)
IAD(8 字节)/ Interface Association Descriptor (8 bytes)
接口描述符(9 字节)/ Interface descriptor (9 bytes)
控制请求(Class/Vendor)处理结果 / Control request (Class/Vendor) handling result
bool write_zlp
发送 STATUS IN(发送 ZLP)/ Send STATUS IN (send ZLP)