1.场景还原:在我开发USB PD测试模块时,发现待测主板始终不回复Request消息,导致我的测试失败;此时我的任务就是快速定位这个协议交互失败的原因,无论是软件、硬件还是协同

2.大致的调试步骤:

        1.首先使用了逻辑分析仪抓取了CC线(这里是CC1)上面的物理波形,并在分析仪的软件上启用了BMC解码,确认了DUT确实发出了Request消息,并且波形解码出来的CRC值与我手动计算出来的值结果一致。

        2.然后,我检查了Linux驱动层的调试日志,发现驱动收到的同一条消息的CRC值与波形完全不同。好了,此时有两种可能,一种就是在PL端和PS端进行数据通信的时候发生了问题,导致校验失败;另一种可能就是PL端出现了某些问题

        3.我排查了我的驱动读取FIFO的代码,发现一切正常,所以不是我软件的问题。那么只有一种可能,那就是FPGA的PL端出现了问题。

        4.好了,我此时定位了是FPGA的硬件问题了。然后就是和硬件工程师排查一下是哪里出现了问题,Review了PL端IP核的Verilog代码,发现其CRC生成器的初始值配置错误

3.解决方案:

        1.在定位了是PL端的问题以后,先进行了自己的软件CRC 校验作为临时的方案,保证了项目的进度;

        2.过了大概两天,提交了我们的硬件团队,协助他们修复了IP核,并验证了新的比特流文件,最终彻底解决了该问题。

4.总结一个这个令人自豪的调试过程以及DEBUG思路吧。

        总的来说,发现问题要先利用工具来进行问题的定位,这里用到了逻辑分析仪和Linux 内核调试日志,日志会打印出关键的信息,但是这需要很大的耐心去分析波形,在分析的过程中,不仅仅是对波形的分析,还是对于USB PD协议的每一步结构进行深入透彻的了解,不能忽略每一个细节,要精确到每一个时刻,哈哈哈,有点废人说实话。此外,在日志查看的阶段,也是非常需要耐心的,每一个日志信息都有可能成为突破的关键点,所以能不能有人开发一个一键解决的软件啊,要不这样有点废牛马,哈哈哈哈。

