aboutsummaryrefslogtreecommitdiff
path: root/ports/nrf/mphalport.c
diff options
context:
space:
mode:
Diffstat (limited to 'ports/nrf/mphalport.c')
-rw-r--r--ports/nrf/mphalport.c142
1 files changed, 142 insertions, 0 deletions
diff --git a/ports/nrf/mphalport.c b/ports/nrf/mphalport.c
index d8c3a9d2a..fc6882d79 100644
--- a/ports/nrf/mphalport.c
+++ b/ports/nrf/mphalport.c
@@ -31,6 +31,8 @@
#include "py/mphal.h"
#include "py/mperrno.h"
#include "uart.h"
+#include "nrfx_errors.h"
+#include "nrfx_config.h"
// this table converts from HAL_StatusTypeDef to POSIX errno
const byte mp_hal_status_to_errno_table[4] = {
@@ -77,3 +79,143 @@ 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));
}
+
+void mp_hal_delay_us(mp_uint_t us)
+{
+ register uint32_t delay __ASM ("r0") = us;
+ __ASM volatile (
+#ifdef NRF51
+ ".syntax unified\n"
+#endif
+ "1:\n"
+ " SUBS %0, %0, #1\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+#ifdef NRF52
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+ " NOP\n"
+#endif
+ " BNE 1b\n"
+#ifdef NRF51
+ ".syntax divided\n"
+#endif
+ : "+r" (delay));
+}
+
+void mp_hal_delay_ms(mp_uint_t ms)
+{
+ for (mp_uint_t i = 0; i < ms; i++)
+ {
+ mp_hal_delay_us(999);
+ }
+}
+
+#if defined(NRFX_LOG_ENABLED) && (NRFX_LOG_ENABLED == 1)
+
+static const char nrfx_error_unknown[1] = "";
+
+static const char nrfx_error_success[] = "NRFX_SUCCESS";
+static const char nrfx_error_internal[] = "NRFX_ERROR_INTERNAL";
+static const char nrfx_error_no_mem[] = "NRFX_ERROR_NO_MEM";
+static const char nrfx_error_not_supported[] = "NRFX_ERROR_NOT_SUPPORTED";
+static const char nrfx_error_invalid_param[] = "NRFX_ERROR_INVALID_PARAM";
+static const char nrfx_error_invalid_state[] = "NRFX_ERROR_INVALID_STATE";
+static const char nrfx_error_invalid_length[] = "NRFX_ERROR_INVALID_LENGTH";
+static const char nrfx_error_timeout[] = "NRFX_ERROR_TIMEOUT";
+static const char nrfx_error_forbidden[] = "NRFX_ERROR_FORBIDDEN";
+static const char nrfx_error_null[] = "NRFX_ERROR_NULL";
+static const char nrfx_error_invalid_addr[] = "NRFX_ERROR_INVALID_ADDR";
+static const char nrfx_error_busy[] = "NRFX_ERROR_BUSY";
+static const char nrfx_error_already_initalized[] = "NRFX_ERROR_ALREADY_INITIALIZED";
+
+static const char * nrfx_error_strings[13] = {
+ nrfx_error_success,
+ nrfx_error_internal,
+ nrfx_error_no_mem,
+ nrfx_error_not_supported,
+ nrfx_error_invalid_param,
+ nrfx_error_invalid_state,
+ nrfx_error_invalid_length,
+ nrfx_error_timeout,
+ nrfx_error_forbidden,
+ nrfx_error_null,
+ nrfx_error_invalid_addr,
+ nrfx_error_busy,
+ nrfx_error_already_initalized
+};
+
+static const char nrfx_drv_error_twi_err_overrun[] = "NRFX_ERROR_DRV_TWI_ERR_OVERRUN";
+static const char nrfx_drv_error_twi_err_anack[] = "NRFX_ERROR_DRV_TWI_ERR_ANACK";
+static const char nrfx_drv_error_twi_err_dnack[] = "NRFX_ERROR_DRV_TWI_ERR_DNACK";
+
+static const char * nrfx_drv_error_strings[3] = {
+ nrfx_drv_error_twi_err_overrun,
+ nrfx_drv_error_twi_err_anack,
+ nrfx_drv_error_twi_err_dnack
+};
+
+const char * nrfx_error_code_lookup(uint32_t err_code) {
+ if (err_code >= NRFX_ERROR_BASE_NUM && err_code <= NRFX_ERROR_BASE_NUM + 13) {
+ return nrfx_error_strings[err_code - NRFX_ERROR_BASE_NUM];
+ } else if (err_code >= NRFX_ERROR_DRIVERS_BASE_NUM && err_code <= NRFX_ERROR_DRIVERS_BASE_NUM + 3) {
+ return nrfx_drv_error_strings[err_code - NRFX_ERROR_DRIVERS_BASE_NUM];
+ }
+
+ return nrfx_error_unknown;
+}
+
+#endif // NRFX_LOG_ENABLED