嵌入式之fastboot的初步学习笔记

2023-11-05

:如下内容参考朱老师物联网大讲堂课件

1. 什么是fastboot

(1)fastboot是android使用的一种刷机方法.android系统设计了2种刷机方式:fastboot和recovery。

  • fastboot是一种线刷,就是使用USB数据线连接手机的一种刷机模式。相对于某些系统(如小米)卡刷来说,线刷更可靠,安全。
  • recovery是一种卡刷,就是将刷机包放在sd卡上,然后在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模式下如何响应主机发送的各种命令。

3.开发板端的命令分析

3.1 开发板进入fastboot模式

根据我们之前的刷机经验我们知道,在整个刷机过程中我们的开发板只要直接在uboot中输入fastboot就好。
那么我们就先看下fastboot指令在uboot中的实现

do_fastboot
	set_partition_table(设置分区表)
	fastboot_init(初始化特定于单板的fastboot)
	LCD_turnon
		LCD_Initialize_NONAME1
			LCD_setprogress(0) //开发板LCD显示
	进入while 循环,这样我们开发板端就已经逐步被好了,如下的就是在循环中判断是
	否发生了中断
	fastboot_poll(检查中断寄存器、判断是否连接USB、)
		fboot_usb_int_hndlr
			fboot_usb_pkt_receive(处理开发板端接收函数)
				fboot_usb_int_bulkout
					fastboot_interface->rx_handler(函数指针)
					指向cmd_fastboot.c/rx_handler

这个过程主要进行了读取分区表,并进入了while循环,等待主机发送指令

3.2 主机端发送的指令解析

找的过程涉及到USB物理层通信的一些概念和理解,相对比较复杂。最终uboot这边的fastboot是通过rx_handler函数来处理主机端fastboot软件发送过来的信息的。fastboot协议的命令实现都在这个函数中提现。所以这个函数的分析就是重点。
(1)大文件download机制
rx_handler函数中通过if和else分成了两部分,if部分负责处理download,else部分负责处理命令。usb传输单次传输最大只能有限个字节(64、256),因此当我们发送比较小的东西(譬如命令)时可以单次传输完毕;当我们发送比较大的东西(譬如文件)时就必须要分包发送。

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

3.3 uboot中fastboot有关的一些宏定义设置值

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

3.4 开发板端对主机fastboot命令响应

fastboot命令响应之:fastboot reboot
作用:在PC机这边可以远程重启开发板

/* reboot 
Reboot the board. */
if (memcmp(cmdbuf, "reboot", 6) == 0)
{
	if (!strcmp(cmdbuf + 6, "-bootloader"))
	{
		strcpy((char *)interface.transfer_buffer, (char *)FASTBOOT_REBOOT_MAGIC);
	}
	else
	{
		memset(interface.transfer_buffer, 0x0, FASTBOOT_REBOOT_MAGIC_SIZE);
	}

	sprintf(response,"OKAY");
	fastboot_tx_status(response, strlen(response), FASTBOOT_TX_SYNC);
	//udelay (1000000); /* 1 sec */

	do_reset (NULL, 0, 0, NULL);
			
	/* This code is unreachable,
	   leave it to make the compiler happy */
	return 0;
	}

fastboot命令响应之:fastboot getvar
作用: 得到一些fastboot中定义的变量名的值,譬如version、product…

	if (memcmp(cmdbuf, "getvar:", 7) == 0)
		{
			strcpy(response,"OKAY");
        
			if (!strcmp(cmdbuf + 7, "version"))
			{
				strcpy(response + 4, FASTBOOT_VERSION);
			} 
			else if (!strcmp(cmdbuf + 7, "product"))
			{
				if (interface.product_name) 
					strcpy(response + 4, interface.product_name);
			}
			else if (!strcmp(cmdbuf + 7, "serialno"))
			{
				if (interface.serial_no) 
					strcpy(response + 4, interface.serial_no);
			}
			else if (!strcmp(cmdbuf + 7, "downloadsize"))
			{
				if (interface.transfer_buffer_size) 
					sprintf(response + 4, "%08x", interface.transfer_buffer_size);
			} 
			else 
			{
				fastboot_getvar(cmdbuf + 7, response + 4);
			}
			ret = 0;
			goto send_tx_status;
		}

