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

748 lines
18 KiB
C
Executable File

#include "os_types.h"
#include "os_task.h"
#include "os_mem.h"
#include "dbg_io.h"
#include "iot_diag.h"
#include "iot_io.h"
//#include <stdlib.h>
#include "iot_system_api.h"
#include "iot_config.h"
//#include "iot_gptmr.h"
#include "iot_system.h"
//#include "os_mem.h"
//#include "cpu.h"
//#include "os_task.h"
#include "platform.h"
#include "encoding.h"
//#include "sec_glb.h"
//#include "ahb.h"
//#include "intc.h"
#include "bits.h"
#include "os_utils.h"
#include "iot_rtc.h"
#include "chip_reg_base.h"
#include "hw_reg_api.h"
#include "iot_bitops.h"
#include "flash.h"
#include "os_lock.h"
#include "iot_config.h"
#include "ahb.h"
#include "sec_glb.h"
#if HW_PLATFORM > HW_PLATFORM_SIMU
#include "dbg_io.h"
#endif
#include "iot_io.h"
#define SFC_API_TEST 1
#if SFC_API_TEST == 1
#include "sfc.h"
#endif
#define FLASH_TEST_OFFSET (0x100000)
uint8_t rdata[0x1000] = {0};
uint8_t wdata[0x1000] = {1,2,3,4,5,6,7,8,9,0,255,254,253,252,251,250};
#include "chip_reg_base.h"
#include "hw_reg_api.h"
#include "iot_bitops.h"
#include "os_lock.h"
#include "iot_config.h"
#include "sram.h"
#include "os_mem.h"
#include "smc.h"
#if HW_PLATFORM > HW_PLATFORM_SIMU
#include "dbg_io.h"
#endif
#include "iot_io.h"
#include "ahb.h"
#include "sec_glb.h"
#define CLK 48 //16 //48
#define PSRAM_ACCSEE_WAY 0 //0:cache 1:software
extern void sfc_bus_share_en();
static int32_t iot__platform_init()
{
/*platform intialization*/
platform_init();
dbg_uart_init();
return 0;
}
void get_id_test()
{
uint8_t param[0x100] = {0};
iot_printf("[SFDP data]\n");
sfc_read_sfdp(param, 0x0, 0x4);
iot_printf("0x0: %x %x %x %x\n", param[0], param[1], param[2], param[3]);
sfc_read_sfdp(param, 0x10, 0x4);
iot_printf("0x0: %x %x %x %x\n", param[0], param[1], param[2], param[3]);
iot_printf("\n[SFC API TEST] start get id test\n");
//g_sfc_ctrl->get_dev_id(rdata);
iot_printf("Manufacturer ID:%x%x\r\n",rdata[1], rdata[0]);
sfc_qspi_get_id_mult(rdata, MOD_SFC_SERIAL);
iot_printf("Manufacturer ID:%x%x\r\n",rdata[1], rdata[0]);
sfc_qspi_get_id_mult(rdata, MOD_SFC_DUAL);
iot_printf("Manufacturer ID dual: %x%x\r\n",rdata[1], rdata[0]);
sfc_qspi_get_id_mult(rdata, MOD_SFC_QUAD);
iot_printf("Manufacturer ID quad: %x%x\r\n",rdata[1], rdata[0]);
iot_printf("[SFC API TEST] end get id test\n");
}
void get_sts_reg_test()
{
uint8_t data;
uint8_t reg = 0;
iot_printf("\n[SFC API TEST] start get status reg test\n");
g_sfc_ctrl->get_sts_reg(&data, reg);
iot_printf("get reg[%d]: %08x\n ", reg, data);
reg = 1;
g_sfc_ctrl->get_sts_reg(&data, reg);
iot_printf("get reg[%d]: %08x\n ", reg, data);
iot_printf("[SFC API TEST] end get status reg test\n");
}
void erase_test(void)
{
uint32_t i = 0, error = 0;
iot_printf("erase sector test\n");
os_mem_set(rdata,0,sizeof(rdata));
g_sfc_ctrl->erase_sector(FLASH_TEST_OFFSET, MOD_SW_MODE_DIS); //4k
for (i=0; i<0x10; i++) {
g_sfc_ctrl->read(rdata+0x100*i,(FLASH_TEST_OFFSET+0x100*i),0x100, MOD_SFC_READ_SIG); //read page 256
}
for (i=0;i<sizeof(rdata);i++) {
if (rdata[i] != 0xff) {
error++;
}
}
if (error != 0) {
iot_printf("ERROR erase sector failed\n");
} else {
iot_printf("erase sector success\n");
}
}
void write_test()
{
uint32_t i = 0,error = 0;
iot_printf("\n[SFC API TEST] start write test\n");
for (i=0; i<sizeof(wdata); i++){
wdata[i] = i;
}
//////////////////////////////////////////
iot_printf("qspi write test\n");
error = 0;
os_mem_set(rdata,0,sizeof(rdata));
//g_sfc_ctrl->erase_sector(FLASH_TEST_OFFSET, MOD_SW_MODE_DIS); //4k
erase_test();
for (i=0; i<0x10; i++) {
g_sfc_ctrl->write((wdata+0x100*i),(FLASH_TEST_OFFSET+0x100*i), 0x100,
MOD_SFC_PROG_STAND, MOD_SW_MODE_DIS); //write page 256
}
for (i=0; i<0x10; i++) {
g_sfc_ctrl->read(rdata+0x100*i,(FLASH_TEST_OFFSET+0x100*i),0x100, MOD_SFC_READ_SIG); //read page 256
}
for (i=0; i<sizeof(rdata); i++){
if (rdata[i] != i%256) {
error++;
}
}
if (error != 0) {
iot_printf("ERROR qspi write, qspi read error\n");
} else {
iot_printf("qspi write, qspi read success\n");
}
os_delay(5);
//////////////////////////////////////////
iot_printf("\n\rquad write test\n");
error = 0;
os_mem_set(rdata,0,sizeof(rdata));
// g_sfc_ctrl->erase_sector(FLASH_TEST_OFFSET, MOD_SW_MODE_DIS); //4k
erase_test();
for (i=0; i<0x10; i++) {
g_sfc_ctrl->write((wdata+0x100*i),(FLASH_TEST_OFFSET+0x100*i),0x100,
MOD_SFC_PROG_QUAD, MOD_SW_MODE_DIS);
}
for (i=0; i<0x10; i++) {
g_sfc_ctrl->read(rdata+0x100*i,(FLASH_TEST_OFFSET+0x100*i),0x100, MOD_SFC_READ_SIG); //read page 256
}
for (i=0; i<sizeof(rdata); i++){
if (rdata[i] != i%256) {
error++;
}
}
if (error != 0) {
iot_printf("ERROR quad write, quad read error\n");
} else {
iot_printf("quad write, quad read success\n");
}
os_delay(5);
iot_printf("[SFC API TEST] end write test\n");
}
void read_test()
{
uint32_t i = 0,error = 0;
iot_printf("\n[SFC API TEST] start read test\n");
iot_printf("read test\n");
os_mem_set(rdata,0,sizeof(rdata));
for (i=0; i<0x10; i++) {
g_sfc_ctrl->read(rdata+0x100*i,(FLASH_TEST_OFFSET+0x100*i),0x100, MOD_SFC_READ_SIG); //read page 256
}
for (i=0; i<sizeof(rdata); i++){
if (rdata[i] != i%256) {
error++;
}
}
if (error != 0) {
iot_printf("ERROR sig read error\n");
} else {
iot_printf("sig read success\n");
}
os_delay(5);
///////////////
error = 0;
os_mem_set(rdata,0,sizeof(rdata));
for (i=0; i<0x10; i++) {
g_sfc_ctrl->read(rdata+0x100*i,(FLASH_TEST_OFFSET+0x100*i),0x100, MOD_SFC_READ_HIGH_SPD); //read page 256
}
for (i=0; i<sizeof(rdata); i++){
if (rdata[i] != i%256) {
error++;
}
}
if (error != 0) {
iot_printf("ERROR high speed read error\n");
} else {
iot_printf("high speed read success\n");
}
os_delay(5);
//////////////
error = 0;
os_mem_set(rdata,0,sizeof(rdata));
for (i=0; i<0x10; i++) {
g_sfc_ctrl->read(rdata+0x100*i,(FLASH_TEST_OFFSET+0x100*i),0x100, MOD_SFC_READ_DUAL_FAST); //read page 256
}
for (i=0; i<sizeof(rdata); i++){
if (rdata[i] != i%256) {
error++;
}
}
if (error != 0) {
iot_printf("ERROR dual fast read error\n");
} else {
iot_printf("dual fast read success\n");
}
os_delay(5);
///////////////
error = 0;
os_mem_set(rdata,0,sizeof(rdata));
for (i=0; i<0x10; i++) {
g_sfc_ctrl->read(rdata+0x100*i,(FLASH_TEST_OFFSET+0x100*i),0x100, MOD_SFC_READ_QUAD_FAST); //read page 256
}
for (i=0; i<sizeof(rdata); i++){
if (rdata[i] != i%256) {
error++;
}
}
if (error != 0) {
iot_printf("ERROR quad fast read error\n");
} else {
iot_printf("quad fast read success\n");
}
os_delay(5);
///////////////
error = 0;
os_mem_set(rdata,0,sizeof(rdata));
for (i=0; i<0x10; i++) {
g_sfc_ctrl->read(rdata+0x100*i,(FLASH_TEST_OFFSET+0x100*i),0x100, MOD_SFC_READ_DUAL_IO_FAST); //read page 256
}
for (i=0; i<sizeof(rdata); i++){
if (rdata[i] != i%256) {
error++;
}
}
if (error != 0) {
iot_printf("ERROR dual io fast read error\n");
} else {
iot_printf("dual io fast read success\n");
}
os_delay(5);
///////////////
error = 0;
os_mem_set(rdata,0,sizeof(rdata));
for (i=0; i<0x10; i++) {
g_sfc_ctrl->read(rdata+0x100*i,(FLASH_TEST_OFFSET+0x100*i),0x100, MOD_SFC_READ_QUAD_IO_FAST); //read page 256
}
for (i=0; i<sizeof(rdata); i++){
if (rdata[i] != i%256) {
error++;
}
}
if (error != 0) {
iot_printf("ERROR quad io fast read error\n");
} else {
iot_printf("quad io fast read success\n");
}
os_delay(5);
///////////////
error = 0;
os_mem_set(rdata,0,sizeof(rdata));
for (i=0; i<0x10; i++) {
g_sfc_ctrl->read(rdata+0x100*i,(FLASH_TEST_OFFSET+0x100*i),0x100, MOD_SFC_READ_QUAD_IO_WORD_FAST); //read page 256
}
for (i=0; i<sizeof(rdata); i++){
if (rdata[i] != i%256) {
error++;
}
}
if (error != 0) {
iot_printf("ERROR quad io word fast read error\n");
} else {
iot_printf("quad io word fast read success\n");
}
os_delay(5);
iot_printf("[SFC API TEST] end read test\n");
}
void sfc_cache_read_test()
{
uint32_t i = 0,rdata = 0, error = 0;
iot_printf("\n[SFC API TEST] start cache read test\n");
iot_printf(" read flash by cache0\n");
for (i=0;i<sizeof(wdata);i++) {
rdata = *(volatile uint8_t *)(0x14000000+FLASH_TEST_OFFSET+i);
if (rdata != i%256) {
iot_printf("ERROR cache flash read: rdata[%d] = %02x\n",i, rdata);
error++;
}
}
os_delay(5);
iot_printf("read flash by cache1\n");
for (i=0;i<sizeof(wdata);i++) {
rdata = *(volatile uint8_t *)(0x1c000000+FLASH_TEST_OFFSET+i);
if (rdata != i%256) {
iot_printf("ERROR cache flash read: rdata[%d] = %02x\n",i, rdata);
error++;
}
}
os_delay(5);
iot_printf("read flash by cache2\n");
for (i=0;i<sizeof(wdata);i++) {
rdata = *(volatile uint8_t *)(0x24000000+FLASH_TEST_OFFSET+i);
if (rdata != i%256) {
iot_printf("ERROR cache flash read: rdata[%d] = %02x\n",i, rdata);
error++;
}
}
os_delay(5);
iot_printf("read flash by cache3\n");
for (i=0;i<sizeof(wdata);i++) {
rdata = *(volatile uint8_t *)(0x2c000000+FLASH_TEST_OFFSET+i);
if (rdata != i%256) {
iot_printf("ERROR cache flash read: rdata[%d] = %02x\n",i, rdata);
error++;
}
}
if (0 == error) {
iot_printf("flash cache0~4 read test success\r\n");
}else {
iot_printf("flash cache0~4 read test failed\r\n");
}
}
void sfc_main() {
uint8_t wip_sts;
uint32_t loop = 0;
iot_printf("\r\n>>>>>>>>>>>>>>>>>>>>>>>>flash read && write test begin<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\r\n");
/* init sfc and flash */
flash_init(1);
do {
iot_printf("quad: %d\n", g_sfc_ctrl->is_quad);
get_id_test();
get_sts_reg_test();
g_sfc_ctrl->query_wip_sts(&wip_sts);
if(wip_sts == 1) {
iot_printf("FLASH is WORK IN STATUS\r\n");
} else{
erase_test();
write_test();
read_test();
sfc_cache_read_test();
erase_test();
os_delay(5);
}
loop++;
iot_printf("\r\n>>>>>>>>>>>>>>>>>>>>>>>>>>>flash read && write test cnt : %d<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\r\n",loop);
} while (1);
while(1)
{
iot_printf("user_task_test_1 \n");
os_delay(1000);
}
return;
}
void smc_main() {
uint32_t loop = 0;
uint8_t rdata[0x40] = {0};
uint8_t wdata[0x40] = {1,2,3,4,5,6,7,8,9,0x11,0x22,0x33,0x44};
int i = 0, j = 0, k = 0;
int offset = 0;
int len = sizeof(wdata);
for(i = 0; i < len; i++) {
wdata[i] = 0x5a;
}
iot_printf("\r\n-------------------------------psram read && write test begin-------------------------------\r\n");
if(PSRAM_ACCSEE_WAY == 0)
{
while(1) {
int i,j,error = 0;
uint32_t rdat;
for (j=0;j<100;j++)
{
for (i=0;i<1000;i++)
{
*((volatile uint32_t*)(0x18300000+i*4+1000*4*j)) = 0x12345678+i+j;
}
ahb_cachex_flush(1,0x18300000+1000*4*j, 0x400*4);
ahb_cachex_flush(0,0x10100000,1024*1024);
for (i=0;i<1000;i++)
{
rdat=((volatile uint32_t)*((volatile uint32_t*)(0x10300000+i*4+1000*4*j)));
if(((0x12345678+i+j) != rdat))
{
iot_printf("ERROR addr 0x%x, WR:0x%x, RD 0x%X\r\n",(0x10300000+i*4+1000*4*j), (0x12345678+i+j),rdat);
error++;
}
}
os_delay(1);
}
for (j=0;j<100;j++)
{
for (i=0;i<1000;i++)
{
*((volatile uint32_t*)(0x28300000+i*4+1000*4*j)) = 0x12345678+i+j;
}
ahb_cachex_flush(3,0x28300000+1000*4*j, 0x400*4);
ahb_cachex_clear(2);
for (i=0;i<1000;i++)
{
rdat=((volatile uint32_t)*((volatile uint32_t*)(0x20300000+i*4+1000*4*j)));
if(((0x12345678+i+j) != rdat))
{
iot_printf("ERROR addr 0x%x, WR:0x%x, RD 0x%X\r\n",(0x20300000+i*4+1000*4*j), (0x12345678+i+j),rdat);
error++;
}
}
os_delay(1);
}
if (0 == error) {
iot_printf("*********************psram cache0~4 flush and read test success***********************\r\n");
}else {
iot_printf("*********************psram cache0~4 flush and read test failed************************\r\n");
}
loop++;
iot_printf("\r\n------------------------------- psram read && write test cnt : %d -------------------------------\n\r",loop);
}
}else{
/* init sfc and sram */
sfc_bus_share_en();
sram_qspi_init();
hal_smc_spi_cfg(CLK);
do {
if(sram_qspi_is_busy() != HAL_SRAM_OK){
iot_printf("SRAM IS Busy Now!\r\n");
}else{
/* spi mode */
// sram_qspi_exit();
iot_printf("spi write & read \n");
wdata[10] = 0xaa;
sram_qspi_write(wdata,0x1000,sizeof(wdata));
while(sram_qspi_is_busy());
os_mem_set(rdata,0,sizeof(rdata));
sram_qspi_read(rdata,0x1000,sizeof(rdata));
iot_printf("wdata[10]:%x, rdata[10]:%x\n", wdata[10], rdata[10]);
if (wdata[10] != rdata[10]) {
iot_printf("ERROR!! qspi write, qspi read not match\n");
//return;
}
/* qpi mode */
iot_printf("qpi write & read \n");
sram_qspi_enter();
hal_smc_qspi_quad_cfg(CLK);
wdata[10] = 0xbb;
sram_qspi_quad_write(wdata,0x2000,sizeof(wdata));
while(sram_qspi_is_busy());
os_mem_set(rdata,0,sizeof(rdata));
sram_qspi_quad_read(rdata,0x2000,sizeof(rdata));
iot_printf("wdata[10]:%x, rdata[10]:%x\n", wdata[10], rdata[10]);
if (wdata[10] != rdata[10]) {
iot_printf(" quad write, quad read not match\n");
return;
}
/* write read test */
iot_printf(" write read loop test \n");
offset = 0;
j = 0;
for (j = 0; j < 10; j++) {
iot_printf("\r\n------loop %d offset %x------\r\n", j, offset);
sram_qspi_quad_write(wdata, 0x1000+offset,sizeof(wdata));
while(sram_qspi_is_busy());
os_mem_set(rdata,0,sizeof(rdata));
sram_qspi_quad_read(rdata, 0x1000 +offset, sizeof(rdata));
for(i=0; i<len; i++) {
if (i % 4 == 0 ) {
iot_printf("\r\naddr: %08x: ", offset+i);
}
iot_printf("%02x ", rdata[i]);
}
k = 0;
for(k=0;k<1000;k++);
offset += 0x40;
}
sram_qspi_exit();
return;
}
while(sram_qspi_is_busy());
} while (false);
}
while(1)
{
iot_printf("user_task_test_2 \n");
os_delay(1000);
}
return;
}
void user_task_1()
{
sfc_main();
}
void user_task_2()
{
smc_main();
}
void user_task_test_1()
{
iot_time_tm_t curr_tm;
*((volatile uint32_t*)(0x05c0f808)) = 0xffffffff;
curr_tm.tm_year=2012;
curr_tm.tm_mon=1;
curr_tm.tm_mday=11;
curr_tm.tm_hour=4;
curr_tm.tm_min=55;
curr_tm.tm_sec=0;
iot_rtc_set(&curr_tm);
while(1)
{
iot_rtc_get(&curr_tm);
iot_printf("user_task_test_1 %d-%d-%d %d:%d:%d\n",curr_tm.tm_year,curr_tm.tm_mon,curr_tm.tm_mday,curr_tm.tm_hour,curr_tm.tm_min,curr_tm.tm_sec);
os_delay(500);
}
}
void user_task_test_2()
{
iot_time_tm_t curr_tm;
*((volatile uint32_t*)(0x05c0f808)) = 0xffffffff;
curr_tm.tm_year=2012;
curr_tm.tm_mon=1;
curr_tm.tm_mday=11;
curr_tm.tm_hour=4;
curr_tm.tm_min=55;
curr_tm.tm_sec=0;
iot_rtc_set(&curr_tm);
while(1)
{
iot_rtc_get(&curr_tm);
iot_printf("user_task_test_2 %d-%d-%d %d:%d:%d\n",curr_tm.tm_year,curr_tm.tm_mon,curr_tm.tm_mday,curr_tm.tm_hour,curr_tm.tm_min,curr_tm.tm_sec);
os_delay(500);
}
}
int32_t iot__task_init()
{
os_task_h handle;
//create the tasks;
#if 1
handle = os_create_task(user_task_1, NULL, 6);
//handle = os_create_task(user_task_test_1, NULL, 9);
if(handle != NULL) {
iot_printf("task 1 init successfully...\n");
}
#endif
#if 1
handle = NULL;
handle = os_create_task(user_task_2, NULL, 6);
//handle = os_create_task(user_task_test_2, NULL, 9);
if(handle != NULL) {
iot_printf("task 2 init successfully...\n");
}
#endif
return 0;
}
int32_t iot__module_init(void)
{
//platform intialization;
iot__platform_init();
//create all the tasks;
iot__task_init();
iot_rtc_init();
iot_printf("starting...\n");
return 0;
}
int32_t iot__task_start()
{
//start the tasks;
os_start_kernel();
return 0;
}
int32_t iot__module_start(void)
{
int32_t res = 0;
res = iot__task_start();
return res;
}
int main(void)
{
//module init;
iot__module_init();
//module start;
iot__module_start();
return 0;
}