Fastboot通讯协议

   翻阅Android源代码,看到了fastboot protocol文件,阅读之后将其译成了中文。既为备忘,也方便一下懒得读E文的朋友。

    文档对于fastboot的交互模式,命令和变量解释的还是比较清楚的,对Android平台和更新ROM的底层细节感兴趣的朋友可以阅读一下。

    翻译欠妥或错误的地方,欢迎诸君指正。

 

====================================

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"          擦除指定的分区(将分区全部写成0xFFs)。

   "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特定的变量名不应该以小写字母开头。


文章标签:

本文链接: http://lmroot.com/blog/?id=5,尊重共享,欢迎转载,请自觉添加本文链接,谢谢!

版权声明: 本文除特别说明外均由原创

分享本文:
呃 本文暂时没人评论 来添加一个吧

分享:

支付宝

微信

歌曲 - 歌手
0:00