1 /*
2  * Copyright (c) 2006-2018, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2018-01-26     armink       the first version
9  */
10 
11 #include <fal.h>
12 #include <sfud.h>
13 
14 #ifdef FAL_USING_SFUD_PORT
15 #ifdef RT_USING_SFUD
16 #include <dev_spi_flash_sfud.h>
17 #endif
18 
19 #ifndef FAL_USING_NOR_FLASH_DEV_NAME
20 #define FAL_USING_NOR_FLASH_DEV_NAME             "norflash0"
21 #endif
22 
23 static int init(void);
24 static int read(long offset, rt_uint8_t *buf, rt_size_t size);
25 static int write(long offset, const rt_uint8_t *buf, rt_size_t size);
26 static int erase(long offset, rt_size_t size);
27 
28 static sfud_flash_t sfud_dev = NULL;
29 struct fal_flash_dev nor_flash0 =
30 {
31     .name       = FAL_USING_NOR_FLASH_DEV_NAME,
32     .addr       = 0,
33     .len        = 8 * 1024 * 1024,
34     .blk_size   = 4096,
35     .ops        = {init, read, write, erase},
36     .write_gran = 1
37 };
38 
init(void)39 static int init(void)
40 {
41 
42 #ifdef RT_USING_SFUD
43     /* RT-Thread RTOS platform */
44     sfud_dev = rt_sfud_flash_find_by_dev_name(FAL_USING_NOR_FLASH_DEV_NAME);
45 #else
46     /* bare metal platform */
47     extern sfud_flash sfud_norflash0;
48     sfud_dev = &sfud_norflash0;
49 #endif
50 
51     if (NULL == sfud_dev)
52     {
53         return -1;
54     }
55 
56     /* update the flash chip information */
57     nor_flash0.blk_size = sfud_dev->chip.erase_gran;
58     nor_flash0.len = sfud_dev->chip.capacity;
59 
60     return 0;
61 }
62 
read(long offset,rt_uint8_t * buf,rt_size_t size)63 static int read(long offset, rt_uint8_t *buf, rt_size_t size)
64 {
65     RT_ASSERT(sfud_dev);
66     RT_ASSERT(sfud_dev->init_ok);
67     sfud_read(sfud_dev, nor_flash0.addr + offset, size, buf);
68 
69     return size;
70 }
71 
write(long offset,const rt_uint8_t * buf,rt_size_t size)72 static int write(long offset, const rt_uint8_t *buf, rt_size_t size)
73 {
74     RT_ASSERT(sfud_dev);
75     RT_ASSERT(sfud_dev->init_ok);
76     if (sfud_write(sfud_dev, nor_flash0.addr + offset, size, buf) != SFUD_SUCCESS)
77     {
78         return -1;
79     }
80 
81     return size;
82 }
83 
erase(long offset,rt_size_t size)84 static int erase(long offset, rt_size_t size)
85 {
86     RT_ASSERT(sfud_dev);
87     RT_ASSERT(sfud_dev->init_ok);
88     if (sfud_erase(sfud_dev, nor_flash0.addr + offset, size) != SFUD_SUCCESS)
89     {
90         return -1;
91     }
92 
93     return size;
94 }
95 #endif /* FAL_USING_SFUD_PORT */
96 
97