VxWorks vxbus总线知识

https://blog.csdn.net/bingcheby/article/details/89554150
https://www.vxworks.net/bsp/107-organization-structure-of-vxbus-device-driver-in-vxworks
https://blog.csdn.net/u010383937/article/details/72123955

VxBus是风河公司新的设备驱动程序架构,在VxWorks6.2及以后版本被增加到VxWorks中的。
vxBus下,硬件称为device,软件叫做driver。如果一个device出现在硬件列表中,启动时需要到driver的队列中去找相应的driver,如果找到,二者结合成一个instance,否则在vxBusShow里可以看到一个orphan。

PLB,是VxBus架构中引入的一个新的概念,PLB一processor local bus,即处理器局部总线。PLB是VxBus架构中最重要的一个
概念,以前版本的设备驱动都是独立存在的,VxBus架构引入PLB之后,各个独立的设备驱动形成了一个链表,我们使用的大部分设备驱动都是直接或者间接的挂接在PLB上的。PLB实际上是一个虚拟的CPU总线。

vxbus结构设计了几个链表:

/*放置驱动的链表*/
struct vxbDevRegInfo * pDriverListHead = NULL;
/*放置注册的总线的链表*/
struct vxbBusTypeInfo * pBusListHead = NULL;
/*匹配好的设备和驱动称为instlist,没有找到驱动的设备链表,*/
struct vxbBusPresent * pBusHead = NULL;

当一个设备注册进来之后,就会从pDriverListHead中查找驱动,如果找到了就会放到pBusHead链表中的instList链表中,没有找到驱动就会放置到pBusHead->devList中;而当一个新的总线注册进来后就会放置到pBusListHead链表中。

文件位置

在开发驱动程序之前,了解驱动程序文件在VxWorks源码树中的位置是非常重要的,驱动程序文件主要分布在源码树中的3个不同位置。

installDir/vxworks-6.x/target/3rdparty 第三方提供的基于VxBus驱动模型的驱动,它们一般都做为插件安装到现有的VxWorks开发环境中
installDir/vxworks-6.x/target/src/hwif 风河官方提供的基于VxBus驱动模型的驱动程序,它们一般都作为标准产品的一部分,或者作为补丁来升级。
installDir/vxworks-6.x/target/src/drv 风河官方提供的基于传统模型的驱动程序,和VxBus不兼容

hwconf.c

如果需要增加一个设备,首先要修改的是hcfDeviceList,这是hwconf.c中的一个数组,这个数组中列有本系统中所有需要初始化的硬件设备。例如:

HCF_DEVICE hcfDeviceList[] = {
  #ifdef DRV_SIO_ns16550
  { “ns16550”, 0, VXB_BUSID_PLB, 0, ns1655x1Num, ns1655x1Resources },
  { “ns16550”, 1, VXB_BUSID_PLB, 0, ns1655x2Num, ns1655x2Resources },
  #endif

对于单核CPU,配置到这里就结束了。如果是多核,还需要修改一下sysDeviceFilter,这个函数决定一个设备在哪个核上初始化。

驱动.c

在这个结构中,包含了初始化阶段要调用的函数。

LOCAL struct drvBusFuncs lpc24xxFuncs =
    {
    lpc24xxInstInit,      /* devInstanceInit */
    lpc24xxInstInit2,     /* devInstanceInit2 */
    lpc24xxInstConnect    /* devConnect */
    };

这个结构提供了应用软件操作硬件的一些函数及方法(寄存器相关),描述驱动程序所支持的驱动方法的数据结构。
该结构中注册的函数是在驱动中公开的函数,可以让应用程序、中间件、VxWorks内核调用以访问设备。

LOCAL struct vxbDeviceMethod lpc24xxMethods[] =
   {
   DEVMETHOD (miiRead,          lpc24xxPhyRead),
   DEVMETHOD (miiWrite,         lpc24xxPhyWrite),
   DEVMETHOD (miiMediaUpdate,   lpc24xxLinkUpdate),
   DEVMETHOD (muxDevConnect,    lpc24xxMuxConnect),
   DEVMETHOD (vxbDrvUnlink,     lpc24xxInstUnlink),
   DEVMETHOD_END
   };

最后这个结构在void xxxDriverRegister(void)中被使用。Probe()是硬件探测函数,该函数在VxBus初始化过程中检测硬件的数量,当检测到硬件时,将设备与驱动结合,形成设备的一个实例,以便应用程序使用。

LOCAL struct vxbDevRegInfo lpc24xxDevRegistration =
    {
    NULL,                       /* pNext */
    VXB_DEVID_DEVICE,           /* devID */
    VXB_BUSID_PLB,              /* busID */
    VXBUS_VERSION_4,            /* vxbVersion */
    EMAC_NAME,                  /* drvName */
    &lpc24xxFuncs,              /* pDrvBusFuncs */
    NULL,                       /* pMethods */
    NULL,                       /* devProbe */
    lpc24xxParamDefaults        /* pParamDefaults */
    };

sysHwInit()的hardWareInterFaceInit()完成vxbus驱动初始化;
sysHwInit()其它函数完成非VxBus驱动的初始化。
sysHwInit()函数返回后,VxWorks内核被初始化。

采用VxBus驱动的一个主要优点是:设备的驱动程序可以被看成VxWorks 系统的一个组件,通过集成的Workbench开发环境来配置设备驱动。需要有以下文件:
· 一个驱动源文件.c,执行驱动运行逻辑,包括驱动的实现代码。
· 一个组件描述文件.cdf,允许集成驱动到VxWorks开发工具Workbench当中。
· 一个.dc文件,提供驱动注册函数原型。
· 一个.dr文件,提供一个调用注册函数的C语言代码段。
· 一个readme文件 ,提供版本信息。
· 一个makefile 文件,提供建立驱动的编译规则。

posted @ 2022-08-12 11:24  solonj  阅读(953)  评论(0编辑  收藏  举报