转载留做备份,原文地址:http://92ez.com/?action=show&id=23341

首先找到osmocon.c这个源文件,具体目录在这里

osmocom-bb/src/host/osmocon/osmocon.c

编辑器打开,找到help帮助信息,这里就解释了各个参数

#define HELP_TEXT \
    "[ -v | -h ] [ -d [t][r] ] [ -p /dev/ttyXXXX ]\n" \
    "\t\t [ -c ] (enable chainloading of highram-images)\n" \
    "\t\t [ -s /tmp/osmocom_l2 ]\n" \
    "\t\t [ -l /tmp/osmocom_loader ]\n" \
    "\t\t [ -m {c123,c123xor,c140,c140xor,c155,romload,mtk} ]\n" \
    "\t\t [ -i beacon-interval (mS) ]\n" \
    "\t\t  file.bin\n\n" \
    "* Open serial port /dev/ttyXXXX (connected to your phone)\n" \
    "* Perform handshaking with the ramloader in the phone\n" \
    "* Download file.bin to the attached phone (base address 0x00800100)\n"

但是具体是干啥用的注释写的并不是很清楚,博主本着研究学习的心态,开始各种尝试。

先看注释里面的三句话

*打开串口端口 /dev/ttyXXXX (已经跟手机连接好的)
*跟手机里面的ramloader执行握手
*下载bin文件到目标手机(基址 0x00800100)

其实这这三句话说了也没什么乱用,就是介绍下功能,具体的啥也没说,看来还是得慢慢折腾。我们接着看代码,很幸运,我们在下面的代码中找到了switch,输入的参数就进到这里了,看看都是些啥

while ((opt = getopt(argc, argv, "d:hl:p:m:cs:i:v")) != -) {
        switch (opt) {
        case 'p':
            serial_dev = optarg;
            break;
        case 'm':
            dnload.mode = parse_mode(optarg);
            if (dnload.mode == MODE_INVALID)
                usage(argv[]);
            break;
        case 's':
            layer2_un_path = optarg;
            break;
        case 'l':
            loader_un_path = optarg;
            break;
        case 'v':
            version(argv[]);
            break;
        case 'd':
            parse_debug(optarg);
            break;
        case 'c':
            dnload.do_chainload = ;
            break;
        case 'i':
            dnload.beacon_interval = atoi(optarg) * ;
            break;
        case 'h':
        default:
            usage(argv[]);
            break;
        }
    }

这么长,别着急,我们一条条来,研究这东西没点儿耐心咋行?先看第一个case

serial_dev = optarg;

p这个参数里面进行了一个赋值操作,我们来找找这两个变量都代表啥意思。首先找到

const char *serial_dev = "/dev/ttyUSB1";

看到这句话应该能够明白serial_dev其实就是代表了串口设备的标识,这里的赋值操作就是将获取到的设备标识重新赋值给serial_dev,如果没有p参数,默认的设备标识就是/dev/ttyUSB1,显然不太符合我们的要求,因为我们通常看到的串口标识是/dev/ttyUSB0,所以带上p参数是很有必要的。optarg实际上就是我们输入的参数名。

好的,接着我们看第二个重要的参数-m参数

dnload.mode = parse_mode(optarg);
    if (dnload.mode == MODE_INVALID)
            usage(argv[]);

看字面上的意思好像是下载模式的意思,我们找找代码,恩,很快我们就找到了一个switch,看代码

switch (dnload.mode) {
    case MODE_C155:
        hdr = data_hdr_c155;
        hdr_len = sizeof(data_hdr_c155);
        break;
    case MODE_C140:
    case MODE_C140xor:
    case MODE_C123:
    case MODE_C123xor:
        hdr = data_hdr_c123;
        hdr_len = sizeof(data_hdr_c123);
        break;
    case MODE_ROMLOAD:
        break;
    default:
        break;
    }

看样子已经把dnload.mode传进去了,再找找,找到这一段

enum dnload_mode {
    MODE_C123,
    MODE_C123xor,
    MODE_C140,
    MODE_C140xor,
    MODE_C155,
    MODE_ROMLOAD,
    MODE_MTK,
    MODE_INVALID,
};

看来刷机模式也只有这几种了,我们输入的是c123xor,使用了parse_mode方法进行了转换,看下parse_mode具体是怎么实现的

