91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuà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 編寫目的

讓顯示應用開發(fā)人員了解顯示驅(qū)動的接口及使用流程,快速上手,進行開發(fā);讓新人接手工作時能快速地了解驅(qū)動接口,進行調(diào)試排查問題。

1.2 適用范圍

sunxi 平臺DE1.0/DE2.0。

1.3 相關人員

與顯示相關的應用開發(fā)人員,及與顯示相關的其他模塊的開發(fā)人員,以及新人。

2 模塊介紹

2.1 模塊功能介紹

image-20221123145359081

?

圖2-1: 模塊框圖

?

本模塊框圖如上,由顯示引擎(DE)和各類型控制器(tcon)組成。輸入圖層(layers)在DE中進行顯示相關處理后,通過一種或多種接口輸出到顯示設備上顯

示,以達到將眾多應用渲染的圖層合成后在顯示器呈現(xiàn)給用戶觀看的作用。DE 有2 個獨立單元(可以簡稱de0、de1),可以分別接受用戶輸入的圖層進行合成,

輸出到不同的顯示器,以實現(xiàn)雙顯。DE 的每個獨立的單元有1-4 個通道(典型地,de0 有4 個,de1 有2 個),每個通道可以同時處理接受4 個格式相同的

圖層。sunxi 平臺有視頻通道和UI 通道之分。視頻通道功能強大,可以支持YUV 格式和RGB圖層。UI 通道只支持RGB 圖層。

簡單來說,顯示模塊的主要功能如下:

? 支持lcd(hv/lvds/cpu/dsi) 輸出。 ? 支持雙顯輸出。 ? 支持多圖層疊加混合處理。 ? 支持多種顯示效果處理(alpha, colorkey, 圖像增強,亮度/對比度/飽和度/色度調(diào)整)。 ? 支持智能背光調(diào)節(jié)。 ? 支持多種圖像數(shù)據(jù)格式輸入(arg,yuv)。 ? 支持圖像縮放處理。 ? 支持截屏。 ? 支持圖像轉(zhuǎn)換。

2.2 相關術語介紹

2.2.1 硬件術語介紹

?

表2-1: 硬件術語介紹表

?

術語 解釋
de display engine,顯示引擎,負責將輸入的多圖層進行疊加、混合、縮放等處理的硬件模塊
channel 一個硬件通道,包含若干圖層處理單元,可以同時處理若干(典型4 個)格式相同的圖層
layer 一個圖層處理單元,可以處理一張輸入圖像,按支持的圖像格式分video 和ui類型
capture 截屏,將de 的輸出保存到本地文件
alpha 透明度,在混合時決定對應圖像的透明度
transform 圖像變換,如平移、旋轉(zhuǎn)等
overlay 圖像疊加,按順序?qū)D像疊加一起的效果。z 序大的靠近觀察者,會把z 序小的擋住
blending 圖像混合,按alpha 比例將圖像合成一起的效果
enhance 圖像增強,有目的地處理圖像數(shù)據(jù)以達到改善圖像效果的過程或方法

2.2.2 軟件術語介紹

?

表2-2: 軟件術語介紹表

?

術語 解釋
fb 幀緩沖(framebuffer),Linux 為顯示設備提供的一個接口,把顯存抽象成的一種設備。有時也指一塊顯存
al 抽象層,驅(qū)動中將底層硬件抽象成固定業(yè)務邏輯的軟件層
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ū)動請選上。

? debugfs support for disp driver(sunxi-disp2)

調(diào)試節(jié)點,建議選上,方便調(diào)試。

? composer support for disp driver(sunxi-disp2)

disp2 的fence 處理。linux 系統(tǒng)可以不選擇。

2.4 源碼結構介紹

源碼結構如下:

├─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)相關層

│ │ │ │ │ │ ├─lcd/ lcd driver

│ │ │ │ │ │ │ │─lcd_src_interface.c --與display 驅(qū)動的接口

│ │ │ │ │ │ │ │─default_panel.c... --平臺已經(jīng)支持的屏驅(qū)動

include

├─video video header dir

│ ├─sunxi_display2.h display header file

2.5 驅(qū)動框架介紹

image-20221123151947713

?

圖2-3: 驅(qū)動框圖

?

顯示驅(qū)動可劃分為三個層面,驅(qū)動層,框架層及底層。底層與圖形硬件相接,主要負責將上層配置的功能參數(shù)轉(zhuǎn)換成硬件所需要的參數(shù),并配置到相應寄存器中。

顯示框架層對底層進行抽象封裝成一個個的功能模塊。驅(qū)動層對外封裝功能接口,通過內(nèi)核向用戶空間提供相應的設備結點及統(tǒng)一的接口。在驅(qū)動層,分為四個驅(qū)

動,分別是framebuffer 驅(qū)動,disp 驅(qū)動,lcd 驅(qū)動,hdmi 驅(qū)動。Framebuffer 驅(qū)動與framebuffer core 對接,實現(xiàn)linux 標準的framebuffre 接口。

Disp 驅(qū)動是是整個顯示驅(qū)動中的核心驅(qū)動模塊,所有的接口都由disp 驅(qū)動來提供,包括lcd 的接口。

