diff --git a/boards/jiminy-mega256rfr2/Makefile b/boards/jiminy-mega256rfr2/Makefile new file mode 100644 index 000000000..f8fcbb53a --- /dev/null +++ b/boards/jiminy-mega256rfr2/Makefile @@ -0,0 +1,3 @@ +MODULE = board + +include $(RIOTBASE)/Makefile.base diff --git a/boards/jiminy-mega256rfr2/Makefile.features b/boards/jiminy-mega256rfr2/Makefile.features new file mode 100644 index 000000000..4e78995dd --- /dev/null +++ b/boards/jiminy-mega256rfr2/Makefile.features @@ -0,0 +1,10 @@ +include $(RIOTBOARD)/common/arduino-atmega/Makefile.features + +# Put defined MCU peripherals here (in alphabetical order) +# Peripherals are defined in common/arduino-atmega/Makefile.features +# Add only additional Peripherals + +# The board MPU family (used for grouping by the CI system) +FEATURES_MCU_GROUP = avr6 + +-include $(RIOTCPU)/atmega256rfr2/Makefile.features diff --git a/boards/jiminy-mega256rfr2/Makefile.include b/boards/jiminy-mega256rfr2/Makefile.include new file mode 100644 index 000000000..a0fc16954 --- /dev/null +++ b/boards/jiminy-mega256rfr2/Makefile.include @@ -0,0 +1,24 @@ +# define the cpu used by the jiminy board +export CPU = atmega256rfr2 + +# export needed for flash rule +export PORT_LINUX ?= /dev/ttyACM0 +export PORT_DARWIN ?= $(firstword $(sort $(wildcard /dev/tty.usbmodem*))) + +# Serial Baud rate for Ffasher is configured to 500kBaud +# see /usr/include/asm-generic/termbits.h for availabel baudrates on your linux system +export PROGRAMMER_SPEED ?= 0010005 + +export FFLAGS += -p atmega256rfr2 + +# refine serial port information for pyterm +# For 8MHz F_CPU following Baudrate have good error rates +# 76923 +# 38400 +export BAUD = 38400 + +# PROGRAMMER defaults to arduino which is the internal flasher via USB. Can be +# overridden for debugging (which requires changes that require to use an ISP) +export PROGRAMMER ?= wiring + +include $(RIOTBOARD)/common/arduino-atmega/Makefile.include diff --git a/boards/jiminy-mega256rfr2/board.c b/boards/jiminy-mega256rfr2/board.c new file mode 100644 index 000000000..193385591 --- /dev/null +++ b/boards/jiminy-mega256rfr2/board.c @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2016 RWTH Aachen, Josua Arndt + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup boards_jiminy-mega256rfr2 + * @{ + * + * @file + * @brief Board specific implementations for the Jiminy Mega 256rfr2 board + * developed by the IAS of the RWTH Aachen University + * + * @author Josua Arndt + * + * @} + */ + +#include "board.h" + +#include +#include + +#include "cpu.h" +#include "uart_stdio.h" + +void SystemInit(void); +static int uart_putchar(char c, FILE *stream); +static int uart_getchar(FILE *stream); + +static FILE uart_stdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE); +static FILE uart_stdin = FDEV_SETUP_STREAM(NULL, uart_getchar, _FDEV_SETUP_READ); + +void board_init(void) +{ + /* initialize stdio via USART_0 */ + SystemInit(); + + /* initialize the CPU */ + cpu_init(); + + /* initialize the board LED (connected to pin PB7) */ + /* Ports Pins as Output */ + LED_PORT_DDR |= LED2_MASK | LED1_MASK | LED0_MASK; + /* All Pins Low so LEDs are off */ + LED_PORT &= ~(LED2_MASK | LED1_MASK | LED0_MASK); + + irq_enable(); +} + +/*Initialize the System, initialize IO via UART_0*/ +void SystemInit(void) +{ + /* initialize UART_0 for use as stdout */ + uart_stdio_init(); + + stdout = &uart_stdout; + stdin = &uart_stdin; + + /* Flush stdout */ + puts("\f"); +} + +static int uart_putchar(char c, FILE *stream) +{ + (void) stream; + uart_stdio_write(&c, 1); + return 0; +} + +int uart_getchar(FILE *stream) +{ + (void) stream; + char c; + uart_stdio_read(&c, 1); + return (int)c; +} diff --git a/boards/jiminy-mega256rfr2/include/board.h b/boards/jiminy-mega256rfr2/include/board.h new file mode 100644 index 000000000..632bc78d9 --- /dev/null +++ b/boards/jiminy-mega256rfr2/include/board.h @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2016 RWTH Aachen, Josua Arndt + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @defgroup boards_jiminy-mega256rfr2 Jiminy- Mega256rfr2 + * @ingroup boards + * @brief Board specific files for the Jiminy Mega 256rfr2 board. + * @{ + * + * @file + * @brief Board specific definitions for the Jiminy Mega 256rfr2 board. + * + * @author Josua Arndt + * @author Steffen Robertz + */ + +#ifndef BOARD_H +#define BOARD_H + +#include "cpu.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @name Baudrate for STDIO terminal + * + * The standard configuration for STDIO in spu/atmega_comman/periph/uart.c + * is to use double speed. + * + * For 8MHz F_CPU following Baudrate have good error rates + * 76923 + * 38400 + * + * Matches this with BAUD in Board/Makefile.include + * + * @{ + */ +#ifndef UART_STDIO_BAUDRATE +#define UART_STDIO_BAUDRATE (38400U) /**< Sets Baudrate for e.g. Shell */ +#endif +/** @} */ + +/** + * @name LED pin definitions and handlers + * @{ + */ +#define LED_PORT PORTB +#define LED_PORT_DDR DDRB + +#define LED0_PIN GPIO_PIN(1, 5) +#define LED1_PIN GPIO_PIN(1, 6) +#define LED2_PIN GPIO_PIN(1, 7) + +#define LED0_MASK (1 << DDB5) +#define LED1_MASK (1 << DDB6) +#define LED2_MASK (1 << DDB7) + +#define LED0_ON (LED_PORT |= LED0_MASK) +#define LED0_OFF (LED_PORT &= ~LED0_MASK) +#define LED0_TOGGLE (LED_PORT ^= LED0_MASK) + +#define LED1_ON (LED_PORT |= LED1_MASK) +#define LED1_OFF (LED_PORT &= ~LED1_MASK) +#define LED1_TOGGLE (LED_PORT ^= LED1_MASK) + +#define LED2_ON (LED_PORT |= LED2_MASK) +#define LED2_OFF (LED_PORT &= ~LED2_MASK) +#define LED2_TOGGLE (LED_PORT ^= LED2_MASK) +/** @} */ + +/** + * @name Context swap defines + * This emulates a software triggered interrupt + * @{ + */ +#define AVR_CONTEXT_SWAP_INIT do { \ + DDRE |= (1 << PE7); \ + EICRB |= (1 << ISC70); \ + EIMSK |= (1 << INT7); \ + sei(); \ +} while (0) +#define AVR_CONTEXT_SWAP_INTERRUPT_VECT INT7_vect +#define AVR_CONTEXT_SWAP_TRIGGER PORTE ^= (1 << PE7) +/** @} */ + +/** + * @name xtimer configuration values + * @{ + */ +#define XTIMER_DEV TIMER_DEV(0) +#define XTIMER_CHAN (0) +#define XTIMER_WIDTH (16) +#define XTIMER_HZ (125000UL) +/** @} */ + +/** + * @brief Initialize board specific hardware, including clock, LEDs and std-IO + */ +void board_init(void); + +#ifdef __cplusplus +} +#endif + +#endif /* BOARD_H */ +/** @} */ diff --git a/boards/jiminy-mega256rfr2/include/periph_conf.h b/boards/jiminy-mega256rfr2/include/periph_conf.h new file mode 100644 index 000000000..94efb799d --- /dev/null +++ b/boards/jiminy-mega256rfr2/include/periph_conf.h @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2016 RWTH Aachen, Josua Arndt + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup boards_jiminy-mega256rfr2 + * @{ + * + * @file + * @brief Peripheral MCU configuration for the Jiminy Mega 256rfr2 board + * + * @author Josua Arndt + * @author Steffen Robertz + */ + +#ifndef PERIPH_CONF_H +#define PERIPH_CONF_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include "periph_cpu.h" +#include "atmega_regs_common.h" +#include "periph_cpu_common.h" + +/** + * @name Clock configuration + * @{ + */ +#define CLOCK_CORECLOCK (8000000UL) +/** @} */ + +/** + * @name Timer configuration + * + * ATTENTION RIOT Timer 0 is used for Xtimer which is system Timer + * + * The timer driver only supports the four 16-bit timers + * (Timer1, TST, Timer3, Timer4, Timer5), so those are the Timer we can use here. + * Timer 1, TST, PORT B5/6/7 Out, Port D4/6 In, Analog Comparator Input Capture, Output Compare Modulator, PWM + * Timer 3, TST, PORT E3/4/5 Out, Port E/6/7 In, Input or Output Compare and PWM Output + * Timer 4, TST, It can not be connected to any I/O Pin, + * Timer 5, TST, It can not be connected to any I/O Pin, + * + * Using Atmel Timer 4 and 5 seems to be the best choice + * Using Atmel Timer 4 as Xtimer + * and Atmel Timer 5 as timer available for the the application seems to be the best choice, + * as the special functions of the other timer are not lost. + * Atmel Timer1 to be used as PWM timer for RGB LED + * @{ + */ +#define TIMER_NUMOF (3U) + +#define TIMER_0 MEGA_TIMER4 +#define TIMER_0_MASK &TIMSK4 +#define TIMER_0_FLAG &TIFR4 +#define TIMER_0_ISRA TIMER4_COMPA_vect +#define TIMER_0_ISRB TIMER4_COMPB_vect +#define TIMER_0_ISRC TIMER4_COMPC_vect + +#define TIMER_1 MEGA_TIMER5 +#define TIMER_1_MASK &TIMSK5 +#define TIMER_1_FLAG &TIFR5 +#define TIMER_1_ISRA TIMER5_COMPA_vect +#define TIMER_1_ISRB TIMER5_COMPB_vect +#define TIMER_1_ISRC TIMER5_COMPC_vect + +#define TIMER_2 MEGA_TIMER1 +#define TIMER_2_MASK &TIMSK1 +#define TIMER_2_FLAG &TIFR1 +#define TIMER_2_ISRA TIMER1_COMPA_vect +#define TIMER_2_ISRB TIMER1_COMPB_vect +#define TIMER_2_ISRC TIMER1_COMPC_vect +/** @} */ + +/** + * @name UART configuration + * + * The UART devices have fixed pin mappings, so all we need to do, is to specify + * which devices we would like to use and their corresponding RX interrupts. See + * the reference manual for the fixed pin mapping. + * + * @{ + */ +#define UART_NUMOF (2U) + +/* UART0 is used for stdio */ +#define UART_0 MEGA_UART0 +#define UART_0_ISR USART0_RX_vect + +#define UART_1 MEGA_UART1 +#define UART_1_ISR USART1_RX_vect +/** @} */ + +/** + * @name SPI configuration + * + * The atmega256rfr has only one hardware SPI with fixed pin configuration, so all + * we can do here, is to enable or disable it. + * + * PINS SS SCK MOSI MISO + * PB0 PB1 PB2 PB3 + * @{ + */ +#define SPI_NUMOF (1U) /* set to 0 to disable SPI */ +/** @} */ + +/** + * @name I2C configuration + * @{ + */ +#define I2C_NUMOF (1U) +/** @} */ + +/** + * @name ADC Configuration + * @{ + */ +#define ADC_NUMOF (8U) +/** @} */ + +#ifdef __cplusplus +} +#endif + +/** @} */ +#endif /* PERIPH_CONF_H */