[U-Boot-Users] [PATCH 1/1] Add support for ATMEL AT91SAM9G20EK board

From 81230b02610c06fdc8a175e635851346488e3bdb Mon Sep 17 00:00:00 2001
From: Hong Xu hong.xu@atmel.com Date: Thu, 24 Jul 2008 14:25:05 +0800 Subject: [PATCH 1/1] Add support for ATMEL AT91SAM9G20EK board
This patch adds support for ATMEL AT91SAM9G20EK board. User manual for AT91SAM9G20EK board, see http://www.atmel.com/dyn/resources/prod_documents/doc6413.pdf AT91 SAM9G20 datasheet, see http://www.atmel.com/dyn/resources/prod_documents/doc6384.pdf
Signed-off-by: Hong Xu hong.xu@atmel.com --- Makefile | 3 + board/atmel/at91sam9g20ek/Makefile | 57 +++++++ board/atmel/at91sam9g20ek/at91sam9g20ek.c | 250 +++++++++++++++++++++++++++++ board/atmel/at91sam9g20ek/config.mk | 1 + board/atmel/at91sam9g20ek/led.c | 64 ++++++++ board/atmel/at91sam9g20ek/nand.c | 79 +++++++++ board/atmel/at91sam9g20ek/partition.c | 40 +++++ drivers/net/macb.c | 4 +- include/asm-arm/arch-at91sam9/hardware.h | 2 +- include/configs/at91sam9g20ek.h | 202 +++++++++++++++++++++++ net/eth.c | 2 +- 11 files changed, 700 insertions(+), 4 deletions(-) create mode 100644 board/atmel/at91sam9g20ek/Makefile create mode 100644 board/atmel/at91sam9g20ek/at91sam9g20ek.c create mode 100644 board/atmel/at91sam9g20ek/config.mk create mode 100644 board/atmel/at91sam9g20ek/led.c create mode 100644 board/atmel/at91sam9g20ek/nand.c create mode 100644 board/atmel/at91sam9g20ek/partition.c create mode 100644 include/configs/at91sam9g20ek.h
diff --git a/Makefile b/Makefile index 369bbd7..c7ed34d 100644 --- a/Makefile +++ b/Makefile @@ -2388,6 +2388,9 @@ at91cap9adk_config : unconfig at91sam9260ek_config : unconfig @$(MKCONFIG) $(@:_config=) arm arm926ejs at91sam9260ek atmel at91sam9
+at91sam9g20ek_config : unconfig + @$(MKCONFIG) $(@:_config=) arm arm926ejs at91sam9g20ek atmel at91sam9 + ######################################################################## ## ARM Integrator boards - see doc/README-integrator for more info. integratorap_config \ diff --git a/board/atmel/at91sam9g20ek/Makefile b/board/atmel/at91sam9g20ek/Makefile new file mode 100644 index 0000000..cdf5d34 --- /dev/null +++ b/board/atmel/at91sam9g20ek/Makefile @@ -0,0 +1,57 @@ +# +# (C) Copyright 2003-2008 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# (C) Copyright 2008 +# Stelian Pop stelian.pop@leadtechdesign.com +# Lead Tech Design <www.leadtechdesign.com> +# +# 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-y += at91sam9g20ek.o +COBJS-y += led.o +COBJS-y += partition.o +COBJS-$(CONFIG_CMD_NAND) += nand.o + +SRCS := $(SOBJS:.o=.S) $(COBJS-y:.o=.c) +OBJS := $(addprefix $(obj),$(COBJS-y)) +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 $(obj).depend + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/board/atmel/at91sam9g20ek/at91sam9g20ek.c b/board/atmel/at91sam9g20ek/at91sam9g20ek.c new file mode 100644 index 0000000..f47b7bb --- /dev/null +++ b/board/atmel/at91sam9g20ek/at91sam9g20ek.c @@ -0,0 +1,250 @@ +/* + * (C) Copyright 2007-2008 + * Stelian Pop stelian.pop@leadtechdesign.com + * Lead Tech Design <www.leadtechdesign.com> + * + * 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 <common.h> +#include <asm/arch/at91sam9260.h> +#include <asm/arch/at91sam9260_matrix.h> +#include <asm/arch/at91sam9_smc.h> +#include <asm/arch/at91_pmc.h> +#include <asm/arch/at91_rstc.h> +#include <asm/arch/gpio.h> +#include <asm/arch/io.h> +#if defined(CONFIG_RESET_PHY_R) && defined(CONFIG_MACB) +#include <net.h> +#endif + +DECLARE_GLOBAL_DATA_PTR; + +/* ------------------------------------------------------------------------- */ +/* + * Miscelaneous platform dependent initialisations + */ + +static void at91sam9g20ek_serial_hw_init(void) +{ +#ifdef CONFIG_USART0 + at91_set_A_periph(AT91_PIN_PB4, 1); /* TXD0 */ + at91_set_A_periph(AT91_PIN_PB5, 0); /* RXD0 */ + at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_US0); +#endif + +#ifdef CONFIG_USART1 + at91_set_A_periph(AT91_PIN_PB6, 1); /* TXD1 */ + at91_set_A_periph(AT91_PIN_PB7, 0); /* RXD1 */ + at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_US1); +#endif + +#ifdef CONFIG_USART2 + at91_set_A_periph(AT91_PIN_PB8, 1); /* TXD2 */ + at91_set_A_periph(AT91_PIN_PB9, 0); /* RXD2 */ + at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_US2); +#endif + +#ifdef CONFIG_USART3 /* DBGU */ + at91_set_A_periph(AT91_PIN_PB14, 0); /* DRXD */ + at91_set_A_periph(AT91_PIN_PB15, 1); /* DTXD */ + at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_SYS); +#endif +} + +#ifdef CONFIG_CMD_NAND +static void at91sam9g20ek_nand_hw_init(void) +{ + unsigned long csa; + + /* Enable CS3 */ + csa = at91_sys_read(AT91_MATRIX_EBICSA); + at91_sys_write(AT91_MATRIX_EBICSA, + csa | AT91_MATRIX_CS3A_SMC_SMARTMEDIA); + + /* Configure SMC CS3 for NAND/SmartMedia */ + at91_sys_write(AT91_SMC_SETUP(3), + AT91_SMC_NWESETUP_(2) | AT91_SMC_NCS_WRSETUP_(0) | + AT91_SMC_NRDSETUP_(2) | AT91_SMC_NCS_RDSETUP_(0)); + at91_sys_write(AT91_SMC_PULSE(3), + AT91_SMC_NWEPULSE_(4) | AT91_SMC_NCS_WRPULSE_(3) | + AT91_SMC_NRDPULSE_(4) | AT91_SMC_NCS_RDPULSE_(3)); + at91_sys_write(AT91_SMC_CYCLE(3), + AT91_SMC_NWECYCLE_(7) | AT91_SMC_NRDCYCLE_(7)); + at91_sys_write(AT91_SMC_MODE(3), + AT91_SMC_READMODE | AT91_SMC_WRITEMODE | + AT91_SMC_EXNWMODE_DISABLE | +#ifdef CFG_NAND_DBW_16 + AT91_SMC_DBW_16 | +#else /* CFG_NAND_DBW_8 */ + AT91_SMC_DBW_8 | +#endif + AT91_SMC_TDF_(3)); + + at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_PIOC); + + /* Configure RDY/BSY */ + at91_set_gpio_input(AT91_PIN_PC13, 1); + + /* Enable NandFlash */ + at91_set_gpio_output(AT91_PIN_PC14, 1); +} +#endif + +#ifdef CONFIG_HAS_DATAFLASH +static void at91sam9g20ek_spi_hw_init(void) +{ + at91_set_A_periph(AT91_PIN_PA3, 0); /* SPI0_NPCS0 */ + at91_set_B_periph(AT91_PIN_PC11, 0); /* SPI0_NPCS1 */ + + at91_set_A_periph(AT91_PIN_PA0, 0); /* SPI0_MISO */ + at91_set_A_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */ + at91_set_A_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */ + + /* Enable clock */ + at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_SPI0); +} +#endif + +#ifdef CONFIG_MACB +static void at91sam9g20ek_macb_hw_init(void) +{ + /* Enable clock */ + at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_EMAC); + + /* + * Disable pull-up on: + * RXDV (PA17) => PHY normal mode (not Test mode) + * ERX0 (PA14) => PHY ADDR0 + * ERX1 (PA15) => PHY ADDR1 + * ERX2 (PA25) => PHY ADDR2 + * ERX3 (PA26) => PHY ADDR3 + * ECRS (PA28) => PHY ADDR4 => PHYADDR = 0x0 + * + * PHY has internal pull-down + */ + writel(pin_to_mask(AT91_PIN_PA14) | + pin_to_mask(AT91_PIN_PA15) | + pin_to_mask(AT91_PIN_PA17) | + pin_to_mask(AT91_PIN_PA25) | + pin_to_mask(AT91_PIN_PA26) | + pin_to_mask(AT91_PIN_PA28), + pin_to_controller(AT91_PIN_PA0) + PIO_PUDR); + + /* Need to reset PHY -> 500ms reset */ + at91_sys_write(AT91_RSTC_MR, AT91_RSTC_KEY | + (AT91_RSTC_ERSTL & (0x0D << 8)) | + AT91_RSTC_URSTEN); + + at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_EXTRST); + + /* Wait for end hardware reset */ + while (!(at91_sys_read(AT91_RSTC_SR) & AT91_RSTC_NRSTL)); + + /* Restore NRST value */ + at91_sys_write(AT91_RSTC_MR, AT91_RSTC_KEY | + (AT91_RSTC_ERSTL & (0x0 << 8)) | + AT91_RSTC_URSTEN); + + /* Re-enable pull-up */ + writel(pin_to_mask(AT91_PIN_PA14) | + pin_to_mask(AT91_PIN_PA15) | + pin_to_mask(AT91_PIN_PA17) | + pin_to_mask(AT91_PIN_PA25) | + pin_to_mask(AT91_PIN_PA26) | + pin_to_mask(AT91_PIN_PA28), + pin_to_controller(AT91_PIN_PA0) + PIO_PUER); + + at91_set_A_periph(AT91_PIN_PA19, 0); /* ETXCK_EREFCK */ + at91_set_A_periph(AT91_PIN_PA17, 0); /* ERXDV */ + at91_set_A_periph(AT91_PIN_PA14, 0); /* ERX0 */ + at91_set_A_periph(AT91_PIN_PA15, 0); /* ERX1 */ + at91_set_A_periph(AT91_PIN_PA18, 0); /* ERXER */ + at91_set_A_periph(AT91_PIN_PA16, 0); /* ETXEN */ + at91_set_A_periph(AT91_PIN_PA12, 0); /* ETX0 */ + at91_set_A_periph(AT91_PIN_PA13, 0); /* ETX1 */ + at91_set_A_periph(AT91_PIN_PA21, 0); /* EMDIO */ + at91_set_A_periph(AT91_PIN_PA20, 0); /* EMDC */ + +#ifndef CONFIG_RMII + at91_set_B_periph(AT91_PIN_PA28, 0); /* ECRS */ + at91_set_B_periph(AT91_PIN_PA29, 0); /* ECOL */ + at91_set_B_periph(AT91_PIN_PA25, 0); /* ERX2 */ + at91_set_B_periph(AT91_PIN_PA26, 0); /* ERX3 */ + at91_set_B_periph(AT91_PIN_PA27, 0); /* ERXCK */ +#if defined(CONFIG_AT91SAM9G20EK) + /* + * use PA10, PA11 for ETX2, ETX3. + * PA23 and PA24 are for TWI EEPROM + */ + at91_set_B_periph(AT91_PIN_PA10, 0); /* ETX2 */ + at91_set_B_periph(AT91_PIN_PA11, 0); /* ETX3 */ +#else + at91_set_B_periph(AT91_PIN_PA23, 0); /* ETX2 */ + at91_set_B_periph(AT91_PIN_PA24, 0); /* ETX3 */ +#endif + at91_set_B_periph(AT91_PIN_PA22, 0); /* ETXER */ +#endif + +} +#endif + +int board_init(void) +{ + /* Enable Ctrlc */ + console_init_f(); + + /* arch number of AT91SAM9G20EK-Board */ + gd->bd->bi_arch_number = MACH_TYPE_AT91SAM9G20EK; + /* adress of boot parameters */ + gd->bd->bi_boot_params = PHYS_SDRAM + 0x100; + + at91sam9g20ek_serial_hw_init(); +#ifdef CONFIG_CMD_NAND + at91sam9g20ek_nand_hw_init(); +#endif +#ifdef CONFIG_HAS_DATAFLASH + at91sam9g20ek_spi_hw_init(); +#endif +#ifdef CONFIG_MACB + at91sam9g20ek_macb_hw_init(); +#endif + + return 0; +} + +int dram_init(void) +{ + gd->bd->bi_dram[0].start = PHYS_SDRAM; + gd->bd->bi_dram[0].size = PHYS_SDRAM_SIZE; + return 0; +} + +#ifdef CONFIG_RESET_PHY_R +void reset_phy(void) +{ +#ifdef CONFIG_MACB + /* + * Initialize ethernet HW addr prior to starting Linux, + * needed for nfsroot + */ + eth_init(gd->bd); +#endif +} +#endif diff --git a/board/atmel/at91sam9g20ek/config.mk b/board/atmel/at91sam9g20ek/config.mk new file mode 100644 index 0000000..ff2cfd1 --- /dev/null +++ b/board/atmel/at91sam9g20ek/config.mk @@ -0,0 +1 @@ +TEXT_BASE = 0x23f00000 diff --git a/board/atmel/at91sam9g20ek/led.c b/board/atmel/at91sam9g20ek/led.c new file mode 100644 index 0000000..ddc375f --- /dev/null +++ b/board/atmel/at91sam9g20ek/led.c @@ -0,0 +1,64 @@ +/* + * (C) Copyright 2007-2008 + * Stelian Pop stelian.pop@leadtechdesign.com + * Lead Tech Design <www.leadtechdesign.com> + * + * 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 <common.h> +#include <asm/arch/at91sam9260.h> +#include <asm/arch/at91_pmc.h> +#include <asm/arch/gpio.h> +#include <asm/arch/io.h> + +#define RED_LED AT91_PIN_PA9 /* this is the power led */ +#define GREEN_LED AT91_PIN_PA6 /* this is the user led */ + +void red_LED_on(void) +{ + at91_set_gpio_value(RED_LED, 1); +} + +void red_LED_off(void) +{ + at91_set_gpio_value(RED_LED, 0); +} + +void green_LED_on(void) +{ + at91_set_gpio_value(GREEN_LED, 0); +} + +void green_LED_off(void) +{ + at91_set_gpio_value(GREEN_LED, 1); +} + +void coloured_LED_init(void) +{ + /* Enable clock */ + at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_PIOA); + + at91_set_gpio_output(RED_LED, 1); + at91_set_gpio_output(GREEN_LED, 1); + + at91_set_gpio_value(RED_LED, 0); + at91_set_gpio_value(GREEN_LED, 1); +} diff --git a/board/atmel/at91sam9g20ek/nand.c b/board/atmel/at91sam9g20ek/nand.c new file mode 100644 index 0000000..25d3277 --- /dev/null +++ b/board/atmel/at91sam9g20ek/nand.c @@ -0,0 +1,79 @@ +/* + * (C) Copyright 2007-2008 + * Stelian Pop stelian.pop@leadtechdesign.com + * Lead Tech Design <www.leadtechdesign.com> + * + * (C) Copyright 2006 ATMEL Rousset, Lacressonniere Nicolas + * + * 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 <common.h> +#include <asm/arch/at91sam9260.h> +#include <asm/arch/gpio.h> +#include <asm/arch/at91_pio.h> + +#include <nand.h> + +/* + * hardware specific access to control-lines + */ +#define MASK_ALE (1 << 21) /* our ALE is AD21 */ +#define MASK_CLE (1 << 22) /* our CLE is AD22 */ + +static void at91sam9g20ek_nand_hwcontrol(struct mtd_info *mtd, int cmd) +{ + struct nand_chip *this = mtd->priv; + ulong IO_ADDR_W = (ulong) this->IO_ADDR_W; + + IO_ADDR_W &= ~(MASK_ALE|MASK_CLE); + switch (cmd) { + case NAND_CTL_SETCLE: + IO_ADDR_W |= MASK_CLE; + break; + case NAND_CTL_SETALE: + IO_ADDR_W |= MASK_ALE; + break; + case NAND_CTL_CLRNCE: + at91_set_gpio_value(AT91_PIN_PC14, 1); + break; + case NAND_CTL_SETNCE: + at91_set_gpio_value(AT91_PIN_PC14, 0); + break; + } + this->IO_ADDR_W = (void *) IO_ADDR_W; +} + +static int at91sam9g20ek_nand_ready(struct mtd_info *mtd) +{ + return at91_get_gpio_value(AT91_PIN_PC13); +} + +int board_nand_init(struct nand_chip *nand) +{ + nand->eccmode = NAND_ECC_SOFT; +#ifdef CFG_NAND_DBW_16 + nand->options = NAND_BUSWIDTH_16; +#endif + nand->hwcontrol = at91sam9g20ek_nand_hwcontrol; + nand->dev_ready = at91sam9g20ek_nand_ready; + nand->chip_delay = 20; + + return 0; +} diff --git a/board/atmel/at91sam9g20ek/partition.c b/board/atmel/at91sam9g20ek/partition.c new file mode 100644 index 0000000..557d695 --- /dev/null +++ b/board/atmel/at91sam9g20ek/partition.c @@ -0,0 +1,40 @@ +/* + * (C) Copyright 2008 + * Ulf Samuelsson ulf@atmel.com + * + * 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 <common.h> +#include <config.h> +#include <asm/hardware.h> +#include <dataflash.h> + +AT91S_DATAFLASH_INFO dataflash_info[CFG_MAX_DATAFLASH_BANKS]; + +struct dataflash_addr cs[CFG_MAX_DATAFLASH_BANKS] = { + {CFG_DATAFLASH_LOGIC_ADDR_CS0, 0}, /* Logical adress, CS */ + {CFG_DATAFLASH_LOGIC_ADDR_CS1, 1} +}; + +/*define the area offsets*/ +dataflash_protect_t area_list[NB_DATAFLASH_AREA] = { + {0x00000000, 0x000041FF, FLAG_PROTECT_SET, 0, "Bootstrap"}, + {0x00004200, 0x000083FF, FLAG_PROTECT_CLEAR, 0, "Environment"}, + {0x00008400, 0x00041FFF, FLAG_PROTECT_SET, 0, "U-Boot"}, + {0x00042000, 0x00251FFF, FLAG_PROTECT_CLEAR, 0, "Kernel"}, + {0x00252000, 0xFFFFFFFF, FLAG_PROTECT_CLEAR, 0, "FS"}, +}; diff --git a/drivers/net/macb.c b/drivers/net/macb.c index aa39284..c3dcce6 100644 --- a/drivers/net/macb.c +++ b/drivers/net/macb.c @@ -415,14 +415,14 @@ static int macb_init(struct eth_device *netdev, bd_t *bd) /* choose RMII or MII mode. This depends on the board */ #ifdef CONFIG_RMII #if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \ - defined(CONFIG_AT91SAM9263) + defined(CONFIG_AT91SAM9263) || defined(CONFIG_AT91SAM9G20) macb_writel(macb, USRIO, MACB_BIT(RMII) | MACB_BIT(CLKEN)); #else macb_writel(macb, USRIO, 0); #endif #else #if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \ - defined(CONFIG_AT91SAM9263) + defined(CONFIG_AT91SAM9263) || defined(CONFIG_AT91SAM9G20) macb_writel(macb, USRIO, MACB_BIT(CLKEN)); #else macb_writel(macb, USRIO, MACB_BIT(MII)); diff --git a/include/asm-arm/arch-at91sam9/hardware.h b/include/asm-arm/arch-at91sam9/hardware.h index f312419..76b4f0e 100644 --- a/include/asm-arm/arch-at91sam9/hardware.h +++ b/include/asm-arm/arch-at91sam9/hardware.h @@ -18,7 +18,7 @@
#if defined(CONFIG_AT91RM9200) #include <asm/arch/at91rm9200.h> -#elif defined(CONFIG_AT91SAM9260) +#elif defined(CONFIG_AT91SAM9260) || defined(CONFIG_AT91SAM9G20) #include <asm/arch/at91sam9260.h> #define AT91_BASE_EMAC AT91SAM9260_BASE_EMAC #define AT91_BASE_SPI AT91SAM9260_BASE_SPI0 diff --git a/include/configs/at91sam9g20ek.h b/include/configs/at91sam9g20ek.h new file mode 100644 index 0000000..ed64895 --- /dev/null +++ b/include/configs/at91sam9g20ek.h @@ -0,0 +1,202 @@ +/* + * (C) Copyright 2007-2008 + * Stelian Pop stelian.pop@leadtechdesign.com + * Lead Tech Design <www.leadtechdesign.com> + * + * Configuation settings for the AT91SAM9G20EK board. + * + * 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 + */ + +#ifndef __CONFIG_H +#define __CONFIG_H + +/* ARM asynchronous clock */ +#define AT91_MAIN_CLOCK 396288000 /* from 18.432 MHz crystal */ +#define AT91_MASTER_CLOCK 132096000 /* peripheral = main / 3 */ +#define CFG_HZ 1000000 /* 1us resolution */ + +#define AT91_SLOW_CLOCK 32768 /* slow clock */ + +#define CONFIG_ARM926EJS 1 /* This is an ARM926EJS Core */ +#define CONFIG_AT91SAM9G20 1 /* It's an Atmel AT91SAM9G20 SoC*/ +#define CONFIG_AT91SAM9G20EK 1 /* on an AT91SAM9G20EK Board */ +#undef CONFIG_USE_IRQ /* we don't need IRQ/FIQ stuff */ + +#define CONFIG_CMDLINE_TAG 1 /* enable passing of ATAGs */ +#define CONFIG_SETUP_MEMORY_TAGS 1 +#define CONFIG_INITRD_TAG 1 + +#define CONFIG_SKIP_LOWLEVEL_INIT +#define CONFIG_SKIP_RELOCATE_UBOOT + +/* + * Hardware drivers + */ +#define CONFIG_ATMEL_USART 1 +#undef CONFIG_USART0 +#undef CONFIG_USART1 +#undef CONFIG_USART2 +#define CONFIG_USART3 1 /* USART 3 is DBGU */ + +#define CONFIG_BOOTDELAY 3 + +/* + * BOOTP options + */ +#define CONFIG_BOOTP_BOOTFILESIZE 1 +#define CONFIG_BOOTP_BOOTPATH 1 +#define CONFIG_BOOTP_GATEWAY 1 +#define CONFIG_BOOTP_HOSTNAME 1 + +/* + * Command line configuration. + */ +#include <config_cmd_default.h> +#undef CONFIG_CMD_BDI +#undef CONFIG_CMD_IMI +#undef CONFIG_CMD_AUTOSCRIPT +#undef CONFIG_CMD_FPGA +#undef CONFIG_CMD_LOADS +#undef CONFIG_CMD_IMLS + +#define CONFIG_CMD_PING 1 +#define CONFIG_CMD_DHCP 1 +#define CONFIG_CMD_NAND 1 +#define CONFIG_CMD_USB 1 + +/* SDRAM */ +#define CONFIG_NR_DRAM_BANKS 1 +#define PHYS_SDRAM 0x20000000 +#define PHYS_SDRAM_SIZE 0x04000000 /* 64 megs */ + +/* DataFlash */ +#define CONFIG_HAS_DATAFLASH 1 +#define CFG_SPI_WRITE_TOUT (5*CFG_HZ) +#define CFG_MAX_DATAFLASH_BANKS 2 +#define CFG_DATAFLASH_LOGIC_ADDR_CS0 0xC0000000 /* CS0 */ +#define CFG_DATAFLASH_LOGIC_ADDR_CS1 0xD0000000 /* CS1 */ +#define AT91_SPI_CLK 15000000 +#define DATAFLASH_TCSS (0x22 << 16) +#define DATAFLASH_TCHS (0x1 << 24) + +/* NAND flash */ +#define NAND_MAX_CHIPS 1 +#define CFG_MAX_NAND_DEVICE 1 +#define CFG_NAND_BASE 0x40000000 +#define CFG_NAND_DBW_8 1 + +/* NOR flash - no real flash on this board */ +#define CFG_NO_FLASH 1 + +/* Ethernet */ +#define CONFIG_MACB 1 +#define CONFIG_RMII 1 +#define CONFIG_NET_MULTI 1 +#define CONFIG_NET_RETRY_COUNT 20 +#define CONFIG_RESET_PHY_R 1 + +/* USB */ +#define CONFIG_USB_OHCI_NEW 1 +#define LITTLEENDIAN 1 +#define CONFIG_DOS_PARTITION 1 +#define CFG_USB_OHCI_CPU_INIT 1 +#define CFG_USB_OHCI_REGS_BASE 0x00500000 /* AT91SAM9G20_UHP_BASE */ +#define CFG_USB_OHCI_SLOT_NAME "at91sam9g20" +#define CFG_USB_OHCI_MAX_ROOT_PORTS 2 +#define CONFIG_USB_STORAGE 1 + +#define CFG_LOAD_ADDR 0x22000000 /* load address */ + +#define CFG_MEMTEST_START PHYS_SDRAM +#define CFG_MEMTEST_END 0x23e00000 + +#undef CFG_USE_DATAFLASH_CS0 +#define CFG_USE_DATAFLASH_CS1 1 +#undef CFG_USE_NANDFLASH + +#ifdef CFG_USE_DATAFLASH_CS0 + +/* bootstrap + u-boot + env + linux in dataflash on CS0 */ +#define CFG_ENV_IS_IN_DATAFLASH 1 +#define CFG_MONITOR_BASE (CFG_DATAFLASH_LOGIC_ADDR_CS0 + 0x8400) +#define CFG_ENV_OFFSET 0x4200 +#define CFG_ENV_ADDR (CFG_DATAFLASH_LOGIC_ADDR_CS0 + CFG_ENV_OFFSET) +#define CFG_ENV_SIZE 0x4200 +#define CONFIG_BOOTCOMMAND "cp.b 0xC0042000 0x22000000 0x210000; bootm" +#define CONFIG_BOOTARGS "console=ttyS0,115200 " \ + "root=/dev/mtdblock0 " \ + "mtdparts=at91_nand:-(root) " \ + "rw rootfstype=jffs2" + +#elif CFG_USE_DATAFLASH_CS1 + +/* bootstrap + u-boot + env + linux in dataflash on CS1 */ +#define CFG_ENV_IS_IN_DATAFLASH 1 +#define CFG_MONITOR_BASE (CFG_DATAFLASH_LOGIC_ADDR_CS1 + 0x8400) +#define CFG_ENV_OFFSET 0x4200 +#define CFG_ENV_ADDR (CFG_DATAFLASH_LOGIC_ADDR_CS1 + CFG_ENV_OFFSET) +#define CFG_ENV_SIZE 0x4200 +#define CONFIG_BOOTCOMMAND "cp.b 0xD0042000 0x22000000 0x210000; bootm" +#define CONFIG_BOOTARGS "console=ttyS0,115200 " \ + "root=/dev/mtdblock0 " \ + "mtdparts=at91_nand:-(root) " \ + "rw rootfstype=jffs2" + +#else /* CFG_USE_NANDFLASH */ + +/* bootstrap + u-boot + env + linux in nandflash */ +#define CFG_ENV_IS_IN_NAND 1 +#define CFG_ENV_OFFSET 0x60000 +#define CFG_ENV_OFFSET_REDUND 0x80000 +#define CFG_ENV_SIZE 0x20000 /* 1 sector = 128 kB */ +#define CONFIG_BOOTCOMMAND "nand read 0x22000000 0xA0000 0x200000; bootm" +#define CONFIG_BOOTARGS "console=ttyS0,115200 " \ + "root=/dev/mtdblock5 " \ + "mtdparts=at91_nand:128k(bootstrap)ro," \ + "256k(uboot)ro,128k(env1)ro," \ + "128k(env2)ro,2M(linux),-(root) " \ + "rw rootfstype=jffs2" + +#endif + +#define CONFIG_BAUDRATE 115200 +#define CFG_BAUDRATE_TABLE {115200 , 19200, 38400, 57600, 9600 } + +#define CFG_PROMPT "U-Boot> " +#define CFG_CBSIZE 256 +#define CFG_MAXARGS 16 +#define CFG_PBSIZE (CFG_CBSIZE + sizeof(CFG_PROMPT) + 16) +#define CFG_LONGHELP 1 +#define CONFIG_CMDLINE_EDITING 1 + +#define ROUND(A, B) (((A) + (B)) & ~((B) - 1)) +/* + * Size of malloc() pool + */ +#define CFG_MALLOC_LEN ROUND(3 * CFG_ENV_SIZE + 128*1024, 0x1000) +#define CFG_GBL_DATA_SIZE 128 /* 128 bytes for initial data */ + +#define CONFIG_STACKSIZE (32*1024) /* regular stack */ + +#ifdef CONFIG_USE_IRQ +#error CONFIG_USE_IRQ not supported +#endif + +#endif diff --git a/net/eth.c b/net/eth.c index 38979aa..3f50e2b 100644 --- a/net/eth.c +++ b/net/eth.c @@ -287,7 +287,7 @@ int eth_initialize(bd_t *bis) mcdmafec_initialize(bis); #endif #if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \ - defined(CONFIG_AT91SAM9263) + defined(CONFIG_AT91SAM9263) || defined(CONFIG_AT91SAM9G20) at91sam9_eth_initialize(bis); #endif

