/******************************************************************************* ** ** Function phDnldNfc_ReadLog ** ** Description Retrieves log data from EEPROM ** ** Parameters pData - response buffer which gets updated with data from EEPROM ** pNotify - notify caller after getting response ** pContext - caller context ** ** Returns NFC status: ** NFCSTATUS_SUCCESS - Read request to NFCC is successful ** NFCSTATUS_FAILED - Read request failed due to internal error ** NFCSTATUS_NOT_ALLOWED - command not allowed ** Other command specific errors - ** *******************************************************************************/ NFCSTATUS phDnldNfc_ReadLog(pphDnldNfc_Buff_t pData, pphDnldNfc_RspCb_t pNotify, void *pContext) { NFCSTATUS wStatus = NFCSTATUS_SUCCESS; if((NULL == pNotify) || (NULL == pData) || (NULL == pContext) ) { NXPLOG_FWDNLD_E("Invalid Input Parameters!!"); wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER); } else { if(phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress) { NXPLOG_FWDNLD_E("Dnld Cmd Request in Progress..Cannot Continue!!"); wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY); } else { if((NULL != pData->pBuff) && (0 != pData->wLen)) { (gpphDnldContext->tCmdId) = PH_DL_CMD_READ; (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTRead; (gpphDnldContext->FrameInp.dwAddr) = PHDNLDNFC_EEPROM_LOG_START_ADDR; (gpphDnldContext->tRspBuffInfo.pBuff) = pData->pBuff; (gpphDnldContext->tRspBuffInfo.wLen) = pData->wLen; (gpphDnldContext->tUserData.pBuff) = NULL; (gpphDnldContext->tUserData.wLen) = 0; (gpphDnldContext->UserCb) = pNotify; (gpphDnldContext->UserCtxt) = pContext; memset(&(gpphDnldContext->tRWInfo),0,sizeof(gpphDnldContext->tRWInfo)); wStatus = phDnldNfc_CmdHandler(gpphDnldContext,phDnldNfc_EventRead); if(NFCSTATUS_PENDING == wStatus) { NXPLOG_FWDNLD_D("Read Request submitted successfully"); } else { NXPLOG_FWDNLD_E("Read Request Failed!!"); } } else { NXPLOG_FWDNLD_E("Invalid Buff Parameters!!"); wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER); } } } return wStatus; }
/******************************************************************************* ** ** Function phDnldNfc_RawReq ** ** Description Sends raw frame request to NFCC. ** It is currently used for sending an NCI RESET cmd after doing a production key update ** ** Parameters pFrameData - input buffer, contains raw frame packet to be sent to NFCC ** pRspData - response buffer received from NFCC ** pNotify - notify caller after getting response ** pContext - caller context ** ** Returns NFC status: ** NFCSTATUS_SUCCESS - GetSessionState request to NFCC is successful ** NFCSTATUS_FAILED - GetSessionState request failed due to internal error ** NFCSTATUS_NOT_ALLOWED - command not allowed ** Other command specific errors - ** *******************************************************************************/ NFCSTATUS phDnldNfc_RawReq(pphDnldNfc_Buff_t pFrameData, pphDnldNfc_Buff_t pRspData, pphDnldNfc_RspCb_t pNotify, void *pContext) { NFCSTATUS wStatus = NFCSTATUS_SUCCESS; if((NULL == pFrameData) || (NULL == pNotify) || (NULL == pRspData) || (NULL == pContext) ) { NXPLOG_FWDNLD_E("Invalid Input Parameters!!"); wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER); } else { if(phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress) { NXPLOG_FWDNLD_E("Raw Cmd Request in Progress..Cannot Continue!!"); wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY); } else { if(((NULL != pFrameData->pBuff) && (0 != pFrameData->wLen)) && ((NULL != pRspData->pBuff) && (0 != pRspData->wLen)) ) { (gpphDnldContext->tRspBuffInfo.pBuff) = pRspData->pBuff; (gpphDnldContext->tRspBuffInfo.wLen) = pRspData->wLen; (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTRaw; (gpphDnldContext->tCmdId) = PH_DL_CMD_NONE; (gpphDnldContext->tUserData.pBuff) = pFrameData->pBuff; (gpphDnldContext->tUserData.wLen) = pFrameData->wLen; (gpphDnldContext->UserCb) = pNotify; (gpphDnldContext->UserCtxt) = pContext; wStatus = phDnldNfc_CmdHandler(gpphDnldContext,phDnldNfc_EventRaw); if(NFCSTATUS_PENDING == wStatus) { NXPLOG_FWDNLD_D("RawFrame Request submitted successfully"); } else { NXPLOG_FWDNLD_E("RawFrame Request Failed!!"); } } else { NXPLOG_FWDNLD_E("Invalid Buff Parameters!!"); wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER); } } } return wStatus; }
/******************************************************************************* ** ** Function phDnldNfc_Reset ** ** Description Performs a soft reset of the download module ** ** Parameters pNotify - notify caller after getting response ** pContext - caller context ** ** Returns NFC status: ** NFCSTATUS_SUCCESS - reset request to NFCC is successful ** NFCSTATUS_FAILED - reset request failed due to internal error ** NFCSTATUS_NOT_ALLOWED - command not allowed ** Other command specific errors - ** *******************************************************************************/ NFCSTATUS phDnldNfc_Reset(pphDnldNfc_RspCb_t pNotify, void *pContext) { NFCSTATUS wStatus = NFCSTATUS_SUCCESS; if((NULL == pNotify) || (NULL == pContext) ) { NXPLOG_FWDNLD_E("Invalid Input Parameters!!"); wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER); } else { if(phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress) { NXPLOG_FWDNLD_E("Dnld Cmd Request in Progress..Cannot Continue!!"); wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY); } else { (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTNone; (gpphDnldContext->tCmdId) = PH_DL_CMD_RESET; (gpphDnldContext->tRspBuffInfo.pBuff) = NULL; (gpphDnldContext->tRspBuffInfo.wLen) = 0; (gpphDnldContext->tUserData.pBuff) = NULL; (gpphDnldContext->tUserData.wLen) = 0; (gpphDnldContext->UserCb) = pNotify; (gpphDnldContext->UserCtxt) = pContext; wStatus = phDnldNfc_CmdHandler(gpphDnldContext,phDnldNfc_EventReset); if(NFCSTATUS_PENDING == wStatus) { NXPLOG_FWDNLD_D("Reset Request submitted successfully"); } else { NXPLOG_FWDNLD_E("Reset Request Failed!!"); } } } return wStatus; }
/******************************************************************************* ** ** Function phDnldNfc_Force ** ** Description Used as an emergency recovery procedure for NFCC due to corrupt ** settings of system platform specific parameters by the host ** ** Parameters pInputs - input buffer which contains clk src & clk freq settings for desired platform ** pNotify - notify caller after getting response ** pContext - caller context ** ** Returns NFC status: ** NFCSTATUS_SUCCESS - Emergency Recovery request is successful ** NFCSTATUS_FAILED - Emergency Recovery failed due to internal error ** NFCSTATUS_NOT_ALLOWED - command not allowed ** Other command specific errors - ** *******************************************************************************/ NFCSTATUS phDnldNfc_Force(pphDnldNfc_Buff_t pInputs, pphDnldNfc_RspCb_t pNotify, void *pContext) { NFCSTATUS wStatus = NFCSTATUS_SUCCESS; uint8_t bClkSrc = 0x00,bClkFreq = 0x00; uint8_t bPldVal[3] = {0x11,0x00,0x00}; /* default values to be used if input not provided */ if((NULL == pNotify) || (NULL == pContext)) { NXPLOG_FWDNLD_E("Invalid Input Parameters!!"); wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER); } else { if(phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress) { NXPLOG_FWDNLD_E("Dnld Cmd Request in Progress..Cannot Continue!!"); wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY); } else { (gpphDnldContext->tCmdId) = PH_DL_CMD_FORCE; (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTForce; (gpphDnldContext->tRspBuffInfo.pBuff) = NULL; (gpphDnldContext->tRspBuffInfo.wLen) = 0; if((0 != (pInputs->wLen)) || (NULL != (pInputs->pBuff))) { if(CLK_SRC_XTAL == (pInputs->pBuff[0])) { bClkSrc = phDnldNfc_ClkSrcXtal; } else if(CLK_SRC_PLL == (pInputs->pBuff[0])) { bClkSrc = phDnldNfc_ClkSrcPLL; if(CLK_FREQ_13MHZ == (pInputs->pBuff[1])) { bClkFreq = phDnldNfc_ClkFreq_13Mhz; } else if(CLK_FREQ_19_2MHZ == (pInputs->pBuff[1])) { bClkFreq = phDnldNfc_ClkFreq_19_2Mhz; } else if(CLK_FREQ_24MHZ == (pInputs->pBuff[1])) { bClkFreq = phDnldNfc_ClkFreq_24Mhz; } else if(CLK_FREQ_26MHZ == (pInputs->pBuff[1])) { bClkFreq = phDnldNfc_ClkFreq_26Mhz; } else if(CLK_FREQ_38_4MHZ == (pInputs->pBuff[1])) { bClkFreq = phDnldNfc_ClkFreq_38_4Mhz; } else if(CLK_FREQ_52MHZ == (pInputs->pBuff[1])) { bClkFreq = phDnldNfc_ClkFreq_52Mhz; } else { NXPLOG_FWDNLD_E("Invalid Clk Frequency !! Using default value of 19.2Mhz.."); bClkFreq = phDnldNfc_ClkFreq_19_2Mhz; } } else if(CLK_SRC_PADDIRECT == (pInputs->pBuff[0])) { bClkSrc = phDnldNfc_ClkSrcPad; } else { NXPLOG_FWDNLD_E("Invalid Clk src !! Using default value of PLL.."); bClkSrc = phDnldNfc_ClkSrcPLL; } bPldVal[0] = 0U; bPldVal[0] = ((bClkSrc << 3U) | bClkFreq); } else { NXPLOG_FWDNLD_E("Clk src inputs not provided!! Using default values.."); } (gpphDnldContext->tUserData.pBuff) = bPldVal; (gpphDnldContext->tUserData.wLen) = sizeof(bPldVal); memset(&(gpphDnldContext->tRWInfo),0,sizeof(gpphDnldContext->tRWInfo)); (gpphDnldContext->UserCb) = pNotify; (gpphDnldContext->UserCtxt) = pContext; wStatus = phDnldNfc_CmdHandler(gpphDnldContext,phDnldNfc_EventForce); if(NFCSTATUS_PENDING == wStatus) { NXPLOG_FWDNLD_D("Force Command Request submitted successfully"); } else { NXPLOG_FWDNLD_E("Force Command Request Failed!!"); } } } return wStatus; }
/******************************************************************************* ** ** Function phDnldNfc_Write ** ** Description Writes requested data of length len to desired EEPROM/FLASH address ** ** Parameters bRecoverSeq - flag to indicate whether recover sequence data needs to be written or not ** pData - data buffer to write into EEPROM/FLASH by user ** pNotify - notify caller after getting response ** pContext - caller context ** ** Returns NFC status: ** NFCSTATUS_SUCCESS - Write request to NFCC is successful ** NFCSTATUS_FAILED - Write request failed due to internal error ** NFCSTATUS_NOT_ALLOWED - command not allowed ** Other command specific errors - ** *******************************************************************************/ NFCSTATUS phDnldNfc_Write(bool_t bRecoverSeq, pphDnldNfc_Buff_t pData, pphDnldNfc_RspCb_t pNotify, void *pContext) { NFCSTATUS wStatus = NFCSTATUS_SUCCESS; uint8_t *pImgPtr = NULL; uint16_t wLen = 0; phDnldNfc_Buff_t tImgBuff; if((NULL == pNotify) || (NULL == pContext)) { NXPLOG_FWDNLD_E("Invalid Input Parameters!!"); wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER); } else { if(phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress) { NXPLOG_FWDNLD_E("Dnld Cmd Request in Progress..Cannot Continue!!"); wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY); } else { if(NULL != pData) { pImgPtr = pData->pBuff; wLen = pData->wLen; } else { if(FALSE == bRecoverSeq) { pImgPtr = (uint8_t *)gpphDnldContext->nxp_nfc_fw; wLen = gpphDnldContext->nxp_nfc_fw_len; } else { if(PH_DL_STATUS_PLL_ERROR == (gpphDnldContext->tLastStatus)) { wStatus = phDnldNfc_LoadRecInfo(); } else if(PH_DL_STATUS_SIGNATURE_ERROR == (gpphDnldContext->tLastStatus)) { wStatus = phDnldNfc_LoadPKInfo(); } else { } if(NFCSTATUS_SUCCESS == wStatus) { pImgPtr = (uint8_t *)gpphDnldContext->nxp_nfc_fwp; wLen = gpphDnldContext->nxp_nfc_fwp_len; } else { NXPLOG_FWDNLD_E("Platform Recovery Image extraction Failed!!"); pImgPtr = NULL; wLen = 0; } } } if((NULL != pImgPtr) && (0 != wLen)) { tImgBuff.pBuff = pImgPtr; tImgBuff.wLen = wLen; (gpphDnldContext->tCmdId) = PH_DL_CMD_WRITE; (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTWrite; (gpphDnldContext->tRspBuffInfo.pBuff) = NULL; (gpphDnldContext->tRspBuffInfo.wLen) = 0; (gpphDnldContext->tUserData.pBuff) = pImgPtr; (gpphDnldContext->tUserData.wLen) = wLen; (gpphDnldContext->bResendLastFrame) = FALSE; memset(&(gpphDnldContext->tRWInfo),0,sizeof(gpphDnldContext->tRWInfo)); (gpphDnldContext->tRWInfo.bFirstWrReq) = TRUE; (gpphDnldContext->UserCb) = pNotify; (gpphDnldContext->UserCtxt) = pContext; wStatus = phDnldNfc_CmdHandler(gpphDnldContext,phDnldNfc_EventWrite); if(NFCSTATUS_PENDING == wStatus) { NXPLOG_FWDNLD_D("Write Request submitted successfully"); } else { NXPLOG_FWDNLD_E("Write Request Failed!!"); } } else { NXPLOG_FWDNLD_E("Download Image Primitives extraction failed!!"); wStatus = NFCSTATUS_FAILED; } } } return wStatus; }
/******************************************************************************* ** ** Function phDnldNfc_CheckIntegrity ** ** Description Inspects the integrity of EEPROM and FLASH contents of the NFCC, ** provides CRC for each section ** NOTE: The user data section CRC is valid only after fresh download ** ** Parameters bChipVer - current ChipVersion for including additional parameters in request payload ** pCRCData - response buffer which gets updated with respective section CRC status ** and CRC bytes from NFCC ** pNotify - notify caller after getting response ** pContext - caller context ** ** Returns NFC status: ** NFCSTATUS_SUCCESS - CheckIntegrity request is successful ** NFCSTATUS_FAILED - CheckIntegrity request failed due to internal error ** NFCSTATUS_NOT_ALLOWED - command not allowed ** Other command specific errors - ** *******************************************************************************/ NFCSTATUS phDnldNfc_CheckIntegrity(uint8_t bChipVer, pphDnldNfc_Buff_t pCRCData, pphDnldNfc_RspCb_t pNotify, void *pContext) { NFCSTATUS wStatus = NFCSTATUS_SUCCESS; if((NULL == pNotify) || (NULL == pContext) ) { NXPLOG_FWDNLD_E("Invalid Input Parameters!!"); wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER); } else { if(phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress) { NXPLOG_FWDNLD_E("Dnld Cmd Request in Progress..Cannot Continue!!"); wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY); } else { if((PHDNLDNFC_HWVER_MRA2_1 == bChipVer) || (PHDNLDNFC_HWVER_MRA2_2 == bChipVer) || (PHDNLDNFC_HWVER_PN548AD_MRA1_0 == bChipVer)) { (gpphDnldContext->FrameInp.Type) = phDnldNfc_ChkIntg; } else { (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTNone; } if((NULL != pCRCData->pBuff) && (0 != pCRCData->wLen)) { (gpphDnldContext->tRspBuffInfo.pBuff) = pCRCData->pBuff; (gpphDnldContext->tRspBuffInfo.wLen) = pCRCData->wLen; (gpphDnldContext->tCmdId) = PH_DL_CMD_CHECKINTEGRITY; (gpphDnldContext->tUserData.pBuff) = NULL; (gpphDnldContext->tUserData.wLen) = 0; (gpphDnldContext->UserCb) = pNotify; (gpphDnldContext->UserCtxt) = pContext; wStatus = phDnldNfc_CmdHandler(gpphDnldContext,phDnldNfc_EventIntegChk); if(NFCSTATUS_PENDING == wStatus) { NXPLOG_FWDNLD_D("CheckIntegrity Request submitted successfully"); } else { NXPLOG_FWDNLD_E("CheckIntegrity Request Failed!!"); } } else { NXPLOG_FWDNLD_E("Invalid Buff Parameters!!"); wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER); } } } return wStatus; }