屏驱动支持
-
Kernel: source/linux-5.10/drivers/video/artinchip/disp/panel/
-
Uboot: source/uboot-2021.10/drivers/video/artinchip/display/panel/
-
在 panel 目录下,根据屏接口类型选择一个合适的模板,拷贝一个屏驱动,例如:
-
MIPI-DSI 接口可参考 panel_dsi_xm91080.c
-
SRGB 接口可参考 panel_srgb_ili8961.c
-
MIPI-DBI 接口可参考 panel_dbi_ili9488.c
不需要初始化动作的 LCD 屏幕,如 RGB/ LVDS 屏幕,可通过 menuconfig 配置选择 panel_lvds_general.c/ panel_rgb_general.c,在 board.dts 中修改相关参数即可。
-
- 修改新屏驱动名字,将屏驱动添加进 panel 目录下的 Kconfig 和 Makefile 文件。
- 重新实现 aic_panel_funcs
结构体中的 prepare 或者 enable
接口,添加屏幕所需的初始化操作。
-
对于 RGB 和 LVDS 屏幕,可执行下列操作:
- 通过 menuconfig 配置选择RGB 和 LVDS 通用屏幕驱动。
- 在 Panel_RGB 和 Panel_LVDS中选择所需配置参数和时序参数。
-
对于 MIPI-DSI 屏幕
-
在发送 init_sequence 之前需要调用 panel_mipi_send_perpare 确保屏幕能正确无误地接受到命令。
-
在发送完 init_sequence 后需要调用 panel_mipi_setup_realmode 设置正确的 MIPI 模式。
-
发送 init_sequence 的两个接口:
-
panel_dsi_generic_send_seq :发送 DCS 命令
-
panel_dsi_generic_send_seq:发送 Generic 命令
注:MIPI-DSI Command 分为下列两类:-
DCS (Display Command Set),MIPI 协议定义的一个专门用于显示的命令集,使用广泛
-
Generic,屏厂根据 MIPI 协议进行定制
-
-
时序参数,推荐 hardcode 方式,保存在驱动源码中
-
推荐 video burst 模式
struct panel_dsi dsi = { .mode = DSI_MOD_VID_BURST, ... };
-
MIPI-DSI 数据通道支持顺序互换,极性翻转,时钟通道支持极性翻转
-
-
对于 MIPI-DBI 屏幕
-
Type B 接口可配置参数:
-
first_line : 第一行刷屏数据自动插入的命令,默认 0x2c
-
other_line : 其余行刷屏数据自动插入的命令,默认 0x3c
-
-
Type C 接口可配置参数:
-
first_line : 第一行刷屏数据自动插入的命令,默认 0x2c
-
other_line : 其余行刷屏数据自动插入的命令,默认 0x3c
-
qspi_mode : 刷屏数据是否携带时序信息
-
vbp_num : 帧数据传输前的空白行数量
-
code1_cfg : 引导码
-
code[3] : 引导码
-
-
时序参数,推荐 hardcode 方式,保存在驱动源码中
MIPI-DBI 接口读写/刷屏时序详见芯片手册 > 多媒体 > LCD 章节。
-
MIPI-DBI init_sequence 发送接口 panel_dbi_default_enable()
-
MIPI-DBI init_sequence 格式
command, count of data, data... //命令,数据个数,不定长的数据
延时操作指令,毫秒级延时
0x00, delay_ms //标记头,毫秒级延时
-
-
RGB 和 LVDS 通用屏幕驱动
GPIO 操作
- panel_comp 结构体默认支持两个 GPIO
-
一个 enable gpio , 可用于控制背光,使能屏幕
-
一个 sleep gpio, 可用于控制屏幕供电,休眠唤醒
-
如果需要添加更多 gpio 引脚,可参考 panel_dsi_wuxga_7in.c/panel_srgb_ili8961.c。
数据结构
- struct
panel_comp
struct panel_comp { struct aic_panel panel; struct display_timings *timings; bool use_dt_timing; struct backlight_device *backlight; struct regulator *supply; struct gpio_desc *enable_gpio; struct gpio_desc *sleep_gpio; };
- struct
aic_panel
struct aic_panel { struct aic_panel_funcs *funcs; struct aic_panel_callbacks callbacks; struct videomode *vm; struct device *dev; union { struct panel_rgb *rgb; struct panel_lvds *lvds; struct panel_dsi *dsi; }; };
- struct aic_panel_funcspanel 提供,供 fb 调用的回调。新屏驱动必须实现。
/* Each panel driver should define the follow functions. */ struct aic_panel_funcs { int (*prepare)(struct aic_panel *panel); int (*enable)(struct aic_panel *panel); int (*disable)(struct aic_panel *panel); int (*unprepare)(struct aic_panel *panel); int (*get_video_mode)(struct aic_panel *panel, struct videomode *vm); int (*register_callback)(struct aic_panel *panel, struct aic_panel_callbacks *pcallback); };
- struct aic_panel_callbackspanel 无需实现,由 DE、DI 提供,供 panel 调用的回调。
struct aic_panel_callbacks { int (*di_enable)(void); int (*di_disable)(void); int (*di_send_cmd)(u32 dt, u32 vc, s8 *data, u32 len); int (*di_set_videomode)(struct videomode *vm, int enable); int (*timing_enable)(void); int (*timing_disable)(void); };
- struct panel_rgbRGB 接口屏幕参数
struct panel_rgb { unsigned int mode; unsigned int format; unsigned int clock_phase; unsigned int data_order; bool data_mirror; };
- struct panel_lvdsLVDS 接口屏幕参数
struct panel_lvds { enum lvds_mode mode; enum lvds_link_mode link_mode; };
- struct panel_dsiMIPI-DSI 接口屏幕参数
struct panel_dsi { enum dsi_mode mode; enum dsi_format format; unsigned int lane_num; };
- struct panel_dbiMIPI-DBI 接口屏幕参数
struct panel_dbi_commands { const u8 *buf; size_t len; }; struct spi_cfg { unsigned int qspi_mode; unsigned int vbp_num; unsigned int code1_cfg; unsigned int code[3]; }; struct panel_dbi { unsigned int type; unsigned int format; unsigned int first_line; unsigned int other_line; struct panel_dbi_commands commands; struct spi_cfg *spi; };
函数接口
接口定义 | int panel_default_prepare(struct aic_panel *panel) |
---|---|
功能说明 | 默认的 prepare 接口函数,使能 regulator |
参数定义 | 结构体 aic_panel |
返回值 |
|
注意事项 | - |
接口定义 | int panel_default_enable(struct aic_panel *panel) |
---|---|
功能说明 | 默认的 enable 接口函数,设置 de 模块的 timing 参数,使能相应的 DI 接口,开启背光 |
参数定义 | 结构体 aic_panel |
返回值 | 0:成功 |
注意事项 | - |
接口定义 | int panel_default_unprepare(struct aic_panel *panel) |
---|---|
功能说明 | 默认的 unprepare 接口函数,禁用 regulator |
参数定义 | 结构体 aic_panel |
返回值 | 0:成功 |
注意事项 | - |
接口定义 | int panel_default_disable(struct aic_panel *panel) |
---|---|
功能说明 | 默认的 disable 接口函数,禁用背光,禁用 DI 接口,禁用 DE |
参数定义 | 结构体 aic_panel |
返回值 | 0:成功 |
注意事项 | - |
接口定义 | int panel_register_callback(struct aic_panel *panel, struct aic_panel_callbacks *pcallback) |
---|---|
功能说明 | DE,DI 提供的回调函数,供 panel 调用 |
参数定义 | 结构体 aic_panel |
返回值 | 0:成功 |
注意事项 | - |
接口定义 | int panel_default_get_video_mode(struct aic_panel *panel, struct videomode *vm) |
---|---|
功能说明 | panel 提供的回调,供 fb 调用,传递从 dts 中解析的 timing 参数 |
参数定义 | videomode:包含屏幕的 timing 参数 |
返回值 | 0:成功 |
注意事项 | - |
接口定义 | int panel_parse_dts(struct panel_comp *p, struct device *dev); |
---|---|
功能说明 | 解析 dts 中的 panel 结点 |
参数定义 | panel_comp ,结构体 device |
返回值 | 0:成功 |
注意事项 | - |
接口定义 | void panel_di_enable(struct aic_panel *panel, u32 ms) |
---|---|
功能说明 | 使能相应的 DI 接口 |
参数定义 | 结构体 aic_panel, ms 延时毫秒 |
返回值 | void |
注意事项 | - |
接口定义 | void panel_di_disable(struct aic_panel *panel, u32 ms) |
---|---|
功能说明 | 禁用相应的 DI 接口 |
参数定义 | 结构体 aic_panel, ms 延时毫秒 |
返回值 | void |
注意事项 | - |
接口定义 | void panel_de_timing_enable(struct aic_panel *panel, u32 ms) |
---|---|
功能说明 | 启用 DE, 设置 de 模块的 timing 参数 |
参数定义 | 结构体 aic_panel, ms 延时毫秒 |
返回值 | void |
注意事项 | - |
接口定义 | void panel_de_timing_disable(struct aic_panel *panel, u32 ms) |
---|---|
功能说明 | 禁用 DE, 设置 de 模块的 timing 参数 |
参数定义 | 结构体 aic_panel, ms 延时毫秒 |
返回值 | void |
注意事项 | - |
接口定义 | void panel_mipi_send_perpare(struct aic_panel *panel) |
---|---|
功能说明 | 将 DSI 通道切换到 command mode, 准备好给 MIPI 屏幕发送初始化命令 |
参数定义 | 结构体 aic_panel |
返回值 | void |
注意事项 | 在 MIPI 屏幕发送初始化命令前要先调用这个函数,以确保 MIPI 屏幕收到正确的初始化命令 |
接口定义 | void panel_send_command(u8 *para_cmd, u32 size, struct aic_panel *panel) |
---|---|
功能说明 | 给 MIPI 屏幕发送初始化命令 |
参数定义 | 结构体 aic_panel , 初始化序列大小 size, 初始化序列 para_cmd |
返回值 | void |
注意事项 | - |
接口定义 | void panel_send_command(u8 *para_cmd, u32 size, struct aic_panel *panel) |
---|---|
功能说明 | 将 DSI 通道切换回正确的模式 |
参数定义 | 结构体 aic_panel |
返回值 | void |
注意事项 | 在 MIPI 屏幕发送完初始化命令后调用这个函数,以确保 MIPI 通道正常工作 |
接口定义 | #define panel_dsi_generic_send_seq(panel, seq…) |
---|---|
功能说明 | 发送屏厂根据 MIPI 协议扩展的 command |
参数定义 | 结构体 aic_panel,seq: init command |
返回值 | 0: 成功, 负数:失败 |
注意事项 | - |
接口定义 | #define panel_dsi_dcs_send_seq(panel, seq…) |
---|---|
功能说明 | 发送 mipi 协议标准的 command |
参数定义 | 结构体 aic_panel,seq: init command |
返回值 | 0: 成功, 负数:失败 |
注意事项 | - |
接口定义 |
static inline void panel_init(struct panel_comp *p, struct device *dev, struct videomode *vm, struct aic_panel_funcs *funcs) |
---|---|
功能说明 | 初始化一个 panel |
参数定义 | 结构体 panel_comp , 结构体 device,屏时序参数 videomode, aic_panel_funcs |
返回值 | void |
注意事项 | - |