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。
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 文件,提供建立驱动的编译规则。
标签:驱动程序,VxWorks,函数,总线,VxBus,链表,驱动,vxbus 来源: https://www.cnblogs.com/solo666/p/16578791.html