main
Default mainpagebasic-internalflash-projectmain
Description Source Call Graph
Start Line: 168
int main(void)
{
    unsigned int i;
    unsigned char error;
    unsigned int pBuffer[AT91C_IFLASH_PAGE_SIZE / 4];
    unsigned int lastPageAddress;
    volatile unsigned int *pLastPageData;
    unsigned char pageLocked;

    TRACE_CONFIGURE(DBGU_STANDARD, 115200, BOARD_MCK);
    printf("-- Basic Internal Flash Project %s --\n\r", SOFTPACK_VERSION);
    printf("-- %s\n\r", BOARD_NAME);
    printf("-- Compiled: %s %s --\n\r", __DATE__, __TIME__);

    // Initialize flash driver
    FLASHD_Initialize(BOARD_MCK);

    // Unlock whole flash
    printf("-I- Unlocking the whole flash\n\r");
#if defined(at91sam7a3)
    error = FLASHD_Unlock(AT91C_IFLASH, AT91C_IFLASH + 64 * 1024, 0, 0);
#else
    error = FLASHD_Unlock(AT91C_IFLASH, AT91C_IFLASH + AT91C_IFLASH_SIZE, 0, 0);
#endif
    ASSERT(!error, "-F- Error while trying to unlock the whole flash (0x%02X)\n\r", error);

    // Performs tests on last page (to avoid overriding existing program).
    lastPageAddress = AT91C_IFLASH + AT91C_IFLASH_SIZE - AT91C_IFLASH_PAGE_SIZE;
    pLastPageData = (volatile unsigned int *) lastPageAddress;

    // Write page with walking bit pattern (0x00000001, 0x00000002, ...)
    printf("-I- Writing last page with walking bit pattern\n\r");
    for (i=0; i < (AT91C_IFLASH_PAGE_SIZE / 4); i++) {

        pBuffer[i] = 1 << (i % 32);
    }
    error = FLASHD_Write(lastPageAddress, pBuffer, AT91C_IFLASH_PAGE_SIZE);
    ASSERT(!error, "-F- Error when trying to write page (0x%02X)\n\r", error);

    // Check page contents
    printf("-I- Checking page contents ");
    for (i=0; i < (AT91C_IFLASH_PAGE_SIZE / 4); i++) {

        printf(".");
        ASSERT(pLastPageData[i] == (1 << (i % 32)),
               "\n\r-F- Expected 0x%08X at address 0x%08X, found 0x%08X\n\r",
               (1 << (i % 32)), (unsigned int) &(pLastPageData[i]), pLastPageData[i]);
    }
    printf(" ok \n\r");

#if defined(at91sam7a3)
    // Only the first 64Kb can be locked in the SAM7A3
    lastPageAddress = AT91C_IFLASH + (64*1024) - AT91C_IFLASH_PAGE_SIZE;
#endif

    // Lock page
    printf("-I- Locking last page\n\r");
    error = FLASHD_Lock(lastPageAddress, lastPageAddress + AT91C_IFLASH_PAGE_SIZE, 0, 0);
    ASSERT(!error, "-F- Error when trying to lock page (0x%02X)\n\r", error);

    // Check that associated region is locked
    printf("-I- Checking lock status ... ");
    pageLocked = FLASHD_IsLocked(lastPageAddress, lastPageAddress + AT91C_IFLASH_PAGE_SIZE);
    ASSERT(pageLocked, "\n\r-F- Page is not locked\n\r");
    printf("ok\n\r");

    // Unlock page
    printf("-I- Unlocking last page\n\r");
    error = FLASHD_Unlock(lastPageAddress, lastPageAddress + AT91C_IFLASH_PAGE_SIZE, 0, 0);
    ASSERT(!error, "-F- Error when trying to unlock page (0x%02X)\n\r", error);

    // Check that associated region is unlocked
    printf("-I- Checking lock status ... ");
    pageLocked = FLASHD_IsLocked(lastPageAddress, lastPageAddress + AT91C_IFLASH_PAGE_SIZE);
    ASSERT(!pageLocked, "\n\r-F- Page is locked\n\r");
    printf("ok\n\r");

#if (EFC_NUM_GPNVMS > 0)
    // Test GPNVM bit #1 (should be safe)
    if (FLASHD_IsGPNVMSet(1)) {

        printf("-I- GPNVM #1 is set\n\r");

        // Clear GPNVM
        printf("-I- Clearing GPNVM #%d\n\r", 1);
        error = FLASHD_ClearGPNVM(1);
        ASSERT(!error, "-F- Error while trying to clear GPNVM (0x%02X)\n\r", error);
        ASSERT(!FLASHD_IsGPNVMSet(1), "-F- GPNVM is set\n\r");

        // Set GPNVM
        printf("-I- Setting GPNVM #%d\n\r", 1);
        error = FLASHD_SetGPNVM(1);
        ASSERT(!error, "-F- Error while trying to set GPNVM (0x%02X)\n\r", error);
        ASSERT(FLASHD_IsGPNVMSet(1), "-F- GPNVM is not set\n\r");

    }
    else {

        printf("-I- GPNVM #1 is cleared\n\r");

        // Set GPNVM
        printf("-I- Setting GPNVM #%d\n\r", 1);
        error = FLASHD_SetGPNVM(1);
        ASSERT(!error, "-F- Error while trying to set GPNVM (0x%02X)\n\r", error);
        ASSERT(FLASHD_IsGPNVMSet(1), "-F- GPNVM is not set\n\r");

        // Clear GPNVM
        printf("-I- Clearing GPNVM #%d\n\r", 1);
        error = FLASHD_ClearGPNVM(1);
        ASSERT(!error, "-F- Error while trying to clear GPNVM (0x%02X)\n\r", error);
        ASSERT(!FLASHD_IsGPNVMSet(1), "-F- GPNVM is set\n\r");
    }
#endif

    printf("-I- All tests ok\n\r");
    return 0;
}