基于嵌入式arm-linux的电子相册设计学士学位毕业设计(论文)_第1页
基于嵌入式arm-linux的电子相册设计学士学位毕业设计(论文)_第2页
基于嵌入式arm-linux的电子相册设计学士学位毕业设计(论文)_第3页
基于嵌入式arm-linux的电子相册设计学士学位毕业设计(论文)_第4页
基于嵌入式arm-linux的电子相册设计学士学位毕业设计(论文)_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

学士学位毕业设计(论文)基于嵌入式ARM-Linux的电子相册设计学生姓名:学号:指导教师:所在学院:专业:中国·2013年05月本科毕业设计(论文)任务书学生姓名所在班级导师姓名导师职称论文题目基于嵌入式ARM-Linux的电子相册设计题目分类1.应用与非应用类:〇工程〇科研〇教学建设〇理论分析〇模拟2.软件与软硬结合类:〇软件〇硬件〇软硬结合〇非软硬件(1、2类中必须各选一项适合自己题目的类型在〇内打√)主要研究内容及指标:研究内容:以嵌入式硬件设备为基础,软件为核心,设计一种可插SD卡且方便携带的电子相册。实现图片的浏览、查找及定时更换等功能。并对系统的软、硬件程序设计与测试。设计要求:绘制硬件原理图,编制bootloder、硬件驱动及应用层软件;完成毕业设计说明技术要求:1)通过LED输出显示;2)主要采用ARM芯片控制电路、显示电路、电源电路;3)可随时更换相片,具有USB通信功能;4)与PC之间进行串行通信;5)可外扩SD存储卡,曾加照片容量。主要参考文献:[1]博韦,西斯特(著),陈莉君,张琼声,张宏伟(译),深入理解LINUX内核(第三版),中国电力出版社,2007.9[2]邵贝贝,单片机嵌入式应用的在线开发方法,清华大学出版社,2004.11[3]张友德、谢伟毅,单片机原理与应用技术,机械工业出版社,2004.3[4]Matthew,N,Stones,R,BeginningLinuxProgramming,ElectronicProducts,2010.6阶段规划:第一周--第三周查阅和收集课题资料,并分析嵌入式系统的简要工作过程。第四周--第十周总体方案设计,绘制电路原理图,对数据分析并设计最优电路。第十一周--第十五周编程、调试第十六周--至今整理论文准备答辩开题时间完成论文时间专家审定意见:系主任签字:年月日注:1.任务书由指导教师填写后交给学生,要求学生妥善保存。2.此任务书夹于论文扉页与论文一并装订,作为论文评分依据之。摘要摘要PAGE———PAGE36—摘要随着数码相机的盛行,传统相机逐渐退出历史的舞台。对于数码相片的欣赏和摆设,人们一般只能通过PC机,极其不方便。电子相册正是迎合这种需求,它体积小,能随时更换相片,并具有USB传输功能,能够即插即用,拥有较大的存储空间。本设计采用了比较通用的S3C2410系列处理芯片为主芯片和源代码开放的嵌入linux操作系统共同建立的平台设计了电子相册系统,主要实现的功能有对多种格式相片在640*480LCD触摸屏上以幻灯形式播放、USB读取等功能。该设计具有成本低,功能强大等特点。针对nandflash启动的支持,实现了启动引导程序U-BOOT的修改和移植,以及嵌入式linux内核的裁剪和驱动的修改,包括nandflash分区、LCD驱动修改等;在软件开发的同时,我们根据该项目设计需求,完成了电路原理图和PCB版图的设计。关键词:S3C2410;nandflash;LCD触摸屏;linuxABSTRACTABSTRACTWiththeprevalenceofdigitalcamera,traditionalcameragraduallywithdrawfromthestageofhistory.Fordigitalphotoappreciationanddecoration,peoplegenerallyonlythroughthePCmachine,isnotveryconvenient.Electronicphotoalbumistomeetthisdemand,itissmallinsize,canbereplacedatanytimeandphoto,withUSBtransmissionfunction,canplugandplay,hasalargerstoragespace.ThisdesignusesthejointestablishmentofembeddedoperatingsystemoflinuxseriesS3C2410chipasthemainchip,andopensourcegeneralplatformdesignofelectronicalbumsystem,themainfunctionofavarietyofphotosinthe640*480LCDtouchscreenintheslideshowbroadcast,USBreadfunctions.Thedesignhastheadvantagesoflowcost,powerfulfeatures.Thenandflashstartupsupport,realizethebootloaderofthemodificationandtransplantationofU-BOOT,andtheembeddedLinuxkernelcuttinganddrivemodifications,includingnandflashpartition,LCDdrivermodification;insoftwaredevelopmentandatthesametime,weaccordingtothedesignrequirementsoftheproject,completedthedesignofthecircuitprinciplediagramandPCBlayout.Keywords:S3C2410;Nandflash;LCDtouchscreen;Linux目录目录摘要 IABSTRACT II目录 III前言 IV1绪论 11.1电子相册市场成长的必然性 11.2电子相册未来产品的发展 11.2.1数码相框 11.2.2电子相册 11.3目前市场上流行三种系统设计架构 21.3.1单芯片解决方案 21.3.2以DSP+FPGA等硬件为基础,用软件算法实现功能 21.3.3ARM9核心方案 22硬件设计方案 32.1采用此硬件方案的优势 42.2采用Linux操作系统的优势 42.3硬件的设计方案 52.3.1S3C2410简介 52.3.2SDRAM存储接口电路 62.3.3NANDFLASH存储电路 72.3.4电源模块 92.3.5USB电路模块 92.3.6LCD电路模块 102.4小结 123Linux系统的建立 133.1Linux的启动过程 133.2启动代码和BootLoader 153.3U-BOOT的简介 173.4U-BOOT的移植和修改步骤 193.4.1U-BOOT由NandFlash启动概述 193.4.2U-BOOT基本配置移植步骤 193.4.3U-BOOT对NandFlash命令的支持 203.4.4启动代码的移植 203.4.5NandFlash环境参数的设置 213.5Linux内核移植 213.5.1LCD驱动分析和修改 223.5.2配置图形 223.6文件系统的创建 223.6.1创建根文件系统 233.6.2yaffs文件系统的移植 233.7嵌入式图形用户界面系统概述 233.7.1图形用户界面(GUI)系统简介 233.7.2嵌入式图形用户界面简介 243.7.3Qt/Embedded简介 243.8Qt/Embedded核心技术 253.8.1信号与槽 253.8.2对象模型 253.8.3国际化 263.8.4FrameBuffer 273.8.5Qt/Embedded工具 283.8.6Qt/Embedded的移植 293.9小结 294基于嵌入式的电子相册应用程序设计 294.1图片播放模块 294.1.1程序实现功能及说明 294.1.2关键代码实现 314.2移动设备读取模块 324.2.1程序实现功能及说明 324.2.2关键代码实现 334.3设置模块 344.3.1程序实现功能及说明 344.3.2关键代码实现 354.4小结 36结论 1参考文献 1致谢 1附录Ⅰ 1附录Ⅱ 1前言前言随着数码相机的大量普及和人们对多媒体娱乐播放的需求,各种记忆卡越来越多地被运用于存放数码照片和多媒体文件。不同用户的计算机中存满各种照片,连桌上相框中照片的更换频率也提高了。先输出照片,然后更换到相框中,这样的程序比较烦琐,常常要通过计算机才能将相片进行显示与分享。对数码相片进行便捷的显示、分享、编辑、删除、打印等操作逐渐成为市场的需求。电子相框,数码伴侣等概念型产品逐渐出现在数码市场,电子相册也由概念型产品进入市场已有六、七年。目前,电子相册产品主要应用于礼品市场,其真正的目标用户却是非常广泛的,并且它的最终消费人群应该是以家庭为主的普通消费者,其应用的领域将更广阔。国内也有厂家很早就注意到这类产品的良好的发展趋势,例如曾作为NHJMP4中国地区总代理的北京中电金捷数码科技有限公司,就及时地推出了自有品牌的金捷电子相册,并且以出众的外观设计和良好的口碑效应,以及亲民的价格赢得了市场的青睐。结论大学毕业设计(论文)1绪论1.1电子相册市场成长的必然性(1)市场需求的必然性在上世纪末本世纪初,电子相册呈现迅速发展的势头,普及型数码相机的分辨率由200万象素增长到现在的800—1500万象素,价格也由300美元左右下降到现在的120美元左右。随着数码相机的日益普及,作为一种以数字照片的保存、回放和浏览为核心功能的产品——电子相册自然迎合了消费者的需求。(2)核心器件性能和价格的合理化推动市场的发展电子相册有三大核心器件:处理器,半导体存储器和LCD显示单元。随着ARM的不断发展,电子相册所需要的ARM+Jpeg处理器技术已为许多厂商所拥有,集成了USBHost及卡接口单元的产品也屡见不鲜。Nandflash技术飞速发展,单位容量的价格在过去的六年中约下跌40至50倍。1.2电子相册未来产品的发展1.2.1数码相框数码相框将是以数字照片的重显为主要功能的产品,其功能更接近于传统意义上的相框。由于受到人机界面的限制,为更方便地重显和浏览以及确定重显的规则,这类产品不强调有大容量的内存以及丰富的卡接口。主要特征是:(1)USB接口以便更新和同步数据;(2)在某些情况下(如从PC端通过相框的USB接口同步数据时),允许修改数字照片的格式,使其有最佳的重显效果;(3)仅依靠内置的半导体存储器存放需要重显的数字照片;(4)文件(照片)查询和播放规则设定非常简洁易用;(5)产品大致分为桌面和壁挂两种。1.2.2电子相册电子相册是以数字照片的存储和浏览为主要功能的产品由于需要满足跟PC相同的类似功能,这类产品的主要特征是:(1)有大容量的内置数据存储器;(2)USB等各种卡接口,并支持内部存贮器与各种数据存贮器之间的同步以及相互拷贝;(3)强大的文件管理功能:浏览,搜寻,命名(重命名),复制,删除,备份等;(4)带或不带内建显示单元,有能支持其它高分辨率显示设备的接口(如色差,VGA甚至是HDMI);与其他产品的功能结合的产品形态以及大头贴等产品,用于不在本文所包含的范围内。1.3目前市场上流行三种系统设计架构1.3.1单芯片解决方案以单芯片的解决方案,以ESS/AMLOGIC/MPX等芯片设计为代表,PHILIP/Sony等品牌厂商也以该方式为主。该方案的优点:(1)结构简单,成本低,芯片功能强大;(2)多媒体的编解码速度快。该方案的缺点:(1)可扩展的余地不足;(2)对读卡部分,某些方案使用硬件实现,不能支持新类型的卡;(3)应客户要求的二次开发比较不方便。1.3.2以DSP+FPGA等硬件为基础,用软件算法实现功能这种方案,是以DSP来实现多媒体部分的编解码算法,再由FPGA实现显示输出格式的算法转化;读卡部分,文件系统部分由DSP软件处理,外围设备大的驱动由DSP的软件算法实现。这种方案的优点:功能扩展升级性强,软件实现读卡部分,新的类型卡,外围设备可以通过升级方式实现。这种方案的缺点:(1)整体成本比较大;(2)客户二次开发难度大。DSP和FPGA的算法实现需要专业人员;(3)显示输出由FPGA实现,该类输出大部分是数字的输出,模拟输出支持比较弱。1.3.3ARM9核心方案以ARM9等强大的CPU为核心,以WINCE、LINUX等操作系统为软件核心架构系统。此方案以ARM如S3C2410、Intelxscale等强大的嵌入式CPU为架构,速度在200M-300MHZ。嵌入WINCE、LINUX等操作系统,实现多媒体的编解码。该方案的优点:(1)系统芯片功能强大,实现的功能多,对于新的多媒体格式支持好,只需要安装更新的软件;(2)硬件电路简单;(3)二次开发容易实现。该方案的缺点:(1)成本较大,该类强大的CPU一般使用在PDA等嵌入式领域;(2)比较耗电,使用软件解码功耗与频率相关性很大。2硬件设计方案本设计选用的是第三种方案:以ARM9CPU_S3C2410为核心,以Linux操作系统为软件核心架构。基于ARM的微处理器具有低功耗、低成本、高性能等特点,ARM采用RISC(精简指令集计算机)架构和流水线结构,使用了大量的寄存器,具有极高的工作效率。其中,RISC架构具有如下特点:固定长度的指令格式,指令归整、简单,基本寻址方式只有2~3种,使用单周期指令,便于流水线操作。ARM微处理器按性能分为以下系列:ARM7,ARM9,ARM9E,ARM10E,SecureCoreXscale。ARM支持两种类型的指令集:一种是32位的ARM指令,以字对准保存;另一种是16位的Thumb指令,半字对准保存。ARM具有7种工作状态:USR:正常的程序执行状态FIQ:用于高速数据传输或通道处理IRQ:用于通用的中断处理SVC:操作系统使用的保护模式ABT:用于虚拟存储及存储保护UND:当出现未定义指令终止时进入该模式SYS:运行具有特权的操作系统任务在ARM体系中有一个重要的概念——异常:当正常的程序执行流程发生暂时的停止时就叫做异常,例如处理一个外部的中断请求。在处理异常之前,当前的处理器状态必须被保留,当异常处理完后,异常发生前的程序可以继续执行。处理器允许多个异常同时发生,它们将会按固定的优先级进行处理。ARM支持的异常类型有:复位:复位电平有效时,产生复位异常;未定义指令:遇到不能处理的指令时,产生未定义指令异常;软件中断:执行SWI指令产生,用于用户模式下的程序调用特权操作指令;指令预取中止:处理器预取指令的地址不存在,或该地址不允许当前指令访问,产生指令预取中止异常;数据中止:处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常;中断服务请求:外部中断请求有效,且CPSR中的1位为0时,产生IRQ异常;快速中断请求:快速中断请求引脚有效,且CPSR中的F位为0时,产生FIQ异常。2.1采用此硬件方案的优势如上所述:(1)系统芯片功能强大,实现的功能多,对于新的多媒体格式支持性好,只需要安装更新的软件;(2)硬件电路简单,可采用标准电路,不需耗费过多的资源(人力,资金等);(3)可以在硬件上增加模块,留作二次开发使用,极为方便;(4)S3C2410是一个比较成熟的芯片,技术积累齐全;(5)S3C2410支持丰富的存储卡接口。2.2采用Linux操作系统的优势Linux是一种自由和开放源码的类Unix操作系统。目前存在着许多不同的Linux,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,从手机、平板电脑、路由器和视频游戏控制台,到台式计算机、大型机和超级计算机。Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU工程各种工具和数据库的操作系统。Linux是我国软件的国策,尤其是在IT行业,庞大的使用群体、开放的体系和丰富资源使得Linux将是日后普及和推广的重点。Linux的优越性日益凸显Linux将是我们学习和工作实用的首选。目前,很多网络技术、服务器、网络设备都是基于Linux操作系统,并且在不少时尚的手机、PDA、媒体播放器等消费类电子产品中已经广泛使用Linux作为操作系统。在Linux软件国策的指引下,Linux已经得到很大的普及。很多学生已经自发地通过书籍、互联网等资源学习Linux。综上所述,提高技术水平就是以市场流行需求为导向进行研发,特别是像嵌入式种工程类的技术。在条件允许的情况下,我们甚至应该时刻与国际接轨,掌握当前最领先的技术。2.3硬件的设计方案根据前面所提出的系统方案,本课题所研究的系统应该包括以下功能:支持USB接口存储设备的读写;支持常用格式图片的浏览(jpg、Bmp、gif等);支持彩色LCD屏,图形化界面显示。2.3.1S3C2410简介Samsung公司推出的16/32位RISC处理器S3C2410A,为手持设备和一般类型应用提供了低价格、低功耗、高性能小型微控制器的解决方案。S3C2410为手持设备和一般类型应用提供了低价格、低功耗、高性能小型微控制器的解决方案。采用272脚FPGA封装,内含一个ARM920T内核。为了降低系统成本,S3CARM9-S3C2410处理器,ARM920T核由ARM9TDMI、存储管理单元,MMU和高速缓存三部分组成。其中MMU可以管理虚拟内存,高速缓存由独立的16KB地址和16KB数据高速Cache组成。ARM92T0有两个内部协处理器:CP14和CP15。CP14用于调试控制CP15用于存储系统控制以及测试控制。总的资源如下:・内核工作电压为1.2V,内存工作电压兼容1.8V/2.5V/3.3V,外围I/O口使用3.3V,集成16KB的指令缓存和16KB的数据缓存,带MMU(MemoryManagementUnit),支持SRAM和SDRAM等内存。・LCD控制器接口(最高支持4K色的STN和256K色的TFT)・4通道DMA控制器・3通道UART・2通道SPI接口・IIC总线接口・IIS音频编解码数据接口・AC97音频接口・MMC/SD存储卡接口・2通道USB传输接口和1个复用的USB设备接口・4通道PWM(脉宽调制)定时器和1个看门狗定时器・8通道10位ADC和一个触控屏接口・实时时钟・130个GPIO口和24通道外部中断源接口・片上PLL时钟发生锁相环总的方案图如图2.1:LCD显示LCD显示ARM芯片S3C2410RESET电路SDRAMNandFlash时钟电路USB接口电源图2.1硬件系统框图2.3.2SDRAM存储接口电路SDRAM:同步动态随机存储器,同步是指Memory工作需要同步时钟,内部的命令的发送与数据的传输都以它为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;随机是指数据不是线性依次存储,而是自由指定地址进行数据读写。SDRAM从发展到现在已经经历了四代,分别是:第一代SDRSDRAM,第二代DDRSDRAM,第三代DDR2SDRAM,第四代DDR3SDRAM.(显卡上的DDR已经发展到DDR5)第一代SDRAM采用单端(Single-Ended)时钟信号,第二代、第三代与第四代由于工作频率比较快,所以采用可降低干扰的差分时钟信号作为同步时钟。SDRAM之所以成为DRARM就是因为它要不断进行刷新(Refresh)才能保留住数据,因此它是DRAM最重要的操作。那么要隔多长时间重复一次刷新,目前公认的标准是,存储体中电容的数据有效保存期上限是64ms(毫秒,1/1000秒),也就是说每一行刷新的循环周期是64ms。这样刷新速度就是:行数量/64ms。我们在看内存规格时,经常会看到4096RefreshCycles/64ms或8192RefreshCycles/64ms的标识,这里的4096与8192就代表这个芯片中每个Bank的行数。刷新命令一次对一行有效,发送间隔也是随总行数而变化,4096行时为15.625μs(微秒,1/1000毫秒),8192行时就为7.8125μs。HY57V561620为8192refreshcycles/64ms。本设计采用32M的HY57V56162来设计SDRAM存储电路,它的单片内存规格为256Mbit4M*16bit*4Banks,即容量为32MB的16位SDRAM。使用S3C2410的nGCS6片选信号HY57V56162的数据总线与上S3C2410的低16位相连。操作地址的最小值变为0x00000004,所以将S3C2410的ADDR2-ADDR14顺序与HY57V56162的A0-A12相连。为了能够正确访问HY57V56162高/低位字节数据,又将HY57V56162的LDQM和UDQM分别与nBE0:nWBE0:DQM0和nBE1:nWBE1:DQM1相连,HY57V56162的BA0、BA1是SDRAM内部BANK选择地址线,代表着SDRAM内存的最高地址,因为两片HY57V56162组成了64M的内存,也就是说要26根地址线来实现寻址,所以将BA0、BA1分别与S3C2410的ADDR24和ADDR25引脚相连。原理图如图2.2所示:图2.2SDRAM存储电路2.3.3NANDFLASH存储电路Nand-flash内存是flash内存的一种,其内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案。Nand-flash存储器具有容量较大,改写速度快等优点,适用于大量数据的存储,因而在业界得到了越来越广泛的应用,如嵌入式产品中包括数码相机、MP3随身听记忆卡、体积小巧的U盘等。NOR和NAND是现在市场上两种主要的非易失闪存技术。Intel于1988年首先开发出NORflash技术,彻底改变了原先由EPROM和EEPROM一统天下的局面。紧接着,1989年,东芝公司发表了NANDflash结构,强调降低每比特的成本,更高的性能,并且象磁盘一样可以通过接口轻松升级。但是经过了十多年之后,仍然有相当多的硬件工程师分不清NOR和NAND闪存。许多业内人士也搞不清楚NAND闪存技术相对于NOR技术的优越之处,因为大多数情况下闪存只是用来存储少量的代码,这时NOR闪存更适合一些。而NAND则是高数据存储密度的理想解决方案。NANDflash的单元尺寸几乎是NOR器件的一半,由于生产过程更为简单,NAND结构可以在给定的模具尺寸内提供更高的容量,也就相应地降低了价格。NandFlash读和写操作采用512字节的块,这一点有点像硬盘管理此类操作,很自然地,基于NAND的存储器就可以取代硬盘或其他块设备。NORflash占据了容量为1~16MB闪存市场的大部分,而NANDflash只是用在8~128MB的产品当中,这也说明NOR主要应用在代码存储介质中,NAND适合于数据存储,NAND在CompactFlash、SecureDigital、PCCards和MMC存储卡市场上所占份额最大。当前NORFLASH价格比较昂贵,考虑到成本问题,本设计采用了64M的K9F1208U0BNandFlash作为介质存储电路,将K9F1208U0B的I/O[0-7]与上S3C2410的数据总线DATA[0-7]相连,实现数据的读写。S3C2410中NandFlash控制器的R/nB与K9F1208U0B的R/nB相连,可以检查nFCE/GPA22、nFRE/GPA20、nFWE/GPA19分别与K9F1208U0B的CLE、nCE、nRE、new是否相连。分别可以控制K9F1208U0B的地址锁存使能、命令锁存使能、片选使能、读使能和写使能。原理图如图2.3所示:图2.3NandFlash存储电路2.3.4电源模块S3C2410的电源引脚分为:VDDalive引脚给处理器复位模块和端口寄存器提供1.8V电压;VDDi和VDDiarm为处理器内核提供1.8V电压;VDDi_MPLL提供1.8V模拟电源和数字电源;VDD_UPLL为UPLL提供1.8V模拟电源和数字电源;VDDOP和VDDMOP分别为处理器存储端口提供3.3V电压;VDDRTC为处理器内的ADC系统提供3.3V电压;VDDRTC为时钟电路提供1.8V电压,该电压在系统掉电后仍需要维持。在该系统中,需要使用1.8V和3.3V的直流稳压电源。为简化系统电源电路的设计,要求整个电路系统的输入为高质量的5V直流稳压电源然后采用两个LM117电压稳压器转成3.3V的VDD和VCC;再采用IN4148稳压管来保证电源输入电压的稳定性。VDDRTC是通过一个外置电池,再加4个IN4148稳压管串联组成。复位电路是用一个74HC14反施密特触发芯片实现两级非门是用于按钮去抖动和波形整形;nRESET端的输出状态与RESET端输出状态相反,用于低电平复位的器件。电源电路如图2.4所示:图2.4电源电路2.3.5USB电路模块USB接口可用于连接多达127个外设,如鼠标、调制解调器和键盘等。USB自从1996年推出后,已成功替代串口和并口,并成为当今个人电脑和大量智能设备的必配的接口之一。目前USB设备虽已被广泛应用,比较普遍的是USB2.0接口,它的传输速度为480Mbps。USB2.0将设备之间的数据传输速度增加到了480Mbps,比USB1.1标准快40倍左右,速度的提高对于用户的最大好处就是意味着用户可以使用到更高效的外部设备,而且具有多种速度的周边设备都可以被连接到USB2.0的线路上,而且无需担心数据传输时发生瓶颈效应。USB采用四线电缆,其中两根是用来传送数据的串行通道,另两根为下游(Downstream)设备提供电源,对于高速且需要高带宽的外设,USB以全速12Mbps的传输数据;对于低速外设,USB则以1.5Mbps的传输速率来传输数据。USB总线会根据外设情况在两种传输模式中自动地动态转换。USB是基于令牌的总线。类似于令牌环网络或FDDI基于令牌的总线。USB主控制器广播令牌,总线上设备检测令牌中的地址是否与自身相符,通过接收或发送数据给主机来响应。USB通过支持悬挂/恢复操作来管理USB总线电源。根据S3C2410内部的USB控制器,它的接口规范:主机接口的正负数据线分别接15K欧姆的下拉电阻,并且分别通过22欧姆的电阻与CPU的Dpn和DNn相连;设备接口的正数据线要接1.5K欧姆的上拉电阻,而负数据线接470欧姆的下拉电阻,正负数据线与CPU之间接22欧姆的终端电阻。控制器原理图如图2.5所示:图2.5USB接口电路2.3.6LCD电路模块LCD的构造是在两片平行的玻璃基板当中放置液晶盒,下基板玻璃上设置TFT(薄膜晶体管),上基板玻璃上设置彩色滤光片,通过TFT上的信号与电压改变来控制液晶分子的转动方向,从而达到控制每个像素点偏振光出射与否而达到显示目的。现在LCD已经替代CRT成为主流,价格也已经下降了很多,并已充分的普及。LCD制造时选用的控制IC、滤光片和定向膜等配件,与面板的对比度有关,一般而言,对比度能够达到350:1就足够了,但在专业领域这样的对比度平还不够。相对CRT显示器轻易达到500:1甚至更高的对比度而言,只有高档液晶显示器才能达到这样如此程度。LCD是一种介于固态与液态之间的物质,本身是不能发光的,需借助要额外的光源才行。最早的液晶显示器只有上下两个灯管,发展到现在,普及型的最低也是四灯,高端的是六灯。四灯管设计分为三种摆放形式:一种是四个边各有一个灯管,但缺点是中间会出现黑影,解决的方法就是由上到下四个灯管平排列的方式,最后一种是U型的摆放形式,其实是两灯变相产生的两根灯管。六灯管设计实际使用的是三根灯管,将三根灯管都弯成U型,然后平行放置,以达到六根灯管的效果。图2.6和图2.7是S3C2410X芯片内部集成的LCD控制器的外部管脚图和内部方框图,其中内部的寄存器作用如下:REGBANK有17个可编程寄存器组和256*16的调色板存储器,用来设定LCD控制器。LCDCDMA是一个专用DMA,自动从帧存储器传输视频数据到LCD控制器,用这个特殊的DMA,视频数据可不经过CPU干涉就显示在屏幕上。VIDPRCS接受从LCDCDMA来的视频数据,并在将其改变到合适数据格式后,经VD[23:0]将之送到LCD驱动器,如4/8单扫描或4双扫描显示模式。LENDLENDLCD-PWRENLCDVF0LCDVF1LCDVF2S3C2410LCD控制器VD[23-0]VM/VDEN/TPVFRAME/VSYNC/STVVLINE/VSYNC/CPVVCLK/LCDHCLK图2.6S3C2410LCD控制器外部管脚图TIMEGEN由可编程逻辑组成,以支持不同LCD驱动器的接口时序和速率的不同要求。TIMEGEN产生VFRAME、VLINE、VCLK、VM信号等。数据流描述如下:FIFO存储器位于LCDCDMA。当FIFO空或部分空时,LCDCDMA要求从基于突发传输模式的帧存储器中获取数据,存入要显示的图像数据,而这个帧存储器是LCD控制器在RAM中开辟的一片缓冲区。当这个传输请求被存储控制器中的总线仲裁器接收到后,从系统存储器到内部FIFO就会成功传输4个字。BEGBANKBEGBANKLCDCDMAVIDPRCSVIDEOMUXLPC3600TIMEGENVSYNCHSYNCVCLKVDENLCDVF0LCDVF1LCDVF2VD[23-0]图2.7LCD控制器内部方框图由于S3C2410内部集成的LCD控制器如上所以设计的外接LCD电路模块如图2.8:图2.8LCD模块电路2.4小结本章首先介绍了嵌入式ARM-Linux系统的组成,并简要介绍了Linux操作系统的历史及Linux操作系统在嵌入式领域的应用。介绍了S3C2410的功能,并对SDRAM存储接口电路、NANDFLASH存储电路、电源模块、USB电路模块和LCD电路模块的设计进行了说明。对系统各组成部分功能作了简要说明,对系统主要技术指标、性能及结构特点亦作了简要介绍。3Linux系统的建立本设计采用的是嵌入式Linux系统,嵌入式Linux(EmbeddedLinux)是指对Linux经过裁剪小型化后,可固化在存储器或单片机中,应用于特定嵌入式场合的专用Linux操作系统。Linux做嵌入式的优势:首先,Linux是开放源代码,是遍布全球的众多Linux爱好者和Linux开发者的强大技术支持;其次,Linux的内核小、效率高,内核的更新速度很快,Linux可以定制,其系统内核最小只有约134KB;第三,Linux是免费的OS,在价格上极具竞争力。Linux还有着嵌入式操作系统所需要的很多特色,突出的就是Linux适应于多种CPU和多种硬件平台,是一个跨平台的系统。到目前为止,它可以支持二三十种CPU。而且性能稳定,裁剪性很好,开发和使用都很容易,移植性很强,移植的速度远远超过Java的开发环境,即用Linux环境开发的产品,二次开发方便。同时,Linux内核的结构在网络方面是非常完整的,Linux对网络中最常用的TCP/IP协议有最完备的支持,提供了包括十兆、百兆、千兆的以太网络,以及无线网络、Tokerring(令牌环网)、光纤甚至卫星的支持。还有使用Linux开发无线连接产品的开发者越来越多。3.1Linux的启动过程嵌入式Linux的启动流程大概如下:第一阶段,用户上电,CPU进入自动实模式,通常是从ROM-BIOS的地址0xffff0开始执行代码,按BIOS中设置的启动设备进行启动,接着启动设备上安装的引导程序lilo或grub开始引导Linux。第二阶段,Linux首先进行内核的引导,主要完成磁盘引导、读取机器系统数据、实模式和保护模式的切换、加载数据段寄存器以及重置中断描述符表等。第三阶段,执行init系统初始化工作,init程序调用了rc.sysinit和rc等程序,而rc.sysinit和rc在完成初始化和运行服务的任务后,返回init。第四阶段,init启动mingetty,打开终端供用户登录系统,用户登录成功后进入了shell,这样就完成从开机到登录的整个启动过程。BootLoader应用程序文件系统参数BootLoader应用程序文件系统参数内核内核图3.1Linux系统各部分软件图一个嵌入式Linux系统从软件的角度看通常可以分为四个层次:(1)引导加载程序。包括固化在固件中启动代码和Bootloader两大部分。(2)Linux内核。特定于嵌入式电路板的内核以及控制内核引导系统的参数。(3)文件系统。包括根文件系统和建立于Flash内存设备上的文件系统,一般有RAMDISK、CRAMFS和YAFFS等。(4)用户应用程序。特定于用户开发的应用程序。上电上电BIOSBIOS第第一阶段Grub/liloGrub/lilo第二第二阶段Kernelrc.sysinitKernelrc.sysinit第三阶段第三阶段RcInitLoginMingettyLoginMingetty第四第四阶段ShellShell完成完成图3.2Linux启动流程图3.2启动代码和BootLoader引导加载程序是系统加电后运行的第一段代码,对嵌入式系统来讲是一个非常重要的系统组成部分。但在嵌入式系统中,一般并没有像PC中BIOS那样的固件程序,因此在一般的系统中,整个系统的加载启动任务就完全由BootLoader来完成。在一个基于ARM嵌入式系统中,系统上电或者复位时通常都从0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader,通过这小段程序可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做准备。BootLoader的启动过程可以是单阶段的,也可以是多阶段的。大多数单阶段的BootLoader应用于简单的系统,一般为没有操作系统的系统。通常多阶段的BootLoader能提供更为复杂的功能以及更好的可移植性。从固态存储设备上启动的BootLoader大多数是两阶段的启动过程,也就是启动过程可以分为stage1和stage2两部分:(1)Stage1为启动代码,它是CPU上电后执行的第一段代码负责初始化最原始的硬件资源,例如屏蔽CPU中断、工作频率、内存参数和设置堆栈等。由于在初始化原始硬件资源之前程序是直接控制CPU工作,所以该部分的启动代码必须要用汇编语言编写。(1)Stage2是紧接着启动代码之后的程序,负责初始化本阶段要用到的硬件资源,例如UART,RAM,ROM,USB,LCD等;为内核设置启动参数:还要提供一定的命令行接口,用于进行系统调试,最后要负责引导操作系统。由于涉及复杂的功能,所以通常用C语言编写,C语言入口点由上一级启动代码引导进入。大多数BootLoader都包含两种不同的操作模式:启动加载(Bootloading)模式和下载(Downloading)模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,BootLoader的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。(1)启动加载模式:这种模式也称为自主(Autonomous)模式,即BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程没有用户的介入。这种模式是BootLoader的正常工作模式。在嵌入式产品发布的时候,BootLoader显然必须工作在这种模式下。(2)下载模式:在这种模式下,目标机上的BootLoader将通过串口连接或网络连接等通信手段从主机上下载文件,比如下载应用程序、数据文件、内核映像等。从主机下载的文件通常首先被BootLoader保存到目标机的RAM中,然后再被BootLoader写到目标机上的固态存储设备中,BootLoader的这种模式通常在系统更新时使用。工作于这种模式下的BootLoader通常都会向它的终端用户提供一个简单的命令行接口,比如U-Boot、Blob、VIVI等。BootLoader是依赖于硬件实现的,特别是在嵌入式系统中。不同体系结构需求的BootLoader是不同的,除了体系结构,BootLoader还依赖于具体的嵌入式板级设备的配置。也就是说,对于两块不同的嵌入式板而言,即使它们基于相同的CPU构建,运行在其中一块电路板上的BootLoader未必能够运行在另一块电路开发板上,要使之后的软件系统能正常地运行起来,就必须确保BootLoader能正确地从ROM中被读取运行,并且具备引导操作系统的能力,所以要对BootLoader进行正确移植和修改。由上所述可知,BootLoader是嵌入式系统中重要的一部分,目前流行的BootLoader主要有:(1)U-BOOT。U-BOOT是德国DENX小组开发的用于多种嵌入式CPU的BootLoader程序,它可以运行在基于PowerPC、ARM、MIPS等多种嵌入式开发板上。从http://U-BOOT./或ftp;//ftp.denx.de/pub/U-BOOT/站点都可以下载U-BOOT的源代码。(2)VIVI。VIVI是由韩国MIZI公司开发的专门用于ARM产品线的一种BootLoader。因为VIVI目前只支持使用串口和主机通信,所以必须使用一条串口电缆来连接目标板和主机。VIVI的源代码下载地址为http;///developer/S3C2410x/download/vivi.html。(3)Blob。Blob是BootLoaderObject的缩写,是一款功能强大的BootLoader。其源码在http;///projects/blob上可以获取。Blob最初是由Jan-DerkBakker和ErikMouw两人为一块名为LART(LinuxAdvancedRadioTerminal)的开发板所写,该板使用的处理器是StrongARMSA-1100,现在Blob已经被成功地移植到许多基于ARM的CPU上。(4)RedBoot。RedBoot是一个专门为嵌入式系统定制的引导启动工具,最初由Redhat开发,它是基于eCos(EmbeddedConfigurableOperatingSystem)的硬件抽象层,同时它继承了eCos的高可靠性、简洁性、可配置性和可移植性等特点。RedBoot集BootLoader、调试、Flash烧写于一体,支持串口、网络下载,执行嵌入式应用程序。既可以用在产品的开发阶段(调试功能),也可以用在最终的产品上(Flash更新、网络启动)。RedBoot支持下载和调试应用程序,开发板可以通过BOOTP/DHCP协议动态配置IP地址,支持跨网段访问。用户可以通过tftp协议下载应用程序和image,或者通过串口用x-modem/y-modem下载,在嵌入式系统应用中非常广泛。(5)ARMboot。ARMboot是一个以ARM或StrongARM为内核CPU的嵌入式系统的BootLoader固件程序,该软件的主要目标是使新的平台更容易被移植并且尽可能地发挥其强大性能。它只基于ARM固件,但是它支持多种类型的启动,比如Flash,网络下载通过bootp、dhcp、tftp等。它也是开源项目,可以从http;///projects/armboot网站获得最新的ARMboot源码和详细资料,它在ARM处理器方面应用非常广泛。(6)DIY。DIY(DoItYouself),即自己制作。以上U-BOOT、VIVI、Blob、RedBoot和ARMboot等成熟工具移植起来简单快捷,但它们都存在着一定的局限性。首先,它们是面向大部分硬件的工具,在功能上要满足大部分硬件的需求。一般情况下,我们只需要与特定的开发板相关的实现代码,其他型号开发板的实现代码对它来说是没有用的,所以通常它们的代码量较大。其次,它们在使用上不够灵活。比如,在这些工具上添加自己的特有功能相对比较困难,必须熟悉该代码的组织关系,以及了解它的配置编译等文件。用DIY的方式自己编写针对目标板的BootLoader不但代码量短小,同时灵活性很大,最重要的是将来容易维护。因此,在实际嵌入式产品开发时大都选择DIY的方式编写BootLoader。3.3U-BOOT的简介U-BOOT的全称为UniversalBootLoader,是遵循GPL(GNUGeneralPublicLicense)协议的开放源码项目。该条款规定开发者必须开放源代码,确保用户可以自由地共享和修改软件,目的是促进软件知识的自由传播。不少U-BOOT源代码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序。U-BOOT不仅支持嵌入式Linux系统的引导,还支持NetBSD,VxWorks,QNX,RTEMS,ARTOS,LynxOS等操作系统,所以本设计打算选用此BootLoader。U-BOOT源代码是由多个目录组成的GNU项目,在不同的目录中按功能分类存放了C语言的代码文件,其主要目录结构如下:Board:U-BOOT所支持目标开发板相关文件。主要包含SDRAM和Flash的驱动程序;Common与处理器体系结构无关的通用代码,如内存大小探测与故障检测,在这里主要关注cmd_boot.c和cmd_bootm.c;Cpu:与处理器相关的文件,如ARM920t子目录下含S3C2410的串口、IIC接口和中断初始化等文件。系统启动的第一段汇编代码start.S就包含在此目录;Drivers:各种外设驱动程序;Doc:U-BOOT的说明文档;Include:头文件目录;Lib_XXX:处理器体系相关的文件,如lib_ppc,lib_arm目录分别包含与PowerPC、体系结构相关的文件;Net:与网络功能相关的文件目录,如bootp,nfs,tftp等网络协议。U-BOOT支持多种CPU体系结构,但对于不同的CPU来说,整个启动流程是类似的。下面介绍以ARM920T为架构的CPU启动过程。U-BOOT的启动可以分为两个阶段:第一阶段用汇编语言实现,负责初始化低层次的硬件,如CPU底层的寄存器和RAM等;第二阶段用C语言实现,负责初始化较高级的外围硬件接口,如串口、USB、网卡等,另外,通过C语言可实现更高级的应用,如命令行调试、网络传输等。U-BOOT整个程序的入口点位于cpu/ARM920T/start.S中,它用ARM汇编语言编写,它是ARM上电启动后执行的第一段代码,实现U-BOOT的第一阶段启动。之后的步骤如图3.3所示:start.Sstart.S定义程序入口定义程序入口设置异常向量设置异常向量初始化CPU底层部件初始化CPU底层部件搬移ROM的程序到RAM搬移ROM的程序到RAM程序转移到RAM上执行程序转移到RAM上执行图3.3BootLoader启动步骤3.4U-BOOT的移植和修改步骤3.4.1U-BOOT由NandFlash启动概述U-BOOT支持从NORFlash启动,本设计用的是NandFlash因为NandFlash的价格相对便宜。为了解决NandFlash不能直接本地读取数据的问题,本系统需要对U-BOOT进行修改,使得启动代码能被存储在NandFlash中也能正常运行。S3C2410本身也针对从NandFlash启动的方案采取了相应的措施。它在NandFlash控制器端采用了4KB的内部缓冲区,CPU上电后会把NandFlash的前4KB代码自动转移到内部缓冲中执行。通过OM【1:0】信号跳线可以选择是否启用该启动方式:OM【1:0】=00时处理器从NandFlash启动;OM【1:0】=01时处理器从16位宽的rom启动;OM【1:0】=10时处理器从32位宽的rom启动;OM【1:0】=11时测试模式的rom启动;当使用NandFlash启动时,4KB的内部缓冲区会被映射到0x0地址,此地址存放了CPU上电后的第一条指令。在U-BOOT的Start.S中,要跳过之前介绍的“搬移ROM中的程序到RAM”那一步,然后插入自己修改的NAND启动代码。本设计中,U-BOOT调试用到的硬件和功能主要有一个串口,DM9000E网卡支持tftp下载,工作频率为200M的S3C2410处理器,JTAG口烧写U-BOOT映像文件,1片4M*16位数据宽度的NandFlash地址范围为0x01000000~0x01800000和1片32MB16位SDRAM位数据宽度的SDRAM地址范围为0x30000000~0x32000000。Flash使用了2410处理器的BANK0单元。3.4.2U-BOOT基本配置移植步骤本设计采用U-BOOT1.1.4进行修改移植,交叉编译器是cross_2.95.3做法是在U-BOOT已经支持的开发板中选择一种和目标板接近的并在其基础上进行修改,代码修改的步骤如下:在U-BOOT1.1.4的根目录的Makefile中加入my2410_config:unconfig,其中的参数意思arm:CPU的架构;ARM920t:CPU的类型;建立自己开发板所需目录、文件配置文件。建立board/my2410目录,拷贝board/smdk2410下的文件到board/my2410目录,将smdk2410.c更名为my2410.c修改my2410目录下的Makefile文件,将OBJS=smdk2410.oflash.o修改为OBJS=my2410.oflash.o3.建立配置文件cpinclude/configs/smdk2410.hinclude/configs/my2410.h(3)排除编译器问趔。修改cpu/ARM920t/config.mk中的PLATFORM_CPPFLAGS+=$(callcc-option,-mapcs-32,-mabi=apcs-gnu)改为:cpu/ARM920t/config.mk中的PLATFORM_CPPFLAGS+=$(callcc-option,-mapcs-32,$(callcc-option,-mabi=apcs-gnu))(4)修改include/configs/my2410.h文件中的内容#defineCFG_PROMPT“my2410”/*我自己U-BOOT的调试平台名字*/#defineCONFIG_BOOTDELAY/*自动启动时间为3秒*/#defineCONFIG_BOOTARGS“noinitrdroot=/dev/mtdblock/3init=linuxrcconsole=ttyS0”/*NandFlash第三分区,串口0,Linux2.4内核,也可以不设,在移植后用NandFlash的命令再设置*/3.4.3U-BOOT对NandFlash命令的支持由于U-BOOT调试要用到一些NandFlash命令,如对设置一些参数保存要用到nandwrite对参数的保存到NandFlash中要用nandsave命令等,所以要在U-BOOT中加入一些命令。步骤如下:(1)在include/configs/my2410.h文件将CFG_CMD_NAND宏打开;(2)在include/linux/mtd/nand_ids.h加入K9F1208U0B的信息;(3)加入对SamsungK9F1208U0BNandFlash的基本宏定义;(4)在lib_arm/board.c中加入对NandFlash初始化函数externulongnand_probe(ulongphysadr);3.4.4启动代码的移植S3C2410被配置成从NAND闪存启动,上电后,S3C2410的NAND闪存控制器会自动把NAND闪存中的前4K数据搬移到内部RAM中,并把0X00000000设置为内部RAM的起始地址,CPU从内部RAM的0X00000000位置开始启动。因此要把最核心的启动程序放在NAND闪存的前4K中。由于NAND闪存控制器从NAND闪存中搬移到内部RAM的代码是有限的,所以,在启动代码的前4K里,必须完成S3C2410的核心配置,并把启动代码的剩余部分搬到RAM中运行。在U-BOOT中,前4K完成的主要工作就是U0BOOT启动的第一个阶段(stage1)。根据U-BOOT的执行流程图,可知要实现从NAND闪存中启动U-BOOT首先需要初始化NAND闪存,并从NAND闪存中把U-BOOT搬移到RAM中,最后需要让U-BOOT支持,NAND闪存的命令操作。3.4.5NandFlash环境参数的设置U-BOOT默认从NORFLASH启动,此时环境参数可以存放在NORFLASH中,也可以存放在NANDFLASH中。在NORFLASH中时,参数的存储位置由CFG_ENV_ADDR决定。此外必须有CFG_ENV_IS_IN_FLASH、CFG_ENV_SIZE这两个宏定义。如果U-BOOT从NANDFLASH启动,由于从NANDFLASH启动时S3C2410内部的4KSRAM被影射到Ngcso,故此时NORFLASH是无效,也不能对NORFLASH进行操作。因此环境变量是不能存储在NORFLASH上,此时只能将环境变量存储到NANDFLASH中。这样必须在my2410.h中做如下修改。/*#defineCFG_ENV_IS_IN_FLASH1*//*注释掉此行,添加下面三行*/#defineCFG_ENV_IS_IN_NAND1#defineCFG_ENV_OFFSET0xf0000#defineCFG_ENV_SIZE0x10000由于u-BOOT默认条件下是不传递环境参数到LINUX内核的TAG区(默认从0X30000100开始),为了能够用U-BOOT引导LINUX内核,必须定义以下配置,把信息传入LINUX核心。#defineCONFIG_SETUP_MEMORY_TAGS#defineCONFIG_INITRD_TAG#defineCONFIG_CMDLINE_TAG3.5Linux内核移植本设计采用的Linux内核是MIZI公司的2.4.18内核结合系统的硬件要求,需要对内核的适当配置,主要的修改包括了根目录和arch/arm/boot等目录下的Makefile分别针对NandFlash、LCD驱动、USB主机驱动、启动挂载devfs支持文件系统、Cramfs,Yaffs文件系统的支持以及声音系统的支持进行源代码的修改。对内核进行配置就是对其硬件进行裁剪,通过导入与S3C2410接近SMDK2410的默认配置可以简化其配置过程。S3C2410的默认配置在kernal/arch/arm/defconfigs/smdk2410.config里面。先进行手动裁剪,再进入图形配置界面配置。3.5.1LCD驱动分析和修改S3C2410本身具有LCD控制器接口,通过设置该部分的寄存器可以比较方便地对液晶显示屏进行控制,这样也大大简化了显示驱动程序的设计。Linux对LCD是以字符设备方式加以访问和管理的,它把要显示的数据一字节一字节地送往LCD控制器。3.5.2配置图形手动修改后,再终端输入命令makemenuconfig进入内核配置画面,选择相关的选项之后保存退出。(1)makemenuconfig:该命令用来调用图形化菜单式的配置内核界面。这种配置方法比用命令行方式更有效率。配置对SCSI设备的支持。在Linux中,大多数USB驱动程序会“钩住”另外一个驱动系统。经过以上配置并编译后,对于USB存储设备来说,一些关键的驱动模块会被编译进内核,如usbcore.o,usb-ohci.o和usb-storage.o。其usbcore.o是支持USB所需要的最基础模块;usb-ohci.o是主机协议模块;usb-storage.o是存储设备所需用到。在加载了以上模块后,当插入U盘时系统中就会出现一个SCSI硬盘,通过正确地挂载操作则可以使用该U盘。(2)makedepend:此命令用于为Linux项目产生,depend文件。当编译一个庞大的项目时,如果没有depend文件,编译器就无法判断出文件之间的依赖关系,这样会造成大量的重复编译,甚至使编译无法正常进行。所以,在每次增加源代码头文件时,都必须运行一次“makedepend“以更新各目标文件的依赖关系。这个命令只用于Linux2.4的内核,Linux2.6的不需要。(3)makezImage:编译器按照之前的配置选项生成Linux内核的机器代码映像,其中“zImage”是经过压缩并可以自解压的代码映像。(4)下载,用U-BOOT进行下载。3.6文件系统的创建在嵌入式Linux中,文件系统可分为根文件系统和子文件系统。根文件系统包含基本的操作系统命令和维护工具,启动时需要根文件系统来挂载,通常在系统建立后无需作出改动,每次启动都会恢复到原始的状态,这样有利于系统的稳定性,即使用户进行了错误操作也不至于对操作系统造成永久破坏;子文件系统通常是适合对嵌入式存储介质频繁进行读写操作的文件系统,用于保存经常需要修改的数据。常用的文件系统包括ROMfs,JFFS2,Yaffs,ETX2,NFS,Cramfs等。本设计用到的Cramfs(CompressedRAMFileSystem)作为根文件系统,是为压缩式文件系统,特点是数据可经过压缩而保存在ROM中,经过修改的数据在掉电或重启后不会被保留,而是恢复到原始状态;并且在读取数据时选择性读取,可大大节省内存资源。本设计还用到yaffs(YetAnotherFlashFileSystem)子文件系统,它是一种日志结构的文件系统,专门为NandFlash设计的,其速度快、占用内存少且易于移植,还为NandFlash供写均衡和垃圾收集等底层操作,能有效地降低Flash出现坏块的几率。3.6.1创建根文件系统根文件系统是存放运行、维护系统的Busybox、库文件、配置文件和脚本等,也可以安装各种软件包。其中的Busybox用于提供shell命令集;配置文件用来初始化和布局文件系统;库文件为应用程序和操作系统提供API函数接。Busybox将许多常用的UNIX命令和工具经过功能裁减结合到一个单独的可执行程序中,能够在满足一般嵌入式系统的应用,并节省了存储空间。它采用一种很巧妙的办法减少自己的体积:所有的命令都通过“插件”的方式集中到一个可执行文件中,在实际应用过程中通过不同的符号链接来确定要执行哪个操作。采用单一执行文件的方式能最大限度地共享系统资源,对于资源相对紧张的系统来说是非常合适的。3.6.2yaffs文件系统的移植移植步骤如下:1.在内核中建立YAFFS目录fs/yaffs,并把下载的YAFFS代码复制到该目录下面。2.修改fs/Kconfig,使得可以配置YAFFS。3.修改fs/makefile,添加如下内容:obj-$(CONFIG_YAFFS_FS)+=yaffs4.在yaffs目录中编写Makefile和Kconfig文件。5.按照BootLoader的分区设置修改NAND分区。6.配置内核时选中MTD支持和YAFFS支持。7.编译内核并将内核下载到开发板的Flash中。3.7嵌入式图形用户界面系统概述3.7.1图形用户界面(GUI)系统简介Linux有一套简便易学的图形用户接口(GUI),GUI由窗口系统,窗口管理器,工具包和风格等几个部分组成。窗口系统用于组织显示屏上的图形输出,窗口管理器用于对窗口的操作如最小化等,工具包是用于编程界面的库,风格是应用程序的用户界面。现在,Linux下的桌面环境主要包括KDE和Gnome两种。KDE(KDesktopEnvironment)桌面环境目的是提供一个开放源代码的图形用户接口和开发环境。KDE是基于QT库。而另一种Gnome使用的图形库是Gtk+构件库,它是基于LGPL协议。与早期计算机使用的命令行界面相比,对于用户来说,图形界面更为简便易用。图形用户界面的系统设计直接影响到最终用户的使用,是计算机和嵌入式系统设计的重要组成部分。3.7.2嵌入式图形用户界面简介嵌入式GUI为嵌入式系统提供了一种应用于特殊场合的人们交互接口,但是嵌入式硬件资源有限,要求嵌入式GUI简单、直观、可靠、占用资源小且反应快速。另外,由于嵌入式系统硬件本身的特殊性,嵌入式GUI应具备高度可移植性与可裁减性,以适应不同的硬件条件和使用需求。总体来讲,嵌入式GUI具备以下特点:体积小;运行时耗用系统资源小;上层接口与硬件无关,高度可移植;高可靠性;在某些应用场合应具备实时性。一个能够移植到多种硬件平台上的嵌入式GUI系统,应用至少抽象出两类设备:基于图形显示设备(如VGA卡)的图形抽象层GAL(GraphicAbstractLayer),基于输入设备(如键盘,触摸层等)的输入抽象层IAL(InputAbstractLayer)。GAL层完成系统对具体的显示硬件设备的操作,极大程度上隐蔽各种不同硬件的技术实现细节,为程序开发人员提供统一的图形编程接口。IAL层则需要实现对于各类不同输入设备的控制操作,提供统一的调用接口。其目前常见的面向嵌入式Linux的GUI系统主要有QtopiaCore(Qt/Embedded)、Tiny、MiniGUI、MicroWindows等。3.7.3QtQt是由Trolltech公司所开发的一套开源的C++图形用户界面库。在XWindow上KDE桌面环境就是用这套图形界面库所建立。它采用C++的语法,有各式各样的图形对象可供使用,采用signal/slot信号的事件信号传递机制。Qt/Embedded是基于Qt的嵌入式GUI和应用程序开发的工具包,它可运行多种嵌入式设备上,主要运行在嵌入式Linux系统上,需要C++编译器的支持,并为嵌入式应用程序提供Qt的标准API。Qt/Embedded的API是基于面向对象技术,在应用程序开发上使用与Qt相同的工具包,只需在目标嵌入式平台上重新编译即可。使用所熟悉的桌面开发工具,来编写和保存一个嵌入式应用程序的源代码树,在移植到多种嵌入式平台时,只需要重新编译代码。3.8Qt/Embedded核心技术3.8.1信号与槽信号和槽机制是QT的核心机制,信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性,也是QT区别于其它工具包的重要地方。信号和槽是QT自行定义的一种通信机制,它独立于标准的C/C++语言,要正确的处理信号和槽,必须借助一个称为moc(MetaObjectCompiler)的QT工具。该工具是一个C++预处理程序,它为高层次的事件处理自动生成所需要的附加代码。在我们所熟知的很多GUI工具包中,窗口小部件(widge)都有一个回调函数用于响应它们能触发的每个动作,这个回调函数通常是一个指向某个函数的指针。但是,在QT中信号和槽取代了这些凌乱的函数指针,使得编写这些通信程序更为简洁明了。信号和槽能携带任意数量和任意类型的参数,它们是类型完全安全的,不会出现回调函数产生coredumps的情况。所有从QObject或其子类派生的类都能够包含信号和槽。当对象改变其状态时,信号就由该对象发射(emit)出去,这就是对象所要做的全部事情,它不知道另一端是谁在接收这个信号。这是真正的信息封装,能确保对象被当作一个真正的软件组件来使用。槽用于接收信号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且,对象并不了解具体的通信机制。你可以将很多信号与单个的槽进行连接,也可以将单个的信号与很多的槽进行连接,甚至于将一个信号与另外一个信号相连接也是可能的,这时无论第一个信号什么时候发射系统都将立刻发射第二个信号。总之,信号与槽构造了一个强大的部件编程机制。3.8.2对象模型Qt中元对象系统是用来处理对象间通讯的信号槽机制、运行时的类型信息和动态属性系统。它基于下列三类:(1)QObject类;(2)类声明中的私有段中的Q_OBJECT宏;(3)元对象编译器(moc)。moc读取C++源文件。如果它发现其中包含一个或多个类的声明中含有Q_OBJECT宏,它就会给含有Q_OBJECT宏的类生成另一个含有元对象代码的C++源文件。这个生成的源文件可以被类的源文件所包含(#include)或者与这个类的实现一起编译和连制。除提供对象间通讯的信号和槽机制,QObject中的元对象代码还可实现其它特征:(1)className()函数在运行时,以字符串返回类的名称,不需要C++编译器的本地运行类型信息(RTTI)的支持。(2)inherits()函数返回,这个对象是否是一个继承于QObject继承树中一个特定类的类实例。(3)tr()和trUtf8()两个函数是用于国际化中的字符串翻译。(4)setProperty()和property()两个函数是用来通过名称动态设置和获得对象属性。(5)metaObject()函数返回这个类所关联的元对象。QObject作为一个基类而不使用Q_OBJECT宏和元对象代码是可以的。但是,如果Q_OBJECT宏没有被使用,那么这里的信号和槽以及其它特征描述都不会被提供。根据元对象系统的观点,一个没有元代码的QObject的子类和它含有元对象代码的最近的祖先相同。因此,建议QObject的所有子类使用Q_OBJECT宏,而不管它们是否实际使用了信号、槽和属性。3.8.3国际化程序或者软件系统的国际化,指的是如何使所开发的软件在不重写源代码的情况下能够支持多种语言,在英语中我们用inernationlization或者它的简写形式i18n来表示。在Linux/UNIX系统中,现在流行的国际化方法是使用GUN的gettext套件。利用gettext套件,程序员可以将需要翻译的字符串gettext()函数来取得,而由翻译人员协助提供翻译后的资源而建*.po,在一次编译后就可以支持多种语言。Qt中的国际化方法与GUNgettext类似,它提供了tr()函数与gettext函数对应,而翻译后的资源文件则以.qm来命名,且其国际化的机制与它的元对象系统密切相关。在支持国际化的过程中,程序员的工作一般是在所编写的代码中加入国际化的支持,这在Qt中利用QString、QTranslator等类和tr()函数能够很方便的完成。一般所需要做的工作有如下:(1)使用QString对象来表示所有用户可见的文本。由于QString内部使用Unicode编码来实现,它可以用来表示所有需要向用户呈现的文本。当然对于仅仅程序员可见的文本并不需要都变成QString对象,可利用Qt提供的QCString或者原始的char*。(2)使用tr()函数来取得所有需要翻译的文本。在Qt的翻译机制下,QObject::tr()函数可以帮我们取得翻译之后的文本。对于从QObject继承而来的类,函数最终由QObject::tr()来实现,在某些时候如果无法使用QObject::tr()函数,还可以直接调用QCoreApplication::translate()来取得翻译之后的字符串。(3)使用QString::arg()来组织动态文本。有时一段文本需要由一些静态文本和动态变量组合起来,由于不同的语言习惯在翻译的时会出现问题,使用QString::arg()方法可以有效的解决。(4)利用QTranslator::load()和QCoreApplication::installTran

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论