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("");
}
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
- fastboot 源码分析2
- fastboot 源码分析1
- 四极管:FastBoot 协议源码
- FastBoot 协议源码 .
- fastboot命令分析
- fastboot命令分析
- fastboot cmd 分析
- fastboot花屏问题分析
- Fastboot
- fastboot
- fastboot
- fastboot
- fastboot
- fastboot
- fastboot
- fastboot
- fastboot
- fastboot
- linux上安装redis以及redis扩展
- style——继承
- HDU 5441 Travel(并查集)
- eclipse关于项目validate的过滤选择
- linux3.4版本内核make出现的错误----缺少compiler-gcc5.h
- fastboot 源码分析2
- HDU 1592 Half of and a Half(高精度)
- oracle字符窜操作
- POJ-1113-Wall
- linux shell 获取当前正在执行脚本的绝对路径
- PAT 1008
- 百度地图API示范例
- jquery ajax error 200 解决方案
- 数据结构实验之链表四:有序链表的归并