点击打开链接

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. ios遍历模块的方式
  2. linux /proc文件系统(1)
  3. rabbitmq可靠性投递_RabbitMQ 可靠投递
  4. qt ui界面无法移动控件_都是知识点!移动端UI设计最基本的10种APP界面类型(上)...
  5. python--装饰器初阶
  6. ssh X11 Forwarding(本地共享远程服务器界面)
  7. 剖析:计算机专业大一学生如何学习C语言?如何自学C语言?大学C语言学习视频教程谁有?
  8. 最好用的UltraISO 9.5.3.2901中文完美注册破解版
  9. SaaSBase:什么是SAP(思爱普) ERP?
  10. git/icode操作记录
  11. 1371: 三位数求解
  12. 2.PyTorch的Dataset和DataLoader
  13. LeetCode——868. 二进制间距
  14. 使用AD16画板步骤
  15. (3)Mathpix Snipping Tool——公式截图获取工具(转为LaTex、MarkDown格式)
  16. 建筑施工复习资料-立杆基础
  17. dhl寄件邮编错了_如果从国外邮寄DHL往中国.邮编怎么写?
  18. (转)Linux Kernel核心中文手册
  19. 多元函数第六:连续函数(6)Bolzano-Weierstrass 波尔查诺-维尔斯特拉斯定理 聚点与列紧集
  20. Python 爬虫实战(三) 获取百度地图搜索结果

热门文章

  1. 日期加星期存入mysql_在MySQL中添加两个星期的日期?
  2. python代码怎么设置,如何设置PyCharm中的Python代码模版(推荐)
  3. 接口文件也是.java结尾吗
  4. 041_Unicode对照表七
  5. 001_Servlet简介
  6. 074_JSON.stringify()
  7. 2021-10-20开发计量系统遇到的问题之--1启动mysql--2mybatis谨慎注释--3mybatis返回多表查询结果
  8. RxJava 教程第一部分:入门之 生命周期管理
  9. ssh 用密码连接不上、查看openSSH 的版本、CentOS - 升级openSSH,修复安全漏洞
  10. CAD2011软件安装资料及教程