"Hong Xu" hongxu.cn@gmail.com wrote:
diff --git a/drivers/net/macb.c b/drivers/net/macb.c index aa39284..c3dcce6 100644 --- a/drivers/net/macb.c +++ b/drivers/net/macb.c @@ -415,14 +415,14 @@ static int macb_init(struct eth_device *netdev, bd_t *bd) /* choose RMII or MII mode. This depends on the board */ #ifdef CONFIG_RMII #if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \
- defined(CONFIG_AT91SAM9263)
- defined(CONFIG_AT91SAM9263) || defined(CONFIG_AT91SAM9G20)
Hmm...I don't really like the direction this is going. Any chance you could have all AT91 boards define CONFIG_AT91 and check for that instead?
Alternatively, we could do it the other way around and test for CONFIG_AVR32 instead, since all AVR32 boards already define that.
In either case, this should probably be a separate cleanup; I don't have any objections to your patch.
Haavard

On 15:41 Thu 24 Jul , Hong Xu wrote:
From 81230b02610c06fdc8a175e635851346488e3bdb Mon Sep 17 00:00:00 2001
From: Hong Xu hong.xu@atmel.com Date: Thu, 24 Jul 2008 14:25:05 +0800 Subject: [PATCH 1/1] Add support for ATMEL AT91SAM9G20EK board
This patch adds support for ATMEL AT91SAM9G20EK board. User manual for AT91SAM9G20EK board, see http://www.atmel.com/dyn/resources/prod_documents/doc6413.pdf AT91 SAM9G20 datasheet, see http://www.atmel.com/dyn/resources/prod_documents/doc6384.pdf
Signed-off-by: Hong Xu hong.xu@atmel.com
Makefile | 3 + board/atmel/at91sam9g20ek/Makefile | 57 +++++++ board/atmel/at91sam9g20ek/at91sam9g20ek.c | 250 +++++++++++++++++++++++++++++ board/atmel/at91sam9g20ek/config.mk | 1 + board/atmel/at91sam9g20ek/led.c | 64 ++++++++ board/atmel/at91sam9g20ek/nand.c | 79 +++++++++ board/atmel/at91sam9g20ek/partition.c | 40 +++++ drivers/net/macb.c | 4 +- include/asm-arm/arch-at91sam9/hardware.h | 2 +- include/configs/at91sam9g20ek.h | 202 +++++++++++++++++++++++ include/asm-arm/arch-at91sam9/hardware.h | 2 +- include/configs/at91sam9g20ek.h | 202 +++++++++++++++++++++++ net/eth.c | 2 +-
Please rebase your code on the branch for-1.3.5 of the u-boot-at91 tree.
--- a/drivers/net/macb.c +++ b/drivers/net/macb.c @@ -415,14 +415,14 @@ static int macb_init(struct eth_device *netdev, bd_t *bd) /* choose RMII or MII mode. This depends on the board */ #ifdef CONFIG_RMII #if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \
- defined(CONFIG_AT91SAM9263)
- defined(CONFIG_AT91SAM9263) || defined(CONFIG_AT91SAM9G20) macb_writel(macb, USRIO, MACB_BIT(RMII) | MACB_BIT(CLKEN));
#else macb_writel(macb, USRIO, 0); #endif #else #if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \
- defined(CONFIG_AT91SAM9263)
- defined(CONFIG_AT91SAM9263) || defined(CONFIG_AT91SAM9G20) macb_writel(macb, USRIO, MACB_BIT(CLKEN));
#else macb_writel(macb, USRIO, MACB_BIT(MII)); diff --git a/net/eth.c b/net/eth.c index 38979aa..3f50e2b 100644 --- a/net/eth.c +++ b/net/eth.c @@ -287,7 +287,7 @@ int eth_initialize(bd_t *bis) mcdmafec_initialize(bis); #endif #if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \
- defined(CONFIG_AT91SAM9263)
- defined(CONFIG_AT91SAM9263) || defined(CONFIG_AT91SAM9G20) at91sam9_eth_initialize(bis);
#endif at91sam9_eth_initialize(bis); #endif
Same comment as Haavard, Could please create a CONFIG_SOMETHING for each of this tree block of ifdef (not neccessarely the same CONFIG)
Best Regards, J.

