海思Hifb層(一些原理性的東西,無例項說明)
HIFB層的簡介(我們主要處理的是圖形層資料)
1:Hisilicon Framebuffer是海思平臺用於管理疊加圖形層的模組,增加層間colorkey,層間colorkey mask,層間alpha,原點偏移等功能。HIFB一個子裝置號對應一個疊加層,HIFB可以管理多個圖形疊加層(意思就是說。HIFB可以支援多個子裝置,支援多路輸出)。
2:HIFB支援的標準功能:
a:將物理視訊記憶體對映到虛擬記憶體中。
b:像操作普通檔案一樣操作物理視訊記憶體。
c:設定畫素解析度,和畫素格式,,每個疊加圖形層的支援的最大解析度和畫素格式可以通過支援能力介面獲取。
d:從物理視訊記憶體的任何位置進行讀寫,顯示等操作
e:在疊加圖形層支援索引格式的情況下,支援設定和獲取256色的調色盤
增加的功能:
f:設定獲取ALPHa和colorkey值
g:設定當前疊加圖形層的其實位置(相對於螢幕原點的偏移)。以及疊加圖形層的顯示,隱藏狀態。
5:
h:通過模組引數配置Hifb的物理視訊記憶體大小和管理疊加圖形層的數目。
I:新增抗閃爍功能,獲取預乘模式的狀態,壓縮模式,獲取記憶體檢測狀態,圖形層重新整理型別(2buffer型別)。
:::2buffer圖形重新整理型別是分配兩個buffer,一個用來顯示,一個用來繪製。
3:模組載入:默寫linux framebuffer不支援執行期間更改解析度,顏色深度,時序等顯示屬性,,因此linux在核心啟動或者模組載入時,通過引數將相應選項傳遞給linux framebuffer,可以在核心載入器中配置核心啟動引數,
HIFB驅動在載入時只能設定物理視訊記憶體大小。(物理視訊記憶體大小一經設定就不能改變)video=“hifb:vram0_size:xxx, vram1_size:xxx,…”其中,vramn_size:xxx 表示對疊加圖形層n配置xxx K 位元組的物理視訊記憶體。
先載入fb.ko,然後載入hifb.ko引數。
對於標準Fb模式來說:
Vramn_size * 1024 >= xres_virtual * yres_virtual * bpp;
其中:xres_virtual * yres_virtual是虛擬解析度,bpp是每個畫素所佔位元組數。
******vramn_size 必須是PAGE_SIZE(4K byte)的倍數,否則HiFB 驅動強制將其設為PAGE_SIZE的
倍數,向上取整
預設引數值配置Hi3536
video="hifb:vram0_size:32400,
vram1_size:8100,vram2_size:1620,vram3_size:32,vram4_size:32" softcursor="off"
4:HIFB開發步奏:
a:呼叫open開啟指定裝置Hifb裝置。
b:呼叫ioctl,函式設定hifb的畫素格式以及螢幕高寬等引數。
c:呼叫ioctl函式獲取Hifb所分配的物理視訊記憶體大小,跨度等固定資訊。可以使用層間colorkey(把一副圖片的顏色扣掉疊加到另一張圖片上),層間Alpha點(透明度引數),原點便宜等
d:物理視訊記憶體對映到虛擬記憶體
e:完成具體的繪製任務。
f:解除視訊記憶體對映
::::::::::::::::::
由於修改虛擬解析度將改變Hifb的固定資訊fb_fix_screeninfo::line_length(跨度),為保證繪製程式能夠正確執行,推薦先設定HiFB的可變資訊fb_var_screeninfo,再獲取HiFB的固定資訊fb_fix_screeninfo::line_length。.:
5:視訊輸出主要由裝置層,視訊層和圖形層組成。
按裝置層的配置輸出一定的時序驅動與之相連的顯示裝置輸出視訊圖形,同時裝置層決定了裝置解析度。
裝置層的操作都要關上視訊層和圖形層,在對裝置層進行操作,這樣才能顯示正確的視訊和圖形。
所以在open(“dev/fbn”)之前先配置並且開啟裝置層。
每個裝置層支援若干時序輸出,,使用者需要呼叫相關的介面使能裝置層,然後操作圖形層,才能看到結果。
SDK使用VOU 模組控制裝置層。SDK的VOU模組提供裝置層和視訊層控制介面,其中操作裝置層的介面包括:
HI_MPI_VO_Enable/HI_MPI_VO_Disable/HI_MPI_VO_SetPubAttr/HI_MPI_VO_GetPubAttr。