qmi

QMI概述

高通平台一种通信接口, 是AP与BP的通信方式,多核间通信的方式;

连接AP BP有多种方式,如USB, 共享内存等等,多用于集成modem的msm(Mobile Station Modem)平台,独立modem的mdm(Mobile Data Modem)平台;

QMI 是Qualcomm Messaging Interface 的缩写,一些场景下,也被视为Qualcomm Modem Interface ,Qualcomm MSM Interface 之缩写;

可参考qcom文档:

80-VR459-1 C : QMI Framework Overview

80-NE084-2 B :QMI Overview

QMI消息

三种消息类型:

  1. Client request
  2. Service response
  3. Service indication

QMI消息特点

Messages:

qmi消息分为两种, 两种消息支持并发,互不干扰;

  • QMI Control Message
  • QMI Data Message

Message-based communication

  • Transactions用于将响应与特定请求关联起来
  • 一对请求/响应使用Transaction ID分组到Transactions中
  • 每个Transaction包含一个或多对 请求/响应
    • 当Transaction中的所有请求完成时发送响应
  • 消息是可变长度的
  • 每个服务的消息ID都是唯一的
  • Type-Length-Value (TLV)(TLV) (一种有 类型,长度,值组成的数据格式)
    • 类型和长度是固定大小,但值是可变长度
    • 每个消息中可以存在多个TLV
    • 值中可以存在多个数据元素
    • 每个消息的TLV ID都是唯一的

QMI消息组成结构

由传输头transport header和service-level message组成

  • 每个transport 的transport header都是唯一的
  • service-level message对于所有transport都是通用的,并且包含以下元素
    • Message ID
    • Message length
    • 零个或多个可变长度TLV

QMI结构

QMI是CS结构,分为client端,和service端;

QMI的control point和service。在AP向BP发送请求时,AP作为client端,当AP

接收BP侧返回的响应时,AP作为services端。QMI包含了一系列的QMI Service,例如nas,voice,wds等,

这些不同的services相当于不同逻辑设备,给不同的app调用。

使用接口:

QCCI:Qualcomm common client interface

是一套用于客户端从服务器接收信息或者发送消息到服务器的API集合

QCSI:Qualcomm common service interface

则是与QMI IDL(interface definition language)自动编译生成的代码一起使用,用于接收客户端的请求及对其作出响应。另外,它也用来发送指示消息(indication message)以及对消息进行编解码(encode/decode),这个消息由server端主动发出。

QMI消息格式

QMI有相应的消息和消息的协议,设备终端就是通过这些消息来访问AMSS。对于不同的qmi消息,

消息长度不一样,可自己定义消息长度,不同的qmi消息,消息格式是相同的。

QMI特点

  • 异步消息传递接口用于客户端和服务之间的通信
  • 设备的控制接口
  • 高通芯片组通用接口
  • 可拓展
  • 向后兼容
  • 同时支持多个客户端并发
  • 同时支持多个服务端并发运行,每个服务端还对应多个客户端
  • 将任何类似的功能分离为独立的服务
  • 每个服务端支持版本信息

QMI Service

每一个服务都对应于一个service.idl的文件定义。.idl文件定义了每一个massage相关的常量,枚举类型以及和消息相关的数据结构。消息的类型有如下三种:

Request message ——一条request消息由客户端发往服务端,并由服务端进行处理。

Reponse message——每一个request的消息都会有一个reponse消息与之对应,类似于一个函数的返回值。如果请求消息等效于调用函数,则响应消息等效于返回给调用方的结果。

Indiction message——这类消息是由服务端发给客户端的异步消息。sensor1 API的规范要求:在任何indication message发送之前,客户端首先需要通过request message与服务端建立连接。indication消息可以在任何时候发送。

QMI与其他Interface比较

QMI ATCoP DIAG
异步通信 同步通信 系统更改后重启生效
支持外部芯片
同时多个客户端 每个实例只支持一个客户端 每个实例只支持一个客户端
根据需要扩展以支持尽可能多的实例
(目前最多支持大约20个)
不容易支持多个实例 不容易支持多个实例

QMI framework

上层控制点打包对应类型的QMI消息或通过其他操作系统的框架,将要发出的数据传到AP

侧底层的逻辑设备,最后逻辑设备通过内联的总线接口,传到BP侧的AMSS。在代码中可以找到从控制点发

送到逻辑设备的函数。

这个是控制点向BP侧发送同步消息的函数,参数包括走的QMI_Service类型,Service里面消息的名称,

请求消息的初始地址,长度,返回相应的初始地址和长度。逻辑设备和BP侧内联的总线也可以分很多种:

USB,SDIO,共享内存,无线协议802.11等都可以作为总线连接AP和BP。咱们现在开发的MSM平台用

的是共享内存。代码中qmi_port_defs.h中的枚举qmi_connection_id_type定义了AP侧QMI和BP侧的

连接通道,包括集成modem的MSM平台和独立modem的MDM。

![image-20210709140118353](C:\Users\jixuan.yu\AppData\Roaming\Typora\typora-user-images\image-20210709140118353.png

AP侧 QMI:

代码路径:vendor/qcom/proprietary/qmi

从图中可看出,整个QMI架构中,主要是通过QMUX层完成软件上的TE和MSM的交互。

1,一个服务可以对应多个控制点,一个控制点只能对应一个服务。

2,控制点与服务的关系就好比C/S模型中的客户端与服务器关系。

3,如果某程序使用几种QMI服务,那么它就要为每种服务构建一个控制点。

可以看出QMI并不是一个简单的一对一传输通信方式,而是一个服务可以同时接受几个控制点发出的消息,

其实现的原理也是对传输信道的复用。

QMI之QMUX

QMI之QCRIL

QMI消息传送

posted @ 2021-07-08 17:12  yujixuan  阅读(889)  评论(0编辑  收藏  举报