高通QMI协议

QMI(Qualcomm MSM Interface,官方名称应该是Qualcomm Message Interface)是高通用来替代OneRPC/DM的协议,用来与modem通信。

QMI协议定义了多个服务: DMS(设备管理Device Management) 提供载入 设备信息的功能 NAS(网络访问Network Access)提供欧冠你注册网络的动作 WDS(数据连接) PDS(GPS定位报告) UIM(管理User Identity Module) CTL(控制服务:用户发起其他服务请求前,必须先申请 ClientID, 这个ID就是由控制服务分配的, 这个服务永远在线)

协议里的每个服务都定义了 请求和响应 (也叫做 Indication) 每个请求响应都有一个匹配的ID,这样用户可以一次发出多个请求。并且响应也不必严格按照请求的顺序进行回应。

Indication作为主动提供的消息, 要么发送给某个特定的客户端, 要么是广播消息(广播给所有使用这个服务的客户)。 通常情况下,用户需要通过一些请求/响应 来打开indication

协议中的每条消息都定义了一系列输入(在请求中才有输入)参数,或者输出(在响应或者indications中才有输出)参数。 这些参数,我们命名为TLV

QMI协议可以通过Linux kernels (>= 3.4)来访问。载入cdc-wdm和qmi_wwan之后即可

$ lsmod
...
qmi_wwan               20971  0
cdc_wdm                17427  1 qmi_wwan
...
usbnet                 30844  3 rndis_host,qmi_wwan,cdc_ether
usbcore               195340  14 rndis_host,rt2x00usb,usb_storage,rt2800usb,ehci_hcd,ehci_pci,qmi_wwan,usbhid,usbnet,cdc_wdm,xhci_hcd,cdc_ether

https://packages.debian.org/sid/libqmi-glib1 (/usr/lib/x86_64-linux-gnu/libqmi-glib.so.1) https://packages.debian.org/jessie/libqmi-utils (/usr/bin/qmi-network) (/usr/bin/qmicli) https://packages.debian.org/sid/libqmi-glib-dev

设置适当的usb模式

# setprop sys.usb.config diag,serial_smd,serial_tty,rmnet_bam,mass_storage,adb

在PC上可以看到

$ ls -la /dev/cdc*
crw------- 1 root root 180, 0 10月 12 20:29 /dev/cdc-wdm0

演示

# qmicli -d /dev/cdc-wdm0 --dms-get-revision
[/dev/cdc-wdm0] Device revision retrieved:
	Revision: ‘M8626A-AAAANAZM-1.1.00759  1  [Dec 31 2013 03:00:00]‘

# qmicli -d /dev/cdc-wdm0 --dms-uim-get-imsi
[/dev/cdc-wdm0] UIM IMSI retrieved:
	IMSI: ‘204043154974997‘

# qmicli -d /dev/cdc-wdm0 --dms-uim-get-iccid
[/dev/cdc-wdm0] UIM ICCID retrieved:
	ICCID: ‘89860313100205205744‘

# qmicli -d /dev/cdc-wdm0 --dms-get-capabilities
[/dev/cdc-wdm0] Device capabilities retrieved:
	Max TX channel rate: ‘1800000‘
	Max RX channel rate: ‘3100000‘
	       Data Service: ‘non-simultaneous-cs-ps‘
	                SIM: ‘supported‘
	           Networks: ‘cdma20001x, evdo, gsm‘

# qmicli -d /dev/cdc-wdm0 --dms-get-ids
[/dev/cdc-wdm0] Device IDs retrieved:
	 ESN: ‘C33BA980‘
	IMEI: ‘355991020927480‘
	MEID: ‘A1000051CA0BE1‘

# qmicli -d /dev/cdc-wdm0 --dms-get-band-capabilities
[/dev/cdc-wdm0] Device band capabilities retrieved:
	Bands: ‘bc-0-a-system, bc-0-b-system, gsm-dcs-1800, gsm-900-extended, gsm-850, gsm-pcs-1900‘
	LTE bands: ‘(null)‘

