Tina_Linux_Display_开发指南
Posted 韦东山
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tina_Linux_Display_开发指南相关的知识,希望对你有一定的参考价值。
Tina_Linux_Display_开发指南
1 概述
1.1 编写目的
让显示应用开发人员了解显示驱动的接口及使用流程,快速上手,进行开发;让新人接手工作时能快速地了解驱动接口,进行调试排查问题。
1.2 适用范围
sunxi 平台DE1.0/DE2.0。
1.3 相关人员
与显示相关的应用开发人员,及与显示相关的其他模块的开发人员,以及新人。
2 模块介绍
2.1 模块功能介绍
本模块框图如上,由显示引擎(DE)和各类型控制器(tcon)组成。输入图层(layers)在DE中进行显示相关处理后,通过一种或多种接口输出到显示设备上显
示,以达到将众多应用渲染的图层合成后在显示器呈现给用户观看的作用。DE 有2 个独立单元(可以简称de0、de1),可以分别接受用户输入的图层进行合成,
输出到不同的显示器,以实现双显。DE 的每个独立的单元有1-4 个通道(典型地,de0 有4 个,de1 有2 个),每个通道可以同时处理接受4 个格式相同的
图层。sunxi 平台有视频通道和UI 通道之分。视频通道功能强大,可以支持YUV 格式和RGB图层。UI 通道只支持RGB 图层。
简单来说,显示模块的主要功能如下:
• 支持lcd(hv/lvds/cpu/dsi) 输出。
• 支持双显输出。
• 支持多图层叠加混合处理。
• 支持多种显示效果处理(alpha, colorkey, 图像增强,亮度/对比度/饱和度/色度调整)。
• 支持智能背光调节。
• 支持多种图像数据格式输入(arg,yuv)。
• 支持图像缩放处理。
• 支持截屏。
• 支持图像转换。
2.2 相关术语介绍
2.2.1 硬件术语介绍
术语 | 解释 |
---|---|
de | display engine,显示引擎,负责将输入的多图层进行叠加、混合、缩放等处理的硬件模块 |
channel | 一个硬件通道,包含若干图层处理单元,可以同时处理若干(典型4 个)格式相同的图层 |
layer | 一个图层处理单元,可以处理一张输入图像,按支持的图像格式分video 和ui类型 |
capture | 截屏,将de 的输出保存到本地文件 |
alpha | 透明度,在混合时决定对应图像的透明度 |
transform | 图像变换,如平移、旋转等 |
overlay | 图像叠加,按顺序将图像叠加一起的效果。z 序大的靠近观察者,会把z 序小的挡住 |
blending | 图像混合,按alpha 比例将图像合成一起的效果 |
enhance | 图像增强,有目的地处理图像数据以达到改善图像效果的过程或方法 |
2.2.2 软件术语介绍
术语 | 解释 |
---|---|
fb | 帧缓冲(framebuffer),Linux 为显示设备提供的一个接口,把显存抽象成的一种设备。有时也指一块显存 |
al | 抽象层,驱动中将底层硬件抽象成固定业务逻辑的软件层 |
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)
其中:
• DISP Driver Support(sunxi-disp2)
DE 驱动请选上。
• debugfs support for disp driver(sunxi-disp2)
调试节点,建议选上,方便调试。
• composer support for disp driver(sunxi-disp2)
disp2 的fence 处理。linux 系统可以不选择。
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 层,与操作系统相关层
│ │ │ │ │ │ ├─lcd/ lcd driver
│ │ │ │ │ │ │ │─lcd_src_interface.c --与display 驱动的接口
│ │ │ │ │ │ │ │─default_panel.c... --平台已经支持的屏驱动
include
├─video video header dir
│ ├─sunxi_display2.h display header file
2.5 驱动框架介绍
显示驱动可划分为三个层面,驱动层,框架层及底层。底层与图形硬件相接,主要负责将上层配置的功能参数转换成硬件所需要的参数,并配置到相应寄存器中。
显示框架层对底层进行抽象封装成一个个的功能模块。驱动层对外封装功能接口,通过内核向用户空间提供相应的设备结点及统一的接口。在驱动层,分为四个驱
动,分别是framebuffer 驱动,disp 驱动,lcd 驱动,hdmi 驱动。Framebuffer 驱动与framebuffer core 对接,实现linux 标准的framebuffre 接口。
Disp 驱动是是整个显示驱动中的核心驱动模块,所有的接口都由disp 驱动来提供,包括lcd 的接口。
3 模块接口概述
模块使用主要通过ioctl 实现,对应的驱动节点是/dev/disp。
具体定义请仔细阅读头文件上面的注释,kernel/linux-4.9/include/video/sunxi_display2.h。
对于显示模块来说,把图层参数设置到驱动,让显示器显示为最重要。sunxi 平台的DE 接受用户设置图层参数,通过disp,channel,layer_id 三个索引确定需要设置的显示位置(disp:0/1,channel: 0/1/2/3,layer_id:0/1/2/3),其中disp 表示显示器索引,channel 表示通道索引,layer_id 表示通道内的图层索引。
下面着重地把图层的参数从头文件中拿出来介绍。
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 中需要显示裁减区。如下图所示,完整的图像以size 标识,而矩形框住的部分为裁减区,以crop 标识,在屏幕上
只能看到crop 标识的部分,其余部分是隐藏的,不能在屏幕上显示出来的。
• crop 和screen_win
crop 上面已经介绍过,Screen_win 为crop 部分buffer 在屏幕上显示的位置。如果不需要进行缩放的话,crop 和screen_win 的width,height 是相等的,如果需要
缩放,crop 和screen_win 的width,height 可以不相等。
• alpha
Alpha 模式有三种:
- gloabal alpha: 全局alpha,也叫面alpha,即整个图层共用一个alpha,统一的透明度。
- pixel alpha: 点alpha,即每个像素都有自己单独的alpha,可以实现部分区域全透,部分区域半透,部分区域不透的效果。
- global_pixel alpha: 可以是说以上两种效果的叠加,在实现pxiel alpha 的效果的同时,还可以做淡入浅出的效果。
• align
显存的对齐字节数。
• 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
所有图层都支持缩放。对图层的操作如下所示:
- 设置图层参数并使能,接口为DISP_LAYER_SET_CONFIG,图像格式,buffer size,
buffer 地址,alpha 模式,enable,图像帧id 号等参数。 - 关闭图层,依然通过DISP_LAYER_SET_CONFIG,将enable 参数设置为0 关闭。
4 显示输出设备操作说明
Disp2 支持多种的显示输出设备,LCD、TV、HDMI。开启显示输出设备有几种方式,第一种是在sys_config 或dts 中配置[disp] 的初始化参数,显示模块在加载时
将会根据配置初始化选择的显示输出设备;第二种是在kernel 启动后,调用驱动模块的ioctl 接口去开启或关闭指定的输出设备,以下是操作的说明:
• 开启或切换到某个具体的显示输出设备,ioctl(DISP_DEVICE_SWITCH…),参数设置为特定的输出设备类型,DISP_OUTPUT_TYPE_LCD/TV/HDMI。
• 关闭某个设备,ioctrl(DISP_DEVICE_SWITCH…),参数设置为DISP_OUTPUT_TYPE_NONE。
5 接口参数更改说明
sunxi 平台支持disp1 和disp2。
项目\\平台 | disp2 | disp1 |
---|---|---|
图层标识 | 以disp, chennel, layer_id 唯一标识 | 以disp, layer_id 唯一标识 |
图层开关 | 将开关当成图层参数设置DISP_LAYER_SET_CONFIG 中 | 独立图层开关接口 |
图层size | 每个分量都需要设置1 个size | 一个buffer 只有1 |
图层align | 针对每个分量需要设置其align,单位为byte。 | 无 |
图层Crop | 为64 位定点小数,高32 位为整数,低32位为小数 | 为32 位参数,不支持小数 |
YUV MB 格式支持 | 不再支持 | 支持 |
PALETTE 格式支持 | 不再支持 | 支持 |
单色模式(无buffer) | 支持 | 不支持 |
Pipe 选择 | Pipe 对用户透明,用户无需选择,只需要配置channel | 用户设置 |
zorder | 用户设置,保证zorder 不重复,从0 到N-1 | 用户不能设置 |
设置图层信息接口 | 一次可设置多个图层的信息,增加一个图层信息数目参数 | 一次设置1 个图层信息 |
6 输出设备介绍
平台支持屏以及HDMI 输出,及二者同时显示。
6.1 屏
屏的接口很多,平台支持RGB/CPU/LVDS/DSI 接口。
6.2 HDMI
HDMI 全名是:High-Definition Multimedia Interface。可以提供DVD,audio device, settop boxes,television sets, and other video displays 之间的高清互
联。可以承载音,视频数据,以及其他的控制,数据信息。支持热插拔,内容保护,模式是否支持的查询。
6.3 同显
驱动支持双路显示。屏(主)+ HDMI(辅)。
同显或异显,差别只在于显示内容,如果显示内容一样,则为同显;反之,则为异显。
-
如果是android 系统,4.2 版本以上版本,原生框架已经支持多显(同显,异显,虚拟显示设备),实现同显则比较简单,在android hal 与上层对接好即可。
-
如果是android 4.1 以下版本,同显需要自行实现,参考做法为主屏内容由android 原生提供,辅屏需要android hal 在合适的时机(比如HDMI 插入时)打开
辅屏,并且将主屏的内容(存放于FB0 中),拷贝至辅屏的显示后端buffer 中,然后将辅屏的后端buffer 切换到前端buffer。注意问题为,两路显示的显示
buffer 的同步,如果同步不好,会产生图像撕裂,错位的现象。
- 如果是Linux 系统,做法与上一个做法类似。
7 IOCTL 接口描述
sunxi 平台下显示驱动给用户提供了众多功能接口,可对图层、LCD、hdmi 等显示资源进行操作。
7.1 Global Interface
7.1.1 DISP_SHADOW_PROTECT
• 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_SHADOW_PROTECT |
arg | arg[0] 为显示通道0/1;arg[1] 为protect 参数,1 表示protect, 0: 表示not protect |
• 返回值
如果成功,返回DIS_SUCCESS,否则,返回失败号。
• 描述
DISP_SHADOW_PROTECT(1)与DISP_SHADOW_PROTECT(0)配对使用,在protect期间,所有的请求当成一个命令序列缓冲起来, 等到调用
DISP_SHADOW_PROTECT(0)后将一起执行。
• 示例
//启动cache,disphd为显示驱动句柄
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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_SET_BKCOLOR |
arg | arg[0] 为显示通道0/1;arg[1] 为backcolor 信息,指向disp_color 数据结构指针 |
• 返回值
如果成功,返回DIS_SUCCESS,否则,返回失败号。
• 描述
该函数用于设置显示背景色。
• 示例
//设置显示背景色,disphd为显示驱动句柄,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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_GET_BKCOLOR |
arg | arg[0] 为显示通道0/1;arg[1] 为backcolor 信息,指向disp_color 数据结构指针 |
• 返回值
如果成功,返回DIS_SUCCESS,否则,返回失败号。
• 描述
该函数用于获取显示背景色。
• 示例
//获取显示背景色,disphd为显示驱动句柄,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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_GET_SCN_WIDTH |
arg | arg[0] 显示通道0/1 |
• 返回值
如果成功,返回当前屏幕水平分辨率,否则,返回失败号。
• 描述
该函数用于获取当前屏幕水平分辨率。
• 示例
//获取屏幕水平分辨率
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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_GET_SCN_HEIGHT |
arg | arg[0] 显示通道0/1 |
• 返回值
如果成功,返回当前屏幕垂直分辨率,否则,返回失败号。
• 描述
该函数用于获取当前屏幕垂直分辨率。
• 示例
//获取屏幕垂直分辨率
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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_GET_OUTPUT_TYPE |
arg | arg[0] 显示通道0/1 |
• 返回值
如果成功,返回当前显示输出类型,否则,返回失败号。
• 描述
该函数用于获取当前显示输出类型(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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_GET_OUTPUT |
arg | arg[0] 为显示通道0/1;arg[1] 为指向disp_output 结构体的指针,用于保存返回值 |
• 返回值
如果成功,返回0,否则,返回失败号。
• 描述
该函数用于获取当前显示输出类型及模式(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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_VSYNC_EVENT_EN |
arg | arg[0] 为显示通道0/1;arg[1] 为enable 参数,0:disable, 1:enable |
• 返回值
如果成功,返回DIS_SUCCESS。
否则,返回失败号。
• 描述
该函数开启/关闭vsync 消息发送功能。
• 示例
//开启/关闭vsync消息发送功能,disphd为显示驱动句柄,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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_DEVICE_SWITCH |
arg | arg[0] 为显示通道0/1;arg[1] 为输出类型;arg[2] 为输出模式,在输出类型不为LCD 时有效 |
• 返回值
如果成功,返回DIS_SUCCESS,否则,返回失败号。
• 描述
该函数用于切换输出类型。
• 示例
//切换
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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_DEVICE_SET_CONFIG |
arg | arg[0] 为显示通道0/1;arg[1] 为指向disp_device_config 的指针 |
• 返回值
如果成功,返回DIS_SUCCESS,否则,返回失败号。
• 描述
该函数用于切换输出类型并设置输出设备的属性参数。
• 示例
//切换输出类型并设置输出设备的属性参数
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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_DEVICE_GET_CONFIG |
arg | arg[0] 为显示通道0/1;arg[1] 为指向disp_device_config 的指针 |
• 返回值
如果成功,返回DIS_SUCCESS,否则,返回失败号。
• 描述
该函数用于获取当前输出类型及相关的属性参数。
• 示例
//获取当前输出类型及相关的属性参数
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,表示当前输出显示通道为关闭状态
7.2 Layer Interface
7.2.1 DISP_LAYER_SET_CONFIG
• 原型
int ioctl(int handle, unsigned int cmd, unsigned int *arg);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_CMD_SET_LAYER_CONFIG |
arg | arg[0] 为显示通道0/1;arg[1] 为图层配置参数指针;arg[2] 为需要配置的图层数目 |
• 返回值
如果成功,则返回DIS_SUCCESS;如果失败,则返回失败号。
• 描述
该函数用于设置多个图层信息。
• 示例
struct
disp_layer_info info,
bool enable;
unsigned int channel,
unsigned int layer_id,
disp_layer_config;
//设置图层参数,disphd为显示驱动句柄
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;//定点小数。高32bit为整数,低32bit为小
数
config.info.fb.crop.height= ((uunsigned long)height)<<32;//定点小数。高32bit为整数,低32bit为小
数
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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_LAYER_GET_CONFIG |
arg | arg[0] 为显示通道0/1;arg[1] 为图层配置参数指针;arg[2] 为需要获取配置的图层数目 |
• 返回值
如果成功,则返回DIS_SUCCESS;如果失败,则返回失败号。
• 描述
该函数用于获取图层参数。
• 示例
//获取图层参数,disphd为显示驱动句柄
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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_SET_LAYER_CONFIG2 |
arg | arg[0] 为显示通道0/1;arg[1] 为图层配置参数指针;arg[2] 为需要配置的图层数目 |
• 返回值
如果成功,则返回DIS_SUCCESS;如果失败,则返回失败号。
• 描述
该函数用于设置多个图层信息,注意该接口只接受disp_layer_config2 的信息。
• 示例
struct
disp_layer_info info,
bool enable;
unsigned int channel,
unsigned int layer_id,
disp_layer_config2;
//设置图层参数,dispfd 为显示驱动句柄
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;//定点小数。高32bit 为整数,低32bit 为小数
config.info.fb.crop.height= ((uunsigned long)height)<<32;//定点小数。高32bit 为整数,低32bit 为小数
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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_CAPTURE_START |
arg | arg[0] 为显示通道0/1 |
• 返回值
如果成功,则返回DIS_SUCCESS;如果失败,则返回失败号。
• 描述
该函数用于开启截屏功能。
• 示例
//启动截屏功能,dispfd 为显示驱动句柄
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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_CAPTURE_COMMIT |
arg | arg[0] 为显示通道0/1;arg[1] 为指向截屏的信息结构体,详见disp_capture_info |
• 返回值
如果成功,则返回DIS_SUCCESS;如果失败,则返回失败号。
• 描述
该函数用于提交截屏的任务,提交一次,则会启动一次截屏操作。
• 示例
//提交截屏功能,dispfd 为显示驱动句柄
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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_CAPTURE_STOP |
arg | arg[0] 为显示通道0/1 |
• 返回值
如果成功,则返回DIS_SUCCESS;如果失败,则返回失败号。
• 描述
该函数用于关闭截屏功能。
• 示例
//停止截屏功能,dispfd 为显示驱动句柄
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);
• 参数
命令DISP_CAPTURE_QUERY 是查询功能。
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_CAPTURE_QUERY |
arg | arg[0] 为显示通道0/1 |
• 返回值
如果成功,则返回DIS_SUCCESS;如果失败,则返回失败号。
• 描述
该函数查询刚结束的图像帧是否截屏成功。
• 示例
//查询截屏是否成功,dispfd 为显示驱动句柄
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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_LCD_SET_BRIGHTNESS |
arg | arg[0] 为显示通道0/1;arg[1] 为背光亮度值,(0~255) |
• 返回值
如果成功,则返回DIS_SUCCESS;如果失败,则返回失败号。
• 描述
该函数用于设置LCD 亮度。
• 示例
//设置LCD的背光亮度,disphd为显示驱动句柄
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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_LCD_GET_BRIGHTNESS |
arg | arg[0] 为显示通道0/1 |
• 返回值
如果成功,则返回DIS_SUCCESS;如果失败,则返回失败号。
• 描述
该函数用于获取LCD 亮度。
• 示例
//获取LCD的背光亮度,disphd为显示驱动句柄
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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_ENHANCE_ENABLE |
arg | arg[0] 为显示通道0/1 |
• 返回值
如果成功,则返回DIS_SUCCESS;如果失败,则返回失败号。
• 描述
该函数用于使能图像后处理功能。
• 示例
//开启图像后处理功能,disphd为显示驱动句柄
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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_ENHANCE_DISABLE |
arg | arg[0] 为显示通道0/1 |
• 返回值
如果成功,则返回DIS_SUCCESS;如果失败,则返回失败号。
• 描述
该函数用于关闭图像后处理功能。
• 示例
//关闭图像后处理功能,disphd为显示驱动句柄
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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_ENHANCE_DEMO_ENABLE |
arg | arg[0] 为显示通道0/1 |
• 返回值
如果成功,则返回DIS_SUCCESS;如果失败,则返回失败号。
• 描述
该函数用于开启图像后处理演示模式,开启后,在屏幕会出现左边进行后处理,右边未处理的图像画面,方便对比效果。演示模式需要在后处理功能开启之后才有
效。
• 示例
//开启图像后处理演示模式,disphd为显示驱动句柄
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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_ENHANCE_DEMO_DISABLE |
arg | arg[0] 为显示通道0/1 |
• 返回值
如果成功,则返回DIS_SUCCESS;如果失败,则返回失败号。
• 描述
该函数用于关闭图像后处理演示模式。
• 示例
//开启图像后处理演示模式,disphd为显示驱动句柄
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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_SMBL_ENABLE |
arg | arg[0] 为显示通道0/1 |
• 返回值
如果成功,则返回DIS_SUCCESS;如果失败,则返回失败号。
• 描述
该函数用于使能智能背光功能。
• 示例
//开启智能背光功能,disphd为显示驱动句柄
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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_SMBL_ENABLE |
arg | arg[0] 为显示通道0/1 |
• 返回值
如果成功,则返回DIS_SUCCESS;如果失败,则返回失败号。
• 描述
该函数用于关闭智能背光功能。
• 示例
//关闭智能背光功能,disphd为显示驱动句柄
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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_SMBL_SET_WINDOW |
arg | arg[0] 为显示通道0/1;arg[1] 为指向struct disp_rect 的指针 |
• 返回值
如果成功,则返回DIS_SUCCESS;如果失败,则返回失败号。
• 描述
该函数用于设置智能背光开启效果的窗口,智能背光在设置的窗口中有效。
• 示例
//设置智能背光窗口,disphd为显示驱动句柄
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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_HDMI_SUPPORT_MODE |
arg | arg[0] 为显示通道0/1;arg[1] 为需要查询的模式,详见disp_tv_mode |
• 返回值
如果支持,则返回1;如果失败,则返回0。
• 描述
该函数用于查询指定的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);
• 参数
参数 | 说明 |
---|---|
hdle | 显示驱动句柄 |
cmd | DISP_HDMI_GET_HPD_STATUS |
arg | arg[0] 为显示通道0/1 |
• 返回值
如果HDMI 插入,则返回1;如果未插入,则返回0。
• 描述
该函数用于指定HDMI 是否处于插入状态。
• 示例
//查询HDMI是否处于插入状态
unsigned int arg[3];
arg[0] = 0;//显示通道0
if (ioctl(disphd, DISP_HDMI_GET_HPD_STATUS, (void*)arg) == 1)
printf("hdmi plug in\\n");
else
printf("hdmi plug out\\n");
8 sysfs 接口描述
以下两个函数在下面接口的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
• 系统节点
/sys/class/disp/disp/attr/disp
/sys/class/disp/disp/attr/enhance_mode
• 参数
参数 | 说明 |
---|---|
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
• 系统节点
/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 /* 细节增强*/
/sys/class/disp/disp/attr/enhance_denoise /* 降噪*/
• 参数
disp display channel,比如0: disp0, 1:disp1。
enhance_xxx: 范围:0~100,数据越大,调节幅度越大。
• 返回值
no。
• 描述
该接口用于设置图像的亮度/对比度/饱和度/边缘锐度/细节增强/降噪的调节幅度。
• 示例
//设置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
• 系统节点
/sys/class/hdmi/hdmi/attr/edid
• 参数
no。
• 返回值
Edid data(1024 bytes)。
• 描述
该接口用于读取EDID 的裸数据。
• 示例
// 读取edid数据
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
• 系统节点
/sys/class/switch/hdmi/state
• 参数
no。
• 返回值
Hdmi hotplut state, 0: unplug; 1: plug in。
• 描述
该接口用于读取HDMI 的热插拔状态。
• 示例
// 读取HDMI热插拔状态
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 in\\n");
else
printf("hdmi unplug \\n");
8.2.3 hdcp_enable
• 系统节点
/sys/class/hdmi/hdmi/attr/hdcp_enable
• 参数
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 的内容地址,对于interleaved 类型,只有addr[0] 有效;planar 类型,三个都有;UV combined 的类型addr[0],addr[1]有效 |
size | size of framebuffer, 单位为pixel |
align | 对齐位宽,为2 的指数 |
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 裁减区 |
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, 优先级高的图层可能会覆盖优先级低的图层 |
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, 设置给驱动的图像帧号,可以通过DISP_LAYER_GET_FRAME_ID 获取当前显示的帧号,以做一下特定的处理,比如释放掉已经显示完成的图像帧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 是在通道内的图层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;
• 成员
变量 | 参数 |
---|---|
x | 起点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 值, 定点小数,高32bit 为整数,低32bit 为小数 |
y | 起点y 值, 定点小数,高32bit 为整数,低32bit 为小数 |
width | 宽, 定点小数,高32bit 为整数,低32bit 为小数 |
height | 高, 定点小数,高32bit 为整数,低32bit 为小数 |
• 描述
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_YUV以上是关于Tina_Linux_Display_开发指南的主要内容,如果未能解决你的问题,请参考以下文章