精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Tina Linux Display開發(fā)指南

嵌入式Linux那些事 ? 來源:嵌入式Linux那些事 ? 作者:嵌入式Linux那些事 ? 2023-03-06 10:52 ? 次閱讀

Tina_Linux_Display_開發(fā)指南

image-20221123145359081image-20221123145359081image-20221123145359081image-20221123145359081image-20221123145359081

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 模塊功能介紹

image-20221123145359081

?

圖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)

image-20221123150416330

?

圖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)框架介紹

image-20221123151947713

?

圖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í)的部分,其余部分是隱藏的,不能在屏幕上顯示出來的。

image-20221123152906780

?

圖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 可以不相等。

image-20221123152930138

?

圖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í),還可以做淡入淺出的效果。

image-20221123153137180

?

圖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ù)
起點(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流程。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(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
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Tina_Linux系統(tǒng)裁剪開發(fā)指南

    Tina_Linux系統(tǒng)裁剪開發(fā)指南1 概述2 Tina系統(tǒng)裁剪簡(jiǎn)介2.1 boot0裁剪2.2 uboot裁剪2.3 內(nèi)核裁剪2.3.1 刪除不使用的功能2.3.2 刪除不使用的驅(qū)動(dòng)2.3.3
    的頭像 發(fā)表于 03-06 09:52 ?1515次閱讀

    EAC0945 linux開發(fā)指南

    EAC0945 linux開發(fā)指南
    發(fā)表于 09-28 12:40

    EAC0945 linux開發(fā)指南

    `EAC0945 linux開發(fā)指南`
    發(fā)表于 10-31 12:18

    Rockchip Linux SDK uboot logo開發(fā)指南

    arm嵌入式vs-rk3399 板卡uboot logo 開發(fā)指南概述:本文檔主要介紹 rockchip linux sdk uboot logo 顯示的相關(guān)功能、配置以及開發(fā)過程中的注意事項(xiàng)。適用于 rockhip
    發(fā)表于 10-09 08:12

    Tiny6410 Linux開發(fā)指南詳解

    Tiny6410 Linux 開發(fā)指南
    發(fā)表于 07-08 17:12 ?210次下載
    Tiny6410 <b class='flag-5'>Linux</b><b class='flag-5'>開發(fā)指南</b>詳解

    A64開發(fā)板LCD開發(fā)指南

    A64開發(fā)板LCD開發(fā)指南,驅(qū)動(dòng)開發(fā)指南
    發(fā)表于 06-21 17:02 ?0次下載

    彩光燈開發(fā)指南

    彩光燈開發(fā)指南
    發(fā)表于 12-29 20:15 ?0次下載

    Linux的平臺(tái)下Mini210S裸機(jī)程序開發(fā)指南

    Linux的平臺(tái)下Mini210S裸機(jī)程序開發(fā)指南
    發(fā)表于 10-29 10:52 ?59次下載
    <b class='flag-5'>Linux</b>的平臺(tái)下Mini210S裸機(jī)程序<b class='flag-5'>開發(fā)指南</b>

    Rockchip Linux SDK的開發(fā)指南的詳細(xì)資料說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是Rockchip Linux SDK的開發(fā)指南的詳細(xì)資料說明。
    發(fā)表于 01-10 17:17 ?74次下載
    Rockchip <b class='flag-5'>Linux</b> SDK的<b class='flag-5'>開發(fā)指南</b>的詳細(xì)資料說明

    Tina_Linux_系統(tǒng)軟件開發(fā)指南

    Tina_Linux_系統(tǒng)軟件開發(fā)指南
    的頭像 發(fā)表于 03-02 15:25 ?1776次閱讀
    <b class='flag-5'>Tina_Linux</b>_系統(tǒng)軟件<b class='flag-5'>開發(fā)指南</b>

    Tina Linux配置開發(fā)指南

    Tina Linux配置開發(fā)指南
    的頭像 發(fā)表于 03-02 15:28 ?1.6w次閱讀
    <b class='flag-5'>Tina</b> <b class='flag-5'>Linux</b>配置<b class='flag-5'>開發(fā)指南</b>

    Linux NOR開發(fā)指南

    Linux NOR開發(fā)指南
    的頭像 發(fā)表于 03-06 09:55 ?925次閱讀
    <b class='flag-5'>Linux</b> NOR<b class='flag-5'>開發(fā)指南</b>

    Tina Linux圖形系統(tǒng)開發(fā)指南

    本文檔將介紹 Allwinner Tina Linux 中已經(jīng)移植好的窗口系統(tǒng),以及怎么使用,包括 MiniGUI、QT5、EFL、GTK+(WebkitGtk、Midori)、DirectFB、Wayland,整體結(jié)構(gòu) 。
    的頭像 發(fā)表于 03-06 11:00 ?3055次閱讀
    <b class='flag-5'>Tina</b> <b class='flag-5'>Linux</b>圖形系統(tǒng)<b class='flag-5'>開發(fā)指南</b>

    Tina Linux音頻開發(fā)指南

    介紹Tina平臺(tái)音頻模塊的使用方法。
    的頭像 發(fā)表于 03-06 11:02 ?6254次閱讀
    <b class='flag-5'>Tina</b> <b class='flag-5'>Linux</b>音頻<b class='flag-5'>開發(fā)指南</b>

    Tina Linux PMU開發(fā)指南

    介紹使用Tina PMU 驅(qū)動(dòng)的使用方法。
    的頭像 發(fā)表于 03-06 11:05 ?2016次閱讀
    <b class='flag-5'>Tina</b> <b class='flag-5'>Linux</b> PMU<b class='flag-5'>開發(fā)指南</b>