华清远见系列图书
VxWorks设备驱动开发详解
曹桂平 等编著
ISBN 978-7-121-12828-8
2011年3月出版
定价:49.00元
16开
420 页
内 容 提 要
Shell是用户与内核进行交互操作的一种接口,是Linux最重要的软件之一。目前最流行的Shell称为bash Shell,bash Shell脚本编程以其简洁、高效而著称,多年来成为Linux程序本书结合作者实际的开发经验,对VxWorks操作系统内部的机制及其各类设备驱动的开发进行了深入的讲解和分析。全书分3篇共11章,第1篇对VxWorks操作系统的主要组件如任务、任务调度、任务间通信、内存管理、中断处理进行了较为细致的分析;其后对很多VxWorks开发者不甚了解的VxWorks内核映像类型以及启动方式和流程进行了详细的说明和解析。第2篇是驱动开发的准备阶段,着重介绍了VxWorks系统下设备驱动的内核层次结构。第3篇作为本书的重点,每章对应一类驱动,结合开发实例,详细而完整地分析了VxWorks下普通字符设备驱动、串口驱动、普通块设备驱动、Flash设备驱动、网络设备驱动以及USB设备驱动的设计和实现。
本书面向广大工程技术工作者,既可作为高等院校教师和相关专业学生的教材,又可作为各类培训班的培训教程。
前 言
VxWorks是较为常用的嵌入式硬实时操作系统,在很多领域都有其应用的身影,然而由于VxWorks操作系统源代码不公开,虽然文档中对各种驱动设计都有说明,但在实际应用中还是会遇到很多问题。本书根据作者工作中的一些驱动经验,结合Wind River提供的一些官方文档和开发环境下的源代码写成,对VxWorks下各种常见设备的驱动都做了比较详细的介绍和分析,可以作为VxWorks下设备驱动设计的指南。另外,对于各种类型的VxWorks启动方式以及映像文件组成进行了较为细致的分析,将澄清VxWorks BSP开发者具有的很多疑问。本书既可作为VxWorks初学者的学习材料,也可作为VxWorks老手的参考资料。
本书内容
本书分为3篇共11章。
第1篇为VxWorks操作系统快速入门篇,共包括3章内容。
第1章简单介绍了嵌入式系统,并对VxWorks操作系统的特性进行了简单说明。
第2章对VxWorks操作系统的主要组成进行了比较详细的介绍,包括任务、任务调度、任务间通信、内存管理、中断处理。书中内容不是翻译官方的文档,而是结合作者的经验有感而发。
第3章对VxWorks内核映像类型以及启动方式进行了详细分析,并对下载方式中使用的bootrom进行了较为深入的分析和介绍,此后对VxWorks操作系统的启动过程进行了梳理。本章将澄清读者对VxWorks启动方面的很多疑问。
第2篇为VxWorks设备驱动起步篇,共包括2章内容。
第4章讨论了驱动程序的基本功能和结构,对驱动程序中常用的一些策略以及注意事项进行了介绍。
第5章介绍了VxWorks设备驱动的内核结构层次,着重对I/O子系统及其维护的三张系统表进行了讨论,并对VxWorks下已有的几个较为常用的驱动以代码示例的方式介绍其使用方法。
第3篇为本书的重点,对VxWorks下六大核心设备驱动进行了详细的分析和介绍,六类驱动中每类驱动对应一章内容,故本篇共包括6章内容。
第6章开始进入具体设备驱动的设计,本章将从结构层次最简单的普通字符设备驱动开始讲起,以一个SPI接口驱动代码为例,着重讨论了普通字符设备驱动的结构、设计方式和具体实现。
第7章对串口驱动设计和实现进行了详细的分析。串口也是字符设备的一种,由于其常用性,VxWorks内核专门提供了TTY中间层来提高串口驱动设计的效率,降低串口驱动设计的复杂度。
第8章进入第二大类设备——块设备驱动的设计和实现的分析。我们将从数据结构的知识出发,分析块设备驱动的基本结构,进而讨论其具体实现。VxWorks下块设备驱动工作的方式比较特殊,其使用的阻塞读写方式不同于通用操作系统下的中断读写方式,这与VxWorks特殊的工作环境有关。
第9章将对Flash设备驱动进行详细介绍。Flash设备是嵌入式平台上最常见和常用的设备,用以存储操作系统内核映像和用户数据。本章将以VxWorks内核提供的TrueFFS中间层进行展开,分析Flash设备驱动涉及的各个方面。
第10章进入第三大类设备——网络设备驱动的设计和实现中。网络设备由于其独特的工作方式,其内核驱动层次不同于其他两类设备(字符设备、块设备),其不属于I/O子系统管理,而是直接工作在内核网络栈的实现下。为了简化网络设备驱动设计的复杂度,VxWorks提供了MUX中间层,在该层次下实现的驱动通常被称为增强型网络驱动。本章同样也是从数据结构的知识出发,以实际项目中使用的网口驱动代码为例,逐步完成对网络设备驱动的设计和实现。
第11章分析了USB设备驱动的设计和实现。首先对USB本身进行了详细的介绍,之后对要驱动的对象进行了澄清。一般而言,USB设备驱动指的是对USB主机或者目标机控制器的驱动,这个驱动由于与内核USB栈耦合较紧密,故必须对内核USB栈的实现有很清楚的了解才能成功地完成USB主机控制器的驱动开发。本章首先跟随一个USB类驱动层读数据请求,对请求在内核USB栈中的传递路径进行了跟踪,对路径上调用的关键函数以及使用的数据结构进行了较为详细的分析和介绍,之后以Mass Storage类驱动为例,介绍类驱动的初始化过程,并以UHCI控制器驱动为例,介绍主机控制器驱动的初始化过程,最后总结出了USB主机控制器的驱动结构,给出了驱动中两个中心函数的实现框架。
致谢
我要感谢我尊敬的慈祥的奶奶,您的勤劳善良将影响我的一生,是您教导我“自成人,方成人”,告诫我要严于律己。同时,我要感谢我的父母,你们鬓角的丝丝白发,早已印入我的心中,成为我奋斗不止的动力。
鉴于作者能力有限,不可能对VxWorks下各类驱动中的每一个问题都理解到位,如果发现理解或者分析有误之处,恳请广大读者批评、指正,读者也可通过邮件[email protected]与作者联系。
曹桂平
目 录
第1篇 VxWorks操作系统快速入门篇
第1章 VxWorks嵌入式操作
系统的特点与应用 2
1.1 嵌入式系统概述 3
1.1.1 嵌入式系统定义 3
1.1.2 嵌入式系统组成和特点 3
1.1.3 嵌入式系统发展趋势 4
1.1.4 实时操作系统 5
1.实时操作系统定义 5
2.实时操作系统的特征 6
3.实时操作系统的相关概念 6
1.2 VxWorks操作系统基本特点 7
1.2.1 操作系统内核结构——微内核和宏内核 7
1.宏内核 7
2.微内核 8
1.2.2 VxWorks内核——高性能的微内核设计 8
1.2.3 VxWorks开发支持——可裁减的运行软件 8
1.2.4 VxWorks网络支持——综合的网络工具 9
1.2.5 VxWorks移植性支持 9
1.兼容POSIX 1003.1b标准 9
2.平台的选择 9
3.方便移植到用户硬件上 9
1.2.6 VxWorks操作系统选件 10
1.3 VxWorks操作系统应用范围 10
1.4 本章小结 11
第2章 VxWorks操作系统的基本组件 12
2.1 VxWorks任务 13
2.1.1 内核实现基本原理 13
2.1.2 任务操作函数 15
2.1.3 深入了解任务栈 19
2.1.4 任务名长度问题 20
2.1.5 正确结束任务 21
2.1.6 任务的钩子函数——黑客机制 23
2.1.7 任务小结 25
2.2 VxWorks任务调度算法——基于优先级的抢占式调度 26
2.3 VxWorks任务间通信策略 29
2.3.1 信号量 30
2.3.2 消息队列 31
2.3.3 管道 32
2.3.4 网络套接字Socket 32
2.3.5 任务间通信的特殊机制:信号 33
2.4 VxWorks内存管理——虚拟地址空间支持 33
2.5 VxWorks中断处理——多层次的中断转移 38
2.5.1 VxWorks下中断转移过程详解(基于ARM平台) 40
2.5.2 中断上下文中为何不可调用可引起睡眠的函数 43
2.6 本章小结 45
第3章 VxWorks操作系统启动过程详解 46
3.1 VxWorks操作系统启动 47
3.1.1 VxWorks基本启动方式 47
3.1.2 VxWorks操作系统内存布局 48
1.非压缩形式 48
2.压缩形式 48
3.1.3 下载型启动方式概述 50
3.1.4 ROM型启动方式概述 53
3.2 深入理解bootrom——下载启动方式下的“瑞士军刀” 54
3.2.1 bootrom的构成 55
3.2.2 bootrom脚本的创建 56
3.2.3 脚本运行过程分析 56
3.2.4 bootrom的重定位 60
3.2.5 RAM中运行的bootrom代码 62
1.usrInit函数 62
2.usrRoot函数 65
3.bootCmdLoop函数 68
3.2.6 在bootrom中添加用户代码 68
3.2.7 其他注意事项及说明 69
3.3 深入VxWorks启动过程 71
3.3.1 ROM型映像早期启动流程详解 71
1.romInit函数 71
2.romStart函数 79
3.3.2 下载型映像早期启动流程详解 81
3.3.3 公共启动流程详解 82
1.usrInit函数分析 83
2.usrRoot函数分析 84
3.启动用户代码 89
3.4 VxWorks BSP文件组成 90
3.4.1 源文件 91
3.4.2 头文件 94
3.4.3 Makefile文件 97
3.4.4 扩展文件 100
3.4.5 说明文件 100
3.5 本章小结 100
第2篇 VxWorks设备驱动起步篇
第4章 设备驱动 102
4.1 设备驱动的功能 103
4.2 设备驱动的结构 103
4.3 设备驱动的基本特点 105
4.3.1 驱动代码执行环境——任务和中断上下文 105
4.3.2 设备基本分类 105
4.3.3 驱动代码安全性——参数合法性检查 106
4.3.4 驱动基本工作模式——轮询和中断 106
4.3.5 驱动与硬件数据的交互方式——DMA和直接复制 107
4.3.6 其他注意事项——Volatile关键字 107
4.4 本章小结 108
第5章 VxWorks下设备驱动的内核结构层次 109
5.1 认识VxWorks设备驱动内核基本层次 110
1.USB设备驱动内核层次 110
2.块设备驱动内核层次 111
3.字符设备驱动内核层次 111
4.网络设备驱动内核层次 112
5.2 VxWorks内核驱动基本结构——内核三张表 114
5.2.1 系统设备表 114
5.2.2 系统驱动表 116
5.2.3 系统文件描述符表 118
5.2.4 内核三张表之间的联系 120
5.3 VxWorks内核驱动支持——“免费的午餐” 122
5.3.1 管道虚拟设备驱动支持 123
5.3.2 虚拟内存设备驱动支持 124
1.虚拟内存设备创建函数 124
2.虚拟内存设备使用实例 125
5.3.3 ramDisk设备驱动支持 127
5.3.4 网络设备(netDrv)高层次驱动支持 129
1.netDrv驱动基本工作原理 129
2.网络设备节点的创建 130
3.netDrv驱动中关键参数的获取 131
5.4 VxWorks文件系统支持 132
5.4.1 虚拟根文件系统VRFS 132
5.4.2 事务型文件系统HRFS 132
5.4.3 MS-DOS兼容型文件系统dosFs 133
5.4.4 原始文件系统rawFs 134
5.4.5 CD-ROM文件系统cdromFs 135
5.4.6 只读文件系统ROMFS 135
5.4.7 目标机文件系统TSFS 136
5.5 添加驱动到VxWorks内核 136
1.将驱动代码编入内核映像 136
2.注册驱动和创建设备 137
5.6 本章小结 138
第3篇 VxWorks之六大核心设备驱动
第6章 VxWorks设备驱动之字符设备驱动详解 140
6.1 用户请求到字符设备驱动服务函数的传递 141
6.2 实例入门:基于SPI接口的串口扩展芯片VK3224驱动实现 144
6.3 认识VxWorks字符设备驱动基本数据结构——DEV_HDR结构 145
6.4 注册字符设备驱动和创建字符设备节点 147
6.5 编写字符设备驱动底层服务函数 150
6.5.1 编写字符设备打开函数 150
6.5.2 编写字符设备读写函数 152
6.5.3 编写字符设备控制函数 155
6.5.4 编写字符设备关闭函数 157
6.5.5 设备驱动工作模式的选择 160
6.5.6 编写字符设备删除函数 161
6.6 删除字符设备节点和卸载字符设备驱动 163
6.6.1 删除字符设备节点 163
6.6.2 卸载字符设备驱动 164
6.7 本章小结 165
第7章 VxWorks设备驱动之串口驱动详解 166
7.1 认识VxWorks内核TTY
中间层——串口驱动的基石 168
7.1.1 TTY中间层应具备的功能 168
7.1.2 基于TTY的串口驱动实现思想 169
7.1.3 TTY中间层与底层串口驱动的关系 171
7.2 VxWorks内核TTY中间层初始化详解 171
7.2.1 ttyDrv函数 172
7.2.2 ttyDevCreate函数 173
7.2.3 sysSerialHwInit和sysSerialHwInit2函数 174
7.2.4 TTY中间层初始化过程小结及注意事项 174
7.3 认识VxWorks下串口驱动基本数据结构——SIO_CHAN结构 176
7.3.1 内核SIO_CHAN结构定义 176
7.3.2 封装SIO_CHAN结构 178
7.4 VxWorks串口驱动文件基本构成 180
7.5 VxWorks串口驱动内核接口
文件sysSerial.c的实现 183
1.sysSerial.c模板文件 184
2.模板文件函数功能说明 188
3.sysSerial.c文件功能小结 190
7.6 编写VxWorks串口驱动底层服务函数 190
7.6.1 编写串口驱动初始化函数 191
7.6.2 编写串口驱动回调函数——arm926UartCallback- Install 193
7.6.3 编写串口驱动控制函数——arm926UartIoctl 195
7.6.4 编写串口驱动中断处理函数——arm926UartInt 197
7.6.5 编写串口驱动启动发送函数——arm926Uart- TxStartup 200
7.6.6 编写串口驱动轮询工作模式支持函数 202
1.编写发送函数arm926UartPollOutput 202
2.编写接收函数arm926UartPollInput 203
7.7 再议VxWorks内核TTY中间层 205
7.8 本章小结 208
第8章 VxWorks设备驱动之块设备驱动详解 208
8.1 认识VxWorks块设备驱动内核基本层次 210
8.2 VxWorks块设备驱动基石——内核文件系统支持 211
8.2.1 rawFs文件系统详解 211
1.rawFs文件系统初始化第一步:rawFsInit函数 212
2.rawFs文件系统初始化第二步:rawFsDevInit函数 212
3.rawFs文件系统使用示例 214
4.CBIO中间层浅析 216
8.2.2 dosFs文件系统详解 220
1.dosFs初始化基本流程 221
2.初始化第一步:dosFsLibInit函数 222
3.初始化第二步:dosFsDevCreate函数 223
4.dosFs文件系统格式化 225
5.dosFs文件系统初始化小结 226
8.3 认识VxWorks块设备驱动基本数据结构——BLK_DEV结构 228
8.3.1 内核BLK_DEV结构定义 229
8.3.2 封装BLK_DEV结构 232
8.4 VxWorks块设备驱动基本架构 233
8.4.1 块设备驱动工作的特点 233
8.4.2 基于CBIO中间层的块设备驱动内核层次 234
8.4.3 块设备驱动底层函数组成 234
8.5 编写VxWorks块设备驱动底层服务函数 235
8.5.1 认识ATA(IDE)硬盘结构 236
8.5.2 认识硬盘分区 237
8.5.3 认识CBIO分区管理层 239
8.5.4 编写块设备驱动初始化函数 241
8.5.5 编写块设备驱动读设备函数ataBlkRd 244
8.5.6 编写块设备驱动写设备函数ataBlkWrt 245
8.5.7 编写块设备驱动设备控制函数ataIoctl 247
8.5.8 编写块设备驱动设备状态查询函数ataStatus 248
8.5.9 编写块设备驱动设备复位函数ataReset 248
8.6 本章小结 249
第9章 VxWorks设备驱动之Flash设备驱动详解 249
9.1 认识Flash设备 251
9.1.1 概述 251
9.1.2 Flash设备硬件接口的差别 252
9.1.3 Flash设备容量和成本 252
9.1.4 Flash设备可靠性和耐用性 252
9.1.5 Flash设备易用性 253
9.1.6 Flash设备软件支持 253
9.2 深入Nand Flash设备 254
9.3 深入Nor Flash设备 256
9.3.1 Nor Flash存储器特点 256
9.3.2 Nor Flash命令集BCS / SCS 256
9.3.3 Nor Flash接口访问标准 257
9.4 认识Flash设备地址问题——驱动“陷阱” 258
9.5 VxWorks下Flash设备驱动内核层次详解——认识TrueFFS中间层 259
9.6 VxWorks内核TrueFFS中间层初始化详解 261
9.7 创建和使用Flash设备 264
9.8 认识VxWorks下Flash设备驱动基本架构 267
9.9 编写VxWorks下Flash设备驱动Socket层服务函数 268
9.9.1 Socket驱动层文件构成 268
9.9.2 Socket驱动层实现示例 269
9.9.3 Socket层实现小结 279
9.10 编写VxWorks下Flash设备驱动MTD层服务函数 285
9.10.1 tffsConfig.c文件——Flash设备驱动初始化入口 286
9.10.2 tffsMtd.c文件——Flash设备驱动MTD层服务函数所在地 289
9.10.2.1 编写Flash设备识别函数 289
9.10.2.2 编写Flash设备读函数 292
9.10.2.3 编写Flash设备写函数 293
9.10.2.4 编写Flash设备块擦除函数 296
9.10.2.5 编写Flash设备地址映射函数 297
9.11 本章小结 297
第10章 VxWorks设备驱动之网络设备驱动详解 298
10.1 VxWorks下网络设备驱动内核基本层次——认识MUX接口层 300
10.1.1 网络设备驱动的基本特点 300
10.1.2 网络设备驱动内核层次 301
10.1.3 认识MUX中间层 302
10.2 认识VxWorks网络设备驱动基本数据结构——END_OBJ结构 304
10.3 实例介绍:基于TMS320D-M6446平台的EMAC网口驱动 305
10.4 定义VxWorks网络设备驱动自定义结构——“信息集中地” 310
10.5 VxWorks网络设备驱动加载与启动 311
10.5.1 网络设备驱动初始化基本流程 311
10.5.2 修改configNet.h文件 313
10.5.3 网络设备驱动加载函数armload的实现 314
10.5.4 网络设备驱动启动函数armStart的实现 319
10.6 VxWorks网络设备驱动数据帧后台处理支持:netJobAdd 320
10.7 编写VxWorks网络设备驱动数据帧接收函数 323
10.7.1 编写数据帧接收“下半部分”入口函数 323
10.7.2 VxWorks内核网络栈对数据帧的封装要求 324
10.7.3 网络数据帧处理和上传 330
10.7.4 再议网络数据帧的接收 332
10.8 编写VxWorks网络设备驱动数据帧发送函数 333
10.9 编写VxWorks网络设备控制函数 337
10.10 编写VxWorks网络设备驱动查询模式支持函数 342
1.armPollSend函数的实现 343
2.armPollRcv函数的实现 344
10.11 编写VxWorks网络设备停止和卸载函数 345
1.armStop函数的实现 346
2.armUnload函数的实现 347
10.12 认识VxWorks网络设备驱动内核支持函数 347
10.13 VxWorks网络设备驱动实现小结 349
10.14 认识网络设备IP地址和MAC地址 350
10.15 VxWorks网络设备驱动对多网口的支持 351
10.15.1 修改底层驱动 352
10.15.2 修改configNet.h文件 353
10.15.3 修改usrNetInit函数 354
10.16 本章小结 355
第11章 VxWorks设备驱动之USB设备驱动详解 355
11.1 USB详解 357
11.1.1 USB的定义 357
11.1.2 认识USB描述符及其相互关系 360
1.驱动描述符(Device Descriptor) 360
2.配置描述符(Configuration Descriptor) 360
3.接口描述符(Interface Descriptor) 361
4.端点描述符(Endpoint Descriptor) 362
11.1.3 USB控制器基本分类 363
11.1.4 认识USB硬件接口 363
11.2 认识VxWorks下USB设备驱动内核层次和驱动对象 365
11.3 示例介绍:UHCI USB主机控制器基本工作原理 367
11.3.1 UHCI规范 367
11.3.2 UHCI基本工作原理和数据结构 368
11.3.3 UHCI控制器驱动原理概述 371
11.4 VxWorks下USB设备操作请求内核传递过程详解 372
11.4.1 第一层入口函数:usbBulkDevBlkRd 373
11.4.2 第二层入口函数:usbBulkCmdExecute 376
11.4.3 第三层入口函数:usbdTransfer 381
11.4.4 第四层入口函数:urbExecBlock 383
11.4.5 第五层入口函数:usbdCoreEntry 384
11.4.6 第六层入口函数:fncTransfer 386
11.4.7 第七层入口函数:usbHcdIrpSubmit 388
11.4.8 第八层入口函数:底层HCD总入口函数 389
11.4.9 VxWorks下USB设备操作请求内核传递过程总结 391
11.5 VxWorks下USB设备应用层类驱动初始化详解 392
11.6 VxWorks下USB控制器驱动初始化详解 397
11.7 VxWorks下USB控制器驱动架构 402
11.8 编写VxWorks下USB控制器驱动底层服务函数 403
11.8.1 编写USB操作请求总入口函数 403
11.8.2 编写USB控制器驱动中断处理函数 404
11.8.3 编写USB控制器驱动具体服务函数 408
11.9 本章小结 408
参考文献 409