Chinaunix首页 | 论坛 | 博客
  • 博客访问: 302722
  • 博文数量: 172
  • 博客积分: 25
  • 博客等级: 民兵
  • 技术积分: 895
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-09 16:57
文章分类

全部博文(172)

文章存档

2012年(86)

2011年(86)

分类:

2012-03-05 15:22:35

原文地址:FastBoot协议 作者:embededgood

====================================
FastBoot协议版本0.4
====================================

    fastboot协议是一种通过USB连接与bootloaders通讯的机制。
    它被设计的非常容易实现,能够用于多种设备和运行Linux、Windows或者OSX的主机。

基本需求(Basic Requirements)
   * 两个端点,一个输入端,一个输出端。
   * 对于全速(full-speed)USB,最大包尺寸必须是64个字节;
     对于高速(hign-speed)USB,最大包尺寸必须是512个字节。
   * 协议完全是主机驱动(SSW注:相对于设备客户端而言),并且同步的。
     这与多通道、双向、异步的ADB协议不同。

传输和组帧(Transport and Framing)


   步骤1、主机发送命令(Command)。
                一个命令是一个ASCII字符串,并且只能包含在不大于64个字节的单个包内。
   步骤2、客户端(SSW注:设备)用一个单个的不大于64个字节的包响应。
                响应包开头四个字节是“OKAY”、“FAIL”、“DATA”或者“INFO”。
                响应包剩余的字节可以包含ASCII格式的说明性信息。
                a、INFO ->   剩余的60个字节包含说明信息(提供进度或者诊断信息)。
                                      这些说明信息应该被显示,然后重复步骤2。
                b、FAIL  ->   指示请求的命令失败。
                                      剩余的60个字节可以提供一个文本形式的失败原因呈现给用户。交互停止。
                c、OKAY ->  指示请求的命令成功完成。跳转到步骤5。
                d、DATA -> 请求的命令已经为数据阶段做好准备。
                                      一个数据响应包是12个字节长,组织形式为DATA00000000,
                                      其中8位十六进制的数字表示所传输数据的总大小。
   步骤3、数据阶段。
               根据命令的不同,主机或者客户端将发送指定大小的数据。
               比指定长度短的包总是可接受的,零长度的包将被忽略。
               这个阶段会一直持续,直到客户端已经发送或接收了上面数据响应包中指定大小的字节数为止。
   步骤4、客户端用一个单个的不大于64个字节的包响应。
                响应包开头四个字节是“OKEY”、“FAIL”或者“INFO”,类似于步骤2。
                a、INFO  -> 显示剩余的60个字节,然后返回到步骤4。
                b、FAIL   -> 显示剩余的60个字节(如果有的话)作为失败原因,命令失败,停止交互。
                c、OKAY -> 成功。跳转到步骤5。
   步骤5、命令执行成功。
                结束交互。

示例会话(Example Session)
   Host:主机   Client:客户端(设备)

   Host:   "getvar:version"                   请求版本号
   Client:    "OKAY0.4"                            返回版本为"0.4"

   Host:    "getvar:nonexistant"             请求未定义的变量
   Client:  "OKAY"                                   返回值为""

   Host:    "download:00001234"           请求发送0x1234大小的字节数据
   Client:  "DATA00001234"                   准备好接收数据

   Host:    < 0x1234 bytes >                    发送数据
   Client:  "OKAY"                                    数据接收成功完成

   Host:    "flash:bootloader"                  请求刷新数据到bootloader
   Client:   "INFOerasing flash"               指示状态/进度为“擦除flash”
                "INFOwriting flash"                指示状态/进度为“写入flash”
                "OKAY"                                    刷新成功完成

   Host:     "powerdown"                         发送“关机”命令
   Client:   "FAILunknown command"    命令执行失败

命令参考(Command Reference)

   * 命令参数以printf风格的转义序列表示。
   * 命令是ASCII字符串,发送时不用引号(下面命令外使用引号仅仅为了在此文档中清楚的表达命令),发送时也不以字节0结尾。
   * 以小写字母开头的命令是为本规范保留的,OEM特定的命令不应该以小写字母开头,以防和规范的未来版本不兼容。


   "getvar:%s"                    从bootloader读取配置或版本变量。变量的值在OKAY响应的后面返回。
   "download:x"                写入数据到内存,供下面阐述的”boot“、”randisk“、”flash“等命令使用。
                                          如果RAM有足够的空间,客户端将用”DATAx“回应;否则,将回应”FAIL“。
                                          下载数据的大小会被记下来。
   "verify:x"                         发送一个数字签名去验证下载的数据。
                                           如果bootloader是”secure(安全的)“,那么签名验证是必须的;
                                           如果bootloader不是”secure“,”flash“和”boot“命令会忽略签名验证。
   "flash:%s"                        将之前下载的影像写入到指定的分区(如果可能的话)。
   "erase:%s"                       擦除指定的分区(将分区全部写成0xFF)。
   "boot"                             之前下载的数据一个boot.img,应该按照boot.img的正常步骤被启动。
   "continue"                      继续正常启动工作(如果可能的话)。
   "reboot"                          重新启动设备。
   "reboot-bootloader"      重新启动进入bootloader。
                                           对于升级bootloader之后,用新的bootloader去升级其他分区的升级过程,

                                           这个命令是很有用的。
   "powerdown"                 设备关机。

