9.1 KiB
驱动概述
- DC 是一个显示控制器,主要完成将 CPU/GPU/VPU 处理后的图像数据,按照 Display 协议处理后送给 DP PHY 接入显示器。E2000 下 DC 主要有以下特性
- 支持两路Display,两路Display相互独立
- 支持的 size 有 640×480、800×600、1024×768、1152×864、1280×720、1280×960、1366×768、1440×900、1600×90、1920×1080,最大帧率为 2.7G/(size*32)
- 支持AHB配置寄存器
- 支持Hsync,Vsync配置
- 输出支持像素格式:RGB2101010,RGB888,RGB666,RGB555
- 输入图像格式:ARGB2101010,A/XRGB8888,A/XRGB1555,A/XRGB4444,RGB565;YUV422(YUY2,UYVY,NV16);YUV420(YUY2(P010)YV12,NV12,NV21)
当前Media 驱动控制器主要为用户提供了以下功能接口
- DC,DP 控制器状态初始化函数
- 中断接口
- 热插拔检测处理接口
- 多屏模式处理接口
驱动功能
驱动组成由以下所示 :
. ├── fdc.c ├── fdc.h ├── fdc_static.c ├── fdc_hw.c ├── fdc_hw.h ├── fdc_g.c ├── fdc_common_hw.c ├── fdc_common_hw.c ├── fdp.c ├── fdp.h ├── fdp_static.c ├── fdp_phy.c ├── fdp_phy.h ├── fdp_hq.c ├── fdp_hw.h ├── fdp_g.c ├── fdp_aux.c ├── fdp_aux.h ├── fdcdp.c ├── fdcdp.h ├── fdcdp_param.c ├── fdcdp_intr.c ├── fdcdp_multi_display.c ├── fdcdp_multi_display.h
其中fdcdp.h 为用户开发者主要使用接口,提供了以下功能:
- DC,DP 控制器控制器初始化接口
- DC,DP 控制器相关状态位的回调函数注册
- DC,DP 控制器中断处理函数
- DP热插拔检测处理函数
数据结构
typedef struct
{
/* fdc instace object */
FDcCtrl dc_instance_p[FDCDP_INSTANCE_NUM];
/* fdp instace object */
FDpCtrl dp_instance_p[FDCDP_INSTANCE_NUM];
/* user config */
/* resolution */
/* color depth */
FDcDpDisplaySetting display_setting[FDCDP_DISPLAY_ID_MAX_NUM];
/* gamma parameter */
/* .... */
/* uintptr fb_p[FDCDP_INSTANCE_NUM];*/
u32 is_ready; /* Device is ininitialized and ready*/
FMediaIntrConfig intr_event[FDCDP_INTR_MAX_NUM];
void *args;
u32 connect_flg[FDCDP_INSTANCE_NUM];
u32 connect_changed_flg[FDCDP_INSTANCE_NUM];
} FDcDp;
其中FdcPrivateParams结构体为dc模块相关变量,包含有时序,frambuffer,pannel,gamma,dither,cursor等等;FdpPrivateParams结构体为dp模块相关变量,包括有时序,传输参数,phy等等。
```c
dc 相关结构体定义
typedef struct
{
FDcDtdTable dtd_table;
FDcDisplayVHTimmingConfig timming_config;
FDcDisplayFramebuffer framebuffer;
FDcDisplayPanel panel;
FDcDisplayGamma gamma;
FDcDisplayDither dither;
FDcDisplayDpMode dp_mode;
FDcDisplayVideoMode video_mode;
FDcDisplayCursor cursor;
} FDcCurrentConfig;
typedef struct
{
u32 instance_id; /* dc id */
uintptr dcch_baseaddr; /* DC channel register address*/
uintptr dcctrl_baseaddr; /* DC control register address */
u32 irq_num; /* Device intrrupt id */
} FDcConfig;
typedef struct
{
FDcCurrentConfig fdc_currentconfig;
FDcConfig config;
u32 multimode; /* The display mode of the device , including clone, horizontal and vertical display*/
} FDcCtrl;
dp 相关结构体
typedef struct
{
/* 设置参数 */
FDpSyncParameter sync_parameter[DP_GOP_MAX_MODENUM];
FDpTransmissionConfig transmission_config;
/* 当前状态 */
FDpStatus status;
u8 down_spread_enable;
#define dtd_list_max 4
/* edid 缓冲数据 */
FDpDtdTable dtd_table[dtd_list_max]; /* the max dtd num is 4 */
} FDpCurrentConfig;
typedef struct
{
u32 instance_id;
uintptr dp_channe_base_addr;
uintptr dp_phy_base_addr;
u32 irq_num;
} FDpConfig;
typedef struct
{
FDpCurrentConfig fdp_current_config;
FDpConfig config;
} FDpCtrl;
中断 相关结构体
typedef enum
{
FDCDP_HPD_IRQ_CONNECTED = 0, /* hpd 中断 */
FDCDP_HPD_IRQ_DISCONNECTED,
FDCDP_AUX_REPLY_TIMEOUT,
FDCDP_AUX_REPLY_ERROR,
FDCDP_INTR_MAX_NUM
} FDcDpIntrEventType;
typedef void (*FDcDpIntrHandler )(void *param, u32 index);
typedef struct
{
FMediaIntrConfigtype; /* data */
FDcDpIntrHandler handler;
void *param;
} FMediaIntrConfig;
错误码定义
`` FMEDIA_DEFAULT_PARAM_ERR /获取默认参数失败 / FMEDIA_ERR_PIXEL / 时钟设置错误 / FMEDIA_ERR_EDID / EDID参数获取错误/ FMEDIA_AUX_CONNECT_FAILED /* AUX连接失败 / FMEDIA_TRAIN_TIME_ERR / dp train次数超过5次还未能连接 */ FMEDIA_REACH_MAX_VOLTAGE /*已经达到最大电压设置 */
``
关键配置参数介绍
当您在使用显示驱动时,有必要将显示系统中的关键参数为您介绍:
- resolution 分辨率
显示器能够呈现的最基本的单元是像素,显示器的显示区域正是被像素点所填充,显示器的分辨率就代表了显示器所能呈现的最大像素点,通常使用较多的是1024768,19201080几种,在本驱动中,已将板卡支持分辨率统一至dpSyncTable,dcSyncTable中
- color depth 色深
色彩深度是用「n位元颜色」(n-bit colour)来作为单位的。若色彩深度是n位元,即有2的n次方种颜色选择,而储存每像素所用的位数目就是n,通常您见到最多的一般是16bit或32bit
- fresh rate 刷新率
显示器每秒刷新画面的次数;单位是Hz;例如60Hz,120Hz
- pixel clock 像素时钟
像素时钟 = 实际的水平像素垂直像素刷新率(像素数包括消隐数据)
比如 {800 , 525 , 1 , 1 , 96 , 2 , 640 , 480 , 144 , 35 , 0 , 0 } 640*480@60Hz
像素时钟 = 80052560 = 25.2 Mhz Vesa标准采用25.175
应用例程
``
- baremetal/example/peripheral/media/media_test
- baremetal/example/peripheral/media/lvgl
其中第一个例程只是点亮屏幕;第二个例程可与lvgl库进行连接,测试
API 介绍
1. FDcConfig && FDpConfig
FDcConfig *FDcLookupConfig(u32 instance_id)
FDpConfig *FDpLookupConfig(u32 instance_id)
介绍
-
获取当前FDC驱动默认配置
-
获取当前FDP驱动默认配置
参数
- u32 instance_id :当前media驱动中对应的ID
返回
FDcConfig * :dc静态默认配置 FDpConfig * :dp静态默认配置
2. FDcDpSetBasicParam
FError FDcDpSetBasicParam(FDcDp *instance_p, u32 channel_num, u32 mode_id);
介绍
- 根据传入配置,初始化MEDIA驱动实例,设置基本参数
参数
- FDcDp *instance_p FDcDp 控制器实例的指针
- u32 channel_num DP通道号
- u32 mode_id sync时序模式
返回
- FError :FMEDIA_DP_SUCCESS 为初始成功
3. FDcDpInitial
FError FDcDpInitial(FDcDp *instance_p, u32 channel_num, u32 mode_id, u32 multi_mode);
介绍
- 初始化DC,DP,设置参数,包括dc,dp的初始化和连接
参数
- FDcDp *instance_p FDcDp 控制器实例的指针
- u32 channel_num DP通道号
- u32 mode_id sync时序模式
- u32 multi_mode 单屏/多屏
返回
- FError :FMEDIA_DP_SUCCESS 为初始成功
4. FDcDpRegisterHandler
void FDcDpRegisterHandler(FDcDp *instance_p, FMediaIntrConfig *intr_event_p)
介绍
- 中断注册函数
参数
- FDcDp *instance_p FDcDp 控制器实例的指针
- FMediaIntrConfig event_p 中断事件参数
5. FDcDpInterruptHandler
void FDcDpInterruptHandler(s32 vector, void *args);
介绍
-中断handle处理函数
参数
s32 vector 中断返回值
void *irq_args 回调结构体指针
返回
- NULL
6. FDcDpIrqEnable
void FDcDpIrqEnable(FDcDp *instance_p, FMediaIntrConfigintr_event_p);
介绍
-中断使能函数
参数
FDcDp *instance_p dcdp驱动实例
FMediaIntrConfig intr_event_p 中断类型
返回
- NULL
7. FDcDpMultiDisplayFrameBufferSet
FError FDcDpMultiDisplayFrameBufferSet(FDcDp *instance_p, u32 channel_num, u32 multi_mode);
介绍
-设置多屏模式下framebuffer参数
参数
FDcDp *instance_p dcdp驱动实例
u32 channel_num 通道号
u32 multi_mode 单屏/多屏
返回
- FMEDIA_DP_SUCCESS
8. FDcDpGetFramebuffer
FDcDpFrameBuffer *FDcDpGetFramebuffer(FDcDp *instance_p);
介绍
-提供framebuffer信息对外接口
参数
FDcDp *instance_p dcdp驱动实例
返回
- &framebuffer_config
frambuffer信息