You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by GitBox <gi...@apache.org> on 2018/10/18 16:41:06 UTC

[GitHub] andrzej-kaczmarek closed pull request #1466: Update all nRF52xxx BSP-s to use new nrf52xxx MCU package

andrzej-kaczmarek closed pull request #1466: Update all nRF52xxx BSP-s to use new nrf52xxx MCU package
URL: https://github.com/apache/mynewt-core/pull/1466
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/hw/bsp/arduino_primo_nrf52/pkg.yml b/hw/bsp/arduino_primo_nrf52/pkg.yml
index cfeac23e11..7ab1e8e27f 100644
--- a/hw/bsp/arduino_primo_nrf52/pkg.yml
+++ b/hw/bsp/arduino_primo_nrf52/pkg.yml
@@ -34,29 +34,11 @@ pkg.cflags.HARDFLOAT:
     - -mfloat-abi=hard -mfpu=fpv4-sp-d16
 
 pkg.deps:
-    - "@apache-mynewt-core/hw/mcu/nordic/nrf52xxx-compat"
+    - "@apache-mynewt-core/hw/mcu/nordic/nrf52xxx"
     - "@apache-mynewt-core/libc/baselibc"
 
-pkg.deps.BLE_DEVICE:
-    - "@apache-mynewt-core/hw/drivers/nimble/nrf52"
-
-pkg.deps.UART_0:
-    - "@apache-mynewt-core/hw/drivers/uart/uart_hal"
-
-pkg.deps.UART_1:
-    - "@apache-mynewt-core/hw/drivers/uart/uart_bitbang"
-
-pkg.deps.ADC_0:
-    - "@apache-mynewt-core/hw/drivers/adc/adc_nrf52"
-
-pkg.deps.PWM_0:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
-pkg.deps.PWM_1:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
-pkg.deps.PWM_2:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
 pkg.deps.SOFT_PWM:
     - "@apache-mynewt-core/hw/drivers/pwm/soft_pwm"
+
+pkg.deps.UARTBB_0:
+    - "@apache-mynewt-core/hw/drivers/uart/uart_bitbang"
diff --git a/hw/bsp/arduino_primo_nrf52/src/hal_bsp.c b/hw/bsp/arduino_primo_nrf52/src/hal_bsp.c
index e18d08f360..45646d8a6e 100644
--- a/hw/bsp/arduino_primo_nrf52/src/hal_bsp.c
+++ b/hw/bsp/arduino_primo_nrf52/src/hal_bsp.c
@@ -28,98 +28,25 @@
 #include "hal/hal_spi.h"
 #include "hal/hal_watchdog.h"
 #include "mcu/nrf52_hal.h"
+#include "mcu/nrf52_periph.h"
 #include "flash_map/flash_map.h"
-#if MYNEWT_VAL(UART_0) || MYNEWT_VAL(UART_1)
-#include "uart/uart.h"
-#endif
-#if MYNEWT_VAL(UART_0)
-#include "uart_hal/uart_hal.h"
-#endif
-#if MYNEWT_VAL(UART_1)
-#include "uart_bitbang/uart_bitbang.h"
-#endif
-#include "bsp.h"
-#if MYNEWT_VAL(ADC_0)
-#include <adc_nrf52/adc_nrf52.h>
-#include <nrfx_saadc.h>
-#endif
-#if MYNEWT_VAL(PWM_0) || MYNEWT_VAL(PWM_1) || MYNEWT_VAL(PWM_2)
-#include <pwm_nrf52/pwm_nrf52.h>
-#endif
 #if MYNEWT_VAL(SOFT_PWM)
-#include <soft_pwm/soft_pwm.h>
-#endif
-
-#if MYNEWT_VAL(UART_0)
-static struct uart_dev os_bsp_uart0;
-static const struct nrf52_uart_cfg os_bsp_uart0_cfg = {
-    .suc_pin_tx = MYNEWT_VAL(UART_0_PIN_TX),
-    .suc_pin_rx = MYNEWT_VAL(UART_0_PIN_RX),
-    .suc_pin_rts = MYNEWT_VAL(UART_0_PIN_RTS),
-    .suc_pin_cts = MYNEWT_VAL(UART_0_PIN_CTS),
-};
-#endif
-
-#if MYNEWT_VAL(UART_1)
-static struct uart_dev os_bsp_bitbang_uart1;
-static const struct uart_bitbang_conf os_bsp_uart1_cfg = {
-    .ubc_txpin = MYNEWT_VAL(UART_1_PIN_TX),
-    .ubc_rxpin = MYNEWT_VAL(UART_1_PIN_RX),
-    .ubc_cputimer_freq = MYNEWT_VAL(OS_CPUTIME_FREQ),
-};
-#endif
-
-#if MYNEWT_VAL(SPI_0_MASTER)
-/*
- * NOTE: Our HAL expects that the SS pin, if used, is treated as a gpio line
- * and is handled outside the SPI routines.
- */
-static const struct nrf52_hal_spi_cfg os_bsp_spi0m_cfg = {
-    .sck_pin      = MYNEWT_VAL(SPI_0_MASTER_PIN_SCK),
-    .mosi_pin     = MYNEWT_VAL(SPI_0_MASTER_PIN_MOSI),
-    .miso_pin     = MYNEWT_VAL(SPI_0_MASTER_PIN_MISO),
-};
-#endif
-
-#if MYNEWT_VAL(SPI_0_SLAVE)
-static const struct nrf52_hal_spi_cfg os_bsp_spi0s_cfg = {
-    .sck_pin      = MYNEWT_VAL(SPI_0_SLAVE_PIN_SCK),
-    .mosi_pin     = MYNEWT_VAL(SPI_0_SLAVE_PIN_MOSI),
-    .miso_pin     = MYNEWT_VAL(SPI_0_SLAVE_PIN_MISO),
-    .ss_pin       = MYNEWT_VAL(SPI_0_SLAVE_PIN_SS),
-};
+#include "pwm/pwm.h"
+#include "soft_pwm/soft_pwm.h"
 #endif
-
-#if MYNEWT_VAL(ADC_0)
-static struct adc_dev os_bsp_adc0;
-static struct nrf52_adc_dev_cfg os_bsp_adc0_config = {
-    .nadc_refmv     = MYNEWT_VAL(ADC_0_REFMV_0),
-};
+#if MYNEWT_VAL(UARTBB_0)
+#include "uart_bitbang/uart_bitbang.h"
 #endif
 
-#if MYNEWT_VAL(PWM_0)
-static struct pwm_dev os_bsp_pwm0;
-int pwm0_idx;
-#endif
-#if MYNEWT_VAL(PWM_1)
-static struct pwm_dev os_bsp_pwm1;
-int pwm1_idx;
-#endif
-#if MYNEWT_VAL(PWM_2)
-static struct pwm_dev os_bsp_pwm2;
-int pwm2_idx;
-#endif
 #if MYNEWT_VAL(SOFT_PWM)
 static struct pwm_dev os_bsp_spwm[MYNEWT_VAL(SOFT_PWM_DEVS)];
-char* spwm_name[MYNEWT_VAL(SOFT_PWM_DEVS)];
-int spwm_idx[MYNEWT_VAL(SOFT_PWM_DEVS)];
 #endif
 
-#if MYNEWT_VAL(I2C_0)
-static const struct nrf52_hal_i2c_cfg hal_i2c_cfg = {
-    .scl_pin = MYNEWT_VAL(I2C_0_PIN_SCL),
-    .sda_pin = MYNEWT_VAL(I2C_0_PIN_SDA),
-    .i2c_frequency = MYNEWT_VAL(I2C_0_FREQ_KHZ),
+#if MYNEWT_VAL(UARTBB_0)
+static const struct uart_bitbang_conf os_bsp_uartbb0_cfg = {
+    .ubc_txpin = MYNEWT_VAL(UARTBB_0_PIN_TX),
+    .ubc_rxpin = MYNEWT_VAL(UARTBB_0_PIN_RX),
+    .ubc_cputimer_freq = MYNEWT_VAL(OS_CPUTIME_FREQ),
 };
 #endif
 
@@ -186,120 +113,32 @@ hal_bsp_get_nvic_priority(int irq_num, uint32_t pri)
 void
 hal_bsp_init(void)
 {
-    int rc;
 #if MYNEWT_VAL(SOFT_PWM)
+    int rc;
     int idx;
+    char *spwm_name;
 #endif
 
     /* Make sure system clocks have started */
     hal_system_clock_start();
 
-#if MYNEWT_VAL(TIMER_0)
-    rc = hal_timer_init(0, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_1)
-    rc = hal_timer_init(1, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_2)
-    rc = hal_timer_init(2, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_3)
-    rc = hal_timer_init(3, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_4)
-    rc = hal_timer_init(4, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_5)
-    rc = hal_timer_init(5, NULL);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(ADC_0)
-    rc = os_dev_create((struct os_dev *) &os_bsp_adc0,
-                       "adc0",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_adc_dev_init,
-                       &os_bsp_adc0_config);
-    assert(rc == 0);
-#endif
+    /* Create all available nRF52840 peripherals */
+    nrf52_periph_create();
 
-#if MYNEWT_VAL(PWM_0)
-    pwm0_idx = 0;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm0,
-                       "pwm0",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm0_idx);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(PWM_1)
-    pwm1_idx = 1;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm1,
-                       "pwm1",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm1_idx);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(PWM_2)
-    pwm2_idx = 2;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm2,
-                       "pwm2",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm2_idx);
-    assert(rc == 0);
-#endif
 #if MYNEWT_VAL(SOFT_PWM)
-    for (idx = 0; idx < MYNEWT_VAL(SOFT_PWM_DEVS); idx++)
-    {
-        spwm_name[idx] = "spwm0";
-        spwm_name[idx][4] = '0' + idx;
-        spwm_idx[idx] = idx;
-        rc = os_dev_create((struct os_dev *) &os_bsp_spwm[idx],
-                           spwm_name[idx],
-                           OS_DEV_INIT_KERNEL,
-                           OS_DEV_INIT_PRIO_DEFAULT,
-                           soft_pwm_dev_init,
-                           &spwm_idx[idx]);
+    for (idx = 0; idx < MYNEWT_VAL(SOFT_PWM_DEVS); idx++) {
+        asprintf(&spwm_name, "spwm%d", idx);
+        rc = os_dev_create(&os_bsp_spwm[idx].pwm_os_dev, spwm_name,
+                           OS_DEV_INIT_KERNEL, OS_DEV_INIT_PRIO_DEFAULT,
+                           soft_pwm_dev_init, UINT_TO_POINTER(idx));
         assert(rc == 0);
     }
 #endif
 
-#if (MYNEWT_VAL(OS_CPUTIME_TIMER_NUM) >= 0)
-    rc = os_cputime_init(MYNEWT_VAL(OS_CPUTIME_FREQ));
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(SPI_0_MASTER)
-    rc = hal_spi_init(0, (void *)&os_bsp_spi0m_cfg, HAL_SPI_TYPE_MASTER);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(SPI_0_SLAVE)
-    rc = hal_spi_init(0, (void *)&os_bsp_spi0s_cfg, HAL_SPI_TYPE_SLAVE);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(UART_0)
-    rc = os_dev_create((struct os_dev *) &os_bsp_uart0, "uart0",
-      OS_DEV_INIT_PRIMARY, 0, uart_hal_init, (void *)&os_bsp_uart0_cfg);
+#if MYNEWT_VAL(UARTBB_0)
+    rc = os_dev_create(&os_bsp_uartbb0.ud_dev, "uartbb0",
+                       OS_DEV_INIT_PRIMARY, 0, uart_bitbang_init,
+                       (void *)&os_bsp_uartbb0_cfg);
     assert(rc == 0);
 #endif
-
-#if MYNEWT_VAL(UART_1)
-    rc = os_dev_create((struct os_dev *) &os_bsp_bitbang_uart1, "uart1",
-      OS_DEV_INIT_PRIMARY, 0, uart_bitbang_init, (void *)&os_bsp_uart1_cfg);
-    assert(rc == 0);
-#endif
-
 }
diff --git a/hw/bsp/arduino_primo_nrf52/syscfg.yml b/hw/bsp/arduino_primo_nrf52/syscfg.yml
index ef6f9d9531..351fdab324 100644
--- a/hw/bsp/arduino_primo_nrf52/syscfg.yml
+++ b/hw/bsp/arduino_primo_nrf52/syscfg.yml
@@ -28,91 +28,36 @@ syscfg.defs:
         description: 'Set to indicate that BSP has NRF52'
         value: 1
 
-    UART_0:
-        description: 'Whether to enable UART0'
-        value:  1
-    UART_0_PIN_TX:
-        description: 'TX pin for UART0'
-        value:  12
-    UART_0_PIN_RX:
-        description: 'RX pin for UART0'
-        value:  11
-    UART_0_PIN_RTS:
-        description: 'RTS pin for UART0'
-        value:  0
-    UART_0_PIN_CTS:
-        description: 'CTS pin for UART0'
-        value:  0
-
-    UART_1:
-        description: 'Whether to enable bitbanger UART1'
-        value:  1
-    UART_1_PIN_TX:
-        description: 'TX pin for UART1'
-        value:  6
-    UART_1_PIN_RX:
-        description: 'RX pin for UART1'
-        value:  5
-
-    SPI_0_MASTER_PIN_SCK:
-        description: 'SCK pin for SPI_0_MASTER'
-        value:  24
-    SPI_0_MASTER_PIN_MOSI:
-        description: 'MOSI pin for SPI_0_MASTER'
-        value:  23
-    SPI_0_MASTER_PIN_MISO:
-        description: 'MISO pin for SPI_0_MASTER'
-        value:  22
-
-    SPI_0_SLAVE_PIN_SCK:
-        description: 'SCK pin for SPI_0_SLAVE'
-        value:  24
-    SPI_0_SLAVE_PIN_MOSI:
-        description: 'MOSI pin for SPI_0_SLAVE'
-        value:  23
-    SPI_0_SLAVE_PIN_MISO:
-        description: 'MISO pin for SPI_0_SLAVE'
-        value:  22
-    SPI_0_SLAVE_PIN_SS:
-        description: 'SS pin for SPI_0_SLAVE'
-        value:  19
-
-    I2C_0_PIN_SCL:
-        description: 'SCL pin for I2C_0'
-        value:  27
-    I2C_0_PIN_SDA:
-        description: 'SDA pin for I2C_0'
-        value:  26
-    I2C_0_FREQ_KHZ:
-        description: 'Frequency in khz for I2C_0 bus'
-        value:  100
-
-    TIMER_0:
-        description: 'NRF52 Timer 0'
-        value:  1
-    TIMER_1:
-        description: 'NRF52 Timer 1'
-        value:  0
-    TIMER_2:
-        description: 'NRF52 Timer 2'
-        value:  0
-    TIMER_3:
-        description: 'NRF52 Timer 3'
-        value:  0
-    TIMER_4:
-        description: 'NRF52 Timer 4'
-        value:  0
-    TIMER_5:
-        description: 'NRF52 RTC 0'
-        value:  0
+    SOFT_PWM:
+        description: 'Enable soft PWM'
+        value: 0
 
-syscfg.defs.BLE_LP_CLOCK:
-    TIMER_0:
+    UARTBB_0:
+        description: 'Enable bit-banger UART 0'
         value: 0
-    TIMER_5:
-        value: 1
+    UARTBB_0_PIN_TX:
+        description: 'TX pin for UARTBB0'
+        value: -1
+    UARTBB_0_PIN_RX:
+        description: 'RX pin for UARTBB0'
+        value: -1
 
 syscfg.vals:
+    # Enable nRF52832 MCU
+    MCU_NRF52832: 1
+    # Set default pins for peripherals
+    UART_0_PIN_TX: 12
+    UART_0_PIN_RX: 11
+    SPI_0_MASTER_PIN_SCK: 24
+    SPI_0_MASTER_PIN_MOSI: 23
+    SPI_0_MASTER_PIN_MISO: 22
+    SPI_0_SLAVE_PIN_SCK: 24
+    SPI_0_SLAVE_PIN_MOSI: 23
+    SPI_0_SLAVE_PIN_MISO: 22
+    SPI_0_SLAVE_PIN_SS: 19
+    I2C_0_PIN_SCL: 27
+    I2C_0_PIN_SDA: 26
+
     CONFIG_FCB_FLASH_AREA: FLASH_AREA_NFFS
     REBOOT_LOG_FLASH_AREA: FLASH_AREA_REBOOT_LOG
     NFFS_FLASH_AREA: FLASH_AREA_NFFS
@@ -122,6 +67,11 @@ syscfg.vals:
     XTAL_32768: 1
 
 syscfg.vals.BLE_LP_CLOCK:
+    TIMER_0: 0
+    TIMER_5: 1
     OS_CPUTIME_FREQ: 32768
     OS_CPUTIME_TIMER_NUM: 5
     BLE_XTAL_SETTLE_TIME: 1500
+
+syscfg.restrictions:
+    - "!UARTBB_0 || (UARTBB_0_PIN_TX >= 0 && UARTBB_0_PIN_RX >= 0)"
diff --git a/hw/bsp/bmd300eval/pkg.yml b/hw/bsp/bmd300eval/pkg.yml
index d48676a76e..b36370ac5d 100644
--- a/hw/bsp/bmd300eval/pkg.yml
+++ b/hw/bsp/bmd300eval/pkg.yml
@@ -34,29 +34,11 @@ pkg.cflags.HARDFLOAT:
     - -mfloat-abi=hard -mfpu=fpv4-sp-d16
 
 pkg.deps:
-    - "@apache-mynewt-core/hw/mcu/nordic/nrf52xxx-compat"
+    - "@apache-mynewt-core/hw/mcu/nordic/nrf52xxx"
     - "@apache-mynewt-core/libc/baselibc"
 
-pkg.deps.BLE_DEVICE:
-    - "@apache-mynewt-core/hw/drivers/nimble/nrf52"
-
-pkg.deps.UART_0:
-    - "@apache-mynewt-core/hw/drivers/uart/uart_hal"
-
-pkg.deps.UART_1:
-    - "@apache-mynewt-core/hw/drivers/uart/uart_bitbang"
-
-pkg.deps.ADC_0:
-    - "@apache-mynewt-core/hw/drivers/adc/adc_nrf52"
-
-pkg.deps.PWM_0:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
-pkg.deps.PWM_1:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
-pkg.deps.PWM_2:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
 pkg.deps.SOFT_PWM:
     - "@apache-mynewt-core/hw/drivers/pwm/soft_pwm"
+
+pkg.deps.UARTBB_0:
+    - "@apache-mynewt-core/hw/drivers/uart/uart_bitbang"
diff --git a/hw/bsp/bmd300eval/src/hal_bsp.c b/hw/bsp/bmd300eval/src/hal_bsp.c
index 63ab3eb07b..2cf8fc6237 100644
--- a/hw/bsp/bmd300eval/src/hal_bsp.c
+++ b/hw/bsp/bmd300eval/src/hal_bsp.c
@@ -29,100 +29,28 @@
 #include "hal/hal_spi.h"
 #include "hal/hal_i2c.h"
 #include "mcu/nrf52_hal.h"
