[U-Boot] [PATCH V2 00/13] Basic Raspberyr Pi support

This series adds basic support for the Raspberry Pi ARM board.
v2: * Add README config_cmd_default.h documentation fix. * Use <> not "" for include of config_cmd_default.h. * Squash together 3 patches related to enabling booting a Linux kernel. * Minor rpi_b.h order changes in order to drop later cleanup patch. * Merged together 2 patch series of mine, and the GPIO series from Vikram.
Stephen Warren (11): README: fix references to config_cmd_default.h ARM: add basic support for the Broadcom BCM2835 SoC ARM: bcm2835: add Raspberry Pi model B board ARM: arm1176: enable instruction cache in arch_cpu_init() ARM: rpi_b: enable CONFIG_ARCH_CPU_INIT for icache ARM: rpi_b: define CONFIG_MACH_TYPE ARM: rpi_b: include config_cmd_default.h ARM: rpi_b: enable booting the Linux kernel ARM: rpi_b: drop RAM size to 128M ARM: rpi_b: move stack to top of RAM ARM: bcm2835: implement reset using watchdog
Vikram Narayanan (2): gpio: bcm2835: Add GPIO driver rbpi: Add BCM2835 GPIO driver for raspberry pi
MAINTAINERS | 4 + README | 4 +- arch/arm/cpu/arm1176/bcm2835/Makefile | 37 +++++++++ arch/arm/cpu/arm1176/bcm2835/config.mk | 19 +++++ arch/arm/cpu/arm1176/bcm2835/lowlevel_init.S | 19 +++++ arch/arm/cpu/arm1176/bcm2835/reset.c | 35 +++++++++ arch/arm/cpu/arm1176/bcm2835/timer.c | 55 +++++++++++++ arch/arm/cpu/arm1176/cpu.c | 7 ++ arch/arm/include/asm/arch-bcm2835/gpio.h | 66 ++++++++++++++++ arch/arm/include/asm/arch-bcm2835/timer.h | 37 +++++++++ arch/arm/include/asm/arch-bcm2835/wdog.h | 37 +++++++++ board/raspberrypi/rpi_b/Makefile | 34 +++++++++ board/raspberrypi/rpi_b/rpi_b.c | 34 +++++++++ boards.cfg | 1 + drivers/gpio/Makefile | 1 + drivers/gpio/bcm2835_gpio.c | 90 ++++++++++++++++++++++ include/configs/rpi_b.h | 106 ++++++++++++++++++++++++++ 17 files changed, 584 insertions(+), 2 deletions(-) create mode 100644 arch/arm/cpu/arm1176/bcm2835/Makefile create mode 100644 arch/arm/cpu/arm1176/bcm2835/config.mk create mode 100644 arch/arm/cpu/arm1176/bcm2835/lowlevel_init.S create mode 100644 arch/arm/cpu/arm1176/bcm2835/reset.c create mode 100644 arch/arm/cpu/arm1176/bcm2835/timer.c create mode 100644 arch/arm/include/asm/arch-bcm2835/gpio.h create mode 100644 arch/arm/include/asm/arch-bcm2835/timer.h create mode 100644 arch/arm/include/asm/arch-bcm2835/wdog.h create mode 100644 board/raspberrypi/rpi_b/Makefile create mode 100644 board/raspberrypi/rpi_b/rpi_b.c create mode 100644 drivers/gpio/bcm2835_gpio.c create mode 100644 include/configs/rpi_b.h

All usage of config_cmd_default.h uses <> for the include statement. Update the README to do the same, rather than using "".
Signed-off-by: Stephen Warren swarren@wwwdotorg.org --- v2: New patch --- README | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README b/README index dac46f3..a7deaf4 100644 --- a/README +++ b/README @@ -744,8 +744,8 @@ The following options need to be configured: - Monitor Functions: Monitor commands can be included or excluded from the build by using the #include files - "config_cmd_all.h" and #undef'ing unwanted - commands, or using "config_cmd_default.h" + <config_cmd_all.h> and #undef'ing unwanted + commands, or using <config_cmd_default.h> and augmenting with additional #define's for wanted commands.

This SoC is used in the Raspberry Pi, for example.
Initial support is enough to boot to a serial console, and execute a minimal set of U-Boot commands. No drivers are implemented. For more details, see http://www.broadcom.com/products/BCM2835 or http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripheral....
Signed-off-by: Stephen Warren swarren@wwwdotorg.org --- arch/arm/cpu/arm1176/bcm2835/Makefile | 37 +++++++++++++++++ arch/arm/cpu/arm1176/bcm2835/config.mk | 19 +++++++++ arch/arm/cpu/arm1176/bcm2835/lowlevel_init.S | 19 +++++++++ arch/arm/cpu/arm1176/bcm2835/reset.c | 27 +++++++++++++ arch/arm/cpu/arm1176/bcm2835/timer.c | 55 ++++++++++++++++++++++++++ arch/arm/include/asm/arch-bcm2835/timer.h | 37 +++++++++++++++++ 6 files changed, 194 insertions(+) create mode 100644 arch/arm/cpu/arm1176/bcm2835/Makefile create mode 100644 arch/arm/cpu/arm1176/bcm2835/config.mk create mode 100644 arch/arm/cpu/arm1176/bcm2835/lowlevel_init.S create mode 100644 arch/arm/cpu/arm1176/bcm2835/reset.c create mode 100644 arch/arm/cpu/arm1176/bcm2835/timer.c create mode 100644 arch/arm/include/asm/arch-bcm2835/timer.h
diff --git a/arch/arm/cpu/arm1176/bcm2835/Makefile b/arch/arm/cpu/arm1176/bcm2835/Makefile new file mode 100644 index 0000000..4ea6d6b --- /dev/null +++ b/arch/arm/cpu/arm1176/bcm2835/Makefile @@ -0,0 +1,37 @@ +# +# 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 +# version 2 as published by the Free Software Foundation. +# +# 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. +# + +include $(TOPDIR)/config.mk + +LIB = $(obj)lib$(SOC).o + +SOBJS := lowlevel_init.o +COBJS := reset.o timer.o + +SRCS := $(SOBJS:.o=.c) $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS)) + +all: $(obj).depend $(LIB) + +$(LIB): $(OBJS) + $(call cmd_link_o_target, $(OBJS)) + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/arch/arm/cpu/arm1176/bcm2835/config.mk b/arch/arm/cpu/arm1176/bcm2835/config.mk new file mode 100644 index 0000000..b87ce24 --- /dev/null +++ b/arch/arm/cpu/arm1176/bcm2835/config.mk @@ -0,0 +1,19 @@ +# +# (C) Copyright 2012 Stephen Warren +# +# 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 +# version 2 as published by the Free Software Foundation. +# +# 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. + +# Don't attempt to override the target CPU/ABI options; +# the Raspberry Pi toolchain does the right thing by default. +PLATFORM_RELFLAGS := $(filter-out -msoft-float,$(PLATFORM_RELFLAGS)) +PLATFORM_CPPFLAGS := $(filter-out -march=armv5t,$(PLATFORM_CPPFLAGS)) diff --git a/arch/arm/cpu/arm1176/bcm2835/lowlevel_init.S b/arch/arm/cpu/arm1176/bcm2835/lowlevel_init.S new file mode 100644 index 0000000..c7b0843 --- /dev/null +++ b/arch/arm/cpu/arm1176/bcm2835/lowlevel_init.S @@ -0,0 +1,19 @@ +/* + * (C) Copyright 2012 Stephen Warren + * + * 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 + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +.globl lowlevel_init +lowlevel_init: + mov pc, lr diff --git a/arch/arm/cpu/arm1176/bcm2835/reset.c b/arch/arm/cpu/arm1176/bcm2835/reset.c new file mode 100644 index 0000000..69c9577 --- /dev/null +++ b/arch/arm/cpu/arm1176/bcm2835/reset.c @@ -0,0 +1,27 @@ +/* + * (C) Copyright 2012 Stephen Warren + * + * 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 + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include <common.h> +#include <asm/io.h> + +void reset_cpu(ulong addr) +{ + /* + * We should probably use the WDT module here, but an unaligned + * access will do the trick for now. + */ + readl(1); +} diff --git a/arch/arm/cpu/arm1176/bcm2835/timer.c b/arch/arm/cpu/arm1176/bcm2835/timer.c new file mode 100644 index 0000000..d232d7e --- /dev/null +++ b/arch/arm/cpu/arm1176/bcm2835/timer.c @@ -0,0 +1,55 @@ +/* + * (C) Copyright 2012 Stephen Warren + * + * 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 + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include <common.h> +#include <asm/io.h> +#include <asm/arch/timer.h> + +int timer_init(void) +{ + return 0; +} + +ulong get_timer(ulong base) +{ + struct bcm2835_timer_regs *regs = + (struct bcm2835_timer_regs *)BCM2835_TIMER_PHYSADDR; + + return readl(®s->clo) - base; +} + +unsigned long long get_ticks(void) +{ + return get_timer(0); +} + +ulong get_tbclk(void) +{ + return CONFIG_SYS_HZ; +} + +void __udelay(unsigned long usec) +{ + ulong endtime; + signed long diff; + + endtime = get_timer(0) + usec; + + do { + ulong now = get_timer(0); + diff = endtime - now; + } while (diff >= 0); +} diff --git a/arch/arm/include/asm/arch-bcm2835/timer.h b/arch/arm/include/asm/arch-bcm2835/timer.h new file mode 100644 index 0000000..30c70e0 --- /dev/null +++ b/arch/arm/include/asm/arch-bcm2835/timer.h @@ -0,0 +1,37 @@ +/* + * (C) Copyright 2012 Stephen Warren + * + * 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 + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#ifndef _BCM2835_TIMER_H +#define _BCM2835_TIMER_H + +#define BCM2835_TIMER_PHYSADDR 0x20003000 + +struct bcm2835_timer_regs { + u32 cs; + u32 clo; + u32 chi; + u32 c0; + u32 c1; + u32 c2; + u32 c3; +}; + +#define BCM2835_TIMER_CS_M3 (1 << 3) +#define BCM2835_TIMER_CS_M2 (1 << 2) +#define BCM2835_TIMER_CS_M1 (1 << 1) +#define BCM2835_TIMER_CS_M0 (1 << 0) + +#endif

The Raspberry Pi model B uses the BCM2835 SoC, has 256MB of RAM, contains an SMSC 9512 USB LAN/Hub chip, and various IO connectors. For more details, see http://www.raspberrypi.org/.
Signed-off-by: Stephen Warren swarren@wwwdotorg.org --- v2: Re-order defines slightly to drop a later cleanup patch. --- MAINTAINERS | 4 ++ board/raspberrypi/rpi_b/Makefile | 34 ++++++++++++++++ board/raspberrypi/rpi_b/rpi_b.c | 32 +++++++++++++++ boards.cfg | 1 + include/configs/rpi_b.h | 80 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 151 insertions(+) create mode 100644 board/raspberrypi/rpi_b/Makefile create mode 100644 board/raspberrypi/rpi_b/rpi_b.c create mode 100644 include/configs/rpi_b.h
diff --git a/MAINTAINERS b/MAINTAINERS index fd0c65c..abe621e 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -928,6 +928,10 @@ Stephen Warren swarren@nvidia.com trimslice Tegra2 (ARM7 & A9 Dual Core) whistler Tegra2 (ARM7 & A9 Dual Core)
+Stephen Warren swarren@wwwdotorg.org + + rpi_b BCM2835 (ARM1176) + Thomas Weber weber@corscience.de
devkit8000 ARM ARMV7 (OMAP3530 SoC) diff --git a/board/raspberrypi/rpi_b/Makefile b/board/raspberrypi/rpi_b/Makefile new file mode 100644 index 0000000..9d0c377 --- /dev/null +++ b/board/raspberrypi/rpi_b/Makefile @@ -0,0 +1,34 @@ +# +# 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 +# version 2 as published by the Free Software Foundation. +# +# 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. +# + +include $(TOPDIR)/config.mk + +LIB = $(obj)lib$(BOARD).o + +COBJS := $(BOARD).o + +SRCS := $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(COBJS)) + +$(LIB): $(obj).depend $(OBJS) + $(call cmd_link_o_target, $(OBJS)) + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/board/raspberrypi/rpi_b/rpi_b.c b/board/raspberrypi/rpi_b/rpi_b.c new file mode 100644 index 0000000..f39440f --- /dev/null +++ b/board/raspberrypi/rpi_b/rpi_b.c @@ -0,0 +1,32 @@ +/* + * (C) Copyright 2012 Stephen Warren + * + * 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 + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#include <common.h> +#include <asm/global_data.h> + +DECLARE_GLOBAL_DATA_PTR; + +int dram_init(void) +{ + gd->ram_size = SZ_256M; + + return 0; +} + +int board_init(void) +{ + return 0; +} diff --git a/boards.cfg b/boards.cfg index 2d36d83..7a88eb9 100644 --- a/boards.cfg +++ b/boards.cfg @@ -48,6 +48,7 @@ mx35pdk arm arm1136 - freesca apollon arm arm1136 apollon - omap24xx omap2420h4 arm arm1136 - ti omap24xx tnetv107x_evm arm arm1176 tnetv107xevm ti tnetv107x +rpi_b arm arm1176 rpi_b raspberrypi bcm2835 integratorap_cm720t arm arm720t integrator armltd - integratorap:CM720T integratorap_cm920t arm arm920t integrator armltd - integratorap:CM920T integratorcp_cm920t arm arm920t integrator armltd - integratorcp:CM920T diff --git a/include/configs/rpi_b.h b/include/configs/rpi_b.h new file mode 100644 index 0000000..28e5510 --- /dev/null +++ b/include/configs/rpi_b.h @@ -0,0 +1,80 @@ +/* + * (C) Copyright 2012 Stephen Warren + * + * 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 + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#ifndef __CONFIG_H +#define __CONFIG_H + +#include <asm/sizes.h> + +/* Architecture, CPU, etc.*/ +#define CONFIG_ARM1176 +#define CONFIG_BCM2835 + +/* Timer */ +#define CONFIG_SYS_HZ 1000000 + +/* Memory layout */ +#define CONFIG_NR_DRAM_BANKS 1 +#define CONFIG_SYS_SDRAM_BASE 0x00000000 +#define CONFIG_SYS_TEXT_BASE 0x00008000 +#define CONFIG_SYS_UBOOT_BASE CONFIG_SYS_TEXT_BASE +#define CONFIG_SYS_INIT_RAM_SIZE SZ_4K +#define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_SDRAM_BASE + \ + CONFIG_SYS_INIT_RAM_SIZE - \ + GENERATED_GBL_DATA_SIZE) +#define CONFIG_SYS_MALLOC_LEN SZ_4M +#define CONFIG_SYS_MEMTEST_START 0x00100000 +#define CONFIG_SYS_MEMTEST_END 0x00200000 + +/* Flash */ +#define CONFIG_SYS_NO_FLASH + +/* Devices */ +/* None yet */ + +/* Console UART */ +#define CONFIG_PL011_SERIAL +#define CONFIG_PL011_CLOCK 3000000 +#define CONFIG_PL01x_PORTS { (void *)0x20201000 } +#define CONFIG_CONS_INDEX 0 +#define CONFIG_BAUDRATE 115200 +#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 } + +/* Console configuration */ +#define CONFIG_SYS_CBSIZE 1024 +#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + \ + sizeof(CONFIG_SYS_PROMPT) + 16) + +/* Environment */ +#define CONFIG_ENV_SIZE SZ_16K +#define CONFIG_ENV_IS_NOWHERE +#define CONFIG_SYS_LOAD_ADDR 0x1000000 + +/* Shell */ +#define CONFIG_SYS_HUSH_PARSER +#define CONFIG_SYS_MAXARGS 8 +#define CONFIG_SYS_PROMPT "U-Boot> " +#define CONFIG_SYS_PROMPT_HUSH_PS2 "> " +#define CONFIG_SYS_LONGHELP +#define CONFIG_CMDLINE_EDITING +#define CONFIG_COMMAND_HISTORY +#define CONFIG_AUTO_COMPLETE + +/* Commands */ +#define CONFIG_CMD_MEMORY +#define CONFIG_CMD_MISC + +#endif

