Edit online

源码和框架说明

4 Dec 2024
Read time: 3 minute(s)

源码说明

本模块源代码的目录结构如下:

1. 目录 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 配置文件
2. 目录 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 适配的专用驱动
3. 目录 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 运行过程中,显示接口只能输出一种标准信号,其数据链路是确定的。显示接口硬件框图如下所示:


/hw_framework

1. 硬件框图
在软件 SDK 中,显示引擎、显示接口与 LCD 的关系是 1 x N x N。 一个显示引擎需要支持多个显示接口标准,一个显示接口又要适配多款 LCD,其数据链路是不确定的。

/sw_framework

2. 软件框图

MIPI-DBI 协议

Mobile Industry Processor Interface - Display Bus Interface (MIPI-DBI) 是一种用于显示接口的协议,主要用于移动设备中的显示屏连接。MIPI-DBI 是软件虚拟出来的 device,为 MIPI-DBI 协议提供支持。MIPI-DBI 协议支持多种类型的数据传输方式:

  • Type A: Motorola 6800

  • Type B: Intel 8080

  • Type C: SPI

ArtInChip 平台支持 MIPI-DBI 协议中的 Type B 和 Type C,可以与使用这两种类型的 MIPI-DBI 接口的显示屏进行通信。

结构体定义

  • struct platform_driver
    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;
        };
    };
  • struct aic_panel
    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;
    };
    • struct aic_panel_funcs*funcs; 由 panel 提供,供 fb 调用的回调

    • struct aic_panel_callbackscallbacks; 由 DE/DI 提供,供 panel 调用的回调

    • 在 panel 提供的 struct aic_panel_funcs 中,会调用 DE/DI 提供的 struct aic_panel_callbacks

      callbacks 的设计是为了满足 DE、DI、panel 三个硬件模块的初始化时序,包含先后顺序、延迟大小等。时序约束主要来自 panel 侧。