MIPI
3 Mar 2025
Read time: 5 minute(s)
MIPI-DSI 屏幕通常需要初始化,调试时需根据屏厂提供的资料,开发一款专用的驱动。开发步骤如下:。
- 新增一款屏驱动:
- 复制模块文件 ``panel_dsi_xm91080.c``
- 将新文件重命名为 ``panel_dsi_xxx.c`` (xxx 为屏驱 IC 型号)
- 注册新驱动文件。
-
修改 ``bsp\artinchip\drv\display\panel\Kconfig`` 文件,添加配置项,让新驱动在 menuconfig 界面可见。
config AIC_PANEL_DSI_XXX bool "ArtInChip MIPI DSI XXX panel" depends on AIC_DISP_MIPI_DSI
-
修改 bsp/artinchip/SConscript 文件,添加编译规则。
if GetDepend('AIC_PANEL_DSI_XXX'): src += Glob('drv/display/panel/panel_dsi_xxx.c')
-
- 注册新 struct aic_panel 结构体:
- 修改 panel_dsi_xxx.c 的 struct aic_panel 命名,重命名为 dsi_xxx
- 在 panel_com.h 中 extern struct aic_panel
dsi_xxx
// panel_com.h extern struct aic_panel dsi_xxx;
- 将 dsi_xxx 添加到 ``panel_com.c`` 文件的 panels[]
指针数组中
// panel_com.c static struct aic_panel *panels[] = { ... #ifdef AIC_PANEL_DSI_XXX &dsi_xxx, #endif };
- 设置屏幕时序和接口参数*。
- 修改 ``struct display_timing`` 结构体,根据 LCD
屏幕规格书修改时序参数
static struct display_timing xxx_timing = { .pixelclock = 130000000, .hactive = 1080, .hfront_porch = 160, .hback_porch = 160, .hsync_len = 40, .vactive = 1920, .vfront_porch = 10, .vback_porch = 20, .vsync_len = 8, };
- 修改 struct panel_dsi 结构体,根据 LCD
屏幕规格书修改显示接口参数
struct panel_dsi dsi = { .mode = DSI_MOD_VID_BURST, .format = DSI_FMT_RGB888, .lane_num = 4, };
- 根据 PCB 原理图修改 MIPI-DSI 通道顺序和极性
修改 bsp\artinchip\drv\display\disp_conf.h 文件下列宏定义
使用硬件设计指南的推荐设计,不需要修改下列参数
/** * MIPI-DSI options */ /** * data lane assignments, default 0x3210 * * default D3 D2 D1 D0 * PD26/PD27 PD24/PD25 PD20/PD21 PD18/PD19 * * example 0x0123 * D0 D1 D2 D3 * PD26/PD27 PD24/PD25 PD20/PD21 PD18/PD19 */ #define LANE_ASSIGNMENTS 0x3210 /** * data lane polarities, default 0b0000 * * default PD26/PD27 PD24/PD25 PD19/PD20 PD17/PD18 * N/P N/P N/P N/P * * example 0b1010 * PD26/PD27 PD24/PD25 PD19/PD20 PD17/PD18 * P/N N/P P/N N/P * * LANE_POLARITIES 0b1010 */ #define LANE_POLARITIES 0b0000 /** * data clk inverse, default 0 * * default PD22/PD23 * N/P * * example 1 * PD23/PD22 * P/N */ #define CLK_INVERSE 0
注: 部分 MIPI 屏幕对 timing 时序较为敏感,时序不匹配可能会导致颜色异常,图像错位等显示问题。增大消隐区,更换 video mode 可以改善显示异常问题, 推荐使用 DSI_MOD_VID_BURST mode,显示异常时增大 hbp hfp - 修改 ``struct display_timing`` 结构体,根据 LCD
屏幕规格书修改时序参数
- 添加初始化操作*。
- 重新实现 struct aic_panel_funcs 结构体中的 prepare 或者 enable
接口,发送初始化命令
static struct aic_panel_funcs st7701s_funcs = { .disable = panel_default_disable, .unprepare = panel_default_unprepare, .prepare = panel_default_prepare, .enable = panel_enable, .register_callback = panel_register_callback, };
- 根据板卡原理图添加 ``reset`` 或 ``power`` 控制引脚的逻辑
如果不需要软件控制 reset 引脚,该步骤可省略
#define RESET_PIN "PE.14" static struct gpio_desc reset_gpio; static void panel_gpio_init(void) { panel_get_gpio(&reset_gpio, RESET_PIN); panel_gpio_set_value(&reset_gpio, 1); aic_delay_ms(120); }
- 重新实现 struct aic_panel_funcs 结构体中的 prepare 或者 enable
接口,发送初始化命令
- 配置屏幕引脚功能。
在 pinmux.c 文件中添加屏幕引脚
以 demo128-nand 工程为例,在 target/d21x/demo128-nand/pinmux.c 中配置屏幕引脚
- 添加 reset 等控制引脚,配置功能 1
如果不需要软件控制 reset 引脚,该步骤可省略
#ifdef AIC_DISP_MIPI_DSI ... {1, PIN_PULL_DIS, 3, "PE.14"}, // reset gpio #endif
- 添加 MIPI-DSI 信号引脚,配置功能
4
#ifdef AIC_DISP_MIPI_DSI // MIPI DSI 只有一组 pinmux 配置,根据使用的通道数量和原理图接线进行修改 {4, PIN_PULL_DIS, 3, "PD.18"}, {4, PIN_PULL_DIS, 3, "PD.19"}, {4, PIN_PULL_DIS, 3, "PD.20"}, {4, PIN_PULL_DIS, 3, "PD.21"}, {4, PIN_PULL_DIS, 3, "PD.22"}, {4, PIN_PULL_DIS, 3, "PD.23"}, {4, PIN_PULL_DIS, 3, "PD.24"}, {4, PIN_PULL_DIS, 3, "PD.25"}, {4, PIN_PULL_DIS, 3, "PD.26"}, {4, PIN_PULL_DIS, 3, "PD.27"}, #endif
- 添加 reset 等控制引脚,配置功能 1
- 使能新建的 panel 驱动
在 Luban-Lite 根目录下执行 me,进入 menuconfig 的功能配置界面。
- 配置显示接口:
Board options ---> [*] Using Display Engine (DE) Display Parameter ---> select Display interface (Display MIPI-DSI interface) --->
- 选择新建的 ArtInChip MIPI DSI panel
驱动:
Board options ---> [*] Using Display Engine (DE) Display Parameter ---> Display Panels ---> ArtInChip Panel Drivers (ArtInChip MIPI DSI XXX panel) --->
- 配置显示接口: