wve

导航

rild 守护进程分析

 

目录在/hardware/ril/rild/rild.c ,编译生成可执行程序rild,安装在目标系统的/system/bin/ 中

守护进程的启动 由 init.rc 中定义 ,其中/dev/ttyUSB0 是根据所使用的modem来选择的。

service ril-daemon /system/bin/rild -l /system/lib/libreference-ril.so -- -d /dev/ttyUSB0
socket rild stream 660 root radio 
socket rild-debug stream 660 radio system
user root 
group radio cache inet misc audio sdcard_rw

rild的入口函数是main()

  1 int main(int argc, char **argv)
  2 {
  3     const char * rilLibPath = NULL;
  4     char **rilArgv;
  5     void *dlHandle;
  6     const RIL_RadioFunctions *(*rilInit)(const struct RIL_Env *, int, char **);
  7     const RIL_RadioFunctions *funcs;
  8     char libPath[PROPERTY_VALUE_MAX];
  9     unsigned char hasLibArgs = 0;
 10 
 11     int i;
 12 
 13 
 14    LOGD("dgdg*************main***********rild.c************");
 15 
 16     umask(S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IWOTH | S_IXOTH);
 17     for (i = 1; i < argc ;) {
 18         if (0 == strcmp(argv[i], "-l") && (argc - i > 1)) {
 19             rilLibPath = argv[i + 1];
 20             i += 2;
 21         } else if (0 == strcmp(argv[i], "--")) {
 22             i++;
 23             hasLibArgs = 1;
 24             break;
 25         } else {
 26             usage(argv[0]);
 27         }
 28     }
 29  //warren print test log
 30  for(i=0;i<argc;i++){
 31      LOGD("argv[%d]=%s",i,argv[i]);
 32  }
 33     if (rilLibPath == NULL) {
 34         if ( 0 == property_get(LIB_PATH_PROPERTY, libPath, NULL)) {
 35             // No lib sepcified on the command line, and nothing set in props.
 36             // Assume "no-ril" case.
 37             goto done;
 38         } else {
 39             rilLibPath = libPath;
 40         }
 41     }
 42 
 43     /* special override when in the emulator */
 44 #if 1
 45     {
 46         static char*  arg_overrides[3];
 47         static char   arg_device[32];
 48         int           done = 0;
 49 
 50 #define  REFERENCE_RIL_PATH  "/system/lib/libreference-ril.so"
 51 
 52         /* first, read /proc/cmdline into memory */
 53         char          buffer[1024], *p, *q;
 54         int           len;
 55         int           fd = open("/proc/cmdline",O_RDONLY);
 56 
 57         if (fd < 0) {
 58             LOGD("could not open /proc/cmdline:%s", strerror(errno));
 59             goto OpenLib;
 60         }
 61 
 62         do {
 63             len = read(fd,buffer,sizeof(buffer)); }
 64         while (len == -1 && errno == EINTR);
 65 
 66         if (len < 0) {
 67             LOGD("could not read /proc/cmdline:%s", strerror(errno));
 68             close(fd);
 69             goto OpenLib;
 70         }
 71         close(fd);
 72 
 73         if (strstr(buffer, "android.qemud=") != NULL)
 74         {
 75             /* the qemud daemon is launched after rild, so
 76             * give it some time to create its GSM socket
 77             */
 78             int  tries = 5;
 79 #define  QEMUD_SOCKET_NAME    "qemud"
 80 
 81             while (1) {
 82                 int  fd;
 83 
 84                 sleep(1);
 85 
 86                 fd = socket_local_client(
 87                             QEMUD_SOCKET_NAME,
 88                             ANDROID_SOCKET_NAMESPACE_RESERVED,
 89                             SOCK_STREAM );
 90 
 91                 if (fd >= 0) {
 92                     close(fd);
 93                     snprintf( arg_device, sizeof(arg_device), "%s/%s",
 94                                 ANDROID_SOCKET_DIR, QEMUD_SOCKET_NAME );
 95 
 96                     arg_overrides[1] = "-s";
 97 
 98                     LOGD("dgdg....add /dev/ttyUSB0");
 99                  //   arg_overrides[2] = arg_device;
100                      arg_overrides[2] = "/dev/ttyUSB0";
101 
102 
103                     done = 1;
104                     break;
105                 }
106                 LOGD("could not connect to %s socket: %s",
107                     QEMUD_SOCKET_NAME, strerror(errno));
108                 if (--tries == 0)
109                     break;
110             }
111             if (!done) {
112                 LOGE("could not connect to %s socket (giving up): %s",
113                     QEMUD_SOCKET_NAME, strerror(errno));
114                 while(1)
115                     sleep(0x00ffffff);
116             }
117         }else{
118 
119                     LOGD("dgdg....buffer not   --include .qemud--, but include =%s ",buffer);
120 
121     }
122         
123         /* otherwise, try to see if we passed a device name from the kernel */
124         if (!done) do {
125 #define  KERNEL_OPTION  "android.ril="
126 #define  DEV_PREFIX     "/dev/"
127 
128             p = strstr( buffer, KERNEL_OPTION );
129             if (p == NULL)
130                 break;
131 
132             p += sizeof(KERNEL_OPTION)-1;
133             q  = strpbrk( p, " \t\n\r" );
134             if (q != NULL)
135                 *q = 0;
136 
137             snprintf( arg_device, sizeof(arg_device), DEV_PREFIX "%s", p );
138             arg_device[sizeof(arg_device)-1] = 0;
139             arg_overrides[1] = "-d";
140             //arg_overrides[2] = arg_device;
141             arg_overrides[2] = "/dev/ttyUSB0";
142 
143          done = 1;
144             LOGD("dbg************arg_overrides[2] =%s",arg_overrides[2] );
145 
146         } while (0);
147 
148         if (done) {
149             argv = arg_overrides;
150             argc = 3;
151             i    = 1;
152             hasLibArgs = 1;
153             rilLibPath = REFERENCE_RIL_PATH;
154 
155             LOGD("overriding with %s %s", arg_overrides[1], arg_overrides[2]);
156         }
157     }
158 OpenLib:
159 #endif
160     switchUser();
161 
162     dlHandle = dlopen(rilLibPath, RTLD_NOW);
163 
164     if (dlHandle == NULL) {
165         fprintf(stderr, "dlopen failed: %s\n", dlerror());
166         exit(-1);
167     }
168 
169     LOGD("dgdg******dlopenOK******%s*******in rild.c************",rilLibPath);
170 
171 
172     RIL_startEventLoop();
173 
174     rilInit = (const RIL_RadioFunctions *(*)(const struct RIL_Env *, int, char **))dlsym(dlHandle, "RIL_Init");
175 
176     if (rilInit == NULL) {
177         fprintf(stderr, "RIL_Init not defined or exported in %s\n", rilLibPath);
178         exit(-1);
179     }
180 
181     if (hasLibArgs) {
182         rilArgv = argv + i - 1;
183         argc = argc -i + 1;
184     } else {
185         static char * newArgv[MAX_LIB_ARGS];
186         static char args[PROPERTY_VALUE_MAX];
187         rilArgv = newArgv;
188         property_get(LIB_ARGS_PROPERTY, args, "");
189         argc = make_argv(args, rilArgv);
190     }
191 
192     // Make sure there's a reasonable argv[0]
193     rilArgv[0] = argv[0];
194 
195     funcs = rilInit(&s_rilEnv, argc, rilArgv);
196 
197     RIL_register(funcs);
198 
199 done:
200 
201     while(1) {
202         // sleep(UINT32_MAX) seems to return immediately on bionic
203         sleep(0x00ffffff);
204     }
205 }

 

