/** * * This function verifies the locking and unlocking features of the Flash device. * * @param None * * @return XST_SUCCESS if successful else XST_FAILURE. * * @note None. * ******************************************************************************/ int FlashProtectionExample(void) { int Status; u32 Index; char temp[120]; /* * Initialize the Flash Library. */ Status = XFlash_Initialize(&FlashInstance, FLASH_BASE_ADDRESS, FLASH_MEM_WIDTH, 0); if(Status != XST_SUCCESS) { xil_printf("-- Fail at Initialize --\r\n"); if(logenable==1) strcat(logbuf, "-- Fail at Initialize --\r\n"); return XST_FAILURE; } xil_printf("-- Initialized the Flash library successfully --\r\n"); if(logenable==1) strcat(logbuf, "-- Initialized the Flash library successfully --\r\n"); /* * Reset the Flash Device. This clears the Status registers and puts * the device in Read mode. */ Status = XFlash_Reset(&FlashInstance); if(Status != XST_SUCCESS) { xil_printf("-- Fail at reset --\r\n"); if(logenable==1) strcat(logbuf, "-- Fail at reset --\r\n"); return XST_FAILURE; } /* * Lock the Block. */ Status = XFlash_Lock(&FlashInstance, BLOCK_OFFSET_ADDR, 0); if(Status != XST_SUCCESS) { xil_printf("-- Lock error --\r\n"); if(logenable==1) strcat(logbuf, "-- Lock error --\r\n"); return XST_FAILURE; } xil_printf("-- Locked all the blocks successfully --\r\n"); if(logenable==1) strcat(logbuf, "-- Locked all the blocks successfully --\r\n"); /* * Perform the Erase operation. This should fail as the block is locked. */ Status = XFlash_Erase(&FlashInstance, START_ADDRESS, FLASH_TEST_SIZE); if(Status == XST_SUCCESS) { xil_printf("-- Erase failed --\r\n"); if(logenable==1) strcat(logbuf, "-- Erase failed --\r\n"); return XST_FAILURE; } xil_printf("-- Erased the Flash memory contents at offset 0x%07x successfully --\r\n", START_ADDRESS); if(logenable==1) { sprintf(temp, "-- Erased the Flash memory contents at offset 0x%07x successfully --\r\n", START_ADDRESS); strcat(logbuf, temp); } /* * Unlock the Block. */ Status = XFlash_Unlock(&FlashInstance, BLOCK_OFFSET_ADDR, 0); if(Status != XST_SUCCESS) { return XST_FAILURE; } xil_printf("-- Unlocked all the blocks successfully --\r\n"); if(logenable==1) strcat(logbuf, "-- Unlocked all the blocks successfully --\r\n"); /* * Perform the Erase operation. This should succeed as the block is * unlocked. */ Status = XFlash_Erase(&FlashInstance, START_ADDRESS, FLASH_TEST_SIZE); if(Status != XST_SUCCESS) { return XST_FAILURE; } /* * Prepare the write buffer. Fill in the data need to be written into * Flash Device. */ xil_printf("-- Writing: "); if(logenable==1) strcat(logbuf, "-- Writing: "); for(Index = 0; Index < FLASH_TEST_SIZE; Index++) { WriteBuffer[Index] = (u8)Index; xil_printf("%02x", WriteBuffer[Index]); if(logenable==1) { sprintf(temp, "%02x", WriteBuffer[Index]); strcat(logbuf, temp); } } xil_printf("\r\n"); if(logenable==1) strcat(logbuf, "\r\n"); /* * Perform the Write operation. */ Status = XFlash_Write(&FlashInstance, START_ADDRESS, FLASH_TEST_SIZE, WriteBuffer); if(Status != XST_SUCCESS) { return XST_FAILURE; } xil_printf("-- Write operation at offset 0x%07x completed successfully --\r\n", START_ADDRESS); if(logenable==1) { sprintf(temp, "-- Write operation at offset 0x%07x completed successfully --\r\n", START_ADDRESS); strcat(logbuf, temp); } /* * Perform the read operation. */ Status = XFlash_Read(&FlashInstance, START_ADDRESS, FLASH_TEST_SIZE, ReadBuffer); if(Status != XST_SUCCESS) { return XST_FAILURE; } xil_printf("-- Read operation completed successfully --\r\n"); if(logenable==1) strcat(logbuf, "-- Read operation completed successfully --\r\n"); /* * Compare the data read against the data Written. */ for(Index = 0; Index < FLASH_TEST_SIZE; Index++) { if(ReadBuffer[Index] != (u8)Index) { return XST_FAILURE; } } xil_printf("-- Data comparison successful --\r\n"); if(logenable==1) strcat(logbuf, "-- Data comparison successful --\r\n"); return XST_SUCCESS; }
/** * * This function verifies the locking and unlocking features of the Flash device. * * @param None * * @return XST_SUCCESS if successful else XST_FAILURE. * * @note None. * ******************************************************************************/ int FlashProtectionExample(void) { int Status; u32 Index; #ifdef XPAR_XFL_DEVICE_FAMILY_INTEL #if XFL_TO_ASYNCMODE /* * Set Flash to Async mode. */ if (FLASH_MEM_WIDTH == 1) { WRITE_FLASH_8(FLASH_BASE_ADDRESS + ASYNC_ADDR, 0x60); WRITE_FLASH_8(FLASH_BASE_ADDRESS + ASYNC_ADDR, 0x03); } else if (FLASH_MEM_WIDTH == 2) { WRITE_FLASH_16(FLASH_BASE_ADDRESS + ASYNC_ADDR, INTEL_CMD_CONFIG_REG_SETUP); WRITE_FLASH_16(FLASH_BASE_ADDRESS + ASYNC_ADDR, INTEL_CMD_CONFIG_REG_CONFIRM); } #endif #endif /* * Initialize the Flash Library. */ Status = XFlash_Initialize(&FlashInstance, FLASH_BASE_ADDRESS, FLASH_MEM_WIDTH, 0); if(Status != XST_SUCCESS) { return XST_FAILURE; } /* * Reset the Flash Device. This clears the Status registers and puts * the device in Read mode. */ Status = XFlash_Reset(&FlashInstance); if(Status != XST_SUCCESS) { return XST_FAILURE; } /* * Lock the Block. */ Status = XFlash_Lock(&FlashInstance, BLOCK_OFFSET_ADDR, 0); if(Status != XST_SUCCESS) { return XST_FAILURE; } /* * Perform the Erase operation. This should fail as the block is locked. */ Status = XFlash_Erase(&FlashInstance, START_ADDRESS, FLASH_TEST_SIZE); if(Status == XST_SUCCESS) { return XST_FAILURE; } /* * Unlock the Block. */ Status = XFlash_Unlock(&FlashInstance, BLOCK_OFFSET_ADDR, 0); if(Status != XST_SUCCESS) { return XST_FAILURE; } /* * Perform the Erase operation. This should succeed as the block is * unlocked. */ Status = XFlash_Erase(&FlashInstance, START_ADDRESS, FLASH_TEST_SIZE); if(Status != XST_SUCCESS) { return XST_FAILURE; } /* * Prepare the write buffer. Fill in the data need to be written into * Flash Device. */ for(Index = 0; Index < FLASH_TEST_SIZE; Index++) { WriteBuffer[Index] = (u8)Index; } /* * Perform the Write operation. */ Status = XFlash_Write(&FlashInstance, START_ADDRESS, FLASH_TEST_SIZE, WriteBuffer); if(Status != XST_SUCCESS) { return XST_FAILURE; } /* * Perform the read operation. */ Status = XFlash_Read(&FlashInstance, START_ADDRESS, FLASH_TEST_SIZE, ReadBuffer); if(Status != XST_SUCCESS) { return XST_FAILURE; } /* * Compare the data read against the data Written. */ for(Index = 0; Index < FLASH_TEST_SIZE; Index++) { if(ReadBuffer[Index] != (u8)Index) { return XST_FAILURE; } } return XST_SUCCESS; }