2020-06-03 18:40:05 -04:00
|
|
|
// SPDX-FileCopyrightText: 2014 MicroPython & CircuitPython contributors (https://github.com/adafruit/circuitpython/graphs/contributors)
|
|
|
|
// SPDX-FileCopyrightText: Copyright (c) 2013, 2014 Damien P. George
|
|
|
|
//
|
|
|
|
// SPDX-License-Identifier: MIT
|
2015-05-03 13:25:40 -04:00
|
|
|
|
2017-10-03 21:37:50 -04:00
|
|
|
#include "py/runtime.h"
|
2015-12-12 17:15:33 -05:00
|
|
|
#include "extmod/machine_mem.h"
|
2015-05-03 13:25:40 -04:00
|
|
|
|
|
|
|
#if MICROPY_PY_MACHINE
|
|
|
|
|
2015-12-13 19:11:20 -05:00
|
|
|
// 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
|
2016-11-20 17:09:17 -05:00
|
|
|
// MICROPY_MACHINE_MEM_GET_WRITE_ADDR in your mpconfigport.h. Since the
|
2015-12-13 19:11:20 -05:00
|
|
|
// 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) {
|
2020-11-19 17:12:53 -05:00
|
|
|
mp_raise_ValueError_varg(translate("address %08x is not aligned to %d bytes"), addr, align);
|
2015-12-13 19:11:20 -05:00
|
|
|
}
|
|
|
|
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
|
|
|
|
|
2015-05-03 13:25:40 -04:00
|
|
|
STATIC void machine_mem_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
|
|
|
|
(void)kind;
|
2015-11-27 12:01:44 -05:00
|
|
|
machine_mem_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
2015-05-03 13:25:40 -04:00
|
|
|
mp_printf(print, "<%u-bit memory>", 8 * self->elem_size);
|
|
|
|
}
|
|
|
|
|
|
|
|
STATIC mp_obj_t machine_mem_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
|
|
|
|
// TODO support slice index to read/write multiple values at once
|
2015-11-27 12:01:44 -05:00
|
|
|
machine_mem_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
2015-05-03 13:25:40 -04:00
|
|
|
if (value == MP_OBJ_NULL) {
|
|
|
|
// delete
|
|
|
|
return MP_OBJ_NULL; // op not supported
|
|
|
|
} else if (value == MP_OBJ_SENTINEL) {
|
|
|
|
// load
|
2015-12-13 19:11:20 -05:00
|
|
|
uintptr_t addr = MICROPY_MACHINE_MEM_GET_READ_ADDR(index, self->elem_size);
|
2015-05-03 13:25:40 -04:00
|
|
|
uint32_t val;
|
|
|
|
switch (self->elem_size) {
|
2021-03-15 09:57:36 -04:00
|
|
|
case 1:
|
|
|
|
val = (*(uint8_t *)addr);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
val = (*(uint16_t *)addr);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
val = (*(uint32_t *)addr);
|
|
|
|
break;
|
2015-05-03 13:25:40 -04:00
|
|
|
}
|
|
|
|
return mp_obj_new_int(val);
|
|
|
|
} else {
|
|
|
|
// store
|
2015-12-13 19:11:20 -05:00
|
|
|
uintptr_t addr = MICROPY_MACHINE_MEM_GET_WRITE_ADDR(index, self->elem_size);
|
2016-02-10 12:05:03 -05:00
|
|
|
uint32_t val = mp_obj_get_int_truncated(value);
|
2015-05-03 13:25:40 -04:00
|
|
|
switch (self->elem_size) {
|
2021-03-15 09:57:36 -04:00
|
|
|
case 1:
|
|
|
|
(*(uint8_t *)addr) = val;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
(*(uint16_t *)addr) = val;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
(*(uint32_t *)addr) = val;
|
|
|
|
break;
|
2015-05-03 13:25:40 -04:00
|
|
|
}
|
|
|
|
return mp_const_none;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-12-12 17:15:33 -05:00
|
|
|
const mp_obj_type_t machine_mem_type = {
|
2015-05-03 13:25:40 -04:00
|
|
|
{ &mp_type_type },
|
|
|
|
.name = MP_QSTR_mem,
|
|
|
|
.print = machine_mem_print,
|
|
|
|
.subscr = machine_mem_subscr,
|
|
|
|
};
|
|
|
|
|
2015-12-12 17:15:33 -05:00
|
|
|
const machine_mem_obj_t machine_mem8_obj = {{&machine_mem_type}, 1};
|
|
|
|
const machine_mem_obj_t machine_mem16_obj = {{&machine_mem_type}, 2};
|
|
|
|
const machine_mem_obj_t machine_mem32_obj = {{&machine_mem_type}, 4};
|
2015-05-03 13:25:40 -04:00
|
|
|
|
|
|
|
#endif // MICROPY_PY_MACHINE
|