fastboot命令响应之:fastboot erase
作用:擦除寄存器闪存分区

fastboot命令响应之:fastboot download
作用:判断download_size的大小,如果在buffer_size以内,就显示对应下载的大小

		if (memcmp(cmdbuf, "download:", 9) == 0)
		{
			/* save the size */
			download_size = simple_strtoul (cmdbuf + 9, NULL, 16);
			/* Reset the bytes count, now it is safe */
			download_bytes = 0;
			/* Reset error */
			download_error = 0;

			printf ("Starting download of %d bytes\n", download_size);

			if (0 == download_size)
			{
				/* bad user input */
				sprintf(response, "FAILdata invalid size");
			}
			else if (download_size > interface.transfer_buffer_size)
			{
				/* set download_size to 0 because this is an error */
				download_size = 0;
				sprintf(response, "FAILdata too large");
			}
			else
			{
				/* The default case, the transfer fits
				   completely in the interface buffer */
				sprintf(response, "DATA%08x", download_size);
			}
			ret = 0;
			goto send_tx_status;
		}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式之fastboot的初步学习笔记 的相关文章

  • kafka存储原理介绍

    几个基本概念 Topic 消息主题 每一条消息都必须要指定主题 kafka集群可以同时进行多个topic的分发 Broker 消息处理的节点 可以立即为每个broker是一个单独的kafka进程 一般部署在不同的机器上 多个broker共同
  • js 计算月份差 ,天数差

  • Linux 安装 RocketMQ(Server)

    安装 linux版 官网下载地址 解压上传至 usr local 进入上传文件目录 cd usr local rocketmq all 4 7 0 source release bin 修改runbroker sh 修改runserver
  • chatgpt赋能python:如何通过Python赚钱

    如何通过Python赚钱 介绍 Python是一种高级编程语言 广泛用于Web开发 数据分析 机器学习等领域 Python具有简单易学 功能强大 易于维护等特点 因此非常受欢迎 而且 Python开源免费 可以在各个平台上运行 不需要花费太
  • Java设计模式-里氏替换原则

    里氏替换原则 Liskov Substitution Principle 定义1 如果对每一个类型为 T1的对象 o1 都有类型为 T2 的对象o2 使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时 程序 P 的行为没
  • 虚拟机ubantu连接物理机外部代理

    1 关闭windows防火墙 2 手动设置虚拟机代理 首先代理的允许局域网连接要打开 并且端口信息是根据v2rayN左下角的端口信息填写的 注意本地监听端口和局域网监听端口不一样
  • 【MATLAB第73期】# 源码分享

    MATLAB第73期 源码分享 基于MATLAB的不同类型数据排列方式合集 学习参考链接 1 对数组的行进行排序 单元格 字符串 类别 表 2 按字符代码对文本进行排序 3 对文件名 文件夹名或文件路径进行排序 4 对字符串 单元格 分类数
  • 原理图和PCB设计--EMC审查项(具体实施需结合公司实际项目做合理变更)

    原理图EMC设计检查要点 PCB EMC设计检查要点
  • python q-q图 和PP图

    转载于https www cnblogs com king lps p 7840268 html以供学习 侵权即删 一 QQ图 分位数图示法 Quantile Quantile Plot 简称 Q Q 图 统计学里Q Q图 Q代表分位数 是
  • qmake中文官方文档

    qmake QMake提供了一个用于管理应用程序 库 其他组件的构建过程的面向工程系统 QMake扩展了每个工程文件的信息 生成一个执行编译和连接过程的Makefile 本文翻译自Qt 4 8官方文档 一 QMake使用 QMake提供了一
  • vue导出excel

    1 下载依赖包 npm install S file saver xlsx npm install D Script loader 2 下载两个文件Blob js和 Export2Excel js 在src下创建vendor文件夹 将两个j
  • MVC简介

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 MVC简介 MVC架构最早是smalltalk语言研究团提出的 应用于用户交互应用程序中 smalltalk语言和java语言有很多相似性 都是面向对象语言 很自然的SUN在
  • QT的oracle驱动QOCI连接数据库产生QOCI driver not loaded和Unable to logon的问题解决

    相比mysql oracle的驱动真是一言难尽 都是商用的 mysql的驱动编译起来又快又稳 oci真的是让人捉鸡 无奈客户一开始起步用的都是国外买的成套系统 搭配oracle数据库 数据量大不可能进行迁移 所以只能硬着头皮上了 先记一波流
  • 解决数组塌陷问题的两种方法

    数组塌陷 操作数组的时候会使数组的索引发生变化 造成数组中的某项被跳过 例如 删除数组中的每一项 for var i 0 i lt arr length i arr splice i 1 1 每次执行i for var i 0 i lt a
  • if综合练习

    1 1 从控制台输入你要出的拳 石头 1 剪刀 2 布 3 2 电脑随即出拳 3 比较胜负 import random 1 从控制台输入要出的拳 player int input 请输入您要出的拳 石头1 剪刀2 布3 2 电脑出拳 com
  • IDEA个人常用设置及迅雷下载方式

    IDEA个人常用设置及迅雷下载方式 文章目录 IDEA个人常用设置及迅雷下载方式 1 迅雷下载方式 2 显示空格 3 120字符标准线及格式化自动换行 以下以2021 1为例 个人常用的一些设置总结 1 迅雷下载方式 有时候用浏览器下载很慢
  • 加密解密-对称加密与非对称加密

    目录 加密 Encryption Symmetric Key Encryption 对称密钥加密 凯撒密码 对称加密的例子 aesarCipher 例子 Kercos原理 Kerckhoff s Principle 有什么方法破解凯撒密码
  • 微信小程序 尺寸单位px与rpx之间的转换(入门篇)

    1 rpx 微信小程序中的尺寸单位rpx responsive pixel 可以根据屏幕宽度进行自适应 规定屏幕宽度为750rpx 微信官方建议视觉稿以iphone6为标准 2 个人示例测试 假设我们需要一个宽为200px 高为200px这
  • 重庆邮电大学c语言实验题库,重庆邮电大学软件技术基础实验报告(耿道渠).pdf...

    软件技术基础 实验报告 实验名称 顺序表的操作 班 级 学 号 姓 名 第 9 周 星 期 2 5 6 节 成 绩 一 实验目的 1 掌握顺序表结构的实现方式 2 掌握顺序表常用算法的实现 3 熟悉利用顺序表解决问题的一般思路 4 参照给定

