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注册后完成。
浙公网安备 33010602011771号