[bubblegum96 问题解决] 笔记本thinkpad t440p+ubuntu16.04 环境下无法通过DFU下载SPL并点亮LED
本文是原「蜗窝讨论区」的历史存档(2016-08-07),来自版块「X Project」,共 7 帖。讨论区已停止服务,此处仅供查阅。
X project开发的过程中,calm.xia同学发现一个问题,描述如下(可参考“/forum/”):
calm.xia 写道: 现在板子(bubblegum 96)的LED灯是点亮了,但是有点问题,大概整理如下: 1. 结果: LED灯亮 环境: 台式机+win10+vmware10+ubuntu12.04 工具: x_project代码仓库的build目录和tools目录,并make libusb 和 make dfu image: tools/actions/spluboot.bin download: 插入usb线,按住ADFU键,插入电源,build目录下执行 sudo ../tools/dfu/dfu bubblegum 0xe406b200 ../tools/actions/spluboot.bin 1
- 结果: LED灯不亮 环境: 笔记本thinkpad t440p+ubuntu16.04和ubuntu14.04 工具: 同上 image: 同上 download: 同上
由于笔记本安装ubuntu12.04出了点问题没有安装成功,所以这种情况没结果。 现在的问题是: 不同环境下,LED灯出现点亮和无法点亮的问题,而且不同环境下download时的log都是一样的!!
由于问题比较有意思,现单独开一个帖子,debug该问题,具体的debug步骤可参考本帖后面的回复。
首先,自己搭建环境,重现该问题。最终可以稳定重现,我的环境为: 一个破笔记本电脑+ubuntu16.04
其次,筛选怀疑对象,首先想到的是,USB传输出问题了。 先检查能够工作时,不能工作时DFU下载的日志,竟然一模一样,如下:
[== Undefined ==]
sudo ../tools/dfu/dfu bubblegum 0xe406b200 ../tools/actions/splboot.bin 1
password for pengo:
board bubblegum
address 0xe406b200
filename ../tools/actions/splboot.bin
need_run 1
bDescriptorType: 1
bNumConfigurations: 1
iManufacturer: 0
bNumInterfaces: 1
Info: cannot detach kernel driver: LIBUSB_ERROR_NOT_FOUND (no worry)
Configuiration: 1
Handler: 0x9a91160
CBW: 55 53 42 43 00 00 00 00 83 43 00 00 00 00 10 05 00 b2 06 e4 83 43 00 00 00 00 00 00 00 00 00
Bulk transferred 17283 bytes
CSW:55534253000000000000000000
CBW: 55 53 42 43 00 00 00 00 00 00 00 00 00 00 00 10 00 b2 06 e4 00 00 00 00 00 00 00 00 00 00 00
Transffered: 31
CSW:55534253000000000000000000
还不死心,日志一样,会不会传输过程中出问题了呢? 参考这份文件:(https://wiki.ubuntu.com/Kernel/Debugging/USB) 使用USBMON,抓取USB传输的数据包,再次确认,发现还是一模一样,如下:
[== Undefined ==]
vim@vim-pc:~$ cat bus2data_ok.txt
ffff8800357c23c0 3921553956 S Co:2:014:0 s 00 09 0001 0000 0000 0
ffff8800357c23c0 3921554387 C Co:2:014:0 0 0
ffff8800357c23c0 3921555490 S Bo:2:014:1 -115 31 = 55534243 00000000 b31b0000 00001005 00b206e4 b31b0000 00000000 000000
ffff8800357c23c0 3921555631 C Bo:2:014:1 0 31 >
ffff880035511780 3922556019 S Bo:2:014:1 -115 4096 = 0a000014 1f2003d5 00000011 00000000 b81b0000 00000000 00500000 00000000
ffff880035511780 3922556244 C Bo:2:014:1 0 4096 >
ffff8800b4cb8900 3923556726 S Bo:2:014:1 -115 2995 = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
ffff8800b4cb8900 3923556976 C Bo:2:014:1 0 2995 >
ffff880034679840 3924557531 S Bi:2:014:2 -115 1024 <
ffff880034679840 3924557712 C Bi:2:014:2 0 13 = 55534253 00000000 00000000 00
ffff8800bc20b900 3925558226 S Bo:2:014:1 -115 31 = 55534243 00000000 00000000 00000010 00b206e4 00000000 00000000 000000
ffff8800bc20b900 3925558308 C Bo:2:014:1 0 31 >
ffff88003543e540 3925558402 S Bi:2:014:2 -115 1024 <
ffff88003543e540 3925558563 C Bi:2:014:2 0 13 = 55534253 00000000 00000000 00
vim@vim-pc:~$ cat bus2data_fail.txt
ffff8800357c2cc0 3962482159 S Co:2:015:0 s 00 09 0001 0000 0000 0
ffff8800357c2cc0 3962482337 C Co:2:015:0 0 0
ffff8800357c2cc0 3962482973 S Bo:2:015:1 -115 31 = 55534243 00000000 b31b0000 00001005 00b206e4 b31b0000 00000000 000000
ffff8800357c2cc0 3962483083 C Bo:2:015:1 0 31 >
ffff8800b4cb8540 3963483515 S Bo:2:015:1 -115 4096 = 0a000014 1f2003d5 00000011 00000000 b81b0000 00000000 00500000 00000000
ffff8800b4cb8540 3963483702 C Bo:2:015:1 0 4096 >
ffff8800b4cb80c0 3964484296 S Bo:2:015:1 -115 2995 = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
ffff8800b4cb80c0 3964484440 C Bo:2:015:1 0 2995 >
ffff8800bd600d80 3965484700 S Bi:2:015:2 -115 1024 <
ffff8800bd600d80 3965484797 C Bi:2:015:2 0 13 = 55534253 00000000 00000000 00
ffff8800bd6003c0 3966485241 S Bo:2:015:1 -115 31 = 55534243 00000000 00000000 00000010 00b206e4 00000000 00000000 000000
ffff8800bd6003c0 3966485288 C Bo:2:015:1 0 31 >
ffff8800b4cb6480 3966485484 S Bi:2:015:2 -115 1024 <
ffff8800b4cb6480 3966485659 C Bi:2:015:2 0 13 = 55534253 00000000 00000000 00
PS:可以根据上面链接中的解释,并结合抓包数据,理解DFU所使用的协议。
看来传输是对了,再想其它办法吧……
新的怀疑对象,PC USB port的供电问题吗?暂时没有验证,后续可以照着这个思路查一下。
无意中发现,通过如下的操作,可以成功解决问题:
** 写道:**
- 进入ADFU模式之前,使用USB cable连接开发板和PC
- 按住ADFU键,重启开发板,使其进入ADFU模式
- 重新拔插一下USB cable(这个是关键步骤)
再次进行DFU下载,一切都正常了!
由此可见,应该是S900 ROM代码中的USB driver有兼容性问题。 进入ADFU模式之后,PC已经可以正确检测到USB设备了,说明问题出在板子那边。拔插一次USB cable后,应该能够恢复板子中USB driver的状态。
接下来怎么办?ROM code我们看不到阿!麻烦!先这样吧,看看后续还没有其它思路。
如果没接 USB 重启开放板进入 ADFU 模式,然后在接入 USB 进行下载可以正常工作么? 还是说一定要进行一次拔插操作?
wowo 写道: 无意中发现,通过如下的操作,可以成功解决问题:
** 写道:**
- 进入ADFU模式之前,使用USB cable连接开发板和PC
- 按住ADFU键,重启开发板,使其进入ADFU模式
- 重新拔插一下USB cable(这个是关键步骤)
再次进行DFU下载,一切都正常了!
由此可见,应该是S900 ROM代码中的USB driver有兼容性问题。 进入ADFU模式之后,PC已经可以正确检测到USB设备了,说明问题出在板子那边。拔插一次USB cable后,应该能够恢复板子中USB driver的状态。
接下来怎么办?ROM code我们看不到阿!麻烦!先这样吧,看看后续还没有其它思路。
Codingbelief 写道: 如果没接 USB 重启开放板进入 ADFU 模式,然后在接入 USB 进行下载可以正常工作么? 还是说一定要进行一次拔插操作?
wowo 写道: 无意中发现,通过如下的操作,可以成功解决问题:
** 写道:**
- 进入ADFU模式之前,使用USB cable连接开发板和PC
- 按住ADFU键,重启开发板,使其进入ADFU模式
- 重新拔插一下USB cable(这个是关键步骤)
再次进行DFU下载,一切都正常了!
由此可见,应该是S900 ROM代码中的USB driver有兼容性问题。 进入ADFU模式之后,PC已经可以正确检测到USB设备了,说明问题出在板子那边。拔插一次USB cable后,应该能够恢复板子中USB driver的状态。
接下来怎么办?ROM code我们看不到阿!麻烦!先这样吧,看看后续还没有其它思路。
不可以,一定要拔插。 这才是奇葩的地方,无语中…… 哈哈
