最近解决一故障——在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串口故障案例分析相关推荐

  1. 电池管理系统(BMS)功能与作用/BMS 故障分析方法/15种常见故障案例分析

    提示:本篇文章仅供学习参考 文章目录 一.电池管理系统(BMS)功能与作用 二.BMS 故障分析方法 三.15种常见故障案例分析 一.电池管理系统(BMS)功能与作用 从整车角度,电池管理系统(BMS ...

  2. Netty消息接收类故障案例分析

    <Netty 进阶之路>.<分布式服务框架原理与实践>作者李林锋深入剖析Netty消息接收类故障案例.李林锋此后还将在 InfoQ 上开设 Netty 专题持续出稿,感兴趣的同 ...

  3. python图像开闭区间_自动开闭器不良故障案例分析

    问题:怎样才能每天收到这种文章? 答案:点击上方蓝色字体,再点击关注即可! 一.故障概况 某年10月26日13:00分,某站的16/18号道岔在排列进路时,从定位操纵到反位时,反位无表示. 二.监测数 ...

  4. 以太网 STP临时环路的产生、STP BPDU的转发过程、根桥故障案例分析。

    2.10.2 以太网 传统STP生成树(STP临时环路.STP BPDU的转发过程.根桥故障案例) 传统STP生成树 2.10.2 以太网 传统STP生成树(STP临时环路.STP BPDU的转发过程 ...

  5. matlab如何模拟转子断条,转子断条故障案例分析

    铸铝转子的质量,可以从转子槽口的整齐度做一个基本的定性判定,一件好的铸铝转子,槽口应该非常整齐,否则就会出现明显的锯齿.转子出现相对均匀的锯齿时,就相当于转子一致性瘦条,这时转子电阻会增大,进而增加了 ...

  6. 大型网站典型故障案例分析

    写日志也会引发故障 故障现象:某应用服务器集群发布后不久就出现多台服务器相继报警,硬盘可用空间低于警戒值,并且很快有服务器宕机,登录到线上服务器,发现log文件夹里的文件迅速增加,不断消耗磁盘空间. ...

  7. 【Elasticsearch】 es ElasticSearch集群故障案例分析: 警惕通配符查询 Wildcard

    1.概述 转载:https://elasticsearch.cn/article/171 许多有RDBMS/SQL背景的开发者,在初次踏入ElasticSearch世界的时候,很容易就想到使用(Wil ...

  8. 常见的几种网络故障案例分析与解决

    故障1:交换机刚加电时网络无法通信 [故障现象] 交换机刚刚开启的时候无法连接至其他网络,需要等待一段时间才可以.另外,需要使用一段时间之后,访问其他计算机的速度才快,如果有一段时间不使用网络,再访问 ...

  9. 1-10-RHEL6.3-linux启动原理及各种故障案例分析(Red Hat Enterprise Linux Server6.3)@树袋飘零...

    本节内容: 一.Linux启动过程 二.常见的启动故障排除 三.救援模式 1.系统瘫痪了救援模式下拷贝数据 2.grub重新安装 3.系统无法启动--磁盘资源耗尽 4.文件删除空间不释放的问题(拓展) ...

最新文章

  1. Android EventBus使用(不含源码解析)
  2. CTFshow 反序列化 web267
  3. 【模板】EK求最大流、dinic求最大流
  4. Hibernate---对象的三种状态
  5. Nagios配置监控windows客户端
  6. 测试管理工具QC第一篇-QC安装步骤(史上最详细的图解过程)-第一篇
  7. win10绿联usb转串口_USB转串口DB9驱动安装与设置方法
  8. sap的pod确认_PO确认控制
  9. 敏捷开发和瀑布开发的区别
  10. 王垠《清华梦破碎》沉思与反省
  11. 前馈神经网络中的“前馈”指的是什么意思
  12. 第八周博客作业西北师范大学|李晓婷
  13. matlab中inf是什么意思,simulink中inf什么意思
  14. Shiro介绍(四):定义自己的安全域Realm
  15. phpcms 会员头像h5上传_PHPCMS 在任意页面调取会员头像
  16. Python实现大文本文件分割成多个小文件
  17. win7 找不到 计算机策略组,win7打开组策略提示无权限怎么解决 win7系统组策略如何开启...
  18. 指尖江湖李忘生鸿蒙初开,剑网3指尖江湖李忘生怎么玩 使用攻略
  19. 大话设计模式——外观模式
  20. 陈表达VBA学习笔记-新建工作表鼠标右键菜单按钮

热门文章

  1. js string转两位小数_js保留两位小数
  2. micro:bit 一款用于编程教育和硬件制作的微型计算机
  3. 易语言使用线程时钟后MYSQL_易语言多线程时钟周期 易语言三个时钟同时运行
  4. 让人无法抗拒的小程序魅力值
  5. 2002-2012年间巨头的疯狂收购
  6. LibreTranslate
  7. 服务器春节期间维护,运维安全之春节维护指南!
  8. 企业实战-Kubernetes(十一)Kubernetes监控
  9. Mqtt主题那点事(topic)
  10. iOS KVC和KVO简介