/** * \brief Unlocks all the regions in the given address range. The actual unlock range is * reported through two output parameters. * \param start Start address of unlock range. * \param end End address of unlock range. * \param pActualStart Start address of the actual unlock range (optional). * \param pActualEnd End address of the actual unlock range (optional). * \return 0 if successful, otherwise returns an error code. */ extern uint32_t FLASHD_Unlock( uint32_t start, uint32_t end, uint32_t *pActualStart, uint32_t *pActualEnd ) { Efc* pEfc ; uint32_t actualStart, actualEnd ; uint16_t startPage, endPage ; uint32_t dwError ; uint16_t numPagesInRegion = IFLASH_LOCK_REGION_SIZE / IFLASH_PAGE_SIZE; /* Compute actual unlock range and store it */ ComputeLockRange(start, end, &actualStart, &actualEnd); if ( pActualStart != NULL ) { *pActualStart = actualStart ; } if ( pActualEnd != NULL ) { *pActualEnd = actualEnd ; } /* Compute page numbers */ EFC_TranslateAddress( &pEfc, actualStart, &startPage, 0 ) ; EFC_TranslateAddress( 0, actualEnd, &endPage, 0 ) ; /* Unlock all pages */ while ( startPage < endPage ) { dwError = EFC_PerformCommand( pEfc, EFC_FCMD_CLB, startPage, _dwUseIAP ) ; if ( dwError ) { return dwError ; } startPage += numPagesInRegion ; } return 0 ; }
//------------------------------------------------------------------------------ /// Unlocks all the regions in the given address range. The actual unlock range is /// reported through two output parameters. /// Returns 0 if successful; otherwise returns an error code. /// \param start Start address of unlock range. /// \param end End address of unlock range. /// \param pActualStart Start address of the actual unlock range (optional). /// \param pActualEnd End address of the actual unlock range (optional). //------------------------------------------------------------------------------ unsigned char FLASHD_Unlock( unsigned int start, unsigned int end, unsigned int *pActualStart, unsigned int *pActualEnd) { AT91S_EFC *pStartEfc, *pEndEfc, *pEfc; unsigned int actualStart, actualEnd; unsigned short startPage, endPage; unsigned char error; unsigned short numPagesInRegion = AT91C_IFLASH_LOCK_REGION_SIZE / AT91C_IFLASH_PAGE_SIZE; // Compute actual unlock range and store it ComputeLockRange(start, end, &actualStart, &actualEnd); if (pActualStart) { *pActualStart = actualStart; } if (pActualEnd) { *pActualEnd = actualEnd; } // Compute page numbers EFC_TranslateAddress(&pStartEfc, actualStart, &startPage, 0); EFC_TranslateAddress(&pEndEfc, actualEnd, &endPage, 0); // Unlock all pages // If there is an EFC crossover, unlock all pages from first EFC #if defined(AT91C_BASE_EFC1) if (pStartEfc != pEndEfc) { while (startPage < (AT91C_IFLASH_NB_OF_PAGES / 2)) { error = EFC_PerformCommand(pStartEfc, AT91C_MC_FCMD_UNLOCK, startPage); if (error) { return error; } startPage += numPagesInRegion; } startPage = 0; } #endif pEfc = pEndEfc; // Unlock remaining pages while (startPage < endPage) { error = EFC_PerformCommand(pEfc, AT91C_MC_FCMD_UNLOCK, startPage); if (error) { return error; } startPage += numPagesInRegion; } return 0; }
//------------------------------------------------------------------------------ /// Unlocks all the regions in the given address range. The actual unlock range is /// reported through two output parameters. /// Returns 0 if successful; otherwise returns an error code. /// \param start Start address of unlock range. /// \param end End address of unlock range. /// \param pActualStart Start address of the actual unlock range (optional). /// \param pActualEnd End address of the actual unlock range (optional). //------------------------------------------------------------------------------ unsigned char FLASHD_Unlock( unsigned int start, unsigned int end, unsigned int *pActualStart, unsigned int *pActualEnd) { AT91S_EFC *pEfc; unsigned int actualStart, actualEnd; unsigned short startPage, endPage; unsigned char error; unsigned short numPagesInRegion = AT91C_IFLASH_LOCK_REGION_SIZE / AT91C_IFLASH_PAGE_SIZE; // Compute actual unlock range and store it ComputeLockRange(start, end, &actualStart, &actualEnd); if (pActualStart) { *pActualStart = actualStart; } if (pActualEnd) { *pActualEnd = actualEnd; } // Compute page numbers EFC_TranslateAddress(&pEfc, actualStart, &startPage, 0); EFC_TranslateAddress(0, actualEnd, &endPage, 0); // Unlock all pages while (startPage < endPage) { error = EFC_PerformCommand(pEfc, AT91C_EFC_FCMD_CLB, startPage); if (error) { return error; } startPage += numPagesInRegion; } return 0; }