v# qmicli -d /dev/cdc-wdm0 --nas-get-system-selection-preference
[/dev/cdc-wdm0] Successfully got system selection preference
	Emergency mode: ‘no‘
	Mode preference: ‘cdma-1x, cdma-1xevdo, gsm‘
	Band preference: ‘bc-0-a-system, bc-0-b-system, bc-1-all-blocks, bc-2, bc-3-a-system, bc-4-all-blocks, bc-5-all-blocks, gsm-dcs-1800, gsm-900-extended, gsm-900-primary, bc-6, bc-7, bc-8, bc-9, bc-10, bc-11, gsm-450, gsm-480, gsm-750, gsm-850, gsm-900-railways, gsm-pcs-1900, wcdma-2100, wcdma-pcs-1900, wcdma-dcs-1800, wcdma-1700-us, wcdma-850-us, wcdma-800, bc-12, bc-14, wcdma-2600, wcdma-900, wcdma-1700-japan, bc-16, bc-17, bc-18, bc-19‘
	LTE band preference: ‘(null)‘
	TD-SCDMA band preference: ‘a, b, c, d, e, f‘
	CDMA PRL preference: ‘any‘
	Roaming preference: ‘any‘
	Network selection preference: ‘automatic‘
	Service domain preference: ‘cs-ps‘
	Service selection preference: ‘wcdma‘

代码  http://cgit.freedesktop.org/libqmi

详细调试信息

v# qmicli -d /dev/cdc-wdm0 -v  --dms-get-ids
[12 10月 2014, 20:55:31] [Debug] [/dev/cdc-wdm0] Opening device with flags ‘none‘...
[12 10月 2014, 20:55:31] [Debug] QMI Device at ‘/dev/cdc-wdm0‘ ready
[12 10月 2014, 20:55:31] [Debug] [/dev/cdc-wdm0] Assuming service ‘dms‘ is supported...
[12 10月 2014, 20:55:31] [Debug] [/dev/cdc-wdm0] Allocating new client ID...
[12 10月 2014, 20:55:31] [Debug] [/dev/cdc-wdm0] Sent message...
<<<<<< RAW:
<<<<<<   length = 16
<<<<<<   data   = 01:0F:00:00:00:00:00:01:22:00:04:00:01:01:00:02

[12 10月 2014, 20:55:31] [Debug] [/dev/cdc-wdm0] Sent message (translated)...
<<<<<< QMUX:
<<<<<<   length  = 15
<<<<<<   flags   = 0x00
<<<<<<   service = "ctl"
<<<<<<   client  = 0
<<<<<< QMI:
<<<<<<   flags       = "none"
<<<<<<   transaction = 1
<<<<<<   tlv_length  = 4
<<<<<<   message     = "Allocate CID" (0x0022)
<<<<<< TLV:
<<<<<<   type       = "Service" (0x01)
<<<<<<   length     = 1
<<<<<<   value      = 02
<<<<<<   translated = dms

[12 10月 2014, 20:55:31] [Debug] [/dev/cdc-wdm0] Received message...
>>>>>> RAW:
>>>>>>   length = 24
>>>>>>   data   = 01:17:00:80:00:00:01:01:22:00:0C:00:02:04:00:00:00:00:00:01:02:00:02:03

[12 10月 2014, 20:55:31] [Debug] [/dev/cdc-wdm0] Received message (translated)...
>>>>>> QMUX:
>>>>>>   length  = 23
>>>>>>   flags   = 0x80
>>>>>>   service = "ctl"
>>>>>>   client  = 0
>>>>>> QMI:
>>>>>>   flags       = "response"
>>>>>>   transaction = 1
>>>>>>   tlv_length  = 12
>>>>>>   message     = "Allocate CID" (0x0022)
>>>>>> TLV:
>>>>>>   type       = "Result" (0x02)
>>>>>>   length     = 4
>>>>>>   value      = 00:00:00:00
>>>>>>   translated = SUCCESS
>>>>>> TLV:
>>>>>>   type       = "Allocation Info" (0x01)
>>>>>>   length     = 2
>>>>>>   value      = 02:03
>>>>>>   translated = [ service = ‘dms‘ cid = ‘3‘ ]

