1 /*
2  * Copyright (c) 2006-2021, Bluetrum Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2021-11-16     greedyhao    first version
9  */
10 
11 #include "board.h"
12 #include "drv_flash.h"
13 
14 #ifdef BSP_USING_ON_CHIP_FLASH
15 
16 #if defined(RT_USING_FAL)
17 #include "fal.h"
18 #endif
19 
20 //#define DRV_DEBUG
21 #define LOG_TAG                "drv.flash"
22 #include <drv_log.h>
23 
24 #if defined(RT_USING_FAL)
25 
26 #define AB32_FLASH_START_ADDRESS    0x00000000
27 #define AB32_FLASH_SIZE             (1024 * 1024)
28 #define AB32_FLASH_PAGE_SIZE        (0x1000)
29 
30 static int fal_flash_read(long offset, rt_uint8_t *buf, size_t size);
31 static int fal_flash_write(long offset, const rt_uint8_t *buf, size_t size);
32 static int fal_flash_erase(long offset, size_t size);
33 
34 const struct fal_flash_dev ab32_onchip_flash =
35 {
36     "onchip_flash",
37     AB32_FLASH_START_ADDRESS,
38     AB32_FLASH_SIZE,
39     AB32_FLASH_PAGE_SIZE,
40     {NULL, fal_flash_read, fal_flash_write, fal_flash_erase},
41     256 * 8
42 };
43 
fal_flash_read(long offset,rt_uint8_t * buf,size_t size)44 static int fal_flash_read(long offset, rt_uint8_t *buf, size_t size)
45 {
46     return os_spiflash_read(buf, offset, size);
47 }
48 
fal_flash_write(long offset,const rt_uint8_t * buf,size_t size)49 static int fal_flash_write(long offset, const rt_uint8_t *buf, size_t size)
50 {
51     if (size % 256)
52     {
53         rt_kprintf("Flash write requires 256 byte alignment\n");
54         return -1;
55     }
56     os_spiflash_program(buf, offset, size);
57     return 0;
58 }
59 
fal_flash_erase(long offset,size_t size)60 static int fal_flash_erase(long offset, size_t size)
61 {
62     if (size % 4096)
63     {
64         rt_kprintf("Flash erase requires 4096 byte alignment\n");
65         return -1;
66     }
67     while (size > 0)
68     {
69         os_spiflash_erase(offset);
70         offset += 4096;
71         size -= 4096;
72     }
73     return 0;
74 }
75 
fal_ops_test(void)76 int fal_ops_test(void)
77 {
78     int result;
79     const struct fal_partition *part_dev = fal_partition_find("param");
80     uint8_t *data = rt_malloc(256);
81     int i;
82     int size = 256;
83     int addr = 0;
84 
85     for (int i = 0; i < 256; i++)
86     {
87         data[i] = i;
88     }
89 
90     result = fal_partition_write(part_dev, 0, data, 256);
91     if (result >= 0)
92     {
93         rt_kprintf("Write data success. Start from 0x%08X, size is %ld.\n", addr, size);
94         rt_kprintf("Write data: ");
95         for (i = 0; i < size; i++)
96         {
97             rt_kprintf("%d ", data[i]);
98         }
99         rt_kprintf(".\n");
100     }
101 
102     rt_memset(data, 0, 256);
103     result = fal_partition_read(part_dev, 0, data, 256);
104     if (result >= 0)
105     {
106         rt_kprintf("Read data success. Start from 0x%08X, size is %ld.\n", addr, size);
107         rt_kprintf("Read data: ");
108         for (i = 0; i < size; i++)
109         {
110             rt_kprintf("%d ", data[i]);
111         }
112         rt_kprintf(".\n");
113     }
114 
115     result = fal_partition_erase(part_dev, 0, 4096);
116     if (result >= 0)
117     {
118         rt_kprintf("Erase data success.\n");
119     }
120 
121     rt_memset(data, 0, 256);
122     result = fal_partition_read(part_dev, 0, data, 256);
123     if (result >= 0)
124     {
125         rt_kprintf("Read data success. Start from 0x%08X, size is %ld.\n", addr, size);
126         rt_kprintf("Read data: ");
127         for (i = 0; i < size; i++)
128         {
129             rt_kprintf("%d ", data[i]);
130         }
131         rt_kprintf(".\n");
132     }
133     rt_free(data);
134 
135     return 0;
136 }
137 MSH_CMD_EXPORT(fal_ops_test, "fal_ops_test");
138 
139 #endif
140 #endif/* BSP_USING_ON_CHIP_FLASH */
141