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
106 [[nodiscard]] bool IsInited() const { return state_.inited; }
107
108 protected:
117 virtual ErrorCode SetAddress(uint8_t address, Context state) = 0;
118
122 virtual void EnableRemoteWakeup() {}
123
127 virtual void DisableRemoteWakeup() {}
128
133 virtual bool IsRemoteWakeupEnabled() const { return false; }
134
139 [[nodiscard]] Speed GetSpeed() const;
140
141 private:
142 static void OnEP0OutCompleteStatic(bool in_isr, DeviceCore* self,
144 static void OnEP0InCompleteStatic(bool in_isr, DeviceCore* self,
146
147 static bool IsValidUSBCombination(USBSpec spec, Speed speed,
149
150 void OnEP0OutComplete(bool in_isr, LibXR::ConstRawData& data);
151 void OnEP0InComplete(bool in_isr, LibXR::ConstRawData& data);
152
153 void ReadZLP(Context context = Context::ZLP);
154 void WriteZLP(Context context = Context::ZLP);
155 void ResetControlTransferState();
156
157 void DevWriteEP0Data(LibXR::ConstRawData data, size_t packet_max_length,
158 size_t request_size = 0, bool early_read_zlp = false);
159 void DevReadEP0Data(LibXR::RawData data, size_t packet_max_length);
160 void ArmStatusOutIfNeeded();
161
162 ErrorCode ProcessStandardRequest(bool in_isr, const SetupPacket*& setup,
163 RequestDirection direction, Recipient recipient);
164
165 ErrorCode RespondWithStatus(const SetupPacket* setup, Recipient recipient);
166 ErrorCode ClearFeature(const SetupPacket* setup, Recipient recipient);
167 ErrorCode ApplyFeature(const SetupPacket* setup, Recipient recipient);
168 ErrorCode SendDescriptor(bool in_isr, const SetupPacket* setup, Recipient recipient);
169 ErrorCode PrepareAddressChange(uint16_t address);
170 ErrorCode SwitchConfiguration(uint16_t value, bool in_isr);
171 ErrorCode SendConfiguration();
172
173 void StallControlEndpoint();
174 void ClearControlEndpointStall();
175 void ResetClassRequestState();
176
177 ErrorCode ProcessClassRequest(bool in_isr, const SetupPacket* setup,
178 RequestDirection direction, Recipient recipient);
179
180 ErrorCode ProcessVendorRequest(bool in_isr, const SetupPacket*& setup,
181 RequestDirection direction, Recipient recipient);
182
183 private:
186
187 struct
188 {
190 Endpoint* in0 = nullptr;
191 Endpoint* out0 = nullptr;
195 } endpoint_;
196
197 struct
198 {
199 bool inited = false;
200 Speed speed = Speed::FULL;
204 RawData read_remain{nullptr, 0};
205 uint8_t pending_addr = 0xFF;
206 uint8_t* out0_buffer = nullptr;
207 bool need_write_zlp = false;
209 false;
210 } state_;
211
212 struct
213 {
214 bool write = false;
215 bool read = false;
217 false;
220 uint8_t b_request = 0;
221 ConstRawData data{nullptr, 0};
222 } class_req_;
223};
224
225} // namespace LibXR::USB
通用回调包装,支持动态参数传递 / Generic callback wrapper supporting dynamic argument passing
Definition libxr_cb.hpp:144
只读原始数据视图 / Immutable raw data view
可写原始数据视图 / Mutable raw data view
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:122
Endpoint * out0
EP0 OUT 端点 / EP0 OUT endpoint.
Definition dev_core.hpp:191
bool need_write_zlp
是否需要发送 ZLP / Whether to send ZLP
Definition dev_core.hpp:207
Endpoint * in0
EP0 IN 端点 / EP0 IN endpoint.
Definition dev_core.hpp:190
bool IsInited() const
查询设备核心是否已经完成初始化 / Query whether the device core is initialized
Definition dev_core.hpp:106
ConstRawData data
数据阶段数据 / Data stage payload
Definition dev_core.hpp:221
LibXR::Callback< LibXR::ConstRawData & > ep0_in_cb
EP0 IN 回调 / EP0 IN callback.
Definition dev_core.hpp:192
virtual void Stop(bool in_isr)=0
停止设备(由子类实现)/ Stop device (implemented by derived class)
EndpointPool & pool
端点池引用 / Endpoint pool reference
Definition dev_core.hpp:189
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:219
RawData read_remain
OUT 剩余待接收 / Remaining OUT buffer.
Definition dev_core.hpp:204
bool read
是否存在 OUT 数据阶段 / Whether OUT data stage exists
Definition dev_core.hpp:215
DeviceDescriptor device_desc_
设备描述符 / Device descriptor
Definition dev_core.hpp:185
Speed GetSpeed() const
获取设备速度 / Get device speed
bool inited
是否已初始化 / Whether initialized
Definition dev_core.hpp:199
DeviceComposition composition_
USB 组合管理器 / USB composition manager.
Definition dev_core.hpp:184
virtual void Start(bool in_isr)=0
启动设备(由子类实现)/ Start device (implemented by derived class)
virtual void DisableRemoteWakeup()
禁用远程唤醒 / Disable remote wakeup
Definition dev_core.hpp:127
uint8_t pending_addr
待生效地址 / Pending address
Definition dev_core.hpp:205
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:200
uint8_t b_request
当前请求码 / Current request code
Definition dev_core.hpp:220
bool status_out_armed
STATUS OUT 已经预先挂起 / STATUS OUT already armed.
Definition dev_core.hpp:208
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:133
uint8_t * out0_buffer
EP0 OUT 缓冲区 / EP0 OUT buffer.
Definition dev_core.hpp:206
bool write
是否存在 IN 数据阶段 / Whether IN data stage exists
Definition dev_core.hpp:214
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:203
LibXR::Callback< LibXR::ConstRawData & > ep0_out_cb
EP0 OUT 回调 / EP0 OUT callback.
Definition dev_core.hpp:194
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:58