VxWorks驱动程序
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
串口设备驱动——ttyDrv 的层次结构
3. write() write()函数的调用过程是:write()→tyWrite()→xxDrv。 tyWrite 对所有的串行设备做同样的事情: ● 如果环形缓冲满,则阻塞; ● 从用户的缓冲中读数据到环形缓冲中; ● 在一定的情况下激活xxDrv 开始传输数据周期(一 个传输周期中首先传送数据到设备,然后等待设备给 出一个中断,以继续传送下一个数据); ● xxDrv 通过调用tyITx()来从输出环形缓冲中读数 据。
串口设备驱动——概述
串行设备驱动代码的分层结构图 vxWorks 的串行设备不同于前 面介绍的字符设备和块设备。 其驱动的结构如图 所示。从图 中可以看出:系统中的串行设 备驱动总共分3 层: usrConfig.c和ttyDrv(包括tyLib) 提供了一些对串行设备的一些 通用操作;而sysSerial.c 则针 对具体目标系统的、串行设备 有关的一些数据结构进行初始 化操作;最后xxDrv.c ( 在 cvtpxa270 BSP 中文件名为 pxa270FfnSio.c)包括了一些 具体设备相关的操作(如读/写 数据和设置等)。
串口设备驱动——概述
一个包含了串行设备及其应用程 序的总体模型如图所示。从图中 可以看出,串行设备的驱动xxDrv 并不是直接和I/O 系统交互的, 中间存在一个ttyDrv(包括 tyLib)。实际上,与IO 系统交 互的不是xxDrv的函数而是 ttyDrv/tyLib 提供的函数。另外, TargetAgent 可以和xxDrv 交互, 方便了系统的调试。ttyDrv(包 括tyLib):可以称为一个虚拟的 设备驱动。它只是介于I/O 与底 层具体设备驱动之间,为系统提 供统一的串行设备界面。
字符设备驱动
编写设备驱动程序时存在一个问题:如果设备的缓冲 中没有任何数据,但应用程序此时发起了一个read() 调用,那么此时该应用程序就有可能阻塞在这个位置 上,直到缓冲中有了足够的数据。当该应用程序只须 处理一个设备的数据时,阻塞还不至于产生问题。但 如果该应用程序须处理多个设备的数据时(如同时响 应键盘和触摸屏的数据),那么阻塞在某个设备操作 上就变得不可接受。 为了解决这个问题,要使用系统提供的select 机制。 支持调用select()函数的用户驱动程序,可以使任务同 时等待多个设备的输入,或允许任务为设备执行指定 的I/O 操作设定最长等待时间。这一功能的实现需要 借助于selectLib 函数库。
串口设备驱动——串口驱动的编写
CVT-PXA270 串口驱动的编写 编写串行设备的驱动主要有以下几个方面的工作: ● 初始化:确定系统要支持的串行通道的个数,初始化设 备描述符,编写设备初始化代码; ● 编写入口点函数; ● 编写设备中断服务程序(ISR); ● 修改sysSerial.c 文件。 1. 初始化过程 要编写设备的初始化代码,首先看一下系统初始化的大致 顺序,如下图所示。
串口设备驱动——概述
另外,还可调用具体 硬件的管理驱动。总 之ttyDrv 给系统提供 了一些通用的管理函 数(如缓冲管理和互 斥等)。所以ttyDrv 往往可以管理多个设 备。 右图表明了ttyDrv在 I/O系统中的作用。
串口设备驱动——ttyDrv 的层次结构
ttyDrv(tyLib)是一个虚拟的驱动,既管理着和 I/O 的交互,又管理与底层硬件驱动的交互。它 在与I/O 交换时所做的工作主要有:I/O 系统请 求初始化 (如添加设备入口,创建设备描述符)、 处理所有I/O 请求(如:ttyOpen、ttyIoctl、 tyRead 和tyWrite 等)、管理数据缓冲区和管理 多任务的同步和互斥。 ttyDrv 负责着ttyOpen 和ttyIoctl 的接入;而 tyLib 则负责tyRead 和tyWrite 的接入。下面这 个图为一个更加详细的、系统的数据流向图。
串口设备驱动——ttyDrv 的层次结构
4. read( ) read ()函数的调用过程是: read( )→tyRead( )→xxDrv。tyRead 对所有的 串行设备执行以下操作: ● 如果环形缓冲空,则阻塞; ● 从环形缓冲读数据到用户的缓冲中; ● 如果输入环形缓冲中还有字符,则启动所 有阻塞的进程; ● xxDrv 用tyIRx()来将设备读到的字符写 入到输入环形缓冲中
VxWorks 设备驱动分类及特点
2. 其他特殊设备:主要指一些非基于I/O 文件系统的设 备,如串口、硬盘、网络设备等。不能通过标准I/O 来进 行存取,但都有它们各自相关的标准。 虽然VxWorks 的I/O 设备驱动与UNIX 的很类似,但两者 也有区别,主要包括以下几点: ● VxWorks 的设备驱动可以动态安装和卸载; ● 除了标准的输入、输出和错误输出外,VxWorks 的文 件描述符是全局的,可由任何任务存取; ● VxWorks 的设备驱动有优先级之分,这取决于调用它的 任务的优先级。而Unix 下的设备驱动则执行在系统模式 下,无优先级之分。
串口设备驱动——ttyDrv 的层次结构
ttyDrv的数据流图:
串口设备驱动——ttyDrv 的层次结构
从图7-9 中可以清楚地看出系统的层次关系。应用层往往 调用通用的ioLib 中的函数(如:read、write、ioCtl 等)。这些函数从输入的文件描述符中找到相应的设备描 述符;然后找到设备驱动表,并调用设备驱动表中的处理 函数。而设备驱动表中的函ttyDrv/tyLib(tyWrite、 tyRead 等)则是第二层的内容。ttyDrv/tyLib 与实际的 设备(xxDrv)打交道完成指定的操作。第二层和底层的 通信是通过回调函数(callback)来实现的。具体来说, ttyDrv 提供两个函数(tyWrite 和tyRead):输出时底 层驱动可以从缓冲区中读取数据;输入时底层驱动可将接 收到的字符填入缓冲区。
常见的VxWorks 驱动程序
VxWorks 的提供了对很多设备的驱动程序支持。 下图为常见的VxWorks 设备驱动程序。
字符设备驱动
字符设备是指在I/O 传输 过程中以字符为单位进 行传输的设备,如键盘、 鼠标和打印机等。字符 设备驱动程序一般都有7 个基本I/O 操作函数,但 也不排除某些具体的字 符设备驱动程序可能忽 略其中的一个或几个操 作函数。
串口设备驱动——ttyDrv 的层次结构
下面对驱动中涉及的各函数进行简要说明: 1. ttyDrv() ttyDrv()调用iosDrvInstall()将ttyDrv 和tyLib 中的函 数安装到设备驱动表中。此函数在系统启动时由usrRoot() 调用。 2. ttyDevCreate() ttyDevCreate()主要完成如下工作: ● 创建和初始化设备描述符; ● 通过调用tyDevInit( )初始化tyLib; ● 通过调用 iosDevAdd( )将设备添加到设备列表中; ● 给底层的设备安装回调函数; ● 启动设备的中断。 此函数也是在系统启动时由usrRoot()调用。
驱动程序概念
英文名为“Device Driver”,全称为“设备驱 动程序”。是一种可以使计算机和设备通信的 特殊程序,相当于硬件的接口,操作系统只有 通过这个接口,才能控制硬件设备的工作。 因此,驱动程序被誉为“ 硬件的灵魂”、 “硬件的主宰”、和“硬件和系统之间的桥梁” 等。
VxWorks 设备驱动分类及特点
块设备驱动
块设备是指以“块”为 单位对数据进行存取的 设备。它可以被随机存 取,并且数据以块为单 位进行传输,典型的有 硬盘、光驱、软驱和磁 带等。 VxWorks 的块设备与字 符设备有微小的差别: 块设备不能与I/O 系统直 接打交道,如右图所示。
块设备驱动
块设备不能与I/O 系统直接打交道,如上图所示,在 块设备驱动程序与I/O 系统之间必须有文件系统,如 dosFs、rawFs 或tapeFs 等。这种层次关系允许同一 个块设备上存在不同的文件系统,从而减少驱动程序 中必须支持的I/O 函数的数量。 块设备驱动程序的操作函数大致有以下几个部分: 1. 低级驱动程序初始化; 2. 设备创建; 3. 读/写操作; 4. I/O 控制; 5. 复位及状态检测。
串口设备驱动——串口驱动的编写
从图中可以看出,串口设备的初始化涉及2 个阶段: (1) 在usrInit()中进行设备的初始化 sysHwInit()→sysSerialHwInit():进行设备资源的设置,初始化硬 件,并关闭串口中断; (2) 在usrRoot 中执行进一步操作 ● usrRoot()→SysSerialHwInit2():开启中断; ● usrIosCoreInit()→ttyDrv():进行系统调用,初始化ttyLib通 用驱动程序; ● usrIosCoreInit() → usrSerialInit()→ttyDevCreate() :创 建串口设备,其中创建时ttyDevCreate()的第二个参数SIO_CHAN 需 要使用sysSerialChanGet()获得。
VxWorks 设备驱动分类及特点
系统与驱动程序的关系
VxWorks 设备驱动分类及特点
当用户调用一种基本I/O 操作时,I/O 系统将用 户请求反映给特定驱动程序的相应操作函数。 驱动程序可调用该任务可执行的任何操作,包括 对其他设备进行I/O 操作。这意味着多数驱动程 序必须对关键程序代码采取一种互斥的操作机制。 通常采用的互斥机制是使用semlib 函数库提供的 信号量操作。
串口设备驱动——串口驱动的编写
PXA270 包含3 个串口:全功能串口、蓝牙串口以及标准 串口。由于RS-232-C 标准所定义的高、低电平信号与 PXA270 的UART 所定义的高、低电平信号完全不同。 PXA270 的UART 采用正逻辑方式。而RS-232-C 标准采用 负逻辑方式。显然,两者间要进行通信必须经过信号电平 的转换。
这7 个基本的I/O 操作函 数及其功能
字符设备驱动
驱动程序除了具有上述7 种基本I/O 操作函数 以外,还包含以下两种操作: ● 初始化函数负责在I/O 系统中安装驱动程序; 驱动程序将相应的设备与所需的资源关联起 来;然后初始化函数再执行其它任何必须的硬 件初始化操作。 ● 将驱动程序加载到I/O 系统中,这类函数一般 称作xxDevCreate()。一般简单的驱动程序, 往往将这两个函数合二为一。
串口设备驱动串口驱动的编写先入先出串口设备驱动串口驱动的编写串口设备驱动串口驱动的编写串口设备驱动串口驱动的编写串口设备驱动串口驱动的编写串口设备驱动串口驱动的编写?xxdevinit函数ns16550devinit函数是系统启动过程中首先调用的一个底层驱动函数被sysserialhwinit函数调用
串口设备驱动——串口驱动的编写
下图为CVT-PXA270 教学实验系统中蓝牙串口(BT_UART) 的电路原理图。它采用串行接口芯片MAX3244EAI。 MAX3244EAI为3 V~5 V 供电,EIA/TIA-232 与V.28/V.24 通信接口芯片,包含3 个发送、5Байду номын сангаас个接收电路,带自动关 断/唤醒功能,高数据传输速率。
串口设备驱动——ttyDrv 的层次结构
5. ioCtl() ioCtl 将函数传递到xxIoCtl(),如果设备驱动 没有实现此功能,则将控制转移到tyIoCtl。其关 系如图所示。
总之,ttyDrv 和tyLib 之所以独立为一层,主要 是从代码可复用和统一界面两个角度来考虑的。 代码可重用,是因为所有的串行设备都有一些相 同的管理工作(如缓存和信号的管理等);同样 为了给I/O 提供统一的界面,ttyDrv 在设备驱动 表中安装了统一的驱动函数,这样I/O 和串行设 备的交互就被屏蔽了。
大体上可把设备驱动程序分为两大类: 1. 基于I/O 文件系统的设备:包括基于I/O 系统的字符 设备和块设备。VxWorks 的I/O 系统有其独特性,因而它 比其它I/O 系统更快速、灵活,这在实时系统中非常重要。 这些设备都可采用ioLib 系统库提供的接口函数create()、 open()、close()、 read()、write()和 ioctl()来操作。 VxWorks 的I/O 系统由基本I/O 及含缓冲的I/O 组成,它 提供标准的C 库函数。基本I/O 库与Unix 兼容;而含缓 冲的I/O 则与ANSI C兼容。
VxWorks 操作系统
第7章:VxWorks 驱动程序的编写
耿长青 2010.8.13
本章主要内容
介绍VxWorks 驱动程序的编写方法,包括字 符设备、块设备、串口设备、网络设备等的 驱动编写方法以及文件系统。本章安排了很多 实验,在学习过程中需要进行实践操作,这些 实验需要有第5 、6章的基础。