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