《13.uboot杂记-logo显示和fastboot原理等》

转自 https://edu.csdn.net/lecturer/505 朱老师物联网大讲堂
《13.uboot杂记-logo显示和fastboot原理等》

第一部分、章节目录
2.13.1.X210的uboot中LCD操作分析
2.13.2.logo显示和LCD屏幕分辨率适配
2.13.3.fastboot的基本分析
2.13.4.uboot的fastboot代码分析1
2.13.5.uboot的fastboot代码分析2

第二部分、章节介绍
2.13.1.X210的uboot中LCD操作分析
本节分析在X210的uboot中LCD是如何被操作的,包括分析核心板、底板和LCD模组的原理图、uboot中的相关代码等。
2.13.2.logo显示和LCD屏幕分辨率适配
本节首先讲解如何修改代码让uboot在新版X210BV3S中正常显示logo,然后顺带分析下logo显示部分的代码。
2.13.3.fastboot的基本分析
本节简要描述了fastboot的功能和工作原理,目的是让大家对fastboot有一个宏观和直觉上的认识。
2.13.4.uboot的fastboot代码分析1
本节开始分析fastboot的实现代码,从do_fastboot函数入手一路顺藤摸瓜分析到rx_handler函数。
2.13.5.uboot的fastboot代码分析2
本节继续分析fastboot的实现代码,主要是fastboot从机和主机之间通过的各种命令集及其实现,通过分析让大家从本质上理解fastboot是如何工作的。

第三部分、随堂记录
2.13.1.X210的uboot中LCD操作分析
2.13.1.1、新旧版本开发板的LCD模组差异
(1)2015.11月初之前购买的X210开发板都属于老版本,型号是X210V3;之后购买的开发板都是新版本的,型号是X210V3S。
(2)两个开发板主要电路是完全一样的,不同主要有3点:一个是把拨码开关换成了短路帽;另一个是LCD分辨率从800480升级成1024600;第三个是触摸屏芯片型号换了。

2.13.1.2、背光电路分析
(1)LCD的背光源有2种设计。一种是简单设计,背光只能点亮和熄灭两种状态,不能调亮度;另一种设计类似手机屏幕可以调节亮度。第一种设计很简单,就是开和关。第二种模式比较复杂,需要一个额外的PWM调光IC来支持,X210的LCD模组上使用MP3202芯片来做调光。
(2)分析原理图和MP3202的数据手册,可以得出结论:
第一:PWMTOUT0(GPD0_0)接在了IC的FB引脚上,SoC应该通过该引脚输出一个频率合适的PWM波形给调光IC,这个波形的占空比就会控制MP3202输出的电流大小,从而控制屏幕亮度。
第二:L_DISP(DISP、SYS_OE、GPF3_5)接在了MP3202的EN引脚上,SoC应该给该引脚一个高电平来让背光工作,或者给一个低电平来让背光不工作。
(3)综合分析:背光要点亮,要同时满足以上两个条件。GPD0_0要输出低电平或者PWM信号,同时GPF3_5要输出一个高电平。一般来说我们在uboot中都把GPD0_0设置成输出模式然后输出低电平来点亮背光。

2.13.1.3、X210的uboot中LCD代码分析
(1)在uboot-jiuding/board.c中init_sequence中的display_banner中的open_backlight函数中给GPF3_5输出高电平。但是这个其实是可以省略的,注释掉这一句uboot的LCD显示照样正常的,主要原因是后面LCD操作的部分还会再做一遍的。
(2)真正的初始化LCD系统并且显示logo是在start_armboot函数的后段的x210_preboot_init中。这个函数纯粹是九鼎在移植时添加的。如果我们自己移植uboot可以考虑自己去添加。

2.13.2.logo显示和LCD屏幕分辨率适配
2.13.2.1、LCD驱动mpadfb.c分析
(1)fb_init函数给framebuffer相关的数据结构赋值。左值的info是一个结构体,这个结构体描述fb驱动中的硬件设备参数的,右值的lcd是自己定义的一个数据结构,里面的值都是我们人为配置给驱动体系的。
(2)lcd_port_init看名字是lcd端口的初始化,端口就是GPIO,所以这个函数是在初始化LCD相关的SoC的引脚。
(3)lcd_reg_init看名字是LCD的寄存器的初始化,就是SoC的LCD控制器中的那些寄存器的初始化。
(4)以上三个函数调用执行完后,LCD初始化就结束了。然后向LCD写东西就能显示了。但是你要注意背光是否被点亮了。后面剩下的事情就是写东西和开背光两个了。
(5)display_logo(&s5pv210_fb);这个函数负责把logo图片写到LCD的fb中去。backlight_brigness_init(1);负责开背光。

2.13.2.2、解决新版开发板X210BV3S的logo显示问题
(1)用旧版本的uboot.bin下载到新版开发板中,发现能工作,但是屏幕logo显示不正常(屏幕下面有一条显示不正常的,然后logo是显示出来的但是不在屏幕正中间)。
(2)原因分析:主要原因新版开发板LCD屏幕的分辨率是1024600而旧版分辨率是800480.所以旧版本的uboot在新版开发板上运行时,就会造成屏幕填充不满(现象就是下面有一排显示不正常的),还会造成显示内容位置偏移,本来在中间结果偏左了。
(3)解决方案:很简单,在uboot中将LCD的参数部分,分辨率改成1024*600即可。