-#if MYNEWT_VAL(UART_0) || MYNEWT_VAL(UART_1)
-#include "uart/uart.h"
-#endif
-#if MYNEWT_VAL(UART_0)
-#include "uart_hal/uart_hal.h"
+#include "mcu/nrf52_periph.h"
+#include "bsp/bsp.h"
+#if MYNEWT_VAL(SOFT_PWM)
+#include "pwm/pwm.h"
+#include "soft_pwm/soft_pwm.h"
 #endif
-#if MYNEWT_VAL(UART_1)
+#if MYNEWT_VAL(UARTBB_0)
 #include "uart_bitbang/uart_bitbang.h"
 #endif
-#include "bsp.h"
-#if MYNEWT_VAL(ADC_0)
-#include <adc_nrf52/adc_nrf52.h>
-#include <nrfx_saadc.h>
-#endif
-#if MYNEWT_VAL(PWM_0) || MYNEWT_VAL(PWM_1) || MYNEWT_VAL(PWM_2)
-#include <pwm_nrf52/pwm_nrf52.h>
-#endif
-#if MYNEWT_VAL(SOFT_PWM)
-#include <soft_pwm/soft_pwm.h>
-#endif
 
-#if MYNEWT_VAL(UART_0)
-static struct uart_dev os_bsp_uart0;
-static const struct nrf52_uart_cfg os_bsp_uart0_cfg = {
-    .suc_pin_tx = MYNEWT_VAL(UART_0_PIN_TX),
-    .suc_pin_rx = MYNEWT_VAL(UART_0_PIN_RX),
-    .suc_pin_rts = MYNEWT_VAL(UART_0_PIN_RTS),
-    .suc_pin_cts = MYNEWT_VAL(UART_0_PIN_CTS),
-};
+#if MYNEWT_VAL(SOFT_PWM)
+static struct pwm_dev os_bsp_spwm[MYNEWT_VAL(SOFT_PWM_DEVS)];
 #endif
 
-#if MYNEWT_VAL(UART_1)
-static struct uart_dev os_bsp_bitbang_uart1;
-static const struct uart_bitbang_conf os_bsp_uart1_cfg = {
-    .ubc_txpin = MYNEWT_VAL(UART_1_PIN_TX),
-    .ubc_rxpin = MYNEWT_VAL(UART_1_PIN_RX),
+#if MYNEWT_VAL(UARTBB_0)
+static const struct uart_bitbang_conf os_bsp_uartbb0_cfg = {
+    .ubc_txpin = MYNEWT_VAL(UARTBB_0_PIN_TX),
+    .ubc_rxpin = MYNEWT_VAL(UARTBB_0_PIN_RX),
     .ubc_cputimer_freq = MYNEWT_VAL(OS_CPUTIME_FREQ),
 };
 #endif
 
-#if MYNEWT_VAL(SPI_0_MASTER)
-/*
- * NOTE: Our HAL expects that the SS pin, if used, is treated as a gpio line
- * and is handled outside the SPI routines.
- */
-static const struct nrf52_hal_spi_cfg os_bsp_spi0m_cfg = {
-    .sck_pin      = MYNEWT_VAL(SPI_0_MASTER_PIN_SCK),
-    .mosi_pin     = MYNEWT_VAL(SPI_0_MASTER_PIN_MOSI),
-    .miso_pin     = MYNEWT_VAL(SPI_0_MASTER_PIN_MISO),
-};
-#endif
-
-#if MYNEWT_VAL(SPI_0_SLAVE)
-static const struct nrf52_hal_spi_cfg os_bsp_spi0s_cfg = {
-    .sck_pin      = MYNEWT_VAL(SPI_0_SLAVE_PIN_SCK),
-    .mosi_pin     = MYNEWT_VAL(SPI_0_SLAVE_PIN_MOSI),
-    .miso_pin     = MYNEWT_VAL(SPI_0_SLAVE_PIN_MISO),
-    .ss_pin       = MYNEWT_VAL(SPI_0_SLAVE_PIN_SS),
-};
-#endif
-
-#if MYNEWT_VAL(I2C_0)
-static const struct nrf52_hal_i2c_cfg hal_i2c_cfg = {
-    .scl_pin = MYNEWT_VAL(I2C_0_PIN_CLK),
-    .sda_pin = MYNEWT_VAL(I2C_0_PIN_SDA),
-    .i2c_frequency = 400    /* 400 kHz */
-};
-#endif
-
-#if MYNEWT_VAL(ADC_0)
-static struct adc_dev os_bsp_adc0;
-static struct nrf52_adc_dev_cfg os_bsp_adc0_config = {
-    .nadc_refmv     = MYNEWT_VAL(ADC_0_REFMV_0),
-};
-#endif
-
-#if MYNEWT_VAL(PWM_0)
-static struct pwm_dev os_bsp_pwm0;
-int pwm0_idx;
-#endif
-#if MYNEWT_VAL(PWM_1)
-static struct pwm_dev os_bsp_pwm1;
-int pwm1_idx;
-#endif
-#if MYNEWT_VAL(PWM_2)
-static struct pwm_dev os_bsp_pwm2;
-int pwm2_idx;
-#endif
-#if MYNEWT_VAL(SOFT_PWM)
-static struct pwm_dev os_bsp_spwm[MYNEWT_VAL(SOFT_PWM_DEVS)];
-char* spwm_name[MYNEWT_VAL(SOFT_PWM_DEVS)];
-int spwm_idx[MYNEWT_VAL(SOFT_PWM_DEVS)];
-#endif
-
 /*
  * What memory to include in coredump.
  */
@@ -186,126 +114,32 @@ hal_bsp_get_nvic_priority(int irq_num, uint32_t pri)
 void
 hal_bsp_init(void)
 {
-    int rc;
 #if MYNEWT_VAL(SOFT_PWM)
+    int rc;
     int idx;
+    char *spwm_name;
 #endif
 
-    (void)rc;
-
     /* Make sure system clocks have started */
     hal_system_clock_start();
 
-#if MYNEWT_VAL(TIMER_0)
-    rc = hal_timer_init(0, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_1)
-    rc = hal_timer_init(1, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_2)
-    rc = hal_timer_init(2, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_3)
-    rc = hal_timer_init(3, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_4)
-    rc = hal_timer_init(4, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_5)
-    rc = hal_timer_init(5, NULL);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(ADC_0)
-    rc = os_dev_create((struct os_dev *) &os_bsp_adc0,
-                       "adc0",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_adc_dev_init,
-                       &os_bsp_adc0_config);
-    assert(rc == 0);
-#endif
+    /* Create all available nRF52840 peripherals */
+    nrf52_periph_create();
 
-#if MYNEWT_VAL(PWM_0)
-    pwm0_idx = 0;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm0,
-                       "pwm0",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm0_idx);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(PWM_1)
-    pwm1_idx = 1;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm1,
-                       "pwm1",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm1_idx);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(PWM_2)
-    pwm2_idx = 2;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm2,
-                       "pwm2",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm2_idx);
-    assert(rc == 0);
-#endif
 #if MYNEWT_VAL(SOFT_PWM)
-    for (idx = 0; idx < MYNEWT_VAL(SOFT_PWM_DEVS); idx++)
-    {
-        spwm_name[idx] = "spwm0";
-        spwm_name[idx][4] = '0' + idx;
-        spwm_idx[idx] = idx;
-        rc = os_dev_create((struct os_dev *) &os_bsp_spwm[idx],
-                           spwm_name[idx],
-                           OS_DEV_INIT_KERNEL,
-                           OS_DEV_INIT_PRIO_DEFAULT,
-                           soft_pwm_dev_init,
-                           &spwm_idx[idx]);
+    for (idx = 0; idx < MYNEWT_VAL(SOFT_PWM_DEVS); idx++) {
+        asprintf(&spwm_name, "spwm%d", idx);
+        rc = os_dev_create(&os_bsp_spwm[idx].pwm_os_dev, spwm_name,
+                           OS_DEV_INIT_KERNEL, OS_DEV_INIT_PRIO_DEFAULT,
+                           soft_pwm_dev_init, UINT_TO_POINTER(idx));
         assert(rc == 0);
     }
 #endif
 
-#if (MYNEWT_VAL(OS_CPUTIME_TIMER_NUM) >= 0)
-    rc = os_cputime_init(MYNEWT_VAL(OS_CPUTIME_FREQ));
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(SPI_0_MASTER)
-    rc = hal_spi_init(0, (void *)&os_bsp_spi0m_cfg, HAL_SPI_TYPE_MASTER);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(SPI_0_SLAVE)
-    rc = hal_spi_init(0, (void *)&os_bsp_spi0s_cfg, HAL_SPI_TYPE_SLAVE);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(I2C_0)
-    rc = hal_i2c_init(0, (void *)&hal_i2c_cfg);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(UART_0)
-    rc = os_dev_create((struct os_dev *) &os_bsp_uart0, "uart0",
-      OS_DEV_INIT_PRIMARY, 0, uart_hal_init, (void *)&os_bsp_uart0_cfg);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(UART_1)
-    rc = os_dev_create((struct os_dev *) &os_bsp_bitbang_uart1, "uart1",
-      OS_DEV_INIT_PRIMARY, 0, uart_bitbang_init, (void *)&os_bsp_uart1_cfg);
+#if MYNEWT_VAL(UARTBB_0)
+    rc = os_dev_create(&os_bsp_uartbb0.ud_dev, "uartbb0",
+                       OS_DEV_INIT_PRIMARY, 0, uart_bitbang_init,
+                       (void *)&os_bsp_uartbb0_cfg);
     assert(rc == 0);
 #endif
 }
diff --git a/hw/bsp/bmd300eval/syscfg.yml b/hw/bsp/bmd300eval/syscfg.yml
index 4d5ceaddeb..b381507961 100644
--- a/hw/bsp/bmd300eval/syscfg.yml
+++ b/hw/bsp/bmd300eval/syscfg.yml
@@ -24,88 +24,25 @@ syscfg.defs:
         description: 'Set to indicate that BSP has NRF52'
         value: 1
 
-    UART_0:
-        description: 'Whether to enable UART0'
-        value:  1
-    UART_0_PIN_TX:
-        description: 'TX pin for UART0'
-        value:  6
-    UART_0_PIN_RX:
-        description: 'RX pin for UART0'
-        value:  8
-    UART_0_PIN_RTS:
-        description: 'RTS pin for UART0'
-        value:  5
-    UART_0_PIN_CTS:
-        description: 'CTS pin for UART0'
-        value:  7
-
-    UART_1:
-        description: 'Whether to enable bitbanger UART1'
-        value:  0
-    UART_1_PIN_TX:
-        description: 'TX pin for UART1'
-        value:  -1
-    UART_1_PIN_RX:
-        description: 'RX pin for UART1'
-        value:  -1
-
-    SPI_0_MASTER_PIN_SCK:
-        description: 'SCK pin for SPI_0_MASTER'
-        value:  23
-    SPI_0_MASTER_PIN_MOSI:
-        description: 'MOSI pin for SPI_0_MASTER'
-        value:  24
-    SPI_0_MASTER_PIN_MISO:
-        description: 'MISO pin for SPI_0_MASTER'
-        value:  25
-
-    SPI_0_SLAVE_PIN_SCK:
-        description: 'SCK pin for SPI_0_SLAVE'
-        value:  23
-    SPI_0_SLAVE_PIN_MOSI:
-        description: 'MOSI pin for SPI_0_SLAVE'
-        value:  24
-    SPI_0_SLAVE_PIN_MISO:
-        description: 'MISO pin for SPI_0_SLAVE'
-        value:  25
-    SPI_0_SLAVE_PIN_SS:
-        description: 'SS pin for SPI_0_SLAVE'
-        value:  22
-
-    I2C_0_PIN_CLK:
-        description: 'Pin Number for I2C Clock'
-        value: 15
-    I2C_0_PIN_SDA:
-        description: 'Pin Number for I2C SDA'
-        value: 14
-
-    TIMER_0:
-        description: 'NRF52 Timer 0'
-        value:  1
-    TIMER_1:
-        description: 'NRF52 Timer 1'
-        value:  0
-    TIMER_2:
-        description: 'NRF52 Timer 2'
-        value:  0
-    TIMER_3:
-        description: 'NRF52 Timer 3'
-        value:  0
-    TIMER_4:
-        description: 'NRF52 Timer 4'
-        value:  0
-    TIMER_5:
-        description: 'NRF52 RTC 0'
-        value:  0
-
-syscfg.defs.BLE_LP_CLOCK:
-    TIMER_0:
+    UARTBB_0:
+        description: 'Enable bit-banger UART 0'
         value: 0
-    TIMER_5:
-        value: 1
+    UARTBB_0_PIN_TX:
+        description: 'TX pin for UARTBB0'
+        value: -1
+    UARTBB_0_PIN_RX:
+        description: 'RX pin for UARTBB0'
+        value: -1
 
 syscfg.vals:
+    # Enable nRF52832 MCU
+    MCU_NRF52832: 1
+    # Set default pins for peripherals
+    UART_0_PIN_TX: 6
+    UART_0_PIN_RX: 8
+    UART_0_PIN_RTS: 5
+    UART_0_PIN_CTS: 7
+
     CONFIG_FCB_FLASH_AREA: FLASH_AREA_NFFS
     REBOOT_LOG_FLASH_AREA: FLASH_AREA_REBOOT_LOG
     NFFS_FLASH_AREA: FLASH_AREA_NFFS
@@ -114,6 +51,11 @@ syscfg.vals:
     XTAL_32768: 1
 
 syscfg.vals.BLE_LP_CLOCK:
+    TIMER_0: 0
+    TIMER_5: 1
     OS_CPUTIME_FREQ: 32768
     OS_CPUTIME_TIMER_NUM: 5
     BLE_XTAL_SETTLE_TIME: 1500
+
+syscfg.restrictions:
+    - "!UARTBB_0 || (UARTBB_0_PIN_TX >= 0 && UARTBB_0_PIN_RX >= 0)"
diff --git a/hw/bsp/dwm1001-dev/pkg.yml b/hw/bsp/dwm1001-dev/pkg.yml
index a48d6cd3f7..b6526eb7e1 100644
--- a/hw/bsp/dwm1001-dev/pkg.yml
+++ b/hw/bsp/dwm1001-dev/pkg.yml
@@ -33,29 +33,11 @@ pkg.cflags.HARDFLOAT:
     - -mfloat-abi=hard -mfpu=fpv4-sp-d16
 
 pkg.deps:
-    - "@apache-mynewt-core/hw/mcu/nordic/nrf52xxx-compat"
+    - "@apache-mynewt-core/hw/mcu/nordic/nrf52xxx"
     - "@apache-mynewt-core/libc/baselibc"
 
-pkg.deps.BLE_DEVICE:
-    - "@apache-mynewt-core/hw/drivers/nimble/nrf52"
-
-pkg.deps.UART_0:
-    - "@apache-mynewt-core/hw/drivers/uart/uart_hal"
-
-pkg.deps.UART_1:
-    - "@apache-mynewt-core/hw/drivers/uart/uart_bitbang"
-
-pkg.deps.ADC_0:
-    - "@apache-mynewt-core/hw/drivers/adc/adc_nrf52"
-
-pkg.deps.PWM_0:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
-pkg.deps.PWM_1:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
-pkg.deps.PWM_2:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
 pkg.deps.SOFT_PWM:
     - "@apache-mynewt-core/hw/drivers/pwm/soft_pwm"
+
+pkg.deps.UARTBB_0:
+    - "@apache-mynewt-core/hw/drivers/uart/uart_bitbang"
diff --git a/hw/bsp/dwm1001-dev/src/hal_bsp.c b/hw/bsp/dwm1001-dev/src/hal_bsp.c
index 3c3a7487a6..0bba4378da 100644
--- a/hw/bsp/dwm1001-dev/src/hal_bsp.c
+++ b/hw/bsp/dwm1001-dev/src/hal_bsp.c
@@ -30,109 +30,25 @@
 #include "hal/hal_watchdog.h"
 #include "hal/hal_i2c.h"
 #include "mcu/nrf52_hal.h"
-#if MYNEWT_VAL(UART_0) || MYNEWT_VAL(UART_1)
-#include "uart/uart.h"
-#endif
-#if MYNEWT_VAL(UART_0)
-#include "uart_hal/uart_hal.h"
-#endif
-#if MYNEWT_VAL(UART_1)
-#include "uart_bitbang/uart_bitbang.h"
-#endif
-#include "bsp.h"
-#if MYNEWT_VAL(ADC_0)
-#include <adc_nrf52/adc_nrf52.h>
-#include <nrfx_saadc.h>
-#endif
-#if MYNEWT_VAL(PWM_0) || MYNEWT_VAL(PWM_1) || MYNEWT_VAL(PWM_2)
-#include <pwm_nrf52/pwm_nrf52.h>
-#endif
+#include "mcu/nrf52_periph.h"
+#include "bsp/bsp.h"
 #if MYNEWT_VAL(SOFT_PWM)
-#include <soft_pwm/soft_pwm.h>
-#endif
-
-#if MYNEWT_VAL(UART_0)
-static struct uart_dev os_bsp_uart0;
-static const struct nrf52_uart_cfg os_bsp_uart0_cfg = {
-    .suc_pin_tx = MYNEWT_VAL(UART_0_PIN_TX),
-    .suc_pin_rx = MYNEWT_VAL(UART_0_PIN_RX),
-    .suc_pin_rts = MYNEWT_VAL(UART_0_PIN_RTS),
-    .suc_pin_cts = MYNEWT_VAL(UART_0_PIN_CTS),
-};
-#endif
-
-#if MYNEWT_VAL(UART_1)
-static struct uart_dev os_bsp_bitbang_uart1;
-static const struct uart_bitbang_conf os_bsp_uart1_cfg = {
-    .ubc_txpin = MYNEWT_VAL(UART_1_PIN_TX),
-    .ubc_rxpin = MYNEWT_VAL(UART_1_PIN_RX),
-    .ubc_cputimer_freq = MYNEWT_VAL(OS_CPUTIME_FREQ),
-};
-#endif
-
-#if MYNEWT_VAL(SPI_0_MASTER)
-/*
- * NOTE: Our HAL expects that the SS pin, if used, is treated as a gpio line
- * and is handled outside the SPI routines.
- */
-static const struct nrf52_hal_spi_cfg os_bsp_spi0m_cfg = {
-    .sck_pin      = MYNEWT_VAL(SPI_0_MASTER_PIN_SCK),
-    .mosi_pin     = MYNEWT_VAL(SPI_0_MASTER_PIN_MOSI),
-    .miso_pin     = MYNEWT_VAL(SPI_0_MASTER_PIN_MISO),
-};
-#endif
-
-#if MYNEWT_VAL(SPI_1_MASTER)
-/*
- * NOTE: Our HAL expects that the SS pin, if used, is treated as a gpio line
- * and is handled outside the SPI routines.
- */
-static const struct nrf52_hal_spi_cfg os_bsp_spi1m_cfg = {
-    .sck_pin      = MYNEWT_VAL(SPI_1_MASTER_PIN_SCK),
-    .mosi_pin     = MYNEWT_VAL(SPI_1_MASTER_PIN_MOSI),
-    .miso_pin     = MYNEWT_VAL(SPI_1_MASTER_PIN_MISO),
-};
-#endif
-
-#if MYNEWT_VAL(SPI_1_SLAVE)
-static const struct nrf52_hal_spi_cfg os_bsp_spi1s_cfg = {
-    .sck_pin      = MYNEWT_VAL(SPI_1_SLAVE_PIN_SCK),
-    .mosi_pin     = MYNEWT_VAL(SPI_1_SLAVE_PIN_MOSI),
-    .miso_pin     = MYNEWT_VAL(SPI_1_SLAVE_PIN_MISO),
-    .ss_pin       = MYNEWT_VAL(SPI_1_SLAVE_PIN_SS),
-};
+#include "pwm/pwm.h"
+#include "soft_pwm/soft_pwm.h"
 #endif
