Edit online

MIPI

3 Mar 2025
Read time: 5 minute(s)
MIPI-DSI 屏幕通常需要初始化,调试时需根据屏厂提供的资料,开发一款专用的驱动。开发步骤如下:。
  1. 新增一款屏驱动:
    • 复制模块文件 ``panel_dsi_xm91080.c``
    • 将新文件重命名为 ``panel_dsi_xxx.c`` (xxx 为屏驱 IC 型号)
  2. 注册新驱动文件。
    • 修改 ``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')
  3. 注册新 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
              };
  4. 设置屏幕时序和接口参数*。
    • 修改 ``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
  5. 添加初始化操作*。
    • 重新实现 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);
              }
  6. 配置屏幕引脚功能。

    在 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
  7. 使能新建的 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)  --->