VxBus设备驱动模型
VxBus是指在VxWorks中用于支持设备驱动的特有的架构,这种架构包含对minimal BSP的支持。
VxBus简介
它包括以下功能:
- 允许设备驱动匹配对应设备;
- 提供驱动程序访问硬件的机制;
- 软件其他部分访问设备功能;
- 在VxWorks系统中,实现设备驱动的模块化。
VxBus在总线控制器驱动程序服务的支持下,能在总线上发现设备,并执行一些初始化工作,使驱动与硬件设备之间正常的通讯。
LOCAL struct vxbPlbRegister windmlGraphicsPlbDevRegistration =
{
{
NULL, /* register next driver */
VXB_DEVID_BUSCTRL, /* bus controller */
VXB_BUSID_PLB, /* bus id - PCI Bus Type */
VXB_VER_4_0_0, /* vxBus version Id */
"graphics", /* drv name */
&windmlvxbFuncs, /* pDrvBusFuncs */
NULL, /* pMethods */
windmlGraphicsProbe, /* probe routine */
NULL /* vxbParams */
}
};
LOCAL struct vxbPciRegister windmlGraphicsPciDevRegistration =
{
/* b */
{
(DRIVER_REGISTRATION *)(&windmlGraphicsPlbDevRegistration), /* pNext */
VXB_DEVID_DEVICE, /* devID */
VXB_BUSID_PCI, /* busID = PCI */
VXB_VER_4_0_0, /* vxbVersion */
"graphics", /* drvName */
&windmlvxbFuncs, /* pDrvBusFuncs */
NULL, /* pMethods */
windmlGraphicsProbe, /* devProbe */
NULL,
},
NELEMENTS(windmlPciDevIDList),
&windmlPciDevIDList[0],
};
这个结构就是用于描述一个需要注册的驱动。驱动的初始化的入口函数都需要放在windmlvxbFuncs中。
//通过这个数据结构,可以向系统注册一些设备初始化函数
LOCAL struct drvBusFuncs windmlvxbFuncs =
{
windmlStub, /* devInstanceInit */
windmlStub, /* devInstanceInit2 */
windmlStub /* devConnect */
};
上述代码中把这些函数都设置为了空。这里对三个初始化阶段函数简单介绍一下。devInstanceInit是在vxworks内核启动之前预初始化时调用,完成的主要是关闭设备的中断。然后内核启动初始化,调用init2,这时候就会完成设备驱动内存的初始化,如果驱动初始过程需要使用内核的一些基础设施,那么都可以放到这时候。devInstanceConnect用于设备的连接,通常可以不使用,但如果它依赖于其他设备,则可以把启动代码放在这里。
另外,还需要注意到的一个就是windmlGraphicsProbe,这是一个设备探测函数,用于探测所有驱动所驱动的设备,并加入到设备列表中。
windmlGraphicsPciDevRegistration
是通过 usrWindMlInit
中的vxbDevRegister函数,完成每个被wind media所支持的设备类型的驱动注册。
vxbDevRegister((struct vxbDevRegInfo *)&windmlGraphicsPciDevRegistration);
vxbDevRegister((struct vxbDevRegInfo *)&windmlKeyboardDevRegistration);
vxbDevRegister((struct vxbDevRegInfo *)&windmlMouseDevRegistration);
vxbDevRegister((struct vxbDevRegInfo *)&windmlAudioPciDevRegistration);
然后调用uglODrvInit();这个函数完成的工作就是创建所有的设备驱动,通过阅读源码就可以知道,其实仅仅是创建了设备节点而已。