-
-#if MYNEWT_VAL(ADC_0)
-static struct adc_dev os_bsp_adc0;
-static struct nrf52_adc_dev_cfg os_bsp_adc0_config = {
-    .nadc_refmv     = MYNEWT_VAL(ADC_0_REFMV_0),
-};
+#if MYNEWT_VAL(UARTBB_0)
+#include "uart_bitbang/uart_bitbang.h"
 #endif
 
-#if MYNEWT_VAL(PWM_0)
-static struct pwm_dev os_bsp_pwm0;
-int pwm0_idx;
-#endif
-#if MYNEWT_VAL(PWM_1)
-static struct pwm_dev os_bsp_pwm1;
-int pwm1_idx;
-#endif
-#if MYNEWT_VAL(PWM_2)
-static struct pwm_dev os_bsp_pwm2;
-int pwm2_idx;
-#endif
 #if MYNEWT_VAL(SOFT_PWM)
 static struct pwm_dev os_bsp_spwm[MYNEWT_VAL(SOFT_PWM_DEVS)];
-char* spwm_name[MYNEWT_VAL(SOFT_PWM_DEVS)];
-int spwm_idx[MYNEWT_VAL(SOFT_PWM_DEVS)];
 #endif
 
-#if MYNEWT_VAL(I2C_0)
-static const struct nrf52_hal_i2c_cfg hal_i2c_cfg = {
-    .scl_pin = MYNEWT_VAL(I2C_0_PIN_SCL),
-    .sda_pin = MYNEWT_VAL(I2C_0_PIN_SDA),
-    .i2c_frequency = MYNEWT_VAL(I2C_0_FREQ_KHZ),
+#if MYNEWT_VAL(UARTBB_0)
+static const struct uart_bitbang_conf os_bsp_uartbb0_cfg = {
+    .ubc_txpin = MYNEWT_VAL(UARTBB_0_PIN_TX),
+    .ubc_rxpin = MYNEWT_VAL(UARTBB_0_PIN_RX),
+    .ubc_cputimer_freq = MYNEWT_VAL(OS_CPUTIME_FREQ),
 };
 #endif
 
@@ -199,132 +115,32 @@ hal_bsp_get_nvic_priority(int irq_num, uint32_t pri)
 void
 hal_bsp_init(void)
 {
-    int rc;
 #if MYNEWT_VAL(SOFT_PWM)
+    int rc;
     int idx;
+    char *spwm_name;
 #endif
 
-    (void)rc;
-
     /* Make sure system clocks have started */
     hal_system_clock_start();
 
-#if MYNEWT_VAL(TIMER_0)
-    rc = hal_timer_init(0, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_1)
-    rc = hal_timer_init(1, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_2)
-    rc = hal_timer_init(2, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_3)
-    rc = hal_timer_init(3, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_4)
-    rc = hal_timer_init(4, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_5)
-    rc = hal_timer_init(5, NULL);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(ADC_0)
-    rc = os_dev_create((struct os_dev *) &os_bsp_adc0,
-                       "adc0",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_adc_dev_init,
-                       &os_bsp_adc0_config);
-    assert(rc == 0);
-#endif
+    /* Create all available nRF52840 peripherals */
+    nrf52_periph_create();
 
-#if MYNEWT_VAL(PWM_0)
-    pwm0_idx = 0;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm0,
-                       "pwm0",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm0_idx);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(PWM_1)
-    pwm1_idx = 1;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm1,
-                       "pwm1",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm1_idx);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(PWM_2)
-    pwm2_idx = 2;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm2,
-                       "pwm2",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm2_idx);
-    assert(rc == 0);
-#endif
 #if MYNEWT_VAL(SOFT_PWM)
-    for (idx = 0; idx < MYNEWT_VAL(SOFT_PWM_DEVS); idx++)
-    {
-        spwm_name[idx] = "spwm0";
-        spwm_name[idx][4] = '0' + idx;
-        spwm_idx[idx] = idx;
-        rc = os_dev_create((struct os_dev *) &os_bsp_spwm[idx],
-                           spwm_name[idx],
-                           OS_DEV_INIT_KERNEL,
-                           OS_DEV_INIT_PRIO_DEFAULT,
-                           soft_pwm_dev_init,
-                           &spwm_idx[idx]);
+    for (idx = 0; idx < MYNEWT_VAL(SOFT_PWM_DEVS); idx++) {
+        asprintf(&spwm_name, "spwm%d", idx);
+        rc = os_dev_create(&os_bsp_spwm[idx].pwm_os_dev, spwm_name,
+                           OS_DEV_INIT_KERNEL, OS_DEV_INIT_PRIO_DEFAULT,
+                           soft_pwm_dev_init, UINT_TO_POINTER(idx));
         assert(rc == 0);
     }
 #endif
 
-#if (MYNEWT_VAL(OS_CPUTIME_TIMER_NUM) >= 0)
-    rc = os_cputime_init(MYNEWT_VAL(OS_CPUTIME_FREQ));
+#if MYNEWT_VAL(UARTBB_0)
+    rc = os_dev_create(&os_bsp_uartbb0.ud_dev, "uartbb0",
+                       OS_DEV_INIT_PRIMARY, 0, uart_bitbang_init,
+                       (void *)&os_bsp_uartbb0_cfg);
     assert(rc == 0);
 #endif
-
-#if MYNEWT_VAL(I2C_0)
-    rc = hal_i2c_init(0, (void *)&hal_i2c_cfg);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(SPI_0_MASTER)
-    rc = hal_spi_init(0, (void *)&os_bsp_spi0m_cfg, HAL_SPI_TYPE_MASTER);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(SPI_1_MASTER)
-    rc = hal_spi_init(1, (void *)&os_bsp_spi1m_cfg, HAL_SPI_TYPE_MASTER);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(SPI_1_SLAVE)
-    rc = hal_spi_init(1, (void *)&os_bsp_spi1s_cfg, HAL_SPI_TYPE_SLAVE);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(UART_0)
-    rc = os_dev_create((struct os_dev *) &os_bsp_uart0, "uart0",
-      OS_DEV_INIT_PRIMARY, 0, uart_hal_init, (void *)&os_bsp_uart0_cfg);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(UART_1)
-    rc = os_dev_create((struct os_dev *) &os_bsp_bitbang_uart1, "uart1",
-      OS_DEV_INIT_PRIMARY, 0, uart_bitbang_init, (void *)&os_bsp_uart1_cfg);
-    assert(rc == 0);
-#endif
-
 }
diff --git a/hw/bsp/dwm1001-dev/syscfg.yml b/hw/bsp/dwm1001-dev/syscfg.yml
index 2ff5a82a2d..2cf1cdf9a9 100644
--- a/hw/bsp/dwm1001-dev/syscfg.yml
+++ b/hw/bsp/dwm1001-dev/syscfg.yml
@@ -23,101 +23,36 @@ syscfg.defs:
         description: 'Set to indicate that BSP has NRF52'
         value: 1
 
-    UART_0:
-        description: 'Whether to enable UART0'
-        value:  1
-    UART_0_PIN_TX:
-        description: 'TX pin for UART0'
-        value:  5
-    UART_0_PIN_RX:
-        description: 'RX pin for UART0'
-        value:  11
-    UART_0_PIN_RTS:
-        description: 'RTS pin for UART0'
-        value:  -1
-    UART_0_PIN_CTS:
-        description: 'CTS pin for UART0'
-        value: -1
-
-    UART_1:
-        description: 'Whether to enable bitbanger UART1'
-        value:  0
-    UART_1_PIN_TX:
-        description: 'TX pin for UART1'
-        value:  -1
-    UART_1_PIN_RX:
-        description: 'RX pin for UART1'
-        value:  -1
-
-    SPI_0_MASTER_PIN_SCK:
-        description: 'SCK pin for SPI_0_MASTER'
-        value:  16
-    SPI_0_MASTER_PIN_MOSI:
-        description: 'MOSI pin for SPI_0_MASTER'
-        value:  20
-    SPI_0_MASTER_PIN_MISO:
-        description: 'MISO pin for SPI_0_MASTER'
-        value:  18
-
-    SPI_1_MASTER_PIN_SCK:
-        description: 'SCK pin for SPI_1_MASTER'
-        value:  4
-    SPI_1_MASTER_PIN_MOSI:
-        description: 'MOSI pin for SPI_1_MASTER'
-        value:  6
-    SPI_1_MASTER_PIN_MISO:
-        description: 'MISO pin for SPI_1_MASTER'
-        value:  7
-
-    SPI_1_SLAVE_PIN_SCK:
-        description: 'SCK pin for SPI_1_SLAVE'
-        value:  4
-    SPI_1_SLAVE_PIN_MOSI:
-        description: 'MOSI pin for SPI_1_SLAVE'
-        value:  6
-    SPI_1_SLAVE_PIN_MISO:
-        description: 'MISO pin for SPI_1_SLAVE'
-        value:  7
-    SPI_1_SLAVE_PIN_SS:
-        description: 'SS pin for SPI_1_SLAVE'
-        value:  3
-
-    I2C_0_PIN_SCL:
-        description: 'SCL pin for I2C_0'
-        value:  28
-    I2C_0_PIN_SDA:
-        description: 'SDA pin for I2C_0'
-        value:  29
-    I2C_0_FREQ_KHZ:
-        description: 'Frequency in khz for I2C_0 bus'
-        value:  400
-
-    TIMER_0:
-        description: 'NRF52 Timer 0'
-        value:  1
-    TIMER_1:
-        description: 'NRF52 Timer 1'
-        value:  0
-    TIMER_2:
-        description: 'NRF52 Timer 2'
-        value:  0
-    TIMER_3:
-        description: 'NRF52 Timer 3'
-        value:  0
-    TIMER_4:
-        description: 'NRF52 Timer 4'
-        value:  0
-    TIMER_5:
-        description: 'NRF52 RTC 0'
-        value:  0
+    SOFT_PWM:
+        description: 'Enable soft PWM'
+        value: 0
 
-syscfg.defs.BLE_LP_CLOCK:
-    TIMER_0:
+    UARTBB_0:
+        description: 'Enable bit-banger UART 0'
         value: 0
-    TIMER_5:
-        value: 1
+    UARTBB_0_PIN_TX:
+        description: 'TX pin for UARTBB0'
+        value: -1
+    UARTBB_0_PIN_RX:
+        description: 'RX pin for UARTBB0'
+        value: -1
 
 syscfg.vals:
+    # Enable nRF52832 MCU
+    MCU_NRF52832: 1
+    # Set default pins for peripherals
+    UART_0_PIN_TX: 5
+    UART_0_PIN_RX: 11
+    SPI_0_MASTER_PIN_SCK: 4
+    SPI_0_MASTER_PIN_MOSI: 6
+    SPI_0_MASTER_PIN_MISO: 7
+    SPI_0_SLAVE_PIN_SCK: 4
+    SPI_0_SLAVE_PIN_MOSI: 6
+    SPI_0_SLAVE_PIN_MISO: 7
+    SPI_0_SLAVE_PIN_SS: 3
+    I2C_0_PIN_SCL: 28
+    I2C_0_PIN_SDA: 29
+
     CONFIG_FCB_FLASH_AREA: FLASH_AREA_NFFS
     REBOOT_LOG_FLASH_AREA: FLASH_AREA_REBOOT_LOG
     NFFS_FLASH_AREA: FLASH_AREA_NFFS
@@ -127,6 +62,11 @@ syscfg.vals:
     BOOT_SERIAL_DETECT_PIN: 2  # Button BT_WAKE_UP
 
 syscfg.vals.BLE_LP_CLOCK:
+    TIMER_0: 0
+    TIMER_5: 1
     OS_CPUTIME_FREQ: 32768
     OS_CPUTIME_TIMER_NUM: 5
     BLE_XTAL_SETTLE_TIME: 1500
+
+syscfg.restrictions:
+    - "!UARTBB_0 || (UARTBB_0_PIN_TX >= 0 && UARTBB_0_PIN_RX >= 0)"
diff --git a/hw/bsp/nina-b1/pkg.yml b/hw/bsp/nina-b1/pkg.yml
index 3a9c6daad3..3a3be6979f 100644
--- a/hw/bsp/nina-b1/pkg.yml
+++ b/hw/bsp/nina-b1/pkg.yml
@@ -33,35 +33,11 @@ pkg.cflags.HARDFLOAT:
     - -mfloat-abi=hard -mfpu=fpv4-sp-d16
 
 pkg.deps:
-    - "@apache-mynewt-core/hw/mcu/nordic/nrf52xxx-compat"
+    - "@apache-mynewt-core/hw/mcu/nordic/nrf52xxx"
     - "@apache-mynewt-core/libc/baselibc"
 
-pkg.deps.BLE_DEVICE:
-    - "@apache-mynewt-core/hw/drivers/nimble/nrf52"
-
-pkg.deps.UART_0:
-    - "@apache-mynewt-core/hw/drivers/uart/uart_hal"
-
-pkg.deps.UART_1:
-    - "@apache-mynewt-core/hw/drivers/uart/uart_bitbang"
-
-pkg.deps.UART_0:
-    - "@apache-mynewt-core/hw/drivers/uart/uart_hal"
-
-pkg.deps.UART_1:
-    - "@apache-mynewt-core/hw/drivers/uart/uart_bitbang"
-
-pkg.deps.ADC_0:
-    - "@apache-mynewt-core/hw/drivers/adc/adc_nrf52"
-
-pkg.deps.PWM_0:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
-pkg.deps.PWM_1:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
-pkg.deps.PWM_2:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
 pkg.deps.SOFT_PWM:
     - "@apache-mynewt-core/hw/drivers/pwm/soft_pwm"
+
+pkg.deps.UARTBB_0:
+    - "@apache-mynewt-core/hw/drivers/uart/uart_bitbang"
diff --git a/hw/bsp/nina-b1/src/hal_bsp.c b/hw/bsp/nina-b1/src/hal_bsp.c
index dcf2659f0e..0bba4378da 100644
--- a/hw/bsp/nina-b1/src/hal_bsp.c
+++ b/hw/bsp/nina-b1/src/hal_bsp.c
@@ -30,97 +30,25 @@
 #include "hal/hal_watchdog.h"
 #include "hal/hal_i2c.h"
 #include "mcu/nrf52_hal.h"
-#if MYNEWT_VAL(UART_0) || MYNEWT_VAL(UART_1)
-#include "uart/uart.h"
-#endif
-#if MYNEWT_VAL(UART_0)
-#include "uart_hal/uart_hal.h"
-#endif
-#if MYNEWT_VAL(UART_1)
-#include "uart_bitbang/uart_bitbang.h"
-#endif
-#include "bsp.h"
-#if MYNEWT_VAL(ADC_0)
-#include <adc_nrf52/adc_nrf52.h>
-#include <nrfx_saadc.h>
-#endif
-#if MYNEWT_VAL(PWM_0) || MYNEWT_VAL(PWM_1) || MYNEWT_VAL(PWM_2)
-#include <pwm_nrf52/pwm_nrf52.h>
-#endif
+#include "mcu/nrf52_periph.h"
+#include "bsp/bsp.h"
 #if MYNEWT_VAL(SOFT_PWM)
-#include <soft_pwm/soft_pwm.h>
-#endif
-
-#if MYNEWT_VAL(UART_0)
-static struct uart_dev os_bsp_uart0;
-static const struct nrf52_uart_cfg os_bsp_uart0_cfg = {
-    .suc_pin_tx = MYNEWT_VAL(UART_0_PIN_TX),
-    .suc_pin_rx = MYNEWT_VAL(UART_0_PIN_RX),
-    .suc_pin_rts = MYNEWT_VAL(UART_0_PIN_RTS),
-    .suc_pin_cts = MYNEWT_VAL(UART_0_PIN_CTS),
-};
-#endif
-
-#if MYNEWT_VAL(UART_1)
-static struct uart_dev os_bsp_bitbang_uart1;
-static const struct uart_bitbang_conf os_bsp_uart1_cfg = {
-    .ubc_rxpin = MYNEWT_VAL(UART_1_PIN_TX),
-    .ubc_txpin = MYNEWT_VAL(UART_1_PIN_RX),
-    .ubc_cputimer_freq = MYNEWT_VAL(OS_CPUTIME_FREQ),
-};
-#endif
-
-#if MYNEWT_VAL(SPI_0_MASTER)
-/*
- * NOTE: Our HAL expects that the SS pin, if used, is treated as a gpio line
- * and is handled outside the SPI routines.
- */
-static const struct nrf52_hal_spi_cfg os_bsp_spi0m_cfg = {
-    .sck_pin      = MYNEWT_VAL(SPI_0_MASTER_PIN_SCK),
-    .mosi_pin     = MYNEWT_VAL(SPI_0_MASTER_PIN_MOSI),
-    .miso_pin     = MYNEWT_VAL(SPI_0_MASTER_PIN_MISO),
-};
+#include "pwm/pwm.h"
+#include "soft_pwm/soft_pwm.h"
 #endif
-
-#if MYNEWT_VAL(SPI_0_SLAVE)
-static const struct nrf52_hal_spi_cfg os_bsp_spi0s_cfg = {
-    .sck_pin      = MYNEWT_VAL(SPI_0_SLAVE_PIN_SCK),
-    .mosi_pin     = MYNEWT_VAL(SPI_0_SLAVE_PIN_MOSI),
-    .miso_pin     = MYNEWT_VAL(SPI_0_SLAVE_PIN_MISO),
-    .ss_pin       = MYNEWT_VAL(SPI_0_SLAVE_PIN_SS),
-};
-#endif
-
-#if MYNEWT_VAL(ADC_0)
-static struct adc_dev os_bsp_adc0;
-static struct nrf52_adc_dev_cfg os_bsp_adc0_config = {
-    .nadc_refmv     = MYNEWT_VAL(ADC_0_REFMV_0),
-};
+#if MYNEWT_VAL(UARTBB_0)
+#include "uart_bitbang/uart_bitbang.h"
 #endif
 
