1 /* Copyright 2000 AG Electronics Ltd. */
2 /* This code is distributed without warranty under the GPL v2 (see COPYING) */
4 #include <console/console.h>
10 * Environment variable record runs:
11 * [length]NAME=value[length]NAME=value[0]\0
12 * A deleted variable is:
15 * When memory is full, we compact.
18 static nvram_device *nvram_dev = 0;
19 static unsigned char *nvram_buffer = 0;
20 static unsigned nvram_size = 0;
21 static uint8_t nvram_csum = 0;
22 #define NVRAM_INVALID (! nvram_dev)
24 static void update_device(unsigned i, unsigned char data)
28 nvram_csum -= nvram_buffer[i];
29 nvram_buffer[i] = data;
30 nvram_dev->write_byte(nvram_dev, i, data);
34 printk_info("Offset %d out of range in nvram\n", i);
37 static void update_csum(void)
39 nvram_dev->write_byte(nvram_dev, nvram_size, nvram_csum);
40 if (nvram_dev->commit)
41 nvram_dev->commit(nvram_dev);
44 static void update_string_device(unsigned i, const unsigned char *data,
47 if (i + len < nvram_size)
50 for(j = 0; j < len; j++)
52 nvram_csum -= nvram_buffer[i];
53 nvram_buffer[i] = *data;
54 nvram_dev->write_byte(nvram_dev, i, *data);
61 printk_info("Offset %d out of range in nvram\n", i + len);
64 int nvram_init (struct nvram_device *dev)
69 nvram_size = dev->size(dev) - 1;
70 printk_info("NVRAM size is %d\n", nvram_size);
75 nvram_buffer = malloc (nvram_size);
80 dev->read_block(dev, 0, nvram_buffer, nvram_size+1);
81 for(i = 0; i < nvram_size; i++)
82 nvram_csum += nvram_buffer[i];
84 if (nvram_csum != nvram_buffer[nvram_size])
86 printk_info("NVRAM checksum invalid - erasing\n");
87 //update_device(0, 0);
91 printk_info("Initialised nvram\n");
95 void nvram_clear(void)
97 printk_info("Erasing NVRAM\n");