On Tue, Jul 31, 2012 at 10:13:33PM -0600, Stephen Warren wrote:
The Raspberry Pi model B uses the BCM2835 SoC, has 256MB of RAM, contains an SMSC 9512 USB LAN/Hub chip, and various IO connectors. For more details, see http://www.raspberrypi.org/.
Signed-off-by: Stephen Warren swarren@wwwdotorg.org
[snip]
+int dram_init(void) +{
- gd->ram_size = SZ_256M;
- return 0;
+}
You should use get_ram_size(CONFIG_SYS_SDRAM_BASE, max-possible-dram-size); I say this as I just found a "oh, so that's why mainline reports the right amount of memory and other tree does not" bug yesterday. This should also be in the SoC-generic code area (like say arch/arm/cpu/arm1176/bcm2835/board.c). Sorry I didn't spot this last go-round.
[snip]
+#define CONFIG_SYS_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 }
This is the table now in <config_fallbacks.h> which is auto-included.
+#define CONFIG_SYS_PROMPT_HUSH_PS2 "> "
This is now the default prompt value, so you can drop this line.

On Wed, Aug 01, 2012 at 09:19:15AM -0700, Tom Rini wrote:
On Tue, Jul 31, 2012 at 10:13:33PM -0600, Stephen Warren wrote:
The Raspberry Pi model B uses the BCM2835 SoC, has 256MB of RAM, contains an SMSC 9512 USB LAN/Hub chip, and various IO connectors. For more details, see http://www.raspberrypi.org/.
Signed-off-by: Stephen Warren swarren@wwwdotorg.org
[snip]
+int dram_init(void) +{
- gd->ram_size = SZ_256M;
- return 0;
+}
You should use get_ram_size(CONFIG_SYS_SDRAM_BASE, max-possible-dram-size); I say this as I just found a "oh, so that's why mainline reports the right amount of memory and other tree does not" bug yesterday. This should also be in the SoC-generic code area (like say arch/arm/cpu/arm1176/bcm2835/board.c). Sorry I didn't spot this last go-round.
I forgot about the video co-processor change later in the series, so you can disregard this specific comment. But I have some still applicable comments I'm going to add to the 0/13 patch now.

Note that this affects all users of the ARM1176 CPU that enable CONFIG_ARCH_CPU_INIT, not just the BCM2835 SoC, potentially such as tnetv107x.
Cc: Cyril Chemparathy cyril@ti.com Signed-off-by: Stephen Warren swarren@wwwdotorg.org --- arch/arm/cpu/arm1176/cpu.c | 7 +++++++ 1 file changed, 7 insertions(+)
diff --git a/arch/arm/cpu/arm1176/cpu.c b/arch/arm/cpu/arm1176/cpu.c index c0fd114..532a90b 100644 --- a/arch/arm/cpu/arm1176/cpu.c +++ b/arch/arm/cpu/arm1176/cpu.c @@ -65,3 +65,10 @@ static void cache_flush (void) /* mem barrier to sync things */ asm ("mcr p15, 0, %0, c7, c10, 4": :"r" (0)); } + +int arch_cpu_init(void) +{ + icache_enable(); + + return 0; +}

This causes arch_cpu_init() to be called, which enables the icache.
Extracted from work by Oleksandr Tymoshenko gonzo@bluezbox.com.
Signed-off-by: Stephen Warren swarren@wwwdotorg.org --- include/configs/rpi_b.h | 1 + 1 file changed, 1 insertion(+)
diff --git a/include/configs/rpi_b.h b/include/configs/rpi_b.h index 28e5510..9020d80 100644 --- a/include/configs/rpi_b.h +++ b/include/configs/rpi_b.h @@ -22,6 +22,7 @@ /* Architecture, CPU, etc.*/ #define CONFIG_ARM1176 #define CONFIG_BCM2835 +#define CONFIG_ARCH_CPU_INIT
/* Timer */ #define CONFIG_SYS_HZ 1000000

