作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生在读,研究方向无线联邦学习
擅长领域:驱动开发,嵌入式软件开发,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 910 11 12 13 14 15 16 17 18 1920 21 22 23 24 25 26 27 28 2930 31 32 33 34 35 36 37 38 3940 41 42 43 44 45 46 47 48 4950 51 52 53 54 55 56 57 58 5960 61 62 63 64 65 66 67 68 6970 71 72 73 74 75 76 77 78 7980 81 82 83 84 85 86 87 88 8990 91 92 93 94 95 96 97 98 99100>;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 40modes: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: preferredprops:1 EDID:flags: immutable blobblobs:value:2 DPMS:flags: enumenums: On=0 Standby=1 Suspend=2 Off=3value: 05 link-status:flags: enumenums: Good=0 Bad=1value: 06 non-desktop:flags: immutable rangevalues: 0 1value: 04 TILE:flags: immutable blobblobs: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: preferredprops:24 VRR_ENABLED:flags: rangevalues: 0 1value: 0
Planes:
id crtc fb CRTC x,y x,y gamma size possible crtcs
34 36 45 0,0 0,0 0 0x00000002formats: XR24 AR24 RG16 XB24 AB24 AR15 XR15props:8 type:flags: immutable enumenums: Overlay=0 Primary=1 Cursor=2value: 135 zpos:flags: immutable rangevalues: 0 0value: 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