当前位置: 首页 > >

嵌入式VxWorks系统下的CPCI设备驱动程序开发

发布时间:

总第 255 期 2011 年第 1 期

计算机与数字工程 Computer & D ig ital Eng ineer ing

V o l. 39 No . 1 1 83

嵌入式 VxWorks 系统下的 CPCI 设备驱动程序开发*

唐力强 王行祥
( 中国电子科技集团公司电子第三十六研究所 嘉兴 314033)
摘 要 具体分析了 V x Wor ks 下 PCI 总线的配置空 间结构 和地址 映射, 并采用 CPCI9054 芯片, 结 合一个信 号产生、 数据采集处理系统的工程实例, 详细阐述了 V xW orks 下 CP CI 设备驱动程序的开发实现方法和具体 步骤, 并给出了部 分关 键代码。应用结果表明, 该方法可移植性较高, 可操作性强, 对于 了解和开发 CPCI 驱动程序具有一定的参考价值。
关键词 V xW orks; CP CI; 9054; 设备驱动程序 中图分类号 T P334

Development of CPCI Device Driver for Embedded VxWorks System

T ang L iqiang Wang X inx iang ( T he 36st Institute of China Electro nics T echnolog y G roup Co rpor ation, Jiaxin 314033)

Abstract F irstly, the P CI config uratio n space architecture and address mapping ar e analy zed, and then, acco rding to a eng ineering ex amples used the CP CI9054 chipsets fo r sig nal g ener ator and data acquisition, the specific method and steps of developing CP CI device driver fo r embedded r eal time V x Wo rks system are intr oduced in detail, and impo rtantly, so me key pr og rams is pro vided. A s a result, the technolog y and methods adopted in this paper a re pr act ical and w o rthy of using a bro ad. It is v ery useful for realizing and developing CPCI device driv er.
Key Words V x Wor ks, CPCI, 9054, dev ice dr iver Class Number T P334

1 引言
VxWo rks 是一款微内核高性能可裁剪的嵌入 式实时操作系统, 它以其卓越的实时性和良好的可 靠性, 被广泛地应用在通信、军事、航天等实时性要 求极高的领域中[ 1] 。Co mpact PCI( CPCI) 总线技术 在工业控制、航空航天等 领域也得 到了广泛 的应 用, 但目前大多数设备厂商只提供了 Window s 操 作系统下的 CPCI 驱动程序, 对于嵌入式 Vx Works 系统中以 CPCI 总线技术为接口的 I/ O 设备, 还必 须自己开发相应的设备驱动程序。
本文以 CPCI9054 为例详细讨论了 Vx Works 下开发 CPCI 设备驱动程序的方法。
2 系统*台构成
试验*台是某型号自研的信号产生、数据采集

和处理系统, CPU 模块是 x86 体系结构, 系统中的 几块数据采集板 卡和信号 产生模块 都基于 CPCI 总线, 使用 PCI9054 接口芯片作为 PCI 总线和本地 总线通信的介质。VxW orks 操作系统专门对 PCI 设备提供支持, 包括对 P CI 总线的底层操作函数。
Vx Works *台所用 版本为 T ornado2. 2/ Vx Works 5. 5[ 2] 。
3 PCI 配置空间组织结构
P CI 局部 总线有 三类地 址空 间: 内存 地址空 间、I/ O 地址空间、配置地址空间。每一个 P CI 设 备都有一个配置空间, 容量最大为 256 字节, 其中 前 64 字节为预定义头标区, 后 192 字节为设备关 联区, 而头标区的前 16 字节对各类 PCI 设备而言 都是相同的, 配置寄存器是 P CI 设备的硬件与其初 始化软件信息交接的地方, 软件可通过它对设备进

* 收稿日期: 2010 年 8 月 10 日, 修回日期: 2010 年 9 月 20 日 作者简介: 唐力强, 男, 硕士, 工程师, 研究方向: 嵌入式和控制软件开发。

18 4

唐力强等: 嵌入式 Vx Wo rks 系统下的 CP CI 设备驱动程序开发

第 39 卷

行识别和监控。头标区的布局如图 1 所示。

设备标识

厂商标识

00h

状态字

命令字

04h

分类代码

修订版本标识 08h

内置自 头标 测试 类型

等待时间 定时器

Cache 行长 0ch

基地址寄存器

10h

Card bus 卡的卡信息结构指针

28h

子系统标识

子系统供应商标识

2ch

扩充 RO M 基地址

30h

保留

34h

保留

38h

最长等待 时间

最短获准 时间

中断引脚

中断线

3ch

