Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
M
micropython
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container registry
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
This is an archived project. Repository and other project resources are read-only.
Show more breadcrumbs
card10
micropython
Commits
b6133648
Commit
b6133648
authored
Dec 14, 2015
by
Dave Hylands
Committed by
Damien George
Dec 19, 2015
Browse files
Options
Downloads
Patches
Plain Diff
stmhal: Add mem8/mem16/mem32 operations to machine module.
This uses the newly factored machine_mem functions.
parent
d0f31ccf
No related branches found
No related tags found
No related merge requests found
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
stmhal/modmachine.c
+41
-0
41 additions, 0 deletions
stmhal/modmachine.c
stmhal/modstm.c
+4
-89
4 additions, 89 deletions
stmhal/modstm.c
stmhal/mpconfigport.h
+4
-0
4 additions, 0 deletions
stmhal/mpconfigport.h
with
49 additions
and
89 deletions
stmhal/modmachine.c
+
41
−
0
View file @
b6133648
...
@@ -30,6 +30,7 @@
...
@@ -30,6 +30,7 @@
#include
"py/gc.h"
#include
"py/gc.h"
#include
"py/runtime.h"
#include
"py/runtime.h"
#include
"py/mphal.h"
#include
"py/mphal.h"
#include
"extmod/machine_mem.h"
#include
"lib/fatfs/ff.h"
#include
"lib/fatfs/ff.h"
#include
"lib/fatfs/diskio.h"
#include
"lib/fatfs/diskio.h"
#include
"gccollect.h"
#include
"gccollect.h"
...
@@ -418,6 +419,42 @@ STATIC mp_obj_t machine_reset_cause(void) {
...
@@ -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);
STATIC MP_DEFINE_CONST_FUN_OBJ_0(machine_reset_cause_obj, machine_reset_cause);
#endif
#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
[]
=
{
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___name__
),
MP_OBJ_NEW_QSTR
(
MP_QSTR_umachine
)
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_info
),
(
mp_obj_t
)
&
machine_info_obj
},
{
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[] = {
...
@@ -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_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_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
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_Pin
),
(
mp_obj_t
)
&
pin_type
},
#if 0
#if 0
...
...
This diff is collapsed.
Click to expand it.
stmhal/modstm.c
+
4
−
89
View file @
b6133648
...
@@ -31,100 +31,15 @@
...
@@ -31,100 +31,15 @@
#include
"py/nlr.h"
#include
"py/nlr.h"
#include
"py/obj.h"
#include
"py/obj.h"
#include
"extmod/machine_mem.h"
#include
"portmodules.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
[]
=
{
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___name__
),
MP_OBJ_NEW_QSTR
(
MP_QSTR_stm
)
},
{
MP_
OBJ_NEW
_QSTR
(
MP_QSTR_mem8
),
(
mp_obj_t
)
&
stm
_mem8_obj
},
{
MP_
ROM
_QSTR
(
MP_QSTR_mem8
),
(
mp_obj_t
)
&
machine
_mem8_obj
},
{
MP_
OBJ_NEW
_QSTR
(
MP_QSTR_mem16
),
(
mp_obj_t
)
&
stm
_mem16_obj
},
{
MP_
ROM
_QSTR
(
MP_QSTR_mem16
),
(
mp_obj_t
)
&
machine
_mem16_obj
},
{
MP_
OBJ_NEW
_QSTR
(
MP_QSTR_mem32
),
(
mp_obj_t
)
&
stm
_mem32_obj
},
{
MP_
ROM
_QSTR
(
MP_QSTR_mem32
),
(
mp_obj_t
)
&
machine
_mem32_obj
},
#include
"genhdr/modstm_const.h"
#include
"genhdr/modstm_const.h"
};
};
...
...
This diff is collapsed.
Click to expand it.
stmhal/mpconfigport.h
+
4
−
0
View file @
b6133648
...
@@ -86,6 +86,10 @@
...
@@ -86,6 +86,10 @@
#define MICROPY_PY_UHEAPQ (1)
#define MICROPY_PY_UHEAPQ (1)
#define MICROPY_PY_UHASHLIB (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_ENABLE_EMERGENCY_EXCEPTION_BUF (1)
#define MICROPY_EMERGENCY_EXCEPTION_BUF_SIZE (0)
#define MICROPY_EMERGENCY_EXCEPTION_BUF_SIZE (0)
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
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!
Save comment
Cancel
Please
register
or
sign in
to comment