设为首页收藏本站

移动叔叔

搜索
查看: 2435|回复: 0
打印 上一主题 下一主题

[教程] 工大,android系统中间件移植-3G4G通信模块适配

[复制链接]
跳转到指定楼层
楼主
发表于 2015-9-5 04:58:09 来自手机版 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 1281423525 于 2015-9-5 12:34 编辑

一、在内核源码drivers/usb/serial/option.c文件中添加相关模块的pid和vid,有些模块还需要厂家提供的系统上的驱动。

下面列举我们常用的模块以及pid和vid:
{ USB_DEVICE(0x16d5, 0x6502) }, //DTM518
{ USB_DEVICE(0x19D2, 0xFFED) }, //MC2716
{ USB_DEVICE(0x1AB7, 0x6000) }, //LC6311
{ USB_DEVICE(0x1AB7, 0x6341) }, //LC6341
{ USB_DEVICE(0x20B9, 0x1682) }, //CEM600
{ USB_DEVICE(0x1782, 0x3d00) }, //M520
{ USB_DEVICE(0x1782, 0x3d10) }, //M520-PCIE
{ USB_DEVICE(0x05C6, 0x9000) }, //SIM5218
{ USB_DEVICE(0x1AB7, 0x8142) }, //LC6152
{ USB_DEVICE(0x19D2, 0xFFFE) }, //MC8630
{ USB_DEVICE(0x07B8, 0x0040) }, //DWM162
{ USB_DEVICE(0x1C9E, 0x9B05) }, //U8300
{ USB_DEVICE(0x05C6, 0x9025) }, //L250/SIM939/L570

重新编译内核并烧写后,使用lsusb命令可以罗列相关usb设备及其pid、vid。


二、pppd数据拨号相关调试。
把相关脚本传到android系统/system/etc目录下,注意修改cmnet脚本文件中模块AT命令端口号(我们在调试的一款模式clm920有两个AT命令通信口:/dev/ttyUSB2和/dev/ttyUSB3),一个用于和android系统通信(android源码中对应),一个用于数据通信(cmnet脚本文件相对应)。

注:修改好上述pppd脚本后,传到android系统/system/etc目录的时候遇到报错:Readonly Filesystem,文件系统只读。

1、使用mount -o remount rw /system把相关目录重新挂载成可读写。这种方法仍然报Readonly Filesystem,文件系统只读。

2、采用重新做android文件系统的方法,修改android源码中out/target/product/ut5260/root/init.rc

修改mkdir /system成mkdir /system 0777 root root和修改mount rootfs rootfs / ro remount成mount rootfs rootfs / rw remount

重新编译android源码把生成的system.img和ramdisk.img烧写到开发板中。

这样就可以传ppp的脚本到/system/etc/目录了。

使用pppd call cmnet&或者/system/etc/ppp/init.gprs-pppd&进行手动拨号测试看可否拨号成功。

若拨号成功则使用busybox ifconfig会罗列出新的设备。


三、编译android源码的相关拨号库(我们这里使用ndk编译成库,该部分代码已经从android源码里剥离出来)把编译生成的.so库文件名字修改成nbpt-ril.so传到/system/lib目录下

并修改init.rc文件添加如下语句,重新编译android源码并烧写system.img和ramdisk.img

0
service ril-daemon /system/bin/rild -l /system/lib/nbpt-ril.so -- -d /dev/ttypts1 #--是注释
   class main
   socket rild stream 660 root radio
   socket rild-debug stream 660 radio system
   user root
   group radio cache inet misc audio sdcard_rw log


这样就重启设备就使用了。
logcat -b radio
就可以抓log对应源码修改进行调试了。Android通信模块
发布时间:2015-4-16 11:54:17
来源:分享查询网

Android通信模块
第一部分电话功能概述
    Android的Radio Interface Layer (RIL)提供了电话服务和的radio硬件之间的抽象层。
     Radio Interface Layer RIL(Radio Interface Layer)负责数据的可靠传输、AT命令的发送以及response的解析。应用处理器通过AT命令集与带GPRS功能的无线通讯模块通信。
     AT command由Hayes公司发明,是一个调制解调器制造商采用的一个调制解调器命令语言,每条命令以字母"AT"开头。

JAVA Framework
代码的路径为:
    frameworks/base/telephony/java/android/telephony
     android.telephony以及android.telephony.gsm

Core native:
在hardware/ril目录中,提供了对RIL支持的本地代码,包括4个文件夹:
hardware/ril/include  
hardware/ril/libril  
hardware/ril/reference-ril  
hardware/ril/rild

kernel Driver
     在Linux内核的驱动中,提供了相关的驱动程序的支持,可以建立在UART或者SDIO,USB等高速的串行总线上。

第二部分电话功能各个部分
    hardware/ril/include/telephony/目录中的ril.h文件是ril部分的基础头文件。
    其中定义的结构体RIL_RadioFunctions如下所示:
typedefstruct {
    int version;
    RIL_RequestFunc onRequest;
    RIL_RadioStateRequest onStateRequest;
    RIL_Supports supports;
    RIL_Cancel onCancel;
    RIL_GetVersion getVersion;
} RIL_RadioFunctions;
    RIL_RadioFunctions中包含了几个函数指针的结构体,这实际上是一个移植层的接口,下层的库实现后,由rild守护进程得到这些函数指针,执行对应的函数。
