作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生在读,研究方向无线联邦学习
擅长领域:驱动开发,嵌入式软件开发,BSP开发
作者主页:一个平凡而乐于分享的小比特的个人主页
文章收录专栏:IMX8MP,本专栏记录imx8mp开发板,学习开发过程中的问题及解决方法记录
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖
LCD 显示–lvds
该lcd详细技术文档,请下载:lvds lcd
1.基础知识
1.1 lcd
下图是LCD各个参数对应的位置:
显示mode 各个参数含义如下:
hdisplay:有效显示区水平像素数量,对应Active Width
hsync_start:水平同步开始,对应hdispay + HFP
hsync_end:水平同步结束,对应hdisplay + HFP + HSYNC width(HPW)
htotal:水平总像素,对应hdisplay + HFP + HSYNC width + HBP
vdisplay:垂直显示像素,对应Active Height
vsync_start:垂直同步开始,对应vdispay + VFP
vsync_end:垂直像素结束,对应vdisplay + VFP + VSYNC width(VPW)
vtotal:垂直总像素,对应vdisplay + VFP + VSYNC width + VBP
vrefresh:刷新率
1.2 lvds
LVDS(Low Voltage Differential Signaling,即低电压差分信号)接口又称RS-644总线接口,是20世纪90年代才提出的一种数据传输和接口技术。
LVDS接口是美国NS美国国家半导体公司为克服以TTL电平方式传输宽带高码率数据时功耗大,电磁干扰大等缺点而研制的一种数字视频信号传输方式。由于其采用低压和低电流驱动方式,因此,实现了低噪声和低功耗。LVDS技术具有低功耗、低误码率、低串扰和低辐射等特点,其传输介质可以是铜质的PCB连线,也可以是平衡电缆。LVDS在对信号完整性、低抖动及共模特性要求较高的系统中得到了越来越广泛的应用,常见于液晶电视中。
2.原理图
3.设备数添加
lvds0_panel {
compatible = "boe,ev121wxm-n10-1850";
backlight = <&lvds_backlight>;
port {
panel_lvds_in: endpoint {
remote-endpoint = <&lvds_out>;
};
};
};
lvds_backlight: lvds_backlight {
compatible = "pwm-backlight";
pwms = <&pwm2 0 100000 0>;
status = "okay";
enable-gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>;
brightness-levels = < 0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49
50 51 52 53 54 55 56 57 58 59
60 61 62 63 64 65 66 67 68 69
70 71 72 73 74 75 76 77 78 79
80 81 82 83 84 85 86 87 88 89
90 91 92 93 94 95 96 97 98 99
100>;
default-brightness-level = <80>;
};
&pwm2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_pwm2>;
status = "okay";
};
&lcdif2 {
status = "okay";
};
&ldb {
status = "okay";
lvds-channel@0 {
fsl,data-mapping = "spwg";
fsl,data-width = <24>;
status = "okay";
port@1 {
reg = <1>;
lvds_out: endpoint {
remote-endpoint = <&panel_lvds_in>;
};
};
};
};
&ldb_phy {
status = "okay";
};
&lcdif1 {
status = "okay";
};
pinctrl_pwm2: pwm2grp {
fsl,pins = <
MX8MP_IOMUXC_GPIO1_IO11__PWM2_OUT 0x116
>;
};
因为我们的lcd显示屏也是京东方公司的产品,在/drivers/gpu/drm/panel/panel-simple.c文件,搜索boe
,会找到一个与我们所使用lcd参数很相似的产品boe,ev121wxm-n10-1850
static const struct drm_display_mode boe_ev121wxm_n10_1850_mode = {
.clock = 71143,
.hdisplay = 1280,
.hsync_start = 1280 + 48,
.hsync_end = 1280 + 48 + 32,
.htotal = 1280 + 48 + 32 + 80,
.vdisplay = 800,
.vsync_start = 800 + 3,
.vsync_end = 800 + 3 + 6,
.vtotal = 800 + 3 + 6 + 14,
};
static const struct panel_desc boe_ev121wxm_n10_1850 = {
.modes = &boe_ev121wxm_n10_1850_mode,
.num_modes = 1,
.bpc = 8,
.size = {
.width = 261,
.height = 163,
},
.delay = {
.prepare = 8,
.enable = 300,
.unprepare = 300,
.disable = 60,
},
.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
.bus_flags = DRM_BUS_FLAG_DE_HIGH,
.connector_type = DRM_MODE_CONNECTOR_LVDS,
};
对比一下我们的lcd屏幕参数,会发现几乎差不多,是同个厂家生产的产品,几乎是兼容的,于是我们在设备数中添加compatible = "boe,ev121wxm-n10-1850"
与其兼容。
4.实物图及其接线
lcd屏背面
5.实验测试
5.1 启动显示
开机,屏幕显示终端信息:
/dev目录下出现fb0
在/sys/kernel/debug/dri/0目录下有LVDS-1
5.2 使用modetest工具进行DRM测试
查看DRM驱动名称为imx-drm:
root@igkboard:/sys/kernel/debug/dri/0# cat /sys/class/drm/card0/device/uevent
DRIVER=imx-drm
OF_NAME=display-subsystem
OF_FULLNAME=/display-subsystem
OF_COMPATIBLE_0=fsl,imx-display-subsystem
OF_COMPATIBLE_N=1
MODALIAS=of:Ndisplay-subsystemT(null)Cfsl,imx-display-subsystem
DRIVER=imx-drm
:指示使用的驱动程序是 imx-drm,这是用于i.MX处理器的DRM(Direct Rendering Manager)驱动。OF_NAME=display-subsystem
:设备树中的节点名称是 display-subsystem,表示这是显示子系统的一部分。OF_FULLNAME=/display-subsystem
:设备树中的完整路径是 /display-subsystem,这是设备在设备树中的位置。OF_COMPATIBLE_0=fsl,imx-display-subsystem
:设备的兼容性信息,指示这是适用于Freescale(现在的NXP)i.MX平台的显示子系统。MODALIAS=of:Ndisplay-subsystemT(null)Cfsl,imx-display-subsystem
:这是一个模块别名,用于在Linux系统中标识设备和其对应的设备树节点。
查看DRM驱动connectors信息:
Connectors:
id encoder status name size (mm) modes encoders
41 40 connected LVDS-1 261x163 1 40
modes:
index name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot
#0 1280x800 60.03 1280 1328 1360 1440 800 803 809 823 71143 flags: ; type: preferred
props:
1 EDID:
flags: immutable blob
blobs:
value:
2 DPMS:
flags: enum
enums: On=0 Standby=1 Suspend=2 Off=3
value: 0
5 link-status:
flags: enum
enums: Good=0 Bad=1
value: 0
6 non-desktop:
flags: immutable range
values: 0 1
value: 0
4 TILE:
flags: immutable blob
blobs:
value:
连接器信息
显示了连接器的属性和详情:
- ID 41:
- 编码器 (encoder): 40
- 连接状态 (status): 已连接 (connected)
- 名称 (name): LVDS-1
- 尺寸 (size): 261 毫米 x 163 毫米
- 支持的模式 (modes): 1 种
- 编码器 (encoders): 40
支持的模式
列出了支持的显示模式:
- 模式 0:
- 名称: 1280x800
- 刷新率 (refresh): 60.03 Hz
- 水平显示参数: 1280 1328 1360 1440
- 垂直显示参数: 800 803 809 823
- 总计参数: 71143
- 属性:
- EDID: 不可更改的二进制数据块
- DPMS: 当前状态为 “On” (开启)
- 连接状态: 连接良好
- 非桌面显示: 否
- TILE: 不可更改的二进制数据块
查看DRM驱动CRTs和plans信息:
root@igkboard:/sys/class/drm/card0/device# modetest -M imx-drm -p
CRTCs:
id fb pos size
36 45 (0,0) (1280x800)
#0 1280x800 60.03 1280 1328 1360 1440 800 803 809 823 71143 flags: ; type: preferred
props:
24 VRR_ENABLED:
flags: range
values: 0 1
value: 0
Planes:
id crtc fb CRTC x,y x,y gamma size possible crtcs
34 36 45 0,0 0,0 0 0x00000002
formats: XR24 AR24 RG16 XB24 AB24 AR15 XR15
props:
8 type:
flags: immutable enum
enums: Overlay=0 Primary=1 Cursor=2
value: 1
35 zpos:
flags: immutable range
values: 0 0
value: 0
CRTCs (显示控制器管道)
显示了与显示控制器管道相关的信息:
CRTC ID 36
- 帧缓冲 (fb): 45
- 位置 (pos): (0,0)
- 尺寸 (size): (1280x800)
该 CRTC 连接到一个显示设备,显示分辨率为 1280x800。
Planes (平面)
显示了与显示平面相关的信息:
平面 ID 34
- 关联 CRTC (crtc): 36
- 帧缓冲 (fb): 45
- CRTC 坐标 (CRTC x,y): (0,0)
- 平面坐标 (x,y): (0,0)
- 伽马大小 (gamma size): 0
- 可能的 CRTCs: 0x00000002
支持的格式 (formats):
- XR24, AR24, RG16, XB24, AB24, AR15, XR15
属性 (props):
- 类型 (type):
- 不可变枚举类型: 表示平面类型,可能是 Overlay (叠加层)、Primary (主显示)、Cursor (光标)。
- 值为 1: 表示当前为主显示。
- zpos:
- 不可变范围: 表示平面的 Z 轴位置。
- 值为 0: 表示当前 Z 轴位置为 0。
5.3 花屏显示
modetest -M imx-drm -D 1 -a -s 41@36:1280x800 -P 34@36:1280x800
-P <plane_id>@<crtc_id>:<w>x<h>[+<x>+<y>][*<scale>][@<format>] set a plane
-s <connector_id>[,<connector_id>][@<crtc_id>]:[#<mode index>]<mode>[-<vrefresh>][@<format>] set a mode