前言
- 将w25q128设备挂载到FAL,FAL (Flash Abstraction Layer) Flash 抽象层,是对 Flash 及基于 Flash 的分区进行管理、操作的抽象层;
- FAL 详细介绍请参考官网
- 挂载步骤参考FAL提供的示例文档
相关宏定义
#define RT_USING_FAL
#define FAL_DEBUG 1
#define FAL_PART_HAS_TABLE_CFG
#define RT_USING_SPI
#define RT_USING_SFUD
#define RT_SFUD_USING_SFDP
#define RT_SFUD_USING_FLASH_INFO_TABLE
#define RT_SFUD_SPI_MAX_HZ 50000000
#define FAL_USING_SFUD_PORT
#define FAL_USING_NOR_FLASH_DEV_NAME "W25Q128BV"
Fal_w25q64驱动编写(参考示例文档)
#include <fal.h>
#include <sfud.h>
#ifdef FAL_USING_SFUD_PORT
#ifdef RT_USING_SFUD
#include <spi_flash_sfud.h>
#endif
#ifndef FAL_USING_NOR_FLASH_DEV_NAME
#define FAL_USING_NOR_FLASH_DEV_NAME "norflash0"
#endif
static int init(void);
static int read(long offset, uint8_t *buf, size_t size);
static int write(long offset, const uint8_t *buf, size_t size);
static int erase(long offset, size_t size);
static sfud_flash_t sfud_dev = NULL;
struct fal_flash_dev w25q128_flash_dev =
{
.name = FAL_USING_NOR_FLASH_DEV_NAME,
.addr = 0,
.len = 16 * 1024 * 1024,
.blk_size = 4096,
.ops = {init, read, write, erase},
.write_gran = 1
};
static int init(void) {
#ifdef RT_USING_SFUD
sfud_dev = rt_sfud_flash_find_by_dev_name(FAL_USING_NOR_FLASH_DEV_NAME);
#else
extern sfud_flash sfud_norflash0;
sfud_dev = &sfud_norflash0;
#endif
if (NULL == sfud_dev) {
return -1;
}
w25q128_flash_dev.blk_size = sfud_dev->chip.erase_gran;
w25q128_flash_dev.len = sfud_dev->chip.capacity;
return 0;
}
static int read(long offset, uint8_t *buf, size_t size) {
assert(sfud_dev);
assert(sfud_dev->init_ok);
sfud_read(sfud_dev, w25q128_flash_dev.addr + offset, size, buf);
return size;
}
static int write(long offset, const uint8_t *buf, size_t size) {
assert(sfud_dev);
assert(sfud_dev->init_ok);
if (sfud_write(sfud_dev, w25q128_flash_dev.addr + offset, size, buf) != SFUD_SUCCESS) {
return -1;
}
return size;
}
static int erase(long offset, size_t size) {
assert(sfud_dev);
assert(sfud_dev->init_ok);
if (sfud_erase(sfud_dev, w25q128_flash_dev.addr + offset, size) != SFUD_SUCCESS) {
return -1;
}
return size;
}
#endif
fal配置头文件
#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_
#include "rtconfig.h"
#include "board.h"
#define FLASH_SIZE_GRANULARITY_16K (4*16*1024)
#define FLASH_SIZE_GRANULARITY_64K (64*1024)
#define FLASH_SIZE_GRANULARITY_128K (7*128*1024)
#define STM32_FLASH_START_ADRESS_16K STM32_FLASH_START_ADRESS
#define STM32_FLASH_START_ADRESS_64K (STM32_FLASH_START_ADRESS+FLASH_SIZE_GRANULARITY_16K)
#define STM32_FLASH_START_ADRESS_128K (STM32_FLASH_START_ADRESS_64K+FLASH_SIZE_GRANULARITY_64K)
extern const struct fal_flash_dev stm32_onchip_flash_16k ;
extern const struct fal_flash_dev stm32_onchip_flash_64k ;
extern const struct fal_flash_dev stm32_onchip_flash_128k ;
extern struct fal_flash_dev w25q128_flash_dev;
#define FAL_FLASH_DEV_TABLE \
{ \
&stm32_onchip_flash_16k, \
&stm32_onchip_flash_64k, \
&stm32_onchip_flash_128k, \
&w25q128_flash_dev, \
}
#ifdef FAL_PART_HAS_TABLE_CFG
#define FAL_PART_TABLE \
{ \
{FAL_PART_MAGIC_WORD, "app", "onchip_flash_128k", 0*1024, 512*1024, 0}, \
{FAL_PART_MAGIC_WORD, "download", "onchip_flash_128k", 512*1024, 384*1024, 0}, \
{FAL_PART_MAGIC_WORD, "flash_dev", FAL_USING_NOR_FLASH_DEV_NAME, 0, 16*1024*1024, 0}, \
}
#endif
#endif
fal初始化
结果