点击打开链接

RIL Socket 资源创建

service ril-daemon /system/bin/rild

class main
    socket rild stream 660 root radio
    socket sap_uim_socket1 stream 660 bluetooth bluetooth
    socket rild-debug stream 660 radio system
    user root

group radio cache inet misc audio log

radiooptions.c 解析:

int main(int argc, char *argv[])
{
    int fd;
    int num_socket_args = 0;
    int i  = 0;
    int modem_socket_type = 0;
    int sim_id = 0;
    char socket_name[20];

if(error_check(argc, argv)) {
        print_usage();
        exit(-1);
    }

num_socket_args = get_number_args(argv);  // 执行参数个数

modem_socket_type = atoi(argv[(num_socket_args-1)]);  //The last argument must be modem-socket style \n\

sim_id = atoi(argv[(num_socket_args-2)]);  // The argument before the last one must be SIM slot \n\

memset(socket_name, 0, sizeof(char)*20);    
    if (sim_id == 0 || modem_socket_type == 1) {
        strncpy(socket_name, SOCKET_NAME_RIL_DEBUG, 19);
    } else if (sim_id == 1) {
        strncpy(socket_name, SOCKET_NAME_RIL2_DEBUG, 19);
    }
    
    fd = socket_local_client(socket_name,
                                 ANDROID_SOCKET_NAMESPACE_RESERVED,
                                 SOCK_STREAM);
    if (fd < 0) {
        perror ("opening radio debug socket");
        exit(-1);
    }
    
    /* It is not necessacry to pass the argument "modem-socket style" to rild */

最后一个参数modem-socket style 不需要发送到rild 进程

num_socket_args--;  // 将参数个数减1
    int ret = send(fd, (const void *)&num_socket_args, sizeof(int), 0);  //发送参数个数
    if(ret != sizeof(int)) {
        perror ("Socket write error when sending num args");
        close(fd);
        exit(-1);
    }

for (i = 0; i < num_socket_args; i++) {  //将参数发送到rild 进程
        // Send length of the arg, followed by the arg.
        int len = strlen(argv[1 + i]);     //获取每个参数的长度,并发送
        ret = send(fd, &len, sizeof(int), 0);
        if (ret != sizeof(int)) {
            perror("Socket write Error: when sending arg length");
            close(fd);
            exit(-1);
        }

ret = send(fd, argv[1 + i], sizeof(char) * len, 0);    //发送每个参数的值
        if (ret != len * sizeof(char)) {
            perror ("Socket write Error: When sending arg");
            close(fd);
            exit(-1);
        }
    }

close(fd);
    return 0;
}

编译radiooptions.c ,生成mtkradiooptions 可执行文件;

push 到手机 system/bin ,添加可执行权限:chmod 777 /system/bin/mtkradiooptions

执行如下:

mtkradiooptions  1  1  1  ;关闭radio

mtkradiooptions  5  1  1  ;打开radio

Native 端Ril.cpp ,以 rild-debug socket 讲解

extern "C" void
RIL_register (const RIL_RadioFunctions *callbacks) {

s_fdDebug = android_get_control_socket(rildebug);//获取ril-debug socket 描述符
    if (s_fdDebug < 0) {
        RLOGE("Failed to get socket : %s errno:%d", rildebug, errno);
        exit(-1);
    }

ret = listen(s_fdDebug, 4);//监听ril-debug socket

if (ret < 0) {
        RLOGE("Failed to listen on ril debug socket '%d': %s",
             s_fdDebug, strerror(errno));
        exit(-1);
    }

ril_event_set (&s_debug_event, s_fdDebug, true,
                debugCallback, NULL); //传递socket 文件描述符,debugCallback 处理接收到的消息

}

static void debugCallback (int fd, short flags, void *param) {

acceptFD = accept (fd,  (sockaddr *) &peeraddr, &socklen);   // 接收socket 连接

if (acceptFD < 0) {
        RLOGE ("error accepting on debug port: %d\n", errno);     
        return;
    }

if (recv(acceptFD, &number, sizeof(int), 0) != sizeof(int)) {     // 接收第一个数据(参数的个数)请求
        RLOGE ("error reading on socket: number of Args: \n");
        return;
    }

args[i] = (char *) calloc(1, (sizeof(char) * len) + 1);     // 接收参数数据
        if (recv(acceptFD, args[i], sizeof(char) * len, 0)
            != (int)sizeof(char) * len) {
            RLOGE ("error reading on socket: Args[%d] \n", i);
            freeDebugCallbackArgs(i, args);
            return;
        }

}

static void
issueLocalRequest(int request, void *data, int len, RIL_SOCKET_ID socket_id) {

pRI->p_next = *pendingRequestsHook;
    *pendingRequestsHook = pRI;

callOnRequest(request, data, len, pRI, pRI->socket_id);

}