图 1 PCI 配置空间头标区
配置空间中的一个重要部分是基地址寄存器 ( BAR) , 它的内容是 PCI 设 备的地址空间 映射到 系统地址空间的起始物理地址, 在初始化 PCI 设备 时, 还可以通过对该地址写和读, 来确定设备需要 的资源大小, 方法是向设备配置空间的基地址寄存 器全写 1( 0x FF FF FF FF ) , 然后再读出 来, 看 有多 少 bit 位变为 0, 就可得到该设备需要的 PCI 内存 空间或 I/ O 空间的 bit 位数。基地址寄存 器通过 寄存器的最低位来标识该空间是存储器空间还是 I/ O 空间, BAR 的 bit0 为 1 表示 I/ O 空间映 射, bit 0 为 0 表示为存储空间映射。
系统加电时, 6 个基地址寄存器向 POST 软件 反映该设备需要多少存储空间和 I/ O 空间, POST 软件了解到 P CI 总线上所有的存储器和 I/ O 设备, 再根据它们的容量需求将其映射定位到适当的存 储器地址和 I/ O 地址, 并把起始地址写入基地址寄 存器, 再启动系统。
PCI 配置空间信息可用 V xWor ks 下相关库函 数读取, 但在 Window s *台有很多的 PL X 支持工 具, 可以读取 CPCI 板卡的厂商号、设备号、基地址 寄存器地址等信息。

4 设备在 V xW orks 中的地址映射

得到设 备基 地 址后 必 须要 完 成设 备 在 Vx Wo rks 中的地址映射, 以便应用程序可以正常的访 问设备[ 3] 。在 V x Works 中有 MM U 管理组件, 该 组件完成 PCI 设备在 Vx Wor ks 系统中的 自动地 址映射。如果系统中只包含了基本的 M MU 功能 时, 系统不会对设备进行自动配置, 这时可以用手 动配置和半自动配置的方法[ 4] 。
1) 在 boo t able 工程中编译系统映象 文件时, 工程默认配置的是 basic M MU suppo rt 组件, 如果

选择包含 f ull M M U suppo rt 组件, 系统就会自动 的对设备进行地址映射。
2) 手动配置的方法是根据 P CI 基地址寄存器 中的值来 修改 sy sL ib. c 文件 中 的 sysP hysM em Desc 表, 但是这种方法使 BSP 的应用受到了限制。
3) 半自动配置的方法是使用系统提供的函数 sysM muM apAdd 将地址加入到 sysPhysM emDesc 表中。
本文在地址 映射时, 对手动 和半自动 配置方 式, 都作了试验验证。系统对设备完成地址映射之 后驱动程序就可以根据分配的基地址访问设备了。
5 CPCI 驱动程序实现方法
本文采用了把驱动程序编译到 Vx Works 内核 中的方法, 增加了系统的实时性和可靠性, 为了降 低实现的复杂度, 没有使用标准的驱动程序规范函 数如 x xopen、x x creat 等。嵌 入式 Vx Works 系统 下的 CPCI 驱动程序实现方法如下:
1) 寻找 P CI 总线上的 CPCI 板卡设备, 需指定 厂商标 记、设 备 标记。本 系统 使 用的 多 块 CPCI 卡, 厂商标记 0x 10b5, 设备标记 0x9054, 在用户开 发文件 usrAppInit . c 中, 多 次调用 pciF indDevice ( 0x 10b5, 0x 9054, nIndex , & pciBus, & pciDevice, & pciF unc) 函数, 直到返回值不等于 OK, 这样就自 动将各板卡设备全部识别出来, 在 nIndex 存放板 卡序号, pciBus 存放识别出 板卡的总线号, pciDe vice 为识别出板卡的设备句 柄, pciFunc 中存放识 别出板卡的功能号, 这些变量都可以是 int 型, 各板 卡信息可以保存备用[ 5] 。
2) 取出各板卡基地址寄存器 BAR 中的地址, 每块板卡最多有 6 个基地址寄存器。比如调用函 数 pciConfig InL ong ( pciBus, pciDevice, pciF unc, P CI_CF G_BASE _ADDRESS _0, & BaseAddr0) 可 取出基地址 寄存器 0 中的地址, 并将地 址存放在 BaseAddr0 变量中。对其他寄存器读取, 可以修改 P CI 配置基地址宏 P CI_CFG_BASE_ADDRESS_0 参数即可。比如从 0 号基地址寄存器中读出地址 为 0xea140000, 该地址在内存地址映射时需要。
3) 读 取命 令寄 存器, 还 是调 用 pciConfigIn L ong, 地址宏改为 P CI_CF G_COM MAN D。
4) 读取中断号, 调用函数 pciConfigInByt e( pci Bus, pciDevice, pciFunc, PCI_CFG_DEV_INT _L INE, & irqnum) 实现, 中断号保存在 irqnum 变量中。
5) 中断连接和中断使 能, 挂接中断服务程序

2011 年第 1 期

计算机与数字工程

1 85

