您的位置:首页 > 其它

VxBus设备驱动模型

2016-03-30 17:23 966 查看

VxBus简介

VxBus是指在VxWorks中用于支持设备驱动的特有的架构,这种架构包含对minimal BSP的支持。

它包括以下功能:①允许设备驱动匹配对应设备;②提供驱动程序访问硬件的机制;③软件其他部分访问设备功能;④在VxWorks系统中,实现设备驱动的模块化。

VxBus在总线控制器驱动程序服务的支持下,能在总线上发现设备,并执行一些初始化工作,使驱动与硬件设备之间正常的通讯。

OCAL 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();这个函数完成的工作就是创建所有的设备驱动,通过阅读源码就可以知道,其实仅仅是创建了设备节点而已。

后续会继续更新相关细节。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: