//------------------------------------------------------------------------------ /// Returns the number of locked regions inside the given address range. /// \param start Start address of range. /// \param end End address of range. //------------------------------------------------------------------------------ unsigned char FLASHD_IsLocked(unsigned int start, unsigned int end) { AT91S_EFC *pEfc; unsigned short startPage, endPage; unsigned char startRegion, endRegion; unsigned int numPagesInRegion; unsigned int status; unsigned char error; unsigned int numLockedRegions = 0; SANITY_CHECK(end >= start); #ifdef AT91C_BASE_EFC1 // Convert wrapped address to physical address. start &= 0x19FFFF; end &= 0x19FFFF; // Check EFC crossover 2 bank SANITY_CHECK(((start >=AT91C_IFLASH) && (end <= AT91C_IFLASH + AT91C_IFLASH_SIZE)) || ((start >=AT91C_IFLASH1) && (end <= AT91C_IFLASH1 + AT91C_IFLASH1_SIZE))); #else SANITY_CHECK((start >=AT91C_IFLASH) && (end <= AT91C_IFLASH + AT91C_IFLASH_SIZE)); #endif // Compute page numbers EFC_TranslateAddress(&pEfc, start, &startPage, 0); EFC_TranslateAddress(0, end, &endPage, 0); // Compute region numbers numPagesInRegion = AT91C_IFLASH_LOCK_REGION_SIZE / AT91C_IFLASH_PAGE_SIZE; startRegion = startPage / numPagesInRegion; endRegion = endPage / numPagesInRegion; if ((endPage % numPagesInRegion) != 0) { endRegion++; } // Retrieve lock status error = EFC_PerformCommand(pEfc, AT91C_EFC_FCMD_GLB, 0); ASSERT(!error, "-F- Error while trying to fetch lock bits status (0x%02X)\r\n", error); status = EFC_GetResult(pEfc); // Check status of each involved region while (startRegion < endRegion) { if ((status & (1 << startRegion)) != 0) { numLockedRegions++; } startRegion++; } return numLockedRegions; }
/** * \brief Returns the number of locked regions inside the given address range. * * \param start Start address of range * \param end End address of range. */ extern uint32_t FLASHD_IsLocked( uint32_t start, uint32_t end ) { uint32_t i, j; Efc *pEfc ; uint16_t startPage, endPage ; uint8_t startRegion, endRegion ; uint32_t numPagesInRegion ; uint32_t status[IFLASH_NB_OF_LOCK_BITS / 32u] ; uint32_t numLockedRegions = 0 ; assert( end >= start ) ; assert( (start >=IFLASH_ADDR) && (end <= IFLASH_ADDR + IFLASH_SIZE) ) ; /* Compute page numbers */ EFC_TranslateAddress( &pEfc, start, &startPage, 0 ) ; EFC_TranslateAddress( 0, end, &endPage, 0 ) ; /* Compute region numbers */ numPagesInRegion = IFLASH_LOCK_REGION_SIZE / IFLASH_PAGE_SIZE ; startRegion = startPage / numPagesInRegion ; endRegion = endPage / numPagesInRegion ; if ((endPage % numPagesInRegion) != 0) { endRegion++ ; } /* Retrieve lock status */ EFC_PerformCommand( pEfc, EFC_FCMD_GLB, 0, _dwUseIAP ) ; for (i = 0; i < (IFLASH_NB_OF_LOCK_BITS / 32u); i++) { status[i] = EFC_GetResult( pEfc ) ; } /* Check status of each involved region */ while ( startRegion < endRegion ) { i = startRegion / 32u; j = startRegion % 32u; if ( (status[i] & (1 << j)) != 0 ) { numLockedRegions++ ; } startRegion++ ; } return numLockedRegions ; }
/** * \brief Returns the number of locked regions inside the given address range. * * \param start Start address of range * \param end End address of range. */ extern uint32_t FLASHD_IsLocked( uint32_t start, uint32_t end ) { const uint32_t IFLASH_PAGE_SIZE = IS_SAM3() ? IFLASH_PAGE_SIZE_SAM3 : IFLASH_PAGE_SIZE_SAM4; const uint32_t IFLASH_LOCK_REGION_SIZE = IS_SAM3() ? IFLASH_LOCK_REGION_SIZE_SAM3 : IFLASH_LOCK_REGION_SIZE_SAM4; Efc *pEfc ; uint16_t startPage, endPage ; uint8_t startRegion, endRegion ; uint32_t numPagesInRegion ; uint32_t status ; __attribute__((unused)) uint32_t dwError ; uint32_t numLockedRegions = 0 ; assert( end >= start ) ; assert( (start >=IFLASH_ADDR) && (end <= IFLASH_ADDR + IFLASH_SIZE) ) ; // Compute page numbers EFC_TranslateAddress( &pEfc, start, &startPage, 0 ) ; EFC_TranslateAddress( 0, end, &endPage, 0 ) ; // Compute region numbers numPagesInRegion = IFLASH_LOCK_REGION_SIZE / IFLASH_PAGE_SIZE ; startRegion = startPage / numPagesInRegion ; endRegion = endPage / numPagesInRegion ; if ((endPage % numPagesInRegion) != 0) { endRegion++ ; } // Retrieve lock status dwError = EFC_PerformCommand( pEfc, EFC_FCMD_GLB, 0, _dwUseIAP ) ; assert( !dwError ) ; status = EFC_GetResult( pEfc ) ; // Check status of each involved region while ( startRegion < endRegion ) { if ( (status & (1 << startRegion)) != 0 ) { numLockedRegions++ ; } startRegion++ ; } return numLockedRegions ; }
/** * \brief Check if the given GPNVM bit is set or not. * * \param gpnvm GPNVM bit index. * \returns 1 if the given GPNVM bit is currently set; otherwise returns 0. */ extern uint32_t FLASHD_IsGPNVMSet( uint8_t ucGPNVM ) { uint32_t dwStatus ; assert( ucGPNVM < GPNVM_NUM_MAX ) ; /* Get GPNVMs status */ EFC_PerformCommand( EFC, EFC_FCMD_GFB, 0, _dwUseIAP ) ; dwStatus = EFC_GetResult( EFC ) ; /* Check if GPNVM is set */ if ( (dwStatus & (1 << ucGPNVM)) != 0 ) { return 1 ; } else { return 0 ; } }
//------------------------------------------------------------------------------ /// Returns 1 if the given GPNVM bit is currently set; otherwise returns 0. /// \param gpnvm GPNVM bit index. //------------------------------------------------------------------------------ unsigned char FLASHD_IsGPNVMSet(unsigned char gpnvm) { unsigned char error; unsigned int status; SANITY_CHECK(gpnvm < EFC_NUM_GPNVMS); // Get GPNVMs status error = EFC_PerformCommand(AT91C_EFC_FCMD_GFB, 0); ASSERT(!error, "-F- Error while trying to fetch GPNVMs status (0x%02X)\n\r", error); status = EFC_GetResult(); // Check if GPNVM is set if ((status & (1 << gpnvm)) != 0) { return 1; } else { return 0; } }
//------------------------------------------------------------------------------ /// Returns the number of locked regions inside the given address range. /// \param start Start address of range. /// \param end End address of range. //------------------------------------------------------------------------------ unsigned char FLASHD_IsLocked(unsigned int start, unsigned int end) { unsigned short startPage, endPage; unsigned char startRegion, endRegion; unsigned int numPagesInRegion; unsigned int status; unsigned char error; unsigned int numLockedRegions = 0; // Compute page numbers EFC_TranslateAddress(start, &startPage, 0); EFC_TranslateAddress(end, &endPage, 0); // Compute region numbers numPagesInRegion = AT91C_IFLASH_LOCK_REGION_SIZE / AT91C_IFLASH_PAGE_SIZE; startRegion = startPage / numPagesInRegion; endRegion = endPage / numPagesInRegion; if ((endPage % numPagesInRegion) != 0) { endRegion++; } // Retrieve lock status error = EFC_PerformCommand(AT91C_EFC_FCMD_GLB, 0); ASSERT(!error, "-F- Error while trying to fetch lock bits status (0x%02X)\n\r", error); status = EFC_GetResult(); // Check status of each involved region while (startRegion < endRegion) { if ((status & (1 << startRegion)) != 0) { numLockedRegions++; } startRegion++; } return numLockedRegions; }
/** * \brief Check if the given GPNVM bit is set or not. * * \param gpnvm GPNVM bit index. * \returns 1 if the given GPNVM bit is currently set; otherwise returns 0. */ extern uint32_t FLASHD_IsGPNVMSet( uint8_t ucGPNVM ) { __attribute__((unused)) uint32_t dwError ; uint32_t dwStatus ; assert( ucGPNVM < 2 ) ; /* Get GPNVMs status */ dwError = EFC_PerformCommand( EFC, EFC_FCMD_GFB, 0, _dwUseIAP ) ; assert( !dwError ) ; dwStatus = EFC_GetResult( EFC ) ; /* Check if GPNVM is set */ if ( (dwStatus & (1 << ucGPNVM)) != 0 ) { return 1 ; } else { return 0 ; } }