[U-Boot] [PATCH 6/6] am335x_evm: Add support to boot from NOR.

Peter Korsgaard jacmet at sunsite.dk
Sun May 12 23:34:14 CEST 2013


>>>>> "Tom" == Tom Rini <trini at ti.com> writes:

 Tom> From: Steve Kipisz <s-kipisz2 at ti.com>
 Tom> NOR requires that s_init be within the first 4KiB of the image so that
 Tom> we can perform the rest of the required pinmuxing to talk with the rest
 Tom> of NOR that we are found on.  When NOR_BOOT is set we save our
 Tom> environment in NOR at 512KiB and a redundant copy at 768KiB.

Why not use SPL when booting from NOR as well? You still want to
relocate into DDR.


 Tom> Signed-off-by: Steve Kipisz <s-kipisz2 at ti.com>
 Tom> Signed-off-by: Tom Rini <trini at ti.com>
 Tom> ---
 Tom>  arch/arm/cpu/armv7/am33xx/emif4.c |    6 +-
 Tom>  board/ti/am335x/Makefile          |    2 +-
 Tom>  board/ti/am335x/board.c           |   31 ++++++++++-
 Tom>  board/ti/am335x/mux.c             |    6 +-
 Tom>  board/ti/am335x/u-boot.lds        |  110 +++++++++++++++++++++++++++++++++++++
 Tom>  boards.cfg                        |    1 +
 Tom>  include/configs/am335x_evm.h      |   27 ++++++++-
 Tom>  7 files changed, 174 insertions(+), 9 deletions(-)
 Tom>  create mode 100644 board/ti/am335x/u-boot.lds

 Tom> diff --git a/arch/arm/cpu/armv7/am33xx/emif4.c b/arch/arm/cpu/armv7/am33xx/emif4.c
 Tom> index aa84e96..370230b 100644
 Tom> --- a/arch/arm/cpu/armv7/am33xx/emif4.c
 Tom> +++ b/arch/arm/cpu/armv7/am33xx/emif4.c
 Tom> @@ -43,9 +43,11 @@ void dram_init_banksize(void)
 Tom>  }
 
 
 Tom> -#ifdef CONFIG_SPL_BUILD
 Tom> +#if defined(CONFIG_SPL_BUILD) || defined(CONFIG_NOR_BOOT)
 Tom> +#ifdef CONFIG_TI81XX
 Tom>  static struct dmm_lisa_map_regs *hw_lisa_map_regs =
 Tom>  				(struct dmm_lisa_map_regs *)DMM_BASE;
 Tom> +#endif
 Tom>  static struct vtp_reg *vtpreg[2] = {
 Tom>  				(struct vtp_reg *)VTP0_CTRL_ADDR,
 Tom>  				(struct vtp_reg *)VTP1_CTRL_ADDR};
 Tom> @@ -53,6 +55,7 @@ static struct vtp_reg *vtpreg[2] = {
 Tom>  static struct ddr_ctrl *ddrctrl = (struct ddr_ctrl *)DDR_CTRL_ADDR;
 Tom>  #endif
 
 Tom> +#ifdef CONFIG_TI81XX
 Tom>  void config_dmm(const struct dmm_lisa_map_regs *regs)
 Tom>  {
 Tom>  	enable_dmm_clocks();
 Tom> @@ -67,6 +70,7 @@ void config_dmm(const struct dmm_lisa_map_regs *regs)
 Tom>  	writel(regs->dmm_lisa_map_1, &hw_lisa_map_regs->dmm_lisa_map_1);
 Tom>  	writel(regs->dmm_lisa_map_0, &hw_lisa_map_regs->dmm_lisa_map_0);
 Tom>  }
 Tom> +#endif
 
 Tom>  static void config_vtp(int nr)
 Tom>  {
 Tom> diff --git a/board/ti/am335x/Makefile b/board/ti/am335x/Makefile
 Tom> index 67a87a1..1795e3e 100644
 Tom> --- a/board/ti/am335x/Makefile
 Tom> +++ b/board/ti/am335x/Makefile
 Tom> @@ -18,7 +18,7 @@ include $(TOPDIR)/config.mk
 
 Tom>  LIB	= $(obj)lib$(BOARD).o
 
 Tom> -ifdef CONFIG_SPL_BUILD
 Tom> +ifeq ($(CONFIG_SPL_BUILD)$(CONFIG_NOR_BOOT),y)
 Tom>  COBJS	:= mux.o
 Tom>  endif
 
 Tom> diff --git a/board/ti/am335x/board.c b/board/ti/am335x/board.c
 Tom> index 6f6b5d0..a0ad4bc 100644
 Tom> --- a/board/ti/am335x/board.c
 Tom> +++ b/board/ti/am335x/board.c
 Tom> @@ -38,7 +38,7 @@
 Tom>  DECLARE_GLOBAL_DATA_PTR;
 
 Tom>  static struct wd_timer *wdtimer = (struct wd_timer *)WDT_BASE;
 Tom> -#ifdef CONFIG_SPL_BUILD
 Tom> +#if defined(CONFIG_SPL_BUILD) || (CONFIG_NOR_BOOT)
 Tom>  static struct uart_sys *uart_base = (struct uart_sys *)DEFAULT_UART_BASE;
 Tom>  #endif
 
 Tom> @@ -94,7 +94,7 @@ static int read_eeprom(struct am335x_baseboard_id *header)
 Tom>  }
 
 Tom>  /* UART Defines */
 Tom> -#ifdef CONFIG_SPL_BUILD
 Tom> +#if defined(CONFIG_SPL_BUILD) || defined(CONFIG_NOR_BOOT)
 Tom>  #define UART_RESET		(0x1 << 1)
 Tom>  #define UART_CLK_RUNNING_MASK	0x1
 Tom>  #define UART_SMART_IDLE_EN	(0x1 << 0x3)
 Tom> @@ -273,6 +273,24 @@ void s_init(void)
 Tom>  {
 Tom>  	__maybe_unused struct am335x_baseboard_id header;
 
 Tom> +	/*
 Tom> +	 * The ROM will only have set up sufficient pinmux to allow for the
 Tom> +	 * first 4KiB NOR to be read, we must finish doing what we know of
 Tom> +	 * the NOR mux in this space in order to continue.
 Tom> +	 */
 Tom> +#ifdef CONFIG_NOR_BOOT
 Tom> +	asm("stmfd      sp!, {r2 - r4}");
 Tom> +	asm("movw       r4, #0x8A4");
 Tom> +	asm("movw       r3, #0x44E1");
 Tom> +	asm("orr        r4, r4, r3, lsl #16");
 Tom> +	asm("mov        r2, #9");
 Tom> +	asm("mov        r3, #8");
 Tom> +	asm("gpmc_mux:  str     r2, [r4], #4");
 Tom> +	asm("subs       r3, r3, #1");
 Tom> +	asm("bne        gpmc_mux");
 Tom> +	asm("ldmfd      sp!, {r2 - r4}");
 Tom> +#endif
 Tom> +
 Tom>  	/* WDT1 is already running when the bootloader gets control
 Tom>  	 * Disable it to avoid "random" resets
 Tom>  	 */
 Tom> @@ -283,7 +301,7 @@ void s_init(void)
 Tom>  	while (readl(&wdtimer->wdtwwps) != 0x0)
 Tom>  		;
 
 Tom> -#ifdef CONFIG_SPL_BUILD
 Tom> +#if defined(CONFIG_SPL_BUILD) || defined(CONFIG_NOR_BOOT)
 Tom>  	/* Setup the PLLs and the clocks for the peripherals */
 Tom>  	pll_init();
 
 Tom> @@ -324,9 +342,16 @@ void s_init(void)
 Tom>  	regVal |= UART_SMART_IDLE_EN;
 Tom>  	writel(regVal, &uart_base->uartsyscfg);
 
 Tom> +#if defined(CONFIG_NOR_BOOT)
 Tom> +	/* We want our console now. */
 Tom> +	gd->baudrate = CONFIG_BAUDRATE;
 Tom> +	serial_init();
 Tom> +	gd->have_console = 1;
 Tom> +#else
 Tom>  	gd = &gdata;
 
 Tom>  	preloader_console_init();
 Tom> +#endif
 
 Tom>  	/* Initalize the board header */
 Tom>  	enable_i2c0_pin_mux();
 Tom> diff --git a/board/ti/am335x/mux.c b/board/ti/am335x/mux.c
 Tom> index 187468e..5b7ed63 100644
 Tom> --- a/board/ti/am335x/mux.c
 Tom> +++ b/board/ti/am335x/mux.c
 Tom> @@ -190,7 +190,7 @@ static struct module_pin_mux nand_pin_mux[] = {
 Tom>  	{-1},
 Tom>  };
 
 Tom> -#if defined(CONFIG_NOR)
 Tom> +#if defined(CONFIG_NOR) && !defined(CONFIG_NOR_BOOT)
 Tom>  static struct module_pin_mux bone_norcape_pin_mux[] = {
 Tom>  	{OFFSET(lcd_data0), MODE(1) | PULLUDEN | RXACTIVE},     /* NOR_A0 */
 Tom>  	{OFFSET(lcd_data1), MODE(1) | PULLUDEN | RXACTIVE},     /* NOR_A1 */
 Tom> @@ -317,8 +317,10 @@ void enable_board_pin_mux(struct am335x_baseboard_id *header)
 Tom>  		configure_module_pin_mux(i2c1_pin_mux);
 Tom>  		configure_module_pin_mux(mii1_pin_mux);
 Tom>  		configure_module_pin_mux(mmc0_pin_mux);
 Tom> +#ifndef CONFIG_NOR
 Tom>  		configure_module_pin_mux(mmc1_pin_mux);
 Tom> -#if defined(CONFIG_NOR)
 Tom> +#endif
 Tom> +#if defined(CONFIG_NOR) && !defined(CONFIG_NOR_BOOT)
 Tom>  		configure_module_pin_mux(bone_norcape_pin_mux);
 Tom>  #endif
 Tom>  	} else if (board_is_gp_evm(header)) {
 Tom> diff --git a/board/ti/am335x/u-boot.lds b/board/ti/am335x/u-boot.lds
 Tom> new file mode 100644
 Tom> index 0000000..d376743
 Tom> --- /dev/null
 Tom> +++ b/board/ti/am335x/u-boot.lds
 Tom> @@ -0,0 +1,110 @@
 Tom> +/*
 Tom> + * Copyright (c) 2004-2008 Texas Instruments
 Tom> + *
 Tom> + * (C) Copyright 2002
 Tom> + * Gary Jennejohn, DENX Software Engineering, <garyj at denx.de>
 Tom> + *
 Tom> + * See file CREDITS for list of people who contributed to this
 Tom> + * project.
 Tom> + *
 Tom> + * This program is free software; you can redistribute it and/or
 Tom> + * modify it under the terms of the GNU General Public License as
 Tom> + * published by the Free Software Foundation; either version 2 of
 Tom> + * the License, or (at your option) any later version.
 Tom> + *
 Tom> + * This program is distributed in the hope that it will be useful,
 Tom> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 Tom> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 Tom> + * GNU General Public License for more details.
 Tom> + *
 Tom> + * You should have received a copy of the GNU General Public License
 Tom> + * along with this program; if not, write to the Free Software
 Tom> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 Tom> + * MA 02111-1307 USA
 Tom> + */
 Tom> +
 Tom> +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
 Tom> +OUTPUT_ARCH(arm)
 Tom> +ENTRY(_start)
 Tom> +SECTIONS
 Tom> +{
 Tom> +	. = 0x00000000;
 Tom> +
 Tom> +	. = ALIGN(4);
 Tom> +	.text :
 Tom> +	{
 Tom> +		__image_copy_start = .;
 Tom> +		CPUDIR/start.o (.text*)
 Tom> +		board/ti/am335x/libam335x.o (.text*)
 Tom> +		*(.text*)
 Tom> +	}
 Tom> +
 Tom> +	. = ALIGN(4);
 Tom> +	.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
 Tom> +
 Tom> +	. = ALIGN(4);
 Tom> +	.data : {
 Tom> +		*(.data*)
 Tom> +	}
 Tom> +
 Tom> +	. = ALIGN(4);
 Tom> +
 Tom> +	. = .;
 Tom> +
 Tom> +	. = ALIGN(4);
 Tom> +	.u_boot_list : {
 Tom> +		KEEP(*(SORT(.u_boot_list*)));
 Tom> +	}
 Tom> +
 Tom> +	. = ALIGN(4);
 Tom> +
 Tom> +	__image_copy_end = .;
 Tom> +
 Tom> +	.rel.dyn : {
 Tom> +		__rel_dyn_start = .;
 Tom> +		*(.rel*)
 Tom> +		__rel_dyn_end = .;
 Tom> +	}
 Tom> +
 Tom> +	.dynsym : {
 Tom> +		__dynsym_start = .;
 Tom> +		*(.dynsym)
 Tom> +	}
 Tom> +
 Tom> +	_end = .;
 Tom> +
 Tom> +	/*
 Tom> +	 * Deprecated: this MMU section is used by pxa at present but
 Tom> +	 * should not be used by new boards/CPUs.
 Tom> +	 */
 Tom> +	. = ALIGN(4096);
 Tom> +	.mmutable : {
 Tom> +		*(.mmutable)
 Tom> +	}
 Tom> +
 Tom> +/*
 Tom> + * Compiler-generated __bss_start and __bss_end, see arch/arm/lib/bss.c
 Tom> + * __bss_base and __bss_limit are for linker only (overlay ordering)
 Tom> + */
 Tom> +
 Tom> +	.bss_start __rel_dyn_start (OVERLAY) : {
 Tom> +		KEEP(*(.__bss_start));
 Tom> +		__bss_base = .;
 Tom> +	}
 Tom> +
 Tom> +	.bss __bss_base (OVERLAY) : {
 Tom> +		*(.bss*)
 Tom> +		 . = ALIGN(4);
 Tom> +		 __bss_limit = .;
 Tom> +	}
 Tom> +
 Tom> +	.bss_end __bss_limit (OVERLAY) : {
 Tom> +		KEEP(*(.__bss_end));
 Tom> +	}
 Tom> +
 Tom> +	/DISCARD/ : { *(.dynstr*) }
 Tom> +	/DISCARD/ : { *(.dynamic*) }
 Tom> +	/DISCARD/ : { *(.plt*) }
 Tom> +	/DISCARD/ : { *(.interp*) }
 Tom> +	/DISCARD/ : { *(.gnu*) }
 Tom> +}
 Tom> diff --git a/boards.cfg b/boards.cfg
 Tom> index d74840d..90e018f 100644
 Tom> --- a/boards.cfg
 Tom> +++ b/boards.cfg
 Tom> @@ -237,6 +237,7 @@ integratorcp_cm946es         arm         arm946es    integrator          armltd
 Tom>  ca9x4_ct_vxp                 arm         armv7       vexpress            armltd
 Tom>  am335x_evm                   arm         armv7       am335x              ti             am33xx      am335x_evm:SERIAL1,CONS_INDEX=1
 Tom>  am335x_evm_nor               arm         armv7       am335x              ti             am33xx      am335x_evm:SERIAL1,CONS_INDEX=1,NOR
 Tom> +am335x_evm_norboot           arm         armv7       am335x              ti             am33xx      am335x_evm:SERIAL1,CONS_INDEX=1,NOR,NOR_BOOT
 Tom>  am335x_evm_spiboot           arm         armv7       am335x              ti             am33xx      am335x_evm:SERIAL1,CONS_INDEX=1,SPI_BOOT
 Tom>  am335x_evm_uart1             arm         armv7       am335x              ti             am33xx      am335x_evm:SERIAL2,CONS_INDEX=2
 Tom>  am335x_evm_uart2             arm         armv7       am335x              ti             am33xx      am335x_evm:SERIAL3,CONS_INDEX=3
 Tom> diff --git a/include/configs/am335x_evm.h b/include/configs/am335x_evm.h
 Tom> index 343a4aa..abc477b 100644
 Tom> --- a/include/configs/am335x_evm.h
 Tom> +++ b/include/configs/am335x_evm.h
 Tom> @@ -39,6 +39,9 @@
 Tom>  #define CONFIG_SETUP_MEMORY_TAGS
 Tom>  #define CONFIG_INITRD_TAG
 
 Tom> +/* Custom script for NOR */
 Tom> +#define CONFIG_SYS_LDSCRIPT		"board/ti/am335x/u-boot.lds"
 Tom> +
 Tom>  #define CONFIG_SYS_CACHELINE_SIZE       64
 
 Tom>  /* commands to include */
 Tom> @@ -300,6 +303,7 @@
 Tom>  #define CONFIG_ENV_OVERWRITE		1
 Tom>  #define CONFIG_SYS_CONSOLE_INFO_QUIET
 
 Tom> +#ifndef CONFIG_NOR_BOOT
 Tom>  /* Defines for SPL */
 Tom>  #define CONFIG_SPL
 Tom>  #define CONFIG_SPL_FRAMEWORK
 Tom> @@ -343,6 +347,8 @@
 Tom>  #define CONFIG_SPL_NAND_BASE
 Tom>  #define CONFIG_SPL_NAND_DRIVERS
 Tom>  #define CONFIG_SPL_NAND_ECC
 Tom> +#endif
 Tom> +
 Tom>  #define CONFIG_SYS_NAND_5_ADDR_CYCLE
 Tom>  #define CONFIG_SYS_NAND_PAGE_COUNT	(CONFIG_SYS_NAND_BLOCK_SIZE / \
 Tom>  					 CONFIG_SYS_NAND_PAGE_SIZE)
 Tom> @@ -376,14 +382,18 @@
 Tom>   * header. That is 0x800FFFC0--0x80100000 should not be used for any
 Tom>   * other needs.
 Tom>   */
 Tom> +#ifdef CONFIG_NOR_BOOT
 Tom> +#define CONFIG_SYS_TEXT_BASE		0x08000000
 Tom> +#else
 Tom>  #define CONFIG_SYS_TEXT_BASE		0x80800000
 Tom> +#endif
 Tom>  #define CONFIG_SYS_SPL_MALLOC_START	0x80208000
 Tom>  #define CONFIG_SYS_SPL_MALLOC_SIZE	0x100000
 
 Tom>  /* Since SPL did pll and ddr initialization for us,
 Tom>   * we don't need to do it twice.
 Tom>   */
 Tom> -#ifndef CONFIG_SPL_BUILD
 Tom> +#if !defined(CONFIG_SPL_BUILD) && !defined(CONFIG_NOR_BOOT)
 Tom>  #define CONFIG_SKIP_LOWLEVEL_INIT
 Tom>  #endif
 
 Tom> @@ -470,7 +480,7 @@
 Tom>  #define CONFIG_PHY_ADDR			0
 Tom>  #define CONFIG_PHY_SMSC
 
 Tom> -#if !defined(CONFIG_SPI_BOOT)
 Tom> +#if !defined(CONFIG_SPI_BOOT) && !defined(CONFIG_NOR_BOOT)
 Tom>  #define CONFIG_NAND
 Tom>  #endif
 
 Tom> @@ -520,6 +530,19 @@
 Tom>  #define CONFIG_SYS_FLASH_BASE		(0x08000000)
 Tom>  #define CONFIG_SYS_FLASH_CFI_WIDTH	FLASH_CFI_16BIT
 Tom>  #define CONFIG_SYS_MONITOR_BASE		CONFIG_SYS_FLASH_BASE
 Tom> +#ifdef CONFIG_NOR_BOOT
 Tom> +#define CONFIG_ENV_IS_IN_FLASH
 Tom> +#define CONFIG_ENV_SECT_SIZE		(128 << 10)	/* 128 KiB */
 Tom> +#define CONFIG_ENV_OFFSET		(512 << 10)	/* 512 KiB */
 Tom> +#define CONFIG_ENV_OFFSET_REDUND	(768 << 10)	/* 768 KiB */
 Tom> +#define CONFIG_CMD_MTDPARTS
 Tom> +#define MTDIDS_DEFAULT			"nor0=physmap-flash.0"
 Tom> +#define MTDPARTS_DEFAULT		"mtdparts=physmap-flash.0:" \
 Tom> +					"512k(u-boot)," \
 Tom> +					"128k(u-boot-env1)," \
 Tom> +					"128k(u-boot-env2)," \
 Tom> +					"4m(kernel),-(rootfs)"
 Tom> +#endif
 Tom>  #define CONFIG_MTD_DEVICE
 Tom>  #define CONFIG_CMD_FLASH
 Tom>  #endif  /* NOR support */
 Tom> -- 
 Tom> 1.7.9.5

 Tom> _______________________________________________
 Tom> U-Boot mailing list
 Tom> U-Boot at lists.denx.de
 Tom> http://lists.denx.de/mailman/listinfo/u-boot


-- 
Bye, Peter Korsgaard


More information about the U-Boot mailing list