| Index: src/platform/uboot-env/uboot-env.py
|
| diff --git a/src/platform/uboot-env/uboot-env.py b/src/platform/uboot-env/uboot-env.py
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..3898da00d33d6637d8f36560ede4c8745b3b9fcb
|
| --- /dev/null
|
| +++ b/src/platform/uboot-env/uboot-env.py
|
| @@ -0,0 +1,116 @@
|
| +#!/usr/bin/python
|
| +#
|
| +# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +from optparse import OptionParser
|
| +import binascii
|
| +import struct
|
| +import sys
|
| +
|
| +# This script allows listing, reading and writing environment variables for
|
| +# u-boot, that usually live in an area of a block device (NVRAM, e.g. NAND or
|
| +# NOR flash).
|
| +# The u-boot environment variable area is a crc (4 bytes) followed by all
|
| +# environment variables as "key=value" strings (\0-terminated) with \0\0
|
| +# (empty string) to indicate the end.
|
| +
|
| +
|
| +class SizeError(Exception):
|
| + pass
|
| +
|
| +
|
| +def ReadEnviron(file, size=0, offset=0):
|
| + """Reads the u-boot environment variables from a file into a dict."""
|
| + f = open(file, "rb")
|
| + f.seek(offset)
|
| + if size:
|
| + data = f.read(size)
|
| + else:
|
| + data = f.read()
|
| + f.close()
|
| +
|
| + (crc,) = struct.unpack("I", data[0:4])
|
| + real_data = data[4:]
|
| + real_crc = binascii.crc32(real_data) & 0xffffffff
|
| + environ = {}
|
| + for s in real_data.split('\0'):
|
| + if not s:
|
| + break
|
| + key, value = s.split('=', 1)
|
| + environ[key] = value
|
| +
|
| + return (environ, len(data), crc == real_crc)
|
| +
|
| +def WriteEnviron(file, environ, size, offset=0):
|
| + """Writes the u-boot environment variables from a dict into a file."""
|
| + strings = ['%s=%s' % (k, environ[k]) for k in environ]
|
| + data = '\0'.join(strings + [''])
|
| +
|
| + # pad with \0
|
| + if len(data) <= size-4:
|
| + data = data + '\0'*(size-len(data)-4)
|
| + else:
|
| + raise SizeError
|
| +
|
| + crc = binascii.crc32(data) & 0xffffffff
|
| +
|
| + f = open(file, "r+b")
|
| + f.seek(offset)
|
| + f.write(struct.pack("I", crc)[0:4])
|
| + f.write(data)
|
| + f.close()
|
| +
|
| +
|
| +def main(argv):
|
| + parser = OptionParser()
|
| + parser.add_option('-f', '--file', type='string', dest='filename')
|
| + parser.add_option('-o', '--offset', type='int', dest='offset', default=0)
|
| + parser.add_option('-s', '--size', type='int', dest='size', default=0)
|
| + parser.add_option('--out', type='string', dest='out_filename')
|
| + parser.add_option('--out-offset', type='string', dest='out_offset')
|
| + parser.add_option('--out-size', type='string', dest='out_size')
|
| + parser.add_option('--list', action='store_true', dest='list')
|
| + parser.add_option('--force', action='store_true', dest='force')
|
| + parser.add_option('--get', type='string', action='append', dest='get',
|
| + default=[])
|
| + parser.add_option('--set', type='string', action='append', dest='set',
|
| + default=[])
|
| + (options, args) = parser.parse_args()
|
| + (environ, size, crc) = ReadEnviron(options.filename, options.size,
|
| + options.offset)
|
| + if not crc:
|
| + sys.stderr.write('Bad CRC\n')
|
| + if not options.force:
|
| + sys.exit(1)
|
| +
|
| + if options.list:
|
| + for key in environ:
|
| + print "%s=%s" % (key, environ[key])
|
| +
|
| + for key in options.get:
|
| + try:
|
| + print environ[key]
|
| + except KeyError:
|
| + print ''
|
| +
|
| + do_write = False
|
| + for key_value in options.set:
|
| + key, value = key_value.split('=', 1)
|
| + environ[key] = value
|
| + do_write = True
|
| +
|
| + if do_write:
|
| + out_filename = options.out_filename
|
| + out_offset = options.out_offset
|
| + out_size = options.out_size
|
| + if not out_filename:
|
| + out_filename = options.filename
|
| + out_offset = options.offset
|
| + out_size = size
|
| + WriteEnviron(out_filename, environ, out_size, out_offset)
|
| +
|
| +
|
| +if __name__ == '__main__':
|
| + main(sys.argv)
|
|
|