Re: [U-Boot-Users] [PATCH 1/1] Add support for the hammerhead (AVR32) board

Julien May mailinglist@miromico.ch wrote:
Signed-off-by: Julien May mailinglist@miromico.ch
Could you add a few lines describing the Hammerhead board, perhaps with a link to your site?
This looks pretty good to me. I have a few comments below, and I've Cc'ed u-boot-users so that more people can comment on this. Please keep them in the loop whenever you post a new version of this patch.
If you want, I can apply this to my tree as is, and you can send me incremental patches fixing up the remaining issues. I'll fold everything into a single patch before sending it upstream.
MAKEALL | 1 + Makefile | 3 + board/miromico/hammerhead/Makefile | 40 +++++++ board/miromico/hammerhead/config.mk | 3 + board/miromico/hammerhead/eth.c | 37 ++++++ board/miromico/hammerhead/hammerhead.c | 105 +++++++++++++++++ board/miromico/hammerhead/u-boot.lds | 73 ++++++++++++ cpu/at32ap/at32ap700x/gpio.c | 11 ++ cpu/at32ap/at32ap700x/sm.h | 2 +- cpu/at32ap/cpu.c | 5 + include/asm-avr32/arch-at32ap700x/clk.h | 1 + include/asm-avr32/arch-at32ap700x/gpio.h | 3 + include/configs/hammerhead.h | 179 ++++++++++++++++++++++++++++++ net/eth.c | 4 + 14 files changed, 466 insertions(+), 1 deletions(-) create mode 100644 board/miromico/hammerhead/Makefile create mode 100644 board/miromico/hammerhead/config.mk create mode 100644 board/miromico/hammerhead/eth.c create mode 100644 board/miromico/hammerhead/hammerhead.c create mode 100644 board/miromico/hammerhead/u-boot.lds create mode 100644 include/configs/hammerhead.h
diff --git a/MAKEALL b/MAKEALL index f40de23..89b68a5 100755 --- a/MAKEALL +++ b/MAKEALL @@ -699,6 +699,7 @@ LIST_avr32=" \ atstk1004 \ atstk1006 \ atngw100 \
- hammerhead \
"
######################################################################### diff --git a/Makefile b/Makefile index 154e592..09bae45 100644 --- a/Makefile +++ b/Makefile @@ -2885,6 +2885,9 @@ atstk1006_config : unconfig atngw100_config : unconfig @$(MKCONFIG) $(@:_config=) avr32 at32ap atngw100 atmel at32ap700x
+hammerhead_config : unconfig
- @$(MKCONFIG) $(@:_config=) avr32 at32ap hammerhead miromico at32ap700x
######################################################################### ######################################################################### ######################################################################### diff --git a/board/miromico/hammerhead/Makefile b/board/miromico/hammerhead/Makefile new file mode 100644 index 0000000..c5fc67a --- /dev/null +++ b/board/miromico/hammerhead/Makefile @@ -0,0 +1,40 @@ +# +# Copyright (C) 2008 Miromico AG +# +# 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 := $(BOARD).o eth.o
+SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS))
+$(LIB): $(obj).depend $(OBJS)
- $(AR) $(ARFLAGS) $@ $(OBJS)
+#########################################################################
+# defines $(obj).depend target +include $(SRCTREE)/rules.mk
+sinclude $(obj).depend
+######################################################################### diff --git a/board/miromico/hammerhead/config.mk b/board/miromico/hammerhead/config.mk new file mode 100644 index 0000000..9a794e5 --- /dev/null +++ b/board/miromico/hammerhead/config.mk @@ -0,0 +1,3 @@ +TEXT_BASE = 0x00000000 +PLATFORM_RELFLAGS += -ffunction-sections -fdata-sections +PLATFORM_LDFLAGS += --gc-sections diff --git a/board/miromico/hammerhead/eth.c b/board/miromico/hammerhead/eth.c new file mode 100644 index 0000000..969c48e --- /dev/null +++ b/board/miromico/hammerhead/eth.c @@ -0,0 +1,37 @@ +/*
- Copyright (C) 2008 Miromico AG
- Ethernet initialization for the Miromico Hammerhead AVR32 board
- Mostly copied form Atmel ATNGW100 sources
- 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/memory-map.h>
+extern int macb_eth_initialize(int id, void *regs, unsigned int phy_addr);
+#ifdef CONFIG_CMD_NET +void board_eth_initialize(bd_t *bi) +{
- macb_eth_initialize(0, (void *)MACB0_BASE, bi->bi_phy_id[0]);
+} +#endif diff --git a/board/miromico/hammerhead/hammerhead.c b/board/miromico/hammerhead/hammerhead.c new file mode 100644 index 0000000..69ff7fa --- /dev/null +++ b/board/miromico/hammerhead/hammerhead.c @@ -0,0 +1,105 @@ +/*
- Copyright (C) 2008 Miromico AG
- Mostly copied form atmel ATNGW100 sources
- 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 "../cpu/at32ap/at32ap700x/sm.h"
+#include <common.h>
+#include <asm/io.h> +#include <asm/sdram.h> +#include <asm/arch/clk.h> +#include <asm/arch/gpio.h> +#include <asm/arch/hmatrix.h>
+DECLARE_GLOBAL_DATA_PTR;
+static const struct sdram_config sdram_config = {
- .data_bits = SDRAM_DATA_32BIT,
- .row_bits = 13,
- .col_bits = 9,
- .bank_bits = 2,
- .cas = 3,
- .twr = 2,
- .trc = 7,
- .trp = 2,
- .trcd = 2,
- .tras = 5,
- .txsr = 5,
- /* 7.81 us */
- .refresh_period = (781 * (SDRAMC_BUS_HZ / 1000)) / 100000,
+};
+int board_early_init_f(void) +{
- /* Enable SDRAM in the EBI mux */
- hmatrix_slave_write(EBI, SFR, HMATRIX_BIT(EBI_SDRAM_ENABLE));
- gpio_enable_ebi();
- gpio_enable_usart1();
+#if defined(CONFIG_MACB)
- gpio_enable_macb0();
+#endif +#if defined(CONFIG_MMC)
- gpio_enable_mmci();
+#endif
- /* Select GCLK3 peripheral function. We'll need it as clock output
* for ethernet PHY. */
- gpio_enable_gclk3();
- return 0;
+}
+long int initdram(int board_type) +{
- unsigned long expected_size;
- unsigned long actual_size;
- void *sdram_base;
- sdram_base = map_physmem(EBI_SDRAM_BASE, EBI_SDRAM_SIZE, MAP_NOCACHE);
- expected_size = sdram_init(sdram_base, &sdram_config);
- actual_size = get_ram_size(sdram_base, expected_size);
- unmap_physmem(sdram_base, EBI_SDRAM_SIZE);
- if (expected_size != actual_size)
printf("Warning: Only %u of %u MiB SDRAM is working\n",
actual_size >> 20, expected_size >> 20);
- return actual_size;
+}
+void board_init_info(void) +{
- gd->bd->bi_phy_id[0] = 0x01;
+}
+void gclk_init(void)
Hmm...I'm not crazy about adding another board init hook here. Can you move this stuff into board_early_init_f()?
No, I suppose it needs to go after cpu_init()...
<looks at the stinking pile of crap called common.h>
<cringes at the number of #ifdefs in most arches' init sequence>
Not a single arch seems to implement all the board-specific initcalls. Help, please?
+{
- /* Hammerhead boards uses GCLK3 as 25MHz output to ethernet PHY */
- /* Enable GCLK3 with no input divider, from OSC0 (crystal) */
- sm_writel( PM_GCCTRL(3), SM_BIT(CEN) );
In any case, please drop the extra spaces after '(' and before ')'.
+}
diff --git a/board/miromico/hammerhead/u-boot.lds b/board/miromico/hammerhead/u-boot.lds new file mode 100644 index 0000000..e736adf --- /dev/null +++ b/board/miromico/hammerhead/u-boot.lds @@ -0,0 +1,73 @@ +/* -*- Fundamental -*-
- Copyright (C) 2005-2006 Atmel Corporation
- 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-avr32", "elf32-avr32", "elf32-avr32") +OUTPUT_ARCH(avr32) +ENTRY(_start)
+SECTIONS +{
- . = 0;
- _text = .;
- .text : {
*(.exception.text)
*(.text)
*(.text.*)
- }
- _etext = .;
- .rodata : {
*(.rodata)
*(.rodata.*)
- }
- . = ALIGN(8);
- _data = .;
- .data : {
*(.data)
*(.data.*)
- }
- . = ALIGN(4);
- __u_boot_cmd_start = .;
- .u_boot_cmd : {
KEEP(*(.u_boot_cmd))
- }
- __u_boot_cmd_end = .;
- . = ALIGN(4);
- _got = .;
- .got : {
*(.got)
- }
- _egot = .;
- . = ALIGN(8);
- _edata = .;
- .bss : {
*(.bss)
*(.bss.*)
- }
- . = ALIGN(8);
- _end = .;
+} diff --git a/cpu/at32ap/at32ap700x/gpio.c b/cpu/at32ap/at32ap700x/gpio.c index 859124a..2b7717f 100644 --- a/cpu/at32ap/at32ap700x/gpio.c +++ b/cpu/at32ap/at32ap700x/gpio.c @@ -142,3 +142,14 @@ void gpio_enable_mmci(void) gpio_select_periph_A(GPIO_PIN_PA15, 0); /* DATA3 */ } #endif
+/*
- Hammerhead board uses GCLK3 (Periph A on PB29) as 25MHz clock output
- for ethernet PHY.
- */
+void __gpio_enable_gclk3(void) +{
- gpio_select_periph_A(GPIO_PIN_PB29, 0); /* GCLK3 */
+}
+void gpio_enable_gclk3(void) __attribute__((weak, alias("__gpio_enable_gclk3")));
Hmm...what's the point here? I don't think there are that many ways to enable gclk3...?
In fact, I'm sort of thinking it might be better to just open-code this in the board file. It's only a single line of code...
diff --git a/cpu/at32ap/at32ap700x/sm.h b/cpu/at32ap/at32ap700x/sm.h index 6492c8e..b6e4409 100644 --- a/cpu/at32ap/at32ap700x/sm.h +++ b/cpu/at32ap/at32ap700x/sm.h @@ -21,7 +21,7 @@ #define SM_PM_IMR 0x0048 #define SM_PM_ISR 0x004c #define SM_PM_ICR 0x0050 -#define SM_PM_GCCTRL 0x0060 +#define SM_PM_GCCTRL(x) (0x0060 + 4 * x) #define SM_RTC_CTRL 0x0080 #define SM_RTC_VAL 0x0084 #define SM_RTC_TOP 0x0088 diff --git a/cpu/at32ap/cpu.c b/cpu/at32ap/cpu.c index 0ba8361..4a92aab 100644 --- a/cpu/at32ap/cpu.c +++ b/cpu/at32ap/cpu.c @@ -65,6 +65,11 @@ int cpu_init(void) sysreg_write(EVBA, (unsigned long)&_evba); asm volatile("csrf %0" : : "i"(SYSREG_EM_OFFSET));
- if(gclk_init)
- {
gclk_init();
- }
Please remove the superfluous braces.
return 0; }
diff --git a/include/asm-avr32/arch-at32ap700x/clk.h b/include/asm-avr32/arch-at32ap700x/clk.h index 4a1dd33..63671db 100644 --- a/include/asm-avr32/arch-at32ap700x/clk.h +++ b/include/asm-avr32/arch-at32ap700x/clk.h @@ -76,6 +76,7 @@ static inline unsigned long get_mci_clk_rate(void) #endif
extern void clk_init(void); +extern void gclk_init(void) __attribute__((weak));
Hmmm...right. An undefined weak symbol evaluates to zero...
/* Board code may need the SDRAM base clock as a compile-time constant */ #define SDRAMC_BUS_HZ (MAIN_CLK_RATE >> CFG_CLKDIV_HSB) diff --git a/include/asm-avr32/arch-at32ap700x/gpio.h b/include/asm-avr32/arch-at32ap700x/gpio.h index b10a3e4..c350d54 100644 --- a/include/asm-avr32/arch-at32ap700x/gpio.h +++ b/include/asm-avr32/arch-at32ap700x/gpio.h @@ -216,5 +216,8 @@ void gpio_enable_macb1(void); #ifdef AT32AP700x_CHIP_HAS_MMCI void gpio_enable_mmci(void); #endif +#ifdef CONFIG_HAMMERHEAD +void gpio_enable_gclk3(void); +#endif
Please remove the #ifdef.
#endif /* __ASM_AVR32_ARCH_GPIO_H__ */ diff --git a/include/configs/hammerhead.h b/include/configs/hammerhead.h new file mode 100644 index 0000000..6699aea --- /dev/null +++ b/include/configs/hammerhead.h @@ -0,0 +1,179 @@ +/*
- Copyright (C) 2008 Miromico AG
- Configuration settings for the Miromico Hammerhead AVR32 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
+#define CONFIG_AVR32 1 +#define CONFIG_AT32AP 1 +#define CONFIG_AT32AP7000 1 +#define CONFIG_HAMMERHEAD 1
+#define CFG_HZ 1000
+/*
- Set up the PLL to run at 140 MHz, the CPU to run at the PLL
- frequency, the HSB and PBB busses to run at 1/2 the PLL frequency
- and the PBA bus to run at 1/4 the PLL frequency.
- */
+#define CONFIG_PLL 1 +#define CFG_POWER_MANAGER 1 +#define CFG_OSC0_HZ 25000000 /* 25MHz crystal */ +#define CFG_PLL0_DIV 1 +#define CFG_PLL0_MUL 5
This gives (25000000 / 1) * 5 = 125 MHz. Please update the comment.
Sure you don't wanna crank it up to 150 MHz, btw? ;-)
+#define CFG_PLL0_SUPPRESS_CYCLES 16 +#define CFG_CLKDIV_CPU 0 +#define CFG_CLKDIV_HSB 1 +#define CFG_CLKDIV_PBA 2 +#define CFG_CLKDIV_PBB 1
+/*
- The PLLOPT register controls the PLL like this:
- icp = PLLOPT<2>
- ivco = PLLOPT<1:0>
- We want icp=1 (default) and ivco=0 (80-160 MHz) or ivco=2 (150-240MHz).
- */
+#define CFG_PLL0_OPT 0x04
+#define CONFIG_USART1 1
+#define CONFIG_HOSTNAME hammerhead
+/* User serviceable stuff */ +#define CONFIG_DOS_PARTITION 1
+#define CONFIG_CMDLINE_TAG 1 +#define CONFIG_SETUP_MEMORY_TAGS 1 +#define CONFIG_INITRD_TAG 1
+#define CONFIG_STACKSIZE (2048)
+#define CONFIG_BAUDRATE 115200 +#define CONFIG_BOOTARGS \
- "console=ttyS0 root=/dev/mtdblock1 rootfstype=jffs2"
It turns out that you can use "console=ttyS0 root=mtd1 rootfstype=jffs2". That's shorter and makes it possible to boot a kernel without Block Device support.
+#define CONFIG_BOOTCOMMAND \
- "fsload; bootm"
+/*
- Only interrupt autoboot if <space> is pressed. Otherwise, garbage
- data on the serial line may interrupt the boot sequence.
- */
+#define CONFIG_BOOTDELAY 1 +#define CONFIG_AUTOBOOT 1 +#define CONFIG_AUTOBOOT_KEYED 1 +#define CONFIG_AUTOBOOT_PROMPT \
- "Press SPACE to abort autoboot in %d seconds\n"
+#define CONFIG_AUTOBOOT_DELAY_STR "d" +#define CONFIG_AUTOBOOT_STOP_STR " "
+/*
- After booting the board for the first time, new ethernet address
- should be generated and assigned to the environment variables
- "ethaddr". This is normally done during production.
- */
+#define CONFIG_OVERWRITE_ETHADDR_ONCE 1 +#define CONFIG_NET_MULTI 1
+/*
- BOOTP/DHCP options
- */
+#define CONFIG_BOOTP_SUBNETMASK +#define CONFIG_BOOTP_GATEWAY
+#define CONFIG_DOS_PARTITION 1
You've defined this before.
+/*
- Command line configuration.
- */
+#include <config_cmd_default.h>
+#define CONFIG_CMD_ASKENV +#define CONFIG_CMD_DHCP +#define CONFIG_CMD_EXT2 +#define CONFIG_CMD_FAT +#define CONFIG_CMD_JFFS2 +#define CONFIG_CMD_MMC +#undef CONFIG_CMD_FPGA +#undef CONFIG_CMD_SETGETDCR
+#define CONFIG_ATMEL_USART 1 +#define CONFIG_MACB 1 +#define CONFIG_PIO2 1 +#define CFG_NR_PIOS 5 +#define CFG_HSDRAMC 1 +#define CONFIG_MMC 1
+#define CFG_DCACHE_LINESZ 32 +#define CFG_ICACHE_LINESZ 32
+#define CONFIG_NR_DRAM_BANKS 1
+#define CFG_FLASH_CFI 1 +#define CFG_FLASH_CFI_DRIVER 1
+#define CFG_FLASH_BASE 0x00000000 +#define CFG_FLASH_SIZE 0x800000 +#define CFG_MAX_FLASH_BANKS 1 +#define CFG_MAX_FLASH_SECT 135
+#define CFG_MONITOR_BASE CFG_FLASH_BASE
+#define CFG_INTRAM_BASE 0x24000000 +#define CFG_INTRAM_SIZE 0x8000
+#define CFG_SDRAM_BASE 0x10000000
+#define CFG_ENV_IS_IN_FLASH 1 +#define CFG_ENV_SIZE 65536 +#define CFG_ENV_ADDR (CFG_FLASH_BASE + CFG_FLASH_SIZE - CFG_ENV_SIZE)
+#define CFG_INIT_SP_ADDR (CFG_INTRAM_BASE + CFG_INTRAM_SIZE)
+#define CFG_MALLOC_LEN (256*1024) +#define CFG_MALLOC_END \
- ({ \
DECLARE_GLOBAL_DATA_PTR; \
CFG_SDRAM_BASE + gd->sdram_size; \
- })
+#define CFG_MALLOC_START (CFG_MALLOC_END - CFG_MALLOC_LEN)
I don't think CFG_MALLOC_END and CFG_MALLOC_START is used anywhere. Please remove them.
+#define CFG_DMA_ALLOC_LEN (16384)
+/* Allow 4MB for the kernel run-time image */ +#define CFG_LOAD_ADDR (CFG_SDRAM_BASE + 0x00400000) +#define CFG_BOOTPARAMS_LEN (16 * 1024)
+/* Other configuration settings that shouldn't have to change all that often */ +#define CFG_PROMPT "Uboot> "
Some people think "U-Boot> " looks nicer. Or you can make it something custom, e.g. "Hammerhead> ". It's up to you, really.
+#define CFG_CBSIZE 256 +#define CFG_MAXARGS 16 +#define CFG_PBSIZE (CFG_CBSIZE + sizeof(CFG_PROMPT) + 16) +#define CFG_LONGHELP 1
+#define CFG_MEMTEST_START CFG_SDRAM_BASE +#define CFG_MEMTEST_END (CFG_MEMTEST_START + 0x1f00000)
+#define CFG_BAUDRATE_TABLE { 115200, 38400, 19200, 9600, 2400 }
+#endif /* __CONFIG_H */ diff --git a/net/eth.c b/net/eth.c index c4f24c6..054a9fd 100644 --- a/net/eth.c +++ b/net/eth.c @@ -65,6 +65,7 @@ extern int atngw100_eth_initialize(bd_t *); extern int mcffec_initialize(bd_t*); extern int mcdmafec_initialize(bd_t*); extern int at91sam9_eth_initialize(bd_t *); +extern int board_eth_initialize(bd_t *);
#ifdef CONFIG_API extern void (*push_packet)(volatile void *, int); @@ -291,6 +292,9 @@ int eth_initialize(bd_t *bis) #if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) at91sam9_eth_initialize(bis); #endif +#if defined(CONFIG_HAMMERHEAD)
- board_eth_initialize(bis);
+#endif
Hmm...this needs to be coordinated with Ben Warren's ethernet init patches somehow.
If you call it "board_eth_init()" instead, we can simply chop off this hunk when Ben's patches are in, and it will all Just Work. Hopefully.
if (!eth_devices) { puts ("No ethernet found.\n");
Haavard

On Mon, 23 Jun 2008, Haavard Skinnemoen wrote:
Julien May mailinglist@miromico.ch wrote:
Signed-off-by: Julien May mailinglist@miromico.ch
Could you add a few lines describing the Hammerhead board, perhaps with a link to your site?
You'll find a short desc. of the hammerhead board on top of the inc. patch below.
This looks pretty good to me. I have a few comments below, and I've Cc'ed u-boot-users so that more people can comment on this. Please keep them in the loop whenever you post a new version of this patch.
If you want, I can apply this to my tree as is, and you can send me incremental patches fixing up the remaining issues. I'll fold everything into a single patch before sending it upstream.
Would be great if you could apply the patch to your tree. Please find below the incremental patch that should fix all of the remaining issues.
- Julien May
From 6333f6ea0a5a16d273fe1512ecacdce9fff275f5 Mon Sep 17 00:00:00 2001
From: Julien May mailinglist@miromico.ch Date: Mon, 23 Jun 2008 16:44:44 +0200 Subject: [PATCH 1/1] Add support for the hammerhead (AVR32) board.
The Hammerhead platform is built around a AVR32 32-bit microcontroller from Atmel. It offers versatile peripherals, such as ethernet, usb device, usb host etc.
The board also incooperates a power supply and is a Power over Ethernet (PoE) Powered Device (PD).
Additonally, a Cyclone III FPGA from Altera is integrated on the board. The FPGA is mapped into the 32-bit AVR memory bus. The FPGA offers two DDR2 SDRAM interfaces, which will cover even the most exceptional need of memory bandwidth. Together with the onboard video decoder the board is ready for video processing.
For more information see: http://www.miromico.com/hammerhead
Signed-off-by: Julien May mailinglist@miromico.ch --- board/miromico/hammerhead/eth.c | 2 +- board/miromico/hammerhead/hammerhead.c | 9 ++++----- cpu/at32ap/at32ap700x/gpio.c | 11 ----------- cpu/at32ap/cpu.c | 2 -- include/asm-avr32/arch-at32ap700x/gpio.h | 3 --- include/configs/hammerhead.h | 14 +++----------- net/eth.c | 4 ++-- 7 files changed, 10 insertions(+), 35 deletions(-)
diff --git a/board/miromico/hammerhead/eth.c b/board/miromico/hammerhead/eth.c index 969c48e..056e9ca 100644 --- a/board/miromico/hammerhead/eth.c +++ b/board/miromico/hammerhead/eth.c @@ -30,7 +30,7 @@ extern int macb_eth_initialize(int id, void *regs, unsigned int phy_addr);
#ifdef CONFIG_CMD_NET -void board_eth_initialize(bd_t *bi) +void board_eth_init(bd_t *bi) { macb_eth_initialize(0, (void *)MACB0_BASE, bi->bi_phy_id[0]); } diff --git a/board/miromico/hammerhead/hammerhead.c b/board/miromico/hammerhead/hammerhead.c index 69ff7fa..26d1182 100644 --- a/board/miromico/hammerhead/hammerhead.c +++ b/board/miromico/hammerhead/hammerhead.c @@ -64,10 +64,6 @@ int board_early_init_f(void) #if defined(CONFIG_MMC) gpio_enable_mmci(); #endif - - /* Select GCLK3 peripheral function. We'll need it as clock output - * for ethernet PHY. */ - gpio_enable_gclk3(); return 0; }
@@ -100,6 +96,9 @@ void gclk_init(void) { /* Hammerhead boards uses GCLK3 as 25MHz output to ethernet PHY */
+ /* Select GCLK3 peripheral function */ + gpio_select_periph_A(GPIO_PIN_PB29, 0); + /* Enable GCLK3 with no input divider, from OSC0 (crystal) */ - sm_writel( PM_GCCTRL(3), SM_BIT(CEN) ); + sm_writel(PM_GCCTRL(3), SM_BIT(CEN)); } diff --git a/cpu/at32ap/at32ap700x/gpio.c b/cpu/at32ap/at32ap700x/gpio.c index 2b7717f..859124a 100644 --- a/cpu/at32ap/at32ap700x/gpio.c +++ b/cpu/at32ap/at32ap700x/gpio.c @@ -142,14 +142,3 @@ void gpio_enable_mmci(void) gpio_select_periph_A(GPIO_PIN_PA15, 0); /* DATA3 */ } #endif - -/* - * Hammerhead board uses GCLK3 (Periph A on PB29) as 25MHz clock output - * for ethernet PHY. - */ -void __gpio_enable_gclk3(void) -{ - gpio_select_periph_A(GPIO_PIN_PB29, 0); /* GCLK3 */ -} - -void gpio_enable_gclk3(void) __attribute__((weak, alias("__gpio_enable_gclk3"))); diff --git a/cpu/at32ap/cpu.c b/cpu/at32ap/cpu.c index 4a92aab..1a13702 100644 --- a/cpu/at32ap/cpu.c +++ b/cpu/at32ap/cpu.c @@ -66,9 +66,7 @@ int cpu_init(void) asm volatile("csrf %0" : : "i"(SYSREG_EM_OFFSET));
if(gclk_init) - { gclk_init(); - }
return 0; } diff --git a/include/asm-avr32/arch-at32ap700x/gpio.h b/include/asm-avr32/arch-at32ap700x/gpio.h index c350d54..b10a3e4 100644 --- a/include/asm-avr32/arch-at32ap700x/gpio.h +++ b/include/asm-avr32/arch-at32ap700x/gpio.h @@ -216,8 +216,5 @@ void gpio_enable_macb1(void); #ifdef AT32AP700x_CHIP_HAS_MMCI void gpio_enable_mmci(void); #endif -#ifdef CONFIG_HAMMERHEAD -void gpio_enable_gclk3(void); -#endif
#endif /* __ASM_AVR32_ARCH_GPIO_H__ */ diff --git a/include/configs/hammerhead.h b/include/configs/hammerhead.h index 6699aea..70123f7 100644 --- a/include/configs/hammerhead.h +++ b/include/configs/hammerhead.h @@ -38,7 +38,7 @@ */ #define CONFIG_PLL 1 #define CFG_POWER_MANAGER 1 -#define CFG_OSC0_HZ 25000000 /* 25MHz crystal */ +#define CFG_OSC0_HZ 25000000 /* 25MHz crystal -> 125MHz clock */ #define CFG_PLL0_DIV 1 #define CFG_PLL0_MUL 5 #define CFG_PLL0_SUPPRESS_CYCLES 16 @@ -71,7 +71,7 @@
#define CONFIG_BAUDRATE 115200 #define CONFIG_BOOTARGS \ - "console=ttyS0 root=/dev/mtdblock1 rootfstype=jffs2" + "console=ttyS0 root=mtd1 rootfstype=jffs2" #define CONFIG_BOOTCOMMAND \ "fsload; bootm"
@@ -101,8 +101,6 @@ #define CONFIG_BOOTP_SUBNETMASK #define CONFIG_BOOTP_GATEWAY
-#define CONFIG_DOS_PARTITION 1 - /* * Command line configuration. */ @@ -151,12 +149,6 @@ #define CFG_INIT_SP_ADDR (CFG_INTRAM_BASE + CFG_INTRAM_SIZE)
#define CFG_MALLOC_LEN (256*1024) -#define CFG_MALLOC_END \ - ({ \ - DECLARE_GLOBAL_DATA_PTR; \ - CFG_SDRAM_BASE + gd->sdram_size; \ - }) -#define CFG_MALLOC_START (CFG_MALLOC_END - CFG_MALLOC_LEN)
#define CFG_DMA_ALLOC_LEN (16384)
@@ -165,7 +157,7 @@ #define CFG_BOOTPARAMS_LEN (16 * 1024)
/* Other configuration settings that shouldn't have to change all that often */ -#define CFG_PROMPT "Uboot> " +#define CFG_PROMPT "Hammerhead> " #define CFG_CBSIZE 256 #define CFG_MAXARGS 16 #define CFG_PBSIZE (CFG_CBSIZE + sizeof(CFG_PROMPT) + 16) diff --git a/net/eth.c b/net/eth.c index 054a9fd..2d6f15f 100644 --- a/net/eth.c +++ b/net/eth.c @@ -65,7 +65,7 @@ extern int atngw100_eth_initialize(bd_t *); extern int mcffec_initialize(bd_t*); extern int mcdmafec_initialize(bd_t*); extern int at91sam9_eth_initialize(bd_t *); -extern int board_eth_initialize(bd_t *); +extern int board_eth_init(bd_t *);
#ifdef CONFIG_API extern void (*push_packet)(volatile void *, int); @@ -293,7 +293,7 @@ int eth_initialize(bd_t *bis) at91sam9_eth_initialize(bis); #endif #if defined(CONFIG_HAMMERHEAD) - board_eth_initialize(bis); + board_eth_init(bis); #endif
if (!eth_devices) {

Hi Julien,
Julien May wrote:
On Mon, 23 Jun 2008, Haavard Skinnemoen wrote:
Julien May mailinglist@miromico.ch wrote:
Signed-off-by: Julien May mailinglist@miromico.ch
Could you add a few lines describing the Hammerhead board, perhaps with a link to your site?
You'll find a short desc. of the hammerhead board on top of the inc. patch below.
Please don't do incremental patches. Just re-submit.
This looks pretty good to me. I have a few comments below, and I've Cc'ed u-boot-users so that more people can comment on this. Please keep them in the loop whenever you post a new version of this patch.
If you want, I can apply this to my tree as is, and you can send me incremental patches fixing up the remaining issues. I'll fold everything into a single patch before sending it upstream.
Would be great if you could apply the patch to your tree. Please find below the incremental patch that should fix all of the remaining issues.
- Julien May
From 6333f6ea0a5a16d273fe1512ecacdce9fff275f5 Mon Sep 17 00:00:00 2001
From: Julien May mailinglist@miromico.ch Date: Mon, 23 Jun 2008 16:44:44 +0200 Subject: [PATCH 1/1] Add support for the hammerhead (AVR32) board.
The Hammerhead platform is built around a AVR32 32-bit microcontroller from Atmel. It offers versatile peripherals, such as ethernet, usb device, usb host etc.
The board also incooperates a power supply and is a Power over Ethernet (PoE) Powered Device (PD).
Additonally, a Cyclone III FPGA from Altera is integrated on the board. The FPGA is mapped into the 32-bit AVR memory bus. The FPGA offers two DDR2 SDRAM interfaces, which will cover even the most exceptional need of memory bandwidth. Together with the onboard video decoder the board is ready for video processing.
For more information see: http://www.miromico.com/hammerhead
Signed-off-by: Julien May mailinglist@miromico.ch
board/miromico/hammerhead/eth.c | 2 +- board/miromico/hammerhead/hammerhead.c | 9 ++++----- cpu/at32ap/at32ap700x/gpio.c | 11 ----------- cpu/at32ap/cpu.c | 2 -- include/asm-avr32/arch-at32ap700x/gpio.h | 3 --- include/configs/hammerhead.h | 14 +++----------- net/eth.c | 4 ++-- 7 files changed, 10 insertions(+), 35 deletions(-)
diff --git a/board/miromico/hammerhead/eth.c b/board/miromico/hammerhead/eth.c index 969c48e..056e9ca 100644 --- a/board/miromico/hammerhead/eth.c +++ b/board/miromico/hammerhead/eth.c @@ -30,7 +30,7 @@ extern int macb_eth_initialize(int id, void *regs, unsigned int phy_addr);
#ifdef CONFIG_CMD_NET -void board_eth_initialize(bd_t *bi) +void board_eth_init(bd_t *bi) { macb_eth_initialize(0, (void *)MACB0_BASE, bi->bi_phy_id[0]); }
board_eth_init() returns an int. Standard UNIX, =0 on success, <0 on failure.
diff --git a/board/miromico/hammerhead/hammerhead.c b/board/miromico/hammerhead/hammerhead.c index 69ff7fa..26d1182 100644 --- a/board/miromico/hammerhead/hammerhead.c +++ b/board/miromico/hammerhead/hammerhead.c @@ -64,10 +64,6 @@ int board_early_init_f(void) #if defined(CONFIG_MMC) gpio_enable_mmci(); #endif
- /* Select GCLK3 peripheral function. We'll need it as clock output
* for ethernet PHY. */
- gpio_enable_gclk3(); return 0;
}
@@ -100,6 +96,9 @@ void gclk_init(void) { /* Hammerhead boards uses GCLK3 as 25MHz output to ethernet PHY */
- /* Select GCLK3 peripheral function */
- gpio_select_periph_A(GPIO_PIN_PB29, 0);
- /* Enable GCLK3 with no input divider, from OSC0 (crystal) */
- sm_writel( PM_GCCTRL(3), SM_BIT(CEN) );
- sm_writel(PM_GCCTRL(3), SM_BIT(CEN));
} diff --git a/cpu/at32ap/at32ap700x/gpio.c b/cpu/at32ap/at32ap700x/gpio.c index 2b7717f..859124a 100644 --- a/cpu/at32ap/at32ap700x/gpio.c +++ b/cpu/at32ap/at32ap700x/gpio.c @@ -142,14 +142,3 @@ void gpio_enable_mmci(void) gpio_select_periph_A(GPIO_PIN_PA15, 0); /* DATA3 */ } #endif
-/*
- Hammerhead board uses GCLK3 (Periph A on PB29) as 25MHz clock output
- for ethernet PHY.
- */
-void __gpio_enable_gclk3(void) -{
- gpio_select_periph_A(GPIO_PIN_PB29, 0); /* GCLK3 */
-}
-void gpio_enable_gclk3(void) __attribute__((weak, alias("__gpio_enable_gclk3"))); diff --git a/cpu/at32ap/cpu.c b/cpu/at32ap/cpu.c index 4a92aab..1a13702 100644 --- a/cpu/at32ap/cpu.c +++ b/cpu/at32ap/cpu.c @@ -66,9 +66,7 @@ int cpu_init(void) asm volatile("csrf %0" : : "i"(SYSREG_EM_OFFSET));
if(gclk_init)
{ gclk_init();
}
return 0;
} diff --git a/include/asm-avr32/arch-at32ap700x/gpio.h b/include/asm-avr32/arch-at32ap700x/gpio.h index c350d54..b10a3e4 100644 --- a/include/asm-avr32/arch-at32ap700x/gpio.h +++ b/include/asm-avr32/arch-at32ap700x/gpio.h @@ -216,8 +216,5 @@ void gpio_enable_macb1(void); #ifdef AT32AP700x_CHIP_HAS_MMCI void gpio_enable_mmci(void); #endif -#ifdef CONFIG_HAMMERHEAD -void gpio_enable_gclk3(void); -#endif
#endif /* __ASM_AVR32_ARCH_GPIO_H__ */ diff --git a/include/configs/hammerhead.h b/include/configs/hammerhead.h index 6699aea..70123f7 100644 --- a/include/configs/hammerhead.h +++ b/include/configs/hammerhead.h @@ -38,7 +38,7 @@ */ #define CONFIG_PLL 1 #define CFG_POWER_MANAGER 1 -#define CFG_OSC0_HZ 25000000 /* 25MHz crystal */ +#define CFG_OSC0_HZ 25000000 /* 25MHz crystal -> 125MHz clock */ #define CFG_PLL0_DIV 1 #define CFG_PLL0_MUL 5 #define CFG_PLL0_SUPPRESS_CYCLES 16 @@ -71,7 +71,7 @@
#define CONFIG_BAUDRATE 115200 #define CONFIG_BOOTARGS \
- "console=ttyS0 root=/dev/mtdblock1 rootfstype=jffs2"
- "console=ttyS0 root=mtd1 rootfstype=jffs2"
#define CONFIG_BOOTCOMMAND \ "fsload; bootm"
@@ -101,8 +101,6 @@ #define CONFIG_BOOTP_SUBNETMASK #define CONFIG_BOOTP_GATEWAY
-#define CONFIG_DOS_PARTITION 1
/*
- Command line configuration.
*/ @@ -151,12 +149,6 @@ #define CFG_INIT_SP_ADDR (CFG_INTRAM_BASE + CFG_INTRAM_SIZE)
#define CFG_MALLOC_LEN (256*1024) -#define CFG_MALLOC_END \
- ({ \
DECLARE_GLOBAL_DATA_PTR; \
CFG_SDRAM_BASE + gd->sdram_size; \
- })
-#define CFG_MALLOC_START (CFG_MALLOC_END - CFG_MALLOC_LEN)
#define CFG_DMA_ALLOC_LEN (16384)
@@ -165,7 +157,7 @@ #define CFG_BOOTPARAMS_LEN (16 * 1024)
/* Other configuration settings that shouldn't have to change all that often */ -#define CFG_PROMPT "Uboot> " +#define CFG_PROMPT "Hammerhead> " #define CFG_CBSIZE 256 #define CFG_MAXARGS 16 #define CFG_PBSIZE (CFG_CBSIZE + sizeof(CFG_PROMPT) + 16) diff --git a/net/eth.c b/net/eth.c index 054a9fd..2d6f15f 100644 --- a/net/eth.c +++ b/net/eth.c
You won't need to touch this file. Please see how it's done in the 'next' branch of the net repo on git.denx.de.
regards, Ben