3 模塊接口概述

模塊使用主要通過ioctl 實現(xiàn),對應的驅(qū)動節(jié)點是/dev/disp。

具體定義請仔細閱讀頭文件上面的注釋,kernel/linux-4.9/include/video/sunxi_display2.h。

對于顯示模塊來說,把圖層參數(shù)設置到驅(qū)動,讓顯示器顯示為最重要。sunxi 平臺的DE 接受用戶設置圖層參數(shù),通過disp,channel,layer_id 三個索引確定需要設置的顯示位置(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 標識,而矩形框住的部分為裁減區(qū),以crop 標識,在屏幕上

只能看到crop 標識的部分,其余部分是隱藏的,不能在屏幕上顯示出來的。

image-20221123152906780

?

圖3-1: size 和crop 示意圖

?

? crop 和screen_win

crop 上面已經(jīng)介紹過,Screen_win 為crop 部分buffer 在屏幕上顯示的位置。如果不需要進行縮放的話,crop 和screen_win 的width,height 是相等的,如果需要

縮放,crop 和screen_win 的width,height 可以不相等。

image-20221123152930138

?

圖3-2: crop 和screen win 示意圖

?

? alpha

Alpha 模式有三種:

gloabal alpha: 全局alpha,也叫面alpha,即整個圖層共用一個alpha,統(tǒng)一的透明度。

pixel alpha: 點alpha,即每個像素都有自己單獨的alpha,可以實現(xiàn)部分區(qū)域全透,部分區(qū)域半透,部分區(qū)域不透的效果。

global_pixel alpha: 可以是說以上兩種效果的疊加,在實現(xiàn)pxiel alpha 的效果的同時,還可以做淡入淺出的效果。

image-20221123153137180

?

圖3-3: alpha 疊加模式

?

? align

顯存的對齊字節(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

所有圖層都支持縮放。對圖層的操作如下所示:

設置圖層參數(shù)并使能,接口為DISP_LAYER_SET_CONFIG,圖像格式,buffer size, buffer 地址,alpha 模式,enable,圖像幀id 號等參數(shù)。

關閉圖層,依然通過DISP_LAYER_SET_CONFIG,將enable 參數(shù)設置為0 關閉。

4 顯示輸出設備操作說明

Disp2 支持多種的顯示輸出設備,LCD、TV、HDMI。開啟顯示輸出設備有幾種方式,第一種是在sys_config 或dts 中配置[disp] 的初始化參數(shù),顯示模塊在加載時

將會根據(jù)配置初始化選擇的顯示輸出設備;第二種是在kernel 啟動后,調(diào)用驅(qū)動模塊的ioctl 接口去開啟或關閉指定的輸出設備,以下是操作的說明:

? 開啟或切換到某個具體的顯示輸出設備,ioctl(DISP_DEVICE_SWITCH…),參數(shù)設置為特定的輸出設備類型,DISP_OUTPUT_TYPE_LCD/TV/HDMI。

? 關閉某個設備,ioctrl(DISP_DEVICE_SWITCH…),參數(shù)設置為DISP_OUTPUT_TYPE_NONE。

5 接口參數(shù)更改說明

sunxi 平臺支持disp1 和disp2。

?

表5-1: disp1 與disp2 區(qū)別

?

項目平臺 disp2 disp1
圖層標識 以disp, chennel, layer_id 唯一標識 以disp, layer_id 唯一標識
圖層開關 將開關當成圖層參數(shù)設置DISP_LAYER_SET_CONFIG 中 獨立圖層開關接口
圖層size 每個分量都需要設置1 個size 一個buffer 只有1
圖層align 針對每個分量需要設置其align,單位為byte。
圖層Crop 為64 位定點小數(shù),高32 位為整數(shù),低32位為小數(shù) 為32 位參數(shù),不支持小數(shù)
YUV MB 格式支持 不再支持 支持
PALETTE 格式支持 不再支持 支持
單色模式(無buffer) 支持 不支持
Pipe 選擇 Pipe 對用戶透明,用戶無需選擇,只需要配置channel 用戶設置
zorder 用戶設置,保證zorder 不重復,從0 到N-1 用戶不能設置
設置圖層信息接口 一次可設置多個圖層的信息,增加一個圖層信息數(shù)目參數(shù) 一次設置1 個圖層信息

6 輸出設備介紹

平臺支持屏以及HDMI 輸出,及二者同時顯示。

6.1 屏

屏的接口很多,平臺支持RGB/CPU/LVDS/DSI 接口。

6.2 HDMI

HDMI 全名是:High-Definition Multimedia Interface??梢蕴峁〥VD,audio device, settop boxes,television sets, and other video displays 之間的高清互

聯(lián)??梢猿休d音,視頻數(shù)據(jù),以及其他的控制,數(shù)據(jù)信息。支持熱插拔,內(nèi)容保護,模式是否支持的查詢。

6.3 同顯

驅(qū)動支持雙路顯示。屏(主)+ HDMI(輔)。

同顯或異顯,差別只在于顯示內(nèi)容,如果顯示內(nèi)容一樣,則為同顯;反之,則為異顯。

如果是android 系統(tǒng),4.2 版本以上版本,原生框架已經(jīng)支持多顯(同顯,異顯,虛擬顯示設備),實現(xiàn)同顯則比較簡單,在android hal 與上層對接好即可。

如果是android 4.1 以下版本,同顯需要自行實現(xiàn),參考做法為主屏內(nèi)容由android 原生提供,輔屏需要android hal 在合適的時機(比如HDMI 插入時)打開

輔屏,并且將主屏的內(nèi)容(存放于FB0 中),拷貝至輔屏的顯示后端buffer 中,然后將輔屏的后端buffer 切換到前端buffer。注意問題為,兩路顯示的顯示

buffer 的同步,如果同步不好,會產(chǎn)生圖像撕裂,錯位的現(xiàn)象。

如果是Linux 系統(tǒng),做法與上一個做法類似。

7 IOCTL 接口描述

sunxi 平臺下顯示驅(qū)動給用戶提供了眾多功能接口,可對圖層、LCD、hdmi 等顯示資源進行操作。

7.1 Global Interface

7.1.1 DISP_SHADOW_PROTECT

? 原型

int ioctl(int handle, unsigned int cmd, unsigned int *arg);

? 參數(shù)

參數(shù) 說明
hdle 顯示驅(qū)動句柄
cmd DISP_SHADOW_PROTECT
arg arg[0] 為顯示通道0/1;arg[1] 為protect 參數(shù),1 表示protect, 0: 表示not protect

? 返回值

如果成功,返回DIS_SUCCESS,否則,返回失敗號。

? 描述

DISP_SHADOW_PROTECT(1)與DISP_SHADOW_PROTECT(0)配對使用,在protect期間,所有的請求當成一個命令序列緩沖起來, 等到調(diào)用

DISP_SHADOW_PROTECT(0)后將一起執(zhí)行。

? 示例

//啟動cache,disphd為顯示驅(qū)動句柄

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ū)動句柄
cmd DISP_SET_BKCOLOR
arg arg[0] 為顯示通道0/1;arg[1] 為backcolor 信息,指向disp_color 數(shù)據(jù)結構指針

? 返回值

如果成功,返回DIS_SUCCESS,否則,返回失敗號。

? 描述

該函數(shù)用于設置顯示背景色。

? 示例

//設置顯示背景色,disphd為顯示驅(qū)動句柄,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ū)動句柄
cmd DISP_GET_BKCOLOR
arg arg[0] 為顯示通道0/1;arg[1] 為backcolor 信息,指向disp_color 數(shù)據(jù)結構指針

? 返回值

如果成功,返回DIS_SUCCESS,否則,返回失敗號。

? 描述

該函數(shù)用于獲取顯示背景色。

? 示例

//獲取顯示背景色,disphd為顯示驅(qū)動句柄,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ū)動句柄
cmd DISP_GET_SCN_WIDTH
arg arg[0] 顯示通道0/1

? 返回值

如果成功,返回當前屏幕水平分辨率,否則,返回失敗號。

? 描述

該函數(shù)用于獲取當前屏幕水平分辨率。

? 示例

//獲取屏幕水平分辨率 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ū)動句柄
cmd DISP_GET_SCN_HEIGHT
arg arg[0] 顯示通道0/1

? 返回值

如果成功,返回當前屏幕垂直分辨率,否則,返回失敗號。

? 描述

該函數(shù)用于獲取當前屏幕垂直分辨率。

? 示例

//獲取屏幕垂直分辨率 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ū)動句柄
cmd DISP_GET_OUTPUT_TYPE
arg arg[0] 顯示通道0/1

? 返回值

如果成功,返回當前顯示輸出類型,否則,返回失敗號。

? 描述

該函數(shù)用于獲取當前顯示輸出類型(LCD,TV,HDMI,VGA,NONE)。

? 示例

//獲取當前顯示輸出類型 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ū)動句柄
cmd DISP_GET_OUTPUT
arg arg[0] 為顯示通道0/1;arg[1] 為指向disp_output 結構體的指針,用于保存返回值

? 返回值

如果成功,返回0,否則,返回失敗號。

? 描述

該函數(shù)用于獲取當前顯示輸出類型及模式(LCD,TV,HDMI,VGA,NONE)。

? 示例

//獲取當前顯示輸出類型 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ū)動句柄
cmd DISP_VSYNC_EVENT_EN
arg arg[0] 為顯示通道0/1;arg[1] 為enable 參數(shù),0:disable, 1:enable

? 返回值

如果成功,返回DIS_SUCCESS。

否則,返回失敗號。

? 描述

該函數(shù)開啟/關閉vsync 消息發(fā)送功能。

? 示例

//開啟/關閉vsync消息發(fā)送功能,disphd為顯示驅(qū)動句柄,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ū)動句柄
cmd DISP_DEVICE_SWITCH
arg arg[0] 為顯示通道0/1;arg[1] 為輸出類型;arg[2] 為輸出模式,在輸出類型不為LCD 時有效

? 返回值

如果成功,返回DIS_SUCCESS,否則,返回失敗號。

? 描述

該函數(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,將會關閉當前顯示通道的輸出。

7.1.10 DISP_DEVICE_SET_CONFIG

? 原型

int ioctl(int handle, unsigned int cmd,unsigned int *arg);

? 參數(shù)

參數(shù) 說明
hdle 顯示驅(qū)動句柄
cmd DISP_DEVICE_SET_CONFIG
arg arg[0] 為顯示通道0/1;arg[1] 為指向disp_device_config 的指針

? 返回值

如果成功,返回DIS_SUCCESS,否則,返回失敗號。

? 描述

該函數(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,將會關閉當前顯示通道的輸出。

7.1.11 DISP_DEVICE_GET_CONFIG

? 原型

int ioctl(int handle, unsigned int cmd,unsigned int *arg);

? 參數(shù)

參數(shù) 說明
hdle 顯示驅(qū)動句柄
cmd DISP_DEVICE_GET_CONFIG
arg arg[0] 為顯示通道0/1;arg[1] 為指向disp_device_config 的指針

? 返回值

如果成功,返回DIS_SUCCESS,否則,返回失敗號。

? 描述

該函數(shù)用于獲取當前輸出類型及相關的屬性參數(shù)。

? 示例

//獲取當前輸出類型及相關的屬性參數(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,表示當前輸出顯示通道為關閉狀態(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ū)動句柄
cmd DISP_CMD_SET_LAYER_CONFIG
arg arg[0] 為顯示通道0/1;arg[1] 為圖層配置參數(shù)指針;arg[2] 為需要配置的圖層數(shù)目

? 返回值

如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號。

? 描述

該函數(shù)用于設置多個圖層信息。

? 示例

struct { disp_layer_info info, bool enable; unsigned int channel, unsigned int layer_id, } disp_layer_config; //設置圖層參數(shù),disphd為顯示驅(qū)動句柄 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;//定點小數(shù)。高32bit為整數(shù),低32bit為小 數(shù) config.info.fb.crop.height= ((uunsigned long)height)<<32;//定點小數(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ū)動句柄
cmd DISP_LAYER_GET_CONFIG
arg arg[0] 為顯示通道0/1;arg[1] 為圖層配置參數(shù)指針;arg[2] 為需要獲取配置的圖層數(shù)目

? 返回值

如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號。

? 描述

該函數(shù)用于獲取圖層參數(shù)。

? 示例

//獲取圖層參數(shù),disphd為顯示驅(qū)動句柄 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ū)動句柄
cmd DISP_SET_LAYER_CONFIG2
arg arg[0] 為顯示通道0/1;arg[1] 為圖層配置參數(shù)指針;arg[2] 為需要配置的圖層數(shù)目

? 返回值

如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號。

? 描述

該函數(shù)用于設置多個圖層信息,注意該接口只接受disp_layer_config2 的信息。

? 示例

struct { disp_layer_info info, bool enable; unsigned int channel, unsigned int layer_id, }disp_layer_config2; //設置圖層參數(shù),dispfd 為顯示驅(qū)動句柄 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;//定點小數(shù)。高32bit 為整數(shù),低32bit 為小數(shù) config.info.fb.crop.height= ((uunsigned long)height)<<32;//定點小數(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ū)動句柄
cmd DISP_CAPTURE_START
arg arg[0] 為顯示通道0/1

? 返回值

如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號。

? 描述

該函數(shù)用于開啟截屏功能。

? 示例

//啟動截屏功能,dispfd 為顯示驅(qū)動句柄 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ū)動句柄
cmd DISP_CAPTURE_COMMIT
arg arg[0] 為顯示通道0/1;arg[1] 為指向截屏的信息結構體,詳見disp_capture_info

? 返回值

如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號。

? 描述

該函數(shù)用于提交截屏的任務,提交一次,則會啟動一次截屏操作。

? 示例

//提交截屏功能,dispfd 為顯示驅(qū)動句柄 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ū)動句柄
cmd DISP_CAPTURE_STOP
arg arg[0] 為顯示通道0/1

? 返回值

如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號。

? 描述

該函數(shù)用于關閉截屏功能。

? 示例

//停止截屏功能,dispfd 為顯示驅(qū)動句柄 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ū)動句柄
cmd DISP_CAPTURE_QUERY
arg arg[0] 為顯示通道0/1

? 返回值

如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號。

? 描述

該函數(shù)查詢剛結束的圖像幀是否截屏成功。

? 示例

//查詢截屏是否成功,dispfd 為顯示驅(qū)動句柄 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ū)動句柄
cmd DISP_LCD_SET_BRIGHTNESS
arg arg[0] 為顯示通道0/1;arg[1] 為背光亮度值,(0~255)

? 返回值

如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號。

? 描述

該函數(shù)用于設置LCD 亮度。

? 示例

//設置LCD的背光亮度,disphd為顯示驅(qū)動句柄 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ū)動句柄
cmd DISP_LCD_GET_BRIGHTNESS
arg arg[0] 為顯示通道0/1

? 返回值

如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號。

? 描述

該函數(shù)用于獲取LCD 亮度。

? 示例

//獲取LCD的背光亮度,disphd為顯示驅(qū)動句柄 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ū)動句柄
cmd DISP_ENHANCE_ENABLE
arg arg[0] 為顯示通道0/1

? 返回值

如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號。

? 描述

該函數(shù)用于使能圖像后處理功能。

? 示例

//開啟圖像后處理功能,disphd為顯示驅(qū)動句柄 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ū)動句柄
cmd DISP_ENHANCE_DISABLE
arg arg[0] 為顯示通道0/1

? 返回值

如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號。

? 描述

該函數(shù)用于關閉圖像后處理功能。

? 示例

//關閉圖像后處理功能,disphd為顯示驅(qū)動句柄 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ū)動句柄
cmd DISP_ENHANCE_DEMO_ENABLE
arg arg[0] 為顯示通道0/1

? 返回值

如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號。

? 描述

該函數(shù)用于開啟圖像后處理演示模式,開啟后,在屏幕會出現(xiàn)左邊進行后處理,右邊未處理的圖像畫面,方便對比效果。演示模式需要在后處理功能開啟之后才有

效。

? 示例

//開啟圖像后處理演示模式,disphd為顯示驅(qū)動句柄 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ū)動句柄
cmd DISP_ENHANCE_DEMO_DISABLE
arg arg[0] 為顯示通道0/1

? 返回值

如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號。

? 描述

該函數(shù)用于關閉圖像后處理演示模式。

? 示例

//開啟圖像后處理演示模式,disphd為顯示驅(qū)動句柄 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ū)動句柄
cmd DISP_SMBL_ENABLE
arg arg[0] 為顯示通道0/1

? 返回值

如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號。

? 描述

該函數(shù)用于使能智能背光功能。

? 示例

//開啟智能背光功能,disphd為顯示驅(qū)動句柄 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ū)動句柄
cmd DISP_SMBL_ENABLE
arg arg[0] 為顯示通道0/1

? 返回值

如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號。

? 描述

該函數(shù)用于關閉智能背光功能。

? 示例

//關閉智能背光功能,disphd為顯示驅(qū)動句柄 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ū)動句柄
cmd DISP_SMBL_SET_WINDOW
arg arg[0] 為顯示通道0/1;arg[1] 為指向struct disp_rect 的指針

? 返回值

如果成功,則返回DIS_SUCCESS;如果失敗,則返回失敗號。

? 描述

該函數(shù)用于設置智能背光開啟效果的窗口,智能背光在設置的窗口中有效。

? 示例

//設置智能背光窗口,disphd為顯示驅(qū)動句柄 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ū)動句柄
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ū)動句柄
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 接口描述

以下兩個函數(shù)在下面接口的demo 中會使用到。

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é)點

/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。

? 描述

該接口用于設置色彩增強的模式。

? 示例

//設置disp0 的色彩增強的模式為增強模式 echo 0 > /sys/class/disp/disp/attr/disp; echo 1 > /sys/class/disp/disp/attr/enhance_mode; //設置disp1 的色彩增強的模式為柔和模式 echo 1 > /sys/class/disp/disp/attr/disp; echo 2 > /sys/class/disp/disp/attr/enhance_mode; //設置disp0 的色彩增強的模式為增加模式,并且開啟演示模式 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é)點

/sys/class/disp/disp/attr/disp /sys/class/disp/disp/attr/enhance_bright /* 亮度*/ /sys/class/disp/disp/attr/enhance_contrast /* 對比度*/ /sys/class/disp/disp/attr/enhance_saturation /* 飽和*/ /sys/class/disp/disp/attr/enhance_edge /* 邊緣銳度*/ /sys/class/disp/disp/attr/enhance_detail /* 細節(jié)增強*/ /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。

? 描述

該接口用于設置圖像的亮度/對比度/飽和度/邊緣銳度/細節(jié)增強/降噪的調(diào)節(jié)幅度。

? 示例

//設置disp0 的圖像亮度為80 echo 0 > /sys/class/disp/disp/attr/disp; echo 80 > /sys/class/disp/disp/attr/enhance_bright; //設置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é)點

/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é)點

