【GD32F527_EVAL】USB 驱动移植 和 USB CDC Device 接入PC实验
文章目录
- 本篇写给RT-Thread社区和GigaDevice原厂
- 入坑摘要 -
- 已有资料梳理
- GD32F5xx_usb_library/
- RT官方/社区已完成vs未完成
- USB驱动架构图
- 驱动移植标准流程
- 新增文件架构
- menuconfig中的菜单
- 测试成功:USB-FS 虚拟串口枚举
- Win11上,设备管理器,枚举成功。
- 设备的VID和PID与原厂一致
- 代码已上传到gitee
本篇写给RT-Thread社区和GigaDevice原厂
入坑摘要 -
1/ 查看硬件,优选从USB-FS开始,HS的硬件复制非常多;
2/ 记得配置48MHz的时钟,还有电源脚(PD13);
3/ 串口和USB-FS,硬件居然要跳线,调试起来很麻烦;
4/ 调试输出,rt_kprintf,比LOGI,好用;
5/ 驱动移植完整流程 + 调试;
已有资料梳理
GD32F5xx_usb_library/
├── driver/ # USB底层硬件驱动
│ ├── Include/
│ │ ├── drv_usb_core.h # USB核心驱动
│ │ ├── drv_usb_dev.h # USB Device驱动
│ │ ├── drv_usb_hw.h # USB硬件配置
│ │ ├── drv_usb_regs.h # USB寄存器定义
│ │ └── drv_usbd_int.h # USB Device中断
│ └── Source/
│ ├── drv_usb_core.c
│ ├── drv_usb_dev.c
│ └── drv_usbd_int.c
│
├── device/ # USB Device功能层
│ ├── core/ # Device核心
│ │ ├── Include/
│ │ │ ├── usbd_core.h
│ │ │ ├── usbd_enum.h # 枚举处理
│ │ │ └── usbd_transc.h # 传输处理
│ │ └── Source/
│ │ ├── usbd_core.c
│ │ ├── usbd_enum.c
│ │ └── usbd_transc.c
│ │
│ └── class/ # Device类驱动
│ ├── cdc/ # 虚拟串口
│ ├── msc/ # 大容量存储
│ ├── hid/ # 人机接口
│ ├── audio/ # 音频
│ ├── dfu/ # 固件升级
│ ├── iap/ # 在线编程
│ └── printer/ # 打印机
│
└── ustd/ # USB标准定义
├── common/usb_ch9_std.h # USB规范定义
└── class/ # 类标准定义
位置 -
./gd32527I-eval/packages/gd32-arm-series-latest/GD32F5xx/、
备注 -
- 这是GD官方固件库
- 作用:提供底层硬件访问的HAL层
- 包含:标准外设库和USB库
- 特点:直接操作寄存器,不依赖操作系统
RT官方/社区已完成vs未完成
已完成移植的驱动:
- drv_adc - ADC驱动
- drv_can - CAN驱动
- drv_dma - DMA驱动
- drv_gpio - GPIO驱动
- drv_hard_i2c - 硬件I2C驱动
- drv_hwtimer - 硬件定时器驱动
- drv_pwm - PWM驱动(基于TIMER)
- drv_rtc - RTC驱动
- drv_sdio - SDIO驱动
- drv_sdram - SDRAM驱动(基于EXMC)
- drv_spi - SPI驱动
- drv_spi_flash - SPI Flash驱动
- drv_usart - USART驱动(含v2版本)
- drv_wdt - 看门狗驱动(FWDGT)
尚未移植到RT-Thread的驱动:
- CAU - 加密加速单元(AES/DES/TDES)
- CRC - 循环冗余校验
- CTC - 时钟调整控制器
- DAC - 数模转换器
- DBG - 调试接口
- DCI - 数字摄像头接口
- ENET - 以太网控制器
- EXTI - 外部中断(可能集成在GPIO中)
- FMC - Flash存储器控制器
- HAU - 哈希加速单元(SHA/MD5)
- IPA - 图像像素加速器
- IREF - 内部参考电压
- MISC - 杂项功能
- PKCAU - 公钥加密加速单元
- PMU - 电源管理
- RCU - 复位和时钟单元(框架层可能已包含)
- SAI - 串行音频接口
- SYSCFG - 系统配置
- TLI - TFT-LCD接口
- TRNG - 真随机数生成器
- WWDGT - 窗口看门狗
位置 -
./libraries/gd32_drivers/
备注 -
- 这是RT-Thread的驱动适配层,
- 作用:将GD芯片的硬件功能适配到RT-Thread的设备框架,
- 提供统一的RT-Thread API接口,如 rt_device_t、rt_spi_bus、rt_serial
- 包含:drv_xxx.c/h文件,它们实现了RT-Thread的设备ops接口
- 特点:需要实现RT-Thread的设备注册、初始化、读写等标准接口
- 通过
rt_hw_xxx_init()
注册到RT-Thread系统
USB驱动架构图
┌─────────────────────────────────────────────────────────┐
│ 应用层 (Application) │
│ usb_cdc_test.c / 用户USB应用 │
└───────────────────┬─────────────────────────────────────┘│
┌───────────────────┴─────────────────────────────────────┐
│ RT-Thread设备驱动框架 (Device Framework) │
│ rt_device / rt_usb_device │
└───────────────────┬─────────────────────────────────────┘│
┌───────────────────┴─────────────────────────────────────┐
│ RT-Thread USB适配层 (libraries/gd32_drivers/) │
│ drv_usbd.c - USB Device适配驱动 │
│ ? USB硬件初始化 │
│ ? GPIO/时钟配置 │
│ ? 中断处理 │
│ ? RT-Thread设备注册 │
└───────────────────┬─────────────────────────────────────┘│ 调用
┌───────────────────┴─────────────────────────────────────┐
│ GD32 USB库 (packages/.../GD32F5xx_usb_library/) │
│ ┌─────────────────────────────────────────────────┐ │
│ │ device/class/ - CDC/MSC/HID类驱动 │ │
│ │ device/core/ - USB Device核心 │ │
│ │ driver/ - USB底层硬件驱动 │ │
│ │ ustd/ - USB标准定义 │ │
│ └─────────────────────────────────────────────────┘ │
└───────────────────┬─────────────────────────────────────┘│ 操作
┌───────────────────┴─────────────────────────────────────┐
│ GD32F527硬件寄存器 │
│ USBFS / USBHS 外设 │
└─────────────────────────────────────────────────────────┘
驱动移植标准流程
0/ 工具链
在ConEmu中,
- 更新软件包 - pkgs --update
- 生成MDK5工程 - scons --target=mdk5
在Keil中,调试器选举openocd, - Rebuild All
- Download
1/ 确认芯片原厂官方bsp存在,
./gd32527I-eval/packages/gd32-arm-series-latest/GD32F5xx/usb_library/
├── driver/ # USB底层驱动(已存在)
├── device/ # USB Device功能(已存在)
├── host/ # USB Host功能(已存在)
└── ustd/ # USB标准定义(已存在)
2/ 确认rt框架层驱动不存在,编写 -
usbd.h/c usbd_conf.h (USB通用);
usbd.h/c usbd_conf.h (USB Device通用);
3/ 添加编写的,构建文件
.\libraries\gd32_drivers\SConscript# add usb device drivers.if GetDepend('BSP_USING_USBD'):src += ['drv_usbd.c']
4/ 添加,对应构建包中,原厂package中,相关的文件
.\gd32527I-eval\packages\gd32-arm-series-latest\GD32F5xx\SConscript
5/ 添加,对应,menuconfig的,配置
.\gd32527I-eval\board\Kconfig
6/ 编写测试文件,
.\gd32527I-eval\applications\usb_cdc_test.c
7/ 在menuconfig中配置,更新配置并重新生成工程,编译,下载,运行测试。
新增文件架构
gd32527I-eval/
├── board/
│ ├── usb_conf.h ? 新建
│ ├── usbd_conf.h ? 新建
│ └── SConscript ? 修改
├── applications/
│ └── usb_cdc_test.c ? 新建
└── libraries/gd32_drivers/
├── drv_usbd.h ? 新建
├── drv_usbd.c ? 新建
└── SConscript ? 修改
packages/gd32-arm-series-latest/GD32F5xx/
└── SConscript ? 已修改
menuconfig中的菜单
Hardware Drivers Config --->On-chip Peripheral Drivers --->[*] Enable USB Device --->USB Device Type (CDC (Virtual COM Port)) --->(X) CDC (Virtual COM Port)( ) MSC (Mass Storage)( ) HID (Keyboard/Mouse)(0) USB Speed (0:FS, 1:HS)
8/ 测试,debug;
测试成功:USB-FS 虚拟串口枚举
Win11上,设备管理器,枚举成功。
设备的VID和PID与原厂一致
串口Log -
代码已上传到gitee
https://gitee.com/jomoly/gd32f5_usbd_test
感谢社区,看都看到这里了,小伙伴给三连一下呗!!