Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 526|回复: 0

开发交流:Android RIL (c/c++) 和 Java代码(一)

[复制链接]

该用户从未签到

发表于 2011-10-24 10:46:51 | 显示全部楼层 |阅读模式
  第一部分, c/c++代码

  Android系统源代码目录里面: hardware/ril 目录包含了所有有关于telephony的底层代码.
  1.目录架构(20101215的git版本):
  ril
  |-- CleanSpec.mk
  |-- include
  |   |-- telephony
  |       |-- ril_cdma_sms.h                                              //CDMA SMS
  |       |-- ril.h                                                    //Android RIL 框架的一些接口和数据结构
  |-- libril
  |   |-- Android.mk
  |   |-- MODULE_LICENSE_APACHE2
  |   |-- NOTICE
  |   |-- ril_commands.h                                      //RIL命令列表
  |   |-- ril.cpp
  |   |-- ril_event.cpp
  |   |-- ril_event.h
  |   |-- ril_unsol_commands.h                            //RIL 主动上报信息列表
  |-- reference-cdma-sms
  |   |-- Android.mk
  |   |-- reference-cdma-sms.c
  |   |-- reference-cdma-sms.h
  |-- reference-ril
  |   |-- Android.mk
  |   |-- atchannel.h                                             //负责向modem读写数据
  |   |-- atchannel.c
  |   |-- at_tok.h
  |   |-- at_tok.c
  |   |-- misc.h
  |   |-- misc.c
  |   |-- MODULE_LICENSE_APACHE2
  |   |-- NOTICE
  |   |-- reference-ril.c                                          //主要负责与modem进行交互
  |-- rild
  |-- Android.mk
  |-- MODULE_LICENSE_APACHE2
  |-- NOTICE
  |-- radiooptions.c                                          //调试时配置Modem参数
  |-- rild.c                                                        //RIL守护进程
  其中include/telephony目录下面的ril.h文件,定义了104个如下的宏:
  RIL_REQUEST_XXXX
  这些宏代表客户进程向Android telephony发送的命令,包括SIM卡相关的功能,打电话,发短信,网络信号查询等等.

       2.目录hardware/ril/libril

  本目录下代码负责与客户进程进行交互.在接收客户进程命令后,调用相应函数进行处理,然后将命令响应结果传回客户进程.在收到来自网络端的事件后,也传给客户进程.
  文件ril_commands.h:列出了telephony可以接收的命令;每个命令对应的处理函数;以及命令响应的处理函数.
  文件ril_unsol_commands.h:列出了telephony可以接收的事件类型;对每个事件的处理函数;以及WAKEType
  文件ril_event.h/cpp:处理与事件源(端口,modem等)相关的功能.ril_event_loop监视所有注册的事件源,当某事件源有数据到来时,相应事件源的回调函数被触发(firePending-> ev->func())
  文件ril.cpp:
  RIL_register函数:打开监听端口,接收来自客户进程的命令请求(s_fdListen   =android_get_control_socket(SOCKET_NAME_RIL);),当与某客户进程连接建立时,调用listenCallback函数;创建一单独线程监视并处理所有事件源(通过ril_event_loop)
  listenCallback函数:当与客户进程连接建立时,此函数被调用.此函数接着调用  processCommandsCallback处理来自客户进程的命令请求
  processCommandsCallback函数:具体处理来自客户进程的命令请求.对每一个命令,ril_commands.h中都规定了对应的命令处理函数(dispatchXXX),processCommandsCallback会调用这个命令处理函数进行处理.
  dispatch系列函数:此函数接收来自客户进程的命令己相应参数,并调用onRequest进行处理.
  RIL_onUnsolicitedResponse函数:将来自网络端的事件封装(通过调用responseXXX)后传给客户进程.
  RIL_onRequestComplete函数:将命令的最终响应结构封装(通过调用responseXXX)后传给客户进程.
  response系列函数:对每一个命令,都规定了一个对应的response函数来处理命令的最终响应;对每一个网络端的事件,也规定了一个对应的response函数来处理此事件.response函数可被onUnsolicitedResponse或者onRequestComplete调用.

  3. 目录hardware/ril/reference-ril分析:

  本目录下代码主要负责与modem进行交互.
  文件reference-ril.c:此文件核心是两个函数:onRequest和onUnsolicited
  onRequest 函数:在这个函数里,对每一个RIL_REQUEST_XXX请求,都转化成相应的ATcommand,发送给modem,然后睡眠等待.当收到此ATcommand的最终响应后,线程被唤醒,将响应传给客户进程(RIL_onRequestComplete-> sendResponse).
  onUnsolicited函数:这个函数处理modem从网络端收到的各种事件,如网络信号变化,拨入的电话,收到短信等.然后将时间传给客户进程(RIL_onUnsolicitedResponse -> sendResponse)
  文件atchannel.c:负责向modem读写数据.其中,写数据(主要是ATcommand)功能运行在主线程中,读数据功能运行在一个单独的读线程中.
  at_send_command_full_nolock函数:运行在主线程里面.将一个ATcommand命令写入modem后进入睡眠状态(使用pthread_cond_wait或类似函数),直到modem读线程将其唤醒.唤醒后此函数获得了ATcommand的最终响应并返回.
  readerLoop函数: 运行在一个单独的读线程里面,负责从modem中读取数据.读到的数据可分为三种类型:网络端传入的事件;modem对当前ATcommand的部分响应;modem对当前AT command的全部响应.对第三种类型的数据(ATcommand的全部响应),读线程唤醒(pthread_cond_signal)睡眠状态的主线程.


系列之Android RIL (c/c++) 和 java代码(二)的帖子链接http://www.eoeandroid.com/thread-103273-1-1.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 07:48 , Processed in 0.359999 second(s), 34 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表