Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
TASTE
uPython-mirror
Commits
b6133648
Commit
b6133648
authored
Dec 13, 2015
by
Dave Hylands
Committed by
Damien George
Dec 19, 2015
Browse files
stmhal: Add mem8/mem16/mem32 operations to machine module.
This uses the newly factored machine_mem functions.
parent
d0f31ccf
Changes
3
Hide whitespace changes
Inline
Side-by-side
stmhal/modmachine.c
View file @
b6133648
...
...
@@ -30,6 +30,7 @@
#include
"py/gc.h"
#include
"py/runtime.h"
#include
"py/mphal.h"
#include
"extmod/machine_mem.h"
#include
"lib/fatfs/ff.h"
#include
"lib/fatfs/diskio.h"
#include
"gccollect.h"
...
...
@@ -418,6 +419,42 @@ STATIC mp_obj_t machine_reset_cause(void) {
STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_reset_cause_obj, machine_reset_cause);
#endif
// To use compile-time constants we are restricted to 31-bit numbers (a small int,
// so it fits in a Micro Python object pointer). Thus, when extracting a constant
// from an object, we must clear the MSB.
uintptr_t
mod_machine_mem_get_read_addr
(
mp_obj_t
addr_o
,
uint
align
)
{
uint32_t
addr
=
mp_obj_get_int_truncated
(
addr_o
);
if
(
MP_OBJ_IS_SMALL_INT
(
addr_o
))
{
addr
&=
0x7fffffff
;
}
/*
if (addr < 0x10000000) {
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "cannot read from address %08x", addr));
}
*/
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
;
}
uintptr_t
mod_machine_mem_get_write_addr
(
mp_obj_t
addr_o
,
uint
align
)
{
uint32_t
addr
=
mp_obj_get_int_truncated
(
addr_o
);
if
(
MP_OBJ_IS_SMALL_INT
(
addr_o
))
{
addr
&=
0x7fffffff
;
}
if
(
addr
<
0x10000000
)
{
// Everything below 0x10000000 is either ROM or aliased to something higher, so we don't
// lose anything by restricting writes to this area, and we gain some safety.
nlr_raise
(
mp_obj_new_exception_msg_varg
(
&
mp_type_ValueError
,
"cannot write to address %08x"
,
addr
));
}
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
;
}
STATIC
const
mp_map_elem_t
machine_module_globals_table
[]
=
{
{
MP_OBJ_NEW_QSTR
(
MP_QSTR___name__
),
MP_OBJ_NEW_QSTR
(
MP_QSTR_umachine
)
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_info
),
(
mp_obj_t
)
&
machine_info_obj
},
...
...
@@ -439,6 +476,10 @@ STATIC const mp_map_elem_t machine_module_globals_table[] = {
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_disable_irq
),
(
mp_obj_t
)
&
pyb_disable_irq_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_enable_irq
),
(
mp_obj_t
)
&
pyb_enable_irq_obj
},
{
MP_ROM_QSTR
(
MP_QSTR_mem8
),
(
mp_obj_t
)
&
machine_mem8_obj
},
{
MP_ROM_QSTR
(
MP_QSTR_mem16
),
(
mp_obj_t
)
&
machine_mem16_obj
},
{
MP_ROM_QSTR
(
MP_QSTR_mem32
),
(
mp_obj_t
)
&
machine_mem32_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_Pin
),
(
mp_obj_t
)
&
pin_type
},
#if 0
...
...
stmhal/modstm.c
View file @
b6133648
...
...
@@ -31,100 +31,15 @@
#include
"py/nlr.h"
#include
"py/obj.h"
#include
"extmod/machine_mem.h"
#include
"portmodules.h"
// To use compile-time constants we are restricted to 31-bit numbers (a small int,
// so it fits in a Micro Python object pointer). Thus, when extracting a constant
// from an object, we must clear the MSB.
STATIC
uint32_t
get_read_addr
(
mp_obj_t
addr_o
,
uint
align
)
{
uint32_t
addr
=
mp_obj_get_int_truncated
(
addr_o
);
if
(
MP_OBJ_IS_SMALL_INT
(
addr_o
))
{
addr
&=
0x7fffffff
;
}
/*
if (addr < 0x10000000) {
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "cannot read from address %08x", addr));
}
*/
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
;
}
STATIC
uint32_t
get_write_addr
(
mp_obj_t
addr_o
,
uint
align
)
{
uint32_t
addr
=
mp_obj_get_int_truncated
(
addr_o
);
if
(
MP_OBJ_IS_SMALL_INT
(
addr_o
))
{
addr
&=
0x7fffffff
;
}
if
(
addr
<
0x10000000
)
{
// Everything below 0x10000000 is either ROM or aliased to something higher, so we don't
// lose anything by restricting writes to this area, and we gain some safety.
nlr_raise
(
mp_obj_new_exception_msg_varg
(
&
mp_type_ValueError
,
"cannot write to address %08x"
,
addr
));
}
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
;
}
typedef
struct
_stm_mem_obj_t
{
mp_obj_base_t
base
;
uint32_t
elem_size
;
// in bytes
}
stm_mem_obj_t
;
STATIC
void
stm_mem_print
(
const
mp_print_t
*
print
,
mp_obj_t
self_in
,
mp_print_kind_t
kind
)
{
stm_mem_obj_t
*
self
=
self_in
;
mp_printf
(
print
,
"<%u-bit memory>"
,
8
*
self
->
elem_size
);
}
STATIC
mp_obj_t
stm_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
stm_mem_obj_t
*
self
=
self_in
;
if
(
value
==
MP_OBJ_NULL
)
{
// delete
return
MP_OBJ_NULL
;
// op not supported
}
else
if
(
value
==
MP_OBJ_SENTINEL
)
{
// load
uint32_t
addr
=
get_read_addr
(
index
,
self
->
elem_size
);
uint32_t
val
;
switch
(
self
->
elem_size
)
{
case
1
:
val
=
(
*
(
uint8_t
*
)
addr
);
break
;
case
2
:
val
=
(
*
(
uint16_t
*
)
addr
);
break
;
default:
val
=
(
*
(
uint32_t
*
)
addr
);
break
;
}
return
mp_obj_new_int_from_uint
(
val
);
}
else
{
// store
uint32_t
addr
=
get_write_addr
(
index
,
self
->
elem_size
);
uint32_t
val
=
mp_obj_get_int_truncated
(
value
);
switch
(
self
->
elem_size
)
{
case
1
:
(
*
(
uint8_t
*
)
addr
)
=
val
;
break
;
case
2
:
(
*
(
uint16_t
*
)
addr
)
=
val
;
break
;
default:
(
*
(
uint32_t
*
)
addr
)
=
val
;
break
;
}
return
mp_const_none
;
}
}
STATIC
const
mp_obj_type_t
stm_mem_type
=
{
{
&
mp_type_type
},
.
name
=
MP_QSTR_mem
,
.
print
=
stm_mem_print
,
.
subscr
=
stm_mem_subscr
,
};
STATIC
const
stm_mem_obj_t
stm_mem8_obj
=
{{
&
stm_mem_type
},
1
};
STATIC
const
stm_mem_obj_t
stm_mem16_obj
=
{{
&
stm_mem_type
},
2
};
STATIC
const
stm_mem_obj_t
stm_mem32_obj
=
{{
&
stm_mem_type
},
4
};
STATIC
const
mp_map_elem_t
stm_module_globals_table
[]
=
{
{
MP_OBJ_NEW_QSTR
(
MP_QSTR___name__
),
MP_OBJ_NEW_QSTR
(
MP_QSTR_stm
)
},
{
MP_
OBJ_NEW
_QSTR
(
MP_QSTR_mem8
),
(
mp_obj_t
)
&
stm
_mem8_obj
},
{
MP_
OBJ_NEW
_QSTR
(
MP_QSTR_mem16
),
(
mp_obj_t
)
&
stm
_mem16_obj
},
{
MP_
OBJ_NEW
_QSTR
(
MP_QSTR_mem32
),
(
mp_obj_t
)
&
stm
_mem32_obj
},
{
MP_
ROM
_QSTR
(
MP_QSTR_mem8
),
(
mp_obj_t
)
&
machine
_mem8_obj
},
{
MP_
ROM
_QSTR
(
MP_QSTR_mem16
),
(
mp_obj_t
)
&
machine
_mem16_obj
},
{
MP_
ROM
_QSTR
(
MP_QSTR_mem32
),
(
mp_obj_t
)
&
machine
_mem32_obj
},
#include
"genhdr/modstm_const.h"
};
...
...
stmhal/mpconfigport.h
View file @
b6133648
...
...
@@ -86,6 +86,10 @@
#define MICROPY_PY_UHEAPQ (1)
#define MICROPY_PY_UHASHLIB (1)
#define MICROPY_PY_MACHINE (1)
#define MICROPY_MACHINE_MEM_GET_READ_ADDR mod_machine_mem_get_read_addr
#define MICROPY_MACHINE_MEM_GET_WRITE_ADDR mod_machine_mem_get_write_addr
#define MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF (1)
#define MICROPY_EMERGENCY_EXCEPTION_BUF_SIZE (0)
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment