Chinaunix首页 | 论坛 | 博客
  • 博客访问: 804709
  • 博文数量: 244
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 2420
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-29 09:07
文章分类

全部博文(244)

文章存档

2011年(4)

2010年(3)

2009年(72)

2008年(119)

2007年(46)

我的朋友

分类: LINUX

2009-04-27 17:31:51

rild 进程流程分析
main()
RIL_Init
 
#define  REFERENCE_RIL_PATH  "/system/lib/libreference-ril.so"
dlHandle = dlopen(rilLibPath, RTLD_NOW);
rilInit = (const RIL_RadioFunctions *(*)(const struct RIL_Env *, int, char **))dlsym(dlHandle, "RIL_Init");
...
funcs = rilInit(&s_rilEnv, argc, rilArgv); //rild 启动时候的参数,如串口设备等是用过 rilInit传递给  
                                           //libreference-ril.so库,然后由库函数中打开串口
RIL_register(funcs);
 
 
Reference-ril.c (hardware\ril\reference-ril)中的
如果我们把Reference-ril.c 做为库调用那么执行的是
RIL_Init()  
否则为
Reference-ril.c 的main函数
 
 
 
Reference-ril.c (hardware\ril\reference-ril)
#ifdef RIL_SHLIB
pthread_t s_tid_mainloop;
const RIL_RadioFunctions *RIL_Init(const struct RIL_Env *env, int argc, char **argv)
....
#else
int main (int argc, char **argv)
....
#endif
从上面的程序片段可以看出如果定义了 RIL_SHLIB 那么将会被便宜成库这就是为什么
利用android的官方便宜脚本,我们很容易把源代码编译成库或者应用程序
 
 
 
 
 
RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen)
RIL_onRequestComplete()函数的声明和定义分别在文件 Ril.h 和 Ril.cpp 中   
Ril.h (hardware\ril\include\telephony)
Ril.cpp (hardware\ril\libril):
Rild.c (hardware\ril\rild):
static struct RIL_Env s_rilEnv = {
    RIL_onRequestComplete,
    RIL_onUnsolicitedResponse,
    RIL_requestTimedCallback
};
Rild.c (hardware\ril\rild):     
funcs = rilInit(&s_rilEnv, argc, rilArgv);
 
Rild.c (hardware\ril\rild)
rilInit = (const RIL_RadioFunctions *(*)(const struct RIL_Env *, int, char **))dlsym(dlHandle, "RIL_Init");
const RIL_RadioFunctions *RIL_Init(const struct RIL_Env *env, int argc, char **argv)
rilfd 启动的是时候调用了 Reference-ril.so 中的 RIL_Init函数进行了初始化
所以   onRequest (int request, void *data, size_t datalen, RIL_Token t) //Reference-ril.c (hardware\ril\reference-ril)
中执行的 RIL_onRequestComplete 函数实际上是调用 Ril.cpp (hardware\ril\libril)中的 RIL_onRequestComplete
 
 
RIL_register (const RIL_RadioFunctions *callbacks)
  ril_event_set (&s_listen_event, s_fdListen, false,  
                listenCallback, NULL);
   
Ril_event.cpp (hardware\ril\libril)
void ril_event_init()
  init_list(&pending_list);
   
RIL_register (const RIL_RadioFunctions *callbacks)
  RIL_startEventLoop();
    ret = pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL);
 
 
static const RIL_RadioFunctions s_callbacks = {
    RIL_VERSION,
    onRequest,
    currentState,
    onSupports,
    onCancel,
    getVersion
};
 
static void listenCallback (int fd, short flags, void *param)
  ril_event_set (&s_commands_event, s_fdCommand, 1, processCommandsCallback, p_rs);
  rilEventAddWakeup (&s_commands_event);
  onNewCommandConnect();
static void *eventLoop(void *param)
  ril_event_set (&s_wakeupfd_event, s_fdWakeupRead, true,processWakeupCallback, NULL);
 
 
void RIL_register (const RIL_RadioFunctions *callbacks)
  ril_event_set (&s_listen_event, s_fdListen, false, listenCallback, NULL);
  rilEventAddWakeup (&s_listen_event);
  ...
  ril_event_set (&s_debug_event, s_fdDebug, true,debugCallback, NULL);
  rilEventAddWakeup (&s_debug_event);                                   
 