[12 10月 2014, 20:55:31] [Debug] [/dev/cdc-wdm0] Registered ‘dms‘ (version unknown) client with ID ‘3‘
[12 10月 2014, 20:55:31] [Debug] Asynchronously getting IDs...
[12 10月 2014, 20:55:31] [Debug] [/dev/cdc-wdm0] Sent message...
<<<<<< RAW:
<<<<<<   length = 13
<<<<<<   data   = 01:0C:00:00:02:03:00:01:00:25:00:00:00

[12 10月 2014, 20:55:31] [Debug] [/dev/cdc-wdm0] Sent message (translated)...
<<<<<< QMUX:
<<<<<<   length  = 12
<<<<<<   flags   = 0x00
<<<<<<   service = "dms"
<<<<<<   client  = 3
<<<<<< QMI:
<<<<<<   flags       = "none"
<<<<<<   transaction = 1
<<<<<<   tlv_length  = 0
<<<<<<   message     = "Get IDs" (0x0025)

[12 10月 2014, 20:55:31] [Debug] [/dev/cdc-wdm0] Received message...
>>>>>> RAW:
>>>>>>   length = 66
>>>>>>   data   = 01:41:00:80:02:03:02:01:00:25:00:35:00:02:04:00:00:00:00:00:12:0E:00:41:31:30:30:30:30:35:31:43:41:30:42:45:31:10:08:00:43:33:33:42:41:39:38:30:11:0F:00:33:35:35:39:39:31:30:32:30:39:32:37:34:38:30

[12 10月 2014, 20:55:31] [Debug] [/dev/cdc-wdm0] Received message (translated)...
>>>>>> QMUX:
>>>>>>   length  = 65
>>>>>>   flags   = 0x80
>>>>>>   service = "dms"
>>>>>>   client  = 3
>>>>>> QMI:
>>>>>>   flags       = "response"
>>>>>>   transaction = 1
>>>>>>   tlv_length  = 53
>>>>>>   message     = "Get IDs" (0x0025)
>>>>>> TLV:
>>>>>>   type       = "Result" (0x02)
>>>>>>   length     = 4
>>>>>>   value      = 00:00:00:00
>>>>>>   translated = SUCCESS
>>>>>> TLV:
>>>>>>   type       = "Meid" (0x12)
>>>>>>   length     = 14
>>>>>>   value      = 41:31:30:30:30:30:35:31:43:41:30:42:45:31
>>>>>>   translated = A1000051CA0BE1
>>>>>> TLV:
>>>>>>   type       = "Esn" (0x10)
>>>>>>   length     = 8
>>>>>>   value      = 43:33:33:42:41:39:38:30
>>>>>>   translated = C33BA980
>>>>>> TLV:
>>>>>>   type       = "Imei" (0x11)
>>>>>>   length     = 15
>>>>>>   value      = 33:35:35:39:39:31:30:32:30:39:32:37:34:38:30
>>>>>>   translated = 355991020927480

[/dev/cdc-wdm0] Device IDs retrieved:
	 ESN: ‘C33BA980‘
	IMEI: ‘355991020927480‘
	MEID: ‘A1000051CA0BE1‘
[12 10月 2014, 20:55:31] [Debug] [/dev/cdc-wdm0] Releasing ‘dms‘ client with flags ‘release-cid‘...
[12 10月 2014, 20:55:31] [Debug] [/dev/cdc-wdm0] Unregistered ‘dms‘ client with ID ‘3‘
[12 10月 2014, 20:55:31] [Debug] [/dev/cdc-wdm0] Sent message...
<<<<<< RAW:
<<<<<<   length = 17
<<<<<<   data   = 01:10:00:00:00:00:00:02:23:00:05:00:01:02:00:02:03

[12 10月 2014, 20:55:31] [Debug] [/dev/cdc-wdm0] Sent message (translated)...
<<<<<< QMUX:
<<<<<<   length  = 16
<<<<<<   flags   = 0x00
<<<<<<   service = "ctl"
<<<<<<   client  = 0
<<<<<< QMI:
<<<<<<   flags       = "none"
<<<<<<   transaction = 2
<<<<<<   tlv_length  = 5
<<<<<<   message     = "Release CID" (0x0023)
<<<<<< TLV:
<<<<<<   type       = "Release Info" (0x01)
<<<<<<   length     = 2
<<<<<<   value      = 02:03
<<<<<<   translated = [ service = ‘dms‘ cid = ‘3‘ ]

