在上一小節《Linux GUI加速(1)_GUI系統概述》中,我們從應用層到kernel層大致分析了linux中的圖形界面的構成,並在最後給出了kernel中DRM+KMS的軟體顯示框架以及accelerate logic+framebuffer+displayport的硬體結構。在這一子篇會將這兩塊內容詳細展開。
本篇主要以Xilinx的xc7z010 的SOPC(zybo的開發板)為硬體平台,在以下幾方面介紹:
- 以zynq 7000的邏輯資源(PL)搭建CRTC/Encoder/Connector硬體模塊,以HDMI輸出介面為例,介紹各個模塊的介面特性(Framebuffer對應著物理的DDR部分);
- 會先給出DRM+KMS驅動框架下的主要模塊,並針對上述硬體子模塊分析對應的內核驅動部分;
DRI在片上系統的硬體構成
在各類SOC上,CRTC+Endode+Connector一般是集成在一個外設模塊掛在系統匯流排上,以ARM為例,CRTC/Endoder等需要配置的外設模塊,配置介面掛在APB匯流排,數據介面直接在AHB匯流排上,實現和Framebuffer的高速通信。
我們按照connector-->encoder-->crtc-->framebuffer的順序倒過來介紹吧。
Connector
Connector其實就是和顯示器連接的物理介面,常見的有VGA/HDMI/DVI/DP等。以HDMI為例,HDMI的介面信號主要由以下幾組信號組成:
- 1組TMDS clock:差分時鐘用於同步信號驅動;
- 3組TMDS data:查分數據傳輸視頻信號;
- 1組I2C:用於EDID的獲取;
- 1組音頻匯流排;
(註:EDID全稱是Extended Display Identification Data(擴展顯示標識數據),目的是讓視頻信號輸出設備輸出前獲取到存儲在顯示器內部的相關參數,如支持的解析度、幀率、圖像格式:RGB等,因此,整個輸出的控制參數是由以下幾個部分綜合決定的:
- 通過connector讀出的顯示器支持的參數;
- 內核靜態配置或devicetree傳入的參數;
- 用戶空間輸入的參數)
HDMI類型的connector的任務就是輸出顯示器解碼晶元所需的信號時序(主要是TMDS clock以及TMDS data)。
Encoder
Encoder比較好理解,在此處其實就是將一定格式的圖像信號(如RGB、YUV等)編碼成connector需要輸出的信號。以HDMI為例,幀/行同步/顯示內容都是通過TMDS data的串列匯流排輸出的,那麼並行的時序按照HDMI的標準編碼為串列順序則是Encoder的任務;
在本片中的XC7Z010 SOPC中Encoder+Connector如下: