summaryrefslogtreecommitdiff
path: root/ports
diff options
context:
space:
mode:
authorDan Halbert <halbert@halwitz.org>2018-06-29 16:01:46 -0400
committerDan Halbert <halbert@halwitz.org>2018-06-29 16:01:46 -0400
commit2a0b8576439b0cfefff909135dba424a2a179275 (patch)
tree65af38bd381fbf571692540cf5814812d7de77ca /ports
parentb4fd77bb7c041d2855dba826f380ce66944c23d4 (diff)
implement mp_hal_delay_us() to not need interrupts, and use it
Diffstat (limited to 'ports')
-rw-r--r--ports/atmel-samd/mphalport.c9
-rw-r--r--ports/atmel-samd/mphalport.h2
-rw-r--r--ports/esp8266/Makefile1
-rw-r--r--ports/nrf/common-hal/microcontroller/__init__.c3
-rw-r--r--ports/nrf/mphalport.c14
-rw-r--r--ports/nrf/mphalport.h2
6 files changed, 5 insertions, 26 deletions
diff --git a/ports/atmel-samd/mphalport.c b/ports/atmel-samd/mphalport.c
index 7bb423a3e..a4eca1c74 100644
--- a/ports/atmel-samd/mphalport.c
+++ b/ports/atmel-samd/mphalport.c
@@ -99,10 +99,7 @@ void mp_hal_delay_ms(mp_uint_t delay) {
}
}
-void mp_hal_delay_us(mp_uint_t delay) {
- tick_delay(delay);
-}
-
+// Use mp_hal_delay_us() for timing of less than 1ms.
// Do a simple timing loop to wait for a certain number of microseconds.
// Can be used when interrupts are disabled, which makes tick_delay() unreliable.
//
@@ -115,8 +112,8 @@ void mp_hal_delay_us(mp_uint_t delay) {
#define DELAY_LOOP_ITERATIONS_PER_US ( (30U*120000000U) / common_hal_mcu_processor_get_frequency())
#endif
-void mp_hal_delay_us_loop(uint32_t us) {
- for (uint32_t i = us*DELAY_LOOP_ITERATIONS_PER_US; i > 0; i--) {
+void mp_hal_delay_us(mp_uint_t delay) {
+ for (uint32_t i = delay*DELAY_LOOP_ITERATIONS_PER_US; i > 0; i--) {
asm volatile("nop");
}
}
diff --git a/ports/atmel-samd/mphalport.h b/ports/atmel-samd/mphalport.h
index 31d34c8c3..3bc824d4e 100644
--- a/ports/atmel-samd/mphalport.h
+++ b/ports/atmel-samd/mphalport.h
@@ -50,6 +50,4 @@ void mp_hal_set_interrupt_char(int c);
void mp_hal_disable_all_interrupts(void);
void mp_hal_enable_all_interrupts(void);
-void mp_hal_delay_us_loop(uint32_t us);
-
#endif // MICROPY_INCLUDED_ATMEL_SAMD_MPHALPORT_H
diff --git a/ports/esp8266/Makefile b/ports/esp8266/Makefile
index 02b75eadd..8fabd3412 100644
--- a/ports/esp8266/Makefile
+++ b/ports/esp8266/Makefile
@@ -92,7 +92,6 @@ SRC_C = \
machine_hspi.c \
modesp.c \
modnetwork.c \
- mphalport.c \
ets_alt_task.c \
fatfs_port.c \
posix_helpers.c \
diff --git a/ports/nrf/common-hal/microcontroller/__init__.c b/ports/nrf/common-hal/microcontroller/__init__.c
index e26acff1b..4399e7708 100644
--- a/ports/nrf/common-hal/microcontroller/__init__.c
+++ b/ports/nrf/common-hal/microcontroller/__init__.c
@@ -33,6 +33,8 @@
#include "shared-bindings/microcontroller/Processor.h"
// TODO porting common_hal_mcu
+// This routine should work even when interrupts are disabled. Used by OneWire
+// for precise timing.
void common_hal_mcu_delay_us(uint32_t delay) {
// os_delay_us(delay);
}
@@ -58,4 +60,3 @@ const mcu_processor_obj_t common_hal_mcu_processor_obj = {
.type = &mcu_processor_type,
},
};
-
diff --git a/ports/nrf/mphalport.c b/ports/nrf/mphalport.c
index 014d410ec..d0447f06c 100644
--- a/ports/nrf/mphalport.c
+++ b/ports/nrf/mphalport.c
@@ -85,17 +85,3 @@ void mp_hal_stdout_tx_strn_cooked(const char *str, mp_uint_t len) {
void mp_hal_stdout_tx_str(const char *str) {
mp_hal_stdout_tx_strn(str, strlen(str));
}
-
-// Do a simple timing loop to wait for a certain number of microseconds.
-// Can be used when interrupts are disabled, which makes tick_delay() unreliable.
-//
-// Testing done at 48 MHz on SAMD21 and 120 MHz on SAMD51 (cache on).
-// TODO: Test on NRF. For now, use SAMD51 calibration, even though nRF52 runs slower.
-// Fraction should compensate.
-#define DELAY_LOOP_ITERATIONS_PER_US ( (30U*120000000U) / common_hal_mcu_processor_get_frequency())
-
-void mp_hal_delay_us_loop(uint32_t us) {
- for (uint32_t i = us*DELAY_LOOP_ITERATIONS_PER_US; i > 0; i--) {
- asm volatile("nop");
- }
-}
diff --git a/ports/nrf/mphalport.h b/ports/nrf/mphalport.h
index 79e1d2d58..a87247737 100644
--- a/ports/nrf/mphalport.h
+++ b/ports/nrf/mphalport.h
@@ -52,7 +52,6 @@ static inline uint32_t hal_tick_fake(void) {
extern const unsigned char mp_hal_status_to_errno_table[4];
-
NORETURN void mp_hal_raise(HAL_StatusTypeDef status);
void mp_hal_set_interrupt_char(int c); // -1 to disable
@@ -70,7 +69,6 @@ bool mp_hal_stdin_any(void);
#define mp_hal_pin_od_high(p) mp_hal_pin_high(p)
#define mp_hal_pin_open_drain(p) hal_gpio_cfg_pin(p->port, p->pin, HAL_GPIO_MODE_INPUT, HAL_GPIO_PULL_DISABLED)
-void mp_hal_delay_us_loop(uint32_t us);
// TODO: empty implementation for now. Used by machine_spi.c:69
#define mp_hal_delay_us_fast(p)