-#if MYNEWT_VAL(PWM_0)
-static struct pwm_dev os_bsp_pwm0;
-int pwm0_idx;
-#endif
-#if MYNEWT_VAL(PWM_1)
-static struct pwm_dev os_bsp_pwm1;
-int pwm1_idx;
-#endif
-#if MYNEWT_VAL(PWM_2)
-static struct pwm_dev os_bsp_pwm2;
-int pwm2_idx;
-#endif
 #if MYNEWT_VAL(SOFT_PWM)
 static struct pwm_dev os_bsp_spwm[MYNEWT_VAL(SOFT_PWM_DEVS)];
-char* spwm_name[MYNEWT_VAL(SOFT_PWM_DEVS)];
-int spwm_idx[MYNEWT_VAL(SOFT_PWM_DEVS)];
 #endif
 
-#if MYNEWT_VAL(I2C_0)
-static const struct nrf52_hal_i2c_cfg hal_i2c_cfg = {
-    .scl_pin = MYNEWT_VAL(I2C_0_PIN_SCL),
-    .sda_pin = MYNEWT_VAL(I2C_0_PIN_SDA),
-    .i2c_frequency = MYNEWT_VAL(I2C_0_FREQ_KHZ),
+#if MYNEWT_VAL(UARTBB_0)
+static const struct uart_bitbang_conf os_bsp_uartbb0_cfg = {
+    .ubc_txpin = MYNEWT_VAL(UARTBB_0_PIN_TX),
+    .ubc_rxpin = MYNEWT_VAL(UARTBB_0_PIN_RX),
+    .ubc_cputimer_freq = MYNEWT_VAL(OS_CPUTIME_FREQ),
 };
 #endif
 
@@ -187,127 +115,32 @@ hal_bsp_get_nvic_priority(int irq_num, uint32_t pri)
 void
 hal_bsp_init(void)
 {
-    int rc;
 #if MYNEWT_VAL(SOFT_PWM)
+    int rc;
     int idx;
+    char *spwm_name;
 #endif
 
-    (void)rc;
-
     /* Make sure system clocks have started */
     hal_system_clock_start();
 
-#if MYNEWT_VAL(TIMER_0)
-    rc = hal_timer_init(0, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_1)
-    rc = hal_timer_init(1, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_2)
-    rc = hal_timer_init(2, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_3)
-    rc = hal_timer_init(3, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_4)
-    rc = hal_timer_init(4, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_5)
-    rc = hal_timer_init(5, NULL);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(ADC_0)
-    rc = os_dev_create((struct os_dev *) &os_bsp_adc0,
-                       "adc0",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_adc_dev_init,
-                       &os_bsp_adc0_config);
-    assert(rc == 0);
-#endif
+    /* Create all available nRF52840 peripherals */
+    nrf52_periph_create();
 
-#if MYNEWT_VAL(PWM_0)
-    pwm0_idx = 0;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm0,
-                       "pwm0",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm0_idx);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(PWM_1)
-    pwm1_idx = 1;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm1,
-                       "pwm1",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm1_idx);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(PWM_2)
-    pwm2_idx = 2;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm2,
-                       "pwm2",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm2_idx);
-    assert(rc == 0);
-#endif
 #if MYNEWT_VAL(SOFT_PWM)
-    for (idx = 0; idx < MYNEWT_VAL(SOFT_PWM_DEVS); idx++)
-    {
-        spwm_name[idx] = "spwm0";
-        spwm_name[idx][4] = '0' + idx;
-        spwm_idx[idx] = idx;
-        rc = os_dev_create((struct os_dev *) &os_bsp_spwm[idx],
-                           spwm_name[idx],
-                           OS_DEV_INIT_KERNEL,
-                           OS_DEV_INIT_PRIO_DEFAULT,
-                           soft_pwm_dev_init,
-                           &spwm_idx[idx]);
+    for (idx = 0; idx < MYNEWT_VAL(SOFT_PWM_DEVS); idx++) {
+        asprintf(&spwm_name, "spwm%d", idx);
+        rc = os_dev_create(&os_bsp_spwm[idx].pwm_os_dev, spwm_name,
+                           OS_DEV_INIT_KERNEL, OS_DEV_INIT_PRIO_DEFAULT,
+                           soft_pwm_dev_init, UINT_TO_POINTER(idx));
         assert(rc == 0);
     }
 #endif
 
-#if (MYNEWT_VAL(OS_CPUTIME_TIMER_NUM) >= 0)
-    rc = os_cputime_init(MYNEWT_VAL(OS_CPUTIME_FREQ));
+#if MYNEWT_VAL(UARTBB_0)
+    rc = os_dev_create(&os_bsp_uartbb0.ud_dev, "uartbb0",
+                       OS_DEV_INIT_PRIMARY, 0, uart_bitbang_init,
+                       (void *)&os_bsp_uartbb0_cfg);
     assert(rc == 0);
 #endif
-
-#if MYNEWT_VAL(I2C_0)
-    rc = hal_i2c_init(0, (void *)&hal_i2c_cfg);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(SPI_0_MASTER)
-    rc = hal_spi_init(0, (void *)&os_bsp_spi0m_cfg, HAL_SPI_TYPE_MASTER);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(SPI_0_SLAVE)
-    rc = hal_spi_init(0, (void *)&os_bsp_spi0s_cfg, HAL_SPI_TYPE_SLAVE);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(UART_0)
-    rc = os_dev_create((struct os_dev *) &os_bsp_uart0, "uart0",
-      OS_DEV_INIT_PRIMARY, 0, uart_hal_init, (void *)&os_bsp_uart0_cfg);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(UART_1)
-    rc = os_dev_create((struct os_dev *) &os_bsp_bitbang_uart1, "uart1",
-      OS_DEV_INIT_PRIMARY, 0, uart_bitbang_init, (void *)&os_bsp_uart1_cfg);
-    assert(rc == 0);
-#endif
-
 }
diff --git a/hw/bsp/nina-b1/syscfg.yml b/hw/bsp/nina-b1/syscfg.yml
index 5beffc68f9..44d8927b23 100644
--- a/hw/bsp/nina-b1/syscfg.yml
+++ b/hw/bsp/nina-b1/syscfg.yml
@@ -23,91 +23,38 @@ syscfg.defs:
         description: 'Set to indicate that BSP has NRF52'
         value: 1
 
-    UART_0:
-        description: 'Whether to enable UART0'
-        value:  1
-    UART_0_PIN_TX:
-        description: 'TX pin for UART0'
-        value:  6
-    UART_0_PIN_RX:
-        description: 'RX pin for UART0'
-        value:  5
-    UART_0_PIN_RTS:
-        description: 'RTS pin for UART0'
-        value:  31
-    UART_0_PIN_CTS:
-        description: 'CTS pin for UART0'
-        value: 7
-
-    UART_1:
-        description: 'whether to enable Bitbanger UART1'
-        value:  0
-    UART_1_PIN_TX:
-        description: 'TX pin for UART1'
-        value:  -1
-    UART_1_PIN_RX:
-        description: 'RX pin for UART1'
-        value:  -1
-
-    SPI_0_MASTER_PIN_SCK:
-        description: 'SCK pin for SPI_0_MASTER'
-        value:  23
-    SPI_0_MASTER_PIN_MOSI:
-        description: 'MOSI pin for SPI_0_MASTER'
-        value:  24
-    SPI_0_MASTER_PIN_MISO:
-        description: 'MISO pin for SPI_0_MASTER'
-        value:  25
-
-    SPI_0_SLAVE_PIN_SCK:
-        description: 'SCK pin for SPI_0_SLAVE'
-        value:  23
-    SPI_0_SLAVE_PIN_MOSI:
-        description: 'MOSI pin for SPI_0_SLAVE'
-        value:  24
-    SPI_0_SLAVE_PIN_MISO:
-        description: 'MISO pin for SPI_0_SLAVE'
-        value:  25
-    SPI_0_SLAVE_PIN_SS:
-        description: 'SS pin for SPI_0_SLAVE'
-        value:  22
-
-    I2C_0_PIN_SCL:
-        description: 'SCL pin for I2C_0'
-        value:  27
-    I2C_0_PIN_SDA:
-        description: 'SDA pin for I2C_0'
-        value:  26
-    I2C_0_FREQ_KHZ:
-        description: 'Frequency in khz for I2C_0 bus'
-        value:  100
-
-    TIMER_0:
-        description: 'NRF52 Timer 0'
-        value:  1
-    TIMER_1:
-        description: 'NRF52 Timer 1'
-        value:  0
-    TIMER_2:
-        description: 'NRF52 Timer 2'
-        value:  0
-    TIMER_3:
-        description: 'NRF52 Timer 3'
-        value:  0
-    TIMER_4:
-        description: 'NRF52 Timer 4'
-        value:  0
-    TIMER_5:
-        description: 'NRF52 RTC 0'
-        value:  0
+    SOFT_PWM:
+        description: 'Enable soft PWM'
+        value: 0
 
-syscfg.defs.BLE_LP_CLOCK:
-    TIMER_0:
+    UARTBB_0:
+        description: 'Enable bit-banger UART 0'
         value: 0
-    TIMER_5:
-        value: 1
+    UARTBB_0_PIN_TX:
+        description: 'TX pin for UARTBB0'
+        value: -1
+    UARTBB_0_PIN_RX:
+        description: 'RX pin for UARTBB0'
+        value: -1
 
 syscfg.vals:
+    # Enable nRF52832 MCU
+    MCU_NRF52832: 1
+    # Set default pins for peripherals
+    UART_0_PIN_TX: 6
+    UART_0_PIN_RX: 5
+    UART_0_PIN_RTS: 31
+    UART_0_PIN_CTS: 7
+    SPI_0_MASTER_PIN_SCK: 14
+    SPI_0_MASTER_PIN_MOSI: 13
+    SPI_0_MASTER_PIN_MISO: 12
+    SPI_0_SLAVE_PIN_SCK: 14
+    SPI_0_SLAVE_PIN_MOSI: 13
+    SPI_0_SLAVE_PIN_MISO: 12
+    SPI_0_SLAVE_PIN_SS: 11
+    I2C_0_PIN_SCL: 3
+    I2C_0_PIN_SDA: 2
+
     CONFIG_FCB_FLASH_AREA: FLASH_AREA_NFFS
     REBOOT_LOG_FLASH_AREA: FLASH_AREA_REBOOT_LOG
     NFFS_FLASH_AREA: FLASH_AREA_NFFS
@@ -118,6 +65,11 @@ syscfg.vals:
     # BOOT_SERIAL_DETECT_PIN 30 # on IRC-BTLE board P0.30=SWITCH_2
 
 syscfg.vals.BLE_LP_CLOCK:
+    TIMER_0: 0
+    TIMER_5: 1
     OS_CPUTIME_FREQ: 32768
     OS_CPUTIME_TIMER_NUM: 5
     BLE_XTAL_SETTLE_TIME: 1500
+
+syscfg.restrictions:
+    - "!UARTBB_0 || (UARTBB_0_PIN_TX >= 0 && UARTBB_0_PIN_RX >= 0)"
diff --git a/hw/bsp/nrf52dk/pkg.yml b/hw/bsp/nrf52dk/pkg.yml
index a911da7bea..cc5951a939 100644
--- a/hw/bsp/nrf52dk/pkg.yml
+++ b/hw/bsp/nrf52dk/pkg.yml
@@ -41,3 +41,6 @@ pkg.deps.ENC_FLASH_DEV:
 
 pkg.deps.SOFT_PWM:
     - "@apache-mynewt-core/hw/drivers/pwm/soft_pwm"
+
+pkg.deps.UARTBB_0:
+    - "@apache-mynewt-core/hw/drivers/uart/uart_bitbang"
diff --git a/hw/bsp/puckjs/pkg.yml b/hw/bsp/puckjs/pkg.yml
index f938b86964..62e655bc93 100644
--- a/hw/bsp/puckjs/pkg.yml
+++ b/hw/bsp/puckjs/pkg.yml
@@ -34,29 +34,11 @@ pkg.cflags.HARDFLOAT:
     - -mfloat-abi=hard -mfpu=fpv4-sp-d16
 
 pkg.deps:
-    - "@apache-mynewt-core/hw/mcu/nordic/nrf52xxx-compat"
+    - "@apache-mynewt-core/hw/mcu/nordic/nrf52xxx"
     - "@apache-mynewt-core/libc/baselibc"
 
-pkg.deps.BLE_DEVICE:
-    - "@apache-mynewt-core/hw/drivers/nimble/nrf52"
-
-pkg.deps.UART_0:
-    - "@apache-mynewt-core/hw/drivers/uart/uart_hal"
-
-pkg.deps.UART_1:
-    - "@apache-mynewt-core/hw/drivers/uart/uart_bitbang"
-
-pkg.deps.ADC_0:
-    - "@apache-mynewt-core/hw/drivers/adc/adc_nrf52"
-
-pkg.deps.PWM_0:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
-pkg.deps.PWM_1:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
-pkg.deps.PWM_2:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
 pkg.deps.SOFT_PWM:
     - "@apache-mynewt-core/hw/drivers/pwm/soft_pwm"
+
+pkg.deps.UARTBB_0:
+    - "@apache-mynewt-core/hw/drivers/uart/uart_bitbang"
diff --git a/hw/bsp/puckjs/src/hal_bsp.c b/hw/bsp/puckjs/src/hal_bsp.c
index f7668825a7..0bba4378da 100644
--- a/hw/bsp/puckjs/src/hal_bsp.c
+++ b/hw/bsp/puckjs/src/hal_bsp.c
@@ -30,97 +30,25 @@
 #include "hal/hal_watchdog.h"
 #include "hal/hal_i2c.h"
 #include "mcu/nrf52_hal.h"
-#if MYNEWT_VAL(UART_0) || MYNEWT_VAL(UART_1)
-#include "uart/uart.h"
-#endif
-#if MYNEWT_VAL(UART_0)
-#include "uart_hal/uart_hal.h"
-#endif
-#if MYNEWT_VAL(UART_1)
-#include "uart_bitbang/uart_bitbang.h"
-#endif
-#include "bsp.h"
-#if MYNEWT_VAL(ADC_0)
-#include <adc_nrf52/adc_nrf52.h>
-#include <nrfx_saadc.h>
-#endif
-#if MYNEWT_VAL(PWM_0) || MYNEWT_VAL(PWM_1) || MYNEWT_VAL(PWM_2)
-#include <pwm_nrf52/pwm_nrf52.h>
-#endif
+#include "mcu/nrf52_periph.h"
+#include "bsp/bsp.h"
 #if MYNEWT_VAL(SOFT_PWM)
-#include <soft_pwm/soft_pwm.h>
-#endif
-
-#if MYNEWT_VAL(UART_0)
-static struct uart_dev os_bsp_uart0;
-static const struct nrf52_uart_cfg os_bsp_uart0_cfg = {
-    .suc_pin_tx = MYNEWT_VAL(UART_0_PIN_TX),
-    .suc_pin_rx = MYNEWT_VAL(UART_0_PIN_RX),
-    .suc_pin_rts = MYNEWT_VAL(UART_0_PIN_RTS),
-    .suc_pin_cts = MYNEWT_VAL(UART_0_PIN_CTS),
-};
-#endif
-
-#if MYNEWT_VAL(UART_1)
-static struct uart_dev os_bsp_bitbang_uart1;
-static const struct uart_bitbang_conf os_bsp_uart1_cfg = {
-    .ubc_txpin = MYNEWT_VAL(UART_1_PIN_TX),
-    .ubc_rxpin = MYNEWT_VAL(UART_1_PIN_RX),
-    .ubc_cputimer_freq = MYNEWT_VAL(OS_CPUTIME_FREQ),
-};
-#endif
-
-#if MYNEWT_VAL(SPI_0_MASTER)
-/*
- * NOTE: Our HAL expects that the SS pin, if used, is treated as a gpio line
- * and is handled outside the SPI routines.
- */
-static const struct nrf52_hal_spi_cfg os_bsp_spi0m_cfg = {
-    .sck_pin      = MYNEWT_VAL(SPI_0_MASTER_PIN_SCK),
-    .mosi_pin     = MYNEWT_VAL(SPI_0_MASTER_PIN_MOSI),
-    .miso_pin     = MYNEWT_VAL(SPI_0_MASTER_PIN_MISO),
-};
+#include "pwm/pwm.h"
+#include "soft_pwm/soft_pwm.h"
 #endif
-
-#if MYNEWT_VAL(SPI_0_SLAVE)
-static const struct nrf52_hal_spi_cfg os_bsp_spi0s_cfg = {
-    .sck_pin      = MYNEWT_VAL(SPI_0_SLAVE_PIN_SCK),
-    .mosi_pin     = MYNEWT_VAL(SPI_0_SLAVE_PIN_MOSI),
-    .miso_pin     = MYNEWT_VAL(SPI_0_SLAVE_PIN_MISO),
-    .ss_pin       = MYNEWT_VAL(SPI_0_SLAVE_PIN_SS),
-};
-#endif
-
-#if MYNEWT_VAL(ADC_0)
-static struct adc_dev os_bsp_adc0;
-static struct nrf52_adc_dev_cfg os_bsp_adc0_config = {
-    .nadc_refmv     = MYNEWT_VAL(ADC_0_REFMV_0),
-};
+#if MYNEWT_VAL(UARTBB_0)
+#include "uart_bitbang/uart_bitbang.h"
 #endif
 
-#if MYNEWT_VAL(PWM_0)
-static struct pwm_dev os_bsp_pwm0;
-int pwm0_idx;
-#endif
-#if MYNEWT_VAL(PWM_1)
-static struct pwm_dev os_bsp_pwm1;
-int pwm1_idx;
-#endif
-#if MYNEWT_VAL(PWM_2)
-static struct pwm_dev os_bsp_pwm2;
-int pwm2_idx;
-#endif
 #if MYNEWT_VAL(SOFT_PWM)
 static struct pwm_dev os_bsp_spwm[MYNEWT_VAL(SOFT_PWM_DEVS)];
-char* spwm_name[MYNEWT_VAL(SOFT_PWM_DEVS)];
-int spwm_idx[MYNEWT_VAL(SOFT_PWM_DEVS)];
 #endif
 
