blob: a4e501cac53654dec51eb6ec024f1ab7fc94cec9 [file] [log] [blame]
/*
* 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);