记一次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
果然问题被解决了