2525 */
2626
2727#include "extmod/machine_mem.h"
28+ #include "py/nlr.h"
2829
2930#if MICROPY_PY_MACHINE
3031
32+ // If you wish to override the functions for mapping the machine_mem read/write
33+ // address, then add a #define for MICROPY_MACHINE_MEM_GET_READ_ADDR and/or
34+ // MICROPY_MACHINE_MEM_GET_WRITE_ADDR in yopur mpconfigport.h. Since the
35+ // prototypes are identical, it is allowable for both of the macros to evaluate
36+ // the to same function.
37+ //
38+ // It is expected that the modmachine.c file for a given port will provide the
39+ // implementations, if the default implementation isn't used.
40+
41+ #if !defined(MICROPY_MACHINE_MEM_GET_READ_ADDR ) || !defined(MICROPY_MACHINE_MEM_GET_WRITE_ADDR )
42+ STATIC uintptr_t machine_mem_get_addr (mp_obj_t addr_o , uint align ) {
43+ uintptr_t addr = mp_obj_int_get_truncated (addr_o );
44+ if ((addr & (align - 1 )) != 0 ) {
45+ nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_ValueError , "address %08x is not aligned to %d bytes" , addr , align ));
46+ }
47+ return addr ;
48+ }
49+ #if !defined(MICROPY_MACHINE_MEM_GET_READ_ADDR )
50+ #define MICROPY_MACHINE_MEM_GET_READ_ADDR machine_mem_get_addr
51+ #endif
52+ #if !defined(MICROPY_MACHINE_MEM_GET_WRITE_ADDR )
53+ #define MICROPY_MACHINE_MEM_GET_WRITE_ADDR machine_mem_get_addr
54+ #endif
55+ #endif
56+
3157STATIC void machine_mem_print (const mp_print_t * print , mp_obj_t self_in , mp_print_kind_t kind ) {
3258 (void )kind ;
3359 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
4268 return MP_OBJ_NULL ; // op not supported
4369 } else if (value == MP_OBJ_SENTINEL ) {
4470 // load
45- uintptr_t addr = machine_mem_get_read_addr (index , self -> elem_size );
71+ uintptr_t addr = MICROPY_MACHINE_MEM_GET_READ_ADDR (index , self -> elem_size );
4672 uint32_t val ;
4773 switch (self -> elem_size ) {
4874 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
5278 return mp_obj_new_int (val );
5379 } else {
5480 // store
55- uintptr_t addr = machine_mem_get_write_addr (index , self -> elem_size );
81+ uintptr_t addr = MICROPY_MACHINE_MEM_GET_WRITE_ADDR (index , self -> elem_size );
5682 uint32_t val = mp_obj_get_int (value );
5783 switch (self -> elem_size ) {
5884 case 1 : (* (uint8_t * )addr ) = val ; break ;
0 commit comments