• osmocom-bb中用osmocon刷入固件命令那些参数你都弄懂了吗?


    转载留做备份,原文地址: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 ]
    " 
        "		 [ -c ] (enable chainloading of highram-images)
    " 
        "		 [ -s /tmp/osmocom_l2 ]
    " 
        "		 [ -l /tmp/osmocom_loader ]
    " 
        "		 [ -m {c123,c123xor,c140,c140xor,c155,romload,mtk} ]
    " 
        "		 [ -i beacon-interval (mS) ]
    " 
        "		  file.bin
    
    " 
        "* Open serial port /dev/ttyXXXX (connected to your phone)
    " 
        "* Perform handshaking with the ramloader in the phone
    " 
        "* Download file.bin to the attached phone (base address 0x00800100)
    "

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

    先看注释里面的三句话

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

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

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

    看字面上的意思好像是下载模式的意思,我们找找代码,恩,很快我们就找到了一个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) != 0)
        exit(1);

    这里有个方法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[0]);

    version是版本的意思?

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

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

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

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

    dnload.do_chainload = 1;

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

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

    dnload.beacon_interval = atoi(optarg) * 1000;

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

  • 相关阅读:
    Resharper Visual studio中的插件
    MVC 中Simditor上传本地图片
    MVC编程模型
    数据库面试题
    SQL、索引
    存储过程详解
    EF的简单认识
    MVC是什么
    AOP面向切面编程
    SQL语句基本
  • 原文地址:https://www.cnblogs.com/k1two2/p/5122403.html
Copyright © 2020-2023  润新知