# HG changeset patch # User Mychaela Falconia # Date 1451510921 0 # Node ID a7b0b426f9ca58bd3a93f0a26a710013490174b0 # Parent 5cff3579814c781dbede1dd73df250d1dbce0a34 target-utils: boot ROM UART autodetection revamped The new implementation should work with both the familiar Calypso C035 boot ROM version found in our regular targets as well as the older Calypso F741979B version found on the vintage D-Sample board. diff -r 5cff3579814c -r a7b0b426f9ca target-utils/env/iram.lds --- a/target-utils/env/iram.lds Wed Dec 30 20:48:12 2015 +0000 +++ b/target-utils/env/iram.lds Wed Dec 30 21:28:41 2015 +0000 @@ -39,10 +39,6 @@ PROVIDE(end = .); } -/* a few absolute definitions */ -rom_vars = 0x800518; -/* stack_bottom = 0x83FFFC; */ - /* * stack_bottom will be set via the --defsym option to ld. * Some programs have minimal IRAM requirements, so it would make more diff -r 5cff3579814c -r a7b0b426f9ca target-utils/helloapp/main.c --- a/target-utils/helloapp/main.c Wed Dec 30 20:48:12 2015 +0000 +++ b/target-utils/helloapp/main.c Wed Dec 30 21:28:41 2015 +0000 @@ -1,18 +1,8 @@ -#include "types.h" -#include "romvars.h" - -extern struct boot_rom_vars rom_vars; - -extern char *uart_name; - main() { uart_select_init(); printf("Hello-world demo app running\n"); - printf("Loaded via UART %d (%s) at baud rate #%d\n", rom_vars.uart_id, - uart_name, rom_vars.baud_rate_code); - printf("TCXO clock input autodetected to be %d MHz\n", - rom_vars.clktcxo_13mhz ? 13 : 26); + print_boot_rom_info(); for (;;) { putchar('='); if (command_entry()) diff -r 5cff3579814c -r a7b0b426f9ca target-utils/include/halt.h --- a/target-utils/include/halt.h Wed Dec 30 20:48:12 2015 +0000 +++ b/target-utils/include/halt.h Wed Dec 30 21:28:41 2015 +0000 @@ -8,3 +8,4 @@ #define HALTCODE_MAINEXITED 0x40 #define HALTCODE_INVALIDUART 0x41 +#define HALTCODE_BOOTROMVER 0x42 diff -r 5cff3579814c -r a7b0b426f9ca target-utils/libbase/serio.S --- a/target-utils/libbase/serio.S Wed Dec 30 20:48:12 2015 +0000 +++ b/target-utils/libbase/serio.S Wed Dec 30 21:28:41 2015 +0000 @@ -2,6 +2,8 @@ @ this module implements the elementary serial I/O operations + .comm uart_base,4,4 + .text .code 32 .global serial_out diff -r 5cff3579814c -r a7b0b426f9ca target-utils/libcommon/uartsel.c --- a/target-utils/libcommon/uartsel.c Wed Dec 30 20:48:12 2015 +0000 +++ b/target-utils/libcommon/uartsel.c Wed Dec 30 21:28:41 2015 +0000 @@ -9,14 +9,28 @@ #include "ns16550.h" #include "halt.h" -extern struct boot_rom_vars rom_vars; +extern struct ns16550_regs *uart_base; -struct ns16550_regs *uart_base; -char *uart_name; +static u16 rom_version; +static struct boot_rom_vars *rom_vars; +static char *uart_name; uart_select_init() { - switch (rom_vars.uart_id) { + rom_version = *(u16 *)0x1FFE; + + switch (rom_version) { + case 0x0200: + rom_vars = (struct boot_rom_vars *) 0x800504; + break; + case 0x0300: + rom_vars = (struct boot_rom_vars *) 0x800518; + break; + default: + _exit(HALTCODE_BOOTROMVER); + } + + switch (rom_vars->uart_id) { case 0: uart_base = (struct ns16550_regs *) 0xFFFF5800; uart_name = "MODEM"; @@ -29,3 +43,12 @@ _exit(HALTCODE_INVALIDUART); } } + +print_boot_rom_info() +{ + printf("Loaded via boot ROM v%04X, UART %d (%s) at baud rate #%d\n", + rom_version, rom_vars->uart_id, uart_name, + rom_vars->baud_rate_code); + printf("CLKTCXO input autodetected to be %d MHz\n", + rom_vars->clktcxo_13mhz ? 13 : 26); +} diff -r 5cff3579814c -r a7b0b426f9ca target-utils/loadagent/main.c --- a/target-utils/loadagent/main.c Wed Dec 30 20:48:12 2015 +0000 +++ b/target-utils/loadagent/main.c Wed Dec 30 21:28:41 2015 +0000 @@ -2,21 +2,11 @@ * FreeCalypso loadagent main() function lives here */ -#include "types.h" -#include "romvars.h" - -extern struct boot_rom_vars rom_vars; - -extern char *uart_name; - main() { uart_select_init(); printf("FreeCalypso loadagent running\n"); - printf("Loaded via UART %d (%s) at baud rate #%d\n", rom_vars.uart_id, - uart_name, rom_vars.baud_rate_code); - printf("TCXO clock input autodetected to be %d MHz\n", - rom_vars.clktcxo_13mhz ? 13 : 26); + print_boot_rom_info(); for (;;) { putchar('='); if (command_entry()) diff -r 5cff3579814c -r a7b0b426f9ca target-utils/pirexplore/main.c --- a/target-utils/pirexplore/main.c Wed Dec 30 20:48:12 2015 +0000 +++ b/target-utils/pirexplore/main.c Wed Dec 30 21:28:41 2015 +0000 @@ -1,18 +1,10 @@ #include "types.h" -#include "romvars.h" - -extern struct boot_rom_vars rom_vars; - -extern char *uart_name; main() { uart_select_init(); printf("Pirelli hardware exploration utility running\n"); - printf("Loaded via UART %d (%s) at baud rate #%d\n", rom_vars.uart_id, - uart_name, rom_vars.baud_rate_code); - printf("TCXO clock input autodetected to be %d MHz\n", - rom_vars.clktcxo_13mhz ? 13 : 26); + print_boot_rom_info(); /* * Make the same register settings as in the init script used by * fc-loadtool and fc-xram: ../../loadtools/scripts/pirelli.init