1 /*
2 * Copyright (c) 2006-2024, RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 * 2018-12-14 balanceTWK add sdcard port file
9 * 2021-02-26 Meco Man fix a bug that cannot use fatfs in the main thread at starting up
10 */
11
12 #include <rtthread.h>
13
14 #if defined(BSP_USING_SPI7) && defined(RT_USING_SFUD) && defined(RT_USING_DFS) && defined(RT_USING_DFS_ELMFAT)
15 #include <dfs_elm.h>
16 #include "dev_spi_flash_sfud.h"
17 #include "dfs_fs.h"
18 #include "dfs.h"
19 #include "dfs_file.h"
20
21 #define DBG_TAG "app.filesystem_spi_flash"
22 #define DBG_LVL DBG_INFO
23 #include <rtdbg.h>
24
25 #define W25Q64_SPI_DEVICE_NAME "spi70"
26 #define W25Q64_SPI_BUS_NAME "spi7"
27 #define W25Q64_SPI_FLASH_NAME "w25qxx"
28 #define W25Q64_SPI_FLASH_CS_PIN 96
29
30 #define W25Q64_FS_MOUNT_PATH "/"
31
app_filesystem_init(void)32 static int app_filesystem_init(void)
33 {
34 rt_err_t ret = RT_EOK;
35 struct rt_spi_device *spi_device = rt_malloc(sizeof(struct rt_spi_device));
36
37 if (!spi_device)
38 {
39 LOG_W("spi sample run failed! can't find %s device!\n", W25Q64_SPI_BUS_NAME);
40 return -RT_ERROR;
41 }
42
43 struct rt_spi_configuration cfg =
44 {
45 .data_width = 8,
46 .mode = RT_SPI_MASTER | RT_SPI_MODE_3 | RT_SPI_MSB,
47 .max_hz = 50 * 1000 * 1000,
48 };
49 ret = rt_spi_configure(spi_device, &cfg);
50 if (ret != RT_EOK)
51 {
52 LOG_E("SPI bus configuration failed.\n");
53 return -RT_ERROR;
54 }
55
56 ret = rt_spi_bus_attach_device_cspin(spi_device, W25Q64_SPI_DEVICE_NAME, W25Q64_SPI_BUS_NAME, W25Q64_SPI_FLASH_CS_PIN, RT_NULL);
57 if (ret != RT_EOK)
58 {
59 LOG_E("SPI flash device attach failed.\n");
60 return -RT_ERROR;
61 }
62
63 if (RT_NULL == rt_sfud_flash_probe(W25Q64_SPI_FLASH_NAME, W25Q64_SPI_DEVICE_NAME))
64 {
65 LOG_E("Flash sfud Failed!\n");
66 return -RT_ERROR;
67 }
68
69 if (dfs_mount(W25Q64_SPI_FLASH_NAME, W25Q64_FS_MOUNT_PATH, "elm", 0, 0) != 0)
70 {
71 LOG_W("Initial ELM FAT mount failed, trying to format block device.\n");
72
73 if (dfs_mkfs("elm", W25Q64_SPI_FLASH_NAME) != 0)
74 {
75 LOG_E("Failed to create ELM FAT filesystem.\n");
76 return -4;
77 }
78
79 if (dfs_mount(W25Q64_SPI_FLASH_NAME, W25Q64_FS_MOUNT_PATH, "elm", 0, 0) != 0)
80 {
81 LOG_E("Failed to mount ELM FAT filesystem, check mount point.\n");
82 return -5;
83 }
84 }
85
86 LOG_I("ELM FAT filesystem mounted.\n");
87
88 return RT_EOK;
89 }
90
91 INIT_APP_EXPORT(app_filesystem_init);
92
93 #endif /* BSP_USING_SPI7/RT_USING_SFUD/RT_USING_DFS/RT_USING_DFS_ELMFAT */
94