RK3566恢复显示屏异常显示的方法
设备进行EMI静电测试时,LCD显示屏异常之后不能恢复,需要在软件上检测LCD是否处于工作状态,如果没有处于工作状态,则需要重启LCD。
如何确定LCD是否处于工作状态?
参照SDK docs/Common/DISPLAY路径下的Rockchip_DRM_Panel_Porting_Guide_V1.6_20190228.pdf》文档,其中3.4章节提到了如何判断MIPI-DSI外设有正常工作?瑞芯微也为此申请了专利。
drivers/gpu/drm/drm_mipi_dsi.c
kernel/include/drm/drm_mipi_dsi.h
提供了对 MIPI-DSI 外设通信的相关 API。
支持 DCS 标准 MIPI_DCS_GET_POWER_MODE(0x0A)命令的外设,可以通过读取 power_mode 来判断,函数mipi_dsi_dcs_get_power_mode() - query the display module's current power mode。mode=0x08 说 明 设 备 目 前 是 OFF 状 态,mode=0x9c,说明设备目前是 ON 状态。
驱动说明文档<rockchip_drm_integration_helper-zh.pdf>
# echo off > /sys/class/drm/card0-DSI-1/status
# echo on > /sys/class/drm/card0-DSI-1/status
修改驱动,启动时获取power_mode
..\x3566_linux_v1.2.0\kernel\drivers\gpu\drm\panel\panel-simple.c文件,在static int panel_simple_dsi_probe(struct mipi_dsi_device *dsi)函数中增加读取液晶状态的函数:
static int panel_simple_dsi_probe(struct mipi_dsi_device *dsi)
{struct panel_simple *panel;struct device *dev = &dsi->dev;const struct panel_desc_dsi *desc;struct panel_desc_dsi *d;const struct of_device_id *id;int err;u8 mode;id = of_match_node(dsi_of_match, dsi->dev.of_node);if (!id)return -ENODEV;dev_info(dev, "panel_simple_dsi_probe\n");if (!id->data) {d = devm_kzalloc(dev, sizeof(*d), GFP_KERNEL);if (!d)return -ENOMEM;err = panel_simple_dsi_of_get_desc_data(dev, d);if (err) {dev_err(dev, "failed to get desc data: %d\n", err);return err;}}desc = id->data ? id->data : d;err = panel_simple_probe(&dsi->dev, &desc->desc);if (err < 0)return err;panel = dev_get_drvdata(dev);panel->dsi = dsi;dsi->mode_flags = desc->flags;dsi->format = desc->format;dsi->lanes = desc->lanes;++ /* user add begin */
++ if(dsi)
++ {
++ err = mipi_dsi_dcs_get_power_mode( dsi, &mode);
++ dev_info( dev, "get_power_mode err=%d, mode=%02x\n", err, mode );
++ }
++ /* user add end */err = mipi_dsi_attach(dsi);if (err) {struct panel_simple *panel = dev_get_drvdata(&dsi->dev);drm_panel_remove(&panel->base);}return err;
}
启动时没有连接屏幕,打印如下:
[root@RK356X:/]# dmesg | grep get_power_mode
[ 0.267272] panel-simple-dsi fe060000.dsi.0: get_power_mode err=-110, mode=02
启动时连接了屏幕,打印如下:
[root@RK356X:/]# dmesg | grep get_power_mode
[ 0.268318] panel-simple-dsi fe060000.dsi.0: get_power_mode err=0, mode=9c
设备运行过程中定时查询屏幕状态
在panel-simple.c文件中增加一个内核线程函数,每5s读取一次power_mode:
static int kthread_checkLCDstatus_func(void * data)
{struct mipi_dsi_device *dsi = (struct mipi_dsi_device *)data;int err;u8 mode;while (!kthread_should_stop()) { err = mipi_dsi_dcs_get_power_mode( dsi, &mode);dev_info( &dsi->dev, "get_power_mode err=%d, mode=%02x\n", err, mode ); msleep(5000);}return 0;
}
在panel_simple_dsi_probe()函数中创建并运行checkLCDstatus_kthread线程:
static struct task_struct *checkLCDstatus_kthread = NULL;static int panel_simple_dsi_probe(struct mipi_dsi_device *dsi)
{struct panel_simple *panel;struct device *dev = &dsi->dev;const struct panel_desc_dsi *desc;struct panel_desc_dsi *d;const struct of_device_id *id;int err;u8 mode;id = of_match_node(dsi_of_match, dsi->dev.of_node);if (!id)return -ENODEV;if (!id->data) {d = devm_kzalloc(dev, sizeof(*d), GFP_KERNEL);if (!d)return -ENOMEM;err = panel_simple_dsi_of_get_desc_data(dev, d);if (err) {dev_err(dev, "failed to get desc data: %d\n", err);return err;}}desc = id->data ? id->data : d;err = panel_simple_probe(&dsi->dev, &desc->desc);if (err < 0)return err;panel = dev_get_drvdata(dev);panel->dsi = dsi;dsi->mode_flags = desc->flags;dsi->format = desc->format;dsi->lanes = desc->lanes;++ /* user add begin */
++ if(dsi)
++ {
++ err = mipi_dsi_dcs_get_power_mode( dsi, &mode);
++ dev_info( dev, "get_power_mode err=%d, mode=%02x\n", err, mode );++ checkLCDstatus_kthread = kthread_run(kthread_checkLCDstatus_func, dsi, "test_task");
++ }
++ /* user add end */err = mipi_dsi_attach(dsi);if (err) {struct panel_simple *panel = dev_get_drvdata(&dsi->dev);drm_panel_remove(&panel->base);}return err;
}
设备运行过程中,手动复位触发LCD复位,读取的mode重9c变为了08,日志如下:
[ 118.415228] kthread is running
[ 118.418300] panel-simple-dsi fe060000.dsi.0: get_power_mode err=0, mode=9c
[ 123.535187] kthread is running
[ 123.541131] panel-simple-dsi fe060000.dsi.0: get_power_mode err=0, mode=9c
[ 128.655245] kthread is running
[ 128.664003] panel-simple-dsi fe060000.dsi.0: get_power_mode err=0, mode=08
[ 133.775156] kthread is running
[ 133.786790] panel-simple-dsi fe060000.dsi.0: get_power_mode err=0, mode=08
设备运行过程中读取到power_mode为OFF状态时,重启内核
本应该只重启LCD即可,但没有合适的方法,所以直接重启系统,修改kthread_checkLCDstatus_func()函数:
static int kthread_checkLCDstatus_func(void * data)
{struct mipi_dsi_device *dsi = (struct mipi_dsi_device *)data;int err;u8 mode;while (!kthread_should_stop()) { err = mipi_dsi_dcs_get_power_mode( dsi, &mode);dev_info( &dsi->dev, "get_power_mode err=%d, mode=%02x\n", err, mode ); msleep(5000);printk("panel-simple restart kernel\n");kernel_restart(NULL); //linux kernel restart.}return 0;
}
方法不完善,请有这方面经验的朋友指教。
RK3566恢复显示屏异常显示的方法相关推荐
- 电脑计算机怎么没有桌面显示器,显示器无信号,教您电脑显示屏不显示怎么修复...
电脑使用久了,就什么问题都会碰见的,有的用户是看淡了,可是对于电脑新手来说却是一个不小的打击,如果电脑出现一开机显示器就显示无信号,主机运行应该正常,风扇转着,连接线也重新插拔过,怎么解决?下面,小编 ...
- 电脑计算机怎么没有桌面显示器,显示器无信号,详细教您电脑显示屏不显示怎么修复...
电脑现在是越来越普遍了,不过既有甜又有苦,这不有用户就遇到了显示器无信号的情况,这让用户摸不着头脑.相比显示器没有任何显示而言,显示器无信号电脑故障其实更容易解决.那么该怎么去解决呢?下面,小编就来跟 ...
- 适用于Windows11 任务栏开始菜单和图标,资源管理器显示异常修复的方法
Windows11 任务栏开始菜单和图标,资源管理器显示异常修复的方法,适用于Windows开始菜单点不开和使用start11后的任务栏异常.除了禁用驱动程序签名无法正常启动PC. 问题 在卸载完st ...
- 苹果id登录_英雄联盟手游用苹果id登录显示账号异常的解决方法_英雄联盟手游...
不少小伙伴们在登录的时候,发现自己的英雄联盟手游用苹果id登录显示账号异常,这究竟是怎么回事呢,遇到此类LOL手游账号登录异常应该如何解决,这里就来和小伙伴们分享一下此次登录问题的解决方法. 情况一: ...
- 今日头条适配方案造成Dialog显示异常的解决方法
今日头条适配方案造成Dialog显示异常的解决方法 产生问题的原因 由于该适配方案是更改的全局的density, 对整个项目生效,所以在使用第三方View或者系统的的view时,如果和项目中的设计尺寸 ...
- linux 图标显示 异常,在Ubuntu 18.04系统中VSCode图标显示异常的解决方法
以下介绍在Ubuntu 18.04系统中VSCode图标显示异常的解决方法,同时附上在Ubuntu 18.04系统中安装Anaconda3-5.3.0方法.VSCode是一款全平台开发的编辑器,它具有 ...
- HTML文件图标异常Chrome,win7系统任务栏中chrome图标显示异常的解决方法
很多小伙伴都遇到过win7系统任务栏中chrome图标显示异常的困惑吧,一些朋友看过网上零散的win7系统任务栏中chrome图标显示异常的处理方法,并没有完完全全明白win7系统任务栏中chrome ...
- WPF程序在Win7系统下字体显示异常(解决方法记录)
WPF程序在Win7系统下字体显示异常(解决方法记录) 问题描述 WPF程序在大部分客户电脑上正常运行,字体显示正常.仅在某个客户电脑上显示异常.并且不是所有字体都显示为异常状况.指定了具体字体的(如 ...
- IEEE conference latex模板自己电脑编译后变形、字体显示异常的解决方法
IEEE conference latex模板自己电脑编译后变形.字体显示异常的解决方法 最近在投IEEE下面的一个会议,但是把 IEEE 会议模板下载到自己电脑编译时,和原版格式不对,搞得我心态爆炸 ...
最新文章
- Python3 的内置函数和闭包
- 数据结构学习工具总结
- C++类模板(二)用类模板实现可变长数组
- 近期低分纯生信友好的期刊简介
- CSS3动画详解(图文教程)
- 从xtrabackup备份恢复单表【转】
- 实验6.1 定义一个基类Animal
- 对丰田暴冲事故的软件调查报告——嵌入式软件工程师必看
- GWmodel | 地理加权模型(Ⅱ-2):如何查看地理加权回归的显著性
- DOE全因子实验设计报告
- 德州大学计算机系郭小虎2021,2021年德州农工大学排名U.S.News世界大学排名第130...
- 【python】详解multiprocessing多进程-Pool进程池模块(二)
- 安卓zip解压软件_手机压缩软件ZArchiver下载、使用教程丨免费、中文,支持7z、zip、rar等所有格式...
- 数的三次方根(二分方法的运用)
- Android离线文字转语音(TTS)原生实现
- 程序员必读的职业规划书,少走 5 年弯路(送书)
- Valgrind使用简介
- Mac家谱制作软件MacFamilyTree 9好用吗?如何在MacFamilyTree 9中创建数据库的备份?
- 一区WR | 河海大学李轶课题组利用环境兼容的载氧生物炭修复缺氧淡水生物机制
- whistle安装,成功率高
热门文章
- mysql共同好友_Hadoop实例之寻找博客中共同好友
- 天气通android2.1,老黄历天气通app
- bundle是什么?
- silvaco学习日记(八)--对界面电荷问题的解决
- dnf手游体验服服务器维护,dnf手游体验服官网
- gdtpc.com掘客资源网站
- 2016全球大数据战略版图剖析(3):分析篇
- Centos7(3.10.0内核)编译rtl8192EU WiFi driver v5.6.3.1出现 error: ‘IEEE80211_NUM_BANDS’ undeclared here修改方案
- 渗透测试-Z宝典(Penetration-Zbook)
- Lformat 低格教程