《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > VxWorks5.5下电子盘DMA驱动程序设计与实现
VxWorks5.5下电子盘DMA驱动程序设计与实现
2016年电子技术应用第11期
尹加豹
江苏自动化研究所,江苏 连云港222061
摘要: 在嵌入式实时操作系统中,经常需要实时读写硬盘数据,为了提高VxWorks5.5系统下IDE电子盘读写速度,提出了一种基于ICH7-M南桥芯片的DMA模式驱动软件的设计方法。该方法采用风河公司提供的磁盘驱动程序框架,设计了新的读写接口函数,新驱动遵循ATA-6接口协议并采用UDMA2传输模式,可使电子盘读写速度提高十余倍。应用结果表明,该方法运行稳定,系统的实时性提高,充分发挥了电子盘性能。
中图分类号: TP336
文献标识码: A
DOI:10.16157/j.issn.0258-7998.2016.11.009
中文引用格式: 尹加豹. VxWorks5.5下电子盘DMA驱动程序设计与实现[J].电子技术应用,2016,42(11):40-43.
英文引用格式: Yin Jiabao. Development of flash disk DMA driver on VxWorks5.5 operating system[J].Application of Electronic Technique,2016,42(11):40-43.
Development of flash disk DMA driver on VxWorks5.5 operating system
Yin Jiabao
Jiangsu Automation Research Institute,Lianyungang 222061,China
Abstract: In the embedded real-time operating system, reading and writing hard disk data are common. To improve the reading and writing speeds of Integrated Drive Electronics(IDE) Flash disk, a new Direct Memory Access(DMA) driver of south bridge chipset ICH7-M is introduced. This driver uses the hard disk driver framework provided by the WindRiver company and designs new reading and writing functions. This new driver follows the Advanced Technology Attachment with Packet Interface-6(ATA/ATAPI-6) protocol and Ultra DMA Mode-2(UDMA2) is used to read and write. The test result shows that the speed is scaled up more than 10 times, and real-time of the system is improved. This driver is stable and takes full advantage of IDE Flash disk.
Key words : VxWorks5.5;DMA;Flash disk;driver

0 引言

    电子盘又称电子硬盘,它采用符合硬盘接口技术(Advanced Technology Attachment,ATA)工业标准的控制技术,克服了传统机械硬盘的弊病,能够提供高性能和高可靠的数据储存,被广泛应用于工业控制、军工、航空航天等领域[1]。VxWorks是风河公司开发的嵌入式实时操作系统,其中VxWorks5.5版本具有较高的可靠性和卓越的实时性,在很多领域都有广泛的应用[2]。但是VxWorks5.5系统原生电子盘驱动仅支持过程输入输出(Process Input Output,PIO)方式,存取速度较慢,无法满足某些应用的实时性要求,需要设计基于直接存储器存取(Direct Memory Access,DMA)方式的驱动,以提升电子盘读写速度,扩展其应用领域。

1 硬件环境

    硬件平台为中船重工第七一六研究所生产的CM6066单板加固计算机。该计算机主板采用Intel Core Duo L2400/L2500低功耗处理器, 配以Intel 945GM芯片组,南桥芯片为ICH7-M(82801GBM),提供的接口包括SATA、ATA/IDE、USB2.0、千兆以太网及串口等,主要功能框图见图1。

qrs1-t1.gif

    该计算机模块搭载的电子盘为源科公司生产的飞龙V系列闪存硬盘,它采用NandFlash闪存芯片,基于标准的ATA/IDE端口,支持ATA-6协议。

2 硬盘工作原理分析

    硬盘的读写是一个复杂的过程,它涉及到硬盘的接口方式、寻址方式、控制寄存器模型等。硬盘的存储介质也从最初的磁性材料、光磁介质发展到半导体存储材料,但不同硬盘的读写方法和寻址方式都一样,因为不同硬盘都遵循ATA协议。ATA协议的最新版本为ATA-8,ATA-6及之前的版本仅支持IDE接口,从ATA-7开始,协议增加了对SATA接口的支持。在ATA-6协议中,硬盘参数信息共占用512 B,分为256个WORD,表1简单说明了部分字节代表的意义。

qrs1-b1.gif

    在ATA-6协议中,CPU与硬盘设备的通信是通过读写设备接口上的寄存器实现的。接口寄存器分为两组,一组为命令块寄存器,用于CPU向设备发送命令或从设备读取状态;另一组为控制块寄存器,用于CPU控制设备或获取备用状态,如表2所示。

