1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
# Print out the CRC's if debugging.
# Prevent the erasure of the environment.
# Allow the deliberate erasure of the environment with the
# clearenv command.
diff --git a/src/u_boot.c b/src/u_boot.c
index e240475..f10eaa3 100644
--- a/src/u_boot.c
+++ b/src/u_boot.c
@@ -64,6 +64,8 @@ static int write_uboot_env(const char *device, struct environment *env)
error("mtd_erase_all %s failed", device);
return -1;
}
+ if(env == NULL)
+ return 0;
fd = open(device, O_WRONLY);
if (fd < 0) {
@@ -213,7 +215,7 @@ static int cmd_setenv(struct environment *env, int argc, char **argv)
}
env->crc = crc32(0, (uint8_t *) env->data, sizeof(env->data));
- dbg("crc: 0x%08X", env->crc);
+ dbg("Calculated crc: 0x%08X", env->crc);
env->flags = 0;
tmp = write_uboot_env(MTD_ENV1, env);
@@ -252,6 +254,7 @@ int main(int argc, char *argv[]) {
struct environment *env2;
uint32_t crc1_ok;
uint32_t crc2_ok;
+ uint32_t mycrc;
if (argc <= 1) {
usage(stderr);
@@ -301,12 +304,18 @@ int main(int argc, char *argv[]) {
error("read_uboot_env failed");
return 1;
}
- dbg("env1 crc: 0x%08X", env1->crc);
+ dbg("env1 stored crc: 0x%08X", env1->crc);
dbg("env1 flags: %d", env1->flags);
- if (crc32(0, (uint8_t *) env1->data, sizeof(env1->data)) == env1->crc) {
+ mycrc = crc32(0, (uint8_t *) env1->data, sizeof(env1->data));
+ if (mycrc == env1->crc) {
crc1_ok = 1;
} else {
- error("crc does not match on primary env");
+ dbg("env1 stored crc 0x%x, calculated crc 0x%x",env1->crc,mycrc);
+ if(env1->flags != 255)
+ error("crc does not match on env1");
+ else
+ dbg("uninitialized env1");
+
crc1_ok = 0;
}
@@ -315,20 +324,26 @@ int main(int argc, char *argv[]) {
error("read_uboot_env failed");
return 1;
}
- dbg("env2 crc: 0x%08X", env2->crc);
+ dbg("env2 stored crc: 0x%08X", env2->crc);
dbg("env2 flags: %d", env2->flags);
- if (crc32(0, (uint8_t *) env2->data, sizeof(env2->data)) == env2->crc) {
+ mycrc = crc32(0, (uint8_t *) env2->data, sizeof(env2->data));
+ if (mycrc == env2->crc) {
crc2_ok = 1;
} else {
- error("crc does not match on redundant env");
+ dbg("env2 stored crc 0x%x, calculated crc 0x%x",env2->crc,mycrc);
+ if(env2->flags != 255)
+ error("crc does not match on env2");
+ else
+ dbg("uninitialized env2");
crc2_ok = 0;
}
if (!crc1_ok && !crc2_ok) {
- error("both environments are bad: loading DEFAULT_ENV");
+ error("both environments are bad: not loading DEFAULT_ENV");
env = env1;
env->flags = 0;
memcpy(env->data, DEFAULT_ENV, sizeof(DEFAULT_ENV));
+ exit(1);
} else if (crc1_ok && !crc2_ok) {
env = env1;
} else if (!crc1_ok && crc2_ok) {
@@ -353,6 +368,9 @@ int main(int argc, char *argv[]) {
err = cmd_printenv(env, argc, argv);
} else if (!tokcmp(cmd, "setenv")) {
err = cmd_setenv(env, argc, argv);
+ } else if (!tokcmp(cmd, "clearenv")) {
+ (void)write_uboot_env(MTD_ENV1, NULL);
+ (void)write_uboot_env(MTD_ENV2, NULL);
} else {
usage(stderr);
exit(1);
|