*参考文档: 搜索modem qmi qmi-qualcomm
* http://wenku.baidu.com/link?url=WtNOI1ojokVsXT3LiWmCRg6IAyNRm5U_rwq_-Os_C_aDnZBtjtTNMKTANv-RpyP_-A2BRXgOlbQMu5Bcg_yMJZfYCe6WOf_9MkvH2VSppI7
*
/*********************************************
****qmi通信的双方的角色及位置如下
*********************************************
****qmux server qmux client****
**** modem linux*******
**** AMSS linux*******
**********************************************/
nv6873(QMI Port Config List)项可以配置qmi port (QMI Port Config List)如下图:通过QXDM读取
modem 侧的代码:
qmux_state[ ],qmi_ctl_cfg[ ]
ds_qmux.c中会调用qmuxi_set_default_port_configuration函数来设置默认的qmi口
qmux_state.io.port_info.sio_port/default_ep_id/qmi_stream/frame_mode (这四个成员跟nv里的值对应)
RUNTIME Device Mapper(RDM)
qmi_ctl_cfg.cbs.recv = qmi_ctil_recv(),此函数接收client(linux端)传送过来的数据
每个qmi service创建两个信号list:client transations single list 和 command buffer single list,
他们都包含在qmi_common_client_state_type结构体中(.qmi_transaction_type和.qmi_cmd_buf_type结构体)
所有的qmi services都会执行q_init函数来完成下图任务
qmi_transaction_s = q_get( struct q_type );
qmi_transaction_s.cmd_list[]中有许多命令, 这里先将qmi通信理解为cmd集合吧。。
linux侧发送qmi的代码为qmi_client_send_msg_sync((qmi_client_type) clnt,
QMI_TMD_SET_MITIGATION_LEVEL_REQ_V01,
&data_req, sizeof(data_req),
&data_resp, sizeof(data_resp), 0);
每个qmi service都有几个指定的状态 ,用特定的结构体表示,如下图
定义格式如下:
typedef struct { uint16 num_qmi_instances; /*Not used at the moment. May be used in the future*/ qmi_ati_client_state_ptr_type client[ATI_MAX_CLIDS]; } qmi_ati_state_type; SIO接收到数据后:qmuxi_sio_rx_cb()会被调用,它不处理信息,只是将所有的信息转发给不同的命令处理函数*handler,如下 dcc_set_cmd_handler dcc_set_sig_handler等 1 当AMSS QMUX 接收到数据后from SIO,用qmuxi_process_rx_sig为每个instance来查看其qmux_s->io.rx_wm是否有数据需要处理 没有数据的话会在QXDM的log中打印:ds_qmux.c 01757 no pending command on QMUX link 1/2/3 2 qmuxi_process_msg