当前位置:   article > 正文

linux的DRM之mipi应用程序,LCD之MIPI接口

linux drm

LCD之MIPI接口

(因本人之局限性,内容仅供参考。错误之处,敬请指出。谢谢!)linux

说到mipi接口,它不仅是一个简简单单的一个接口。而是一个两层概念的叠加:物理传输系统结构(物理层面) 和 MIPI DSI 驱动框架(软件层面)。

注意:“物理传输系统结构(物理层面) 和 MIPI DSI 驱动框架(软件层面)” 这两个名词,是本人本身定义的。感受可以表达我心里的想法。web

首先讲述一下 “物理传输系统结构(物理层面)”,它是一种什么概念。如图:缓存

87954fb8ddb1dc061791d2ac0083b771.png

这幅图描述的正是“物理传输系统结构(物理层面)”。

该物理层面大体分为三层:

->1.PHY Layer 物理层,通常使用 C-PHY,D-PHY,M-PHY。它们被设计的传输速率为:100Mbits/s,500Mbits/s,1000Mbits/s。(像RK3399-firefly使用的是D-PHY)

->2.中间层,该层涉及到两个协议:DSI-2(LCD) 和CSI(camera)。 MIPI DSI 驱动就和这层有着莫大的关系。

->3.应用层。框架

那“MIPI DSI 驱动框架(软件层面)”又是怎么回事呢?这涉及到linux内核如何实现 该MIPI接口的LCD驱动。

该驱动较为复杂,这里不进行详细讲解。

MIPI DSI 之 LCD 驱动 使用的是 DSI/DRM驱动框架。

DRM 由如下 4部分组成:

->1.KMS (kernel mode setting) : 改变分辨率 和 位深。

->2.DRI (direct rendering infrastructure) : 直接访问硬件接口。

->3.GEM (graphics execution manager) : 内存管理。

->4.DRM (driver in kernel side) : 访问硬件。

其中KMS模块又由如下几部分组成:

–>1.framebuffer (画布)

–>2.CRTC (将plane 和 framebuffer数据进行配,画画)

–>3.Encoder

–>4.Connector

–>5.Plane

–>6.Drm device

KMS模块的工做原理以下:

9effdfb5f209d357dbf8cf2407299910.png

咱们以RK3399的内核对KMS模块作简单的分析:

(1)Framebuffer 画布(图像数据缓存区)相关的三个文件以下:

1.Drivers/gpu/drm/drm_fb_helper.c 内核开发者封装的 DRM fb 标准接口。

2.Drivers/gpu/drm/rockchip/rockchip_drm_fb.c rockchiop根据上面的内核接口,封装的专门针对本身芯片的 DRM fb 接口。

3.Drivers/gpu/drm/rockchip/rockchip_drm_fbdev.c rockchip 根据上面的本身封装的DRM fb接口 实现 rockchip本身的framebuffer 配置 函数。不过它也是给别人提供接口函数。(好比:rockchip_drm_fbdev_init()会被drivers/gpu/drm/rockchip/rockchip_drm_drv.c调用。)

(2)CRTC 主要用于显示控制,如:display timing,resolution配置。Rockchip中的vop 就是根据CRTC 来进一步封装实现出来的。

和CRTC 相关的文件是:

Drivers/gpu/drm/rockchip/rockchip_drm_vop.c

这个文件主要是根据内核开发者提供的函数接口,rockchip进一步封装,实现的CRTC. 它是rockchip实现 VOP 的基础。

(3)Encoder 他是将CRTC/VOP 处理后的图像数据转换成合适的格式。好比转换成HDMI须要的TMDS格式的信息,或则MIPI须要的格式信息。而后再将转换后的信息发送给connector.

Encoder 被rockchip实现位一个 platfrom总线驱动(rockchip-dp).它的主要文件是:

Drivers/gpu/drm/rockchip/analogix_dp-rockchip.c

(4)Connector 表明具体的外部接口,如edp,hdmi,mipi等。用于传输信号给外部硬件显示设备,探测外部显示设备接入。Connector 中各类外部接口对应的驱动文件以下:

(1)Rockchip_lvds.c LVDS 接口。

(2)Analogix_dp-rockchip.c EDP 接口。

(3)Cdn-dp-core.c

(4)Dw-mipi-dsi.c MIPI接口

(5)Dw-hdmi-rockchip.c HDMI接口

咱们的connector模块使用的是 dw-mipi-dsi.c 也就是mipi接口。

注意:

Encoder 和 connector 两个模块有些内容是重叠再一块儿的,因此很难清晰的划分开来。

(5)Planes 一个plane表明一个image layer(图层),咱们最终显示在显示器上的是由一个或多个plane重叠组合而成。

通常planes有三种类型:

1.DRM_PLANE_TYPE_PRIMARY :必定要有,用于显示背景或者图像内容。

2.DRM_PLANE_TYPE_OVERLAY : 用于显示overlay.

3.DRM_PLANE_TYPE_CURSOR : 用与显示鼠标。

4f0552e90d67bfb4e3c875a73e8d5c9e.png

Plane 对应的结构体是: struct drm_plane_funcs .

该结构体的初始化在vop_plane_init()在rockchip_drm_vop.c 中建立注册。

(6)Drm device 处理用户空间的请求。在代码中由struct drm_drivern 表示执行。

在 rockchip_drm_bind() drivers/gpu/drm/rockchip/rockchip_drm_drv.c 中建立注册。ide

(内容源自理解,仅供参考)svg

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号