刚入门学习调试LCD驱动,在同事的教导下一步步学习LCD驱动调试:
(R61581)
R_lcd驱动调试比较简单,现将具体的调试过程,及调试过程中出现的问题记载如下,已备参考。
1,首先是将项目ixxxx代码拉下,使用命令:
ssh git@192.x.x.x 找到代码后拉回本地,使用命令:git clonegit@192.x.x.x:pXxxxx.git 克隆远程分支;然后使用命令: git branch -a 查看分支,再创建自己的分支:使用命令: git checkout -b ixxx origin/ixxx;创建了一个本地分支;在本地分支上修改就可以了。
2,修改以后如何提交,具体过程如下:
git status | more 查看哪些文件被修改过
git add /被修改文件的全路径
git commit -am "备注"
git pull --rebase
git push origin xxxxx 推到远程分支上
gitk 确认
3具体的调试过程中出现的问题:
1) 首先就是修改文件以后出现各种错误,慢慢细心修改,需要修改的有: 1、分辨率;2、查看GPIO口是否有改动,3先修改OBM里的文件,这里面是用开开机时调用,主要是logo.c,logo.h和屏的初始化代码等。 在调试过程中主要出现了两个问题: 1 是GPIO口有改动,但是硬件原理图上却没有显示,修改了无数遍,就是 只有背光没有别的。最后在公司高手的帮助下,解决该问题。2 是上面问题解决以后,出现了花屏的问题,首先确定是初始化代码给错,改了各个地方就是不对,最后发现在B4H下的PM位中是用来确定是什么接口,其中 DPI对应的是RGB接口,选择这个模式即可出现了开机画面 长舒一口气。
2) 开机画面出现后开始修改kernel里面的内容,主要是屏的.c文件,makefile,ttc等。修改的也是一些参数问题,初始化代码等,成功后即可开机进入kernel中
3) 由于所用的屏幕是320x480的 ,而该分支以前是高分辨率的 在 vendor/marvell/dkb/dkb.mk 有这样一串代码
+#Add for support High dpi
+PRODUCT_PROPERTY_OVERRIDES += \
+ persist.service.pp.enable = 1 \
+ro.sf.lcd_density = 240
+CUSTOM_LOCALES += hdpi mdpi
该代码作用以前说过 主要是
1,launcher 无法加载第三方的高清icon,效果很模糊。
2,第三方应用运行的效果对比p1000差太多,完全不是pad的布局。
而本屏的分辨率本来就很小,加上这串代码以后反而起到了反作用, 注释掉以后 make
4): lcd读id的问题,在sdk中 看到device code read(BFH)中有lcd屏的ID可以读取,利用gpio_read_form_lcd() 和gpio_spi_sent_to_lcd()来读取该寄存器数据,得到lcd_id的读数,LCD_ID的读取可以在adb shell 中看到,进入,add shell 以后命令: cat /proc/cmdline查看就可以看见lcd屏的ID号了。
5): lcd 硬件图要注意的地方是:首先看GPIO口有没有接错,注意的是LCD上的out,in管脚要分别对应芯片上的in,out管脚。
继续补充:
6): t调试出现LCD屏底部一块白色横条,左侧从上到下一小块闪动的条状竖纹分布,初步以为是margin的原因,修改了很多不对,最后发现时时钟刷新率太高,导致上述的原因。
7): lcd调试出现字体变大,文字下移到底部等问题,原因是由于初始化代码中 在初始化分辨率的时候没有初始化正确,
8):文字方向问题一般都是由于相关寄存器扫描方向,输出方向等没有设置好(B6H,ILI9486)
9): ILI9486的ID在D3H中。
9486LCD驱动调试出现的问题比较多,一:在obm中出现的问题有:
1、时钟频率的问题,这个时钟频率比较重要,首先就是要考虑的问题。
2、lcd_bmp_log.c中需要读取lcd的id值,这个可以参考spk中的d3h reg。
3、成功出现图片之后,开机时会产生一个白色的闪屏,主要原因是由于图片还没有显示之前背光已经打开了,解决的办法由多种,可以延迟背光时间的开始,或者在log没出现之前打入一帧全黑的图片。
二 在kernel中出现了较大的问题,主要是进入了kernel之后,屏幕产生了抖动现象,左侧出现梳妆条纹,不停的闪动,下面出现了白色的块状斑纹。浪费了我一个星期才找到问题的来源:
主要原因是9486所需要的时钟频率和1581,在9486中的sclk_div的地址要设置成0x4000001f, 这个问题的具体原因还有待与细节的解决。
10) lcd调试过程中出现个问题: 连续按两次power键,会出现短暂的白屏现象。这个问题比较麻烦,查看log发现流程是对的,即第一次按power时 开lcd、开背光。第二次按power键时关背光,关lcd。出现了白屏现象说明,此时背光没关,但是lcd关了。查看代码分别在:
1) kernel/kernel/driver/video/pxa168f.c
2) kernel/kernel/arch/arm/mach-mmp/onboard/lcd_Rxxx.c lcd开关
3) kernel/kernel/drivers/video/backlight/88pm860x_bl.c 背光开关
在背光suspend()函数最后添加关背光代码,解决问题。
关背光代码: mutexl_lock(&bn_lock)
gpio_direction_output(gpio51_bl,0)
mdelay(3)
mutex_unlock(&bn_lock)
问题理解:
1、按开机关机键的时候,系统会建立两个list,suspend_list,resume_list,lcd_suspend,lcd_resume,backlight_suspend,backlight_resume等都会被插入这个list,系统会在按power键之后遍历这个list,根据按键之后的状态时要开机还是关机,来选择遍历哪个list,注意的是,在resume_List中的_func_和suspend_list中的_func_
是顺序相反的。这样在运行resume_list是遍历的顺序是lcd_resume,backlight_resume。再按power之后,开始遍历suspend_list中的顺序为: backlight_suspend,lcd_suspend。
2、在连续按两次power之后首先会出现一次屏幕的画面,然后跳转到白屏现象,分析应该是在按第二次power之后,本来因该是先关背光然后再开始关屏幕,但是在关背光到一半的时候转到关lcd,而lcd也没有关闭完全,但是log之后发现log的流程是正确的,为什么会出现白屏现象还不明确。
3、