This SoC is used in the Raspberry Pi, for example. For more details, see: http://www.broadcom.com/products/BCM2835 http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf. Initial support is enough to boot to a serial console, execute a minimal set of U-Boot commands, download data over a serial port, and boot a Linux kernel. No storage or network drivers are implemented. GPIO driver originally by Vikram Narayanan <vikram186@gmail.com> with many fixes from myself. Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>master
parent
86c632651d
commit
efad6cf881
@ -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 |
||||
|
||||
#########################################################################
|
@ -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))
|
@ -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 |
@ -0,0 +1,35 @@ |
||||
/*
|
||||
* (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/wdog.h> |
||||
|
||||
#define RESET_TIMEOUT 10 |
||||
|
||||
void reset_cpu(ulong addr) |
||||
{ |
||||
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); |
||||
} |
@ -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); |
||||
} |
@ -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 54 |
||||
|
||||
#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_ */ |
@ -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 |
@ -0,0 +1,36 @@ |
||||
/*
|
||||
* (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 |
@ -0,0 +1,89 @@ |
||||
/*
|
||||
* 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; |
||||
} |
Loading…
Reference in new issue