NanoPC-T2(S5P4418)无法通过Android usb host API识别两个以上USB设备
当我连接一个打印机和一个USB转串口设备到NanoPC-T2上时,发现不能识别两个以上的USB设备。只有第一个识别的设备能够会一个成功的配置(configration),而后的设备无法得到一个正常的配置(configration),这样就无法正确识别到该设备。这个问题困扰了我很久,我甚至怀疑我程序中没有打印设备没有关闭的问题,供电的问题,甚至包括NanoPC-T2硬件问题。最开始我的判断是一半对一半,一半是软件问题;一半是硬件问题。我做了如下测试得出一些结论:
查看Linux内核LOG信息dmesg判断是否是内核无法识别
结论:Linux内核识别USB正常,没有出现disconnected。交换两个USB设备所在端口
结论:开发板是的物理端口之间没有区别,同样的问题。插入设备重新开机,开机后打开测试软件「USB Device Info」也同样是这样
注:不用在意两个图的Product ID不同,这个只是这个软件的设计方式。可以看到能识别的情况下可以读取Configration#Interfaces等等信息,识别不出来的情况下就读不出来了。更换其它Android设备测试结果是可以读取多个USB设备的,排除Android API的问题;
使用外接USB HUB测试是同样的现象,排除USB HUB问题。
到目前为止,由于Android USB HOST Api也是CPU厂商各自实现的,所以这里初步判断此问题是三星为Android底层实现的usb host **.so(S5P4418库文件)有BUG,默认用户只插入一个USB设备了。
有新的进度再进一步更新。
20161127更:
查看libusbhost.so(源码位置:system/core/libusbhost)库文件所包含的其它库文件,由下面内容可以看到,libusb只包含了常规的libc libcutils lim libstdc++库。
$ readelf -d libusbhost.so
Dynamic section at offset 0x1e88 contains 23 entries:
Tag Type Name/Value
0x00000003 (PLTGOT) 0x2f70
0x00000002 (PLTRELSZ) 264 (bytes)
0x00000017 (JMPREL) 0xce8
0x00000014 (PLTREL) REL
0x00000011 (REL) 0xcc8
0x00000012 (RELSZ) 32 (bytes)
0x00000013 (RELENT) 8 (bytes)
0x6ffffffa (RELCOUNT) 2
0x00000006 (SYMTAB) 0x148
0x0000000b (SYMENT) 16 (bytes)
0x00000005 (STRTAB) 0x5c8
0x0000000a (STRSZ) 1228 (bytes)
0x00000004 (HASH) 0xa94
0x00000001 (NEEDED) Shared library: [libc.so]
0x00000001 (NEEDED) Shared library: [libcutils.so]
0x00000001 (NEEDED) Shared library: [libm.so]
0x00000001 (NEEDED) Shared library: [libstdc++.so]
0x0000000e (SONAME) Library soname: [libusbhost.so]
0x0000001a (FINI_ARRAY) 0x2e84
0x0000001c (FINI_ARRAYSZ) 4 (bytes)
0x0000001e (FLAGS) BIND_NOW
0x6ffffffb (FLAGS_1) Flags: NOW
0x00000000 (NULL) 0x0
再向上查可以查到
frameworks/base/services/usb/java/com/android/server/usb
libandroid_servers.so