TT12-MCU/applications/w25q.c
CSSC-WORK\murmur 47fe7c90ee 更新 checkFlash 逻辑,在开始时检测
更新 checkManualWindow 逻辑
修复 SYS_CFG 中 isMaWin 的类型错误

cfg.c 中文件锁采用mutex
2023-09-06 09:51:08 +08:00

185 lines
4.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2023-04-14 murmur the first version
*/
#include <rtthread.h>
//#define LOG_TAG "flash"
//#define LOG_LVL LOG_LVL_DBG
//#include <ulog.h>
#define DBG_TAG "w25q"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#include "board.h"
#include <rtdevice.h>
#include "cfg/cfg.h"
int rt_hw_spi_flash_init(void)
{
// rt_kprintf("SW Version: %s\n","1.4(temp)");
__HAL_RCC_GPIOB_CLK_ENABLE();
// __HAL_RCC_GPIOD_CLK_ENABLE();
// rt_kprintf("sfud success.\n");
// rt_tick_t t= rt_tick_get_millisecond();
rt_hw_spi_device_attach("spi2", "spi10", GPIOB, GPIO_PIN_12);
// rt_kprintf("sfud success.\n");
if (RT_NULL == rt_sfud_flash_probe("W25Q128", "spi10"))
{
LOG_E("sfud error.");
return -RT_ERROR;
};
// rt_kprintf("sfud success.\n");
return RT_EOK;
}
/* 导出到自动初始化 */
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);
void w25q128_mount(void)
{
// dfs_mkfs("elm", "W25Q128");
rt_device_t dev;
dev = rt_device_find("W25Q128");
if(dev != RT_NULL) {
if(dfs_mount("W25Q128", "/", "elm", 0, 0) == 0){
// rt_kprintf("spi_flash mount to spi!\n");
mkdir("sd",0);
} else {
LOG_E("spi_flash mount to spi failed!");
}
}
}
/* 导出到自动初始化 */
INIT_COMPONENT_EXPORT(w25q128_mount);
//1.41版本之前挂载并未出现问题。
//1.41版出现flash能挂载而sd卡正确识别后却不能挂载的问题
//后发现是SD卡的挂载目录"sd"丢失,原因未知。
void sdmnt_init(void)
{
rt_thread_mdelay(300);//这段延时必须加上系统上电过程中存在延时否则会出现先挂载后注册块设备sd0的情况
// mkfs("elm","sd0");//挂在前需格式化
if(dfs_mount("sd0","/sd","elm",0,0)==0) //挂载文件系统参数块设备名称、挂载目录、文件系统类型、读写标志、私有数据0
{
// rt_kprintf("dfs mount success\r\n");
}
else
{
LOG_E("dfs mount failed");
// mkfs("elm","sd0");
}
}
/* 导出到自动初始化 */
INIT_COMPONENT_EXPORT(sdmnt_init);
/**
* 判断flash是否损坏
*/
void checkFlash()
{
//间接判断。文件存在但大小为零则认为flash已损坏
if (isFileExit("cfg.ini") && getFileSize("cfg.ini")==0 && isFileExit("map.geojson") && getFileSize("map.geojson")==0)
{
LOG_E("the flash is damaged, try formatting to fix.");
dfs_mkfs("elm", "W25Q128");
rt_hw_cpu_reset();
}
}
/* 导出到自动初始化 */
INIT_COMPONENT_EXPORT(checkFlash);
void bootinfo()
{
rt_kprintf("%d ms since boot.\n", rt_tick_get_millisecond());
// add_val("bootCnt");
}
/* 导出到自动初始化 */
INIT_APP_EXPORT(bootinfo);
void sram_init(void)
{
MX_FSMC_Init();
}
/* 导出到自动初始化 */
INIT_COMPONENT_EXPORT(sram_init);
static int sram_test(void)
{
int i = 0;
uint32_t start_time = 0, time_cast = 0;
#if SRAM_DATA_WIDTH == 8
char data_width = 1;
uint8_t data = 0;
#elif SRAM_DATA_WIDTH == 16
char data_width = 2;
uint16_t data = 0;
#else
char data_width = 4;
uint32_t data = 0;
#endif
/* write data */
LOG_D("Writing the %ld bytes data, waiting....", SRAM_SIZE);
start_time = rt_tick_get();
for (i = 0; i < SRAM_SIZE / data_width; i++)
{
#if SRAM_DATA_WIDTH == 8
*(__IO uint8_t *)(SRAM_BANK_ADDR + i * data_width) = (uint8_t)0x55;
#elif SRAM_DATA_WIDTH == 16
*(__IO uint16_t *)(SRAM_BANK_ADDR + i * data_width) = (uint16_t)0x5555;
#else
*(__IO uint32_t *)(SRAM_BANK_ADDR + i * data_width) = (uint32_t)0x55555555;
#endif
}
time_cast = rt_tick_get() - start_time;
LOG_D("Write data success, total time: %d.%03dS.", time_cast / RT_TICK_PER_SECOND,
time_cast % RT_TICK_PER_SECOND / ((RT_TICK_PER_SECOND * 1 + 999) / 1000));
/* read data */
LOG_D("start Reading and verifying data, waiting....");
for (i = 0; i < SRAM_SIZE / data_width; i++)
{
#if SRAM_DATA_WIDTH == 8
data = *(__IO uint8_t *)(SRAM_BANK_ADDR + i * data_width);
if (data != 0x55)
{
LOG_E("SRAM test failed!");
break;
}
#elif SRAM_DATA_WIDTH == 16
data = *(__IO uint16_t *)(SRAM_BANK_ADDR + i * data_width);
if (data != 0x5555)
{
LOG_E("SRAM test failed!");
break;
}
#else
data = *(__IO uint32_t *)(SRAM_BANK_ADDR + i * data_width);
if (data != 0x55555555)
{
LOG_E("SRAM test failed!");
break;
}
#endif
}
if (i >= SRAM_SIZE / data_width)
{
LOG_D("SRAM test success!");
}
return RT_EOK;
}
MSH_CMD_EXPORT(sram_test, sram test);