Linux MIPI DSI LCD设备驱动开发调试细节学习笔记(一)

简介: Linux MIPI DSI LCD设备驱动开发调试细节学习笔记(一)

最近在学习MIPI接口的LCD驱动开发与调试,这里我主要用的是MIPI-DSI接口,它学习起来真的是太复杂了,特别是对于我这种很久都没写驱动来说更是头疼,但是头疼归头疼,工作咱们还是要完成的,那就只能硬着头皮往下肝吧!


首先了解下什么是MIPI-DSI


MIPI-DSI是一种应用于显示技术的串行接口,兼容DPI(显示像素接口,Display Pixel Interface)、DBI(显示总线接口,Display Bus Interface)和DCS(显示命令集,Display Command Set),以串行的方式发送像素信息或指令给外设,而且从外设中读取状态信息或像素信息,而且在传输的过程中享有自己独立的通信协议,包括数据包格式和纠错检错机制。下图所示的是MIPI-DSI接口的简单示意图。MIPI-DSI具备高速模式和低速模式两种工作模式,全部数据通道都可以用于单向的高速传输,但只有第一个数据通道才可用于低速双向传输,从属端的状态信息、像素等格式通过该数据通道返回。时钟通道专用于在高速传输数据的过程中传输同步时钟信号。此外,一个主机端可允许同时与多个从属端进行通信。(摘抄自网友)

640.png

那么,在Linux中调试MIPI LCD需要注意哪些细节呢?分别是:


  • 供电
  • 复位
  • 时序
  • 像素时钟
  • MIPI时钟(本章不涉及)
  • MIPI命令(本章不涉及)
  • MIPI数据格式(本章不涉及)


在Linux驱动开发过程中,一般通用的MIPI的驱动都是现成的,比如以下的simple-panel-dsi,就是通用的MIPI接口LCD驱动,它在Linux内核中位于driver/gpu/drm/panel目录下,对应的文件是:panel-simple.c


一般使用通用的MIPI LCD驱动,我们只需要根据自己选购的屏的参数进行配置即可,也就是只需要配置设备树即可顺利完成点屏的操作,那么如何来配置相关参数呢?这里我用的是瑞芯微的RV1109方案,在此借用荣品LCD的设备树我们来学习下它的设备树参数:

&dsi {
 status = "okay";
 rockchip,lane-rate = <480>;
 panel@0 {
  compatible ="simple-panel-dsi";
  reg = <0>;
  backlight = <&backlight>;
  /delete-property/ power-supply;
  prepare-delay-ms = <100>;
  reset-delay-ms = <10>;
  init-delay-ms = <100>;
  disable-delay-ms = <50>;
  unprepare-delay-ms = <20>;
  width-mm = <68>;
  height-mm = <121>;
  pinctrl-names = "default";
  pinctrl-0 = <&vdd_5v_3v3_h>;
  enable-gpios = <&gpio2 27 GPIO_ACTIVE_HIGH>;
  reset-gpios  = <&gpio3 4 GPIO_ACTIVE_LOW>;
  dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
         MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET)>;
  dsi,format = <MIPI_DSI_FMT_RGB888>;
  dsi,lanes = <4>;
  panel-init-sequence = [
   05 78 01 11
   05 78 01 29
  ];
  display-timings {
   native-mode = <&timing0>;
   timing0: timing0 {
    clock-frequency = <51000000>;
    hactive = <1024>;
    vactive = <600>;
    hback-porch = <160>;
    hfront-porch = <136>;
    vback-porch = <16>;
    vfront-porch = <16>;
    hsync-len = <4>;
    vsync-len = <2>;
    hsync-active = <0>;
    vsync-active = <0>;
    de-active = <0>;
    pixelclk-active = <0>;
   };
  };
  ports {
   #address-cells = <1>;
   #size-cells = <0>;
   port@0 {
    reg = <0>;
    panel_in_dsi: endpoint {
     remote-endpoint = <&dsi_out_panel>;
    };
   };
  };
 };
 ports {
  #address-cells = <1>;
  #size-cells = <0>;
  port@1 {
   reg = <1>;
   dsi_out_panel: endpoint {
    remote-endpoint = <&panel_in_dsi>;
   };
  };
 };
};

上面提供了非常多的节点,但是怎么去理解这些节点呢??Linux内核为我们提供了丰富的文档:

640.png

640.png

有了这些文档,我们再来看上面设备树节点的内容就简单多了,当然我们也可以结合代码来理解这些参数的含义:

640.png

先列举一些重要的参数:

1、enable-gpios和reset-gpios

640.png

enable-gpios配置的是LCD的使能脚,reset-gpios配置的是LCD的复位脚:

enable-gpios = <&gpio2 27 GPIO_ACTIVE_HIGH>;
reset-gpios  = <&gpio3 4 GPIO_ACTIVE_LOW>;

