您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 移动终端Bootloader的开发与设计
移动终端Bootloader的开发与设计摘要:为了缩短系统的响应时间和提高文件的下载速度,基于U-Boot设计和开发了CrystalBoot引导程序。通过在Bootloader中增加开机动画显示、充电管理和基于USB的文件下载功能,CrystalBoot能够快速地对用户的开机和充电操作进行响应,提高代码下载和调试效率,更好地满足了用户及开发人员的需求。关键词:引导程序;U-Boot;CrystalBoot;移动终端;嵌入式系统中图分类号:TP311.5文献标志码:A文章编号:1001-3695(2008)06-1917-04随着智能手机、PDA等移动终端设备的功能越来越丰富,其内核代码和系统软件的规模越来越大,导致操作系统的加载和启动时间延长,系统从上电复位开始要经过较长时间才能就绪,不能及时响应用户的操作。按照日常使用习惯,用户希望按下开机键后很快看到动态的画面,说明系统在正常运行。如果能在内核启动前就显示开机动画,用户体验会大为改善。同样,用户在关机状态下给终端充电也希望马上看到充电画面。Bootloader是在系统加电后运行的第一段程序,代码尺寸小、运行速度快。将开机动画和关机充电显示功能集成到Bootloader中,可以缩短两者的启动时间。另一方面,由于开发阶段需要经常下载内核和文件系统进行调试,传统的低速串口下载方式已经不适合日渐增大的代码规模,而移动终端又没有其他嵌入式系统常见的以太网口,必须采用新的高速下载方案。USB是一个很好的选择。在Bootloader中通过USB进行文件下载,可以不依赖于上层系统软件下载文件到设备端内存中,既可以在开发阶段用于下载调试,也可以在产品化阶段用于系统软件升级。本文在基于OMAP平台的移动终端系统上对U-Boot进行功能扩充,开发了CrystalBoot。CrystalBoot在满足引导操作系统这一基本功能需求的同时,增强Bootloader的功能,实现了显示开机动画、充电管理以及基于USB的文件下载功能,在关机状态下能够对用户的开机和充电操作迅速做出反应,同时通过USB进行文件下载,大大加快了代码下载速度,提高了研发效率。1CrystalBoot的功能与流程1.1Bootloader的基本功能??Bootloader是系统加电复位后执行的第一段用户代码,其最主要的功能就是引导操作系统内核。一般为了完成此任务,还需要执行一些必要的硬件初始化工作。有些Bootloader,如Grub、U-Boot等,还提供了一个用户交互接口,可以执行用户输入的命令,在线修改系统配置,实现系统诊断和调试功能。这种类型的Bootloader实质上是实现了一个Pre-OS的运行环境。关于Bootloader的基本概念和功能,已经有很多文献[1,2]对其进行了描述,本文不再赘述。?ビ捎谟?CPU体系结构、硬件平台紧密相关,Bootloader的编写并不是一件简单的工作,甚至有些神秘。但开源社区的努力与贡献已经改变了这种状况。对于基于ARM的很多嵌入式开发平台,U-Boot[3,4]已经提供了非常完善的支持,只需要经过很少的代码修改(有时甚至无须任何修改),就可以在相应的平台上运行起来,完成引导操作系统的基本功能。U-Boot为人们开发和完善Bootloader提供了一个非常好的基础,CrystalBoot就是基于U-Boot。1.2CrystalBoot的主要功能??CrystalBoot是为基于OMAP和嵌入式Linux的移动终端开发和设计的Bootloader,在实现Bootloader的基本功能的基础上进行了扩展。其主要功能包括:??a)硬件初始化,包括设置ARM运行模式、配置指令和数据cache、堆栈初始化、时钟设置、中断寄存器配置、OMAP引脚配置、SDRAM初始化、NANDflash初始化、串口设置等,为引导操作系统内核构建适合的运行环境。??b)引导操作系统。将Linux内核从flash拷贝到内存地址0x10008000处,从此处引导内核。??c)显示开机动画。用户按下开机键后,在引导操作系统之前显示开机动画,改善用户体验。??d)支持充电管理。用户在关机状态下接入充电器后,可以在不启动操作系统的情况下显示充电界面,进行充电管理。??e)实现基于USB的文件下载功能,能够高速地下载文件到移动终端的内存中,直接进行调试或烧写到flash上。?ピ谏鲜鑫逑罟δ苤校?前两项属于Bootloader的基本功能,本文主要对后三项扩充功能进行具体描述。1.3启动流程?ビ捎谠黾恿诵碌墓δ埽?CrystalBoot在启动过程中不只有一条单一的执行路径,需根据用户的不同输入,执行不同的流程。首先,CrystalBoot在完成基本的硬件初始化工作后,检测用户(研发人员)是否通过串口终端有按键操作,如果有,说明用户要进入交互模式,进而可以输入控制台命令进行各种调试以及文件下载。U-Boot已经实现了串口中断检测,CrystalBoot在此不用添加新功能。然后,CrystalBoot需要识别出此次开机的原因。如果是用户按了开机键,则显示开机动画、引导操作系统;如果是由于接入充电器或充电数据线引起的系统开机,则显示充电界面,转入充电管理流程。CrystalBoot的启动流程如图1所示。2开机动画2.1GIF解码器2.1.1GIF文件格式?ヒ桓?GIF文件的结构可分为文件头、GIF数据流和文件终结器三个部分。文件头包含GIF文件签名和版本号;GIF数据流由逻辑屏幕描述符、全局颜色表、图像块(包括图像描述符、局部颜色表、图像数据)和其他的一些扩展块(图形控制扩展、注释扩展、应用扩展、文本扩展)组成;文件终结器用一个值为0x3B的字符表示文件结束。GIF文件内部按块组织分为控制块和数据块。控制块包含各种参数,控制数据块的行为;数据块包含8位字符流,由它前面的控制块来决定它的功能,每个数据块大小为0~??255Byte,数据块的第一个字节指出该数据块的字节数。GIF图像存储的数据不是颜色本身,而是该点的颜色对应于颜色列表的索引值。关于GIF文件格式的详细说明,请参阅文献[6]。2.1.2Libungif库及其移植??Giflib和Libungif[7]是用于处理GIF文件的开源项目,提供了一套完整的编解码库函数和工具包。两者的功能相当,但由于涉及到LZW算法的专利问题,如果是商业软件开发,应采用Libungif库。?ノ?了在CrystalBoot中对GIF文件进行解码,本文基于??4.1.0版本的Libungif库,将其中的dgif_lib.c和gif_lib.h两个文件集成到Bootloader中,最主要的移植工作是将其中的磁盘文件操作修改为对内存的直接读写。为此,在打开GIF文件前,需要首先将该文件从flash上读到内存缓冲区中,然后在指定的内存位置打开文件。具体地,使用一个新的DGifOpen-?┆?File()函数替代原文件中的DGifOpen-??FileName()和DGifOpenFileHandle()两个函数,用于从指定内存地址打开一个GIF文件。DGifOpenFile()的函数原型如下:GifFileType*DGifOpenFile(unsignedchar*addr,GifFileType*giffile,GifFilePrivateType*gifprivate);其中:addr为内存地址;giffile和gifprivate为原库中声明的数据类型;giffile可视为文件操作指针。之后,所有的解码操作都维持与原文件中的流程和接口一致。2.2动画显示及内核加载?ノ?了减少系统的启动时间,Bootloader在显示GIF动画的同时,从flash上读取内核代码到内存中。读flash的延迟可用做GIF动画的帧间间隔,因此,GIF本身的帧间间隔属性可以忽略。从整体上看,在显示开机动画的同时,Bootloader完成了内核的加载工作。该过程的伪代码如下:??[第一步,初始化LCD控制器、背光和帧缓冲区];[第二步,从flash中将GIF文件加载到内存地址addr处]/*第三步,从内存中“打开”文件*/DGifOpenFile((unsignedchar*)addr,&GifFile,&Private);/*第四步,一边解码、显示GIF图像,一边加载内核*/do{DGifGetRecordType(&GifFile,&RecordType);switch(RecordType){caseIMAGE_DESC_RECORD_TYPE:[读取并解码一帧图像到帧缓冲区中];[将缓冲区中的图像显示到LCD上];[(如果内核没有加载完)从flash上读取一段内核代码到指定内存地址处];break;caseEXTENSION_RECORD_TYPE:[跳过全部扩展块];break;caseTERMINATE_RECORD_TYPE:default:break;}}while(RecordType!=TERMINATE_RECORD_TYPE);[第五步,如果内核没有加载完,将剩余内核代码加载到内存中];[第六步,从内存地址0x00008000处执行,启动内核];3充电管理?サ庇没г谙低彻鼗?状态下接入电源适配器或充电数据线时,系统会自动开机,启动Bootloader。Bootloader检测到存在充电源且开机键没有被按下,进入图1中的充电流程。Bootloader中的充电管理模块主要负责三个任务,包括充电界面显示、电池电量测量和用户操作响应。3.1关机状态下的充电界面?コ涞缃缑嬷饕?是给用户明确的提示,充电是否在进行以及是否已经充满。Bootloader通过在屏幕上显示一个分格滚动的电量条,向用户表示系统正在充电。在充电结束后,电量条停止滚动,设置为满格。3.2电池电量测量?ノ?了判断电池是否已充满,需要检测电池电量。通常,可以检测电池电压或充电电流,当电池电压高于某一阈值或充电电流低于某一阈值,并超过一定时限时,则可判定电池电量满,充电过程结束。具体的数值需要结合电池电芯的充放电特性曲线来确定。例如TI的TSC2101[8]芯片具有电压检测功能,电压采样后保存在TSC2101的BAT寄存器中,通过如下公式计算得到电池的实际电压值:V??BAT=B/2??N×5×V??REF其中:V??REF采用内部参考电压为1.25V;N为控制精度;B为BAT寄存器读数。?ヅ卸系绯爻涞缃崾?还可以采用另外一种方法,即检测电源管理芯片的状态寄存器,充电结束时,相应的状态位会置位。但是否可以采用此方法,需要参考特定的硬件设计。?ゴ送猓?在系统启动的初始阶段,Bootloader应该检测当前的电池电量。如果电池电量低,提示用户及时充电;如果电量过低,在给出用户提示后应自动关机,以保护电池。3.3响应用户操作?ピ诔涞绻?程中,需要对用户操作进行响应。如果用户按下开机键,则显示开机动画,并加载操作系统内核,完成开机操作。该过程等同于用户按开机键开机,从实现的角度,就是跳转到图1中正常开机的流程。如果用户拨出了电源适配器或充电线,则终止充电界面,执行系统关机操作。4文件下载4.1下载方案设计?ソ岷铣<?的USB设备的应用方式、实现复杂度和使用的方便性,CrystalBoot采用USBNET方式实现文件下载功能。具体地说,在主机端(PC机)通过驱动程序将设备端(移动终端)模拟成网络设备,当做以太网卡使用;在设备端实现USB数据传输、以太网组帧及上层网络协议的解析工作,这样双方就可以使用标准的网络协议和服务进行通信。开源社区已经提供了内核补丁[11],只需要进行简单的修改和配置即可。主机端USB驱动的开发工作量很小。为实现下载功能,设备端不用开发完整的网络协议栈,只要支持一种简单的文件传输协议TFTP。?ピ诳?始文件传输之前,需要对USB接口进行初始化,并对其各种描述符进行配置,如表1所示。此处需要注意的是,CrystalBoot中的设置必须保证与主机USB驱动中的设置一致,以便双方可以正常通信。?ナ褂檬保?在CrystalBoot启
本文标题:移动终端Bootloader的开发与设计
链接地址:https://www.777doc.com/doc-3665134 .html