随机推荐

  • Ubuntu 22.04 版本的网络配置

    Ubuntu 22 04 版本是一款强大的操作系统 它提供了广泛的网络配置选项 包括网络连接 路由设置 DNS 配置和防火墙配置等 在这篇博客中 我们将仔细介绍关于 Ubuntu 22 04 版本的网络配置 网络连接配置 在安装 Ubunt
  • 1.android 使用intent 跳转页面跳不过去

    使用intent 跳转页面跳不过去 直接崩了报错 ActivityNotFoundException错误 原因是因为要跳转到的页面我是通过继承BaseActavity来的 在清单文件里没有入口 所以跳不过去 解决需要手动在清单文件中添加Ac
  • win10误删的注册表能还原吗_Win10自带注册表修复方法 Win10注册表误删修复步骤...

    系统注册表 是计算机中一个很重要的部件 没有人可以保证自己能记住所有的注册表项 当注册表被修改或者其他原因让注册表失效的时候 就可以使用CMD对注册表进行修复 以下便是Win10自带注册表修复方法介绍 Win10自带注册表修复方法 1 按下
  • 解决引入taglib的时候,tomcat报taglib definition not consistent with specification version错误

    解决方法 出现此问题 是由于tomcat版本的问题 如果是7 0版本以前的tomcat 配置taglib如下
  • qt之槽函数的lambda写法

    文章目录 1 函数对象参数 2 操作符重载函数参数 3 可修改标示符 4 错误抛出标示符 5 函数返回值 6 函数体 一共包含六个部分 部分可以省略 1 函数对象参数 标识一个Lambda的开始 这部分必须存在 不能省略 函数对象参数是传递
  • 详细讲解C语言4(C语言系列)

    目录 前言 猜数字游戏 练习题 结束语 前言 在上一次博客中小编讲解了分支语句中的一些小习题 接下来小编带大家一起玩一个猜数字的小游戏 以及再和大家分享一些练习题 猜数字游戏 写一个猜数字游戏要求 1 自动产生1 100之间的随机数 2 猜
  • 【LeetCode】145.二叉树的后序遍历 - 使用迭代方式完成

    题目链接 LeetCode 145 二叉树的后序遍历 题目描述 给你一棵二叉树的根节点 root 返回其节点值的后序遍历 树中节点的数目在范围 0 100 0 100
  • 在maven中引入达梦包

    将达梦包install进maven仓库 可以 在idea运行中的工程中 terminal执行命令 Dfile 是jar包目录 尽量使用英文目录 DgroupId com dm DartifactId test Dversion 1 0 0
  • vue引用vant的弹出框Dialog

    1 消息提示 如下图 分两种弹框显示 点按钮 确认 提示弹出框 修改确认为圆角按钮风格 点按钮 确认 取消 提示弹出框
  • 挺起胸膛站下去

    试题内容 阅读下面的材料 根据要求写作 60分 好的故事 可以帮我们更好地表达和沟通 可以触动心灵 启迪智慧 好的故事 可以改变一个人的命运 可以展现一个民族的形象 故事是有力量的 以上材料引发了你怎样的联想和思考 请写一篇文章 要求 选准
  • 计算机电脑中了勒索病毒怎么办,Windows系统中了faust勒索病毒解密数据恢复

    电脑的操作系统被恶意软件攻击已不再是新鲜的话题了 而攻击的恶意软件中有一种叫做faust勒索病毒 常常袭击Windows电脑系统 如果我们的电脑在使用Windows操作系统时感染了faust勒索软件 请不要慌张 我们可以咨询专业的数据恢复厂
  • ECharts3使用入门

    最近项目中有用到百度ECharts 目前版本已经到3了 很多人说百度的这个东西是他最有良心的产品 用起来要比国外的插件简单点 这里主要讲一些简单的应用 算是简单的入门级别的 如果要是想更加的深入可以去看看范例 1 前期准备 1 相较于以前好
  • unix网络编程卷一:第四章——基本TCP套接口编程

    基本TCP套接口编程 4 1 过程 4 2 socket include
  • 数据挖掘分析概述

    目录 什么是数据挖掘分析 数据挖掘能够干什么 描述 评估 预测 分类 聚类 关联 数据挖掘的一般流程 业务理解阶段 数据理解阶段 数据准备阶段 建模阶段 评估阶段 部署阶段 什么是数据挖掘分析 数据挖掘是指从大量的数据中通过算法搜索隐藏于其
  • 关于在IDEA和jar包下MD5加密不一致问题

    关于在IDEA和jar包下MD5加密不一致问题 服务端 java 移动端 安卓 苹果 问题 MD5加密中文 在jar包下和idea下加密结果不一致问题 描述 移动端和服务端数据传输数据需要加解密 其中用到了AES RSA MD5 IDEA编
  • mysql导出表结构到excel

    1 执行如下sql 查询出想要的表信息 select c table name as 表名 t TABLE COMMENT as 表名描述 c column name as 字段名称 c column type as 数据类型 c COLU
  • vuecli2.0完成多页面应用中遇到的问题

    1 ECHO off SETLOCAL CALL find dp0 IF EXIST dp0 node exe SET prog dp0 node exe max old space size 4096 ELSE SET prog node
  • 拳王公社:知识付费项目!个体操作可年入千万!简单可复制!

    昨天 拳王分享了一篇 小白零基础靠副业年赚30W玩法 看懂一半至少年赚10W 揭秘了一个由个体思维转变到平台思维的网创人是怎么练就的 今天 我们分享的是 知识付费项目 个体操作可年入千万 简单可复制 这是在互联网上的一个纯粹的好项目 顺应互
  • 微服务可观测平台设计-总体设计

    背景 服务可观测性 预测与发现系统性能瓶颈 透视系统状态 为系统调优和查故障提供可靠数据支撑 参考和关键词 参考资料 https www cnblogs com erda p 15204516 html Metrics Metrics 计算
  • 嵌入式之fastboot的初步学习笔记

    注 如下内容参考朱老师物联网大讲堂课件 1 什么是fastboot 1 fastboot是android使用的一种刷机方法 android系统设计了2种刷机方式 fastboot和recovery fastboot是一种线刷 就是使用USB