RPi 樹莓派 DSI 接口研究 MIPI raspberry pi


之前一直在玩樹莓派,發現有個DSI顯示接口一直沒有被用上,經過一番研究發現有點意思,記錄一下相關資料以后再說。

1. DSI接口直接從BCM283x的CPU里面引出來,對應的是VC4(GPU核心)的一個輸出,樹莓派一共有兩個DSI輸出,DSI0只在樹莓派的CM型號中引出。驅動這個端口目前有兩種方法:

  • 官方(實際上是Broadcom和樹莓派基金會)提供的閉源GPU驅動/firmware+kernel patch
  • 開源的DRM驅動,目前已經被整合到kernel當中,但在樹莓派官方系統里面是可選項

2. DSI接口跑的具體協議是MIPI DSI協議,是MIPI組織規定的一種專有的視頻傳輸協議,常見於手機屏幕。這種協議目前並不公開,相關的開發研究較為困難(在某些論壇散落者零星的資料)。與此類似的是CSI攝像頭協議,但目前CSI協議已經被泄露,可以在網上找到詳盡的spec。很久之前還有MIPI DPI協議,這個因為長時間的研究基本上已經被研究清楚,網上可以找到大量資料。

3 關於視頻傳輸格式,基本可以分為三類,HDMI,VGA,A/V,DVI等面向最終用戶的接口,這種接口比較常見,相關資料比較全面也容易適配,但是注意,這些接口一般需要芯片進行轉換,為了通用性實際上無法直接驅動屏幕面板。第二類是一些通用的屏幕接口如edp,lvds,rgb(ttl)等等,這里所說的這些接口往往是可以直接驅動面板的,是直接編碼的像素信息,復雜的是需要考慮時序和屏幕自身的參數(刷新時間,空白時間等等),另外這些協議設計的主要是像素編碼和物理傳輸層的規定。第三類就是一些專用的屏幕接口,如MIPI DSI,MIPI DPI等等,這類接口的特性更為復雜,通過一些特定的指令序列進行控制和視頻數據傳輸。

(補充,也有一些接口既可以外部連接,也可以直接用在屏幕上,比如DP和EDP)

4.關於樹莓派的顯示系統,視頻相關的過程應當分為兩部分分析:視頻的渲染和視頻的輸出(編碼)。

  • 視頻渲染大體分為兩種:直接渲染和GPU渲染,前者類似早期dos中的圖形界面實現方法,幾乎是在利用CPU進行直接解算,而后者是原生的驅動GPU進行渲染。
  • 視頻的輸出:除了某些奇葩的SPI接口屏幕,大部分的輸出都是靠GPU(或者BCM283x里的專用模塊:注意,樹莓派非常集成,除了電源其他所有功能幾乎全部由這片集成的BCM283x芯片實現),包括hdmi,dsi,dpi,a/v等等。目前就樹莓派論壇的討論看,似乎可以利用主屏幕+軟件直接寫入另一個屏幕的方式實現樹莓派雙屏。當然這樣對於GPU來說壓力較大(主要是渲染能力有限。對於輸出來說是由芯片里某些專用模塊實現的,負載並不大——當然前提是你能同時驅動這幾路輸出模塊,目前的官方閉源驅動只能選擇一個輸出路徑作為主屏,至於開源驅動目前可以用但是調試起來很復雜)

5. 目前,全網只有一個方案成功利用了樹莓派的dsi接口,即官方屏幕,DF家也有一塊類似的屏幕。利用dsi屏幕的難點有兩個:硬件和軟件

  • 硬件上,目前除了拆機的,基本沒有能用的mipi dsi屏幕,這一類屏幕往往是定制生產的高清手機屏,專用於某些機型,不可能公開驅動和設計闡述。dpi屏幕也不多。而與此同時,非常常見而且廉價的是rgb、lvds和其他集成了驅動的hdmi成品屏幕。所以,這直接造成了樹莓派的dsi接口難以被直接利用。
  • 軟件上,dsi協議的握手指令等需要主機端自行發出,這一方面需要知道如何驅動gpu在dsi通道上發送這些指令,另一方面還需要知道與屏幕參數對應的dsi指令是什么。由於dsi規范並不公開,而且廠商基本也不會為個人用戶提供具體的dsi驅動方法,這造成了在linux內核這一端,需要根據不同的屏幕寫不同的patch,這也決定了dsi接口很難適用通用屏幕,官方往往只為個別屏幕專門寫了dsi的驅動方法,而且一般是寫死/hardcode在kernel和firmware里面的,更別說還有大部分的驅動是以blob的閉源形式提供的。而且,即使是進行橋接,將dsi橋接到其他格式,也需要首先配置橋接芯片的參數,這一般也是寫死在firmware和kernel里的。

