在phTmlNfc_StartThread
函数中创建了读线程phTmlNfc_TmlThread,
phTmlNfc_i2c_read
被 phTmlNfc_TmlThread
循环调用阻塞读取数据,然后调用:
phTmlNfc_DeferredCall(gpphTmlNfc_Context->dwCallbackThreadId, &tMsg);
把message发送给上一层的线程 ,
具体是:发送message给queue:nxpncihal_ctrl.gDrvCfg.nClientId ,然后通过semaphore 来唤醒读线程。
sem_post +1
sem_wait -1
接受数据的线程:
在phNxpNciHal_MinOpen函数中创建了一个线程: phNxpNciHal_client_thread,
它会无限循环调用phDal4Nfc_msgrcv 从 p_nxpncihal_ctrl->gDrvCfg.nClientId
这个队列接受数据 。
具体到一种消息类型:
NCI_HAL_OPEN_CPLT_MSG :
在 phNxpNciHal_open_complete 中创建了 一个msg.eMsgType 为 NCI_HAL_OPEN_CPLT_MSG 的 msg ,然后通过 phDal4Nfc_msgsnd 发送给上层 。
而 phNxpNciHal_open 调用 phNxpNciHal_open_complete ,也就是在打开设备文件成功之后会发送NCI_HAL_OPEN_CPLT_MSG 出来。
然后在 phNxpNciHal_client_thread 中会将NCI_HAL_OPEN_CPLT_MSG 转为 HAL_NFC_OPEN_CPLT_EVT ,调用 nxpncihal_ctrl.p_nfc_stack_cback 到
nfc_main_post_hal_evt 然后 到 GKI_send_msg(NFC_TASK, NFC_MBOX_ID, p_msg);
到
GKI_send_msg(NFC_TASK, NFC_MBOX_ID, p_msg);
然后会最终调用到NfcService代码里面 。