以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除。

一、fastboot的基本知识

1、什么是fastboot

(1)fastboot是android使用的一种刷机方法。

  • android系统设计了2种刷机方式:fastboot和recovery。

(2)fastboot使用usb作为物理传输。

  • 刷机其实就是镜像传输+烧录,fastboot刷机时就是通过usb线来传输镜像的。

(3)fastboot是uboot中的一个命令。

  • uboot进入命令行中后,可以在命令行执行fastboot命令,让uboot进入fastboot模式;
  • 刷机是在fastboot模式下进行的。

(4)fastboot需要主机端的fastboot软件配合。

  • 要实现fastboot刷机,只有开发板端uboot是不行的,还需要在主机上有fastboot.exe的软件配合。

(5)fastboot在开发板和主机间定义了一套协议。

  • fastboot是我们在开发板和主机之间定义的一套协议;
  • 这套协议以usb为底层传输物理层,协议规定了主机fastboot软件和开发板fastboot软件之间的信息传输规则。
  • 消息传递可以实现功能有:主机可以向开发板发送命令、开发板可以向主机发送回复、主机可以向开发板发送文件(download)

2、fastboot的工作原理

(1)uboot的fastboot命令将开发板伪装成一个usb设备。

  • 开发板并不是一个usb设备,因此开发板直接插到电脑上电脑是没有反应,没有提示发现设备需要装驱动的。
  • 伪装之后开发板就被主机windows识别成一个安卓手机了。

(2)主机的fastboot软件和开发板的fastboot程序通信。

  • 开发板端只要执行了fastboot命令进入fastboot模式即可,之后不用再进行开发板的端的操作。
  • 主机端通过运行fastboot相关命令,传递不同的参数来实现主机端和开发板端的通信。
  • 譬如主机端执行fastboot devices,则这个命令通过USB线被传递到开发板中被开发板的fastboot程序接收和处理,然后开发板向主机端发送反馈信息,主机端接收到反馈信息后显示出来。

(3)学习fastboot时,分析代码的思路

  • 主机端:fastboot.exe的源代码没有,fastboot协议虽然能找到但是很枯燥,所以主机端没有去分析的。
  • 开发板端:主要分析点就是uboot如何进入fastboot模式,fastboot模式下如何响应主机发送的各种命令。

二、uboot的fastboot代码分析

1、do_fastboot函数

  • do_fastboot函数本身涉及到很多操作SD/Nand等磁盘的,主要目的是为了刷机。要完整的分析fastboot的函数细节很复杂很麻烦,我们并不是要做这个。

2、rx_handler函数

函数调用关系

do_fastboot
fastboot_poll
fboot_usb_int_hndlr
fboot_usb_pkt_receive
fboot_usb_int_bulkout

fastboot_interface->rx_handler(函数指针)

指向cmd_fastboot.c/rx_handler

  • 找的过程涉及到USB物理层通信的一些概念和理解,相对比较复杂。
  • uboot的fastboot最终是通过rx_handler函数,来处理主机端fastboot软件发送过来的信息的。
  • fastboot协议的命令实现都在这个函数中提现。所以这个函数的分析就是重点。

3、代码分析

(1)大文件download机制

  • rx_handler函数中通过if和else分成了两部分,if部分负责处理download,else部分负责处理命令。
  • usb传输单次传输最大只能有限个字节(64、256),因此当我们发送比较小的东西(譬如命令)时可以单次传输完毕;当我们发送比较大的东西(譬如文件)时就必须要分包发送。

(2)down后的响应机制。开发板端通过fastboot_tx_status函数向主机发送响应,主机显示这个响应。

(3)uboot中fastboot有关的一些宏定义设置值

  • CFG_FASTBOOT_TRANSFER_BUFFER:配置fastboot工作时的缓冲区地址,fastboot在执行某些功能时需要大块内存做缓冲区(譬如download时)。
  • CFG_FASTBOOT_TRANSFER_BUFFER_SIZE  fastboot:缓冲区的大小。

(4)如果刷机时烧录uboot和zImage都正常,但是烧录android镜像x210.img时错误,提示image too large……

  • 错误的原因就是x210.img太大了,超出了CFG_FASTBOOT_TRANSFER_BUFFER_SIZE,因此uboot的fastboot报错。

三、fastboot的一些命令

(1)fastboot命令响应之:fastboot reboot

  • 在PC机这边可以远程重启开发板

(2)fastboot命令响应之:fastboot getvar

  • 作用是得到一些fastboot中定义的变量名的值,譬如version、product

(3)fastboot命令响应之:fastboot erase

(4)fastboot命令响应之:fastboot download

(5)fastboot命令响应之:fastboot boot

(6)fastboot命令响应之:fastboot flash

(7)fastboot命令响应之:fastboot oem

  • oem命令是用户自定义的,其他命令全都是fastboot协议定义的。
  • 有时候自带的命令不足以使用,oem厂商可能希望定义一些自己专有的命令,则可以使用oem命令。

