- Android系统级深入开发
- 韩超 梁泉
- 1093字
- 2020-08-26 21:43:42
5.4.9 高通特有的组件相关内容
MSM处理器SOC内部集成应用处理器和基带处理器,因此还包含了很多高通独有的组件驱动。
这些文件在arch/arm/mach-msm/目录中,主要内容如下所示。
smd_private.h:共享内存相关的结构和内存区域等定义
smd.c:共享内存的部分底层机制的实现
proc_comm.c:处理器间简单远程命令接口实现
smd_rpcrouter.c:ONCRPC实现部分
smd_rpcrouter_device.c:ONCRPC实现部分
smd_rpcrouter_servers.c:ONCRPC实现部分
1.SMEM
SMEM(Shared Memory)用于管理共享内存的区域。有静态和动态两种区域。静态区域一般是定义好的,可以由两个CPU分别直接访问。而动态区域一般通过smem的分配机制来分配。
SMEM是最基础的共享内存管理机制,所有使用共享内存的通信机制或协议都基于它来实现。区域很多,有用于存放基本的版本等信息的,也有用于实现简单的RPC机制的,还有分配Buffer以用于大量数据传输的。
SMEM的区域定义在arch/arm/mach-msm/目录smd_private.h中,实现代码大多在该目录下的smd.c中。
2.SMSM
SMSM利用SMEM中SMEM_SMSM_SHARED_STATE等区域,传送两个CPU的状态信息,诸如modem重启,休眠等状态。
SMSM信息变化后,通常通过中断来通知到另一处理器。
3.PROC COMM
PROC COMM使用SMEM中的最前面一个区域:SMEM_PROC_COMM。它是一套应用处理器向MODEM发送简单命令的接口。
PROC COMM能传递的信息非常有限,仅能传递两个uint32的数据作为参数,也只能接受两个uint32的数据,加一个boolean作为返回值。但相对于后面提到的RPC,PROC COMM更轻量级。
PROC COMM定义在proc_comm.c中,通常应用处理器会使用msm_proc_comm接口函数来发送命令,并通过轮询进行等待返回。注意需要支持的命令,要在modem侧启动时,注册好对应的处理程序。
常用的PROC COMM命令有:
SMEM_PROC_COMM_GET_BATT_LEVEL:获取电池电量级别
SMEM_PROC_COMM_CHG_IS_CHARGING:判断是否在充电
SMEM_PROC_COMM_POWER_DOWN:关机
SMEM_PROC_COMM_RESET_MODEM:重启modem
4.SMD
SMD用于在处理器之间,是一套通过共享内存,同步大量数据的协议。
目前SMD支持64个通道,其中36个已经定义。分别用于蓝牙,RPC,modem数据链接等。为了防止冲突,每个通道使用两路连接,将发送和接收分开。
SMD使用SMEM中的对应区域分配适当大小的缓冲,并定义了详细的协议,用于控制传输的开启、停止等。控制的标记类似于RS-232,而且支持流控。
SMD支持stream模式和packet模式。后者会对数据进行封包,保证对端获取到的数据与传送时分块一致。
SMD主要实现在smd.c中。有一整套的函数接口:
smd_open:打开一个smd通道
smd_close:关闭一个smd通道
smd_read:从一个通道中读取
smd_write:写入到一个通道
smd_alloc_channel:分配一个通道
5.ONCRPC
RPC的含义为Remote Procedure Calls(远程过程调用)。此处特指处理器间的远程过程调用。在高通平台中,这一机制又叫ONCRPC(Open Network Computing Remote Procedure Call),以下提及ONCRPC,都是特指高通平台上的具体实现。
ONCRPC基于共享内存上的SMD实现。使应用处理器端的应用程序,可以直接访问modem端的服务,支持的服务如下:
Call Manager (CM API)
Wireless Messaging Service (WMS API)
GSDI (SIM/USIM)
GSTK (Toolkit)
PDSM API (GPS)
其他
ONCRPC基于服务端/客户端的思想构建,代码分布在smd_rpcrouter开头的源码文件中。服务端实现到modem的具体服务访问,而客户端暴露透明的API给用户程序调用。用户程序如果需要使用ONCRPC,需要链接ONCRPC-shared,AMSS RPC exported等库。