[U-Boot] [PATCH 3/5] add TI da8xx support: new board directory for spectrum digital EVM

Tom Tom.Rix at windriver.com
Sun Oct 18 19:22:59 CEST 2009


Thompson, Nick (GE EntSol, Intelligent Platforms) wrote:
> Create initial contents of the board/da8xx/da8xx-evm directory:
> 
> Low level board initialisation.
> Board level initilisation.
> Linker control.

Please add a better description of the board.
Please include a link to a long lived document if
appropriate.

> 
> Signed-off-by: Nick Thompson <nick.thompson at gefanuc.com>
> ---
> Applies to u-boot-ti
> 
>  board/da8xx/da8xx-evm/Makefile     |   52 ++++++
>  board/da8xx/da8xx-evm/board_init.S |   29 +++
>  board/da8xx/da8xx-evm/config.mk    |   30 ++++
>  board/da8xx/da8xx-evm/dv_board.c   |  330 ++++++++++++++++++++++++++++++++++++
>  board/da8xx/da8xx-evm/u-boot.lds   |   52 ++++++
>  5 files changed, 493 insertions(+), 0 deletions(-)
> 
> diff --git a/board/da8xx/da8xx-evm/Makefile b/board/da8xx/da8xx-evm/Makefile
> new file mode 100644
> index 0000000..fa00138
> --- /dev/null
> +++ b/board/da8xx/da8xx-evm/Makefile
> @@ -0,0 +1,52 @@
> +#
> +# (C) Copyright 2000, 2001, 2002
> +# Wolfgang Denk, DENX Software Engineering, wd at denx.de.
> +#
> +# Copyright (C) 2007 Sergey Kubushyn <ksi at koi8.net>
> +#
> +# See file CREDITS for list of people who contributed to this
> +# project.
> +#
> +# This program is free software; you can redistribute it and/or
> +# modify it under the terms of the GNU General Public License as
> +# published by the Free Software Foundation; either version 2 of
> +# the License, or (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program; if not, write to the Free Software
> +# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> +# MA 02111-1307 USA
> +#
> +
> +include $(TOPDIR)/config.mk
> +
> +LIB	= $(obj)lib$(BOARD).a
> +
> +COBJS	:= dv_board.o
> +SOBJS	:= board_init.o
> +
> +SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c)
> +OBJS	:= $(addprefix $(obj),$(COBJS))
> +SOBJS	:= $(addprefix $(obj),$(SOBJS))
> +
> +$(LIB):	$(obj).depend $(OBJS) $(SOBJS)
> +	$(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
> +
> +clean:
> +	rm -f $(SOBJS) $(OBJS)
> +
> +distclean:	clean
> +	rm -f $(LIB) core *.bak *~ .depend
> +
> +#########################################################################
> +# This is for $(obj).depend target
> +include $(SRCTREE)/rules.mk
> +
> +sinclude $(obj).depend
> +
> +#########################################################################
> diff --git a/board/da8xx/da8xx-evm/board_init.S b/board/da8xx/da8xx-evm/board_init.S
> new file mode 100644
> index 0000000..22d8adc
> --- /dev/null
> +++ b/board/da8xx/da8xx-evm/board_init.S
> @@ -0,0 +1,29 @@
> +/*
> + * Copyright (C) 2007 Sergey Kubushyn <ksi at koi8.net>
> + *
> + * Board-specific low level initialization code. Called at the very end
> + * of cpu/arm926ejs/davinci/lowlevel_init.S. Just returns if there is no
> + * initialization required.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +
> +#include <config.h>
> +
> +.globl	dv_board_init
> +dv_board_init:
> +
> +	mov	pc, lr

This is noop file.
This function can be handled as in inlined static function if
it is called at all.
Please remove this file if it is never used.

> diff --git a/board/da8xx/da8xx-evm/config.mk b/board/da8xx/da8xx-evm/config.mk
> new file mode 100644
> index 0000000..56de37a
> --- /dev/null
> +++ b/board/da8xx/da8xx-evm/config.mk
> @@ -0,0 +1,30 @@
> +#
> +# (C) Copyright 2002
> +# Gary Jennejohn, DENX Software Engineering, <gj at denx.de>
> +# David Mueller, ELSOFT AG, <d.mueller at elsoft.ch>
> +#
> +# (C) Copyright 2003
> +# Texas Instruments, <www.ti.com>
> +# Swaminathan <swami.iyer at ti.com>
I believe TI copyright has company on the same line as date
> +#
> +# Copyright (C) 2007 Sergey Kubushyn <ksi at koi8.net>
> +#
> +# (C) Copyright 2008
> +# Sekhar Nori, Texas Instruments, Inc. <nsekhar at ti.com>

The normal order is to have newest copyrights first.
Please reorder and include gpl 2 boilerplate.

> +#
> +# Texas Instruments DA8xx EVM board (ARM925EJS) cpu
> +# see http://www.ti.com/ for more information on Texas Instruments
> +#
> +# DA8xx EVM has 1 bank of 64 MB SDRAM (2 16Meg x16 chips).
> +# Physical Address:
> +# C000'0000 to C400'0000
> +#
> +# Linux-Kernel is expected to be at C000'8000, entry C000'8000
> +# (mem base + reserved)
> +#
> +# we load ourself to C108 '0000
> +#
> +#
> +
> +#Provide at least 16MB spacing between us and the Linux Kernel image
> +TEXT_BASE = 0xC1080000
> diff --git a/board/da8xx/da8xx-evm/dv_board.c b/board/da8xx/da8xx-evm/dv_board.c
> new file mode 100644
> index 0000000..b551bc5
> --- /dev/null
> +++ b/board/da8xx/da8xx-evm/dv_board.c
> @@ -0,0 +1,330 @@
> +/*
> + * Copyright (C) 2009 Nick Thompson, GE Fanuc, Ltd. <nick.thompson at gefanuc.com>
> + *
> + * Use the board_eth_init hook to initialise the ethernet in the
> + * correct order. (Has to wait until after call to miiphy_init().)
> + *
> + * Copyright (C) 2008 Sekhar Nori, Texas Instruments, Inc.  <nsekhar at ti.com>
> + * 
trailing whitespace
> + * Modified for DA8xx EVM. 
here too..
Please fix this globally
> + *
> + * Copyright (C) 2007 Sergey Kubushyn <ksi at koi8.net>
> + *
> + * Parts are shamelessly stolen from various TI sources, original copyright
> + * follows:
> + * -----------------------------------------------------------------
> + *
> + * Copyright (C) 2004 Texas Instruments.
> + *
> + * ----------------------------------------------------------------------------
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + *  You should have received a copy of the GNU General Public License
> + *  along with this program; if not, write to the Free Software
> + *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
Extra spaces in the prefix of the last 3 lines
> + * ----------------------------------------------------------------------------
> + */
> +
> +#include <common.h>
> +#include <i2c.h>
> +#include <net.h>
> +#include <asm/arch/hardware.h>
> +#include <asm/arch/emac_defs.h>
> +#include <asm/io.h>
> +
> +#define MACH_TYPE_DA8XX_EVM		1781
This should be in mach-types.h
This number is currently
#define MACH_TYPE_DAVINCI_DA830_EVM    1781
If this is not correct, please apply for a new number.
If this is correct the name board file should change from
da8xx/da8xx-evm
to
da8xx/da830-evm

> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +/* Works on Always On power domain only (no PD argument) */
> +void lpsc_on(unsigned int id)
> +{
> +	dv_reg_p	mdstat, mdctl, ptstat, ptcmd;
> +
> +	if (id >= 64)
> +		return;	
> +
> +    if(id < 32) {
> +	mdstat = REG_P(PSC0_MDSTAT + (id * 4));
> +        mdctl = REG_P(PSC0_MDCTL + (id * 4));
> +        ptstat = REG_P(PSC0_PTSTAT);
> +        ptcmd = REG_P(PSC0_PTCMD);
> +    } else {
> +        id -= 32;
> +	    mdstat = REG_P(PSC1_MDSTAT + (id * 4));
> +        mdctl = REG_P(PSC1_MDCTL + (id * 4));
> +        ptstat = REG_P(PSC1_PTSTAT);
> +        ptcmd = REG_P(PSC1_PTCMD);
> +    }
> +    
Many spaces need to be converted to tabs.
Please fix globally

> +	while (*ptstat & 0x01) {;}
Add a comment if you really going to do this infite loop
The statement should just be a ';' on the next line

> +
> +	if ((*mdstat & 0x1f) == 0x03)
> +		return;			/* Already on and enabled */
> +
> +	*mdctl |= 0x03;
> +
> +	/* Special treatment for some modules as for sprue14 p.7.4.2 */
Please convert this reference to text.
This document will not be in general available to everyone or
it will be supperceeded.
> +    /* TBD: Confirm if such cases exist for Primus */
> +	if (0)
> +	   	*mdctl |= 0x200;
> +
An if (0) is a noop
Please remove
> +	*ptcmd = 0x01;
Register access are through readl/writel
Please apply goblally
> +
> +	while (*ptstat & 0x01) {;}
Same comment as above infinite loop.

> +	while ((*mdstat & 0x1f) != 0x03) {;}	/* Probably an overkill... */
Same here too
> +}
> +
> +int board_init(void)
> +{
> +
> +	dv_reg_p intc;		
> +
> +	/*-------------------------------------------------------*
> +	 * Mask all IRQs by clearing the global enable and setting
> +     * the enable clear for all the 90 interrupts. This code is
> +	 * also included in low level init. Including it here in case
> +	 * low level init is skipped. Not removing it from low level
> +	 * init in case some of the low level init code generates 
> +	 * interrupts... Not expected... but you never know...
> +	 *-------------------------------------------------------*/
> +		
Multiline comment needs fixing.
Please apply this globally

> +#ifndef CONFIG_USE_IRQ
> +	intc = REG_P(INTC_GLB_EN);
> +	intc[0] = 0;	
> +
> +	intc = REG_P(INTC_HINT_EN);
> +	intc[0] = 0;
> +	intc[1] = 0;
> +	intc[2] = 0;			
> +
> +	intc = REG_P(INTC_EN_CLR0);
> +	intc[0] = 0xFFFFFFFF;
> +	intc[1] = 0xFFFFFFFF;
> +	intc[2] = 0xFFFFFFFF;
> +#endif
> +
> +	/* arch number of the board */
> +	gd->bd->bi_arch_number = MACH_TYPE_DA8XX_EVM;
> +
> +	/* address of boot parameters */
> +	gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;
> +
> +	/* Power on required peripherals 
Trainling whitespace
> +	 * ARM does not have acess by default to PSC0 and PSC1
> +	 * assuming here that the DSP bootloader has set the IOPU
> +	 * such that PSC access is available to ARM
> +	 */
> +	lpsc_on(DAVINCI_LPSC_AEMIF);    /* NAND, NOR */
> +	lpsc_on(DAVINCI_LPSC_SPI0);     /* Serial Flash */
> +	lpsc_on(DAVINCI_LPSC_EMAC);     /* image download */
> +	lpsc_on(DAVINCI_LPSC_UART2);    /* console */
> +	lpsc_on(DAVINCI_LPSC_GPIO);
> +
> +	/* Pin Muxing support */
> +	
> +	/* setup the SUSPSRC for ARM to control emulation suspend */
> +	REG(SUSPSRC) &= ~( (1 << 27) 	/* Timer0 */
> +			| (1 << 21) 	/* SPI0 */
> +			| (1 << 20) 	/* UART2 */ 
> +			| (1 << 5) 	/* EMAC */
> +			| (1 << 16) 	/* I2C0 */
> +			);		
> +
These magic numbers should be #defined
Below, there are other cases there magic numbers
need to be converted to #defines. Please fix this
globally.

> +#ifdef CONFIG_USE_PINMUX
> +
> +#ifdef CONFIG_SPI_FLASH
> +	/* SPI0 */
> +	REG(PINMUX7) &= 0x00000FFF;
> +	REG(PINMUX7) |= 0x11111000;
The REG macro is going away. in favor of readl/writel
> +#endif
> +
> +#ifdef CONFIG_DRIVER_DA8XX_EMAC
> +	/* RMII clock is sourced externally */
> +	REG(PINMUX9) &= 0xFF0FFFFF; 
> +	REG(PINMUX10) &= 0x0000000F; 
> +	REG(PINMUX10) |= 0x22222220; 
> +	REG(PINMUX11) &= 0xFFFFFF00; 
> +	REG(PINMUX11) |= 0x00000022; 
> +#endif
> +
> +	/* Async EMIF */
> +#if defined(CONFIG_USE_NAND) || defined(CONFIG_USE_NOR)
> +	REG(PINMUX13) &= 0x00FFFFFF;
> +	REG(PINMUX13) |= 0x11000000;
> +	REG(PINMUX14) =  0x11111111;
> +	REG(PINMUX15) =  0x11111111;
> +	REG(PINMUX16) =  0x11111111;
> +	REG(PINMUX17) =  0x11111111;
> +	REG(PINMUX18) =  0x11111111;
> +	REG(PINMUX19) &= 0xFFFFFFF0;
> +	REG(PINMUX19) |= 0x1;
> +#endif
> +
> +	/* UART Muxing and enabling */
> +	REG(PINMUX8) &= 0x0FFFFFFF; 
> +	REG(PINMUX8) |= 0x20000000;
> +    
> +	REG(PINMUX9) &= 0xFFFFFFF0; 
> +	REG(PINMUX9) |= 0x00000002;
> +
> +	/* I2C muxing */
> +	REG(PINMUX8) &= 0xFFF00FFF;
> +	REG(PINMUX8) |= 0x00022000;
> +
> +#endif
Add a comment that the enclosing #ifdef is CONFIG_USE_PINMUX
> +
> +	REG(DAVINCI_UART2_BASE + 0x30) = 0xE001;
> +
> +
Extra space
> +	return(0);
> +}
> +
> +int misc_init_r (void)
> +{
> +	printf ("ARM Clock : %d Hz\n", clk_get(DAVINCI_ARM_CLKID));
This looks like it may be debuffing information.
Please surround by an appropriate DEBUG ifdef if it is.
> +
> +	return(0);
> +}
> +
> +/* TODO: find a header file to put these in */
> +extern void da8xx_eth_set_mac_addr (const u_int8_t *addr);
> +extern int da8xx_eth_hw_init(void);
Yes.  Find a better header..

> +/*
> + * Initializes on-board ethernet controllers.
> + */
> +int board_eth_init(bd_t *bis)
> +{
> +#ifdef CONFIG_DRIVER_DA8XX_EMAC
> +	u_int8_t   tmp[20], buf[10];
> +	int i;
> +
> +	/* Set Ethernet MAC address from EEPROM */
> +	if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0x7f00, CONFIG_SYS_I2C_EEPROM_ADDR_LEN, buf, 6)) {
The 0x7f00 is magic, use a #define

> +		printf("\nEEPROM @ 0x%02x read FAILED!!!\n", CONFIG_SYS_I2C_EEPROM_ADDR);
If ethernet is failing to init the return status should change to 1.
It is currently always 0.
Please fix this globally.

> +	} else {
> +		tmp[0] = 0xff;
> +		for (i = 0; i < 6; i++)
> +			tmp[0] &= buf[i];
Please add a comment as what you are trying to do here.
tmp's type should likely be changed to 'char '
> +
> +		if ((tmp[0] != 0xff) && (getenv("ethaddr") == NULL)) {
> +			sprintf((char *)&tmp[0], "%02x:%02x:%02x:%02x:%02x:%02x",
> +				buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
> +		  setenv("ethaddr", (char *)&tmp[0]);
> +		}
> +	}
The logic of this should be reordered.
if (getenv("ethaddr") != NULL) {
	read eeprom
	setenv "ethaddr"

}
> +
> +	tmp[0] = 0x01;
> +	tmp[1] = 0x23;
> +	if(i2c_write(0x5f, 0, 0, tmp, 2)) {
> +		printf("Ethernet switch start failed!\n");
> +	}
This needs to be rewritten
You are abusing tmp.  The tmp variable should be split into
so its use is clear by the name of the vairable.
The 0x01, 0x23 and 0x5f are also magic numbers.
Please use #defines and/or add a comment to what you are doing

> +
> +	if (getenv ("ethaddr")) {
> +		uchar enetaddr[6];
> +		eth_getenv_enetaddr("ethaddr", enetaddr);
> +		da8xx_eth_set_mac_addr(enetaddr);
This logic can be reduced when using above suggested logic reordering
> +	}
> +
> +	if (!da8xx_eth_hw_init()) {
> +		printf("Error: Ethernet init failed!\n");
Another case where status of failure should be returned
> +	}
> +#endif
> +	
> +	return 0;
> +}
> +
> +int dram_init(void)
> +{
> +	gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
> +	gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;
> +
> +	return(0);
> +}
> +
> +#if defined(CONFIG_USE_NOR)
> +static u8 nor_read8(void *addr)
> +{
> +      u32 temp = (u32) addr;
> +
> +      temp &= 0x00FFFFFF;
> +      temp >>= 13;
> +      temp |= 0x62000000;
> +      *(unsigned char*) temp = 0;
Please remove the magic by using #defines and/or comments
Apply globally
> +
> +      return __raw_readb(addr);
Convert to readb and apply goblally
Tabs
> +}
> +
> +static u16 nor_read16(void *addr)
> +{
> +      u32 temp = (u32) addr;
> +
> +      temp &= 0x00FFFFFF;
> +      temp >>= 13;
> +      temp |= 0x62000000;
> +      *(unsigned char*) temp = 0;
> +
> +      return __raw_readw(addr);
> +}
> +
> +static u32 nor_read32(void *addr)
> +{
> +      u32 temp = (u32) addr;
> +
> +      temp &= 0x00FFFFFF;
> +      temp >>= 13;
> +      temp |= 0x62000000;
> +      *(unsigned char*) temp = 0;
> +
> +      return __raw_readl(addr);
> +}
> +
> +static void nor_write8(u8 value, void *addr)
> +{
> +	u32 temp = (u32) addr;
> +	temp &= 0x00FFFFFF;
> +	temp >>= 13;
> +	temp |= 0x62000000;
> +	*(unsigned char*) temp = 0;
> +	__raw_writeb(value, addr);
> +}
> +
> +static void nor_write16(u8 value, void *addr)
> +{
> +	u32 temp = (u32) addr;
> +	temp &= 0x00FFFFFF;
> +	temp >>= 13;
> +	temp |= 0x62000000;
> +	*(unsigned char*) temp = 0;
> +	__raw_writew(value, addr);
> +}
> +
> +static void nor_write32(u8 value, void *addr)
> +{
> +	u32 temp = (u32) addr;
> +	temp &= 0x00FFFFFF;
> +	temp >>= 13;
> +	temp |= 0x62000000;
> +	*(unsigned char*) temp = 0;
> +	__raw_writel(value, addr);
> +}
> +
> +void board_flash_set_access(ulong bank_base, int banknum, flash_info_t* info)
> +{
> +	info->read8 = nor_read8;
> +	info->read16 = nor_read16;
> +	info->read32 = nor_read32;
> +	
> +	info->write8 = nor_write8;
> +	info->write16 = nor_write16;
> +	info->write32 = nor_write32;
> +}
> +#endif
> diff --git a/board/da8xx/da8xx-evm/u-boot.lds b/board/da8xx/da8xx-evm/u-boot.lds
> new file mode 100644
> index 0000000..a4fcd1a
> --- /dev/null
> +++ b/board/da8xx/da8xx-evm/u-boot.lds

Nak
There is a common u-boot.lds in cpu/arm926ejs
You should also review other routines in the cpu/arm926ejs dir
to remove other common code from your board files


> @@ -0,0 +1,52 @@
> +/*
> + * (C) Copyright 2002
> + * Gary Jennejohn, DENX Software Engineering, <gj at denx.de>
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +
> +OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
> +OUTPUT_ARCH(arm)
> +ENTRY(_start)
> +SECTIONS
> +{
> +	. = 0x00000000;
> +	. = ALIGN(4);
> +	.text	:
> +	{
> +	  cpu/arm926ejs/start.o	(.text)
> +	  *(.text)
> +	}
> +	. = ALIGN(4);
> +	.rodata : { *(.rodata) }
> +	. = ALIGN(4);
> +	.data : { *(.data) }
> +	. = ALIGN(4);
> +	.got : { *(.got) }
> +
> +	. = .;
> +	__u_boot_cmd_start = .;
> +	.u_boot_cmd : { *(.u_boot_cmd) }
> +	__u_boot_cmd_end = .;
> +
> +	. = ALIGN(4);
> +	__bss_start = .;
> +	.bss (NOLOAD) : { *(.bss) }
> +	_end = .;
> +}
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot



More information about the U-Boot mailing list