《电子技术应用》

VxWorks5.5下电子盘DMA驱动程序设计与实现

2016年电子技术应用第11期 作者:尹加豹
2016/12/7 14:17:00

尹加豹

(江苏自动化研究所,江苏 连云港222061)


    摘  要: 在嵌入式实时操作系统中,经常需要实时读写硬盘数据,为了提高VxWorks5.5系统下IDE电子盘读写速度,提出了一种基于ICH7-M南桥芯片的DMA模式驱动软件的设计方法。该方法采用风河公司提供的磁盘驱动程序框架,设计了新的读写接口函数,新驱动遵循ATA-6接口协议并采用UDMA2传输模式,可使电子盘读写速度提高十余倍。应用结果表明,该方法运行稳定,系统的实时性提高,充分发挥了电子盘性能。

    关键词: VxWorks5.5;DMA;电子盘;驱动

    中图分类号: 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.

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.

继续阅读>>