您当前的位置:首页 > 美文分享

Bootloader中LCD硬件初始化和软件驱动程序设计

时间:2023-02-11 10:53:45

Bootloader中LCD硬件初始化和软件驱动程序设计

简介Android系统正常启动过程中,刷屏功能一般在内核执行,而Bootloader的任务应该是初始化硬件,尽快跳转到Linux内核。在Bootloader启动过程中启用一个显示驱动来实现刷屏功能并不违背这个目标。本文通过分析Bootloader的工作原理,研究嵌入式芯片C6310中的LCD控制器,设计了Bootloader中LCD的硬件初始化和软件驱动程序。该设计完善了Bootloader的扩展功能,加速了手机动画的实现,提高了用户体验。

从2011年开始,Android实现了计算机诞生以来用户群体的最快增长。目前,Android以每天85万的新激活量迅速征服全球,成为全球市场份额最高的智能手机操作系统。根据赛诺的研究报告,Android系统在中国的市场份额高达74.7%。然而,许多硬件制造商更新旧设备的速度很慢。相比之前的Android系统,Android 4.0的配置要求有了很大的提升,导致很多厂商低端市场的新机型和主力机型可以不满足最低配置要求。从市场需求来看,低端安卓手机存在巨大的商机。在价格低廉的情况下,如何达到高配置的要求成为手机开发者关注的焦点研究。

对于Android系统,Bootloader是基于特定平台实现的。Booloader解锁与否,关系到各方利益。解锁Bootloader会给用户带来很大的好处。Android用户将可以根据自己的需求刷固件,去掉可能导致扣费的运营商服务,获得更加多样化的Android体验。因此,本文根据定制的实际平台,提出了一种面向客户的Bootloader扩展功能的设计方案。

bootloader的基本原理和功能介绍

Boot(系统引导加载程序)实际上是一个在系统启动前运行的程序。加载程序的功能是初始化硬件设备并建立内存空间映射,从而使系统的软件环境达到合适的状态。这样系统调用内核的时候就准备好了真实的环境,最后系统正常引导。对于Android系统来说,通常没有PC那样的每周BIOS,所以Bootloader必须完成整个系统的加载任务。而且对于嵌入式系统来说,它们的硬件差异是非常大的。在操作系统启动之前,必须完成这些硬件的初始化,这就导致嵌入式系统Bootloader的功能和实现要比PC系统复杂得多。

LK(Linux Kernel)是一个小型内核操作系统,也是AndroidBootloader的核心。在高通代码中,Android Bootloader位于bootable \ Bootloader \ 1k目录下,Bootloader的功能设计主要在app\aboot.c下,aboot_init函数是LK的功能入口点,aboot_init的执行过程如下:

设置NAND/EMMC读取信息的页面大小;

读取关键信息。判断是正常启动、进入快速启动还是进入恢复模式;

从NAND加载内核;

启动内核。扫屏功能可以在读键之前实现,所以Bootloader扩展功能的设计过程如图1所示。

2 LCD控制器和外围设备连接

2.1液晶控制器介绍

液晶控制器是Android手机开发项目中C6310芯片的重要模块。负责将操作界面、图像等需要显示的数据发送到LCD显示设备。在手机应用中,液晶显示器件主要有以下几类:被动显示模式STN屏、主动显示模式TFT屏、主动模式有机发光二极管屏。根据显示颜色的不同,可分为单色屏和彩色屏。LCD控制器不直接连接LCD屏幕,而是连接LCD驱动器,简化了接口信号的数量和显示控制过程。LCD控制器的时序由控制信号和图像数据组成,其中控制信号包括VCLK、HSYNC和VSYNC,分别为像素时钟信号、行同步信号和帧同步信号。作为帧同步信号,VSYNC发出一个脉冲,这意味着开始发送一个新屏幕的图像数据。作为行同步信号,HSYNC发出脉冲,这意味着开始发送新的一行图像数据。必须在帧同步和行同步的开始和结束时预留回扫时间。这种时序安排起源于CRT显示器电子枪偏转所需的时间,但后来成为实际的行业标准,因此TFT屏幕也包括回扫时间。

C6310芯片集成了LCD控制器,通常配置寄存器来控制其工作。命令和图像数据的传输由LCD主控制器自动完成。当C6310的LCD控制器使用并行或串行接口工作时,它最多可以支持3层图像合并(L1、L2、L3),L4层用作命令存储空间。命令存储空间中的一个命令有20位,占用32位。前0 ~ 17位对应LCD_CMD寄存器的0 ~ 17位;第19位用作命令和数据切换位。

