1
2
3
4
5
6
7#include <common.h>
8#include <command.h>
9#include <environment.h>
10#include <linux/stddef.h>
11#include <dataflash.h>
12#include <search.h>
13#include <errno.h>
14
15DECLARE_GLOBAL_DATA_PTR;
16
17env_t *env_ptr;
18
19char *env_name_spec = "dataflash";
20
21uchar env_get_char_spec(int index)
22{
23 uchar c;
24
25 read_dataflash(CONFIG_ENV_ADDR + index + offsetof(env_t, data),
26 1, (char *)&c);
27 return c;
28}
29
30void env_relocate_spec(void)
31{
32 ulong crc, new = 0;
33 unsigned off;
34 char buf[CONFIG_ENV_SIZE];
35
36
37 read_dataflash(CONFIG_ENV_ADDR + offsetof(env_t, crc),
38 sizeof(ulong), (char *)&crc);
39
40
41 read_dataflash(CONFIG_ENV_ADDR, CONFIG_ENV_SIZE, buf);
42
43
44 off = offsetof(env_t, data);
45 new = crc32(new, (unsigned char *)(buf + off), ENV_SIZE);
46
47 if (crc == new)
48 env_import(buf, 1);
49 else
50 set_default_env("!bad CRC");
51}
52
53#ifdef CONFIG_ENV_OFFSET_REDUND
54#error No support for redundant environment on dataflash yet!
55#endif
56
57int saveenv(void)
58{
59 env_t env_new;
60 ssize_t len;
61 char *res;
62
63 res = (char *)&env_new.data;
64 len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
65 if (len < 0) {
66 error("Cannot export environment: errno = %d\n", errno);
67 return 1;
68 }
69 env_new.crc = crc32(0, env_new.data, ENV_SIZE);
70
71 return write_dataflash(CONFIG_ENV_ADDR,
72 (unsigned long)&env_new,
73 CONFIG_ENV_SIZE);
74}
75
76
77
78
79
80
81
82int env_init(void)
83{
84
85 gd->env_addr = (ulong)&default_environment[0];
86 gd->env_valid = 1;
87
88 return 0;
89}
90