meow
This commit is contained in:
parent
b454664773
commit
06ccb61666
|
@ -0,0 +1,103 @@
|
|||
#!/bin/env python3
|
||||
|
||||
from struct import pack as p
|
||||
from struct import unpack as up
|
||||
import serial
|
||||
import time
|
||||
import sys
|
||||
|
||||
|
||||
baudgen = 0x11
|
||||
reg0 = 0x6
|
||||
|
||||
def chksum(data):
|
||||
chk = 0
|
||||
for d in data:
|
||||
chk += d
|
||||
chk &= 0xFFFF_FFFF
|
||||
return chk
|
||||
|
||||
def hdrchksum(data):
|
||||
chk = 0
|
||||
for i in range(0, len(data), 4):
|
||||
chk += up("<I", data[i:i+4])[0]
|
||||
chk &= 0xFFFF_FFFF
|
||||
return chk
|
||||
|
||||
def gen_hdr():
|
||||
# xip ivt
|
||||
hdr = b""
|
||||
hdr += p("<I", 0xeafffffe)
|
||||
hdr += p("<I", 0xeafffffe)
|
||||
hdr += p("<I", 0xeafffffe)
|
||||
hdr += p("<I", 0xeafffffe)
|
||||
hdr += p("<I", 0xeafffffe)
|
||||
hdr += p("<I", 0xeafffffe)
|
||||
hdr += p("<I", 0xeafffffe)
|
||||
hdr += p("<I", 0xeafffffe)
|
||||
# width detect
|
||||
hdr += p("<I", 0xaa995566)
|
||||
hdr += b'XNLX'
|
||||
# encryption + misc
|
||||
hdr += p("<II", 0, 0x01010000)
|
||||
# :D ('source offset' - why yes, I'm like to boot the bootrom!)
|
||||
hdr += p("<I", 0x1_0000_0000-0x40000)
|
||||
# len
|
||||
hdr += p("<I", 0x2_0000)
|
||||
# load addr 0 or 0x4_0000 only...
|
||||
hdr += p("<I", 0)
|
||||
# entrypt (just a loop :))
|
||||
hdr += p("<I", 0x0FCB4)
|
||||
#"total image len" doesn't matter here
|
||||
hdr += p("<I", 0x010014)
|
||||
# QSPI something something
|
||||
hdr += p("<I", 1)
|
||||
# checksum
|
||||
hdr += p("<I", 0xffff_ffff - hdrchksum(hdr[0x20:]))
|
||||
|
||||
# unused...
|
||||
for _ in range(19):
|
||||
hdr += p("<I", 0)
|
||||
# not sure at allll:
|
||||
hdr += p("<II", 0x8c0,0x8c0)
|
||||
# init lists
|
||||
for _ in range(0x100):
|
||||
hdr += p("<II", 0xffff_ffff, 0)
|
||||
return hdr
|
||||
|
||||
img = gen_hdr()
|
||||
size = len(img)
|
||||
checksum = chksum(img)
|
||||
print("checksum: "+hex(checksum))
|
||||
print("len: "+str(size))
|
||||
|
||||
ser = serial.Serial(timeout=0.5)
|
||||
ser.port = "/dev/ttyUSB0"
|
||||
ser.baudrate = 115200
|
||||
ser.open()
|
||||
|
||||
while ser.read(1) != b'X':
|
||||
continue
|
||||
assert ser.read(8) == b'LNX-ZYNQ'
|
||||
|
||||
ser.write(b"BAUD")
|
||||
ser.write(baudgen.to_bytes(4, 'little'))
|
||||
ser.write(reg0.to_bytes(4, 'little'))
|
||||
ser.write(size.to_bytes(4, 'little'))
|
||||
|
||||
ser.write(checksum.to_bytes(4, 'little'))
|
||||
ser.flush()
|
||||
|
||||
print("writing image...")
|
||||
# sleep here 'cause this is where they hit resets for the tx/rx logic,
|
||||
# and anything in-flight when that happens is lost (it happens a fair bit)
|
||||
time.sleep(0.1)
|
||||
print("wrote: " + str(ser.write(img)))
|
||||
ser.flush()
|
||||
# let any error logic propagate..
|
||||
time.sleep(0.1)
|
||||
if ser.in_waiting == 0:
|
||||
print("ok, i think we are done, ROM is 0x2_0000 bytes starting at 0 :)")
|
||||
else:
|
||||
print("something went wrong? bootrom says: " + str(ser.read(ser.in_waiting)))
|
||||
|
Loading…
Reference in New Issue