From f1c806526fd9b5d10cafcff37246564414dc877a Mon Sep 17 00:00:00 2001 From: Masayuki Ishikawa Date: Fri, 4 Jan 2019 12:03:55 +0000 Subject: [PATCH] Merged in masayuki2009/nuttx.nuttx/lc823450_spif_boot (pull request #801) lc823450 spif boot * arch/arm/src/lc823450: Add support for SPI flash boot Also, remove unnecessary code for the SPI flash boot Signed-off-by: Masayuki Ishikawa * configs/lc823450-xgevk: Add linker script for SPI flash boot Signed-off-by: Masayuki Ishikawa Approved-by: GregoryN --- arch/arm/src/lc823450/Kconfig | 3 + arch/arm/src/lc823450/Make.defs | 8 -- .../arm/src/lc823450/lc823450_allocateheap2.c | 7 +- arch/arm/src/lc823450/lc823450_start.c | 66 ++------- configs/lc823450-xgevk/scripts/Make.defs | 4 + .../scripts/ld-spif-boot.script | 126 ++++++++++++++++++ 6 files changed, 151 insertions(+), 63 deletions(-) create mode 100644 configs/lc823450-xgevk/scripts/ld-spif-boot.script diff --git a/arch/arm/src/lc823450/Kconfig b/arch/arm/src/lc823450/Kconfig index 947a564e3f..2c355b1f37 100644 --- a/arch/arm/src/lc823450/Kconfig +++ b/arch/arm/src/lc823450/Kconfig @@ -42,6 +42,9 @@ if LC823450_SPIFI config LC823450_SPIFI_QUADIO bool "SPIFI 4bit access" default y +config LC823450_SPIFI_BOOT + bool "Boot from an external SPI flash" + default n endif config LC823450_SDIF diff --git a/arch/arm/src/lc823450/Make.defs b/arch/arm/src/lc823450/Make.defs index 1efda9aa3c..1c1e578e6a 100644 --- a/arch/arm/src/lc823450/Make.defs +++ b/arch/arm/src/lc823450/Make.defs @@ -140,12 +140,8 @@ CHIP_CSRCS += lc823450_adc.c endif ifeq ($(CONFIG_LC823450_IPL2),y) -ifeq ($(CONFIG_LC823450_SPIFLASH_BOOT),y) -CHIP_CSRCS += lc823450_spif_ipl2.c -else CHIP_CSRCS += lc823450_ipl2.c endif -endif ifeq ($(CONFIG_DVFS),y) CHIP_CSRCS += lc823450_dvfs2.c @@ -157,10 +153,6 @@ CHIP_CSRCS += lc823450_pminitialize.c CHIP_CSRCS += lc823450_sleep.c endif -ifeq ($(CONFIG_LC823450_SPIFI_RAMFAT), y) -CHIP_CSRCS += lc823450_ramfat.c -endif - ifeq ($(CONFIG_SMP), y) CHIP_CSRCS += lc823450_cpuidlestack.c CHIP_CSRCS += lc823450_cpuindex.c diff --git a/arch/arm/src/lc823450/lc823450_allocateheap2.c b/arch/arm/src/lc823450/lc823450_allocateheap2.c index 5e33fbcb70..7b13592fd0 100644 --- a/arch/arm/src/lc823450/lc823450_allocateheap2.c +++ b/arch/arm/src/lc823450/lc823450_allocateheap2.c @@ -165,7 +165,12 @@ void up_allocate_heap(FAR void **heap_start, size_t *heap_size) /* Return the heap settings */ - *heap_start = (uintptr_t *)&_eronly; /* please see ld.script */ +#ifdef CONFIG_LC823450_SPIFI_BOOT + *heap_start = (uintptr_t *)&_ebss + 4096; /* see ld-spif-boot.script */ +#else + *heap_start = (uintptr_t *)&_eronly; /* see ld.script */ +#endif + *heap_size = SRAM1_END - (int)*heap_start; /* Colorize the heap for debug */ diff --git a/arch/arm/src/lc823450/lc823450_start.c b/arch/arm/src/lc823450/lc823450_start.c index 2f72ea1b12..a6890a6b99 100644 --- a/arch/arm/src/lc823450/lc823450_start.c +++ b/arch/arm/src/lc823450/lc823450_start.c @@ -201,11 +201,7 @@ static void go_os_start(void *pv, unsigned int nbytes) * ****************************************************************************/ -#ifdef CONFIG_SPIFLASH_BOOT -__attribute__((section (".start_text"))) void __start_main(void) -#else /* CONFIG_SPIFLASH_BOOT */ void __start(void) -#endif /* CONFIG_SPIFLASH_BOOT */ { const uint32_t *src; uint32_t *dest; @@ -261,26 +257,23 @@ void __start(void) g_lastksg_buf.sig = LASTKMSG_SIG; #endif /* CONFIG_LASTKMSG */ -#ifdef CONFIG_SPIFLASH_BOOT +#ifdef CONFIG_LC823450_SPIFI_BOOT /* Copy any necessary code sections from FLASH to RAM. The correct - * destination in SRAM is given by _sramfuncs and _eramfuncs. The - * temporary location is in flash after the data initalization code - * at _framfuncs. + * destination in SRAM is geive by _sramfuncs and _eramfuncs. The + * temporary location is in flash after the data initialization code + * at _framfuncs. This should be done before lc823450_clockconfig() is + * called (in case it has some dependency on initialized C variables). */ - /* copt text & vectors */ - - for (src = &_ftext, dest = &_stext_sram; dest < &_etext_sram; ) +#ifdef CONFIG_ARCH_RAMFUNCS + for (src = &_framfuncs, dest = &_sramfuncs; dest < &_eramfuncs; ) { *dest++ = *src++; } +#endif - /* vector offset */ - - putreg32((uint32_t)&_svect, NVIC_VECTAB); - -#else /* CONFIG_SPIFLASH_BOOT */ +#else /* CONFIG_LC823450_SPIFI_BOOT */ /* vector offset */ #ifdef CONFIG_LC823450_IPL2 @@ -289,7 +282,8 @@ void __start(void) #else /* CONFIG_LC823450_IPL2 */ putreg32(0x02040000, 0xe000ed08); #endif /* CONFIG_LC823450_IPL2 */ -#endif /* CONFIG_LC823450_SPIFLASH_BOOT */ + +#endif /* CONFIG_LC823450_SPIFI_BOOT */ /* Enable Mutex */ /* NOTE: modyfyreg32() can not be used because it might use spin_lock */ @@ -327,7 +321,7 @@ void __start(void) showprogress('B'); -#if defined(CONFIG_LC823450_SPIFI) && !defined(CONFIG_SPIFLASH_BOOT) +#if defined(CONFIG_LC823450_SPIFI) && !defined(CONFIG_LC823450_SPIFI_BOOT) lc823450_spiflash_earlyinit(); #endif /* CONFIG_LC823450_SPIFI */ @@ -421,39 +415,3 @@ void __start(void) #endif } -#if defined(CONFIG_SPIFLASH_BOOT) -__attribute__((section (".start_gdb"))) void __start(void) -{ - /* XXX: Don't use stack in this function */ - - /* SPIF/CACHE clock */ - - putreg32(0x0402, 0x40080100); - - /* SPIF/CACHE reset */ - - putreg32(0x0402, 0x40080114); - - /* PinMux for QSPI */ - - putreg32(0x540000c0, 0x40080400); - putreg32(0x00000017, 0x40080404); - - /* BusAcc enable */ - - putreg32(0x00000303, 0x40001028); - - /* Stack initialize: */ - - __asm__ __volatile__ - ( - "ldr r0, =_vectors\n" - "bic r0, r0, #1\n" - "ldr sp, [r0, #0]\n" - ); - - __start_main(); - - /* not reached */ -} -#endif /* defined(CONFIG_SPIFLASH_BOOT) */ diff --git a/configs/lc823450-xgevk/scripts/Make.defs b/configs/lc823450-xgevk/scripts/Make.defs index 9e10983e92..66593e22f4 100644 --- a/configs/lc823450-xgevk/scripts/Make.defs +++ b/configs/lc823450-xgevk/scripts/Make.defs @@ -39,9 +39,13 @@ include ${TOPDIR}/arch/arm/src/armv7-m/Toolchain.defs ifeq ($(CONFIG_LC823450_IPL2),y) LDSCRIPT = ld-ipl2.script +else +ifeq ($(CONFIG_LC823450_SPIFI_BOOT),y) + LDSCRIPT = ld-spif-boot.script else LDSCRIPT = ld.script endif +endif ifeq ($(WINTOOL),y) # Windows-native toolchains diff --git a/configs/lc823450-xgevk/scripts/ld-spif-boot.script b/configs/lc823450-xgevk/scripts/ld-spif-boot.script new file mode 100644 index 0000000000..036a665bd8 --- /dev/null +++ b/configs/lc823450-xgevk/scripts/ld-spif-boot.script @@ -0,0 +1,126 @@ +/**************************************************************************** + * configs/lc823450-xgevk/scripts/ld-spif-boot.script + * + * Copyright 2019 Sony Video & Sound Products Inc. + * Author: Masayuki Ishikawa + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +MEMORY +{ + flash (rx) : ORIGIN = 0x05000000, LENGTH = 16384K + sram (rwx) : ORIGIN = 0x02001000, LENGTH = 1652K +} + +OUTPUT_ARCH(arm) +EXTERN(_vectors) +ENTRY(_stext) +SECTIONS +{ + .text : + { + _stext = ABSOLUTE(.); + KEEP(*(.vectors)) + *(.vectors) + *(.text .text.*) + *(.fixup) + *(.gnu.warning) + *(.rodata .rodata.*) + *(.gnu.linkonce.t.*) + *(.glue_7) + *(.glue_7t) + *(.got) + *(.gcc_except_table) + *(.gnu.linkonce.r.*) + _etext = ABSOLUTE(.); + } > flash + + .init_section : + { + _sinit = ABSOLUTE(.); + KEEP(*(.init_array .init_array.*)) + _einit = ABSOLUTE(.); + } > flash + + .ARM.extab : + { + *(.ARM.extab*) + } > flash + + __exidx_start = ABSOLUTE(.); + .ARM.exidx : + { + *(.ARM.exidx*) + } > flash + __exidx_end = ABSOLUTE(.); + + _eronly = ABSOLUTE(LOADADDR(.data)); + + .data : + { + _sdata = ABSOLUTE(.); + *(.data .data.*) + *(.gnu.linkonce.d.*) + CONSTRUCTORS + _edata = ABSOLUTE(.); + } > sram AT > flash + + .ramfunc ALIGN(4): + { + _sramfuncs = ABSOLUTE(.); + *(.ramfunc .ramfunc.*) + _eramfuncs = ABSOLUTE(.); + } > sram AT > flash + + _framfuncs = LOADADDR(.ramfunc); + + .bss : + { + _sbss = ABSOLUTE(.); + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + _ebss = ABSOLUTE(.); + } > sram + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_info 0 : { *(.debug_info) } + .debug_line 0 : { *(.debug_line) } + .debug_pubnames 0 : { *(.debug_pubnames) } + .debug_aranges 0 : { *(.debug_aranges) } +}