qrs1-b2.gif

    各接口寄存器功能如下所述:

    数据寄存器:用于CPU与硬盘设备之间的数据交换,该种方式即PIO模式,DMA传输不使用该寄存器;

    错误寄存器:用于记录硬盘执行命令后的出错信息;

    特征寄存器:用于存储命令代码;

    扇区计数寄存器:用于存储要读/写的扇区总数;

    LBA高/中/低8位寄存器:用于LBA寻址;

    设备寄存器:用于使能被选设备并提供配置信息;

    状态寄存器:用于记录硬盘设备执行命令后的状态;

    命令寄存器:用于执行命令;

    备用寄存器:其内部数据与状态寄存器相同;

    设备控制寄存器:用于控制硬盘设备。

3 驱动程序设计

3.1 驱动与文件系统关系

    VxWorks下的设备包括字符设备、块设备和网络设备等,电子盘等存储设备属于块设备,此类型设备以“块”为单位进行数据操作,可大大提高数据的访问速度,但也带来了巨大的数据维护工作量,因此,块设备驱动程序与I/O系统之间还存在一个中间层,即文件系统[4]。VxWorks使用的dosFs文件系统是一种与MS_DOS文件系统兼容的文件系统,能够满足实时应用的多种需求[5]。dosFs文件系统以簇为单位读写数据,每簇包含64个扇区,每一个扇区(512 B)为一个存储块,所以一次读写4 KB数据[6]。应用程序访问电子盘数据时,I/O系统会调用文件系统计算出相应扇区的地址及数量,而后文件系统再调用电子盘驱动程序访问电子盘,完成读写操作。以读操作为例,具体过程如图2所示[7]

qrs1-t2.gif

3.2 初始化

    电子盘在PIO模式下,仅使用命令块寄存器中的数据寄存器进行数据交换,传输过程十分简单,但在DMA模式下需要专用的IDE控制器,传输过程比较复杂。IDE控制器集成在ICH7-M芯片组中,是标准PCI设备,在256 B的配置空间中,偏移0x20的寄存器配置为IDE主控寄存器组基地址。主控寄存器组包含3个寄存器,分别为主控命令寄存器、主控状态寄存器、物理设备描述符表指针寄存器,各寄存器地址映射如表3所示。

qrs1-b3.gif

    在初始化过程中,首先搜寻PCI-IDE控制器并获取寄存器基地址、中断信号量等信息,之后分配必要的资源,如同步信号量、看门狗、PRDT表等,然后挂接中断服务程序,建立CPU与控制器的连接。连接成功后首先获取电子盘参数信息,然后根据参数设置读写传输模式和其他一些支持的属性,如电源管理、SMART指令等。在电子盘设备初始化过程中,CPU会向设备发送指令来进行操作。发送指令时, CPU先填写各种指令参数到相关寄存器中, 然后向命令寄存器发送命令字启动指令, 之后设备开始执行指令[9]

    指令执行一般要经过以下几种状态:

    (1)发送指令, 进入等待状态;

    (2)设备执行完指令后发出中断,检验设备状态;

    (3)如状态正确, 则进行后续操作;否则返回。

    设置数据传输模式时,为保证电子盘能够更高效工作,优先选择UDMA传输模式;若电子盘不支持UDMA,则选择MDMA模式;若不支持MDMA,则选择SDMA模式;若不支持SDMA,则选择PIO模式。

3.3 DMA读写设计

    每一次DMA传输都需要设置一系列寄存器,使得开销很大,然而文件系统对硬盘的I/O请求是不连续的,物理内存中的数据也是不连续的。为了提高传输效率,需要将不连续的数据组合在一起,再启用DMA操作,这些数据就能够一次传输完成。为此,DMA传输使用了物理设备描述符表(Physical Region Descriptor Table,PRDT),表中的描述符指向内存缓冲区的起始地址和长度,这样一次DMA传输,即可将表中记录的数据都传输完成,PRDT表结构示意图如图3所示。