Jean-Christophe PLAGNIOL-VILLARD wrote:
/* choose RMII or MII mode. This depends on the board */
#ifdef CONFIG_RMII #if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \
- defined(CONFIG_AT91SAM9263)
- defined(CONFIG_AT91SAM9263) || defined(CONFIG_AT91SAM9G20) macb_writel(macb, USRIO, MACB_BIT(RMII) | MACB_BIT(CLKEN));
#else macb_writel(macb, USRIO, 0); #endif
Same comment as Haavard, Could please create a CONFIG_SOMETHING for each of this tree block of ifdef (not necessarily the same CONFIG)
What do you suggest for <SOMETHING> in CONFIG_SOMETHING? Surely you aren't suggesting a literal "CONFIG_SOMETHING".
The fact that you didn't easily define a meaningful <SOMETHING> suggests that there isn't one that is sufficiently meaningful and that perhaps the #if condition as written above should remain as is. Code should be written for readability, not for terseness alone. Do we have to define yet another preprocessor constant for yet another purpose? U-Boot already has too many preprocessor constants and the addition of another (perhaps) dubious one merits more debate.
Sincerely,
Ken Fuchs

On Thu, 24 Jul 2008 13:14:02 -0500 Ken.Fuchs@bench.com wrote:
U-Boot already has too many preprocessor constants and the addition of another (perhaps) dubious one merits more debate.
I don't completely agree. U-Boot has too many #ifdefs, which isn't necessarily the same as too many #defines. And I don't think CONFIG_AT91 is dubious at all.
But since we already have a CONFIG_AVR32 #define, we can clean up the mess in macb.c by simply reversing the logic.
Haavard

