summaryrefslogtreecommitdiff
path: root/util/rockchip/make_idb.py
diff options
context:
space:
mode:
Diffstat (limited to 'util/rockchip/make_idb.py')
-rwxr-xr-xutil/rockchip/make_idb.py124
1 files changed, 124 insertions, 0 deletions
diff --git a/util/rockchip/make_idb.py b/util/rockchip/make_idb.py
new file mode 100755
index 0000000000..e95f5c2fd7
--- /dev/null
+++ b/util/rockchip/make_idb.py
@@ -0,0 +1,124 @@
+#!/usr/bin/env python
+# Copyright (c) 2014 Google Inc. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import struct
+import sys
+from io import SEEK_SET, SEEK_END
+
+class IDBTool:
+ def __init__(self):
+ print "Initialize IDBTool"
+
+ def p_rc4(self, buf, length):
+ key = (124,78,3,4,85,5,9,7,45,44,123,56,23,13,23,17)
+ K = key * 16
+ S = [i for i in range(256)]
+
+ j = 0
+ for i in range(256):
+ j = (j + S[i] + K[i]) % 256
+ temp = S[i]; S[i] = S[j]; S[j] = temp;
+
+ i = j = k = 0
+ for x in range(length):
+ i = (i+1) % 256
+ j = (j + S[i]) % 256
+ temp = S[i]; S[i] = S[j]; S[j] = temp
+ k = (S[i] + S[j]) % 256
+ buf[x] = struct.pack('B', ord(buf[x]) ^ S[k])
+
+ def makeIDB(self, from_file, to_file, rc4_flag = False, align_flag = False):
+ try:
+ fin = open(from_file, 'rb')
+ except:
+ sys.exit("Failed to open file : " + from_file)
+
+ try:
+ fin.seek(0, SEEK_END)
+ if (fin.tell() > 4 * 1024 * 1024):
+ sys.exit("Input file is more than 4MB")
+ fin.seek(0)
+ data = fin.read()
+ finally:
+ fin.close()
+
+ data_len = len(data)
+ SECTOR_SIZE = 512
+ PAGE_ALIGN = 4
+ sectors = (data_len + 4 - 1) / SECTOR_SIZE + 1
+ pages = (sectors - 1) / PAGE_ALIGN + 1
+ sectors = pages * PAGE_ALIGN;
+
+ buf = [B'\0'] * sectors * SECTOR_SIZE
+ buf[:4] = "RK32"
+ buf[4 : 4+data_len] = data
+
+ idblock = [B'\0'] * 4 * SECTOR_SIZE
+ blank = [B'\0'] * 4 * SECTOR_SIZE
+ idblock[:4] = ['\x55', '\xAA', '\xF0', '\x0F']
+
+ if (not rc4_flag):
+ idblock[8:12] = struct.pack("<I", 1)
+ else:
+ for i in range(sectors):
+ list_tmp = buf[SECTOR_SIZE*i : SECTOR_SIZE*(i+1)]
+ self.p_rc4(list_tmp, SECTOR_SIZE)
+ buf[SECTOR_SIZE*i : SECTOR_SIZE*(i+1)] = list_tmp
+
+ idblock[12:16] = struct.pack("<HH", 4, 4);
+ idblock[506:510] = struct.pack("<HH", sectors, sectors);
+ self.p_rc4(idblock, SECTOR_SIZE)
+
+ try:
+ fout = open(to_file, "wb+")
+ except:
+ sys.exit("Failed to open output file : " + to_file)
+
+ try:
+ if (align_flag):
+ fout.write(''.join(idblock))
+ fout.write(''.join(blank))
+
+ for s in xrange(0, sectors * SECTOR_SIZE, PAGE_ALIGN * SECTOR_SIZE):
+ fout.write(''.join(buf[s : s + PAGE_ALIGN * SECTOR_SIZE]))
+ fout.write(''.join(blank))
+ else:
+ fout.write(''.join(idblock))
+ fout.write(''.join(buf))
+ fout.flush()
+ except:
+ sys.exit("Failed to write data to : " + to_file)
+ finally:
+ fout.close()
+ print "DONE"
+
+def usage():
+ print "Usage: make_idb.py [--enable-rc4] [--enable-align] [--to=out] --from=in"
+
+if __name__ == '__main__':
+ rc4_flag = align_flag = False
+ to_file = "IDBlock.bin"
+
+ for para in sys.argv[1:]:
+ if (para == "--enable-rc4"):
+ rc4_flag = True
+ elif (para == "--enable-align"):
+ align_flag = True
+ elif (para.startswith("--to=")):
+ to_file = para.split('=')[1]
+ elif (para.startswith("--from=")):
+ from_file = para.split('=')[1]
+ elif (para == "--help" or para == "-h"):
+ usage()
+ sys.exit()
+ else:
+ usage()
+ sys.exit()
+ if ('from_file' not in vars() or to_file == ''):
+ usage()
+ sys.exit()
+
+ idbtool = IDBTool()
+ idbtool.makeIDB(from_file, to_file, rc4_flag, align_flag)