如上所示,为什么是27和4,我们要查询下IO口绑定的编号,如下:

640.png

2、hactive, vactive:

表示显示分辨率,在设备树里一般如下表示:

hactive = <1024>;  //水平分辨率
vactive = <600>;   //垂直分辨率

跟分辨率相关的内容我们一般都可以从LCD厂家提供的数据手册里找到它们:

640.png

3、dsi,lanes

确定接口类型为MIPI,MIPI能够实现多通道差分传输,所以通过数据手册我们可以了解它具体有多少路:

640.png

640.png

640.png

640.png

根据数据手册,我们很容易了解到数据通道有4组,所以对应设备树中的配置如下:

dsi,lanes = <4>; //表示使用 4lane 传输数据

4、时序

640.png

一般厂家FAE会给到我们一组参数,分别是:

lane个数(与原理图匹配)
HSA、HBP、HACT、HFP
VSA、VBP、VACT、VFP
FR
pixel_clk (KHZ)
phy_data_rate (Mbps)
其中参考了网上的一些计算公式:
(1)HBB = HSA + HBP
(2)VBB = VSA + VBP
(3)pixel_clk = round((HBB+HACT+HFP)*(VBB+VACT+VFP)*FR/1000) KHZ
(4)phy_data_rate = round((HBB+HACT+HFP)*(VBB+VACT+VFP)*FR*output_format/lane个数/1000000) Mbps
output_format是输出数据字节数,例:RBG24即为24

根据以上提供的这些参数就可以完成MIPI DSI的时序初始化。比如我随便找一个LCD的数据手册就会看到:

640.png

640.png

640.png

4.1、以像素为单位的水平显示时序参数

在LCD屏厂手册里一般都会提供以下三个参数,分别是:


  • hfront-porch:(HFP)
  • hback-porch:(HBP)
  • hsync-len:(HSA)


荣品的LCD手册里没有提供这部分的时序描述,仅在设备树里配置了几个参数而已,至于为什么那么配,我也不知道,只能说知道是什么含义就行了:

hback-porch = <160>;
hfront-porch = <136>; 
hsync-len = <4>;

相对应的在以像素为单位的水平时序里还有一个水平脉冲的配置选项:hsync-active,官方文档描述是:hsync pulse is active low/high/ignored,也就是说,如果要配置的话要么就是0/1,要么就不配置,默认配置:

hsync-active = <0>;
4.2、以行为单位的垂直显示时序参数

在LCD屏厂手册里一般都会提供以下三个参数,分别是:


  • vfront-porch:(VFP)
  • vback-porch:(VBP)
  • vsync-len:(VSA)


荣品的LCD手册里没有提供这部分的时序描述,仅在设备树里配置了几个参数而已,至于为什么那么配,我也不知道,只能说知道是什么含义就行了:

vback-porch = <16>;
vfront-porch = <16>;
vsync-len = <2>;

相对应的在以行为单位的垂直显示时序里还有一个水平脉冲的配置选项:vsync-active,官方文档描述是:vsync pulse is active low/high/ignored,也就是说,如果要配置的话要么就是0/1,要么就不配置,默认配置:

vsync-active = <0>;
4.3、数据使能 & 像素时钟脉冲参数

(1)de-active:

data-enable pulse is active low/high/ignored
de-active = <0>;

(2)pixelclk-active:数据采样的方式


配置为1:上升沿驱动像素数据/下降沿采样数据


配置为0:下降沿驱动像素数据/上升沿采样数据

pixelclk-active = <0>;

5、像素时钟的配置

一般像素时钟有一个计算公式,如下:

(h+hbp+hfp+hsa)*(v+vbp+vfp+vsa)*60

也就是说把厂家手册提供给我们的时序参数往这个公式里面套,最终就可以算出我们的像素时钟是多少了。

6、panel-init-sequence

这部分一般指的是厂家给我们提供的屏幕的初始化代码,官方文档的介绍是这样的:

A byte stream formed by simple multiple dcs packets.
byte 0: dcs data type
byte 1: wait number of specified ms after dcs command transmitted
byte 2: packet payload length
byte 3 and beyond: number byte of payload

荣品的设备树这部分配置如下:

panel-init-sequence = [
   05 78 01 11
   05 78 01 29
  ];

还有很多内容,分几个章节来写吧,今天就学习总结到这了。

往期精彩

一个强大的音视频编解码库-rkmedia的应用


瑞芯微RV1109配置7寸电容触摸屏的方向修改笔记


如何添加APP到Buildroot里(以瑞芯微rv1126为例)


瑞芯微RV1109配置GPIO设备树修改笔记(熟悉新平台从点灯大法开始)


新产品立项了,作为嵌入式软件工程师该如何来开展设计工作?(个人经验分享)

