转载留做备份,原文地址: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. vb 和vb.net的区别

    vb 和vb.net的区别 源地址:http://blog.csdn.net/xjc1278003262/article/details/8805324 在随着VB.NET的 发展,大部分人都放弃使用 ...

  2. 3D正方体

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  3. python 练习 26

    Python break语句,就像在C语言中,打破了最小封闭for或while循环. break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止执行循环语句. br ...

  4. robotframework笔记10

    循环和条件 for循环 *** Settings *** Library BuiltIn Library Collections *** Test Cases *** TestCase01 My Ke ...

  5. CentOS6.5配置python开发环境之一:CentOS图形化界面显示

    这两天在配置centos系统下python的开发环境和工具. 刚用centos,做做记录可以方便以后有需要的人...查资料确实挺麻烦的 centos6.5 sublime3 python27 subl ...

  6. hdu----(5053)the Sum of Cube(签到题,水体)

    the Sum of Cube Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  7. ARM字节对齐问题详解

    一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这 ...

  8. Android: Intent实现活动之间的交互

    Intent的作用:是Android中各个组件直接交互的一种重要方式,且利用Intent可以启动Activity.Service以及Broadcast Receiver. Intent的创建:显示和隐 ...

  9. 学习记录012-NFS

    1.Network file System 主要是通过网络让不同的主机进行通信,构建于ip协议之上的现代文件系统,用来存储共享视频,图片,文件等 2.并发大的时候会有点问题(维护不好会丢数据) 3.N ...

  10. ASCII转义字符

    转义字符 意义 ASCII码值(十进制) \a 响铃(BEL) 007 \b 退格(BS) 008 \f 换页(FF) 012 \n 换行(LF) 010 \r 回车(CR) 013 \t 水平制表( ...