153 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			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);
 | 
						|
    }
 | 
						|
}
 |