Blame view
env/flash.c
9.13 KB
83d290c56 SPDX: Convert all... |
1 |
// SPDX-License-Identifier: GPL-2.0+ |
c609719b8 Initial revision |
2 |
/* |
ea882baf9 New implementatio... |
3 |
* (C) Copyright 2000-2010 |
c609719b8 Initial revision |
4 5 6 7 |
* Wolfgang Denk, DENX Software Engineering, wd@denx.de. * * (C) Copyright 2001 Sysgo Real-Time Solutions, GmbH <www.elinos.com> * Andreas Heppel <aheppel@sysgo.de> |
c609719b8 Initial revision |
8 9 10 11 12 |
*/ /* #define DEBUG */ #include <common.h> |
c609719b8 Initial revision |
13 |
#include <command.h> |
db1970103 env: Move env_val... |
14 |
#include <env.h> |
f3998fdc4 env: Rename envir... |
15 |
#include <env_internal.h> |
0ee48252b common: Move flas... |
16 |
#include <flash.h> |
c609719b8 Initial revision |
17 |
#include <linux/stddef.h> |
47cd00fa7 * Patches by Robe... |
18 |
#include <malloc.h> |
ea882baf9 New implementatio... |
19 20 |
#include <search.h> #include <errno.h> |
3db711085 crc32: Use the cr... |
21 |
#include <u-boot/crc.h> |
c609719b8 Initial revision |
22 |
|
d87080b72 GCC-4.x fixes: cl... |
23 |
DECLARE_GLOBAL_DATA_PTR; |
4415f1d1f env: Create a loc... |
24 25 26 27 28 29 |
#ifndef CONFIG_SPL_BUILD # if defined(CONFIG_CMD_SAVEENV) && defined(CONFIG_CMD_FLASH) # define CMD_SAVEENV # elif defined(CONFIG_ENV_ADDR_REDUND) # error CONFIG_ENV_ADDR_REDUND must have CONFIG_CMD_SAVEENV & CONFIG_CMD_FLASH # endif |
c609719b8 Initial revision |
30 |
#endif |
4415f1d1f env: Create a loc... |
31 32 33 34 35 36 37 38 39 40 41 |
/* TODO(sjg@chromium.org): Figure out all these special cases */ #if (!defined(CONFIG_MICROBLAZE) && !defined(CONFIG_ARCH_ZYNQ) && \ !defined(CONFIG_TARGET_MCCMON6) && !defined(CONFIG_TARGET_X600) && \ !defined(CONFIG_TARGET_EDMINIV2)) || \ !defined(CONFIG_SPL_BUILD) #define LOADENV #endif #if !defined(CONFIG_TARGET_X600) || !defined(CONFIG_SPL_BUILD) #define INITENV #endif |
b6cba297a env: allow flash ... |
42 43 |
#if defined(CONFIG_ENV_ADDR_REDUND) && defined(CMD_SAVEENV) || \ !defined(CONFIG_ENV_ADDR_REDUND) && defined(INITENV) |
c609719b8 Initial revision |
44 |
#ifdef ENV_IS_EMBEDDED |
be54ec162 env: Rename envir... |
45 |
static env_t *env_ptr = &embedded_environment; |
c609719b8 Initial revision |
46 |
#else /* ! ENV_IS_EMBEDDED */ |
b6cba297a env: allow flash ... |
47 |
static env_t *env_ptr = (env_t *)CONFIG_ENV_ADDR; |
c609719b8 Initial revision |
48 |
#endif /* ENV_IS_EMBEDDED */ |
b6cba297a env: allow flash ... |
49 50 |
#endif static __maybe_unused env_t *flash_addr = (env_t *)CONFIG_ENV_ADDR; |
c609719b8 Initial revision |
51 |
|
ea882baf9 New implementatio... |
52 |
/* CONFIG_ENV_ADDR is supposed to be on sector boundary */ |
e5bce247b env: Switch over ... |
53 54 |
static ulong __maybe_unused end_addr = CONFIG_ENV_ADDR + CONFIG_ENV_SECT_SIZE - 1; |
ea882baf9 New implementatio... |
55 |
|
0e8d15866 rename CFG_ENV ma... |
56 |
#ifdef CONFIG_ENV_ADDR_REDUND |
e5bce247b env: Switch over ... |
57 |
static env_t __maybe_unused *flash_addr_new = (env_t *)CONFIG_ENV_ADDR_REDUND; |
c609719b8 Initial revision |
58 |
|
ea882baf9 New implementatio... |
59 |
/* CONFIG_ENV_ADDR_REDUND is supposed to be on sector boundary */ |
e5bce247b env: Switch over ... |
60 61 |
static ulong __maybe_unused end_addr_new = CONFIG_ENV_ADDR_REDUND + CONFIG_ENV_SECT_SIZE - 1; |
0e8d15866 rename CFG_ENV ma... |
62 |
#endif /* CONFIG_ENV_ADDR_REDUND */ |
c609719b8 Initial revision |
63 |
|
0e8d15866 rename CFG_ENV ma... |
64 |
#ifdef CONFIG_ENV_ADDR_REDUND |
4415f1d1f env: Create a loc... |
65 |
#ifdef INITENV |
e5bce247b env: Switch over ... |
66 |
static int env_flash_init(void) |
c609719b8 Initial revision |
67 |
{ |
8ed960461 * Patches by Rich... |
68 |
int crc1_ok = 0, crc2_ok = 0; |
c609719b8 Initial revision |
69 70 71 72 73 74 75 |
uchar flag1 = flash_addr->flags; uchar flag2 = flash_addr_new->flags; ulong addr_default = (ulong)&default_environment[0]; ulong addr1 = (ulong)&(flash_addr->data); ulong addr2 = (ulong)&(flash_addr_new->data); |
82b54b972 env: clean env_fl... |
76 77 78 79 80 81 |
crc1_ok = crc32(0, flash_addr->data, ENV_SIZE) == flash_addr->crc; crc2_ok = crc32(0, flash_addr_new->data, ENV_SIZE) == flash_addr_new->crc; if (crc1_ok && !crc2_ok) { gd->env_addr = addr1; |
203e94f6c env: Add an enum ... |
82 |
gd->env_valid = ENV_VALID; |
82b54b972 env: clean env_fl... |
83 84 |
} else if (!crc1_ok && crc2_ok) { gd->env_addr = addr2; |
203e94f6c env: Add an enum ... |
85 |
gd->env_valid = ENV_VALID; |
82b54b972 env: clean env_fl... |
86 87 |
} else if (!crc1_ok && !crc2_ok) { gd->env_addr = addr_default; |
2d7cb5b42 env: Replace all ... |
88 |
gd->env_valid = ENV_INVALID; |
d3716dd64 env: Rename the r... |
89 90 |
} else if (flag1 == ENV_REDUND_ACTIVE && flag2 == ENV_REDUND_OBSOLETE) { |
82b54b972 env: clean env_fl... |
91 |
gd->env_addr = addr1; |
203e94f6c env: Add an enum ... |
92 |
gd->env_valid = ENV_VALID; |
d3716dd64 env: Rename the r... |
93 94 |
} else if (flag1 == ENV_REDUND_OBSOLETE && flag2 == ENV_REDUND_ACTIVE) { |
82b54b972 env: clean env_fl... |
95 |
gd->env_addr = addr2; |
203e94f6c env: Add an enum ... |
96 |
gd->env_valid = ENV_VALID; |
c3f9d4939 * Patch by Yuli B... |
97 |
} else if (flag1 == flag2) { |
82b54b972 env: clean env_fl... |
98 |
gd->env_addr = addr1; |
203e94f6c env: Add an enum ... |
99 |
gd->env_valid = ENV_REDUND; |
c3f9d4939 * Patch by Yuli B... |
100 |
} else if (flag1 == 0xFF) { |
82b54b972 env: clean env_fl... |
101 |
gd->env_addr = addr1; |
203e94f6c env: Add an enum ... |
102 |
gd->env_valid = ENV_REDUND; |
c3f9d4939 * Patch by Yuli B... |
103 |
} else if (flag2 == 0xFF) { |
82b54b972 env: clean env_fl... |
104 |
gd->env_addr = addr2; |
203e94f6c env: Add an enum ... |
105 |
gd->env_valid = ENV_REDUND; |
c609719b8 Initial revision |
106 |
} |
ea882baf9 New implementatio... |
107 |
return 0; |
c609719b8 Initial revision |
108 |
} |
4415f1d1f env: Create a loc... |
109 |
#endif |
c609719b8 Initial revision |
110 |
|
e7e5bb316 s32v234: flash: R... |
111 |
#ifdef CONFIG_CMD_SAVEENV |
e5bce247b env: Switch over ... |
112 |
static int env_flash_save(void) |
c609719b8 Initial revision |
113 |
{ |
ea882baf9 New implementatio... |
114 |
env_t env_new; |
7ce1526ed env: Add env_expo... |
115 |
char *saved_data = NULL; |
d3716dd64 env: Rename the r... |
116 |
char flag = ENV_REDUND_OBSOLETE, new_flag = ENV_REDUND_ACTIVE; |
82b54b972 env: clean env_fl... |
117 |
int rc = 1; |
0e8d15866 rename CFG_ENV ma... |
118 |
#if CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE |
ea882baf9 New implementatio... |
119 |
ulong up_data = 0; |
500545cc6 Fix problem with ... |
120 |
#endif |
c609719b8 Initial revision |
121 |
|
82b54b972 env: clean env_fl... |
122 123 |
debug("Protect off %08lX ... %08lX ", (ulong)flash_addr, end_addr); |
c609719b8 Initial revision |
124 |
|
82b54b972 env: clean env_fl... |
125 |
if (flash_sect_protect(0, (ulong)flash_addr, end_addr)) |
ea882baf9 New implementatio... |
126 |
goto done; |
c609719b8 Initial revision |
127 |
|
ea882baf9 New implementatio... |
128 129 |
debug("Protect off %08lX ... %08lX ", |
c609719b8 Initial revision |
130 |
(ulong)flash_addr_new, end_addr_new); |
82b54b972 env: clean env_fl... |
131 |
if (flash_sect_protect(0, (ulong)flash_addr_new, end_addr_new)) |
ea882baf9 New implementatio... |
132 |
goto done; |
ea882baf9 New implementatio... |
133 |
|
7ce1526ed env: Add env_expo... |
134 135 136 |
rc = env_export(&env_new); if (rc) return rc; |
82b54b972 env: clean env_fl... |
137 |
env_new.flags = new_flag; |
c609719b8 Initial revision |
138 |
|
0e8d15866 rename CFG_ENV ma... |
139 |
#if CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE |
82b54b972 env: clean env_fl... |
140 |
up_data = end_addr_new + 1 - ((long)flash_addr_new + CONFIG_ENV_SIZE); |
ea882baf9 New implementatio... |
141 142 |
debug("Data to save 0x%lX ", up_data); |
47cd00fa7 * Patches by Robe... |
143 |
if (up_data) { |
82b54b972 env: clean env_fl... |
144 145 |
saved_data = malloc(up_data); if (saved_data == NULL) { |
8bde7f776 * Code cleanup: |
146 147 |
printf("Unable to save the rest of sector (%ld) ", |
47cd00fa7 * Patches by Robe... |
148 |
up_data); |
ea882baf9 New implementatio... |
149 |
goto done; |
47cd00fa7 * Patches by Robe... |
150 |
} |
8bde7f776 * Code cleanup: |
151 |
memcpy(saved_data, |
82b54b972 env: clean env_fl... |
152 153 |
(void *)((long)flash_addr_new + CONFIG_ENV_SIZE), up_data); |
ea882baf9 New implementatio... |
154 155 156 157 |
debug("Data (start 0x%lX, len 0x%lX) saved at 0x%p ", (long)flash_addr_new + CONFIG_ENV_SIZE, up_data, saved_data); |
47cd00fa7 * Patches by Robe... |
158 159 |
} #endif |
ea882baf9 New implementatio... |
160 |
puts("Erasing Flash..."); |
82b54b972 env: clean env_fl... |
161 |
debug(" %08lX ... %08lX ...", (ulong)flash_addr_new, end_addr_new); |
c609719b8 Initial revision |
162 |
|
82b54b972 env: clean env_fl... |
163 |
if (flash_sect_erase((ulong)flash_addr_new, end_addr_new)) |
ea882baf9 New implementatio... |
164 |
goto done; |
c609719b8 Initial revision |
165 |
|
ea882baf9 New implementatio... |
166 167 |
puts("Writing to Flash... "); debug(" %08lX ... %08lX ...", |
c609719b8 Initial revision |
168 |
(ulong)&(flash_addr_new->data), |
82b54b972 env: clean env_fl... |
169 170 171 172 173 174 175 176 177 178 |
sizeof(env_ptr->data) + (ulong)&(flash_addr_new->data)); rc = flash_write((char *)&env_new, (ulong)flash_addr_new, sizeof(env_new)); if (rc) goto perror; rc = flash_write(&flag, (ulong)&(flash_addr->flags), sizeof(flash_addr->flags)); if (rc) goto perror; |
c609719b8 Initial revision |
179 |
|
0e8d15866 rename CFG_ENV ma... |
180 |
#if CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE |
47cd00fa7 * Patches by Robe... |
181 |
if (up_data) { /* restore the rest of sector */ |
ea882baf9 New implementatio... |
182 183 184 |
debug("Restoring the rest of data to 0x%lX len 0x%lX ", (long)flash_addr_new + CONFIG_ENV_SIZE, up_data); |
8bde7f776 * Code cleanup: |
185 |
if (flash_write(saved_data, |
0e8d15866 rename CFG_ENV ma... |
186 |
(long)flash_addr_new + CONFIG_ENV_SIZE, |
82b54b972 env: clean env_fl... |
187 188 |
up_data)) goto perror; |
47cd00fa7 * Patches by Robe... |
189 190 |
} #endif |
ea882baf9 New implementatio... |
191 192 |
puts("done "); |
c609719b8 Initial revision |
193 |
{ |
82b54b972 env: clean env_fl... |
194 |
env_t *etmp = flash_addr; |
c609719b8 Initial revision |
195 196 197 198 199 200 201 202 203 204 |
ulong ltmp = end_addr; flash_addr = flash_addr_new; flash_addr_new = etmp; end_addr = end_addr_new; end_addr_new = ltmp; } rc = 0; |
82b54b972 env: clean env_fl... |
205 206 207 |
goto done; perror: flash_perror(rc); |
ea882baf9 New implementatio... |
208 |
done: |
47cd00fa7 * Patches by Robe... |
209 |
if (saved_data) |
ea882baf9 New implementatio... |
210 |
free(saved_data); |
c609719b8 Initial revision |
211 |
/* try to re-protect */ |
82b54b972 env: clean env_fl... |
212 213 |
flash_sect_protect(1, (ulong)flash_addr, end_addr); flash_sect_protect(1, (ulong)flash_addr_new, end_addr_new); |
c609719b8 Initial revision |
214 215 216 |
return rc; } |
e7e5bb316 s32v234: flash: R... |
217 |
#endif /* CONFIG_CMD_SAVEENV */ |
c609719b8 Initial revision |
218 |
|
0e8d15866 rename CFG_ENV ma... |
219 |
#else /* ! CONFIG_ENV_ADDR_REDUND */ |
c609719b8 Initial revision |
220 |
|
4415f1d1f env: Create a loc... |
221 |
#ifdef INITENV |
e5bce247b env: Switch over ... |
222 |
static int env_flash_init(void) |
c609719b8 Initial revision |
223 |
{ |
c609719b8 Initial revision |
224 |
if (crc32(0, env_ptr->data, ENV_SIZE) == env_ptr->crc) { |
82b54b972 env: clean env_fl... |
225 |
gd->env_addr = (ulong)&(env_ptr->data); |
203e94f6c env: Add an enum ... |
226 |
gd->env_valid = ENV_VALID; |
82b54b972 env: clean env_fl... |
227 |
return 0; |
c609719b8 Initial revision |
228 |
} |
9bb8b209e Fix compilation e... |
229 |
|
82b54b972 env: clean env_fl... |
230 |
gd->env_addr = (ulong)&default_environment[0]; |
2d7cb5b42 env: Replace all ... |
231 |
gd->env_valid = ENV_INVALID; |
ea882baf9 New implementatio... |
232 |
return 0; |
c609719b8 Initial revision |
233 |
} |
4415f1d1f env: Create a loc... |
234 |
#endif |
c609719b8 Initial revision |
235 |
|
e7e5bb316 s32v234: flash: R... |
236 |
#ifdef CONFIG_CMD_SAVEENV |
e5bce247b env: Switch over ... |
237 |
static int env_flash_save(void) |
c609719b8 Initial revision |
238 |
{ |
ea882baf9 New implementatio... |
239 |
env_t env_new; |
ea882baf9 New implementatio... |
240 |
int rc = 1; |
3fa1981e2 env_flash.c: Drop... |
241 |
char *saved_data = NULL; |
ea882baf9 New implementatio... |
242 243 |
#if CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE ulong up_data = 0; |
c609719b8 Initial revision |
244 |
|
82b54b972 env: clean env_fl... |
245 |
up_data = end_addr + 1 - ((long)flash_addr + CONFIG_ENV_SIZE); |
ea882baf9 New implementatio... |
246 247 248 |
debug("Data to save 0x%lx ", up_data); if (up_data) { |
82b54b972 env: clean env_fl... |
249 250 |
saved_data = malloc(up_data); if (saved_data == NULL) { |
ea882baf9 New implementatio... |
251 252 253 254 255 256 257 258 259 260 261 262 263 |
printf("Unable to save the rest of sector (%ld) ", up_data); goto done; } memcpy(saved_data, (void *)((long)flash_addr + CONFIG_ENV_SIZE), up_data); debug("Data (start 0x%lx, len 0x%lx) saved at 0x%lx ", (ulong)flash_addr + CONFIG_ENV_SIZE, up_data, (ulong)saved_data); } |
0e8d15866 rename CFG_ENV ma... |
264 |
#endif /* CONFIG_ENV_SECT_SIZE */ |
c609719b8 Initial revision |
265 |
|
82b54b972 env: clean env_fl... |
266 267 |
debug("Protect off %08lX ... %08lX ", (ulong)flash_addr, end_addr); |
c609719b8 Initial revision |
268 |
|
ea882baf9 New implementatio... |
269 270 |
if (flash_sect_protect(0, (long)flash_addr, end_addr)) goto done; |
c609719b8 Initial revision |
271 |
|
7ce1526ed env: Add env_expo... |
272 273 |
rc = env_export(&env_new); if (rc) |
ea882baf9 New implementatio... |
274 |
goto done; |
c609719b8 Initial revision |
275 |
|
ea882baf9 New implementatio... |
276 277 278 |
puts("Erasing Flash..."); if (flash_sect_erase((long)flash_addr, end_addr)) goto done; |
c609719b8 Initial revision |
279 |
|
ea882baf9 New implementatio... |
280 281 |
puts("Writing to Flash... "); rc = flash_write((char *)&env_new, (long)flash_addr, CONFIG_ENV_SIZE); |
82b54b972 env: clean env_fl... |
282 283 |
if (rc != 0) goto perror; |
ea882baf9 New implementatio... |
284 285 286 287 288 289 290 |
#if CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE if (up_data) { /* restore the rest of sector */ debug("Restoring the rest of data to 0x%lx len 0x%lx ", (ulong)flash_addr + CONFIG_ENV_SIZE, up_data); if (flash_write(saved_data, (long)flash_addr + CONFIG_ENV_SIZE, |
82b54b972 env: clean env_fl... |
291 292 |
up_data)) goto perror; |
ea882baf9 New implementatio... |
293 294 295 296 297 |
} #endif puts("done "); rc = 0; |
82b54b972 env: clean env_fl... |
298 299 300 |
goto done; perror: flash_perror(rc); |
ea882baf9 New implementatio... |
301 302 303 |
done: if (saved_data) free(saved_data); |
c609719b8 Initial revision |
304 |
/* try to re-protect */ |
82b54b972 env: clean env_fl... |
305 |
flash_sect_protect(1, (long)flash_addr, end_addr); |
ea882baf9 New implementatio... |
306 |
return rc; |
c609719b8 Initial revision |
307 |
} |
e7e5bb316 s32v234: flash: R... |
308 |
#endif /* CONFIG_CMD_SAVEENV */ |
c609719b8 Initial revision |
309 |
|
0e8d15866 rename CFG_ENV ma... |
310 |
#endif /* CONFIG_ENV_ADDR_REDUND */ |
c609719b8 Initial revision |
311 |
|
e5bce247b env: Switch over ... |
312 |
#ifdef LOADENV |
c59519919 env: Adjust the l... |
313 |
static int env_flash_load(void) |
c609719b8 Initial revision |
314 |
{ |
0e8d15866 rename CFG_ENV ma... |
315 |
#ifdef CONFIG_ENV_ADDR_REDUND |
c3f9d4939 * Patch by Yuli B... |
316 |
if (gd->env_addr != (ulong)&(flash_addr->data)) { |
ea882baf9 New implementatio... |
317 |
env_t *etmp = flash_addr; |
c609719b8 Initial revision |
318 319 320 321 322 323 324 325 |
ulong ltmp = end_addr; flash_addr = flash_addr_new; flash_addr_new = etmp; end_addr = end_addr_new; end_addr_new = ltmp; } |
d3716dd64 env: Rename the r... |
326 |
if (flash_addr_new->flags != ENV_REDUND_OBSOLETE && |
82b54b972 env: clean env_fl... |
327 |
crc32(0, flash_addr_new->data, ENV_SIZE) == flash_addr_new->crc) { |
d3716dd64 env: Rename the r... |
328 |
char flag = ENV_REDUND_OBSOLETE; |
c3f9d4939 * Patch by Yuli B... |
329 |
|
203e94f6c env: Add an enum ... |
330 |
gd->env_valid = ENV_REDUND; |
ea882baf9 New implementatio... |
331 |
flash_sect_protect(0, (ulong)flash_addr_new, end_addr_new); |
c3f9d4939 * Patch by Yuli B... |
332 |
flash_write(&flag, |
8bde7f776 * Code cleanup: |
333 334 |
(ulong)&(flash_addr_new->flags), sizeof(flash_addr_new->flags)); |
ea882baf9 New implementatio... |
335 |
flash_sect_protect(1, (ulong)flash_addr_new, end_addr_new); |
c609719b8 Initial revision |
336 |
} |
d3716dd64 env: Rename the r... |
337 338 339 |
if (flash_addr->flags != ENV_REDUND_ACTIVE && (flash_addr->flags & ENV_REDUND_ACTIVE) == ENV_REDUND_ACTIVE) { char flag = ENV_REDUND_ACTIVE; |
c3f9d4939 * Patch by Yuli B... |
340 |
|
203e94f6c env: Add an enum ... |
341 |
gd->env_valid = ENV_REDUND; |
ea882baf9 New implementatio... |
342 |
flash_sect_protect(0, (ulong)flash_addr, end_addr); |
c3f9d4939 * Patch by Yuli B... |
343 |
flash_write(&flag, |
8bde7f776 * Code cleanup: |
344 345 |
(ulong)&(flash_addr->flags), sizeof(flash_addr->flags)); |
ea882baf9 New implementatio... |
346 |
flash_sect_protect(1, (ulong)flash_addr, end_addr); |
c609719b8 Initial revision |
347 |
} |
203e94f6c env: Add an enum ... |
348 |
if (gd->env_valid == ENV_REDUND) |
82b54b972 env: clean env_fl... |
349 350 351 352 |
puts("*** Warning - some problems detected " "reading environment; recovered successfully "); |
0e8d15866 rename CFG_ENV ma... |
353 |
#endif /* CONFIG_ENV_ADDR_REDUND */ |
ea882baf9 New implementatio... |
354 |
|
2166ebf78 env: make env dri... |
355 |
return env_import((char *)flash_addr, 1); |
c609719b8 Initial revision |
356 |
} |
e5bce247b env: Switch over ... |
357 |
#endif /* LOADENV */ |
4415f1d1f env: Create a loc... |
358 359 360 |
U_BOOT_ENV_LOCATION(flash) = { .location = ENVL_FLASH, |
ac358beb8 env: Drop the env... |
361 |
ENV_NAME("Flash") |
4415f1d1f env: Create a loc... |
362 |
#ifdef LOADENV |
e5bce247b env: Switch over ... |
363 |
.load = env_flash_load, |
4415f1d1f env: Create a loc... |
364 |
#endif |
e7e5bb316 s32v234: flash: R... |
365 |
#ifdef CONFIG_CMD_SAVEENV |
e5bce247b env: Switch over ... |
366 |
.save = env_save_ptr(env_flash_save), |
4415f1d1f env: Create a loc... |
367 368 |
#endif #ifdef INITENV |
e5bce247b env: Switch over ... |
369 |
.init = env_flash_init, |
4415f1d1f env: Create a loc... |
370 371 |
#endif }; |