高通安卓调试LCD几方面总结
來公司上班現(xiàn)在已經(jīng)整整一個(gè)月了,蔽人不才,能力有限,學(xué)習(xí)進(jìn)度緩慢,不過也是有一點(diǎn)點(diǎn)的收獲與心得,在這里寫出來與大家分享,養(yǎng)成良好的記錄習(xí)慣也免得后忘記。
???不啰嗦了,開入正題。來公司一個(gè)月左右的時(shí)間,主要接觸了高通android4.0和android2.3的LCD驅(qū)動(dòng),當(dāng)然在bootloader下LCD的驅(qū)動(dòng)我也調(diào)試的。
?
???(1)?kernel
???先來說一下kernel里L(fēng)CD的移植,之前從來沒有接觸過LINUX里L(fēng)CD的驅(qū)動(dòng),所以剛一開始我竟然連MIPI接口、LCDC接口這些最基本的都不知道,鄙視一下我自己,呵呵。感覺android2.3和android4.0在kernel里L(fēng)CD驅(qū)動(dòng)上的區(qū)別不是特別大。只是android2.3里多了一個(gè)late_display.c這個(gè)文件,背光和MDP的開關(guān)以及屏的初始化都是在這個(gè)文件里調(diào)用的。
???????因?yàn)楦咄ńo的codebase本身包含有一些LCD芯片的驅(qū)動(dòng),我在2.3上用的是MIPI接口的,是根據(jù)truly的例子來做的。在2.3上我們使用的是MIPI CMD模式,從truly的例子移植的時(shí)候代碼的大體結(jié)構(gòu)不需要改動(dòng),一般只是需要針對(duì)要更改的屏的文檔作一些參數(shù)與配置的修改就可以了。我是照著truly的在/kernel/drivers/video/msm下創(chuàng)建mipi_hx8369a.cMipi_hx8369a_cmd_wvga_pt.c這兩個(gè)文件,從truly的例子中把內(nèi)容拷過來,把名字全改成hx8369a,的mipi_hx8369a.c里面,主要就是GPIO_HX8369A_LCD_RESET的宏,根據(jù)原理圖來定義正確的RESET管腳,然后還有mipi_hx8369a_lcd_reset()里L(fēng)CD初始化之前reset的時(shí)序要根據(jù)lcd芯片的spec來,初始化之前的reset對(duì)lcd非常重要;最后就是根據(jù)FAE給的初始化指令填好初始化數(shù)組。
??????????在Mipi_hx8369a_cmd_wvga_pt.c文件里有一些要傳到frame_buffer中去的一些參數(shù),這些參數(shù)與所選用的顯示屏有關(guān),在這里把最主要的一些列出來:
??
[cpp]?view plaincopy ???其它的一些參數(shù)我還沒弄清是什么意思,不明白就照著別的例子抄來吧。
???由于android2.3里有一個(gè)late_display.c的函數(shù),這個(gè)函數(shù)用來控制背光、MDP的開關(guān)以及打開屏的時(shí)候調(diào)用mipi_hx8369a.c和Mipi_hx8369a_cmd_wvga_pt.c中的初始化函數(shù)mipi_hx8369a_lcd_late_init()和mipi_cmd_hx8369a_wvga_pt_late_init()。所以late_display.c里把變量gpio_backlight_en的值改為當(dāng)前使用的背光控制管腳。函數(shù)mipi_hx8369a_lcd_late_init()和mipi_cmd_hx8369a_wvga_pt_late_init()是在late_display_ioctl()里調(diào)用,在上層打開LCD設(shè)備的時(shí)候會(huì)來設(shè)用這兩個(gè)函數(shù)來初始化LCD設(shè)備。
???下面就是要改board文件了,在board文件里會(huì)給LCD分配顯存,這里會(huì)有一個(gè)宏MSM_FB_SIZE,通過計(jì)算后填一個(gè)有余量的值便好。然后就是在board文件里添加設(shè)備以及設(shè)備相關(guān)的一些資源,也可以參考別的芯片的例子來。定義
[cpp]?view plaincopy???這里定義了控制背光的GPIO管腳,如果背光控制管腳使用的是PMIC的一個(gè)GPIO來控制,使用的方法也不一樣,在下一篇4.0的LCD移植中會(huì)寫這種方式。還要定義一個(gè)platform_device,
[cpp]?view plaincopy???這里name要與mipi_hx8369a.c里的platform_driver里的名字一樣,id要選擇0,因?yàn)閙ipi_hx8369a.c里還會(huì)分配一個(gè)platform_device,它的name和這個(gè)一樣,所以mipi_hx8369a.c里的probe函數(shù)會(huì)被調(diào)用兩次,第一次與board里的platform_devices匹配,目的是為了將背光的管腳號(hào)傳遞給驅(qū)動(dòng)(因?yàn)槲疫@里使用了late_display.c里的變量,而且背光控制是在late_display.c里,所以這里的管腳號(hào)也不重要了)。
???最后再把結(jié)構(gòu)體mipi_dsi_panel_device加到board文件里添加設(shè)備的數(shù)組中,當(dāng)系統(tǒng)啟動(dòng)時(shí)統(tǒng)一向內(nèi)核中注冊(cè)設(shè)備。
?
?? kernel里驅(qū)動(dòng)文件添加和修改就基本完成了,然后就是要在/kernel/driver/video/msm里修改Kconfig和Makefile文件.
?? 在Makefile里,添加
[cpp]?view plaincopy?? 在Kconfig里,添加
[cpp]?view plaincopy?????????但有一點(diǎn)要注意的是,config FB_MSM_MIPI_HX8369A_CMD_WVGA_PT_PANEL這個(gè)的位置要放在choice包含的里面,具體可以參考truly的例子的位置。
?? 最后,運(yùn)行make kernelconfig,在里面選中FB_MSM_MIPI_HX8369A_CMD_WVGA_PT_PANEL和FB_MSM_MIPI_HX8369A_CMD_WVGA_PT,
然后在/kernel/arch/arm/configs下找到與工程相關(guān)的配置文件,在里面可以找到選中的配置,在編繹的時(shí)候,根據(jù)這個(gè)成.config文件,在out/target/product/$(Projec)/obj/KERNEL_OBJ,在這里也可以查到最后選中的配置。
??
?? (2) bootloader
?? 我每次都是先移植kernel里的LCD驅(qū)動(dòng),因?yàn)槲矣X得kernel里的代碼要相對(duì)集中一些,而且就算是代碼弄的有問題,也不會(huì)造成手機(jī)找不到端口而下不了程序,而且kernel里的LOG要容易抓一些,bootloader里還得接個(gè)串口,太麻煩。然后就是有了kernel里驅(qū)動(dòng),bootloader里的LCD也要簡(jiǎn)單一些了,畢竟有了一些經(jīng)驗(yàn)了。
?
?? 在bootloader里移植LCD有一點(diǎn)需要特別注意,就是/bootable/bootloader/lk/platform/msm_shared/splash.h這個(gè)文件,如果高通的codebase是Lcdc接口的,而你要改為mipi接口的話,這個(gè)文件一定要注意更換,否則會(huì)造成手機(jī)找不到端口而直接掛掉。蔽人不才,由于這個(gè)原因燒壞了手機(jī)不下十次,鄙視一下在這里,哈哈。更換了splash.h后還要注釋掉/vendor/qcom/opensource/qrdplus/QRDExtensions/DynamicComponents/res/Splash_QRD/Android.mk這個(gè)文件下的
[cpp]?view plaincopy這幾句,否則在你編譯的時(shí)候,你改過的splash.h會(huì)被更改回去。
?
?? 步入正題吧,該說說bootloader里移植lcd驅(qū)動(dòng)了。高通的bootloader使用的是一個(gè)叫l(wèi)k(little kernel)的bootloader,在lk里也有不少高通提供的示例代碼,我一般也是參考truly的來改,同樣的,代碼的大體結(jié)構(gòu)都不需要更改。首先要在目錄/bootable/bootloader/lk/target/$(Projec)下更改lcd的makefile文件rules.mk,由于我們的手機(jī)是從nand flash啟動(dòng),所以要改的都在NDND啟下的方式下改。在rules.mk下添加:
[cpp]?view plaincopy?? 代碼的主要流程基本上可以根著codebase里truly的來照著填,這里簡(jiǎn)單的列一下:
[cpp]?view plaincopy
??????到這里lk里L(fēng)CD移植也寫完了,如果認(rèn)為有問題的地方,歡迎提出來。下一篇再寫4.0里L(fēng)CD的移植,4.0里使用的是LCDC的接口。
高通安卓調(diào)試LCD幾方面總結(jié)(二)
????????最近工作太忙了,而且經(jīng)常出差,所以有一個(gè)多月沒有來得及更新博客了,唉,之前一個(gè)項(xiàng)目LCD也遇到幾個(gè)棘手的問題,壓力山大。
?? 閑話少說,直接進(jìn)入正題了,在上一篇里寫了高通平臺(tái)android2.3里的kernel和bootloader(LK)里L(fēng)CD驅(qū)動(dòng)的移植,這一篇主要寫一下在4.0里L(fēng)CD驅(qū)動(dòng)的移植。
??
?? (1) kernel
???高通的android4.0和2.3在kernel里的LCD驅(qū)動(dòng)是有區(qū)別的,主要在于4.0里少了latedisplay.c這個(gè)文件。這里我以renesas公司的r61408這顆IC來介紹。我使用的是RGB565的接口,由于kernel里有高通公司提供的其它家IC的代碼,我同樣是以truly的來作為參考的,代碼的框架不變。首先就是在kernel\drivers\video\msm下以truly的代碼為模板,創(chuàng)建一個(gè)名為lcdc_r61408.c的文件,文件里的內(nèi)容照著truly的來做。
?? 這里先來把Makefile和Kconfig文件修改好。在kernel\drivers\video\msm文件夾下的Makefile里添加:
?????????
[cpp]?view plaincopy?? 在此目錄下打開Kconfig文件,在里面添加:
??
[cpp]?view plaincopy?? 還要在kernel\arch\arm\configs目錄下的board config文件里添加:
[cpp]?view plaincopy?? 在lcdc_r61408.c文件里主要就是要寫向LCD用SPI發(fā)指令和發(fā)數(shù)據(jù)的函數(shù),我們的這個(gè)項(xiàng)目里使用的是GPIO口模擬的SPI總線,所以SPI的時(shí)序一定要寫正確,R61408在用SPI發(fā)指令的時(shí)候data和command是在寫8bit數(shù)據(jù)前通過SDO口的高和低來判別的,但是有些LCD的IC,比如NT35510,需要在發(fā)8bit數(shù)據(jù)之前要發(fā)送R/W,H/L,D/C幾個(gè)信號(hào)來區(qū)別接下來發(fā)的數(shù)據(jù)表示什么。所以一定要根據(jù)所選用的LCD的IC的spec嚴(yán)格的來寫SPI的時(shí)序,否則有可能造成LCD的初始化都不成功。
?? 在kernel里,LCD的驅(qū)動(dòng)的調(diào)用的流程是:
[cpp]?view plaincopy?? 在關(guān)閉LCD的時(shí)候,kernel里驅(qū)動(dòng)調(diào)用流程剛好是和上面反向的。
?? 這里有一點(diǎn),因?yàn)槲覀兪褂玫谋彻馐峭ㄟ^PMIC的一個(gè)1號(hào)腳來控制的,使用PMIC管腳產(chǎn)生PWM的使用方法是,在board-display.c里初始化GPIO的函數(shù)里,加上這么一句:
[cpp]?view plaincopy?? 然后在board-display.c里加上如下配置:
[cpp]?view plaincopy?? 最后在lcdc_renesas_r61408.c的pmic_backlight這個(gè)函數(shù)指針就可以實(shí)現(xiàn)背光的控制和調(diào)節(jié)。
??
?? (2) bootloader(lk)
?? 和上一篇一樣,首先要在目錄/bootable/bootloader/lk/target/$(Projec)下更改lcd的makefile文件rules.mk,在rules.mk下添加:
[cpp]?view plaincopy?? 代碼的流程可以跟著truly的例子來做,這里簡(jiǎn)單的介紹一下流程:
[cpp]?view plaincopy?? LCDC接口的LCD驅(qū)動(dòng)在LK里相對(duì)MIPI的來說流程比較簡(jiǎn)單,SPI的時(shí)序參考KERNEL里的一般就沒有什么問題的。
?
?? 到這里,LCDC和MIPI的兩種LCD在高通平臺(tái)上的驅(qū)動(dòng)也算是寫完了,小弟也正處在學(xué)習(xí)的過程當(dāng)中,寫得不好。我再寫一下在調(diào)試LCDC接口的LCD驅(qū)動(dòng)時(shí)的一些心得(也是之前在網(wǎng)上看到的):
1)調(diào)試lcd背光,背光主要分為PMIC自帶的和單獨(dú)的DCDC,如果為PMIC自帶的背光,一般平臺(tái)廠商已經(jīng)做好,直接調(diào)用接口即可,如果為單獨(dú)的DCDC驅(qū)動(dòng),則需要用GPIO控制DCDC的EN端
2)確認(rèn)lcd的模擬電,io電是否正常
3)根據(jù)lcd的分辨率,RGB/CPU/MIPI等不同的接口,配置控制寄存器接口
4)根據(jù)lcd spec配置PCLK的頻率,配置PCLK,VSYNC,HSYNC,DE等控制線的極性
5)使用示波器測(cè)試所有clk的波形,確認(rèn)頻率,極性是否符合要求
6)使用示波器測(cè)試data線,看是否有數(shù)據(jù)輸出,bpp的設(shè)置是否正確
7)如果lcd需要初始化,配置spi的接口,一般分為cpu自帶的spi控制器,和gpio模擬的spi。
8)根據(jù)lcd spec中的初始化代碼進(jìn)行l(wèi)cd的初始化
9)用示波器測(cè)量lcd的spi clk及數(shù)據(jù)線,確認(rèn)是否正常輸出
10)正常情況下,此時(shí)lcd應(yīng)該可以點(diǎn)亮。如果沒有點(diǎn)亮,按照上述步驟1到9,逐項(xiàng)進(jìn)行檢查測(cè)試,重點(diǎn)檢查第5項(xiàng),clk的極性
11)如果lcd點(diǎn)亮,但是花屏。則需要先確認(rèn)數(shù)據(jù)格式是否正確,然后確認(rèn)fb里的數(shù)據(jù)是否正常,有以下幾種方法確認(rèn)fb里的數(shù)據(jù)
i)cat /dev/graphics/fb0 > /sdcard/fb0,然后將/sdcard/fb0 >到另一臺(tái)相同分辨率及相同格式的手機(jī)上,看圖片顯示是否正常 ii)使用irfanview軟件顯示cat /dev/graphics/fb0出來的raw數(shù)據(jù),注意要正確設(shè)置分辨率及格式,否則顯示花屏 iii)如果adb連接正常,可以使用豌豆莢等軟件,查看fb中的數(shù)據(jù)是否正常
通過以上三種途徑,如果確認(rèn)fb中的數(shù)據(jù)正常顯示,則很可能為lcd初始化代碼的問題,或者clk極性的問題,如果fb數(shù)據(jù)不正常,則可能為lcd控制寄存器配置不正常導(dǎo)致
http://blog.csdn.net/dacaozuo/article/details/7796476總結(jié)
以上是生活随笔為你收集整理的高通安卓调试LCD几方面总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机开机画面制作工具(LogoBuild
- 下一篇: SD卡驱动分析(一)