Android RIL CDMA分支总结(1)

1. CDMA分支代码结构

代码结构如下:
ril
|-- include
| `-- telephony
| |-- ril.h
| `-- ril_cdma_sms.h
|-- libril
| |-- ril.cpp
| |-- ril_commands.h
| |-- ril_event.cpp
| |-- ril_event.h
| `-- ril_unsol_commands.h
|-- reference-cdma-sms
| |-- reference-cdma-sms.c
| `-- reference-cdma-sms.h
|-- reference-ril
| |-- at_tok.c
| |-- at_tok.h
| |-- atchannel.c
| |-- atchannel.h
| |-- misc.c
| |-- misc.h
| `-- reference-ril.c
`-- rild
|-- radiooptions.c
`-- rild.c

reference-ril->libference-ril.so 主要负责modem通信(包含通话、上网、短信以及modem初始化功能等等)

rild -> rild rild守护进程,是整个android ril层的入口点。

libril -> libril.so rild的共享库,驻留在rild中,完成和上层通信的工作,接受ril请求并传递给libreference-ril.so来通知modem,与此同时将其反馈回传给调用进程。

radiooptions -> radiooptions 无线通信测试程序。

reference-cdma-sms -> cdma模组特殊定义用于cdma(evdo)通信使用,主要定义短信接口(实现短息的编码解码工作)。

2.AT从界面到模组流程

通话外例:

按通话图标->>

DialtactsActivity(4个Tab 分别由TwelveKeyDialer<拨号>、RecentCallsListActivity<最近联系人>,两个activity-alias DialtactsContactsEntryActivity<联系人>和DialtactsFavoritesEntryActivity<收藏>)

输入拨号号码

TwelveKeyDialer

mehod: Onclick

placecall()

Intent intent =new Intent(Intent.ACTION_CALL_PRIVILEGED,

Uri.fromParts("tel",number,null));

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(intent);

启动拨号->>>>>>

intert.ACTION_CALL_PRIVILEGED实际字符串为android.intent.action.CALL_PRIVILEGED,通过查找知道了packegs/phone

下面的androidmanifest.xml中PrivilegedOutgoingCallBroadcaster activity-alias设置了intent-filter,所以需要找到其targetactivity为OutgoingCallBroadcaster。所以进入OutgoingCallBroadcaster的

method:onCreate()

//如果为紧急号码马上启动intent.setClass(this, InCallScreen.class); startActivity(intent);

Intent broadcastIntent = new Intent(Intent.ACTION_NEW_OUTGOING_CALL);

if (number != null) broadcastIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, number);

broadcastIntent.putExtra(EXTRA_ALREADY_CALLED, callNow);

broadcastIntent.putExtra(EXTRA_ORIGINAL_URI, intent.getData().toString());

if (LOGV) Log.v(TAG, "Broadcasting intent " + broadcastIntent + ".");

sendOrderedBroadcast(broadcastIntent, PERMISSION, null, null,

Activity.RESULT_OK, number, null);

Intent.ACTION_NEW_OUTGOING_CALL实际字符串为android.intent.action.NEW_OUTGOING_CALL,通过查找知道了packegs/phone下面的androidmanifest.xml中OutgoingCallReceiver Receiver接收此intent消息。找到OutgoingCallReceiver,执行

mothod:onReceive()函数

Intent newIntent = new Intent(Intent.ACTION_CALL, uri);

newIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, number);

newIntent.setClass(context, InCallScreen.class);

newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

《整个流程》

mothod:onCreate(第一次)/onNewIntent(非第一次)

internalResolveIntent

placeCall(intent);

PhoneUtils.placeCall(mPhone, number, intent.getData());

phone.dial(number);

mCT.dial(newDialString);

dial(dialString, CommandsInterface.CLIR_DEFAULT);

cm.dial(pendingMO.address, clirMode, obtainCompleteMessage());//obtainCompleteMessage(EVENT_OPERATION_COMPLETE);

send(rr);

msg = mSender.obtainMessage(EVENT_SEND, rr);

acquireWakeLock();

msg.sendToTarget();

RILSender.handleMessage() //已经到系统java ril<gsm &cdma>处理部分

case EVENT_SEND:

...

s.getOutputStream().write(dataLength);

s.getOutputStream().write(data);//从这里流程跑到下面ril.cpp中监听部份

RIL层

rild守护进程 rild->main=>RIL_startEventLoop

//建立事件循环线程

ret = pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL);

//注册进程唤醒事件回调

ril_event_set (&s_wakeupfd_event, s_fdWakeupRead, true,

processWakeupCallback, NULL);

rilEventAddWakeup (&s_wakeupfd_event);

//建立事件循环

ril_event_loop

for (;;) {

...

n = select(nfds, &rfds, NULL, NULL, ptv);

// Check for timeouts

processTimeouts();

// Check for read-ready

processReadReadies(&rfds, n);

// Fire away

firePending();

}

funcs = rilInit(&s_rilEnv, argc, rilArgv);//实际是通过动态加载动态库的方式执行reference-ril.c中的RIL_Init

//单独启动一个线程读取串口数据

ret = pthread_create(&s_tid_mainloop, &attr, mainLoop, NULL);

fd = open (s_device_path, O_RDWR);//打开虚拟模组

ret = at_open(fd, onUnsolicited); //设置模组主动上报

ret = pthread_create(&s_tid_reader, &attr, readerLoop, &attr);

RIL_requestTimedCallback(initializeCallback, NULL, &TIMEVAL_0);

reference-ril.so 处理方式(rild动态加载libreference-ril.so库)

(处理模型)

>static void request(x x x)

switch(x) //判断请求类型

request_dail //电话请求

function() //请求处理函数AT指令

设置事件回报//

参考文献:

http://blog.csdn.net/basonjiang_sz/archive/2011/03/17/6255881.aspx

Android GSM驱动模块详细分析(作者:熊猫哥哥)

更多相关文章

  1. Android的简单的广播的例子
  2. Eclipse 运行Android程序在虚拟机中,出现问题
  3. android MotionEvent的相关的类的介绍
  4. React Navigation Android(安卓)返回键事件处理
  5. Android(安卓)7.0 启动篇 — init原理(一)(转 Android(安卓)9.0 分
  6. Android中的popWindow
  7. Android之防快速重复点击的全局设置
  8. android点击文本框之外的地方隐藏键盘
  9. [Android开发]android 跨进程通信之content provider

随机推荐

  1. android progressBar 自定义 进度颜色
  2. 理解Android系统的进程间通信原理----RPC
  3. Android(安卓)UI开发之——使用Fragment
  4. 转: Android(安卓)ListView 滑动背景为黑
  5. Android中由IP地址查询经纬度坐标的实例
  6. 直接拿来用!最火的Android开源项目(一)
  7. 四十、Android(安卓)home键和back键区别
  8. [置顶] 玩转pandaboard之linaro对于Andro
  9. [转]android下面res目录
  10. Android来电拦截及拦截后的提示音