MTK radiooptions 分析相关推荐

  1. Android OrangePi 4G IOT(四) - MTK LK分析

    一.MTK启动流程 1-3:设备上电起来后,跳转到Boot ROM(不是flash)中的boot code中执行把pre-loader加载起到ISRAM, 因为当前DRAM(RAM分SRAM跟DRAM ...

  2. log 的抓取与分析

    log 的抓取与分 http://blog.csdn.net/yaoming168/article/details/38777727 log 的抓取与分析 一.Android log框架简介 二.lo ...

  3. 三,Linux SDIO驱动框架之扫卡流程

     本文以kernel-4.4,以MTK平台分析host端初始化的扫卡流程  mtk平台host驱动代码在drivers/mmc/host/mtk-sdio.c,sd card,mmc和sdio car ...

  4. 个人收集的一些手机研发资料

    FlashTool_v3.1.04 FlashTool v3[1][1].1.04 MTK平台板测校准原理 FlashTool v5.1140.00 MTK6223方案介绍 高薪诚聘软件J2ME开发工 ...

  5. Ansroid系统(262)---MTK安卓sim卡相关源码分析

    MTK安卓sim卡相关源码分析 原文地址:http://m.blog.csdn.net/article/details?id=50039589 最近由于一个sim卡相关的需求,就去了解了一下Andro ...

  6. MTK驱动(74)---平台待机功耗分析流程

    MTK平台待机功耗分析流程 1.目的 2.MTK平台各个场景功耗数据测试方法 很多功耗问题都是因为测试手法不对,列出一些常用场景功耗测试手法.  测试功耗数据之前,请先确认以下配置:  1.关闭 WI ...

  7. MTK 驱动(67)---深入MTK平台bootloader启动之【 lk -amp;gt; kernel】分析笔记

    Pre-loader 运行在ISRAM,待完成 DRAM 的初始化后,再将lk载入DRAM中,最后通过特殊sys call手段实现跳转到lk的执行入口,正式进入lk初始化阶段. 一.lk执行入口: 位 ...

  8. Android 功耗(4)---MTK平台待机功耗分析流程

    MTK平台待机功耗分析流程 MTK平台待机功耗分析流程 1.目的 2.MTK平台各个场景功耗数据测试方法 很多功耗问题都是因为测试手法不对,列出一些常用场景功耗测试手法.  测试功耗数据之前,请先确认 ...

  9. MTK 驱动(38)---MTK 待机问题分析

    mtk 平台待机问题分析: 1 待机问题分类  1)无法待机:  1. 需要确认 APK 是否有 partial_wakelock 2. kernel 是否持有 wakeup source 不释放. ...

最新文章

  1. 这几个超绝设计,谁看了不大喊一声“丑!!”
  2. maven整合S2SH
  3. 看了这个高并发系统架构,才知道我对秒杀的误解有多深
  4. Yarn的默认端口(转载)
  5. FIR仿真module_04
  6. Linux Kbuild文档 1
  7. android不能在主线程,安卓开发:主线程真的不能做UI操作吗?这一点很多程序员都没想到...
  8. python字典如何删除数据库,如何从python字典中删除?
  9. Mysql学习总结(39)——49条MySql语句优化技巧
  10. MySql Workbench表PK UN UQ B等字符的含义
  11. 软件开发从需求分析开始
  12. 用Java读取pdf中的数据
  13. JetBrains正式发布GoLand
  14. 改写自SqlHelper的SqliteHelper
  15. python123练习六+练习七
  16. pytorch nn.AdaptiveAvgPool2d(1)
  17. VMware导致电脑蓝屏解决方案
  18. ubuntu 板载r8125有限网卡连接
  19. ios从打包到上架全过程
  20. 谈谈区块链入门技能(二):以太坊区块链浏览器如何使用?

热门文章

  1. 026_jdbc-mysql-PrepareStatement解决sql注入
  2. 071_html语言代码
  3. Smoke Test与Ad hoc Test
  4. R-CNN系列学习笔记
  5. 计算机丢失cv210.dll,cv210.dll文件免费版
  6. wireshark合并多个文件_TEQC合并多个时段GPS RINEX文件
  7. 网络ip功放连接图_精耕新基建:智能IP网络构筑稳固的连接基石
  8. 大一大专计算机考试题型,大专,计算机一级考试考什么内容,麻烦详细点,谢谢。...
  9. 二层交换机可以划分vlan吗_二层交换机上,属于不同VLAN的PC该如何通信
  10. lsqcurvefit拟合结果为复数_非线性拟合怎么转化为线性拟合?