用 pciInt Connect ( INU M _ T O _ IVEC ( irqnum + 0x20) , ( V OIDF UNCP T R) int err _ upt H andler, 0) 函 数 实 现, 中 断 服 务 程 序 定 义 为 void int er r upt H andler( void) 。
6) 实现内存地址映射。在 sy sL ib. c 中有一张 表 sy sPhy sM emDesc 描述了系统物理内存的分配, 在此表的后面增加基地址寄存器的地址映射, 注意 地址和长度参数必须按页对齐, 为 4kB/ 4MB 的倍 数。前面已经从 BAR 中读出几个基地址, 都可增 加到地址映射表中。
PH YS_M EM _DESC sysPhysM emDesc [ ] = { / * 下面为新增加的基地址映射, 不要删改前面已有的映射* /
{ ( v oid * ) 0xea140000, ( v oid * ) 0xea140000, 0x 00020000, VM _ST AT E_M ASK _FO R_A L L, V M _ST AT E_
FO R_M EM _A PPL ICA T IO N }, { ( v oid * ) 0xea100000, ( v oid * ) 0xea100000, 0x 00020000, VM _ST AT E_M ASK _FO R_A L L, V M _ST AT E_
FO R_M EM _A PPL ICA T IO N }, { ( v oid * ) 0xea120000, ( v oid * ) 0xea120000, 0x 00020000, VM _ST AT E_M ASK _FO R_A L L, V M _ST AT E_
FO R_M EM _A PPL ICA T IO N },
DU M M Y _M M U _EN T RY , }
也可用自动地址映射方式, 将从 BAR 中读取 的基地址加入到 sysPhysMemDesc 表中, 如调用函 数 sy sM muMapA dd( ( void* ) BaseAddr0, ( U INT ) MM U _ Map _ M EM SIZE, ( U INT ) ( 0x03 | 0x0c | 0x30) , ( UINT ) ( 0x 01| 0x04) 实现。
7) 配置 BSP 从硬盘启动, 这一步对 CPCI 驱动程 序开发不是必须的, 但有利于试验验证, 满足实际系统 需求。因为大多数工控机主 IDE 都分配给光驱用, 硬 盘用的是从 IDE, 所以 BSP 配置中, ATA 启动时, 要配 置为从硬盘, 在 conf ig. h 文件中的 DEFAULT _BOOT _LINE 定义时, 描述为 at a= 1, 0( 0, 1) host: / ata0/ vx Works, h= ? e= ? u= target pw= target t n= target , 同

时要修改以下配置项为如下设置:
# define SY S_W A RM _T YP E SY S_W A RM _BIOS # define SY S_W A RM _A T A_CT RL 1 # define SY S_W A RM _A T A_DRIV E 1 # define INCL U DE_A T A # define AT A0_CT R L_T Y PE ( ID E_L OCA L) # define AT A1_CT R L_T Y PE IDE_L O CA L
8) 编译生成 Vx w orks 系统镜像文件, 从硬盘 启动系统, 可验证驱动开发。
6 试验验证
本试验*台是某自研的信号产生、数据采集和 处理系统, 有 多块 信号 产 生和 处理 板卡, 都 基于 CPCI 总线插在不同的插槽, 仪器面板有信号产生 或关闭的指示灯, 信号产生和处理功能执行状态可 通过面板上的若干指示灯来反馈。以信号产生为 例来验证 CP CI 驱动程序, 试验时可在 usr AppInit . c 文件中, 采用前述 方法自动查找多块 板卡, 完成 内存地址映射后, 可创建一个定时器, 周期性地向 CPCI 总线发送指令, 实现信号产生、信号关闭、再 信号产生, 控制面板的信号状态指示灯会直观地显 示点亮、熄灭、再点亮的切换状态, 表示 CPCI 总线 的设备驱动程序开发成功实现。
7 结语
本文采 用 CP CI9054 芯 片, 阐述 了 在嵌 入式 Vx Works 系统下的 CPCI 设备驱动程序开发方法, 并结合一个信号产生、数据采集处理系统的工程实 例, 深刻体会到 PCI 配置空间的重要意义, 同时也 总结了 P CI 设备的查找策略和内存地址映射方法。 采用本文的方法编写的驱动程序已经在某重点型 号课题得到试验 验证, 对 CPCI 总线的 读写、数据 采集性能和可靠性都有很好的表现。本方法即满 足了系统工程的实际需要, 又避开了繁杂的驱动程 序开发方法, 工程可复用性较高。
参考文献
[ 1] 程宏标, 等. 目标自动 跟踪系统的 PCI 总线接 口板设计 [ J] . 火炮发射与控制学报, 2008( 4) : 90~ 93
[ 2] 孔祥营, 柏 桂枝. 嵌 入式 实时 操作 系统 V x Wo rks 及 其 开发环境 T o rnado [ M ] . 北京: 中国电力出版社, 2001
[ 3] 郑彬, 陈华明, 等. V xW or ks 下可加 载的 PCI 驱动程 序 设计[ J] . 微计算机信息, 2008, 11( 2) : 6~ 7
[ 4] 周 启*, 张杨. Vx Wo rks 下 设备 驱动程 序及 BSP 开 发 指南[ M ] . 北京: 中国电力出版社, 2004
[ 5] 何莉, 龚 宗 洋, 等. 基 于 CPCI 总线 的 运 动控 制 卡及 其 VxWo rks 下的驱动设计[ J] . 测控技术, 2008( 8) : 50~ 52




友情链接: