MTK radiooptions 分析
點(diǎn)擊打開(kāi)鏈接
RIL Socket 資源創(chuàng)建
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); ?// 執(zhí)行參數(shù)個(gè)數(shù)
? ? 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 */
? ? 最后一個(gè)參數(shù)modem-socket style 不需要發(fā)送到rild 進(jìn)程
? ? num_socket_args--; ?// 將參數(shù)個(gè)數(shù)減1
? ? int ret = send(fd, (const void *)&num_socket_args, sizeof(int), 0); ?//發(fā)送參數(shù)個(gè)數(shù)
? ? if(ret != sizeof(int)) {
? ? ? ? perror ("Socket write error when sending num args");
? ? ? ? close(fd);
? ? ? ? exit(-1);
? ? }
? ? for (i = 0; i < num_socket_args; i++) { ?//將參數(shù)發(fā)送到rild 進(jìn)程
? ? ? ? // Send length of the arg, followed by the arg.
? ? ? ? int len = strlen(argv[1 + i]); ? ? //獲取每個(gè)參數(shù)的長(zhǎng)度,并發(fā)送
? ? ? ? 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); ? ?//發(fā)送每個(gè)參數(shù)的值
? ? ? ? if (ret != len * sizeof(char)) {
? ? ? ? ? ? perror ("Socket write Error: When sending arg");
? ? ? ? ? ? close(fd);
? ? ? ? ? ? exit(-1);
? ? ? ? }
? ? }
? ? close(fd);
? ? return 0;
}
編譯radiooptions.c ,生成mtkradiooptions 可執(zhí)行文件;
push 到手機(jī) system/bin ,添加可執(zhí)行權(quán)限:chmod 777 /system/bin/mtkradiooptions
執(zhí)行如下:
mtkradiooptions ?1 ?1 ?1 ?;關(guān)閉radio
mtkradiooptions ?5 ?1 ?1 ?;打開(kāi)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);//監(jiān)聽(tīng)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)) { ? ??// 接收第一個(gè)數(shù)據(jù)(參數(shù)的個(gè)數(shù))請(qǐng)求
? ? ? ? RLOGE ("error reading on socket: number of Args: \n");
? ? ? ? return;
? ? }
? ? args[i] = (char *) calloc(1, (sizeof(char) * len) + 1); ? ??// 接收參數(shù)數(shù)據(jù)
? ? ? ? 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);
}
總結(jié)
以上是生活随笔為你收集整理的MTK radiooptions 分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android中通过Socket直接与R
- 下一篇: 高通平台java层操作NV数据的方法