Ben Warren bwarren@qstreams.com wrote:
Hi Julien,
Julien May wrote:
On Mon, 23 Jun 2008, Haavard Skinnemoen wrote:
Julien May mailinglist@miromico.ch wrote:
Signed-off-by: Julien May mailinglist@miromico.ch
Could you add a few lines describing the Hammerhead board, perhaps with a link to your site?
You'll find a short desc. of the hammerhead board on top of the inc. patch below.
Please don't do incremental patches. Just re-submit.
Sorry, my fault. See below:
This looks pretty good to me. I have a few comments below, and I've Cc'ed u-boot-users so that more people can comment on this. Please keep them in the loop whenever you post a new version of this patch.
If you want, I can apply this to my tree as is, and you can send me incremental patches fixing up the remaining issues. I'll fold everything into a single patch before sending it upstream.
Would be great if you could apply the patch to your tree. Please find below the incremental patch that should fix all of the remaining issues.
...though I'm not sure what the problem with incremental patches is, assuming someone is willing to merge them before they finally go upstream. I am willing to do that.
diff --git a/net/eth.c b/net/eth.c index 054a9fd..2d6f15f 100644 --- a/net/eth.c +++ b/net/eth.c
You won't need to touch this file. Please see how it's done in the 'next' branch of the net repo on git.denx.de.
Yeah, but it you don't touch this file, it will only work in your 'next' branch. If you don't rebase your next branch, I can pull it into my tree and get everything sorted out before the merge window. Hey, I'll even fix up a few existing boards :-)
The other possibility is to apply the patch with this hunk present and throw it out before I finally merge it after your changes are in. That was my initial suggestion.
What do you think?
Haavard

