产品推荐:水表|流量计|压力变送器|热电偶|液位计|冷热冲击试验箱|水质分析|光谱仪|试验机|试验箱


仪表网>技术中心>应用设计>正文

欢迎联系我

有什么可以帮您? 在线咨询

Android平台Bootloader的刷屏功能扩展设计

   2013年01月11日 14:09  
  摘要:Android系统在正常启动中,刷屏功能一般在内核中执行,而Bootloader的任务应该是执行硬件初始化,并尽快跳转到Linux内核。在Bootloader启动过程中使能一个显示驱动,实现刷屏功能,并不违背这一目标。本文通过对Bootloader的原理分析和嵌入式芯片C6310中LCD控制器的研究,设计了Bootloader中LCD硬件初始化和软件驱动程序。该设计完善了Bootloader的扩展功能,加快了手机动画的实现,改善了客户的使用体验。
  
  关键词:Bootloader;LCD控制器;驱动设计
  
  引言
  
  Android自2011年以来实现了计算机诞生以来zui快速度的用户群体增长,目前Android以每天85万新激活数的速度快速征服世界,在世界范围内成为占有率zui高的智能手机操作系统。根据赛诺的调研报告,Android系统在中国的*高达74.7%。然而很多硬件制造商在旧设备的升级问题上动作缓慢。Android4.0的配置要求比起之前的Android系统有较大的提高,导致很多厂商在中低端市场的新机型和主推机型都无法达到zui低配置要求。根据市场的需求,低端Android手机存在着巨大商机。在低价格的情况下,如何实现高配置的要求,成为手机开发商研究的重点。
  
  对于Android系统,Bootloader是基于特定平台来实现的。Booloader是否解锁关系到各方的利益,解锁Bootloader将会给用户带来很大的好处,Android用户将能够自行根据需要刷写固件,去掉可能导致扣费的运营商服务,得到更加多样的Android体验。因此,本文根据定制的实际平台,提出了一种面向客户需求的实现Bootloader扩展功能的设计方案。
  
  1、Bootloador的基本原理及功能介绍
  
  Bootloader(系统启动加载器),其实就是在系统启动之前运行的一段程序。Bootloader的作用是对硬件设备初始化,建立内存空间映像图,从而把系统的软件环境带到一个合适的状态。这样,系统在调用内核时就准备好真正的环境,zui终引导系统正常启动。对于Android系统,通常并没有PC机那样的周件程序BIOS,因此Bootloader必须完成整个系统的加载任务。而且对于嵌入式系统,其硬件的差别也是很大的,在操作系统启动之前,必须完成这些硬件的初始化工作,这就导致嵌入式系统Bootloader的功能和具体实现都比PC系统复杂得多。
  
  LK(LinuxKernel)是小内核小操作系统,是AndroidBootloader的核心。在高通代码中,AndroidBootloader位于bootable\bootloader\1k目录下,Bootloader的功能性设计主要在app\aboot.c下,aboot_init函数是LK的功能入口点。aboot_init的执行过程如下:
  
  ①设置NAND/EMMC读取信息页面大小;
  
  ②读取按健信息。判断是正常开机、进入fastboot,还是进入recovery模式;
  
  ③从NAND中加载内核;
  
  ④启动内核。实现刷屏功能可以在读取按键之前,所以Bootloader扩展功能的设计流程如图1所示。
  
  2、LCD控制器及外围设备连接
  
  2.1LCD控制器介绍
  
  LCD控制器是Android手机开发项目中C6310芯片的*模块,它负责将需要显示的数据,如操作界面、图像等送给LCD显示设备。在手机的应用中,LCD显示设备主要有以下几类:被动显示模式STN屏、主动显示模式TFT屏,以及主动模式OLED屏。根据显示颜色不同,又可以分为单色屏和彩色屏。LCD控制器不直接和LCD显示屏相连,而是和LCD驱动器相连,这样简化了接口信号数量和显示控制过程。LCD控制器时序由控制信号和图像数据两部分组成,其中控制信号包括VCLK、HSYNC、VSYNC,分别为像素时钟信号、行同步信号、帧同步信号。作为帧同步信号的VSYNC,每发出一个脉冲,都意味着新的一屏图像数据开始发送。而作为行同步信号的HSYNC,每发出一个脉冲,都意味着新的一行图像资料开始发送。在帧同步以及行同步的头尾都必须保留回扫时间。这样的时序安排起源于CRT显示器电子枪偏转所需的时间,但后来成为实际上的工业标准,因此TFT屏也包含了回扫时间。
  
  C6310芯片内部集成了一个LCD控制器,通常配置寄存器来控制其工作,命令和图像数据的传输由LCD主控制器自动完成。C6310的LCD控制器采用并行或串行接口工作时,zui多支持3层图像合并(L1、L2、L3),L4层用作命令存储空间。命令存储空间中一个命令有20位,占用32位空间。*个0~17位对应LCD_CMD寄存器中0~17位;第19位用作命令、数据切换位。
  
  2.2LCD控制器和LCD驱动嚣的硬件连接
  
  ILI9481是一个单芯片TFT液晶显示驱动器,通常LCD控制器和LCD驱动器之间有并口、串口、RGB三种接口。采用RGB接口时,控制信息(行同步、场同步等)由主控制器发送;采用并口、串口时,控制信息包含在发送的图像数据中,该项目采用的是C6310LCD控制器和ILI9481驱动器,它们采用并口连接,图2描述了LCD主控制器和ILI9481的连接。
  
  驱动中针对硬件的操作主要为主控制器寄存器的配置,命令和图像的传输由LCD主控制器完成。
  
  3、LCD控制器操作流程设计
  
  C6310采用L3层作为背景层、L4为命令层。当缓冲区的图像数据准备好以后,通过B_LCD_BmpOntoScreen16Bpp_ILI9481()函数启动LCD控制器,并将图像数据搬移到LCD驱动器。B_LCD_BmlpOntoScreen16Bpp_ILI9481()启动控制器后,启动一个等待队列,等待图像数据传输完毕。
  
  图像搬移过程中会产生中断,这里用到L4_EOF、L3_EOF、和L1_EOF中断,其中L4_EOF为命令传输完成中断,L3_EOF和L1_EOF分别为L3层和L1层数据传输完成中断。首先,C6310_LCDC向LCD驱动器发送一组数据,命令发送完毕后产生L4_EOF中断。然后,C6310_LCDC向LCD驱动器发送图像数据,发送完毕后产生L3_EOF和L1_EOF中断。
  
  在LCD进行数据显示前,首先要对LCD控制器的相关寄存器进行正确的设置。表1是C6310中的主要寄存器及其说明。
  
  连接16位RGB并行接口屏,其寄存器的操作流程如下;
  
  ①将命令index和命令数据写入存储器,如果命令是16位,则每一个字对应15:0是命令。如果命令为8位,则每一个字对应7:0是命令,通过每一个字中的第17位、WR_RD和第16位A0控制命令属性,如果该命令是zui后一个命令,命令的第19位设置为1。
  
  ②配置LCD寄存器。配置第4层的起始地址为命令存储地址,配置LCD_PCONF控制读写时序,配置LCD_L1_SIZE的屏幕大小,配置LCD_PCONF控制读写时序,配置LCD_LCONF控制每层的开关和透明覆盖使能等。
  
  ③使能LCD控制位LCD_SEL,LCD控制器自动读取存储器中数据传输到接口。
  
  ④等待L1_SOF中断产生后,可以写下一帧所需要的命令和修改其他层起始地址等。
  
  ⑤等待BOF中断可以配置下一帧的LCD_CTRL寄存器或者每一层起始地址。
  
  ⑥如果连接的是并口或者串口LCD屏,在图像数据写入存储器的同时将命令写到第4层图像对应地址,LCD控制器会自动读取这些命令输出。LCD控制器操作流程如图3所示。
  
  从流程图可以看出,当EOF中断产生之后,就可以配置LCD控制器下一帧数据的起始地址。此时,这些配置不会在当前帧起效,而是在下一帧起效,如果需要当前命令发送完毕之后发送图像数据,L4_WINTH需配置为大于实际命令发送个数。本驱动为了让LCD控制器传送一帧图像后停止工作,当L4_EOF中断到来后,配置下一帧发送的命令为0x30003。
  
  4、LCD驱动程序设计
  
  LCD驱动程序开发过程中,主要需要实现的是底层驱动程序,底层驱动大体分为两个部分:硬件初始化部分和实现splash_screen函数。
  
  4.1硬件初始化实现
  
  硬件初始化部分主要由display_init函数来实现,主要包括初始化LCD控制器、初始化LCD处理器、Frame-buffer设备的配置等工作,主要实现的函数如下:
  
  fb_config首先使能I2S写函数,对ILI9481进行复位操作,fbcon_setup函数记录了LCD屏幕参数,包括屏幕分辨率、时序参数、像素比特数(bpp)等参数,B_LCD_Init_ILI9481函数肩负着向framebuffer驱动程序传递数据的任务。初始化LCD控制器的寄存器主要是对LCD的PCD、ARM_INYEN、PBUS_WIDTH、OUT_BPP、LCD_TYPE等寄存器进行配置。LCD控制寄存器主要是对屏幕参数、ARM中断使能、并口LCD中片选信号极性、LCD屏类型、时序特性进行配置。主要寄存器如下:
  
  PCD,配置像素时钟分屏。
  
  ARM_INTEN,配置ARM中断使能信号。当信号为0时,达到中断产生条件后,不产生送到ARM的中断信号;当信号为1时,达到中断产生条件后,产生送到ARM的中断。
  
  PBUS_WIDTH,输出数据线位宽,当配置为并口显示屏时有效。
  
  OUT_BPP,配置BPP位宽。
  
  LCD_TYPE,配置LCD屏类型选择。00为普通RGB接口TFT显示屏,01为Sharp接口TFT显示屏,10为并口LCD显示屏,11为串口LCD显示屏。
  
  4.2读取图像信息
  
  splash_screen函数主要是定义图像的地址,通过framebuffer对图像进行显示。这里将显示的图像放在了U盘文件中,当LK启动时,直接从SDRAM中读取图像信息,并定义bmp图像的地址为0x14000000。图像显示函数如下:

  
  LCD显示数据大小是由显示模式和显示屏尺寸大小共同决定的。根据设计要求,使用的是320X480个像素、16bpp的256色LCD,显示一屏图像所需的显示缓冲为320×480×16位。在显示缓冲器中,每一个像素都占一个字节,且每个字节又要区分RGB格式。在显示图像时,需要配置相应的寄存器,这些工作在初始化LCD控制器已经完成。其次,确定图像缓冲区的首地址,这个地址在4字节对齐的边界上,而且要在SDRAM的4MB空间之间,显示缓冲区的数据会直接显示到显示屏上。LCD上显示的不同图像信息就是显示缓冲区内不同数据的输出。
  
  5、LK的测试与调试
  
  在该模块下编写了一个Makefile文件,在调试LK模块时,可以单独编译LK模块,这样就节约了开发的时间。编译LK模块,得到1k.bin文件。开发板上电后,进入U盘模式,用生成的1k.bin文件替换掉U盘中原始的文件,通过超级终端连接串口,启动LK。LK启动打印信息如图4所示,LK能正常工作,并能执行LCD显示驱动。
  
  6、结语
  
  本文通过对Bootloader的研究,提出了一种Android详细给出了LCD控制器操作流程和LCD的驱动设计。系统启动正常,运行稳定,达到了设计的要求。尽管LCD手机在LK启动过程中实现LCD显示的设计方案,并且的种类很多,但驱动程序的设计都可以遵循一定的模式,可以根据自己设计的需求选择合适的方法。该方法对Android系统开发具有一定的借鉴意义和参考价值。

免责声明

  • 凡本网注明“来源:仪表网”的所有作品,均为浙江兴旺宝明通网络有限公司-仪表网合法拥有版权或有权使用的作品,未经本网授权不得转载、摘编或利用其它方式使用上述作品。已经本网授权使用作品的,应在授权范围内使用,并注明“来源:仪表网”。违反上述声明者,本网将追究其相关法律责任。
  • 本网转载并注明自其它来源(非仪表网)的作品,目的在于传递更多信息,并不代表本网赞同其观点或和对其真实性负责,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品第一来源,并自负版权等法律责任。
  • 如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。
联系我们

客服热线: 15267989561

加盟热线: 15267989561

媒体合作: 0571-87759945

投诉热线: 0571-87759942

关注我们
  • 下载仪表站APP

  • Ybzhan手机版

  • Ybzhan公众号

  • Ybzhan小程序

企业未开通此功能
详询客服 : 0571-87759942