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