Use MACH_TYPE_BCM2708 as the Linux machine type for the Raspberry Pi.
The Raspberry Pi actually uses a BCM2835. However, the 2835 this is apparently a SKU in a series for which the BCM2708 is the first or perhaps primary version, such that the 2708 name has historically been used for this purpose.
Extracted from work by Oleksandr Tymoshenko gonzo@bluezbox.com.
Signed-off-by: Stephen Warren swarren@wwwdotorg.org --- include/configs/rpi_b.h | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/include/configs/rpi_b.h b/include/configs/rpi_b.h index 9020d80..0a3681d 100644 --- a/include/configs/rpi_b.h +++ b/include/configs/rpi_b.h @@ -23,6 +23,11 @@ #define CONFIG_ARM1176 #define CONFIG_BCM2835 #define CONFIG_ARCH_CPU_INIT +/* + * 2835 is a SKU in a series for which the 2708 is the first or primary SoC, + * so 2708 has historically been used rather than a dedicated 2835 ID. + */ +#define CONFIG_MACH_TYPE MACH_TYPE_BCM2708
/* Timer */ #define CONFIG_SYS_HZ 1000000

This enables a more typical default set of commands. Remove explicit enables for commands already in the default list.
Signed-off-by: Stephen Warren swarren@wwwdotorg.org --- v2: Use <> not "" for #include of config_cmd_default.h --- include/configs/rpi_b.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/include/configs/rpi_b.h b/include/configs/rpi_b.h index 0a3681d..f34cc03 100644 --- a/include/configs/rpi_b.h +++ b/include/configs/rpi_b.h @@ -80,7 +80,11 @@ #define CONFIG_AUTO_COMPLETE
/* Commands */ -#define CONFIG_CMD_MEMORY -#define CONFIG_CMD_MISC +#include <config_cmd_default.h> +/* Some things don't make sense on this HW or yet */ +#undef CONFIG_CMD_FPGA +#undef CONFIG_CMD_NET +#undef CONFIG_CMD_NFS +#undef CONFIG_CMD_SAVEENV
#endif

CONFIG_OF_LIBFDT allows bootm/bootz to pass a device tree to the kernel.
Set bi_boot_params to define where ATAGs will be written (extracted from work by Oleksandr Tymoshenko gonzo@bluezbox.com).
Add ATAG support for bootm/bootz. Newer kernels use device tree, so this isn't that useful. However, old kernels all use board files, so this might still see some use.
Enable bootz command to allow booting a zImage directly.
Signed-off-by: Stephen Warren swarren@wwwdotorg.org --- v2: Squashed the following commits into one: ARM: rpi_b: add ATAG support for bootm/bootz ARM: rpi_b: set bi_boot_params ARM: rpi_b: enable CONFIG_OF_LIBFDT ARM: rpi_b: enabled bootz command --- board/raspberrypi/rpi_b/rpi_b.c | 2 ++ include/configs/rpi_b.h | 8 ++++++++ 2 files changed, 10 insertions(+)
diff --git a/board/raspberrypi/rpi_b/rpi_b.c b/board/raspberrypi/rpi_b/rpi_b.c index f39440f..26df74b 100644 --- a/board/raspberrypi/rpi_b/rpi_b.c +++ b/board/raspberrypi/rpi_b/rpi_b.c @@ -28,5 +28,7 @@ int dram_init(void)
int board_init(void) { + gd->bd->bi_boot_params = 0x100; + return 0; } diff --git a/include/configs/rpi_b.h b/include/configs/rpi_b.h index f34cc03..9c96d0e 100644 --- a/include/configs/rpi_b.h +++ b/include/configs/rpi_b.h @@ -81,10 +81,18 @@
/* Commands */ #include <config_cmd_default.h> +#define CONFIG_CMD_BOOTZ /* Some things don't make sense on this HW or yet */ #undef CONFIG_CMD_FPGA #undef CONFIG_CMD_NET #undef CONFIG_CMD_NFS #undef CONFIG_CMD_SAVEENV
+/* Device tree support for bootm/bootz */ +#define CONFIG_OF_LIBFDT +/* ATAGs support for bootm/bootz */ +#define CONFIG_SETUP_MEMORY_TAGS +#define CONFIG_CMDLINE_TAG +#define CONFIG_INITRD_TAG + #endif

