MTK radiooptions 分析

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);

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章