/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é)點

/sys/class/hdmi/hdmi/attr/hdcp_enable

? 參數(shù)

enable: 0: disable hdmi hdcp function;1:enable hdmi hdcp function。

? 返回值

No returns。

? 描述

該接口用于使能、關閉hdmi hdcp 功能。

? 示例

// 開啟hdmi hdcp功能 echo 1 > /sys/class/hdmi/hdmi/attr/hdcp_enable // 關閉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)容地址,對于interleaved 類型,只有addr[0] 有效;planar 類型,三個都有;UV combined 的類型addr[0],addr[1]有效
size size of framebuffer, 單位為pixel
align 對齊位寬,為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 標識2D 或3D 的buffer
scan 標識描述類型,progress, interleaved

? 描述

disp_fb_info 用于描述一個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)先級高的圖層可能會覆蓋優(yōu)先級低的圖層
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, 設置給驅(qū)動的圖像幀號,可以通過DISP_LAYER_GET_FRAME_ID 獲取當前顯示的幀號,以做一下特定的處理,比如釋放掉已經(jīng)顯示完成的圖像幀buffer。

? 描述

disp_layer_info 用于描述一個圖層的屬性信息。

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 使能標志
channel 圖層所在的通道id(0/1/2/3)
layer_id 圖層的id,此id 是在通道內(nèi)的圖層id。即(channel,layer_id)=(0,0) 表示通道0 中的圖層0 之意