[12 10月 2014, 20:55:31] [Debug] [/dev/cdc-wdm0] Received message...
>>>>>> RAW:
>>>>>>   length = 24
>>>>>>   data   = 01:17:00:80:00:00:01:02:23:00:0C:00:02:04:00:00:00:00:00:01:02:00:02:03

[12 10月 2014, 20:55:31] [Debug] [/dev/cdc-wdm0] Received message (translated)...
>>>>>> QMUX:
>>>>>>   length  = 23
>>>>>>   flags   = 0x80
>>>>>>   service = "ctl"
>>>>>>   client  = 0
>>>>>> QMI:
>>>>>>   flags       = "response"
>>>>>>   transaction = 2
>>>>>>   tlv_length  = 12
>>>>>>   message     = "Release CID" (0x0023)
>>>>>> TLV:
>>>>>>   type       = "Result" (0x02)
>>>>>>   length     = 4
>>>>>>   value      = 00:00:00:00
>>>>>>   translated = SUCCESS
>>>>>> TLV:
>>>>>>   type       = "Release Info" (0x01)
>>>>>>   length     = 2
>>>>>>   value      = 02:03
>>>>>>   translated = [ service = ‘dms‘ cid = ‘3‘ ]

[12 10月 2014, 20:55:31] [Debug] Client released

参考资料 http://sigquit.wordpress.com/2012/08/20/an-introduction-to-libqmi/ http://www.lanedo.com/users/amorgado/talks/FOSDEM2013%20-%20Mobile%20broadband%20modem%20control%20protocols.pdf http://blogs.gnome.org/dcbw/2010/04/15/mobile-broadband-and-qualcomm-proprietary-protocols/

usb网络接口 ECM: Ethernet Control Model       802.3 ethernet frames 以太网控制模型

NCM: Network Control Model

MBIM协议 (由高通,爱立信,微软等开发, USB论坛发布) 内核驱动是 cdc_mbim (Linux Kernel >= 3.8) 设备是  /dev/cdc-wdm libmbim mbimcli(libmbim-utils)

 mbimcli
 -d /dev/cdc-wdm1
 --basic-connect-query-subscriber-ready-status

在ChromiumOS上也实现了部分QMI协议 https://chromium.googlesource.com/chromiumos/platform/libqmi/+/master/src/

时间: 2024-11-05 21:47:10

高通QMI协议的相关文章

高通9X07模块QMI架构使用入门

QMI(Qualcomm Message Interface) 高通用来替代OneRPC/DM的协议,用来与modem通信.本文是摸索高通QMI机制一点经验,重点解读了如果建立拨号连接,仅供参考.qmi详细使用参考:高通QMI协议 1. QMI协议常用组件 DMS(设备管理Device Management) 提供查询设备信息功能 参考: qmi/device_management_service_v01.h NAS(网络访问Network Access) 提供网络管理功能 参考:qmi/net

解读高通反垄断调查中的四个真相

解读高通反垄断调查中的四个真相 http://tech.sina.com.cn/zl/post/detail/t/2015-02-15/pid_8472038.htm 2015年02月15日 09:02 文/丁傲西 近日,高通反垄断案成为业内热议的话题,各种观点可谓层出不穷.由于早期门户网站翻译的问题,大部分国人至今仍不知道高通收取专利费的情况,一些门户网站的分析文章甚至就此得出了4G手机要缴纳8.5%(3G5%+4G3.5%)的错误结论.除此之外,目前的分析也集中在高通降低专利费对中国手机厂商

发改委对高通垄断行为责令整改并罚款61亿元