Ken.Fuchs@bench.com wrote:
U-Boot already has too many preprocessor constants and the addition of another (perhaps) dubious one merits more debate.
You omitted the context of this statement and hence most of its meaning.
Haavard Skinnemoen wrote:
I don't completely agree. U-Boot has too many #ifdefs, which isn't necessarily the same as too many #defines. And I don't think CONFIG_AT91 is dubious at all.
Perhaps the CONFIG_* symbols should be defined as TRUE or FALSE rather than defined or not defined.
I didn't say CONFIG_AT91 was dubious. I stated that defining CONFIG_<SOMETHING> where it isn't clear what <SOMETHING> should be is dubious. If one has to think too hard about what meaningful phrase <SOMETHING> should be, perhaps CONFIG_<SOMETHING> should not be defined at all. I'm complaining about defining new preprocessor definitions to be specific aggregations of other definitions just so a developer can type the conditions with fewer keystrokes without any improvement in code readability and maintainability. Sometimes an idiom should be left as an idiom rather than replaced by a preprocessor constant.
I have nothing against defining CONFIG_AT91 if it is useful, unique and makes code that uses it easier to understand and maintain.
But since we already have a CONFIG_AVR32 #define, we can clean up the mess in macb.c by simply reversing the logic.
If CONFIG_AVR32 can be used in macb.c without ofuscation, why is CONFIG_AT91 needed here? However, "simply reversing the logic" may be too much ofuscation though; we want clear rather than clever code after all.
An example of what I'd be opposed to is defining CONFIG_AT91SAM9260_OR_AT91SAM9263 where it is TRUE if either CONFIG_AT91SAM9260 or CONFIG_AT91SAM9263 are TRUE. Can you see where this might be used in the macb.c code?
Sincerely,
Ken Fuchs

