当前位置: 首页 > news >正文

6.5物联网RK3399项目开发实录-驱动开发之LCD显示屏使用(wulianjishu666)

90款行业常用传感器单片机程序及资料【stm32,stc89c52,arduino适用】

链接:https://pan.baidu.com/s/1M3u8lcznKuXfN8NRoLYtTA?pwd=c53f 
========================================================

LCD使用

简介

AIO-3399J开发板外置了两个LCD屏接口,一个是EDP,一个是LVDS,接口对应板子上的位置如下图:

_images/lcd_interface.jpg

LVDS屏

DTS配置

引脚配置

AIO-3399J的SDK有LVDS DSI的DTS文件:kernel/arch/arm64/boot/dts/rockchip/rk3399-firefly-aio-lvds.dts,从该文件中我们可以看到以下语句:

/ {model = "AIO Board lvds (Android)";compatible = "rockchip,android", "rockchip,rk3399-firefly-lvds", "rockchip,rk3399";test-power {status = "okay";};...&dsi {status = "okay";dsi_panel: panel {compatible ="simple-panel-dsi";reg = <0>;//ddc-i2c-bu//power-supply = <&vcc_lcd>;//pinctrl-0 = <&lcd_panel_reset &lcd_panel_enable>;backlight = <&backlight>;/*enable-gpios = <&gpio1 1 GPIO_ACTIVE_LOW>;reset-gpios = <&gpio4 29 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>;//bus-format = <MEDIA_BUS_FMT_RGB666_1X18>;dsi,lanes = <4>;dsi,channel = <0>;enable-delay-ms = <35>;prepare-delay-ms = <6>;unprepare-delay-ms = <0>;disable-delay-ms = <20>;size,width = <120>;size,height = <170>;status = "okay";...power_ctr: power_ctr {rockchip,debug = <0>;lcd_pwr_en: lcd-pwr-en {gpios = <&gpio3 16 GPIO_ACTIVE_HIGH>;pinctrl-names = "default";pinctrl-0 = <&lcd_panel_pwr_en>;rockchip,delay = <10>;};lcd_rst: lcd-rst {gpios = <&gpio2 27 GPIO_ACTIVE_HIGH>;pinctrl-names = "default";pinctrl-0 = <&lcd_panel_reset>;rockchip,delay = <6>;};};...&pinctrl {lcd-panel {lcd_panel_reset: lcd-panel-reset {rockchip,pins = <2 27 RK_FUNC_GPIO &pcfg_pull_down>;};lcd_panel_pwr_en: lcd-panel-pwr-en {rockchip,pins = <3 16 RK_FUNC_GPIO &pcfg_pull_down>;};};
};

这里定义了LCD的电源控制引脚:

lcd_pwr_en:(GPIO3_C0)GPIO_ACTIVE_HIGH
lcd_rst:(GPIO2_D3)GPIO_ACTIVE_HIGH

都是高电平有效,具体的引脚配置请参考《GPIO》一节。

配置背光

AIO-3399J开发板外置了一个背光接口用来控制屏幕背光,如下图所示:

_images/lcd_back_light.jpg

在DTS文件:kernel/arch/arm64/boot/dts/rockchip/rk3399-firefly-core.dtsi中配置了背光信息,如下:

/ {compatible = "rockchip,rk3399-firefly-core", "rockchip,rk3399";backlight: backlight {status = "disabled";compatible = "pwm-backlight";pwms = <&pwm0 0 25000 0>;brightness-levels = <0   1   2   3   4   5   6   78   9  10  11  12  13  14  1516  17  18  19  20  21  22  2324  25  26  27  28  29  30  3132  33  34  35  36  37  38  3940  41  42  43  44  45  46  4748  49  50  51  52  53  54  5556  57  58  59  60  61  62  6364  65  66  67  68  69  70  7172  73  74  75  76  77  78  7980  81  82  83  84  85  86  8788  89  90  91  92  93  94  9596  97  98  99 100 101 102 103104 105 106 107 108 109 110 111112 113 114 115 116 117 118 119120 121 122 123 124 125 126 127128 129 130 131 132 133 134 135136 137 138 139 140 141 142 143144 145 146 147 148 149 150 151152 153 154 155 156 157 158 159160 161 162 163 164 165 166 167168 169 170 171 172 173 174 175176 177 178 179 180 181 182 183184 185 186 187 188 189 190 191192 193 194 195 196 197 198 199200 201 202 203 204 205 206 207208 209 210 211 212 213 214 215216 217 218 219 220 221 222 223224 225 226 227 228 229 230 231232 233 234 235 236 237 238 239240 241 242 243 244 245 246 247248 249 250 251 252 253 254 255>;default-brightness-level = <200>;
};

pwms属性:配置PWM,范例里面默认使用pwm0,25000ns是周期(40 KHz)。LVDS需要加背光电源控制脚,在kernel/arch/arm64/boot/dts/rockchip/rk3399-firefly-aio-lvds.dts中可以看到以下语句:

&backlight {status = "okay";enable-gpios = <&gpio1 1 GPIO_ACTIVE_HIGH>;brightness-levels = < 150 151152 153 154 155 156 157 158 159160 161 162 163 164 165 166 167168 169 170 171 172 173 174 175176 177 178 179 180 181 182 183184 185 186 187 188 189 190 191192 193 194 195 196 197 198 199200 201 202 203 204 205 206 207208 209 210 211 212 213 214 215216 217 218 219 220 221 222 223224 225 226 227 228 229 230 231232 233 234 235 236 237 238 239240 241 242 243 244 245 246 247248 249 250 251 252 253 254 255>;
};

因此使用时需修改DTS文件。

brightness-levels属性:配置背光亮度数组,最大值为255,配置暗区和亮区,并把亮区数组做255的比例调节。比如范例中暗区是255-221,亮区是220-0。 default-brightness-level属性:开机时默认背光亮度,范围为0-255。 具体请参考kernel中的说明文档:kernel/Documentation/devicetree/bindings/leds/backlight/pwm-backlight.txt

配置显示时序

与EDP屏不同,LVDS屏的 Timing 写在DTS文件中,在kernel/arch/arm64/boot/dts/rockchip/rk3399-firefly-aio-lvds.dts中可以看到以下语句:

disp_timings: display-timings {native-mode = <&timing0>;timing0: timing0 {clock-frequency = <80000000>;hactive = <768>;vactive = <1024>;hsync-len = <20>;   //20, 50hback-porch = <130>; //50, 56hfront-porch = <150>;//50, 30vsync-len = <40>;vback-porch = <130>;vfront-porch = <136>;hsync-active = <0>;vsync-active = <0>;de-active = <0>;pixelclk-active = <0>;};}
}

时序属性参考下图:

_images/lcd_sequence.jpg

Init Code

lvds屏上完电后需要发送初始化指令才能使之工作。初始化指令需要以下工具文档生成,下载TC358764_5_774_5XBG_DSI-LVDS_Tv11p_nm_1280x800.xls

如何配置LVDS panel-init-sequence

以1280x800单lvds为例: 首先打开TC358764_5_774_5XBG_DSI-LVDS_Tv11p_nm_1280x800.xls 

_images/page.png

 选择页面”Timing Parameters_SYNC_EVENT”,按照LVDS屏的时序填入LVDS timing黄色单元,一般只需填入以下单元即可。

  • HPW / HBPR / HDISPR / HFPR 分别对应 hsync-len / hback-porch / hactive / hfront-porch

  • VPW / VBPR / VDISPR / VFPR 分别对应 vhsync-len / vback-porch / vactive / vfront-porch

LVDS timing填入完成后还需配置常规参数 

_images/parameter.png

  • 1.根据LVDS屏规格书确认LVDS Link和LVDS output format并选择屏的参数。

  • 2.计算LVDS clock(蓝色单元无法写入,需要黄色单元自动计算得出),需要填入DSI Clock(HOST), Pixel Clock Source, Pixel Clock Divider。计算公式如下:DSI Clock/Pixel Clock Source/Pixel Clock Divider=LVDS Clock

填入上述黄色单元基本上完成配置,接下来选择页面”Source”即可看到转换后的Comment 

_images/source.png

 以上面为例”013C 00030005”,mipi command就应该是”29 02 06 3C 01 05 00 03 00”

  • 29 : packet ID

  • 02 : 2ms delay

  • 06 : 6 bytes

  • 3C 01 : address = 0x013C

  • 00 03 00 05 : data=0x05000300

将页面source所有地址写入数据,即可完成初始化指令panel-init-sequence。

dts在kernel/arch/arm64/boot/dts/rockchip/rk3399-firefly-aio-lvds.dts中可以看到lvds的初始化指令列表:

&dsi {status = "okay";...panel-init-sequence = [29 00 06 3C 01 09 00 07 0029 00 06 14 01 06 00 00 0029 00 06 64 01 0B 00 00 0029 00 06 68 01 0B 00 00 0029 00 06 6C 01 0B 00 00 0029 00 06 70 01 0B 00 00 0029 00 06 34 01 1F 00 00 0029 00 06 10 02 1F 00 00 0029 00 06 04 01 01 00 00 0029 00 06 04 02 01 00 00 0029 00 06 50 04 20 01 F0 0329 00 06 54 04 32 00 B4 0029 00 06 58 04 80 07 48 0029 00 06 5C 04 0A 00 19 0029 00 06 60 04 38 04 0A 0029 00 06 64 04 01 00 00 0029 01 06 A0 04 06 80 44 0029 00 06 A0 04 06 80 04 0029 00 06 04 05 04 00 00 0029 00 06 80 04 00 01 02 0329 00 06 84 04 04 07 05 0829 00 06 88 04 09 0A 0E 0F29 00 06 8C 04 0B 0C 0D 1029 00 06 90 04 16 17 11 1229 00 06 94 04 13 14 15 1B29 00 06 98 04 18 19 1A 0629 02 06 9C 04 33 04 00 00];panel-exit-sequence = [05 05 01 2805 78 01 10];...
};

命令格式以及说明可参考以下附件: Rockchip DRM Panel Porting Guide.pdf

  • kernel 发送指令可以看到在kernel/drivers/gpu/drm/panel/panel-simple.c文件中的操作:

static int panel_simple_enable(struct drm_panel *panel)
{struct panel_simple *p = to_panel_simple(panel);int err;if (p->enabled)return 0;DBG("enter\n");if (p->on_cmds) {err = panel_simple_dsi_send_cmds(p, p->on_cmds);if (err)dev_err(p->dev, "failed to send on cmds\n");}if (p->desc && p->desc->delay.enable) {DBG("p->desc->delay.enable=%d\n", p->desc->delay.enable);msleep(p->desc->delay.enable);}if (p->backlight) {DBG("open backlight\n");p->backlight->props.power = FB_BLANK_UNBLANK;backlight_update_status(p->backlight);}p->enabled = true;return 0;
}
  • u-boot

发送指令可以看到在u-boot/drivers/video/rockchip-dw-mipi-dsi.c文件中的操作:

static int rockchip_dw_mipi_dsi_enable(struct display_state *state)
{struct connector_state *conn_state = &state->conn_state;struct crtc_state *crtc_state = &state->crtc_state;const struct rockchip_connector *connector = conn_state->connector;const struct dw_mipi_dsi_plat_data *pdata = connector->data;struct dw_mipi_dsi *dsi = conn_state->private;u32 val;DBG("enter\n");dw_mipi_dsi_set_mode(dsi, DW_MIPI_DSI_VID_MODE);dsi_write(dsi, DSI_MODE_CFG, ENABLE_CMD_MODE);dw_mipi_dsi_set_mode(dsi, DW_MIPI_DSI_VID_MODE);if (!pdata->has_vop_sel)return 0;if (pdata->grf_switch_reg) {if (crtc_state->crtc_id)val = pdata->dsi0_en_bit | (pdata->dsi0_en_bit << 16);elseval = pdata->dsi0_en_bit << 16;writel(val, RKIO_GRF_PHYS + pdata->grf_switch_reg);}debug("vop %s output to dsi0\n", (crtc_state->crtc_id) ? "LIT" : "BIG");//rockchip_dw_mipi_dsi_read_allregs(dsi);return 0;
}
常见问题
1. 画面抖动闪屏

排查屏参数是否超出屏规格书限定周期,排查屏时钟大小。”Timing Parameters_SYNC_EVENT”所有参数变动必须和comment同步调整。

2. 颜色显示异常

尝试同步调整color mapping或者lvds timing。

NOTE: 页面”How to use”有详细步骤,其他参数说明可以参考文档”页面”菜单。

相关文章:

6.5物联网RK3399项目开发实录-驱动开发之LCD显示屏使用(wulianjishu666)

90款行业常用传感器单片机程序及资料【stm32,stc89c52,arduino适用】 链接&#xff1a;https://pan.baidu.com/s/1M3u8lcznKuXfN8NRoLYtTA?pwdc53f LCD使用 简介 AIO-3399J开发板外置了两个LCD屏接口&#xff0c;一个是EDP&#xff0c;一个是LVDS&#xff0c;接口对应板…...

「Android高级工程师」BAT大厂面试基础题集合-下-Github标星6-5K

C、 com.android.provider.contact D、 com.android.provider.contacts 11.下面关于ContentProvider描述错误的是&#xff08;&#xff09;。 A、 ContentProvider可以暴露数据 B、 ContentProvider用于实现跨程序共享数据 C、 ContentProvider不是四大组件 D、 ContentP…...

【算法】基数排序

简介 基数排序&#xff08;*Radix sort&#xff09;是一种非比较排序算法&#xff08;non-comparative sorting algorithm&#xff09;。现代计算机的基数排序算法由 计数排序 算法的开发人哈罗德H西华德&#xff08;Harold H. Seward&#xff09;于1954年于麻省理工大学开发。…...

2核2G服务器优惠价格轻量61元一年,CVM价格313元15个月

腾讯云2核2G服务器多少钱一年&#xff1f;轻量服务器61元一年&#xff0c;CVM 2核2G S5服务器313.2元15个月&#xff0c;轻量2核2G3M带宽、40系统盘&#xff0c;云服务器CVM S5实例是2核2G、50G系统盘。腾讯云2核2G服务器优惠活动 txybk.com/go/txy 链接打开如下图&#xff1a;…...

不同Python版本和wxPython版本用pyinstaller打包文件大小对比

1、确定wxPython和Python版本的对应关系 在这里可以找到Python支持的所有wxPython版本&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple/wxpython/ 由于Python从3.6版本开始支持f字符串、从3.9版本开始不支持Windows7操作系统&#xff0c;所以我仅筛选3.6-3.8之间的版本…...

【C语言】结构体详解(一)

目录 1、什么是结构体? 2、结构体成分 3、结构体变量的定义与初始化 3.1、结构体变量的三种定义方式 3.2、结构体变量的初始化 4、结构体成员的访问&#xff08;两种方式&#xff09; 4.1、直接访问 4.2、间接访问 5、结构的特殊声明 5.1、不完全声明&#xff08;匿…...

AI时代-普通人的AI绘画工具对比(Midjouney与Stable Diffusion)

AI时代-普通人的AI绘画工具对比&#xff08;Midjouney与Stable Diffusion&#xff09; 前言1、基础对比Stable Diffusion&#xff08;SD&#xff09;SD界面安装与使用SD Midjouney&#xff08;MJ&#xff09; 2、硬件与运行要求对比Stable Diffusion硬件要求内存硬盘显卡 Midjo…...

【蓝桥杯】矩阵快速幂

一.快速幂概述 1.引例 1&#xff09;题目描述&#xff1a; 求A^B的最后三位数表示的整数&#xff0c;A^B表示&#xff1a;A的B次方。 2&#xff09;思路&#xff1a; 一般的思路是&#xff1a;求出A的B次幂&#xff0c;再取结果的最后三位数。但是由于计算机能够表示的数字…...

C语言使用STM32开发板手搓高端家居洗衣机

目录 概要 成品效果 背景概述 1.开发环境 2.主要传感器。 技术细节 1. 用户如何知道选择了何种功能 2.启动后如何进行洗衣 3.如何将洗衣机状态上传至服务器并通过APP查看 4.洗衣过程、可燃气检测、OLED屏显示、服务器通信如何并发进行 小结 概要 本文章主要是讲解如…...

【Hello,PyQt】QTextEdit和QSplider

PyQt5 是一个强大的Python库&#xff0c;用于创建图形用户界面&#xff08;GUI&#xff09;。其中&#xff0c;QTextEdit 控件作为一个灵活多用的组件&#xff0c;常用于显示和编辑多行文本内容&#xff0c;支持丰富的格式设置和文本操作功能。另外&#xff0c;QSlider 控件是一…...

【力扣】191.位 1 的个数、485.最大连续 1 的个数

191.位 1 的个数 题目描述 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中 设置位 的个数&#xff08;也被称为汉明重量&#xff09;。 示例 1&#xff1a; 输入&#xff1a;n 11 输出&#xff1…...

蓝桥杯 java 承压计算

题目: 思路&#xff1a; 1&#xff1a;其中的数字代表金属块的重量(计量单位较大) 说明每个数字后面不一定有多少个0 2&#xff1a;假设每块原料的重量都十分精确地平均落在下方的两个金属块上&#xff0c;最后&#xff0c;所有的金属块的重量都严格精确地平分落在最底层的电子…...

leetcode268-Missing Number

这道题目要求缺失的数字&#xff0c;一般解决数组的问题&#xff0c;要么往排序数组&#xff0c;要么往双指针遍历这些方向上靠&#xff0c;要么往异或方向上靠&#xff0c;总之落点无非就只有这几个。我们要求缺失的数字&#xff0c;可以依次让1&#xff5e;n和数组元素进行异…...

【jenkins+cmake+svn管理c++项目】jenkins回传文件到svn(windows)

书接上文&#xff1a;创建一个项目 在经过cmakemsbuild顺利生成动态库之后&#xff0c;考虑到我一个项目可能会生成多个动态库&#xff0c;它们分散在build内的不同文件夹&#xff0c;我希望能将它们收拢到一个文件夹下&#xff0c;并将其回传到svn。 一、动态库移位—cmake实…...

数据结构·二叉树(2)

目录 1 堆的概念 2 堆的实现 2.1 堆的初始化和销毁 2.2 获取堆顶数据和堆的判空 2.3 堆的向上调整算法 2.4 堆的向下调整算法 2.4 堆的插入 2.5 删除堆顶数据 2.6 建堆 3 建堆的时间复杂度 3.1 向上建堆的时间复杂度 3.2向下建堆的时间复杂度 4 堆的排序 前言&…...

MATLAB算法实战应用案例精讲-【毕业季论文专用】人工智能视觉检测技术及其在实际应用中的挑战与前景

目录 摘要: 第一章:引言 1.1 研究背景 1.2 研究目的与意义...

Linux虚拟机环境搭建spark

Linux环境搭建Spark分为两个版本&#xff0c;分别是Scala版本和Python版本。 一、 安装Pyspark 本环境以 Python 环境为例。 1、下载spark 下载网址&#xff1a;https://archive.apache.org/dist/spark 下载安装包&#xff1a;根据自己环境选择合适版本&#xff0c;本环境…...

STL的string容器

string基本概念 string是C风格的字符串&#xff0c;本质上是一个类。 string 和 char* 的区别 char* 是一个指针&#xff1b; string是一个类&#xff0c;内部封装了 char* &#xff0c;用来管理字符串&#xff0c;是一个 char* 型的容器。 特点 string内部封装了很多成员…...

半导体工艺技术

完整内容点击&#xff1a;【半导体工艺技术】...

acwing算法提高之图论--单源最短路的扩展应用

目录 1 介绍2 训练 1 介绍 本专题用来记录使用。。。。 2 训练 题目1&#xff1a;1137选择最佳线路 C代码如下&#xff0c; #include <iostream> #include <cstring> #include <algorithm> #include <queue>using namespace std;const int N 101…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...