近日,国家发展改革委对高通公司滥用市场支配地位实施排除.限制竞争的垄断行为依法作出处理,责令高通公司停止相关违法行为,处2013年度我国市场销售额8%的罚款,计60.88亿元. 2013年11月,国家发展改革委根据举报启动了对高通公司的反垄断调查.在调查过程中,国家发展改革委对数十家国内外手机生产企业和基带芯片制造企业进行了深入调查,获取了高通公司实施价格垄断等行为的相关证据,充分听取了高通公司的陈述和申辩意见,并就高通公司相关行为构成我国<反垄断法>禁止的滥用市场支配地位行为进行了研究论证.

高通Quick Charge高速充电原理分析

1 QC 2.0 1.1 高通Quick Charge 2.0 高速充电原理分析 高通的QC2.0高速充电须要手机端和充电器都要支持才行. 当将充电器端通过数据线连到手机上时,充电器默认的是将D+和D-短接的,这样手机端探測充电器类型是DCP(參见本人还有一篇博文<高通平台USB2.0和3.0接口充电器识别原理>).手机以默认的5V电压充电,接着步骤例如以下: 1) 假设手机端使能了高速充电协议.Android用户空间的hvdcp(high voltage dedicated charger

高通camera结构【转】

本文转载自:http://www.cnblogs.com/whw19818/p/5853407.html 摄像头基础介绍 一.摄像头结构和工作原理. 拍摄景物通过镜头,将生成的光学图像投射到传感器上,然后光学图像被转换成电信号,电信号再经过模数转换变为数字信号,数字信号经过DSP加工处理,再被送到电脑中进行处理,最终转换成手机屏幕上能够看到的图像. 数字信号处理芯片DSP(DIGITAL SIGNAL PROCESSING)功能:主要是通过一系列复杂的数学算法运算,对数字图像信号参数进行优化处理

高通 MSM8K GPT异常导致无法开机问题分析

问题分析步骤如下: 一. MSM8916平台gpt概率性问题:使用QPST emmc software download工具下载完软件后,无法开机.如下图: log分析是userdata分区没有成功mount . 二. adb shell ls /dev/block 显示,开机失败的机器,比正常开机的机器少一个分区:mmcblk0p28 ,这个分区就是userdata所在分区! 参考本人的转并补充内容的另一篇文章<add_partition 函数学习> 可知,/dev/block/mmcblk

高通被罚 影响买手机的价格吗?

高通被罚 影响买手机的价格吗? 高通被发改委处罚后,是不是对国产手机厂商专利费收的就少了?那么手机价格会不会更便宜? 今天,高通中国反垄断案终于尘埃落定.高通公司被处罚款9.75亿美元,并对中国市场的智能手机专利授权做出多项调整. 高通对专利收费模式进行调整,于手机厂商而言,直接的影响是降低成本. 高通的专利授权一般分两部分,即厂商获得某项芯片解决方案的一次性授权费(有时还包括高额的一次性“入门费”),以及协议期内每销售一台手机额外缴纳的提成费率. 假设一部价格为2000元的手机,原先手机厂商首

高通LCD的pwm背光驱动

发生异常的现象: msm8953 lcd在快速亮灭的情况下背光概率性休眠不灭:测量高通pwm,发现正常的时候pwm的管脚LCM_BL_PWM为低电平,失败的时候为高电平: 根据原理图: mpp是什么? mpp是基于电源pmic的管脚,也叫做多功能管脚:MPP的全称是Multi Purpose Pin:可以做电源.gpio.ADC.PWM.SINK等功能. 背光的控制方式: LCD控制IC支持动态背光控制功能(CABC)通过解析图像的直方图动态改变输出PWM的占空比从而动态调节LCD的背光,在不改

又一家手机厂要被高通断供!唏嘘

6月13日消息,据外媒报道,LG因与高通在续签芯片授权协议上存在分歧,其最新的5G手机V50 ThinQ上市计划可能会被搁置. LG电子法律顾问JongSang Lee在一份法庭文件中提到,高通公司向LG施压,要求签署一项专利许可协议,以保持对高通芯片的获取权限. 报道指出,LG电子与高通公司达成的协议将于6月30日结束,如果LG不按照高通的条款续签许可协议和芯片组供应协议,那么LG可能会被高通断供.BNK Securities分析师表示,如果LG电子未能与高通续签合同,那么很可能无法生产任何手