Haavard Skinnemoen wrote:
Ben Warren bwarren@qstreams.com wrote:
Hi Julien,
Julien May wrote:
On Mon, 23 Jun 2008, Haavard Skinnemoen wrote:
Julien May mailinglist@miromico.ch wrote:
Signed-off-by: Julien May mailinglist@miromico.ch
Could you add a few lines describing the Hammerhead board, perhaps with a link to your site?
You'll find a short desc. of the hammerhead board on top of the inc. patch below.
Please don't do incremental patches. Just re-submit.
Sorry, my fault. See below:
Oh, I missed you suggesting that idea...
This looks pretty good to me. I have a few comments below, and I've Cc'ed u-boot-users so that more people can comment on this. Please keep them in the loop whenever you post a new version of this patch.
If you want, I can apply this to my tree as is, and you can send me incremental patches fixing up the remaining issues. I'll fold everything into a single patch before sending it upstream.
Would be great if you could apply the patch to your tree. Please find below the incremental patch that should fix all of the remaining issues.
...though I'm not sure what the problem with incremental patches is, assuming someone is willing to merge them before they finally go upstream. I am willing to do that.
I personally think they're hard to follow, add unnecessary dependencies and pollute the changelog. But that's just my opinion.
diff --git a/net/eth.c b/net/eth.c index 054a9fd..2d6f15f 100644 --- a/net/eth.c +++ b/net/eth.c
You won't need to touch this file. Please see how it's done in the 'next' branch of the net repo on git.denx.de.
Yeah, but it you don't touch this file, it will only work in your 'next' branch. If you don't rebase your next branch, I can pull it into my tree and get everything sorted out before the merge window. Hey, I'll even fix up a few existing boards :-)
The other possibility is to apply the patch with this hunk present and throw it out before I finally merge it after your changes are in. That was my initial suggestion.
What do you think?
Just another fun aspect of having non-orthogonal branches and patches. The best solution would be for Wolfgang to pull my patch into mainline (for r1.3.4). Technically, a few rounds of the submission were posted before the merge window closed, so maybe he'll be in a good mood after vacation :) Otherwise, I don't care - your idea works. You can move a few or all of the macb-using boards over and that would be cool.
cheers, Ben

