libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
dev_core.hpp
1#pragma once
2
3#include <cstddef>
4#include <cstdint>
5#include <initializer_list>
6
7#include "device_class.hpp"
8#include "device_composition.hpp"
9#include "libxr_type.hpp"
10#include "usb/core/core.hpp"
11#include "usb/core/ep_pool.hpp"
12
13namespace LibXR::USB
14{
15
22{
23 public:
41
58 EndpointPool& ep_pool, USBSpec spec, Speed speed,
59 DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid, uint16_t bcd,
60 const std::initializer_list<const DescriptorStrings::LanguagePack*>& lang_list,
61 const std::initializer_list<const std::initializer_list<ConfigDescriptorItem*>>&
62 configs,
63 ConstRawData uid = {nullptr, 0});
64
70 virtual void Init(bool in_isr);
71
77 virtual void Deinit(bool in_isr);
78
84 virtual void Start(bool in_isr) = 0;
85
91 virtual void Stop(bool in_isr) = 0;
92
98 void OnSetupPacket(bool in_isr, const SetupPacket* setup);
99
100 protected:
109 virtual ErrorCode SetAddress(uint8_t address, Context state) = 0;
110
114 virtual void EnableRemoteWakeup() {}
115
119 virtual void DisableRemoteWakeup() {}
120
125 virtual bool IsRemoteWakeupEnabled() const { return false; }
126
131 [[nodiscard]] Speed GetSpeed() const;
132
133 private:
134 static void OnEP0OutCompleteStatic(bool in_isr, DeviceCore* self,
136 static void OnEP0InCompleteStatic(bool in_isr, DeviceCore* self,
138
139 static bool IsValidUSBCombination(USBSpec spec, Speed speed,
141
142 void OnEP0OutComplete(bool in_isr, LibXR::ConstRawData& data);
143 void OnEP0InComplete(bool in_isr, LibXR::ConstRawData& data);
144
145 void ReadZLP(Context context = Context::ZLP);
146 void WriteZLP(Context context = Context::ZLP);
147 void ResetControlTransferState();
148
149 void DevWriteEP0Data(LibXR::ConstRawData data, size_t packet_max_length,
150 size_t request_size = 0, bool early_read_zlp = false);
151 void DevReadEP0Data(LibXR::RawData data, size_t packet_max_length);
152 void ArmStatusOutIfNeeded();
153
154 ErrorCode ProcessStandardRequest(bool in_isr, const SetupPacket*& setup,
155 RequestDirection direction, Recipient recipient);
156
157 ErrorCode RespondWithStatus(const SetupPacket* setup, Recipient recipient);
158 ErrorCode ClearFeature(const SetupPacket* setup, Recipient recipient);
159 ErrorCode ApplyFeature(const SetupPacket* setup, Recipient recipient);
160 ErrorCode SendDescriptor(bool in_isr, const SetupPacket* setup, Recipient recipient);
161 ErrorCode PrepareAddressChange(uint16_t address);
162 ErrorCode SwitchConfiguration(uint16_t value, bool in_isr);
163 ErrorCode SendConfiguration();
164
165 void StallControlEndpoint();
166 void ClearControlEndpointStall();
167 void ResetClassRequestState();
168
169 ErrorCode ProcessClassRequest(bool in_isr, const SetupPacket* setup,
170 RequestDirection direction, Recipient recipient);
171
172 ErrorCode ProcessVendorRequest(bool in_isr, const SetupPacket*& setup,
173 RequestDirection direction, Recipient recipient);
174
175 private:
178
179 struct
180 {
182 Endpoint* in0 = nullptr;
183 Endpoint* out0 = nullptr;
187 } endpoint_;
188
189 struct
190 {
191 bool inited = false;
192 Speed speed = Speed::FULL;
196 RawData read_remain{nullptr, 0};
197 uint8_t pending_addr = 0xFF;
198 uint8_t* out0_buffer = nullptr;
199 bool need_write_zlp = false;
201 false;
202 } state_;
203
204 struct
205 {
206 bool write = false;
207 bool read = false;
209 false;
212 uint8_t b_request = 0;
213 ConstRawData data{nullptr, 0};
214 } class_req_;
215};
216
217} // namespace LibXR::USB
通用回调包装,支持动态参数传递 / Generic callback wrapper supporting dynamic argument passing
Definition libxr_cb.hpp:142
常量原始数据封装类。 A class for encapsulating constant raw data.
原始数据封装类。 A class for encapsulating raw data.
USB 设备类接口基类 / USB device class interface base.
USB 组合管理器:class 列表、字符串、BOS、配置切换 USB composition manager: class list, strings, BOS,...
USB 设备协议栈核心:EP0 控制传输、描述符、配置、标准/类/厂商请求 USB device core: EP0 control transfer, descriptors,...
Definition dev_core.hpp:22
virtual void Deinit(bool in_isr)
反初始化 / Deinitialize
Definition dev_core.cpp:139
virtual void EnableRemoteWakeup()
启用远程唤醒 / Enable remote wakeup
Definition dev_core.hpp:114
Endpoint * out0
EP0 OUT 端点 / EP0 OUT endpoint.
Definition dev_core.hpp:183
bool need_write_zlp
是否需要发送 ZLP / Whether to send ZLP
Definition dev_core.hpp:199
Endpoint * in0
EP0 IN 端点 / EP0 IN endpoint.
Definition dev_core.hpp:182
ConstRawData data
数据阶段数据 / Data stage payload
Definition dev_core.hpp:213
LibXR::Callback< LibXR::ConstRawData & > ep0_in_cb
EP0 IN 回调 / EP0 IN callback.
Definition dev_core.hpp:184
virtual void Stop(bool in_isr)=0
停止设备(由子类实现)/ Stop device (implemented by derived class)
EndpointPool & pool
端点池引用 / Endpoint pool reference
Definition dev_core.hpp:181
Context
控制传输上下文 / Control transfer context
Definition dev_core.hpp:31
@ SETUP_BEFORE_STATUS
Setup handled, before STATUS IN ZLP is armed.
Definition dev_core.hpp:33
@ STATUS_IN_ARMED
STATUS IN ZLP armed, but not yet completed.
Definition dev_core.hpp:34
@ STATUS_IN_COMPLETE
IN status stage completed.
Definition dev_core.hpp:38
@ DATA_OUT
OUT data stage / OUT data stage.
Definition dev_core.hpp:35
@ STATUS_OUT
OUT status stage / OUT status stage.
Definition dev_core.hpp:36
@ DATA_IN
IN data stage / IN data stage.
Definition dev_core.hpp:37
@ ZLP
ZLP stage marker / ZLP stage marker.
Definition dev_core.hpp:39
@ UNKNOWN
未知 / Unknown
Definition dev_core.hpp:32
DeviceClass * class_ptr
当前处理类 / Current class handler
Definition dev_core.hpp:211
virtual void Init(bool in_isr)
初始化 / Initialize
Definition dev_core.cpp:122
RawData read_remain
OUT 剩余待接收 / Remaining OUT buffer.
Definition dev_core.hpp:196
bool read
是否存在 OUT 数据阶段 / Whether OUT data stage exists
Definition dev_core.hpp:207
DeviceDescriptor device_desc_
设备描述符 / Device descriptor
Definition dev_core.hpp:177
Speed GetSpeed() const
获取设备速度 / Get device speed
bool inited
是否已初始化 / Whether initialized
Definition dev_core.hpp:191
DeviceComposition composition_
USB 组合管理器 / USB composition manager.
Definition dev_core.hpp:176
virtual void Start(bool in_isr)=0
启动设备(由子类实现)/ Start device (implemented by derived class)
virtual void DisableRemoteWakeup()
禁用远程唤醒 / Disable remote wakeup
Definition dev_core.hpp:119
uint8_t pending_addr
待生效地址 / Pending address
Definition dev_core.hpp:197
DeviceCore(EndpointPool &ep_pool, USBSpec spec, Speed speed, DeviceDescriptor::PacketSize0 packet_size, uint16_t vid, uint16_t pid, uint16_t bcd, const std::initializer_list< const DescriptorStrings::LanguagePack * > &lang_list, const std::initializer_list< const std::initializer_list< ConfigDescriptorItem * > > &configs, ConstRawData uid={nullptr, 0})
构造函数 / Constructor
Definition dev_core.cpp:12
Speed speed
设备速度 / Device speed
Definition dev_core.hpp:192
uint8_t b_request
当前请求码 / Current request code
Definition dev_core.hpp:212
bool status_out_armed
STATUS OUT 已经预先挂起 / STATUS OUT already armed.
Definition dev_core.hpp:200
void OnSetupPacket(bool in_isr, const SetupPacket *setup)
处理 Setup 包 / Handle Setup packet
Definition dev_core.cpp:396
virtual bool IsRemoteWakeupEnabled() const
远程唤醒是否启用 / Whether remote wakeup is enabled
Definition dev_core.hpp:125
uint8_t * out0_buffer
EP0 OUT 缓冲区 / EP0 OUT buffer.
Definition dev_core.hpp:198
bool write
是否存在 IN 数据阶段 / Whether IN data stage exists
Definition dev_core.hpp:206
virtual ErrorCode SetAddress(uint8_t address, Context state)=0
设置设备地址(由子类实现) Set device address (implemented by derived class).
ConstRawData write_remain
IN 剩余待发送 / Remaining IN payload.
Definition dev_core.hpp:195
LibXR::Callback< LibXR::ConstRawData & > ep0_out_cb
EP0 OUT 回调 / EP0 OUT callback.
Definition dev_core.hpp:186
USB描述符基类 USB descriptor base class.
Definition desc_dev.hpp:40
PacketSize0
控制端点0最大包长度枚举 Packet size for endpoint 0 (bMaxPacketSize0)
Definition desc_dev.hpp:75
USB 端点基类 / USB Endpoint base class.
Definition ep.hpp:24
USB端点池类 / USB endpoint pool class.
Definition ep_pool.hpp:23
ErrorCode
定义错误码枚举
USB 标准请求 SETUP 包(固定8字节) Standard USB setup packet (8 bytes)
Definition core.hpp:57