高通QMI IDL格式介绍,方便增加QMI message

主要方便单个的增加qmi 消息。


[背景]
由于idl文件和自动生成工具不开放给客户,客户如果想要扩展qmi结构或者新增QMI
消息需要手动按照IDL的格式修改qmi消息对应的<api>.c和<api>.h 文件。这篇KBA
主要介绍一些常见的QMI 结构与<api>.c中的宏定义的对应关系,客户可以参照现有代码学习,
自行添加。


[数据结构描述信息格式说明]
#define QMI_IDL_GENERIC_1_BYTE 0 1个字节,例如uint8
#define QMI_IDL_GENERIC_2_BYTE 1 2个字节,例如uint16
#define QMI_IDL_GENERIC_4_BYTE 2 4个字节
#define QMI_IDL_GENERIC_8_BYTE 3 8个字节
#define QMI_IDL_1_BYTE_ENUM 4 1个字节Enum
#define QMI_IDL_2_BYTE_ENUM 5 2个字节Enum
#define QMI_IDL_STRING 6 字符串
#define QMI_IDL_AGGREGATE 7 数据结构
QMI_IDL_FLAGS_OFFSET_IS_16
当数据结构比较大时offset可能超过256,此时需要用2个字节表示offset,需要添加标志
QMI_IDL_FLAGS_OFFSET_IS_16
#define QMI_IDL_FLAGS_OFFSET_IS_16 0x80 定义了该标志后必须使用OFFSET16计算偏移
----------------------------------------------------------------------------------------------------------------------------------
例:
QMI_IDL_FLAGS_OFFSET_IS_16 | QMI_IDL_1_BYTE_ENUM,
QMI_IDL_OFFSET16ARRAY(voice_dial_call_resp_msg_v02, cc_result_type),
----------------------------------------------------------------------------------------------------------------------------------
QMI_IDL_FLAGS_IS_ARRAY, QMI_IDL_FLAGS_IS_VARIABLE_LEN
固定长度数组,字节3表示数组项数
可变长度数据,字节3表示数组最大项数,字节4表示数组实际项数的count字段与其描述项之间的
offset,并且需要添加标志QMI_IDL_FLAGS_IS_VARIABLE_LEN,可变长度数组都有一个名称类似
uint32 xxx_len的变量表示实际长度
----------------------------------------------------------------------------------------------------------------------------------
例:
固定长度数组
typedef struct {
char old_password[4];
---->
static const uint8_t voice_call_barring_password_info_type_data_v02[] = {
QMI_IDL_FLAGS_IS_ARRAY | QMI_IDL_GENERIC_1_BYTE,
QMI_IDL_OFFSET8(voice_call_barring_password_info_type_v02, old_password),
4,
可变长度数组
typedef struct {
// 号码实际长度
uint32_t number_len; /**< Must be set to # of elements in number */
char number[QMI_VOICE_NUMBER_MAX_V02];
--->
QMI_IDL_FLAGS_IS_ARRAY | QMI_IDL_FLAGS_IS_VARIABLE_LEN | QMI_IDL_GENERIC_1_
BYTE,
QMI_IDL_OFFSET8(voice_ect_number_type_v02, number),
// 数组最大长度
QMI_VOICE_NUMBER_MAX_V02,
// 表示数组实际长度的变量number_len与number变量之间的内存偏移量
QMI_IDL_OFFSET8(voice_ect_number_type_v02, number) - QMI_IDL_OFFSET8(
voice_ect_number_type_v02, number_len),
----------------------------------------------------------------------------------------------------------------------------------
QMI_IDL_FLAGS_SZ_IS_16
数组最大项数如果超过256时,需要2个字节表示最大项数,此时需要定义QMI_IDL_FLAGS_SZ_IS_
16
#define QMI_IDL_FLAGS_SZ_IS_16 0x20
QMI_IDL_AGGREGATE
如果被描述的数据结构中Field类型为数据结构:FLAG中需包含QMI_IDL_AGGREGATE,此时 字节
3表示该数据结构在Type Table中的Index,字节4表示Type Table Id, Type Table Id 0 表示当前
service的type table,1 表示common_v01.c中的通用type table
----------------------------------------------------------------------------------------------------------------------------------
例子:
voice_get_call_forwarding_info_exten_type_v02
typedef struct {
voice_num_info_type_v02 cfw_num_info;
} voice_get_call_forwarding_info_exten_type_v02; /* Type */
---->
static const uint8_t voice_get_call_forwarding_info_exten_type_data_v02[] = {
// 数据结构
QMI_IDL_AGGREGATE,
QMI_IDL_OFFSET8(voice_get_call_forwarding_info_exten_type_v02, cfw_num_info), // 见
voice_type_table_v02,voice_type_table_v02[8]即为voice_num_info_type_v02
8, // 在Type Table中的Index
0, // Type Table Index
----------------------------------------------------------------------------------------------------------------------------------
QMI_IDL_FLAG_END_VALUE
#define QMI_IDL_FLAG_END_VALUE 0x20
数据结构结束标志,Type Data必须以该标志结束,同样参考voice_num_info_type_data_v02
#define QMI_IDL_TLV_FLAGS_LAST_TLV 0x80
最后一个TLV字段,QMI_IDL_TLV_FLAGS_LAST_TLV之后的添加的任何TLV 结构都不再进行编码
#define QMI_IDL_TLV_FLAGS_OPTIONAL 0x40
Flag标志包含QMI_IDL_TLV_FLAGS_OPTIONAL 表示Optional字段,编码时先从内存取出valid字段
,如果valid为TRUE,则进行编码,否则不编码。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章