On Tue, 24 Jun 2008 09:22:13 -0700 Ben Warren biggerbadderben@gmail.com wrote:
...though I'm not sure what the problem with incremental patches is, assuming someone is willing to merge them before they finally go upstream. I am willing to do that.
I personally think they're hard to follow, add unnecessary dependencies and pollute the changelog. But that's just my opinion.
I was thinking of creating some kind of "staging branch" where it could evolve until some time before the next merge window. Then I'd just do a "git rebase -i master" and suck it into my main branch as a single commit, so the changelog should end up nice and tidy. Sort of like how -mm works, except using git instead of quilt.
Not sure if it's a good idea or not...I still feel my workflow isn't fully optimized ;-)
The alternative is doing a few more full respins on the mailing lists. I personally think full patches get tiresome to review on the third respin or so...so I kinda prefer incremental patches once things are in reasonably good shape.
Just another fun aspect of having non-orthogonal branches and patches. The best solution would be for Wolfgang to pull my patch into mainline (for r1.3.4). Technically, a few rounds of the submission were posted before the merge window closed, so maybe he'll be in a good mood after vacation :) Otherwise, I don't care - your idea works. You can move a few or all of the macb-using boards over and that would be cool.
I think I'll create a "hammerhead" branch and pull your "next" branch into it. It will be kind of volatile anyway since I intend to rebase it at least once before doing the final merge, so if it doesn't work out, I can always drop your tree.
That said, your patch paves the way for a lot of nice cleanups in net/eth.c, so IMO it would be a pity to have to wait another release cycle before starting that work. In other words, feel free to add a huge Acked-by from me and push it for 1.3.4 :-)
As for the other macb-using boards...maybe it would be easier to take that through your tree? Heh, non-orthogonal patches again...
Haavard
participants (4)
-
Ben Warren
-
Ben Warren
-
Haavard Skinnemoen
-
Julien May