-#if MYNEWT_VAL(I2C_0)
-static const struct nrf52_hal_i2c_cfg hal_i2c_cfg = {
-    .scl_pin = MYNEWT_VAL(I2C_0_PIN_SCL),
-    .sda_pin = MYNEWT_VAL(I2C_0_PIN_SDA),
-    .i2c_frequency = MYNEWT_VAL(I2C_0_FREQ_KHZ),
+#if MYNEWT_VAL(UARTBB_0)
+static const struct uart_bitbang_conf os_bsp_uartbb0_cfg = {
+    .ubc_txpin = MYNEWT_VAL(UARTBB_0_PIN_TX),
+    .ubc_rxpin = MYNEWT_VAL(UARTBB_0_PIN_RX),
+    .ubc_cputimer_freq = MYNEWT_VAL(OS_CPUTIME_FREQ),
 };
 #endif
 
@@ -187,126 +115,32 @@ hal_bsp_get_nvic_priority(int irq_num, uint32_t pri)
 void
 hal_bsp_init(void)
 {
-    int rc;
 #if MYNEWT_VAL(SOFT_PWM)
+    int rc;
     int idx;
+    char *spwm_name;
 #endif
 
-    (void)rc;
-
     /* Make sure system clocks have started */
     hal_system_clock_start();
 
-#if MYNEWT_VAL(TIMER_0)
-    rc = hal_timer_init(0, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_1)
-    rc = hal_timer_init(1, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_2)
-    rc = hal_timer_init(2, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_3)
-    rc = hal_timer_init(3, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_4)
-    rc = hal_timer_init(4, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_5)
-    rc = hal_timer_init(5, NULL);
-    assert(rc == 0);
-#endif
+    /* Create all available nRF52840 peripherals */
+    nrf52_periph_create();
 
-#if MYNEWT_VAL(ADC_0)
-    rc = os_dev_create((struct os_dev *) &os_bsp_adc0,
-                       "adc0",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_adc_dev_init,
-                       &os_bsp_adc0_config);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(PWM_0)
-    pwm0_idx = 0;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm0,
-                       "pwm0",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm0_idx);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(PWM_1)
-    pwm1_idx = 1;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm1,
-                       "pwm1",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm1_idx);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(PWM_2)
-    pwm2_idx = 2;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm2,
-                       "pwm2",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm2_idx);
-    assert(rc == 0);
-#endif
 #if MYNEWT_VAL(SOFT_PWM)
-    for (idx = 0; idx < MYNEWT_VAL(SOFT_PWM_DEVS); idx++)
-    {
-        spwm_name[idx] = "spwm0";
-        spwm_name[idx][4] = '0' + idx;
-        spwm_idx[idx] = idx;
-        rc = os_dev_create((struct os_dev *) &os_bsp_spwm[idx],
-                           spwm_name[idx],
-                           OS_DEV_INIT_KERNEL,
-                           OS_DEV_INIT_PRIO_DEFAULT,
-                           soft_pwm_dev_init,
-                           &spwm_idx[idx]);
+    for (idx = 0; idx < MYNEWT_VAL(SOFT_PWM_DEVS); idx++) {
+        asprintf(&spwm_name, "spwm%d", idx);
+        rc = os_dev_create(&os_bsp_spwm[idx].pwm_os_dev, spwm_name,
+                           OS_DEV_INIT_KERNEL, OS_DEV_INIT_PRIO_DEFAULT,
+                           soft_pwm_dev_init, UINT_TO_POINTER(idx));
         assert(rc == 0);
     }
 #endif
 
-#if (MYNEWT_VAL(OS_CPUTIME_TIMER_NUM) >= 0)
-    rc = os_cputime_init(MYNEWT_VAL(OS_CPUTIME_FREQ));
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(I2C_0)
-    rc = hal_i2c_init(0, (void *)&hal_i2c_cfg);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(SPI_0_MASTER)
-    rc = hal_spi_init(0, (void *)&os_bsp_spi0m_cfg, HAL_SPI_TYPE_MASTER);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(SPI_0_SLAVE)
-    rc = hal_spi_init(0, (void *)&os_bsp_spi0s_cfg, HAL_SPI_TYPE_SLAVE);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(UART_0)
-    rc = os_dev_create((struct os_dev *) &os_bsp_uart0, "uart0",
-      OS_DEV_INIT_PRIMARY, 0, uart_hal_init, (void *)&os_bsp_uart0_cfg);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(UART_1)
-    rc = os_dev_create((struct os_dev *) &os_bsp_bitbang_uart1, "uart1",
-      OS_DEV_INIT_PRIMARY, 0, uart_bitbang_init, (void *)&os_bsp_uart1_cfg);
+#if MYNEWT_VAL(UARTBB_0)
+    rc = os_dev_create(&os_bsp_uartbb0.ud_dev, "uartbb0",
+                       OS_DEV_INIT_PRIMARY, 0, uart_bitbang_init,
+                       (void *)&os_bsp_uartbb0_cfg);
     assert(rc == 0);
 #endif
 }
diff --git a/hw/bsp/puckjs/syscfg.yml b/hw/bsp/puckjs/syscfg.yml
index 3a6142be21..ebe8e47c61 100644
--- a/hw/bsp/puckjs/syscfg.yml
+++ b/hw/bsp/puckjs/syscfg.yml
@@ -23,95 +23,29 @@ syscfg.defs:
         description: 'Set to indicate that BSP has NRF52'
         value: 1
 
-    UART_0:
-        description: 'Whether to enable UART0'
-        value:  0
-        restrictions:
-            - "!SPI_0_MASTER"
-            - "!SPI_0_SLAVE"
-
-    UART_0_PIN_TX:
-        description: 'TX pin for UART0'
-        value:  28
-    UART_0_PIN_RX:
-        description: 'RX pin for UART0'
-        value:  29
-    UART_0_PIN_RTS:
-        description: 'RTS pin for UART0'
-        value:  30
-    UART_0_PIN_CTS:
-        description: 'CTS pin for UART0'
-        value:  31
-
-    UART_1:
-        description: 'Whether to enable bitbanger UART1'
-        value:  0
-    UART_1_PIN_TX:
-        description: 'TX pin for UART1'
-        value:  -1
-    UART_1_PIN_RX:
-        description: 'RX pin for UART1'
-        value:  -1
-
-    SPI_0_MASTER_PIN_SCK:
-        description: 'SCK pin for SPI_0_MASTER'
-        value:  28
-    SPI_0_MASTER_PIN_MOSI:
-        description: 'MOSI pin for SPI_0_MASTER'
-        value:  29
-    SPI_0_MASTER_PIN_MISO:
-        description: 'MISO pin for SPI_0_MASTER'
-        value:  30
-
-    SPI_0_SLAVE_PIN_SCK:
-        description: 'SCK pin for SPI_0_SLAVE'
-        value:  28
-    SPI_0_SLAVE_PIN_MOSI:
-        description: 'MOSI pin for SPI_0_SLAVE'
-        value:  29
-    SPI_0_SLAVE_PIN_MISO:
-        description: 'MISO pin for SPI_0_SLAVE'
-        value:  30
-    SPI_0_SLAVE_PIN_SS:
-        description: 'SS pin for SPI_0_SLAVE'
-        value:  31
-
-    I2C_0_PIN_SCL:
-        description: 'SCL pin for I2C_0'
-        value:  33
-    I2C_0_PIN_SDA:
-        description: 'SDA pin for I2C_0'
-        value:  34
-    I2C_0_FREQ_KHZ:
-        description: 'Frequency in khz for I2C_0 bus'
-        value:  400
-
-    TIMER_0:
-        description: 'NRF52 Timer 0'
-        value:  1
-    TIMER_1:
-        description: 'NRF52 Timer 1'
-        value:  0
-    TIMER_2:
-        description: 'NRF52 Timer 2'
-        value:  0
-    TIMER_3:
-        description: 'NRF52 Timer 3'
-        value:  0
-    TIMER_4:
-        description: 'NRF52 Timer 4'
-        value:  0
-    TIMER_5:
-        description: 'NRF52 RTC 0'
-        value:  0
+    SOFT_PWM:
+        description: 'Enable soft PWM'
+        value: 0
 
-syscfg.defs.BLE_LP_CLOCK:
-    TIMER_0:
+    UARTBB_0:
+        description: 'Enable bit-banger UART 0'
         value: 0
-    TIMER_5:
-        value: 1
+    UARTBB_0_PIN_TX:
+        description: 'TX pin for UARTBB0'
+        value: -1
+    UARTBB_0_PIN_RX:
+        description: 'RX pin for UARTBB0'
+        value: -1
 
 syscfg.vals:
+    # Enable nRF52832 MCU
+    MCU_NRF52832: 1
+    # Set default pins for peripherals
+    UART_0_PIN_TX: 29
+    UART_0_PIN_RX: 28
+    I2C_0_PIN_SCL: 19
+    I2C_0_PIN_SDA: 20
+
     CONFIG_FCB_FLASH_AREA: FLASH_AREA_NFFS
     REBOOT_LOG_FLASH_AREA: FLASH_AREA_REBOOT_LOG
     NFFS_FLASH_AREA: FLASH_AREA_NFFS
@@ -124,6 +58,11 @@ syscfg.vals:
     BLE_LL_MASTER_SCA: 5
 
 syscfg.vals.BLE_LP_CLOCK:
+    TIMER_0: 0
+    TIMER_5: 1
     OS_CPUTIME_FREQ: 32768
     OS_CPUTIME_TIMER_NUM: 5
     BLE_XTAL_SETTLE_TIME: 0
+
+syscfg.restrictions:
+    - "!UARTBB_0 || (UARTBB_0_PIN_TX >= 0 && UARTBB_0_PIN_RX >= 0)"
diff --git a/hw/bsp/rb-blend2/pkg.yml b/hw/bsp/rb-blend2/pkg.yml
index e4aa904ac3..af61a9aa08 100644
--- a/hw/bsp/rb-blend2/pkg.yml
+++ b/hw/bsp/rb-blend2/pkg.yml
@@ -34,29 +34,11 @@ pkg.cflags.HARDFLOAT:
     - -mfloat-abi=hard -mfpu=fpv4-sp-d16
 
 pkg.deps:
-    - "@apache-mynewt-core/hw/mcu/nordic/nrf52xxx-compat"
+    - "@apache-mynewt-core/hw/mcu/nordic/nrf52xxx"
     - "@apache-mynewt-core/libc/baselibc"
 
-pkg.deps.BLE_DEVICE:
-    - "@apache-mynewt-core/hw/drivers/nimble/nrf52"
-
-pkg.deps.UART_0:
-    - "@apache-mynewt-core/hw/drivers/uart/uart_hal"
-
-pkg.deps.UART_1:
-    - "@apache-mynewt-core/hw/drivers/uart/uart_bitbang"
-
-pkg.deps.ADC_0:
-    - "@apache-mynewt-core/hw/drivers/adc/adc_nrf52"
-
-pkg.deps.PWM_0:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
-pkg.deps.PWM_1:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
-pkg.deps.PWM_2:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
 pkg.deps.SOFT_PWM:
     - "@apache-mynewt-core/hw/drivers/pwm/soft_pwm"
+
+pkg.deps.UARTBB_0:
+    - "@apache-mynewt-core/hw/drivers/uart/uart_bitbang"
diff --git a/hw/bsp/rb-blend2/src/hal_bsp.c b/hw/bsp/rb-blend2/src/hal_bsp.c
index 7a7a60c151..929a2d57ee 100644
--- a/hw/bsp/rb-blend2/src/hal_bsp.c
+++ b/hw/bsp/rb-blend2/src/hal_bsp.c
@@ -25,102 +25,29 @@
 #include "hal/hal_bsp.h"
 #include "hal/hal_system.h"
 #include "mcu/nrf52_hal.h"
+#include "mcu/nrf52_periph.h"
 #include "flash_map/flash_map.h"
 #include "hal/hal_flash.h"
 #include "hal/hal_spi.h"
 #include "hal/hal_i2c.h"
 #include "hal/hal_watchdog.h"
-#if MYNEWT_VAL(UART_0) || MYNEWT_VAL(UART_1)
-#include "uart/uart.h"
-#endif
-#if MYNEWT_VAL(UART_0)
-#include "uart_hal/uart_hal.h"
-#endif
-#if MYNEWT_VAL(UART_1)
-#include "uart_bitbang/uart_bitbang.h"
-#endif
-#include "bsp.h"
-#if MYNEWT_VAL(ADC_0)
-#include <adc_nrf52/adc_nrf52.h>
-#include <nrfx_saadc.h>
-#endif
-#if MYNEWT_VAL(PWM_0) || MYNEWT_VAL(PWM_1) || MYNEWT_VAL(PWM_2)
-#include <pwm_nrf52/pwm_nrf52.h>
-#endif
 #if MYNEWT_VAL(SOFT_PWM)
-#include <soft_pwm/soft_pwm.h>
-#endif
-
-#if MYNEWT_VAL(UART_0)
-static struct uart_dev os_bsp_uart0;
-static const struct nrf52_uart_cfg os_bsp_uart0_cfg = {
-    .suc_pin_tx = MYNEWT_VAL(UART_0_PIN_TX),
-    .suc_pin_rx = MYNEWT_VAL(UART_0_PIN_RX),
-    .suc_pin_rts = MYNEWT_VAL(UART_0_PIN_RTS),
-    .suc_pin_cts = MYNEWT_VAL(UART_0_PIN_CTS),
-};
-#endif
-
-#if MYNEWT_VAL(UART_1)
-static struct uart_dev os_bsp_bitbang_uart1;
-static const struct uart_bitbang_conf os_bsp_uart1_cfg = {
-    .ubc_txpin = MYNEWT_VAL(UART_1_PIN_TX),
-    .ubc_rxpin = MYNEWT_VAL(UART_1_PIN_RX),
-    .ubc_cputimer_freq = MYNEWT_VAL(OS_CPUTIME_FREQ),
-};
-#endif
-
-#if MYNEWT_VAL(SPI_0_MASTER)
-/*
- * NOTE: Our HAL expects that the SS pin, if used, is treated as a gpio line
- * and is handled outside the SPI routines.
- */
-static const struct nrf52_hal_spi_cfg os_bsp_spi0m_cfg = {
-    .sck_pin      = MYNEWT_VAL(SPI_0_MASTER_PIN_SCK),
-    .mosi_pin     = MYNEWT_VAL(SPI_0_MASTER_PIN_MOSI),
-    .miso_pin     = MYNEWT_VAL(SPI_0_MASTER_PIN_MISO),
-};
+#include "pwm/pwm.h"
+#include "soft_pwm/soft_pwm.h"
 #endif
-
-#if MYNEWT_VAL(SPI_0_SLAVE)
-static const struct nrf52_hal_spi_cfg os_bsp_spi0s_cfg = {
-    .sck_pin      = MYNEWT_VAL(SPI_0_SLAVE_PIN_SCK),
-    .mosi_pin     = MYNEWT_VAL(SPI_0_SLAVE_PIN_MOSI),
-    .miso_pin     = MYNEWT_VAL(SPI_0_SLAVE_PIN_MISO),
-    .ss_pin       = MYNEWT_VAL(SPI_0_SLAVE_PIN_SS),
-};
-#endif
-
-#if MYNEWT_VAL(ADC_0)
-static struct adc_dev os_bsp_adc0;
-static struct nrf52_adc_dev_cfg os_bsp_adc0_config = {
-    .nadc_refmv     = MYNEWT_VAL(ADC_0_REFMV_0),
-};
+#if MYNEWT_VAL(UARTBB_0)
+#include "uart_bitbang/uart_bitbang.h"
 #endif
 
-#if MYNEWT_VAL(PWM_0)
-static struct pwm_dev os_bsp_pwm0;
-int pwm0_idx;
-#endif
-#if MYNEWT_VAL(PWM_1)
-static struct pwm_dev os_bsp_pwm1;
-int pwm1_idx;
-#endif
-#if MYNEWT_VAL(PWM_2)
-static struct pwm_dev os_bsp_pwm2;
-int pwm2_idx;
-#endif
 #if MYNEWT_VAL(SOFT_PWM)
 static struct pwm_dev os_bsp_spwm[MYNEWT_VAL(SOFT_PWM_DEVS)];
-char* spwm_name[MYNEWT_VAL(SOFT_PWM_DEVS)];
-int spwm_idx[MYNEWT_VAL(SOFT_PWM_DEVS)];
 #endif
 
-#if MYNEWT_VAL(I2C_0)
-static const struct nrf52_hal_i2c_cfg hal_i2c_cfg = {
-    .scl_pin = MYNEWT_VAL(I2C_0_PIN_SCL),
-    .sda_pin = MYNEWT_VAL(I2C_0_PIN_SDA),
-    .i2c_frequency = MYNEWT_VAL(I2C_0_FREQ_KHZ),
+#if MYNEWT_VAL(UARTBB_0)
+static const struct uart_bitbang_conf os_bsp_uartbb0_cfg = {
+    .ubc_txpin = MYNEWT_VAL(UARTBB_0_PIN_TX),
+    .ubc_rxpin = MYNEWT_VAL(UARTBB_0_PIN_RX),
+    .ubc_cputimer_freq = MYNEWT_VAL(OS_CPUTIME_FREQ),
 };
 #endif
 
@@ -187,126 +114,32 @@ hal_bsp_get_nvic_priority(int irq_num, uint32_t pri)
 void
 hal_bsp_init(void)
 {
-    int rc;
 #if MYNEWT_VAL(SOFT_PWM)
+    int rc;
     int idx;
+    char *spwm_name;
 #endif
 
-    (void)rc;
-
     /* Make sure system clocks have started */
     hal_system_clock_start();
 
-#if MYNEWT_VAL(TIMER_0)
-    rc = hal_timer_init(0, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_1)
-    rc = hal_timer_init(1, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_2)
-    rc = hal_timer_init(2, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_3)
-    rc = hal_timer_init(3, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_4)
-    rc = hal_timer_init(4, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_5)
-    rc = hal_timer_init(5, NULL);
-    assert(rc == 0);
-#endif
+    /* Create all available nRF52840 peripherals */
+    nrf52_periph_create();
 
-#if MYNEWT_VAL(ADC_0)
-    rc = os_dev_create((struct os_dev *) &os_bsp_adc0,
-                       "adc0",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_adc_dev_init,
-                       &os_bsp_adc0_config);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(PWM_0)
-    pwm0_idx = 0;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm0,
-                       "pwm0",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm0_idx);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(PWM_1)
-    pwm1_idx = 1;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm1,
-                       "pwm1",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm1_idx);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(PWM_2)
-    pwm2_idx = 2;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm2,
-                       "pwm2",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm2_idx);
-    assert(rc == 0);
-#endif
 #if MYNEWT_VAL(SOFT_PWM)