几个函数指针的原型为:
typedefvoid (*RIL_RequestFunc) (int request, void *data,
                                  size_t datalen, RIL_Token t);
typedef RIL_RadioState (*RIL_RadioStateRequest)();
typedef int (*RIL_Supports)(int requestCode);
typedef void (*RIL_Cancel)(RIL_Token t);
typedef const char * (*RIL_GetVersion) (void);
    其中最为重要的函数是onRequest(),它是一个请求执行的函数。

2.1 rild守护进程
    rild 守护进程的文件包含在hardware/ril/rild目录中,其中包含了rild.c和radiooptions.c两个文件,这个目录中的文件经过编译后生成一个可执行程序,这个程序在系统的安装路径在:
/system/bin/rild
     rild.c是这个守护进程的入口,它具有一个主函数的入口main,执行的过程是将请求转换成AT命令的字符串,给下层的硬件执行。在运行过程中,使用dlopen 打开路径为/system/lib/中名称为libreference-ril.so的动态库,然后从中取出RIL_Init符号来运行。
     RIL_Init符号是一个函数指针,执行这个函数后,返回的是一个RIL_RadioFunctions类型的指针。得到这个指针后,调用RIL_register()函数,将这个指针注册到libril库之中,然后进入循环。
     事实上,这个守护进程提供了一个申请处理的框架,而具体的功能都是在libril.so和libreference-ril.so中完成的。

2.2libreference-ril.so动态库

libreference-ril.so动态库的路径是:
hardware/ril/reference-ril
其中主要的文件是reference-ril.c和atchannel.c。这个库必须实现的是一个名称为RIL_Init的函数,这个函数执行的结果是返回一个RIL_RadioFunctions结构体的指针,指针指向函数指针。
这个库在执行的过程中需要创建一个线程来执行实际的功能。在执行的过程中,这个库将打开一个/dev/ttySXXX的终端(终端的名字是从上层传入的),然后利用这个终端控制硬件执行。

2.3 libril.so动态库
     libril.so库的目录是:
hardware/ril/libril  
     其中主要的文件为ril.cpp,这个库主要需要实现的以下几个接口为:
RIL_startEventLoop(void);
void RIL_setcallbacks (const RIL_RadioFunctions *callbacks);
RIL_register (const RIL_RadioFunctions *callbacks);
RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_tresponselen);
void RIL_onUnsolicitedResponse(int unsolResponse, void *data,
                               size_tdatalen);
RIL_requestTimedCallback (RIL_TimedCallback callback, void *param,
                               conststruct timeval *relativeTime);
    这些函数也是被rild守护进程调用的,不同的vendor可以通过自己的方式实现这几个接口,这样可以保证RIL可以在不同系统的移植。其中RIL_register()函数把外部的RIL_RadioFunctions结构体注册到这个库之中,在恰当的时候调用相应的函数。在执行的过程中,这个库处理了一些将请求转换成字符串的功能。
1. ITelephony接口和ISms接口以及AIDL
   在我们的Android应用中,当需要实现电话拨号时,我们需要进行如下调用
   ITelephony phone =(ITelephony)ITelephony.Stub.asInterface(ServiceManager.getService("phon"))
   phone.dial("10086");
   对于短信应用,我们需要的是调用SmsManager,代码如下
   SmsManager manager = SmsManager.getDefault();
   manager.sendTextMessage("10086",null,"hi,this issms",null,null);
   这里,SmsManager对ISms做了一层包装,实质上是通过调用
   ISms simISms = ISms.Stub.asInterface(ServiceManager.getService("isms"));
   simISms.sendRawPdu....
   
   可以看到,应用都是采用AIDL来实现IPC的跨进程调度。
   对于AIDL应用,调用进程方存在的是一个实现接口的Proxy对象,通过Proxy对象与被调用进程中的Stub对象进行
通讯来实现IPC的跨进程调度,所以,在被调用进程一端必定有一个ITelephony.Stub类以及ISms.Stub类的实现
如下图所示

2. PhoneInterfaceManager和SimSmsInterfaceManager
   ITelephony.Stub 的实现类为com.android.phone.PhoneInterfaceManager
   ISms.Stub的实现类为com.android.internal.telephony.gsm.SimSmsInterfaceManager
   从这两个类的构造器的调用代码里可以很清楚的看到进行了Service的注册工作
   ServiceManager.addService("phone",this);
   ServiceManager.addService("isms",this);
3. PhoneApp,InCallScreen,PhoneUtils及其他相关类
   从SimSmsInteferManager的相关方法实现中可以看到,具体就是调用GSMPhone的SmsDispatcher实例来进行相关操作的
您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /1 下一条

© 2008-2025 移动叔叔. 版权所有,专业的网络售后平台 ( 闽ICP备18006692号-3 )

商务合作点击这里给我发消息|Email:service@mobileuncle.com|手机版|移动叔叔     

GMT+8, 2025-2-26 22:22 , Processed in 0.178618 second(s), 11 queries , Gzip On, Memcache On.

返回顶部