From c32b1efa43e31bd9a8a7eae3623664d00c34d842 Mon Sep 17 00:00:00 2001 From: Alan Cudmore Date: Sat, 23 Mar 2013 19:13:07 +0100 Subject: bsp/raspberrypi: New BSP --- c/src/lib/libbsp/arm/raspberrypi/Makefile.am | 154 ++++++++++++++++ c/src/lib/libbsp/arm/raspberrypi/README | 65 +++++++ c/src/lib/libbsp/arm/raspberrypi/bsp_specs | 13 ++ c/src/lib/libbsp/arm/raspberrypi/clock/clockdrv.c | 91 ++++++++++ c/src/lib/libbsp/arm/raspberrypi/configure.ac | 31 ++++ .../arm/raspberrypi/console/console-config.c | 53 ++++++ c/src/lib/libbsp/arm/raspberrypi/console/usart.c | 160 +++++++++++++++++ c/src/lib/libbsp/arm/raspberrypi/include/bsp.h | 38 ++++ c/src/lib/libbsp/arm/raspberrypi/include/irq.h | 62 +++++++ c/src/lib/libbsp/arm/raspberrypi/include/mmu.h | 68 ++++++++ .../libbsp/arm/raspberrypi/include/raspberrypi.h | 194 +++++++++++++++++++++ c/src/lib/libbsp/arm/raspberrypi/include/usart.h | 26 +++ c/src/lib/libbsp/arm/raspberrypi/irq/irq.c | 124 +++++++++++++ .../arm/raspberrypi/make/custom/raspberrypi.cfg | 22 +++ c/src/lib/libbsp/arm/raspberrypi/misc/timer.c | 49 ++++++ c/src/lib/libbsp/arm/raspberrypi/preinstall.am | 140 +++++++++++++++ .../lib/libbsp/arm/raspberrypi/startup/bspreset.c | 35 ++++ .../lib/libbsp/arm/raspberrypi/startup/bspstart.c | 29 +++ .../libbsp/arm/raspberrypi/startup/bspstarthooks.c | 114 ++++++++++++ c/src/lib/libbsp/arm/raspberrypi/startup/linkcmds | 62 +++++++ 20 files changed, 1530 insertions(+) create mode 100644 c/src/lib/libbsp/arm/raspberrypi/Makefile.am create mode 100644 c/src/lib/libbsp/arm/raspberrypi/README create mode 100644 c/src/lib/libbsp/arm/raspberrypi/bsp_specs create mode 100644 c/src/lib/libbsp/arm/raspberrypi/clock/clockdrv.c create mode 100644 c/src/lib/libbsp/arm/raspberrypi/configure.ac create mode 100644 c/src/lib/libbsp/arm/raspberrypi/console/console-config.c create mode 100644 c/src/lib/libbsp/arm/raspberrypi/console/usart.c create mode 100644 c/src/lib/libbsp/arm/raspberrypi/include/bsp.h create mode 100644 c/src/lib/libbsp/arm/raspberrypi/include/irq.h create mode 100644 c/src/lib/libbsp/arm/raspberrypi/include/mmu.h create mode 100644 c/src/lib/libbsp/arm/raspberrypi/include/raspberrypi.h create mode 100644 c/src/lib/libbsp/arm/raspberrypi/include/usart.h create mode 100644 c/src/lib/libbsp/arm/raspberrypi/irq/irq.c create mode 100644 c/src/lib/libbsp/arm/raspberrypi/make/custom/raspberrypi.cfg create mode 100644 c/src/lib/libbsp/arm/raspberrypi/misc/timer.c create mode 100644 c/src/lib/libbsp/arm/raspberrypi/preinstall.am create mode 100644 c/src/lib/libbsp/arm/raspberrypi/startup/bspreset.c create mode 100644 c/src/lib/libbsp/arm/raspberrypi/startup/bspstart.c create mode 100644 c/src/lib/libbsp/arm/raspberrypi/startup/bspstarthooks.c create mode 100644 c/src/lib/libbsp/arm/raspberrypi/startup/linkcmds (limited to 'c/src/lib/libbsp/arm/raspberrypi') diff --git a/c/src/lib/libbsp/arm/raspberrypi/Makefile.am b/c/src/lib/libbsp/arm/raspberrypi/Makefile.am new file mode 100644 index 0000000000..24d396c70b --- /dev/null +++ b/c/src/lib/libbsp/arm/raspberrypi/Makefile.am @@ -0,0 +1,154 @@ +## +# +# @file +# +# @brief Makefile of LibBSP for the raspberrypi board. +# + +ACLOCAL_AMFLAGS = -I ../../../../aclocal + +include $(top_srcdir)/../../../../automake/compile.am + +include_bspdir = $(includedir)/bsp +include_libcpudir = $(includedir)/libcpu + +dist_project_lib_DATA = bsp_specs + +############################################################################### +# Header # +############################################################################### + +include_HEADERS = include/bsp.h +include_HEADERS += ../../shared/include/tm27.h + +nodist_include_HEADERS = ../../shared/include/coverhd.h \ + include/bspopts.h + +nodist_include_bsp_HEADERS = ../../shared/include/bootcard.h + +include_bsp_HEADERS = +include_bsp_HEADERS += ../../shared/include/utility.h +include_bsp_HEADERS += ../../shared/include/irq-generic.h +include_bsp_HEADERS += ../../shared/include/irq-info.h +include_bsp_HEADERS += ../../shared/include/stackalloc.h +include_bsp_HEADERS += ../../shared/include/uart-output-char.h +include_bsp_HEADERS += ../../shared/tod.h +include_bsp_HEADERS += ../shared/include/linker-symbols.h +include_bsp_HEADERS += ../shared/include/start.h +include_bsp_HEADERS += ../shared/lpc/include/lpc-timer.h +include_bsp_HEADERS += ../shared/lpc/include/lpc-dma.h +include_bsp_HEADERS += include/irq.h +include_bsp_HEADERS += include/mmu.h +include_bsp_HEADERS += include/usart.h +include_bsp_HEADERS += include/raspberrypi.h + +include_libcpu_HEADERS = ../../../libcpu/arm/shared/include/cache_.h \ + ../../../libcpu/arm/shared/include/arm-cp15.h + +############################################################################### +# Data # +############################################################################### + +noinst_LIBRARIES = libbspstart.a + +libbspstart_a_SOURCES = ../shared/start/start.S + +project_lib_DATA = start.$(OBJEXT) + +project_lib_DATA += startup/linkcmds +project_lib_DATA += ../shared/startup/linkcmds.base + +EXTRA_DIST = startup/linkcmds + +############################################################################### +# LibBSP # +############################################################################### + +noinst_LIBRARIES += libbsp.a + +libbsp_a_SOURCES = +libbsp_a_CPPFLAGS = +libbsp_a_LIBADD = + +# Shared +libbsp_a_SOURCES += ../../shared/bootcard.c +libbsp_a_SOURCES += ../../shared/bspclean.c +libbsp_a_SOURCES += ../../shared/bspgetworkarea.c +libbsp_a_SOURCES += ../../shared/bsplibc.c +libbsp_a_SOURCES += ../../shared/bsppost.c +libbsp_a_SOURCES += ../../shared/bsppredriverhook.c +libbsp_a_SOURCES += ../../shared/bsppretaskinghook.c +libbsp_a_SOURCES += ../../shared/gnatinstallhandler.c +libbsp_a_SOURCES += ../../shared/sbrk.c +libbsp_a_SOURCES += ../../shared/src/stackalloc.c +libbsp_a_SOURCES += ../shared/abort/simple_abort.c +libbsp_a_SOURCES += ../shared/startup/bsp-start-memcpy.S + + +# Startup +libbsp_a_SOURCES += startup/bspreset.c +libbsp_a_SOURCES += startup/bspstart.c + +# IRQ +libbsp_a_SOURCES += ../../shared/src/irq-default-handler.c +libbsp_a_SOURCES += ../../shared/src/irq-generic.c +libbsp_a_SOURCES += ../../shared/src/irq-info.c +libbsp_a_SOURCES += ../../shared/src/irq-legacy.c +libbsp_a_SOURCES += ../../shared/src/irq-server.c +libbsp_a_SOURCES += ../../shared/src/irq-shell.c +libbsp_a_SOURCES += irq/irq.c + +# Console +libbsp_a_SOURCES += ../../shared/console.c +libbsp_a_SOURCES += ../../shared/console_control.c +libbsp_a_SOURCES += ../../shared/console_read.c +libbsp_a_SOURCES += ../../shared/console_select.c +libbsp_a_SOURCES += ../../shared/console_write.c +libbsp_a_SOURCES += console/console-config.c +libbsp_a_SOURCES += console/usart.c + +# clock +libbsp_a_SOURCES += clock/clockdrv.c ../../../shared/clockdrv_shell.h + +# Timer +libbsp_a_SOURCES += misc/timer.c + +# RTC + +# SSP + +# I2C + +# Cache +libbsp_a_SOURCES += ../../../libcpu/shared/src/cache_manager.c +libbsp_a_SOURCES += ../../../libcpu/arm/shared/include/cache_.h +libbsp_a_CPPFLAGS += -I$(srcdir)/../../../libcpu/arm/shared/include + +# Start hooks +libbsp_a_SOURCES += startup/bspstarthooks.c + +############################################################################### +# Network # +############################################################################### + +#if HAS_NETWORKING +# +#noinst_PROGRAMS = network.rel +# +#network_rel_SOURCES = ../shared/lpc/network/lpc-ethernet.c +#network_rel_CPPFLAGS = $(AM_CPPFLAGS) -D__INSIDE_RTEMS_BSD_TCPIP_STACK__ -D__BSD_VISIBLE +#network_rel_LDFLAGS = $(RTEMS_RELLDFLAGS) +# +# +#libbsp_a_LIBADD += network.rel +# +#endif + +############################################################################### +# Special Rules # +############################################################################### + +DISTCLEANFILES = include/bspopts.h + +include $(srcdir)/preinstall.am +include $(top_srcdir)/../../../../automake/local.am diff --git a/c/src/lib/libbsp/arm/raspberrypi/README b/c/src/lib/libbsp/arm/raspberrypi/README new file mode 100644 index 0000000000..d0c32a748d --- /dev/null +++ b/c/src/lib/libbsp/arm/raspberrypi/README @@ -0,0 +1,65 @@ +BSP for the Raspberry Pi ARM board +This is a basic port that should work on either Model A or Model B. + +It currently supports the following devices: + o Console using the PL011 UART0 + The console driver only works with polled mode right now, + the interrupt code is there, but it does not work yet. + The console driver is currently hardcoded at 115k 8N1 + o Clock uses the internal ARM timer + The Raspberry Pi can be overclocked through the config.txt file, this + would affect the duration of the clock tick. + o Benchmark timer reads the lower 32 bit GPU timer register + +To run an RTEMS binary, it must be stripped and loaded on the SD card along with +the following files: + bootcode.bin + config.txt + loader.bin + start.elf + kernel.img ( the RTEMS binary, you can change the name in config.txt ) + +These files can be obtained from a Linux installation image, or from here: +https://github.com/raspberrypi/firmware + +I used an old 256MB SD card to boot RTEMS. +Much more information about the SD card file and bootloader can be found here: +http://elinux.org/RPi_Hub +http://www.raspberrypi.org + +The linker script is set up for 128MB, so it can be used with a GPU/ARM split +of 128/128. +The bootloader that is used on the SD card determines the split of RAM between the +ARM and the GPU. It might make sense to adjust the GPU/ARM memory split to give +more memory to RTEMS, especially on a 512MB board. + +To do: + It would be nice to get support in the BSP for the following: + o SD card + o USB and USB 10/100 network chip on Model B + o SPI + o GPIO + o ARM MMU + o Graphics console + o Sound + +Credits and links: + + There is a wealth of code and information to reference on the raspberrypi.org bare metal forums: + http://www.raspberrypi.org/phpBB3/viewforum.php?f=72 + + I found information about how to program the timers, interrupts, and UART 0 + from the examples provided by: + + David Welch: + https://github.com/dwelch67/raspberrypi + The readme file at his github repository has valuable information about connecting a UART cable, JTAG etc. + + Steve Bate: + http://www.stevebate.net/chibios-rpi/GettingStarted.html + Steve provided a port of the Chibios RTOS to the raspberry Pi + + James Walmsley: + http://www.raspberrypi.org/phpBB3/viewtopic.php?f=72&t=22423 + James ported FreeRTOS to the raspberry Pi. + diff --git a/c/src/lib/libbsp/arm/raspberrypi/bsp_specs b/c/src/lib/libbsp/arm/raspberrypi/bsp_specs new file mode 100644 index 0000000000..082653ad22 --- /dev/null +++ b/c/src/lib/libbsp/arm/raspberrypi/bsp_specs @@ -0,0 +1,13 @@ +%rename endfile old_endfile +%rename startfile old_startfile +%rename link old_link + +*startfile: +%{!qrtems: %(old_startfile)} \ +%{!nostdlib: %{qrtems: start.o%s crti.o%s crtbegin.o%s -e _start}} + +*link: +%{!qrtems: %(old_link)} %{qrtems: -dc -dp -N} + +*endfile: +%{!qrtems: *(old_endfiles)} %{qrtems: crtend.o%s crtn.o%s } diff --git a/c/src/lib/libbsp/arm/raspberrypi/clock/clockdrv.c b/c/src/lib/libbsp/arm/raspberrypi/clock/clockdrv.c new file mode 100644 index 0000000000..d50ae32d1e --- /dev/null +++ b/c/src/lib/libbsp/arm/raspberrypi/clock/clockdrv.c @@ -0,0 +1,91 @@ +/* + * BCM2835 Clock driver + * + * Copyright (c) 2013 Alan Cudmore + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.rtems.com/license/LICENSE + * +*/ + +#include +#include +#include +#include + +/* This is defined in ../../../shared/clockdrv_shell.h */ +void Clock_isr(rtems_irq_hdl_param arg); + +static void raspberrypi_clock_at_tick(void) +{ + BCM2835_REG(BCM2835_TIMER_CLI) = 0; +} + +static void raspberrypi_clock_handler_install(void) +{ + rtems_status_code sc = RTEMS_SUCCESSFUL; + + sc = rtems_interrupt_handler_install( + BCM2835_IRQ_ID_TIMER_0, + "Clock", + RTEMS_INTERRUPT_UNIQUE, + (rtems_interrupt_handler) Clock_isr, + NULL + ); + if (sc != RTEMS_SUCCESSFUL) { + rtems_fatal_error_occurred(0xdeadbeef); + } +} + +static void raspberrypi_clock_initialize(void) +{ + BCM2835_REG(BCM2835_TIMER_CTL) = 0x003E0000; + BCM2835_REG(BCM2835_TIMER_LOD) = 10000 - 1; + BCM2835_REG(BCM2835_TIMER_RLD) = 10000 - 1; + BCM2835_REG(BCM2835_TIMER_DIV) = BCM2835_TIMER_PRESCALE; + BCM2835_REG(BCM2835_TIMER_CLI) = 0; + BCM2835_REG(BCM2835_TIMER_CTL) = 0x003E00A2; +} + +static void raspberrypi_clock_cleanup(void) +{ + rtems_status_code sc = RTEMS_SUCCESSFUL; + + /* Remove interrupt handler */ + sc = rtems_interrupt_handler_remove( + BCM2835_IRQ_ID_TIMER_0, + (rtems_interrupt_handler) Clock_isr, + NULL + ); + if (sc != RTEMS_SUCCESSFUL) { + rtems_fatal_error_occurred(0xdeadbeef); + } +} + +/* + * Return the nanoseconds since last tick + */ +static uint32_t raspberrypi_clock_nanoseconds_since_last_tick(void) +{ + return 0; +} + +#define Clock_driver_support_at_tick() raspberrypi_clock_at_tick() + +#define Clock_driver_support_initialize_hardware() raspberrypi_clock_initialize() + +#define Clock_driver_support_install_isr(isr, old_isr) \ + do { \ + raspberrypi_clock_handler_install(); \ + old_isr = NULL; \ + } while (0) + +#define Clock_driver_support_shutdown_hardware() raspberrypi_clock_cleanup() + +#define Clock_driver_nanoseconds_since_last_tick \ + raspberrypi_clock_nanoseconds_since_last_tick + + +#include "../../../shared/clockdrv_shell.h" diff --git a/c/src/lib/libbsp/arm/raspberrypi/configure.ac b/c/src/lib/libbsp/arm/raspberrypi/configure.ac new file mode 100644 index 0000000000..9bd6883204 --- /dev/null +++ b/c/src/lib/libbsp/arm/raspberrypi/configure.ac @@ -0,0 +1,31 @@ +## +# +# @file +# +# @brief Configure script of LibBSP for the Raspberry Pi boards. +# + +AC_PREREQ([2.68]) +AC_INIT([rtems-c-src-lib-libbsp-arm-raspberrypi],[_RTEMS_VERSION],[http://www.rtems.org/bugzilla]) +AC_CONFIG_SRCDIR([bsp_specs]) +RTEMS_TOP(../../../../../..) + +RTEMS_CANONICAL_TARGET_CPU +AM_INIT_AUTOMAKE([no-define nostdinc foreign 1.12.2]) +RTEMS_BSP_CONFIGURE + +RTEMS_PROG_CC_FOR_TARGET +RTEMS_CANONICALIZE_TOOLS +RTEMS_PROG_CCAS + +RTEMS_CHECK_NETWORKING +AM_CONDITIONAL(HAS_NETWORKING,test "$HAS_NETWORKING" = "yes") + +RTEMS_BSPOPTS_SET([BSP_START_RESET_VECTOR],[*],[]) +RTEMS_BSPOPTS_HELP([BSP_START_RESET_VECTOR],[reset vector address for BSP start]) + +RTEMS_BSP_CLEANUP_OPTIONS(0, 0) +RTEMS_BSP_LINKCMDS + +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT diff --git a/c/src/lib/libbsp/arm/raspberrypi/console/console-config.c b/c/src/lib/libbsp/arm/raspberrypi/console/console-config.c new file mode 100644 index 0000000000..ee4061d0ca --- /dev/null +++ b/c/src/lib/libbsp/arm/raspberrypi/console/console-config.c @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2013 Alan Cudmore + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.rtems.com/license/LICENSE + * + */ + +#include + +#include + +#include +#include +#include +#include + +console_tbl Console_Configuration_Ports [] = { + { + .sDeviceName = "/dev/ttyS0", + .deviceType = SERIAL_CUSTOM, + .pDeviceFns = &bcm2835_usart_fns, + .deviceProbe = NULL, + .pDeviceFlow = NULL, + .ulCtrlPort1 = BCM2835_UART0_BASE, + .ulCtrlPort2 = 0, + .ulClock = USART0_DEFAULT_BAUD, + .ulIntVector = BCM2835_IRQ_ID_UART + } +}; + +#define PORT_COUNT \ + (sizeof(Console_Configuration_Ports) \ + / sizeof(Console_Configuration_Ports [0])) + +unsigned long Console_Configuration_Count = PORT_COUNT; + +static void output_char(char c) +{ + const console_fns *con = + Console_Configuration_Ports [Console_Port_Minor].pDeviceFns; + + if (c == '\n') { + con->deviceWritePolled((int) Console_Port_Minor, '\r'); + } + con->deviceWritePolled((int) Console_Port_Minor, c); +} + +BSP_output_char_function_type BSP_output_char = output_char; + +BSP_polling_getchar_function_type BSP_poll_char = NULL; diff --git a/c/src/lib/libbsp/arm/raspberrypi/console/usart.c b/c/src/lib/libbsp/arm/raspberrypi/console/usart.c new file mode 100644 index 0000000000..8c64b5fca6 --- /dev/null +++ b/c/src/lib/libbsp/arm/raspberrypi/console/usart.c @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2013 Alan Cudmore + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.rtems.com/license/LICENSE + * + */ + +#include + +#include +#include +#include +#include + +static void usart_delay(uint32_t n) +{ + volatile uint32_t i = 0; + for(i = 0; i < n; i++); +} + +static rtems_vector_number usart_get_irq_number(const console_tbl *ct) +{ + return ct->ulIntVector; +} + +static uint32_t usart_get_baud(const console_tbl *ct) +{ + return ct->ulClock; +} + +static void usart_set_baud(int minor, int baud) +{ + /* + ** Nothing for now + */ + return; +} + +static void usart_initialize(int minor) +{ + unsigned int gpio_reg; + + /* + ** Program GPIO pins for UART 0 + */ + gpio_reg = BCM2835_REG(BCM2835_GPIO_GPFSEL1); + gpio_reg &= ~(7<<12); /* gpio14 */ + gpio_reg |= (4<<12); /* alt0 */ + gpio_reg &= ~(7<<15); /* gpio15 */ + gpio_reg |= (4<<15); /* alt0 */ + BCM2835_REG(BCM2835_GPIO_GPFSEL1) = gpio_reg; + + BCM2835_REG(BCM2835_GPIO_GPPUD) = 0; + usart_delay(150); + BCM2835_REG(BCM2835_GPIO_GPPUDCLK0) = (1<<14)|(1<<15); + usart_delay(150); + BCM2835_REG(BCM2835_GPIO_GPPUDCLK0) = 0; + + /* + ** Init the PL011 UART + */ + BCM2835_REG(BCM2835_UART0_CR) = 0; + BCM2835_REG(BCM2835_UART0_ICR) = 0x7FF; + BCM2835_REG(BCM2835_UART0_IMSC) = 0; + BCM2835_REG(BCM2835_UART0_IBRD) = 1; + BCM2835_REG(BCM2835_UART0_FBRD) = 40; + BCM2835_REG(BCM2835_UART0_LCRH) = 0x70; + BCM2835_REG(BCM2835_UART0_RSRECR) = 0; + + BCM2835_REG(BCM2835_UART0_CR) = 0x301; + + BCM2835_REG(BCM2835_UART0_IMSC) = BCM2835_UART0_IMSC_RX; + + usart_set_baud(minor, 115000); + +} + +static int usart_first_open(int major, int minor, void *arg) +{ + rtems_libio_open_close_args_t *oc = (rtems_libio_open_close_args_t *) arg; + struct rtems_termios_tty *tty = (struct rtems_termios_tty *) oc->iop->data1; + const console_tbl *ct = Console_Port_Tbl [minor]; + console_data *cd = &Console_Port_Data [minor]; + + cd->termios_data = tty; + rtems_termios_set_initial_baud(tty, ct->ulClock); + + return 0; +} + +static int usart_last_close(int major, int minor, void *arg) +{ + return 0; +} + +static int usart_read_polled(int minor) +{ + if (minor == 0) + { + if(((BCM2835_REG(BCM2835_UART0_FR)) & BCM2835_UART0_FR_RXFE) == 0) + { + return((BCM2835_REG(BCM2835_UART0_DR)) & 0xFF ); + } + else + { + return -1; + } + } + else + { + printk("Unknown console minor number: %d\n", minor); + return -1; + } + +} + +static void usart_write_polled(int minor, char c) +{ + while (1) + { + if ((BCM2835_REG(BCM2835_UART0_FR) & BCM2835_UART0_FR_TXFF) == 0) break; + } + BCM2835_REG(BCM2835_UART0_DR) = c; +} + +static ssize_t usart_write_support_polled( + int minor, + const char *s, + size_t n +) +{ + ssize_t i = 0; + + for (i = 0; i < n; ++i) + { + usart_write_polled(minor, s [i]); + } + + return n; +} + +static int usart_set_attributes(int minor, const struct termios *term) +{ + return -1; +} + +const console_fns bcm2835_usart_fns = { + .deviceProbe = libchip_serial_default_probe, + .deviceFirstOpen = usart_first_open, + .deviceLastClose = usart_last_close, + .deviceRead = usart_read_polled, + .deviceWrite = usart_write_support_polled, + .deviceInitialize = usart_initialize, + .deviceWritePolled = usart_write_polled, + .deviceSetAttributes = usart_set_attributes, + .deviceOutputUsesInterrupts = false +}; diff --git a/c/src/lib/libbsp/arm/raspberrypi/include/bsp.h b/c/src/lib/libbsp/arm/raspberrypi/include/bsp.h new file mode 100644 index 0000000000..cb34bd3331 --- /dev/null +++ b/c/src/lib/libbsp/arm/raspberrypi/include/bsp.h @@ -0,0 +1,38 @@ +/** + * @file + * + * @ingroup raspberrypi + * + * @brief Global BSP definitions. + */ + +/* + * Copyright (c) 2013 Alan Cudmore + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.rtems.com/license/LICENSE + * + */ + +#ifndef LIBBSP_ARM_RASPBERRYPI_BSP_H +#define LIBBSP_ARM_RASPBERRYPI_BSP_H + +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#define BSP_FEATURE_IRQ_EXTENSION + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* LIBBSP_ARM_RASPBERRYPI_BSP_H */ diff --git a/c/src/lib/libbsp/arm/raspberrypi/include/irq.h b/c/src/lib/libbsp/arm/raspberrypi/include/irq.h new file mode 100644 index 0000000000..0e3769c07f --- /dev/null +++ b/c/src/lib/libbsp/arm/raspberrypi/include/irq.h @@ -0,0 +1,62 @@ +/** + * @file + * + * @ingroup bsp_interrupt + * + * @brief Interrupt definitions. + */ + +/* + * Copyright (c) 2013 Alan Cudmore + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.rtems.com/license/LICENSE + * + */ + +#ifndef LIBBSP_ARM_RASBPERRYPI_IRQ_H +#define LIBBSP_ARM_RASPBERRYPI_IRQ_H + +#ifndef ASM + +#include +#include +#include + +#define BCM2835_INTC_TOTAL_IRQ 64 + 8 + + +#define BCM2835_IRQ_ID_AUX 29 +#define BCM2835_IRQ_ID_SPI_SLAVE 43 +#define BCM2835_IRQ_ID_PWA0 45 +#define BCM2835_IRQ_ID_PWA1 46 +#define BCM2835_IRQ_ID_SMI 48 +#define BCM2835_IRQ_ID_GPIO_0 49 +#define BCM2835_IRQ_ID_GPIO_1 50 +#define BCM2835_IRQ_ID_GPIO_2 51 +#define BCM2835_IRQ_ID_GPIO_3 52 +#define BCM2835_IRQ_ID_I2C 53 +#define BCM2835_IRQ_ID_SPI 54 +#define BCM2835_IRQ_ID_PCM 55 +#define BCM2835_IRQ_ID_UART 57 + + +#define BCM2835_IRQ_ID_TIMER_0 64 +#define BCM2835_IRQ_ID_MAILBOX_0 65 +#define BCM2835_IRQ_ID_DOORBELL_0 66 +#define BCM2835_IRQ_ID_DOORBELL_1 67 +#define BCM2835_IRQ_ID_GPU0_HALTED 68 + +#define BSP_INTERRUPT_VECTOR_MIN (0) +#define BSP_INTERRUPT_VECTOR_MAX (BCM2835_INTC_TOTAL_IRQ - 1) + +#define BSP_IRQ_COUNT (BCM2835_INTC_TOTAL_IRQ) + + +void raspberrypi_set_exception_handler(Arm_symbolic_exception_name exception, + void (*handler)(void)); + +#endif /* ASM */ +#endif /* LIBBSP_ARM_RASPBERRYPI_IRQ_H */ diff --git a/c/src/lib/libbsp/arm/raspberrypi/include/mmu.h b/c/src/lib/libbsp/arm/raspberrypi/include/mmu.h new file mode 100644 index 0000000000..50e9180dcc --- /dev/null +++ b/c/src/lib/libbsp/arm/raspberrypi/include/mmu.h @@ -0,0 +1,68 @@ +/** + * @file + * + * @ingroup rapberrypi_mmu + * + * @brief MMU API. + */ + +/* + * Copyright (c) 2013 Alan Cudmore. + * based on work by: + * Copyright (c) 2009 + * embedded brains GmbH + * Obere Lagerstr. 30 + * D-82178 Puchheim + * Germany + * + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.rtems.com/license/LICENSE + * + */ + +#ifndef LIBBSP_ARM_RASPBERRYPI_MMU_H +#define LIBBSP_ARM_RASPBERRYPI_MMU_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup raspberrypi_mmu MMU Support + * + * @ingroup raspberrypi + * + * @brief MMU support. + * + * @{ + */ + +#define RASPBERRYPI_MMU_CLIENT_DOMAIN 15U + +#define RASPBERRYPI_MMU_READ_ONLY \ + ((RASPBERRYPI_MMU_CLIENT_DOMAIN << ARM_MMU_SECT_DOMAIN_SHIFT) \ + | ARM_MMU_SECT_DEFAULT) + +#define RASPBERRYPI_MMU_READ_ONLY_CACHED \ + (RASPBERRYPI_MMU_READ_ONLY | ARM_MMU_SECT_C | ARM_MMU_SECT_B) + +#define RASPBERRYPI_MMU_READ_WRITE \ + ((RASPBERRYPI_MMU_CLIENT_DOMAIN << ARM_MMU_SECT_DOMAIN_SHIFT) \ + | ARM_MMU_SECT_AP_0 \ + | ARM_MMU_SECT_DEFAULT) + +#define RASPBERRYPI_MMU_READ_WRITE_CACHED \ + (RASPBERRYPI_MMU_READ_WRITE | ARM_MMU_SECT_C | ARM_MMU_SECT_B) + +/** @} */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* LIBBSP_ARM_RASPBERRYPI_MMU_H */ diff --git a/c/src/lib/libbsp/arm/raspberrypi/include/raspberrypi.h b/c/src/lib/libbsp/arm/raspberrypi/include/raspberrypi.h new file mode 100644 index 0000000000..44a105ad4b --- /dev/null +++ b/c/src/lib/libbsp/arm/raspberrypi/include/raspberrypi.h @@ -0,0 +1,194 @@ + +/* + * raspberrypi.h + * + * Copyright (c) 2013 Alan Cudmore. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.rtems.com/license/LICENSE + * + */ + +#ifndef LIBBSP_ARM_RASPBERRYPI_RASPBERRYPI_H +#define LIBBSP_ARM_RASPBERRYPI_RASPBERRYPI_H + +#include +#include + +/** + * @defgroup raspberrypi_reg Register Definitions + * + * @ingroup raspberrypi + * + * @brief Register definitions. + * + * @{ + */ + +/** + * @name Register Macros + * + * @{ + */ + +#define BCM2835_REG(x) (*(volatile uint32_t *)(x)) +#define BCM2835_BIT(n) (1 << (n)) + +/** @} */ + +/** + * @name Internal ARM Timer Registers + * + * @{ + */ + +#define BCM2835_CLOCK_FREQ 250000000 + +#define BCM2835_TIMER_BASE (0x2000B400) + +#define BCM2835_TIMER_LOD (BCM2835_TIMER_BASE+0x00) +#define BCM2835_TIMER_VAL (BCM2835_TIMER_BASE+0x04) +#define BCM2835_TIMER_CTL (BCM2835_TIMER_BASE+0x08) +#define BCM2835_TIMER_CLI (BCM2835_TIMER_BASE+0x0C) +#define BCM2835_TIMER_RIS (BCM2835_TIMER_BASE+0x10) +#define BCM2835_TIMER_MIS (BCM2835_TIMER_BASE+0x14) +#define BCM2835_TIMER_RLD (BCM2835_TIMER_BASE+0x18) +#define BCM2835_TIMER_DIV (BCM2835_TIMER_BASE+0x1C) +#define BCM2835_TIMER_CNT (BCM2835_TIMER_BASE+0x20) + +#define BCM2835_TIMER_PRESCALE 0xF9 + +/** @} */ + +/** + * @name GPIO Registers + * + * @{ + */ + +#define BCM2835_GPIO_REGS_BASE (0x20200000) + +#define BCM2835_GPIO_GPFSEL1 (BCM2835_GPIO_REGS_BASE+0x04) +#define BCM2835_GPIO_GPSET0 (BCM2835_GPIO_REGS_BASE+0x1C) +#define BCM2835_GPIO_GPCLR0 (BCM2835_GPIO_REGS_BASE+0x28) +#define BCM2835_GPIO_GPPUD (BCM2835_GPIO_REGS_BASE+0x94) +#define BCM2835_GPIO_GPPUDCLK0 (BCM2835_GPIO_REGS_BASE+0x98) + +/** @} */ + +/** + * @name AUX Registers + * + * @{ + */ + +#define BCM2835_AUX_BASE (0x20215000) + +#define AUX_ENABLES (BCM2835_AUX_BASE+0x04) +#define AUX_MU_IO_REG (BCM2835_AUX_BASE+0x40) +#define AUX_MU_IER_REG (BCM2835_AUX_BASE+0x44) +#define AUX_MU_IIR_REG (BCM2835_AUX_BASE+0x48) +#define AUX_MU_LCR_REG (BCM2835_AUX_BASE+0x4C) +#define AUX_MU_MCR_REG (BCM2835_AUX_BASE+0x50) +#define AUX_MU_LSR_REG (BCM2835_AUX_BASE+0x54) +#define AUX_MU_MSR_REG (BCM2835_AUX_BASE+0x58) +#define AUX_MU_SCRATCH (BCM2835_AUX_BASE+0x5C) +#define AUX_MU_CNTL_REG (BCM2835_AUX_BASE+0x60) +#define AUX_MU_STAT_REG (BCM2835_AUX_BASE+0x64) +#define AUX_MU_BAUD_REG (BCM2835_AUX_BASE+0x68) + +/** @} */ + + +/** + * @name UART 0 (PL011) Registers + * + * @{ + */ + + +#define BCM2835_UART0_BASE (0x20201000) + +#define BCM2835_UART0_DR (BCM2835_UART0_BASE+0x00) +#define BCM2835_UART0_RSRECR (BCM2835_UART0_BASE+0x04) +#define BCM2835_UART0_FR (BCM2835_UART0_BASE+0x18) +#define BCM2835_UART0_ILPR (BCM2835_UART0_BASE+0x20) +#define BCM2835_UART0_IBRD (BCM2835_UART0_BASE+0x24) +#define BCM2835_UART0_FBRD (BCM2835_UART0_BASE+0x28) +#define BCM2835_UART0_LCRH (BCM2835_UART0_BASE+0x2C) +#define BCM2835_UART0_CR (BCM2835_UART0_BASE+0x30) +#define BCM2835_UART0_IFLS (BCM2835_UART0_BASE+0x34) +#define BCM2835_UART0_IMSC (BCM2835_UART0_BASE+0x38) +#define BCM2835_UART0_RIS (BCM2835_UART0_BASE+0x3C) +#define BCM2835_UART0_MIS (BCM2835_UART0_BASE+0x40) +#define BCM2835_UART0_ICR (BCM2835_UART0_BASE+0x44) +#define BCM2835_UART0_DMACR (BCM2835_UART0_BASE+0x48) +#define BCM2835_UART0_ITCR (BCM2835_UART0_BASE+0x80) +#define BCM2835_UART0_ITIP (BCM2835_UART0_BASE+0x84) +#define BCM2835_UART0_ITOP (BCM2835_UART0_BASE+0x88) +#define BCM2835_UART0_TDR (BCM2835_UART0_BASE+0x8C) + +#define BCM2835_UART0_MIS_RX 0x10 +#define BCM2835_UART0_MIS_TX 0x20 +#define BCM2835_UART0_IMSC_RX 0x10 +#define BCM2835_UART0_IMSC_TX 0x20 +#define BCM2835_UART0_FR_RXFE 0x10 +#define BCM2835_UART0_FR_TXFF 0x20 +#define BCM2835_UART0_ICR_RX 0x10 +#define BCM2835_UART0_ICR_TX 0x20 + + +/** @} */ + + +/** + * @name IRQ Registers + * + * @{ + */ + +#define BCM2835_BASE_INTC (0x2000B200) + +#define BCM2835_IRQ_BASIC (BCM2835_BASE_INTC + 0x00) +#define BCM2835_IRQ_PENDING1 (BCM2835_BASE_INTC + 0x04) +#define BCM2835_IRQ_PENDING2 (BCM2835_BASE_INTC + 0x08) +#define BCM2835_IRQ_FIQ_CTRL (BCM2835_BASE_INTC + 0x0C) +#define BCM2835_IRQ_ENABLE1 (BCM2835_BASE_INTC + 0x10) +#define BCM2835_IRQ_ENABLE2 (BCM2835_BASE_INTC + 0x14) +#define BCM2835_IRQ_ENABLE_BASIC (BCM2835_BASE_INTC + 0x18) +#define BCM2835_IRQ_DISABLE1 (BCM2835_BASE_INTC + 0x1C) +#define BCM2835_IRQ_DISABLE2 (BCM2835_BASE_INTC + 0x20) +#define BCM2835_IRQ_DISABLE_BASIC (BCM2835_BASE_INTC + 0x24) + +/** @} */ + + +/** + * @name GPU Timer Registers + * + * @{ + */ + +/** + * NOTE: The GPU uses Compare registers 0 and 2 for + * it's own RTOS. 1 and 3 are available for use in + * RTEMS. + */ +#define BCM2835_GPU_TIMER_BASE (0x20003000) + +#define BCM2835_GPU_TIMER_CS (BCM2835_TIMER_BASE+0x00) +#define BCM2835_GPU_TIMER_CLO (BCM2835_TIMER_BASE+0x04) +#define BCM2835_GPU_TIMER_CHI (BCM2835_TIMER_BASE+0x08) +#define BCM2835_GPU_TIMER_C0 (BCM2835_TIMER_BASE+0x0C) +#define BCM2835_GPU_TIMER_C1 (BCM2835_TIMER_BASE+0x10) +#define BCM2835_GPU_TIMER_C2 (BCM2835_TIMER_BASE+0x14) +#define BCM2835_GPU_TIMER_C3 (BCM2835_TIMER_BASE+0x18) + +/** @} */ + + +/** @} */ + +#endif /* LIBBSP_ARM_RASPBERRYPI_RASPBERRYPI_H */ diff --git a/c/src/lib/libbsp/arm/raspberrypi/include/usart.h b/c/src/lib/libbsp/arm/raspberrypi/include/usart.h new file mode 100644 index 0000000000..26b44161da --- /dev/null +++ b/c/src/lib/libbsp/arm/raspberrypi/include/usart.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2013 Alan Cudmore. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE + */ + +#ifndef LIBBSP_ARM_RASPBERRYPI_USART_H +#define LIBBSP_ARM_RASPBERRYPI_USART_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#define USART0_DEFAULT_BAUD 115000 + +extern const console_fns bcm2835_usart_fns; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* LIBBSP_ARM_RASPBERRYPI_USART_H */ diff --git a/c/src/lib/libbsp/arm/raspberrypi/irq/irq.c b/c/src/lib/libbsp/arm/raspberrypi/irq/irq.c new file mode 100644 index 0000000000..fc0b74a92e --- /dev/null +++ b/c/src/lib/libbsp/arm/raspberrypi/irq/irq.c @@ -0,0 +1,124 @@ +/** + * @file + * + * @ingroup bsp_interrupt + * + * @brief Interrupt support. + */ + +/* + * Copyright (c) 2009 + * embedded brains GmbH + * Obere Lagerstr. 30 + * D-82178 Puchheim + * Germany + * + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + */ + +#include + +#include +#include +#include +#include +#include +#include + +/* +** This sets the main exception vectors +*/ +void raspberrypi_set_exception_handler( + Arm_symbolic_exception_name exception, + void (*handler)(void) + ) +{ + if ((unsigned) exception < MAX_EXCEPTIONS) + { + uint32_t *table = (uint32_t *) bsp_section_vector_begin + MAX_EXCEPTIONS; + table [exception] = (uint32_t) handler; + + } +} + +/* +** Determine the source of the interrupt and dispatch the correct handler. +*/ +void bsp_interrupt_dispatch(void) +{ + rtems_vector_number vector = 255; + + /* ARM timer */ + if (BCM2835_REG(BCM2835_IRQ_BASIC) && 0x1) + { + vector = BCM2835_IRQ_ID_TIMER_0; + + } + /* UART 0 */ + else if ( BCM2835_REG(BCM2835_IRQ_BASIC) && BCM2835_BIT(19)) + { + vector = BCM2835_IRQ_ID_UART; + } + + if ( vector < 255 ) + { + bsp_interrupt_handler_dispatch(vector); + } + +} + +rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector) +{ + rtems_interrupt_level level; + + rtems_interrupt_disable(level); + + /* ARM Timer */ + if ( vector == BCM2835_IRQ_ID_TIMER_0 ) + { + BCM2835_REG(BCM2835_IRQ_ENABLE_BASIC) = 0x1; + } + /* UART 0 */ + else if ( vector == BCM2835_IRQ_ID_UART ) + { + BCM2835_REG(BCM2835_IRQ_ENABLE2) = BCM2835_BIT(25); + + } + rtems_interrupt_enable(level); + + return RTEMS_SUCCESSFUL; +} + +rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector) +{ + rtems_interrupt_level level; + + rtems_interrupt_disable(level); + + if ( vector == BCM2835_IRQ_ID_TIMER_0 ) + { + BCM2835_REG(BCM2835_IRQ_DISABLE_BASIC) = 0x1; + } + else if ( vector == BCM2835_IRQ_ID_UART ) + { + BCM2835_REG(BCM2835_IRQ_DISABLE2) = BCM2835_BIT(25); + } + rtems_interrupt_enable(level); + + return RTEMS_SUCCESSFUL; +} + + +void bsp_interrupt_handler_default(rtems_vector_number vector) +{ + printk("spurious interrupt: %u\n", vector); +} + +rtems_status_code bsp_interrupt_facility_initialize(void) +{ + raspberrypi_set_exception_handler(ARM_EXCEPTION_IRQ, _ARMV4_Exception_interrupt); + return RTEMS_SUCCESSFUL; +} diff --git a/c/src/lib/libbsp/arm/raspberrypi/make/custom/raspberrypi.cfg b/c/src/lib/libbsp/arm/raspberrypi/make/custom/raspberrypi.cfg new file mode 100644 index 0000000000..9751658a6e --- /dev/null +++ b/c/src/lib/libbsp/arm/raspberrypi/make/custom/raspberrypi.cfg @@ -0,0 +1,22 @@ +# +# Config file for RASPBERRYPI +# +# $Id: $ +# + +include $(RTEMS_ROOT)/make/custom/default.cfg + +RTEMS_CPU = arm + +CPU_CFLAGS = -mcpu=arm1176jzf-s + +CFLAGS_OPTIMIZE_V = -O2 -g + +# This defines the operations performed on the linked executable. +# is currently required. +define bsp-post-link + $(OBJCOPY) -O binary --strip-all \ + $(basename $@).exe $(basename $@)$(DOWNEXT) + $(SIZE) $(basename $@).exe +endef + diff --git a/c/src/lib/libbsp/arm/raspberrypi/misc/timer.c b/c/src/lib/libbsp/arm/raspberrypi/misc/timer.c new file mode 100644 index 0000000000..a26be2f7a7 --- /dev/null +++ b/c/src/lib/libbsp/arm/raspberrypi/misc/timer.c @@ -0,0 +1,49 @@ +/** + * @file + * + * @ingroup raspberrypi + * + * @brief Benchmark timer support. + */ + +/* + * Copyright (c) 2013 by Alan Cudmore + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.rtems.com/license/LICENSE + * + */ + +#include +#include +#include + +static bool benchmark_timer_find_average_overhead = false; + +static uint64_t benchmark_timer_base; + +void benchmark_timer_initialize(void) +{ + benchmark_timer_base = BCM2835_REG(BCM2835_GPU_TIMER_CLO); +} + +uint32_t benchmark_timer_read(void) +{ + uint32_t delta = BCM2835_REG(BCM2835_GPU_TIMER_CLO) - benchmark_timer_base; + + if (benchmark_timer_find_average_overhead) + { + return delta; + } + else + { + return BCM2835_REG(BCM2835_GPU_TIMER_CLO); + } +} + +void benchmark_timer_disable_subtracting_average_overhead(bool find_average_overhead) +{ + benchmark_timer_find_average_overhead = find_average_overhead; +} diff --git a/c/src/lib/libbsp/arm/raspberrypi/preinstall.am b/c/src/lib/libbsp/arm/raspberrypi/preinstall.am new file mode 100644 index 0000000000..056c5f1eaa --- /dev/null +++ b/c/src/lib/libbsp/arm/raspberrypi/preinstall.am @@ -0,0 +1,140 @@ +## Automatically generated by ampolish3 - Do not edit + +if AMPOLISH3 +$(srcdir)/preinstall.am: Makefile.am + $(AMPOLISH3) $(srcdir)/Makefile.am > $(srcdir)/preinstall.am +endif + +PREINSTALL_DIRS = +DISTCLEANFILES += $(PREINSTALL_DIRS) + +all-local: $(TMPINSTALL_FILES) + +TMPINSTALL_FILES = +CLEANFILES = $(TMPINSTALL_FILES) + +all-am: $(PREINSTALL_FILES) + +PREINSTALL_FILES = +CLEANFILES += $(PREINSTALL_FILES) + +$(PROJECT_LIB)/$(dirstamp): + @$(MKDIR_P) $(PROJECT_LIB) + @: > $(PROJECT_LIB)/$(dirstamp) +PREINSTALL_DIRS += $(PROJECT_LIB)/$(dirstamp) + +$(PROJECT_INCLUDE)/$(dirstamp): + @$(MKDIR_P) $(PROJECT_INCLUDE) + @: > $(PROJECT_INCLUDE)/$(dirstamp) +PREINSTALL_DIRS += $(PROJECT_INCLUDE)/$(dirstamp) + +$(PROJECT_INCLUDE)/bsp/$(dirstamp): + @$(MKDIR_P) $(PROJECT_INCLUDE)/bsp + @: > $(PROJECT_INCLUDE)/bsp/$(dirstamp) +PREINSTALL_DIRS += $(PROJECT_INCLUDE)/bsp/$(dirstamp) + +$(PROJECT_INCLUDE)/libcpu/$(dirstamp): + @$(MKDIR_P) $(PROJECT_INCLUDE)/libcpu + @: > $(PROJECT_INCLUDE)/libcpu/$(dirstamp) +PREINSTALL_DIRS += $(PROJECT_INCLUDE)/libcpu/$(dirstamp) + +$(PROJECT_LIB)/bsp_specs: bsp_specs $(PROJECT_LIB)/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_LIB)/bsp_specs +PREINSTALL_FILES += $(PROJECT_LIB)/bsp_specs + +$(PROJECT_INCLUDE)/bsp.h: include/bsp.h $(PROJECT_INCLUDE)/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp.h + +$(PROJECT_INCLUDE)/tm27.h: ../../shared/include/tm27.h $(PROJECT_INCLUDE)/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/tm27.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/tm27.h + +$(PROJECT_INCLUDE)/coverhd.h: ../../shared/include/coverhd.h $(PROJECT_INCLUDE)/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/coverhd.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/coverhd.h + +$(PROJECT_INCLUDE)/bspopts.h: include/bspopts.h $(PROJECT_INCLUDE)/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bspopts.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bspopts.h + +$(PROJECT_INCLUDE)/bsp/bootcard.h: ../../shared/include/bootcard.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/bootcard.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/bootcard.h + +$(PROJECT_INCLUDE)/bsp/utility.h: ../../shared/include/utility.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/utility.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/utility.h + +$(PROJECT_INCLUDE)/bsp/irq-generic.h: ../../shared/include/irq-generic.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq-generic.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq-generic.h + +$(PROJECT_INCLUDE)/bsp/irq-info.h: ../../shared/include/irq-info.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq-info.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq-info.h + +$(PROJECT_INCLUDE)/bsp/stackalloc.h: ../../shared/include/stackalloc.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/stackalloc.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/stackalloc.h + +$(PROJECT_INCLUDE)/bsp/uart-output-char.h: ../../shared/include/uart-output-char.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/uart-output-char.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/uart-output-char.h + +$(PROJECT_INCLUDE)/bsp/tod.h: ../../shared/tod.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/tod.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/tod.h + +$(PROJECT_INCLUDE)/bsp/linker-symbols.h: ../shared/include/linker-symbols.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/linker-symbols.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/linker-symbols.h + +$(PROJECT_INCLUDE)/bsp/start.h: ../shared/include/start.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/start.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/start.h + +$(PROJECT_INCLUDE)/bsp/lpc-timer.h: ../shared/lpc/include/lpc-timer.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/lpc-timer.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/lpc-timer.h + +$(PROJECT_INCLUDE)/bsp/lpc-dma.h: ../shared/lpc/include/lpc-dma.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/lpc-dma.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/lpc-dma.h + +$(PROJECT_INCLUDE)/bsp/irq.h: include/irq.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/irq.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/irq.h + +$(PROJECT_INCLUDE)/bsp/mmu.h: include/mmu.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/mmu.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/mmu.h + +$(PROJECT_INCLUDE)/bsp/usart.h: include/usart.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/usart.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/usart.h + +$(PROJECT_INCLUDE)/bsp/raspberrypi.h: include/raspberrypi.h $(PROJECT_INCLUDE)/bsp/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/bsp/raspberrypi.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/bsp/raspberrypi.h + +$(PROJECT_INCLUDE)/libcpu/cache_.h: ../../../libcpu/arm/shared/include/cache_.h $(PROJECT_INCLUDE)/libcpu/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libcpu/cache_.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/libcpu/cache_.h + +$(PROJECT_INCLUDE)/libcpu/arm-cp15.h: ../../../libcpu/arm/shared/include/arm-cp15.h $(PROJECT_INCLUDE)/libcpu/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libcpu/arm-cp15.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/libcpu/arm-cp15.h + +$(PROJECT_LIB)/start.$(OBJEXT): start.$(OBJEXT) $(PROJECT_LIB)/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_LIB)/start.$(OBJEXT) +TMPINSTALL_FILES += $(PROJECT_LIB)/start.$(OBJEXT) + +$(PROJECT_LIB)/linkcmds: startup/linkcmds $(PROJECT_LIB)/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds +TMPINSTALL_FILES += $(PROJECT_LIB)/linkcmds + +$(PROJECT_LIB)/linkcmds.base: ../shared/startup/linkcmds.base $(PROJECT_LIB)/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_LIB)/linkcmds.base +TMPINSTALL_FILES += $(PROJECT_LIB)/linkcmds.base + diff --git a/c/src/lib/libbsp/arm/raspberrypi/startup/bspreset.c b/c/src/lib/libbsp/arm/raspberrypi/startup/bspreset.c new file mode 100644 index 0000000000..588a33ec09 --- /dev/null +++ b/c/src/lib/libbsp/arm/raspberrypi/startup/bspreset.c @@ -0,0 +1,35 @@ +/** + * @file + * + * @ingroup raspberrypi + * + * @brief Reset code. + */ + +/* + * Copyright (c) 2013 by Alan Cudmore + * Based on work by: + * Copyright (c) 2009 + * embedded brains GmbH + * Obere Lagerstr. 30 + * D-82178 Puchheim + * Germany + * + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.rtems.com/license/LICENSE + * + */ + +#include + +#include + +void bsp_reset( void) +{ + while (true) { + /* Do nothing */ + } +} diff --git a/c/src/lib/libbsp/arm/raspberrypi/startup/bspstart.c b/c/src/lib/libbsp/arm/raspberrypi/startup/bspstart.c new file mode 100644 index 0000000000..e48dd532a4 --- /dev/null +++ b/c/src/lib/libbsp/arm/raspberrypi/startup/bspstart.c @@ -0,0 +1,29 @@ +/** + * @file + * + * @ingroup raspberrypi + * + * @brief Startup code. + */ + +/* + * Copyright (c) 2013 by Alan Cudmore + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * + * http://www.rtems.com/license/LICENSE + */ + +#include +#include +#include +#include +#include +#include +#include + +void bsp_start(void) +{ + bsp_interrupt_initialize(); +} diff --git a/c/src/lib/libbsp/arm/raspberrypi/startup/bspstarthooks.c b/c/src/lib/libbsp/arm/raspberrypi/startup/bspstarthooks.c new file mode 100644 index 0000000000..6f57264119 --- /dev/null +++ b/c/src/lib/libbsp/arm/raspberrypi/startup/bspstarthooks.c @@ -0,0 +1,114 @@ +/** + * @file + * + * @ingroup raspberrypi + * + * @brief Startup code. + */ + +/* + * Copyright (c) 2013 by Alan Cudmore + * based on work by: + * Copyright (c) 2009 + * embedded brains GmbH + * Obere Lagerstr. 30 + * D-82178 Puchheim + * Germany + * + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE + */ + +#include + +#include +#include +#include +#include +#include +#include + +static void BSP_START_TEXT_SECTION clear_bss(void) +{ + const int *end = (const int *) bsp_section_bss_end; + int *out = (int *) bsp_section_bss_begin; + + /* Clear BSS */ + while (out != end) { + *out = 0; + ++out; + } +} + +static void BSP_START_TEXT_SECTION raspberrypi_cache_setup(void) +{ + uint32_t ctrl = 0; + + /* Disable MMU and cache, basic settings */ + ctrl = arm_cp15_get_control(); + ctrl &= ~(ARM_CP15_CTRL_I | ARM_CP15_CTRL_R | ARM_CP15_CTRL_C + | ARM_CP15_CTRL_V | ARM_CP15_CTRL_M); + ctrl |= ARM_CP15_CTRL_S | ARM_CP15_CTRL_A; + arm_cp15_set_control(ctrl); + + arm_cp15_cache_invalidate(); + arm_cp15_tlb_invalidate(); + +} + + +void BSP_START_TEXT_SECTION bsp_start_hook_0(void) +{ + raspberrypi_cache_setup(); +} + + +void BSP_START_TEXT_SECTION bsp_start_hook_1(void) +{ + + /* Copy .text section */ + arm_cp15_instruction_cache_invalidate(); + bsp_start_memcpy( + (int *) bsp_section_text_begin, + (const int *) bsp_section_text_load_begin, + (size_t) bsp_section_text_size + ); + + /* Copy .rodata section */ + arm_cp15_instruction_cache_invalidate(); + bsp_start_memcpy( + (int *) bsp_section_rodata_begin, + (const int *) bsp_section_rodata_load_begin, + (size_t) bsp_section_rodata_size + ); + + /* Copy .data section */ + arm_cp15_instruction_cache_invalidate(); + bsp_start_memcpy( + (int *) bsp_section_data_begin, + (const int *) bsp_section_data_load_begin, + (size_t) bsp_section_data_size + ); + + /* Copy .fast_text section */ + arm_cp15_instruction_cache_invalidate(); + bsp_start_memcpy( + (int *) bsp_section_fast_text_begin, + (const int *) bsp_section_fast_text_load_begin, + (size_t) bsp_section_fast_text_size + ); + + /* Copy .fast_data section */ + arm_cp15_instruction_cache_invalidate(); + bsp_start_memcpy( + (int *) bsp_section_fast_data_begin, + (const int *) bsp_section_fast_data_load_begin, + (size_t) bsp_section_fast_data_size + ); + + /* Clear .bss section */ + clear_bss(); + +} diff --git a/c/src/lib/libbsp/arm/raspberrypi/startup/linkcmds b/c/src/lib/libbsp/arm/raspberrypi/startup/linkcmds new file mode 100644 index 0000000000..b9a0dd88dc --- /dev/null +++ b/c/src/lib/libbsp/arm/raspberrypi/startup/linkcmds @@ -0,0 +1,62 @@ +/** + * @file + * + * @ingroup raspberry_pi + * + * @brief Memory map. + */ + +/** + * @defgroup raspberry_pi Memory Map + * + * @ingroup bsp_linker + * + * @brief Raspberry Pi memory map. + * + * + * + * + * + *
Region NameRegion BeginRegion Size
VECTOR_RAM0x080000008k
RAM0x80008000128M
+ * + * + * + * + * + * + * + * + * + * + * + * + *
Section NameSection Runtime RegionSection Load Region
.startRAM
.vectorVECTOR_RAM
.textRAMRAM_EXT
.rodataRAMRAM_EXT
.dataRAMRAM_EXT
.fastRAMRAM_EXT
.bssRAM
.workRAM
.stackRAM
+ */ + +MEMORY { + VECTOR_RAM (AIW) : ORIGIN = 0x0 , LENGTH = 0x8000 + RAM (AIW) : ORIGIN = 0x00008000, LENGTH = 128M - 0x8000 +} + +REGION_ALIAS ("REGION_START", RAM); +REGION_ALIAS ("REGION_VECTOR", VECTOR_RAM); +REGION_ALIAS ("REGION_TEXT", RAM); +REGION_ALIAS ("REGION_TEXT_LOAD", RAM); +REGION_ALIAS ("REGION_RODATA", RAM); +REGION_ALIAS ("REGION_RODATA_LOAD", RAM); +REGION_ALIAS ("REGION_DATA", RAM); +REGION_ALIAS ("REGION_DATA_LOAD", RAM); +REGION_ALIAS ("REGION_FAST_TEXT", RAM); +REGION_ALIAS ("REGION_FAST_TEXT_LOAD", RAM); +REGION_ALIAS ("REGION_FAST_DATA", RAM); +REGION_ALIAS ("REGION_FAST_DATA_LOAD", RAM); +REGION_ALIAS ("REGION_BSS", RAM); +REGION_ALIAS ("REGION_WORK", RAM); +REGION_ALIAS ("REGION_STACK", RAM); + +bsp_stack_irq_size = DEFINED (bsp_stack_irq_size) ? bsp_stack_irq_size : 4096; +bsp_stack_abt_size = DEFINED (bsp_stack_abt_size) ? bsp_stack_abt_size : 1024; + +bsp_section_robarrier_align = DEFINED (bsp_section_robarrier_align) ? bsp_section_robarrier_align : 1M; + +INCLUDE linkcmds.armv4 -- cgit v1.2.3