The board really has 256M. However, the VC (VideoCore co-processor) shares the RAM, and uses a configurable portion at the top. We tell U-Boot that a smaller amount of RAM is present in order to avoid stomping on the area the VC uses.
Extracted from work by Oleksandr Tymoshenko gonzo@bluezbox.com.
Signed-off-by: Stephen Warren swarren@wwwdotorg.org --- v2: Modified location new define was inserted, in order to drop a later cleanup patch. --- board/raspberrypi/rpi_b/rpi_b.c | 2 +- include/configs/rpi_b.h | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/board/raspberrypi/rpi_b/rpi_b.c b/board/raspberrypi/rpi_b/rpi_b.c index 26df74b..688b0aa 100644 --- a/board/raspberrypi/rpi_b/rpi_b.c +++ b/board/raspberrypi/rpi_b/rpi_b.c @@ -21,7 +21,7 @@ DECLARE_GLOBAL_DATA_PTR;
int dram_init(void) { - gd->ram_size = SZ_256M; + gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
return 0; } diff --git a/include/configs/rpi_b.h b/include/configs/rpi_b.h index 9c96d0e..73482d9 100644 --- a/include/configs/rpi_b.h +++ b/include/configs/rpi_b.h @@ -37,6 +37,13 @@ #define CONFIG_SYS_SDRAM_BASE 0x00000000 #define CONFIG_SYS_TEXT_BASE 0x00008000 #define CONFIG_SYS_UBOOT_BASE CONFIG_SYS_TEXT_BASE +/* + * The board really has 256M. However, the VC (VideoCore co-processor) shares + * the RAM, and uses a configurable portion at the top. We tell U-Boot that a + * smaller amount of RAM is present in order to avoid stomping on the area + * the VC uses. + */ +#define CONFIG_SYS_SDRAM_SIZE SZ_128M #define CONFIG_SYS_INIT_RAM_SIZE SZ_4K #define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_SDRAM_BASE + \ CONFIG_SYS_INIT_RAM_SIZE - \

Move the top-of-stack from 32k to near the top of RAM. This leaves the bottom of RAM free for ATAGs, or U-Boot scripts to use as they see fit.
Extracted from work by Oleksandr Tymoshenko gonzo@bluezbox.com.
Signed-off-by: Stephen Warren swarren@wwwdotorg.org --- include/configs/rpi_b.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/include/configs/rpi_b.h b/include/configs/rpi_b.h index 73482d9..33169d3 100644 --- a/include/configs/rpi_b.h +++ b/include/configs/rpi_b.h @@ -44,9 +44,8 @@ * the VC uses. */ #define CONFIG_SYS_SDRAM_SIZE SZ_128M -#define CONFIG_SYS_INIT_RAM_SIZE SZ_4K #define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_SDRAM_BASE + \ - CONFIG_SYS_INIT_RAM_SIZE - \ + CONFIG_SYS_SDRAM_SIZE - \ GENERATED_GBL_DATA_SIZE) #define CONFIG_SYS_MALLOC_LEN SZ_4M #define CONFIG_SYS_MEMTEST_START 0x00100000

Signed-off-by: Stephen Warren swarren@wwwdotorg.org --- arch/arm/cpu/arm1176/bcm2835/reset.c | 18 +++++++++++---- arch/arm/include/asm/arch-bcm2835/wdog.h | 37 ++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 arch/arm/include/asm/arch-bcm2835/wdog.h
diff --git a/arch/arm/cpu/arm1176/bcm2835/reset.c b/arch/arm/cpu/arm1176/bcm2835/reset.c index 69c9577..8c37ad9 100644 --- a/arch/arm/cpu/arm1176/bcm2835/reset.c +++ b/arch/arm/cpu/arm1176/bcm2835/reset.c @@ -16,12 +16,20 @@
#include <common.h> #include <asm/io.h> +#include <asm/arch/wdog.h> + +#define RESET_TIMEOUT 10
void reset_cpu(ulong addr) { - /* - * We should probably use the WDT module here, but an unaligned - * access will do the trick for now. - */ - readl(1); + struct bcm2835_wdog_regs *regs = + (struct bcm2835_wdog_regs *)BCM2835_WDOG_PHYSADDR; + uint32_t rstc; + + rstc = readl(®s->rstc); + rstc &= ~BCM2835_WDOG_RSTC_WRCFG_MASK; + rstc |= BCM2835_WDOG_RSTC_WRCFG_FULL_RESET; + + writel(BCM2835_WDOG_PASSWORD | RESET_TIMEOUT, ®s->wdog); + writel(BCM2835_WDOG_PASSWORD | rstc, ®s->rstc); } diff --git a/arch/arm/include/asm/arch-bcm2835/wdog.h b/arch/arm/include/asm/arch-bcm2835/wdog.h new file mode 100644 index 0000000..d750a62 --- /dev/null +++ b/arch/arm/include/asm/arch-bcm2835/wdog.h @@ -0,0 +1,37 @@ +/* + * (C) Copyright 2012 Stephen Warren + * + * 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 + * version 2 as published by the Free Software Foundation. + * + * 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. + */ + +#ifndef _BCM2835_TIMER_H +#define _BCM2835_TIMER_H + +#define BCM2835_WDOG_PHYSADDR 0x20100000 + +struct bcm2835_wdog_regs { + u32 unknown0[7]; + u32 rstc; + u32 unknown1; + u32 wdog; +}; + +#define BCM2835_WDOG_PASSWORD 0x5a000000 + +#define BCM2835_WDOG_RSTC_WRCFG_MASK 0x00000030 +#define BCM2835_WDOG_RSTC_WRCFG_FULL_RESET 0x00000020 + +#define BCM2835_WDOG_WDOG_TIMEOUT_MASK 0x0000ffff + +#endif +

