summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Shawcroft <scott@adafruit.com>2019-08-21 13:01:26 -0700
committerGitHub <noreply@github.com>2019-08-21 13:01:26 -0700
commit389e7cc35dfa91f84a9d12cd55ef536bda8a23ac (patch)
tree5b1636218e67caf6df59b56adac526e8463c0051
parent42143ca0568c69bec6c60da3ae9a1e8f3ca106ff (diff)
parentfe2ec6c887a5c4d8414fa19879dd5a1b083d0240 (diff)
Merge pull request #2072 from bmeisels/nrf-no-crystal-support
Add support for nrf boards that don't have an external crystal
-rw-r--r--ports/nrf/common-hal/bleio/Adapter.c28
-rw-r--r--ports/nrf/peripherals/nrf/clocks.c16
2 files changed, 37 insertions, 7 deletions
diff --git a/ports/nrf/common-hal/bleio/Adapter.c b/ports/nrf/common-hal/bleio/Adapter.c
index 936dfcb9b..70e87cf78 100644
--- a/ports/nrf/common-hal/bleio/Adapter.c
+++ b/ports/nrf/common-hal/bleio/Adapter.c
@@ -39,17 +39,37 @@
#include "supervisor/usb.h"
#include "shared-bindings/bleio/Adapter.h"
#include "shared-bindings/bleio/Address.h"
+#include "mpconfigboard.h" // for BOARD_HAS_CRYSTAL
STATIC void softdevice_assert_handler(uint32_t id, uint32_t pc, uint32_t info) {
mp_raise_msg_varg(&mp_type_AssertionError,
translate("Soft device assert, id: 0x%08lX, pc: 0x%08lX"), id, pc);
}
+static inline bool board_has_crystal(void) {
+#ifdef BOARD_HAS_CRYSTAL
+ return BOARD_HAS_CRYSTAL == 1;
+#else
+ return false;
+#endif
+}
+
STATIC uint32_t ble_stack_enable(void) {
- nrf_clock_lf_cfg_t clock_config = {
- .source = NRF_CLOCK_LF_SRC_XTAL,
- .accuracy = NRF_CLOCK_LF_ACCURACY_20_PPM
- };
+ nrf_clock_lf_cfg_t clock_config;
+
+ // Set low-frequency clock source to be either an external 32.768kHz crystal if one exists on the board
+ // or an internal 32.768 kHz RC oscillator otherwise
+ if (board_has_crystal()) {
+ clock_config = (nrf_clock_lf_cfg_t){
+ .source = NRF_CLOCK_LF_SRC_XTAL,
+ .accuracy = NRF_CLOCK_LF_ACCURACY_20_PPM};
+ } else {
+ clock_config = (nrf_clock_lf_cfg_t){
+ .source = NRF_CLOCK_LF_SRC_RC,
+ .rc_ctiv = 16,
+ .rc_temp_ctiv = 2,
+ .accuracy = NRF_CLOCK_LF_ACCURACY_250_PPM};
+ }
uint32_t err_code = sd_softdevice_enable(&clock_config, softdevice_assert_handler);
if (err_code != NRF_SUCCESS)
diff --git a/ports/nrf/peripherals/nrf/clocks.c b/ports/nrf/peripherals/nrf/clocks.c
index 4acb878db..de9eec6b5 100644
--- a/ports/nrf/peripherals/nrf/clocks.c
+++ b/ports/nrf/peripherals/nrf/clocks.c
@@ -26,11 +26,21 @@
*/
#include "nrfx.h"
+#include "mpconfigboard.h" // for BOARD_HAS_CRYSTAL
+
+static inline bool board_has_crystal(void) {
+#ifdef BOARD_HAS_CRYSTAL
+ return BOARD_HAS_CRYSTAL == 1;
+#else
+ return false;
+#endif
+}
void nrf_peripherals_clocks_init(void) {
- // Set low-frequency clock source to be crystal. If there's a crystalless board, this will need to be
- // generalized.
- NRF_CLOCK->LFCLKSRC = (uint32_t)((CLOCK_LFCLKSRC_SRC_Xtal << CLOCK_LFCLKSRC_SRC_Pos) & CLOCK_LFCLKSRC_SRC_Msk);
+ // Set low-frequency clock source to be either an external 32.768kHz crystal if one exists on the board
+ // or an internal 32.768 kHz RC oscillator otherwise
+ uint32_t clock_src = board_has_crystal() ? CLOCK_LFCLKSRC_SRC_Xtal : CLOCK_LFCLKSRC_SRC_RC;
+ NRF_CLOCK->LFCLKSRC = (uint32_t)((clock_src << CLOCK_LFCLKSRC_SRC_Pos) & CLOCK_LFCLKSRC_SRC_Msk);
NRF_CLOCK->TASKS_LFCLKSTART = 1UL;
// Wait for clocks to start.