summaryrefslogtreecommitdiff
path: root/extmod/machine_mem.c
diff options
context:
space:
mode:
authorDave Hylands <dhylands@gmail.com>2015-12-13 16:11:20 -0800
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2015-12-18 22:01:03 +0200
commit755b01439bab486d3ccb3c6eddccd10aae045f23 (patch)
tree61b867c8369f8c49f523c4d9866a9814e83c64b4 /extmod/machine_mem.c
parentacaccb37ecae4e29c1e3e6fcd67c4b59bf39dfbd (diff)
unix: machine_mem improvements
This basically introduces the MICROPY_MACHINE_MEM_GET_READ_ADDR and MICROPY_MACHINE_MEM_GET_WRITE_ADDR macros. If one of them is not defined, then a default identity function is provided.
Diffstat (limited to 'extmod/machine_mem.c')
-rw-r--r--extmod/machine_mem.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/extmod/machine_mem.c b/extmod/machine_mem.c
index 634ef2f6b..2c09d752d 100644
--- a/extmod/machine_mem.c
+++ b/extmod/machine_mem.c
@@ -25,9 +25,35 @@
*/
#include "extmod/machine_mem.h"
+#include "py/nlr.h"
#if MICROPY_PY_MACHINE
+// If you wish to override the functions for mapping the machine_mem read/write
+// address, then add a #define for MICROPY_MACHINE_MEM_GET_READ_ADDR and/or
+// MICROPY_MACHINE_MEM_GET_WRITE_ADDR in yopur mpconfigport.h. Since the
+// prototypes are identical, it is allowable for both of the macros to evaluate
+// the to same function.
+//
+// It is expected that the modmachine.c file for a given port will provide the
+// implementations, if the default implementation isn't used.
+
+#if !defined(MICROPY_MACHINE_MEM_GET_READ_ADDR) || !defined(MICROPY_MACHINE_MEM_GET_WRITE_ADDR)
+STATIC uintptr_t machine_mem_get_addr(mp_obj_t addr_o, uint align) {
+ uintptr_t addr = mp_obj_int_get_truncated(addr_o);
+ if ((addr & (align - 1)) != 0) {
+ nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "address %08x is not aligned to %d bytes", addr, align));
+ }
+ return addr;
+}
+#if !defined(MICROPY_MACHINE_MEM_GET_READ_ADDR)
+#define MICROPY_MACHINE_MEM_GET_READ_ADDR machine_mem_get_addr
+#endif
+#if !defined(MICROPY_MACHINE_MEM_GET_WRITE_ADDR)
+#define MICROPY_MACHINE_MEM_GET_WRITE_ADDR machine_mem_get_addr
+#endif
+#endif
+
STATIC void machine_mem_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
(void)kind;
machine_mem_obj_t *self = MP_OBJ_TO_PTR(self_in);
@@ -42,7 +68,7 @@ STATIC mp_obj_t machine_mem_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t va
return MP_OBJ_NULL; // op not supported
} else if (value == MP_OBJ_SENTINEL) {
// load
- uintptr_t addr = machine_mem_get_read_addr(index, self->elem_size);
+ uintptr_t addr = MICROPY_MACHINE_MEM_GET_READ_ADDR(index, self->elem_size);
uint32_t val;
switch (self->elem_size) {
case 1: val = (*(uint8_t*)addr); break;
@@ -52,7 +78,7 @@ STATIC mp_obj_t machine_mem_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t va
return mp_obj_new_int(val);
} else {
// store
- uintptr_t addr = machine_mem_get_write_addr(index, self->elem_size);
+ uintptr_t addr = MICROPY_MACHINE_MEM_GET_WRITE_ADDR(index, self->elem_size);
uint32_t val = mp_obj_get_int(value);
switch (self->elem_size) {
case 1: (*(uint8_t*)addr) = val; break;