admin 管理员组

文章数量: 887021


2023年12月25日发(作者:异步电动机顺序启动是如何实现的)

162010,31(1)计算机工程与设计ComputerEngineeringandDesign嵌入式系统工程0引言NVRAM(non-volatilerandomaccessmemory,非易失性随机访问存储器)是广泛应用于网络路由器的一种存储器件。它如同PC上的CMOS,作用是存放路由器的配置参数。目前常见的NVRAM,大都是静态SRAM,即带有备用电源的SRAM,它的实现最简单,同普通内存操作一样。但是在实际应用中,不是所有的开发板都配备有静态SRAM。在这种情况下,如果使用该方案开发网络路由器,重新加入配备电源的SRAM必须要重新排版,布线。开发周期与开发成本将会大大增加。因此,可以考虑在现有的硬件资源基础上,通过新的方式来实现NVRAM[1]。本文就是以神州龙芯开发的CQ8401开发板为硬件平台,在自行裁剪和移植的嵌入式Linux平台下,利用NorFlash来实现网络路由器的NVRAM功能。1NVRAM新的实现方案分析由于NVRAM仅用于保存启动配置文件(Startup-Config),故其容量较小,通常在路由器上只配置32KB~128KB大小的NVRAM。配备电源的SRAM速度较快,是目前读写最快的存储设备,而成本也比较高。一般的开发板所配备的NorFlash收稿日期:2009-07-17;修订日期:2009-09-18。空间足够大,在系统性能得到满足的前提下,可以把NorFlash分出一个区来当作NVRAM使用。SRAM和NorFlash的对比分析,如表1所示。网络路由器中的NVRAM用于存放配置参数。正常启动路由器后,NVRAM中的内容会拷贝到内存一份,我们对路由器的设置实际上就是修改内存中的参数。所以内存和NVRAM中的内容可以不一样,直到使用writememory将内存设置保存到NVRAM。在系统起来以后,我们可以根据需要修改配备参

徐立松,郭晓金:嵌入式Linux中NVRAM的实现方案及驱动设计数,设定好所有参数或者退出系统时执行信息回写,把数据从内存拷贝回NVRAM。因此,NorFlash读写数据慢的缺点可以规避。在把NorFlash作为NVRAM使用时,不宜过多访问NorFlash,对于通用的NVRAM操作我们可以做下简化。不对一个的变量单独做调用和修改,而对整体做读写操作,本文将重点讲述NVRAM呈现层设计。下面先看一下系统所应用的硬件平台。2010,31(1)172CQ8401开发板与NorFlash开发板以神州龙芯科技有限公司的嵌入式SOC-CQ8401为核心处理器,采用子母板方式,方便调试与扩展,支持32位通用PCI总线设备扩展接口,板载16MBNorFlash。NorFlash的硬件原理图如图1所示。NorFlash型号为INTEL28F128J3D-75,16MB(8M×16Bit),片选为CS0。电阻R26接地(写保护使能)。NorFlash片选地址为0x00000000,系统启动引导程序BOOTLOAD就装在NorFlash中。NorFlash的寻址范围为0x00000000-0x01000000,本系统取NVRAM大小为128K,因此把NorFlash中地址空间0x00ff0000-0x01000000的分区用做NVRAM。2所示),不需要增加额外的控制电路。NorFlash的编程原理是只能将1写为0,而不能将0写为1。所以在Flash编程之前,必须将对应的块擦除,而擦除的过程就是把所有位都写为1的过程,块内所有字节都变为0xFF。擦除NORFLASH器件时是以64~128KB的块进行的。INTEL28F128J3D-75每个sector是128K。3.2NVRAM驱动设计本文所设计的NVRAM驱动是利用NorFlash的分区。对于嵌入式系统来说,NorFlash驱动其实有两个,一个是在系统引导程序BOOTLOAD中(NorFlash最重要的作用就是存储BOOTLOAD),当Linux系统启动后,要重新加载Linux下的NorFlash驱动。Linux系统中,提供了MTD(内存技术设备)系统来建立Flash针对Linux的统一、抽象的接口。在引入MTD后,Linux系统中的Flash设备驱动及接口可分为4层,从上到下依次是;设备节点、MTD设备层、MTD原始设备层和硬件驱动层,如图3所示。底层Flash驱动直接与MTD原始设备层交互,利用其提供的接口注册设备和分区[1-2]。本文的NVRAM驱动设计,可采用两种方案:(1)利用MTD分区,直接划分给NVRAM,操作如同NorFlash通常操作,优点是设计简单,只需修改分区表,即可。但是效率较低。(2)从底层Flash硬件驱动截一分支出来,单独做NVRAM驱动,定义接口。NorFlash的读写访问效率本身就低于SRAM,考虑到系统运行效率,本文采用第2种方案。TE28F128J3D-75NorFlash容量是16M,NVRAM所需空间比较小,128K的容量足以满足要求。为了节省FLASH空间,可以从底CS0#RD#WE#RP#BYTE#R2410kR22R23+3.3VR2510kNC0RSTOUT#10k+3.3V3驱动程序开发任何一个计算机系统的运行都是系统中软硬件协作的结果,设备驱动充当了硬件和应用软件之间的纽带,它使得应用软件只需要调用系统软件的应用编程接口(API)就可让硬件去完成要求的工作。Linux系统的设备驱动是内核的最重要的组成部分,其代码一般占内核代码的50%以上。对于开发驱动程序来说,首先要明白硬件的工作原理与系统接口。本文所设计的NVRAM驱动是使用NorFlash的一个分区,因此,首先要清楚NorFlash的工作原理。3.1NorFlash工作原理NorFlash和CPU的接口属于典型的类SRAM接口(如图NORFlashU6MA24MA23MA22MA21MA20MA19MA18MA17MA16MA15MA14MA13MA12MA11MA10MA9MA8MA7MA6MA5MA4MA3MA2MA1MA0+3.3V56372832A24A23A22A21A20A19A18A17A16A15A14A13A12A11A10A9A8A7A6A5A4A3A2A1A0DQ15DQ14DQ13DQ12DQ11DQ10DQ9DQ8DQ7DQ6DQ5DQ4DQ3DQ2DQ1DQ9363453533D15D14D13D12D11D10D9D8D7D6D5D4D3D2D1D0+3.3VR2110kR26connect:WriteProtectionR260NC29CE22CE114CE054OE#55WE#16RP#31BYTE#5315STS4843VPENGND3VCCQ3742GND2219VCC2GND1VCC1TE28F128J3D-75端分出128K,用做NVRAM。重新划分的分区表如下所示:staticstructmtd_partitionstatic_partitions[]={{.name="BootLoader",区域{.name="Kernel",.size=0x0100000,.offset=0x40000},//内核映像存放的区域.size=0x040000,.offset=0x0},//bootloader存放的图1NorFlash硬件结构

