如题,公司自制am335x处理器单板,uboot、linux和编译器使用TI SDK6.0,rootfs使用buildroot生成。现在需要将usb0配置为Peripheral模式,使能ethernet gadget功能,使PC机能够和usb接口通讯。但折腾了很久也没搞好,也缺少定位手段和思路,特来找大神求助。
为了便于分析,我们拿beaglebone black加载SDK6.0的prebuilt image进行对比分析的。自制单板的硬件原理图见《usb接口原理图及pcb图.png》。
目前调试遇到的现象总结下来有下面几个方面:
- 上电启动
自制单板usb接口的vbus电源也接入电源管理芯片tps65317的,此外tps65317还有一路5v供电设计,自制单板的通电启动是双电源的。
现有硬件基础上,尝试了以下几种上电情况,usb设备在pc上均识别为unkown device:
- 单独5v供电,am335x从nandflash正常启动,刚一通电,电脑显示unkown device后,进入uboot继续显示;
- 单独插入usb接口,am335x尝试从不存在的mmc启动,电脑显示unkown device,此时无法正常启动,串口无任何输出;
- 5v供电和usb接口同时插入,此时的配置是从以太网接口启动,进行软件烧录,电脑也显示unkown device后,进入uboot继续显示。
上述情况是根据现有上电启动设备配置情况做的比较,后来想到am335x还可以直接配置为从usb接口启动,并且就是用usb gadget ethernt烧录程序的。于是修改配置为usb启动,也就是不接5v供电,插上usb接口后am335x直接启动。此时发现电脑端可以识别到linux rndis网络设备,符合预期要求,通过uniflash软件可以正常将spl烧录进片上ddr。
- Uboot阶段
前一步直接通过usb启动可以烧录,似乎可以说明usb接口的数据通信硬件是可以的。为了避免5v供电的干扰,直接将启动配置修改为插上usb接口后,从nandflash启动,此时am335x外部只有usb接口和串口线连接。希望能够在uboot下将usb接口调通。
但uboot下调试也不行,上电后电脑先识别unkown device,即便进入uboot后执行初始化程序PC机也不能识别到rndis。
Uboot下单板启动记录见《uboot usb启动详细debug.txt》,已开启debug信息。启动过程中用bushound抓包数据见《uboot启动后的枚举过程.txt》,用USBTrace抓包的数据见《uboot startup and dhcp.utl》文件标签294之前的内容。从USBTrace的信息来看,显示查询设备信息失败,此时电脑上显示的unkown device详细信息中vid和pid都是0,USBTrace抓取到的枚举失败后close的过程见图《USBTrace数据uboot startup and dhcp异常信息截图.jpg》。
上述uboot启动过程中枚举失败,从uboot启动的debug信息中也没见什么线索。在uboot启动命令行中,尝试直接开启usb ether也不行。具体方法是首先执行setenv ethact usb_ether,然后执行dhcp命令。显示错误信息如下:
mkq161# dhcp
Trying usb_ether
<== devctl 99
using musb-hdrc, OUT ep1out IN ep1in STATUS ep2in
MAC 60:64:05:24:0a:3c
HOST MAC de:ad:be:af:00:00
rndis_register: configNr = 0
rndis_set_param_dev: configNr = 0
rndis_set_param_vendor: configNr = 0
rndis_set_param_medium: configNr = 0, 0 0
RNDIS ready
gadget D+ pullup on
usbintr (1) epintr(0)
** IRQ peripheral usb0001 tx0000 rx0000
<== Power=e0, DevCtl=99, int_usb=0x1
ERROR: The remote end did not respond in time.
at ether.c:2395/usb_eth_init()
FAIL
Initial value for argc=3
Final value for argc=3
Trying NatSemi_DP83848
link up on port 0, speed 100, full duplex
BOOTP broadcast 1
返回了一个remote end无响应就切换为普通ethernet设备了,但是看这个信息也没什么线索。到这里插上usb接口,直接从nandflash启动也是无解了。
- Kernel阶段
最后将下kernel的现象,kernel的工作其实是最开始做的,并且和BBK的对比都是在kernel阶段进行的。
首先配置内核,将am335x的usb0接口在arch\arm\mach-omap2\board-xx.c里配置为Peripheral模式,内核配置文件使用sdk自带的am335x_evm_defconfig。在menuconfig的system type里选中自制单板,将driver/usb/usb_gadget里的ethernet选为内建模块,重新编译加载内核。BBK的内核也采用同样的配置,重新编译加载,不同的是system type选择bbk单板。最终配置文件参见《am335x_evm_defconfig.txt》
加载后,kernel bootup的信息都一致,分别见《bbk内建启动.txt》和《mkq161内建启动 usb perh.txt》。加载后,bbk无需配合操作,pc机直接出现rndis网络设备,只是未连接状态,并且查看设备属性也有正确的vid和pid,但是在bbk执行ifconfig usb0 up后,pc机的网口会显示联机,并且bbk和pc机可以通过usb0继续ping包通讯。而自制单板mkq161,启动后显示unknown device,即便执行了ifconfig usb0 up也不行,抓包显示又是启动过程中usb枚举失败。
内核启动后分别用cat /proc/driver/musb_hdrc.0和lsusb命令检查了bbk和自制单板的信息,分别见《bbk cat musb .txt》和《mkq cat musb.txt》。两块单板启动后,包括执行ifconfig usb命令后的dmesg记录分别见《bbk dmesg.txt》和《mkq dmesg.txt》,看上去也没什么差异。但是这两者用的都是同一个内核啊,这又是为何呢?
上面啰嗦了一大堆详细调试过程,简单而言,就是usb启动加载能够加载软件,但是在uboot和kernel中均失败,通过和bbk的对比,又没发现软件配置有什么差异,bbk确可以工作。所以经过数天折磨,从现象来看,软件没问题、硬件也有能工作的,到这里已经没啥头绪了。还请哪位大神能留步细看,拜谢。
PS:前面验证uboot时不知道0001-u-boot-Change-default-cdc_connect_timeout-to-15s.patch补丁的事情,不知道是否和这个补丁有关系,稍后验证。
Jian Zhou:
你可以参考下下面这个贴子:
http://www.deyisupport.com/question_answer/dsp_arm/sitara_arm/f/25/t/73278.aspx
BBB进行USB烧写,就是把USB模拟成ethernet gadget。
kai zong:
回复 Jian Zhou:
谢谢回复,我已经按照步骤打开了uboot里的usb配置,今天又添加了之前未验证的补丁0001-u-boot-Change-default-cdc_connect_timeout-to-15s.patch,但实际测试uboot下usb ethernet gadget仍然无法正常工作。
Jian Zhou:
回复 kai zong:
手上有没有BBB的板子?有没有在BBB上测试过?