# HG changeset patch # User Mychaela Falconia # Date 1583116338 0 # Node ID 3229940734e56589417ebc72e6c00ae7eb540066 # Parent dfe6ba3611cd8ef79867f6a32f4f9ab6712e3e6c loadagent: binary memload command implemented diff -r dfe6ba3611cd -r 3229940734e5 target-utils/loadagent/Makefile --- 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` diff -r dfe6ba3611cd -r 3229940734e5 target-utils/loadagent/binload.c --- /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; + } + } +} diff -r dfe6ba3611cd -r 3229940734e5 target-utils/loadagent/cmdtab.c --- 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}, diff -r dfe6ba3611cd -r 3229940734e5 target-utils/loadagent/serextra.S --- /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