182010,31(1)计算机工程与设计ComputerEngineeringandDesign根文件系统文件系统字符设备节点块设备节点MTD字符设备MTD块设备MTD原始设备Flash硬件驱动图3LinuxMTD系统结构{.name="RamDisk",.size=0x400000,.offset=0x140000},//ramdisk存放的区域{.name="cramfs(2MB)",.size=0x200000,.offset=0x540000},//只读的cramfs区域{.name="jffs2(0.75MB)",.size=0xc0000,.offset=0x740000},//可读写的jffs2区域{.name="nvram(128KB)",.size=0x20000,.offset=0xff0000}//NVRAM区域};驱动程序是应用软件访问硬件的桥梁,对于本系统的NVRAM来说,它在应用层所提供的功能是保存路由器的配置参数,支持修改参数,和显示参数。NorFlash中对特定变量的存取,采取的方法是设置环境变量,可以读取、修改任意变量。在路由器系统启动以后,我们对NVRAM的操作其实是对内存数据的操作,直到执行writeback才会把内存的数据拷贝回NVRAM。哈希表是一种高效的存取特定变量的结构,本文的NVRAM应用层使用哈希表存储路由器信息。它所用到的命令包括:显示变量值(nvramshow);修改变量值(nvramconfig);写回(writeback)。底层驱动需要给应用层提供相应的接口函数。Linux系统设备驱动程序的接口函数,通过file_operation结构体来访问。file_operations变量会在驱动程序初始化时,注册到系统内部。当操作系统对设备进行操作时,会调用驱动程序注册的file_operations结构中的函数指针[3]。应用层程序调用驱动程序接口可以通过命令访问的形式,即通过ioctrl函数。为了方便操作和对驱动进行精简,本文的NVRAM驱动把read、write、llseek操作集成到ioctrl函数中,通过命令供应用程序调用。NVRAM的file_operations结构如下:Staticstructfile_operationsnvram_fops={.owner=THIS_MODULE,.open=open_nvram,.release=release_nvram,.ioctrl=ioctrl_nvram}.owner=THIS_MODULE不是一个操作,它是一个指向拥有这个结构模块的指针。这个成员用来在操作还在被使用时阻止模块被卸载。几乎所有时间中,它被简化为THIS_MOD-ULE,一个在中定义的宏,此项是必须的。.open=open_nvram和.release=release_nvram打开关闭设备操作。.ioctrl=ioctrl_nvram包括了应用层对NVRAM的所有操作的调用函数。staticintioctrl_nvram(structinode*node,structfile*filp,unsignedintcmd,unsignedlongarg){switch(cmd){char*strp;caseNVRAM_SHOW://nvram_read函数封装了对flash特定区域的读取操作strp=nvram_read();…caseNVRAM_WR_BACK://擦除flash中的0x00ff0000-0x01000000扇区sector_erase();//将内存中的哈希表写回flashwrite_nvram(filp,arg);…}}3.3驱动程序的注册驱动程序的入口不同与应用程序的main()函数,它是通过init_module()函数来实现,NVRAM驱动中的init_module()函数如下:unsignedintnvram_major=0;intinit_module(void){intresult;result=register_chrdev(0,"NVRAM",&nvram_fops);if(result<0){printk(KERN_INFO"NVRAM:can'tgetmajornumbern");returnresult;}if(nvram_major==0)nvram_major=result;/*dynamic*/return0;}init_module做了一件事,就是向系统的字符设备表登记了一个字符设备。register_chrdev需要3个参数,参数一是希望获得的设备号,如果是零的话,系统将选择一个没有被占用的设备号返回。参数二是设备文件名,参数三用来登记驱动程序实际执行操作的函数的指针。同样在驱动程序注销的时候调用cleanup_module()函数。voidcleanup_module(void){unregister_chrdev(test_major,"test");}驱动程序成功注册后,应用程序通过命令来调用NVRAM驱动程序函数,实现具体的操作。3.4驱动程序的实现嵌入式Linux中,驱动程序的编译添加分为动态加载和静(下转第129页)

