当前位置: 首页 > article >正文

记一次HID报表描述符识别异常问题排查

文章开头先表白我师父冬瓜

问题:
在rv1126开发板可以正常使用的触摸屏的HID报表描述符,在更换到rk3576开发板后无法正常识别

在这里插入图片描述

排查思路:
首先,先确认了报表描述符是否复制错误

之后使用Bus Hound工具捕捉传输报表描述符的数据,发现接收到的报表描述符不完整

然后cat节点内容,发现节点的数据就不完整,这说明usbdevice文件中执行echo操作时写入的数据就不完整

cat ./sys/kernel/config/usb_gadget/rockchip/functions/hid.0/report_desc

此时怀疑驱动内部问题:1. 内存大小问题 2. 拷贝问题
首先,内存大小,先怀疑了是否是缓冲区的大小不够,数了一下,发现丢失了前面的618个字节数据,并没有什么规律,并且此时丢失了前半部分,拷贝内存并不是环形内存,因此不存在后面数据覆盖前面数据的问题,排除这种可能
其次,是拷贝问题,查看驱动代码,可以发现拷贝操作是memcpy操作,不太可能有问题,排除可能

如果驱动内部没有问题,怀疑外部写入数据有问题
再次检查写入的报表描述符丢失的位置
从0x0A开始之前的全部丢失,只保留后面0x75开始向后的部分
突然想到0x0A在ASCII中是换行符
加之之前遇到过bash的内联echo函数遇到换行符后会分多次写入(详情见:关于bash内建echo输出多行文本)
于是大胆猜测很有可能是echo将0x0A识别为换行符,然后分多次写入,将前半部分给覆盖掉了

将原来的echo操作
echo 0x06 ... 0x0A 0x75 ... 0xc0 > report_desc 
更改为
echo 0x06 ... 0x0A 0x75 ... 0xc0 | tee report_desc 

果然问题被解决了


http://www.kler.cn/a/543462.html

相关文章:

  • 测试自动化落地方向
  • 八、OSG学习笔记-
  • 【嵌入式Linux应用开发基础】open函数与close函数
  • 物联网(IoT)如何与人工智能(AI)的结合
  • IPD项目管理是什么?
  • java.io.InvalidClassException
  • 使用Docker部署MySQL 5.7并配置防火墙
  • C++,STL容器 unordered_set/unordered_multiset:无序集合/无序多重集合深入解析
  • 【面试集锦】如何设计SSO方案?和OAuth有什么区别?
  • JavaWeb学习-Mybatis(增删改查)
  • Windows 软件奔溃-dmp文件分析
  • 微信小程序网络请求封装
  • 【JavaEE进阶】Spring IoC
  • 【漫话机器学习系列】088.常见的输出层激活函数(Common Output Layer Activation Functions)
  • 堆、方法区、虚拟机栈、本地方法栈 和 程序计数器
  • HCIA项目实践--RIP相关原理知识面试问题总结回答
  • 从 0 开始本地部署 DeepSeek:详细步骤 + 避坑指南 + 构建可视化(安装在D盘)
  • Oracle数据库ADG日志丢失处理方法
  • js实现深拷贝
  • HDL Compiler:工具简介
  • C++病毒(^_^|)(2)
  • 多机器人系统的大语言模型:综述
  • es-head 正则查询和标准正则查询的差异
  • flutter 中 ReceivePort 的 first 和 listen
  • Nginx 中的HTTP2
  • 网络安全ids是什么意思