/* * Copyright (C) 2015 HAW Hamburg * 2016 Freie Universität Berlin * 2016 INRIA * * 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 cpu_atmega_common * @{ * * @file * @brief CPU specific definitions for internal peripheral handling * * @author René Herthel * @author Hauke Petersen * @author Francisco Acosta */ #ifndef PERIPH_CPU_COMMON_H #define PERIPH_CPU_COMMON_H #ifdef __cplusplus extern "C" { #endif /** * @brief Define a CPU specific GPIO pin generator macro */ #define GPIO_PIN(x, y) ((x << 4) | y) /** * @brief Override the GPIO flanks * * This device has an additional mode in which the interrupt is triggered * when the pin is low. * * Enumeration order is important, do not modify. * @{ */ #define HAVE_GPIO_FLANK_T typedef enum { GPIO_LOW, /**< emit interrupt when pin low */ GPIO_BOTH, /**< emit interrupt on both flanks */ GPIO_FALLING, /**< emit interrupt on falling flank */ GPIO_RISING, /**< emit interrupt on rising flank */ } gpio_flank_t; /** @} */ /** * @brief Use some common SPI functions * @{ */ #define PERIPH_SPI_NEEDS_INIT_CS #define PERIPH_SPI_NEEDS_TRANSFER_BYTE #define PERIPH_SPI_NEEDS_TRANSFER_REG #define PERIPH_SPI_NEEDS_TRANSFER_REGS /** @} */ /** * @brief SPI mode select macro * * The polarity is determined by bit 3 in the configuration register, the phase * by bit 2. */ #define SPI_MODE_SEL(pol, pha) ((pol << 3) | (pha << 2)) /** * @brief Override the SPI mode values * * As the mode is set in bit 3 and 2 of the configuration register, we put the * correct configuration there * @{ */ #define HAVE_SPI_MODE_T typedef enum { SPI_MODE_0 = SPI_MODE_SEL(0, 0), /**< mode 0 */ SPI_MODE_1 = SPI_MODE_SEL(0, 1), /**< mode 1 */ SPI_MODE_2 = SPI_MODE_SEL(1, 0), /**< mode 2 */ SPI_MODE_3 = SPI_MODE_SEL(1, 1) /**< mode 3 */ } spi_mode_t; /** @} */ /** * @brief SPI speed selection macro * * We encode the speed in bits 2, 1, and 0, where bit0 and bit1 hold the SPCR * prescaler bits, while bit2 holds the SPI2X bit. */ #define SPI_CLK_SEL(s2x, pr1, pr0) ((s2x << 2) | (pr1 << 1) | pr0) /** * @brief Override SPI speed values * * We assume a master clock speed of 16MHz here. * @{ */ #define HAVE_SPI_CLK_T typedef enum { SPI_CLK_100KHZ = SPI_CLK_SEL(0, 1, 1), /**< 16/128 -> 125KHz */ SPI_CLK_400KHZ = SPI_CLK_SEL(1, 1, 0), /**< 16/32 -> 500KHz */ SPI_CLK_1MHZ = SPI_CLK_SEL(0, 0, 1), /**< 16/16 -> 1MHz */ SPI_CLK_5MHZ = SPI_CLK_SEL(0, 0, 0), /**< 16/4 -> 4MHz */ SPI_CLK_10MHZ = SPI_CLK_SEL(1, 0, 0) /**< 16/2 -> 8MHz */ } spi_clk_t; /** @} */ #ifdef __cplusplus } #endif #endif /* PERIPH_CPU_COMMON_H */ /** @} */