summaryrefslogtreecommitdiff
path: root/Host/libnxt-0.3/make_flash_header.py
diff options
context:
space:
mode:
Diffstat (limited to 'Host/libnxt-0.3/make_flash_header.py')
-rwxr-xr-xHost/libnxt-0.3/make_flash_header.py109
1 files changed, 109 insertions, 0 deletions
diff --git a/Host/libnxt-0.3/make_flash_header.py b/Host/libnxt-0.3/make_flash_header.py
new file mode 100755
index 0000000..9734c86
--- /dev/null
+++ b/Host/libnxt-0.3/make_flash_header.py
@@ -0,0 +1,109 @@
+#!/usr/bin/env python
+#
+# Take the flash_routine.bin file, and embed it as an array of bytes
+# in a flash_routine.h, ready for packaging with the C firmware
+# flasher.
+#
+# If a file name is provided on the commandline, load that file as the
+# firmware flashing routine instead.
+#
+
+import sys
+import os
+import os.path
+import urllib2
+import sha
+
+FLASH_DIR = 'flash_write'
+FLASH_BIN = 'flash.bin'
+FLASH_PATH = os.path.join(FLASH_DIR, FLASH_BIN)
+
+DOWNLOAD_FLASH_CHECKSUM = '589501072d76be483f873a787080adcab20841f4'
+DOWNLOAD_FLASH_URL = 'http://libnxt.googlecode.com/files/flash.bin'
+
+def check_flash_size():
+ statinfo = os.stat(FLASH_PATH)
+ if statinfo.st_size > 1024:
+ print "The flash driver looks too big, refusing to embed."
+ return False
+ return True
+
+def ensure_flash_bin():
+ # If the flash binary does exist, just check its size and return.
+ if os.path.isfile(FLASH_PATH):
+ return check_flash_size()
+
+ # If the binary doesn't exist, offer to download a binary build
+ # from Google Code.
+ print """
+Embedded flash driver not found. This is required to build LibNXT.
+
+If you have an ARM7 cross-compiler toolchain available, you can build
+the flash driver by interrupting (ctrl-C) this build and running
+'make' in the 'flash_write' subdirectory. Then rerun this build again,
+and everything should work great.
+
+If you do not have a cross-compiler, do not despair! I can also
+download a copy of the compiled driver (built by the libnxt developer)
+from the project website and use that.
+"""
+ reply = raw_input("Is that okay? (y/n) ")
+ if reply not in ('y', 'Y', 'yes'):
+ print ("Okay, you're the boss. But that does mean I can't build "
+ "LibNXT. Sorry.")
+ return False
+ f = urllib2.urlopen(DOWNLOAD_FLASH_URL)
+ data = f.read()
+ f.close()
+
+ # Verify the SHA-1 checksum
+ checksum = sha.new(data).hexdigest()
+ if checksum != DOWNLOAD_FLASH_CHECKSUM:
+ print "Oops, the flash binary I downloaded has the wrong checksum!"
+ print "Aborting :("
+ return False
+
+ f = open(FLASH_PATH, 'w')
+ f.write(data)
+ f.close()
+
+ if os.path.isfile(FLASH_PATH):
+ return check_flash_size()
+
+ # Dude, you're really not lucky, are you.
+ return False
+
+
+def main():
+ if not ensure_flash_bin():
+ sys.exit(1)
+
+ f = file(FLASH_PATH)
+ fwbin = f.read()
+ f.close()
+
+ data = ['0x%s' % c.encode('hex') for c in fwbin]
+
+ for i in range(0, len(data), 12):
+ data[i] = "\n " + data[i]
+
+ data_str = ', '.join(data)
+ len_data = "%d" % len(data)
+
+ # Read in the template
+ tplfile = file('flash_routine.h.base')
+ template = tplfile.read()
+ tplfile.close()
+
+ # Replace the values in the template
+ template = template.replace('___FLASH_BIN___', data_str + '\n')
+ template = template.replace('___FLASH_LEN___', len_data)
+
+ # Output the done header
+ out = file('flash_routine.h', 'w')
+ out.write(template)
+ out.close()
+
+if __name__ == '__main__':
+ main()
+