arm: working bootloader, example app

'make' will produce two outputs:
- bootloader.elf to be loaded into the bitstream
- app.bin to be loaded through the programmer

Loading app.bin is as simple as:
- reset the board
- `python3 prog.py app.bin`
This commit is contained in:
2022-05-10 11:20:02 -07:00
parent 43d245bae2
commit b8b0d94065
10 changed files with 231 additions and 46 deletions

47
arm/prog.py Normal file
View File

@@ -0,0 +1,47 @@
import serial
import struct
import sys
offset = 0x800
tty = 'tty'
baud = 115200
chunksize = 128
def write(s, offset, dat):
for i in range(0, len(dat), chunksize):
chunk = dat[i: i + chunksize]
cmd = struct.pack('<cII', b'c', offset + i, len(chunk))
print(f'Sending {len(chunk)} bytes @0x{offset + i:04x}')
s.write(cmd)
s.write(chunk)
ack = s.read(2)
if len(ack) < 2:
raise RuntimeError(f'timeout waiting for full ack. got {ack}')
if ack[0] != b'a'[0]:
raise RuntimeError(f'expected ack, got this instead: {ack}')
print(f'Ack! len={ack[1]}')
def jump(s, offset):
addr = struct.pack('<I', offset)
s.write(b'j')
s.write(addr)
def main():
binfile = sys.argv[1]
with open(binfile, 'rb') as f:
dat = f.read()
s = serial.Serial(tty, baud, timeout=1)
write(s, offset, dat)
jump(s, offset)
if __name__ == "__main__":
main()