-    for (idx = 0; idx < MYNEWT_VAL(SOFT_PWM_DEVS); idx++)
-    {
-        spwm_name[idx] = "spwm0";
-        spwm_name[idx][4] = '0' + idx;
-        spwm_idx[idx] = idx;
-        rc = os_dev_create((struct os_dev *) &os_bsp_spwm[idx],
-                           spwm_name[idx],
-                           OS_DEV_INIT_KERNEL,
-                           OS_DEV_INIT_PRIO_DEFAULT,
-                           soft_pwm_dev_init,
-                           &spwm_idx[idx]);
+    for (idx = 0; idx < MYNEWT_VAL(SOFT_PWM_DEVS); idx++) {
+        asprintf(&spwm_name, "spwm%d", idx);
+        rc = os_dev_create(&os_bsp_spwm[idx].pwm_os_dev, spwm_name,
+                           OS_DEV_INIT_KERNEL, OS_DEV_INIT_PRIO_DEFAULT,
+                           soft_pwm_dev_init, UINT_TO_POINTER(idx));
         assert(rc == 0);
     }
 #endif
 
-#if (MYNEWT_VAL(OS_CPUTIME_TIMER_NUM) >= 0)
-    rc = os_cputime_init(MYNEWT_VAL(OS_CPUTIME_FREQ));
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(UART_0)
-    rc = os_dev_create((struct os_dev *) &os_bsp_uart0, "uart0",
-      OS_DEV_INIT_PRIMARY, 0, uart_hal_init, (void *)&os_bsp_uart0_cfg);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(UART_1)
-    rc = os_dev_create((struct os_dev *) &os_bsp_bitbang_uart1, "uart1",
-      OS_DEV_INIT_PRIMARY, 0, uart_bitbang_init, (void *)&os_bsp_uart1_cfg);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(SPI_0_MASTER)
-    rc = hal_spi_init(0, (void *)&os_bsp_spi0m_cfg, HAL_SPI_TYPE_MASTER);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(SPI_0_SLAVE)
-    rc = hal_spi_init(0, (void *)&os_bsp_spi0s_cfg, HAL_SPI_TYPE_SLAVE);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(I2C_0)
-    rc = hal_i2c_init(0, (void *)&hal_i2c_cfg);
+#if MYNEWT_VAL(UARTBB_0)
+    rc = os_dev_create(&os_bsp_uartbb0.ud_dev, "uartbb0",
+                       OS_DEV_INIT_PRIMARY, 0, uart_bitbang_init,
+                       (void *)&os_bsp_uartbb0_cfg);
     assert(rc == 0);
 #endif
 }
diff --git a/hw/bsp/rb-blend2/syscfg.yml b/hw/bsp/rb-blend2/syscfg.yml
index 6d3de0930e..9e60ba01be 100644
--- a/hw/bsp/rb-blend2/syscfg.yml
+++ b/hw/bsp/rb-blend2/syscfg.yml
@@ -24,91 +24,38 @@ syscfg.defs:
         description: 'Set to indicate that BSP has NRF52'
         value: 1
 
-    UART_0:
-        description: 'Whether to enable UART0'
-        value: 1
-    UART_0_PIN_TX:
-        description: 'TX pin for UART0'
-        value: 6
-    UART_0_PIN_RX:
-        description: 'RX pin for UART0'
-        value: 8
-    UART_0_PIN_RTS:
-        description: 'RTS pin for UART0'
-        value: 7
-    UART_0_PIN_CTS:
-        description: 'CTS pin for UART0'
-        value: 5
-
-    UART_1:
-        description: 'Whether to enable bitbanger UART1'
+    SOFT_PWM:
+        description: 'Enable soft PWM'
         value: 0
-    UART_1_PIN_TX:
-        description: 'TX pin for UART1'
-        value: 12
-    UART_1_PIN_RX:
-        description: 'RX pin for UART1'
-        value: 11
-
-    SPI_0_MASTER_PIN_SCK:
-        description: 'SCK pin for SPI_0_MASTER'
-        value:  20
-    SPI_0_MASTER_PIN_MOSI:
-        description: 'MOSI pin for SPI_0_MASTER'
-        value:  23
-    SPI_0_MASTER_PIN_MISO:
-        description: 'MISO pin for SPI_0_MASTER'
-        value:  24
-
-    SPI_0_SLAVE_PIN_SCK:
-        description: 'SCK pin for SPI_0_SLAVE'
-        value:  20
-    SPI_0_SLAVE_PIN_MOSI:
-        description: 'MOSI pin for SPI_0_SLAVE'
-        value:  23
-    SPI_0_SLAVE_PIN_MISO:
-        description: 'MISO pin for SPI_0_SLAVE'
-        value:  24
-    SPI_0_SLAVE_PIN_SS:
-        description: 'SS pin for SPI_0_SLAVE'
-        value:  22
-
-    I2C_0_PIN_SCL:
-        description: 'SCL pin for I2C_0'
-        value:  27
-    I2C_0_PIN_SDA:
-        description: 'SDA pin for I2C_0'
-        value:  26
-    I2C_0_FREQ_KHZ:
-        description: 'Frequency in khz for I2C_0 bus'
-        value:  100
 
-    TIMER_0:
-        description: 'NRF52 Timer 0'
-        value:  1
-    TIMER_1:
-        description: 'NRF52 Timer 1'
-        value:  0
-    TIMER_2:
-        description: 'NRF52 Timer 2'
-        value:  0
-    TIMER_3:
-        description: 'NRF52 Timer 3'
-        value:  0
-    TIMER_4:
-        description: 'NRF52 Timer 4'
-        value:  0
-    TIMER_5:
-        description: 'NRF52 RTC 0'
-        value:  0
-
-syscfg.defs.BLE_LP_CLOCK:
-    TIMER_0:
+    UARTBB_0:
+        description: 'Enable bit-banger UART 0'
         value: 0
-    TIMER_5:
-        value: 1
+    UARTBB_0_PIN_TX:
+        description: 'TX pin for UARTBB0'
+        value: -1
+    UARTBB_0_PIN_RX:
+        description: 'RX pin for UARTBB0'
+        value: -1
 
 syscfg.vals:
+    # Enable nRF52832 MCU
+    MCU_NRF52832: 1
+    # Set default pins for peripherals
+    UART_0_PIN_TX: 6
+    UART_0_PIN_RX: 8
+    UART_0_PIN_RTS: 7
+    UART_0_PIN_CTS: 5
+    SPI_0_MASTER_PIN_SCK: 20
+    SPI_0_MASTER_PIN_MOSI: 23
+    SPI_0_MASTER_PIN_MISO: 24
+    SPI_0_SLAVE_PIN_SCK: 20
+    SPI_0_SLAVE_PIN_MOSI: 23
+    SPI_0_SLAVE_PIN_MISO: 24
+    SPI_0_SLAVE_PIN_SS: 22
+    I2C_0_PIN_SCL: 27
+    I2C_0_PIN_SDA: 26
+
     CONFIG_FCB_FLASH_AREA: FLASH_AREA_NFFS
     REBOOT_LOG_FLASH_AREA: FLASH_AREA_REBOOT_LOG
     NFFS_FLASH_AREA: FLASH_AREA_NFFS
@@ -117,6 +64,11 @@ syscfg.vals:
     XTAL_32768: 1
 
 syscfg.vals.BLE_LP_CLOCK:
+    TIMER_0: 0
+    TIMER_5: 1
     OS_CPUTIME_FREQ: 32768
     OS_CPUTIME_TIMER_NUM: 5
     BLE_XTAL_SETTLE_TIME: 1500
+
+syscfg.restrictions:
+    - "!UARTBB_0 || (UARTBB_0_PIN_TX >= 0 && UARTBB_0_PIN_RX >= 0)"
diff --git a/hw/bsp/rb-nano2/pkg.yml b/hw/bsp/rb-nano2/pkg.yml
index c6025d3249..47472ff08a 100644
--- a/hw/bsp/rb-nano2/pkg.yml
+++ b/hw/bsp/rb-nano2/pkg.yml
@@ -34,29 +34,11 @@ pkg.cflags.HARDFLOAT:
     - -mfloat-abi=hard -mfpu=fpv4-sp-d16
 
 pkg.deps:
-    - "@apache-mynewt-core/hw/mcu/nordic/nrf52xxx-compat"
+    - "@apache-mynewt-core/hw/mcu/nordic/nrf52xxx"
     - "@apache-mynewt-core/libc/baselibc"
 
-pkg.deps.BLE_DEVICE:
-    - "@apache-mynewt-core/hw/drivers/nimble/nrf52"
-
-pkg.deps.UART_0:
-    - "@apache-mynewt-core/hw/drivers/uart/uart_hal"
-
-pkg.deps.UART_1:
-    - "@apache-mynewt-core/hw/drivers/uart/uart_bitbang"
-
-pkg.deps.ADC_0:
-    - "@apache-mynewt-core/hw/drivers/adc/adc_nrf52"
-
-pkg.deps.PWM_0:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
-pkg.deps.PWM_1:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
-pkg.deps.PWM_2:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
 pkg.deps.SOFT_PWM:
     - "@apache-mynewt-core/hw/drivers/pwm/soft_pwm"
+
+pkg.deps.UARTBB_0:
+    - "@apache-mynewt-core/hw/drivers/uart/uart_bitbang"
diff --git a/hw/bsp/rb-nano2/src/hal_bsp.c b/hw/bsp/rb-nano2/src/hal_bsp.c
index ba514efd56..3373f3a79d 100644
--- a/hw/bsp/rb-nano2/src/hal_bsp.c
+++ b/hw/bsp/rb-nano2/src/hal_bsp.c
@@ -25,96 +25,31 @@
 #include "hal/hal_bsp.h"
 #include "hal/hal_system.h"
 #include "mcu/nrf52_hal.h"
+#include "mcu/nrf52_periph.h"
 #include "flash_map/flash_map.h"
 #include "hal/hal_flash.h"
 #include "hal/hal_spi.h"
 #include "hal/hal_watchdog.h"
-#if MYNEWT_VAL(UART_0) || MYNEWT_VAL(UART_1)
-#include "uart/uart.h"
-#endif
-#if MYNEWT_VAL(UART_0)
-#include "uart_hal/uart_hal.h"
+#if MYNEWT_VAL(SOFT_PWM)
+#include "pwm/pwm.h"
+#include "soft_pwm/soft_pwm.h"
 #endif
-#if MYNEWT_VAL(UART_1)
+#if MYNEWT_VAL(UARTBB_0)
 #include "uart_bitbang/uart_bitbang.h"
 #endif
-#include "bsp.h"
-#if MYNEWT_VAL(ADC_0)
-#include <adc_nrf52/adc_nrf52.h>
-#include <nrfx_saadc.h>
-#endif
-#if MYNEWT_VAL(PWM_0) || MYNEWT_VAL(PWM_1) || MYNEWT_VAL(PWM_2)
-#include <pwm_nrf52/pwm_nrf52.h>
-#endif
-#if MYNEWT_VAL(SOFT_PWM)
-#include <soft_pwm/soft_pwm.h>
-#endif
 
-#if MYNEWT_VAL(UART_0)
-static struct uart_dev os_bsp_uart0;
-static const struct nrf52_uart_cfg os_bsp_uart0_cfg = {
-    .suc_pin_tx = MYNEWT_VAL(UART_0_PIN_TX),
-    .suc_pin_rx = MYNEWT_VAL(UART_0_PIN_RX),
-    .suc_pin_rts = MYNEWT_VAL(UART_0_PIN_RTS),
-    .suc_pin_cts = MYNEWT_VAL(UART_0_PIN_CTS),
-};
+#if MYNEWT_VAL(SOFT_PWM)
+static struct pwm_dev os_bsp_spwm[MYNEWT_VAL(SOFT_PWM_DEVS)];
 #endif
 
-#if MYNEWT_VAL(UART_1)
-static struct uart_dev os_bsp_bitbang_uart1;
-static const struct uart_bitbang_conf os_bsp_uart1_cfg = {
-    .ubc_txpin = MYNEWT_VAL(UART_1_PIN_TX),
-    .ubc_rxpin = MYNEWT_VAL(UART_1_PIN_RX),
+#if MYNEWT_VAL(UARTBB_0)
+static const struct uart_bitbang_conf os_bsp_uartbb0_cfg = {
+    .ubc_txpin = MYNEWT_VAL(UARTBB_0_PIN_TX),
+    .ubc_rxpin = MYNEWT_VAL(UARTBB_0_PIN_RX),
     .ubc_cputimer_freq = MYNEWT_VAL(OS_CPUTIME_FREQ),
 };
 #endif
 
-#if MYNEWT_VAL(SPI_0_MASTER)
-/*
- * NOTE: Our HAL expects that the SS pin, if used, is treated as a gpio line
- * and is handled outside the SPI routines.
- */
-static const struct nrf52_hal_spi_cfg os_bsp_spi0m_cfg = {
-    .sck_pin      = MYNEWT_VAL(SPI_0_MASTER_PIN_SCK),
-    .mosi_pin     = MYNEWT_VAL(SPI_0_MASTER_PIN_MOSI),
-    .miso_pin     = MYNEWT_VAL(SPI_0_MASTER_PIN_MISO),
-};
-#endif
-
-#if MYNEWT_VAL(SPI_0_SLAVE)
-static const struct nrf52_hal_spi_cfg os_bsp_spi0s_cfg = {
-    .sck_pin      = MYNEWT_VAL(SPI_0_SLAVE_PIN_SCK),
-    .mosi_pin     = MYNEWT_VAL(SPI_0_SLAVE_PIN_MOSI),
-    .miso_pin     = MYNEWT_VAL(SPI_0_SLAVE_PIN_MISO),
-    .ss_pin       = MYNEWT_VAL(SPI_0_SLAVE_PIN_SS),
-};
-#endif
-
-#if MYNEWT_VAL(ADC_0)
-static struct adc_dev os_bsp_adc0;
-static struct nrf52_adc_dev_cfg os_bsp_adc0_config = {
-    .nadc_refmv     = MYNEWT_VAL(ADC_0_REFMV_0),
-};
-#endif
-
-#if MYNEWT_VAL(PWM_0)
-static struct pwm_dev os_bsp_pwm0;
-int pwm0_idx;
-#endif
-#if MYNEWT_VAL(PWM_1)
-static struct pwm_dev os_bsp_pwm1;
-int pwm1_idx;
-#endif
-#if MYNEWT_VAL(PWM_2)
-static struct pwm_dev os_bsp_pwm2;
-int pwm2_idx;
-#endif
-#if MYNEWT_VAL(SOFT_PWM)
-static struct pwm_dev os_bsp_spwm[MYNEWT_VAL(SOFT_PWM_DEVS)];
-char* spwm_name[MYNEWT_VAL(SOFT_PWM_DEVS)];
-int spwm_idx[MYNEWT_VAL(SOFT_PWM_DEVS)];
-#endif
-
 /*
  * What memory to include in coredump.
  */
@@ -178,122 +113,32 @@ hal_bsp_get_nvic_priority(int irq_num, uint32_t pri)
 void
 hal_bsp_init(void)
 {
-    int rc;
 #if MYNEWT_VAL(SOFT_PWM)
+    int rc;
     int idx;
+    char *spwm_name;
 #endif
 
-    (void)rc;
-
     /* Make sure system clocks have started */
     hal_system_clock_start();
 
-#if MYNEWT_VAL(TIMER_0)
-    rc = hal_timer_init(0, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_1)
-    rc = hal_timer_init(1, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_2)
-    rc = hal_timer_init(2, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_3)
-    rc = hal_timer_init(3, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_4)
-    rc = hal_timer_init(4, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_5)
-    rc = hal_timer_init(5, NULL);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(ADC_0)
-    rc = os_dev_create((struct os_dev *) &os_bsp_adc0,
-                       "adc0",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_adc_dev_init,
-                       &os_bsp_adc0_config);
-    assert(rc == 0);
-#endif
+    /* Create all available nRF52840 peripherals */
+    nrf52_periph_create();
 
-#if MYNEWT_VAL(PWM_0)
-    pwm0_idx = 0;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm0,
-                       "pwm0",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm0_idx);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(PWM_1)
-    pwm1_idx = 1;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm1,
-                       "pwm1",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm1_idx);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(PWM_2)
-    pwm2_idx = 2;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm2,
-                       "pwm2",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm2_idx);
-    assert(rc == 0);
-#endif
 #if MYNEWT_VAL(SOFT_PWM)
-    for (idx = 0; idx < MYNEWT_VAL(SOFT_PWM_DEVS); idx++)
-    {
-        spwm_name[idx] = "spwm0";
-        spwm_name[idx][4] = '0' + idx;
-        spwm_idx[idx] = idx;
-        rc = os_dev_create((struct os_dev *) &os_bsp_spwm[idx],
-                           spwm_name[idx],
-                           OS_DEV_INIT_KERNEL,
-                           OS_DEV_INIT_PRIO_DEFAULT,
-                           soft_pwm_dev_init,
-                           &spwm_idx[idx]);
+    for (idx = 0; idx < MYNEWT_VAL(SOFT_PWM_DEVS); idx++) {
+        asprintf(&spwm_name, "spwm%d", idx);
+        rc = os_dev_create(&os_bsp_spwm[idx].pwm_os_dev, spwm_name,
+                           OS_DEV_INIT_KERNEL, OS_DEV_INIT_PRIO_DEFAULT,
+                           soft_pwm_dev_init, UINT_TO_POINTER(idx));
         assert(rc == 0);
     }
 #endif
 
-#if (MYNEWT_VAL(OS_CPUTIME_TIMER_NUM) >= 0)
-    rc = os_cputime_init(MYNEWT_VAL(OS_CPUTIME_FREQ));
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(SPI_0_MASTER)
-    rc = hal_spi_init(0, (void *)&os_bsp_spi0m_cfg, HAL_SPI_TYPE_MASTER);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(SPI_0_SLAVE)
-    rc = hal_spi_init(0, (void *)&os_bsp_spi0s_cfg, HAL_SPI_TYPE_SLAVE);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(UART_0)
-    rc = os_dev_create((struct os_dev *) &os_bsp_uart0, "uart0",
-      OS_DEV_INIT_PRIMARY, 0, uart_hal_init, (void *)&os_bsp_uart0_cfg);
+#if MYNEWT_VAL(UARTBB_0)
+    rc = os_dev_create(&os_bsp_uartbb0.ud_dev, "uartbb0",
+                       OS_DEV_INIT_PRIMARY, 0, uart_bitbang_init,
+                       (void *)&os_bsp_uartbb0_cfg);
     assert(rc == 0);
 #endif
-
-#if MYNEWT_VAL(UART_1)
-    rc = os_dev_create((struct os_dev *) &os_bsp_bitbang_uart1, "uart1",
-      OS_DEV_INIT_PRIMARY, 0, uart_bitbang_init, (void *)&os_bsp_uart1_cfg);
-    assert(rc == 0);
-#endif
-
 }
diff --git a/hw/bsp/rb-nano2/syscfg.yml b/hw/bsp/rb-nano2/syscfg.yml
index c0362b8532..2fde42cfea 100644
--- a/hw/bsp/rb-nano2/syscfg.yml
+++ b/hw/bsp/rb-nano2/syscfg.yml
@@ -24,81 +24,45 @@ syscfg.defs:
         description: 'Set to indicate that BSP has NRF52'
         value: 1
 
