高通QMI架构简介

⾼通QMI架构简介
什么是QMI?
Qualcom Message Interface  ⾼通信息接⼝
弹道修研
背景:2005-2006年部署(原⾼通MSMTM接⼝),所有服务最初都是由DATA团队设计和维护的,功能是按照AT命令标准构建的,主要⽤于连接管理器类型应⽤程序,可通过USB连接(QMUX传输)连接到电脑。
2009年QMI取代RPC(Remote Procedure Call),QMI的范围开始扩⼤,⽆线电接⼝层(RILs)开始向QMI过渡,并定义了必要的⽀持;底层由更健壮的通信(IPC路由器传输)替代,通过共享内存⽅式(SMD)在⽚上SOC之间可⽤。
⾼通平台⽬前都是⾮对称多核⼼,最主要的是AP和Modem。两个处理器怎么进⾏通信呢,我们把AP和Modem当作两个主机,问题就变得了很简单,TCP/IP协议不是⼀种⾮常成功的进程间跨主机通信⽅式。⾼通没有采⽤这种⽅式,但是借鉴了TCP/IP的框架设计。它的框架是这样的,内核态:基于共享内存(SMD)实现链路层,扩展协议域;⽤户态,封装出类似于socket函数的接⼝,⽤于⽤户态使⽤。⽽我所描述的QMI就是⽤户态使⽤的API接⼝,这些接⼝⾮常类似于socket,只要有个socket编程的经验的是会容易理解的。
QMI提供什么?
⽀持同步和异步接⼝;
⽀持在在多个处理器之间进⾏通信;
具有良好的可扩展性;
⽀持多客户端并发运⾏;
⽀持多个服务端并发运⾏,且每个服务端还对应多个客户端;
每个服务端还⽀持版本信息;
QMI架构
Messages
Request message ——⼀条request消息由客户端发往服务端,并由服务端进⾏处理。
Reponse message——每⼀个request的消息都会有⼀个reponse消息与之对应,类似于⼀个函数的返回值。如果请求消息等效于调⽤函数,则响应消息等效于返回给调⽤⽅的结果。
Indiction message——这类消息是由服务端发给客户端的异步消息,在任何indication message发送之前,客户端⾸先需要通过request message与服务端建⽴连接,indication消息可以在任何时候发送。
消息的特点:
1. 消息由Type-Length-Value(TLV)单元构成;
2. 类型和长度是固定⼤⼩,⽽值是可变长度的;
3. 每个消息中可以出现多个tlv值;
4. 可以在该值中显⽰多个数据元素;
5. 对于每个消息的TLV id都是唯⼀的;
消息的结构:
1. 由传输头和服务级消息组成
2. 每个传输的传输头都是唯⼀的
Service Message服务级负载对于所有传输都是通⽤的,并包含以下元素
消息ID
消息长度
零或多个可变长度的tlv
Clients
1. 任何想要使⽤QMI的内部或外部客户端应⽤程序
Services
1. 任何想要使⽤QMI的内部应⽤服务程序
Common Libraries
1. 为客户端(QCCI)和服务(QCSI)提供功能
2. 通⽤API适⽤于所有平台/传输
3. 封装传输和特定于平台的更改,以便共享客户机/服务代码
4. 为每个服务消息提供编码/解码⽀持
Transports
琴谱音响QMUX
1. ⾼通多路复⽤协议(QMUX);
2. 原始传输通过⼀个有线USB以太⽹适配器;
3. ⽀持MPSS处理器上的服务;
4. ⽀持在应⽤程序(APPS)处理器或usb连接的主PC上的客户端;
5. QMUX的客户端是⽤于特定于平台的,不同平台可能有差异;
IPC Router
1. IPC路由器是⼀个⾯向消息(message-oriented)的路由器,⽤于⽀持Qualcomm QCCI QCSI;
2. 增强了同⼀设备上处理器之间的传输;
3. 通过SMD在路由节点之间传递QMI有效负载;
4. ⽀持任何处理器上的客户端和服务;
5. API对于所有平台都是通⽤的,即使实现不同;
QMI IDL
QMI接⼝是⽤接⼝定义语⾔(IDL)编写的,IDL编译器⾃动⽣成⽂件 .c和.h
编码/解码库
1. 库是独⽴的,并且与⾃动⽣成的⽂件解耦
2. 编码/解码消息的元信息将在.c作为Service_Object⽣成
3. 在服务/客户机启动期间,元信息将注册到QCSI/QCCI进⾏消息编码/解码
4. 客户端/服务可以使⽤QCCI/QCSI API发送/接收消息
QMI消息编码标准
1. 不使⽤浮点型数据,⽽是使⽤Q16类型的固定点数,即提供16位2位补码整数部分和16位⼩数部分的定点实现。
2. 命名约定
1. 为了使所有消息实现保持⼀致,service端需要固定的独有的前缀
2. 结构体以_type结尾
3. 枚举以_enum结尾
4. 请求消息以_req_msg结尾,类型以_REQ结尾
5. 消息回应以_resp_msg结尾,类型以_RESP结尾
6. 指⽰消息以_ind_msg结尾,类型以_IND结尾
QMI QCCI
QCCI是⼀套⽤于客户端从服务器接收信息或者发送消息到服务器的API集合。
以下步骤描述初始化客户机:
1. QMI客户机创建⼀个通知句柄来接收服务到达和退出事件通知。然后是客户端
⽤notifier句柄注册⼀个通知回调函数;
2. 当服务到达时,将设置信号,并调⽤通知回调函数来客户端关于服务到达的消息;
3.QMI客户机在收到服务到达通知后解析服务地址;
4. QMI客户机初始化服务的客户机句柄,该服务的地址在步骤3中解析。然后,这个客户端句柄⽤于与相关的QMI服务交换QMI消息;
5. 初始化客户端句柄时,将向客户端句柄注册⼀个错误回调函数。此错误回调⽤于接收关于服务重启或⼦系统重启的任何通知;
6. 此时,QMI客户机可以释放notifier句柄,以避免任何资源泄漏;
7. QMI客户机同步或异步发送请求消息,如上图所⽰;
8. 当所有相关的QMI消息通信完成时,QMI客户机释放客户机句柄。
QCCI APIs Callback function prototypes
1. qmi_client_recv_raw_msg_async_cb
2. qmi_client_recv_msg_async_cb
3. qmi_client_ind_cb
Connection APIs
1. qmi_client_notifier_init
2. qmi_client_init
3. qmi_client_get_service_list
Message sending APIs
1. qmi_client_send_raw_msg_sync
2. qmi_client_send_msg_sync
3. qmi_client_delete_async_txn
Release connection APIs
1. qmi_client_release
Encode and decode APIs
1. qmi_client_message_encode
2. qmi_client_message_decode
QMI QCSI
QCSI是⽤于接收客户端的请求及对其作出响应。另外,它也⽤来发送指⽰消息(indication message)以及对消息进⾏编解码
(encode/decode),这个消息由server端主动发出。
消息的类型有如下三种:
Request message ——⼀条request消息由客户端发往服务端,并由服务端进⾏处理。
Reponse message——每⼀个request的消息都会有⼀个reponse消息与之对应,类似于⼀个函数的返回值。如果请求消息等效于调⽤函数,则响应消息等效于返回给调⽤⽅的结果。
Indiction message——这类消息是由服务端发给客户端的异步消息。在任何indication message发送之前,客户端⾸先需要通过request message与服务端建⽴连接。indication消息可以在任何时候发送。Callback function prototypes
1. qmi_csi_connect
2. qmi_csi_disconnect
3. qmi_csi_process_req
Registration APIs
1. qmi_csi_register
2. qmi_csi_unregister
Message sending APIs
1. qmi_csi_send_resp
2. qmi_csi_send_ind
3. qmi_csi_send_broadcast_ind
华硕u6
Event handling APIs
1. qmi_csi_handle_event
QMI SERVER
这个api构建在QCSI框架之上
其主要⽬的是⽅便客户机以更少的⼯作量实现服务器
该框架允许⽤户编写基于对象的服务器,扩展核⼼服务器对象。核⼼服务器对象提供每个服务都需要的通⽤功能西堤红山
Callback Function Prototypes
1. qmi_csi_connect
2. qmi_csi_disconnect
3. qmi_csi_process_req
广西中医学院学报
Constructor/Destructor APIs
1. qmi_core_server_new
2. qmi_core_server_delete
Registration APIs
1. qmi_core_server_register
2. qmi_core_server_unregister
3. qmi_core_server_register_client
4. qmi_core_server_unregister_client
Message Dispatch APIs
1. qmi_core_server_dispatch_msg
2. qmi_core_server_send_ind
3. qmi_core_server_send_resp
输液管QMUX
QMI Multiplexing Protocol(QMUX):QMI的复⽤协议
消息从控制点经过类似socket的线程传到QMI接⼝后,QMI负责对数据进⾏封装,加上QMUX消息的头,发送到QMUX层,再通过QMUX层传到共享内存到BP侧。

本文发布于:2024-09-21 01:36:37,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/356879.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:消息   服务   客户端   客户机   传输   通知
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议