[FlashDB]基于GD32纯代码裸机移植FlashDB数据库——四、移植Fal

【相关文章导航】

[FlashDB]基于GD32纯代码裸机移植FlashDB数据库——一、介绍
[FlashDB]基于GD32纯代码裸机移植FlashDB数据库——二、移植前准备
[FlashDB]基于GD32纯代码裸机移植FlashDB数据库——三、移植SFUD
[FlashDB]基于GD32纯代码裸机移植FlashDB数据库——四、移植Fal
[FlashDB]基于GD32纯代码裸机移植FlashDB数据库——五、移植FlashDB

六、移植Fal

6.1 移植步骤

  1. 移动源代码
  2. 在Keil的文件组中添加源文件
  3. 修改 fal_cfg.h 文件
  4. 实现 user_fal_flash_sfud_port.c 文件内容

6.2 移动源代码

移动源码文件到当前工程相应文件夹下,如下图:

在这里插入图片描述

6.3 在Keil的文件组中添加源文件

在这里插入图片描述

6.4 修改 fal_cfg.h 文件

关键修改两处:

  1. 定义flash设备表

    因只使用外部flash,故仅有一个flash设备

  2. 定义分区表

    我们只使用KVDB和TSDB两种数据库模式,故仅定义这两个分区表

请参考如下代码:(原代码未删除,仅屏蔽掉了。可做参考)

#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_

//#include <rtconfig.h>
//#include <board.h>

/* 手动添加 */
#define FAL_DEBUG 1

#define FAL_PART_HAS_TABLE_CFG

#define NOR_FLASH_DEV_NAME             "norflash0"

/* ===================== Flash device Configuration ========================= */
//extern const struct fal_flash_dev stm32f2_onchip_flash;
extern struct fal_flash_dev nor_flash0;

/* flash device table */
//#define FAL_FLASH_DEV_TABLE                                          \
//{                                                                    \
//    &stm32f2_onchip_flash,                                           \
//    &nor_flash0,                                                     \
//}

/* flash device table */
#define FAL_FLASH_DEV_TABLE                                          \
{                                                                    \
	&nor_flash0,                                                     \
}
/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG
/* partition table */
//#define FAL_PART_TABLE                                                               \
//{                                                                                    \
//    {FAL_PART_MAGIC_WORD,        "bl",     "stm32_onchip",         0,   64*1024, 0}, \
//    {FAL_PART_MAGIC_WORD,       "app",     "stm32_onchip",   64*1024,  704*1024, 0}, \
//    {FAL_PART_MAGIC_WORD, "easyflash", NOR_FLASH_DEV_NAME,         0, 1024*1024, 0}, \
//    {FAL_PART_MAGIC_WORD,  "download", NOR_FLASH_DEV_NAME, 1024*1024, 1024*1024, 0}, \
//}

/* partition table */
#define FAL_PART_TABLE                                                               \
{                                                                                    \
	{FAL_PART_MAGIC_WORD,      "KVDB",   NOR_FLASH_DEV_NAME,            0,  1*1024*1024, 0}, \
    {FAL_PART_MAGIC_WORD,      "TSDB",   NOR_FLASH_DEV_NAME,  1*1024*1024,  1*1024*1024, 0}, \
}
#endif /* FAL_PART_HAS_TABLE_CFG */

#endif /* _FAL_CFG_H_ */

6.5 实现 user_fal_flash_sfud_port.c 文件内容

  1. 拷贝 /FlashDB-master/port/fal/samples/porting/ 文件路径下的 fal_flash_sfud_port.c 文件内容到此文件。
  2. 针对自己的flash做修改。

关键修改两处:

  1. 添加宏定义 #define FAL_USING_SFUD_PORT(位于Line 5
  2. 修改 sfud_dev 设备定义(位于Line 42

请参考如下代码:(原代码未删除,仅屏蔽掉了。可做参考)

#include <fal.h>
#include <sfud.h>

/* 手动添加 */
#define FAL_USING_SFUD_PORT

#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 nor_flash0 =
{
    .name       = FAL_USING_NOR_FLASH_DEV_NAME,
    .addr       = 0,
    .len        = 8 * 1024 * 1024,
    .blk_size   = 4096,
    .ops        = {init, read, write, erase},
    .write_gran = 1
};

static int init(void)
{

#ifdef RT_USING_SFUD
    /* RT-Thread RTOS platform */
    sfud_dev = rt_sfud_flash_find_by_dev_name(FAL_USING_NOR_FLASH_DEV_NAME);
#else
    /* bare metal platform */
//    extern sfud_flash sfud_norflash0;
//    sfud_dev = &sfud_norflash0;
	sfud_dev = sfud_get_device(SFUD_GD25Q32_DEVICE_INDEX);
#endif

    if (NULL == sfud_dev)
    {
        return -1;
    }

    /* update the flash chip information */
    nor_flash0.blk_size = sfud_dev->chip.erase_gran;
    nor_flash0.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, nor_flash0.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, nor_flash0.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, nor_flash0.addr + offset, size) != SFUD_SUCCESS)
    {
        return -1;
    }

    return size;
}
#endif /* FAL_USING_SFUD_PORT */

至此,Fal移植完成!!!

然后编译,若无报错,则移植成功。。。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值