? 描述

disp_layer_config 用于描述一個圖層配置的屬性信息。

9.4 disp_color_info

? 原型

typedef struct { u8 alpha; u8 red; u8 green; u8 blue; }disp_color_info;

? 成員

變量說明
alpha 顏色的透明度
red
green
blue

? 描述

disp_color_info 用于描述一個顏色的信息。

9.5 disp_rect

? 原型

typedef struct { s32 x; s32 y; u32 width; u32 height; }disp_rect;

? 成員

變量 參數(shù)
起點x 值
y 起點y 值
width
height

? 描述

disp_rect 用于描述一個矩形窗口的信息。

9.6 disp_rect64

? 原型

typedef struct { long long x; long long y; long long width; long long height; }disp_rect64;

? 成員

變量 說明
x 起點x 值, 定點小數(shù),高32bit 為整數(shù),低32bit 為小數(shù)
y 起點y 值, 定點小數(shù),高32bit 為整數(shù),低32bit 為小數(shù)
width 寬, 定點小數(shù),高32bit 為整數(shù),低32bit 為小數(shù)
height 高, 定點小數(shù),高32bit 為整數(shù),低32bit 為小數(shù)

? 描述

disp_rect64 用于描述一個矩形窗口的信息。

9.7 disp_position

? 原型

