FreeCalypso > hg > freecalypso-tools
changeset 648:3229940734e5
loadagent: binary memload command implemented
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 02 Mar 2020 02:32:18 +0000 |
parents | dfe6ba3611cd |
children | 141372e0d28f |
files | target-utils/loadagent/Makefile target-utils/loadagent/binload.c target-utils/loadagent/cmdtab.c target-utils/loadagent/serextra.S |
diffstat | 4 files changed, 93 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/target-utils/loadagent/Makefile Mon Mar 02 00:23:37 2020 +0000 +++ b/target-utils/loadagent/Makefile Mon Mar 02 02:32:18 2020 +0000 @@ -7,7 +7,7 @@ INSTDIR=/opt/freecalypso/target-bin PROG= loadagent -OBJS= crt0.o bindump.o cmdtab.o main.o sertimeout.o +OBJS= crt0.o bindump.o binload.o cmdtab.o main.o serextra.o sertimeout.o LIBS= ../libload/libload.a ../libcommon/libcommon.a ../libprintf/libprintf.a \ ../libbase/libbase.a ../libc/libc.a LIBGCC= `${CC} -print-file-name=libgcc.a`
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/target-utils/loadagent/binload.c Mon Mar 02 02:32:18 2020 +0000 @@ -0,0 +1,76 @@ +/* + * Here we are going to implement our new binary protocol for RAM loading + * for a faster version of fc-xram. + */ + +#include "types.h" + +void +cmd_binary_memload() +{ + int state, recptr, extlen, datalen; + u8 record[256], cksum; + u32 addr; + u16 rec_count; + int c, i; + + rec_count = 0; + for (state = 0; ; ) { + switch (state) { + case 0: + c = serial_in_timeout(3000000); /* 1.8 s */ + if (c < 0 || c == 0x04) + return; + if (c == 0x05) { + serial_out(0x06); /* ACK */ + serial_out(rec_count >> 8); + serial_out(rec_count); + continue; + } + if (c >= 6) { + record[0] = c; + extlen = c + 1; + datalen = c - 5; + recptr = 1; + state = 1; + continue; + } + serial_out(0x15); /* NAK */ + state = 2; + continue; + case 1: + c = serial_in_timeout(1000000); /* 0.6 s */ + if (c < 0) { + serial_out(0x15); /* NAK */ + state = 2; + continue; + } + record[recptr++] = c; + if (recptr < extlen) + continue; + /* verify checksum */ + cksum = 0; + for (i = 0; i < extlen; i++) + cksum += record[i]; + if (cksum != 0xFF) { + serial_out(0x15); /* NAK */ + state = 2; + continue; + } + addr = ((u32)record[1] << 24) | + ((u32)record[2] << 16) | + ((u32)record[3] << 8) | + (u32)record[4]; + memcpy(addr, record + 5, datalen); + rec_count++; + state = 0; + continue; + default: + c = serial_in_timeout(10000000); /* 6.15 s */ + if (c < 0) + return; + serial_out_if_empty(0x15); /* NAK */ + continue; + } + } +}
--- a/target-utils/loadagent/cmdtab.c Mon Mar 02 00:23:37 2020 +0000 +++ b/target-utils/loadagent/cmdtab.c Mon Mar 02 02:32:18 2020 +0000 @@ -18,6 +18,7 @@ extern void cmd_w32(); extern void cmd_baud_switch(); +extern void cmd_binary_memload(); extern void cmd_intel_rewrite_sector(); extern void cmd_memdump_binary(); extern void cmd_memdump_human(); @@ -32,6 +33,7 @@ {"AMFB", cmd_AMFB}, {"AMFW", cmd_AMFW}, {"BINDUMP", cmd_memdump_binary}, + {"BINML", cmd_binary_memload}, {"DUMP", cmd_memdump_machine}, {"INFB", cmd_INFB}, {"INFW", cmd_INFW},
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/target-utils/loadagent/serextra.S Mon Mar 02 02:32:18 2020 +0000 @@ -0,0 +1,14 @@ +#include "ns16550.h" + +@ extra serial I/O functions for loadagent binary operations + + .text + .code 32 + .globl serial_out_if_empty +serial_out_if_empty: + ldr r1, =uart_base + ldr r2, [r1] + ldrb r3, [r2, #NS16550_LSR] + tst r3, #NS16550_LSR_THRE + strneb r0, [r2, #NS16550_THR] + bx lr