From: Vikram Narayanan vikram186@gmail.com
Driver for BCM2835 SoC. This gives the basic functionality of setting/clearing the output.
swarren: * Fix BCM2835_GPIO_BASE; 0x7e200000 is the address on the "VC" CPU, not the ARM CPU. * Fix BCM2835_GPIO_ALT* values to match datasheet. * Invert gpio_request return value. * Add missing & to writel() address parameters in gpio_direction_input(), gpio_direction_output(), and gpio_set_value(). * Fix gpio_direction_input() and gpio_direction_output() to return something, to avoid compiler warnings. * Fix gpio_direction_output() to always call gpio_set_value(), not just when the requested value is 1. * s/bcm_gpio_regs/bcm2835_gpio_regs/g since this driver is specific to BCM2835, and most likely not all Broadcom chips. * Remove FSF address from (c) notices, so we don't have to maintain it. * Fix some indentation errors.
Signed-off-by: Vikram Narayanan vikram186@gmail.com Signed-off-by: Stephen Warren swarren@wwwdotorg.org --- v2: New patch --- arch/arm/include/asm/arch-bcm2835/gpio.h | 66 ++++++++++++++++++++++ drivers/gpio/Makefile | 1 + drivers/gpio/bcm2835_gpio.c | 90 ++++++++++++++++++++++++++++++ 3 files changed, 157 insertions(+) create mode 100644 arch/arm/include/asm/arch-bcm2835/gpio.h create mode 100644 drivers/gpio/bcm2835_gpio.c
diff --git a/arch/arm/include/asm/arch-bcm2835/gpio.h b/arch/arm/include/asm/arch-bcm2835/gpio.h new file mode 100644 index 0000000..c0178cb --- /dev/null +++ b/arch/arm/include/asm/arch-bcm2835/gpio.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2012 Vikram Narayananan + * vikram186@gmail.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. + */ + +#ifndef _BCM2835_GPIO_H_ +#define _BCM2835_GPIO_H_ + +#define BCM2835_GPIO_BASE 0x20200000 +#define BCM2835_GPIO_COUNT 53 + +#define BCM2835_GPIO_FSEL_MASK 0x7 +#define BCM2835_GPIO_INPUT 0x0 +#define BCM2835_GPIO_OUTPUT 0x1 +#define BCM2835_GPIO_ALT0 0x4 +#define BCM2835_GPIO_ALT1 0x5 +#define BCM2835_GPIO_ALT2 0x6 +#define BCM2835_GPIO_ALT3 0x7 +#define BCM2835_GPIO_ALT4 0x3 +#define BCM2835_GPIO_ALT5 0x2 + +#define BCM2835_GPIO_COMMON_BANK(gpio) ((gpio < 32) ? 0 : 1) +#define BCM2835_GPIO_COMMON_SHIFT(gpio) (gpio & 0x1f) + +#define BCM2835_GPIO_FSEL_BANK(gpio) (gpio / 10) +#define BCM2835_GPIO_FSEL_SHIFT(gpio) ((gpio % 10) * 3) + +struct bcm2835_gpio_regs { + u32 gpfsel[6]; + u32 reserved1; + u32 gpset[2]; + u32 reserved2; + u32 gpclr[2]; + u32 reserved3; + u32 gplev[2]; + u32 reserved4; + u32 gpeds[2]; + u32 reserved5; + u32 gpren[2]; + u32 reserved6; + u32 gpfen[2]; + u32 reserved7; + u32 gphen[2]; + u32 reserved8; + u32 gplen[2]; + u32 reserved9; + u32 gparen[2]; + u32 reserved10; + u32 gppud; + u32 gppudclk[2]; +}; + +#endif /* _BCM2835_GPIO_H_ */ diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile index 32a2474..8d2f2b2 100644 --- a/drivers/gpio/Makefile +++ b/drivers/gpio/Makefile @@ -40,6 +40,7 @@ COBJS-$(CONFIG_TEGRA_GPIO) += tegra_gpio.o COBJS-$(CONFIG_DA8XX_GPIO) += da8xx_gpio.o COBJS-$(CONFIG_ALTERA_PIO) += altera_pio.o COBJS-$(CONFIG_MPC83XX_GPIO) += mpc83xx_gpio.o +COBJS-$(CONFIG_BCM2835_GPIO) += bcm2835_gpio.o
COBJS := $(COBJS-y) SRCS := $(COBJS:.o=.c) diff --git a/drivers/gpio/bcm2835_gpio.c b/drivers/gpio/bcm2835_gpio.c new file mode 100644 index 0000000..6ab2df3 --- /dev/null +++ b/drivers/gpio/bcm2835_gpio.c @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2012 Vikram Narayananan + * vikram186@gmail.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. + */ + +#include <common.h> +#include <asm/gpio.h> +#include <asm/io.h> + +inline int gpio_is_valid(unsigned gpio) +{ + return (gpio < BCM2835_GPIO_COUNT); +} + +int gpio_request(unsigned gpio, const char *label) +{ + return !gpio_is_valid(gpio); +} + +int gpio_free(unsigned gpio) +{ + return 0; +} + +int gpio_direction_input(unsigned gpio) +{ + struct bcm2835_gpio_regs *reg = + (struct bcm2835_gpio_regs *)BCM2835_GPIO_BASE; + unsigned val; + + val = readl(®->gpfsel[BCM2835_GPIO_FSEL_BANK(gpio)]); + val &= ~(BCM2835_GPIO_FSEL_MASK << BCM2835_GPIO_FSEL_SHIFT(gpio)); + val |= (BCM2835_GPIO_INPUT << BCM2835_GPIO_FSEL_SHIFT(gpio)); + writel(val, ®->gpfsel[BCM2835_GPIO_FSEL_BANK(gpio)]); + + return 0; +} + +int gpio_direction_output(unsigned gpio, int value) +{ + struct bcm2835_gpio_regs *reg = + (struct bcm2835_gpio_regs *)BCM2835_GPIO_BASE; + unsigned val; + + gpio_set_value(gpio, value); + + val = readl(®->gpfsel[BCM2835_GPIO_FSEL_BANK(gpio)]); + val &= ~(BCM2835_GPIO_FSEL_MASK << BCM2835_GPIO_FSEL_SHIFT(gpio)); + val |= (BCM2835_GPIO_OUTPUT << BCM2835_GPIO_FSEL_SHIFT(gpio)); + writel(val, ®->gpfsel[BCM2835_GPIO_FSEL_BANK(gpio)]); + + return 0; +} + +int gpio_get_value(unsigned gpio) +{ + struct bcm2835_gpio_regs *reg = + (struct bcm2835_gpio_regs *)BCM2835_GPIO_BASE; + unsigned val; + + val = readl(®->gplev[BCM2835_GPIO_COMMON_BANK(gpio)]); + + return (val >> BCM2835_GPIO_COMMON_SHIFT(gpio)) & 0x1; +} + +int gpio_set_value(unsigned gpio, int value) +{ + struct bcm2835_gpio_regs *reg = + (struct bcm2835_gpio_regs *)BCM2835_GPIO_BASE; + u32 *output_reg = value ? reg->gpset : reg->gpclr; + + writel(1 << BCM2835_GPIO_COMMON_SHIFT(gpio), + &output_reg[BCM2835_GPIO_COMMON_BANK(gpio)]); + + return 0; +} +

