基于嵌入式ARM-Linux的电子相册设计方案.doc_第1页
基于嵌入式ARM-Linux的电子相册设计方案.doc_第2页
基于嵌入式ARM-Linux的电子相册设计方案.doc_第3页
基于嵌入式ARM-Linux的电子相册设计方案.doc_第4页
基于嵌入式ARM-Linux的电子相册设计方案.doc_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

基于嵌入式ARM-Linux的电子相册设计方案1.1 电子相册市场成长的必然性(1)市场需求的必然性在上世纪末本世纪初,电子相册呈现迅速发展的势头,普及型数码相机的分辨率由200万象素增长到现在的8001500万象素,价格也由300美元左右下降到现在的120美元左右。随着数码相机的日益普及,作为一种以数字照片的保存、回放和浏览为核心功能的产品电子相册自然迎合了消费者的需求。(2) 核心器件性能和价格的合理化推动市场的发展电子相册有三大核心器件:处理器,半导体存储器和LCD显示单元。随着ARM的不断发展,电子相册所需要的ARM+Jpeg处理器技术已为许多厂商所拥有,集成了USB Host及卡接口单元的产品也屡见不鲜。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.3 ARM9核心方案以ARM9等强大的CPU为核心,以WINCE、LINUX等操作系统为软件核心架构系统。此方案以ARM如S3C2410、Intel xscale等强大的嵌入式CPU为架构,速度在200M-300MHZ。嵌入WINCE、LINUX等操作系统,实现多媒体的编解码。该方案的优点:(1)系统芯片功能强大,实现的功能多,对于新的多媒体格式支持好,只需要安装更新的软件;(2)硬件电路简单;(3)二次开发容易实现。该方案的缺点:(1)成本较大,该类强大的CPU一般使用在PDA等嵌入式领域;(2)比较耗电,使用软件解码功耗与频率相关性很大。2 硬件设计方案本设计选用的是第三种方案:以ARM9CPU_S3C2410为核心,以Linux操作系统为软件核心架构。基于ARM的微处理器具有低功耗、低成本、高性能等特点,ARM采用RISC(精简指令集计算机)架构和流水线结构,使用了大量的寄存器,具有极高的工作效率。其中,RISC架构具有如下特点:固定长度的指令格式,指令归整、简单,基本寻址方式只有23种,使用单周期指令,便于流水线操作。ARM微处理器按性能分为以下系列:ARM7,ARM9,ARM9E,ARM10E,SecureCore Xscale。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.1 S3C2410简介Samsung 公司推出的16/32位RISC处理器S3C2410A,为手持设备和一般类型应用提供了低价格、低功耗、高性能小型微控制器的解决方案。S3C2410为手持设备和一般类型应用提供了低价格、低功耗、高性能小型微控制器的解决方案。采用272脚FPGA封装,内含一个ARM920T内核。为了降低系统成本,S3C2410A 提供了以下丰富的片内外围。ARM9-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(Memory Management Unit),支持SRAM和SDRAM等内存。LCD控制器接口(最高支持4K色的STN和256K色的TFT)4通道DMA控制器3通道UART2通道SPI接口IIC总线接口IIS音频编解码数据接口AC97音频接口MMC/SD存储卡接口2通道USB传输接口和1个复用的USB设备接口4通道PWM(脉宽调制)定时器和1个看门狗定时器8通道10位ADC和一个触控屏接口实时时钟130个GPIO口和24通道外部中断源接口片上PLL时钟发生锁相环总的方案图如图2.1:LCD显示ARM芯片S3C2410RESET电 路SDRAMNandFlash时钟电路USB接口电源图2.1 硬件系统框图2.3.2 SDRAM存储接口电路SDRAM:同步动态随机存储器,同步是指 Memory工作需要同步时钟,内部的命令的发送与数据的传输都以它为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;随机是指数据不是线性依次存储,而是自由指定地址进行数据读写。SDRAM从发展到现在已经经历了四代,分别是:第一代SDR SDRAM,第二代DDR SDRAM,第三代DDR2 SDRAM,第四代DDR3 SDRAM.(显卡上的DDR已经发展到DDR5) 第一代SDRAM采用单端(Single-Ended)时钟信号,第二代、第三代与第四代由于工作频率比较快,所以采用可降低干扰的差分时钟信号作为同步时钟。SDRAM之所以成为DRARM就是因为它要不断进行刷新(Refresh)才能保留住数据,因此它是DRAM最重要的操作。那么要隔多长时间重复一次刷新,目前公认的标准是,存储体中电容的数据有效保存期上限是64ms(毫秒,1/1000秒),也就是说每一行刷新的循环周期是64ms。这样刷新速度就是:行数量/64ms。我们在看内存规格时,经常会看到4096 Refresh Cycles/64ms或8192 Refresh Cycles/64ms的标识,这里的4096与8192就代表这个芯片中每个Bank的行数。刷新命令一次对一行有效,发送间隔也是随总行数而变化,4096行时为15.625s(微秒,1/1000毫秒),8192行时就为7.8125s。HY57V561620为8192 refresh cycles / 64ms。本设计采用32M的HY57V56162来设计SDRAM存储电路,它的单片内存规格为256Mbit 4M*16bit*4 Banks,即容量为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.2 SDRAM存储电路2.3.3 NANDFLASH存储电路Nand-flash内存是flash内存的一种,其内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案。Nand-flash存储器具有容量较大,改写速度快等优点,适用于大量数据的存储,因而在业界得到了越来越广泛的应用,如嵌入式产品中包括数码相机、MP3随身听记忆卡、体积小巧的U盘等。NOR和NAND是现在市场上两种主要的非易失闪存技术。Intel于1988年首先开发出NOR flash技术,彻底改变了原先由EPROM和EEPROM一统天下的局面。紧接着,1989年,东芝公司发表了NAND flash结构,强调降低每比特的成本,更高的性能,并且象磁盘一样可以通过接口轻松升级。但是经过了十多年之后,仍然有相当多的硬件工程师分不清NOR和NAND闪存。许多业内人士也搞不清楚NAND闪存技术相对于NOR技术的优越之处,因为大多数情况下闪存只是用来存储少量的代码,这时NOR闪存更适合一些。而NAND则是高数据存储密度的理想解决方案。NAND flash的单元尺寸几乎是NOR器件的一半,由于生产过程更为简单,NAND结构可以在给定的模具尺寸内提供更高的容量,也就相应地降低了价格。NandFlash读和写操作采用512字节的块,这一点有点像硬盘管理此类操作,很自然地,基于NAND的存储器就可以取代硬盘或其他块设备。NOR flash占据了容量为116MB闪存市场的大部分,而NAND flash只是用在8128M B的产品当中,这也说明NOR主要应用在代码存 储介质中,NAND适合于数据存储,NAND在CompactFlash、Secure Digital、PC Cards和M MC存储卡市场上所占份额最大。当前NORFLASH价格比较昂贵,考虑到成本问题,本设计采用了64M的K9F1208U0B Nand Flash作为介质存储电路,将K9F1208U0B的I/O0-7与上S3C2410的数据总线DATA0-7相连,实现数据的读写。S3C2410中Nand Flash控制器的R/nB与K9F1208U0B的R/nB相连,可以检查nFCE/GPA22、nFRE/GPA20、nFWE/GPA19分别与K9F1208U0B的CLE、nCE、nRE、new是否相连。分别可以控制K9F1208U0B的地址锁存使能、命令锁存使能、片选使能、读使能和写使能。原理图如图2.3所示:图2.3 NandFlash 存储电路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.5 USB 电路模块USB接口可用于连接多达127个外设,如鼠标、调制解调器和键盘等。USB自从1996年推出后,已成功替代串口和并口,并成为当今个人电脑和大量智能设备的必配的接口之一。目前USB设备虽已被广泛应用,比较普遍的是USB2.0接口,它的传输速度为480Mbps。USB 2.0将设备之间的数据传输速度增加到了480Mbps,比USB 1.1标准快40倍左右,速度的提高对于用户的最大好处就是意味着用户可以使用到更高效的外部设备,而且具有多种速度的周边设备都可以被连接到USB 2.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.5 USB接口电路2.3.6 LCD电路模块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来的视频数据,并在将其改变到合适数据格式后,经VD23:0将之送到LCD驱动器,如4/8单扫描或4双扫描显示模式。LENDLCD-PWRENLCDVF0LCDVF1LCDVF2S3C2410LCD控制器VD23-0VM/VDEN/TPVFRAME/VSYNC/STVVLINE/VSYNC/CPVVCLK/LCD HCLK图2.6 S3C2410 LCD控制器外部管脚图TIMEGEN 由可编程逻辑组成,以支持不同LCD驱动器的接口时序和速率的不同要求。TIMEGEN产生VFRAME、VLINE、VCLK、VM信号等。数据流描述如下:FIFO存储器位于LCDCDMA。当FIFO空或部分空时,LCDCDMA要求从基于突发传输模式的帧存储器中获取数据,存入要显示的图像数据,而这个帧存储器是LCD控制器在RAM中开辟的一片缓冲区。当这个传输请求被存储控制器中的总线仲裁器接收到后,从系统存储器到内部FIFO就会成功传输4个字。BEGBANKLCDCDMAVIDPRCSVIDEOMUXLPC3600TIMEGENVSYNCHSYNCVCLKVDENLCDVF0LCDVF1LCDVF2VD23-0图2.7 LCD控制器内部方框图由于S3C2410内部集成的LCD控制器如上所以设计的外接LCD电路模块如图2.8: 图2.8 LCD模块电路2.4 小结本章首先介绍了嵌入式ARM-Linux系统的组成,并简要介绍了Linux操作系统的历史及Linux操作系统在嵌入式领域的应用。介绍了S3C2410的功能,并对SDRAM存储接口电路、NANDFLASH存储电路、电源模块、USB电路模块和LCD电路模块的设计进行了说明。对系统各组成部分功能作了简要说明,对系统主要技术指标、性能及结构特点亦作了简要介绍。3 Linux系统的建立本设计采用的是嵌入式Linux系统,嵌入式Linux(Embedded Linux)是指对Linux经过裁剪小型化后,可固化在存储器或单片机中,应用于特定嵌入式场合的专用Linux操作系统。Linux做嵌入式的优势:首先,Linux是开放源代码,是遍布全球的众多Linux爱好者和Linux开发者的强大技术支持;其次,Linux的内核小、效率高,内核的更新速度很快,Linux可以定制,其系统内核最小只有约134KB;第三,Linux是免费的OS,在价格上极具竞争力。Linux还有着嵌入式操作系统所需要的很多特色,突出的就是Linux适应于多种CPU和多种硬件平台,是一个跨平台的系统。到目前为止,它可以支持二三十种CPU。而且性能稳定,裁剪性很好,开发和使用都很容易,移植性很强,移植的速度远远超过Java的开发环境,即用Linux环境开发的产品,二次开发方便。同时,Linux内核的结构在网络方面是非常完整的,Linux对网络中最常用的TCP/IP协议有最完备的支持,提供了包括十兆、百兆、千兆的以太网络,以及无线网络、Toker ring(令牌环网)、光纤甚至卫星的支持。还有使用Linux开发无线连接产品的开发者越来越多。3.1 Linux的启动过程嵌入式Linux的启动流程大概如下:第一阶段,用户上电,CPU进入自动实模式,通常是从ROM-BIOS的地址0xffff0开始执行代码,按BIOS中设置的启动设备进行启动,接着启动设备上安装的引导程序lilo或grub开始引导Linux。第二阶段,Linux首先进行内核的引导,主要完成磁盘引导、读取机器系统数据、实模式和保护模式的切换、加载数据段寄存器以及重置中断描述符表等。第三阶段,执行init系统初始化工作,init程序调用了rc.sysinit和rc等程序,而rc.sysinit和rc在完成初始化和运行服务的任务后,返回init。第四阶段,init启动mingetty,打开终端供用户登录系统,用户登录成功后进入了shell,这样就完成从开机到登录的整个启动过程。BootLoader应用程序文件系统参数内核图3.1 Linux系统各部分软件图一个嵌入式Linux系统从软件的角度看通常可以分为四个层次:(1)引导加载程序。包括固化在固件中启动代码和Bootloader两大部分。(2)Linux内核。特定于嵌入式电路板的内核以及控制内核引导系统的参数。(3)文件系统。包括根文件系统和建立于Flash内存设备上的文件系统,一般有RAMDISK、CRAMFS和YAFFS等。(4)用户应用程序。特定于用户开发的应用程序。上电BIOS第一阶段Grub/lilo第二阶段Kernelrc.sysinit第三阶段RcInitLoginMingetty第四阶段Shell完成图3.2 Linux启动流程图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都包含两种不同的操作模式:启动加载(Boot loading)模式和下载(Down loading)模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,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是Boot Loader Object的缩写,是一款功能强大的BootLoader。其源码在http;//projects/blob上可以获取。Blob最初是由Jan-Derk Bakker和Erik Mouw两人为一块名为LART(Linux Advanced Radio Terminal)的开发板所写,该板使用的处理器是StrongARM SA-1100,现在Blob已经被成功地移植到许多基于ARM的CPU上。(4)RedBoot。RedBoot是一个专门为嵌入式系统定制的引导启动工具,最初由Redhat开发,它是基于eCos(Embedded Configurable Operating System)的硬件抽象层,同时它继承了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(Do It Youself),即自己制作。以上U-BOOT、VIVI、Blob、RedBoot和ARMboot等成熟工具移植起来简单快捷,但它们都存在着一定的局限性。首先,它们是面向大部分硬件的工具,在功能上要满足大部分硬件的需求。一般情况下,我们只需要与特定的开发板相关的实现代码,其他型号开发板的实现代码对它来说是没有用的,所以通常它们的代码量较大。其次,它们在使用上不够灵活。比如,在这些工具上添加自己的特有功能相对比较困难,必须熟悉该代码的组织关系,以及了解它的配置编译等文件。用DIY的方式自己编写针对目标板的BootLoader不但代码量短小,同时灵活性很大,最重要的是将来容易维护。因此,在实际嵌入式产品开发时大都选择DIY的方式编写BootLoader。3.3 U-BOOT的简介U-BOOT的全称为Universal Boot Loader,是遵循GPL(GNU General Public License)协议的开放源码项目。该条款规定开发者必须开放源代码,确保用户可以自由地共享和修改软件,目的是促进软件知识的自由传播。不少U-BOOT源代码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序。U-BOOT不仅支持嵌入式Linux系统的引导,还支持NetBSD,VxWorks,QNX,RTEMS,ARTOS,LynxOS等操作系统,所以本设计打算选用此Boot Loader。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.S定义程序入口设置异常向量初始化CPU底层部件搬移ROM的程序到RAM程序转移到RAM上执行图3.3 BootLoader启动步骤3.4 U-BOOT的移植和修改步骤3.4.1 U-BOOT由Nand Flash启动概述U-BOOT支持从NOR Flash启动,本设计用的是Nand Flash因为Nand Flash的价格相对便宜。为了解决Nand Flash不能直接本地读取数据的问题,本系统需要对U-BOOT进行修改,使得启动代码能被存储在Nand Flash中也能正常运行。S3C2410本身也针对从Nand Flash启动的方案采取了相应的措施。它在Nand Flash控制器端采用了4KB的内部缓冲区,CPU上电后会把Nand Flash的前4KB代码自动转移到内部缓冲中执行。通过OM【1:0】信号跳线可以选择是否启用该启动方式:OM【1:0】=00时处理器从Nand Flash启动;OM【1:0】=01时处理器从16位宽的rom启动;OM【1:0】=10时处理器从32位宽的rom启动;OM【1:0】=11时测试模式的rom启动;当使用Nand Flash启动时,4KB的内部缓冲区会被映射到0x0地址,此地址存放了CPU上电后的第一条指令。在U-BOOT的Start.S中,要跳过之前介绍的“搬移ROM中的程序到RAM”那一步,然后插入自己修改的NAND启动代码。本设计中,U-BOOT调试用到的硬件和功能主要有一个串口,DM9000E网卡支持tftp下载,工作频率为200M的S3C2410处理器,JTAG口烧写U-BOOT映像文件,1片4M*16位数据宽度的Nand Flash地址范围为0x010000000x01800000和1片32MB16位SDRAM位数据宽度的SDRAM地址范围为0x300000000x32000000。Flash使用了2410处理器的BANK0单元。3.4.2 U-BOOT基本配置移植步骤本设计采用U-BOOT 1.1.4进行修改移植,交叉编译器是cross_2.95.3做法是在U-BOOT已经支持的开发板中选择一种和目标板接近的并在其基础上进行修改,代码修改的步骤如下:(1) 在U-BOOT 1.1.4的根目录的Makefile中加入my2410_config:unconfig,其中的参数意思arm:CPU的架构;ARM920t:CPU的类型;(2) 建立自己开发板所需目录、文件配置文件。1. 建立board/my2410目录,拷贝board/smdk2410下的文件到board/my2410目录,将smdk2410.c更名为my2410.c2. 修改my2410目录下的Makefile文件,将OBJS=smdk2410.o flash.o 修改为OBJS=my2410.o flash.o3.建立配置文件cp include/configs/smdk2410.h include/configs/my2410.h(3)排除编译器问趔。修改cpu/ARM920t/config.mk中的PLATFORM_CPPFLAGS+=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)改为: cpu/ARM920t/config.mk中的PLATFORM_CPPFLAGS+=$(call cc-option,-mapcs-32,$(call cc-option,-mabi=apcs-gnu)(4)修改include/configs/my2410.h文件中的内容#define CFG_PROMPT “my2410” /*我自己U-BOOT的调试平台名字*/#define CONFIG_BOOTDELAY /*自动启动时间为3秒*/#define CONFIG_BOOTARGS “noinitrd root=/dev/mtdblock/3 init=linuxrc console=ttyS0” /*Nand Flash 第三分区,串口0,Linux 2.4内核,也可以不设,在移植后用Nand Flash的命令再设置*/3.4.3 U-BOOT对Nand Flash命令的支持由于U-BOOT调试要用到一些Nand Flash命令,如对设置一些参数保存要用到nand write对参数的保存到Nand Flash中要用nand save命令等,所以要在U-BOOT中加入一些命令。步骤如下:(1)在include/configs/my2410.h文件将CFG_CMD_NAND宏打开;(2) 在include/linux/mtd/nand_ids.h加入K9F1208U0B的信息;(3)加入对Samsung K9F1208U0B Nand Flash的基本宏定义;(4)在lib_arm/board.c中加入对Nand Flash初始化函数extern ulong nand_probe(ulong physadr);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.5 Nand Flash环境参数的设置U-BOOT默认从NOR FLASH启动,此时环境参数可以存放在NOR FLASH中,也可以存放在NAND FLASH中。在NOR FLASH中时,参数的存储位置由CFG_ENV_ADDR决定。此外必须有CFG_ENV_IS_IN_FLASH、CFG_ENV_SIZE这两个宏定义。如果U-BOOT从NAND FLASH启动,由于从NAND FLASH启动时S3C2410内部的4K SRAM被影射到Ngcso,故此时NOR FLASH是无效,也不能对NOR FLASH进行操作。因此环境变量是不能存储在NOR FLASH上,此时只能将环境变量存储到NAND FLASH中。这样必须在my2410.h中做如下修改。/*#define CFG_ENV_IS_IN_FLASH 1 */ /*注释掉此行,添加下面三行*/#define CFG_ENV_IS_IN_NAND 1#define CFG_ENV_OFFSET 0xf0000#define CFG_ENV_SIZE 0x10000由于u-BOOT默认条件下是不传递环境参数到LINUX内核的TAG区(默认从0X30000100开始),为了能够用U-BOOT引导LINUX内核,必须定义以下配置,把信息传入LINUX核心。#define CONFIG_SETUP_MEMORY_TAGS#define CONFIG_INITRD_TAG#define CONFIG_CMDLINE_TAG3.5 Linux内核移植本设计采用的Linux内核是MIZI公司的2.4.18内核结合系统的硬件要求,需要对内核的适当配置,主要的修改包括了根目录和arch/a

温馨提示

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

评论

0/150

提交评论