typedef struct { s32 x; s32 y; }disp_posistion;

? 成員

變量 說明
x x
y y

? 描述

disp_position 用于描述一個坐標的信息。

9.8 disp_rectsz

? 原型

typedef struct { u32 width; u32 height; }disp_rectsz;

? 成員

變量 說明
width
height

? 描述

disp_rectsz 用于描述一個矩形尺寸的信息。

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 格式,分三塊存放,需三個地址,P3在最高位
DISP_FORMAT_YUV422_SP_UVUV semi-planar yuv 格式,分兩塊存放,需兩個地址,U 在低位
DISP_FORMAT_YUV422_SP_VUVU semi-planar yuv 格式,分兩塊存放,需兩個地址,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, 行交錯模式

? 描述

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 場交錯

? 描述

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 用于標清視頻
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 的圖層,只需要一個顏色值表示圖像內(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 的時鐘頻率*/, ref_fps=50 /* 輸出設備的參考刷新率*/ 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 的時鐘頻率*/, ref_fps=50 /* 輸出設備的參考刷新率*/ 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 意思是顯示一個純色的畫面,不帶 BUFFER。 enable: 顯示處于enable 狀態(tài)。 ch[0]: 該圖層處于blending 通道0。 lyr[0]: 該圖層處于當前blending 通道中的圖層0。 z[0]: 圖層z 序,越小越在底部,可能會被z 序大的圖層覆蓋住。 prem[Y]: 是否預乘格式,Y 是,N 否。 a: alpha 參數(shù), globl/pixel/; alpha 值。 fmt: 圖層格式,值64 以下為RGB 格式;以上為YUV 格式,常見的72 為YV12,76 為NV12。 fb: 圖層buffer 的size,width,height,三個分量。 crop: 圖像buffer 中的裁減區(qū)域, [x,y,w,h]。 frame: 圖層在屏幕上的顯示區(qū)域,[x,y,w,h]。 addr: 三個分量的地址。 flags: 一般為0, 3D SS 時0x4, 3D TB 時為0x1, 3D FP 時為0x2。 trd: 是否3D 輸出,3D 輸出的類型(HDMI FP 輸出時為1)各counter 描述如下: err: de 缺數(shù)的次數(shù),de 缺數(shù)可能會出現(xiàn)屏幕抖動,花屏的問題。de 缺數(shù)一般為帶寬不足引起。 skip: 表示de 跳幀的次數(shù),跳幀會出現(xiàn)卡頓問題。跳幀是指本次中斷響應較慢,de 模塊判斷在本次中斷已經(jīng)接近或 者超過了消隱區(qū),將放棄本次更新圖像的機會,選擇繼續(xù)顯示原有的圖像。 irq: 表示該通路上垂直消隱區(qū)中斷執(zhí)行的次數(shù),一直增長表示該通道上的timing。 controller 正在運行當中。 vsync:表示顯示模塊往用戶空間中發(fā)送的vsync 消息的數(shù)目,一直增長表示正在不斷地發(fā)送中。 acquire/release/display 含義如下,只在android 方案中有效。 acquire: 是hw composer 傳遞給disp driver 的圖像幀數(shù)以及幀率,幀率只要有在有圖像更新時才有效,靜止 時的值是不準確的。 release: 是disp driver 顯示完成之后,返還給android 的圖像幀數(shù)以及幀率,幀率只要有在有圖像更新時才有 效,靜止時的值是不準確的。 display: 是disp 顯示到輸出設備上的幀數(shù)以及幀率,幀率只要有在有圖像更新時才有效,靜止時的值是不準確的如 果acquire 與release 不一致,說明disp 有部分圖像幀仍在使用,未返還,差值在1~2 之間為正常值。二者不能 相等,如果相等,說明圖像幀全部返還,顯示將會出。 現(xiàn)撕裂現(xiàn)象。如果display 與release 不一致,說明在disp 中存在丟幀情況,原因為在一個active 區(qū)內(nèi) hwcomposer 傳遞多于一幀的圖像幀下來。

調(diào)試說明:

1. 對于android 系統(tǒng),可以dumpsys SurfaceFlinger 打印surface 的信息,如果信息與disp 中sys 中的信息不一致,很大可能是hwc 的轉(zhuǎn)換存在問題。 2. 如果發(fā)現(xiàn)圖像刷新比較慢,存在卡頓問題,可以看一下輸出設備的刷新率,對比一下ref_fps 與fps 是否一致,如果不一致,說明tcon 的時鐘頻率或timing 沒配置正確。如果ref_fps 與屏的spec 不一致,則需要檢查sys_config 中的時鐘頻率和timing配置是否正確。屏一般為60Hz,而如果是TV 或HDMI,則跟模式有關,比較常 見的為60/50/30/24Hz。 如果是android 方案,還可以看一下display 與release 的counter 是否一致,如果相差太大,說明android送幀不均勻,造成丟幀。 3. 如果發(fā)現(xiàn)圖像刷新比較慢,存在卡頓問題,也需要看一下skip counter,如果skip counter 有增長,說明現(xiàn)在的系統(tǒng)負荷較重,對vblank 中斷的響應較慢,出現(xiàn)跳幀,導致了圖像卡頓問題。 4. 如果屏不亮,懷疑背光時,可以看一下屏的背光值是否為0。如果為0,說明上層傳遞下來的背光值不合理;如果不為0,背光還是不亮,則為驅(qū)動或硬件問題了。硬件上可以通過測量bl_en 以及pwm 的電壓值來排查問題。 5. 如果花屏或圖像抖動,可以查看err counter,如果err counter 有增長,則說明de缺數(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 到顯示器間出錯。

第一個路徑接受顯示器索引0 或1。

第二個路徑接受文件路徑。

10.3 colorbar

echo 0 > /sys/class/disp/disp/attr/disp echo > /sys/class/disp/disp/attr/colorbar

第一個路徑接受顯示器索引0 或1。

第二個路徑表示TCON 選擇的輸入源。1,DE 輸出;2-7,TCON 自檢用的colorbar;8,DE自檢用的colorbar。

10.4 顯示模塊debugfs 接口

10.4.1 總述

調(diào)試節(jié)點

mount -t debugfs none /sys/kernek/debug; /sys/kernel/debug/dispdbg;name command param start info //name: 表示操作的對象名字 //command: 表示執(zhí)行的命令 //param: 表示該命令接收的參數(shù) //start: 輸入1 開始執(zhí)行命令 //info: 保存命令執(zhí)行的結果 //只讀,大小是1024 bytes。

10.4.2 切換顯示輸出設備

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; /* 關閉顯示通道0 的輸出*/ echo disp0 > name;echo switch > command;echo 0 0 > param;echo 1 > start;

10.4.3 開關顯示輸出設備

name: disp0/1/2 //表示顯示通道0/1/2 command: blank param: 0/1 //參數(shù)說明:1 表示blank,即關閉顯示輸出;0 表示unblank,即開啟顯示輸出 /* 例子*/ /* 關閉顯示通道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: 無 /* 例子*/ /* 讓顯示模塊進入休眠狀態(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 //設置背光亮度 param: xx //參數(shù)說明:背光亮度值,范圍是0~255。 /* 例子*/ /* 設置背光亮度為100 */ echo lcd0 > name;echo setbl > command;echo 100 > param;echo 1 > start; /* 設置背光亮度為0 */ echo lcd0 > name;echo setbl > command;echo 0 > param;echo 1 > start;

10.4.6 vsync 消息開關

name: disp0/1/2 //表示顯示通道0/1/2 command: vsync_enable //開啟/關閉vsync 消息 param: 0/1 //參數(shù)說明:0:表示關閉; 1:表示開啟 /* 例子*/ /* 關閉顯示通道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 //顯示的是智能背光是否開啟,有效窗口大小,當前背光值,省電比例

10.5 常見問題

10.5.1 黑屏(無背光)

問題現(xiàn)象:機器接LCD 輸出,發(fā)現(xiàn)LCD 沒有任何顯示,仔細查看背光也不亮。

問題分析:此現(xiàn)象說明LCD 背光供電不正常,不排除還有其他問題,但沒背光的問題必須先解決。

問題排查步驟:

? 步驟一

使用電壓表量LCD 屏的各路電壓,如果背光管腳電壓不正常,確定是PWM 問題。否則,嘗試換個屏再試。

? 步驟二

先看看隨sdk 有沒發(fā)布PWM 模塊使用指南,如果有按照里面步驟進行排查。

? 步驟三

如果sdk 沒有發(fā)布PWM 模塊使用指南??梢詂at /sys/kernel/debug/pwm 看看有沒輸出。如果沒有就是PWM 驅(qū)動沒有加載,請檢查一下menuconfig 有沒打開。

? 步驟四

如果步驟三未解決問題,請排查dts 或board.dts 配置。如果還沒有解決,可以尋求技術支持。

10.5.2 黑屏(有背光)

問題現(xiàn)象:機器接LCD,發(fā)現(xiàn)有背光,界面輸出黑屏。

問題分析:此現(xiàn)象說明沒有內(nèi)容輸出,可能是DE、TCON 出錯或應用沒有送幀。

問題排查步驟:

? 步驟一

根據(jù)10.1 章節(jié)排查應用輸入的圖層信息是否正確。其中,寬高、顯存的文件句柄出錯問題最多。

? 步驟二

根據(jù)10.2 章節(jié)截屏,看看DE 輸出是否正常。如果不正常,排查DE 驅(qū)動配置是否正確;如果正常,接著下面步驟。

? 步驟三 根據(jù)10.3 章節(jié)輸出colorbar,如果TCON 自身的colorbar 也沒有顯示,排查硬件通路;如果 有顯示,排查TCON 輸入源選擇的寄存器。后者概率很低,此時可尋求技術支持。

10.5.3 綠屏

問題現(xiàn)象:顯示器出現(xiàn)綠屏,切換界面可能有其他變化。

問題分析:此現(xiàn)象說明處理圖層時DE 出錯??赡苁菓盟惋@的buffer 內(nèi)容或者格式有問題;也

可能DE 配置出錯。

問題排查步驟:

? 步驟一

根據(jù)10.1 章節(jié)排查應用輸入的圖層信息是否正確。其中,圖層格式填錯的問題最多。

? 步驟二

導出DE 寄存器,排查異常。此步驟比較復雜,需要尋求技術支持。

10.5.4 界面卡住

問題現(xiàn)象:界面定在一個畫面,不再改變。

問題分析:此現(xiàn)象說明顯示通路一般是正常的,只是應用沒有繼續(xù)送幀。

問題排查步驟:

? 步驟一

根據(jù)10.1 章節(jié)排查應用輸入的圖層信息有沒改變,特別關注圖層的地址。

? 步驟二

排查應用送幀邏輯,特別關注死鎖,線程、進行異常退出,fence 處理異常。

10.5.5 局部界面花屏

問題現(xiàn)象:畫面切到特定場景時候,出現(xiàn)局部花屏,并不斷抖動。

問題分析:此現(xiàn)象是典型的DE scaler 出錯現(xiàn)象。

問題排查步驟:

根據(jù)10.1 章節(jié)查看問題出現(xiàn)時帶縮放圖層的參數(shù)。如果屏幕輸出的寬x 高除以crop 的寬x 高小于1/16 或者大于32,那么該圖層不能走DE 縮放,改用GPU,或應

用修改圖層寬高。

10.5.6 快速切換界面花屏

問題現(xiàn)象:快速切換界面花屏,變化不大的界面顯示正常。

問題分析:此現(xiàn)象是典型的性能問題,與顯示驅(qū)動關系不大。

問題排查步驟:

? 步驟一

排查DRAM 帶寬是否滿足場景需求。

? 步驟二

若是安卓系統(tǒng),排查fence 處理流程;若是純linux 系統(tǒng),排查送幀流程、swap buffer、pandisplay流程。

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

    關注

    33

    文章

    9519

    瀏覽量

    157018
  • Linux
    +關注

    關注

    88

    文章

    11758

    瀏覽量

    219009
  • Display
    +關注

    關注

    2

    文章

    54

    瀏覽量

    25517
  • 開發(fā)指南

    關注

    0

    文章

    41

    瀏覽量

    7900
  • Tina
    +關注

    關注

    2

    文章

    45

    瀏覽量

    17683
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

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

    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 顯示的相關功能、配置以及開發(fā)過程中的注意事項。適用于 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ū)動開發(fā)指南
    發(fā)表于 06-21 17:02 ?0次下載

    Linux的平臺下Mini210S裸機程序開發(fā)指南

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

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

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

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

    Tina_Linux_系統(tǒng)軟件開發(fā)指南
    的頭像 發(fā)表于 03-02 15:25 ?4363次閱讀
    <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 ?2w次閱讀
    <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 ?2280次閱讀
    <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,整體結構 。
    的頭像 發(fā)表于 03-06 11:00 ?4855次閱讀
    <b class='flag-5'>Tina</b> <b class='flag-5'>Linux</b>圖形系統(tǒng)<b class='flag-5'>開發(fā)指南</b>

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

    介紹Tina平臺音頻模塊的使用方法。
    的頭像 發(fā)表于 03-06 11:02 ?8758次閱讀
    <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ū)動的使用方法。
    的頭像 發(fā)表于 03-06 11:05 ?3804次閱讀
    <b class='flag-5'>Tina</b> <b class='flag-5'>Linux</b> PMU<b class='flag-5'>開發(fā)指南</b>

    Tina Linux Wi-Fi開發(fā)指南

    介紹Allwinner 平臺上Wi-Fi 驅(qū)動移植,介紹Tina Wi-Fi 管理框架,包括Station,Ap 以及Wi-Fi 常見問題。
    的頭像 發(fā)表于 03-06 11:07 ?4090次閱讀
    <b class='flag-5'>Tina</b> <b class='flag-5'>Linux</b> Wi-Fi<b class='flag-5'>開發(fā)指南</b>