rk3288 MIPI+EDP 雙屏顯示

2019-12-16html

關鍵字:雙屏異顯android


 

筆者手裏有一塊運行着 Android 5.1 的 rk3288 開發板。ide

 

最近接到一個需求:在這塊開發板上實現 MIPI + EDP 雙屏異顯功能。函數

 

筆者手裏的這塊開發板默認是不支持雙屏異顯的,不過好在 rk 有官方補丁,合入補丁後能夠支持雙屏異顯功能。ui

 

筆者是在網上找到的這份補丁程序,主要參考瞭如下兩篇博客,感謝這兩位博主的無私奉獻:spa

https://www.cnblogs.com/lialong1st/p/9149213.html.net

https://blog.csdn.net/lb5761311/article/details/900244703d

 

其實這兩篇博客中所記載的補丁已是將雙屏異顯的核心功能給支持上的了。通常來說,合入博客中的補丁後都能成功實現雙屏異顯功能。但恰恰筆者就是那個「特殊狀況」,筆者在仔細登入補丁後,仍然發現了一些問題,致使不能實現雙異異顯功能。這篇博客,就來記述一下這些問題以及解決辦法。視頻

 

固然,如下記載的問題現象首先都必需要保證補丁程序被正確無誤地合併進去,必定要仔細檢查每一行補丁代碼,確保不是因爲合補丁失誤引起的問題。htm

 

一、主屏點不亮

上面兩篇博客中都有提到,要將 uboot logo 關掉:

 

至少筆者手裏的 MIPI 屏,或者說主屏,是在 uboot 階段而不是在 kernel 階段點亮的。在 uboot 階段也會去解析 dts 配置,並根據 rockchip,uboot-logo-on 屬性的值來決定是否跑 uboot 階段的點屏操做。因此,若是你發現你在正確合入補丁之後出現了連主屏都點不亮的狀況,能夠嘗試着將這個屬性配置爲1,讓uboot去點一下屏。須要注意的是,rk3288不能直接燒 uboot 分區,須要編譯大包才能應用到 uboot 的修改。但若是僅僅是改一下 kernel 層的 dts 文件,則能夠經過燒 resource.img 來驗證。

 

uboot 階段的點屏流程大體以下:

./u-boot/board/rockchip/common/rkboot/fastboot.c

  board_fbt_preboot();

./u-boot/common/lcd.c

  drv_lcd_init();

  lcd_init();

./u-boot/driver/video/rockchip_fb.c

  lcd_ctrl_init();

 

對了,uboot 階段點屏時解析的屏參 dts 是必須記載在根 dts 下的,即咱們除了要像補丁程序中那樣,在 rk_screen 節點下增長主屏參信息配置,也得在根 dts 下繼續引用完整的屏參文件:

 

若是沒有像上圖那樣 include 進來完整的 MIPI 屏參文件,uboot階段點屏時會報找不到 display-timing 節點錯誤的。

 

通常來講,按照上面的步驟操做之後都能點亮主屏。

 

二、副屏不亮

副屏是沒法在 uboot 階段點亮的。或者說 uboot 默認只點了一塊屏幕,若是你硬要像點主屏同樣在 uboot 階段副屏也點亮,那隻能你本身去研究修改 uboot 代碼了。

 

筆者的副屏不亮就沒有動過 uboot 的代碼。

 

在筆者的 rk3288 中,主屏的視頻數據是來自於 fb0 的,而副屏的是來自於 fb4 的:dev/graphics/fb4。咱們首先來查一下 fb4 的基礎屏參信息:

cat /sys/class/graphics/fb4/screen_info

 

這裏要確保副屏的分辨率與幀率與咱們手裏實際的屏幕對的上。若是對不上,好比筆者的以前就出現過副屏解析成 480x320 的狀況。這樣就固然點不亮了。若是出現了分辨率被解析錯了的狀況,修改如下這個文件:

./kernel/drivers/video/rockchip/lcdc/rk3288_lcdc.c

將 lcdc_read_reg_defalut_cfg 函數的設置屏幕分辨率的代碼註釋掉,以下圖所示:

 

注掉這兩段代碼,能夠解決分辨率被修改的問題。

 

若是發現分辨率與幀率都正確了,仍然點不亮,則能夠查一下副屏的時鐘,即 lcdc1 的時鐘。

 

查詢方式有好幾種,第一種是看開機打印:

 

第二種方式是直接查詢時鐘配置表:

cat /d/clk/clk_summary | grep lcdc

lcdc1 的時鐘必須在副屏的可接受範圍之內,不然至關於副屏的屏參不正確,固然點不亮了。

 

若是發現 lcdc1 的時鐘頻率不對,與本身在 dtsi 中填寫的不一致,則要修改 dtsi。

 

系統是在哪裏強制將你設定在 dtsi 中的時鐘頻率給修改掉的呢?在如下代碼中的 set_dclk 函數中。

./kernel/drivers/video/rockchip/lcdc/rk3288_lcdc.c

 

當初始化副屏時,這個函數會去執行上圖紅箭頭所指的函數,並在裏面根據一些條件來應用或修改你設定的頻率值。有興趣的能夠加打印跟蹤一下這個函數流程,它並不複雜,不過筆者就不在這裏貼出來了。

 

總而言之,解決時鐘頻率被修改的辦法就是加打印跟蹤,並將副屏 dtsi 中的時鐘頻率設置成系統強制設給你的頻率的倍數,固然這個倍數也得在你的屏幕的可接受範圍以內才行。

 

三、HDMI不插副屏不亮

可能有些同窗是沒有嚴格按照補丁程序將 dts 中的 hdmi 節點給關閉掉的。

 

關不關 hdmi 自己不會影響雙屏異顯功能,但有的同窗可能會發現一個神奇的現象:HDMI不插時副屏死活點不亮。

 

這實際上是 rk3288 的機制爲之。這個板子默認就將 lcdc1 與 HDMI 綁定死了的。沒有HDMI時就不給 lcdc1 送視頻數據。更過度的是當插了 HDMI 時,副屏雖然亮了,但使用的屏參倒是 HDMI 顯示器的。換句話說,若是你所接的 HDMI 顯示器的屏參與你要點的副屏的屏參差別較大,是有可能出現插了 HDMI 後副屏黑掉的狀況的。因此嚴格來說,應該是當要用雙屏異顯時就關掉 HDMI 功能,當要使用 HDMI 時就不要用雙屏異顯功能。

 

不過若是咱們不考慮兼容性而非要同時使用雙屏異顯與 HDMI 怎麼辦呢?

 

也簡單,在確保了 fb4/screen_info 中的分辨率與 lcdc1 的時鐘正確之後,在 android 系統中設置一條屬性:

  ro.htg.force=1

便可。即在 /system/build.prop 上添加上這條屬性,重啓便可。

 

四、HDMI撥掉致使副屏熄滅

前面有提到,rk3288 默認將 lcdc1 與 HDMI 綁定死了。當檢測到撥掉 HDMI 時就不往 lcdc1 送視頻數據。

 

因此最簡單的解決辦法就是不上報 HDMI 的撥出事件。只需修改一處代碼便可,以下圖所示:

 

五、副屏花屏

修改副屏的屏參,若是屏參正確了,則將上面第 3 步提到的 ro.htg.force=1 配置一下基本也能解決的了。

相關文章
相關標籤/搜索