[nrf52] Platform and sample target support for Nordic NRF52 (cortex-M4)

This commit is contained in:
Eric Holland
2016-06-16 16:31:53 -07:00
parent 1491809fd0
commit 6388cde233
14 changed files with 214 additions and 66 deletions

View File

@@ -54,7 +54,7 @@
#ifndef NRF52_H
#define NRF52_H
#include <platform/nrf52_bitfields.h>
#ifdef __cplusplus
extern "C" {
#endif
@@ -498,7 +498,7 @@ typedef struct { /*!< FICR Structure
__I uint32_t DEVICEADDRTYPE; /*!< Device address type */
__I uint32_t DEVICEADDR[2]; /*!< Description collection[0]: Device address 0 */
__I uint32_t RESERVED3[21];
FICR_INFO_Type INFO; /*!< Device info */
FICR_INFO_Type DEVICEINFO; /*!< Device info */
__I uint32_t RESERVED4[185];
FICR_TEMP_Type TEMP; /*!< Registers storing factory TEMP module linearization coefficients */
__I uint32_t RESERVED5[2];

View File

@@ -30,8 +30,8 @@
#include <stdint.h>
#include <stdbool.h>
#include "nrf.h"
#include "system_nrf52.h"
#include <platform/nrf52.h>
#include <platform/system_nrf52.h>
/*lint ++flb "Enter library region" */

View File

@@ -34,7 +34,7 @@ int gpio_config(unsigned nr, unsigned flags)
if (flags & GPIO_OUTPUT) {
NRF_GPIO->PIN_CNF[nr] = GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos | \
NRF_P0->PIN_CNF[nr] = GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos | \
GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos | \
GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos | \
GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos;
@@ -46,7 +46,7 @@ int gpio_config(unsigned nr, unsigned flags)
} else {
init = GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos;
}
NRF_GPIO->PIN_CNF[nr] = GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos | \
NRF_P0->PIN_CNF[nr] = GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos | \
GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos | \
init;
}
@@ -58,9 +58,9 @@ void gpio_set(unsigned nr, unsigned on)
DEBUG_ASSERT(nr <= NRF_MAX_PIN_NUMBER);
if (on > 0) {
NRF_GPIO->OUTSET = 1 << nr;
NRF_P0->OUTSET = 1 << nr;
} else {
NRF_GPIO->OUTCLR = 1 << nr;
NRF_P0->OUTCLR = 1 << nr;
}
}
@@ -68,7 +68,7 @@ int gpio_get(unsigned nr)
{
DEBUG_ASSERT( nr <= NRF_MAX_PIN_NUMBER );
if ( NRF_GPIO->IN & ( 1 << nr) ) {
if ( NRF_P0->IN & ( 1 << nr) ) {
return 1;
} else {
return 0;

View File

@@ -39,13 +39,10 @@ void platform_early_init(void)
void platform_init(void)
{
dprintf(SPEW, "Nordic nrf51xxx platform for lk...\n");
dprintf(SPEW, "Nordic nrf52xxx platform for lk...\n");
dprintf(SPEW, "\tFlash: %d pages of %d bytes each (%dk bytes total)\n", \
NRF_FICR->CODESIZE, NRF_FICR->CODEPAGESIZE, \
(NRF_FICR->CODESIZE * NRF_FICR->CODEPAGESIZE)>>10);
dprintf(SPEW, "\tRAM: %d blocks of %d bytes each (%dk bytes total)\n", \
NRF_FICR->NUMRAMBLOCK, NRF_FICR->SIZERAMBLOCKS, \
(NRF_FICR->NUMRAMBLOCK * NRF_FICR->SIZERAMBLOCKS)>>10);
dprintf(SPEW, "\tRadio MAC address %02x:%02x:%02x:%02x:%02x:%02x\n", \
(NRF_FICR->DEVICEADDR[1] >> 8) & 0xFF, \
(NRF_FICR->DEVICEADDR[1]) & 0xFF, \
@@ -53,6 +50,4 @@ void platform_init(void)
(NRF_FICR->DEVICEADDR[0] >> 16) & 0xFF, \
(NRF_FICR->DEVICEADDR[0] >> 8) & 0xFF, \
(NRF_FICR->DEVICEADDR[0] >> 0) & 0xFF);
dprintf(SPEW, "\tHWID: 0x%04x\n",NRF_FICR->CONFIGID & 0x0000ffff);
}

View File

@@ -10,27 +10,19 @@ MEMBASE := 0x20000000
ARCH := arm
ARM_CPU := cortex-m4
ifeq ($(NRF51_CHIP),nrf51822-qfaa)
ifeq ($(NRF52_CHIP),nrf52832-qfaa)
GLOBAL_DEFINES +=
MEMSIZE ?= 16384
MEMSIZE ?= 65536
endif
ifeq ($(NRF51_CHIP),nrf51822-ceaa)
GLOBAL_DEFINES +=
MEMSIZE ?= 16384
endif
ifeq ($(NRF51_CHIP),nrf51822-qfab)
GLOBAL_DEFINES +=
MEMSIZE ?= 16384
endif
ifeq ($(NRF51_CHIP),nrf51822-cdab)
GLOBAL_DEFINES +=
MEMSIZE ?= 16384
endif
ifeq ($(NRF51_CHIP),nrf51822-qfac)
ifeq ($(NRF52_CHIP),nrf52832-qfab)
GLOBAL_DEFINES +=
MEMSIZE ?= 32768
endif
ifeq ($(NRF51_CHIP),nrf51822-cfac)
ifeq ($(NRF52_CHIP),nrf52832-chaa)
GLOBAL_DEFINES +=
MEMSIZE ?= 65536
endif
ifeq ($(NRF52_CHIP),nrf52832-chab)
GLOBAL_DEFINES +=
MEMSIZE ?= 32768
endif
@@ -48,7 +40,6 @@ MODULE_SRCS += \
$(LOCAL_DIR)/gpio.c \
$(LOCAL_DIR)/timer.c \
LINKER_SCRIPT += \
$(BUILDDIR)/system-twosegment.ld

View File

@@ -59,7 +59,7 @@ void uart_init_early(void)
NRF_UART0->BAUDRATE = UART_BAUDRATE_BAUDRATE_Baud115200 << UART_BAUDRATE_BAUDRATE_Pos;
NRF_UART0->CONFIG = UART_CONFIG_HWFC_Disabled << UART_CONFIG_HWFC_Pos | \
UART_CONFIG_PARITY_Excluded << UART_CONFIG_PARITY_Pos;
NVIC_DisableIRQ(UART0_IRQn);
NVIC_DisableIRQ(UARTE0_UART0_IRQn);
NRF_UART0->ENABLE = UART_ENABLE_ENABLE_Enabled << UART_ENABLE_ENABLE_Pos;
NRF_UART0->TXD = 'E';
NRF_UART0->TASKS_STARTTX=1;
@@ -79,7 +79,7 @@ void uart_init(void)
#endif //ENABLE_UART0
}
void nrf52_UART0_IRQ(void)
void nrf52_UARTE0_UART0_IRQ(void)
{
// char c;
arm_cm_irq_entry();

View File

@@ -40,69 +40,84 @@ void nrf52_##x(void) __WEAK_ALIAS("nrf52_dummy_irq");
DEFAULT_HANDLER(POWER_CLOCK_IRQ);
DEFAULT_HANDLER(RADIO_IRQ);
DEFAULT_HANDLER(UART0_IRQ);
DEFAULT_HANDLER(SPI0_TWI0_IRQ);
DEFAULT_HANDLER(SPI1_TWI1_IRQ);
DEFAULT_HANDLER(RESERVED_IRQ);
DEFAULT_HANDLER(UARTE0_UART0_IRQ);
DEFAULT_HANDLER(SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQ);
DEFAULT_HANDLER(SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQ);
DEFAULT_HANDLER(NFCT_IRQ);
DEFAULT_HANDLER(GPIOTE_IRQ);
DEFAULT_HANDLER(ADC_IRQ);
DEFAULT_HANDLER(SAADC_IRQ);
DEFAULT_HANDLER(TIMER0_IRQ);
DEFAULT_HANDLER(TIMER1_IRQ);
DEFAULT_HANDLER(TIMER2_IRQ);
DEFAULT_HANDLER(RTC0_IRQ);
DEFAULT_HANDLER(TEMP_IRQ);
DEFAULT_HANDLER(RNG_IRQ);
DEFAULT_HANDLER(ECB_IRQ);
DEFAULT_HANDLER(CCM_AAR_IRQ);
DEFAULT_HANDLER(WDT_IRQ);
DEFAULT_HANDLER(RTC1_IRQ);
DEFAULT_HANDLER(QDEC_IRQ);
DEFAULT_HANDLER(LPCOMP_IRQ);
DEFAULT_HANDLER(SWI0_IRQ);
DEFAULT_HANDLER(SWI1_IRQ);
DEFAULT_HANDLER(SWI2_IRQ);
DEFAULT_HANDLER(SWI3_IRQ);
DEFAULT_HANDLER(SWI4_IRQ);
DEFAULT_HANDLER(SWI5_IRQ);
DEFAULT_HANDLER(COMP_LPCOMP_IRQ);
DEFAULT_HANDLER(SWI0_EGU0_IRQ);
DEFAULT_HANDLER(SWI1_EGU1_IRQ);
DEFAULT_HANDLER(SWI2_EGU2_IRQ);
DEFAULT_HANDLER(SWI3_EGU3_IRQ);
DEFAULT_HANDLER(SWI4_EGU4_IRQ);
DEFAULT_HANDLER(SWI5_EGU5_IRQ);
DEFAULT_HANDLER(TIMER3_IRQ);
DEFAULT_HANDLER(TIMER4_IRQ);
DEFAULT_HANDLER(PWM0_IRQ);
DEFAULT_HANDLER(PDM_IRQ);
DEFAULT_HANDLER(MWU_IRQ);
DEFAULT_HANDLER(PWM1_IRQ);
DEFAULT_HANDLER(PWM2_IRQ);
DEFAULT_HANDLER(SPIM2_SPIS2_SPI2_IRQ);
DEFAULT_HANDLER(RTC2_IRQ);
DEFAULT_HANDLER(I2S_IRQ);
DEFAULT_HANDLER(FPU_IRQ);
#define VECTAB_ENTRY(x) [x##n] = nrf51_##x
#define VECTAB_ENTRY(x) [x##n] = nrf52_##x
/* appended to the end of the main vector table */
const void *const __SECTION(".text.boot.vectab2") vectab2[] = {
VECTAB_ENTRY(POWER_CLOCK_IRQ),
VECTAB_ENTRY(RADIO_IRQ),
VECTAB_ENTRY(UART0_IRQ),
VECTAB_ENTRY(SPI0_TWI0_IRQ),
VECTAB_ENTRY(SPI1_TWI1_IRQ),
VECTAB_ENTRY(RESERVED_IRQ),
VECTAB_ENTRY(UARTE0_UART0_IRQ),
VECTAB_ENTRY(SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQ),
VECTAB_ENTRY(SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQ),
VECTAB_ENTRY(NFCT_IRQ),
VECTAB_ENTRY(GPIOTE_IRQ),
VECTAB_ENTRY(ADC_IRQ),
VECTAB_ENTRY(SAADC_IRQ),
VECTAB_ENTRY(TIMER0_IRQ),
VECTAB_ENTRY(TIMER1_IRQ),
VECTAB_ENTRY(TIMER2_IRQ),
VECTAB_ENTRY(RTC0_IRQ),
VECTAB_ENTRY(TEMP_IRQ),
VECTAB_ENTRY(RNG_IRQ),
VECTAB_ENTRY(ECB_IRQ),
VECTAB_ENTRY(CCM_AAR_IRQ),
VECTAB_ENTRY(WDT_IRQ),
VECTAB_ENTRY(RTC1_IRQ),
VECTAB_ENTRY(QDEC_IRQ),
VECTAB_ENTRY(LPCOMP_IRQ),
VECTAB_ENTRY(SWI0_IRQ),
VECTAB_ENTRY(SWI1_IRQ),
VECTAB_ENTRY(SWI2_IRQ),
VECTAB_ENTRY(SWI3_IRQ),
VECTAB_ENTRY(SWI4_IRQ),
VECTAB_ENTRY(SWI5_IRQ),
VECTAB_ENTRY(COMP_LPCOMP_IRQ),
VECTAB_ENTRY(SWI0_EGU0_IRQ),
VECTAB_ENTRY(SWI1_EGU1_IRQ),
VECTAB_ENTRY(SWI2_EGU2_IRQ),
VECTAB_ENTRY(SWI3_EGU3_IRQ),
VECTAB_ENTRY(SWI4_EGU4_IRQ),
VECTAB_ENTRY(SWI5_EGU5_IRQ),
VECTAB_ENTRY(TIMER3_IRQ),
VECTAB_ENTRY(TIMER4_IRQ),
VECTAB_ENTRY(PWM0_IRQ),
VECTAB_ENTRY(PDM_IRQ),
VECTAB_ENTRY(MWU_IRQ),
VECTAB_ENTRY(PWM1_IRQ),
VECTAB_ENTRY(PWM2_IRQ),
VECTAB_ENTRY(SPIM2_SPIS2_SPI2_IRQ),
VECTAB_ENTRY(RTC2_IRQ),
VECTAB_ENTRY(I2S_IRQ),
VECTAB_ENTRY(FPU_IRQ),
};

View File

@@ -0,0 +1,8 @@
MODULES += \
app/shell \
app/tests \
include project/target/nrf-pca10040.mk

View File

@@ -0,0 +1,3 @@
LOCAL_DIR := $(GET_LOCAL_DIR)
TARGET := nrf-pca10040

View File

@@ -0,0 +1,28 @@
/*
* Copyright (c) 2012 Travis Geiselbrecht
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files
* (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge,
* publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef __TARGET_DEBUGCONFIG_H
#define __TARGET_DEBUGCONFIG_H
#define DEBUG_UART 1
#endif

View File

@@ -0,0 +1,38 @@
/*
* Copyright (c) 2012 Travis Geiselbrecht
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files
* (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge,
* publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef __TARGET_GPIOCONFIG_H
#define __TARGET_GPIOCONFIG_H
#include <platform/gpio.h>
#define GPIO_LED1 17
#define GPIO_LED2 18
#define GPIO_LED3 19
#define GPIO_LED4 20
#define UART0_TX_PIN 6
#define UART0_RX_PIN 8
#endif

View File

@@ -0,0 +1,53 @@
/*
* Copyright (c) 2012 Travis Geiselbrecht
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files
* (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge,
* publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <err.h>
#include <debug.h>
#include <target.h>
#include <compiler.h>
#include <dev/gpio.h>
#include <platform/gpio.h>
#include <platform/nrf52.h>
#include <target/gpioconfig.h>
void target_early_init(void)
{
/* configure the usart1 pins */
gpio_config(GPIO_LED1, GPIO_OUTPUT);
gpio_config(GPIO_LED2, GPIO_OUTPUT);
gpio_config(GPIO_LED3, GPIO_OUTPUT);
gpio_config(GPIO_LED4, GPIO_OUTPUT);
gpio_set(GPIO_LED1,1);
gpio_set(GPIO_LED2,1);
gpio_set(GPIO_LED3,0);
gpio_set(GPIO_LED4,0);
nrf52_debug_early_init();
}
void target_init(void)
{
nrf52_debug_init();
dprintf(SPEW,"Target: PCA10040 DK...\n");
}

View File

@@ -0,0 +1,17 @@
LOCAL_DIR := $(GET_LOCAL_DIR)
MODULE := $(LOCAL_DIR)
NRF52_CHIP := nrf52832-qfaa
PLATFORM := nrf52xxx
GLOBAL_DEFINES += \
ENABLE_UART0=1 \
MODULE_SRCS += \
$(LOCAL_DIR)/init.c
include make/module.mk