libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
dfu_def.hpp
1#pragma once
2
3#include <cstddef>
4#include <cstdint>
5
6#include "crc.hpp"
7#include "dev_core.hpp"
8#include "flash.hpp"
9#include "timebase.hpp"
10#include "webusb.hpp"
11#include "winusb_msos20.hpp"
12
13namespace LibXR::USB
14{
18enum class DFURequest : uint8_t
19{
20 DETACH = 0x00,
21 DNLOAD = 0x01,
22 UPLOAD = 0x02,
23 GETSTATUS = 0x03,
24 CLRSTATUS = 0x04,
25 GETSTATE = 0x05,
26 ABORT = 0x06,
27};
28
32enum class DFUState : uint8_t
33{
34 APP_IDLE = 0x00,
35 APP_DETACH = 0x01,
36 DFU_IDLE = 0x02,
37 DFU_DNLOAD_SYNC = 0x03,
38 DFU_DNBUSY = 0x04,
39 DFU_DNLOAD_IDLE = 0x05,
40 DFU_MANIFEST_SYNC = 0x06,
41 DFU_MANIFEST = 0x07,
42 DFU_MANIFEST_WAIT_RESET = 0x08,
43 DFU_UPLOAD_IDLE = 0x09,
44 DFU_ERROR = 0x0A,
45};
46
50enum class DFUStatusCode : uint8_t
51{
52 OK = 0x00,
53 ERR_TARGET = 0x01,
54 ERR_FILE = 0x02,
55 ERR_WRITE = 0x03,
56 ERR_ERASE = 0x04,
57 ERR_CHECK_ERASED = 0x05,
58 ERR_PROG = 0x06,
59 ERR_VERIFY = 0x07,
60 ERR_ADDRESS = 0x08,
61 ERR_NOTDONE = 0x09,
62 ERR_FIRMWARE = 0x0A,
63 ERR_VENDOR = 0x0B,
64 ERR_USBR = 0x0C,
65 ERR_POR = 0x0D,
66 ERR_UNKNOWN = 0x0E,
67 ERR_STALLEDPKT = 0x0F,
68};
69
74{
75 bool can_download = true;
76 bool can_upload = true;
77 bool manifestation_tolerant = true;
78 bool will_detach = false;
79 uint16_t detach_timeout_ms = 1000u;
80 uint16_t transfer_size = 1024u;
81};
82
87{
88 protected:
89 static constexpr const char* DEFAULT_WINUSB_DEVICE_INTERFACE_GUID =
90 "{4066E5F4-3B02-4B90-9475-12F770A7841B}";
91 static constexpr uint8_t DEFAULT_WINUSB_VENDOR_CODE = 0x20u;
92 enum class WinUsbMsOs20Scope : uint8_t
93 {
94 NONE = 0u,
95 DEVICE = 1u,
96 FUNCTION = 2u,
97 };
100 LibXR::USB::WinUsbMsOs20::GUID_MULTI_SZ_UTF16_BYTES>;
103 LibXR::USB::WinUsbMsOs20::GUID_MULTI_SZ_UTF16_BYTES>;
104
105 // Shared single-interface DFU state:
106 // - one interface string
107 // - optional WebUSB BOS capability
108 // - WinUSB BOS capability enabled by default for dedicated DFU bootloaders
109 // - current interface/alt-setting pair
111 const char* interface_string, const char* webusb_landing_page_url = nullptr,
112 uint8_t webusb_vendor_code = LibXR::USB::WebUsb::WEBUSB_VENDOR_CODE_DEFAULT,
113 const char* winusb_device_interface_guid = DEFAULT_WINUSB_DEVICE_INTERFACE_GUID,
114 uint8_t winusb_vendor_code = DEFAULT_WINUSB_VENDOR_CODE,
115 WinUsbMsOs20Scope winusb_scope = WinUsbMsOs20Scope::DEVICE)
116 : interface_string_(interface_string),
117 winusb_scope_(winusb_scope),
118 webusb_cap_(webusb_landing_page_url, webusb_vendor_code)
119 {
120 InitWinUsbDescriptors(ResolveWinUsbDeviceInterfaceGuid(winusb_device_interface_guid),
121 winusb_vendor_code);
122 }
123
124 const char* GetInterfaceString(size_t local_interface_index) const override
125 {
126 return (local_interface_index == 0u) ? interface_string_ : nullptr;
127 }
128
129 size_t GetBosCapabilityCount() override
130 {
131 return (HasWinUsbBosCapability() ? 1u : 0u) + (webusb_cap_.Enabled() ? 1u : 0u);
132 }
133
134 BosCapability* GetBosCapability(size_t index) override
135 {
136 if (HasWinUsbBosCapability())
137 {
138 if (index == 0u)
139 {
140 return &winusb_msos20_cap_;
141 }
142 return (index == 1u && webusb_cap_.Enabled()) ? &webusb_cap_ : nullptr;
143 }
144
145 return (index == 0u && webusb_cap_.Enabled()) ? &webusb_cap_ : nullptr;
146 }
147
148 uint8_t interface_num_ = 0u;
149 uint8_t current_alt_setting_ = 0u;
150 bool inited_ = false;
151
152 void UpdateWinUsbFunctionInterface(uint8_t interface_num,
153 uint8_t configuration_index = 0u)
154 {
155 function_winusb_msos20_.SetFirstInterface(interface_num);
156 function_winusb_msos20_.cfg.bConfigurationValue = configuration_index;
157 if (winusb_scope_ == WinUsbMsOs20Scope::FUNCTION)
158 {
159 winusb_msos20_cap_.SetDescriptorSet(GetWinUsbMsOs20DescriptorSet());
160 }
161 }
162
163 private:
164 bool HasWinUsbBosCapability() const { return winusb_scope_ != WinUsbMsOs20Scope::NONE; }
165
166 static const char* ResolveWinUsbDeviceInterfaceGuid(const char* guid)
167 {
168 return (guid != nullptr && guid[0] != '\0') ? guid
169 : DEFAULT_WINUSB_DEVICE_INTERFACE_GUID;
170 }
171
172 ConstRawData GetWinUsbMsOs20DescriptorSet() const
173 {
174 if (winusb_scope_ == WinUsbMsOs20Scope::FUNCTION)
175 {
176 return ConstRawData{reinterpret_cast<const uint8_t*>(&function_winusb_msos20_),
177 sizeof(function_winusb_msos20_)};
178 }
179 if (winusb_scope_ == WinUsbMsOs20Scope::DEVICE)
180 {
181 return ConstRawData{reinterpret_cast<const uint8_t*>(&device_winusb_msos20_),
182 sizeof(device_winusb_msos20_)};
183 }
184 return ConstRawData{nullptr, 0};
185 }
186
187 void InitWinUsbDescriptors(const char* guid, uint8_t vendor_code)
188 {
189 device_winusb_msos20_.Init(guid);
190 function_winusb_msos20_.Init(0u, 0u, guid);
191 winusb_msos20_cap_.SetVendorCode(vendor_code);
192 winusb_msos20_cap_.SetDescriptorSet(GetWinUsbMsOs20DescriptorSet());
193 }
194
195 const char* interface_string_ = nullptr;
196 WinUsbMsOs20Scope winusb_scope_ = WinUsbMsOs20Scope::DEVICE;
197 DeviceWinUsbMsOs20DescSet device_winusb_msos20_{};
198 FunctionWinUsbMsOs20DescSet function_winusb_msos20_{};
199
200 protected:
202 LibXR::ConstRawData{nullptr, 0}, DEFAULT_WINUSB_VENDOR_CODE};
204};
205
206} // namespace LibXR::USB
只读原始数据视图 / Immutable raw data view
BOS 能力接口 / BOS capability interface.
Definition bos.hpp:57
USB 设备类接口基类 / USB device class interface base.
DFU 单接口类公共基类 / Common base for single-interface DFU classes.
Definition dfu_def.hpp:87
const char * GetInterfaceString(size_t local_interface_index) const override
返回本类暴露的第 N 个接口字符串 Return the string for the Nth local interface exposed by this class.
Definition dfu_def.hpp:124
size_t GetBosCapabilityCount() override
返回本类提供的 BOS capability 数量 Return the number of BOS capabilities exposed by this class.
Definition dfu_def.hpp:129
BosCapability * GetBosCapability(size_t index) override
返回指定 BOS capability Return the BOS capability at the given index.
Definition dfu_def.hpp:134
WebUSB BOS 能力包装器 / WebUSB BOS capability wrapper.
Definition webusb.hpp:60
bool Enabled() const
当前是否启用 WebUSB / Whether WebUSB is currently enabled
Definition webusb.hpp:84
@ OK
操作成功 | Operation successful
DFU 功能能力集合 / DFU functional capability set.
Definition dfu_def.hpp:74