static UserCallbackInfo *
internalRequestTimedCallback (RIL_TimedCallback callback, void *param,  
                                const struct timeval *relativeTime)
  ril_event_set(&(p_info->event), -1, false, userTimerCallback, p_info);
  ril_timer_add(&(p_info->event), &myRelativeTime);
  triggerEvLoop();
 
Ril.cpp (hardware\ril\libril)
RIL_requestTimedCallback
   internalRequestTimedCallback (callback, param, relativeTime);   
 
void RIL_onUnsolicitedResponse(int unsolResponse, void *data,size_t datalen)
    internalRequestTimedCallback(wakeTimeoutCallback, NULL,&TIMEVAL_WAKE_TIMEOUT);
     
                                    
rild.c
main()
  RIL_startEventLoop();
    ret = pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL);
    在 eventLoop中有:
      ril_event_set (&s_wakeupfd_event, s_fdWakeupRead, true,processWakeupCallback, NULL);
      rilEventAddWakeup (&s_wakeupfd_event);
        ril_event_add(ev);
        watch_table[i] = ev;  
        triggerEvLoop();
      ril_event_loop();
        processTimeouts(); //检测超时
        processReadReadies(&rfds, n);
          addToList(rev, &pending_list);
        firePending();
          struct ril_event * ev = pending_list.next;
          while (ev != &pending_list) {
              struct ril_event * next = ev->next;
              removeFromList(ev);
              ev->func(ev->fd, 0, ev->param);  
              ev = next;
          }
          //此处的 ev->func 为 ril_event_set 注册的函数 processWakeupCallback
  rilInit = (const RIL_RadioFunctions *(*)(const struct RIL_Env *, int, char **))dlsym(dlHandle, "RIL_Init");
  ...
  funcs = rilInit(&s_rilEnv, argc, rilArgv);
  //此处执行的 rilInit 函数实际上为 Reference-ril.c (hardware\ril\reference-ril) 文件中的
  const RIL_RadioFunctions *RIL_Init(const struct RIL_Env *env, int argc, char **argv)
    ret = pthread_create(&s_tid_mainloop, &attr, mainLoop, NULL);
      mainLoop()
        ret = at_open(fd, onUnsolicited);
        RIL_requestTimedCallback(initializeCallback, NULL, &TIMEVAL_0);
          initializeCallback()
            at_handshake();
            at_send_command("AT+CMEE=1", NULL);
            at_send_command("AT+CCWA=1", NULL);
            ...
            /* assume radio is off on error */
            if (isRadioOn() > 0) {
               setRadioState (RADIO_STATE_SIM_NOT_READY);
            }  
            因为Radion一般嗾使On 所以默认都会执行  setRadioState (RADIO_STATE_SIM_NOT_READY)
            所以通常会执行:onRadioPowerOn();
              pollSIMState(NULL);
              getSIMStatus()
              根据返回结果:如果没有sim卡/需要pin/需要PUK 那么将执行:
              setRadioState(RADIO_STATE_SIM_LOCKED_OR_ABSENT);
              如果sim卡状态是就绪的,那么执行:
              setRadioState(RADIO_STATE_SIM_READY);               
    return &s_callbacks;
  //因为RIL_Init 返回值为 s_callbacks 所以 funcs 为变量s_callbacks的指针
  RIL_register(funcs);
    ril_event_set (&s_listen_event, s_fdListen, false,listenCallback, NULL);
    rilEventAddWakeup (&s_listen_event);
   
static void listenCallback (int fd, short flags, void *param)
  ril_event_set (&s_commands_event, s_fdCommand, 1,processCommandsCallback, p_rs);
 
Reference-ril.c (hardware\ril\reference-ril)
此函数类似 libgsmd-tools 的main
int main (int argc, char **argv)
{
  ...
  RIL_register(&s_callbacks);
  mainLoop(NULL);
  ...
}
 

阅读(2017) | 评论(0) | 转发(0) |
0

上一篇:触摸屏概述

下一篇:Android 通信机制分析

给主人留下些什么吧!~~