lk-refs-heads-master\app\aboot下的rules.mk可知
OBJS += \
$(LOCAL_DIR)/aboot.o \
$(LOCAL_DIR)/fastboot.o
主要包含aboot.c 和 fastboot.c
在aboot.c 中
APP_START(aboot)
.init = aboot_init,
APP_END
aboot_init的实现如下:
可知只要用户按下BACK按键就跳过boot_linux_from_flash,进入到fastboot.
void aboot_init(const struct app_descriptor *app)
{
if (keys_get_state(KEY_BACK) != 0)
goto fastboot;

boot_linux_from_flash();
dprintf(CRITICAL, "ERROR: Could not do normal boot. Reverting "
"to fastboot mode.\n");

fastboot:
udc_init(&surf_udc_device);

fastboot_register("boot", cmd_boot);
fastboot_register("erase:", cmd_erase);
fastboot_register("flash:", cmd_flash);
fastboot_register("continue", cmd_continue);
fastboot_publish("product", "swordfish");
fastboot_publish("kernel", "lk");

fastboot_init((void*) SCRATCH_ADDR, 100 * 1024 * 1024);
udc_start();
}
调用usb初始化,并注册fastboot的boot/erase/flash/continue/product/kernel等命令,并fastboot_init,新建thread来接受pc发过来的命令
int fastboot_init(void *base, unsigned size)
{
thread_t *thr;
dprintf(INFO, "fastboot_init()\n");

download_base = base;
download_max = size;

event_init(&usb_online, 0, EVENT_FLAG_AUTOUNSIGNAL);
event_init(&txn_done, 0, EVENT_FLAG_AUTOUNSIGNAL);

in = udc_endpoint_alloc(UDC_TYPE_BULK_IN, 512);
if (!in)
goto fail_alloc_in;
out = udc_endpoint_alloc(UDC_TYPE_BULK_OUT, 512);
if (!out)
goto fail_alloc_out;

fastboot_endpoints[0] = in;
fastboot_endpoints[1] = out;

req = udc_request_alloc();
if (!req)
goto fail_alloc_req;

if (udc_register_gadget(&fastboot_gadget))
goto fail_udc_register;

fastboot_register("getvar:", cmd_getvar);
fastboot_register("download:", cmd_download);
fastboot_publish("version", "0.5");

thr = thread_create("fastboot", fastboot_handler, 0, DEFAULT_PRIORITY, 4096);
thread_resume(thr);
return 0;

fail_udc_register:
udc_request_free(req);
fail_alloc_req:
udc_endpoint_free(out);
fail_alloc_out:
udc_endpoint_free(in);
fail_alloc_in:
return -1;
}
这个函数又注册getvar/download命令,并建立thread接受pc发过来的执行,thread的callback函数是fastboot_handler
static int fastboot_handler(void *arg)
{
for (;;) {
event_wait(&usb_online);
fastboot_command_loop();
}
return 0;
}
这个函数是循环,如果usb接收到命令,就调用fastboot_command_loop来解析命令并调用命令的执行函数
static void fastboot_command_loop(void)
{
struct fastboot_cmd *cmd;
int r;
dprintf(INFO,"fastboot: processing commands\n");

again:
while (fastboot_state != STATE_ERROR) {
r = usb_read(buffer, 64);
if (r < 0) break;
buffer[r] = 0;
dprintf(INFO,"fastboot: %s\n", buffer);

for (cmd = cmdlist; cmd; cmd = cmd->next) {
if (memcmp(buffer, cmd->prefix, cmd->prefix_len))
continue;
fastboot_state = STATE_COMMAND;
cmd->handle((const char*) buffer + cmd->prefix_len,
   (void*) download_base, download_size);
if (fastboot_state == STATE_COMMAND)
fastboot_fail("unknown reason");
goto again;
}

fastboot_fail("unknown command");

}
fastboot_state = STATE_OFFLINE;
dprintf(INFO,"fastboot: oops!\n");
}

所有的命令都在cmdlist 这个列表中,调用memcmp来比较pc发的命令和fastboot的命令是否相等,如果相等就调用handle处理,

也就是我们fastboot_register 时候的第二个参数.

