TinyUSB 使用记录
TinyUSB 仓库目录结构如下:
1 | . |
(一). 下载编译 TinyUSB 原始仓库工程
1. 下载源码
TinyUSB 仓库不仅包含了 USB 协议栈源码,还包含了很多子仓库。所以我们下载 TinyUSB 源码的时候需要加 --recursive
参数,递归下载子仓库。
git clone --recursive https://github.com/hathach/tinyusb.git
2. 安装开发环境
安装通用的 arm gcc 工具链。
sudo apt install gcc-arm-none-eabi
3. 编译
本次编译以 stm32f103bluepill 开发板 csc_msc 为例,输入命令如下:
make -C examples/device/cdc_msc BOARD=stm32f103bluepill all V=1
[^BOARD=stm32f103bluepill]: 表示要编译的目标开发板子。板子名称可以看 hw/bsp
目录。
(二). 移植 TinyUSB 协议栈到自己的工程上
在之前 编译 章节里,我有提到 V=1
用于打印详细的编译参数。
得到的编译参数如下:
1 | CFLAGS -flto -mthumb -mabi=aapcs -mcpu=cortex-m3 -mfloat-abi=soft -nostdlib -nostartfiles -DSTM32F103xB -DCFG_TUSB_MCU=OPT_MCU_STM32F1 -ggdb -fdata-sections -ffunction-sections -fsingle-precision-constant -fno-strict-aliasing -Wdouble-promotion -Wstrict-prototypes -Wstrict-overflow -Wall -Wextra -Werror -Wfatal-errors -Werror-implicit-function-declaration -Wfloat-equal -Wundef -Wshadow -Wwrite-strings -Wsign-compare -Wmissing-format-attribute -Wunreachable-code -Wcast-align -Wcast-function-type -Os -I/home/balance/Desktop/workspace/usb_tuya/tinyusb/lib/CMSIS_5/CMSIS/Core/Include -I/home/balance/Desktop/workspace/usb_tuya/tinyusb/hw/mcu/st/cmsis_device_f1/Include -I/home/balance/Desktop/workspace/usb_tuya/tinyusb/hw/mcu/st/stm32f1xx_hal_driver/Inc -I/home/balance/Desktop/workspace/usb_tuya/tinyusb/hw/bsp/stm32f103bluepill -I/home/balance/Desktop/workspace/usb_tuya/tinyusb/ -Isrc -I/home/balance/Desktop/workspace/usb_tuya/tinyusb/hw -I/home/balance/Desktop/workspace/usb_tuya/tinyusb/src |
1. 头文件路径
通过分析编译参数,可以发现,在 tinyusb/src
TinyUSB 协议栈源码路径下,只有一个头文件路径,那就是自身 tinyusb/src
。之所以只声明了一个路径,是因为 TinyUSB 协议栈的 .c 文件的头文件包含都是相对路径。
综上所述头文件路径只有一个: tinyusb/src
2. 宏定义声明
宏定义的声明有两个地方需要注意,一个是有些宏定义在编译参数里,有些宏定义则在 tusb_config.h
里进行配置。
我们需要对每一个宏定义进行逐一确认,是否打开。这里我只说明下编译参数里的宏定义:
以编译 stm32f103bluepill 开发板例程为例:
STM32F103xB
用于 hw/bsp
的编译。这个宏是与协议栈本身是无关的。
CFG_TUSB_MCU=OPT_MCU_STM32F1
用于 TinyUSB 协议栈已经移植好的 usb 驱动文件tinyusb\src\portable
目录下的文件。如果底层驱动自己写的话,那么也可以不用定义。
tusb_config.h
文件里的宏定义包含了 TinyUSB 协议栈 的一些主要配置信息:如使用了什么 RTOS ,usb 设备类型, buff 大小。。。等。
3. 协议栈 C 文件的添加
由于 TinyUSB 协议栈做了详尽的宏定义条件编译,所以我们只需要一股脑儿的将 tinyusb/src
目录下所有的 .c 文件添加进工程即可。除了 tinyusb\src\portable
!!!
4. 底层 USB 驱动的适配
TinyUSB 在 tinyusb\src\portable\template\dcd_template.c
目录下提供了一份参考实现,里面的函数都是桩函数。我们只需要将这份文件添加进工程即可。在编译完成通过后,然后再去一一实现这个文件里的桩函数。
5. 上层应用 demo 测试
以 cdc_msc 为例。可参考 tinyusb/examples/device/cdc_msc/src/main.c
的例子。主要关注 tusb_init();
tud_task();
cdc_task();
的使用。