summaryrefslogtreecommitdiff
path: root/ports
diff options
context:
space:
mode:
authorScott Shawcroft <scott@tannewt.org>2020-03-06 18:15:16 -0800
committerScott Shawcroft <scott@tannewt.org>2020-03-13 11:12:31 -0700
commit418333979ae007b28855079c64ee3c65f76ecbc7 (patch)
treedea0de8db2b059e6de6abc864df29b0005ac5e1c /ports
parent6f60afe8c521011d1a2d34a2632295b483a8cee3 (diff)
Fix autoreload, neopixel, monotonic_ns and sleep w/o SD
Diffstat (limited to 'ports')
-rw-r--r--ports/nrf/common-hal/neopixel_write/__init__.c17
-rw-r--r--ports/nrf/common-hal/rtc/RTC.c4
-rw-r--r--ports/nrf/common-hal/time/__init__.c12
-rw-r--r--ports/nrf/supervisor/port.c32
4 files changed, 38 insertions, 27 deletions
diff --git a/ports/nrf/common-hal/neopixel_write/__init__.c b/ports/nrf/common-hal/neopixel_write/__init__.c
index 4d961621e..8062937f4 100644
--- a/ports/nrf/common-hal/neopixel_write/__init__.c
+++ b/ports/nrf/common-hal/neopixel_write/__init__.c
@@ -27,6 +27,7 @@
#include "py/mphal.h"
#include "py/mpstate.h"
#include "shared-bindings/neopixel_write/__init__.h"
+#include "supervisor/port.h"
#include "nrf_pwm.h"
// https://github.com/adafruit/Adafruit_NeoPixel/blob/master/Adafruit_NeoPixel.cpp
@@ -103,8 +104,7 @@ void neopixel_write_reset(void) {
pixels_pattern_heap_size = 0;
}
-uint64_t next_start_tick_ms = 0;
-uint32_t next_start_tick_us = 1000;
+uint64_t next_start_raw_ticks = 0;
void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout, uint8_t *pixels, uint32_t numBytes) {
// To support both the SoftDevice + Neopixels we use the EasyDMA
@@ -173,8 +173,9 @@ void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout
}
}
- // Wait to make sure we don't append onto the last transmission.
- // wait_until(next_start_tick_ms, next_start_tick_us);
+ // Wait to make sure we don't append onto the last transmission. This should only be a tick or
+ // two.
+ while (port_get_raw_ticks(NULL) < next_start_raw_ticks) {}
// Use the identified device to choose the implementation
// If a PWM device is available and we have a buffer, use DMA.
@@ -321,11 +322,5 @@ void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout
}
// Update the next start.
- // current_tick(&next_start_tick_ms, &next_start_tick_us);
- // if (next_start_tick_us < 100) {
- // next_start_tick_ms += 1;
- // next_start_tick_us = 100 - next_start_tick_us;
- // } else {
- // next_start_tick_us -= 100;
- // }
+ next_start_raw_ticks = port_get_raw_ticks(NULL) + 4;
}
diff --git a/ports/nrf/common-hal/rtc/RTC.c b/ports/nrf/common-hal/rtc/RTC.c
index 9ffd2e8a3..6b582ef26 100644
--- a/ports/nrf/common-hal/rtc/RTC.c
+++ b/ports/nrf/common-hal/rtc/RTC.c
@@ -40,12 +40,12 @@
static uint32_t rtc_offset = 0;
void common_hal_rtc_get_time(timeutils_struct_time_t *tm) {
- uint64_t ticks_s = port_get_raw_ticks() / 1024;
+ uint64_t ticks_s = port_get_raw_ticks(NULL) / 1024;
timeutils_seconds_since_2000_to_struct_time(rtc_offset + ticks_s, tm);
}
void common_hal_rtc_set_time(timeutils_struct_time_t *tm) {
- uint64_t ticks_s = port_get_raw_ticks() / 1024;
+ uint64_t ticks_s = port_get_raw_ticks(NULL) / 1024;
uint32_t epoch_s = timeutils_seconds_since_2000(
tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec
);
diff --git a/ports/nrf/common-hal/time/__init__.c b/ports/nrf/common-hal/time/__init__.c
index 3ec5cf683..21fe98926 100644
--- a/ports/nrf/common-hal/time/__init__.c
+++ b/ports/nrf/common-hal/time/__init__.c
@@ -25,18 +25,18 @@
*/
#include "py/mphal.h"
+#include "supervisor/port.h"
uint64_t common_hal_time_monotonic(void) {
return supervisor_ticks_ms64();
}
uint64_t common_hal_time_monotonic_ns(void) {
- uint64_t ms = 0;
- uint32_t us_until_ms = 0;
- // FIXME! Re-implement this.
- // current_tick(&ms, &us_until_ms);
- // us counts down.
- return 1000 * (ms * 1000 + (1000 - us_until_ms));
+ uint8_t subticks = 0;
+ uint64_t ticks = port_get_raw_ticks(&subticks);
+ // A tick is 976562.5 nanoseconds so multiply it by the base and add half instead of doing float
+ // math.
+ return 976562 * ticks + ticks / 2 + 30518 * subticks;
}
void common_hal_time_delay_ms(uint32_t delay) {
diff --git a/ports/nrf/supervisor/port.c b/ports/nrf/supervisor/port.c
index 85978cc07..2a4604091 100644
--- a/ports/nrf/supervisor/port.c
+++ b/ports/nrf/supervisor/port.c
@@ -68,7 +68,7 @@ static void power_warning_handler(void) {
const nrfx_rtc_t rtc_instance = NRFX_RTC_INSTANCE(2);
const nrfx_rtc_config_t rtc_config = {
- .prescaler = RTC_FREQ_TO_PRESCALER(1024),
+ .prescaler = RTC_FREQ_TO_PRESCALER(0x8000),
.reliable = 0,
.tick_latency = 0,
.interrupt_priority = 6
@@ -79,10 +79,11 @@ static volatile uint64_t overflowed_ticks = 0;
void rtc_handler(nrfx_rtc_int_type_t int_type) {
if (int_type == NRFX_RTC_INT_OVERFLOW) {
overflowed_ticks += (1L<<24);
- }
- // Do things common to all ports when the tick occurs
- if (int_type == NRFX_RTC_INT_TICK) {
+ } else if (int_type == NRFX_RTC_INT_TICK && nrfx_rtc_counter_get(&rtc_instance) % 32 == 0) {
+ // Do things common to all ports when the tick occurs
supervisor_tick();
+ } else if (int_type == NRFX_RTC_INT_COMPARE0) {
+ nrfx_rtc_cc_set(&rtc_instance, 0, 0, false);
}
}
@@ -195,8 +196,12 @@ uint32_t port_get_saved_word(void) {
return _ebss;
}
-uint64_t port_get_raw_ticks(void) {
- return overflowed_ticks + nrfx_rtc_counter_get(&rtc_instance);
+uint64_t port_get_raw_ticks(uint8_t* subticks) {
+ uint32_t rtc = nrfx_rtc_counter_get(&rtc_instance);
+ if (subticks != NULL) {
+ *subticks = (rtc % 32);
+ }
+ return overflowed_ticks + rtc / 32;
}
// Enable 1/1024 second tick.
@@ -213,7 +218,10 @@ void port_interrupt_after_ticks(uint32_t ticks) {
uint32_t current_ticks = nrfx_rtc_counter_get(&rtc_instance);
uint32_t diff = 3;
if (ticks > diff) {
- diff = ticks;
+ diff = ticks * 32;
+ }
+ if (diff > 0xffffff) {
+ diff = 0xffffff;
}
nrfx_rtc_cc_set(&rtc_instance, 0, current_ticks + diff, true);
}
@@ -225,7 +233,15 @@ void port_sleep_until_interrupt(void) {
(void) __get_FPSCR();
NVIC_ClearPendingIRQ(FPU_IRQn);
}
- sd_app_evt_wait();
+ uint8_t sd_enabled;
+
+ sd_softdevice_is_enabled(&sd_enabled);
+ if (sd_enabled) {
+ sd_app_evt_wait();
+ } else {
+ // Call wait for interrupt ourselves if the SD isn't enabled.
+ __WFI();
+ }
}