2.13.2.3、logo显示代码分析
(1)logo是以工具将图片做成二进制的字符串数据。
(2)显示时通过计算将logo代表的矩形放在屏幕正中央
(3)绘图时先绘制背景色,然后在logo矩形中写入logo图片内容即可。

2.13.3.fastboot的基本分析
2.13.3.1、什么是fastboot
(1)fastboot是android使用的一种刷机方法.android系统设计了2种刷机方式:fastboot和recovery。
(2)fastboot使用usb作为物理传输。刷机其实就是镜像传输+烧录,fastboot刷机时就是通过usb线来传输镜像的。
(3)fastboot是uboot中的一个命令。uboot进入命令行中后,如果需要刷机,则可以在命令行执行fastboot命令就可以让uboot进入fastboot模式,刷机就是在fastboot模式下进行的。
(4)fastboot需要主机端的fastboot软件配合。要实现fastboot刷机,只有开发板端uboot是不行的,还需要在主机上有fastboot.exe的软件配合。
(5)fastboot在开发板和主机间定义了一套协议。其实fastboot是我们在开发板和主机之间定义的一套协议,这套协议以usb为底层传输物理层,协议规定了主机fastboot软件和开发板fastboot软件之间的信息传输规则。消息传递可以实现功能有:主机可以向开发板发送命令、开发板可以向主机发送回复、主机可以向开发板发送文件(download)

2.13.3.2、fastboot的工作原理
(1)uboot的fastboot命令将开发板伪装成一个usb从设备。开发板本身并不是一个usb设备,所以开发板直接插到电脑上电脑是没有反应,没有提示发现设备需要装驱动的。伪装之后开发板就被主机windows识别成一个安卓手机了。
(2)主机的fastboot软件和开发板的fastboot程序通信来工作。平时工作时,开发板端只要执行了fastboot命令进入fastboot模式即可,剩下的就不用管了。主机端通过运行fastboot命令,传递不同的参数来实现主机端和开发板端的通信。
譬如主机端执行fastboot devices,则这个命令通过USB线被传递到开发板中被开发板的fastboot程序接收,接收后去处理然后向主机端发送反馈信息,主机端接收到反馈信息后显示出来。
(3)我们学习fastboot时分析代码的思路就是:
主机端:fastboot.exe的源代码没有,fastboot协议虽然能找到但是很枯燥,所以主机端没有去分析的。
开发板端:主要分析点就是uboot如何进入fastboot模式,fastboot模式下如何响应主机发送的各种命令。

2.13.4.uboot的fastboot代码分析1
2.13.4.1、do_fastboot函数
(1)do_fastboot函数本身涉及到很多操作SD/Nand等磁盘的,主要目的是为了刷机。要完整的分析fastboot的函数细节很复杂很麻烦,我们并不是要做这个。

2.13.4.2、关键点:rx_handler(顺藤摸瓜一路找下去)
do_fastboot
fastboot_poll
fboot_usb_int_hndlr
fboot_usb_pkt_receive
fboot_usb_int_bulkout
fastboot_interface->rx_handler(函数指针)
指向cmd_fastboot.c/rx_handler
找的过程涉及到USB物理层通信的一些概念和理解,相对比较复杂。最终uboot这边的fastboot是通过rx_handler函数来处理主机端fastboot软件发送过来的信息的。fastboot协议的命令实现都在这个函数中提现。所以这个函数的分析就是重点。

2.13.4.3、代码分析
(1)大文件download机制
rx_handler函数中通过if和else分成了两部分,if部分负责处理download,else部分负责处理命令。usb传输单次传输最大只能有限个字节(64、256),因此当我们发送比较小的东西(譬如命令)时可以单次传输完毕;当我们发送比较大的东西(譬如文件)时就必须要分包发送。

(2)down后的响应机制。开发板端通过fastboot_tx_status函数向主机发送响应,主机显示这个响应。

2.13.5.uboot的fastboot代码分析2
(1)uboot中fastboot有关的一些宏定义设置值
CFG_FASTBOOT_TRANSFER_BUFFER 配置fastboot工作时的缓冲区地址,fastboot在执行某些功能时需要大块内存做缓冲区(譬如download时),这里就是在给他配置缓冲区。
CFG_FASTBOOT_TRANSFER_BUFFER_SIZE fastboot缓冲区的大小。
注意:很多同学在之前刷机时,烧录uboot和zImage都正常,但是烧录android镜像x210.img时错误,提示:image too large…(意思是文件太大)。这个错误的原因就是x210.img太大了,超出了CFG_FASTBOOT_TRANSFER_BUFFER_SIZE所以放不下了,所以uboot的fastboot这里报错了。

2.13.5.1、fastboot命令响应之:fastboot reboot
(1)作用:在PC机这边可以远程重启开发板
2.13.5.2、fastboot命令响应之:fastboot getvar
(1)作用是得到一些fastboot中定义的变量名的值,譬如version、product。。。。。
2.13.5.3、fastboot命令响应之:fastboot erase
2.13.5.4、fastboot命令响应之:fastboot download
2.13.5.5、fastboot命令响应之:fastboot boot
2.13.5.6、fastboot命令响应之:fastboot flash
2.13.5.7、fastboot命令响应之:fastboot oem
(1)oem命令是用户自定义的。其他命令全都是fastboot协议定义的,但是有时候自带的命令不足以使用,oem厂商可能希望定义一些自己专有的命令,则可以使用oem命令。

你可能感兴趣的:(系统移植)