目录
相关文章
|
10天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
32 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
22天前
|
Linux 网络安全 网络虚拟化
Linux虚拟网络设备:底层原理与性能优化深度解析
在深入探讨Linux虚拟网络设备的底层原理之前,重要的是要理解这些设备如何在Linux内核中实现,以及它们如何与操作系统的其他部分交互以提供高效且灵活的网络功能。虚拟网络设备在现代网络架构中发挥着关键作用🔑,特别是在云计算☁️、容器化📦和网络功能虚拟化(NFV)环境中。
Linux虚拟网络设备:底层原理与性能优化深度解析
|
22天前
|
Linux 网络虚拟化 虚拟化
Linux虚拟网络设备深度解析:使用场景、分类与开发者指南
Linux虚拟网络设备支撑着各种复杂的网络需求和配置,从基础的网络桥接到高级的网络隔离和加密🔐。以下是对主要Linux虚拟网络设备的介绍、它们的作用以及适用场景的概览,同时提出了一种合理的分类,并指出应用开发人员应该着重掌握的设备。
Linux虚拟网络设备深度解析:使用场景、分类与开发者指南
|
23天前
|
安全 Linux API
Linux设备模型统一:桥接硬件多样性与应用程序开发的关键
在Linux的宏大世界中,各种各样的硬件设备如星辰般繁多。从常见的USB设备到复杂的网络接口卡,从嵌入式设备到强大的服务器,Linux需要在这些差异极大的硬件上运行。这就引出了一个问题:Linux是如何统一这些不同硬件的设备模型的呢?本文将探讨Linux是如何针对不同的硬件统一设备模型的,这一统一的设备模型对于应用程序开发人员来说又有何意义。让我们一探究竟🕵️‍♂️。
Linux设备模型统一:桥接硬件多样性与应用程序开发的关键
|
2月前
|
算法 Linux 测试技术
Linux C++开发中的代码优化之道:把握时机与策略
Linux C++开发中的代码优化之道:把握时机与策略
49 0
|
11天前
|
Unix Linux Shell
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
在Linux环境下交叉编译Android所需的FFmpeg so库,首先下载`android-ndk-r21e`,然后解压。接着,上传FFmpeg及相关库(如x264、freetype、lame)源码,修改相关sh文件,将`SYSTEM=windows-x86_64`改为`SYSTEM=linux-x86_64`并删除回车符。对x264的configure文件进行修改,然后编译x264。同样编译其他第三方库。设置环境变量`PKG_CONFIG_PATH`,最后在FFmpeg源码目录执行配置、编译和安装命令,生成的so文件复制到App工程指定目录。
43 9
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
|
22天前
|
Cloud Native Linux 网络虚拟化
深入理解Linux veth虚拟网络设备:原理、应用与在容器化架构中的重要性
在Linux网络虚拟化领域,虚拟以太网设备(veth)扮演着至关重要的角色🌐。veth是一种特殊类型的网络设备,它在Linux内核中以成对的形式存在,允许两个网络命名空间之间的通信🔗。这篇文章将从多个维度深入分析veth的概念、作用、重要性,以及在容器和云原生环境中的应用📚。
深入理解Linux veth虚拟网络设备:原理、应用与在容器化架构中的重要性
|
23天前
|
监控 中间件 Linux
深入Linux设备模型:开发者指南
Linux的设备模型是操作系统管理硬件设备的一种高级抽象,它不仅涉及到设备驱动程序的加载和卸载,还包括设备之间的关系、设备的状态管理以及与用户空间通信的机制。理解Linux的设备模型对于应用开发人员来说至关重要,它有助于开发出更加稳定、高效的应用程序。🌟
深入Linux设备模型:开发者指南
|
1天前
|
前端开发 Linux iOS开发
【Flutter前端技术开发专栏】Flutter在桌面应用(Windows/macOS/Linux)的开发实践
【4月更文挑战第30天】Flutter扩展至桌面应用开发,允许开发者用同一代码库构建Windows、macOS和Linux应用,提高效率并保持平台一致性。创建桌面应用需指定目标平台,如`flutter create -t windows my_desktop_app`。开发中注意UI适配、性能优化、系统交互及测试部署。UI适配利用布局组件和`MediaQuery`,性能优化借助`PerformanceLogging`、`Isolate`和`compute`。
【Flutter前端技术开发专栏】Flutter在桌面应用(Windows/macOS/Linux)的开发实践
|
3天前
|
存储 监控 Linux
【专栏】如何在 Linux 中列出已安装的驱动器?
【4月更文挑战第28天】在 Linux 中,了解已安装驱动器是系统管理的关键。本文介绍了三种方法:1) 使用 `lsblk` 命令显示设备名、大小和类型;2) `fdisk -l` 命令提供详细分区信息;3) `gnome-disks` 等系统管理工具展示驱动器信息。此外,还讨论了驱动器类型识别、挂载点概念及其应用。通过这些方法,用户能有效地监控和管理 Linux 系统中的驱动器。

热门文章

最新文章