static int parse_mode(const char *arg)
{
    if (!strcasecmp(arg, "c123"))
        return MODE_C123;
    else if (!strcasecmp(arg, "c123xor"))
        return MODE_C123xor;
    else if (!strcasecmp(arg, "c140"))
        return MODE_C140;
    else if (!strcasecmp(arg, "c140xor"))
        return MODE_C140xor;
    else if (!strcasecmp(arg, "c155"))
        return MODE_C155;
    else if (!strcasecmp(arg, "romload"))
        return MODE_ROMLOAD;
    else if (!strcasecmp(arg, "mtk"))
        return MODE_MTK;
 
    return MODE_INVALID;
}

对,if else很容易理解,程序中默认的刷机模式是MODE_C123,而我们通常使用的是c123xor,转换一下应该是MODE_C123xor,所以m参数是很有必要的。

接着看第三个参数-s,case是这样的

layer2_un_path = optarg;

又是一个赋值操作。而且直接将获取到的值赋值,没有任何转换,我们去找找layer2_un_path这个变量,不远处有一句话

const char *layer2_un_path = "/tmp/osmocom_l2";

这句话应该很容易看出它的作用,其实就是设置layer2的一个路径,但是这个path到底用来干啥的呢,再找代码,追踪到这个判断

/* unix domain socket handling */
if (register_tool_server(&dnload.layer2_server, layer2_un_path,SC_DLCI_L1A_L23) != )
    exit();

这里有个方法register_tool_server(),这里应该有个返回值,我们去找找这个方法

static int register_tool_server(struct tool_server *ts,const char *path,uint8_t dlci)

这是个静态方法,*path形参就是我们上面看到的layer2_un_path。继续追踪

strncpy(local.sun_path, path, sizeof(local.sun_path));

在这句之后path就消失了,那我们就去问问strncpy这个方法,它把path搞哪去了,找到strncpy,噢,很遗憾,strncpy这个家伙很狡猾,在这个文件里面就只出现了一次。参考osmocom-bb官网上的例子,发现这个其实就是在缓冲区写入一个osmocom_l2的文件,这个文件到底是作什么用的目前还没研究出来。经过仔细翻阅文档,发现这里其实就是向/tmp目录写入一个空文件,用于绑定socket,因为后面嗅探到的数据都是通过socket进行传递。这个参数对于多个机器同时嗅探很有用,可以同时创建多个socket进行绑定,这样消息传送就有多个管道,不会导致信息的混乱。

看第四个参数-l参数,这个

loader_un_path = optarg;

看起来跟-s差不多,也是一个关于路径的。等会儿再看。

看第五个参数-v,这个参数好像很少用的吧。执行了一个

version(argv[]);

version是版本的意思?

static int version(const char *name)
{
    printf("%s version %s\n", name, PACKAGE_VERSION);
    exit();
}

看起来这个好像真的只是打印一个版本的样子。继续看参数-d,这个参数是直接把获取到的参数值传到parse_debug方法里面,看看parse_debug这个方法是干啥的

void parse_debug(const char *str)
{
    while(*str) {
        switch(*str) {
        case 't':
            dnload.dump_tx = ;
            break;
        case 'r':
            dnload.dump_rx = ;
            break;
        default:
            printf("Unknown debug flag %c\n", *str);
            abort();
            break;
        }
        str++;
    }
}

这个方法也很容易理解,就是用来调试的,在下载固件的时候dump出tx或者rx的一些信息。好的继续看参数-c,这个参数直接执行了赋值操作

dnload.do_chainload = ;

看了看dnload.do_chainload这个其实是针对一些特殊机型Calypso,默认值为0,我们通常直接使用默认值就可以了,所以不需要加这个参数。

下面要看的是参数-i,这个参数好像也没看到用过

dnload.beacon_interval = atoi(optarg) * ;

看到这里我推测这个应该跟时钟有关系。好了,命令里面用到的参数就这些,更加深入的原理部分以及更多研究敬请关注。

