源码文档说明
源码说明
本模块源代码的目录结构如下:
目录 bsp/artinchip/drv/display
文件名 | 含义 |
---|---|
drv_fb.c | 显示驱动框架 |
drv_de.c | 显示引擎驱动 |
drv_rgb.c | RGB 显示接口驱动 |
drv_lvds.c | LVDS 显示接口驱动 |
drv_dsi.c | MIPI-DSI 显示接口驱动 |
drv_dbi.c | MIPI-DBI 显示接口驱动 |
disp_com.h | 显示驱动共用的头文件,定义了共用数据结构、全局函数等 |
disp_conf.h | 显示接口配置文件 |
disp_ccm.h | CCM 色彩矩阵配置文件 |
disp_gamma.h | Gamma 配置文件 |
目录 bsp/artinchip/drv/display/panel
文件名 | 含义 |
---|---|
panel_com.c | LCD 屏公用代码 |
panel_com.h | 显示驱动共用的头文件,其中定义了共用数据结构、全局函数等 |
panel_simple.c | 为 RGB 和 LVDS 接口提供的一款通用的 LCD 驱动 |
panel_dsi.c | 为 MIPI-DSI 屏幕封装的函数,方便屏幕适配 |
panel_dsi.h | 为 MIPI-DSI 屏幕封装的函数的头文件 |
panel_dbi.c | 为 MIPI-DBI 协议封装的函数,方便屏幕适配 |
panel_dbi.h | 为 MIPI-DBI 协议封装的函数的头文件 |
panel_xxxx.c | 为屏驱 IC 适配的专用驱动 |
目录 bsp/artinchip/hal/display
文件名 | 含义 |
---|---|
aic_hal_rgb.c | RGB 显示接口 HAL 层,操作 RGB 接口寄存器 |
aic_hal_de.c | DE 显示引擎 HAL 层,操作 DE 接口寄存器 |
aic_hal_dsi.c | MIPI-DSI 显示接口 HAL 层,操作 DSI 接口寄存器 |
aic_hal_dbi.c | MIPI-DBI 显示接口 HAL 层,操作 DBI 接口寄存器 |
硬件框图
在 Chip 运行过程中,显示接口只能输出一种标准信号,其数据链路是确定的。
软件框图
在软件 SDK 中,显示引擎,显示接口与 LCD 的关系是 1 x N x N。 一个显示引擎需要支持多个显示接口标准,一个显示接口又要适配多款 LCD,其数据链路是不确定的。
DE 和 DI 在显示框架上属于同级模块,都是 DSS 的 component,使用 struct platform_driver 来表示。
struct platform_driver {
const char *name;
int component_type;
int (*probe)(void);
void (*remove)(void);
union {
struct di_funcs *di_funcs;
struct de_funcs *de_funcs;
};
};
2
3
4
5
6
7
8
9
10
注解
MIPI-DBI 是软件虚拟出来的 device,为 MIPI-DBI 协议提供支持。MIPI-DBI 协议包括 3 种类型:
Type A: Motorola 6800
Type B: Intel 8080
Type C: SPI
ArtInChip 平台支持 Type B 和 Type C
LCD panel 使用 struct aic_panel
来表示。严格来说,panel component 不算一个 driver,只是一些屏参数和回调函数的集合。
struct aic_panel {
const char *name;
struct aic_panel_funcs *funcs;
struct aic_panel_callbacks callbacks;
const struct display_timing *timings;
union {
struct panel_rgb *rgb;
struct panel_lvds *lvds;
struct panel_dsi *dsi;
struct panel_dbi *dbi;
};
int connector_type;
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct aic_panel_funcs *funcs;
由 panel 提供,供 fb 调用的回调struct aic_panel_callbacks callbacks;
由 DE/DI 提供,供 panel 调用的回调
在 panel 提供的 struct aic_panel_funcs
中,会调用 DE/DI 提供的 struct aic_panel_callbacks
。
callbacks
的设计是为了满足 DE、DI、panel 三个硬件模块的初始化时序,包含先后顺序、延迟大小等。时序约束主要来自 panel 侧。
初始化流程
在 menuconfig 中使能 LVDS 显示接口和 simple panel 后,显示驱动的初始化过程如下:
DE 和 DI 匹配
DE/DI 的 driver 存放在一个指针数组中。DE 默认使能,DI 通过 menuconfig 选择一种接口标准。
static struct platform_driver *drivers[] = {
#ifdef AIC_DISP_DE_DRV
&artinchip_de_driver,
#endif
#ifdef AIC_DISP_RGB
&artinchip_rgb_driver,
#endif
#ifdef AIC_DISP_LVDS
&artinchip_lvds_driver,
#endif
#ifdef AIC_DISP_MIPI_DSI
&artinchip_dsi_driver
#endif
#ifdef AIC_DISP_MIPI_DBI
&artinchip_dbi_driver
#endif
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
驱动遍历 drivers
指针数组,通过 component_type
来匹配 menuconfig
指定的 DI。
panel 的匹配
panel_com.c
保存了一个 panel 指针数组,通过 menuconfig 选择其中一个。
static struct aic_panel *panels[] = {
#if defined(AIC_DISP_RGB) && defined(AIC_SIMPLE_PANEL)
&aic_panel_rgb,
#endif
#if defined(AIC_DISP_LVDS) && defined(AIC_SIMPLE_PANEL)
&aic_panel_lvds,
#endif
#ifdef AIC_DSI_SIMPLE_PANEL
&dsi_simple,
#endif
#ifdef AIC_PANEL_DSI_XM91080
&dsi_xm91080,
#endif
#ifdef AIC_PANEL_DSI_ST7797
&dsi_st7797,
#endif
#ifdef AIC_PANEL_DSI_ST7703
&dsi_st7703,
#endif
...
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct aic_panel *aic_find_panel(u32 connector_type)
会遍历 panels
指针数组,获取一个跟 DI 匹配的 LCD panel。
simple panel
为不需要初始化操作的 LCD 提供驱动支持,例如:RGB, LVDS 屏幕。
backlight
Luban-Lite 提供两种方式控制背光:
GPIO
PWM
在 menuconfig 中配置 backlight,详情参考 背光配置 章节。
mpp_types.h
路径: bsp/artinchip/include/uapi/mpp_types.h
struct mpp_rect
struct mpp_rect {
int x;
int y;
int width;
int height;
};
2
3
4
5
6
struct mpp_point
struct mpp_point {
int x;
int y;
};
2
3
4
struct mpp_size
struct mpp_size {
int width;
int height;
};
2
3
4
enum mpp_pixel_format
enum mpp_pixel_format {
MPP_FMT_ARGB_8888 = 0x00,
MPP_FMT_ABGR_8888 = 0x01,
MPP_FMT_RGBA_8888 = 0x02,
MPP_FMT_BGRA_8888 = 0x03,
MPP_FMT_XRGB_8888 = 0x04,
MPP_FMT_XBGR_8888 = 0x05,
MPP_FMT_RGBX_8888 = 0x06,
MPP_FMT_BGRX_8888 = 0x07,
MPP_FMT_RGB_888 = 0x08,
MPP_FMT_BGR_888 = 0x09,
MPP_FMT_ARGB_1555 = 0x0a,
MPP_FMT_ABGR_1555 = 0x0b,
MPP_FMT_RGBA_5551 = 0x0c,
MPP_FMT_BGRA_5551 = 0x0d,
MPP_FMT_RGB_565 = 0x0e,
MPP_FMT_BGR_565 = 0x0f,
MPP_FMT_ARGB_4444 = 0x10,
MPP_FMT_ABGR_4444 = 0x11,
MPP_FMT_RGBA_4444 = 0x12,
MPP_FMT_BGRA_4444 = 0x13,
MPP_FMT_YUV420P = 0x20,
MPP_FMT_NV12 = 0x21,
MPP_FMT_NV21 = 0x22,
MPP_FMT_YUV422P = 0x23,
MPP_FMT_NV16 = 0x24,
MPP_FMT_NV61 = 0x25,
MPP_FMT_YUYV = 0x26,
MPP_FMT_YVYU = 0x27,
MPP_FMT_UYVY = 0x28,
MPP_FMT_VYUY = 0x29,
MPP_FMT_YUV400 = 0x2a,
MPP_FMT_YUV444P = 0x2b,
MPP_FMT_YUV420_64x32_TILE = 0x30,
MPP_FMT_YUV420_128x16_TILE = 0x31,
MPP_FMT_YUV422_64x32_TILE = 0x32,
MPP_FMT_YUV422_128x16_TILE = 0x33,
MPP_FMT_MAX,
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
artinchip_fb.h
路径: bsp/artinchip/include/uapi/artinchip_fb.h
struct aicfb_layer_num
/**
* struct aicfb_layer_num - aicfb layer number
* @vi_num: number of video layers
* @ui_num: number of UI layers
*
* total_layer_num = vi_num + ui_num
*
* layer id range: [0, total_layer_num - 1]
*/
struct aicfb_layer_num {
unsigned int vi_num;
unsigned int ui_num;
};
2
3
4
5
6
7
8
9
10
11
12
13
struct aicfb_layer_capability
/**
* struct aicfb_layer_capability - aicfb layer capability
* @layer_id: the layer id
* @layer_type: the layer type
* 0: UI layer
* 1: Video layer
* @max_width: the max pixels per line
* @max_height: the max lines
* @cap_flags: flags of layer capability
*/
struct aicfb_layer_capability {
unsigned int layer_id;
unsigned int layer_type;
unsigned int max_width;
unsigned int max_height;
unsigned int cap_flags;
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct aicfb_buffer
/**
* struct aicfb_buffer - aicfb frame buffer
* @phy_addr[3]: address of frame buffer
* single addr for interleaved fomart with 1 plane,
* double addr for semi-planar fomart with 2 planes,
* triple addr for planar format with 3 planes
* @size: width and height of aicfb_buffer
* @stride[3]: stride for all planes
* @crop_en: corp disable/enable ctrl
* 0: disable crop the buffer
* 1: enable crop the buffer
* @crop: crop info
* @format: color format
* @buf_flags: aicfb buffer flags
*/
struct aicfb_buffer {
unsigned int phy_addr[AICFB_PLANE_NUM];
unsigned int dmabuf_fd[AICFB_PLANE_NUM];
unsigned int stride[AICFB_PLANE_NUM];
struct aic_size size;
unsigned int crop_en;
struct aic_rect crop;
enum aic_pixel_format format;
unsigned int buf_flags;
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
struct aicfb_layer_data
/**
* struct aicfb_layer_data - aicfb layer data
* @enable
* 0: disable the layer
* 1: enable the layer
* @layer_id: the layer id
*
* @rect_id: the rectanglular window id of the layer
* only used by layers with multi-rectangular windows
* for example: if the layer has 4 rectangular windows,
* rect_id can be 0,1,2 or 3 for different windows
*
* @scale_size: scaling size
* if the layer can be scaled. the scaling size can be different
* from the input buffer. the input buffer can be original aicfb_buffer
* or crop aicfb_buffer, otherwise, the scaling size will be ignore
*
* @pos: left-top x/y coordinate of the screen in pixels
* @buf: frame buffer
*/
struct aicfb_layer_data {
unsigned int enable;
unsigned int layer_id;
unsigned int rect_id;
struct aic_size scale_size;
struct aic_point pos;
struct aicfb_buffer buf;
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
struct aicfb_config_lists
/**
* struct aicfb_config_lists - aicfb config lists
* @num: the total number of layer data config lists
* @layers[]: the array of aicfb_layer_data lists
*/
struct aicfb_config_lists {
unsigned int num;
struct aicfb_layer_data layers[];
};
2
3
4
5
6
7
8
9
struct aicfb_alpha_config
/**
* struct aicfb_alpha_config - aicfb layer alpha blending config
*
* @layer_id: the layer id
*
* @enable
* 0: disable alpha
* 1: enable alpha
*
* @mode: alpha mode
* 0: pixel alpha mode
* 1: global alpha mode
* 2: mixder alpha mode(alpha = pixel alpha * global alpha / 255)
*
* @value: global alpha value (0~255)
* used by global alpha mode and mixer alpha mode
*
*/
struct aicfb_alpha_config {
unsigned int layer_id;
unsigned int enable;
unsigned int mode;
unsigned int value;
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
struct aicfb_ck_config
/**
* struct aicfb_ck_config - aicfb layer color key blending config
*
* @layer_id: the layer id
*
* @ck_enable
* 0: disable color key
* 1: enable color key
*
*
* @ck_value: color key rgb value to match the layer pixels
* bit[31:24]: reserved
* bit[23:16]: R value
* bit[15:8]: G value
* bit[7:0]: B value
*
*/
struct aicfb_ck_config {
unsigned int layer_id;
unsigned int enable;
unsigned int value;
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct aicfb_disp_prop
/*
* struct aicfb_disp_prop - aicfb display property
*
* @bright: bright in percent, range [0, 100], 50 means no effect
* @contrast: contrast in percent, range [0, 100], 50 means no effect
* @saturation: saturation in percent, range [0, 100], 50 means no effect
* @hue: hue in percent, range [0, 100], 50 means no effect
*/
struct aicfb_disp_prop {
unsigned int bright;
unsigned int contrast;
unsigned int saturation;
unsigned int hue;
};
2
3
4
5
6
7
8
9
10
11
12
13
14
struct aicfb_ccm_config
struct aicfb_ccm_config {
unsigned int enable;
int ccm_table[12];
};
2
3
4
struct aicfb_gamma_config
enum gamma_lut {
GAMMA_RED,
GAMMA_GREEN,
GAMMA_BLUE,
};
struct aicfb_gamma_config {
unsigned int enable;
unsigned int gamma_lut[3][16];
};
2
3
4
5
6
7
8
9
10
struct aicfb_screeninfo
/*
* struct aicfb_screeninfo - aicfb screen info
*
* @format: color format
* @bits_per_pixel: bits per pixel
* @stride: stride of screen
* @width: screen width in pixels
* @height: screen height in pixels
* @framebuffer: start of frame buffer mem
* @smem_len: length of frame buffer mem
*/
struct aicfb_screeninfo {
enum mpp_pixel_format format;
unsigned int bits_per_pixel;
unsigned int stride;
unsigned int width;
unsigned int height;
unsigned char *framebuffer;
unsigned int smem_len;
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ioctl命令
#define AICFB_WAIT_FOR_VSYNC _IOW(IOC_TYPE_FB, 0x20, unsigned int)
/** get layer number */
#define AICFB_GET_LAYER_NUM _IOR(IOC_TYPE_FB, 0x21, struct aicfb_layer_num)
/** get layer capability */
#define AICFB_GET_LAYER_CAPABILITY _IOWR(IOC_TYPE_FB, 0x22,\
struct aicfb_layer_capability)
/** get layer config data */
#define AICFB_GET_LAYER_CONFIG _IOWR(IOC_TYPE_FB, 0x23, \
struct aicfb_layer_data)
/** update layer config data */
#define AICFB_UPDATE_LAYER_CONFIG _IOW(IOC_TYPE_FB, 0x24, \
struct aicfb_layer_data)
/** update layer config data lists */
#define AICFB_UPDATE_LAYER_CONFIG_LISTS _IOW(IOC_TYPE_FB, 0x25, \
struct aicfb_config_lists)
/** get layer alpha blendig config */
#define AICFB_GET_ALPHA_CONFIG _IOWR(IOC_TYPE_FB, 0x26, \
struct aicfb_alpha_config)
/** update layer alpha blendig config */
#define AICFB_UPDATE_ALPHA_CONFIG _IOW(IOC_TYPE_FB, 0x27, \
struct aicfb_alpha_config)
/** get layer color key config */
#define AICFB_GET_CK_CONFIG _IOWR(IOC_TYPE_FB, 0x28, struct aicfb_ck_config)
/** update layer color key config */
#define AICFB_UPDATE_CK_CONFIG _IOW(IOC_TYPE_FB, 0x29, struct aicfb_ck_config)
/** pan display */
#define AICFB_PAN_DISPLAY _IOR(IOC_TYPE_FB, 0x43, unsigned int)
/** set display property */
#define AICFB_SET_DISP_PROP _IOW(IOC_TYPE_FB, 0x60, struct aicfb_disp_prop)
/** get display property */
#define AICFB_GET_DISP_PROP _IOR(IOC_TYPE_FB, 0x61, struct aicfb_disp_prop)
/** update ccm config */
#define AICFB_UPDATE_CCM_CONFIG _IOR(IOC_TYPE_FB, 0x65, struct aicfb_ccm_config)
/** get ccm config */
#define AICFB_GET_CCM_CONFIG _IOR(IOC_TYPE_FB, 0x66, struct aicfb_ccm_config)
/** update gamma config */
#define AICFB_UPDATE_GAMMA_CONFIG _IOR(IOC_TYPE_FB, 0x67, struct aicfb_gamma_config)
/** get gamma config */
#define AICFB_GET_GAMMA_CONFIG _IOR(IOC_TYPE_FB, 0x68, struct aicfb_gamma_config)
/* get screen info */
#define AICFB_GET_SCREENINFO _IOR(IOC_TYPE_FB, 0x62, struct aicfb_screeninfo)
/* enable aic fb, calls panel enable callback */
#define AICFB_POWERON _IOR(IOC_TYPE_FB, 0x63, unsigned int)
/* disable aic fb, calls panel disable callback */
#define AICFB_POWEROFF _IOR(IOC_TYPE_FB, 0x64, unsigned int)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
概述
Luban-Lite SDK 通过 MPP 中间件,对外提供一套统一的接口来控制显示驱动,屏蔽操作系统内核和裸机方案的差异。
接口功能:
1、获取图层个数
2、获取图层能力
3、获取图层配置数据
4、更新图层配置数据
5、支持同时更新多图层配置数据
6、支持图层 scaler 设置
7、支持 alpha blending 设置
8、支持 color key 设置
9、支持 disp prop 色彩设置
10、支持 CCM 色彩矩阵设置
11、支持 Gamma 设置
MPP 接口
struct mpp_fb;
struct mpp_fb *mpp_fb_open(void);
void mpp_fb_close(struct mpp_fb *fb);
int mpp_fb_probe(void);
int mpp_fb_ioctl(struct mpp_fb *fb, int cmd, void *args);
2
3
4
5
6
7
8
9
mpp_fb_open
函数原型 | struct mpp_fb *mpp_fb_open(void); |
---|---|
功能说明 | 获取一个 mpp_fb 句柄 |
参数定义 | void |
返回值 | 非空: 成功 NULL: 失败 |
注意事项 | 无 |
mpp_fb_close
函数原型 | void mpp_fb_close(struct mpp_fb *fb); |
---|---|
功能说明 | 释放 mpp_fb 句柄 |
参数定义 | fb: mpp_fb 句柄 |
返回值 | void |
注意事项 | 无 |
mpp_fb_probe
函数原型 | int mpp_fb_probe(void); |
---|---|
功能说明 | probe fb |
参数定义 | void |
返回值 | 0: 成功 <0: 失败 |
注意事项 | 多次调用也只会 probe 一次, 需要在 mpp_fb_open() 操作前调用 |
mpp_fb_ioctl
函数原型 | int mpp_fb_ioctl(struct mpp_fb *fb, int cmd, void *args); |
---|---|
功能说明 | ioctl 调用,控制显示驱动 |
参数定义 | fb: MPP FB 文件句柄 CMD: 操作命令 args: ioctl 调用私有数据 |
返回值 | 0: 成功 <0: 失败 |
注意事项 | 无 |
ioctl CMD
AICFB_WAIT_FOR_VSYNC
函数原型 | int mpp_fb_ioctl(int fd, unsigned long cmd, unsigned int *pvalue); |
---|---|
功能说明 | 等待 Vsync 信号 |
参数定义 | CMD: AICFB_WAIT_FOR_VSYNC pvalue: 该值无意义,可为 NULL |
返回值 | 0: 成功 -1: 失败 |
注意事项 | 无 |
AICFB_GET_LAYER_NUM
函数原型 | int mpp_fb_ioctl(int fd, unsigned long cmd, struct aicfb_layer_num *pvalue); |
---|---|
功能说明 | 获取显示图层的个数,包括 UI 图层个数和 Video 图层 |
参数定义 | CMD: AICFB_GET_LAYER_NUM player_num: 参考结构体 struct aicfb_layer_num 定义 |
返回值 | 0: 成功 -1: 失败 |
注意事项 | 无 |
AICFB_GET_LAYER_CAPABILITY
函数原型 | int mpp_fb_ioctl(int fd, unsigned long cmd, struct aicfb_layer_capability *player_cap); |
---|---|
功能说明 | 获取当前图层的能力 |
参数定义 | CMD: AICFB_GET_LAYER_CAPABILITY player_cap: 参考结构体 struct aicfb_layer_capability 定义 |
返回值 | 0: 成功 -1: 失败 |
注意事项 | 调用接口前要先填写结构体中的 layer_id |
AICFB_GET_LAYER_CONFIG
函数原型 | int mpp_fb_ioctl(int fd, unsigned long cmd, struct aicfb_layer_data *player_conf); |
---|---|
功能说明 | 获取图层配置信息 |
参数定义 | CMD: AICFB_GET_LAYER_CONFIG player_conf: 参考结构体 struct aicfb_layer_data 定义 |
返回值 | 0: 成功 -1: 失败 |
注意事项 | 调用接口前要先填写结构体中的 layer_id,如果是多矩形窗口要同时填写 rect_win_id |
AICFB_UPDATE_LAYER_CONFIG
函数原型 | int mpp_fb_ioctl(int fd, unsigned long cmd, struct aicfb_layer_data *player_conf) |
---|---|
功能说明 | 更新图层配置信息 |
参数定义 | CMD: AICFB_UPDATE_LAYER_CONFIG player_conf: 参考结构体 struct aicfb_layer_data 定义 |
返回值 | 0: 成功 -1: 失败 |
注意事项 | 如果是仅更新图层的部分 config data 信息,可以先调用接口 AICFB_GET_LAYER_CONFIG,获取当前图层信息,然后再修改更新新的图像信息,最后再调用此接口更新图层信息 |
AICFB_UPDATE_LAYER_CONFIG_LISTS
函数原型 | int mpp_fb_ioctl(int fd, unsigned long cmd, struct aicfb_config_lists *player_lists) |
---|---|
功能说明 | 更新图层配置数据列表 |
参数定义 | CMD: AICFB_UPDATE_LAYER_CONFIG_LISTS aicfb_config_lists player_lists: 参考结构体 struct aicfb_config_lists 定义 |
返回值 | 0: 成功 -1: 失败 |
注意事项 | 通过此接口可以同时更新多个图层或者多个窗口的配置信息,通过此接口调用的好处是相关图层配置的更新可以同时生效 |
AICFB_GET_ALPHA_CONFIG
函数原型 | int mpp_fb_ioctl(int fd, unsigned long cmd, struct aicfb_alpha_config *alpha) |
---|---|
功能说明 | 获取当前图层的 Alpha 配置 |
参数定义 | CMD: AICFB_GET_ALPHA_CONFIG alpha: 参考结构体 struct aicfb_alpha_config 定义 |
返回值 | 0: 成功 -1: 失败 |
注意事项 | 无 |
AICFB_UPDATE_ALPHA_CONFIG
函数原型 | int mpp_fb_ioctl(int fd, unsigned long cmd, struct aicfb_alpha_config *alpha) |
---|---|
功能说明 | 更新当前图层的 Alpha 配置 |
参数定义 | CMD: AICFB_UPDATE_ALPHA_CONFIG alpha: 参考结构体 struct aicfb_alpha_config 定义 |
返回值 | 0: 成功 -1: 失败 |
注意事项 | 无 |
AICFB_GET_CK_CONFIG
函数原型 | int mpp_fb_ioctl(int fd, unsigned long cmd, struct aicfb_alpha_config *alpha) |
---|---|
功能说明 | 获取当前图层的 Alpha 配置 |
参数定义 | CMD: AICFB_GET_ALPHA_CONFIG alpha: 参考结构体 struct aicfb_alpha_config 定义 |
返回值 | 0: 成功 -1: 失败 |
注意事项 | 无 |
AICFB_UPDATE_CK_CONFIG
函数原型 | int mpp_fb_ioctl(int fd, unsigned long cmd, struct aicfb_ck_config *player_ck); |
---|---|
功能说明 | 更新当前图层的 CK 配置 |
参数定义 | CMD: AICFB_SET_CK_CONFIG player_ck: 参考结构体 struct aicfb_ck_config 定义 |
返回值 | 0: 成功 -1: 当前图层不支持 color key |
注意事项 | 无 |
AICFB_GET_CCM_CONFIG
功能原型 | int mpp_fb_ioctl(int fd, unsigned long cmd, struct aicfb_ccm_config *ccm); |
---|---|
功能说明 | 获取 DE 当前的 CCM 色彩矩阵配置 |
参数定义 | CMD: AICFB_GET_CCM_CONFIG ccm: 参考结构体 struct aicfb_ccm_config 定义 |
返回值 | 0: 成功 -1: 失败 |
注意事项 | 支持 D13x/D12x 系列 |
AICFB_UPDATE_CCM_CONFIG
功能原型 | int mpp_fb_ioctl(int fd, unsigned long cmd, struct aicfb_ccm_config *ccm); |
---|---|
功能说明 | 更新 DE 的 CCM 色彩矩阵配置 |
参数定义 | CMD: AICFB_UPDATE_CCM_CONFIG ccm: 参考结构体 struct aicfb_ccm_config 定义 |
返回值 | 0: 成功 -1: 失败 |
注意事项 | 支持 D13x/D12x 系列 |
AICFB_GET_GAMMA_CONFIG
功能原型 | int mpp_fb_ioctl(int fd, unsigned long cmd, struct aicfb_gamma_config *gamma); |
---|---|
功能说明 | 获取 DE 当前的 Gamma 配置 |
参数定义 | CMD: AICFB_GET_GAMMA_CONFIG gamma: 参考结构体 struct aicfb_gamma_config 定义 |
返回值 | 0: 成功 -1: 失败 |
注意事项 | 支持 D13x/D12x 系列 |
AICFB_UPDATE_GAMMA_CONFIG
功能原型 | int mpp_fb_ioctl(int fd, unsigned long cmd, struct aicfb_gamma_config *gamma); |
---|---|
功能说明 | 更新 DE 的 Gamma 配置 |
参数定义 | CMD: AICFB_UPDATE_GAMMA_CONFIG gamma: 参考结构体 struct aicfb_gamma_config 定义 |
返回值 | 0: 成功 -1: 失败 |
注意事项 | 支持 D13x/D12x 系列 |
AICFB_GET_SCREENINFO
功能原型 | int mpp_fb_ioctl(int fd, unsigned long cmd, struct aicfb_screeninfo *pscreen_size); |
---|---|
功能说明 | 获取当前 LCD 外设 和 framebuffer 信息 |
参数定义 | CMD: AICFB_GET_SCREEN_SIZE pscreen_size: 结构体 struct aicfb_screeninfo |
返回值 | 0: 成功 -1: 失败 |
注意事项 | 无 |
AICFB_POWERON
功能原型 | int mpp_fb_ioctl(int fd, unsigned long cmd, unsigned int zero); |
---|---|
功能说明 | enable LCD 外设 |
参数定义 | CMD: AICFB_POWERON zero: NULL |
返回值 | 0: 成功 -1: 失败 |
注意事项 | 多次调用只会 enable 一次 |
AICFB_POWEROFF
功能原型 | int mpp_fb_ioctl(int fd, unsigned long cmd, unsigned int zero); |
---|---|
功能说明 | disable LCD 外设 |
参数定义 | CMD: AICFB_POWEROFF zero: NULL |
返回值 | 0: 成功 -1: 失败 |
注意事项 | 无 |
MPP FB 接口使用
MPP FB 接口操作示例:
int main(void)
{
struct aicfb_screeninfo 9nfo = {0};
struct mpp_fb *fb;
int zero, ret;
mpp_fb_probe();
fb = mpp_fb_open();
if (!fb)
return -1;
/* Enable lcd panel */
ret = mpp_fb_ioctl(fb, AICFB_POWERON, &zero);
if (ret)
return -1;
/* Get screen info */
ret = mpp_fb_ioctl(fb, AICFB_GET_SCREENINFO, &info);
if (ret)
return -1;
/* Clear framebuffer */
memset(info.framebuffer, 0x00, info.smem_len);
/* Framebuffer is a cached buffer, flush cache is required */
aicos_dcache_clean_invalid_range((unsigned long *)info.framebuffer, info.smem_len);
mpp_fb_close(fb);
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32