#include "error.h" #include "include.h" #include #include #include #include #include #include #include #include "include.h" #include #include #include "typedef.h" #include "arm_arch.h" #include "qspi_pub.h" #if (CFG_SOC_NAME != SOC_BK7252N) #include "BkDriverQspi.h" #endif #include "test_config.h" #include "drv_wdt.h" #include "drv_model_pub.h" //#define QSPI_TEST #ifdef QSPI_TEST #if (CFG_SOC_NAME == SOC_BK7252N) static void qspi_psram_enter_quad_mode(void) { qspi_cmd_t enter_quad_cmd = {0}; enter_quad_cmd.wire_mode = QSPI_1WIRE; enter_quad_cmd.work_mode = INDIRECT_MODE; enter_quad_cmd.op = QSPI_WRITE; enter_quad_cmd.cmd = APS6404_CMD_ENTER_QUAD_MODE; sddev_control(QSPI_DEV_NAME, QSPI_CMD_DCACHE_CONFIG, &enter_quad_cmd); } static void qspi_psram_exit_quad_mode(void) { qspi_cmd_t exit_quad_cmd = {0}; exit_quad_cmd.wire_mode = QSPI_4WIRE; exit_quad_cmd.work_mode = INDIRECT_MODE; exit_quad_cmd.op = QSPI_WRITE; exit_quad_cmd.cmd = APS6404_CMD_EXIT_QUAD_MODE; sddev_control(QSPI_DEV_NAME, QSPI_CMD_DCACHE_CONFIG, &exit_quad_cmd); } static void qspi_psram_quad_write(void) { qspi_cmd_t quad_wr_cmd = {0}; quad_wr_cmd.wire_mode = QSPI_4WIRE; quad_wr_cmd.work_mode = MEMORY_MAPPED_MODE; quad_wr_cmd.op = QSPI_WRITE; quad_wr_cmd.cmd = APS6404_CMD_QUAD_WRITE; quad_wr_cmd.addr = 0; quad_wr_cmd.dummy_cycle = 0; sddev_control(QSPI_DEV_NAME, QSPI_CMD_DCACHE_CONFIG, &quad_wr_cmd); } static void qspi_psaram_quad_read(void) { qspi_cmd_t qspi_rd_cmd = {0}; qspi_rd_cmd.wire_mode = QSPI_4WIRE; qspi_rd_cmd.work_mode = MEMORY_MAPPED_MODE; qspi_rd_cmd.op = QSPI_READ; qspi_rd_cmd.cmd = APS6404_CMD_FAST_READ_QUAD; qspi_rd_cmd.addr = 0; qspi_rd_cmd.dummy_cycle = 6; sddev_control(QSPI_DEV_NAME, QSPI_CMD_DCACHE_CONFIG, &qspi_rd_cmd); } static void qspi_psram_single_write(void) { qspi_cmd_t quad_wr_cmd = {0}; quad_wr_cmd.wire_mode = QSPI_1WIRE; quad_wr_cmd.work_mode = MEMORY_MAPPED_MODE; quad_wr_cmd.op = QSPI_WRITE; quad_wr_cmd.cmd = APS6404_CMD_WRITE; quad_wr_cmd.addr = 0; quad_wr_cmd.dummy_cycle = 0; sddev_control(QSPI_DEV_NAME, QSPI_CMD_DCACHE_CONFIG, &quad_wr_cmd); } static void qspi_psram_single_read(void) { qspi_cmd_t qspi_rd_cmd = {0}; qspi_rd_cmd.wire_mode = QSPI_1WIRE; qspi_rd_cmd.work_mode = MEMORY_MAPPED_MODE; qspi_rd_cmd.op = QSPI_READ; qspi_rd_cmd.cmd = APS6404_CMD_READ; qspi_rd_cmd.addr = 0; qspi_rd_cmd.dummy_cycle = 0; sddev_control(QSPI_DEV_NAME, QSPI_CMD_DCACHE_CONFIG, &qspi_rd_cmd); } static void qspi_psram_test(int argc,char *argv[]) { int i; UINT32 param; qspi_data_t qspi_data; if (strcmp(argv[1], "init") == 0) { sddev_control(QSPI_DEV_NAME, QSPI_DCACHE_CMD_OPEN, NULL); sddev_control(QSPI_DEV_NAME, QSPI_CMD_CLK_SET_120M, NULL); param = 1; sddev_control(QSPI_DEV_NAME, QSPI_CMD_DIV_CLK_SET, ¶m); param = 4; sddev_control(QSPI_DEV_NAME, QSPI_CMD_GPIO_CONFIG, ¶m); rt_kprintf("qspi init done\r\n"); } else if (strcmp(argv[1], "enter_quad_mode") == 0) { qspi_psram_enter_quad_mode(); rt_kprintf("qspi enter quad mode\r\n"); } else if (strcmp(argv[1], "exit_quad_mode") == 0) { qspi_psram_exit_quad_mode(); rt_kprintf("qspi exit quad mode\r\n"); } else if (strcmp(argv[1], "quad_write") == 0) { qspi_psram_quad_write(); rt_kprintf("qspi enter quad write mode\r\n"); } else if (strcmp(argv[1], "quad_read") == 0) { qspi_psaram_quad_read(); rt_kprintf("qspi enter quad read mode\r\n"); } else if (strcmp(argv[1], "single_write") == 0) { qspi_psram_single_write(); rt_kprintf("qspi enter single write mode\r\n"); } else if (strcmp(argv[1], "single_read") == 0) { qspi_psram_single_read(); rt_kprintf("qspi enter single read mode\r\n"); } else if (strcmp(argv[1], "write") == 0) { qspi_data.op = QSPI_WRITE; qspi_data.addr = strtoul(argv[2], NULL, 16); param = strtoul(argv[3], NULL, 16); qspi_data.size = strtoul(argv[4], NULL, 10); qspi_data.buf = rt_malloc(qspi_data.size); if (!qspi_data.buf) { rt_kprintf("malloc write buffer fail\r\n"); return; } param &= 0xFF; memset(qspi_data.buf, param, qspi_data.size); sddev_control(QSPI_DEV_NAME, QSPI_CMD_DATA_CONFIG, &qspi_data); if (qspi_data.buf) { rt_free(qspi_data.buf); qspi_data.buf = NULL; } rt_kprintf("qspi psram write %02x done\r\n", param); } else if (strcmp(argv[1], "read") == 0) { qspi_data.op = QSPI_READ; qspi_data.addr = strtoul(argv[2], NULL, 16); qspi_data.size = strtoul(argv[3], NULL, 10); qspi_data.buf = rt_malloc(qspi_data.size); if (qspi_data.buf == NULL) { rt_kprintf("malloc read buffer fail\r\n"); return; } sddev_control(QSPI_DEV_NAME, QSPI_CMD_DATA_CONFIG, &qspi_data); for (i = 0; i < qspi_data.size; i++) { rt_kprintf("read_buf[%d]=%02x\r\n", i, qspi_data.buf[i]); } if (qspi_data.buf) { rt_free(qspi_data.buf); qspi_data.buf = NULL; } rt_kprintf("qspi psram read done\r\n"); } } MSH_CMD_EXPORT(qspi_psram_test, qspi_psram_test); #else #define QSPI_TEST_LENGTH ( 0x4 * 64 ) #define QSPI_TEST_ADDR (0x100000*8) static UINT8 DataOffset; static void qspi_psram_dcache_test(int argc,char *argv[]) { UINT32 i,ret; UINT32 SetLineMode; qspi_dcache_drv_desc qspi_cfg; UINT32* p_WRData1; UINT32* p_WRData2; UINT32* p_WRData3; UINT32* p_WRData4; UINT32* p_WRData5; UINT32* p_RDData1; UINT32* p_RDData2; UINT32* p_RDData3; UINT32* p_RDData4; UINT32* p_RDData5; p_WRData1 = rt_malloc(QSPI_TEST_LENGTH * sizeof(p_WRData1[0])); if(p_WRData1 == RT_NULL) { rt_kprintf("p_WRData1 malloc failed\r\n"); } p_WRData2 = rt_malloc(QSPI_TEST_LENGTH * sizeof(p_WRData2[0])); if(p_WRData2 == RT_NULL) { rt_kprintf("p_WRData2 malloc failed\r\n"); } p_WRData3 = rt_malloc(QSPI_TEST_LENGTH * sizeof(p_WRData3[0])); if(p_WRData3 == RT_NULL) { rt_kprintf("p_WRData3 malloc failed\r\n"); } p_WRData4 = rt_malloc(QSPI_TEST_LENGTH * sizeof(p_WRData4[0])); if(p_WRData4 == RT_NULL) { rt_kprintf("p_WRData4 malloc failed\r\n"); } p_WRData5 = rt_malloc(QSPI_TEST_LENGTH * sizeof(p_WRData5[0])); if(p_WRData5 == RT_NULL) { rt_kprintf("p_WRData5 malloc failed\r\n"); } p_RDData1 = rt_malloc(QSPI_TEST_LENGTH * sizeof(p_RDData1[0])); if(p_RDData1 == RT_NULL) { rt_kprintf("p_RDData1 malloc failed\r\n"); } p_RDData2 = rt_malloc(QSPI_TEST_LENGTH * sizeof(p_RDData2[0])); if(p_RDData2 == RT_NULL) { rt_kprintf("p_RDData2 malloc failed\r\n"); } p_RDData3 = rt_malloc(QSPI_TEST_LENGTH * sizeof(p_RDData3[0])); if(p_RDData3 == RT_NULL) { rt_kprintf("p_RDData3 malloc failed\r\n"); } p_RDData4 = rt_malloc(QSPI_TEST_LENGTH * sizeof(p_RDData4[0])); if(p_RDData4 == RT_NULL) { rt_kprintf("p_RDData4 malloc failed\r\n"); } p_RDData5 = rt_malloc(QSPI_TEST_LENGTH * sizeof(p_RDData5[0])); if(p_RDData5 == RT_NULL) { rt_kprintf("p_RDData5 malloc failed\r\n"); } for(i=0; i= 0 && test_mode <= 2) { switch (test_mode) { case 0: { rt_kprintf("\n8bit test start memtest,address: 0x%08X size: 0x%08X\r\n", address, size); uint8_t *p_uint8_t = 0; if(rw_way == 0 || rw_way == 1) { p_uint8_t = (uint8_t *)address; for (i = 0; i < size / sizeof(uint8_t); i++) { *p_uint8_t++ = (uint8_t)i; if(i == (8*1024 -1)) { //rt_pin_write(TEST_PIN_NUM, PIN_HIGH); rt_kprintf("test..... \n"); } } } if(rw_way == 0 || rw_way == 2) { p_uint8_t = (uint8_t *)address; for (i = 0; i < size / sizeof(uint8_t); i++) { if (*p_uint8_t != (uint8_t)i) { rt_kprintf("8bit test fail @ 0x%08X,rd:%x,wd:%x system halt!!!!!\r\n", (uint32_t)p_uint8_t, (uint8_t)*p_uint8_t, (uint8_t)i); //while (1) // ; //continue; } p_uint8_t++; } } rt_kprintf("8bit test pass!!\r\n"); } break; case 1: /**< 16bit test */ rt_kprintf("\n16bit test start memtest,address: 0x%08X size: 0x%08X\r\n", address, size); { uint16_t *p_uint16_t = 0; if(rw_way == 0 || rw_way == 1) { p_uint16_t = (uint16_t *)address; for (i = 0; i < size / sizeof(uint16_t); i++) { *p_uint16_t++ = (uint16_t)i; } } if(rw_way == 0 || rw_way == 2) { p_uint16_t = (uint16_t *)address; for (i = 0; i < size / sizeof(uint16_t); i++) { if (*p_uint16_t != (uint16_t)i) { rt_kprintf("16bit test fail @ 0x%08X,rd:%x,wd:%x system halt!!!!!\r\n", (uint32_t)p_uint16_t, (uint16_t)*p_uint16_t, (uint16_t)i); //while (1) // ; //continue; } p_uint16_t++; } } rt_kprintf("16bit test pass!!\r\n"); } break; case 2: /**< 32bit test */ rt_kprintf("\n32bit test start memtest,address: 0x%08X size: 0x%08X\r\n", address, size); { uint32_t *p_uint32_t = 0; if(rw_way == 0 || rw_way == 1) { p_uint32_t = (uint32_t *)address; for (i = 0; i < size / sizeof(uint32_t); i++) { *p_uint32_t++ = (uint32_t)i; } } if(rw_way == 0 || rw_way == 2) { p_uint32_t = (uint32_t *)address; for (i = 0; i < size / sizeof(uint32_t); i++) { if (*p_uint32_t != (uint32_t)i) { rt_kprintf("32bit test fail @ 0x%08X,rd:%x,wd:%x system halt!!!!!\r\n", (uint32_t)p_uint32_t, (uint32_t)*p_uint32_t, (uint32_t)i); //while (1) // ; //continue; } p_uint32_t++; } } rt_kprintf("32bit test pass!!\r\n"); } break; default: break; } } } void test_bus_mem(int argc, char **argv) { psram_init(0,2);//NOTE:should set according to the actual situation! here default set as 1 line;3.3v rt_hw_wdg_stop(); if (argc == 4) { mem_bus_test(0x03000000, atoi(argv[3]) * 1024, atoi(argv[1]), atoi(argv[2])); } else { rt_kprintf("ex:test_bus_mem x1 x2 x3\r\n"); rt_kprintf(" x1 is rw size (0:8 bit 1:16 bit 2:32bit) x2 is rw_way (0:rw 1:write only 2:read only ); x3 is checksize\r\n"); } rt_hw_wdg_start(0,NULL); } MSH_CMD_EXPORT(test_bus_mem, test_bus_mem); FINSH_FUNCTION_EXPORT_ALIAS(qspi_psram_dcache_test, __cmd_qspi_test, test qspi_psram_dcache mode); MSH_CMD_EXPORT(qspi_psram_switch_line_mode, qspi_psram_switch_line_mode); MSH_CMD_EXPORT(qspi_psram_line_mode_test, qspi_psram_line_mode_test); MSH_CMD_EXPORT(qspi_psram_read_id_test, qspi_psram_read_id_test); MSH_CMD_EXPORT(qspi_psram_while_test, qspi_psram_while_test); #endif #endif