OMAP2/3 顯示子系統¶
這是對 drivers/video/omap 中的 OMAP FB 驅動程式的幾乎完全的重寫(我們稱之為 DSS1)。 DSS1 和 DSS2 之間的主要區別在於 DSI、TV-out 和多顯示器支援,但也有許多小的改進。
DSS2 驅動程式 (omapdss 模組) 位於 arch/arm/plat-omap/dss/ 中,FB、面板和控制器驅動程式位於 drivers/video/omap2/ 中。 DSS1 和 DSS2 目前並存,您可以選擇使用哪一個。
特性¶
已工作並測試過的特性包括
MIPI DPI(並行)輸出
MIPI DSI 輸出(命令模式)
MIPI DBI (RFBI) 輸出
SDI 輸出
TV 輸出
所有部分都可以編譯為模組或在核心中
使用 DISPC 更新任何輸出
使用 CPU 更新 RFBI 或 DSI 輸出
OMAP DISPC 平面
RGB16、RGB24 打包、RGB24 解包
YUV2, UYVY
縮放
調整 DSS FCK 以找到一個好的畫素時鐘
使用 DSI DPLL 建立 DSS FCK
測試過的板子包括:- OMAP3 SDP 板 - Beagle 板 - N810
omapdss 驅動程式¶
DSS 驅動程式本身不支援 Linux framebuffer、V4L 或類似當前的驅動程式,但它有一個內部核心 API,上層驅動程式可以使用它。
DSS 驅動程式以一種靈活的方式建模 OMAP 的覆蓋層、覆蓋管理器和顯示器,以支援非通用的多顯示器配置。 除了對硬體覆蓋層進行建模外,omapdss 還支援虛擬覆蓋層和覆蓋管理器。 當使用 CPU 或系統 DMA 更新顯示器時,可以使用它們。
omapdss 驅動程式對音訊的支援¶
存在多種支援音訊的顯示技術和標準。 因此,更新 DSS 裝置驅動程式以提供可供音訊驅動程式或任何其他對該功能感興趣的驅動程式使用的音訊介面是相關的。
audio_enable 函式旨在準備相關的 IP 進行播放(例如,啟用音訊 FIFO,進出復位某些 IP,啟用配套晶片等)。 它旨在 audio_start 之前呼叫。 audio_disable 函式執行相反的操作,旨在 audio_stop 之後呼叫。
雖然給定的 DSS 裝置驅動程式可能支援音訊,但對於某些配置,可能不支援音訊(例如,使用 VESA 影片時序的 HDMI 顯示器)。 audio_supported 函式旨在查詢顯示器的當前配置是否支援音訊。
audio_config 函式旨在配置顯示器的所有相關音訊引數。 為了使該函式獨立於任何特定的 DSS 裝置驅動程式,定義了一個 struct omap_dss_audio。 它的目的是包含音訊配置所需的所有引數。 目前,該結構包含指向 IEC-60958 通道狀態字和 CEA-861 音訊資訊幀結構的指標。 這應該足以支援 HDMI 和 DisplayPort,因為兩者都基於 CEA-861 和 IEC-60958。
audio_enable/disable、audio_config 和 audio_supported 函式可以實現為可能休眠的函式。 因此,在持有自旋鎖或讀鎖時,不應呼叫它們。
audio_start/audio_stop 函式旨在在配置完成後有效地啟動/停止音訊播放。 這些函式旨在在原子上下文中使用。 因此,audio_start 應該快速返回,並且只有在啟動資料傳輸所需的音訊播放的所有必要資源(音訊 FIFO、DMA 通道、配套晶片等)都已啟用後才能呼叫。 audio_stop 旨在僅停止音訊傳輸。 用於播放的資源使用 audio_disable 釋放。
enum omap_dss_audio_state 可用於幫助介面的實現跟蹤音訊狀態。 初始狀態為 _DISABLED; 然後,狀態轉換為 _CONFIGURED,然後,當它準備好播放音訊時,轉換為 _ENABLED。 狀態 _PLAYING 在渲染音訊時使用。
面板和控制器驅動程式¶
這些驅動程式實現了面板或控制器特定的功能,通常除了透過 omapfb 驅動程式之外,使用者不可見。 它們將自己註冊到 DSS 驅動程式。
omapfb 驅動程式¶
omapfb 驅動程式實現了任意數量的標準 linux framebuffer。 這些 framebuffer 可以靈活地路由到任何覆蓋層,從而允許非常動態的顯示架構。
該驅動程式匯出一些 omapfb 特定的 ioctl,這些 ioctl 與舊驅動程式中的 ioctl 相容。
其餘的非標準特性透過 sysfs 匯出。 最終實現是使用 sysfs 還是 ioctl 仍未確定。
V4L2 驅動程式¶
V4L2 正在 TI 中實現。
從 omapdss 的角度來看,V4L2 驅動程式應該類似於 framebuffer 驅動程式。
架構¶
一些澄清不同元件的功能
Framebuffer 是 OMAP 的 SRAM/SDRAM 中的一個記憶體區域,其中包含影像的畫素資料。 Framebuffer 具有寬度、高度和顏色深度。
覆蓋層定義了從哪裡讀取畫素以及它們在螢幕上的顯示位置。 覆蓋層可能小於 framebuffer,因此只顯示 framebuffer 的一部分。 如果覆蓋層小於顯示器,則可以更改覆蓋層的位置。
覆蓋管理器將覆蓋層組合成一個影像並將其饋送到顯示器。
顯示器是實際的物理顯示裝置。
一個 framebuffer 可以連線到多個覆蓋層,以在所有覆蓋層上顯示相同的畫素資料。 請注意,在這種情況下,覆蓋層輸入大小必須相同,但是,對於影片覆蓋層,輸出大小可以不同。 任何 framebuffer 都可以連線到任何覆蓋層。
一個覆蓋層可以連線到一個覆蓋管理器。 此外,DISPC 覆蓋層只能連線到 DISPC 覆蓋管理器,虛擬覆蓋層只能連線到虛擬覆蓋層。
一個覆蓋管理器可以連線到一個顯示器。 某些覆蓋管理器可以連線到哪些型別的顯示器存在一些限制
DISPC TV 覆蓋管理器只能連線到 TV 顯示器。
虛擬覆蓋管理器只能連線到 DBI 或 DSI 顯示器。
DISPC LCD 覆蓋管理器可以連線到所有顯示器,除了 TV 顯示器。
Sysfs¶
sysfs 介面主要用於測試。 我認為 sysfs 介面不是最終版本中的最佳選擇,但我不太清楚這些事情的最佳介面是什麼。
sysfs 介面分為兩個部分:DSS 和 FB。
/sys/class/graphics/fb? 目錄:mirror 0=off, 1=on rotate 旋轉 0-3 表示 0、90、180、270 度 rotate_type 0 = DMA 旋轉,1 = VRFB 旋轉 overlays Framebuffer 畫素轉到的覆蓋層編號列表 phys_addr Framebuffer 的物理地址 virt_addr Framebuffer 的虛擬地址 size Framebuffer 的大小
/sys/devices/platform/omapdss/overlay? 目錄:enabled 0=off, 1=on input_size 寬度,高度 (即 framebuffer 大小) manager 目標覆蓋管理器名稱 name output_size 寬度,高度 position x,y screen_width 寬度 global_alpha 全域性 alpha 0-255 0=透明 255=不透明
/sys/devices/platform/omapdss/manager? 目錄:display 目標顯示器名稱 alpha_blending_enabled 0=off, 1=on trans_key_enabled 0=off, 1=on trans_key_type gfx-destination, video-source trans_key_value 透明顏色鍵 (RGB24) default_color 預設背景顏色 (RGB24)
/sys/devices/platform/omapdss/display? 目錄
ctrl_name |
控制器名稱 |
mirror |
0=off, 1=on |
update_mode |
0=off, 1=自動, 2=手動 |
enabled |
0=off, 1=on |
name |
|
rotate |
旋轉 0-3 表示 0、90、180、270 度 |
timings |
顯示時序 (畫素時鐘,xres/hfp/hbp/hsw,yres/vfp/vbp/vsw) 寫入時,接受兩個特殊的時序用於 tv-out:“pal” 和 “ntsc” |
panel_name |
|
tear_elim |
撕裂消除 0=off, 1=on |
output_type |
輸出型別(僅限影片編碼器):“composite” 或 “svideo” |
在 <debugfs>/omapdss/ 中也有一些 debugfs 檔案,顯示有關時鐘和暫存器的資訊。
示例¶
已為以下示例進行以下定義
ovl0=/sys/devices/platform/omapdss/overlay0
ovl1=/sys/devices/platform/omapdss/overlay1
ovl2=/sys/devices/platform/omapdss/overlay2
mgr0=/sys/devices/platform/omapdss/manager0
mgr1=/sys/devices/platform/omapdss/manager1
lcd=/sys/devices/platform/omapdss/display0
dvi=/sys/devices/platform/omapdss/display1
tv=/sys/devices/platform/omapdss/display2
fb0=/sys/class/graphics/fb0
fb1=/sys/class/graphics/fb1
fb2=/sys/class/graphics/fb2
OMAP3 SDP 上的預設設定¶
這是 OMAP3 SDP 板上的預設設定。 所有平面都轉到 LCD。 DVI 和 TV-out 未在使用中。 從左到右的列是:framebuffer、覆蓋層、覆蓋管理器、顯示器。 Framebuffer 由 omapfb 處理,其餘由 DSS 處理
FB0 --- GFX -\ DVI
FB1 --- VID1 --+- LCD ---- LCD
FB2 --- VID2 -/ TV ----- TV
示例:從 LCD 切換到 DVI¶
w=`cat $dvi/timings | cut -d "," -f 2 | cut -d "/" -f 1`
h=`cat $dvi/timings | cut -d "," -f 3 | cut -d "/" -f 1`
echo "0" > $lcd/enabled
echo "" > $mgr0/display
fbset -fb /dev/fb0 -xres $w -yres $h -vxres $w -vyres $h
# at this point you have to switch the dvi/lcd dip-switch from the omap board
echo "dvi" > $mgr0/display
echo "1" > $dvi/enabled
之後,配置如下所示:
FB0 --- GFX -\ -- DVI
FB1 --- VID1 --+- LCD -/ LCD
FB2 --- VID2 -/ TV ----- TV
示例:將 GFX 覆蓋克隆到 LCD 和 TV¶
w=`cat $tv/timings | cut -d "," -f 2 | cut -d "/" -f 1`
h=`cat $tv/timings | cut -d "," -f 3 | cut -d "/" -f 1`
echo "0" > $ovl0/enabled
echo "0" > $ovl1/enabled
echo "" > $fb1/overlays
echo "0,1" > $fb0/overlays
echo "$w,$h" > $ovl1/output_size
echo "tv" > $ovl1/manager
echo "1" > $ovl0/enabled
echo "1" > $ovl1/enabled
echo "1" > $tv/enabled
之後,配置如下所示(僅顯示相關部分)
FB0 +-- GFX ---- LCD ---- LCD
\- VID1 ---- TV ---- TV
其他說明¶
OMAP FB 使用標準 dma 分配器分配 framebuffer 記憶體。 您可以啟用 Contiguous Memory Allocator (CONFIG_CMA) 來改進 dma 分配器,如果啟用了 CMA,您可以使用 “cma=” 核心引數來增加 CMA 的全域性記憶體區域。
使用 DSI DPLL 生成畫素時鐘可以產生 86.5MHz 的畫素時鐘(最大可能值),透過它可以從 DVI 獲得 1280x1024@57 輸出。
旋轉和映象當前僅支援 RGB565 和 RGB8888 模式。 VRFB 不支援映象。
VRFB 旋轉比非旋轉 framebuffer 需要更多的記憶體,因此您可能需要在使用 VRFB 旋轉之前增加 vram 設定。 此外,如果許多應用程式不注意所有 framebuffer 引數,則可能無法使用 VRFB。
核心啟動引數¶
- omapfb.mode=<顯示器>:<模式>[,...]
指定顯示器的預設影片模式。 例如,“dvi:800x400MR-24@60”。 請參閱 drivers/video/modedb.c。 還有兩種特殊模式:“pal” 和 “ntsc”,可用於 tv out。
- omapfb.vram=<fbnum>:<size>[@<physaddr>][,...]
為 framebuffer 分配的 VRAM。 通常 omapfb 根據顯示大小分配 vram。 使用此方法,您可以手動分配更多記憶體或定義每個 framebuffer 的物理地址。 例如,“1:4M” 為 fb1 分配 4M。
- omapfb.debug=<y|n>
啟用除錯列印。 您必須在核心配置中啟用 OMAPFB 除錯支援。
- omapfb.test=<y|n>
每當 framebuffer 設定更改時,將測試圖案繪製到 framebuffer。 您需要在核心配置中啟用 OMAPFB 除錯支援。
- omapfb.vrfb=<y|n>
對所有 framebuffer 使用 VRFB 旋轉。
- omapfb.rotate=<角度>
應用於所有 framebuffer 的預設旋轉。 0 - 0 度旋轉 1 - 90 度旋轉 2 - 180 度旋轉 3 - 270 度旋轉
- omapfb.mirror=<y|n>
所有 framebuffer 的預設映象。 僅適用於 DMA 旋轉。
- omapdss.def_disp=<顯示器>
所有覆蓋層將連線到的預設顯示器的名稱。 常見的例子是 “lcd” 或 “tv”。
- omapdss.debug=<y|n>
啟用除錯列印。 您必須在核心配置中啟用 DSS 除錯支援。
TODO¶
DSS 鎖定
錯誤檢查
缺少許多檢查,或者只是作為 BUG() 實現
DSI 的系統 DMA 更新
可用於 RGB16 和 RGB24P 模式。 可能不適用於 RGB24U(如何跳過空位元組?)
OMAP1 支援
不確定是否需要