-    UART_0:
-        description: 'Whether to enable UART0'
-        value: 1
-    UART_0_PIN_TX:
-        description: 'TX pin for UART0'
-        value: 29
-    UART_0_PIN_RX:
-        description: 'RX pin for UART0'
-        value: 30
-    UART_0_PIN_RTS:
-        description: 'RTS pin for UART0'
-        value: 2
-    UART_0_PIN_CTS:
-        description: 'CTS pin for UART0'
-        value: 28
-
-    UART_1:
-        description: 'Whether to enable bitbanger UART1'
-        value:  0
-    UART_1_PIN_TX:
-        description: 'TX pin for UART1'
-        value:  -1
-    UART_1_PIN_RX:
-        description: 'RX pin for UART1'
-        value:  -1
-
-    SPI_0_MASTER_PIN_SCK:
-        description: 'SCK pin for SPI_0_MASTER'
-        value:  23
-    SPI_0_MASTER_PIN_MOSI:
-        description: 'MOSI pin for SPI_0_MASTER'
-        value:  24
-    SPI_0_MASTER_PIN_MISO:
-        description: 'MISO pin for SPI_0_MASTER'
-        value:  25
-
-    SPI_0_SLAVE_PIN_SCK:
-        description: 'SCK pin for SPI_0_SLAVE'
-        value:  23
-    SPI_0_SLAVE_PIN_MOSI:
-        description: 'MOSI pin for SPI_0_SLAVE'
-        value:  24
-    SPI_0_SLAVE_PIN_MISO:
-        description: 'MISO pin for SPI_0_SLAVE'
-        value:  25
-    SPI_0_SLAVE_PIN_SS:
-        description: 'SS pin for SPI_0_SLAVE'
-        value:  22
-
-    TIMER_0:
-        description: 'NRF52 Timer 0'
-        value:  1
-    TIMER_1:
-        description: 'NRF52 Timer 1'
-        value:  0
-    TIMER_2:
-        description: 'NRF52 Timer 2'
-        value:  0
-    TIMER_3:
-        description: 'NRF52 Timer 3'
-        value:  0
-    TIMER_4:
-        description: 'NRF52 Timer 4'
-        value:  0
-    TIMER_5:
-        description: 'NRF52 RTC 0'
-        value:  0
+    SOFT_PWM:
+        description: 'Enable soft PWM'
+        value: 0
 
-syscfg.defs.BLE_LP_CLOCK:
-    TIMER_0:
+    UARTBB_0:
+        description: 'Enable bit-banger UART 0'
         value: 0
-    TIMER_5:
-        value: 1
+    UARTBB_0_PIN_TX:
+        description: 'TX pin for UARTBB0'
+        value: -1
+    UARTBB_0_PIN_RX:
+        description: 'RX pin for UARTBB0'
+        value: -1
 
 syscfg.vals:
+    # Enable nRF52832 MCU
+    MCU_NRF52832: 1
+    # Set default pins for peripherals
+    UART_0_PIN_TX: 29
+    UART_0_PIN_RX: 30
+    UART_0_PIN_RTS: 2
+    UART_0_PIN_CTS: 28
+    SPI_0_MASTER_PIN_SCK: 8
+    SPI_0_MASTER_PIN_MOSI: 6
+    SPI_0_MASTER_PIN_MISO: 7
+    SPI_0_SLAVE_PIN_SCK: 8
+    SPI_0_SLAVE_PIN_MOSI: 6
+    SPI_0_SLAVE_PIN_MISO: 7
+    SPI_0_SLAVE_PIN_SS: 3
+    SPI_1_MASTER_PIN_SCK: 2
+    SPI_1_MASTER_PIN_MOSI: 29
+    SPI_1_MASTER_PIN_MISO: 30
+    SPI_1_SLAVE_PIN_SCK: 2
+    SPI_1_SLAVE_PIN_MOSI: 29
+    SPI_1_SLAVE_PIN_MISO: 30
+    SPI_1_SLAVE_PIN_SS: 28
+    I2C_0_PIN_SCL: 2
+    I2C_0_PIN_SDA: 28
+
     CONFIG_FCB_FLASH_AREA: FLASH_AREA_NFFS
     REBOOT_LOG_FLASH_AREA: FLASH_AREA_REBOOT_LOG
     NFFS_FLASH_AREA: FLASH_AREA_NFFS
@@ -107,6 +71,11 @@ syscfg.vals:
     XTAL_32768: 1
 
 syscfg.vals.BLE_LP_CLOCK:
+    TIMER_0: 0
+    TIMER_5: 1
     OS_CPUTIME_FREQ: 32768
     OS_CPUTIME_TIMER_NUM: 5
     BLE_XTAL_SETTLE_TIME: 1500
+
+syscfg.restrictions:
+    - "!UARTBB_0 || (UARTBB_0_PIN_TX >= 0 && UARTBB_0_PIN_RX >= 0)"
diff --git a/hw/bsp/telee02/pkg.yml b/hw/bsp/telee02/pkg.yml
index 33daf3d8b5..d89fe79852 100644
--- a/hw/bsp/telee02/pkg.yml
+++ b/hw/bsp/telee02/pkg.yml
@@ -34,32 +34,14 @@ pkg.cflags.HARDFLOAT:
     - -mfloat-abi=hard -mfpu=fpv4-sp-d16
 
 pkg.deps:
-    - "@apache-mynewt-core/hw/mcu/nordic/nrf52xxx-compat"
+    - "@apache-mynewt-core/hw/mcu/nordic/nrf52xxx"
     - "@apache-mynewt-core/libc/baselibc"
 
-pkg.deps.BLE_DEVICE:
-    - "@apache-mynewt-core/hw/drivers/nimble/nrf52"
-
-pkg.deps.LORA_NODE:
-    - "@apache-mynewt-core/hw/drivers/lora/sx1276"
-
-pkg.deps.UART_0:
-    - "@apache-mynewt-core/hw/drivers/uart/uart_hal"
+pkg.deps.SOFT_PWM:
+    - "@apache-mynewt-core/hw/drivers/pwm/soft_pwm"
 
-pkg.deps.UART_1:
+pkg.deps.UARTBB_0:
     - "@apache-mynewt-core/hw/drivers/uart/uart_bitbang"
 
-pkg.deps.ADC_0:
-    - "@apache-mynewt-core/hw/drivers/adc/adc_nrf52"
-
-pkg.deps.PWM_0:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
-pkg.deps.PWM_1:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
-pkg.deps.PWM_2:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
-pkg.deps.SOFT_PWM:
-    - "@apache-mynewt-core/hw/drivers/pwm/soft_pwm"
+pkg.deps.LORA_NODE:
+    - "@apache-mynewt-core/hw/drivers/lora/sx1276"
diff --git a/hw/bsp/telee02/src/hal_bsp.c b/hw/bsp/telee02/src/hal_bsp.c
index 0d705981e2..464d2a4c24 100644
--- a/hw/bsp/telee02/src/hal_bsp.c
+++ b/hw/bsp/telee02/src/hal_bsp.c
@@ -31,84 +31,28 @@
 #include "hal/hal_watchdog.h"
 #include "hal/hal_i2c.h"
 #include "mcu/nrf52_hal.h"
-#if MYNEWT_VAL(UART_0) || MYNEWT_VAL(UART_1)
-#include "uart/uart.h"
-#endif
-#if MYNEWT_VAL(UART_0)
-#include "uart_hal/uart_hal.h"
+#include "mcu/nrf52_periph.h"
+#include "bsp/bsp.h"
+#if MYNEWT_VAL(SOFT_PWM)
+#include "pwm/pwm.h"
+#include "soft_pwm/soft_pwm.h"
 #endif
-#if MYNEWT_VAL(UART_1)
+#if MYNEWT_VAL(UARTBB_0)
 #include "uart_bitbang/uart_bitbang.h"
 #endif
-#include "bsp.h"
-#if MYNEWT_VAL(ADC_0)
-#include <adc_nrf52/adc_nrf52.h>
-#include <nrfx_saadc.h>
-#endif
-#if MYNEWT_VAL(PWM_0) || MYNEWT_VAL(PWM_1) || MYNEWT_VAL(PWM_2)
-#include <pwm_nrf52/pwm_nrf52.h>
-#endif
-#if MYNEWT_VAL(SOFT_PWM)
-#include <soft_pwm/soft_pwm.h>
-#endif
 
-#if MYNEWT_VAL(UART_0)
-static struct uart_dev os_bsp_uart0;
-static const struct nrf52_uart_cfg os_bsp_uart0_cfg = {
-    .suc_pin_tx = MYNEWT_VAL(UART_0_PIN_TX),
-    .suc_pin_rx = MYNEWT_VAL(UART_0_PIN_RX),
-    .suc_pin_rts = MYNEWT_VAL(UART_0_PIN_RTS),
-    .suc_pin_cts = MYNEWT_VAL(UART_0_PIN_CTS),
-};
+#if MYNEWT_VAL(SOFT_PWM)
+static struct pwm_dev os_bsp_spwm[MYNEWT_VAL(SOFT_PWM_DEVS)];
 #endif
 
-#if MYNEWT_VAL(UART_1)
-static struct uart_dev os_bsp_bitbang_uart1;
-static const struct uart_bitbang_conf os_bsp_uart1_cfg = {
-    .ubc_txpin = MYNEWT_VAL(UART_1_PIN_TX),
-    .ubc_rxpin = MYNEWT_VAL(UART_1_PIN_RX),
+#if MYNEWT_VAL(UARTBB_0)
+static const struct uart_bitbang_conf os_bsp_uartbb0_cfg = {
+    .ubc_txpin = MYNEWT_VAL(UARTBB_0_PIN_TX),
+    .ubc_rxpin = MYNEWT_VAL(UARTBB_0_PIN_RX),
     .ubc_cputimer_freq = MYNEWT_VAL(OS_CPUTIME_FREQ),
 };
 #endif
 
-#if MYNEWT_VAL(SPI_0_MASTER)
-/*
- * NOTE: Our HAL expects that the SS pin, if used, is treated as a gpio line
- * and is handled outside the SPI routines.
- */
-static const struct nrf52_hal_spi_cfg os_bsp_spi0m_cfg = {
-    .sck_pin      = MYNEWT_VAL(SPI_0_MASTER_PIN_SCK),
-    .mosi_pin     = MYNEWT_VAL(SPI_0_MASTER_PIN_MOSI),
-    .miso_pin     = MYNEWT_VAL(SPI_0_MASTER_PIN_MISO),
-};
-#endif
-
-#if MYNEWT_VAL(ADC_0)
-static struct adc_dev os_bsp_adc0;
-static struct nrf52_adc_dev_cfg os_bsp_adc0_config = {
-    .nadc_refmv     = MYNEWT_VAL(ADC_0_REFMV_0),
-};
-#endif
-
-#if MYNEWT_VAL(PWM_0)
-static struct pwm_dev os_bsp_pwm0;
-int pwm0_idx;
-#endif
-#if MYNEWT_VAL(PWM_1)
-static struct pwm_dev os_bsp_pwm1;
-int pwm1_idx;
-#endif
-#if MYNEWT_VAL(PWM_2)
-static struct pwm_dev os_bsp_pwm2;
-int pwm2_idx;
-#endif
-#if MYNEWT_VAL(SOFT_PWM)
-static struct pwm_dev os_bsp_spwm[MYNEWT_VAL(SOFT_PWM_DEVS)];
-char* spwm_name[MYNEWT_VAL(SOFT_PWM_DEVS)];
-int spwm_idx[MYNEWT_VAL(SOFT_PWM_DEVS)];
-#endif
-
-
 /*
  * What memory to include in coredump.
  */
@@ -169,120 +113,35 @@ hal_bsp_get_nvic_priority(int irq_num, uint32_t pri)
     return cfg_pri;
 }
 
-
 void
 hal_bsp_init(void)
 {
     int rc;
 #if MYNEWT_VAL(SOFT_PWM)
     int idx;
+    char *spwm_name;
 #endif
 
-    (void)rc;
-
     /* Make sure system clocks have started */
     hal_system_clock_start();
 
-#if MYNEWT_VAL(TIMER_0)
-    rc = hal_timer_init(0, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_1)
-    rc = hal_timer_init(1, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_2)
-    rc = hal_timer_init(2, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_3)
-    rc = hal_timer_init(3, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_4)
-    rc = hal_timer_init(4, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_5)
-    rc = hal_timer_init(5, NULL);
-    assert(rc == 0);
-#endif
+    /* Create all available nRF52840 peripherals */
+    nrf52_periph_create();
 
-#if MYNEWT_VAL(ADC_0)
-    rc = os_dev_create((struct os_dev *) &os_bsp_adc0,
-                       "adc0",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_adc_dev_init,
-                       &os_bsp_adc0_config);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(PWM_0)
-    pwm0_idx = 0;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm0,
-                       "pwm0",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm0_idx);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(PWM_1)
-    pwm1_idx = 1;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm1,
-                       "pwm1",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm1_idx);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(PWM_2)
-    pwm2_idx = 2;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm2,
-                       "pwm2",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm2_idx);
-    assert(rc == 0);
-#endif
 #if MYNEWT_VAL(SOFT_PWM)
