15
15
16
16
LOG_MODULE_REGISTER (flash_ambiq , CONFIG_FLASH_LOG_LEVEL );
17
17
18
- #define SOC_NV_FLASH_NODE DT_INST(0, soc_nv_flash)
19
- #define SOC_NV_FLASH_ADDR DT_REG_ADDR(SOC_NV_FLASH_NODE)
20
- #define SOC_NV_FLASH_SIZE DT_REG_SIZE(SOC_NV_FLASH_NODE)
21
- #define MIN_WRITE_SIZE 16
18
+ #define SOC_NV_FLASH_NODE DT_INST(0, soc_nv_flash)
19
+ #define SOC_NV_FLASH_ADDR DT_REG_ADDR(SOC_NV_FLASH_NODE)
20
+ #define SOC_NV_FLASH_SIZE DT_REG_SIZE(SOC_NV_FLASH_NODE)
21
+ #if (CONFIG_SOC_SERIES_APOLLO4X )
22
+ #define MIN_WRITE_SIZE 16
23
+ #else
24
+ #define MIN_WRITE_SIZE 4
25
+ #endif /* CONFIG_SOC_SERIES_APOLLO4X */
22
26
#define FLASH_WRITE_BLOCK_SIZE MAX(DT_PROP(SOC_NV_FLASH_NODE, write_block_size), MIN_WRITE_SIZE)
23
27
#define FLASH_ERASE_BLOCK_SIZE DT_PROP(SOC_NV_FLASH_NODE, erase_block_size)
24
28
25
29
BUILD_ASSERT ((FLASH_WRITE_BLOCK_SIZE & (MIN_WRITE_SIZE - 1 )) == 0 ,
26
- "The flash write block size must be a multiple of 16 !" );
30
+ "The flash write block size must be a multiple of MIN_WRITE_SIZE !" );
27
31
28
32
#define FLASH_ERASE_BYTE 0xFF
29
33
#define FLASH_ERASE_WORD \
@@ -77,7 +81,7 @@ static int flash_ambiq_write(const struct device *dev, off_t offset, const void
77
81
ARG_UNUSED (dev );
78
82
79
83
int ret = 0 ;
80
- uint32_t critical = 0 ;
84
+ unsigned int key = 0 ;
81
85
uint32_t aligned [FLASH_WRITE_BLOCK_SIZE / sizeof (uint32_t )] = {0 };
82
86
uint32_t * src = (uint32_t * )data ;
83
87
@@ -96,22 +100,31 @@ static int flash_ambiq_write(const struct device *dev, off_t offset, const void
96
100
97
101
FLASH_SEM_TAKE ();
98
102
99
- critical = am_hal_interrupt_master_disable ();
103
+ key = irq_lock ();
104
+
100
105
for (int i = 0 ; i < len / FLASH_WRITE_BLOCK_SIZE ; i ++ ) {
101
106
for (int j = 0 ; j < FLASH_WRITE_BLOCK_SIZE / sizeof (uint32_t ); j ++ ) {
102
107
/* Make sure the source data is 4-byte aligned. */
103
108
aligned [j ] = UNALIGNED_GET ((uint32_t * )src );
104
109
src ++ ;
105
110
}
111
+ #if (CONFIG_SOC_SERIES_APOLLO4X )
106
112
ret = am_hal_mram_main_program (
107
113
AM_HAL_MRAM_PROGRAM_KEY , aligned ,
108
114
(uint32_t * )(SOC_NV_FLASH_ADDR + offset + i * FLASH_WRITE_BLOCK_SIZE ),
109
115
FLASH_WRITE_BLOCK_SIZE / sizeof (uint32_t ));
116
+ #elif (CONFIG_SOC_SERIES_APOLLO3X )
117
+ ret = am_hal_flash_program_main (
118
+ AM_HAL_FLASH_PROGRAM_KEY , aligned ,
119
+ (uint32_t * )(SOC_NV_FLASH_ADDR + offset + i * FLASH_WRITE_BLOCK_SIZE ),
120
+ FLASH_WRITE_BLOCK_SIZE / sizeof (uint32_t ));
121
+ #endif /* CONFIG_SOC_SERIES_APOLLO4X */
110
122
if (ret ) {
111
123
break ;
112
124
}
113
125
}
114
- am_hal_interrupt_master_set (critical );
126
+
127
+ irq_unlock (key );
115
128
116
129
FLASH_SEM_GIVE ();
117
130
@@ -128,17 +141,42 @@ static int flash_ambiq_erase(const struct device *dev, off_t offset, size_t len)
128
141
return - EINVAL ;
129
142
}
130
143
131
- /* The erase address and length alignment check will be done in HAL.*/
132
-
133
144
if (len == 0 ) {
134
145
return 0 ;
135
146
}
136
147
148
+ #if (CONFIG_SOC_SERIES_APOLLO4X )
149
+ /* The erase address and length alignment check will be done in HAL.*/
150
+ #elif (CONFIG_SOC_SERIES_APOLLO3X )
151
+ if ((offset % FLASH_ERASE_BLOCK_SIZE ) != 0 ) {
152
+ LOG_ERR ("offset 0x%lx is not on a page boundary" , (long )offset );
153
+ return - EINVAL ;
154
+ }
155
+
156
+ if ((len % FLASH_ERASE_BLOCK_SIZE ) != 0 ) {
157
+ LOG_ERR ("len %zu is not multiple of a page size" , len );
158
+ return - EINVAL ;
159
+ }
160
+ #endif /* CONFIG_SOC_SERIES_APOLLO4X */
161
+
137
162
FLASH_SEM_TAKE ();
138
163
164
+ #if (CONFIG_SOC_SERIES_APOLLO4X )
139
165
ret = am_hal_mram_main_fill (AM_HAL_MRAM_PROGRAM_KEY , FLASH_ERASE_WORD ,
140
166
(uint32_t * )(SOC_NV_FLASH_ADDR + offset ),
141
167
(len / sizeof (uint32_t )));
168
+ #elif (CONFIG_SOC_SERIES_APOLLO3X )
169
+ unsigned int key = 0 ;
170
+
171
+ key = irq_lock ();
172
+
173
+ ret = am_hal_flash_page_erase (
174
+ AM_HAL_FLASH_PROGRAM_KEY ,
175
+ AM_HAL_FLASH_ADDR2INST (((uint32_t )SOC_NV_FLASH_ADDR + offset )),
176
+ AM_HAL_FLASH_ADDR2PAGE (((uint32_t )SOC_NV_FLASH_ADDR + offset )));
177
+
178
+ irq_unlock (key );
179
+ #endif /* CONFIG_SOC_SERIES_APOLLO4X */
142
180
143
181
FLASH_SEM_GIVE ();
144
182
0 commit comments