From: Vikram Narayanan vikram186@gmail.com
Add the driver to the default config
swarren: Enable CONFIG_CMD_GPIO, so you can actually use the driver.
Signed-off-by: Vikram Narayanan vikram186@gmail.com Signed-off-by: Stephen Warren swarren@wwwdotorg.org --- v2: New patch --- include/configs/rpi_b.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/include/configs/rpi_b.h b/include/configs/rpi_b.h index 33169d3..5c91e7d 100644 --- a/include/configs/rpi_b.h +++ b/include/configs/rpi_b.h @@ -55,7 +55,8 @@ #define CONFIG_SYS_NO_FLASH
/* Devices */ -/* None yet */ +/* GPIO */ +#define CONFIG_BCM2835_GPIO
/* Console UART */ #define CONFIG_PL011_SERIAL @@ -88,6 +89,7 @@ /* Commands */ #include <config_cmd_default.h> #define CONFIG_CMD_BOOTZ +#define CONFIG_CMD_GPIO /* Some things don't make sense on this HW or yet */ #undef CONFIG_CMD_FPGA #undef CONFIG_CMD_NET

On Tue, Jul 31, 2012 at 10:13:30PM -0600, Stephen Warren wrote:
This series adds basic support for the Raspberry Pi ARM board.
v2:
- Add README config_cmd_default.h documentation fix.
- Use <> not "" for include of config_cmd_default.h.
- Squash together 3 patches related to enabling booting a Linux kernel.
- Minor rpi_b.h order changes in order to drop later cleanup patch.
- Merged together 2 patch series of mine, and the GPIO series from Vikram.
Stephen Warren (11): README: fix references to config_cmd_default.h ARM: add basic support for the Broadcom BCM2835 SoC ARM: bcm2835: add Raspberry Pi model B board ARM: arm1176: enable instruction cache in arch_cpu_init() ARM: rpi_b: enable CONFIG_ARCH_CPU_INIT for icache ARM: rpi_b: define CONFIG_MACH_TYPE ARM: rpi_b: include config_cmd_default.h ARM: rpi_b: enable booting the Linux kernel ARM: rpi_b: drop RAM size to 128M ARM: rpi_b: move stack to top of RAM ARM: bcm2835: implement reset using watchdog
I think some of these should be collapsed. Implement reset using the watchdog in the first SoC commit. Add a fully functional rpi_b config / board file from the get-go (with a why we limit to 128MB DRAM) and just credit the folks that did parts X/Y/Z in the commit message.
participants (2)
-
Stephen Warren
-
Tom Rini