Skip to content

Instantly share code, notes, and snippets.

@ius
Created December 30, 2020 16:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ius/26071d04b7f3dd1863f557ca22772390 to your computer and use it in GitHub Desktop.
Save ius/26071d04b7f3dd1863f557ca22772390 to your computer and use it in GitHub Desktop.
kd20_uboot.py
#!/usr/bin/env python2
import sys
import struct
from binascii import crc32
def unwrap(data):
b = 0
out = ''
for i in range(len(data)):
shift = (i % 8)
if data[i] not in ('\x55', '\xaa'):
break
bit = data[i] == '\x55'
b |= (bit << shift)
if shift == 7:
out += chr(b)
b = 0
return out
def wrap(data):
out = ''
for b in data:
for i in range(8):
if (ord(b) >> i) & 1:
out += '\x55'
else:
out += '\xaa'
return out
def recrc(data):
size, crc = struct.unpack('II', data[:8])
data = data[8:]
calc_crc = crc32(data) & 0xffffffff
assert len(data) == size, 'invalid length'
#assert calc_crc == crc, 'bad crc'
hdr = struct.pack('II', size, calc_crc)
return hdr + data
def fix(data):
data = data.replace('loadr=nand read.e 0x62000000 240000 280000', 'loadr=nand read.e 0x62000000 240000 600000')
data = data.replace('load=nand read.e 0x60500000 840000 300000', 'load=nand read.e 0x60500000 840000 7c0000')
return data
fp = open(sys.argv[1])
data = fp.read()
rdata = None
orig_len = len(data)
data = unwrap(data)
data = fix(data)
data = recrc(data)
data = wrap(data)
open('uboot_patched.bin','wb').write(data)
data = data.ljust(orig_len, '\xff')
open('uboot_patched_padded.bin','wb').write(data)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment