]>
Commit | Line | Data |
---|---|---|
ea882baf WD |
1 | /* |
2 | * LowLevel function for DataFlash environment support | |
5779d8d9 WD |
3 | * Author : Gilles Gastaldi (Atmel) |
4 | * | |
1a459660 | 5 | * SPDX-License-Identifier: GPL-2.0+ |
5779d8d9 WD |
6 | */ |
7 | #include <common.h> | |
5779d8d9 WD |
8 | #include <command.h> |
9 | #include <environment.h> | |
10 | #include <linux/stddef.h> | |
5779d8d9 | 11 | #include <dataflash.h> |
ea882baf WD |
12 | #include <search.h> |
13 | #include <errno.h> | |
5779d8d9 | 14 | |
d87080b7 WD |
15 | DECLARE_GLOBAL_DATA_PTR; |
16 | ||
e5bce247 | 17 | static unsigned char env_dataflash_get_char(int index) |
5779d8d9 WD |
18 | { |
19 | uchar c; | |
ea882baf | 20 | |
0901d9f8 | 21 | read_dataflash(CONFIG_ENV_ADDR + index + offsetof(env_t, data), |
ea882baf | 22 | 1, (char *)&c); |
0901d9f8 | 23 | return c; |
5779d8d9 WD |
24 | } |
25 | ||
e5bce247 | 26 | static void env_dataflash_load(void) |
5779d8d9 | 27 | { |
cca2011e BS |
28 | ulong crc, new = 0; |
29 | unsigned off; | |
cd0f4fa1 | 30 | char buf[CONFIG_ENV_SIZE]; |
ea882baf | 31 | |
cca2011e BS |
32 | /* Read old CRC */ |
33 | read_dataflash(CONFIG_ENV_ADDR + offsetof(env_t, crc), | |
34 | sizeof(ulong), (char *)&crc); | |
35 | ||
36 | /* Read whole environment */ | |
cd0f4fa1 TR |
37 | read_dataflash(CONFIG_ENV_ADDR, CONFIG_ENV_SIZE, buf); |
38 | ||
cca2011e BS |
39 | /* Calculate the CRC */ |
40 | off = offsetof(env_t, data); | |
41 | new = crc32(new, (unsigned char *)(buf + off), ENV_SIZE); | |
42 | ||
43 | if (crc == new) | |
44 | env_import(buf, 1); | |
45 | else | |
46 | set_default_env("!bad CRC"); | |
5779d8d9 WD |
47 | } |
48 | ||
ea882baf WD |
49 | #ifdef CONFIG_ENV_OFFSET_REDUND |
50 | #error No support for redundant environment on dataflash yet! | |
51 | #endif | |
52 | ||
e5bce247 | 53 | static int env_dataflash_save(void) |
5779d8d9 | 54 | { |
7ce1526e MV |
55 | env_t env_new; |
56 | int ret; | |
57 | ||
58 | ret = env_export(&env_new); | |
59 | if (ret) | |
60 | return ret; | |
ea882baf WD |
61 | |
62 | return write_dataflash(CONFIG_ENV_ADDR, | |
cd0f4fa1 | 63 | (unsigned long)&env_new, |
ea882baf | 64 | CONFIG_ENV_SIZE); |
5779d8d9 WD |
65 | } |
66 | ||
4415f1d1 SG |
67 | U_BOOT_ENV_LOCATION(dataflash) = { |
68 | .location = ENVL_DATAFLASH, | |
ac358beb | 69 | ENV_NAME("dataflash") |
e5bce247 SG |
70 | .get_char = env_dataflash_get_char, |
71 | .load = env_dataflash_load, | |
72 | .save = env_save_ptr(env_dataflash_save), | |
4415f1d1 | 73 | }; |