Ken.Fuchs@bench.com wrote:
U-Boot already has too many preprocessor constants and the addition of another (perhaps) dubious one merits more debate.
You omitted the context of this statement and hence most of its meaning.
Haavard Skinnemoen wrote:
I don't completely agree. U-Boot has too many #ifdefs, which isn't necessarily the same as too many #defines. And I don't think CONFIG_AT91 is dubious at all.
Perhaps the CONFIG_* symbols should be defined as TRUE or FALSE rather than defined or not defined.
I didn't say CONFIG_AT91 was dubious. I stated that defining CONFIG_<SOMETHING> where it isn't clear what <SOMETHING> should be is dubious. If one has to think too hard about what meaningful phrase <SOMETHING> should be, perhaps CONFIG_<SOMETHING> should not be defined at all. I'm complaining about defining new preprocessor definitions to be specific aggregations of other definitions just so a developer can type the conditions with fewer keystrokes without any improvement in code readability and maintainability. Sometimes an idiom should be left as an idiom rather than replaced by a preprocessor constant.
I have nothing against defining CONFIG_AT91 if it is useful, unique and makes code that uses it easier to understand and maintain.
But since we already have a CONFIG_AVR32 #define, we can clean up the mess in macb.c by simply reversing the logic.
If CONFIG_AVR32 can be used in macb.c without ofuscation, why is CONFIG_AT91 needed here? However, "simply reversing the logic" may be too much ofuscation though; we want clear rather than clever code after all.
An example of what I'd be opposed to is defining CONFIG_AT91SAM9260_OR_AT91SAM9263 where it is TRUE if either CONFIG_AT91SAM9260 or CONFIG_AT91SAM9263 are TRUE. Can you see where this might be used in the macb.c code?
Sincerely,
As I see it, CONFIG_AT91 would mean that you have a a certain class of peripherals which is developed for the AT91 range of processors (and is used by the AVR32 as well) The name is probably slightly misleading, but convenient.
Not having this definition, will soon mean that you have statements like the following:
#if defined(CONFIG_AT91RM9200) || \ defined(CONFIG_AT91SAM9260) || \ defined(CONFIG_AT91SAM9261) || \ defined(CONFIG_AT91SAM9263) || \ defined(CONFIG_AT91SAM9G10) || \ defined(CONFIG_AT91SAM9G15) || \ defined(CONFIG_AT91SAM9G20) || \ defined(CONFIG_AT91SAM9G41) || \ defined(CONFIG_AT91SAM9M10) || \ defined(CONFIG_AT91SAM9M11) || \ defined(CONFIG_AT91CAP9) || \ defined(CONFIG_AT572D940)
This statement will have to be updated every time a new MCU is released.
Having the statment #if defined(CONFIG_AT91)
should definitely reduce the maintenance of drivers.
Best Regards Ulf Samuelsson

