Imx8串口故障案例分析
最近解决一故障——在imx8qxp单板按“上下键”或者粘贴较长命令均会导致系统死机。最后查出来是驱动移植问题。在此做下记录,免得以后忘记,也对以后有类似串口问题提供一个参考。
故障描述已经比较清楚,只出现在imx8qxp单板,所以跟单板是有关系的。只在“上下键”或其他功能键如“HOME、END”等以及粘贴较长命令情况下出现,而其他普通输入按键没有问题,可以从这几个功能键的差异入手。
网上查阅资料发现这几个按键都是由一连串字符组成的,不单单是一个ASCII键值,程序段实例如下:
case KEY_CURSOR_UP: hit |= add("\033[A"); break; case KEY_CURSOR_DOWN: hit |= add("\033[B"); break; case KEY_CURSOR_LEFT: hit |= add("\033[D"); break; case KEY_CURSOR_RIGHT: hit |= add("\033[C"); break; case KEY_CURSOR_HOME: hit |= add("\033[1~"); break; case KEY_CURSOR_END: hit |= add("\033[4~"); break; case KEY_PAGE_UP: hit |= add("\033[5~"); break; case KEY_PAGE_DOWN: hit |= add("\033[6~"); break; case KEY_INSERT: hit |= add("\033[2~"); break; case KEY_DELETE: hit |= add("\033[3~"); break; case KEY_F1: hit |= add("\033OP"); break; |
其中‘\033’就是ESC,所以“UP键”就由ESC、[、A三个字符组成,也就是你在串口终端敲击一个“UP键”,实际上是同时送给串口三个字符‘ESC’、‘[’、‘A’。
在程序中打点调试,发现每当按下“UP键”时,串口驱动程序只能收到‘ESC’、‘[’字符,第三个字符怎么也收不到,更糟糕的是后续所有按键都会丢失。整个串口模块处于“假死”状态。为什么说“假死”,是因为我的整个功能模块是正常运行的,打印这些都是正常的,只是按键没有反应,也就是读不到键值,串口中断都可以正常的收到。
对比linux驱动,发现imx8系列都用同一个驱动程序,路径在drivers/tty/serial/fsl_lpuart.c。在初始化流程中会对串口的读写中断、FIFO、DMA以及WATERMASK等功能进行设置。我们的系统中为简单起见并没有使能FIFO、DMA及WATERMASK等功能,只用其来实现简单的按键收发而已。我们的初始化流程也并没有问题。
无赖只能将串口所涉及的寄存器打出来对比,看正常情况和“假死”情况状态寄存器能不能给出一些提示。果然,打寄存器才是发现硬件故障的核心手段。“假死”情况状态寄存器中设置了一个“OR”标志位。手册中对这个标志位是这样描述的:
注意其中高亮显示的那句话——当ORflag被置位时,即使数据缓存中有足够的空间,也不会有数据往里面存。
难怪后面的按键都没有反应,原来是OR这个标志被置位了。那什么情况下,OR标志位会被置位呢?上图中也给出了描述,就是接收数据的寄存器溢出了。
回想下故障现象,“UP键”会同时给出3个字符、粘贴较长命令也相当于同时发送了较多字符,这让默认只有一个字符的数据寄存器怎么来得急接收。
找到问题之后,果断将linux中的使能FIFO功能的程序段copy过来,验证一下,OK,问题得到解决。本来还想在OR标志被置位后,来个清除处理的,后来看linux貌似也没有处理,只是将overrun计数器进行了++操作,也就作罢。本来一旦出现OR标志,即使清楚了对后续串口输入不会有影响,但丢失的数据还是找不回来,而且还会隐藏故障现象。那就这么地吧。
Imx8串口故障案例分析相关推荐
- 电池管理系统(BMS)功能与作用/BMS 故障分析方法/15种常见故障案例分析
提示:本篇文章仅供学习参考 文章目录 一.电池管理系统(BMS)功能与作用 二.BMS 故障分析方法 三.15种常见故障案例分析 一.电池管理系统(BMS)功能与作用 从整车角度,电池管理系统(BMS ...
- Netty消息接收类故障案例分析
<Netty 进阶之路>.<分布式服务框架原理与实践>作者李林锋深入剖析Netty消息接收类故障案例.李林锋此后还将在 InfoQ 上开设 Netty 专题持续出稿,感兴趣的同 ...
- python图像开闭区间_自动开闭器不良故障案例分析
问题:怎样才能每天收到这种文章? 答案:点击上方蓝色字体,再点击关注即可! 一.故障概况 某年10月26日13:00分,某站的16/18号道岔在排列进路时,从定位操纵到反位时,反位无表示. 二.监测数 ...
- 以太网 STP临时环路的产生、STP BPDU的转发过程、根桥故障案例分析。
2.10.2 以太网 传统STP生成树(STP临时环路.STP BPDU的转发过程.根桥故障案例) 传统STP生成树 2.10.2 以太网 传统STP生成树(STP临时环路.STP BPDU的转发过程 ...
- matlab如何模拟转子断条,转子断条故障案例分析
铸铝转子的质量,可以从转子槽口的整齐度做一个基本的定性判定,一件好的铸铝转子,槽口应该非常整齐,否则就会出现明显的锯齿.转子出现相对均匀的锯齿时,就相当于转子一致性瘦条,这时转子电阻会增大,进而增加了 ...
- 大型网站典型故障案例分析
写日志也会引发故障 故障现象:某应用服务器集群发布后不久就出现多台服务器相继报警,硬盘可用空间低于警戒值,并且很快有服务器宕机,登录到线上服务器,发现log文件夹里的文件迅速增加,不断消耗磁盘空间. ...
- 【Elasticsearch】 es ElasticSearch集群故障案例分析: 警惕通配符查询 Wildcard
1.概述 转载:https://elasticsearch.cn/article/171 许多有RDBMS/SQL背景的开发者,在初次踏入ElasticSearch世界的时候,很容易就想到使用(Wil ...
- 常见的几种网络故障案例分析与解决
故障1:交换机刚加电时网络无法通信 [故障现象] 交换机刚刚开启的时候无法连接至其他网络,需要等待一段时间才可以.另外,需要使用一段时间之后,访问其他计算机的速度才快,如果有一段时间不使用网络,再访问 ...
- 1-10-RHEL6.3-linux启动原理及各种故障案例分析(Red Hat Enterprise Linux Server6.3)@树袋飘零...
本节内容: 一.Linux启动过程 二.常见的启动故障排除 三.救援模式 1.系统瘫痪了救援模式下拷贝数据 2.grub重新安装 3.系统无法启动--磁盘资源耗尽 4.文件删除空间不释放的问题(拓展) ...
最新文章
- Android EventBus使用(不含源码解析)
- CTFshow 反序列化 web267
- 【模板】EK求最大流、dinic求最大流
- Hibernate---对象的三种状态
- Nagios配置监控windows客户端
- 测试管理工具QC第一篇-QC安装步骤(史上最详细的图解过程)-第一篇
- win10绿联usb转串口_USB转串口DB9驱动安装与设置方法
- sap的pod确认_PO确认控制
- 敏捷开发和瀑布开发的区别
- 王垠《清华梦破碎》沉思与反省
- 前馈神经网络中的“前馈”指的是什么意思
- 第八周博客作业西北师范大学|李晓婷
- matlab中inf是什么意思,simulink中inf什么意思
- Shiro介绍(四):定义自己的安全域Realm
- phpcms 会员头像h5上传_PHPCMS 在任意页面调取会员头像
- Python实现大文本文件分割成多个小文件
- win7 找不到 计算机策略组,win7打开组策略提示无权限怎么解决 win7系统组策略如何开启...
- 指尖江湖李忘生鸿蒙初开,剑网3指尖江湖李忘生怎么玩 使用攻略
- 大话设计模式——外观模式
- 陈表达VBA学习笔记-新建工作表鼠标右键菜单按钮