跳过正文

VxWorks 7.0 基于设备树的驱动程序编写方法

VxWorks 设备树 驱动开发 BSP RTOS GPIO
目录

在嵌入式系统开发中,平台无关性硬件抽象化日益重要。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() 查看解析出的设备树信息;
  • 使用 devsi2cShowgpioShow 等命令确认驱动加载情况;
  • 驱动中添加日志,例如在 attach() 中打印 pinlabel

六、总结与建议
#

基于设备树开发驱动程序,可以显著提升代码可维护性和可重用性。建议:

  • 所有硬件信息统一放入 .dts 文件;
  • 使用标准 compatible 字符串匹配设备;
  • 善用 VxBus 提供的 vxbFdtDevGet*() 等接口解析设备树;
  • 尽量使用已有的 VxBus 控制器驱动(如 GPIO 控制器)复用基础功能。

VxWorks 7.0 的设备树机制,让驱动开发变得更模块化、平台无关。在 AI 边缘设备、工业控制、通信网关等应用中,结合设备树与 VxBus 架构将大大加快产品开发周期。

相关文章

VxWorks: 用于嵌入式系统的高性能实时操作系统
VxWorks RTOS
VxWorks发展历史
VxWorks RTOS
VxWorks Refining the Role of RTOS
VxWorks RTOS