最近剛除錯了基於rk3128平台的lcd驅動,順便記錄總結一下,
有不足之處,望各位不吝賜教!
1.**架構
drivers/video/rockchip/transmitter/
|_ rk32_mipi_dsi.c /* mipi 驅動主體檔案 */
|_ rk32_mipi_dsi.h /* 暫存器以及結構體的定義 */
|_ mipi_dsi.c /* 封裝的函式指標介面函式, 供 lcd_mipi.c 呼叫, 函式的具體實現
在 rk32_mipi_dsi.c 中 */
|_ mipi_dsi.h /* mipi 協議相關的巨集定義以及函式指標結構體定義 */
drivers/video/rockchip/screen/
|_ lcd_mipi.c /* 屏參 dtsi 檔案的解析 */
由於rk3128平台使用了3.10以後的核心,所以採用了dts的形式來管理驅動,剛開始的時候會覺得不順手,用多了還是相當方便的
2.**架構圖
無論是正常的開機流程以及休眠喚醒的流程,顯示相關的模組都是要和 fb 以及
vop(lcdc)互動的。rk32_dsi_enable()和 rk32_dsi_disable()函式作為 mipi 和 vop 之
間 的 交 互 的 總 入 口 函 數 。 另 外 還 有 一 對 rk32_mipi_power_up_ddr() 和
rk32_mipi_power_down_ddr()函式是單獨供 ddr 變頻的時候使用,
正常的開機以及休
眠喚醒流程不走這兩個函式。開機流程圖如下圖所示:
dsi_init() : 該函式主要實現 mipi host 和 phy 的上電以及初始化工作。
rk_mipi_screen_standby() : 屏的供電以及屏的初始化工作(屏初始化命令的傳送)
dsi_enable_video_mode() : command 模式和 video 模式的切換,傳送命令一般是在 command 模式下,正常資料傳輸是在 video 模下。
dsi_is_enable() : mipi host 的關閉與開啟。
3.移植過程
a.配置menuconfig
b.新增關於lcd的dtsi檔案(屏參檔案)
在kernel/arch/arm/boot/dts中隨便找乙個其他mipi屏的dtsi檔案參考其寫法(3.10核心的新變化,也可以不用)
屏參檔案包含四個部分:mipi host 配置、屏電源控制配置、屏初始化序列和屏參。
b.1 mipi host的配置
disp_mipi_init: mipi_dsi_init;
screen_init : 表示屏是否需要初始化,如果需要則置為 1.
dsi_lane : mipi 資料傳輸需要幾條資料 lane,這個一般根據原理圖和 mipi 屏的規格書來配置。這個指的是每個 mipi 的資料 lane 數。譬如如果是雙 mipi,每個 mipi 為 4 lane。那麼此處仍然設定為 4。
dsi_hs_clk : 屏 ddr clk,表示一條資料 lane 的傳輸速率,單位為 mbits/s。有個大概的計算公式:100+h_total*v_total*fps*3*8/lanes。h_total,v_total 包括 active,bp,fp 和 sync-len 的和;fps 為幀率,剛除錯一款屏時,fps 為 50 多幀就好,然後慢慢抬高;3 為乙個畫素點為 rgb 3 個位元組;8 為 8 bits;lanes 為(dsi_lane*mipi_dsi_num) ;100 為實際的結果要比理論值大 100m 左右。上面計算得到的值只是大概值並非精確的值,但是對於一般的屏都適用,對於部分屏需要微調該值。
mipi_dsi_num : 單 mipi 還是雙 mipi,也是根據原理圖和螢幕規格書來配置的。如果是雙 mipi 則置為 2。單 mipi 的屏 sdk **預設設定的是 mipi_tx,所以單 mipi 是接mipi_tx 這一路,雙 mipi 接法:mipi_tx 這路接左屏,mipi_tx/rx 這一路接右屏。
b.2 屏電源的配置
&lcdc ;
lcd_rst:lcd_rst;
lcd_en:lcd_en ;
};};
電源配置的 gpios 需要根據原理圖來配置 lcd_en 等各對應哪路 gpio
b.3 屏的初始化序列
disp_mipi_init_cmds: screen-on-cmds ;
rockchip,on-cmds2 ; 。
。 。rockchip,on-cmds8 ;
rockchip,on-cmds9 ;
};
cmd_type : 命令是在 low power(lpdt)還是 high speed(hsdt)下傳送。
dsi_id : 命令通過哪個 mipi 傳送。0 表示在 mipi0 傳送,1 表示在 mipi1 傳送,2 表示雙 mipi 同時傳送。因為很少出現單獨使用 mipi1 的情況,所以對於單 mipi,這個值預設是 0;對於雙 mipi,這個值 是 2。
cmd : 初始化命令。格式:命令型別(如 0x05/0x15/0x39)+命令+引數。具體細節見 mipi 協議文件。
注:最後兩條命令是mipi協議規定的,一定要加的0x11:
exit_sleep_mode,0x29:set_display_on 表示告訴顯示裝置(屏)可以開始顯示影象資料了。
b.4 屏的引數
disp_timings: display-timings ;
}; screen-type : 螢幕型別,對於 mipi 屏來說有兩種選擇:單 mipi(screen_mipi);雙 mipi(screen_dual_mipi);
lvds-format : lvds 資料格式。對於 mipi 來說是無效引數,不用配置
out-face : 螢幕接線格式
上述三個引數的取值在 include/dt-bindings/rkfb/rk_fb.h 中定義。
clock-frequency : dclk 頻率,單位為 hz,一般屏的規格書中有,如果沒有可以通過公式計算:h*v(包括同步訊號)*fps
hactive : 水平有效畫素
vactive : 垂直有效畫素
hback-porch/hfront-porch/hsync-len : 水平同步訊號
vback-porch/vfront-porch/vsync-len : 垂直同步訊號
hsync-active 、 vsync-active 、 de-active 、 pixelclk-active :分 別 為 hync,vsync,den,dclk 的極性控制。置 1 將對極性進行翻轉。
swap-rb、swap-rg、swap-gb : 設 1 將對對應的顏色進行翻轉。
b.5 板級檔案配置
屏參檔案配置好以後,需要在板級檔案中包含這個屏參檔案:
#include "lcd-***xx-mipi.dtsi"
因為在晶元 dtsi 中預設是關閉的,所以需要在板級板級檔案中開啟 mipi host
&dsihost0 ;
因為是單mipi,只要配置乙個就可以了
4.除錯遇到的問題與總結
1.開機後lcd屏閃
問題定位:修改**,提高dclk到乙個較高的頻率;
(1)若提高pclk後,屏閃現象消失
現象分析:說明此現象是重新整理頻率較低引起的;
解決方法:將dclk提高到乙個合適的較高頻率;
(2)若提高dclk後,屏閃現象仍然存在
現象分析:說明此現象不是重新整理頻率較低引起的,這種情況是lcd極性設定不正確造成的;
解決方法:在dtsi檔案中修改lcd的極性;
2.休眠喚醒,只有背光亮,屏不亮
問題定位:檢視喚醒時的log,**跑崩了,重新上電,屏是可以起來的,可能是喚醒屏時,en,rst的配置有問題
自己其實當時用了乙個很low的方法來獲取rst,en腳的管腳號,在lcd_mipi.c中通過解析dtsi的那個檔案的那個函式,獲得了gpio號,
然後在用gpio_direction_output的方法設定管腳號(這也是我剛開始不習慣的原因),後來在rk_fb.c的檔案中發現有現成的介面,做了修改,**倒是不崩潰了,但是屏還是不亮,通過log發現休眠喚醒時,居然沒有走我的初始化序列,一看,發現少了0x11和0x29兩條指令,加上後,問題解決
解決方法:修改獲得pin腳號的方法,加上0x11和0x29命令
STM32驅動LCD1602程式(除錯已成功)
io接線 rs pa8 rw pb6 e pb7 lcd1602 io pb8 pb15 所有的口都配置成開漏輸出,並且所有的口都通過10k電阻上拉至5v,部分電路圖如下 程式 lcd1602.c include lcd1602.h void lcd1602 gpio init out lcd160...
linux 驅動除錯問題記錄
檔案屬性 rwx rwx rwx sudo chmod 777 dev 其中 r 4,w 2,x 1 詳細sudo dmesg詳細 但是通過改變printk的列印級別沒有除錯成功echo 8 4 1 7 proc sys kernel printk其中數值都可以更改 cat proc sys ker...
linux上sd卡驅動移植除錯記錄
編譯出來了之後,我插上了我的乙個512mb的卡,在啟動資訊了列印如下 s3c2440 sdi s3c2440 sdi powered down.mmc0 error 110 whilst initialising sd card s3c2440 sdi s3c2440 sdi powered dow...