Home | History | Annotate | Download | only in dnld
      1 /*
      2  * Copyright (C) 2010-2014 NXP Semiconductors
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 
     18 /*
     19  * Download Component
     20  * Download Interface routines implementation
     21  */
     22 
     23 #include <phDnldNfc_Internal.h>
     24 #include <phTmlNfc.h>
     25 #include <phNxpLog.h>
     26 #include <dlfcn.h>
     27 #include <phNxpConfig.h>
     28 
     29 static void *pFwLibHandle; /* Global firmware lib handle used in this file only */
     30 uint16_t wMwVer = 0; /* Middleware version no */
     31 uint16_t wFwVer = 0; /* Firmware version no */
     32 #if(NFC_NXP_CHIP_TYPE != PN547C2)
     33 uint8_t gRecFWDwnld; // flag set to true to indicate dummy FW download
     34 #endif
     35 static pphDnldNfc_DlContext_t gpphDnldContext = NULL; /* Download contex */
     36 static pphDnldNfc_RspCb_t      UserCb; /* Upper layer call back function */
     37 static void*                   UserCtxt; /* Pointer to upper layer context */
     38 #undef EEPROM_Read_Mem_IMP
     39 
     40 /* Function prototype declaration */
     41 static void phDnldNfc_ReadComplete(void* pContext, NFCSTATUS status, void* pInfo);
     42 
     43 /*******************************************************************************
     44 **
     45 ** Function         phDnldNfc_Reset
     46 **
     47 ** Description      Performs a soft reset of the download module
     48 **
     49 ** Parameters       pNotify  - notify caller after getting response
     50 **                  pContext - caller context
     51 **
     52 ** Returns          NFC status:
     53 **                  NFCSTATUS_SUCCESS     - reset request to NFCC is successful
     54 **                  NFCSTATUS_FAILED      - reset request failed due to internal error
     55 **                  NFCSTATUS_NOT_ALLOWED - command not allowed
     56 **                  Other command specific errors                -
     57 **
     58 *******************************************************************************/
     59 NFCSTATUS phDnldNfc_Reset(pphDnldNfc_RspCb_t pNotify, void *pContext)
     60 {
     61     NFCSTATUS   wStatus = NFCSTATUS_SUCCESS;
     62 
     63     if((NULL == pNotify) ||
     64        (NULL == pContext)
     65        )
     66     {
     67         NXPLOG_FWDNLD_E("Invalid Input Parameters!!");
     68         wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
     69     }
     70     else
     71     {
     72         if(phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress)
     73         {
     74             NXPLOG_FWDNLD_E("Dnld Cmd Request in Progress..Cannot Continue!!");
     75             wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY);
     76         }
     77         else
     78         {
     79             (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTNone;
     80             (gpphDnldContext->tCmdId) = PH_DL_CMD_RESET;
     81             (gpphDnldContext->tRspBuffInfo.pBuff) = NULL;
     82             (gpphDnldContext->tRspBuffInfo.wLen) = 0;
     83             (gpphDnldContext->tUserData.pBuff) = NULL;
     84             (gpphDnldContext->tUserData.wLen) = 0;
     85             (gpphDnldContext->UserCb) = pNotify;
     86             (gpphDnldContext->UserCtxt) = pContext;
     87 
     88             wStatus = phDnldNfc_CmdHandler(gpphDnldContext,phDnldNfc_EventReset);
     89 
     90             if(NFCSTATUS_PENDING == wStatus)
     91             {
     92                 NXPLOG_FWDNLD_D("Reset Request submitted successfully");
     93             }
     94             else
     95             {
     96                 NXPLOG_FWDNLD_E("Reset Request Failed!!");
     97             }
     98         }
     99     }
    100 
    101     return wStatus;
    102 }
    103 
    104 /*******************************************************************************
    105 **
    106 ** Function         phDnldNfc_GetVersion
    107 **
    108 ** Description      Retrieves Hardware version, ROM Code version, Protected Data version,
    109 **                  Trim data version, User data version, and Firmware version information
    110 **
    111 ** Parameters       pVersionInfo - response buffer which gets updated with complete version info from NFCC
    112 **                  pNotify      - notify caller after getting response
    113 **                  pContext     - caller context
    114 **
    115 ** Returns          NFC status:
    116 **                  NFCSTATUS_SUCCESS     - GetVersion request to NFCC is successful
    117 **                  NFCSTATUS_FAILED      - GetVersion request failed due to internal error
    118 **                  NFCSTATUS_NOT_ALLOWED - command not allowed
    119 **                  Other command specific errors                -
    120 **
    121 *******************************************************************************/
    122 NFCSTATUS phDnldNfc_GetVersion(pphDnldNfc_Buff_t pVersionInfo, pphDnldNfc_RspCb_t pNotify, void *pContext)
    123 {
    124     NFCSTATUS   wStatus = NFCSTATUS_SUCCESS;
    125 
    126     if((NULL == pVersionInfo) || (NULL == pNotify) ||
    127        (NULL == pContext)
    128        )
    129     {
    130         NXPLOG_FWDNLD_E("Invalid Input Parameters!!");
    131         wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
    132     }
    133     else
    134     {
    135         if(phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress)
    136         {
    137             NXPLOG_FWDNLD_E("Dnld Cmd Request in Progress..Cannot Continue!!");
    138             wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY);
    139         }
    140         else
    141         {
    142             if((NULL != pVersionInfo->pBuff) && (0 != pVersionInfo->wLen))
    143             {
    144                 (gpphDnldContext->tRspBuffInfo.pBuff) = pVersionInfo->pBuff;
    145                 (gpphDnldContext->tRspBuffInfo.wLen) = pVersionInfo->wLen;
    146                 (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTNone;
    147                 (gpphDnldContext->tCmdId) = PH_DL_CMD_GETVERSION;
    148                 (gpphDnldContext->tUserData.pBuff) = NULL;
    149                 (gpphDnldContext->tUserData.wLen) = 0;
    150                 (gpphDnldContext->UserCb) = pNotify;
    151                 (gpphDnldContext->UserCtxt) = pContext;
    152 
    153                 wStatus = phDnldNfc_CmdHandler(gpphDnldContext,phDnldNfc_EventGetVer);
    154 
    155                 if(NFCSTATUS_PENDING == wStatus)
    156                 {
    157                     NXPLOG_FWDNLD_D("GetVersion Request submitted successfully");
    158                 }
    159                 else
    160                 {
    161                     NXPLOG_FWDNLD_E("GetVersion Request Failed!!");
    162                 }
    163             }
    164             else
    165             {
    166                 NXPLOG_FWDNLD_E("Invalid Buff Parameters!!");
    167                 wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
    168             }
    169         }
    170     }
    171 
    172     return wStatus;
    173 }
    174 
    175 /*******************************************************************************
    176 **
    177 ** Function         phDnldNfc_GetSessionState
    178 **
    179 ** Description      Retrieves the current session state of NFCC
    180 **
    181 ** Parameters       pSession - response buffer which gets updated with complete version info from NFCC
    182 **                  pNotify  - notify caller after getting response
    183 **                  pContext - caller context
    184 **
    185 ** Returns          NFC status:
    186 **                  NFCSTATUS_SUCCESS     - GetSessionState request to NFCC is successful
    187 **                  NFCSTATUS_FAILED      - GetSessionState request failed due to internal error
    188 **                  NFCSTATUS_NOT_ALLOWED - command not allowed
    189 **                  Other command specific errors                -
    190 **
    191 *******************************************************************************/
    192 NFCSTATUS phDnldNfc_GetSessionState(pphDnldNfc_Buff_t pSession, pphDnldNfc_RspCb_t pNotify, void *pContext)
    193 {
    194     NFCSTATUS   wStatus = NFCSTATUS_SUCCESS;
    195 
    196     if((NULL == pSession) || (NULL == pNotify) ||
    197        (NULL == pContext)
    198        )
    199     {
    200         NXPLOG_FWDNLD_E("Invalid Input Parameters!!");
    201         wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
    202     }
    203     else
    204     {
    205         if(phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress)
    206         {
    207             NXPLOG_FWDNLD_E("Dnld Cmd Request in Progress..Cannot Continue!!");
    208             wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY);
    209         }
    210         else
    211         {
    212             if((NULL != pSession->pBuff) && (0 != pSession->wLen))
    213             {
    214                 (gpphDnldContext->tRspBuffInfo.pBuff) = pSession->pBuff;
    215                 (gpphDnldContext->tRspBuffInfo.wLen) = pSession->wLen;
    216                 (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTNone;
    217                 (gpphDnldContext->tCmdId) = PH_DL_CMD_GETSESSIONSTATE;
    218                 (gpphDnldContext->tUserData.pBuff) = NULL;
    219                 (gpphDnldContext->tUserData.wLen) = 0;
    220                 (gpphDnldContext->UserCb) = pNotify;
    221                 (gpphDnldContext->UserCtxt) = pContext;
    222 
    223                 wStatus = phDnldNfc_CmdHandler(gpphDnldContext,phDnldNfc_EventGetSesnSt);
    224 
    225                 if(NFCSTATUS_PENDING == wStatus)
    226                 {
    227                     NXPLOG_FWDNLD_D("GetSessionState Request submitted successfully");
    228                 }
    229                 else
    230                 {
    231                     NXPLOG_FWDNLD_E("GetSessionState Request Failed!!");
    232                 }
    233             }
    234             else
    235             {
    236                 NXPLOG_FWDNLD_E("Invalid Buff Parameters!!");
    237                 wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
    238             }
    239         }
    240     }
    241 
    242     return wStatus;
    243 }
    244 
    245 /*******************************************************************************
    246 **
    247 ** Function         phDnldNfc_CheckIntegrity
    248 **
    249 ** Description      Inspects the integrity of EEPROM and FLASH contents of the NFCC,
    250 **                  provides CRC for each section
    251 **                  NOTE: The user data section CRC is valid only after fresh download
    252 **
    253 ** Parameters       bChipVer - current ChipVersion for including additional parameters in request payload
    254 **                  pCRCData - response buffer which gets updated with respective section CRC status
    255 **                             and CRC bytes from NFCC
    256 **                  pNotify  - notify caller after getting response
    257 **                  pContext - caller context
    258 **
    259 ** Returns          NFC status:
    260 **                  NFCSTATUS_SUCCESS     - CheckIntegrity request is successful
    261 **                  NFCSTATUS_FAILED      - CheckIntegrity request failed due to internal error
    262 **                  NFCSTATUS_NOT_ALLOWED - command not allowed
    263 **                  Other command specific errors                -
    264 **
    265 *******************************************************************************/
    266 NFCSTATUS phDnldNfc_CheckIntegrity(uint8_t bChipVer, pphDnldNfc_Buff_t pCRCData, pphDnldNfc_RspCb_t pNotify, void *pContext)
    267 {
    268     NFCSTATUS   wStatus = NFCSTATUS_SUCCESS;
    269 
    270     if((NULL == pNotify) ||
    271        (NULL == pContext)
    272        )
    273     {
    274         NXPLOG_FWDNLD_E("Invalid Input Parameters!!");
    275         wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
    276     }
    277     else
    278     {
    279         if(phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress)
    280         {
    281             NXPLOG_FWDNLD_E("Dnld Cmd Request in Progress..Cannot Continue!!");
    282             wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY);
    283         }
    284         else
    285         {
    286             if ((PHDNLDNFC_HWVER_MRA2_1 == bChipVer) || (PHDNLDNFC_HWVER_MRA2_2 == bChipVer)
    287 #if(NFC_NXP_CHIP_TYPE == PN551)
    288               || (PHDNLDNFC_HWVER_PN551_MRA1_0 == bChipVer)
    289 #elif(NFC_NXP_CHIP_TYPE == PN548C2)
    290               || (PHDNLDNFC_HWVER_PN548AD_MRA1_0 == bChipVer)
    291 #endif
    292                 )
    293             {
    294                 (gpphDnldContext->FrameInp.Type) = phDnldNfc_ChkIntg;
    295             }
    296             else
    297             {
    298                 (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTNone;
    299             }
    300 
    301             if((NULL != pCRCData->pBuff) && (0 != pCRCData->wLen))
    302             {
    303                 (gpphDnldContext->tRspBuffInfo.pBuff) = pCRCData->pBuff;
    304                 (gpphDnldContext->tRspBuffInfo.wLen) = pCRCData->wLen;
    305                 (gpphDnldContext->tCmdId) = PH_DL_CMD_CHECKINTEGRITY;
    306                 (gpphDnldContext->tUserData.pBuff) = NULL;
    307                 (gpphDnldContext->tUserData.wLen) = 0;
    308                 (gpphDnldContext->UserCb) = pNotify;
    309                 (gpphDnldContext->UserCtxt) = pContext;
    310 
    311                 wStatus = phDnldNfc_CmdHandler(gpphDnldContext,phDnldNfc_EventIntegChk);
    312 
    313                 if(NFCSTATUS_PENDING == wStatus)
    314                 {
    315                     NXPLOG_FWDNLD_D("CheckIntegrity Request submitted successfully");
    316                 }
    317                 else
    318                 {
    319                     NXPLOG_FWDNLD_E("CheckIntegrity Request Failed!!");
    320                 }
    321             }
    322             else
    323             {
    324                 NXPLOG_FWDNLD_E("Invalid Buff Parameters!!");
    325                 wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
    326             }
    327         }
    328     }
    329 
    330     return wStatus;
    331 }
    332 /*******************************************************************************
    333 **
    334 ** Function         phDnldNfc_ReadLog
    335 **
    336 ** Description      Retrieves log data from EEPROM
    337 **
    338 ** Parameters       pData    - response buffer which gets updated with data from EEPROM
    339 **                  pNotify  - notify caller after getting response
    340 **                  pContext - caller context
    341 **
    342 ** Returns          NFC status:
    343 **                  NFCSTATUS_SUCCESS     - Read request to NFCC is successful
    344 **                  NFCSTATUS_FAILED      - Read request failed due to internal error
    345 **                  NFCSTATUS_NOT_ALLOWED - command not allowed
    346 **                  Other command specific errors                -
    347 **
    348 *******************************************************************************/
    349 NFCSTATUS phDnldNfc_ReadLog(pphDnldNfc_Buff_t pData, pphDnldNfc_RspCb_t pNotify, void *pContext)
    350 {
    351     NFCSTATUS   wStatus = NFCSTATUS_SUCCESS;
    352 
    353     if((NULL == pNotify) || (NULL == pData) ||
    354        (NULL == pContext)
    355        )
    356     {
    357         NXPLOG_FWDNLD_E("Invalid Input Parameters!!");
    358         wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
    359     }
    360     else
    361     {
    362         if(phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress)
    363         {
    364             NXPLOG_FWDNLD_E("Dnld Cmd Request in Progress..Cannot Continue!!");
    365             wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY);
    366         }
    367         else
    368         {
    369             if((NULL != pData->pBuff) && (0 != pData->wLen))
    370             {
    371                 (gpphDnldContext->tCmdId) = PH_DL_CMD_READ;
    372                 (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTRead;
    373                 (gpphDnldContext->FrameInp.dwAddr) = PHDNLDNFC_EEPROM_LOG_START_ADDR;
    374                 (gpphDnldContext->tRspBuffInfo.pBuff) = pData->pBuff;
    375                 (gpphDnldContext->tRspBuffInfo.wLen) = pData->wLen;
    376                 (gpphDnldContext->tUserData.pBuff) = NULL;
    377                 (gpphDnldContext->tUserData.wLen) = 0;
    378                 (gpphDnldContext->UserCb) = pNotify;
    379                 (gpphDnldContext->UserCtxt) = pContext;
    380 
    381                 memset(&(gpphDnldContext->tRWInfo),0,sizeof(gpphDnldContext->tRWInfo));
    382 
    383                 wStatus = phDnldNfc_CmdHandler(gpphDnldContext,phDnldNfc_EventRead);
    384 
    385                 if(NFCSTATUS_PENDING == wStatus)
    386                 {
    387                     NXPLOG_FWDNLD_D("Read Request submitted successfully");
    388                 }
    389                 else
    390                 {
    391                     NXPLOG_FWDNLD_E("Read Request Failed!!");
    392                 }
    393             }
    394             else
    395             {
    396                 NXPLOG_FWDNLD_E("Invalid Buff Parameters!!");
    397                 wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
    398             }
    399         }
    400     }
    401 
    402     return wStatus;
    403 }
    404 
    405 /*******************************************************************************
    406 **
    407 ** Function         phDnldNfc_Write
    408 **
    409 ** Description      Writes requested  data of length len to desired EEPROM/FLASH address
    410 **
    411 ** Parameters       bRecoverSeq - flag to indicate whether recover sequence data needs to be written or not
    412 **                  pData       - data buffer to write into EEPROM/FLASH by user
    413 **                  pNotify     - notify caller after getting response
    414 **                  pContext    - caller context
    415 **
    416 ** Returns          NFC status:
    417 **                  NFCSTATUS_SUCCESS     - Write request to NFCC is successful
    418 **                  NFCSTATUS_FAILED      - Write request failed due to internal error
    419 **                  NFCSTATUS_NOT_ALLOWED - command not allowed
    420 **                  Other command specific errors                -
    421 **
    422 *******************************************************************************/
    423 NFCSTATUS phDnldNfc_Write(bool_t  bRecoverSeq, pphDnldNfc_Buff_t pData, pphDnldNfc_RspCb_t pNotify, void *pContext)
    424 {
    425     NFCSTATUS   wStatus = NFCSTATUS_SUCCESS;
    426     uint8_t *pImgPtr = NULL;
    427     uint16_t wLen = 0;
    428     phDnldNfc_Buff_t tImgBuff;
    429 
    430     if((NULL == pNotify) || (NULL == pContext))
    431     {
    432         NXPLOG_FWDNLD_E("Invalid Input Parameters!!");
    433         wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
    434     }
    435     else
    436     {
    437         if(phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress)
    438         {
    439             NXPLOG_FWDNLD_E("Dnld Cmd Request in Progress..Cannot Continue!!");
    440             wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY);
    441         }
    442         else
    443         {
    444             if(NULL != pData)
    445             {
    446                 pImgPtr = pData->pBuff;
    447                 wLen = pData->wLen;
    448             }
    449             else
    450             {
    451                 if(FALSE == bRecoverSeq)
    452                 {
    453 
    454                     pImgPtr = (uint8_t *)gpphDnldContext->nxp_nfc_fw;
    455                     wLen = gpphDnldContext->nxp_nfc_fw_len;
    456 
    457                 }
    458                 else
    459                 {
    460                     if(PH_DL_STATUS_PLL_ERROR == (gpphDnldContext->tLastStatus))
    461                     {
    462                         wStatus = phDnldNfc_LoadRecInfo();
    463                     }
    464                     else if(PH_DL_STATUS_SIGNATURE_ERROR == (gpphDnldContext->tLastStatus))
    465                     {
    466                         wStatus = phDnldNfc_LoadPKInfo();
    467                     }
    468                     else
    469                     {
    470                     }
    471 
    472                     if(NFCSTATUS_SUCCESS == wStatus)
    473                     {
    474                         pImgPtr = (uint8_t *)gpphDnldContext->nxp_nfc_fwp;
    475                         wLen = gpphDnldContext->nxp_nfc_fwp_len;
    476                     }
    477                     else
    478                     {
    479                         NXPLOG_FWDNLD_E("Platform Recovery Image extraction Failed!!");
    480                         pImgPtr = NULL;
    481                         wLen = 0;
    482                     }
    483                 }
    484             }
    485 
    486             if((NULL != pImgPtr) && (0 != wLen))
    487             {
    488                 tImgBuff.pBuff = pImgPtr;
    489                 tImgBuff.wLen = wLen;
    490 
    491                 (gpphDnldContext->tCmdId) = PH_DL_CMD_WRITE;
    492                 (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTWrite;
    493                 (gpphDnldContext->tRspBuffInfo.pBuff) = NULL;
    494                 (gpphDnldContext->tRspBuffInfo.wLen) = 0;
    495                 (gpphDnldContext->tUserData.pBuff) = pImgPtr;
    496                 (gpphDnldContext->tUserData.wLen) = wLen;
    497                 (gpphDnldContext->bResendLastFrame) = FALSE;
    498 
    499                 memset(&(gpphDnldContext->tRWInfo),0,sizeof(gpphDnldContext->tRWInfo));
    500                 (gpphDnldContext->tRWInfo.bFirstWrReq) = TRUE;
    501                 (gpphDnldContext->UserCb) = pNotify;
    502                 (gpphDnldContext->UserCtxt) = pContext;
    503 
    504                 wStatus = phDnldNfc_CmdHandler(gpphDnldContext,phDnldNfc_EventWrite);
    505 
    506                 if(NFCSTATUS_PENDING == wStatus)
    507                 {
    508                     NXPLOG_FWDNLD_D("Write Request submitted successfully");
    509                 }
    510                 else
    511                 {
    512                     NXPLOG_FWDNLD_E("Write Request Failed!!");
    513                 }
    514             }
    515             else
    516             {
    517                 NXPLOG_FWDNLD_E("Download Image Primitives extraction failed!!");
    518                 wStatus = NFCSTATUS_FAILED;
    519             }
    520         }
    521     }
    522 
    523     return wStatus;
    524 }
    525 
    526 /*******************************************************************************
    527 **
    528 ** Function         phDnldNfc_Log
    529 **
    530 ** Description      Provides a full page free write to EEPROM
    531 **
    532 ** Parameters       pData       - data buffer to write into EEPROM/FLASH by user
    533 **                  pNotify     - notify caller after getting response
    534 **                  pContext    - caller context
    535 **
    536 ** Returns          NFC status:
    537 **                  NFCSTATUS_SUCCESS     - Write request to NFCC is successful
    538 **                  NFCSTATUS_FAILED      - Write request failed due to internal error
    539 **                  NFCSTATUS_NOT_ALLOWED - command not allowed
    540 **                  Other command specific errors                -
    541 **
    542 *******************************************************************************/
    543 NFCSTATUS phDnldNfc_Log(pphDnldNfc_Buff_t pData, pphDnldNfc_RspCb_t pNotify, void *pContext)
    544 {
    545     NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
    546 
    547     if((NULL == pNotify) || (NULL == pData) ||
    548        (NULL == pContext)
    549        )
    550     {
    551         NXPLOG_FWDNLD_E("Invalid Input Parameters!!");
    552         wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
    553     }
    554     else
    555     {
    556         if(phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress)
    557         {
    558             NXPLOG_FWDNLD_E("Dnld Cmd Request in Progress..Cannot Continue!!");
    559             wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY);
    560         }
    561         else
    562         {
    563             if((NULL != (pData->pBuff)) && ((0 != (pData->wLen) && (PHDNLDNFC_MAX_LOG_SIZE >= (pData->wLen)))))
    564             {
    565                 (gpphDnldContext->tCmdId) = PH_DL_CMD_LOG;
    566                 (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTLog;
    567                 (gpphDnldContext->tRspBuffInfo.pBuff) = NULL;
    568                 (gpphDnldContext->tRspBuffInfo.wLen) = 0;
    569                 (gpphDnldContext->tUserData.pBuff) = (pData->pBuff);
    570                 (gpphDnldContext->tUserData.wLen) = (pData->wLen);
    571 
    572                 memset(&(gpphDnldContext->tRWInfo),0,sizeof(gpphDnldContext->tRWInfo));
    573                 (gpphDnldContext->UserCb) = pNotify;
    574                 (gpphDnldContext->UserCtxt) = pContext;
    575 
    576                 wStatus = phDnldNfc_CmdHandler(gpphDnldContext,phDnldNfc_EventLog);
    577 
    578                 if(NFCSTATUS_PENDING == wStatus)
    579                 {
    580                     NXPLOG_FWDNLD_D("Log Request submitted successfully");
    581                 }
    582                 else
    583                 {
    584                     NXPLOG_FWDNLD_E("Log Request Failed!!");
    585                 }
    586             }
    587             else
    588             {
    589                 NXPLOG_FWDNLD_E("Invalid Input Parameters for Log!!");
    590                 wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
    591             }
    592         }
    593     }
    594 
    595     return wStatus;
    596 }
    597 
    598 /*******************************************************************************
    599 **
    600 ** Function         phDnldNfc_Force
    601 **
    602 ** Description      Used as an emergency recovery procedure for NFCC due to corrupt
    603 **                  settings of system platform specific parameters by the host
    604 **
    605 ** Parameters       pInputs  - input buffer which contains  clk src & clk freq settings for desired platform
    606 **                  pNotify  - notify caller after getting response
    607 **                  pContext - caller context
    608 **
    609 ** Returns          NFC status:
    610 **                  NFCSTATUS_SUCCESS     - Emergency Recovery request is successful
    611 **                  NFCSTATUS_FAILED      - Emergency Recovery failed due to internal error
    612 **                  NFCSTATUS_NOT_ALLOWED - command not allowed
    613 **                  Other command specific errors                -
    614 **
    615 *******************************************************************************/
    616 NFCSTATUS phDnldNfc_Force(pphDnldNfc_Buff_t pInputs, pphDnldNfc_RspCb_t pNotify, void *pContext)
    617 {
    618     NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
    619     uint8_t bClkSrc = 0x00,bClkFreq = 0x00;
    620     uint8_t bPldVal[3] = {0x11,0x00,0x00};  /* default values to be used if input not provided */
    621 
    622     if((NULL == pNotify) || (NULL == pContext))
    623     {
    624         NXPLOG_FWDNLD_E("Invalid Input Parameters!!");
    625         wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
    626     }
    627     else
    628     {
    629         if(phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress)
    630         {
    631             NXPLOG_FWDNLD_E("Dnld Cmd Request in Progress..Cannot Continue!!");
    632             wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY);
    633         }
    634         else
    635         {
    636             (gpphDnldContext->tCmdId) = PH_DL_CMD_FORCE;
    637             (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTForce;
    638             (gpphDnldContext->tRspBuffInfo.pBuff) = NULL;
    639             (gpphDnldContext->tRspBuffInfo.wLen) = 0;
    640 
    641             if((0 != (pInputs->wLen)) || (NULL != (pInputs->pBuff)))
    642             {
    643                if(CLK_SRC_XTAL == (pInputs->pBuff[0]))
    644                {
    645                    bClkSrc = phDnldNfc_ClkSrcXtal;
    646                }
    647                else if(CLK_SRC_PLL == (pInputs->pBuff[0]))
    648                {
    649                    bClkSrc = phDnldNfc_ClkSrcPLL;
    650                    if(CLK_FREQ_13MHZ == (pInputs->pBuff[1]))
    651                    {
    652                        bClkFreq = phDnldNfc_ClkFreq_13Mhz;
    653                    }
    654                    else if(CLK_FREQ_19_2MHZ == (pInputs->pBuff[1]))
    655                    {
    656                        bClkFreq = phDnldNfc_ClkFreq_19_2Mhz;
    657                    }
    658                    else if(CLK_FREQ_24MHZ == (pInputs->pBuff[1]))
    659                    {
    660                        bClkFreq = phDnldNfc_ClkFreq_24Mhz;
    661                    }
    662                    else if(CLK_FREQ_26MHZ == (pInputs->pBuff[1]))
    663                    {
    664                        bClkFreq = phDnldNfc_ClkFreq_26Mhz;
    665                    }
    666                    else if(CLK_FREQ_38_4MHZ == (pInputs->pBuff[1]))
    667                    {
    668                        bClkFreq = phDnldNfc_ClkFreq_38_4Mhz;
    669                    }
    670                    else if(CLK_FREQ_52MHZ == (pInputs->pBuff[1]))
    671                    {
    672                        bClkFreq = phDnldNfc_ClkFreq_52Mhz;
    673                    }
    674                    else
    675                    {
    676                        NXPLOG_FWDNLD_E("Invalid Clk Frequency !! Using default value of 19.2Mhz..");
    677                        bClkFreq = phDnldNfc_ClkFreq_19_2Mhz;
    678                    }
    679 
    680                }
    681                else if(CLK_SRC_PADDIRECT == (pInputs->pBuff[0]))
    682                {
    683                    bClkSrc = phDnldNfc_ClkSrcPad;
    684                }
    685                else
    686                {
    687                    NXPLOG_FWDNLD_E("Invalid Clk src !! Using default value of PLL..");
    688                    bClkSrc = phDnldNfc_ClkSrcPLL;
    689                }
    690 
    691                bPldVal[0] = 0U;
    692                bPldVal[0] = ((bClkSrc << 3U) | bClkFreq);
    693             }
    694             else
    695             {
    696                 NXPLOG_FWDNLD_E("Clk src inputs not provided!! Using default values..");
    697             }
    698 
    699             (gpphDnldContext->tUserData.pBuff) = bPldVal;
    700             (gpphDnldContext->tUserData.wLen) = sizeof(bPldVal);
    701 
    702             memset(&(gpphDnldContext->tRWInfo),0,sizeof(gpphDnldContext->tRWInfo));
    703             (gpphDnldContext->UserCb) = pNotify;
    704             (gpphDnldContext->UserCtxt) = pContext;
    705 
    706             wStatus = phDnldNfc_CmdHandler(gpphDnldContext,phDnldNfc_EventForce);
    707 
    708             if(NFCSTATUS_PENDING == wStatus)
    709             {
    710                 NXPLOG_FWDNLD_D("Force Command Request submitted successfully");
    711             }
    712             else
    713             {
    714                 NXPLOG_FWDNLD_E("Force Command Request Failed!!");
    715             }
    716         }
    717     }
    718 
    719     return wStatus;
    720 }
    721 
    722 /*******************************************************************************
    723 **
    724 ** Function         phDnldNfc_SetHwDevHandle
    725 **
    726 ** Description      Stores the HwDev handle to download context. The handle is required for subsequent operations
    727 **
    728 ** Parameters       None
    729 **
    730 ** Returns          None                -
    731 **
    732 *******************************************************************************/
    733 void phDnldNfc_SetHwDevHandle(void)
    734 {
    735     pphDnldNfc_DlContext_t  psDnldContext = NULL;
    736 
    737     if(NULL == gpphDnldContext)
    738     {
    739         NXPLOG_FWDNLD_D("Allocating Mem for Dnld Context..");
    740         /* Create the memory for Download Mgmt Context */
    741         psDnldContext = (pphDnldNfc_DlContext_t)
    742                         malloc(sizeof(phDnldNfc_DlContext_t));
    743 
    744         if(psDnldContext != NULL)
    745         {
    746             (void ) memset((void *)psDnldContext,0,
    747                                             sizeof(phDnldNfc_DlContext_t));
    748             gpphDnldContext = psDnldContext;
    749         }
    750         else
    751         {
    752             NXPLOG_FWDNLD_E("Error Allocating Mem for Dnld Context..")
    753         }
    754     }
    755     else
    756     {
    757         (void ) memset((void *)gpphDnldContext,0,
    758                                             sizeof(phDnldNfc_DlContext_t));
    759     }
    760     return;
    761 }
    762 
    763 /*******************************************************************************
    764 **
    765 ** Function         phDnldNfc_ReSetHwDevHandle
    766 **
    767 ** Description      Frees the HwDev handle to download context.
    768 **
    769 ** Parameters       None
    770 **
    771 ** Returns          None                -
    772 **
    773 *******************************************************************************/
    774 void phDnldNfc_ReSetHwDevHandle(void)
    775 {
    776     if (gpphDnldContext != NULL)
    777     {
    778         NXPLOG_FWDNLD_E("Freeing Mem for Dnld Context..")
    779         free(gpphDnldContext);
    780         gpphDnldContext = NULL;
    781     }
    782 }
    783 
    784 
    785 /*******************************************************************************
    786 **
    787 ** Function         phDnldNfc_RawReq
    788 **
    789 ** Description      Sends raw frame request to NFCC.
    790 **                  It is currently used for sending an NCI RESET cmd after doing a production key update
    791 **
    792 ** Parameters       pFrameData - input buffer, contains raw frame packet to be sent to NFCC
    793 **                  pRspData   - response buffer received from NFCC
    794 **                  pNotify    - notify caller after getting response
    795 **                  pContext   - caller context
    796 **
    797 ** Returns          NFC status:
    798 **                  NFCSTATUS_SUCCESS     - GetSessionState request to NFCC is successful
    799 **                  NFCSTATUS_FAILED      - GetSessionState request failed due to internal error
    800 **                  NFCSTATUS_NOT_ALLOWED - command not allowed
    801 **                  Other command specific errors                -
    802 **
    803 *******************************************************************************/
    804 NFCSTATUS phDnldNfc_RawReq(pphDnldNfc_Buff_t pFrameData, pphDnldNfc_Buff_t pRspData, pphDnldNfc_RspCb_t pNotify, void *pContext)
    805 {
    806     NFCSTATUS   wStatus = NFCSTATUS_SUCCESS;
    807 
    808     if((NULL == pFrameData) || (NULL == pNotify) || (NULL == pRspData) ||
    809        (NULL == pContext)
    810        )
    811     {
    812         NXPLOG_FWDNLD_E("Invalid Input Parameters!!");
    813         wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
    814     }
    815     else
    816     {
    817         if(phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress)
    818         {
    819             NXPLOG_FWDNLD_E("Raw Cmd Request in Progress..Cannot Continue!!");
    820             wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY);
    821         }
    822         else
    823         {
    824             if(((NULL != pFrameData->pBuff) && (0 != pFrameData->wLen)) &&
    825                 ((NULL != pRspData->pBuff) && (0 != pRspData->wLen))
    826                 )
    827             {
    828                 (gpphDnldContext->tRspBuffInfo.pBuff) = pRspData->pBuff;
    829                 (gpphDnldContext->tRspBuffInfo.wLen) = pRspData->wLen;
    830                 (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTRaw;
    831                 (gpphDnldContext->tCmdId) = PH_DL_CMD_NONE;
    832                 (gpphDnldContext->tUserData.pBuff) = pFrameData->pBuff;
    833                 (gpphDnldContext->tUserData.wLen) = pFrameData->wLen;
    834                 (gpphDnldContext->UserCb) = pNotify;
    835                 (gpphDnldContext->UserCtxt) = pContext;
    836 
    837                 wStatus = phDnldNfc_CmdHandler(gpphDnldContext,phDnldNfc_EventRaw);
    838 
    839                 if(NFCSTATUS_PENDING == wStatus)
    840                 {
    841                     NXPLOG_FWDNLD_D("RawFrame Request submitted successfully");
    842                 }
    843                 else
    844                 {
    845                     NXPLOG_FWDNLD_E("RawFrame Request Failed!!");
    846                 }
    847             }
    848             else
    849             {
    850                 NXPLOG_FWDNLD_E("Invalid Buff Parameters!!");
    851                 wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
    852             }
    853         }
    854     }
    855 
    856     return wStatus;
    857 }
    858 
    859 /*******************************************************************************
    860 **
    861 ** Function         phDnldNfc_InitImgInfo
    862 **
    863 ** Description      Extracts image information and stores it in respective variables,
    864 **                  to be used internally for write operation
    865 **
    866 ** Parameters       None
    867 **
    868 ** Returns          NFC status
    869 **
    870 *******************************************************************************/
    871 NFCSTATUS phDnldNfc_InitImgInfo(void)
    872 {
    873     NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
    874     uint8_t *pImageInfo =  NULL;
    875     uint16_t ImageInfoLen = 0;
    876     char fwFileName[256];
    877     char fwpathName[256];
    878     char *pathName = NULL;
    879 
    880     /* if memory is not allocated then allocate memory for download context structure */
    881     phDnldNfc_SetHwDevHandle();
    882 
    883     /*Read Firmware file name from config file*/
    884     if (GetNxpStrValue(NAME_NXP_FW_NAME, fwFileName, sizeof (fwFileName)) == TRUE)
    885     {
    886         strcpy (fwpathName, FW_DLL_ROOT_DIR);
    887         strncat (fwpathName, fwFileName, strlen (fwFileName));
    888         pathName = fwpathName;
    889     }
    890 
    891     /* load the library and get the image info pointer */
    892 #if(NFC_NXP_CHIP_TYPE != PN547C2)
    893     if (gRecFWDwnld == TRUE)
    894         wStatus = phDnldNfc_LoadRecoveryFW (pathName, &pImageInfo, &ImageInfoLen);
    895     else
    896 #endif
    897         wStatus = phDnldNfc_LoadFW (pathName, &pImageInfo, &ImageInfoLen);
    898 
    899     NXPLOG_FWDNLD_D("FW Image Length - ImageInfoLen %d", ImageInfoLen);
    900     NXPLOG_FWDNLD_D("FW Image Info Pointer - pImageInfo %p", pImageInfo);
    901 
    902     if((pImageInfo == NULL) || (ImageInfoLen == 0))
    903     {
    904         NXPLOG_FWDNLD_E("Image extraction Failed - invalid imginfo or imginfolen!!");
    905         wStatus = NFCSTATUS_FAILED;
    906     }
    907 
    908     if (wStatus != NFCSTATUS_SUCCESS)
    909     {
    910         NXPLOG_FWDNLD_E("Error loading libpn54x_fw !!\n");
    911     }
    912 
    913    /* get the MW version */
    914    if(NFCSTATUS_SUCCESS == wStatus)
    915    {
    916        //NXPLOG_FWDNLD_D("MW Major Version Num - %x",NXP_MW_VERSION_MAJ);
    917        //NXPLOG_FWDNLD_D("MW Minor Version Num - %x",NXP_MW_VERSION_MIN);
    918        wMwVer = (((uint16_t)(NXP_MW_VERSION_MAJ) << 8U) | (NXP_MW_VERSION_MIN));
    919    }
    920 
    921    if(NFCSTATUS_SUCCESS == wStatus)
    922    {
    923        gpphDnldContext->nxp_nfc_fw = (uint8_t*)pImageInfo;
    924        gpphDnldContext->nxp_nfc_fw_len = ImageInfoLen;
    925        if((NULL != gpphDnldContext->nxp_nfc_fw) && (0 != gpphDnldContext->nxp_nfc_fw_len))
    926        {
    927            NXPLOG_FWDNLD_D("FW Major Version Num - %x",gpphDnldContext->nxp_nfc_fw[5]);
    928            NXPLOG_FWDNLD_D("FW Minor Version Num - %x",gpphDnldContext->nxp_nfc_fw[4]);
    929            NXPLOG_FWDNLD_D("FW Image Length - %d",ImageInfoLen);
    930            NXPLOG_FWDNLD_D("FW Image Info Pointer - %p", pImageInfo);
    931 
    932            /* get the FW version */
    933            wFwVer = (((uint16_t)(gpphDnldContext->nxp_nfc_fw[5]) << 8U) | (gpphDnldContext->nxp_nfc_fw[4]));
    934            wStatus = NFCSTATUS_SUCCESS;
    935        }
    936        else
    937        {
    938            NXPLOG_FWDNLD_E("Image details extraction Failed!!");
    939            wStatus = NFCSTATUS_FAILED;
    940        }
    941    }
    942 
    943    return wStatus;
    944 }
    945 
    946 
    947 /*******************************************************************************
    948 **
    949 ** Function         phDnldNfc_LoadRecInfo
    950 **
    951 ** Description      Extracts recovery sequence image information and stores it
    952 **                  in respective variables, to be used internally for write operation
    953 **
    954 ** Parameters       None
    955 **
    956 ** Returns          NFC status
    957 **
    958 *******************************************************************************/
    959 NFCSTATUS phDnldNfc_LoadRecInfo(void)
    960 {
    961     NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
    962     uint8_t *pImageInfo = NULL;
    963     uint16_t ImageInfoLen = 0;
    964 
    965     /* if memory is not allocated then allocate memory for donwload context structure */
    966     phDnldNfc_SetHwDevHandle();
    967 #if(NFC_NXP_CHIP_TYPE != PN547C2)
    968     if (gRecFWDwnld == TRUE)
    969         wStatus = phDnldNfc_LoadRecoveryFW (PLATFORM_LIB_PATH, &pImageInfo, &ImageInfoLen);
    970     else
    971 #endif
    972         wStatus = phDnldNfc_LoadFW (PLATFORM_LIB_PATH, &pImageInfo, &ImageInfoLen);
    973     if((pImageInfo == NULL) || (ImageInfoLen == 0))
    974     {
    975         NXPLOG_FWDNLD_E("Image extraction Failed - invalid imginfo or imginfolen!!");
    976         wStatus = NFCSTATUS_FAILED;
    977     }
    978 
    979     /* load the PLL recovery image library */
    980     if (wStatus != NFCSTATUS_SUCCESS)
    981     {
    982         NXPLOG_FWDNLD_E("Error loading libpn54x_fw_platform !!\n");
    983     }
    984 
    985    if(NFCSTATUS_SUCCESS == wStatus)
    986    {
    987        /* fetch the PLL recovery image pointer and the image length */
    988        gpphDnldContext->nxp_nfc_fwp = (uint8_t*)pImageInfo;
    989        gpphDnldContext->nxp_nfc_fwp_len = ImageInfoLen;
    990        if((NULL != gpphDnldContext->nxp_nfc_fwp) && (0 != gpphDnldContext->nxp_nfc_fwp_len))
    991        {
    992            NXPLOG_FWDNLD_D("Recovery Image Length - %d",ImageInfoLen);
    993            NXPLOG_FWDNLD_D("Recovery Image Info Pointer - %p", pImageInfo);
    994            wStatus = NFCSTATUS_SUCCESS;
    995        }
    996        else
    997        {
    998            NXPLOG_FWDNLD_E("Recovery Image details extraction Failed!!");
    999            wStatus = NFCSTATUS_FAILED;
   1000        }
   1001    }
   1002 
   1003    return wStatus;
   1004 }
   1005 
   1006 /*******************************************************************************
   1007 **
   1008 ** Function         phDnldNfc_LoadPKInfo
   1009 **
   1010 ** Description      Extracts production sequence image information and stores it
   1011 **                  in respective variables, to be used internally for write operation
   1012 **
   1013 ** Parameters       None
   1014 **
   1015 ** Returns          NFC status
   1016 **
   1017 *******************************************************************************/
   1018 NFCSTATUS phDnldNfc_LoadPKInfo(void)
   1019 {
   1020     NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
   1021     uint8_t *pImageInfo = NULL;
   1022     uint16_t ImageInfoLen = 0;
   1023 
   1024     /* if memory is not allocated then allocate memory for donwload context structure */
   1025     phDnldNfc_SetHwDevHandle();
   1026 
   1027     /* load the PKU image library */
   1028 #if(NFC_NXP_CHIP_TYPE != PN547C2)
   1029     if (gRecFWDwnld == TRUE)
   1030         wStatus = phDnldNfc_LoadRecoveryFW (PKU_LIB_PATH, &pImageInfo, &ImageInfoLen);
   1031     else
   1032 #endif
   1033         wStatus = phDnldNfc_LoadFW (PKU_LIB_PATH, &pImageInfo, &ImageInfoLen);
   1034     if((pImageInfo == NULL) || (ImageInfoLen == 0))
   1035     {
   1036         NXPLOG_FWDNLD_E("Image extraction Failed - invalid imginfo or imginfolen!!");
   1037         wStatus = NFCSTATUS_FAILED;
   1038     }
   1039 
   1040     if (wStatus != NFCSTATUS_SUCCESS)
   1041     {
   1042         NXPLOG_FWDNLD_E("Error loading libpn54x_fw_pku !!\n");
   1043     }
   1044 
   1045    if(NFCSTATUS_SUCCESS == wStatus)
   1046    {
   1047        /* fetch the PKU image pointer and the image length */
   1048        gpphDnldContext->nxp_nfc_fwp = (uint8_t*)pImageInfo;
   1049        gpphDnldContext->nxp_nfc_fwp_len = ImageInfoLen;
   1050 
   1051        if((NULL != gpphDnldContext->nxp_nfc_fwp) && (0 != gpphDnldContext->nxp_nfc_fwp_len))
   1052        {
   1053            NXPLOG_FWDNLD_D("PKU Image Length - %d",ImageInfoLen);
   1054            NXPLOG_FWDNLD_D("PKU Image Info Pointer - %p",pImageInfo);
   1055            wStatus = NFCSTATUS_SUCCESS;
   1056        }
   1057        else
   1058        {
   1059            NXPLOG_FWDNLD_E("PKU Image details extraction Failed!!");
   1060            wStatus = NFCSTATUS_FAILED;
   1061        }
   1062    }
   1063 
   1064    return wStatus;
   1065 }
   1066 
   1067 /*******************************************************************************
   1068 **
   1069 ** Function         phDnldNfc_CloseFwLibHandle
   1070 **
   1071 ** Description      Closes previously opened fw library handle as part of
   1072 **                  dynamic loader processing
   1073 **
   1074 ** Parameters       None
   1075 **
   1076 ** Returns          None
   1077 **
   1078 *******************************************************************************/
   1079 void phDnldNfc_CloseFwLibHandle(void)
   1080 {
   1081     NFCSTATUS wStatus;
   1082 
   1083     wStatus = phDnldNfc_UnloadFW();
   1084     if(wStatus != NFCSTATUS_SUCCESS)
   1085     {
   1086         NXPLOG_FWDNLD_E("free library FAILED !!\n");
   1087     }
   1088     else
   1089     {
   1090         NXPLOG_FWDNLD_E("free library SUCCESS !!\n");
   1091     }
   1092     return;
   1093 }
   1094 
   1095 /*******************************************************************************
   1096 **
   1097 ** Function         phDnldNfc_LoadFW
   1098 **
   1099 ** Description      Load the firmware version form firmware lib
   1100 **
   1101 ** Parameters       pathName    - Firmware image path
   1102 **                  pImgInfo    - Firmware image handle
   1103 **                  pImgInfoLen - Firmware image length
   1104 **
   1105 ** Returns          NFC status
   1106 **
   1107 *******************************************************************************/
   1108 NFCSTATUS phDnldNfc_LoadFW(const char* pathName, uint8_t **pImgInfo, uint16_t* pImgInfoLen)
   1109 {
   1110     void* pImageInfo = NULL;
   1111     void* pImageInfoLen = NULL;
   1112     if(pathName == NULL)
   1113     {
   1114 #if(NFC_NXP_CHIP_TYPE == PN548C2)
   1115         pathName = "/system/vendor/firmware/libpn548ad_fw.so";
   1116 #elif(NFC_NXP_CHIP_TYPE == PN551)
   1117         pathName = "/system/vendor/firmware/libpn551_fw.so";
   1118 #else
   1119         pathName = "/system/vendor/firmware/libpn547_fw.so";
   1120 #endif
   1121     }
   1122 
   1123     /* check if the handle is not NULL then free the library */
   1124     if(pFwLibHandle != NULL)
   1125     {
   1126         phDnldNfc_UnloadFW();
   1127         pFwLibHandle = NULL;
   1128     }
   1129 
   1130     /* load the DLL file */
   1131     pFwLibHandle = dlopen(pathName, RTLD_LAZY);
   1132     NXPLOG_FWDNLD_D ("@@@%s", pathName);
   1133 
   1134     /* if library load failed then handle will be NULL */
   1135     if(pFwLibHandle == NULL)
   1136     {
   1137         NXPLOG_FWDNLD_E("NULL handler : unable to load the library file, specify correct path");
   1138         return NFCSTATUS_FAILED;
   1139     }
   1140 
   1141     dlerror();    /* Clear any existing error */
   1142 
   1143     /* load the address of download image pointer and image size */
   1144    pImageInfo     =  (void*)dlsym(pFwLibHandle,"gphDnldNfc_DlSeq");
   1145 
   1146    if(dlerror()|| (NULL == pImageInfo))
   1147    {
   1148        NXPLOG_FWDNLD_E("Problem loading symbol : gphDnldNfc_DlSeq");
   1149        return NFCSTATUS_FAILED;
   1150    }
   1151    (*pImgInfo) = (*(uint8_t**)pImageInfo);
   1152 
   1153    pImageInfoLen  = (void*)dlsym(pFwLibHandle,"gphDnldNfc_DlSeqSz");
   1154    if(dlerror() || (NULL == pImageInfoLen))
   1155    {
   1156        NXPLOG_FWDNLD_E("Problem loading symbol : gphDnldNfc_DlSeqSz");
   1157        return NFCSTATUS_FAILED;
   1158    }
   1159 
   1160    (*pImgInfoLen) = (uint16_t)(*((uint16_t*)pImageInfoLen));
   1161 
   1162     return NFCSTATUS_SUCCESS;
   1163 }
   1164 
   1165 #if(NFC_NXP_CHIP_TYPE != PN547C2)
   1166 /*******************************************************************************
   1167 **
   1168 ** Function         phDnldNfc_LoadRecoveryFW
   1169 **
   1170 ** Description      Load the dummy firmware version form firmware lib for recovery
   1171 **                  This will change the FW version of the NFCC firmware
   1172 **                  and enable flashing of firmware of same version.
   1173 **
   1174 ** Parameters       pathName    - Firmware image path
   1175 **                  pImgInfo    - Firmware image handle
   1176 **                  pImgInfoLen - Firmware image length
   1177 **
   1178 ** Returns          NFCSTATUS
   1179 **
   1180 *******************************************************************************/
   1181 NFCSTATUS phDnldNfc_LoadRecoveryFW (const char* pathName, uint8_t **pImgInfo, uint16_t* pImgInfoLen)
   1182 {
   1183     void* pImageInfo = NULL;
   1184     void* pImageInfoLen = NULL;
   1185 
   1186     /* check for path name */
   1187     if (pathName == NULL)
   1188     {
   1189 #if(NFC_NXP_CHIP_TYPE == PN548C2)
   1190         pathName = "/system/vendor/firmware/libpn548ad_fw.so";
   1191 #elif(NFC_NXP_CHIP_TYPE == PN551)
   1192         pathName = "/system/vendor/firmware/libpn551_fw.so";
   1193 #else
   1194         pathName = "/system/vendor/firmware/libpn547_fw.so";
   1195 #endif
   1196     }
   1197 
   1198     /* check if the handle is not NULL then free the library */
   1199     if (pFwLibHandle != NULL)
   1200     {
   1201         phDnldNfc_UnloadFW ();
   1202         pFwLibHandle = NULL;
   1203     }
   1204     /* load the DLL file */
   1205     pFwLibHandle = dlopen (pathName, RTLD_LAZY);
   1206     NXPLOG_FWDNLD_D ("phDnldNfc_LoadRecoveryFW %s ", pathName);
   1207 
   1208     /* if library load failed then handle will be NULL */
   1209     if (pFwLibHandle == NULL)
   1210     {
   1211         NXPLOG_FWDNLD_E("NULL handler : unable to load the library file, specify correct path");
   1212         return NFCSTATUS_FAILED;
   1213     }
   1214 
   1215     dlerror ();    /* Clear any existing error */
   1216 
   1217     /* load the address of download image pointer and image size */
   1218     pImageInfo =  (void*)dlsym (pFwLibHandle, "gphDnldNfc_DummyDlSeq");
   1219 
   1220     if (dlerror() || (NULL == pImageInfo))
   1221     {
   1222         NXPLOG_FWDNLD_E ("Problem loading symbol : gphDnldNfc_DummyDlSeq");
   1223         return NFCSTATUS_FAILED;
   1224     }
   1225 
   1226    (*pImgInfo) = (*(uint8_t**)pImageInfo);
   1227     pImageInfoLen  = (void*)dlsym (pFwLibHandle, "gphDnldNfc_DlSeqDummyFwSz");
   1228     if (dlerror() ||(NULL == pImageInfoLen))
   1229     {
   1230        NXPLOG_FWDNLD_E ("Problem loading symbol : gphDnldNfc_DlSeqDummyFwSz");
   1231        return NFCSTATUS_FAILED;
   1232     }
   1233 
   1234     (*pImgInfoLen) = (uint16_t)(*((uint16_t*)pImageInfoLen));
   1235 
   1236     return NFCSTATUS_SUCCESS;
   1237 }
   1238 #endif
   1239 
   1240 /*******************************************************************************
   1241 **
   1242 ** Function         phDnldNfc_UnloadFW
   1243 **
   1244 ** Description      Deinit the firmware handle
   1245 **
   1246 ** Parameters       None
   1247 **
   1248 ** Returns          NFC status
   1249 **
   1250 *******************************************************************************/
   1251 NFCSTATUS phDnldNfc_UnloadFW(void)
   1252 {
   1253     NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
   1254     int32_t   status;
   1255 
   1256     /* check if the handle is not NULL then free the library */
   1257     if(pFwLibHandle != NULL)
   1258     {
   1259         status = dlclose(pFwLibHandle);
   1260         pFwLibHandle = NULL;
   1261 
   1262         dlerror();    /* Clear any existing error */
   1263         if(status != 0)
   1264         {
   1265             wStatus = NFCSTATUS_FAILED;
   1266             NXPLOG_FWDNLD_E("Free library file failed");
   1267         }
   1268     }
   1269 
   1270     return wStatus;
   1271 }
   1272 
   1273 #ifdef EEPROM_Read_Mem_IMP
   1274 /*******************************************************************************
   1275 **
   1276 ** Function         phDnldNfc_ReadMem
   1277 **
   1278 ** Description      Dumps the contents of EEPROM. The handle is required for subsequent operations
   1279 **
   1280 ** Parameters       pHwRef   - pointer to the hardware device
   1281 **                  pNotify  - notify caller after getting response
   1282 **                  pContext - caller context
   1283 **
   1284 ** Returns          NFC status:
   1285 **                  NFCSTATUS_SUCCESS     - request to NFCC is successful
   1286 **                  NFCSTATUS_FAILED      - request failed due to internal error
   1287 **                  NFCSTATUS_NOT_ALLOWED - command not allowed
   1288 **                  Other command specific errors                -
   1289 **
   1290 *******************************************************************************/
   1291 NFCSTATUS phDnldNfc_ReadMem(void *pHwRef, pphDnldNfc_RspCb_t pNotify, void *pContext)
   1292 {
   1293     NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
   1294     uint32_t wAddr = 0x2011C0; /* eeprom platform specific area start address */
   1295     uint32_t wRdAddr = 0;
   1296     uint8_t *pAddr;
   1297     static uint8_t bRdData[3519];  /* buffer to hold the read data */
   1298     static phDnldNfc_Buff_t Data;
   1299 
   1300     if((NULL == pNotify) || (NULL == pContext))
   1301     {
   1302         NXPLOG_FWDNLD_E("Invalid Input Parameters!!");
   1303         wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
   1304     }
   1305     else
   1306     {
   1307         /* Call Tml Ioctl to enable download mode */
   1308         wStatus = phTmlNfc_IoCtl(phTmlNfc_e_EnableDownloadMode);
   1309 
   1310         if(NFCSTATUS_SUCCESS == wStatus)
   1311         {
   1312            /* Set the obtained device handle to download module */
   1313            phDnldNfc_SetHwDevHandle();
   1314         }
   1315         else
   1316         {
   1317             wStatus = NFCSTATUS_FAILED;
   1318         }
   1319 
   1320         if(NFCSTATUS_SUCCESS == wStatus)
   1321         {
   1322             pAddr = (uint8_t *)&wAddr;
   1323 
   1324             wRdAddr = (pAddr[3]);
   1325             wRdAddr <<= 8;
   1326             wRdAddr |= (pAddr[2]);
   1327             wRdAddr <<= 8;
   1328             wRdAddr |= (pAddr[1]);
   1329             wRdAddr <<= 8;
   1330             wRdAddr |= (pAddr[0]);
   1331 
   1332             Data.pBuff = bRdData;
   1333             Data.wLen = sizeof(bRdData);
   1334             UserCb = pNotify;
   1335             UserCtxt = pContext;
   1336 
   1337             wStatus = phDnldNfc_Read(&Data, wRdAddr,(pphDnldNfc_RspCb_t)phDnldNfc_ReadComplete,gpphDnldContext);
   1338         }
   1339         else
   1340         {
   1341             Data.pBuff = NULL;
   1342             Data.wLen = 0;
   1343             wStatus = NFCSTATUS_FAILED;
   1344         }
   1345 
   1346         if(NFCSTATUS_PENDING == wStatus)
   1347         {
   1348             NXPLOG_FWDNLD_D("Read Request submitted successfully..");
   1349         }
   1350         else
   1351         {
   1352             NXPLOG_FWDNLD_E("Read Request submission failed!!");
   1353         }
   1354     }
   1355 
   1356     return wStatus;
   1357 }
   1358 
   1359 /*******************************************************************************
   1360 **
   1361 ** Function         phDnldNfc_ReadComplete
   1362 **
   1363 ** Description      Read complete
   1364 **
   1365 ** Parameters       pContext - caller layer context
   1366 **                  status   - status of the transaction
   1367 **                  pInfo    - transaction info
   1368 **
   1369 ** Returns          None
   1370 **
   1371 *******************************************************************************/
   1372 static void phDnldNfc_ReadComplete(void* pContext,NFCSTATUS status,void* pInfo)
   1373 {
   1374     NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
   1375     UNUSED(pContext);
   1376 
   1377     /* Call Tml Ioctl to enable/restore normal mode */
   1378     wStatus = phTmlNfc_IoCtl(phTmlNfc_e_EnableNormalMode);
   1379 
   1380     if(NFCSTATUS_SUCCESS == wStatus)
   1381     {
   1382         NXPLOG_FWDNLD_D("Read Done!!");
   1383     }
   1384 
   1385     UserCb(&UserCtxt,status,pInfo);
   1386 
   1387     return;
   1388 }
   1389 
   1390 /*******************************************************************************
   1391 **
   1392 ** Function         phDnldNfc_Read
   1393 **
   1394 ** Description      Retrieves requested data of specified length from desired EEPROM address
   1395 **
   1396 ** Parameters       pData    - response buffer which gets updated with data from EEPROM
   1397 **                  dwRdAddr - EEPROM address for data read
   1398 **                  pNotify  - notify caller after getting response
   1399 **                  pContext - caller context
   1400 **
   1401 ** Returns          NFC status:
   1402 **                  NFCSTATUS_SUCCESS     - Read request to NFCC is successful
   1403 **                  NFCSTATUS_FAILED      - Read request failed due to internal error
   1404 **                  NFCSTATUS_NOT_ALLOWED - command not allowed
   1405 **                  Other command specific errors                -
   1406 **
   1407 *******************************************************************************/
   1408 NFCSTATUS phDnldNfc_Read(pphDnldNfc_Buff_t pData, uint32_t dwRdAddr, pphDnldNfc_RspCb_t pNotify, void *pContext)
   1409 {
   1410     NFCSTATUS   wStatus = NFCSTATUS_SUCCESS;
   1411 
   1412     if((NULL == pNotify) || (NULL == pData) ||
   1413        (NULL == pContext)
   1414        )
   1415     {
   1416         NXPLOG_FWDNLD_E("Invalid Input Parameters!!");
   1417         wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
   1418     }
   1419     else
   1420     {
   1421         if(phDnldNfc_TransitionIdle != gpphDnldContext->tDnldInProgress)
   1422         {
   1423             NXPLOG_FWDNLD_E("Dnld Cmd Request in Progress..Cannot Continue!!");
   1424             wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_BUSY);
   1425         }
   1426         else
   1427         {
   1428             if((NULL != pData->pBuff) && (0 != pData->wLen))
   1429             {
   1430                 (gpphDnldContext->tCmdId) = PH_DL_CMD_READ;
   1431                 (gpphDnldContext->FrameInp.Type) = phDnldNfc_FTRead;
   1432                 (gpphDnldContext->FrameInp.dwAddr) = dwRdAddr;
   1433                 (gpphDnldContext->tRspBuffInfo.pBuff) = pData->pBuff;
   1434                 (gpphDnldContext->tRspBuffInfo.wLen) = pData->wLen;
   1435                 (gpphDnldContext->tUserData.pBuff) = NULL;
   1436                 (gpphDnldContext->tUserData.wLen) = 0;
   1437                 (gpphDnldContext->UserCb) = pNotify;
   1438                 (gpphDnldContext->UserCtxt) = pContext;
   1439 
   1440                 memset(&(gpphDnldContext->tRWInfo),0,sizeof(gpphDnldContext->tRWInfo));
   1441 
   1442                 wStatus = phDnldNfc_CmdHandler(gpphDnldContext,phDnldNfc_EventRead);
   1443 
   1444                 if(NFCSTATUS_PENDING == wStatus)
   1445                 {
   1446                     NXPLOG_FWDNLD_D("Read Request submitted successfully");
   1447                 }
   1448                 else
   1449                 {
   1450                     NXPLOG_FWDNLD_E("Read Request Failed!!");
   1451                 }
   1452             }
   1453             else
   1454             {
   1455                 NXPLOG_FWDNLD_E("Invalid Buff Parameters!!");
   1456                 wStatus = PHNFCSTVAL(CID_NFC_DNLD, NFCSTATUS_INVALID_PARAMETER);
   1457             }
   1458         }
   1459     }
   1460 
   1461     return wStatus;
   1462 }
   1463 #endif
   1464