上篇文章中主要介绍了qmi接口到sim命令传输的过程,相反本文将会介绍从sim卡到qmi的传输过程。
先把上文的软件架构图贴出来:
接下来分析uim到qmi uim的过程。
1.先看串口的中断注册函数
该函数注册了uimIntctrlIsr回调函数,接下来依次调用
uimIntctrlIsr->uim_rx_isr->uimdrv_rx_event_cb->uimdrv_rx_state_machine->uim_rx_isr_proc_procedure_bytes->
uim_rx_isr_process_sw2_byte->uim_command_response_callback
在uim_command_response_callback函数中uim_ptr->card_cmd.resp_buf_ptr即为ue收到sim卡的数据,该指针在上文中讲到指向uim_ptr->command.rsp_buf。接下来会设置信号让uim主task来处理响应数据。
回到uim主task中,参考上篇文档可知调用了uim_handle_cmd_rsp_sig,代码如下
uim_handle_cmd_rsp_sig->uim_process_card_response->uim_command_response->
uim_generic_command_response->uim_generic_command
在uim_generic_command会处理下一条命令。直到状态变为UIM_DONE_ST。
在uim_process_generic_response函数中会根据最初发送到命令id来执行对应函数,然后填充cmmand.rpt_buf,调用rpt_function,在上章中讲到在gsdi发送给uim数据的时候将mmgsdi_uim_report赋值给rpt_function,所以在这里调用了mmgsdi_uim_report回调函数。
在mmgsdi_uim_report函数中调用了mmgsdi_cmd_ext函数,在该函数中通过信号队列方式把命令发送给gsdi task。gadi task收到该信号后,调用mmgsdi_handle_queue_sig函数来处理,mmgsdi_handle_queue_sig函数取出队列数据然后调用mmgsdi_process_response函数,mmgsdi_process_response根据cmd id调用了mmgsdi_process_get_all_pin_status_rsp函数,接着在mmgsdi_process_get_all_pin_status_rsp函数中调用mmgsdi_uicc_rsp_pin_status,
在该函数中调用mmgsdi_util_get_client_request_table_info用来拷贝存放之前qmi发送下来的全局变量mmgsdi_client_req_table_info_ptr。
然后调用函数mmgsdi_cnf_build_and_queue给gsdi发送命令(为了统一接口,所以自己给自己发送)。gsdi收到该命令后进入mmgsdi_handle_queue_sig->mmgsdi_process_cnf,在该函数中调用了cnf_ptr->client_req_cb,该函数在上文中qmi发送过来的处理函数中注册过,
即qmi_sim_internal_mmgsdi_response_callback,然后调用qmi_sim_internal_send_get_all_pin_status_ind->qmi_csi_send_ind。
到此,发送给qmi,整个循环完成。