From: robertkaiser Date: Wed, 2 Oct 2002 16:16:10 +0000 (+0000) Subject: - Changed the various serial_putc()'s to output - on X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=707f00813f759aacb346e469a4bedd0e4b0a5398;p=users%2Frw%2Farmboot.git - Changed the various serial_putc()'s to output - on '\n' (rather than -. - Added new "saves" command to dump memory contents to serial line in S-record form. --- diff --git a/CHANGELOG b/CHANGELOG index 110d29b..4fa7670 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,13 @@ Recent Modifications ====================================================================== +* Patch by Robert Kaiser : + + - Changed the various serial_putc()'s to output - on + '\n' (rather than -. + - Added new "saves" command to dump memory contents to serial + line in S-record form. + * Patch by Robert Kaiser : - one more network code cleanup. Code is now mostly in sync diff --git a/common/cmd_boot.c b/common/cmd_boot.c index 96126ff..9a519ca 100644 --- a/common/cmd_boot.c +++ b/common/cmd_boot.c @@ -38,7 +38,9 @@ #if (CONFIG_COMMANDS & CFG_CMD_LOADS) static ulong load_serial (ulong offset); +static int save_serial (ulong offset, ulong size); static int read_record (char *buf, ulong len); +static int write_record (char *buf); static int do_echo = 1; #endif @@ -156,7 +158,7 @@ int do_load_serial (cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[] printf ("## Switch baudrate to %d bps and press ENTER ...\n", loads_baudrate); udelay(50000); - serial_setbrg (bd->bi_intfreq, loads_baudrate); + serial_setbrg (bd, loads_baudrate); udelay(50000); for (;;) { if (getc() == '\r') @@ -192,7 +194,7 @@ int do_load_serial (cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[] printf ("## Switch baudrate to %d bps and press ESC ...\n", (int)bd->bi_baudrate); udelay (50000); - serial_setbrg (bd->bi_intfreq, bd->bi_baudrate); + serial_setbrg (bd, bd->bi_baudrate); udelay (50000); for (;;) { if (getc() == 0x1B) /* ESC */ @@ -335,6 +337,159 @@ read_record (char *buf, ulong len) *p = '\0'; return (p - buf); } + + + +int do_save_serial (cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[]) +{ + ulong offset = 0; + ulong size = 0; + char *env_echo; +#ifdef CFG_LOADS_BAUD_CHANGE + int saves_baudrate = bd->bi_baudrate; +#endif + + if (argc >= 2) { + offset = simple_strtoul(argv[1], NULL, 16); + } +#ifdef CFG_LOADS_BAUD_CHANGE + if (argc >= 3) { + size = simple_strtoul(argv[2], NULL, 16); + } + if (argc == 4) { + saves_baudrate = (int)simple_strtoul(argv[3], NULL, 10); + + /* default to current baudrate */ + if (saves_baudrate == 0) + saves_baudrate = bd->bi_baudrate; + } +#else /* ! CFG_LOADS_BAUD_CHANGE */ + if (argc == 3) { + size = simple_strtoul(argv[2], NULL, 16); + } +#endif /* CFG_LOADS_BAUD_CHANGE */ + +#ifdef CFG_LOADS_BAUD_CHANGE + if (saves_baudrate != bd->bi_baudrate) { + printf ("## Switch baudrate to %d bps and press ENTER ...\n", + saves_baudrate); + udelay(50000); + serial_setbrg (bd, saves_baudrate); + udelay(50000); + for (;;) { + if (getc() == '\r') + break; + } + } +#endif /* CFG_LOADS_BAUD_CHANGE */ + printf ("## Ready for S-Record upload, press ENTER to proceed ...\n"); + for (;;) { + if (getc() == '\r') + break; + } + if(save_serial (offset, size)) { + printf ("## S-Record upload aborted\n"); + } else { + printf ("## S-Record upload complete\n"); + } +#ifdef CFG_LOADS_BAUD_CHANGE + if (saves_baudrate != bd->bi_baudrate) { + printf ("## Switch baudrate to %d bps and press ESC ...\n", + (int)bd->bi_baudrate); + udelay (50000); + serial_setbrg (bd, bd->bi_baudrate); + udelay (50000); + for (;;) { + if (getc() == 0x1B) /* ESC */ + break; + } + } +#endif + return 0; +} + +#define SREC3_START "S0030000FC\n" +#define SREC3_FORMAT "S3%02X%08X%s%02X\n" +#define SREC3_END "S70500000000FA\n" +#define SREC_BYTES_PER_RECORD 16 + +static int save_serial (ulong address, ulong count) +{ + int i, c, reclen, checksum, length; + char *hex = "0123456789ABCDEF"; + char record[2*SREC_BYTES_PER_RECORD+16]; /* buffer for one S-Record */ + char data[2*SREC_BYTES_PER_RECORD+1]; /* buffer for hex data */ + + reclen = 0; + checksum = 0; + + if(write_record(SREC3_START)) /* write the header */ + return (-1); + do { + if(count) { /* collect hex data in the buffer */ + c = *(volatile uchar*)(address + reclen); /* get one byte */ + checksum += c; /* accumulate checksum */ + data[2*reclen] = hex[(c>>4)&0x0f]; + data[2*reclen+1] = hex[c & 0x0f]; + data[2*reclen+2] = '\0'; + ++reclen; + --count; + } + if(reclen == SREC_BYTES_PER_RECORD || count == 0) { + /* enough data collected for one record: dump it */ + if(reclen) { /* build & write a data record: */ + /* address + data + checksum */ + length = 4 + reclen + 1; + + /* accumulate length bytes into checksum */ + for(i = 0; i < 2; i++) + checksum += (length >> (8*i)) & 0xff; + + /* accumulate address bytes into checksum: */ + for(i = 0; i < 4; i++) + checksum += (address >> (8*i)) & 0xff; + + /* make proper checksum byte: */ + checksum = ~checksum & 0xff; + + /* output one record: */ + sprintf(record, SREC3_FORMAT, length, address, data, checksum); + if(write_record(record)) + return (-1); + } + address += reclen; /* increment address */ + checksum = 0; + reclen = 0; + } + } + while(count); + if(write_record(SREC3_END)) /* write the final record */ + return (-1); + return(0); +} + +static int +write_record (char *buf) +{ + char *p; + char c; + + while((c = *buf++)) + serial_putc(c); + + // Check for the console hangup (if any different from serial) + + if (ctrlc()) + { + return (-1); + } + return (0); +} + + + + + #endif /* CFG_CMD_LOADS */ diff --git a/common/command.c b/common/command.c index 61e5889..5f06868 100644 --- a/common/command.c +++ b/common/command.c @@ -189,6 +189,7 @@ cmd_tbl_t cmd_tbl[] = { CMD_TBL_DHCP CMD_TBL_BOOTD CMD_TBL_LOADS + CMD_TBL_SAVES CMD_TBL_LOADB CMD_TBL_AUTOSCRIPT CMD_TBL_MD diff --git a/cpu/arm920t/serial.c b/cpu/arm920t/serial.c index fcff3a3..5bd44aa 100644 --- a/cpu/arm920t/serial.c +++ b/cpu/arm920t/serial.c @@ -130,6 +130,10 @@ int serial_getc(void) */ void serial_putc(const char c) { + /* If \n, also do \r */ + if(c == '\n') + serial_putc('\r'); + #ifdef CONFIG_SERIAL1 /* wait for room in the tx FIFO on SERIAL1 */ while(!(rUTRSTAT0 & 0x2)) @@ -143,10 +147,6 @@ void serial_putc(const char c) rUTXH1= c; #endif - - /* If \n, also do \r */ - if(c == '\n') - serial_putc('\r'); } /* diff --git a/cpu/epxa/serial.c b/cpu/epxa/serial.c index e9f861b..e076db1 100644 --- a/cpu/epxa/serial.c +++ b/cpu/epxa/serial.c @@ -75,14 +75,14 @@ void serial_init(bd_t *bd) */ void serial_putc(const char c) { + /* If \n, also do \r */ + if(c == '\n') + serial_putc('\r'); + /* Wait for space in the fifo */ while(((*UART_TSR(EXC_UART00_BASE) & UART_TSR_TX_LEVEL_MSK)==15)); *UART_TD(EXC_UART00_BASE)=c; - - /* If \n, also do \r */ - if(c == '\n') - serial_putc('\r'); } /* diff --git a/cpu/sa1100/serial.c b/cpu/sa1100/serial.c index 8827743..5d1b33c 100644 --- a/cpu/sa1100/serial.c +++ b/cpu/sa1100/serial.c @@ -89,6 +89,10 @@ void serial_init(bd_t *bd) */ void serial_putc(const char c) { + /* If \n, also do \r */ + if(c == '\n') + serial_putc('\r'); + #ifdef CONFIG_SERIAL1 /* wait for room in the tx FIFO on SERIAL1 */ while((Ser1UTSR0 & UTSR0_TFS) == 0) ; @@ -100,10 +104,6 @@ void serial_putc(const char c) Ser3UTDR = c; #endif - - /* If \n, also do \r */ - if(c == '\n') - serial_putc('\r'); } /* diff --git a/cpu/xscale/serial.c b/cpu/xscale/serial.c index 11ea81d..e355fa7 100644 --- a/cpu/xscale/serial.c +++ b/cpu/xscale/serial.c @@ -84,6 +84,10 @@ void serial_init(bd_t *bd) */ void serial_putc(const char c) { + /* If \n, also do \r */ + if(c == '\n') + serial_putc('\r'); + #ifdef CONFIG_FFUART /* wait for room in the tx FIFO on FFUART */ while((FFLSR & LSR_TEMT) == 0) ; @@ -91,10 +95,6 @@ void serial_putc(const char c) FFTHR = c; #elif CONFIG_STUART #endif - - /* If \n, also do \r */ - if(c == '\n') - serial_putc('\r'); } /* diff --git a/include/cmd_boot.h b/include/cmd_boot.h index a4d2db0..f3f3130 100644 --- a/include/cmd_boot.h +++ b/include/cmd_boot.h @@ -72,6 +72,25 @@ int do_go (cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[]); int do_load_serial (cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[]); +#ifdef CFG_LOADS_BAUD_CHANGE +#define CMD_TBL_SAVES MK_CMD_TBL_ENTRY( \ + "saves", 5, 4, 0, do_save_serial, \ + "saves - save S-Record file over serial line\n", \ + "[ off ] [size] [ baud ]\n" \ + " - save S-Record file over serial line" \ + " with offset 'off', size 'size' and baudrate 'baud'\n" \ +), +#else /* ! CFG_LOADS_BAUD_CHANGE */ +#define CMD_TBL_SAVES MK_CMD_TBL_ENTRY( \ + "saves", 5, 3, 0, do_save_serial, \ + "saves - save S-Record file over serial line\n", \ + "[ off ] [size]\n" \ + " - save S-Record file over serial line with offset 'off' and size 'size'\n" \ +), +#endif /* CFG_LOADS_BAUD_CHANGE */ + +int do_save_serial (cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[]); + #else /* ! CFG_CMD_LOADS */ #define CMD_TBL_LOADS #endif /* CFG_CMD_LOADS */