5.下面是一些详细的,便于回顾的,同时有具有体会性的调试思路。(其实我可以写一个JSION脚本来描述,但是。。。。。。自行体会吧)

        1.复现问题与收集数据

                1.逻辑分析仪的使用,这里可是重中之重啊,硬件的逻辑分析仪要插好,这里我们要捕获的是PL端和DUT的通信波形,所以就是插在CC线上咯;然后就是配置一下逻辑分析仪软件的配置啦,第一个是采样率,由于USB PD协议的波特率是300kbps,所以采样率要比他高,但是高多少啊,其实俺不知道,那就3Mbps吧,上网查一下就知道了。第二个是要设置一下触发方式,这里选择下降沿触发,看了BMC通信的波形,起始位是高电平,所以要捕获下他下降的那一刻。第三个是要启用一下BMC解码的功能,不然啥都没有哦(呜呜呜,谁知道我踩了多少坑,卡了多久)。

                2.启动内核调试日志,因为我的Linux驱动代码是有调试打印功能的,所以说在开始运行的时候直接开一个终端跑log就行。

                如果没有开启,那就完了。好吧,我开玩笑的,你可以手动开启???我好像在说废话。。。

                首先要确保Linux驱动代码中的dev_dbg()、print_hex_hump_bytes()等调试打印功能是开启的。因为实际上有好多个log,是不是感觉好麻烦,没事,看关键信息就行。

                你可能需要通过dynamic_debug机制动态开启:这里不展示代码,只说怎么做。

                你可以通过echo命令将一个驱动文件的输出重定向到control 里面。

                例如:echo 'file pd_driver.c +p' > /sys/kernel/debug/dynamic_debug/control

                好吧好吧,你赢了,我还是写了。

                3.复现与捕获:

                开始运行程序,触发PD协议的交互,直到交互失败。可以从dmesg命令中打开日志,查看内核日志。

        2.联合分析,定位矛盾(看逻辑分析仪的波形,看日志)

                1.看波形:当然是在逻辑分析仪软件上看啦,注意这个时候不要从头开始看波形,直接找仪器发送的Source_Capabilities消息和DUT(Sink)回复的Request消息。重点关注我的Request消息,但是仪器发送的消息也要看啊,万一是我发的有问题呢,不要排除任何一种可能,逻辑分析仪,逻辑一定要完美,不能有漏洞。

                2.当然说了这么多废话,还是要重点看Requset消息,因为大多数是回的有问题,别问我怎么回事,我瞎说的,哈哈哈哈。

                言归正传,在Request消息里,要展开这条消息的详情,查看软件解码出的每一个字段:消息头、数据对象、CRC32(有的人说CRC16,其实现在多是32,这样效果更好,数据安全性更好)。

                这里要验证一下我的逻辑分析仪,为了以防万一啊,万一逻辑分析仪坏了咋办呢。啊,逻辑分析仪坏了,是不是感觉累了,哈哈哈,啥都得提防,坏人好多。

                怎么验证呢,当然是把消息头、数据对象那些十六进制数据自己手算一下CRC校验值啦。什么,你说你不会,好吧,其实我也不会,但是没有计算器吗?

                好,通过计算器验证了一下,发现和逻辑分析仪解码出来的一样,说明我们的逻辑分析仪还是可信的,是好人捏。

                好了,既然逻辑分析仪解码正确,说明这里波形是正确的,说明DUT传过来的是正确的,消息也确实是发给我仪器了。但是我的驱动却认为CRC错误。那问题可能出现在传输过程中,或者在PL端,这里其实已经初见端倪了。嘿嘿,小黑子终于露出了犄角。

                那接下来就看一下内核日志这一块是怎么说的吧。查看内核日志,找出驱动记录“CRC错误”或者“丢弃无效的消息”的那一行。日志会显示驱动实际接收到的完整消息和CRC值。对比一下逻辑分析仪的正确CRC值,发现这个日志里面的和那个正确的CRC值不一样。好,确定了我上面的猜测。

                这个时候我可以百分之百确定就是在传输的过程中或者是PL端哪里出现了问题。其实后面想了一下,可能是DUT向PL端传输时出现了错误,也可能是PL端,还有可能是PL端向PS端传输的过程中出现了错误,到底是哪个啊,好难猜啊哈哈哈哈哈。其实我是想知道先排查哪一个,那就分析分析吧。

        3.深入挖掘原因

               1. 首先,PL端应该放最后,因为那是FPGA硬件工程师的错误,最后再说,DUT向PL端传输也应该放后,因为目前没有手段直接读到FPGA端接收到的CRC32值,先排查我软件驱动读到的值吧,而且从软件到硬件排查也是通常的一个顺序。

               2. 好了,分析了好久,还是回到了我驱动读到的CRC值。驱动一般不会“写”,不会修改CRC值,那么只有可能是驱动从RX_FIFO寄存器中读取错了,检查一下代码,看看是逻辑错误,还是一次性连续读取4个uint32_t,字节序的问题(毕竟是arm架构和FPGA架构),还有缓存或者内存对齐的问题?

                如果这些代码没有问题,那么就是寄存器里面的数据本身就是有问题的!!!好了,这个时候我的驱动这边问题排除了。那接下来就是PL端的问题了,或者说肯定是PL端的问题了,不不不,大概率是他的问题(差点草率了,其实还有DUT向PL的过程,但是这个概率太小了,但是我不能排除,不然会出问题)。

                好了,将问题丢给硬件工程师,我的调试基本上结束了。

        4.解决方案

                1.我不从PL端的RX-FIFO寄存器读取CRC值,根据数据直接在驱动里计算CRC值。这样做可能看着有点别扭,但是你先别别扭,因为不能因为这个错误把进度卡了,所以先这样吧。

                2.修复FPGA端的错误,定位在了IP核中的CRC模块,配置错误,CRC寄存器初始值不是0XFFFFFFFF,很细节是不是哈哈哈,一个配置错误直接卡了我好久。

                

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/98882.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/98882.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/98882.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32之RTC

RTC简介 实时时钟(Real Time Clock,RTC),本质是一个计数器,计数频率常为秒,专门用来记录时间。 普通定时器拿来作时钟可行吗?普通定时器无法掉电运行! RTC特性: 1,能提供时间&…

【OC】单例模式

文章目录前言概念优缺点优点缺点两种使用模式懒汉模式实现代码运行结果饿汉模式实现代码运行结果在自定义类方法时的几种常见写法总结前言 在之前我们已经学习过单例模式的有关内容,但是只是最简单的单例,无法胜任多线程或者稍微多一点的情况便无法确定…

机器学习(七)决策树-分类

一 概念1 决策节点通过条件判断而进行分支选择的节点。将样本的属性值,也就是特征值与决策节点上的值进行比较,从而判断它的流向。2 叶子节点没有子节点的节点,表示最终的决策结果。3 决策树的深度所有节点的最大层次数决策树具有一定的层次结…

IT 服务管理的新格局:从工单系统到一体化 ITSM 平台

企业 IT 部门的角色转变在过去,IT 部门更多被视为“技术支持”,主要负责设备维护和故障处理。但随着数字化转型加速,IT 已经成为业务连续性和创新的重要推动力。从客户体验到数据安全,从业务敏捷到成本控制,IT 服务管理…

创建一个Spring Boot Starter风格的Basic认证SDK

文章目录前言设计思路SDK实现步骤1. 创建SDK Maven项目(sdk目录)2. 实现配置类3. 实现认证逻辑4. 实现拦截器5. 实现自动配置6. 创建spring.factories文件使用方集成步骤1. 引入SDK依赖2. 配置Application属性3. 创建测试接口4. 测试接口访问SDK扩展功能…

mybatis处理统计sql进度丢失问题