在29行添加了打印log,运行打印出了log:

D/RILD ( 64): argv[0]=/system/bin/rild
D/RILD ( 64): argv[1]=-l
D/RILD ( 64): argv[2]=/system/lib/libreference-ril.so
D/RILD ( 64): argv[3]=--
D/RILD ( 64): argv[4]=-d
D/RILD ( 64): argv[5]=/dev/ttyUSB0

但是真正打开的modem设备却不是ttyUSB0 ,而是从proc/cmdline 中读取出来的 s3c2410_serial1 ,如下是 buffer中读取出来的内容:

“include =root=/dev/mtdblock2 rootfstype=yaffs2 init=/linuxrc nconsole=tty1 console=ttySAC0,115200 android.ril=s3c2410_serial1”

由于还不知道在从哪里改cmdline的内容,就直接改代码了,在98行到100行,强制将modem的设备接口改为了 /dev/ttyUSB0。这样在初始化reference_ril.so

的时候就会去打开ttyuSB0了。

 

1.开启动libril.so中的event机制

通过调用函数 :RIL_startEventLoop(void) 实现 ,具体代码参照ril.cpp

2.建立与modem的通信

初始化reference_ril.so ,通过函数RIL_Init()完成。

RILD 是通过

dlHandle = dlopen(rilLibPath, RTLD_NOW);

 rilInit = (const RIL_RadioFunctions *(*)(const struct RIL_Env *, int, char **))dlsym(dlHandle, "RIL_Init");

获得RIL_Init的指针的,然后进行初始化

funcs = rilInit(&s_rilEnv, argc, rilArgv);

3.打开接受上层命令的socket通道

funcs是RIL_int()返回的RIL_RadioFunctions的指针,通过RIL_Register注册后完成。

 

 

posted on 2012-11-03 12:00  wve  阅读(314)  评论(0)    收藏  举报