王晓亮:基于Yices对时间自动机的有界模型检测ficiently[C].FormalMethodsinSystemDesign,2005:267-292.[3]JunhaoShi,G[8]2010,31(1)129systemswithBDD-likedata-structures[C].IEEETransSoftwEng,2004:arrett,LeonardoMoura,andresultsofthefirstsatisfiabilitymodulotheoriescompetition(SMT-COMP2005)[J].JournalofAutomatedReasoning,2005,35(4):,HenrikHulgaard,icmodelcheckingoftimedguardedcommandsusingdifferencedecisiondiagrams[J].JournalofLogicandAlgebraicProgram-ming,2002,52-52:53-77.[6]ScottCotton,AndreasPodelski,iabilitycheckingwithdifferenceconstraints[D].Saarbruceken:IMPRSComputerScience,2005.[7]icparametricsafetyanalysisoflinearhybrid[9]DanielLeBerre,entialsoftheSAT2003competition[C].ProceedingsoftheSixthInternationalConfe-renceonTheoryandApplicationsofSatisfiabilityTesting,2003:452-467.[10]GerdBehrmann,AlexandreDavid,ialonuppaal[C].Proceedingsofthe4thInternationalSchoolonFor-malMethodsfortheDesignofComputer,Communication,andSoftwareSystems,LNCS3185,2004.(上接第18页)态加载两种方式。动态加载就是把驱动程序编译成模块,在系统运行时加载;静态加载就是把驱动程序编译进内核,通过运行内核加载。调试程序中,一般使用动态加载,来增加效率。网络路由器中采用的是静态加载方式。在driver/char目录下新建nvram目录,把nvram驱动放到此目录下,并编写makefile,然后在该目录的Kconfig文件中包含nvram配置项目。configcq8401_nvrambool“cq8401nvramdriver”dependsonARCH_CQ8401help…编译内核时在相应菜单中选上此项(选项为Y),编译内核时就会执行该驱动的编译。CQ8401采用mips架构,可以使用mipsle-linux-gcc工具编译。编译好的内核烧写到开发板中,启动系统,NVRAM驱动便可以正常使用了。应用程序就可以通过调用驱动提供的接口,来访问和操作硬件,实现NVRAM的功能[3-6]。从图中可以看出,NVRAM显示了网络路由器的配置信息,结果完全正确[7-9]。5结束语本文阐述了在嵌入式Linux下,NVRAM的一种新的实现方式以及其驱动的开发过程。Linux驱动是嵌入式Linux系统开发的重点问题,也是难点问题。它具有特定的DDI(设备驱动接口)接口,以及系统调度方法。这些也是驱动程序所关心的问题。本文根据NVRAM的特点,以及Linux驱动程序的架构,设计了一套实际可行且精简的操作接口。应用程序通过系统函数接口调用驱动程序,操作简单。驱动程序可移植性与可修改性良好,满足了网络路由器对它的需求。目前该方案已经成功运用与该路由器,效果良好。参考文献:[1][2][3][4][5][6][7][8][9]宋宝华.Linux设备驱动开发详解[M].北京:人民邮电出版社,tandingLinuxnetworkinginternals[M].O'Rreilly&Associates,设备驱动程序[M].北京:中国电力出版社,2000.孙琼.嵌入式Linux应用程序开发详解[M].北京:人民邮电出版社,2007.袁丽慧,彭磊.可重用Linux设备驱动程序框架[J].计算机工程,2008,34(10):89-91.马修,斯通斯.Linux程序设计[M].北京:人民邮电出版社,2007.朱斌,程明霄.嵌入式Linux的PC104数据采集卡的驱动设计[J].计算机工程,2008,34(21):236-238.王辉,王自强.LIRC设备驱动程序的设计和实现[J].微处理机,2008(2):165-167.何亚军,邓飞其.嵌入式Linux中I2C总线驱动程序设计[J].计算机工程与设计,2008,29(10):2517-2519.4NVRAM功能验证与测试系统运行以后我们通过调用NVRAM程序,执行命令来测试NVRAM驱动。NVRAM读写正常,操作方便。操作命令nvramshow的显示结果的部分截图如图4所示。图4NVRAM演示


本文标签: 设备 驱动 驱动程序 系统