0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

m3eY_edn_china 来源:未知 作者:邓佳佳 2018-03-07 14:05 次阅读

前言

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

Android自2011年以来实现了计算机诞生以来最快速度的用户群体增长,目前Android以每天85万新激活数的速度快速征服世界,在世界范围内成为占有率最高的智能手机操作系统。根据赛诺的调研报告,Android系统在中国的市场份额高达74.7%。然而很多硬件制造商在旧设备的升级问题上动作缓慢。Android 4.0的配置要求比起之前的Android系统有较大的提高,导致很多厂商在中低端市场的新机型和主推机型都无法达到最低配置要求。根据市场的需求,低端Android手机存在着巨大商机。在低价格的情况下,如何实现高配置的要求,成为手机开发商研究的重点。

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

1 Bootloador的基本原理及功能介绍

Bootloader(系统启动加载器),其实就是在系统启动之前运行的一段程序。Bootloader的作用是对硬件设备初始化,建立内存空间映像图,从而把系统的软件环境带到一个合适的状态。这样,系统在调用内核时就准备好真正的环境,最终引导系统正常启动。对于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读取信息页面大小;

②读取按健信息。判断是正常开机、进入fastboot,还是进入recovery模式;

③从NAND中加载内核;

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

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

2.1 LCD控制器介绍

LCD控制器是Android手机开发项目中C6310芯片的必备模块,它负责将需要显示的数据,如操作界面、图像等送给LCD显示设备。在手机的应用中,LCD显示设备主要有以下几类:被动显示模式STN屏、主动显示模式TFT屏,以及主动模式OLED屏。根据显示颜色不同,又可以分为单色屏和彩色屏。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位用作命令、数据切换位。

2.2LCD控制器和LCD驱动嚣的硬件连接

ILI9481是一个单芯片TFT液晶显示驱动器,通常LCD控制器和LCD驱动器之间有并口、串口、RGB三种接口。采用RGB接口时,控制信息(行同步、场同步等)由主控制器发送;采用并口、串口时,控制信息包含在发送的图像数据中,该项目采用的是C6310 LCD控制器和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控制命令属性,如果该命令是最后一个命令,命令的第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。

4LCD驱动程序设计
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图像的地

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • lcd
    lcd
    +关注

    关注

    34

    文章

    4275

    浏览量

    164038
  • bootloader
    +关注

    关注

    2

    文章

    230

    浏览量

    45045

原文标题:做硬件9年了,心好累,当初应该做软件!

文章出处:【微信号:edn-china,微信公众号:EDN电子技术设计】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    bootloader开多线程做引导程序,跳app初始化后直接进hardfualt,为什么?

    过是没有什么问题的,在做IAP跳app时发现多线程iap跳多线程app一跳进去做完初始化就进hardfault,然后单任务IAP跳多线程APP时程序跳进去都能正常执行这个有大神了解吗,有想要源码研究的我就贴出来。
    发表于 04-18 06:07

    怎么编写Framebuffer驱动程序

    Framebuffer 驱动程序框架 分为上下两层: fbmem.c:承上启下 实现、注册 file_operations 结构体 把 APP 的调用向下转发到具体的硬件驱动程序
    的头像 发表于 03-22 09:13 147次阅读
    怎么编写Framebuffer<b class='flag-5'>驱动程序</b>

    如何在PSOC 6初始化QSPI?

    *cfg,uint32_t hz) 我查看了 \" MTB CAT1 外围设备驱动程序的文档。\"初始化不会那么复杂,对吧? 我的配置有什么问题? 在此先感谢。
    发表于 01-26 07:48

    labview运行后如何初始化

    需要创建一个新的项目。在开始菜单中打开LabVIEW软件,选择"新建项目",然后选择一个适合的文件夹来保存项目文件。在项目窗口中,可以添加各种不同的文件、VI(Virtual Instrument虚拟仪器)及其他资源。 确定程序需求: 在进行
    的头像 发表于 12-28 17:24 897次阅读

    linux驱动程序的主要流程和功能

    驱动程序是用于控制和管理硬件设备的软件模块,它主要负责与设备进行交互,通过操作设备的寄存器和接口,实现对硬件的控制和访问。在Linux系统中,驱动程
    的头像 发表于 12-08 14:56 770次阅读

    AD7091r-4软件初始化失败怎么处理?

    没有设定为默认值 使用RESET引脚执行硬件初始化后,寄存器会被重置为默认值 使用 RESET 针硬件初始化后, 登记册将被重置为默认值 软件
    发表于 12-01 06:31

    MSP430F5529硬件IIC驱动OLED(初始化使用的寄存器)

    MSP430F5529硬件IIC驱动OLED(初始化使用的寄存器)
    发表于 11-24 16:36 0次下载

    FAQ0066结构体成员未完全初始化导致程序异常的解决方法

    使用非官方程序,由于某些外设驱动在配置结构体时,未完全初始化所有成员,导致程序运行异常。以 FSMC 为例,FSMC_NORSRAMInitStructure 结构体共有 15 个成员
    发表于 10-20 06:59

    SD卡初始化及读取程序

    电子发烧友网站提供《SD卡初始化及读取程序.pdf》资料免费下载
    发表于 10-13 09:50 2次下载
    SD卡<b class='flag-5'>初始化</b>及读取<b class='flag-5'>程序</b>

    嵌入式Linux的摄像头驱动程序设计与实现

    电子发烧友网站提供《嵌入式Linux的摄像头驱动程序设计与实现.pdf》资料免费下载
    发表于 10-12 09:31 1次下载
    嵌入式Linux的摄像头<b class='flag-5'>驱动程序设计</b>与实现

    几种常见的单片机驱动程序设计模式

    单片机开发人员需要掌握的一项基本技能是,了解如何编写驱动程序。在嵌入式系统中,通常有两种类型的驱动程序:单片机外围设备驱动程序和通过I2C,SPI或UART等接口连接的外部设备驱动程序
    的头像 发表于 07-10 11:09 3264次阅读
    几种常见的单片机<b class='flag-5'>驱动程序设计</b>模式

    聊聊一些常用的Bootloader安全机制的设计

    不管是玩单片机还是嵌入式linux,基本上都会接触到bootloader,所以bootloader程序也是一个关键的组件,进行硬件初始化,应
    的头像 发表于 06-11 09:51 395次阅读

    mcan驱动没有实现timestamp初始化步骤?

    (TSCC)。 但是,查看 fsl_mcan.c 实现,我找不到任何对 TSCC 寄存器的引用。似乎 mcan 驱动程序没有初始化这个寄存器,也没有任何方法来配置它。 查看 LPC55S06.h 文件
    发表于 06-08 07:56

    STM32H7实现BootLoader内SDRAM的初始化注意事项

    Function Implementation:在 ArtPi 的环境下,实现一个简单的 BootLoader,该 BootLoader 实现了 QSPI 和 SDRAM 功能的初始化
    的头像 发表于 06-07 15:51 2196次阅读
    STM32H7实现<b class='flag-5'>BootLoader</b>内SDRAM的<b class='flag-5'>初始化</b>注意事项

    AzureWave AW-AM510-uSD和i.MX RT1060 EVK一直收到SDIO驱动程序初始化失败怎么解决?

    :卡初始化失败 [wifi_io] 错误:SDIO 驱动程序初始化失败。 [wifi] 错误:sd_wifi_init 失败。状态代码 -1 [wlcm] 错误:wifi_init 失败。状态代码
    发表于 04-28 07:35