Skip to content

Commit 7c5bdd2

Browse files
committed
docs(xrusb): add STM32/CH32 platform guides; enable Mermaid
1 parent 7c42419 commit 7c5bdd2

File tree

20 files changed

+16220
-7589
lines changed

20 files changed

+16220
-7589
lines changed

docs/basic_coding/core/core-rw.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -185,10 +185,10 @@ public:
185185
};
186186
```
187187
188-
- **Stream(WritePort*, WriteOperation)**:构造时尝试锁定,锁定失败则回退为普通写入模式。
189-
- **~Stream()**:析构自动提交所有数据、释放锁。
190-
- **operator<<**:链式添加要写入的数据。
191-
- **Commit()**:立即将当前追加的数据全部写入队列并(如需要)释放锁,可用于分段 flush。
188+
- **`Stream(WritePort*, WriteOperation)`**:构造时尝试锁定,锁定失败则回退为普通写入模式。
189+
- **`~Stream()`**:析构自动提交所有数据、释放锁。
190+
- **`operator<<`**:链式添加要写入的数据。
191+
- **`Commit()`**:立即将当前追加的数据全部写入队列并(如需要)释放锁,可用于分段 flush。
192192
193193
---
194194

docs/concept.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ sidebar_position: 2
88

99
## `无锁数据结构与 ISR 驱动的数据流`
1010

11-
在 LibXR 中,所有 I/O 均建立在无锁队列与环形缓冲之上,运行期不依赖互斥锁或关中断的临界区,保证传输路径的确定性与时延可控。设备事件完全由硬件中断驱动,中断仅承担双缓冲切换与状态机切换等任务,不涉入额外逻辑,从而使数据流动严格受硬件节奏控制,不依赖操作系统调度。由此,LibXR 的 I/O 成为一条由中断推动的无锁流水线,具备轻量、实时的特性。
11+
所有 I/O 均应建立在无锁队列与环形缓冲之上,运行期不依赖互斥锁或关中断的临界区,保证传输路径的确定性与时延可控。设备事件完全由硬件中断驱动,中断仅承担双缓冲切换与状态机切换等任务,不涉入额外逻辑,从而使数据流动严格受硬件节奏控制,不依赖操作系统调度。由此,LibXR 的 I/O 成为一条由中断推动的无锁流水线,具备轻量、实时的特性。
1212

1313
## `嵌入式系统中,运行时的内存分配是设计缺陷`
1414

docs/env_setup/ch32.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ sidebar_position: 2
88

99
CH32的RISC-V工具链极其混乱,推荐使用的有如下两种:
1010

11-
* [官方MRS自带的riscv-wch-elf](http://www.mounriver.com/download): 支持WCH的rv32imafcxw拓展指令集,但是对C++标准实现有残缺,无法使用Eigen等C++库
11+
* ~~[官方MRS自带的riscv-wch-elf](http://www.mounriver.com/download): 支持WCH的rv32imafcxw拓展指令集,但是对C++标准实现有残缺,无法使用Eigen等C++库~~
1212
* [上游riscv32-unknown-elf](https://github.com/riscv-collab/riscv-gnu-toolchain):不支持WCH的拓展指令集,但是对C++标准实现完整,需要自行编译。Windows下需要使用MSYS2进行编译,过程较为繁琐。
1313

1414
快速编译可以使用本项目提供的Docker镜像。

docs/env_setup/stm32.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ export CLANG_GCC_CMSIS_COMPILER=/opt/st-arm-clang
6969

7070
编译时还要指定`-DCMAKE_TOOLCHAIN_FILE="cmake/gcc-arm-none-eabi.cmake"`或者`-DCMAKE_TOOLCHAIN_FILE="cmake/starm-clang.cmake"`来选择工具链。
7171

72-
### 旧版CubeMX工程(<15.0)迁移到新版本编译问题
72+
### `旧版CubeMX工程(<15.0)迁移到新版本编译问题`
7373

7474
如果提示链接不到库`ob`,则在工程根目录的`CMakeLists.txt`中添加:
7575

docs/intro.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,14 @@ sidebar_position: 1
88

99
本文档会分块介绍LibXR, CodeGenerator和XRobot的环境配置、基础使用和进阶用法。有任何问题欢迎在对应仓库提交issue或者加入QQ群交流。
1010

11+
## 引导
12+
13+
* [LibXR](../docs/basic_coding): 跨平台的C++兼容层,包含外设驱动、数据结构、通信中间件、操作系统封装与数学工具等
14+
15+
* [XRUSB](../docs/xrusb): LibXR内置的USB协议栈
16+
17+
* [CodeGenerator](../docs/code_gen): 自动生成外设的C++初始化代码、CMake等内容
18+
19+
* [XRobot](../docs/proj_man): 软件包、软件源和依赖管理,模块参数管理与实例化,函数入口生成
20+
1121
![XRobot Logo](/img/XRobot.png)

docs/xrusb/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ sidebar_position: 8
66

77
# XRUSB
88

9-
TODO:
9+
XRUSB由不同平台的USB设备与端点驱动,结合统一的上层class抽象组成。

docs/xrusb/plat_ep_dev/README.md

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
---
2+
id: xrusb-plat-dev
3+
title: 平台相关实现
4+
sidebar_position: 1
5+
---
6+
7+
# 平台相关实现
8+
9+
本节介绍XRUSB在不同平台的实现原理与构造方式。对于使用不同的class,只需要在构造的最后传入指针即可。
10+
11+
例如:
12+
13+
```cpp
14+
/* USB Classes */
15+
LibXR::USB::CDCUart cdc_uart;
16+
LibXR::USB::HIDKeyboard hid_keyboard;
17+
18+
static constexpr auto LANG_PACK =
19+
LibXR::USB::DescriptorStrings::MakeLanguagePack(
20+
/* Language Code */
21+
LibXR::USB::DescriptorStrings::Language::EN_US,
22+
/* Manufacturer */
23+
"XRobot",
24+
/* Product */
25+
"XRUSB USB CDC Demo",
26+
/* Serial Number */
27+
"123456789");
28+
29+
30+
XXXUSBDevice usb(
31+
/* USB Hardware and Endpoints config */
32+
...,
33+
/* EP0 Packet Size */
34+
USB::DeviceDescriptor::PacketSize0::SIZE_8,
35+
/* Vendor ID */
36+
0x483,
37+
/* Product ID */
38+
0x5740,
39+
/* BcdDevice */
40+
0xF407,
41+
/* Language Pack */
42+
LANG_PACK,
43+
/* Classes */
44+
{{&cdc_uart, &hid_keyboard}});
45+
```
46+
47+

docs/xrusb/plat_ep_dev/ch32_usb.md

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
---
2+
id: xrusb-plat-dev-ch32
3+
title: CH32 USB 实现
4+
sidebar_position: 2
5+
---
6+
7+
# CH32 USB 实现
8+
9+
CH32一共有三种USB设备,如下所示。
10+
11+
| 名称 | 角色 | 端点是否为双向 | 双缓冲 | DMA支持 |
12+
| --------------------- | --------- | -------------------- | ------------- | ------- |
13+
| USB_DEVICE (尚未支持) | 从机 | 硬件双缓冲不支持双向 | 软件/硬件实现 | 不支持 |
14+
| USBHS | 主机/从机 | 硬件双缓冲不支持双向 | 硬件双缓冲 | 支持 |
15+
| USBFS | 主机/从机 | 双向 | 硬件双缓冲 | 支持 |
16+
17+
## USBFS
18+
19+
CH32 USBFS只支持这样声明端点,建议非EP0端点的缓冲区大小为128字节:
20+
21+
1. `{{ep0_buffer}, ...}`: 直接传入缓冲区即可,除了EP0都会被分割为IN/OUT缓冲区,端点号自动递增
22+
23+
```cpp
24+
LibXR::CH32USBDeviceFS usb_dev(
25+
/* EP */
26+
{
27+
{ep0_buffer},
28+
{ep1_buffer},
29+
{ep2_buffer},
30+
},
31+
/* packet size */
32+
LibXR::USB::DeviceDescriptor::PacketSize0::SIZE_64,
33+
/* vid pid bcd */
34+
0x1209, 0x0001, 0x0100,
35+
/* language */
36+
{&LANG_PACK_EN_US},
37+
/* config */
38+
{{&cdc1}});
39+
```
40+
41+
## USBHS
42+
43+
CH32 USBHS支持三种端点声明方式,非EP0端点的缓冲区大小推荐为1024字节,端点号自动递增:
44+
45+
1. `{ep0_buffer_hs}`: 直接传入EP0端点的缓冲区
46+
1. `{ep1_buffer_tx_hs, true}`:传入缓冲区并开启双缓冲
47+
- ep1_buffer_tx_hs: EP1 端点的缓冲区
48+
- true: 是否配置为IN端点
49+
1. `{ep2_buffer_rx_hs, ep2_buffer_tx_hs}`:传入双向端点的缓冲区,不开启双缓冲
50+
51+
```cpp
52+
LibXR::CH32USBDeviceHS usb_dev_hs(
53+
/* EP */
54+
{
55+
{ep0_buf_hs}, // EP0
56+
{ep1_in_buf_hs, true}, // EP1 IN(单向,双缓冲)
57+
{ep2_out_buf_hs, false}, // EP2 OUT(单向,双缓冲)
58+
{ep3_out_buf_hs, ep3_in_buf_hs} // EP3 双向(不启双缓冲)
59+
},
60+
/* vid pid bcd */
61+
0x1209, 0x0001, 0x0100,
62+
/* language */
63+
{&LANG_PACK_EN_US},
64+
/* config */
65+
{{&cdc2}});
66+
```
67+
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
---
2+
id: xrusb-plat-dev-stm32
3+
title: STM32 USB 实现
4+
sidebar_position: 1
5+
---
6+
7+
# STM32 USB 实现
8+
9+
STM32一共有四种USB设备,如下所示。可以参考代码生成工具自动生成的CDC代码,了解USB设备的端点配置。
10+
11+
| 名称 | 角色 | 端点是否为双向 | 双缓冲 | DMA支持 |
12+
| ------------- | --------- | -------------------- | ------------- | ------- |
13+
| USB_DEVICE_FS | 从机 | 硬件双缓冲不支持双向 | 软件/硬件实现 | 不支持 |
14+
| USB_DRV_FS | 主机/从机 | 硬件双缓冲不支持双向 | 软件/硬件实现 | 不支持 |
15+
| USB_OTG_FS | 主机/从机 | 双向 | 支持 | 不支持 |
16+
| USB_OTG_HS | 主机/从机 | 双向 | 支持 | 支持 |
17+
18+
## USB_DEVICE_FS/USB_DRV_FS
19+
20+
支持两种端点的声明方式,缓冲区端点号自动递增:
21+
22+
1. `{usb_fs_ep0_in_buf, usb_fs_ep0_out_buf, 8, 8}`:声明一个双向端点,无法使用硬件双缓冲
23+
- usb_fs_ep0_in_buf: EP0 IN软件缓冲区数组
24+
- usb_fs_ep0_out_buf: EP0 OUT软件缓冲区大小
25+
- 8: EP0 IN硬件RAM大小
26+
- 8: EP0 OUT硬件RAM大小
27+
2. `{usb_fs_ep2_in_buf, 16, true}`:声明一个单向端点,使用硬件双缓冲
28+
- usb_fs_ep2_in_buf: EP2 IN软件缓冲区数组
29+
- 16: EP2 IN硬件RAM大小
30+
31+
为了确保传输速度,对于bulk端点,硬件RAM大小应当不小于64,软件缓冲区可以远大于64,大小与传输速度成正比。
32+
33+
```cpp
34+
STM32USBDeviceDevFs usb_fs(
35+
/* USB Handler */
36+
&hpcd_USB_FS,
37+
/* Endpoints */
38+
{
39+
{usb_fs_ep0_in_buf, usb_fs_ep0_out_buf, 8, 8},
40+
{usb_fs_ep1_in_buf, usb_fs_ep1_out_buf, 128, 128},
41+
{usb_fs_ep2_in_buf, 16, true}
42+
},
43+
USB::DeviceDescriptor::PacketSize0::SIZE_8,
44+
0x483, 0x5740, 0xF407,
45+
{&USB_FS_LANG_PACK},
46+
{{&usb_fs_cdc}}
47+
);
48+
```
49+
50+
## USB_OTG_FS/USB_OTG_HS
51+
52+
STM32USBDeviceOtgHS和STM32USBDeviceOtgFS同样支持两种端点声明方式,IN/OUT端点缓冲区端点号各自自动递增:
53+
54+
1. `{{usb_otg_fs_ep0_in_buf, 8},...}`:in端点必须声明缓冲区与Fifo大小
55+
2. `{usb_otg_fs_ep0_out_buf, ...}`:out端点只需要声明缓冲区
56+
57+
所有out端点共用一个rx fifo,应该分配较大的空间。为了保证速度,IN端点Fifo的大小不应小于包大小,软件缓冲区大小与传输速度成正比。
58+
59+
```cpp
60+
// STM32USBDeviceOtgHS usb_hs(
61+
STM32USBDeviceOtgFS usb_fs(
62+
/* USB Handler */
63+
&hpcd_USB_OTG_FS,
64+
/* RX Fifo Size */
65+
256,
66+
/* Out Endpoints */
67+
{usb_otg_fs_ep0_out_buf, usb_otg_fs_ep1_out_buf},
68+
/* In Endpoints */
69+
{{usb_otg_fs_ep0_in_buf, 8}, {usb_otg_fs_ep1_in_buf, 128}, {usb_otg_fs_ep2_in_buf, 16}},
70+
USB::DeviceDescriptor::PacketSize0::SIZE_8,
71+
0x483, 0x5740, 0xF407,
72+
{&USB_OTG_FS_LANG_PACK},
73+
{{&usb_otg_fs_cdc}}
74+
);
75+
usb_fs.Init();
76+
usb_fs.Start();
77+
```
78+
79+
## 运行
80+
81+
添加以下语句即可。
82+
83+
```cpp
84+
usb_fs.Init();
85+
usb_fs.Start();
86+
```
87+
88+

docusaurus.config.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
const { themes: prismThemes } = require('prism-react-renderer');
2+
13
module.exports = {
24
title: 'XRobot Docs',
35
tagline: 'Want to be the best embedded framework',
@@ -20,6 +22,10 @@ module.exports = {
2022
},
2123
],
2224

25+
markdown: {
26+
mermaid: true,
27+
},
28+
2329
i18n: {
2430
defaultLocale: 'zh',
2531
locales: ['en', 'zh'],
@@ -42,6 +48,8 @@ module.exports = {
4248
],
4349
],
4450

51+
themes: ['@docusaurus/theme-mermaid'],
52+
4553
presets: [
4654
[
4755
'classic',
@@ -153,9 +161,13 @@ module.exports = {
153161
copyright: `Copyright © ${new Date().getFullYear()} XRobot`,
154162
},
155163

164+
mermaid: {
165+
theme: { light: 'neutral', dark: 'forest' },
166+
},
167+
156168
prism: {
157-
theme: require('prism-react-renderer/themes/github'),
158-
darkTheme: require('prism-react-renderer/themes/dracula'),
169+
theme: prismThemes.github,
170+
darkTheme: prismThemes.dracula,
159171
additionalLanguages: ['cmake', 'bash'],
160172
},
161173
},

0 commit comments

Comments
 (0)