现象:hdc无法使用
定位:
1.设备管理器中没有看到设备,提示无法识别usb设备
根据现象初步分析是设备枚举失败了
2.枚举失败的原因非常多,根据该项目背景,这次项目是因为同步最新代码所致,所以问题锁定在同步代码区间
3.交叉测试:
同一个内核+老的system ok
同一个内核+新的system error
根据交叉测试结果排除内核问题,问题聚焦在system
4.查看hdc工作需要配置的很多节点,包括iProduct,iManufacturer 等,发现这些配置均ok
5.因为设备不在手边,暂时无法使用抓包工具进行查看
6.继续查看关键节点发现。dev/usb-ffs/adb节点下只有ep0一个节点,ep1,ep2节点均为生成
问题初步厘清,是ep1,ep2节点创建失败,继而枚举失败
7.ep1,ep2的创建在脚本中
"mount functionfs adb /dev/usb-ffs/adb uid=2000,gid=2000"创建
如果ep1,ep2没有创建成功,有2种可能
7.1这句配置命令没有执行
7.2这句配置执行了,但是内核执行的时候有问题
8.针对上述问题,搜索log关键字“read descriptors”和"read strings“均未找到这2个关键字,从表象上看没有调用到内核
但是找到mount的时候内核的调用栈
ffs_ep0_write()
其中“read descriptors”和"read strings“为info打印
故再次使用dmesg将内核打印全部打出,这次发现了大量了read descriptors,但是没有"read strings"
这说明,"mount functionfs adb /dev/usb-ffs/adb uid=2000,gid=2000”这句是执行了的,只是内核返回失败了
根据内核逻辑
只有read descriptors而没有"read strings"说明上层对于ep0的配置出现了问题导致没有走到"read strings"
而ep0的配置是由上层hdcd服务在启动的时候对ep0进行写各种描述符完成的
而此前已经排除了内核本身的问题,根据经验,ep1,ep2未创建的原因就是配置ep0的时候出错了
查看hdcd服务种的配置描述符,果然配置描述符未同步,同步后,枚举即成功