chenxuuu 5 лет назад
Родитель
Сommit
9e4949ef19

+ 42 - 8
bsp/air100st/rtt/.config

@@ -90,7 +90,7 @@ CONFIG_FINSH_CMD_SIZE=80
 # CONFIG_FINSH_USING_AUTH is not set
 CONFIG_FINSH_USING_MSH=y
 CONFIG_FINSH_USING_MSH_DEFAULT=y
-CONFIG_FINSH_USING_MSH_ONLY=y
+# CONFIG_FINSH_USING_MSH_ONLY is not set
 CONFIG_FINSH_ARG_MAX=10
 
 #
@@ -142,7 +142,7 @@ CONFIG_RT_USING_PIN=y
 # CONFIG_RT_USING_ADC is not set
 # CONFIG_RT_USING_DAC is not set
 # CONFIG_RT_USING_PWM is not set
-# CONFIG_RT_USING_MTD_NOR is not set
+CONFIG_RT_USING_MTD_NOR=y
 # CONFIG_RT_USING_MTD_NAND is not set
 # CONFIG_RT_USING_PM is not set
 # CONFIG_RT_USING_RTC is not set
@@ -357,6 +357,8 @@ CONFIG_ULOG_BACKEND_USING_CONSOLE=y
 # CONFIG_PKG_USING_RT_CJSON_TOOLS is not set
 # CONFIG_PKG_USING_AGILE_TELNET is not set
 # CONFIG_PKG_USING_NMEALIB is not set
+# CONFIG_PKG_USING_AGILE_JSMN is not set
+# CONFIG_PKG_USING_PDULIB is not set
 
 #
 # security packages
@@ -402,6 +404,7 @@ CONFIG_ULOG_BACKEND_USING_CONSOLE=y
 # CONFIG_PKG_USING_BS8116A is not set
 # CONFIG_PKG_USING_GPS_RMC is not set
 # CONFIG_PKG_USING_URLENCODE is not set
+# CONFIG_PKG_USING_UMCN is not set
 
 #
 # system packages
@@ -412,14 +415,43 @@ CONFIG_ULOG_BACKEND_USING_CONSOLE=y
 # CONFIG_PKG_USING_PIXMAN is not set
 # CONFIG_PKG_USING_LWEXT4 is not set
 # CONFIG_PKG_USING_PARTITION is not set
-# CONFIG_PKG_USING_FAL is not set
+CONFIG_PKG_USING_FAL=y
+CONFIG_PKG_FAL_PATH="/packages/system/fal"
+CONFIG_FAL_DEBUG_CONFIG=y
+CONFIG_FAL_DEBUG=1
+CONFIG_FAL_PART_HAS_TABLE_CFG=y
+CONFIG_FAL_USING_SFUD_PORT=y
+CONFIG_FAL_USING_NOR_FLASH_DEV_NAME="W25Q16JV"
+CONFIG_PKG_USING_FAL_V00500=y
+# CONFIG_PKG_USING_FAL_V00400 is not set
+# CONFIG_PKG_USING_FAL_V00300 is not set
+# CONFIG_PKG_USING_FAL_V00200 is not set
+# CONFIG_PKG_USING_FAL_V00100 is not set
+# CONFIG_PKG_USING_FAL_LATEST_VERSION is not set
+CONFIG_PKG_FAL_VER="v0.5.0"
+CONFIG_PKG_FAL_VER_NUM=0x00500
 # CONFIG_PKG_USING_FLASHDB is not set
 # CONFIG_PKG_USING_SQLITE is not set
 # CONFIG_PKG_USING_RTI is not set
 # CONFIG_PKG_USING_LITTLEVGL2RTT is not set
 # CONFIG_PKG_USING_CMSIS is not set
 # CONFIG_PKG_USING_DFS_YAFFS is not set
-# CONFIG_PKG_USING_LITTLEFS is not set
+CONFIG_PKG_USING_LITTLEFS=y
+CONFIG_PKG_LITTLEFS_PATH="/packages/system/littlefs"
+# CONFIG_PKG_USING_LITTLEFS_V090 is not set
+# CONFIG_PKG_USING_LITTLEFS_V170 is not set
+# CONFIG_PKG_USING_LITTLEFS_V172 is not set
+# CONFIG_PKG_USING_LITTLEFS_V201 is not set
+CONFIG_PKG_USING_LITTLEFS_V205=y
+# CONFIG_PKG_USING_LITTLEFS_V214 is not set
+# CONFIG_PKG_USING_LITTLEFS_LATEST_VERSION is not set
+CONFIG_LFS_READ_SIZE=256
+CONFIG_LFS_PROG_SIZE=256
+CONFIG_LFS_BLOCK_SIZE=4096
+CONFIG_LFS_CACHE_SIZE=256
+CONFIG_LFS_BLOCK_CYCLES=100
+CONFIG_LFS_LOOKAHEAD_MAX=128
+CONFIG_PKG_LITTLEFS_VER="v2.0.5"
 # CONFIG_PKG_USING_THREAD_POOL is not set
 # CONFIG_PKG_USING_ROBOTS is not set
 # CONFIG_PKG_USING_EV is not set