-    for (idx = 0; idx < MYNEWT_VAL(SOFT_PWM_DEVS); idx++)
-    {
-        spwm_name[idx] = "spwm0";
-        spwm_name[idx][4] = '0' + idx;
-        spwm_idx[idx] = idx;
-        rc = os_dev_create((struct os_dev *) &os_bsp_spwm[idx],
-                           spwm_name[idx],
-                           OS_DEV_INIT_KERNEL,
-                           OS_DEV_INIT_PRIO_DEFAULT,
-                           soft_pwm_dev_init,
-                           &spwm_idx[idx]);
+    for (idx = 0; idx < MYNEWT_VAL(SOFT_PWM_DEVS); idx++) {
+        asprintf(&spwm_name, "spwm%d", idx);
+        rc = os_dev_create(&os_bsp_spwm[idx].pwm_os_dev, spwm_name,
+                           OS_DEV_INIT_KERNEL, OS_DEV_INIT_PRIO_DEFAULT,
+                           soft_pwm_dev_init, UINT_TO_POINTER(idx));
         assert(rc == 0);
     }
 #endif
 
-#if (MYNEWT_VAL(OS_CPUTIME_TIMER_NUM) >= 0)
-    rc = os_cputime_init(MYNEWT_VAL(OS_CPUTIME_FREQ));
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(SPI_0_MASTER)
-    rc = hal_spi_init(0, (void *)&os_bsp_spi0m_cfg, HAL_SPI_TYPE_MASTER);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(UART_0)
-    rc = os_dev_create((struct os_dev *) &os_bsp_uart0, "uart0",
-      OS_DEV_INIT_PRIMARY, 0, uart_hal_init, (void *)&os_bsp_uart0_cfg);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(UART_1)
-    rc = os_dev_create((struct os_dev *) &os_bsp_bitbang_uart1, "uart1",
-      OS_DEV_INIT_PRIMARY, 0, uart_bitbang_init, (void *)&os_bsp_uart1_cfg);
+#if MYNEWT_VAL(UARTBB_0)
+    rc = os_dev_create(&os_bsp_uartbb0.ud_dev, "uartbb0",
+                       OS_DEV_INIT_PRIMARY, 0, uart_bitbang_init,
+                       (void *)&os_bsp_uartbb0_cfg);
     assert(rc == 0);
 #endif
 
diff --git a/hw/bsp/telee02/syscfg.yml b/hw/bsp/telee02/syscfg.yml
index 5f437b0c19..aa1c37fafb 100644
--- a/hw/bsp/telee02/syscfg.yml
+++ b/hw/bsp/telee02/syscfg.yml
@@ -23,68 +23,32 @@ syscfg.defs:
         description: 'Set to indicate that BSP has NRF52'
         value: 1
 
-    UART_0:
-        description: 'Whether to enable UART0'
-        value:  1
-    UART_0_PIN_TX:
-        description: 'TX pin for UART0'
-        value:  6
-    UART_0_PIN_RX:
-        description: 'RX pin for UART0'
-        value:  8
-    UART_0_PIN_RTS:
-        description: 'RTS pin for UART0'
-        value:  5
-    UART_0_PIN_CTS:
-        description: 'CTS pin for UART0'
-        value: 7
-
-    UART_1:
-        description: 'Bitbanger UART'
-        value:  0
-    UART_1_PIN_TX:
-        description: 'TX pin for UART1'
-        value:  -1
-    UART_1_PIN_RX:
-        description: 'RX pin for UART1'
-        value:  -1
-
-    SPI_0_MASTER_PIN_SCK:
-        description: 'SCK pin for SPI_0_MASTER'
-        value:  25
-    SPI_0_MASTER_PIN_MOSI:
-        description: 'MOSI pin for SPI_0_MASTER'
-        value:  23
-    SPI_0_MASTER_PIN_MISO:
-        description: 'MISO pin for SPI_0_MASTER'
-        value:  24
-
-    TIMER_0:
-        description: 'NRF52 Timer 0'
-        value:  1
-    TIMER_1:
-        description: 'NRF52 Timer 1'
-        value:  0
-    TIMER_2:
-        description: 'NRF52 Timer 2'
-        value:  0
-    TIMER_3:
-        description: 'NRF52 Timer 3'
-        value:  0
-    TIMER_4:
-        description: 'NRF52 Timer 4'
-        value:  0
-    TIMER_5:
-        description: 'NRF52 RTC 0'
-        value:  0
+    SOFT_PWM:
+        description: 'Enable soft PWM'
+        value: 0
 
-syscfg.defs.BLE_LP_CLOCK:
-    TIMER_0:
+    UARTBB_0:
+        description: 'Enable bit-banger UART 0'
         value: 0
-    TIMER_5:
-        value: 1
+    UARTBB_0_PIN_TX:
+        description: 'TX pin for UARTBB0'
+        value: -1
+    UARTBB_0_PIN_RX:
+        description: 'RX pin for UARTBB0'
+        value: -1
 
 syscfg.vals:
+    # Enable nRF52832 MCU
+    MCU_NRF52832: 1
+    # Set default pins for peripherals
+    UART_0_PIN_TX: 6
+    UART_0_PIN_RX: 8
+    UART_0_PIN_RTS: 5
+    UART_0_PIN_CTS: 7
+    SPI_0_MASTER_PIN_SCK: 25
+    SPI_0_MASTER_PIN_MOSI: 23
+    SPI_0_MASTER_PIN_MISO: 24
+
     CONFIG_FCB_FLASH_AREA: FLASH_AREA_NFFS
     REBOOT_LOG_FLASH_AREA: FLASH_AREA_REBOOT_LOG
     NFFS_FLASH_AREA: FLASH_AREA_NFFS
@@ -98,6 +62,11 @@ syscfg.vals:
     SX1276_HAS_ANT_SW: 1
 
 syscfg.vals.BLE_LP_CLOCK:
+    TIMER_0: 0
+    TIMER_5: 1
     OS_CPUTIME_FREQ: 32768
     OS_CPUTIME_TIMER_NUM: 5
     BLE_XTAL_SETTLE_TIME: 1500
+
+syscfg.restrictions:
+    - "!UARTBB_0 || (UARTBB_0_PIN_TX >= 0 && UARTBB_0_PIN_RX >= 0)"
diff --git a/hw/bsp/vbluno52/pkg.yml b/hw/bsp/vbluno52/pkg.yml
index f8d98d555f..0bc221b2c7 100644
--- a/hw/bsp/vbluno52/pkg.yml
+++ b/hw/bsp/vbluno52/pkg.yml
@@ -33,29 +33,11 @@ pkg.cflags.HARDFLOAT:
     - -mfloat-abi=hard -mfpu=fpv4-sp-d16
 
 pkg.deps:
-    - "@apache-mynewt-core/hw/mcu/nordic/nrf52xxx-compat"
+    - "@apache-mynewt-core/hw/mcu/nordic/nrf52xxx"
     - "@apache-mynewt-core/libc/baselibc"
 
-pkg.deps.BLE_DEVICE:
-    - "@apache-mynewt-core/hw/drivers/nimble/nrf52"
-
-pkg.deps.UART_0:
-    - "@apache-mynewt-core/hw/drivers/uart/uart_hal"
-
-pkg.deps.UART_1:
-    - "@apache-mynewt-core/hw/drivers/uart/uart_bitbang"
-
-pkg.deps.ADC_0:
-    - "@apache-mynewt-core/hw/drivers/adc/adc_nrf52"
-
-pkg.deps.PWM_0:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
-pkg.deps.PWM_1:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
-pkg.deps.PWM_2:
-    - "@apache-mynewt-core/hw/drivers/pwm/pwm_nrf52"
-
 pkg.deps.SOFT_PWM:
     - "@apache-mynewt-core/hw/drivers/pwm/soft_pwm"
+
+pkg.deps.UARTBB_0:
+    - "@apache-mynewt-core/hw/drivers/uart/uart_bitbang"
diff --git a/hw/bsp/vbluno52/src/hal_bsp.c b/hw/bsp/vbluno52/src/hal_bsp.c
index 69c12f7ce3..0bba4378da 100644
--- a/hw/bsp/vbluno52/src/hal_bsp.c
+++ b/hw/bsp/vbluno52/src/hal_bsp.c
@@ -30,105 +30,25 @@
 #include "hal/hal_watchdog.h"
 #include "hal/hal_i2c.h"
 #include "mcu/nrf52_hal.h"
-#if MYNEWT_VAL(UART_0) || MYNEWT_VAL(UART_1)
-#include "uart/uart.h"
-#endif
-#if MYNEWT_VAL(UART_0)
-#include "uart_hal/uart_hal.h"
-#endif
-#if MYNEWT_VAL(UART_1)
-#include "uart_bitbang/uart_bitbang.h"
-#endif
-#include "bsp.h"
-#if MYNEWT_VAL(ADC_0)
-#include <adc_nrf52/adc_nrf52.h>
-#include <nrfx_saadc.h>
-#endif
-#if MYNEWT_VAL(PWM_0) || MYNEWT_VAL(PWM_1) || MYNEWT_VAL(PWM_2)
-#include <pwm_nrf52/pwm_nrf52.h>
-#endif
+#include "mcu/nrf52_periph.h"
+#include "bsp/bsp.h"
 #if MYNEWT_VAL(SOFT_PWM)
-#include <soft_pwm/soft_pwm.h>
+#include "pwm/pwm.h"
+#include "soft_pwm/soft_pwm.h"
 #endif
-
-#if MYNEWT_VAL(UART_0)
-static struct uart_dev os_bsp_uart0;
-static const struct nrf52_uart_cfg os_bsp_uart0_cfg = {
-    .suc_pin_tx = MYNEWT_VAL(UART_0_PIN_TX),
-    .suc_pin_rx = MYNEWT_VAL(UART_0_PIN_RX),
-    .suc_pin_rts = MYNEWT_VAL(UART_0_PIN_RTS),
-    .suc_pin_cts = MYNEWT_VAL(UART_0_PIN_CTS),
-};
-#endif
-
-#if MYNEWT_VAL(UART_1)
-static struct uart_dev os_bsp_bitbang_uart1;
-static const struct uart_bitbang_conf os_bsp_uart1_cfg = {
-    .ubc_txpin = MYNEWT_VAL(UART_1_PIN_TX),
-    .ubc_rxpin = MYNEWT_VAL(UART_1_PIN_RX),
-    .ubc_cputimer_freq = MYNEWT_VAL(OS_CPUTIME_FREQ),
-};
-#endif
-
-#if MYNEWT_VAL(SPI_0_MASTER)
-/*
- * NOTE: Our HAL expects that the SS pin, if used, is treated as a gpio line
- * and is handled outside the SPI routines.
- */
-static const struct nrf52_hal_spi_cfg os_bsp_spi0m_cfg = {
-    .sck_pin      = MYNEWT_VAL(SPI_0_MASTER_PIN_SCK),
-    .mosi_pin     = MYNEWT_VAL(SPI_0_MASTER_PIN_MOSI),
-    .miso_pin     = MYNEWT_VAL(SPI_0_MASTER_PIN_MISO),
-};
-#endif
-
-#if MYNEWT_VAL(SPI_0_SLAVE)
-static const struct nrf52_hal_spi_cfg os_bsp_spi0s_cfg = {
-    .sck_pin      = MYNEWT_VAL(SPI_0_SLAVE_PIN_SCK),
-    .mosi_pin     = MYNEWT_VAL(SPI_0_SLAVE_PIN_MOSI),
-    .miso_pin     = MYNEWT_VAL(SPI_0_SLAVE_PIN_MISO),
-    .ss_pin       = MYNEWT_VAL(SPI_0_SLAVE_PIN_SS),
-};
-#endif
-
-#if MYNEWT_VAL(ADC_0)
-static struct adc_dev os_bsp_adc0;
-static struct nrf52_adc_dev_cfg os_bsp_adc0_config = {
-    .nadc_refmv     = MYNEWT_VAL(ADC_0_REFMV_0),
-};
+#if MYNEWT_VAL(UARTBB_0)
+#include "uart_bitbang/uart_bitbang.h"
 #endif
 
-#if MYNEWT_VAL(PWM_0)
-static struct pwm_dev os_bsp_pwm0;
-int pwm0_idx;
-#endif
-#if MYNEWT_VAL(PWM_1)
-static struct pwm_dev os_bsp_pwm1;
-int pwm1_idx;
-#endif
-#if MYNEWT_VAL(PWM_2)
-static struct pwm_dev os_bsp_pwm2;
-int pwm2_idx;
-#endif
 #if MYNEWT_VAL(SOFT_PWM)
 static struct pwm_dev os_bsp_spwm[MYNEWT_VAL(SOFT_PWM_DEVS)];
-char* spwm_name[MYNEWT_VAL(SOFT_PWM_DEVS)];
-int spwm_idx[MYNEWT_VAL(SOFT_PWM_DEVS)];
-#endif
-
-#if MYNEWT_VAL(I2C_0)
-static const struct nrf52_hal_i2c_cfg hal_i2c0_cfg = {
-    .scl_pin = MYNEWT_VAL(I2C_0_PIN_SCL),
-    .sda_pin = MYNEWT_VAL(I2C_0_PIN_SDA),
-    .i2c_frequency = MYNEWT_VAL(I2C_0_FREQ_KHZ),
-};
 #endif
 
-#if MYNEWT_VAL(I2C_1)
-static const struct nrf52_hal_i2c_cfg hal_i2c1_cfg = {
-    .scl_pin = MYNEWT_VAL(I2C_1_PIN_SCL),
-    .sda_pin = MYNEWT_VAL(I2C_1_PIN_SDA),
-    .i2c_frequency = MYNEWT_VAL(I2C_1_FREQ_KHZ),
+#if MYNEWT_VAL(UARTBB_0)
+static const struct uart_bitbang_conf os_bsp_uartbb0_cfg = {
+    .ubc_txpin = MYNEWT_VAL(UARTBB_0_PIN_TX),
+    .ubc_rxpin = MYNEWT_VAL(UARTBB_0_PIN_RX),
+    .ubc_cputimer_freq = MYNEWT_VAL(OS_CPUTIME_FREQ),
 };
 #endif
 
@@ -195,132 +115,32 @@ hal_bsp_get_nvic_priority(int irq_num, uint32_t pri)
 void
 hal_bsp_init(void)
 {
-    int rc;
 #if MYNEWT_VAL(SOFT_PWM)
+    int rc;
     int idx;
+    char *spwm_name;
 #endif
 
-    (void)rc;
-
     /* Make sure system clocks have started */
     hal_system_clock_start();
 
-#if MYNEWT_VAL(TIMER_0)
-    rc = hal_timer_init(0, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_1)
-    rc = hal_timer_init(1, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_2)
-    rc = hal_timer_init(2, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_3)
-    rc = hal_timer_init(3, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_4)
-    rc = hal_timer_init(4, NULL);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(TIMER_5)
-    rc = hal_timer_init(5, NULL);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(ADC_0)
-    rc = os_dev_create((struct os_dev *) &os_bsp_adc0,
-                       "adc0",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_adc_dev_init,
-                       &os_bsp_adc0_config);
-    assert(rc == 0);
-#endif
+    /* Create all available nRF52840 peripherals */
+    nrf52_periph_create();
 
-#if MYNEWT_VAL(PWM_0)
-    pwm0_idx = 0;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm0,
-                       "pwm0",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm0_idx);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(PWM_1)
-    pwm1_idx = 1;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm1,
-                       "pwm1",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm1_idx);
-    assert(rc == 0);
-#endif
-#if MYNEWT_VAL(PWM_2)
-    pwm2_idx = 2;
-    rc = os_dev_create((struct os_dev *) &os_bsp_pwm2,
-                       "pwm2",
-                       OS_DEV_INIT_KERNEL,
-                       OS_DEV_INIT_PRIO_DEFAULT,
-                       nrf52_pwm_dev_init,
-                       &pwm2_idx);
-    assert(rc == 0);
-#endif
 #if MYNEWT_VAL(SOFT_PWM)
-    for (idx = 0; idx < MYNEWT_VAL(SOFT_PWM_DEVS); idx++)
-    {
-        spwm_name[idx] = "spwm0";
-        spwm_name[idx][4] = '0' + idx;
-        spwm_idx[idx] = idx;
-        rc = os_dev_create((struct os_dev *) &os_bsp_spwm[idx],
-                           spwm_name[idx],
-                           OS_DEV_INIT_KERNEL,
-                           OS_DEV_INIT_PRIO_DEFAULT,
-                           soft_pwm_dev_init,
-                           &spwm_idx[idx]);
+    for (idx = 0; idx < MYNEWT_VAL(SOFT_PWM_DEVS); idx++) {
+        asprintf(&spwm_name, "spwm%d", idx);
+        rc = os_dev_create(&os_bsp_spwm[idx].pwm_os_dev, spwm_name,
+                           OS_DEV_INIT_KERNEL, OS_DEV_INIT_PRIO_DEFAULT,
+                           soft_pwm_dev_init, UINT_TO_POINTER(idx));
         assert(rc == 0);
     }
 #endif
 
-#if (MYNEWT_VAL(OS_CPUTIME_TIMER_NUM) >= 0)
-    rc = os_cputime_init(MYNEWT_VAL(OS_CPUTIME_FREQ));
+#if MYNEWT_VAL(UARTBB_0)
+    rc = os_dev_create(&os_bsp_uartbb0.ud_dev, "uartbb0",
+                       OS_DEV_INIT_PRIMARY, 0, uart_bitbang_init,
+                       (void *)&os_bsp_uartbb0_cfg);
     assert(rc == 0);
 #endif
-
-#if MYNEWT_VAL(I2C_0)
-    rc = hal_i2c_init(0, (void *)&hal_i2c0_cfg);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(I2C_1)
-    rc = hal_i2c_init(1, (void *)&hal_i2c1_cfg);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(SPI_0_MASTER)
-    rc = hal_spi_init(0, (void *)&os_bsp_spi0m_cfg, HAL_SPI_TYPE_MASTER);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(SPI_0_SLAVE)
-    rc = hal_spi_init(0, (void *)&os_bsp_spi0s_cfg, HAL_SPI_TYPE_SLAVE);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(UART_0)
-    rc = os_dev_create((struct os_dev *) &os_bsp_uart0, "uart0",
-      OS_DEV_INIT_PRIMARY, 0, uart_hal_init, (void *)&os_bsp_uart0_cfg);
-    assert(rc == 0);
-#endif
-
-#if MYNEWT_VAL(UART_1)
-    rc = os_dev_create((struct os_dev *) &os_bsp_bitbang_uart1, "uart1",
-      OS_DEV_INIT_PRIMARY, 0, uart_bitbang_init, (void *)&os_bsp_uart1_cfg);
-    assert(rc == 0);
-#endif
-
 }
diff --git a/hw/bsp/vbluno52/syscfg.yml b/hw/bsp/vbluno52/syscfg.yml
index 278296485c..e195ac6b4b 100644
--- a/hw/bsp/vbluno52/syscfg.yml
+++ b/hw/bsp/vbluno52/syscfg.yml
@@ -23,111 +23,49 @@ syscfg.defs:
         description: 'Set to indicate that BSP has NRF52'
         value: 1
 
-    UART_0:
-        description: 'Whether to enable UART0'
-        value:  1
-    UART_0_PIN_TX:
-        description: 'TX pin for UART0'
-        value:  6
-    UART_0_PIN_RX:
-        description: 'RX pin for UART0'
-        value:  8
-    UART_0_PIN_RTS:
-        description: 'RTS pin for UART0'
-        value:  5
-    UART_0_PIN_CTS:
-        description: 'CTS pin for UART0'
-        value: 7
-
-    UART_1:
-        description: 'Whether to enable bitbanger UART1'
-        value:  0
-    UART_1_PIN_TX:
-        description: 'TX pin for UART1'
-        value:  -1
-    UART_1_PIN_RX:
-        description: 'RX pin for UART1'
-        value:  -1
-
-    SPI_0_MASTER_PIN_SCK:
-        description: 'SCK pin for SPI_0_MASTER'
-        value:  15
-    SPI_0_MASTER_PIN_MOSI:
-        description: 'MOSI pin for SPI_0_MASTER'
-        value:  13
-    SPI_0_MASTER_PIN_MISO:
-        description: 'MISO pin for SPI_0_MASTER'
-        value:  14
-
-    SPI_0_SLAVE_PIN_SCK:
-        description: 'SCK pin for SPI_0_SLAVE'
-        value:  15
-    SPI_0_SLAVE_PIN_MOSI:
-        description: 'MOSI pin for SPI_0_SLAVE'
-        value:  13
-    SPI_0_SLAVE_PIN_MISO:
-        description: 'MISO pin for SPI_0_SLAVE'
-        value:  14
-    SPI_0_SLAVE_PIN_SS:
-        description: 'SS pin for SPI_0_SLAVE'
-        value:  11
-
-    I2C_0_PIN_SCL:
-        description: 'SCL pin for I2C_0'
-        value:  27
-    I2C_0_PIN_SDA:
-        description: 'SDA pin for I2C_0'
-        value:  26
-    I2C_0_FREQ_KHZ:
-        description: 'Frequency in khz for I2C_0 bus'
-        value:  100
-
-    I2C_1_PIN_SCL:
-        description: 'SCL pin for I2C_1'
-        value:  31
-    I2C_1_PIN_SDA:
-        description: 'SDA pin for I2C_1'
-        value:  30
-    I2C_1_FREQ_KHZ:
-        description: 'Frequency in khz for I2C_1 bus'
-        value:  100
-
-    TIMER_0:
-        description: 'NRF52 Timer 0'
-        value:  1
-    TIMER_1:
-        description: 'NRF52 Timer 1'
-        value:  0
-    TIMER_2:
-        description: 'NRF52 Timer 2'
-        value:  0
-    TIMER_3:
-        description: 'NRF52 Timer 3'
-        value:  0
-    TIMER_4:
-        description: 'NRF52 Timer 4'
-        value:  0
-    TIMER_5:
-        description: 'NRF52 RTC 0'
-        value:  0
+    SOFT_PWM:
+        description: 'Enable soft PWM'
+        value: 0
 
-syscfg.defs.BLE_LP_CLOCK:
-    TIMER_0:
+    UARTBB_0:
+        description: 'Enable bit-banger UART 0'
         value: 0
-    TIMER_5:
-        value: 1
+    UARTBB_0_PIN_TX:
+        description: 'TX pin for UARTBB0'
+        value: -1
+    UARTBB_0_PIN_RX:
+        description: 'RX pin for UARTBB0'
+        value: -1
 
 syscfg.vals:
+    # Enable nRF52832 MCU
+    MCU_NRF52832: 1
+    # Set default pins for peripherals
+    UART_0_PIN_TX: 6
+    UART_0_PIN_RX: 8
+    SPI_0_MASTER_PIN_SCK: 15
+    SPI_0_MASTER_PIN_MOSI: 13
+    SPI_0_MASTER_PIN_MISO: 14
+    SPI_0_SLAVE_PIN_SCK: 15
+    SPI_0_SLAVE_PIN_MOSI: 13
+    SPI_0_SLAVE_PIN_MISO: 14
+    SPI_0_SLAVE_PIN_SS: 11
+    I2C_0_PIN_SCL: 27
+    I2C_0_PIN_SDA: 26
+
     CONFIG_FCB_FLASH_AREA: FLASH_AREA_NFFS
     REBOOT_LOG_FLASH_AREA: FLASH_AREA_REBOOT_LOG
     NFFS_FLASH_AREA: FLASH_AREA_NFFS
     COREDUMP_FLASH_AREA: FLASH_AREA_IMAGE_1
     MCU_DCDC_ENABLED: 1
-    I2C_0: 1
-    I2C_1: 1
     XTAL_32768: 1
 
 syscfg.vals.BLE_LP_CLOCK:
+    TIMER_0: 0
+    TIMER_5: 1
     OS_CPUTIME_FREQ: 32768
     OS_CPUTIME_TIMER_NUM: 5
     BLE_XTAL_SETTLE_TIME: 1500
+
+syscfg.restrictions:
+    - "!UARTBB_0 || (UARTBB_0_PIN_TX >= 0 && UARTBB_0_PIN_RX >= 0)"
diff --git a/hw/mcu/nordic/nrf52xxx-compat/include/nrfx_config.h b/hw/mcu/nordic/nrf52xxx-compat/include/nrfx_config.h
index baf4156b9b..0281270185 100644
--- a/hw/mcu/nordic/nrf52xxx-compat/include/nrfx_config.h
+++ b/hw/mcu/nordic/nrf52xxx-compat/include/nrfx_config.h
@@ -21,9 +21,9 @@
 #define NRFX_CONFIG_H__
 
 #if NRF52
-#include "../../nrf52xxx-compat/include/nrfx52_config.h"
+#include "nrfx52_config.h"
 #elif NRF52840_XXAA
-#include "../../nrf52xxx-compat/include/nrfx52840_config.h"
+#include "nrfx52840_config.h"
 #else
 #error Unsupported chip selected
 #endif


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services