and LCD控制器和LCD驱动器之间的硬件连接

ILI9481是一款单芯片TFT LCD驱动器。通常情况下,LCD控制器和LCD驱动程序之间有三种接口:并口、串口和RGB。当使用RGB接口时,控制信息(行同步、场同步等。)由主控制器发送;当采用并行端口和串行端口时,控制信息包含在传输的图像数据中。该项目采用C6310液晶控制器和ILI9481驱动程序,通过并口连接。图2描述了主LCD控制器和ILI9481之间的连接。

驱动程序中的硬件操作主要是主控制器寄存器的配置,命令和图像的传输由LCD主控制器完成。

3液晶控制器操作流程设计

C6310使用L3层作为背景层,L4层作为命令层。当缓冲区中的图像数据准备就绪时,LCD控制器由b _ LCD _ bmpontoscreen 16 bpp _ Ili 9481()函数启动,图像数据被移至LCD驱动器。b _ LCD _ BMLPONTOSCreen 16 bpp _ Ili 9481()启动控制器后,启动一个等待队列等待图像数据传输。

图像移动期间会出现中断。这里,使用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并行接口屏,其寄存器的操作流程如下;

将命令索引和命令数据写入存储器。如果命令是16位,那么每个字对应于一个15: 0命令。如果命令是8位,则每个字的7: 0是一个命令。命令的属性由每个字的第17位WR_RD和第16位A0控制。如果该命令是最后一个命令,则该命令的第19位被设置为1。

配置LCD寄存器。配置第4层的起始地址作为命令存储地址,LCD_PCONF控制读写顺序,LCD_L1_SIZE屏幕大小,LCD_PCONF控制读写顺序,LCD_LCONF控制各层的切换并启用透明覆盖等。

使能LCD控制位LCD_SEL,LCD控制器会自动读取存储器中的数据并传输到接口。

等待L1_SOF中断后,您可以

如果连接了并行或串行LCD屏幕,当图像数据写入存储器时,命令将被写入第4层图像的相应地址,LCD控制器将自动读取这些命令输出。LCD控制器的操作流程如图3所示。

从流程图可以看出,EOF中断产生后,可以配置LCD控制器下一帧数据的起始地址。此时,这些配置不会在当前帧中生效,而是在下一帧中生效。如果需要在发送当前命令后发送图像数据,L4_WINTH应该配置为大于实际发送的命令数。为了使LCD控制器在传输一帧图像后停止工作,当L4_EOF中断到来时,下一帧发送的命令配置为0x30003。

4LCD驱动设计在LCD驱动开发的过程中,需要实现的主要是底层驱动。底层驱动大致分为两部分:硬件初始化部分和splash_screen函数。4.1硬件初始化的实现硬件初始化主要通过display_init函数实现,主要包括LCD控制器初始化、LCD处理器初始化、帧缓冲设备配置等。主要功能如下:

Fb_config首先使能I2S写功能来复位ILI9481。fbcon_setup函数记录LCD屏幕参数,包括屏幕分辨率、定时参数、像素位数(bpp)等。函数B_LCD_Init_ILI9481负责将数据传输到帧缓冲区驱动程序。初始化LCD控制器的寄存器主要配置LCD的PCD、ARM_INYEN、PBUS_WIDTH、OUT_BPP和LCD_TYPE寄存器。LCD控制寄存器主要用于配置屏幕参数、ARM中断使能、并口LCD中片选信号的极性、LCD屏幕类型和时序特性。主要寄存器如下:

PCD,配置像素时钟分屏。

ARM_INTEN,配置ARM中断启用信号。信号为0时,满足中断产生条件后不会产生发送给ARM的中断信号;当信号为1时,当满足中断产生条件时,产生发送给ARM的中断。

PBUS宽度,输出数据线的位宽,配置为并行显示时有效。

OUT_BPP,配置BPP位宽。

LCD_TYPE,配置LCD屏幕类型选择。00是普通RGB接口TFT显示器,01是夏普接口TFT显示器,10是并口LCD显示器,11是串口LCD显示器。

4.2读取图像信息

splash_screen函数主要定义图像的地址,并通过framebuffer显示图像。此处显示的图像放在u盘文件中。LK启动时直接从SDRAM中读取图像信息,定义bmp图像的位置。

标签:LCD控制器数据

控制器

最新文章