@@ -478,12 +510,11 @@ CONFIG_SDIO_MAX_FREQ=1000000
 # CONFIG_PKG_USING_PMS_SERIES is not set
 # CONFIG_PKG_USING_CAN_YMODEM is not set
 # CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set
-CONFIG_BSP_USING_SPI1=y
-# CONFIG_BSP_USING_SPI2 is not set
 # CONFIG_PKG_USING_QLED is not set
 # CONFIG_PKG_USING_PAJ7620 is not set
 # CONFIG_PKG_USING_AGILE_CONSOLE is not set
 # CONFIG_PKG_USING_LD3320 is not set
+# CONFIG_PKG_USING_WK2124 is not set
 
 #
 # miscellaneous packages
@@ -521,6 +552,7 @@ CONFIG_BSP_USING_SPI1=y
 # CONFIG_PKG_USING_ULAPACK is not set
 # CONFIG_PKG_USING_UKAL is not set
 # CONFIG_PKG_USING_CRCLIB is not set
+# CONFIG_PKG_USING_THREES is not set
 CONFIG_SOC_FAMILY_STM32=y
 CONFIG_SOC_SERIES_STM32F4=y
 
@@ -536,7 +568,7 @@ CONFIG_BSP_USING_USB_TO_USART=y
 # CONFIG_BSP_USING_COM2 is not set
 CONFIG_BSP_USING_COM3=y
 # CONFIG_BSP_USING_SRAM is not set
-CONFIG_BSP_USING_SPI_FLASH=y
+# CONFIG_BSP_USING_SPI_FLASH is not set
 # CONFIG_BSP_USING_EEPROM is not set
 # CONFIG_BSP_USING_ETH is not set
 # CONFIG_BSP_USING_MPU6050 is not set
@@ -559,10 +591,12 @@ CONFIG_BSP_USING_UART3=y
 # CONFIG_BSP_USING_UART6 is not set
 # CONFIG_BSP_USING_TIM is not set
 # CONFIG_BSP_USING_PWM is not set
-# CONFIG_BSP_USING_ON_CHIP_FLASH is not set
+CONFIG_BSP_USING_ON_CHIP_FLASH=y
 CONFIG_BSP_USING_SPI=y
+CONFIG_BSP_USING_SPI1=y
 # CONFIG_BSP_SPI1_TX_USING_DMA is not set
 # CONFIG_BSP_SPI1_RX_USING_DMA is not set
+# CONFIG_BSP_USING_SPI2 is not set
 # CONFIG_BSP_USING_ADC is not set
 # CONFIG_BSP_USING_I2C1 is not set
 # CONFIG_BSP_USING_ONCHIP_RTC is not set

+ 106 - 0
bsp/air100st/rtt/applications/main.c

@@ -13,6 +13,17 @@
 #include <rtdevice.h>
 #include "luat_base.h"
 #include "luat_log.h"
