38
38
39
39
#define SAMD21_FLASH_PAGES_PER_SECTOR (SAMD21_FLASH_PAGES_PER_ROW*SAMD21_FLASH_ROWS_PER_SECTOR)
40
40
41
- static int samd21_flash_read (uint32_t address , void * dst , uint32_t num_bytes );
42
- static int samd21_flash_write (uint32_t address , const void * src ,
43
- uint32_t num_bytes );
44
- static int samd21_flash_erase_sector (uint32_t sector_address );
45
- static int samd21_flash_sector_info (int idx , uint32_t * addr , uint32_t * sz );
46
- static int samd21_flash_init (void );
41
+ static int samd21_flash_read (const struct hal_flash * dev , uint32_t address ,
42
+ void * dst , uint32_t num_bytes );
43
+ static int samd21_flash_write (const struct hal_flash * dev , uint32_t address ,
44
+ const void * src , uint32_t num_bytes );
45
+ static int samd21_flash_erase_sector (const struct hal_flash * dev ,
46
+ uint32_t sector_address );
47
+ static int samd21_flash_sector_info (const struct hal_flash * dev , int idx ,
48
+ uint32_t * addr , uint32_t * sz );
49
+ static int samd21_flash_init (const struct hal_flash * dev );
47
50
48
51
static const struct hal_flash_funcs samd21_flash_funcs = {
49
52
.hff_read = samd21_flash_read ,
@@ -59,51 +62,53 @@ struct hal_flash samd21_flash_dev = {
59
62
};
60
63
61
64
static int
62
- samd21_flash_read (uint32_t address , void * dst , uint32_t num_bytes )
65
+ samd21_flash_read (const struct hal_flash * dev , uint32_t address ,
66
+ void * dst , uint32_t num_bytes )
63
67
{
64
68
int base_address ;
65
69
int offset ;
66
70
struct nvm_parameters params ;
67
71
uint8_t page_buffer [64 ];
68
72
uint8_t * pdst = dst ;
69
-
73
+
70
74
/* make sure this fits into our stack buffer */
71
- nvm_get_parameters (& params );
75
+ nvm_get_parameters (& params );
72
76
assert (params .page_size <= sizeof (page_buffer ));
73
-
77
+
74
78
/* get the page address (this is not a sector, there are 4 pages per
75
79
* row */
76
- while (num_bytes ) {
80
+ while (num_bytes ) {
77
81
int read_len ;
78
-
82
+
79
83
base_address = address & ~(params .page_size - 1 );
80
-
84
+
81
85
offset = address - base_address ;
82
86
read_len = params .page_size - offset ;
83
-
87
+
84
88
if (read_len > num_bytes ) {
85
89
read_len = num_bytes ;
86
90
}
87
91
88
- if (nvm_read_buffer (base_address , page_buffer , params .page_size )
92
+ if (nvm_read_buffer (base_address , page_buffer , params .page_size )
89
93
!= STATUS_OK ) {
90
94
return -1 ;
91
95
}
92
-
96
+
93
97
/* move the pointers since this is a sure thing now */
94
98
num_bytes -= read_len ;
95
- address += read_len ;
99
+ address += read_len ;
96
100
97
101
/* copy it into the page buffer */
98
102
while (read_len -- ) {
99
103
* pdst ++ = page_buffer [offset ++ ];
100
- }
101
- }
104
+ }
105
+ }
102
106
return 0 ;
103
107
}
104
108
105
109
static int
106
- samd21_flash_write (uint32_t address , const void * src , uint32_t len )
110
+ samd21_flash_write (const struct hal_flash * dev , uint32_t address ,
111
+ const void * src , uint32_t len )
107
112
{
108
113
int base_address ;
109
114
int offset ;
@@ -162,19 +167,19 @@ samd21_flash_write(uint32_t address, const void *src, uint32_t len)
162
167
}
163
168
164
169
static int
165
- samd21_flash_erase_sector (uint32_t sector_address )
170
+ samd21_flash_erase_sector (const struct hal_flash * dev , uint32_t sector_address )
166
171
{
167
- struct nvm_parameters params ;
172
+ struct nvm_parameters params ;
168
173
int rc ;
169
174
int i ;
170
175
171
- nvm_get_parameters (& params );
172
-
176
+ nvm_get_parameters (& params );
177
+
173
178
/* erase all rows in the sector */
174
179
for (i = 0 ; i < SAMD21_FLASH_ROWS_PER_SECTOR ; i ++ ) {
175
- uint32_t row_address = sector_address +
180
+ uint32_t row_address = sector_address +
176
181
i * SAMD21_FLASH_PAGES_PER_ROW * params .page_size ;
177
- rc = nvm_erase_row (row_address );
182
+ rc = nvm_erase_row (row_address );
178
183
if (rc != STATUS_OK ) {
179
184
return -1 ;
180
185
}
@@ -184,53 +189,52 @@ samd21_flash_erase_sector(uint32_t sector_address)
184
189
185
190
/* samd21 flash always starts as 0x000000 */
186
191
static int
187
- samd21_flash_sector_info (int idx , uint32_t * addr , uint32_t * sz )
192
+ samd21_flash_sector_info (const struct hal_flash * dev , int idx ,
193
+ uint32_t * addr , uint32_t * sz )
188
194
{
189
195
struct nvm_parameters params ;
190
196
int sector_size ;
191
197
int sector_cnt ;
192
-
198
+
193
199
nvm_get_parameters (& params );
194
200
sector_cnt = params .nvm_number_of_pages /SAMD21_FLASH_PAGES_PER_SECTOR ;
195
201
sector_size = params .page_size * SAMD21_FLASH_PAGES_PER_SECTOR ;
196
-
202
+
197
203
if ((idx >= sector_cnt ) || (idx < 0 )){
198
204
return -1 ;
199
205
}
200
-
206
+
201
207
* sz = sector_size ;
202
- * addr = idx * sector_size + SAMD21_FLASH_START_ADDR ;
208
+ * addr = idx * sector_size + SAMD21_FLASH_START_ADDR ;
203
209
return 0 ;
204
210
}
205
211
206
212
static int
207
- samd21_flash_init (void )
213
+ samd21_flash_init (const struct hal_flash * dev )
208
214
{
209
215
int rc ;
210
216
struct nvm_config cfg ;
211
217
struct nvm_parameters params ;
212
218
nvm_get_config_defaults (& cfg );
213
-
219
+
214
220
cfg .manual_page_write = false;
215
221
rc = nvm_set_config (& cfg );
216
222
if (rc != STATUS_OK ) {
217
223
return -1 ;
218
224
}
219
-
220
- nvm_get_parameters (& params );
221
225
222
- /* the samd21 flash doesn't use sector terminology. They use Row and
226
+ nvm_get_parameters (& params );
227
+
228
+ /* the samd21 flash doesn't use sector terminology. They use Row and
223
229
* page. A row contains 4 pages. Each pages is a fixed size. You can
224
- * only erase based on row. Here I will map the rows to sectors and
225
- * deal with pages inside this driver. */
230
+ * only erase based on row. Here I will map the rows to sectors and
231
+ * deal with pages inside this driver. */
226
232
samd21_flash_dev .hf_itf = & samd21_flash_funcs ;
227
233
samd21_flash_dev .hf_base_addr = SAMD21_FLASH_START_ADDR ;
228
234
samd21_flash_dev .hf_size = params .nvm_number_of_pages * params .page_size ;
229
- samd21_flash_dev .hf_sector_cnt =
235
+ samd21_flash_dev .hf_sector_cnt =
230
236
params .nvm_number_of_pages /SAMD21_FLASH_PAGES_PER_SECTOR ;
231
237
samd21_flash_dev .hf_align = 1 ;
232
-
238
+
233
239
return 0 ;
234
240
}
235
-
236
-
0 commit comments