如何处理统计sql进度丢失 SELECT sum(decimal_column) AS sum_value FROM your_table如上sql执行时没有问题,在数据库可视工具可以正常显示,但是在mybatis执行时,却出现解决办法 使用转 decimal 控制精度 SELECT CAST(SUM(decimal_column) A…

全球首款!科聪控制器获德国 TÜV 莱茵功能安全认证

近日,浙江科聪控制技术有限公司(以下简称"科聪")的安全移动机器人控制器MSC5000荣获全球权威认证机构德国莱茵TV集团(TV Rheinland)颁发的功能安全认证证书。这款控制器是全球首款通过SIL3、PLe 认证的移动机…

pureadmin的动态路由和静态路由

在 PureAdmin(基于 Vue3 的后台管理框架)中,静态路由和动态路由是实现路由管理的两种方式,主要区别在于路由的定义时机、加载方式和灵活性,具体区别如下: 1. 静态路由 定义方式:路由规则在代码中…

第3章:CPU实战

1. Linux操作系统CPU平均负载 以前我们总认为CPU使用率和CPU平均负载是一样的,负载高了就是CPU使用率提高。但是到底是什么情况呢? 1.1. CPU的平均负载 单位时间内 系统处于 可运行状态 和不可中断状态 的平均进程数,就是平均活跃进程数&a…

【Vue3】06-利用setup编写vue(1)

其它篇章: 1.【Vue3】01-创建Vue3工程 2.【Vue3】02-Vue3工程目录分析 3.【Vue3】03-编写app组件——src 4.【Vue3】04-编写vue实现一个简单效果 5.【Vue3】05-Options API和Composition API的区别 6.【Vue3】06-利用setup编写vue(1) 7.【Vue…

UDS NRC速查

目录 NRC 一、通用NRC(0x10~0x5F) 二、数据相关NRC(0x70~0x8F) 三、会话与状态NRC 注意事项 UDS中的NRC(Negative Response Code)即否定响应码,用于在诊断通信中表示服务端无法成功执行客户端请求的原因。以下是一些常用的UDS NRC码及其含义: HEX Name Description 01 …

【AI论文】多模态大型语言模型的视觉表征对齐

摘要:通过视觉指令微调训练的多模态大型语言模型(MLLMs)在各类任务中均取得了优异表现,然而在以视觉为中心的任务(如物体计数或空间推理)中,其性能仍存在局限。我们将这一差距归因于当前主流的纯…

SKywalking Agent配置+Oracle监控插件安装指南

SKywalking Agent配置Oracle监控插件安装指南前言: SkyWalking Elasticsearch8 容器化部署指南 Skywalking版本:V10.2.0 Skywalking Agent版本:V9.4.0 Skywalking Agent下载地址:Downloads | Apache SkyWalking 插件下载地址&…

ES相关问题汇总

问题一:关于【QueryBuilder对象】和【Query String语法】查询时底层运行方式和结果的差异

5. STM32 时钟系统分配

文章目录下述将以stm32f407 为例1. 时钟系统及频率分析2. 时钟配置下述将以stm32f407 为例 1. 时钟系统及频率分析 上述STM32F4时钟系统图解析入下: STM32F407 系列微控制器(基于 Cortex-M4 内核,带 FPU)的工作频率配置如下&…

《从 0 建立测试开发认知:先搞懂 “是什么”,再学 “怎么做”》

🔥个人主页:草莓熊Lotso 🎬作者简介:C研发方向学习者 📖个人专栏: 《C知识分享》《Linux 入门到实践:零基础也能懂》《数据结构与算法》《测试开发实战指南》《算法题闯关指南》 ⭐️人生格言&a…

net::ERR_EMPTY_RESPONSE

net::ERR_EMPTY_RESPONSE表现解决表现 Java后端封装一个接口,透传前端参数,请求到其他模块服务 本地开发环境联调时是没有问题,测试环境上报错 1.前端报错,F12检查,network上的请求,返回response选项中为空…

在线多功能环境音生成器

https://oltool.cc/toolbox/huanjingyins.html 关于环境音生成器介绍: 1、本工具可以混合各种声音,比如下雨声,打雷声,海浪声,鸟叫以及虫鸣声等,生成新的环境声。 2、定时器:可以设置倒计时&…

本地电脑映射端口到外网访问的开启方法和注意事项,内网服务提供跨网使用简单操作实现

在计算机网络中,端口映射是一项重要的技术,它允许外网用户访问局域网内的特定设备或服务。当我们在本地电脑搭建部署项目应用后,就可以通过映射端口的方式,简单快速稳定的提供互联网访问服务。以下将详细介绍如何开启电脑映射端口…

Java 大视界 -- Java 大数据在智能医疗健康档案数据分析与个性化健康管理中的应用(410)

Java 大视界 -- Java 大数据在智能医疗健康档案数据分析与个性化健康管理中的应用(410)引言:正文:一、2023 年 6 月智能医疗健康档案的核心落地需求(政策 业务双驱动)1.1 政策倒逼的数据应用痛点&#xff…