高通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,則進行編碼,否則不編碼。

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