fastboot 源码分析2

来源:互联网 发布:下载微客多软件 编辑:程序博客网 时间:2024/06/06 00:54
在fastboot中我们一般通过fastboot_register 来注册命令
fastboot_register("erase:", cmd_erase);
我们来看看fastboot_register的实现
static struct fastboot_cmd *cmdlist;


void fastboot_register(const char *prefix,
      void (*handle)(const char *arg, void *data, unsigned sz))
{
struct fastboot_cmd *cmd;
cmd = malloc(sizeof(*cmd));
if (cmd) {
cmd->prefix = prefix;
cmd->prefix_len = strlen(prefix);
cmd->handle = handle;
cmd->next = cmdlist;
cmdlist = cmd;
}
}
在fastboot.c 中定义一个fastboot_cmd类型的静态变量cmdlist,在调用fastboot_register 注册时会先通过
malloc 申请一个fastboot_cmd,然后分贝给prefix赋值命令的名称,如本例中的erase:,handle是收到命令后
要处理的函数,本例中赋值为cmd_erase。然后将这个新建的cmd加到cmdlist中
这样在fastboot 处理函数中fastboot_command_loop,会比较buffer中接收到的命令和cmdlist->prefix 相比较是否相等(if (memcmp(buffer, cmd->prefix, cmd->prefix_len))),
如果相等就调用handle函数。
cmd->handle((const char*) buffer + cmd->prefix_len,
   (void*) download_base, download_size);
   
我们会调用fastboot_publish 来注册常量,例如下例中定义version=0.5
fastboot_publish("version", "0.5");


我们看看fastboot_publish 的实现,和上面讲的fastboot_register 类似,也是有一个常量的varlist,通过fastboot_publish
注册的常量都在这个varlist上.
static struct fastboot_var *varlist;


void fastboot_publish(const char *name, const char *value)
{
struct fastboot_var *var;
var = malloc(sizeof(*var));
if (var) {
var->name = name;
var->value = value;
var->next = varlist;
varlist = var;
}
}


而我们又是通过
fastboot_register("getvar:", cmd_getvar);
来注册如果获取常量的
所以如果发过来的命令是getvar,就调用cmd_getvar。
而cmd_getvar 就是将varlist中的所有产量通过fastboot_okay 发送给pc,显示出来.
static void cmd_getvar(const char *arg, void *data, unsigned sz)
{
struct fastboot_var *var;


for (var = varlist; var; var = var->next) {
if (!strcmp(var->name, arg)) {
fastboot_okay(var->value);
return;
}
}
fastboot_okay("");
}
1 0
原创粉丝点击