与fastboot相关的知识相关推荐

  1. 前端面试:你应该了解的JS算法相关的知识

    前端面试:你应该了解的JS算法相关的知识 时间复杂度 通常使用最差的时间复杂度来衡量一个算法的好坏. 常数时间 O(1) 代表这个操作和数据量没关系,是一个固定时间的操作,比如说四则运算. 对于一个算 ...

  2. 面试中常问多线程相关的知识,在工作中到底用在哪里呢?

    求职面试中,面试官问到了高并发相关问题,该怎么办? 如果在求职面试的过程中,面试官问了你这个方向的问题,那你必须打起十二分的精神来回答这个问题,毕竟在各大厂招聘的JD中都提到了求职者具备[高并发经验] ...

  3. trunk口_南京课工场IT培训:VLAN、Trunk与三层交换机的相关理论知识

    各位小伙伴大家好,本次和大家分享的是VLAN.Trunk与三层交换机的相关理论知识,接下来我会从下面几个方面为大家进行解析: 1.VLAN的概念及优势 2.VLAN的种类 3.静态VLAN的配置 4. ...

  4. python网络编程需要学什么,python网络编程学习笔记(五):socket的一些补充 Python 网络编程需要学习哪些网络相关的知识...

    python的socket编程问题hdr = recvall(s, 5) if hdr is None: print 'Unexpected EOF receivingstruct在unpack的时候 ...

  5. java 快速从树节点找到数据_14期每日分享Java程序员分享超全哈希相关的知识

    什么是每日分享? 饥人谷每天为大家带来一篇程序员分享!内容都来自于热爱编程.热爱生活的小伙伴们!分享的话题与编程.生活.兴趣.爱好.运动等相关! 想要每天都进步一点点的小伙伴们快点下关注吧! 今天的分 ...

  6. LED显示相关基础性知识总结

    使用LED显示屏的技术参数来进行相关基础性知识的学习 LED显示相关基础性知识总结 1 像素点间距 1.1 基本概念 1.2 观看距离 2 像素密度 3 灯珠配置 4 亮度 5 扫描问题 6 可视角度 ...

  7. 大学生征信与相关金融知识手册

    珍爱信用记录 享受幸福人生                          ----大学生征信与相关金融知识手册   序  言      征信体系是现代金融体系运行的基石.有无健全的征信体系,是市场 ...

  8. 【生信】基因组学相关基础知识2

    [生信]基因组学相关基础知识2 本文图片来源网络或学术论文,文字部分来源网络与学术论文,仅供学习使用. 目录 [生信]基因组学相关基础知识2 9.细胞增殖与分化的定义和区别 10.有丝分裂与减数分裂 ...

  9. JAVA相关编译知识

    JAVA相关编译知识 总览 语言进化史 整体流程 编译器整体流程 词法分析 语法分析 语义分析 中间代码生成 目标代码生成器 代码优化 编译相关知识 编译种类 热点探测技术 编译什么 什么时候进行检测 ...

最新文章

  1. zephir开发的扩展“wudimei框架”之数据库使用方法
  2. 077_访问者的信息
  3. git push origin master报错
  4. POJ1269(判断线段相交)
  5. 制作五彩纸屑转场动效_何时以及如何将五彩纸屑添加到产品UI
  6. Progressive Web App(PWA)
  7. java打字游戏代码_牛逼啊!一个随时随地写Python代码的神器
  8. cdn dashjs_CSS以及JS各种库的在线CDN引用地址
  9. 如何查找不包含给定字符串模式的文件?
  10. Python3 循环删除列表中的指定变量
  11. 设计模式---访问者模式(C++实现)
  12. ascii码值大小顺序排序c语言,ascii码值的大小顺序是怎样的?
  13. python如何表示正整数_python 正整数
  14. 大一python实验二答案_python实验二
  15. 金融反欺诈 常用特征处理方法
  16. 【C++】2048游戏系列---优化模块第一稿【加载图片】
  17. 如果你恨一个人...
  18. CAD梦想画图中“轻松手绘”功能使用方法
  19. Java中IO(一、文件流)
  20. JavaWeb——JSP技术

热门文章

  1. k8s强制删除pod
  2. [国家集训队]middle
  3. BZOJ 4710 [Jsoi2011]分特产 解题报告
  4. [php] 高级教程
  5. [转]opencv学习资料
  6. Linux学习笔记11——文件I/O之二
  7. struts2--java.lang.IllegalAccessException: Class ognl.OgnlRuntime can not access a member of
  8. 用c#写的一个局域网聊天客户端 类似小飞鸽
  9. 挑战程序设计竞赛 (秋叶拓哉 / 岩田阳一 / 北川宜稔 著)
  10. Linux运维工程师面试-部分题库