+#include "spi_flash_sfud.h"
+#include "drv_spi.h"
+
+/* 添加 DEBUG 头文件 */
+#define DBG_SECTION_NAME               "main"
+#define DBG_LEVEL                      DBG_INFO
+#include <rtdbg.h>
+#define FS_PARTITION_NAME              "fs"
+
+#include "fal.h"
+#include <dfs_fs.h>
 
 static void _main(void* param) {
     rt_thread_mdelay(100); // 故意延后100ms
@@ -24,6 +35,101 @@ static void _main(void* param) {
 
 int main(void)
 {
+    fal_init();
+
+    struct rt_device *mtd_dev = RT_NULL;
+    mtd_dev = fal_mtd_nor_device_create("app");
+    if (!mtd_dev)
+    {
+        LOG_E("Can't create a mtd device on '%s' partition.", "app");
+    }
+    else
+    {
+        /* 挂载 littlefs */
+        if (dfs_mount("app", "/", "lfs", 0, 0) == 0)
+        {
+            LOG_I("Filesystem initialized!");
+        }
+        else
+        {
+            LOG_I("fs reinitialize");
+            /* 格式化文件系统 */
+            dfs_mkfs("lfs", "app");
+            /* 挂载 littlefs */
+            if (dfs_mount("app", "/", "lfs", 0, 0) == 0)
+            {
+                LOG_I("Filesystem initialized!");
+            }
+            else
+            {
+                LOG_E("Failed to initialize filesystem!");
+            }
+        }
+    }
+
+
+
+    // /* 生成 mtd 设备 */
+    // struct rt_device *mtd_dev = RT_NULL;
+    // mtd_dev = fal_mtd_nor_device_create("flash");
+    // if (!mtd_dev)
+    // {
+    //     LOG_E("Can't create a mtd device on '%s' partition.", "flash");
+    // }
+    // else
+    // {
+    //     /* 挂载 littlefs */
+    //     if (dfs_mount("flash", "/flash", "lfs", 0, 0) == 0)
+    //     {
+    //         LOG_I("Filesystem initialized!");
+    //     }
+    //     else
+    //     {
+    //         LOG_I("fs reinitialize");
+    //         /* 格式化文件系统 */
+    //         dfs_mkfs("lfs", "flash");
+    //         /* 挂载 littlefs */
+    //         if (dfs_mount("flash", "/flash", "lfs", 0, 0) == 0)
+    //         {
+    //             LOG_I("Filesystem initialized!");
+    //         }
+    //         else
+    //         {
+    //             LOG_E("Failed to initialize filesystem!");
+    //         }
+    //     }
+    // }
+
+    // struct rt_device *mtd_dev_download = RT_NULL;
+    // mtd_dev_download = fal_mtd_nor_device_create("download");
+    // if (!mtd_dev_download)
+    // {
+    //     LOG_E("Can't create a mtd device on '%s' partition.", "download");
+    // }
+    // else
+    // {
+    //     /* 挂载 littlefs */
+    //     if (dfs_mount("download", "/download", "lfs", 0, 0) == 0)
+    //     {
+    //         LOG_I("Filesystem initialized!");
+    //     }
+    //     else
+    //     {
+    //         LOG_I("download reinitialize");
+    //         /* 格式化文件系统 */
+    //         dfs_mkfs("lfs", "download");
+    //         /* 挂载 littlefs */
+    //         if (dfs_mount("download", "/download", "lfs", 0, 0) == 0)
+    //         {
+    //             LOG_I("Filesystem initialized!");
+    //         }
+    //         else
+    //         {
+    //             LOG_E("Failed to initialize filesystem!");
+    //         }
+    //     }
+    // }
+
     rt_thread_t t = rt_thread_create("luat", _main, RT_NULL, 8*1024, 15, 20);
     rt_thread_startup(t);
     //luat_main(NULL, NULL, NULL);

+ 4 - 4
bsp/air100st/rtt/board/SConscript

@@ -10,14 +10,14 @@ cwd = GetCurrentDir()
 src = Split('''
 board.c
 CubeMX_Config/Src/stm32f4xx_hal_msp.c
+ports/fal_flash_sfud_port.c
+ports/spi_flash_init.c
+ports/fal_flash_stm32f4_port.c
 ''')
 
 if GetDepend(['BSP_USING_ETH']):
     src += Glob('ports/phy_reset.c')
 
-if GetDepend(['BSP_USING_SPI_FLASH']):
-    src += Glob('ports/spi_flash_init.c')
-
 if GetDepend(['BSP_USING_SDCARD']):
     src += Glob('ports/sdcard_port.c')
 
@@ -40,4 +40,4 @@ elif rtconfig.CROSS_TOOL == 'iar':
 CPPDEFINES = ['STM32F407xx']
 group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES)
 
-Return('group')
+Return('group')

+ 12 - 18
bsp/air100st/rtt/board/ports/fal_cfg.h

@@ -14,34 +14,28 @@
 #include <rtthread.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)
+//extern const struct fal_flash_dev stm32f4_onchip_flash;
 
-#define STM32_FLASH_START_ADRESS_16K  STM32_FLASH_START_ADRESS
-#define STM32_FLASH_START_ADRESS_64K  (STM32_FLASH_START_ADRESS_16K + 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;
+/* ===================== Flash device Configuration ========================= */
+extern struct fal_flash_dev nor_flash0;
+extern struct fal_flash_dev stm32f4_onchip_flash;
 
 /* flash device table */
 #define FAL_FLASH_DEV_TABLE                                          \
 {                                                                    \
-    &stm32_onchip_flash_16k,                                         \
-    &stm32_onchip_flash_64k,                                         \
-    &stm32_onchip_flash_128k,                                        \
+    &stm32f4_onchip_flash,                                           \
+    &nor_flash0,                                                     \
 }
+
 /* ====================== Partition Configuration ========================== */
 #ifdef FAL_PART_HAS_TABLE_CFG
 
 /* partition table */
-#define FAL_PART_TABLE                                                                                                     \
-{                                                                                                                          \
-    {FAL_PART_MAGIC_WROD, "bootloader", "onchip_flash_16k",  0 , FLASH_SIZE_GRANULARITY_16K , 0}, \
-    {FAL_PART_MAGIC_WROD, "param",      "onchip_flash_64k",  0 , FLASH_SIZE_GRANULARITY_64K , 0}, \
-    {FAL_PART_MAGIC_WROD, "app",        "onchip_flash_128k", 0 , FLASH_SIZE_GRANULARITY_128K, 0}, \
+#define FAL_PART_TABLE                                                      \
+{                                                                           \
+    {FAL_PART_MAGIC_WROD, "app", "stm32_onchip",  0 , 1024*1024 , 0},         \
+    {FAL_PART_MAGIC_WORD, "flash", "W25Q16JV",  0, 1024*1024, 0},           \
+    {FAL_PART_MAGIC_WORD, "download", "W25Q16JV", 1024*1024, 1024*1024, 0}, \
 }
 
 #endif /* FAL_PART_HAS_TABLE_CFG */

+ 95 - 0
bsp/air100st/rtt/board/ports/fal_flash_sfud_port.c

@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2018-01-26     armink       the first version
+ */
+
+#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             "W25Q16JV"
+#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        = 2 * 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;
+#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 */

+ 201 - 0
bsp/air100st/rtt/board/ports/fal_flash_stm32f4_port.c

@@ -0,0 +1,201 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2018-01-26     armink       the first version
+ */
+
+#include <fal.h>
+
+#include <stm32f4xx.h>
+
+/* base address of the flash sectors */
+#define ADDR_FLASH_SECTOR_0      ((uint32_t)0x08000000) /* Base address of Sector 0, 16 K bytes   */
+#define ADDR_FLASH_SECTOR_1      ((uint32_t)0x08004000) /* Base address of Sector 1, 16 K bytes   */
+#define ADDR_FLASH_SECTOR_2      ((uint32_t)0x08008000) /* Base address of Sector 2, 16 K bytes   */
+#define ADDR_FLASH_SECTOR_3      ((uint32_t)0x0800C000) /* Base address of Sector 3, 16 K bytes   */
+#define ADDR_FLASH_SECTOR_4      ((uint32_t)0x08010000) /* Base address of Sector 4, 64 K bytes   */
+#define ADDR_FLASH_SECTOR_5      ((uint32_t)0x08020000) /* Base address of Sector 5, 128 K bytes  */
+#define ADDR_FLASH_SECTOR_6      ((uint32_t)0x08040000) /* Base address of Sector 6, 128 K bytes  */
+#define ADDR_FLASH_SECTOR_7      ((uint32_t)0x08060000) /* Base address of Sector 7, 128 K bytes  */
+#define ADDR_FLASH_SECTOR_8      ((uint32_t)0x08080000) /* Base address of Sector 8, 128 K bytes  */
+#define ADDR_FLASH_SECTOR_9      ((uint32_t)0x080A0000) /* Base address of Sector 9, 128 K bytes  */
+#define ADDR_FLASH_SECTOR_10     ((uint32_t)0x080C0000) /* Base address of Sector 10, 128 K bytes */
+#define ADDR_FLASH_SECTOR_11     ((uint32_t)0x080E0000) /* Base address of Sector 11, 128 K bytes */
+
+/**
+ * Get the sector of a given address
+ *
+ * @param address flash address
+ *
+ * @return The sector of a given address
+ */
+static uint32_t stm32_get_sector(uint32_t address)
+{
+    uint32_t sector = 0;
+
+    #ifdef FLASH_SECTOR_0
+    #pragma message("FLASH_SECTOR_0 is defined")
+    #endif
+
+    if ((address < ADDR_FLASH_SECTOR_1) && (address >= ADDR_FLASH_SECTOR_0))
+    {
+        sector = FLASH_Sector_0;
+    }
+    else if ((address < ADDR_FLASH_SECTOR_2) && (address >= ADDR_FLASH_SECTOR_1))
+    {
+        sector = FLASH_Sector_1;
+    }
+    else if ((address < ADDR_FLASH_SECTOR_3) && (address >= ADDR_FLASH_SECTOR_2))
+    {
+        sector = FLASH_Sector_2;
+    }
+    else if ((address < ADDR_FLASH_SECTOR_4) && (address >= ADDR_FLASH_SECTOR_3))
+    {
+        sector = FLASH_Sector_3;
+    }
+    else if ((address < ADDR_FLASH_SECTOR_5) && (address >= ADDR_FLASH_SECTOR_4))
+    {
+        sector = FLASH_Sector_4;
+    }
+    else if ((address < ADDR_FLASH_SECTOR_6) && (address >= ADDR_FLASH_SECTOR_5))
+    {
+        sector = FLASH_Sector_5;
+    }
+    else if ((address < ADDR_FLASH_SECTOR_7) && (address >= ADDR_FLASH_SECTOR_6))
+    {
+        sector = FLASH_Sector_6;
+    }
+    else if ((address < ADDR_FLASH_SECTOR_8) && (address >= ADDR_FLASH_SECTOR_7))
+    {
+        sector = FLASH_Sector_7;
+    }
+    else if ((address < ADDR_FLASH_SECTOR_9) && (address >= ADDR_FLASH_SECTOR_8))
+    {
+        sector = FLASH_Sector_8;
+    }
+    else if ((address < ADDR_FLASH_SECTOR_10) && (address >= ADDR_FLASH_SECTOR_9))
+    {
+        sector = FLASH_Sector_9;
+    }
+    else if ((address < ADDR_FLASH_SECTOR_11) && (address >= ADDR_FLASH_SECTOR_10))
+    {
+        sector = FLASH_Sector_10;
+    }
+    else
+    {
+        sector = FLASH_Sector_11;
+    }
+
+    return sector;
+}
+
+/**
+ * Get the sector size
+ *
+ * @param sector sector
+ *
+ * @return sector size
+ */
+static uint32_t stm32_get_sector_size(uint32_t sector) {
+    assert(IS_FLASH_SECTOR(sector));
+
+    switch (sector) {
+    case FLASH_Sector_0: return 16 * 1024;
+    case FLASH_Sector_1: return 16 * 1024;
+    case FLASH_Sector_2: return 16 * 1024;
+    case FLASH_Sector_3: return 16 * 1024;
+    case FLASH_Sector_4: return 64 * 1024;
+    case FLASH_Sector_5: return 128 * 1024;
+    case FLASH_Sector_6: return 128 * 1024;
+    case FLASH_Sector_7: return 128 * 1024;
+    case FLASH_Sector_8: return 128 * 1024;
+    case FLASH_Sector_9: return 128 * 1024;
+    case FLASH_Sector_10: return 128 * 1024;
+    case FLASH_Sector_11: return 128 * 1024;
+    default : return 128 * 1024;
+    }
+}
+static int init(void)
+{
+    /* do nothing now */
+}
+
+static int read(long offset, uint8_t *buf, size_t size)
+{
+    size_t i;
+    uint32_t addr = stm32f4_onchip_flash.addr + offset;
+    for (i = 0; i < size; i++, addr++, buf++)
+    {
+        *buf = *(uint8_t *) addr;
+    }
+
+    return size;
+}
+
+static int write(long offset, const uint8_t *buf, size_t size)
+{
+    size_t i;
+    uint32_t read_data;
+    uint32_t addr = stm32f4_onchip_flash.addr + offset;
+
+    FLASH_Unlock();
+    FLASH_ClearFlag(
+            FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR
+                    | FLASH_FLAG_PGSERR);
+    for (i = 0; i < size; i++, buf++, addr++)
+    {
+        /* write data */
+        FLASH_ProgramByte(addr, *buf);
+        read_data = *(uint8_t *) addr;
+        /* check data */
+        if (read_data != *buf)
+        {
+            return -1;
+        }
+    }
+    FLASH_Lock();
+
+    return size;
+}
+
+static int erase(long offset, size_t size)
+{
+    FLASH_Status flash_status;
+    size_t erased_size = 0;
+    uint32_t cur_erase_sector;
+    uint32_t addr = stm32f4_onchip_flash.addr + offset;
+
+    /* start erase */
+    FLASH_Unlock();
+    FLASH_ClearFlag(
+            FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR
+                    | FLASH_FLAG_PGSERR);
+    /* it will stop when erased size is greater than setting size */
+    while (erased_size < size)
+    {
+        cur_erase_sector = stm32_get_sector(addr + erased_size);
+        flash_status = FLASH_EraseSector(cur_erase_sector, VoltageRange_3);
+        if (flash_status != FLASH_COMPLETE)
+        {
+            return -1;
+        }
+        erased_size += stm32_get_sector_size(cur_erase_sector);
+    }
+    FLASH_Lock();
+
+    return size;
+}
+
+const struct fal_flash_dev stm32f4_onchip_flash =
+{
+    .name       = "stm32_onchip",
+    .addr       = 0x08000000,
+    .len        = 1024*1024,
+    .blk_size   = 128*1024,
+    .ops        = {init, read, write, erase},
+    .write_gran = 8
+};

+ 3 - 3
bsp/air100st/rtt/board/ports/spi_flash_init.c

@@ -9,11 +9,11 @@
  */
 
 #include <rtthread.h>
-#include "spi_flash.h"
+//#include "spi_flash.h"
 #include "spi_flash_sfud.h"
 #include "drv_spi.h"
 
-#if defined(BSP_USING_SPI_FLASH)
+//#if defined(BSP_USING_SPI_FLASH)
 static int rt_hw_spi_flash_init(void)
 {
     __HAL_RCC_GPIOB_CLK_ENABLE();
@@ -27,5 +27,5 @@ static int rt_hw_spi_flash_init(void)
     return RT_EOK;
 }
 INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);
-#endif
+//#endif
 

+ 19 - 3
bsp/air100st/rtt/rtconfig.h

@@ -67,7 +67,6 @@
 #define FINSH_CMD_SIZE 80
 #define FINSH_USING_MSH
 #define FINSH_USING_MSH_DEFAULT
-#define FINSH_USING_MSH_ONLY
 #define FINSH_ARG_MAX 10
 
 /* Device virtual file system */
@@ -99,6 +98,7 @@
 #define RT_SERIAL_USING_DMA
 #define RT_SERIAL_RB_BUFSZ 64
 #define RT_USING_PIN
+#define RT_USING_MTD_NOR
 #define RT_USING_SDIO
 #define RT_SDIO_STACK_SIZE 512
 #define RT_SDIO_THREAD_PRIORITY 15
@@ -197,11 +197,26 @@
 
 /* system packages */
 
+#define PKG_USING_FAL
+#define FAL_DEBUG_CONFIG
+#define FAL_DEBUG 1
+#define FAL_PART_HAS_TABLE_CFG
+#define FAL_USING_SFUD_PORT
+#define FAL_USING_NOR_FLASH_DEV_NAME "W25Q16JV"
+#define PKG_USING_FAL_V00500
+#define PKG_FAL_VER_NUM 0x00500
+#define PKG_USING_LITTLEFS
+#define PKG_USING_LITTLEFS_V205
+#define LFS_READ_SIZE 256
+#define LFS_PROG_SIZE 256
+#define LFS_BLOCK_SIZE 4096
+#define LFS_CACHE_SIZE 256
+#define LFS_BLOCK_CYCLES 100
+#define LFS_LOOKAHEAD_MAX 128
 
 /* peripheral libraries and drivers */
 
 #define SDIO_MAX_FREQ 1000000
-#define BSP_USING_SPI1
 
 /* miscellaneous packages */
 
@@ -219,7 +234,6 @@
 
 #define BSP_USING_USB_TO_USART
 #define BSP_USING_COM3
-#define BSP_USING_SPI_FLASH
 #define BSP_USING_SDCARD
 
 /* On-chip Peripheral Drivers */
@@ -228,7 +242,9 @@
 #define BSP_USING_UART
 #define BSP_USING_UART1
 #define BSP_USING_UART3
+#define BSP_USING_ON_CHIP_FLASH
 #define BSP_USING_SPI
+#define BSP_USING_SPI1
 #define BSP_USING_SDIO
 #define BSP_USING_UDID
 

+ 3 - 0
luat/packages/lfs/SConscript

@@ -2,6 +2,9 @@ Import('RTT_ROOT')
 Import('rtconfig')
 from building import *
 
+if GetDepend(['PKG_USING_LITTLEFS']):
+    Return()
+
 cwd = GetCurrentDir()
 src	= Glob('*.c')
 CPPPATH = [cwd]