使用VxWorks 7 VxBus具体设备参数

使用具体设备参数给你的设备配置增加灵活性

几年前,我们给Renesas R-Car H3 SIP评估板开发了一个VxWorks 7的BSP,这包括给主要的SoC接口:串口,网络,MMC,I2C,GPIO以及PCI Express设计开发驱动。

我写了PCE Express控制器的驱动并插入了一张Intel i210的PCIe卡到R-Car H3评估板的PCIe插槽上测试了驱动。然后我将VxWorks 7下的Intel前兆以太网驱动加入到了内核镜像并成功找到了i210的设备。i210被挂接到网络协议栈并且作为这块开发板上的第二个网络接口。

这个BSP被我们位于Leamington的开发团队使用,也被全球多个客户的团队使用。有一天,我们收到了一个问题反馈,说一个PCIe的CAN控制器在目标系统启动后没有被初始化。经过一些调试后发现PCIe主控制和PCIe终端之间的连接没有被创建。

这个PCIe控制器驱动有一个硬编码的1毫秒的链接建立超时时间,但是这个CAN控制器卡的链接需要最多5毫秒来才可稳定建立。我们可以简单地增加超时时间到一个更大的数值,但是如果没有PCIe外设存在,这将会没有必要地增加启动时间。

方案是将链接超时时间作为一个具体设备的参数,此参数可以在默认的超时时间对于某一个特别的使用情况不够时为板子在设备树中进行设置。

驱动调整成使用具体设备的参数

第一步是更新驱动让链接激活超时时间变成驱动的参数,为了做到这个,我们必须创建一个参数表,表中包含了设备需要用到的默认值。

/* 
 * R-Car H3 PCIe controller driver parameter table 
 */  
LOCAL VXB_PARAMS rcarH3PcieParams[] = 
    { 
    { DLLACT_TIMEOUT_PARAM, VXB_PARAM_INT32, { (void *)DLLACT_TIMEOUT_US } }, 
    { NULL, VXB_PARAM_END_OF_LIST, { NULL } } 
    };

然后我们更新驱动定义通过使用VXB_DRVFLAG_PARAM标识表明那儿有一个参数表。

/* 
 * R-Car H3 PCIe controller VxBus driver definition 
 */ 
VXB_DRV vxbFdtRcarH3PcieDrv = 
    { 
    { NULL } ,                          /* list node */ 
    RCAR_H3_PCIE_DRV_NAME,              /* Name */ 
    "Renesas R-Car H3 PCIe driver",     /* Description */ 
    VXB_BUSID_FDT,                      /* Class */ 
    VXB_DRVFLAG_PARAM,                  /* Flags */ 
    0,                                  /* Reference count */ 
    rcarH3PcieMethodList,               /* Method table */ 
    rcarH3PcieParams                    /* parameter defaults */ 
    };

驱动初始化代码被更新来获取这个参数,如下所示:

/* 
 * Get the DLL activation timeout from the driver parameter table 
 */  
if (vxbParamGet (pDev, 
                 DLLACT_TIMEOUT_PARAM, 
                 VXB_PARAM_INT32, 
                 &param) == OK) 
    { 
    dllActTimeoutUs = (unsigned)param.int32Val; 
    } 
else 
    { 
    PCIEC_DBG (PCIEC_DBG_ERR, 
               "%s: pDev %p: Failed to get DLL timeout parameter " 
               "- using default\n", 
               __FUNCTION__, pDev); 
    }

驱动默认会从驱动参数表中拿参数值来使用,要么就在设备树中提供一个数值来覆盖这个默认值。

设备树具体设备参数覆盖

最后一步是加一个新的段到设备树里来更新这个参数,通过在选择的设备树里创建一个devparam段来完成。下面这段设备树的摘录来自VxWorks 7的文档。

选择节点的例子:

    chosen { 
        .... 
        devparam 
            { 
            @ 
                { 
                 = ; 
                ....
                }; 
             ....
             };

选择的节点包含针对任何设备的参数。deviceName和deviceUnit用来在覆盖默认参数值的时候匹配设备。

使用这个,我们更新了R-Car H3设备树,提供了一个更长的链接激活超时时间(5000 微妙):

chosen 
    { 
    /* U-Boot bootm command will update bootargs in standalone DTB */ 
    bootargs = "etherAvb(0,0) host:vxWorks h=192.168.0.2 e=192.168.0.20 u=target pw=vxTarget"; 

    devparam 
        { 
        renesas,rcar-h3-pcie@0 
            { 
            dllActTimeoutUs = ; 
            }; 
        }; 
    }; 
};

设备树的改动完成后,当R-Car评估板上的PCIe 插槽没有卡存在时候,我们可以看到下面的调试输出:

rcarH3PcieHwInit: pDev 0xffff80000011f980: PCIe DLL not ready after 5000us 
rcarH3PcieAttach: pDev 0xffff80000011f980: error exit

当这个改动完成后,使用PCIe CAN控制器的团队可以通过更新他们目标系统上的设备树来为他们的硬件配置设置一个合适的链接建立超时时间。

具体设备的参数是一种支持不同硬件配置的灵活方式,可以避免硬编码的值不适用于某些目标系统。

更多的信息可以在VxWorks 7 BSP和设备指南的VxBus驱动调试段中找到。