前面分析过 dnw 的源码,发现 dnw 是将 usb 设备设置为 slave 模式,主机通过端点 0 来获取我们设置好的描述符,如果认为这些描述符符合 dnw 标准的话,便可以通过一个批量 Out 端点进行发送数据了。
那么 fastboot 是什么东西,看上去非常复杂的样子,我在 tiny4412 上使用 fastboot 来刷各种东西 kernel system bootloader ,用起来非常简单,只需要输入一条 fastboot flash kernel uImage ,就能自动烧写完成,用起来真是非常方便。
通过抓包分析,我发现 fastboot 只不过是 dnw 的升级版,相对于 dnw ,它多了一个批量输入端点,主机和设备之间有更多的交互。
Bus Hound 6.01 capture on Windows Vista (x64). Complements of www.perisoft.net
Device - Device ID (followed by the endpoint for USB devices)
(43) Android ADB Interface
(48) Android ADB Interface
Phase - Phase Type
CTL USB control transfer
IN Data in transfer
OUT Data out transfer
USTS USB status
Data - Hex dump of the data transferred
Descr - Description of the phase
Cmd... - Position in the captured data
Device Phase Data Description Cmd.Phase.Ofs(rep)
------ ----- ------------------------ ---------------- ------------------
43.0 CTL 80 06 00 01 00 00 12 00 GET DESCRIPTOR 1.1.0
43.0 IN 12 01 10 01 00 00 00 08 ........ 1.2.0
d1 18 02 00 00 01 01 02 ........ 1.2.8
03 01 .. 1.2.16
43.0 CTL 80 06 00 02 00 00 09 00 GET DESCRIPTOR 2.1.0
43.0 IN 09 02 20 00 01 01 00 c0 .. ..... 2.2.0
19 . 2.2.8
43.0 CTL 80 06 00 02 00 00 20 00 GET DESCRIPTOR 3.1.0
43.0 IN 09 02 20 00 01 01 00 c0 .. ..... 3.2.0
19 09 04 00 00 02 ff 42 .......B 3.2.8
03 00 07 05 81 02 40 00 ......@. 3.2.16
00 07 05 03 02 40 00 00 .....@.. 3.2.24
43.0 CTL 80 00 00 00 00 00 02 00 GET STATUS 4.1.0
43.0 IN 01 . 4.2.0
43.0 CTL 00 09 01 00 00 00 00 00 SET CONFIG 5.1.0
43.0 CTL 80 06 00 02 00 00 09 00 GET DESCRIPTOR 6.1.0
43.0 IN 09 02 20 00 01 01 00 c0 .. ..... 6.2.0
19 . 6.2.8
43.0 CTL 80 06 00 02 00 00 20 00 GET DESCRIPTOR 7.1.0
43.0 IN 09 02 20 00 01 01 00 c0 .. ..... 7.2.0
19 09 04 00 00 02 ff 42 .......B 7.2.8
03 00 07 05 81 02 40 00 ......@. 7.2.16
00 07 05 03 02 40 00 00 .....@.. 7.2.24
43.0 CTL 80 06 03 03 09 04 40 00 GET DESCRIPTOR 8.1.0
43.0 USTS c0010000 canceled 8.2.0
43.3 OUT 64 6f 77 6e 6c 6f 61 64 download 9.1.0
3a 30 30 30 30 30 30 30 :0000000 9.1.8
38 8 9.1.16
43.1 IN 44 41 54 41 30 30 30 30 DATA0000 10.1.0
30 30 30 38 0008 10.1.8
43.3 OUT 31 31 31 31 31 31 31 31 11111111 11.1.0
43.1 IN 4f 4b 41 59 OKAY 12.1.0
43.3 OUT 66 6c 61 73 68 3a 6b 65 flash:ke 13.1.0
72 6e 65 6c rnel 13.1.8
抛开主机识别设备过程,单看数据传输过程是十分简单的,首先主机将文件大小发送给设备,设备如果确定这么大小的文件可以接受那么返回给主机一个OKAY,然后主机就开始发送数据,待全部接受完成,设备发送一个 OKAY 返回给主机表示数据接受完成,主机发送 flash:kernel 命令从机将刚发送的数据烧写到 kernel 分区。是不是非常简单?
其实友善的 superboot 也是基于 fastboot 协议来搞的,只不过它针对自家产品进行了封装,主机和设备之间的交互更为复杂,可以来看一眼。
Bus Hound 6.01 capture on Windows Vista (x64). Complements of www.perisoft.net
Device - Device ID (followed by the endpoint for USB devices)
(32) FriendlyARM Superboot Interface
Phase - Phase Type
CTL USB control transfer
IN Data in transfer
OUT Data out transfer
Data - Hex dump of the data transferred
Descr - Description of the phase
Cmd... - Position in the captured data
Device Phase Data Description Cmd.Phase.Ofs(rep)
------ ----- ------------------------ ---------------- ------------------
32.0 CTL 80 06 00 01 00 00 12 00 GET DESCRIPTOR 1.1.0
32.0 IN 12 01 10 01 ff 00 00 08 ........ 1.2.0
d1 18 02 00 00 01 01 02 ........ 1.2.8
00 01 .. 1.2.16
32.0 CTL 80 06 00 02 00 00 09 00 GET DESCRIPTOR 2.1.0
32.0 IN 09 02 20 00 01 01 00 c0 .. ..... 2.2.0
19 . 2.2.8
32.0 CTL 80 06 00 02 00 00 20 00 GET DESCRIPTOR 3.1.0
32.0 IN 09 02 20 00 01 01 00 c0 .. ..... 3.2.0
19 09 04 00 00 02 ff 42 .......B 3.2.8
03 00 07 05 81 02 40 00 ......@. 3.2.16
00 07 05 03 02 40 00 00 .....@.. 3.2.24
32.0 CTL 80 00 00 00 00 00 02 00 GET STATUS 4.1.0
32.0 IN 01 . 4.2.0
32.0 CTL 00 09 01 00 00 00 00 00 SET CONFIG 5.1.0
32.0 CTL 80 06 00 03 09 04 40 00 GET DESCRIPTOR 6.1.0
32.0 IN 04 03 09 08 .... 6.2.0
32.3 OUT 53 4b 49 50 49 4e 46 4f SKIPINFO 7.1.0(3)
32.1 IN 65 e 8.1.0(3)
32.3 OUT 47 45 54 48 57 20 30 GETHW 0 13.1.0
32.1 IN 20 53 75 70 65 72 62 6f Superbo 14.1.0
6f 74 2d 32 34 34 30 20 ot-2440 14.1.8
56 65 72 73 69 6f 6e 3a Version: 14.1.16
20 31 2e 33 61 28 32 30 1.3a(20 14.1.24
32.3 OUT 47 45 54 48 57 20 31 GETHW 1 15.1.0
32.1 IN 20 43 50 55 3a 20 53 33 CPU: S3 16.1.0
43 32 34 34 30 20 34 30 C2440 40 16.1.8
30 4d 48 7a 0MHz 16.1.16
32.3 OUT 47 45 54 48 57 20 32 GETHW 2 17.1.0
32.1 IN 20 52 41 4d 3a 20 36 34 RAM: 64 18.1.0
4d 42 MB 18.1.8
32.3 OUT 47 45 54 48 57 20 33 GETHW 3 19.1.0
32.1 IN 20 4e 41 4e 44 3a 20 32 NAND: 2 20.1.0
35 36 4d 42 28 53 4c 43 56MB(SLC 20.1.8
29 20 49 44 3a 45 43 44 ) ID:ECD 20.1.16
41 31 30 39 35 A1095 20.1.24
32.3 OUT 47 45 54 48 57 20 34 GETHW 4 21.1.0
32.1 IN 20 22.1.0
32.3 OUT 47 45 54 49 4e 46 4f GETINFO 23.1.0
32.1 IN 31 20 55 6e 6b 6e 6f 77 1 Unknow 24.1.0
6e 20 63 6f 6d 6d 61 6e n comman 24.1.8
64 d 24.1.16
32.3 OUT 47 45 54 49 4e 46 4f GETINFO 25.1.0(26)
32.1 IN 31 20 1 26.1.0(26)
主机会获取开发板型号,nandflash 型号大小等等信息,其实只要按照它这个格式进行数据交互,我们就可以借助于 minitools 来烧写我们的开发板了,但是我认为没比较搞这么复杂,原生的 fastboot 足以满足我们的需求。
想仔细分析原理的同学建议看一下我整理的一下代码: