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