As I see it, CONFIG_AT91 would mean that you have a a certain class of peripherals which is developed for the AT91 range of processors (and is used by the AVR32 as well) The name is probably slightly misleading, but convenient.
Not having this definition, will soon mean that you have statements like the following:
#if defined(CONFIG_AT91RM9200) || \ defined(CONFIG_AT91SAM9260) || \ defined(CONFIG_AT91SAM9261) || \ defined(CONFIG_AT91SAM9263) || \ defined(CONFIG_AT91SAM9G10) || \ defined(CONFIG_AT91SAM9G15) || \ defined(CONFIG_AT91SAM9G20) || \ defined(CONFIG_AT91SAM9G41) || \ defined(CONFIG_AT91SAM9M10) || \ defined(CONFIG_AT91SAM9M11) || \ defined(CONFIG_AT91CAP9) || \ defined(CONFIG_AT572D940)
This statement will have to be updated every time a new MCU is released.
Having the statment #if defined(CONFIG_AT91)
should definitely reduce the maintenance of drivers.
I fully agree with Ulf, we need to have a better CONFIG, but I'm not sure that CONFIG_AT91 is the right one
We have actually in the tree the following CPU CONFIG_AT91CAP9 CONFIG_AT91RM9200 CONFIG_AT91SAM9260 CONFIG_AT91SAM9261 CONFIG_AT91SAM9263 CONFIG_AT91SAM9RL
and as mention Ulf are going to have more and more
maybe we can use config related to the functionnality or the sub-class CPU ex : CONFIG_MACB_INCLK
Best Regards, J.

On Sat, Jul 26, 2008 at 19:36, Jean-Christophe PLAGNIOL-VILLARD plagnioj@jcrosoft.com wrote:
As I see it, CONFIG_AT91 would mean that you have a a certain class of peripherals which is developed for the AT91 range of processors (and is used by the AVR32 as well) The name is probably slightly misleading, but convenient.
Not having this definition, will soon mean that you have statements like the following:
#if defined(CONFIG_AT91RM9200) || \ defined(CONFIG_AT91SAM9260) || \ defined(CONFIG_AT91SAM9261) || \ defined(CONFIG_AT91SAM9263) || \ defined(CONFIG_AT91SAM9G10) || \ defined(CONFIG_AT91SAM9G15) || \ defined(CONFIG_AT91SAM9G20) || \ defined(CONFIG_AT91SAM9G41) || \ defined(CONFIG_AT91SAM9M10) || \ defined(CONFIG_AT91SAM9M11) || \ defined(CONFIG_AT91CAP9) || \ defined(CONFIG_AT572D940)
This statement will have to be updated every time a new MCU is released.
Having the statment #if defined(CONFIG_AT91)
should definitely reduce the maintenance of drivers.
I fully agree with Ulf, we need to have a better CONFIG, but I'm not sure that CONFIG_AT91 is the right one
We have actually in the tree the following CPU CONFIG_AT91CAP9 CONFIG_AT91RM9200 CONFIG_AT91SAM9260 CONFIG_AT91SAM9261 CONFIG_AT91SAM9263 CONFIG_AT91SAM9RL
and as mention Ulf are going to have more and more
maybe we can use config related to the functionnality or the sub-class CPU ex : CONFIG_MACB_INCLK
Agree.
We can use "#if defined(CONFIG_AT91) && defined(CONFIG_MACB)" in net/eth.c and "#ifdef CONFIG_MACB_INCLK" in drivers/net/macb.c to simplify the previous *big* #ifdef. If everyone feels comfortable, I'll rewrite these parts and re-submit the patch.
Thanks.
Best Regards, J.
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ U-Boot-Users mailing list U-Boot-Users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/u-boot-users

"Hong Xu" hongxu.cn@gmail.com wrote:
maybe we can use config related to the functionnality or the sub-class CPU ex : CONFIG_MACB_INCLK
Agree.
We can use "#if defined(CONFIG_AT91) && defined(CONFIG_MACB)" in net/eth.c and "#ifdef CONFIG_MACB_INCLK" in drivers/net/macb.c to simplify the previous *big* #ifdef. If everyone feels comfortable, I'll rewrite these parts and re-submit the patch.
What does CONFIG_MACB_INCLK mean?
Haavard

