The option CONFIG_VXWORKS_PREBOOT allows a board specific vxworks_preboot to be run just before jumping into the vxWorks images. This can be used to alter a register which is used differently by U-boot and vxWorks.
The patch defines a weak function which may be overridden by a board specific version. vxworks_preboot should return 0 to indicated that everything worked fine. The error code is checked and the vxWorks image will not be loaded in case of errors. Signed-off-by: Niklaus Giger <niklaus.gi...@netstal.com> --- board/netstal/mcu25/mcu25.c | 8 ++++++++ common/cmd_elf.c | 11 +++++++++++ include/vxworks.h | 2 ++ 3 files changed, 21 insertions(+), 0 deletions(-) diff --git a/board/netstal/mcu25/mcu25.c b/board/netstal/mcu25/mcu25.c index 9054282..d64194d 100644 --- a/board/netstal/mcu25/mcu25.c +++ b/board/netstal/mcu25/mcu25.c @@ -53,6 +53,7 @@ DECLARE_GLOBAL_DATA_PTR; */ #define CPC0_CR0_VALUE 0x0007F03C #define CPC0_CR1_VALUE 0x00004051 +#define CPCO_CR1_USE_EXTERNAL 0x00804051 int board_early_init_f (void) { @@ -161,6 +162,13 @@ int misc_init_r(void) return 0; } +int vxworks_preboot(void) { + if (sys_install_requested()) { + mtdcr(CPC0_CR1, CPCO_CR1_USE_EXTERNAL); + } + return 0; +} + phys_size_t initdram(int board_type) { unsigned int dram_size = 64*1024*1024; diff --git a/common/cmd_elf.c b/common/cmd_elf.c index 63f6fe7..c8eb88a 100644 --- a/common/cmd_elf.c +++ b/common/cmd_elf.c @@ -53,6 +53,11 @@ unsigned long do_bootelf_exec (ulong (*entry)(int, char *[]), int argc, char *ar return ret; } +__attribute__((weak)) int vxworks_preboot(void) +{ + return 0; +} + /* ====================================================================== * Interpreter command to boot an arbitrary ELF image from memory. * ====================================================================== */ @@ -100,6 +105,7 @@ int do_bootvx (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) char *bootline; /* Text of the bootline */ char *tmp; /* Temporary char pointer */ char build_buf[128]; /* Buffer for building the bootline */ + int rc; /* Checking vxworks_preboot */ /* --------------------------------------------------- * @@ -211,6 +217,11 @@ int do_bootvx (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) printf ("## Using bootline (@ 0x%lx): %s\n", bootaddr, (char *) bootaddr); + rc = vxworks_preboot(); + if (rc != 0) { + printf ("## vxworks_preboot failed with %d\n", rc); + return 1; + } printf ("## Starting vxWorks at 0x%08lx ...\n", addr); ((void (*)(void)) addr) (); diff --git a/include/vxworks.h b/include/vxworks.h index 1633904..2edbf8e 100644 --- a/include/vxworks.h +++ b/include/vxworks.h @@ -50,4 +50,6 @@ int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); #define CONFIG_SYS_VXWORKS_SERVERNAME "srv" #endif +int vxworks_preboot(void); + #endif -- 1.6.3.3 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot