在嵌入式系统开发中,平台无关性与硬件抽象化日益重要。VxWorks 7.0 引入设备树(Device Tree)机制,极大地提升了驱动可移植性和系统配置灵活性。本文将介绍如何基于设备树编写设备驱动,帮助开发者更高效地支持多种硬件平台。
一、什么是设备树? #
设备树(Device Tree, DT)是一种硬件描述语言,通过纯文本 .dts
文件描述目标硬件结构,如外设地址、中断、时钟频率、GPIO 映射等。VxWorks 使用经过编译的设备树二进制文件(.dtb
)在启动时动态解析,构建系统设备模型。
二、VxWorks 中设备树的角色 #
在 VxWorks 7.0 中,设备树主要承担如下职责:
- 描述外设信息:如 I2C/SPI/UART/GPIO 控制器、外部芯片、地址、中断等;
- 替代硬编码的硬件参数:避免 BSP 或驱动中出现固定地址或寄存器定义;
- 支持设备模型层(VxBus):通过
vxbFdtDevCreate()
和vxbDevRegister()
等 API,将 DT 节点与驱动匹配绑定。
三、驱动开发流程概览 #
下面以 GPIO 控制器及设备为例,说明如何基于设备树开发 VxWorks 驱动。
四、GPIO 控制器与设备开发示例 #
4.1 设备树节点编写 #
假设我们有一个内建 GPIO 控制器和一个连接的 LED 设备。.dts
文件配置如下:
gpio@ff0a0000 {
compatible = "xlnx,zynq-gpio-1.0";
reg = <0xff0a0000 0x1000>;
gpio-controller;
#gpio-cells = <2>;
interrupts = <0 45 4>;
interrupt-controller;
#interrupt-cells = <2>;
status = "okay";
};
led@0 {
compatible = "mycompany,gpio-led";
gpios = <&gpio 12 0>; // GPIO12, active high
label = "status-led";
};
4.2 驱动中匹配设备节点 #
LOCAL const VXB_FDT_DEV_MATCH_ENTRY gpioLedMatch[] = {
{
.compatible = "mycompany,gpio-led"
},
{ NULL }
};
LOCAL STATUS gpioLedProbe(VXB_DEV_HANDLE pDev)
{
if (vxbFdtDevMatch(pDev, gpioLedMatch) == NULL)
return ERROR;
return OK;
}
4.3 提取设备树属性 #
VXB_DEV_HANDLE pDev = ...;
VXB_FDT_DEV * pFdtDev = vxbFdtDevGet(pDev);
VXB_DEV_HANDLE gpioCtrl;
UINT32 pin, flags;
vxbFdtDevGetGpios(pDev, "gpios", 0, &gpioCtrl, &pin, &flags);
vxbGpioModeSet(gpioCtrl, pin, GPIO_DIR_OUTPUT);
vxbGpioWrite(gpioCtrl, pin, 1); // 点亮 LED
4.4 驱动注册 #
VXB_DRV_DEF gpioLedDrv = {
.name = "gpioLed",
.probe = gpioLedProbe,
.attach = gpioLedAttach,
.devMatch = gpioLedMatch,
};
VXB_DRV_DEF_INSTALL(gpioLedDrv)
五、调试与验证 #
- 使用
vxbFdtShow()
查看解析出的设备树信息; - 使用
devs
或i2cShow
、gpioShow
等命令确认驱动加载情况; - 驱动中添加日志,例如在
attach()
中打印pin
和label
。
六、总结与建议 #
基于设备树开发驱动程序,可以显著提升代码可维护性和可重用性。建议:
- 所有硬件信息统一放入
.dts
文件; - 使用标准
compatible
字符串匹配设备; - 善用 VxBus 提供的
vxbFdtDevGet*()
等接口解析设备树; - 尽量使用已有的 VxBus 控制器驱动(如 GPIO 控制器)复用基础功能。
VxWorks 7.0 的设备树机制,让驱动开发变得更模块化、平台无关。在 AI 边缘设备、工业控制、通信网关等应用中,结合设备树与 VxBus 架构将大大加快产品开发周期。