2 /* Copyright 2000 AG Electronics Ltd. */
3 /* This code is distributed without warranty under the GPL v2 (see COPYING) */
12 * Environment variable record runs:
13 * [length]NAME=value[length]NAME=value[0]\0
14 * A deleted variable is:
17 * When memory is full, we compact.
20 static nvram_device *nvram_dev = 0;
21 static unsigned char *nvram_buffer = 0;
22 static unsigned nvram_size = 0;
23 static u8 nvram_csum = 0;
24 #define NVRAM_INVALID (! nvram_dev)
26 static void update_device(unsigned i, unsigned char data)
30 nvram_csum -= nvram_buffer[i];
31 nvram_buffer[i] = data;
32 nvram_dev->write_byte(nvram_dev, i, data);
36 printk_info("Offset %d out of range in nvram\n", i);
39 static void update_csum(void)
41 nvram_dev->write_byte(nvram_dev, nvram_size, nvram_csum);
42 if (nvram_dev->commit)
43 nvram_dev->commit(nvram_dev);
46 static void update_string_device(unsigned i, const unsigned char *data,
49 if (i + len < nvram_size)
52 for(j = 0; j < len; j++)
54 nvram_csum -= nvram_buffer[i];
55 nvram_buffer[i] = *data;
56 nvram_dev->write_byte(nvram_dev, i, *data);
63 printk_info("Offset %d out of range in nvram\n", i + len);
66 int nvram_init (struct nvram_device *dev)
71 nvram_size = dev->size(dev) - 1;
72 printk_info("NVRAM size is %d\n", nvram_size);
77 nvram_buffer = malloc (nvram_size);
82 dev->read_block(dev, 0, nvram_buffer, nvram_size+1);
83 for(i = 0; i < nvram_size; i++)
84 nvram_csum += nvram_buffer[i];
86 if (nvram_csum != nvram_buffer[nvram_size])
88 printk_info("NVRAM checksum invalid - erasing\n");
89 //update_device(0, 0);
93 printk_info("Initialised nvram\n");
97 void nvram_clear(void)
99 printk_info("Erasing NVRAM\n");