6. 如何解決。官方的方案是dsi->dpi橋接(TC3587系列),DF家的方案是dsi->rgb(icn6211),類似的方案還有TI家的DSI8x系列等等。這些方案的難點是:橋接芯片需要進行配置以適配輸入的dsi信號和輸出給的屏幕參數:要么使用單片機,要么辦法讓host發送這些指令(寫在firmware/kernel里,驅動gpu或其他模塊發送)。對應的,軟件端(包括firmware kernel os 甚至software)必須進行patch並且完全的適配具體屏幕。如果自己做板子,還要考慮高頻數字電路的一些玄學問題(干擾,同步,EMI等等)。總之,這個DSI接口用起來是很難了。

7. 補充:有牛人直接寫FPGA來驅動dsi屏幕的,這個應該是終極解決方案。而且這個足夠硬核,是反向的利用通用信號hdmi去驅動專用屏幕dsi。不過如果有這個技術。。。。應該也不會糾結樹莓派用什么屏幕這種小問題了。

8. 一些思路:

  • 方案A:使用開源驅動,想辦法直接驅動gpu里面的dsi輸出功能,利用TC3587橋接到lvds等通用接口。難度可能在於軟件端需要大量的工作,而且沒有驗證過TC3587系列芯片到底是否能夠這么用。至少可以確認的是,樹莓派自身的dsi應該不能輸出官方屏之外的分辨率,如果需要其他的分辨率乃至屏幕參數,使用開源驅動是必要的。
  • 方案B:使用橋接芯片,利用外置的單片機發送初始參數給橋接芯片。host只需要簡單的控制單片機就可以。但問題是dsi利用樹莓派官方的閉源驅動還是無法輸出其他分辨率,即使可以用單片機解決其他的dsi參數初始化問題。
  • 方案C:模擬/替換樹莓派的DPI輸出。樹莓派在dpi驅動上開發較為完善,提供了多種分辨率支持,並且已經有大量的方案驗證過這個dpi輸出確實可用。痛點在於,dpi輸出需要重定向到gpio上,占用了大量的gpio口比較浪費。如果能過想辦法利用dsi接口走dpi的數據,或者效仿官方方案,利用dsi->dpi,想辦法利用dpi的成熟驅動進行軟件端的處理(分辨率等),也許可以實現dsi口的利用

9. 補充:希望下一代的樹莓派可以將dpi單獨導出來,這樣就可以從根本上解決問題而不再為dsi困擾。Broadcom的意圖很明顯,希望利用RPi的DSI接口促進開發者對於BCM系芯片的高級視頻功能的研究(DSI是為高清視頻設計的,手機屏幕上已經大量采用了,不出意外應該是下一代的通用屏幕接口,當然,如果能開源的話),但目前看來,如果沒有官方的支持,用戶似乎不會對這些功能感興趣,最多也就是感到不便而無可奈何,業余開發者根本不可能去進行這些功能的研究。目前所有的這些成功的嘗試,要么本身就是Broadcom或者RPiF的工程師,要么就是有雄厚財力支持的第三方開發者。苦逼如筆者之類連100M以上示波器都沒有的業余玩家,也許只能洗洗睡了。(哦,對了,我的100M示波器怕是也該還了)。

(全文終)

另:

可能有用的資料

http://m.elecfans.com/article/578395.html

https://www.amobbs.com/thread-5552741-1-1.html

https://toshiba-semicon-storage.com/us/product/assp/interface-bridge/display-interface.html

http://www.ti.com/product/SN65DSI83

(P.S. DSI Tuner 2.0)

https://www.raspberrypi.org/forums/viewtopic.php?t=213625

https://www.raspberrypi.org/forums/viewtopic.php?t=153954

https://raspberrypi.stackexchange.com/questions/49450/does-the-raspberry-pi-touch-display-work-with-regular-kernel

https://www.raspberrypi.org/forums/viewtopic.php?t=178179

https://github.com/anholt/linux/wiki/Raspberry-Pi-and-other-MIPI-DSI-display-panels

http://raspi.tv/2014/raspberry-pi-official-7-inch-dsi-prototype-preview

https://github.com/daveshah1/DSITx

https://www.raspberrypi.org/forums/viewtopic.php?f=45&t=157109

https://hackaday.io/project/364-mipi-dsi-display-shieldhdmi-adapter/details

https://github.com/hermanhermitage/videocoreiv/wiki/VideoCore-IV-Programmers-Manual

https://www.raspberrypi.org/forums/viewtopic.php?t=188908

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=2f733d6194bd58b26b705698f96b0f0bd9225369

https://dri.freedesktop.org/docs/drm/gpu/vc4.html

 

@anholt

@6by9 

@hermanhermitage @openedev 

@aBUGSworstnightmare @es_pi_user 

https://www.raspberrypi.org/forums/index.php

https://github.com

https://www.google.com

https://blog.csdn.net

 

最后,不是很喜歡論壇里大量的不可能、不行的說法,這也是進行這番研究的最初目的。

沒有什么不可能,僅僅是時間和成本是否值得付出。

 

打賞

免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2021 CODEPRJ.COM