SPI 介紹
SPI 原理:
FAL (Flash Abstraction Layer) Flash 抽象層
DFS (Device File System) 設備虛擬文件系統
DFS 的層次架構圖:
ROMFS
ARTPI 外部 SPI Flash
ARTPI 有一個外部 SPI Flash,空間為 16-Mbytes,使用的是 ARTPI 的 SPI1 接口。
查閱 Flash 的數據手冊可知,扇區大小為 4KB,也就是 4096B:
整體思路
在 meunconfig 中開啟 DFS,本教程使用 elmfatfs 文件系統,需要將 elmfatfs 掛載到 RT-Thread 的 DFS 上,所以 elmfatfs 也要開啟:
注意要把扇區大小改成上面查閱的 4096:
當然,不要忘記在 meunconfig 中開啟 SPI Flash filesystem:
此時 scons --target=mdk5 然后編譯下載,運行結果會是這樣:
顯示兩個報錯:
一是 Flash 上面的 filesystem 分區(在上方輸出的 FAL 分區表種可以找到,對應的定義在 fal_cfg.h 文件中)掛載到 /flash 上失敗了;二是 lfs 文件系統沒有找到
我們在 filesystem.c 中找到了報錯對應的代碼:
可以看出來這部分代碼是掛載 lfs 文件系統,于是上面報錯的原因找到了:我們使用的是 elm-FATFS 系統,需要手動修改一下掛載代碼。
我們創建設備的時候是 BLK 設備,要用 fal_blk_device_create 這個函數。
代碼修改之后是這樣:
照葫蘆畫瓢寫個 elm 系統的掛載,主要的區別有:
1.注冊設備用的 fal_blk_device_create 而非 fal_mtd_nor_device_create
2.掛載到 / 而非 /flash
3.文件系統使用 elm 而非 rom
修改完之后重新編譯下載,發現依舊報錯,運行 ls 查看一下情況,發現是這樣:
再次返回查看代碼,原來是這里導致的:
使用了 romfs,然后開啟了 flash 和 sdcard 兩塊區域。這里我們需要默認不使用 ROMFS,改成這樣:
另外在 menuconfig 中查看,發現這個宏是默認開啟的,找到是在 boards/Kconfig 中默認選擇了,需要注釋掉:
到對應的選項取消掉這個宏:
最終,filesystem.c 的代碼完整版如下:
/*
Copyright (c) 2006-2022, RT-Thread Development Team
SPDX-License-Identifier: Apache-2.0
Change Logs:
Date Author Notes
2018-12-13 balanceTWK add sdcard port file 2019-06-11 WillianChan Add SD card hot plug detection
/
#include
#ifdef BSP_USING_FS
#if DFS_FILESYSTEMS_MAX < 4
#error "Please define DFS_FILESYSTEMS_MAX more than 4"
#endif
#if DFS_FILESYSTEM_TYPES_MAX < 4
#error "Please define DFS_FILESYSTEM_TYPES_MAX more than 4"
#endif
#include
#ifdef BSP_USING_SDCARD_FS
#include
#include "drv_sdio.h"
#endif
#ifdef BSP_USING_SPI_FLASH_FS
#include "fal.h"
#endif
#define DBG_TAG "app.filesystem"
#define DBG_LVL DBG_INFO
#include
#ifdef RT_USING_DFS_ROMFS / 默認不使用 ROMFS */
#include "dfs_romfs.h"
static const struct romfs_dirent _romfs_root[] =
{
{ROMFS_DIRENT_DIR, "flash", RT_NULL, 0},
{ROMFS_DIRENT_DIR, "sdcard", RT_NULL, 0}
};
const struct romfs_dirent romfs_root =
{
ROMFS_DIRENT_DIR, "/", (rt_uint8_t )_romfs_root, sizeof(_romfs_root) / sizeof(_romfs_root[0])
};
#endif
#ifdef BSP_USING_SDCARD_FS
/ SD Card hot plug detection pin */
#define SD_CHECK_PIN GET_PIN(D, 5)
static void _sdcard_mount(void)
{
rt_device_t device;
device = rt_device_find("sd0");
if (device == NULL)
{
mmcsd_wait_cd_changed(0);
sdcard_change();
mmcsd_wait_cd_changed(RT_WAITING_FOREVER);
device = rt_device_find("sd0");
}
if (device != RT_NULL)
{
if (dfs_mount("sd0", "/sdcard", "elm", 0, 0) == RT_EOK)
{
LOG_I("sd card mount to '/sdcard'");
}
else
{
LOG_W("sd card mount to '/sdcard' failed!");
}
}
}
static void _sdcard_unmount(void)
{
rt_thread_mdelay(200);
dfs_unmount("/sdcard");
LOG_I("Unmount "/sdcard"");
mmcsd_wait_cd_changed(0);
sdcard_change();
mmcsd_wait_cd_changed(RT_WAITING_FOREVER);
}
static void sd_mount(void parameter)
{
rt_uint8_t re_sd_check_pin = 1;
rt_thread_mdelay(200);
if (rt_pin_read(SD_CHECK_PIN))
{
_sdcard_mount();
}
while (1)
{
rt_thread_mdelay(200);
if (!re_sd_check_pin && (re_sd_check_pin = rt_pin_read(SD_CHECK_PIN)) != 0)
{
_sdcard_mount();
}
if (re_sd_check_pin && (re_sd_check_pin = rt_pin_read(SD_CHECK_PIN)) == 0)
{
_sdcard_unmount();
}
}
}
#endif / BSP_USING_SDCARD_FS */
int mnt_spi_flash_init(void)
{
struct rt_device flash_dev = RT_NULL;
#ifndef RT_USING_WIFI
fal_init();
#endif
flash_dev = fal_blk_device_create("filesystem");
if (flash_dev)
{
//mount filesystem
if (dfs_mount(flash_dev->parent.name, "/", "elm", 0, 0) != 0)
{
LOG_W("mount to '/' failed! try to mkfs %s", flash_dev->parent.name);
dfs_mkfs("elm", flash_dev->parent.name);
if (dfs_mount(flash_dev->parent.name, "/", "elm", 0, 0) == 0)
{
LOG_I("mount to '/' success!");
}
}
else
{
LOG_I("mount to '/' success!");
}
}
else
{
LOG_E("Can't create block device filesystem or bt_image partition.");
}
}
int mount_init(void)
{
#ifdef RT_USING_DFS_ROMFS / 默認不使用ROMFS */
if (dfs_mount(RT_NULL, "/", "rom", 0, &(romfs_root)) != 0)
{
LOG_E("rom mount to '/' failed!");
}
#endif
#ifdef BSP_USING_SPI_FLASH_FS
mnt_spi_flash_init();
#if 0
struct rt_device flash_dev = RT_NULL;
#ifndef RT_USING_WIFI
fal_init();
#endif
flash_dev = fal_mtd_nor_device_create("filesystem");
if (flash_dev)
{
//mount filesystem
if (dfs_mount(flash_dev->parent.name, "/flash", "lfs", 0, 0) != 0)
{
LOG_W("mount to '/flash' failed! try to mkfs %s", flash_dev->parent.name);
dfs_mkfs("lfs", flash_dev->parent.name);
if (dfs_mount(flash_dev->parent.name, "/flash", "lfs", 0, 0) == 0)
{
LOG_I("mount to '/flash' success!");
}
}
else
{
LOG_I("mount to '/flash' success!");
}
}
else
{
LOG_E("Can't create block device filesystem or bt_image partition.");
}
#endif
#endif
#ifdef BSP_USING_SDCARD_FS
rt_thread_t tid;
rt_pin_mode(SD_CHECK_PIN, PIN_MODE_INPUT_PULLUP);
tid = rt_thread_create("sd_mount", sd_mount, RT_NULL,
2048, RT_THREAD_PRIORITY_MAX - 2, 20);
if (tid != RT_NULL)
{
rt_thread_startup(tid);
}
else
{
LOG_E("create sd_mount thread err!");
}
#endif
return RT_EOK;
}
INIT_APP_EXPORT(mount_init);
#endif / BSP_USING_FS */
重新生成、編譯、下載,運行結果如下:
大功告成!
-
SPI
+關注
關注
17文章
1707瀏覽量
91703 -
RT-Thread
+關注
關注
31文章
1293瀏覽量
40212 -
FatFS文件系統
+關注
關注
0文章
12瀏覽量
7553 -
DFS
+關注
關注
0文章
26瀏覽量
9172 -
ART-Pi
+關注
關注
0文章
23瀏覽量
1306
發布評論請先 登錄
相關推薦
評論