osmocom-bb中用osmocon刷入固件命令那些参数你都弄懂了吗?的更多相关文章

  1. NodeMCU之旅(一):构建、刷入固件,上传代码

    扬帆起航 本系列文章将试图实现,使用Web页面远程点亮led.具体包括: 在NodeMCU上搭建HTTP服务器,使其可以通过Web页面配置要接入的网络. 在配置页面可以显示附近中英网络名与信号强度. ...

  2. NodeMCU入门(2):在线构建、刷入固件,上传代码

    准备工作 1.NodeMCU模块 2.ESP8266Flasher.exe 3.ESPlorer v0.2.0-rc6 构建固件 Building the firmware提供了三种构建你自己固件的方 ...

  3. OpenWrt固件刷入后串口终端没有反应的问题

    [路由器开发板硬件固件配置] MTK双频:MT7620a + MT7612e 内存:256 MB 闪存:16 MB 固件:MTK自带SDK中的OpenWrt固件(mtksdk-openwrt-2.6. ...

  4. NodeMCU入门(1):刷入At固件,透传数据到TcpServer和Yeelink平台

    准备工作 1. NodeMCU  LUA ESP8266 CP2102  WIFI Internet Development Board,仔细看背面可以看出自带cp2102模块,可以通过普通的手机充电 ...

  5. Shell 参数(2) --解析命令行参数工具:getopts/getopt

    getopt 与 getopts 都是 Bash 中用来获取与分析命令行参数的工具,常用在 Shell 脚本中被用来分析脚本参数. 两者的比较 (1)getopts 是 Shell 内建命令,geto ...

  6. 极路由1s,固件需要刷入RipOS系统的加40块

    极路由1s,固件需要刷入RipOS系统的加40块,集成wifidog功能,wifi广告路由器的理想选择功能. 经过测试,无线性能稳定,无线可带32个手机客户端. 具体配置: 7620CPU ,主频58 ...

  7. 关于ESP8266 NodeCMU固件无法刷入新代码的解决方法

    在玩ESP8266时,有时候会无意中写了导致死循环的代码,或都某些函数传递了不合适的参数导致系统崩溃,这可能会导致ES8266不停地重启,这时我们发现无法刷入新的代码,也无法删除8266中的原代码.我 ...

  8. Newifi2(D1) 刷入pb-boot和breed的记录

    今天要给一个newifi d1刷系统时发现居然还是原厂的uboot, 使用uboot刷入rom时会进行校验拦截第三方的rom. 之前有刷过这个设备的, 但是已经完全记不清怎么处理的了. 查了一下, 这 ...

  9. 极路由U-boot解锁刷root固件教程,root后可刷华硕、如意云等多种固件,附赠全套刷软

    9008正式版固件将会封堵此漏洞,想root的同学尽快了.安装新工具箱里的root保留,可升级官方最新固件并保留root. 此方法并非本人原创,只是将root的过程和经验做个总结,比较适合菜鸟做参考, ...

随机推荐

  1. 【CITE】5个最优秀的Java和C#代码转换工具

    毋庸置疑,Java是一门最受欢迎而且使用最广泛的编程语言,目前有超过9百万的Java开发者从事web服务的开发,Java以“编写一次,可在任何地方运行”而著称,同时这也是其大受欢迎的主要原因. 和Ja ...

  2. robot.libdocpkg package

    mplements the Libdoc tool. The command line entry point and programmatic interface for Libdoc are pr ...

  3. Python 练习 12

    #!/usr/bin/python # -*- coding: UTF-8 -*- year = int(raw_input('year:\n')) month = int(raw_input('mo ...

  4. Android 使用dagger2进行依赖注入(基础篇)

    0. 前言 Dagger2是首个使用生成代码实现完整依赖注入的框架,极大减少了使用者的编码负担,本文主要介绍如何使用dagger2进行依赖注入.如果你不还不了解依赖注入,请看这一篇. 1. 简单的依赖 ...

  5. VBA中find的一些使用方法

    用excel处理数据的时候,无论是使用VBA还是函数,查找和引用都是两大主要的工作,VBA中的find系列的方法(find.findnext.Range.FindPrevious)返回range对象, ...

  6. Collaborative Filtering

    for i=1:6040 Ai=ratings(ratings(:,1)==i,:); for j=1:5 Labnum(i,j)=length(Ai(Ai(:,3)==j)); end num(i) ...

  7. IE10 CSS hack,IE兼容问题

    IE10 CSS hack,IE兼容问题 作者: 雪影 发表于2013 年 4 月 25 日 分类:技术分享 | 暂无评论 | 人气: 376 度 首先,ie10不支持条件注释了. 方法一:特性检测: ...

  8. 449. Serialize and Deserialize BST——几乎所有树的面试题目都会回到BFS或者DFS,使用BFS,None节点存#

    Serialization is the process of converting a data structure or object into a sequence of bits so tha ...

  9. jQuery EasyUI Combobox无法检索中文输入的问题

    在项目里使用了EasyUI的Combobox,当ComboBox的item是英文时,都能正常检索出对应项,但是如果使用中文输入法输入几个字母然后通过按shift键输入时,奇怪的事情发生了,combob ...

  10. 一道数学题 hduacm 5144

    题目大意:  一直初速度v和抛出速度h  求标枪抛出的最远距离: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5144 显然  d=v/g*sqrt( ...