热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

被LCD调戏睡不着了

好吧,我承认我不是因为被调戏睡不着的,我是因为今天晚上喝了一杯该死的咖啡,然后就睡不着了,这个点[3:40]在

好吧,我承认我不是因为被调戏睡不着的,我是因为今天晚上喝了一杯该死的咖啡,然后就睡不着了,这个点[3:40]在床上翻来覆去,刚开始我摸着楠哥的小腿,过了一会,觉得没意思了,然后再摸楠哥的大腿,我想跟他说几句话,接着是,啪的一个声音,精神小伙给了我一巴掌。

因为睡不着,于是我就坐起来写点奇怪的东西,就有了这篇文章。

我们今天在调试屏幕,已经在LK阶段让屏幕亮起来了,但是在kernel阶段屏幕还是不能亮,排查了很久不知道问题在哪里。

1、测量了复位脚上电时序,可以看到按下power键休眠唤醒的时候可以看到reset脚的电平变化,也就是说这个脚是可以控制的,不过话说回来,如果这个脚不可以控制,在lk阶段怎么可能亮屏呢?

2、测量mipi的lane脚,也可以看到休眠的时候没有波形,唤醒的时候有波形,所以平台端的视频输出是正确的。

3、发现上电时候复位引脚拉高后的延迟时间不够,芯片手册上要求是 10ms以上,但是我们代码实际上写的是5ms,但是实际修改后也没有亮屏。

4、在kernel阶段,我们写入BIST模式的时候不能进入测试模式。这个可以猜测没有写成功是因为上电时序有问题,IC没有进入正常的上电状态。

明天准备排查方向

1、还是从上电时序入手,VDD 和RESET之间的时间,还有RESET和LANE数据的时间,都需要严格遵守,并且要用示波器测量正确。

这一点跟模组厂确认,电源开机后一直打开是没有问题的,所以排除这一点。但是有的屏幕如果复位时序不正确,寄存器是写不进去的。

2、去掉LK的控制,让屏幕在Kernel阶段初始化,因为从没有电到上电有一个过程,这也是为什么LK阶段上电不严格也可以初始化的原因,因为它总是从没有电到有电的冷启动。

3、叫模组厂的FAE过来,我们没有调通,大家应该都有责任把这个事情做好,先把锅甩出去再说。


题外话

在知乎上看到一个问题,如果当时关羽不出手,刘备不出手,张飞不出手,谁能斩华雄。

这里只讨论演义,我看了很多人的答案,我觉得有两个人可以,一个是孙坚,一个是曹洪,孙坚前期打架是很厉害的,当然也还有其他人选,比如典韦,赵云之类的,但是他们当时还没有出现,赵云那时候年纪也还比较小,我选的这两个人也都出现在当时的联合军队中。不过不管是孙坚和曹洪,战斗力应该都打不过华雄,即使能不被反杀,想拿下华雄人头应该还是很难的。


时间来到今天

今天还是一样,我把我熬夜思考出来的秘籍都测试了,开机后可以亮屏幕,但是suspend后再resume,该死的屏幕还是亮不了。

其中还跟模组厂沟通如下:

这个时候,我发现我的背光亮不了。于是我就跟着背光在resume的时候不能亮的思路去寻找。我还想起来,我昨天发了文章,有一个大牛给我回复了,我跟他聊了下。

就是这个该死的宏,在唤醒的时候进行了判断跑了不同的逻辑。

我按照这样修改后,这个该死的屏幕就亮起来了。

