1.背光电路分析
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.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可以考虑自己去添加。
3.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);负责开背光。
4.解决新版开发板X210BV3S的logo显示问题
1)用旧版本的uboot.bin下载到新版开发板中,发现能工作,但是屏幕logo显示不正常(屏幕下面有一条显示不正常的,然后logo是显示出来的但是不在屏幕正中间)。
2)原因分析:主要原因新版开发板LCD屏幕的分辨率是1024*600而旧版分辨率是800*480.所以旧版本的uboot在新版开发板上运行时,就会造成屏幕填充不满(现象就是下面有一排显示不正常的),还会造成显示内容位置偏移,本来在中间结果偏左了。
3)解决方案:很简单,在uboot中将LCD的参数部分,分辨率改成1024*600即可。
5.logo显示代码分析
1)logo是以工具将图片做成二进制的字符串数据。
2)显示时通过计算将logo代表的矩形放在屏幕正*
3)绘图时先绘制背景色,然后在logo矩形中写入logo图片内容即可。
6.移植
移植九鼎官方的开机启动画面。
在display_banner中添加点亮背光的代码,并打印:BACKLIGNT ON
board_init_r添加LCD初始化的代码:
在goni.c添加初始化代码:
复制驱动:
复制头文件到include下:
在mpadfb.c添加如下代码:
7.结果