fastboot 源码分析1相关推荐

  1. 如何将镜像烧写至iNand(fastboot命令的源码分析)

    以下内容源于网络资源的学习与整理,如有侵权请告知删除. 参考博客 u-boot sdfuse命令烧录分析----从SD卡加载内核_white_bugs的博客-CSDN博客 一.将镜像文件烧写至iNan ...

  2. 【Android SDM660源码分析】- 01 - 如何创建 UEFI XBL Protocol DXE_DRIVER 驱动及UEFI_APPLICATION 应用程序

    [Android SDM660源码分析]- 01 - 如何创建 UEFI XBL Protocol DXE_DRIVER 驱动及UEFI_APPLICATION 应用程序 一.创建DXE_DRIVER ...

  3. android源码分析

    01_Android系统概述 02_Android系统的开发综述 03_Android的Linux内核与驱动程序 04_Android的底层库和程序 05_Android的JAVA虚拟机和JAVA环境 ...

  4. Android 源码分析

    查看源码版本号: build\core\version_defaults.mk //搜索该文件中的 PLATFORM_VERSION值 frameworks 目录 (核心框架--java及C++语言) ...

  5. F2FS源码分析-5.2 [数据恢复流程] 后滚恢复和Checkpoint的作用与实现

    F2FS源码分析系列文章 主目录 一.文件系统布局以及元数据结构 二.文件数据的存储以及读写 三.文件与目录的创建以及删除(未完成) 四.垃圾回收机制 五.数据恢复机制 数据恢复的原理以及方式 后滚恢 ...

  6. 【Android SDM660源码分析】- 04 - UEFI ABL LinuxLoader 代码分析

    [Android SDM660源码分析]- 04 - UEFI ABL LinuxLoader 代码分析 1. LinuxLoader.c 系列文章: <[Android SDM660开机流程] ...

  7. movi命令(do_movi函数的源码分析)

    以下内容源于网络资源的学习与整理,如有侵权请告知删除. 一.do_movi函数分析 当执行movi相关命令时,实际执行的是do_movi函数. x210 # help movi movi init - ...

  8. 【SA8295P 源码分析】44 - 如何替换 NON-HLOS.bin 中的 Wifi Firmware 固件

    [SA8295P 源码分析]44 - 如何替换 NON-HLOS.bin 中的 Wifi Firmware 固件 1.提取 NON-HLOS.bin 中的 Wifi Firmware 出来 2.把提取 ...

  9. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

最新文章

  1. gis可达性分析步骤_这个 Python 项目厉害了!多个实战案例教你分析时空数据处理...
  2. WEB中加载ApplicationContext的两种方式
  3. MFC中如何从EDIT控件中获取文字
  4. xampp安装后apache(端口占用)/mysql无法打开(Attempting to start MySQL service...)/Mysql无法修改端口
  5. 常用的LINQ to SQL 用法
  6. dedian系统云服务器,云服务器选择Ubuntu还是Debian镜像系统?根据熟悉度选择
  7. 中国第一软件开发_我第一次开发企业软件中学到的知识
  8. 【转】OWIN是什么?
  9. 解决IDEA不能编译XML文件
  10. 【系统架构设计师】软考高级职称,一次通过,2017年下半年系统架构设计师考试论文真题(论软件架构风格)
  11. 韩国企业百强排行榜!
  12. 联想G480安装WinXp
  13. C++的依赖倒置原则
  14. “秒抢红包”锁屏勒索病毒样本分析
  15. 个人公众号如何运营?可以从哪些方向突破?
  16. windows版微信Hook开发SDK之C#版-微信二次开发
  17. 显示和隐藏一个div的问题
  18. -xms -xmx无效
  19. KNN和Kmeans
  20. 掌握最新网管技术 做悠闲网管员

热门文章

  1. 爬虫 第三讲 数据解析
  2. Xshell在Windows和Linux间文件的上传和下载
  3. Java Jsp+Servlet+mysql实现的图书借阅系统(系统管理员/图书管理员/读者 功能:图书信息管理、图书借阅、我的借阅记录、管理图书、用户管理、反馈)
  4. 这几个手机的隐藏功能学起来,总有一天会用到
  5. 实现扩展 external 能力的 Vite 插件
  6. 给你的应用设置系统签名
  7. 计算a+aa+aaa+...
  8. web项目开发人员配比_Web开发人员应该知道的10个别名
  9. 程序员工作轶事(不定更)
  10. BZOJ1095 ZJOI2007 Hide 捉迷藏