void mt_mt65xx_led_set(struct led_classdev *led_cdev, enum led_brightness level)
{struct mt65xx_led_data *led_data =container_of(led_cdev, struct mt65xx_led_data, cdev);/* unsigned long flags; *//* spin_lock_irqsave(&leds_lock, flags); */output_met_backlight_tag(level);printk("=== weiqifa === %s-%d\n",__FUNCTION__,__LINE__);
#ifdef CONFIG_MTK_AAL_SUPPORTif (led_data->level !&#61; level) {led_data->level &#61; level;if (strcmp(led_data->cust.name, "lcd-backlight") !&#61; 0) {LEDS_DEBUG("Set NLED directly %d at time %lu\n",led_data->level, jiffies);schedule_work(&led_data->work);} else {if (level !&#61; 0&& level * CONFIG_LIGHTNESS_MAPPING_VALUE <255) {level &#61; 1;} else {level &#61;(level * CONFIG_LIGHTNESS_MAPPING_VALUE) /255;}LEDS_DEBUG("Set Backlight directly %d at time %lu, mapping level is %d\n",led_data->level, jiffies, level);/* mt_mt65xx_led_set_cust(&led_data->cust, led_data->level); */disp_aal_notify_backlight_changed((((1 <#else/* do something only when level is changed */if (led_data->level !&#61; level) {led_data->level &#61; level;if (strcmp(led_data->cust.name, "lcd-backlight") !&#61; 0) {LEDS_DEBUG("Set NLED directly %d at time %lu\n",led_data->level, jiffies);schedule_work(&led_data->work);} else {if (level !&#61; 0&& level * CONFIG_LIGHTNESS_MAPPING_VALUE <255) {level &#61; 1;} else {level &#61;(level * CONFIG_LIGHTNESS_MAPPING_VALUE) /255;}LEDS_DEBUG("Set Backlight directly %d at time %lu, mapping level is %d\n",led_data->level, jiffies, level);if (led_data->cust.mode &#61;&#61; MT65XX_LED_MODE_CUST_BLS_PWM) {mt_mt65xx_led_set_cust(&led_data->cust,((((1 <cust, level);}}}/* spin_unlock_irqrestore(&leds_lock, flags); */
#endif

但是这个背光控制没有在DTS里面设置的&#xff0c;这个真的是一个大坑&#xff0c;我们的背光控制硬件GPIO口是

但是代码中&#xff0c;这里直接通过PWM寄存器控制了&#xff0c;所以就脱离了GPIO口了。也就是我们想在DTS里面找GPIO口配置是不对的。

还有这个宏的作用

CONFIG_MTK_AAL_SUPPORT

这个是自动背光的作用&#xff0c;可以用来节省电量&#xff0c;但是我们不需要这个功能&#xff0c;而且前期调试的时候&#xff0c;光感还没有起来&#xff0c;开了这个就有影响了。

把这个功能关闭后需要全编译一次&#xff0c;要不然功能还没有完全关闭。

MTK8167S的LCD软件流程框架我就不说了&#xff0c;驱动调试的话可以按照原有的驱动来参考编写&#xff0c;也有MTK的调试文档&#xff0c;先不花篇幅在这里了。有需要的可以私聊我。

最后~

感谢这位小哥哥~


  回复「 篮球的大肚子」进入技术群聊

回复「1024」获取1000G学习资料



推荐阅读
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 本文将详细探讨Linux pinctrl子系统的各个关键数据结构,帮助读者深入了解其内部机制。通过分析这些数据结构及其相互关系,我们将进一步理解pinctrl子系统的工作原理和设计思路。 ... [详细]
  • 配置多VLAN环境下的透明SQUID代理
    本文介绍如何在包含多个VLAN的网络环境中配置SQUID作为透明网关。网络拓扑包括Cisco 3750交换机、PANABIT防火墙和SQUID服务器,所有设备均部署在ESXi虚拟化平台上。 ... [详细]
  • 主板IO用W83627THG,用VC如何取得CPU温度,系统温度,CPU风扇转速,VBat的电压. ... [详细]
  • 本题探讨了在一个有向图中,如何根据特定规则将城市划分为若干个区域,使得每个区域内的城市之间能够相互到达,并且划分的区域数量最少。题目提供了时间限制和内存限制,要求在给定的城市和道路信息下,计算出最少需要划分的区域数量。 ... [详细]
  • 反向投影技术主要用于在大型输入图像中定位特定的小型模板图像。通过直方图对比,它能够识别出最匹配的区域或点,从而确定模板图像在输入图像中的位置。 ... [详细]
  • 在项目部署后,Node.js 进程可能会遇到不可预见的错误并崩溃。为了及时通知开发人员进行问题排查,我们可以利用 nodemailer 插件来发送邮件提醒。本文将详细介绍如何配置和使用 nodemailer 实现这一功能。 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 本题探讨了在大数据结构背景下,如何通过整体二分和CDQ分治等高级算法优化处理复杂的时间序列问题。题目设定包括节点数量、查询次数和权重限制,并详细分析了解决方案中的关键步骤。 ... [详细]
  • 在进行QT交叉编译时,可能会遇到与目标架构不匹配的宏定义问题。例如,当为ARM或MIPS架构编译时,需要确保使用正确的宏(如QT_ARCH_ARM或QT_ARCH_MIPS),而不是默认的QT_ARCH_I386。本文将详细介绍如何正确配置编译环境以避免此类错误。 ... [详细]
  • 本文介绍了如何使用JavaScript的Fetch API与Express服务器进行交互,涵盖了GET、POST、PUT和DELETE请求的实现,并展示了如何处理JSON响应。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本文探讨了如何在 F# Interactive (FSI) 中通过 AddPrinter 和 AddPrintTransformer 方法自定义类型(尤其是集合类型)的输出格式,提供了详细的指南和示例代码。 ... [详细]
  • 我有一个SpringRestController,它处理API调用的版本1。继承在SpringRestControllerpackagerest.v1;RestCon ... [详细]
author-avatar
北大青鸟西安
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有