diff options
| author | Scott Shawcroft <scott@tannewt.org> | 2020-03-06 18:15:16 -0800 |
|---|---|---|
| committer | Scott Shawcroft <scott@tannewt.org> | 2020-03-13 11:12:31 -0700 |
| commit | 418333979ae007b28855079c64ee3c65f76ecbc7 (patch) | |
| tree | dea0de8db2b059e6de6abc864df29b0005ac5e1c /ports | |
| parent | 6f60afe8c521011d1a2d34a2632295b483a8cee3 (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__.c | 17 | ||||
| -rw-r--r-- | ports/nrf/common-hal/rtc/RTC.c | 4 | ||||
| -rw-r--r-- | ports/nrf/common-hal/time/__init__.c | 12 | ||||
| -rw-r--r-- | ports/nrf/supervisor/port.c | 32 |
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(); + } } |
