QcRilHook:
ByteBuffer reqBuffer = createBufferWithNativeByteOrder(request);
reqBuffer 被用来读取或写入request数组中的数据,不用担心字节序,注意request的大小是否满足所需传递的数据大小
addQcRilHookHeader(reqBuffer, requestId , INT_SIZE + Size);
在reqBuffer对象中组织QC RIL头信息,包括OEM标识符("QOEMHOOK")、请求ID(requestId)和请求大小(INT_SIZE + Size)
AsyncResult ar = sendRilOemHookMsg(requestId, request);->sendRilOemHookMsg(requestId, request, DEFAULT_PHONE)
默认使用DEFAULT_PHONE,ar 用于存储最终的返回结果
public int sendOemRilRequestRaw(byte[] request, byte[] response, int sub)
AsyncResult result = (AsyncResult) sendRequest(CMD_INVOKE_OEM_RIL_REQUEST, request, sub);
sub表示子系统ID
private Object sendRequest(int command, Object argument, int sub)
将指定的命令发送到主线程执行,并等待请求完成后返回结果,其中调用 sendToTarget
方法将消息发送到消息处理器
———————————————————————————————————————————
qcril_qmi_nas:
写入到reqBuffer中的数据传到了params_ptr->data,确保数据无误后就可以从中提取,拆分了
extern qmi_client_error_type
qmi_client_send_msg_sync
(
qmi_client_type user_handle,
unsigned int msg_id,
void *req_c_struct,
unsigned int req_c_struct_len,
void *resp_c_struct,
unsigned int resp_c_struct_len,
unsigned int timeout_msecs
);
然后通过此函数发送一个同步的 QMI 消息,并等待响应
qcril_qmi_util_convert_qmi_response_codes_to_ril_result->qcril_qmi_util_convert_qmi_response_codes_to_ril_result_ex
ril_req_res = qcril_qmi_util_convert_qmi_response_codes_to_ril_result( qmi_client_error, &qmi_response.resp );
通过此接口处理QMI响应码,转换为RIL结果
qcril_default_request_resp_params( instance_id, params_ptr->t, params_ptr->event_id, ril_req_res, &resp );
初始化 qcril_request_resp_params_type
结构体,后续将其用作 RIL 请求响应的参数
qcril_send_request_response( &resp );
涉及RIL层的请求处理和响应发送,以及对QMI(Qualcomm Modem Interface)消息的编码和解码操作,在这个接口中如果QMI IDL tunnel 响应,将执行QMI IDL消息的编码和解码,通过qmi_ril_fw_send_request_response_epilog发送响应
———————————————————————————————————————————
可以先调试AP侧:
在保证AP侧代码逻辑没问题后,QXDM log中的错误码为57时,就可以开始写BP侧的代码了
#define QMI_SERVICE_ERR_INVALID_MESSAGE_ID 57
调试QMI:
当错误码为94时,#define QMI_SERVICE_ERR_NOT_SUPPORTED 94
可以检查AP侧和BP侧的message id的位置是否对齐了
错误码:vendor/qcom/proprietary/qmi/inc/qmi.h
vendor/qcom/proprietary/commonsys/qcrilOemHook/src/com/qualcomm/qcrilhook/IQcRilHook.java
vendor/qcom/proprietary/commonsys/qcrilOemHook/src/com/qualcomm/qcrilhook/QcRilHook.java
vendor/qcom/proprietary/qcril-nr/include/modules/nas/qcril_qmi_nas.h
vendor/qcom/proprietary/qcril-nr/modules/nas/src/qcril_qmi_nas.cpp
vendor/qcom/proprietary/qcril-nr/qcril_qmi/oem_socket/qcril_qmi_oem_eventlist.h
vendor/qcom/proprietary/qcril-nr/qcril_qmi/oem_socket/qcril_qmi_oem_events.cc
vendor/qcom/proprietary/qcril-nr/qcril_qmi/oem_socket/qcril_qmi_oem_reqlist.h
vendor/qcom/proprietary/qcril-qmi-services-headers/device_management_service_v01.h
vendor/qcom/proprietary/qcril-qmi-services/device_management_service_v01.c
单编调试:(待尝试)
vendor/qcom/proprietary/commonsys/qcrilOemHook/Android.bp
vendor/qcom/proprietary/qcril-nr/modules/nas/Android.mk
vendor/qcom/proprietary/qcril-nr/qcril_qmi/Android.mk
vendor/qcom/proprietary/qcril-qmi-services/Android.bp
vendor/qcom/proprietary/qcril-qmi-services-headers/Android.bp
source build/envsetup.sh && lunch parrot-userdebug && mmma vendor/qcom/proprietary/commonsys/qcrilOemHook