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等库。