RK3566恢复显示屏异常显示的方法
admin
2024-04-01 21:13:28
0

        设备进行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 状态。

驱动说明文档

# 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;
}

方法不完善,请有这方面经验的朋友指教。

相关内容

热门资讯

忻州:坚持以文塑旅、以旅彰文 ... 在山西省中北部地区,有一片受到文化与自然双重滋养的土地——忻州市。近年来,忻州市紧扣“以文塑旅、以旅...
原创 朝... 那双手,柔软细腻,像握住了一段温润的绸缎。团里的老张,握住朝鲜导游小金的手后,竟失口惊呼:“哎哟,差...
苦瓜与什么食物相克 苦瓜与什么食物相克原则上来说是没有食物相克一说的,只在于自身体质以及营养吸收上的区别
找个游戏或者平台 电脑上的在线... 找个游戏或者平台 电脑上的在线对战(格斗类的)那种像街机的也可以不要推单机连线对战的?地下城与勇士 ...
口袋精灵金有第3世界吗? 口袋精灵金有第3世界吗?没有了吧······我也记得只有关东了这第2个图了
“我好想你,我希望我们可以在一... “我好想你,我希望我们可以在一起 ”用粤语怎么说啊~谢谢哦!很想知道呢~我好挂住你,我希望我地可以系...
成人高考南京师范大学汉语言文学... 成人高考南京师范大学汉语言文学专业和自考南京师范大学汉语言文学专业一样吗?专业肯定是一样的,但是含金...
摄制组前往空间站,首部太空故事... 摄制组前往空间站,首部太空故事片即将开拍,这部剧有着怎样的演员阵容?这部剧的演员阵容是相当强大的,而...
生活中有哪些小习惯,可以提高生... 生活中有哪些小习惯,可以提高生活的质量?习惯性的物品归纳整理,用过的东西自觉归位。试问现在有几个人敢...
分数分为真分数,假分数和带分数... 分数分为真分数,假分数和带分数对吗分数和小数是可以互换的,分数分为假分数和带分数。假分数就是像11/...
怎样可以让自己变得狠一点? 怎样可以让自己变得狠一点?如果你想要变狠、我想不必别人教你的、如果你天生就是一副好心的人、是怎么也变...
一个小县城八个副县长多不多 一个小县城八个副县长多不多不知道他们是干什么吃的当然太多了,为什么不写出县的名字?
“有朋自远方来,不亦乐乎?”这... “有朋自远方来,不亦乐乎?”这句话是什么意思?“有朋自远方来,不亦乐乎”从字面意思理解为:有志同道合...
吞噬星空9号古文明遗迹过了多久 吞噬星空9号古文明遗迹过了多久9月29号傍晚6点前开始探索的,过去了很长时间。作为危险程度较低的‘9...
求腾讯(坤哥物理)高一必修二视... 求腾讯(坤哥物理)高一必修二视频,。我有最后复习的一轮和二轮视频,不知道你跟得上吧
喜欢是不是深深的爱 喜欢是不是深深的爱喜欢是感觉,爱是感情,喜欢是一个瞬间,爱是一生的永恒,喜欢可以无拘无束,爱则要承担...
一部电影 名字好像叫什么什么奇... 一部电影 名字好像叫什么什么奇缘 不是仙境奇缘有本书叫《古国奇缘》的很好看的是穿越的仙境之桥 电影《...
求一本言情小说名字 求一本言情小说名字我觉得和原来爱情这么伤在某些情节上有点像让爱重见天日?
孩子看课外书的选择问题 孩子看课外书的选择问题你给孩子多看看易懂的书,比如能通过一个故事让她理解一个道理,她做到什么事情的时...
赫西奥德简介 赫西奥德简介 赫西奥德(约公元前 700 年)与荷马一起,是几乎具有传奇色彩的早期希腊史诗诗人之一。...