On Mon, Jul 28, 2008 at 16:29, Haavard Skinnemoen haavard.skinnemoen@atmel.com wrote:
"Hong Xu" hongxu.cn@gmail.com wrote:
maybe we can use config related to the functionnality or the sub-class CPU ex : CONFIG_MACB_INCLK
Agree.
We can use "#if defined(CONFIG_AT91) && defined(CONFIG_MACB)" in net/eth.c and "#ifdef CONFIG_MACB_INCLK" in drivers/net/macb.c to simplify the previous *big* #ifdef. If everyone feels comfortable, I'll rewrite these parts and re-submit the patch.
What does CONFIG_MACB_INCLK mean?
Per J's suggestion, use CONFIG_MACB_INCLK or some other thing to simplify the *big* ifdef in driver/net/macb.c
From the existing code, it seems that some boards (AT91CAP9,
AT91SAM926[0,3]) need the CLKEN bit of EMAC_USRIO to be set, but others(if exist) do not need to. So in all boards that need this bit to be set, use a new CONFIG_MACB_XXX to denote this.
Haavard

"Hong Xu" hongxu.cn@gmail.com wrote:
Per J's suggestion, use CONFIG_MACB_INCLK or some other thing to simplify the *big* ifdef in driver/net/macb.c From the existing code, it seems that some boards (AT91CAP9, AT91SAM926[0,3]) need the CLKEN bit of EMAC_USRIO to be set, but others(if exist) do not need to. So in all boards that need this bit to be set, use a new CONFIG_MACB_XXX to denote this.
The problem is that CONFIG_MACB_INCLK is a completely nonsensical name. The difference isn't _only_ the CLKEN bit, it's the MII/RMII bit polarity as well. So if we want a completely "meaningful" define, we have to use something along the lines of CONFIG_MACB_HAS_CLKEN_AND_RMII_IS_ACTIVE_HIGH.
Let's stop the overengineering already. How about the patch below?
Haavard
===============[cut here]=============== From c63fe984e1a8d18c83119bbc3c575ac5175e61af Mon Sep 17 00:00:00 2001 From: Haavard Skinnemoen haavard.skinnemoen@atmel.com Date: Mon, 28 Jul 2008 11:12:33 +0200 Subject: [PATCH] macb: Simplify AT91 vs AVR32 #ifdefs
The AT91 and AVR32 platforms assign different meanings to the bits in USRIO. Until now, this has been handled with two big #ifdefs listing all the various AT91 variants, with the #else branch handling AVR32.
Since there's no catch-all CONFIG_AT91 define, switch the #ifdefs around and use CONFIG_AVR32 instead. The result is identical to what we already have, assuming all AT91 devices behave the same way.
Signed-off-by: Haavard Skinnemoen haavard.skinnemoen@atmel.com --- drivers/net/macb.c | 14 ++++++-------- 1 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/drivers/net/macb.c b/drivers/net/macb.c index aa39284..49e81d9 100644 --- a/drivers/net/macb.c +++ b/drivers/net/macb.c @@ -414,18 +414,16 @@ static int macb_init(struct eth_device *netdev, bd_t *bd)
/* choose RMII or MII mode. This depends on the board */ #ifdef CONFIG_RMII -#if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \ - defined(CONFIG_AT91SAM9263) - macb_writel(macb, USRIO, MACB_BIT(RMII) | MACB_BIT(CLKEN)); -#else +#ifdef CONFIG_AVR32 macb_writel(macb, USRIO, 0); -#endif #else -#if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \ - defined(CONFIG_AT91SAM9263) - macb_writel(macb, USRIO, MACB_BIT(CLKEN)); + macb_writel(macb, USRIO, MACB_BIT(RMII) | MACB_BIT(CLKEN)); +#endif #else +#ifdef CONFIG_AVR32 macb_writel(macb, USRIO, MACB_BIT(MII)); +#else + macb_writel(macb, USRIO, MACB_BIT(CLKEN)); #endif #endif /* CONFIG_RMII */

On Mon, Jul 28, 2008 at 17:24, Haavard Skinnemoen haavard.skinnemoen@atmel.com wrote:
"Hong Xu" hongxu.cn@gmail.com wrote:
Per J's suggestion, use CONFIG_MACB_INCLK or some other thing to simplify the *big* ifdef in driver/net/macb.c From the existing code, it seems that some boards (AT91CAP9, AT91SAM926[0,3]) need the CLKEN bit of EMAC_USRIO to be set, but others(if exist) do not need to. So in all boards that need this bit to be set, use a new CONFIG_MACB_XXX to denote this.
The problem is that CONFIG_MACB_INCLK is a completely nonsensical name. The difference isn't _only_ the CLKEN bit, it's the MII/RMII bit polarity as well. So if we want a completely "meaningful" define, we have to use something along the lines of CONFIG_MACB_HAS_CLKEN_AND_RMII_IS_ACTIVE_HIGH.
Let's stop the overengineering already. How about the patch below?
Haavard
===============[cut here]=============== From c63fe984e1a8d18c83119bbc3c575ac5175e61af Mon Sep 17 00:00:00 2001 From: Haavard Skinnemoen haavard.skinnemoen@atmel.com Date: Mon, 28 Jul 2008 11:12:33 +0200 Subject: [PATCH] macb: Simplify AT91 vs AVR32 #ifdefs
The AT91 and AVR32 platforms assign different meanings to the bits in USRIO. Until now, this has been handled with two big #ifdefs listing all the various AT91 variants, with the #else branch handling AVR32.
Since there's no catch-all CONFIG_AT91 define, switch the #ifdefs around and use CONFIG_AVR32 instead. The result is identical to what we already have, assuming all AT91 devices behave the same way.
The point is I'm not sure all AT91 series will behave the same way. But since AVR32 has less cases, it's a good idea to use #else to handle AT91 variants. So at least till now, this patch makes sense.
Signed-off-by: Haavard Skinnemoen haavard.skinnemoen@atmel.com
drivers/net/macb.c | 14 ++++++-------- 1 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/drivers/net/macb.c b/drivers/net/macb.c index aa39284..49e81d9 100644 --- a/drivers/net/macb.c +++ b/drivers/net/macb.c @@ -414,18 +414,16 @@ static int macb_init(struct eth_device *netdev, bd_t *bd)
/* choose RMII or MII mode. This depends on the board */
#ifdef CONFIG_RMII -#if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \
- defined(CONFIG_AT91SAM9263)
macb_writel(macb, USRIO, MACB_BIT(RMII) | MACB_BIT(CLKEN));
-#else +#ifdef CONFIG_AVR32 macb_writel(macb, USRIO, 0); -#endif #else -#if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \
- defined(CONFIG_AT91SAM9263)
macb_writel(macb, USRIO, MACB_BIT(CLKEN));
macb_writel(macb, USRIO, MACB_BIT(RMII) | MACB_BIT(CLKEN));
+#endif #else +#ifdef CONFIG_AVR32 macb_writel(macb, USRIO, MACB_BIT(MII)); +#else
macb_writel(macb, USRIO, MACB_BIT(CLKEN));
#endif #endif /* CONFIG_RMII */
-- 1.5.6.2

