Tina_Linux_Display_開發(fā)指南
1 概述
1.1 編寫目的
讓顯示應(yīng)用開發(fā)人員了解顯示驅(qū)動(dòng)的接口及使用流程,快速上手,進(jìn)行開發(fā);讓新人接手工作時(shí)能快速地了解驅(qū)動(dòng)接口,進(jìn)行調(diào)試排查問題。
1.2 適用范圍
sunxi 平臺(tái)DE1.0/DE2.0。
1.3 相關(guān)人員
與顯示相關(guān)的應(yīng)用開發(fā)人員,及與顯示相關(guān)的其他模塊的開發(fā)人員,以及新人。
2 模塊介紹
2.1 模塊功能介紹
?
圖2-1: 模塊框圖
?
本模塊框圖如上,由顯示引擎(DE)和各類型控制器(tcon)組成。輸入圖層(layers)在DE中進(jìn)行顯示相關(guān)處理后,通過一種或多種接口輸出到顯示設(shè)備上顯
示,以達(dá)到將眾多應(yīng)用渲染的圖層合成后在顯示器呈現(xiàn)給用戶觀看的作用。DE 有2 個(gè)獨(dú)立單元(可以簡(jiǎn)稱de0、de1),可以分別接受用戶輸入的圖層進(jìn)行合成,
輸出到不同的顯示器,以實(shí)現(xiàn)雙顯。DE 的每個(gè)獨(dú)立的單元有1-4 個(gè)通道(典型地,de0 有4 個(gè),de1 有2 個(gè)),每個(gè)通道可以同時(shí)處理接受4 個(gè)格式相同的
圖層。sunxi 平臺(tái)有視頻通道和UI 通道之分。視頻通道功能強(qiáng)大,可以支持YUV 格式和RGB圖層。UI 通道只支持RGB 圖層。
簡(jiǎn)單來說,顯示模塊的主要功能如下:
? 支持lcd(hv/lvds/cpu/dsi) 輸出。 ? 支持雙顯輸出。 ? 支持多圖層疊加混合處理。 ? 支持多種顯示效果處理(alpha, colorkey, 圖像增強(qiáng),亮度/對(duì)比度/飽和度/色度調(diào)整)。 ? 支持智能背光調(diào)節(jié)。 ? 支持多種圖像數(shù)據(jù)格式輸入(arg,yuv)。 ? 支持圖像縮放處理。 ? 支持截屏。 ? 支持圖像轉(zhuǎn)換。
2.2 相關(guān)術(shù)語介紹
2.2.1 硬件術(shù)語介紹
?
表2-1: 硬件術(shù)語介紹表
?
術(shù)語 | 解釋 |
---|---|
de | display engine,顯示引擎,負(fù)責(zé)將輸入的多圖層進(jìn)行疊加、混合、縮放等處理的硬件模塊 |
channel | 一個(gè)硬件通道,包含若干圖層處理單元,可以同時(shí)處理若干(典型4 個(gè))格式相同的圖層 |
layer | 一個(gè)圖層處理單元,可以處理一張輸入圖像,按支持的圖像格式分video 和ui類型 |
capture | 截屏,將de 的輸出保存到本地文件 |
alpha | 透明度,在混合時(shí)決定對(duì)應(yīng)圖像的透明度 |
transform | 圖像變換,如平移、旋轉(zhuǎn)等 |
overlay | 圖像疊加,按順序?qū)D像疊加一起的效果。z 序大的靠近觀察者,會(huì)把z 序小的擋住 |
blending | 圖像混合,按alpha 比例將圖像合成一起的效果 |
enhance | 圖像增強(qiáng),有目的地處理圖像數(shù)據(jù)以達(dá)到改善圖像效果的過程或方法 |
2.2.2 軟件術(shù)語介紹
?
表2-2: 軟件術(shù)語介紹表
?
術(shù)語 | 解釋 |
---|---|
fb | 幀緩沖(framebuffer),Linux 為顯示設(shè)備提供的一個(gè)接口,把顯存抽象成的一種設(shè)備。有時(shí)也指一塊顯存 |
al | 抽象層,驅(qū)動(dòng)中將底層硬件抽象成固定業(yè)務(wù)邏輯的軟件層 |
lowlevel | 底層,直接操作硬件寄存器的軟件層 |
2.3 模塊配置介紹
2.3.1 kenel_menuconfig 配置說明
make kenel_menuconfig
具體配置目錄為:
Device Drivers --->
Graphics support --->
<*> Support for frame buffer devices --->
Video support for sunxi --->
<*> DISP Driver Support(sunxi-disp2)
?
圖2-2: disp 配置
?
其中:
? DISP Driver Support(sunxi-disp2)
DE 驅(qū)動(dòng)請(qǐng)選上。
? debugfs support for disp driver(sunxi-disp2)
調(diào)試節(jié)點(diǎn),建議選上,方便調(diào)試。
? composer support for disp driver(sunxi-disp2)
disp2 的fence 處理。linux 系統(tǒng)可以不選擇。
2.4 源碼結(jié)構(gòu)介紹
源碼結(jié)構(gòu)如下:
├─drivers
│ ├─video
│ │ ├─fbdev
│ │ │ ├─sunxi --display driver for sunxi
│ │ │ │ ├─disp2/ --disp2 的目錄
│ │ │ │ │ ├─disp
│ │ │ │ │ │ ├─dev_disp.c --display driver 層
│ │ │ │ │ │ ├─dev_fb.c --framebuffer driver 層
│ │ │ │ │ │ ├─de --bsp層
│ │ │ │ │ │ │ ├─disp_lcd.c --disp_manager.c ..
│ │ │ │ │ │ │ ├─disp_al.c --al層
│ │ │ │ │ │ │ │ └─lowlevel_sun*i/ --lowlevel 層
│ │ │ │ │ │ │ │ ├─de_lcd.c ...
│ │ │ │ │ │ │ └─disp_sys_int.c --OSAL 層,與操作系統(tǒng)相關(guān)層
│ │ │ │ │ │ ├─lcd/ lcd driver
│ │ │ │ │ │ │ │─lcd_src_interface.c --與display 驅(qū)動(dòng)的接口
│ │ │ │ │ │ │ │─default_panel.c... --平臺(tái)已經(jīng)支持的屏驅(qū)動(dòng)
include
├─video video header dir
│ ├─sunxi_display2.h display header file
2.5 驅(qū)動(dòng)框架介紹
?
圖2-3: 驅(qū)動(dòng)框圖
?
顯示驅(qū)動(dòng)可劃分為三個(gè)層面,驅(qū)動(dòng)層,框架層及底層。底層與圖形硬件相接,主要負(fù)責(zé)將上層配置的功能參數(shù)轉(zhuǎn)換成硬件所需要的參數(shù),并配置到相應(yīng)寄存器中。
顯示框架層對(duì)底層進(jìn)行抽象封裝成一個(gè)個(gè)的功能模塊。驅(qū)動(dòng)層對(duì)外封裝功能接口,通過內(nèi)核向用戶空間提供相應(yīng)的設(shè)備結(jié)點(diǎn)及統(tǒng)一的接口。在驅(qū)動(dòng)層,分為四個(gè)驅(qū)
動(dòng),分別是framebuffer 驅(qū)動(dòng),disp 驅(qū)動(dòng),lcd 驅(qū)動(dòng),hdmi 驅(qū)動(dòng)。Framebuffer 驅(qū)動(dòng)與framebuffer core 對(duì)接,實(shí)現(xiàn)linux 標(biāo)準(zhǔn)的framebuffre 接口。
Disp 驅(qū)動(dòng)是是整個(gè)顯示驅(qū)動(dòng)中的核心驅(qū)動(dòng)模塊,所有的接口都由disp 驅(qū)動(dòng)來提供,包括lcd 的接口。
3 模塊接口概述
模塊使用主要通過ioctl 實(shí)現(xiàn),對(duì)應(yīng)的驅(qū)動(dòng)節(jié)點(diǎn)是/dev/disp。
具體定義請(qǐng)仔細(xì)閱讀頭文件上面的注釋,kernel/linux-4.9/include/video/sunxi_display2.h。
對(duì)于顯示模塊來說,把圖層參數(shù)設(shè)置到驅(qū)動(dòng),讓顯示器顯示為最重要。sunxi 平臺(tái)的DE 接受用戶設(shè)置圖層參數(shù),通過disp,channel,layer_id 三個(gè)索引確定需要設(shè)置的顯示位置(disp:0/1,channel: 0/1/2/3,layer_id:0/1/2/3),其中disp 表示顯示器索引,channel 表示通道索引,layer_id 表示通道內(nèi)的圖層索引。
下面著重地把圖層的參數(shù)從頭文件中拿出來介紹。
truct disp_fb_info2 {
int fd;
struct disp_rectsz size[3];
unsigned int align[3];
enum disp_pixel_format format;
enum disp_color_space color_space;
int trd_right_fd;
bool pre_multiply;
struct disp_rect64 crop;
enum disp_buffer_flags flags;
enum disp_scan_flags scan;
enum disp_eotf eotf;
int depth;
unsigned int fbd_en;
int metadata_fd;
unsigned int metadata_size;
unsigned int metadata_flag;
};
? fd
顯存的文件句柄。
? size 與crop
Size 表示buffer 的完整尺寸,crop 則表示buffer 中需要顯示裁減區(qū)。如下圖所示,完整的圖像以size 標(biāo)識(shí),而矩形框住的部分為裁減區(qū),以crop 標(biāo)識(shí),在屏幕上
只能看到crop 標(biāo)識(shí)的部分,其余部分是隱藏的,不能在屏幕上顯示出來的。
?
圖3-1: size 和crop 示意圖
?
? crop 和screen_win
crop 上面已經(jīng)介紹過,Screen_win 為crop 部分buffer 在屏幕上顯示的位置。如果不需要進(jìn)行縮放的話,crop 和screen_win 的width,height 是相等的,如果需要
縮放,crop 和screen_win 的width,height 可以不相等。
?
圖3-2: crop 和screen win 示意圖
?
? alpha
Alpha 模式有三種:
gloabal alpha: 全局alpha,也叫面alpha,即整個(gè)圖層共用一個(gè)alpha,統(tǒng)一的透明度。
pixel alpha: 點(diǎn)alpha,即每個(gè)像素都有自己?jiǎn)为?dú)的alpha,可以實(shí)現(xiàn)部分區(qū)域全透,部分區(qū)域半透,部分區(qū)域不透的效果。
global_pixel alpha: 可以是說以上兩種效果的疊加,在實(shí)現(xiàn)pxiel alpha 的效果的同時(shí),還可以做淡入淺出的效果。
?
圖3-3: alpha 疊加模式
?
? align
顯存的對(duì)齊字節(jié)數(shù)。
? format
輸入圖層的格式。Ui 通道支持的格式:
DISP_FORMAT_ARGB_8888
DISP_FORMAT_ABGR_8888
DISP_FORMAT_RGBA_8888
DISP_FORMAT_BGRA_8888
DISP_FORMAT_XRGB_8888
DISP_FORMAT_XBGR_8888
DISP_FORMAT_RGBX_8888
DISP_FORMAT_BGRX_8888
DISP_FORMAT_RGB_888
DISP_FORMAT_BGR_888
DISP_FORMAT_RGB_565
DISP_FORMAT_BGR_565
DISP_FORMAT_ARGB_4444
DISP_FORMAT_ABGR_4444
DISP_FORMAT_RGBA_4444
DISP_FORMAT_BGRA_4444
DISP_FORMAT_ARGB_1555
DISP_FORMAT_ABGR_1555
DISP_FORMAT_RGBA_5551
DISP_FORMAT_BGRA_5551
DISP_FORMAT_A2R10G10B10
DISP_FORMAT_A2B10G10R10
DISP_FORMAT_R10G10B10A2
DISP_FORMAT_B10G10R10A2
Video 通道支持的格式:
DISP_FORMAT_ARGB_8888
DISP_FORMAT_ABGR_8888
DISP_FORMAT_RGBA_8888
DISP_FORMAT_BGRA_8888
DISP_FORMAT_XRGB_8888
DISP_FORMAT_XBGR_8888
DISP_FORMAT_RGBX_8888
DISP_FORMAT_BGRX_8888
DISP_FORMAT_RGB_888
DISP_FORMAT_BGR_888
DISP_FORMAT_RGB_565
DISP_FORMAT_BGR_565
DISP_FORMAT_ARGB_4444
DISP_FORMAT_ABGR_4444
DISP_FORMAT_RGBA_4444
DISP_FORMAT_BGRA_4444
DISP_FORMAT_ARGB_1555
DISP_FORMAT_ABGR_1555
DISP_FORMAT_RGBA_5551
DISP_FORMAT_BGRA_5551
DISP_FORMAT_YUV444_I_AYUV
DISP_FORMAT_YUV444_I_VUYA
DISP_FORMAT_YUV422_I_YVYU
DISP_FORMAT_YUV422_I_YUYV
DISP_FORMAT_YUV422_I_UYVY
DISP_FORMAT_YUV422_I_VYUY
DISP_FORMAT_YUV444_P
DISP_FORMAT_YUV422_P
DISP_FORMAT_YUV420_P
DISP_FORMAT_YUV411_P
DISP_FORMAT_YUV422_SP_UVUV
DISP_FORMAT_YUV422_SP_VUVU
DISP_FORMAT_YUV420_SP_UVUV
DISP_FORMAT_YUV420_SP_VUVU
DISP_FORMAT_YUV411_SP_UVUV
DISP_FORMAT_YUV411_SP_VUVU
DISP_FORMAT_YUV444_I_AYUV_10BIT
DISP_FORMAT_YUV444_I_VUYA_10BIT
所有圖層都支持縮放。對(duì)圖層的操作如下所示:
設(shè)置圖層參數(shù)并使能,接口為DISP_LAYER_SET_CONFIG,圖像格式,buffer size, buffer 地址,alpha 模式,enable,圖像幀id 號(hào)等參數(shù)。
關(guān)閉圖層,依然通過DISP_LAYER_SET_CONFIG,將enable 參數(shù)設(shè)置為0 關(guān)閉。
4 顯示輸出設(shè)備操作說明
Disp2 支持多種的顯示輸出設(shè)備,LCD、TV、HDMI。開啟顯示輸出設(shè)備有幾種方式,第一種是在sys_config 或dts 中配置[disp] 的初始化參數(shù),顯示模塊在加載時(shí)
將會(huì)根據(jù)配置初始化選擇的顯示輸出設(shè)備;第二種是在kernel 啟動(dòng)后,調(diào)用驅(qū)動(dòng)模塊的ioctl 接口去開啟或關(guān)閉指定的輸出設(shè)備,以下是操作的說明:
? 開啟或切換到某個(gè)具體的顯示輸出設(shè)備,ioctl(DISP_DEVICE_SWITCH…),參數(shù)設(shè)置為特定的輸出設(shè)備類型,DISP_OUTPUT_TYPE_LCD/TV/HDMI。
? 關(guān)閉某個(gè)設(shè)備,ioctrl(DISP_DEVICE_SWITCH…),參數(shù)設(shè)置為DISP_OUTPUT_TYPE_NONE。
5 接口參數(shù)更改說明
sunxi 平臺(tái)支持disp1 和disp2。
?
表5-1: disp1 與disp2 區(qū)別
?
項(xiàng)目平臺(tái) | disp2 | disp1 |
---|---|---|
圖層標(biāo)識(shí) | 以disp, chennel, layer_id 唯一標(biāo)識(shí) | 以disp, layer_id 唯一標(biāo)識(shí) |
圖層開關(guān) | 將開關(guān)當(dāng)成圖層參數(shù)設(shè)置DISP_LAYER_SET_CONFIG 中 | 獨(dú)立圖層開關(guān)接口 |
圖層size | 每個(gè)分量都需要設(shè)置1 個(gè)size | 一個(gè)buffer 只有1 |
圖層align | 針對(duì)每個(gè)分量需要設(shè)置其align,單位為byte。 | 無 |
圖層Crop | 為64 位定點(diǎn)小數(shù),高32 位為整數(shù),低32位為小數(shù) | 為32 位參數(shù),不支持小數(shù) |
YUV MB 格式支持 | 不再支持 | 支持 |
PALETTE 格式支持 | 不再支持 | 支持 |
單色模式(無buffer) | 支持 | 不支持 |
Pipe 選擇 | Pipe 對(duì)用戶透明,用戶無需選擇,只需要配置channel | 用戶設(shè)置 |
zorder | 用戶設(shè)置,保證zorder 不重復(fù),從0 到N-1 | 用戶不能設(shè)置 |
設(shè)置圖層信息接口 | 一次可設(shè)置多個(gè)圖層的信息,增加一個(gè)圖層信息數(shù)目參數(shù) | 一次設(shè)置1 個(gè)圖層信息 |
6 輸出設(shè)備介紹
平臺(tái)支持屏以及HDMI 輸出,及二者同時(shí)顯示。
6.1 屏
屏的接口很多,平臺(tái)支持RGB/CPU/LVDS/DSI 接口。
6.2 HDMI
HDMI 全名是:High-Definition Multimedia Interface。可以提供DVD,audio device, settop boxes,television sets, and other video displays 之間的高清互
聯(lián)。可以承載音,視頻數(shù)據(jù),以及其他的控制,數(shù)據(jù)信息。支持熱插拔,內(nèi)容保護(hù),模式是否支持的查詢。
6.3 同顯
驅(qū)動(dòng)支持雙路顯示。屏(主)+ HDMI(輔)。
同顯或異顯,差別只在于顯示內(nèi)容,如果顯示內(nèi)容一樣,則為同顯;反之,則為異顯。
如果是android 系統(tǒng),4.2 版本以上版本,原生框架已經(jīng)支持多顯(同顯,異顯,虛擬顯示設(shè)備),實(shí)現(xiàn)同顯則比較簡(jiǎn)單,在android hal 與上層對(duì)接好即可。
如果是android 4.1 以下版本,同顯需要自行實(shí)現(xiàn),參考做法為主屏內(nèi)容由android 原生提供,輔屏需要android hal 在合適的時(shí)機(jī)(比如HDMI 插入時(shí))打開
輔屏,并且將主屏的內(nèi)容(存放于FB0 中),拷貝至輔屏的顯示后端buffer 中,然后將輔屏的后端buffer 切換到前端buffer。注意問題為,兩路顯示的顯示
buffer 的同步,如果同步不好,會(huì)產(chǎn)生圖像撕裂,錯(cuò)位的現(xiàn)象。
如果是Linux 系統(tǒng),做法與上一個(gè)做法類似。
7 IOCTL 接口描述
sunxi 平臺(tái)下顯示驅(qū)動(dòng)給用戶提供了眾多功能接口,可對(duì)圖層、LCD、hdmi 等顯示資源進(jìn)行操作。
7.1 Global Interface
7.1.1 DISP_SHADOW_PROTECT
? 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_SHADOW_PROTECT |
arg | arg[0] 為顯示通道0/1;arg[1] 為protect 參數(shù),1 表示protect, 0: 表示not protect |
? 返回值
如果成功,返回DIS_SUCCESS,否則,返回失敗號(hào)。
? 描述
DISP_SHADOW_PROTECT(1)與DISP_SHADOW_PROTECT(0)配對(duì)使用,在protect期間,所有的請(qǐng)求當(dāng)成一個(gè)命令序列緩沖起來, 等到調(diào)用
DISP_SHADOW_PROTECT(0)后將一起執(zhí)行。
? 示例
//啟動(dòng)cache,disphd為顯示驅(qū)動(dòng)句柄
unsigned int arg[3];
arg[0] = 0;//disp0
arg[1] = 1;//protect
ioctl(disphd, DISP_SHADOW_PROTECT, (void*)arg);
//do somthing other
arg[1] = 0;//unprotect
ioctl(disphd, DISP_SHADOW_PROTECT, (void*)arg);
7.1.2 DISP_SET_BKCOLOR
? 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_SET_BKCOLOR |
arg | arg[0] 為顯示通道0/1;arg[1] 為backcolor 信息,指向disp_color 數(shù)據(jù)結(jié)構(gòu)指針 |
? 返回值
如果成功,返回DIS_SUCCESS,否則,返回失敗號(hào)。
? 描述
該函數(shù)用于設(shè)置顯示背景色。
? 示例
//設(shè)置顯示背景色,disphd為顯示驅(qū)動(dòng)句柄,sel為屏0/1 disp_color bk; unsigned int arg[3]; bk.red = 0xff; bk.green = 0x00; bk.blue = 0x00; arg[0] = 0; arg[1] = (unsigned int)&bk; ioctl(disphd, DISP_SET_BKCOLOR, (void*)arg);
7.1.3 DISP_GET_BKCOLOR
? 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_GET_BKCOLOR |
arg | arg[0] 為顯示通道0/1;arg[1] 為backcolor 信息,指向disp_color 數(shù)據(jù)結(jié)構(gòu)指針 |
? 返回值
如果成功,返回DIS_SUCCESS,否則,返回失敗號(hào)。
? 描述
該函數(shù)用于獲取顯示背景色。
? 示例
//獲取顯示背景色,disphd為顯示驅(qū)動(dòng)句柄,sel為屏0/1 disp_color bk; unsigned int arg[3]; arg[0] = 0; arg[1] = (unsigned int)&bk; ioctl(disphd, DISP_GET_BKCOLOR, (void*)arg);
7.1.4 DISP_GET_SCN_WIDTH
? 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_GET_SCN_WIDTH |
arg | arg[0] 顯示通道0/1 |
? 返回值
如果成功,返回當(dāng)前屏幕水平分辨率,否則,返回失敗號(hào)。
? 描述
該函數(shù)用于獲取當(dāng)前屏幕水平分辨率。
? 示例
//獲取屏幕水平分辨率 unsigned int screen_width; unsigned int arg[3]; arg[0] = 0; screen_width = ioctl(disphd, DISP_GET_SCN_WIDTH, (void*)arg);
7.1.5 DISP_GET_SCN_HEIGHT
? 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_GET_SCN_HEIGHT |
arg | arg[0] 顯示通道0/1 |
? 返回值
如果成功,返回當(dāng)前屏幕垂直分辨率,否則,返回失敗號(hào)。
? 描述
該函數(shù)用于獲取當(dāng)前屏幕垂直分辨率。
? 示例
//獲取屏幕垂直分辨率 unsigned int screen_height; unsigned int arg[3]; arg[0] = 0; screen_height = ioctl(disphd, DISP_GET_SCN_HEIGHT, (void*)arg);
7.1.6 DISP_GET_OUTPUT_TYPE
? 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_GET_OUTPUT_TYPE |
arg | arg[0] 顯示通道0/1 |
? 返回值
如果成功,返回當(dāng)前顯示輸出類型,否則,返回失敗號(hào)。
? 描述
該函數(shù)用于獲取當(dāng)前顯示輸出類型(LCD,TV,HDMI,VGA,NONE)。
? 示例
//獲取當(dāng)前顯示輸出類型 disp_output_type output_type; unsigned int arg[3]; arg[0] = 0; output_type = (disp_output_type)ioctl(disphd, DISP_GET_OUTPUT_TYPE, (void*)arg);
7.1.7 DISP_GET_OUTPUT
? 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_GET_OUTPUT |
arg | arg[0] 為顯示通道0/1;arg[1] 為指向disp_output 結(jié)構(gòu)體的指針,用于保存返回值 |
? 返回值
如果成功,返回0,否則,返回失敗號(hào)。
? 描述
該函數(shù)用于獲取當(dāng)前顯示輸出類型及模式(LCD,TV,HDMI,VGA,NONE)。
? 示例
//獲取當(dāng)前顯示輸出類型 unsigned int arg[3]; disp_output output; disp_output_type type; disp_tv_mode mode; arg[0] = 0; arg[1] = (unsigned long)&output; ioctl(disphd, DISP_GET_OUTPUT, (void*)arg); type = (disp_output_type)output.type; mode = (disp_tv_mode)output.mode;
7.1.8 DISP_VSYNC_EVENT_EN
? 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_VSYNC_EVENT_EN |
arg | arg[0] 為顯示通道0/1;arg[1] 為enable 參數(shù),0:disable, 1:enable |
? 返回值
如果成功,返回DIS_SUCCESS。
否則,返回失敗號(hào)。
? 描述
該函數(shù)開啟/關(guān)閉vsync 消息發(fā)送功能。
? 示例
//開啟/關(guān)閉vsync消息發(fā)送功能,disphd為顯示驅(qū)動(dòng)句柄,sel為屏0/1 unsigned int arg[3]; arg[0] = 0; arg[1] = 1; ioctl(disphd, DISP_VSYNC_EVENT_EN, (void*)arg);
7.1.9 DISP_DEVICE_SWITCH
? 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_DEVICE_SWITCH |
arg | arg[0] 為顯示通道0/1;arg[1] 為輸出類型;arg[2] 為輸出模式,在輸出類型不為L(zhǎng)CD 時(shí)有效 |
? 返回值
如果成功,返回DIS_SUCCESS,否則,返回失敗號(hào)。
? 描述
該函數(shù)用于切換輸出類型。
? 示例
//切換 unsigned int arg[3]; arg[0] = 0; arg[1] = (unsigned long)DISP_OUTPUT_TYPE_HDMI; arg[2] = (unsigned long)DISP_TV_MOD_1080P_60HZ; ioctl(disphd, DISP_DEVICE_SWITCH, (void*)arg);
說明:如果傳遞的type 是DISP_OUTPUT_TYPE_NONE,將會(huì)關(guān)閉當(dāng)前顯示通道的輸出。
7.1.10 DISP_DEVICE_SET_CONFIG
? 原型
int ioctl(int handle, unsigned int cmd,unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_DEVICE_SET_CONFIG |
arg | arg[0] 為顯示通道0/1;arg[1] 為指向disp_device_config 的指針 |
? 返回值
如果成功,返回DIS_SUCCESS,否則,返回失敗號(hào)。
? 描述
該函數(shù)用于切換輸出類型并設(shè)置輸出設(shè)備的屬性參數(shù)。
? 示例
//切換輸出類型并設(shè)置輸出設(shè)備的屬性參數(shù) unsigned long arg[3]; struct disp_device_config config; config.type = DISP_OUTPUT_TYPE_LCD; config.mode = 0; config.format = DISP_CSC_TYPE_RGB; config.bits = DISP_DATA_8BITS; config.eotf = DISP_EOTF_GAMMA22; config.cs = DISP_BT709; arg[0] = 0; arg[1] = (unsigned long)&config; ioctl(dispfd, DISP_DEVICE_SET_CONFIG, (void*)arg); //說明:如果傳遞的type是DISP_OUTPUT_TYPE_NONE,將會(huì)關(guān)閉當(dāng)前顯示通道的輸出。
7.1.11 DISP_DEVICE_GET_CONFIG
? 原型
int ioctl(int handle, unsigned int cmd,unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_DEVICE_GET_CONFIG |
arg | arg[0] 為顯示通道0/1;arg[1] 為指向disp_device_config 的指針 |
? 返回值
如果成功,返回DIS_SUCCESS,否則,返回失敗號(hào)。
? 描述
該函數(shù)用于獲取當(dāng)前輸出類型及相關(guān)的屬性參數(shù)。
? 示例
//獲取當(dāng)前輸出類型及相關(guān)的屬性參數(shù) unsigned long arg[3]; struct disp_device_config config; arg[0] = 0; arg[1] = (unsigned long)&config; ioctl(dispfd, DISP_DEVICE_GET_CONFIG, (void*)arg); //說明:如果返回的type是DISP_OUTPUT_TYPE_NONE,表示當(dāng)前輸出顯示通道為關(guān)閉狀態(tài)
7.2 Layer Interface
7.2.1 DISP_LAYER_SET_CONFIG
? 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_CMD_SET_LAYER_CONFIG |
arg | arg[0] 為顯示通道0/1;arg[1] 為圖層配置參數(shù)指針;arg[2] 為需要配置的圖層數(shù)目 |
? 返回值
如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號(hào)。
? 描述
該函數(shù)用于設(shè)置多個(gè)圖層信息。
? 示例
struct { disp_layer_info info, bool enable; unsigned int channel, unsigned int layer_id, } disp_layer_config; //設(shè)置圖層參數(shù),disphd為顯示驅(qū)動(dòng)句柄 unsigned int arg[3]; disp_layer_config config; unsigned int width = 1280; unsigned int height = 800; unsigned int ret = 0; memset(&info, 0, sizeof(disp_layer_info)); config.channel = 0; //channel 0 config.layer_id = 0;//layer 0 at channel 0 config.info.enable = 1; config.info.mode = LAYER_MODE_BUFFER; config.info.fb.addr[0] = (__u32)mem_in; //FB地址 config.info.fb.size.width = width; config.info.fb.format = DISP_FORMAT_ARGB_8888; //DISP_FORMAT_YUV420_P config.info.fb.crop.x = 0; config.info.fb.crop.y = 0; config.info.fb.crop.width = ((unsigned long)width) << 32;//定點(diǎn)小數(shù)。高32bit為整數(shù),低32bit為小 數(shù) config.info.fb.crop.height= ((uunsigned long)height)<<32;//定點(diǎn)小數(shù)。高32bit為整數(shù),低32bit為小 數(shù) config.info.fb.flags = DISP_BF_NORMAL; config.info.fb.scan = DISP_SCAN_PROGRESSIVE; config.info.alpha_mode = 1; //global alpha config.info.alpha_value = 0xff; config.info.screen_win.x = 0; config.info.screen_win.y = 0; config.info.screen_win.width = width; config.info.screen_win.height= height; config.info.id = 0; arg[0] = 0;//screen 0 arg[1] = (unsigned int)&config; arg[2 = 1; //one layer ret = ioctl(disphd, DISP_CMD_LAYER_SET_CONFIG, (void*)arg);
7.2.2 DISP_LAYER_GET_CONFIG
? 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_LAYER_GET_CONFIG |
arg | arg[0] 為顯示通道0/1;arg[1] 為圖層配置參數(shù)指針;arg[2] 為需要獲取配置的圖層數(shù)目 |
? 返回值
如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號(hào)。
? 描述
該函數(shù)用于獲取圖層參數(shù)。
? 示例
//獲取圖層參數(shù),disphd為顯示驅(qū)動(dòng)句柄 unsigned int arg[3]; disp_layer_info info; memset(&info, 0, sizeof(disp_layer_info)); config.channel = 0; //channel 0 config.layer_id = 0;//layer 0 at channel 0 arg[0] = 0;//顯示通道0 arg[1] = 0;//圖層0 arg[2 = (unsigned int)&info; ret = ioctl(disphd, DISP_LAYER_GET_CONFIG, (void*)arg);
7.2.3 DISP_LAYER_SET_CONFIG2
? 原型
int ioctl(int handle, unsigned int cmd,unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_SET_LAYER_CONFIG2 |
arg | arg[0] 為顯示通道0/1;arg[1] 為圖層配置參數(shù)指針;arg[2] 為需要配置的圖層數(shù)目 |
? 返回值
如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號(hào)。
? 描述
該函數(shù)用于設(shè)置多個(gè)圖層信息,注意該接口只接受disp_layer_config2 的信息。
? 示例
struct { disp_layer_info info, bool enable; unsigned int channel, unsigned int layer_id, }disp_layer_config2; //設(shè)置圖層參數(shù),dispfd 為顯示驅(qū)動(dòng)句柄 unsigned long arg[3]; struct disp_layer_config2 config; unsigned int width = 1280; unsigned int height = 800; unsigned int ret = 0; memset(&config, 0, sizeof(struct disp_layer_config2)); config.channnel = 0;//blending channel config.layer_id = 0;//layer index in the blending channel config.info.enable = 1; config.info.mode = LAYER_MODE_BUFFER; config.info.fb.addr[0] = (unsigned long long)mem_in; //FB 地址 config.info.fb.size[0].width = width; config.info.fb.align[0] = 4;//bytes config.info.fb.format = DISP_FORMAT_ARGB_8888; //DISP_FORMAT_YUV420_P config.info.fb.crop.x = 0; config.info.fb.crop.y = 0; config.info.fb.crop.width = ((unsigned long)width) << 32;//定點(diǎn)小數(shù)。高32bit 為整數(shù),低32bit 為小數(shù) config.info.fb.crop.height= ((uunsigned long)height)<<32;//定點(diǎn)小數(shù)。高32bit 為整數(shù),低32bit 為小數(shù) config.info.fb.flags = DISP_BF_NORMAL; config.info.fb.scan = DISP_SCAN_PROGRESSIVE; config.info.fb.eotf = DISP_EOTF_SMPTE2084; //HDR config.info.fb.metadata_buf = (unsigned long long)mem_in2; config.info.alpha_mode = 2; //global pixel alpha config.info.alpha_value = 0xff;//global alpha value config.info.screen_win.x = 0; config.info.screen_win.y = 0; config.info.screen_win.width = width; config.info.screen_win.height= height; config.info.id = 0; arg[0] = 0;//screen 0 arg[1] = (unsigned long)&config; arg[2 = 1; //one layer ret = ioctl(dispfd, DISP_LAYER_SET_CONFIG2, (void*)arg);
7.2.4 DISP_LAYER_GET_CONFIG2
? 原型
int ioctl(int handle, unsigned int cmd,unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_CAPTURE_START |
arg | arg[0] 為顯示通道0/1 |
? 返回值
如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號(hào)。
? 描述
該函數(shù)用于開啟截屏功能。
? 示例
//啟動(dòng)截屏功能,dispfd 為顯示驅(qū)動(dòng)句柄 arg[0] = 0;//顯示通道0 ioctl(dispfd, DISP_CAPTURE_START, (void*)arg);
7.3.2 DISP_CAPTURE_COMMIT
? 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_CAPTURE_COMMIT |
arg | arg[0] 為顯示通道0/1;arg[1] 為指向截屏的信息結(jié)構(gòu)體,詳見disp_capture_info |
? 返回值
如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號(hào)。
? 描述
該函數(shù)用于提交截屏的任務(wù),提交一次,則會(huì)啟動(dòng)一次截屏操作。
? 示例
//提交截屏功能,dispfd 為顯示驅(qū)動(dòng)句柄 unsigned long arg[3]; struct disp_capture_info info; arg[0] = 0; screen_width = ioctl(dispfd, DISP_GET_SCN_WIDTH, (void*)arg); screen_height = ioctl(dispfd, DISP_GET_SCN_HEIGHT, (void*)arg); info.window.x = 0; info.window.y = 0; info.window.width = screen_width; info.window.y = screen_height; info.out_frame.format = DISP_FORMAT_ARGB_8888; info.out_frame.size[0].width = screen_width; info.out_frame.size[0].height = screen_height; info.out_frame.crop.x = 0; info.out_frame.crop.y = 0; info.out_frame.crop.width = screen_width; info.out_frame.crop.height = screen_height; info.out_frame.addr[0] = fb_address; //buffer address arg[0] = 0;//顯示通道0 arg[1] = (unsigned long)&info; ioctl(dispfd, DISP_CAPTURE_COMMIT, (void*)arg);
7.3.3 DISP_CAPTURE_STOP
? 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_CAPTURE_STOP |
arg | arg[0] 為顯示通道0/1 |
? 返回值
如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號(hào)。
? 描述
該函數(shù)用于關(guān)閉截屏功能。
? 示例
//停止截屏功能,dispfd 為顯示驅(qū)動(dòng)句柄 unsigned long arg[3]; arg[0] = 0;//顯示通道0 ioctl(dispfd, DISP_CAPTURE_STOP, (void*)arg);
7.3.4 DISP_CAPTURE_QUERY
? 原型
int ioctl(int handle, unsigned int cmd,unsigned int *arg);
? 參數(shù)
命令DISP_CAPTURE_QUERY 是查詢功能。
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_CAPTURE_QUERY |
arg | arg[0] 為顯示通道0/1 |
? 返回值
如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號(hào)。
? 描述
該函數(shù)查詢剛結(jié)束的圖像幀是否截屏成功。
? 示例
//查詢截屏是否成功,dispfd 為顯示驅(qū)動(dòng)句柄 unsigned long arg[3]; arg[0] = 0;//顯示通道0 ioctl(dispfd, DISP_CAPTURE_QUERY, (void*)arg);
7.4 LCD Interface
7.4.1 DISP_LCD_SET_BRIGHTNESS
? 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_LCD_SET_BRIGHTNESS |
arg | arg[0] 為顯示通道0/1;arg[1] 為背光亮度值,(0~255) |
? 返回值
如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號(hào)。
? 描述
該函數(shù)用于設(shè)置LCD 亮度。
? 示例
//設(shè)置LCD的背光亮度,disphd為顯示驅(qū)動(dòng)句柄 unsigned int arg[3]; unsigned int bl = 197; arg[0] = 0;//顯示通道0 arg[1] = bl; ioctl(disphd, DISP_LCD_SET_BRIGHTNESS, (void*)arg);
7.4.2 DISP_LCD_GET_BRIGHTNESS
? 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_LCD_GET_BRIGHTNESS |
arg | arg[0] 為顯示通道0/1 |
? 返回值
如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號(hào)。
? 描述
該函數(shù)用于獲取LCD 亮度。
? 示例
//獲取LCD的背光亮度,disphd為顯示驅(qū)動(dòng)句柄 unsigned int arg[3]; unsigned int bl; arg[0] = 0;//顯示通道0 bl = ioctl(disphd, DISP_LCD_GET_BRIGHTNESS, (void*)arg);
7.5 Enhance interface
7.5.1 DISP_ENHANCE_ENABLE
? 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_ENHANCE_ENABLE |
arg | arg[0] 為顯示通道0/1 |
? 返回值
如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號(hào)。
? 描述
該函數(shù)用于使能圖像后處理功能。
? 示例
//開啟圖像后處理功能,disphd為顯示驅(qū)動(dòng)句柄 unsigned int arg[3]; arg[0] = 0;//顯示通道0 ioctl(disphd, DISP_ENHANCE_ENABLE, (void*)arg);
7.5.2 DISP_ENHANCE_DISABLE
? 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_ENHANCE_DISABLE |
arg | arg[0] 為顯示通道0/1 |
? 返回值
如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號(hào)。
? 描述
該函數(shù)用于關(guān)閉圖像后處理功能。
? 示例
//關(guān)閉圖像后處理功能,disphd為顯示驅(qū)動(dòng)句柄 unsigned int arg[3]; arg[0] = 0;//顯示通道0 ioctl(disphd, DISP_ENHANCE_DISABLE, (void*)arg);
7.5.3 DISP_ENHANCE_DEMO_ENABLE
? 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_ENHANCE_DEMO_ENABLE |
arg | arg[0] 為顯示通道0/1 |
? 返回值
如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號(hào)。
? 描述
該函數(shù)用于開啟圖像后處理演示模式,開啟后,在屏幕會(huì)出現(xiàn)左邊進(jìn)行后處理,右邊未處理的圖像畫面,方便對(duì)比效果。演示模式需要在后處理功能開啟之后才有
效。
? 示例
//開啟圖像后處理演示模式,disphd為顯示驅(qū)動(dòng)句柄 unsigned int arg[3]; arg[0] = 0;//顯示通道0 ioctl(disphd, DISP_ENHANCE_DEMO_ENABLE, (void*)arg);
7.5.4 DISP_ENHANCE_DEMO_DISABLE
? 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_ENHANCE_DEMO_DISABLE |
arg | arg[0] 為顯示通道0/1 |
? 返回值
如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號(hào)。
? 描述
該函數(shù)用于關(guān)閉圖像后處理演示模式。
? 示例
//開啟圖像后處理演示模式,disphd為顯示驅(qū)動(dòng)句柄 unsigned int arg[3]; arg[0] = 0;//顯示通道0 ioctl(disphd, DISP_ENHANCE_DEMO_ENABLE, (void*)arg);
7.6 Smart backlight
7.6.1 DISP_SMBL_ENABLE
? 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_SMBL_ENABLE |
arg | arg[0] 為顯示通道0/1 |
? 返回值
如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號(hào)。
? 描述
該函數(shù)用于使能智能背光功能。
? 示例
//開啟智能背光功能,disphd為顯示驅(qū)動(dòng)句柄 unsigned int arg[3]; arg[0] = 0;//顯示通道0 ioctl(disphd, DISP_SMBL_ENABLE, (void*)arg);
7.6.2 DISP_SMBL_DISABLE
? 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_SMBL_ENABLE |
arg | arg[0] 為顯示通道0/1 |
? 返回值
如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號(hào)。
? 描述
該函數(shù)用于關(guān)閉智能背光功能。
? 示例
//關(guān)閉智能背光功能,disphd為顯示驅(qū)動(dòng)句柄 unsigned int arg[3]; arg[0] = 0;//顯示通道0 ioctl(disphd, DISP_SMBL_DISABLE, (void*)arg);
7.6.3 DISP_SMBL_SET_WINDOW
? 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_SMBL_SET_WINDOW |
arg | arg[0] 為顯示通道0/1;arg[1] 為指向struct disp_rect 的指針 |
? 返回值
如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號(hào)。
? 描述
該函數(shù)用于設(shè)置智能背光開啟效果的窗口,智能背光在設(shè)置的窗口中有效。
? 示例
//設(shè)置智能背光窗口,disphd為顯示驅(qū)動(dòng)句柄 unsigned int arg[3]; unsigned int screen_width, screen_height; struct disp_rect window; screen_width = ioctl(disphd, DISP_GET_SCN_WIDTH, (void*)arg); screen_height = ioctl(disphd, DISP_GET_SCN_HEIGHT, (void*)arg); window.x = 0; window.y = 0; window.width = screen_width / 2; widnow.height = screen_height; arg[0] = 0;//顯示通道0 arg[1] = (unsigned long)&window; ioctl(disphd, DISP_SMBL_SET_WINDOW, (void*)arg);
7.7 Hdmi interface
7.7.1 DISP_HDMI_SUPPORT_MODE
? 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_HDMI_SUPPORT_MODE |
arg | arg[0] 為顯示通道0/1;arg[1] 為需要查詢的模式,詳見disp_tv_mode |
? 返回值
如果支持,則返回1;如果失敗,則返回0。
? 描述
該函數(shù)用于查詢指定的HDMI 模式是否支持。
? 示例
//查詢指定的HDMI模式是否支持 unsigned int arg[3]; arg[0] = 0;//顯示通道0 arg[1] = (unsigned long)DISP_TV_MOD_1080P_60HZ; ioctl(disphd, DISP_HDMI_SUPPORT_MODE, (void*)arg);
7.7.2 DISP_HDMI_GET_HPD_STATUS
? 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
? 參數(shù)
參數(shù) | 說明 |
---|---|
hdle | 顯示驅(qū)動(dòng)句柄 |
cmd | DISP_HDMI_GET_HPD_STATUS |
arg | arg[0] 為顯示通道0/1 |
? 返回值
如果HDMI 插入,則返回1;如果未插入,則返回0。
? 描述
該函數(shù)用于指定HDMI 是否處于插入狀態(tài)。
? 示例
//查詢HDMI是否處于插入狀態(tài) unsigned int arg[3]; arg[0] = 0;//顯示通道0 if (ioctl(disphd, DISP_HDMI_GET_HPD_STATUS, (void*)arg) == 1) printf("hdmi plug inn"); else printf("hdmi plug outn");
8 sysfs 接口描述
以下兩個(gè)函數(shù)在下面接口的demo 中會(huì)使用到。
const int MAX_LENGTH = 128; const int MAX_DATA = 128; static ssize_t read_data(const char *sysfs_path, char *data) { ssize_t err = 0; FILE *fp = NULL; fp = fopen(sysfs_path, "r"); if (fp) { err = fread(data, sizeof(char), MAX_DATA ,fp); fclose(fp); } return err; } static ssize_t write_data(const char *sysfs_path, const char *data, size_t len) { ssize_t err = 0; int fd = -1; fd = open(sysfs_path, O_WRONLY); if (fp) { errno = 0; err = write(fd, data, len); if (err < 0) { ? ? ? ? ? ? ? ?err = -errno; ? ?} ? ?close(fd); ? ?} else { ? ? ? ?ALOGE("%s: Failed to open file: %s error: %s", __FUNCTION__, sysfs_path, ? ? ? ?strerror(errno)); ? ? ? ?err = -errno; ? ?} ? ?return err; ? ?}
8.1 enhance
8.1.1 enhance_mode
? 系統(tǒng)節(jié)點(diǎn)
/sys/class/disp/disp/attr/disp /sys/class/disp/disp/attr/enhance_mode
? 參數(shù)
參數(shù) | 說明 |
---|---|
disp display channel | 比如0: disp0, 1:disp1 |
enhance_mode | 0:standard, 1: enhance, 2: soft, 3: enahnce + demo |
? 返回值
no。
? 描述
該接口用于設(shè)置色彩增強(qiáng)的模式。
? 示例
//設(shè)置disp0 的色彩增強(qiáng)的模式為增強(qiáng)模式 echo 0 > /sys/class/disp/disp/attr/disp; echo 1 > /sys/class/disp/disp/attr/enhance_mode; //設(shè)置disp1 的色彩增強(qiáng)的模式為柔和模式 echo 1 > /sys/class/disp/disp/attr/disp; echo 2 > /sys/class/disp/disp/attr/enhance_mode; //設(shè)置disp0 的色彩增強(qiáng)的模式為增加模式,并且開啟演示模式 echo 0 > /sys/class/disp/disp/attr/disp; echo 3 > /sys/class/disp/disp/attr/enhance_mode;
c/c++ 代碼:
char sysfs_path[MAX_LENGTH]; char sysfs_data[MAX_DATA]; unisgned int disp = 0 unsigned int enhance_mode = 1; snprintf(sysfs_path,sizeof(sysfs_full_path),"sys/class/disp/disp/attr/disp"); snprintf(sysfs_data, sizeof(sysfs_data),"%d",disp); write_data(sysfs_path, sys_data, strlen(sysfs_data)); snprintf(sysfs_path,sizeof(sysfs_full_path), "/sys/class/disp/disp/attr/enhance_mode"); snprintf(sysfs_data, sizeof(sysfs_data), "%d",enhance_mode); write_data(sysfs_path, sys_data, strlen(sysfs_data));
8.1.2 enhance_bright/contrast/saturation/edge/detail/denoise
? 系統(tǒng)節(jié)點(diǎn)
/sys/class/disp/disp/attr/disp /sys/class/disp/disp/attr/enhance_bright /* 亮度*/ /sys/class/disp/disp/attr/enhance_contrast /* 對(duì)比度*/ /sys/class/disp/disp/attr/enhance_saturation /* 飽和*/ /sys/class/disp/disp/attr/enhance_edge /* 邊緣銳度*/ /sys/class/disp/disp/attr/enhance_detail /* 細(xì)節(jié)增強(qiáng)*/ /sys/class/disp/disp/attr/enhance_denoise /* 降噪*/
? 參數(shù)
disp display channel,比如0: disp0, 1:disp1。 enhance_xxx: 范圍:0~100,數(shù)據(jù)越大,調(diào)節(jié)幅度越大。
? 返回值 no。
? 描述
該接口用于設(shè)置圖像的亮度/對(duì)比度/飽和度/邊緣銳度/細(xì)節(jié)增強(qiáng)/降噪的調(diào)節(jié)幅度。
? 示例
//設(shè)置disp0 的圖像亮度為80 echo 0 > /sys/class/disp/disp/attr/disp; echo 80 > /sys/class/disp/disp/attr/enhance_bright; //設(shè)置disp1 的飽和度為50 echo 1 > /sys/class/disp/disp/attr/disp; echo 50 > /sys/class/disp/disp/attr/enhance_saturation;
c/c++ 代碼:
char sysfs_path[MAX_LENGTH]; char sysfs_data[MAX_DATA]; unisgned int disp = 0 unsigned int enhance_bright = 80; snprintf(sysfs_path,sizeof(sysfs_full_path),"sys/class/disp/disp/attr/disp"); snprintf(sysfs_data, sizeof(sysfs_data),"%d",disp); write_data(sysfs_path, sys_data, strlen(sysfs_data)); snprintf(sysfs_path,sizeof(sysfs_full_path), "/sys/class/disp/disp/attr/enhance_bright"); snprintf(sysfs_data, sizeof(sysfs_data), "%d",enhance_bright); write_data(sysfs_path, sys_data, strlen(sysfs_data));
8.2 hdmi edid
8.2.1 edid
? 系統(tǒng)節(jié)點(diǎn)
/sys/class/hdmi/hdmi/attr/edid
? 參數(shù)
no。
? 返回值
Edid data(1024 bytes)。
? 描述
該接口用于讀取EDID 的裸數(shù)據(jù)。
? 示例
// 讀取edid數(shù)據(jù) cat /sys/class/hdmi/hdmi/attr/edid
c/c++ 代碼:
#define EDID_MAX_LENGTH 1024 char sysfs_path[MAX_LENGTH]; char sysfs_data[EDID_MAX_LENGTH]; ssize_t edid_length; snprintf(sysfs_path,sizeof(sysfs_full_path),"/sys/class/hdmi/hdmi/attr/edid"); edid_length = read_data(sysfs_path, sys_data);
8.2.2 hpd
? 系統(tǒng)節(jié)點(diǎn)
/sys/class/switch/hdmi/state
? 參數(shù)
no。
? 返回值
Hdmi hotplut state, 0: unplug; 1: plug in。
? 描述
該接口用于讀取HDMI 的熱插拔狀態(tài)。
? 示例
// 讀取HDMI熱插拔狀態(tài) cat /sys/class/switch/hdmi/state
c/c++代碼:
char sysfs_path[MAX_LENGTH]; char sysfs_data[MAX_DATA]; int hpd; snprintf(sysfs_path,sizeof(sysfs_full_path),"/sys/class/hdmi/hdmi/attr/edid"); read_data(sysfs_path, sys_data); hpd = atoi(sys_data); If (hpd) printf("hdmi plug inn"); else printf("hdmi unplug n");
8.2.3 hdcp_enable
? 系統(tǒng)節(jié)點(diǎn)
/sys/class/hdmi/hdmi/attr/hdcp_enable
? 參數(shù)
enable: 0: disable hdmi hdcp function;1:enable hdmi hdcp function。
? 返回值
No returns。
? 描述
該接口用于使能、關(guān)閉hdmi hdcp 功能。
? 示例
// 開啟hdmi hdcp功能 echo 1 > /sys/class/hdmi/hdmi/attr/hdcp_enable // 關(guān)閉hdmi hdcp功能 echo 0 > /sys/class/hdmi/hdmi/attr/hdcp_enable
c/c++ 代碼:
char sysfs_path[MAX_LENGTH]; char sysfs_data[MAX_DATA]; snprintf(sysfs_path,sizeof(sysfs_full_path),"/sys/class/hdmi/hdmi/attr/hdcp_enable"); snprintf(sysfs_data, sizeof(sysfs_data),"%d",1); write_data(sysfs_path, sys_data, strlen(sysfs_data));
9 Data Structure
9.1 disp_fb_info
? 原型
typedef struct { unsigned long long addr[3]; /* address of frame buffer, single addr for interleaved fomart, double addr for semi-planar fomart triple addr for planar format */ disp_rectsz size[3]; //size for 3 component,unit: pixels unsigned int align[3]; //align for 3 comonent,unit: bytes(align=2^n,i.e .1/2/4/8/16/32.. disp_pixel_format format; disp_color_space color_space; //color space unsigned int trd_right_addr[3];/* right address of 3d fb, used when in frame packing 3d mode */ bool pre_multiply; //true: pre-multiply fb disp_rect64 crop; //crop rectangle boundaries disp_buffer_flags flags; //indicate stereo or non-stereo buffer disp_scan_flags scan; //scan type & scan order }disp_fb_info;
? 成員
變量 | 說明 |
---|---|
addr | framebuffer 的內(nèi)容地址,對(duì)于interleaved 類型,只有addr[0] 有效;planar 類型,三個(gè)都有;UV combined 的類型addr[0],addr[1]有效 |
size | size of framebuffer, 單位為pixel |
align | 對(duì)齊位寬,為2 的指數(shù) |
format | pixel format, 詳見disp_pixel_format |
color_space | color space mode, 詳見disp_cs_mode |
b_trd_src | 1:3D source; 0:2D source |
trd_mode | source 3D mode, 詳見disp_3d_src_mode |
trd_right_addr | used when in frame packing 3d mode |
crop | 用于顯示的buffer 裁減區(qū) |
flags | 標(biāo)識(shí)2D 或3D 的buffer |
scan | 標(biāo)識(shí)描述類型,progress, interleaved |
? 描述
disp_fb_info 用于描述一個(gè)display frambuffer 的屬性信息。
9.2 disp_layer_info
? 原型
typedef struct { disp_layer_mode mode; unsigned char zorder; /*specifies the front-to-back ordering of the layers on the screen, the top layer having the highest Z value can't set zorder, but can get */ unsigned char alpha_mode; //0: pixel alpha; 1: global alpha; 2: global pixel alpha unsigned char alpha_value; //global alpha value disp_rect screen_win; //display window on the screen bool b_trd_out; //3d display disp_3d_out_mode out_trd_mode;//3d display mode union { unsigned int color; //valid when LAYER_MODE_COLOR disp_fb_info fb; //framebuffer, valid when LAYER_MODE_BUFFER }; unsigned int id; /* frame id, can get the id of frame display currently by DISP_LAYER_GET_FRAME_ID */ }disp_layer_info;
? 成員
變量 | 說明 |
---|---|
mode | 圖層的模式,詳見disp_layer_mode |
zorder | layer zorder, 優(yōu)先級(jí)高的圖層可能會(huì)覆蓋優(yōu)先級(jí)低的圖層 |
alpha_mode | 0:pixel alpha, 1:global alpha, 2:global pixel alpha |
alpha_value | layer global alpha value,valid while alpha_mode(1/2) |
screenn_win | screen window,圖層在屏幕上顯示的矩形窗口 |
fb | framebuffer 的屬性,詳見disp_fb_info,valid when BUFFER_MODE |
color | display color, valid when COLOR_MODE |
b_trd_out | if output in 3d mode,used for scaler layer |
out_trd_mode | output 3d mode, 詳見disp_3d_out_mode |
id | frame id, 設(shè)置給驅(qū)動(dòng)的圖像幀號(hào),可以通過DISP_LAYER_GET_FRAME_ID 獲取當(dāng)前顯示的幀號(hào),以做一下特定的處理,比如釋放掉已經(jīng)顯示完成的圖像幀buffer。 |
? 描述
disp_layer_info 用于描述一個(gè)圖層的屬性信息。
9.3 disp_layer_config
? 原型
typedef struct { disp_layer_info info; bool enable; unsigned int channel; unsigned int layer_id; }disp_layer_config;
? 成員
變量 | 說明 |
---|---|
info | 圖像的信息屬性 |
enable | 使能標(biāo)志 |
channel | 圖層所在的通道id(0/1/2/3) |
layer_id | 圖層的id,此id 是在通道內(nèi)的圖層id。即(channel,layer_id)=(0,0) 表示通道0 中的圖層0 之意 |
? 描述
disp_layer_config 用于描述一個(gè)圖層配置的屬性信息。
9.4 disp_color_info
? 原型
typedef struct { u8 alpha; u8 red; u8 green; u8 blue; }disp_color_info;
? 成員
變量說明 | |
---|---|
alpha | 顏色的透明度 |
red | 紅 |
green | 綠 |
blue | 藍(lán) |
? 描述
disp_color_info 用于描述一個(gè)顏色的信息。
9.5 disp_rect
? 原型
typedef struct { s32 x; s32 y; u32 width; u32 height; }disp_rect;
? 成員
變量 | 參數(shù) |
---|---|
x | 起點(diǎn)x 值 |
y | 起點(diǎn)y 值 |
width | 寬 |
height | 高 |
? 描述
disp_rect 用于描述一個(gè)矩形窗口的信息。
9.6 disp_rect64
? 原型
typedef struct { long long x; long long y; long long width; long long height; }disp_rect64;
? 成員
變量 | 說明 |
---|---|
x | 起點(diǎn)x 值, 定點(diǎn)小數(shù),高32bit 為整數(shù),低32bit 為小數(shù) |
y | 起點(diǎn)y 值, 定點(diǎn)小數(shù),高32bit 為整數(shù),低32bit 為小數(shù) |
width | 寬, 定點(diǎn)小數(shù),高32bit 為整數(shù),低32bit 為小數(shù) |
height | 高, 定點(diǎn)小數(shù),高32bit 為整數(shù),低32bit 為小數(shù) |
? 描述
disp_rect64 用于描述一個(gè)矩形窗口的信息。
9.7 disp_position
? 原型
typedef struct { s32 x; s32 y; }disp_posistion;
? 成員
變量 | 說明 |
---|---|
x | x |
y | y |
? 描述
disp_position 用于描述一個(gè)坐標(biāo)的信息。
9.8 disp_rectsz
? 原型
typedef struct { u32 width; u32 height; }disp_rectsz;
? 成員
變量 | 說明 |
---|---|
width | 寬 |
height | 高 |
? 描述
disp_rectsz 用于描述一個(gè)矩形尺寸的信息。
9.9 disp_pixel_format
? 原型
typedef enum { DISP_FORMAT_ARGB_8888 = 0x00,//MSB A-R-G-B LSB DISP_FORMAT_ABGR_8888 = 0x01, DISP_FORMAT_RGBA_8888 = 0x02, DISP_FORMAT_BGRA_8888 = 0x03, DISP_FORMAT_XRGB_8888 = 0x04, DISP_FORMAT_XBGR_8888 = 0x05, DISP_FORMAT_RGBX_8888 = 0x06, DISP_FORMAT_BGRX_8888 = 0x07, DISP_FORMAT_RGB_888 = 0x08, DISP_FORMAT_BGR_888 = 0x09, DISP_FORMAT_RGB_565 = 0x0a, DISP_FORMAT_BGR_565 = 0x0b, DISP_FORMAT_ARGB_4444 = 0x0c, DISP_FORMAT_ABGR_4444 = 0x0d, DISP_FORMAT_RGBA_4444 = 0x0e, DISP_FORMAT_BGRA_4444 = 0x0f, DISP_FORMAT_ARGB_1555 = 0x10, DISP_FORMAT_ABGR_1555 = 0x11, DISP_FORMAT_RGBA_5551 = 0x12, DISP_FORMAT_BGRA_5551 = 0x13, /* SP: semi-planar, P:planar, I:interleaved * UVUV: U in the LSBs; VUVU: V in the LSBs */ DISP_FORMAT_YUV444_I_AYUV = 0x40,//MSB A-Y-U-V LSB DISP_FORMAT_YUV444_I_VUYA = 0x41,//MSB V-U-Y-A LSB DISP_FORMAT_YUV422_I_YVYU = 0x42,//MSB Y-V-Y-U LSB DISP_FORMAT_YUV422_I_YUYV = 0x43,//MSB Y-U-Y-V LSB DISP_FORMAT_YUV422_I_UYVY = 0x44,//MSB U-Y-V-Y LSB DISP_FORMAT_YUV422_I_VYUY = 0x45,//MSB V-Y-U-Y LSB DISP_FORMAT_YUV444_P = 0x46,//MSB P3-2-1-0 LSB, YYYY UUUU VVVV DISP_FORMAT_YUV422_P = 0x47,//MSB P3-2-1-0 LSB YYYY UU VV DISP_FORMAT_YUV420_P = 0x48,//MSB P3-2-1-0 LSB YYYY U V DISP_FORMAT_YUV411_P = 0x49,//MSB P3-2-1-0 LSB YYYY U V DISP_FORMAT_YUV422_SP_UVUV = 0x4a,//MSB V-U-V-U LSB DISP_FORMAT_YUV422_SP_VUVU = 0x4b,//MSB U-V-U-V LSB DISP_FORMAT_YUV420_SP_UVUV = 0x4c, DISP_FORMAT_YUV420_SP_VUVU = 0x4d, DISP_FORMAT_YUV411_SP_UVUV = 0x4e, DISP_FORMAT_YUV411_SP_VUVU = 0x4f, }disp_pixel_format;
? 成員
變量 | 說明 |
---|---|
DISP_FORMAT_ARGB_8888 | 32bpp, A 在最高位,B 在最低位 |
DISP_FORMAT_YUV420_P | planar yuv 格式,分三塊存放,需三個(gè)地址,P3在最高位 |
DISP_FORMAT_YUV422_SP_UVUV | semi-planar yuv 格式,分兩塊存放,需兩個(gè)地址,U 在低位 |
DISP_FORMAT_YUV422_SP_VUVU | semi-planar yuv 格式,分兩塊存放,需兩個(gè)地址,V 在低位 |
? 描述
disp_pixel_format 用于描述像素格式。
9.10 disp_buffer_flags
? 原型
typedef enum { DISP_BF_NORMAL = 0,//non-stereo DISP_BF_STEREO_TB = 1 << 0,//stereo top-bottom ? ?DISP_BF_STEREO_FP = 1 << 1,//stereo frame packing ? ?DISP_BF_STEREO_SSH = 1 << 2,//stereo side by side half ? ?DISP_BF_STEREO_SSF = 1 << 3,//stereo side by side full ? ?DISP_BF_STEREO_LI = 1 << 4,//stereo line interlace }disp_buffer_flags;
? 成員
變量 | 說明 |
---|---|
DISP_BF_NORMAL | 2d |
DISP_BF_STEREO_TB top bottom | 模式 |
DISP_BF_STEREO_FP | framepacking |
DISP_BF_STEREO_SSF | side by side full, 左右全景 |
DISP_BF_STEREO_SSH | side by side half, 左右半景 |
DISP_BF_STEREO_LI | line interleaved, 行交錯(cuò)模式 |
? 描述
disp_buffer_flags 用于描述3D 源模式。
9.11 disp_3d_out_mode
? 原型
typedef enum { //for lcd DISP_3D_OUT_MODE_CI_1 = 0x5,//column interlaved 1 DISP_3D_OUT_MODE_CI_2 = 0x6,//column interlaved 2 DISP_3D_OUT_MODE_CI_3 = 0x7,//column interlaved 3 DISP_3D_OUT_MODE_CI_4 = 0x8,//column interlaved 4 DISP_3D_OUT_MODE_LIRGB = 0x9,//line interleaved rgb //for hdmi DISP_3D_OUT_MODE_TB = 0x0,//top bottom DISP_3D_OUT_MODE_FP = 0x1,//frame packing DISP_3D_OUT_MODE_SSF = 0x2,//side by side full DISP_3D_OUT_MODE_SSH = 0x3,//side by side half DISP_3D_OUT_MODE_LI = 0x4,//line interleaved DISP_3D_OUT_MODE_FA = 0xa,//field alternative }disp_3d_out_mode;
? 成員
for lcd:
變量 | 說明 |
---|---|
DISP_3D_OUT_MODE_CI_1 | 列交織 |
DISP_3D_OUT_MODE_CI_2 | 列交織 |
DISP_3D_OUT_MODE_CI_3 | 列交織 |
DISP_3D_OUT_MODE_CI_4 | 列交織 |
DISP_3D_OUT_MODE_LIRGB | 行交織 |
for hdmi:
變量 | 說明 |
---|---|
DISP_3D_OUT_MODE_TB top bottom | 上下模式 |
DISP_3D_OUT_MODE_FP | framepacking |
DISP_3D_OUT_MODE_SSF | side by side full, 左右全景 |
DISP_3D_OUT_MODE_SSH | side by side half, 左右半景 |
DISP_3D_OUT_MODE_LI | line interleaved, 行交織 |
DISP_3D_OUT_MODE_FA | field alternate 場(chǎng)交錯(cuò) |
? 描述
disp_3d_out_mode 用于描述3D 輸出模式。
9.12 disp_color_space
? 原型
typedef enum { DISP_BT601 = 0, DISP_BT709 = 1, DISP_YCC = 2, }disp_color_mode;
? 成員
變量 | 說明 |
---|---|
DISP_BT601 | 用于標(biāo)清視頻 |
DISP_BT709 | 用于高清視頻 |
DISP_YCC | 用于圖片 |
? 描述
disp_color_space 用于描述顏色空間類型。
9.13 disp_output_type
? 原型
typedef enum { DISP_OUTPUT_TYPE_NONE = 0, DISP_OUTPUT_TYPE_LCD = 1, DISP_OUTPUT_TYPE_TV = 2, DISP_OUTPUT_TYPE_HDMI = 4, DISP_OUTPUT_TYPE_VGA = 8, }disp_output_type;
? 成員
變量 | 說明 |
---|---|
DISP_OUTPUT_TYPE_NONE | 無顯示輸出 |
DISP_OUTPUT_TYPE_LCD | LCD 輸出 |
DISP_OUTPUT_TYPE_TV | TV 輸出 |
DISP_OUTPUT_TYPE_HDMI | HDMI 輸出 |
DISP_OUTPUT_TYPE_VGA | VGA 輸出 |
? 描述
disp_output_type 用于描述顯示輸出類型。
9.14 disp_tv_mode
? 原型
typedef enum { DISP_TV_MOD_480I = 0, DISP_TV_MOD_576I = 1, DISP_TV_MOD_480P = 2, DISP_TV_MOD_576P = 3, DISP_TV_MOD_720P_50HZ = 4, DISP_TV_MOD_720P_60HZ = 5, DISP_TV_MOD_1080I_50HZ = 6, DISP_TV_MOD_1080I_60HZ = 7, DISP_TV_MOD_1080P_24HZ = 8, DISP_TV_MOD_1080P_50HZ = 9, DISP_TV_MOD_1080P_60HZ = 0xa, DISP_TV_MOD_1080P_24HZ_3D_FP = 0x17, DISP_TV_MOD_720P_50HZ_3D_FP = 0x18, DISP_TV_MOD_720P_60HZ_3D_FP = 0x19, DISP_TV_MOD_1080P_25HZ = 0x1a, DISP_TV_MOD_1080P_30HZ = 0x1b, DISP_TV_MOD_PAL = 0xb, DISP_TV_MOD_PAL_SVIDEO = 0xc, DISP_TV_MOD_NTSC = 0xe, DISP_TV_MOD_NTSC_SVIDEO = 0xf, DISP_TV_MOD_PAL_M = 0x11, DISP_TV_MOD_PAL_M_SVIDEO = 0x12, DISP_TV_MOD_PAL_NC = 0x14, DISP_TV_MOD_PAL_NC_SVIDEO = 0x15, DISP_TV_MOD_3840_2160P_30HZ = 0x1c, DISP_TV_MOD_3840_2160P_25HZ = 0x1d, DISP_TV_MOD_3840_2160P_24HZ = 0x1e, DISP_TV_MODE_NUM = 0x1f, }disp_tv_mode;
? 成員
? 描述
disp_tv_mode 用于描述TV 輸出模式。
9.15 disp_output
? 原型
typedef struct { unsigned int type; unsigned int mode; }disp_output;
? 成員
變量 | 說明 |
---|---|
Type | 輸出類型 |
Mode | 輸出模式,480P/576P, etc |
? 描述
disp_output 用于描述顯示輸出類型,模式。
9.16 disp_layer_mode
? 原型
typedef enum { LAYER_MODE_BUFFER = 0, LAYER_MODE_COLOR = 1, }disp_layer_mode;
? 成員
變量 | 說明 |
---|---|
LAYER_MODE_BUFFER | buffer 模式,帶buffer 的圖層 |
LAYER_MODE_COLOR | 單色模式,無buffer 的圖層,只需要一個(gè)顏色值表示圖像內(nèi)容 |
? 描述
disp_layer_mode 用于描述圖層模式。
9.17 disp_scan_flags
? 原型
typedef enum { DISP_SCAN_PROGRESSIVE = 0,//non interlace DISP_SCAN_INTERLACED_ODD_FLD_FIRST = 1 << 0,//interlace ,odd field first ? ?DISP_SCAN_INTERLACED_EVEN_FLD_FIRST = 1 << 1,//interlace,even field first }disp_scan_flags;
? 成員
變量 | 說明 |
---|---|
DISP_SCAN_PROGRESSIVE | 逐行模式 |
DISP_SCAN_INTERLACED_ODD_FLD_FIRST | 隔行模式,奇數(shù)行優(yōu)先 |
DISP_SCAN_INTERLACED_EVEN_FLD_FIRST | 隔行模式,偶數(shù)行優(yōu)先 |
? 描述 disp_scan_flags 用于描述顯示Buffer 的掃描方式。
10 調(diào)試
10.1 查看顯示模塊的狀態(tài)
cat /sys/class/disp/disp/attr/sys
示例如下:
# cat /sys/class/disp/disp/attr/sys screen 0: de_rate 432000000 Hz /* de 的時(shí)鐘頻率*/, ref_fps=50 /* 輸出設(shè)備的參考刷新率*/ hdmi output mode(4) fps:50.5 1280x 720 err:0 skip:54 irq:21494 vsync:0 BUF enable ch[0] lyr[0] z[0] prem[N] a[globl 255] fmt[ 1] fb [1920,1080;1920,1080;1920,1080] crop[ 0, 0,1920,1080] frame[ 32, 18,1216, 684] addr[716da000, 0, 0] flags[0x 0] trd[0,0] screen 1: de_rate 432000000 Hz /* de 的時(shí)鐘頻率*/, ref_fps=50 /* 輸出設(shè)備的參考刷新率*/ tv output mode(11) fps:50.5 720x 576 /* TV 輸出| 模式為(11:PAL) | 刷新率為:50.5Hz | 分辨 率為:720x576 */ err:0 skip:54 irq:8372 vsync:0 BUF enable ch[0] lyr[0] z[0] prem[Y] a[globl 255] fmt[ 0] fb[ 720, 576; 720, 576; 720, 576] crop[ 0, 0, 720, 576] frame[ 18, 15, 684, 546] addr[739a8000, 0, 0] flags[0x 0] trd[0,0] acquire: 225, 2.6 fps release: 224, 2.6 fps display: 201, 2.5 fps
圖層各信息描述如下:
BUF: 圖層類型,BUF/COLOR,一般為BUF,即圖層是帶BUFFER 的。COLOR 意思是顯示一個(gè)純色的畫面,不帶 BUFFER。 enable: 顯示處于enable 狀態(tài)。 ch[0]: 該圖層處于blending 通道0。 lyr[0]: 該圖層處于當(dāng)前blending 通道中的圖層0。 z[0]: 圖層z 序,越小越在底部,可能會(huì)被z 序大的圖層覆蓋住。 prem[Y]: 是否預(yù)乘格式,Y 是,N 否。 a: alpha 參數(shù), globl/pixel/; alpha 值。 fmt: 圖層格式,值64 以下為RGB 格式;以上為YUV 格式,常見的72 為YV12,76 為NV12。 fb: 圖層buffer 的size,width,height,三個(gè)分量。 crop: 圖像buffer 中的裁減區(qū)域, [x,y,w,h]。 frame: 圖層在屏幕上的顯示區(qū)域,[x,y,w,h]。 addr: 三個(gè)分量的地址。 flags: 一般為0, 3D SS 時(shí)0x4, 3D TB 時(shí)為0x1, 3D FP 時(shí)為0x2。 trd: 是否3D 輸出,3D 輸出的類型(HDMI FP 輸出時(shí)為1)各counter 描述如下: err: de 缺數(shù)的次數(shù),de 缺數(shù)可能會(huì)出現(xiàn)屏幕抖動(dòng),花屏的問題。de 缺數(shù)一般為帶寬不足引起。 skip: 表示de 跳幀的次數(shù),跳幀會(huì)出現(xiàn)卡頓問題。跳幀是指本次中斷響應(yīng)較慢,de 模塊判斷在本次中斷已經(jīng)接近或 者超過了消隱區(qū),將放棄本次更新圖像的機(jī)會(huì),選擇繼續(xù)顯示原有的圖像。 irq: 表示該通路上垂直消隱區(qū)中斷執(zhí)行的次數(shù),一直增長(zhǎng)表示該通道上的timing。 controller 正在運(yùn)行當(dāng)中。 vsync:表示顯示模塊往用戶空間中發(fā)送的vsync 消息的數(shù)目,一直增長(zhǎng)表示正在不斷地發(fā)送中。 acquire/release/display 含義如下,只在android 方案中有效。 acquire: 是hw composer 傳遞給disp driver 的圖像幀數(shù)以及幀率,幀率只要有在有圖像更新時(shí)才有效,靜止 時(shí)的值是不準(zhǔn)確的。 release: 是disp driver 顯示完成之后,返還給android 的圖像幀數(shù)以及幀率,幀率只要有在有圖像更新時(shí)才有 效,靜止時(shí)的值是不準(zhǔn)確的。 display: 是disp 顯示到輸出設(shè)備上的幀數(shù)以及幀率,幀率只要有在有圖像更新時(shí)才有效,靜止時(shí)的值是不準(zhǔn)確的如 果acquire 與release 不一致,說明disp 有部分圖像幀仍在使用,未返還,差值在1~2 之間為正常值。二者不能 相等,如果相等,說明圖像幀全部返還,顯示將會(huì)出。 現(xiàn)撕裂現(xiàn)象。如果display 與release 不一致,說明在disp 中存在丟幀情況,原因?yàn)樵谝粋€(gè)active 區(qū)內(nèi) hwcomposer 傳遞多于一幀的圖像幀下來。
調(diào)試說明:
1. 對(duì)于android 系統(tǒng),可以dumpsys SurfaceFlinger 打印surface 的信息,如果信息與disp 中sys 中的信息不一致,很大可能是hwc 的轉(zhuǎn)換存在問題。 2. 如果發(fā)現(xiàn)圖像刷新比較慢,存在卡頓問題,可以看一下輸出設(shè)備的刷新率,對(duì)比一下ref_fps 與fps 是否一致,如果不一致,說明tcon 的時(shí)鐘頻率或timing 沒配置正確。如果ref_fps 與屏的spec 不一致,則需要檢查sys_config 中的時(shí)鐘頻率和timing配置是否正確。屏一般為60Hz,而如果是TV 或HDMI,則跟模式有關(guān),比較常 見的為60/50/30/24Hz。 如果是android 方案,還可以看一下display 與release 的counter 是否一致,如果相差太大,說明android送幀不均勻,造成丟幀。 3. 如果發(fā)現(xiàn)圖像刷新比較慢,存在卡頓問題,也需要看一下skip counter,如果skip counter 有增長(zhǎng),說明現(xiàn)在的系統(tǒng)負(fù)荷較重,對(duì)vblank 中斷的響應(yīng)較慢,出現(xiàn)跳幀,導(dǎo)致了圖像卡頓問題。 4. 如果屏不亮,懷疑背光時(shí),可以看一下屏的背光值是否為0。如果為0,說明上層傳遞下來的背光值不合理;如果不為0,背光還是不亮,則為驅(qū)動(dòng)或硬件問題了。硬件上可以通過測(cè)量bl_en 以及pwm 的電壓值來排查問題。 5. 如果花屏或圖像抖動(dòng),可以查看err counter,如果err counter 有增長(zhǎng),則說明de缺數(shù),有可能是帶寬不足,或者瞬時(shí)帶寬不足問題。
10.2 截屏
echo 0 > /sys/class/disp/disp/attr/disp echo /data/filename.bmp > /sys/class/disp/disp/attr/capture_dump
該調(diào)試方法用于截取DE 輸出到TCON 前的圖像,用于顯示通路上分段排查。如果截屏沒有問題而界面異常,可以確定TCON 到顯示器間出錯(cuò)。
第一個(gè)路徑接受顯示器索引0 或1。
第二個(gè)路徑接受文件路徑。
10.3 colorbar
echo 0 > /sys/class/disp/disp/attr/disp echo > /sys/class/disp/disp/attr/colorbar
第一個(gè)路徑接受顯示器索引0 或1。
第二個(gè)路徑表示TCON 選擇的輸入源。1,DE 輸出;2-7,TCON 自檢用的colorbar;8,DE自檢用的colorbar。
10.4 顯示模塊debugfs 接口
10.4.1 總述
調(diào)試節(jié)點(diǎn)
mount -t debugfs none /sys/kernek/debug; /sys/kernel/debug/dispdbg;name command param start info //name: 表示操作的對(duì)象名字 //command: 表示執(zhí)行的命令 //param: 表示該命令接收的參數(shù) //start: 輸入1 開始執(zhí)行命令 //info: 保存命令執(zhí)行的結(jié)果 //只讀,大小是1024 bytes。
10.4.2 切換顯示輸出設(shè)備
name: disp0/1/2 //表示顯示通道0/1/2 command: switch param: type mode //參數(shù)說明:type:0(none),1(lcd),2(tv),4(hdmi),8(vga) //mode 詳見disp_tv_mode 定義 /* 例子*/ /* 顯示通道0 輸出LCD */ echo disp0 > name;echo switch > command;echo 1 0 > param;echo 1 > start; /* 關(guān)閉顯示通道0 的輸出*/ echo disp0 > name;echo switch > command;echo 0 0 > param;echo 1 > start;
10.4.3 開關(guān)顯示輸出設(shè)備
name: disp0/1/2 //表示顯示通道0/1/2 command: blank param: 0/1 //參數(shù)說明:1 表示blank,即關(guān)閉顯示輸出;0 表示unblank,即開啟顯示輸出 /* 例子*/ /* 關(guān)閉顯示通道0 的顯示輸出*/ echo disp0 > name;echo blank > command;echo 1 > param;echo 1 > start; /* 開啟顯示通道1 的顯示輸出*/ echo disp1 > name;echo blank > command;echo 0 > param;echo 1 > start;
10.4.4 電源管理(suspend/resume) 接口
name: disp0/1/2 //表示顯示通道0/1/2 command: suspend/resume //休眠,喚醒命令 param: 無 /* 例子*/ /* 讓顯示模塊進(jìn)入休眠狀態(tài)*/ echo disp0 > name;echo suspend > command;echo 1 > start; /* 讓顯示模塊退出休眠狀態(tài)*/ echo disp1 > name;echo resume > command;echo 1 > start;
10.4.5 調(diào)節(jié)lcd 屏幕背光
name: lcd0/1/2 //表示lcd0/1/2 command: setbl //設(shè)置背光亮度 param: xx //參數(shù)說明:背光亮度值,范圍是0~255。 /* 例子*/ /* 設(shè)置背光亮度為100 */ echo lcd0 > name;echo setbl > command;echo 100 > param;echo 1 > start; /* 設(shè)置背光亮度為0 */ echo lcd0 > name;echo setbl > command;echo 0 > param;echo 1 > start;
10.4.6 vsync 消息開關(guān)
name: disp0/1/2 //表示顯示通道0/1/2 command: vsync_enable //開啟/關(guān)閉vsync 消息 param: 0/1 //參數(shù)說明:0:表示關(guān)閉; 1:表示開啟 /* 例子*/ /* 關(guān)閉顯示通道0 的vsync 消息*/ echo disp0 > name;echo vsync_enable > command;echo 0 > param;echo 1 > start; /* 開啟顯示通道1 的vsync 消息*/ echo disp1 > name;echo vsync_enable > command;echo 1 > param;echo 1 > start;
10.4.7 查看enhance 的狀態(tài)
name: enhance0/1/2 //表示enhance0/1/2 command: getinfo //獲取enhance 的狀態(tài) param: 無 /* 例子*/ /* 獲取顯示通道0 的enhance 狀態(tài)信息*/ # echo enhance0 > name;echo getinfo > command;echo 1 > start;cat info; # enhance 0: enable, normal
10.4.8 查看智能背光的狀態(tài)
name: smbl0/1/2 //表示顯示通道0/1/2 command: getinfo //獲取smart backlight 的狀態(tài) param: 無 /* 例子*/ /* 獲取顯示通道0 的smbl 狀態(tài)信息*/ # echo smbl0 > name;echo getinfo > command;echo 1 > start;cat info; # smbl 0: disable, window<0,0,0,0>, backlight=0, save_power=0 percent //顯示的是智能背光是否開啟,有效窗口大小,當(dāng)前背光值,省電比例
10.5 常見問題
10.5.1 黑屏(無背光)
問題現(xiàn)象:機(jī)器接LCD 輸出,發(fā)現(xiàn)LCD 沒有任何顯示,仔細(xì)查看背光也不亮。
問題分析:此現(xiàn)象說明LCD 背光供電不正常,不排除還有其他問題,但沒背光的問題必須先解決。
問題排查步驟:
? 步驟一
使用電壓表量LCD 屏的各路電壓,如果背光管腳電壓不正常,確定是PWM 問題。否則,嘗試換個(gè)屏再試。
? 步驟二
先看看隨sdk 有沒發(fā)布PWM 模塊使用指南,如果有按照里面步驟進(jìn)行排查。
? 步驟三
如果sdk 沒有發(fā)布PWM 模塊使用指南。可以cat /sys/kernel/debug/pwm 看看有沒輸出。如果沒有就是PWM 驅(qū)動(dòng)沒有加載,請(qǐng)檢查一下menuconfig 有沒打開。
? 步驟四
如果步驟三未解決問題,請(qǐng)排查dts 或board.dts 配置。如果還沒有解決,可以尋求技術(shù)支持。
10.5.2 黑屏(有背光)
問題現(xiàn)象:機(jī)器接LCD,發(fā)現(xiàn)有背光,界面輸出黑屏。
問題分析:此現(xiàn)象說明沒有內(nèi)容輸出,可能是DE、TCON 出錯(cuò)或應(yīng)用沒有送幀。
問題排查步驟:
? 步驟一
根據(jù)10.1 章節(jié)排查應(yīng)用輸入的圖層信息是否正確。其中,寬高、顯存的文件句柄出錯(cuò)問題最多。
? 步驟二
根據(jù)10.2 章節(jié)截屏,看看DE 輸出是否正常。如果不正常,排查DE 驅(qū)動(dòng)配置是否正確;如果正常,接著下面步驟。
? 步驟三 根據(jù)10.3 章節(jié)輸出colorbar,如果TCON 自身的colorbar 也沒有顯示,排查硬件通路;如果 有顯示,排查TCON 輸入源選擇的寄存器。后者概率很低,此時(shí)可尋求技術(shù)支持。
10.5.3 綠屏
問題現(xiàn)象:顯示器出現(xiàn)綠屏,切換界面可能有其他變化。
問題分析:此現(xiàn)象說明處理圖層時(shí)DE 出錯(cuò)。可能是應(yīng)用送顯的buffer 內(nèi)容或者格式有問題;也
可能DE 配置出錯(cuò)。
問題排查步驟:
? 步驟一
根據(jù)10.1 章節(jié)排查應(yīng)用輸入的圖層信息是否正確。其中,圖層格式填錯(cuò)的問題最多。
? 步驟二
導(dǎo)出DE 寄存器,排查異常。此步驟比較復(fù)雜,需要尋求技術(shù)支持。
10.5.4 界面卡住
問題現(xiàn)象:界面定在一個(gè)畫面,不再改變。
問題分析:此現(xiàn)象說明顯示通路一般是正常的,只是應(yīng)用沒有繼續(xù)送幀。
問題排查步驟:
? 步驟一
根據(jù)10.1 章節(jié)排查應(yīng)用輸入的圖層信息有沒改變,特別關(guān)注圖層的地址。
? 步驟二
排查應(yīng)用送幀邏輯,特別關(guān)注死鎖,線程、進(jìn)行異常退出,fence 處理異常。
10.5.5 局部界面花屏
問題現(xiàn)象:畫面切到特定場(chǎng)景時(shí)候,出現(xiàn)局部花屏,并不斷抖動(dòng)。
問題分析:此現(xiàn)象是典型的DE scaler 出錯(cuò)現(xiàn)象。
問題排查步驟:
根據(jù)10.1 章節(jié)查看問題出現(xiàn)時(shí)帶縮放圖層的參數(shù)。如果屏幕輸出的寬x 高除以crop 的寬x 高小于1/16 或者大于32,那么該圖層不能走DE 縮放,改用GPU,或應(yīng)
用修改圖層寬高。
10.5.6 快速切換界面花屏
問題現(xiàn)象:快速切換界面花屏,變化不大的界面顯示正常。
問題分析:此現(xiàn)象是典型的性能問題,與顯示驅(qū)動(dòng)關(guān)系不大。
問題排查步驟:
? 步驟一
排查DRAM 帶寬是否滿足場(chǎng)景需求。
? 步驟二
若是安卓系統(tǒng),排查fence 處理流程;若是純linux 系統(tǒng),排查送幀流程、swap buffer、pandisplay流程。
-
接口
+關(guān)注
關(guān)注
33文章
8504瀏覽量
150840 -
Linux
+關(guān)注
關(guān)注
87文章
11230瀏覽量
208933 -
Display
+關(guān)注
關(guān)注
1文章
52瀏覽量
24702 -
開發(fā)指南
+關(guān)注
關(guān)注
0文章
34瀏覽量
7531 -
Tina
+關(guān)注
關(guān)注
2文章
45瀏覽量
16957
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論