vxWorks驱动架构 分类: vxWorks 2014-03-13 08:55 425人阅读 评论(0) 收藏
2014-03-13 08:55
363 查看
Vxworks内核驱动基本结构:
三张表:1. 系统设备表 2. 系统驱动表 3. 文件描述符表
Vxworks 内部对每个设备使用DEV_HDR 数据结构进行表示:
Typedef struct
{
DL_NODE node;
Short drvnum;
Char *name;
}
该结构中给出了链接指针(用以将该结构串入队列中)、驱动索引号、设备节点名称。内核提供这个结构较为简单,只存储了一些设备的关键信息。底层驱动对其驱动的设备都有一个自定义数据结构表示,其中包含了驱动设备寄存器基地址,中断号,可能的数据缓冲区,保存内核回调函数的指针,以及一些标志位。最关键的一点是DEV_HDR必须是自定义数据结构的第一个成员变量,因为这个用户自定义结构最后需要添加到系统设备队列中,必须能够在用户定义结构与DEV_HDR结构之间进行转换,而将DEV_HDR结构设置为用户自定义结构的第一个成员变量就可以达到目的。
typedef struct
{
DEV_HDR pFCcardHdr;
BOOL created;
char * buf_virts;
UINT32 iobase;
UINT32 membase;
char irq;
UINT32 irqvec;
UINT32 Bus;
UINT32 Device;
UINT32 Func;
}DRV_CTRL;
系统提供了iosDevAdd(DEV_HDR *pDevHdr, char *name, int drvnum)用于驱动程序调用注册一个设备。第三个参数是设备对应的驱动程序索引号。这个驱动号是iosDrvInstall函数的返回值,在设备初始化函数中,我们首先调用iosDrvInstall注册驱动,然后使用iosDrvInstall 函数返回的驱动号调用 iosDevAdd添加设备到系统中通过这两步设备就可以被用户程序使用了。
用户调用open函数打开一个设备文件时,系统将以传入的文件路径名匹配系统设备的设备节点名,匹配方式是最佳匹配。
系统驱动表:
系统驱动表包含了当前注册到I/O子系统下的所有驱动。这些驱动可以直接驱动硬件工作的驱动层。系统驱动表底层实现是一个数组,数组元素数目在内核初始化过程中指定。I/O子系统提供iosDrvInstall供驱动程序注册,iosDrvInstall原型如下:
Int iosDrvInstall
(
FUNCPTR pCreate, FUNCPTR pDelete,
FUNCPTR pOpen, FUNCPTR pClose,
FUNCPTR pRead, FUNCPTR pWrite, FUNCPTR pIoctl /*pointer to driver ioctl function*/
)
一个设备驱动在初始化过程中一方面完成硬件设备寄存器配置,另一方面就是向I/O子系统注册驱动和设备。一个驱动并不需要实现上述所有函数,无须实现的函数直接传递NULL指针就可以了。iosDrvInstall 函数的基本实现即遍历drvTable数组,查询一个空闲表项,用传入的函数地址对各成员变量进行初始化。
系统文件描述符表
文件描述符表表项索引被用做文件描述符ID,即open函数返回值。对于文件描述符,需要注意:标准输入、标准输出、标准错误输出虽然使用0,1,2三个文件描述符,但是可能在系统文件描述符表中只占用一个表项,即都使用同一个表项。Vxworks内核将0,1,2三个标准文件描述符与系统文件描述符表中的内容分开进行管理。
系统文件描述符中的内容主要是针对硬件设备,使用一次open函数调用就占用一个表项:
int fd = open(DevName, 2,0);
应用程序每调用一次open函数,系统文件描述符表中就增加一个有效表项,直到数组满为止。此时open函数调用将以失败返回,因此注意如果需要反复打开设备的话,一定要在设备不用的时候调用close函数关闭该描述符指向的设备,并在每次调用open函数之后检查返回的文件描述符是否合法。
三张表:1. 系统设备表 2. 系统驱动表 3. 文件描述符表
Vxworks 内部对每个设备使用DEV_HDR 数据结构进行表示:
Typedef struct
{
DL_NODE node;
Short drvnum;
Char *name;
}
该结构中给出了链接指针(用以将该结构串入队列中)、驱动索引号、设备节点名称。内核提供这个结构较为简单,只存储了一些设备的关键信息。底层驱动对其驱动的设备都有一个自定义数据结构表示,其中包含了驱动设备寄存器基地址,中断号,可能的数据缓冲区,保存内核回调函数的指针,以及一些标志位。最关键的一点是DEV_HDR必须是自定义数据结构的第一个成员变量,因为这个用户自定义结构最后需要添加到系统设备队列中,必须能够在用户定义结构与DEV_HDR结构之间进行转换,而将DEV_HDR结构设置为用户自定义结构的第一个成员变量就可以达到目的。
typedef struct
{
DEV_HDR pFCcardHdr;
BOOL created;
char * buf_virts;
UINT32 iobase;
UINT32 membase;
char irq;
UINT32 irqvec;
UINT32 Bus;
UINT32 Device;
UINT32 Func;
}DRV_CTRL;
系统提供了iosDevAdd(DEV_HDR *pDevHdr, char *name, int drvnum)用于驱动程序调用注册一个设备。第三个参数是设备对应的驱动程序索引号。这个驱动号是iosDrvInstall函数的返回值,在设备初始化函数中,我们首先调用iosDrvInstall注册驱动,然后使用iosDrvInstall 函数返回的驱动号调用 iosDevAdd添加设备到系统中通过这两步设备就可以被用户程序使用了。
用户调用open函数打开一个设备文件时,系统将以传入的文件路径名匹配系统设备的设备节点名,匹配方式是最佳匹配。
系统驱动表:
系统驱动表包含了当前注册到I/O子系统下的所有驱动。这些驱动可以直接驱动硬件工作的驱动层。系统驱动表底层实现是一个数组,数组元素数目在内核初始化过程中指定。I/O子系统提供iosDrvInstall供驱动程序注册,iosDrvInstall原型如下:
Int iosDrvInstall
(
FUNCPTR pCreate, FUNCPTR pDelete,
FUNCPTR pOpen, FUNCPTR pClose,
FUNCPTR pRead, FUNCPTR pWrite, FUNCPTR pIoctl /*pointer to driver ioctl function*/
)
一个设备驱动在初始化过程中一方面完成硬件设备寄存器配置,另一方面就是向I/O子系统注册驱动和设备。一个驱动并不需要实现上述所有函数,无须实现的函数直接传递NULL指针就可以了。iosDrvInstall 函数的基本实现即遍历drvTable数组,查询一个空闲表项,用传入的函数地址对各成员变量进行初始化。
系统文件描述符表
文件描述符表表项索引被用做文件描述符ID,即open函数返回值。对于文件描述符,需要注意:标准输入、标准输出、标准错误输出虽然使用0,1,2三个文件描述符,但是可能在系统文件描述符表中只占用一个表项,即都使用同一个表项。Vxworks内核将0,1,2三个标准文件描述符与系统文件描述符表中的内容分开进行管理。
系统文件描述符中的内容主要是针对硬件设备,使用一次open函数调用就占用一个表项:
int fd = open(DevName, 2,0);
应用程序每调用一次open函数,系统文件描述符表中就增加一个有效表项,直到数组满为止。此时open函数调用将以失败返回,因此注意如果需要反复打开设备的话,一定要在设备不用的时候调用close函数关闭该描述符指向的设备,并在每次调用open函数之后检查返回的文件描述符是否合法。
相关文章推荐
- vxWorks BSP主要文件目录的组成及主要文件的作用 分类: vxWorks 2014-03-13 08:56 380人阅读 评论(0) 收藏
- VxWorks程序指南 分类: vxWorks 2014-03-13 08:56 502人阅读 评论(0) 收藏
- VxWorks下USB驱动总结1 分类: vxWorks 2014-03-12 09:37 464人阅读 评论(0) 收藏
- 对于vxworks下硬盘驱动 分类: vxWorks 2014-03-06 11:05 699人阅读 评论(0) 收藏
- VxWorks6.6 pcPentium BSP 使用说明(三):设备驱动 分类: vxWorks 2014-06-28 08:26 633人阅读 评论(0) 收藏
- vxWorks/BootROM Imageq启动顺序详解 分类: vxWorks 2014-03-13 08:57 479人阅读 评论(0) 收藏
- Vxworks驱动程序的结构 分类: vxWorks 2014-03-13 08:54 382人阅读 评论(0) 收藏
- Linux 下的Bluetooth 架构 分类: Android驱动 2012-03-16 11:07 492人阅读 评论(0) 收藏 举报 实战Linux Bluetooth编程(一) 协议栈概述
- Linux 下的Bluetooth 架构 分类: Android驱动 2012-03-16 11:07 492人阅读 评论(0) 收藏 举报 实战Linux Bluetooth编程(一) 协议栈概述
- ubuntu14.04 编译安装highpoint rocketraid 2720驱动 分类: arm-linux-Ubuntu 2015-01-22 17:18 321人阅读 评论(0) 收藏
- 【ASP.NET开发】ASP.NET(MVC)三层架构知识的学习总结 分类: ASP.NET 2012-09-27 17:09 1985人阅读 评论(1) 收藏
- Cross-Site Scripting XSS 跨站攻击全攻略 分类: 系统架构 2015-07-08 12:25 21人阅读 评论(2) 收藏
- VxWorks嵌入式系统几种常用的延时方法 分类: vxWorks 2014-09-26 18:10 467人阅读 评论(0) 收藏
- VxWorks镜像简介 分类: vxWorks 2014-03-14 08:44 280人阅读 评论(0) 收藏
- DAVINCI DM6446 开发攻略——V4L2视频驱动和应用分析 分类: DSP 2013-07-22 16:30 423人阅读 评论(0) 收藏
- VxWorks各部分初始化流程 分类: vxWorks 2014-03-14 08:44 253人阅读 评论(0) 收藏
- Model/View框架总体架构 分类: QT学习实践 2015-05-11 22:05 34人阅读 评论(0) 收藏
- vxworks下文件读写示例 分类: vxWorks 2014-01-23 11:52 762人阅读 评论(0) 收藏
- 《大型网站技术架构》1:概述 分类: C_OHTERS 2014-05-07 20:40 664人阅读 评论(0) 收藏
- VxWorks 操作系统内存布局 分类: vxWorks 2014-03-12 09:50 512人阅读 评论(0) 收藏