"Hong Xu" hongxu.cn@gmail.com wrote:
The point is I'm not sure all AT91 series will behave the same way. But since AVR32 has less cases, it's a good idea to use #else to handle AT91 variants. So at least till now, this patch makes sense.
When I said "let's stop the overengineering", I meant let's not attempt to handle cases that don't exist yet :-)
If there turns out to be lots of differences within chip families, we should probably consider handling it some other way than through adding lots of #ifdefs. For example by adding a macb_set_usrio() hook in an arch/platform/chip/whatever-specific file. But until we actually _need_ that, I think we should go for the simplest solution possible.
Note that AT91 boards that don't actually have ethernet, or use some other implementation, are not interesting in this context since they shouldn't enable the macb driver in the first place.
Haavard

On Fri, 25 Jul 2008 17:44:52 -0500 Ken.Fuchs@bench.com wrote:
But since we already have a CONFIG_AVR32 #define, we can clean up the mess in macb.c by simply reversing the logic.
If CONFIG_AVR32 can be used in macb.c without ofuscation, why is CONFIG_AT91 needed here? However, "simply reversing the logic" may be too much ofuscation though; we want clear rather than clever code after all.
Reversing the logic wouldn't obfuscate anything. The code in question is a simple matter of "AT91 needs to do it this way, AVR32 needs to do it another way". Whether we check for AT91 or AVR32 is completely arbitrary.
An example of what I'd be opposed to is defining CONFIG_AT91SAM9260_OR_AT91SAM9263 where it is TRUE if either CONFIG_AT91SAM9260 or CONFIG_AT91SAM9263 are TRUE.
I completely agreee with this.
Can you see where this might be used in the macb.c code?
Not really, no. The processors aren't _that_ different. It's a bit unfortunate that the USRIO register ended up with different behaviour on AT91 and AVR32, but fixing the silicon at this point would just make things worse, and IMO it's not a huge deal. From a CPP abuse point of view, the macb driver is IMO exceptionally clean compared to a lot of other code in u-boot.
Haavard

Hi Hong Xu,
On Thu, Jul 24, 2008 at 1:05 AM, Hong Xu hongxu.cn@gmail.com wrote:
From 81230b02610c06fdc8a175e635851346488e3bdb Mon Sep 17 00:00:00 2001
From: Hong Xu hong.xu@atmel.com Date: Thu, 24 Jul 2008 14:25:05 +0800 Subject: [PATCH 1/1] Add support for ATMEL AT91SAM9G20EK board
This patch adds support for ATMEL AT91SAM9G20EK board. User manual for AT91SAM9G20EK board, see http://www.atmel.com/dyn/resources/prod_documents/doc6413.pdf AT91 SAM9G20 datasheet, see http://www.atmel.com/dyn/resources/prod_documents/doc6384.pdf
Signed-off-by: Hong Xu hong.xu@atmel.com
<snip>
diff --git a/net/eth.c b/net/eth.c index 38979aa..3f50e2b 100644 --- a/net/eth.c +++ b/net/eth.c @@ -287,7 +287,7 @@ int eth_initialize(bd_t *bis) mcdmafec_initialize(bis); #endif #if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \
- defined(CONFIG_AT91SAM9263)
- defined(CONFIG_AT91SAM9263) || defined(CONFIG_AT91SAM9G20) at91sam9_eth_initialize(bis);
#endif
Please don't touch net/eth.c. Instead, implement the following in board code:
int board_eth_init(bd_t *bis);
Please be sure to check that the weak version of board_eth_init() is overridden (the board_eth_init and __def_eth_init symbols should have different addresses in the object code). You can do something like:
$ cat System.map | grep eth_init
regards, Ben

Hi Ben Warren,
On Sun, Jul 27, 2008 at 12:51, Ben Warren biggerbadderben@gmail.com wrote:
Hi Hong Xu,
On Thu, Jul 24, 2008 at 1:05 AM, Hong Xu hongxu.cn@gmail.com wrote:
From 81230b02610c06fdc8a175e635851346488e3bdb Mon Sep 17 00:00:00 2001
From: Hong Xu hong.xu@atmel.com Date: Thu, 24 Jul 2008 14:25:05 +0800 Subject: [PATCH 1/1] Add support for ATMEL AT91SAM9G20EK board
This patch adds support for ATMEL AT91SAM9G20EK board. User manual for AT91SAM9G20EK board, see http://www.atmel.com/dyn/resources/prod_documents/doc6413.pdf AT91 SAM9G20 datasheet, see http://www.atmel.com/dyn/resources/prod_documents/doc6384.pdf
Signed-off-by: Hong Xu hong.xu@atmel.com
<snip> > diff --git a/net/eth.c b/net/eth.c > index 38979aa..3f50e2b 100644 > --- a/net/eth.c > +++ b/net/eth.c > @@ -287,7 +287,7 @@ int eth_initialize(bd_t *bis) > mcdmafec_initialize(bis); > #endif > #if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \ > - defined(CONFIG_AT91SAM9263) > + defined(CONFIG_AT91SAM9263) || defined(CONFIG_AT91SAM9G20) > at91sam9_eth_initialize(bis); > #endif >
Please don't touch net/eth.c. Instead, implement the following in board code:
Actually I did NOT touch the logic in net/eth.c. I just said, "hey, since you guys have the logic, please make a call for me.". That's it. :-) Thanks.
int board_eth_init(bd_t *bis);
Please be sure to check that the weak version of board_eth_init() is overridden (the board_eth_init and __def_eth_init symbols should have different addresses in the object code). You can do something like:
$ cat System.map | grep eth_init
regards, Ben

On Sun, Jul 27, 2008 at 6:46 PM, Hong Xu hongxu.cn@gmail.com wrote:
Hi Ben Warren,
On Sun, Jul 27, 2008 at 12:51, Ben Warren biggerbadderben@gmail.com wrote:
Hi Hong Xu,
On Thu, Jul 24, 2008 at 1:05 AM, Hong Xu hongxu.cn@gmail.com wrote:
From 81230b02610c06fdc8a175e635851346488e3bdb Mon Sep 17 00:00:00 2001
From: Hong Xu hong.xu@atmel.com Date: Thu, 24 Jul 2008 14:25:05 +0800 Subject: [PATCH 1/1] Add support for ATMEL AT91SAM9G20EK board
This patch adds support for ATMEL AT91SAM9G20EK board. User manual for AT91SAM9G20EK board, see http://www.atmel.com/dyn/resources/prod_documents/doc6413.pdf AT91 SAM9G20 datasheet, see http://www.atmel.com/dyn/resources/prod_documents/doc6384.pdf
Signed-off-by: Hong Xu hong.xu@atmel.com
<snip> > diff --git a/net/eth.c b/net/eth.c > index 38979aa..3f50e2b 100644 > --- a/net/eth.c > +++ b/net/eth.c > @@ -287,7 +287,7 @@ int eth_initialize(bd_t *bis) > mcdmafec_initialize(bis); > #endif > #if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \ > - defined(CONFIG_AT91SAM9263) > + defined(CONFIG_AT91SAM9263) || defined(CONFIG_AT91SAM9G20) > at91sam9_eth_initialize(bis); > #endif >
Please don't touch net/eth.c. Instead, implement the following in board code:
Actually I did NOT touch the logic in net/eth.c. I just said, "hey, since you guys have the logic, please make a call for me.". That's it. :-)
Sure. I'm saying, don't even do that. I mean don't touch the file, not don't touch the logic.
regards, Ben
participants (6)
-
Ben Warren
-
Haavard Skinnemoen
-
Hong Xu
-
Jean-Christophe PLAGNIOL-VILLARD
-
Ken.Fuchs@bench.com
-
Ulf Samuelsson