客户端变量(Client Variables)
   命令"getvar:%s"用来读取客户端变量,客户端变量代表关于设备和运行于设备之上软件的各种信息。

   当前已经定义的变量名称如下:

   version                       FastBoot协议所支持的版本。
   version-bootloader   Bootloader的版本字符串。
   version-baseband     基带(Baseband)软件的版本字符串。
   product                      产品名称。
   serialno                      产品序列号。
   secure                        如果值是”yes“,说明这是一个安全的bootloader,在它安装或启动映像之前,需要一个签名。

   以小写字母开头的变量名被本规范保留,OEM特定的变量名不应该以小写字母开头。

fastboot协议是PC通过USB与手机上的bootloader通信的协议。适用于Linux,Windows,OSX等平台。

 

基本配置要求:

1、USB连接PC与手机。

2、对于high-speec USB,包的最大尺寸必须是512byte.对于full-speed USB,包的最大尺寸必须是64byte。

3、协议由PC端驱动。

 

协议传输过程如下:

1、PC向手机发送一个命令,命令由ASCII字符组成,必须存在在一个不大于64byte的包里。

2、手机向PC响应一个不大于64byte的包。包的最前面四个byte是“OKAY”、“FAIL”、“DATA”、“INFO”中的一个。后面如果还有byte,包含就是ASCII信息。下面具体解释

INFO:后面的60个byte代表的信息被显示完成后,跳到#2继续执行。

FAIL:命令执行失败。后面的60个byte是需要显示给用户的失败信息。

OKAY:命令执行成功。跳到#1.

DATA:命令执行成功,开始进入数据传输阶段。一个DATA响应包的大小是12byte,通常是DATA00000000这样的形式,后面的8个数字代表的要传输的数据包的总大小。

3、如果#2时,PC收到的是DATA命令的话,就开始传输数据。0byte数据会被忽略。当#2指示的数据大小被传输完成时,数据传输结束。

 

 

例子:

Host:  "getvar:version"          查看版本号

Client: "OKAY0.4"                  返回版本号

Host:  "getvar:nonexistant"   查看一些未定义的变量

Client: “OKAY”                       返回值“”

Host:  “download:00001234” 请求0x1234个byte的数据

Client: "DATA00001234"       准备好接收数据

Host:  "< 0x1234 bytes >"    发送数据

Client "OKAY"                        成功

Host:  "flash:bootloader"        把数据刷到bootloader中。

Client "INFOerasinig flash"     指明状态或进度

          "INFOwriting flash"

          "OKAY"                       成功

Host:  "powerdown"              发送一个关机命令

Client: "FAILunknown command"失败

 

 

命令手册:

1、命令参数格式遵守printf-style

2、命令都是ASCII字符串,不能包含引号,不用以0byte结尾

3、本文档中的命令都是以小写字母开头,为了兼容,OEM的命令不要以小写字母开头。

 

"getvar:%s"

从bootloader读取一个配置/版本变量。变量值跟在OKAY响应后面返回。

“download:%08x”

把数据写入内存,这些数据会被后面执行的“boot”,"ramdisk","flash"等使用。Client的RAM如果有足够的空间的话,会返回一个“DATA%08x”。否则返回“FAIL”。数据大小会被记录下来。

"verify:%08x"

发送一个数字签名来验证下载的数据。如果bootloader当前是“secure”模式,签名会被使用。如果是“flash”和“boot”模式的话,签名被忽略。

"flash:%s"

把前面下载的image写到指定名字的分区中。

"erase:%s"

擦除指定名字的分区。

"boot"

前面下载的数据是一个boot.imgand should be booted according to the normal

 procedure for a boot.img

"continue"

Continue booting as normal (if possible)

"reboot"

重启设备

"reboot-bootloader"

重启并回到bootloader,这对那些需要先升级bootloader才能升级其它分区的升级过程很有用。

"powerdown"

关闭设备。

 

Client端的变量

"getvar:%s"命令可以读一些client端的变量。这些变量通常会可以告诉我们设备以及安装在设备上的软件的信息。目前已经定义的变量如下:

version

当前支持的FastBoot协议版本,对这个文档来说,它的值应该是“0.3”

version-bootloader

Bootloader的版本号

version-baseband

Baseband软件的版本

product

产品的名字

serialno

产品的序列号(serial number)

secure

如果值是“yes”,表示这是一个secure的bootloader,在安装或者boot那些image之前需要一个签名

 

另外,这些变量的名字都是以小写字母开头,为了兼容性考虑,OEM的变量名字不要以小写字母开头。

From net


阅读(1259) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~