/******************************************************************************
|
@file QCQMI.h
|
|
DESCRIPTION
|
This module contains QMI module.
|
|
INITIALIZATION AND SEQUENCING REQUIREMENTS
|
None.
|
|
---------------------------------------------------------------------------
|
Copyright (c) 2016 - 2023 Quectel Wireless Solution, Co., Ltd. All Rights Reserved.
|
Quectel Wireless Solution Proprietary and Confidential.
|
---------------------------------------------------------------------------
|
******************************************************************************/
|
|
|
#ifndef USBQMI_H
|
#define USBQMI_H
|
|
typedef uint8_t uint8;
|
typedef int8_t int8;
|
typedef uint16_t uint16;
|
typedef int16_t int16;
|
typedef uint32_t uint32;
|
typedef uint64_t uint64;
|
|
typedef signed char CHAR;
|
typedef unsigned char UCHAR;
|
typedef short SHORT;
|
typedef unsigned short USHORT;
|
typedef int INT;
|
typedef unsigned int UINT;
|
typedef long LONG;
|
typedef unsigned int ULONG;
|
typedef unsigned long long ULONG64;
|
typedef signed char *PCHAR;
|
typedef unsigned char *PUCHAR;
|
typedef int *PINT;
|
typedef int BOOL;
|
|
#define TRUE (1 == 1)
|
#define FALSE (1 != 1)
|
|
#define QMICTL_SUPPORTED_MAJOR_VERSION 1
|
#define QMICTL_SUPPORTED_MINOR_VERSION 0
|
|
#pragma pack(push, 1)
|
|
// ========= USB Control Message ==========
|
|
#define USB_CTL_MSG_TYPE_QMI 0x01
|
|
// USB Control Message
|
typedef struct _QCUSB_CTL_MSG_HDR
|
{
|
UCHAR IFType;
|
} __attribute__ ((packed)) QCUSB_CTL_MSG_HDR, *PQCUSB_CTL_MSG_HDR;
|
|
#define QCUSB_CTL_MSG_HDR_SIZE sizeof(QCUSB_CTL_MSG_HDR)
|
|
typedef struct _QCUSB_CTL_MSG
|
{
|
UCHAR IFType;
|
UCHAR Message;
|
} __attribute__ ((packed)) QCUSB_CTL_MSG, *PQCUSB_CTL_MSG;
|
|
#define QCTLV_TYPE_REQUIRED_PARAMETER 0x01
|
#define QCTLV_TYPE_RESULT_CODE 0x02
|
|
// ================= QMI ==================
|
|
// Define QMI Type
|
typedef enum _QMI_SERVICE_TYPE
|
{
|
QMUX_TYPE_CTL = 0x00,
|
QMUX_TYPE_WDS = 0x01,
|
QMUX_TYPE_DMS = 0x02,
|
QMUX_TYPE_NAS = 0x03,
|
QMUX_TYPE_QOS = 0x04,
|
QMUX_TYPE_WMS = 0x05,
|
QMUX_TYPE_PDS = 0x06,
|
QMUX_TYPE_UIM = 0x0B,
|
QMUX_TYPE_WDS_IPV6 = 0x11,
|
QMUX_TYPE_WDS_ADMIN = 0x1A,
|
QMUX_TYPE_COEX = 0x22,
|
QMUX_TYPE_MAX = 0xFF,
|
QMUX_TYPE_ALL = 0xFF
|
} QMI_SERVICE_TYPE;
|
|
typedef enum _QMI_RESULT_CODE_TYPE
|
{
|
QMI_RESULT_SUCCESS = 0x0000,
|
QMI_RESULT_FAILURE = 0x0001
|
} QMI_RESULT_CODE_TYPE;
|
|
typedef enum _QMI_ERROR_CODE_TYPE
|
{
|
QMI_ERR_NONE = 0x0000
|
,QMI_ERR_MALFORMED_MSG = 0x0001
|
,QMI_ERR_NO_MEMORY = 0x0002
|
,QMI_ERR_INTERNAL = 0x0003
|
,QMI_ERR_ABORTED = 0x0004
|
,QMI_ERR_CLIENT_IDS_EXHAUSTED = 0x0005
|
,QMI_ERR_UNABORTABLE_TRANSACTION = 0x0006
|
,QMI_ERR_INVALID_CLIENT_ID = 0x0007
|
,QMI_ERR_NO_THRESHOLDS = 0x0008
|
,QMI_ERR_INVALID_HANDLE = 0x0009
|
,QMI_ERR_INVALID_PROFILE = 0x000A
|
,QMI_ERR_INVALID_PINID = 0x000B
|
,QMI_ERR_INCORRECT_PIN = 0x000C
|
,QMI_ERR_NO_NETWORK_FOUND = 0x000D
|
,QMI_ERR_CALL_FAILED = 0x000E
|
,QMI_ERR_OUT_OF_CALL = 0x000F
|
,QMI_ERR_NOT_PROVISIONED = 0x0010
|
,QMI_ERR_MISSING_ARG = 0x0011
|
,QMI_ERR_ARG_TOO_LONG = 0x0013
|
,QMI_ERR_INVALID_TX_ID = 0x0016
|
,QMI_ERR_DEVICE_IN_USE = 0x0017
|
,QMI_ERR_OP_NETWORK_UNSUPPORTED = 0x0018
|
,QMI_ERR_OP_DEVICE_UNSUPPORTED = 0x0019
|
,QMI_ERR_NO_EFFECT = 0x001A
|
,QMI_ERR_NO_FREE_PROFILE = 0x001B
|
,QMI_ERR_INVALID_PDP_TYPE = 0x001C
|
,QMI_ERR_INVALID_TECH_PREF = 0x001D
|
,QMI_ERR_INVALID_PROFILE_TYPE = 0x001E
|
,QMI_ERR_INVALID_SERVICE_TYPE = 0x001F
|
,QMI_ERR_INVALID_REGISTER_ACTION = 0x0020
|
,QMI_ERR_INVALID_PS_ATTACH_ACTION = 0x0021
|
,QMI_ERR_AUTHENTICATION_FAILED = 0x0022
|
,QMI_ERR_PIN_BLOCKED = 0x0023
|
,QMI_ERR_PIN_PERM_BLOCKED = 0x0024
|
,QMI_ERR_SIM_NOT_INITIALIZED = 0x0025
|
,QMI_ERR_MAX_QOS_REQUESTS_IN_USE = 0x0026
|
,QMI_ERR_INCORRECT_FLOW_FILTER = 0x0027
|
,QMI_ERR_NETWORK_QOS_UNAWARE = 0x0028
|
,QMI_ERR_INVALID_QOS_ID = 0x0029
|
,QMI_ERR_INVALID_ID = 0x0029
|
,QMI_ERR_REQUESTED_NUM_UNSUPPORTED = 0x002A
|
,QMI_ERR_INTERFACE_NOT_FOUND = 0x002B
|
,QMI_ERR_FLOW_SUSPENDED = 0x002C
|
,QMI_ERR_INVALID_DATA_FORMAT = 0x002D
|
,QMI_ERR_GENERAL = 0x002E
|
,QMI_ERR_UNKNOWN = 0x002F
|
,QMI_ERR_INVALID_ARG = 0x0030
|
,QMI_ERR_INVALID_INDEX = 0x0031
|
,QMI_ERR_NO_ENTRY = 0x0032
|
,QMI_ERR_DEVICE_STORAGE_FULL = 0x0033
|
,QMI_ERR_DEVICE_NOT_READY = 0x0034
|
,QMI_ERR_NETWORK_NOT_READY = 0x0035
|
,QMI_ERR_CAUSE_CODE = 0x0036
|
,QMI_ERR_MESSAGE_NOT_SENT = 0x0037
|
,QMI_ERR_MESSAGE_DELIVERY_FAILURE = 0x0038
|
,QMI_ERR_INVALID_MESSAGE_ID = 0x0039
|
,QMI_ERR_ENCODING = 0x003A
|
,QMI_ERR_AUTHENTICATION_LOCK = 0x003B
|
,QMI_ERR_INVALID_TRANSITION = 0x003C
|
,QMI_ERR_NOT_A_MCAST_IFACE = 0x003D
|
,QMI_ERR_MAX_MCAST_REQUESTS_IN_USE = 0x003E
|
,QMI_ERR_INVALID_MCAST_HANDLE = 0x003F
|
,QMI_ERR_INVALID_IP_FAMILY_PREF = 0x0040
|
,QMI_ERR_SESSION_INACTIVE = 0x0041
|
,QMI_ERR_SESSION_INVALID = 0x0042
|
,QMI_ERR_SESSION_OWNERSHIP = 0x0043
|
,QMI_ERR_INSUFFICIENT_RESOURCES = 0x0044
|
,QMI_ERR_DISABLED = 0x0045
|
,QMI_ERR_INVALID_OPERATION = 0x0046
|
,QMI_ERR_INVALID_QMI_CMD = 0x0047
|
,QMI_ERR_TPDU_TYPE = 0x0048
|
,QMI_ERR_SMSC_ADDR = 0x0049
|
,QMI_ERR_INFO_UNAVAILABLE = 0x004A
|
,QMI_ERR_SEGMENT_TOO_LONG = 0x004B
|
,QMI_ERR_SEGMENT_ORDER = 0x004C
|
,QMI_ERR_BUNDLING_NOT_SUPPORTED = 0x004D
|
,QMI_ERR_OP_PARTIAL_FAILURE = 0x004E
|
,QMI_ERR_POLICY_MISMATCH = 0x004F
|
,QMI_ERR_SIM_FILE_NOT_FOUND = 0x0050
|
,QMI_ERR_EXTENDED_INTERNAL = 0x0051
|
,QMI_ERR_ACCESS_DENIED = 0x0052
|
,QMI_ERR_HARDWARE_RESTRICTED = 0x0053
|
,QMI_ERR_ACK_NOT_SENT = 0x0054
|
,QMI_ERR_INJECT_TIMEOUT = 0x0055
|
,QMI_ERR_INCOMPATIBLE_STATE = 0x005A
|
,QMI_ERR_FDN_RESTRICT = 0x005B
|
,QMI_ERR_SUPS_FAILURE_CAUSE = 0x005C
|
,QMI_ERR_NO_RADIO = 0x005D
|
,QMI_ERR_NOT_SUPPORTED = 0x005E
|
,QMI_ERR_NO_SUBSCRIPTION = 0x005F
|
,QMI_ERR_CARD_CALL_CONTROL_FAILED = 0x0060
|
,QMI_ERR_NETWORK_ABORTED = 0x0061
|
,QMI_ERR_MSG_BLOCKED = 0x0062
|
,QMI_ERR_INVALID_SESSION_TYPE = 0x0064
|
,QMI_ERR_INVALID_PB_TYPE = 0x0065
|
,QMI_ERR_NO_SIM = 0x0066
|
,QMI_ERR_PB_NOT_READY = 0x0067
|
,QMI_ERR_PIN_RESTRICTION = 0x0068
|
,QMI_ERR_PIN2_RESTRICTION = 0x0069
|
,QMI_ERR_PUK_RESTRICTION = 0x006A
|
,QMI_ERR_PUK2_RESTRICTION = 0x006B
|
,QMI_ERR_PB_ACCESS_RESTRICTED = 0x006C
|
,QMI_ERR_PB_DELETE_IN_PROG = 0x006D
|
,QMI_ERR_PB_TEXT_TOO_LONG = 0x006E
|
,QMI_ERR_PB_NUMBER_TOO_LONG = 0x006F
|
,QMI_ERR_PB_HIDDEN_KEY_RESTRICTION = 0x0070
|
} QMI_ERROR_CODE_TYPE;
|
|
#define QCQMI_CTL_FLAG_SERVICE 0x80
|
#define QCQMI_CTL_FLAG_CTL_POINT 0x00
|
|
typedef struct _QCQMI_HDR
|
{
|
UCHAR IFType;
|
USHORT Length;
|
UCHAR CtlFlags; // reserved
|
UCHAR QMIType;
|
UCHAR ClientId;
|
} __attribute__ ((packed)) QCQMI_HDR, *PQCQMI_HDR;
|
|
#define QCQMI_HDR_SIZE (sizeof(QCQMI_HDR)-1)
|
|
typedef struct _QCQMI
|
{
|
UCHAR IFType;
|
USHORT Length;
|
UCHAR CtlFlags; // reserved
|
UCHAR QMIType;
|
UCHAR ClientId;
|
UCHAR SDU;
|
} __attribute__ ((packed)) QCQMI, *PQCQMI;
|
|
typedef struct _QMI_SERVICE_VERSION
|
{
|
USHORT Major;
|
USHORT Minor;
|
USHORT AddendumMajor;
|
USHORT AddendumMinor;
|
} __attribute__ ((packed)) QMI_SERVICE_VERSION, *PQMI_SERVICE_VERSION;
|
|
// ================= QMUX ==================
|
|
#define QMUX_MSG_OVERHEAD_BYTES 4 // Type(USHORT) Length(USHORT) -- header
|
|
#define QMUX_BROADCAST_CID 0xFF
|
|
typedef struct _QCQMUX_HDR
|
{
|
UCHAR CtlFlags; // 0: single QMUX Msg; 1:
|
USHORT TransactionId;
|
} __attribute__ ((packed)) QCQMUX_HDR, *PQCQMUX_HDR;
|
|
typedef struct _QCQMUX
|
{
|
UCHAR CtlFlags; // 0: single QMUX Msg; 1:
|
USHORT TransactionId;
|
UCHAR Message; // Type(2), Length(2), Value
|
} __attribute__ ((packed)) QCQMUX, *PQCQMUX;
|
|
#define QCQMUX_HDR_SIZE sizeof(QCQMUX_HDR)
|
|
typedef struct _QCQMUX_MSG_HDR
|
{
|
USHORT Type;
|
USHORT Length;
|
} __attribute__ ((packed)) QCQMUX_MSG_HDR, *PQCQMUX_MSG_HDR;
|
|
#define QCQMUX_MSG_HDR_SIZE sizeof(QCQMUX_MSG_HDR)
|
|
typedef struct _QCQMUX_MSG_HDR_RESP
|
{
|
USHORT Type;
|
USHORT Length;
|
UCHAR TLVType; // 0x02 - result code
|
USHORT TLVLength; // 4
|
USHORT QMUXResult; // QMI_RESULT_SUCCESS
|
// QMI_RESULT_FAILURE
|
USHORT QMUXError; // QMI_ERR_INVALID_ARG
|
// QMI_ERR_NO_MEMORY
|
// QMI_ERR_INTERNAL
|
// QMI_ERR_FAULT
|
} __attribute__ ((packed)) QCQMUX_MSG_HDR_RESP, *PQCQMUX_MSG_HDR_RESP;
|
|
typedef struct _QCQMUX_TLV
|
{
|
UCHAR Type;
|
USHORT Length;
|
UCHAR Value;
|
} __attribute__ ((packed)) QCQMUX_TLV, *PQCQMUX_TLV;
|
|
typedef struct _QMI_TLV_HDR
|
{
|
UCHAR TLVType;
|
USHORT TLVLength;
|
} __attribute__ ((packed)) QMI_TLV_HDR, *PQMI_TLV_HDR;
|
|
typedef struct _QMI_TLV
|
{
|
UCHAR TLVType;
|
USHORT TLVLength;
|
union {
|
int8_t s8;
|
uint8_t u8;
|
int16_t s16;
|
uint16_t u16;
|
int32_t s32;
|
uint32_t u32;
|
uint64_t u64;
|
};
|
} __attribute__ ((packed)) QMI_TLV, *PQMI_TLV;
|
|
// QMUX Message Definitions -- QMI SDU
|
#define QMUX_CTL_FLAG_SINGLE_MSG 0x00
|
#define QMUX_CTL_FLAG_COMPOUND_MSG 0x01
|
#define QMUX_CTL_FLAG_TYPE_CMD 0x00
|
#define QMUX_CTL_FLAG_TYPE_RSP 0x02
|
#define QMUX_CTL_FLAG_TYPE_IND 0x04
|
#define QMUX_CTL_FLAG_MASK_COMPOUND 0x01
|
#define QMUX_CTL_FLAG_MASK_TYPE 0x06 // 00-cmd, 01-rsp, 10-ind
|
|
#pragma pack(pop)
|
|
#endif // USBQMI_H
|