zephyr/boards/arm/nrf52840_pca10090/board.c
Emanuele Di Santo e521ee651f boards: arm: add nrf52840_pca10090
Add support for nrf52840_pca10090, i.e. the nRF52840 SoC on the
pca10090 development kit. The SoC is tasked to route some of the
nRF9160 pins to different components on the development kit.
Additionally, it can be used as a Bluetooth HCI device.

The routing options appear under "Board config" in Kconfig.

Signed-off-by: Emanuele Di Santo <emdi@nordicsemi.no>
2019-01-25 22:26:17 +01:00

206 lines
6.8 KiB
C

/*
* Copyright (c) 2018 Nordic Semiconductor ASA.
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr.h>
#include <init.h>
#include <gpio.h>
#include <logging/log.h>
LOG_MODULE_REGISTER(board_control_pca10090);
/* The following pins on the nRF52840 control the routing of certain
* components/lines on the nRF9160 DK. They are specified as follows:
*
* COMPONENT_SWITCH : ROUTING PIN
*
* NOTE: UART1_VCOM_U7 is on pin 12 of both P0 and P1.
* Both P0.12 -and- P1.12 need to be toggled to route UART1 to VCOM2.
*/
/* GPIO pins on Port 0 */
#define INTERFACE0_U5 13 /* MCU interface pins 0 - 2 */
#define INTERFACE1_U6 24 /* MCU interface pins 3 - 5 */
#define UART1_VCOM_U7 12 /* Route nRF9160 UART1 to VCOM2 */
#define BUTTON1_U12 6
#define BUTTON2_U12 26
#define SWITCH2_U9 8
/* GPIO pins on Port 1 */
#define INTERFACE2_U21 10 /* COEX interface pins 6 - 8 */
#define UART0_VCOM_U14 14 /* Route nRF9160 UART0 to VCOM0 */
#define UART1_VCOM_U7 12 /* Route nRF9160 UART1 to VCOM2 */
#define LED1_U8 5
#define LED2_U8 7
#define LED3_U11 1
#define LED4_U11 3
#define SWITCH1_U9 9
/* MCU interface pins
* These pins can be used for inter-SoC communication.
*
* | nRF9160 | | nRF52840 | nRF9160 DK |
* | P0.17 | -- MCU Interface Pin 0 -- | P0.17 | Arduino 4 |
* | P0.18 | -- MCU Interface Pin 1 -- | P0.20 | Arduino 5 |
* | P0.19 | -- MCU Interface Pin 2 -- | P0.15 | Arduino 6 |
* | P0.21 | -- MCU Interface Pin 3 -- | P0.22 | TRACECLK |
* | P0.22 | -- MCU Interface Pin 4 -- | P1.04 | TRACEDATA0 |
* | P0.23 | -- MCU Interface Pin 5 -- | P1.02 | TRACEDATA1 |
* | COEX0 | -- MCU Interface Pin 6 -- | P1.13 | COEX0_PH |
* | COEX1 | -- MCU Interface Pin 7 -- | P1.11 | COEX1_PH |
* | COEX2 | -- MCU Interface Pin 8 -- | P1.15 | COEX2_PH |
*/
/* The following tables specify the -default- values for each pin.
* Thus, when configuring the pins if there is a one in this table,
* pull the pin to zero instead.
*/
static const u8_t pins_on_p0[][2] = {
{ INTERFACE0_U5, IS_ENABLED(CONFIG_BOARD_PCA10090_INTERFACE0_ARDUINO) },
{ INTERFACE1_U6, IS_ENABLED(CONFIG_BOARD_PCA10090_INTERFACE1_TRACE) },
{ UART1_VCOM_U7, IS_ENABLED(CONFIG_BOARD_PCA10090_UART1_ARDUINO) },
{ BUTTON1_U12, IS_ENABLED(CONFIG_BOARD_PCA10090_BUTTON0_PHY) },
{ BUTTON2_U12, IS_ENABLED(CONFIG_BOARD_PCA10090_BUTTON1_PHY) },
{ SWITCH2_U9, IS_ENABLED(CONFIG_BOARD_PCA10090_SWITCH1_PHY) },
};
static const u8_t pins_on_p1[][2] = {
{ INTERFACE2_U21, IS_ENABLED(CONFIG_BOARD_PCA10090_INTERFACE2_COEX) },
{ UART0_VCOM_U14, IS_ENABLED(CONFIG_BOARD_PCA10090_UART0_VCOM) },
{ UART1_VCOM_U7, IS_ENABLED(CONFIG_BOARD_PCA10090_UART1_ARDUINO) },
{ LED1_U8, IS_ENABLED(CONFIG_BOARD_PCA10090_LED0_PHY) },
{ LED2_U8, IS_ENABLED(CONFIG_BOARD_PCA10090_LED1_PHY) },
{ LED3_U11, IS_ENABLED(CONFIG_BOARD_PCA10090_LED2_PHY) },
{ LED4_U11, IS_ENABLED(CONFIG_BOARD_PCA10090_LED3_PHY) },
{ SWITCH1_U9, IS_ENABLED(CONFIG_BOARD_PCA10090_SWITCH0_PHY) },
};
static void config_print(void)
{
/* Interface pins 0-2 */
LOG_DBG("Routing interface pins 0-2 to %s (pin -> %d)",
IS_ENABLED(CONFIG_BOARD_PCA10090_INTERFACE0_MCU) ?
"nRF52840" :
"Arduino headers",
IS_ENABLED(CONFIG_BOARD_PCA10090_INTERFACE0_MCU));
/* Interface pins 3-5 */
LOG_DBG("Routing interface pins 3-5 to %s (pin -> %d)",
IS_ENABLED(CONFIG_BOARD_PCA10090_INTERFACE1_MCU) ?
"nRF52840" :
"TRACE header",
IS_ENABLED(CONFIG_BOARD_PCA10090_INTERFACE1_MCU));
/* Interface pins 6-8 */
LOG_DBG("Routing interface pins 6-8 to %s (pin -> %d)",
IS_ENABLED(CONFIG_BOARD_PCA10090_INTERFACE2_MCU) ?
"nRF52840" :
"COEX header",
IS_ENABLED(CONFIG_BOARD_PCA10090_INTERFACE2_MCU));
LOG_DBG("Routing nRF9160 UART0 to %s (pin -> %d)",
IS_ENABLED(CONFIG_BOARD_PCA10090_UART0_ARDUINO) ?
"Arduino pin headers" :
"VCOM0",
IS_ENABLED(CONFIG_BOARD_PCA10090_UART0_ARDUINO));
LOG_DBG("Routing nRF9160 UART1 to %s (pin -> %d)",
IS_ENABLED(CONFIG_BOARD_PCA10090_UART1_ARDUINO) ?
"Arduino pin headers" :
"VCOM2",
/* defaults to arduino pins */
IS_ENABLED(CONFIG_BOARD_PCA10090_UART1_VCOM));
LOG_DBG("Routing nRF9160 LED 1 to %s (pin -> %d)",
IS_ENABLED(CONFIG_BOARD_PCA10090_LED0_ARDUINO) ?
"Arduino pin headers" :
"physical LED",
IS_ENABLED(CONFIG_BOARD_PCA10090_LED0_ARDUINO));
LOG_DBG("Routing nRF9160 LED 2 to %s (pin -> %d)",
IS_ENABLED(CONFIG_BOARD_PCA10090_LED1_ARDUINO) ?
"Arduino pin headers" :
"physical LED",
IS_ENABLED(CONFIG_BOARD_PCA10090_LED1_ARDUINO));
LOG_DBG("Routing nRF9160 LED 3 to %s (pin -> %d)",
IS_ENABLED(CONFIG_BOARD_PCA10090_LED2_ARDUINO) ?
"Arduino pin headers" :
"physical LED",
IS_ENABLED(CONFIG_BOARD_PCA10090_LED2_ARDUINO));
LOG_DBG("Routing nRF9160 LED 4 to %s (pin -> %d)",
IS_ENABLED(CONFIG_BOARD_PCA10090_LED3_ARDUINO) ?
"Arduino pin headers" :
"physical LED",
IS_ENABLED(CONFIG_BOARD_PCA10090_LED3_ARDUINO));
LOG_DBG("Routing nRF9160 button 1 to %s (pin -> %d)",
IS_ENABLED(CONFIG_BOARD_PCA10090_BUTTON0_ARDUINO) ?
"Arduino pin headers" :
"physical button",
IS_ENABLED(CONFIG_BOARD_PCA10090_BUTTON0_ARDUINO));
LOG_DBG("Routing nRF9160 button 2 to %s (pin -> %d)",
IS_ENABLED(CONFIG_BOARD_PCA10090_BUTTON1_ARDUINO) ?
"Arduino pin headers" :
"physical button",
IS_ENABLED(CONFIG_BOARD_PCA10090_BUTTON1_ARDUINO));
LOG_DBG("Routing nRF9160 switch 1 to %s (pin -> %d)",
IS_ENABLED(CONFIG_BOARD_PCA10090_SWITCH0_ARDUINO) ?
"Arduino pin headers" :
"physical switch",
IS_ENABLED(CONFIG_BOARD_PCA10090_SWITCH0_ARDUINO));
LOG_DBG("Routing nRF9160 switch 2 to %s (pin -> %d)",
IS_ENABLED(CONFIG_BOARD_PCA10090_SWITCH1_ARDUINO) ?
"Arduino pin headers" :
"physical switch",
IS_ENABLED(CONFIG_BOARD_PCA10090_SWITCH1_ARDUINO));
}
static void configure_pins(struct device *port, const u8_t pins[][2],
size_t size)
{
int err;
for (size_t i = 0; i < size; i++) {
err = gpio_pin_configure(port, pins[i][0], GPIO_DIR_OUT);
__ASSERT(err == 0, "Unable to configure pin %u", pins[i][0]);
/* The pin tables contain the default values for each pin.
* Thus, if there is a one in the table, pull the pin to zero.
*/
err = gpio_pin_write(port, pins[i][0], !pins[i][1]);
__ASSERT(err == 0, "Unable to set pin %u to %u", pins[i][0],
!pins[i][1]);
}
}
static int init(struct device *dev)
{
struct device *p0;
struct device *p1;
p0 = device_get_binding(DT_GPIO_P0_DEV_NAME);
__ASSERT(p0, "Unable to find GPIO %s", DT_GPIO_P0_DEV_NAME);
p1 = device_get_binding(DT_GPIO_P1_DEV_NAME);
__ASSERT(p1, "Unable to find GPIO %s", DT_GPIO_P1_DEV_NAME);
configure_pins(p0, pins_on_p0, ARRAY_SIZE(pins_on_p0));
configure_pins(p1, pins_on_p1, ARRAY_SIZE(pins_on_p1));
config_print();
LOG_INF("Board configured.");
return 0;
}
SYS_INIT(init, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEVICE);