对国产板子有阴影?这些软硬件开源的ARM开发板可以学习Linux驱动开发
为了点亮一块MIPI屏幕,我们除了要了解MIPI DSI的工作原理之外,大前提要了解整个MIPI DSI图显系统的组成,更需要清楚点亮一块MIPI屏幕需要做哪些事情。
///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像黑色字体加我地球呺也能领取哦。最近比较闲,带做毕设,带学生参加省级或以上比赛///
正文开始:
1. MIPI DSI图显系统组成
MIPI图显系统的硬件组成如下图表示:
图显处理器通过DPI接口将像素数据传输到MIPI DSI Host,MIPI D-PHY作为显示屏和DSI Host之间由物理媒介,将编码后的像素数据发送到MIPI显示屏。
对于MIPI DSI显示屏而言,无需MIPI信 转换的称之为panel,内部有数据信 转换桥片的称之为bridge。
整个MIPI图显系统除了基本的像素数据信 外,为了使整个显示系统能够正常工作,还包含其他与显示屏相关的控制信 ,包括显示屏内部IC配置、显示屏背光配置、显示屏的复位和上电配置。
对于点亮一块MIPI屏幕而言,重中之重是要正确的配置显示屏参数,配置方式主要有如下3种:
·I2C或SPI等总线配置
·显示屏内部集成的MCU完成配置
·MIPI DSI DCS初始化序列
通过PWM来实现MIPI屏幕的背光控制,使用GPIO完成显示屏的复位、上电的控制。
在设备树中定义MIPI DSI图显系统的联结关系。
以RK3399为例,其提供了两路MIPI DSI通道,分别是dsi@ff960000和dsi1: dsi@ff968000,代表MIPI DSI host。
2050 dsi: dsi@ff960000 {
2051 compatible = “rockchip,rk3399-mipi-dsi”;
2052 reg = ;
…
2083 dsi1: dsi@ff968000 {
2084 compatible = “rockchip,rk3399-mipi-dsi”;
2085 reg = ;
…
RK3399芯片使用了Synopsy的DPHY。控制器与DPHY之间的关系如下图所示:
MIPI DSI设备树结点中有一个信息同MIPI显示密切相关,那就是时钟信息。可以看出MIPI DSI需要三路时钟,分别是ref、pclk、phy_cfg。
2050 dsi: dsi@ff960000 {
2051 compatible = “rockchip,rk3399-mipi-dsi”;
…
2054 clocks = , ,
2055 ;
2056 clock-names = “ref”, “pclk”, “phy_cfg”;
pclk是MIPI DSI host的APB时钟,用于配置MIPI DSI host寄存器以及中断等。ref和phy_cfg是MIPI DPHY所需时钟。这两路时钟由MIPI DSI host提供。其中ref时钟用于MIPI DPHY内部PLL产生主机侧的串行发送时钟。phy_cfg是在配置MIPI DPHY时使用。
4知识体系搭建
MIPI DSI同图显控制器vop之间在逻辑层面上的联结关系如下:
# MIPI DSI Host
dsi_in_vopb: endpoint@0 {
reg = ;
remote-endpoint = ;
};
dsi_in_vopl: endpoint@1 {
reg = ;
remote-endpoint = ;
};
# VOP
vopb_out_dsi: endpoint@1 {
reg = ;
remote-endpoint = ;
};
vopb_out_dsi1: endpoint@4 {
reg = ;
remote-endpoint = ;
};
?「后文所涉及到的代码部分,均基于DRM架构实现」
?
2.关键数据结构
请注意以下几个关键的数据结构,后文的MIPI DSI初始化以及MIPI显示系统初始化均以它们为核心进行展开,包括各数据结构的例化工作和创建各数据结构之间的联结关系。
「struct mipi_dsi_host」
struct mipi_dsi_host {
struct device *dev;
const struct mipi_dsi_host_ops *ops;
struct list_head list;
};
该数据结构由DRM MIPI DSI提供,用以描述MIPI DSI Host,包括Host的驱动设备、Host提供的功能函数(后文会介绍具体功能),Host链表的设备注册、管理。
「struct mipi_dsi_device」
struct mipi_dsi_device {
struct mipi_dsi_host *host;
struct device dev;
char name[DSI_DEV_NAME_SIZE];
unsigned int channel;
unsigned int lanes;
enum mipi_dsi_pixel_format format;
unsigned long mode_flags;
};
该数据结构由DRM MIPI DSI提供,用以描述DSI设备信息,主要包括DSI设备的lane数量(最多4lane)、像素格式(由Host决定,如RGB888、RGB565等)。
「struct mipi_dsi_host_ops」
struct mipi_dsi_host_ops {
int (*attach)(struct mipi_dsi_host *host,
struct mipi_dsi_device *dsi);
int (*detach)(struct mipi_dsi_host *host,
struct mipi_dsi_device *dsi);
ssize_t (*transfer)(struct mipi_dsi_host *host,
const struct mipi_dsi_msg *msg);
};
该数据结构由DRM MIPI DSI提供,用以描述DSI Host所能提供的功能函数,包括DSI Host和显示屏之间创建联结关系需要使用的attach、通过DSI Host配置显示屏的transfer。
3. MIPI DSI软件架构
基于DRM的图显系统中,MIPI DSI子系统主要由DSI CORE与PANEL CORE组成,二者内建连接关系后注册到DRM CORE系统。
在DRM架构下,提供了drm_mipi_dsi.c、drm_panel.c以及drm_bridge.c三个核心文件。用户的MIPI DSI驱动以drm_mipi_dsi.c为核心进行代码编写,例如RK3399的MIPI驱动dw-mipi-dsi.c。各显示屏厂商的驱动代码基于后两者进行编写,例如较为广泛使用的panel-simple.c。
4. MIPI图显系统初始化
从第一章内容来看,点亮MIPI DSI屏幕并能正常的显示图像,在DRM架构下需完成如下初始化工作:
.MIPI DSI Host初始化
.MIPI DSI D-PHY初始化
.MIPI DSI屏幕初始化
.构建MIPI DSI各模块间的联结关系
为了实现以上初始化工作,我们需要在设备树DTS文件中约定各种初始化参数,包括各个模块的功能参数以及各个模块之间的联结关系,在驱动代码中配置各IP及外设硬件,并基于DRM架构注册出各组件,从软件层面勾勒出MIPI DSI的数据流路径。
4.1 MIPI DSI初始化
RK3399使用数据结构struct dw_mipi_dsi描述MIPI DSI设备,该数据结构也是整个MIPI DSI图显系统的核心,囊括了系统中的各个组件。
struct dw_mipi_dsi {
struct drm_encoder encoder;
struct drm_connector connector;
struct drm_bridge *bridge;
struct device_node *client;
struct mipi_dsi_host dsi_host;
struct mipi_dphy dphy;
struct drm_panel *panel;
struct device *dev;
struct regmap *grf;
struct reset_control *rst;
struct regmap *regmap;
struct clk *pclk;
struct clk *h2p_clk;
int irq;
struct dw_mipi_dsi *master;
struct dw_mipi_dsi *slave;
struct mutex mutex;
bool prepared;
unsigned int id;
unsigned long mode_flags;
unsigned int lane_mbps; /* per lane */
u32 channel;
u32 lanes;
u32 format;
struct drm_display_mode mode;
const struct dw_mipi_dsi_plat_data *pdata;
};
「DRM架构相关」
基于DRM KMS架构的MIPI DSI图显系统也同样遵循其设定的组件规则,MIPI Host属于DRM encoder,D-PHY和PANEL部分属于DRM connector。在实际使用过程种你可能发现这样一个现象,就是电路板并没有连接MIPI屏幕,但是DRM connector的连接状态依然是connected,这是因为MIPI DSI无法真实的检测到物理连接关系,通过软件定义DRM connector和encoder之间的连接关系,当一切都初始化成功的时候,connector就处于connected状态了。
struct drm_encoder encoder;
struct drm_connector connector;
struct drm_bridge *bridge;
struct drm_panel *panel;
「MIPI DSI主体」
这里所说的主体主要包括MIPI DSI Host、D-PHY、bridge或pannel。不仅需要表示MIPI DSI图显系统的关键组成模块,也需要定义彼此之间硬件与软件层面的连接关系。
struct mipi_dsi_host dsi_host;
struct mipi_dphy dphy;
struct drm_bridge *bridge;
struct drm_panel *panel;
「MIPI DSI参数」
我们关心的MIPI DSI参数主要包括物理硬件定义、时钟频率、复位控制等。而物理硬件定义又包括lane数目、通道数、lane速率等。
unsigned long mode_flags;
unsigned int lane_mbps; /* per lane */
u32 channel;
u32 lanes;
u32 format;
「显示参数」
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!