Files
kunlun/dtest/flash_life_test/flash_life_test.c
2024-09-28 14:24:04 +08:00

153 lines
3.8 KiB
C
Executable File

#include "os_types.h"
#include "dbg_io.h"
#include "iot_io.h"
#include "flash.h"
#include "sfc.h"
#include "os_mem.h"
#include "iot_errno_api.h"
#define IOT_FLASH_TEST_PRINT_CYCLE 50
#define IOT_FLASH_TEST_DATA_LEN 1024
#define IOT_FLASH_TEST_PAGE_LEN 256
#define IOT_FLASH_TEST_SECTOR_LEN 4096
#define IOT_FLASH_TEST_OFFSET_TABLE {0x00009000}
uint8_t wbuf[IOT_FLASH_TEST_DATA_LEN];
uint8_t ebuf[IOT_FLASH_TEST_DATA_LEN];
uint8_t rbuf[IOT_FLASH_TEST_DATA_LEN];
void iot_flash_test_dump(char *buf, uint32_t len)
{
uint32_t *p_data = (uint32_t *)buf, i;
for (i = 0; i < len; i += 4) {
if (0 == (i % 16)) {
iot_printf("\r\n");
}
iot_printf("%08x ",p_data++);
}
return;
}
void iot_flash_test_write(uint8_t *buf, uint32_t offset, uint32_t buf_len)
{
uint32_t len = buf_len, w_size, s_offset = offset;
while(len > 0) {
w_size = len > IOT_FLASH_TEST_PAGE_LEN ? IOT_FLASH_TEST_PAGE_LEN : len;
g_sfc_ctrl->write(buf, s_offset, w_size, MOD_SFC_PROG_STAND, MOD_SW_MODE_DIS);
len -= w_size;
s_offset += w_size;
buf += w_size;
}
return;
}
void iot_flash_test_read(uint8_t *buf, uint32_t offset, uint32_t buf_len)
{
uint32_t len = buf_len, r_size, s_offset = offset;
while(len > 0) {
r_size = len > IOT_FLASH_TEST_PAGE_LEN ? IOT_FLASH_TEST_PAGE_LEN : len;
g_sfc_ctrl->read(buf, s_offset, r_size, MOD_SFC_READ_SIG);
len -= r_size;
s_offset += r_size;
buf += r_size;
}
return;
}
void iot_flash_test_erase(uint32_t offset, uint32_t min_len)
{
uint32_t e_offset = offset + min_len;
while(e_offset > offset) {
g_sfc_ctrl->erase_sector(offset, MOD_SW_MODE_DIS);
offset += IOT_FLASH_TEST_SECTOR_LEN;
}
return;
}
uint32_t iot_flash_test_mem_cmp_int32(void *src1, void *src2, uint32_t len_bytes)
{
uint32_t *p1 = src1, *p2 = src2, *end = (p1 + len_bytes / sizeof(*p1));
while (p1 < end) {
if (*p1++ != *p2++) {
return 1;
}
}
return 0;
}
uint32_t iot_flash_test_write_cycle(uint32_t offset)
{
iot_flash_test_erase(offset, IOT_FLASH_TEST_DATA_LEN);
iot_flash_test_read(rbuf, offset, IOT_FLASH_TEST_DATA_LEN);
if (iot_flash_test_mem_cmp_int32(ebuf, rbuf, IOT_FLASH_TEST_DATA_LEN)) {
iot_printf("\r\nErase failed, offset = %p.\r\nData read :", offset);
iot_flash_test_dump((char*)rbuf, IOT_FLASH_TEST_DATA_LEN);
return ERR_FAIL;
}
iot_flash_test_write(wbuf,offset, IOT_FLASH_TEST_DATA_LEN);
iot_flash_test_read(rbuf, offset, IOT_FLASH_TEST_DATA_LEN);
if (iot_flash_test_mem_cmp_int32(wbuf, rbuf, IOT_FLASH_TEST_DATA_LEN)) {
iot_printf("\r\nWrite failed, offset = %p.\r\nData read :", offset);
iot_flash_test_dump((char*)rbuf, IOT_FLASH_TEST_DATA_LEN);
return ERR_FAIL;
}
return ERR_OK;
}
void iot_flash_test_cpu_delay(uint32_t ms)
{
volatile uint32_t delay = 7500 * ms, tmp = 0;
while (--delay) tmp += delay;
return;
}
int main(void)
{
uint32_t test_offset[]=IOT_FLASH_TEST_OFFSET_TABLE, i, block_cnt, cycle = 0;
dbg_uart_init();
flash_init(1);
os_mem_set(ebuf, 0xFF, IOT_FLASH_TEST_DATA_LEN);
os_mem_set(wbuf, 0xA5, IOT_FLASH_TEST_DATA_LEN);
block_cnt = (sizeof(test_offset) / sizeof(test_offset[0]));
while(1) {
for (i = 0; i < block_cnt; i++) {
if (ERR_OK != iot_flash_test_write_cycle(test_offset[i])) {
goto endness_loop;
}
}
cycle++;
if (0 == (cycle % IOT_FLASH_TEST_PRINT_CYCLE)) {
iot_printf("\r\nCycle %d passed.", cycle);
}
}
endness_loop:
while(1) {
iot_flash_test_cpu_delay(2000);
iot_printf("\r\nTEST STOPED @ ERROR BLOCK %p, CYCLE = %u.",
test_offset[i], cycle);
}
}