qrs1-t3.gif

    在PRDT表中,每个描述符占8 B,前4 B指向缓冲区地址,后4 B低16 bit表示缓冲区长度,地址和长度的第0位必须为0,当缓冲区长度为0时,数据长度为64 KB,EOT位为缓冲区结束标志位(为1表示当前缓冲区为最后一个)。当执行DMA读时,控制器将电子盘中扇区数据读到各个内存缓冲区中;当执行DMA写时,控制器将各个缓冲区中数据写入对应的扇区中。

    通常情况下,硬盘的DMA读写过程一般需要如下几个步骤:

    (1)首先判断硬盘状态,当其处于就绪状态才可以进行操作;

    (2)填写控制器相关寄存器指定起始逻辑块(LBA寻址方式)和扇区总数;

    (3)启动控制器,开始读写操作;

    (4)读写完毕后,提起中断通知。

    在VxWorks5.5中,电子盘驱动读写硬盘的接口读函数定义为ataBlkRd,写函数定义为ataBlkWrt,读写函数最终调用ataBlkRW实现读写功能。该函数定义为STATUS ataBlkRW(ATA_DEV *pDev,sector_t startBlk,UINT32 nBlks,char *pBuf,int direction)[10]。该接口函数仅使用PIO模式进行读写操作,需要使用DMA读写模式将其重新实现。具体过程如下:

    (1)将主控状态寄存器的Interrupt及Error位置1,清除错误、中断等状态值;

    (2)设置主控命令寄存器的R/W位,读电子盘时,设为1,写电子盘时,设为0;

    (3)将PRDT表地址写入描述符表指针寄存器,并根据缓冲区地址及长度配置PRDT表;

    (4)将要传输的扇区地址、数量等信息写入ATA设备寄存器,方法如下:在LBA 48b寻址模式下,首先将要读取(写入)的扇区数高8位、低8位写入Sector Count寄存器,然后将LBA(31:24)、LBA(7:0)写入LBA Low寄存器;将LBA(39:32)、LBA(15:8)写入LBA Mid寄存器;将LBA(47:40)、LBA(23:16)写入LBA High寄存器;接着配置Device寄存器,其bit 4表示设备号,主盘置0,从盘置1,bit 6表示LBA寻址,需置1;最后将操作指令写入Command寄存器,读操作指令为0x25,写操作指令为0x35;

    (5)主控命令寄存器的Start/Stop位置1,开启DMA传输;

    (6)待传输结束后,硬盘发出一个中断请求,PCI-IDE控制器随之向CPU提起中断;

    (7)响应中断后,将主控状态寄存器的Interrupt位置1,清除中断信息;

    (8)最后将主控命令寄存器的Start/Stop位置0,关闭DMA传输。

4 试验结果与分析

    在CM6066单板加固计算机(南桥芯片为ICH7-M,即82801GBM)上测试新设计的DMA模式驱动,测试结果显示可成功读写电子盘文件,接着对读写速度进行测试,并与原生PIO方式驱动的读写速度进行对比。测试方法如下:采用系统自带函数tickGet()进行计时,测试写速度时将一段内存数据(200 MB)写入电子盘中;测试读速度时将电子盘中文件(200 MB)读入内存中,由此可计算出读写速度[11]。分别使用两种驱动进行测试,结果表明,采用DMA方式的驱动可显著提升电子盘读写速度,具体数值见表4。

qrs1-b4.gif

5 结束语

    本文开展的基于VxWorks5.5系统的电子盘DMA驱动软件的研究具有很大的实用价值,以Intel ICH7-M芯片为硬件平台,完成了新驱动的设计与实现,并通过应用测试证明该设计行之有效,能够显著提升电子盘性能。该驱动程序工作稳定、性能可靠、实时性较好,目前已应用在某电子海图项目中,可大幅缩短海图文件的加载时间,实现了海图的快速拖拽及缩放功能。该驱动亦可应用于其他要求高实时性的工业控制领域。

参考文献

[1] 潘惠芹.电子盘的设计及实现[J].计算机工程,2004,30(16):194-197.

[2] 陈学兵,沈毅男,张振华.VxWorks5.5在龙芯2号处理器的移植和性能分析[J].计算机测量与控制,2012,20(9):2542-2545.

[3] MCLEAN P T.AT attachment with packet interface-6(ATA/ATAPI-6)[R].USA:American National Standards Institute,2002:115-126.

[4] WindRiver.VxWorks programmer′s guide 5.5[M].USA:WindRiver,2002.

[5] 王晋东,黄海,王坤,等.基于VxWorks的dosFs文件系统分析与实现[J].微计算机信息,2008,24(32):85-87.

[6] 张辉,陈昕,沈晶晶,等.大容量机载存储系统设计与仿真评价[J].电光与控制,2014,21(5):104-108.

[7] 张杨,于银涛.VxWorks内核、设备驱动与BSP开发详解[M].北京:人民邮电出版社,2009.

[8] Intel Corporation.Intel ICH7 family datasheet[M].USA:Intel,2006.

[9] 李志鹏,王立强,康建斌,等.连续数据记录系统中IDE数据接口的实现[J].无线电工程,2010,40(2):48-50.

[10] 曹桂平.VxWorks设备驱动开发详解[M].北京:电子工业出版社,2011.

[11] 毛晓梅.基于VxWorks6.6系统的SATA控制器驱动技术研究[J].工业控制计算机,2013,26(11):129-133.

此内容为AET网站原创,未经授权禁止转载。