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
8cc2018d
Commit
8cc2018d
authored
Jul 31, 2014
by
Damien George
Browse files
Merge branch 'master' of
https://github.com/micropython/micropython
parents
c9aa58e6
bb4c6f35
Changes
25
Hide whitespace changes
Inline
Side-by-side
extmod/moductypes.c
View file @
8cc2018d
...
...
@@ -296,13 +296,13 @@ static inline void set_aligned_basic(uint val_type, void *p, mp_uint_t v) {
STATIC
mp_obj_t
get_aligned
(
uint
val_type
,
void
*
p
,
mp_int_t
index
)
{
switch
(
val_type
)
{
case
UINT8
:
return
MP_OBJ_NEW_SMALL_INT
((
mp_int_t
)(
(
uint8_t
*
)
p
)[
index
]);
return
MP_OBJ_NEW_SMALL_INT
(((
uint8_t
*
)
p
)[
index
]);
case
INT8
:
return
MP_OBJ_NEW_SMALL_INT
((
mp_int_t
)(
(
int8_t
*
)
p
)[
index
]);
return
MP_OBJ_NEW_SMALL_INT
(((
int8_t
*
)
p
)[
index
]);
case
UINT16
:
return
MP_OBJ_NEW_SMALL_INT
((
mp_int_t
)(
(
uint16_t
*
)
p
)[
index
]);
return
MP_OBJ_NEW_SMALL_INT
(((
uint16_t
*
)
p
)[
index
]);
case
INT16
:
return
MP_OBJ_NEW_SMALL_INT
((
mp_int_t
)(
(
int16_t
*
)
p
)[
index
]);
return
MP_OBJ_NEW_SMALL_INT
(((
int16_t
*
)
p
)[
index
]);
case
UINT32
:
return
mp_obj_new_int_from_uint
(((
uint32_t
*
)
p
)[
index
]);
case
INT32
:
...
...
py/modgc.c
View file @
8cc2018d
...
...
@@ -42,7 +42,7 @@ extern uint gc_collected;
STATIC
mp_obj_t
py_gc_collect
(
void
)
{
gc_collect
();
#if MICROPY_PY_GC_COLLECT_RETVAL
return
MP_OBJ_NEW_SMALL_INT
(
(
mp_uint_t
)
gc_collected
);
return
MP_OBJ_NEW_SMALL_INT
(
gc_collected
);
#else
return
mp_const_none
;
#endif
...
...
@@ -64,14 +64,14 @@ MP_DEFINE_CONST_FUN_OBJ_0(gc_enable_obj, gc_enable);
STATIC
mp_obj_t
gc_mem_free
(
void
)
{
gc_info_t
info
;
gc_info
(
&
info
);
return
MP_OBJ_NEW_SMALL_INT
(
(
mp_uint_t
)
info
.
free
);
return
MP_OBJ_NEW_SMALL_INT
(
info
.
free
);
}
MP_DEFINE_CONST_FUN_OBJ_0
(
gc_mem_free_obj
,
gc_mem_free
);
STATIC
mp_obj_t
gc_mem_alloc
(
void
)
{
gc_info_t
info
;
gc_info
(
&
info
);
return
MP_OBJ_NEW_SMALL_INT
(
(
mp_uint_t
)
info
.
used
);
return
MP_OBJ_NEW_SMALL_INT
(
info
.
used
);
}
MP_DEFINE_CONST_FUN_OBJ_0
(
gc_mem_alloc_obj
,
gc_mem_alloc
);
...
...
py/modmicropython.c
View file @
8cc2018d
...
...
@@ -35,15 +35,15 @@
#if MICROPY_MEM_STATS
STATIC
mp_obj_t
mp_micropython_mem_total
()
{
return
MP_OBJ_NEW_SMALL_INT
(
(
mp_int_t
)
m_get_total_bytes_allocated
());
return
MP_OBJ_NEW_SMALL_INT
(
m_get_total_bytes_allocated
());
}
STATIC
mp_obj_t
mp_micropython_mem_current
()
{
return
MP_OBJ_NEW_SMALL_INT
(
(
mp_int_t
)
m_get_current_bytes_allocated
());
return
MP_OBJ_NEW_SMALL_INT
(
m_get_current_bytes_allocated
());
}
STATIC
mp_obj_t
mp_micropython_mem_peak
()
{
return
MP_OBJ_NEW_SMALL_INT
(
(
mp_int_t
)
m_get_peak_bytes_allocated
());
return
MP_OBJ_NEW_SMALL_INT
(
m_get_peak_bytes_allocated
());
}
STATIC
MP_DEFINE_CONST_FUN_OBJ_0
(
mp_micropython_mem_total_obj
,
mp_micropython_mem_total
);
...
...
py/obj.c
View file @
8cc2018d
...
...
@@ -368,7 +368,7 @@ mp_obj_t mp_obj_len_maybe(mp_obj_t o_in) {
MP_OBJ_IS_STR
(
o_in
)
||
#endif
MP_OBJ_IS_TYPE
(
o_in
,
&
mp_type_bytes
))
{
return
MP_OBJ_NEW_SMALL_INT
(
(
mp_int_t
)
mp_obj_str_get_len
(
o_in
));
return
MP_OBJ_NEW_SMALL_INT
(
mp_obj_str_get_len
(
o_in
));
}
else
{
mp_obj_type_t
*
type
=
mp_obj_get_type
(
o_in
);
if
(
type
->
unary_op
!=
NULL
)
{
...
...
py/obj.h
View file @
8cc2018d
...
...
@@ -76,10 +76,10 @@ typedef struct _mp_obj_base_t mp_obj_base_t;
#define MP_OBJ_IS_STR(o) (MP_OBJ_IS_QSTR(o) || MP_OBJ_IS_TYPE(o, &mp_type_str))
#define MP_OBJ_SMALL_INT_VALUE(o) (((mp_int_t)(o)) >> 1)
#define MP_OBJ_NEW_SMALL_INT(small_int) ((mp_obj_t)(((small_int) << 1) | 1))
#define MP_OBJ_NEW_SMALL_INT(small_int) ((mp_obj_t)(((
(mp_int_t)(
small_int)
)
<< 1) | 1))
#define MP_OBJ_QSTR_VALUE(o) (((mp_int_t)(o)) >> 2)
#define MP_OBJ_NEW_QSTR(qstr) ((mp_obj_t)((((mp_uint_t)qstr) << 2) | 2))
#define MP_OBJ_NEW_QSTR(qstr) ((mp_obj_t)((((mp_uint_t)
(
qstr)
)
<< 2) | 2))
// These macros are used to declare and define constant function objects
// You can put "static" in front of the definitions to make them local
...
...
@@ -460,6 +460,7 @@ void mp_init_emergency_exception_buf(void);
// str
mp_obj_t
mp_obj_str_builder_start
(
const
mp_obj_type_t
*
type
,
uint
len
,
byte
**
data
);
mp_obj_t
mp_obj_str_builder_end
(
mp_obj_t
o_in
);
mp_obj_t
mp_obj_str_builder_end_with_len
(
mp_obj_t
o_in
,
mp_uint_t
len
);
bool
mp_obj_str_equal
(
mp_obj_t
s1
,
mp_obj_t
s2
);
uint
mp_obj_str_get_hash
(
mp_obj_t
self_in
);
uint
mp_obj_str_get_len
(
mp_obj_t
self_in
);
...
...
py/objbool.c
View file @
8cc2018d
...
...
@@ -74,7 +74,7 @@ STATIC mp_obj_t bool_unary_op(int op, mp_obj_t o_in) {
STATIC
mp_obj_t
bool_binary_op
(
int
op
,
mp_obj_t
lhs_in
,
mp_obj_t
rhs_in
)
{
if
(
MP_BINARY_OP_OR
<=
op
&&
op
<=
MP_BINARY_OP_NOT_EQUAL
)
{
return
mp_binary_op
(
op
,
MP_OBJ_NEW_SMALL_INT
(
(
mp_int_t
)
mp_obj_is_true
(
lhs_in
)),
rhs_in
);
return
mp_binary_op
(
op
,
MP_OBJ_NEW_SMALL_INT
(
mp_obj_is_true
(
lhs_in
)),
rhs_in
);
}
return
MP_OBJ_NULL
;
// op not supported
}
...
...
py/objdict.c
View file @
8cc2018d
...
...
@@ -75,7 +75,7 @@ STATIC mp_obj_t dict_unary_op(int op, mp_obj_t self_in) {
mp_obj_dict_t
*
self
=
self_in
;
switch
(
op
)
{
case
MP_UNARY_OP_BOOL
:
return
MP_BOOL
(
self
->
map
.
used
!=
0
);
case
MP_UNARY_OP_LEN
:
return
MP_OBJ_NEW_SMALL_INT
(
(
mp_int_t
)
self
->
map
.
used
);
case
MP_UNARY_OP_LEN
:
return
MP_OBJ_NEW_SMALL_INT
(
self
->
map
.
used
);
default:
return
MP_OBJ_NULL
;
// op not supported
}
}
...
...
py/objint.c
View file @
8cc2018d
...
...
@@ -64,7 +64,7 @@ STATIC mp_obj_t mp_obj_int_make_new(mp_obj_t type_in, uint n_args, uint n_kw, co
return
mp_parse_num_integer
(
s
,
l
,
0
);
#if MICROPY_PY_BUILTINS_FLOAT
}
else
if
(
MP_OBJ_IS_TYPE
(
args
[
0
],
&
mp_type_float
))
{
return
MP_OBJ_NEW_SMALL_INT
((
mp_int_t
)(
MICROPY_FLOAT_C_FUN
(
trunc
)(
mp_obj_float_get
(
args
[
0
]))));
return
MP_OBJ_NEW_SMALL_INT
((
MICROPY_FLOAT_C_FUN
(
trunc
)(
mp_obj_float_get
(
args
[
0
]))));
#endif
}
else
{
// try to convert to small int (eg from bool)
...
...
py/objset.c
View file @
8cc2018d
...
...
@@ -476,7 +476,7 @@ STATIC mp_obj_t set_unary_op(int op, mp_obj_t self_in) {
mp_obj_set_t
*
self
=
self_in
;
switch
(
op
)
{
case
MP_UNARY_OP_BOOL
:
return
MP_BOOL
(
self
->
set
.
used
!=
0
);
case
MP_UNARY_OP_LEN
:
return
MP_OBJ_NEW_SMALL_INT
(
(
mp_int_t
)
self
->
set
.
used
);
case
MP_UNARY_OP_LEN
:
return
MP_OBJ_NEW_SMALL_INT
(
self
->
set
.
used
);
default:
return
MP_OBJ_NULL
;
// op not supported
}
}
...
...
py/objstr.c
View file @
8cc2018d
...
...
@@ -370,7 +370,7 @@ STATIC mp_obj_t str_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
#endif
const
byte
*
p
=
str_index_to_ptr
(
type
,
self_data
,
self_len
,
index
,
false
);
if
(
type
==
&
mp_type_bytes
)
{
return
MP_OBJ_NEW_SMALL_INT
(
(
mp_int_t
)
*
p
);
return
MP_OBJ_NEW_SMALL_INT
(
*
p
);
}
else
{
return
mp_obj_new_str
((
char
*
)
p
,
1
,
true
);
}
...
...
@@ -1744,6 +1744,16 @@ mp_obj_t mp_obj_str_builder_end(mp_obj_t o_in) {
return
o
;
}
mp_obj_t
mp_obj_str_builder_end_with_len
(
mp_obj_t
o_in
,
mp_uint_t
len
)
{
mp_obj_str_t
*
o
=
o_in
;
o
->
data
=
m_renew
(
byte
,
(
byte
*
)
o
->
data
,
o
->
len
+
1
,
len
+
1
);
o
->
len
=
len
;
o
->
hash
=
qstr_compute_hash
(
o
->
data
,
o
->
len
);
byte
*
p
=
(
byte
*
)
o
->
data
;
p
[
o
->
len
]
=
'\0'
;
// for now we add null for compatibility with C ASCIIZ strings
return
o
;
}
mp_obj_t
mp_obj_new_str_of_type
(
const
mp_obj_type_t
*
type
,
const
byte
*
data
,
uint
len
)
{
mp_obj_str_t
*
o
=
m_new_obj
(
mp_obj_str_t
);
o
->
base
.
type
=
type
;
...
...
@@ -1907,7 +1917,7 @@ STATIC mp_obj_t bytes_it_iternext(mp_obj_t self_in) {
mp_obj_str_it_t
*
self
=
self_in
;
GET_STR_DATA_LEN
(
self
->
str
,
str
,
len
);
if
(
self
->
cur
<
len
)
{
mp_obj_t
o_out
=
MP_OBJ_NEW_SMALL_INT
(
(
mp_int_t
)
str
[
self
->
cur
]);
mp_obj_t
o_out
=
MP_OBJ_NEW_SMALL_INT
(
str
[
self
->
cur
]);
self
->
cur
+=
1
;
return
o_out
;
}
else
{
...
...
py/objstrunicode.c
View file @
8cc2018d
...
...
@@ -257,7 +257,7 @@ STATIC mp_obj_t str_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
#endif
if
(
type
==
&
mp_type_bytes
)
{
uint
index_val
=
mp_get_index
(
type
,
self_len
,
index
,
false
);
return
MP_OBJ_NEW_SMALL_INT
(
(
mp_int_t
)
self_data
[
index_val
]);
return
MP_OBJ_NEW_SMALL_INT
(
self_data
[
index_val
]);
}
const
byte
*
s
=
str_index_to_ptr
(
type
,
self_data
,
self_len
,
index
,
false
);
int
len
=
1
;
...
...
stmhal/accel.c
View file @
8cc2018d
...
...
@@ -83,11 +83,11 @@ STATIC void accel_start(void) {
I2CHandle1
.
Init
.
OwnAddress2
=
0xfe
;
// unused
i2c_init
(
&
I2CHandle1
);
// turn off AVDD, wait
2
0ms, turn on AVDD, wait
2
0ms again
// turn off AVDD, wait
3
0ms, turn on AVDD, wait
3
0ms again
GPIOB
->
BSRRH
=
GPIO_PIN_5
;
// turn off
HAL_Delay
(
2
0
);
HAL_Delay
(
3
0
);
GPIOB
->
BSRRL
=
GPIO_PIN_5
;
// turn on
HAL_Delay
(
2
0
);
HAL_Delay
(
3
0
);
HAL_StatusTypeDef
status
;
...
...
@@ -100,11 +100,12 @@ STATIC void accel_start(void) {
}
}
//printf("MemWrite\n");
uint8_t
data
[
1
];
data
[
0
]
=
1
;
// active mode
// set MMA to active mode
uint8_t
data
[
1
]
=
{
1
};
// active mode
status
=
HAL_I2C_Mem_Write
(
&
I2CHandle1
,
MMA_ADDR
,
MMA_REG_MODE
,
I2C_MEMADD_SIZE_8BIT
,
data
,
1
,
200
);
//printf(" got %d\n", status);
// wait for MMA to become active
HAL_Delay
(
30
);
}
/******************************************************************************/
...
...
stmhal/file.c
View file @
8cc2018d
...
...
@@ -206,7 +206,7 @@ STATIC mp_obj_t file_obj_make_new(mp_obj_t type, uint n_args, uint n_kw, const m
FRESULT
res
=
f_open
(
&
o
->
fp
,
fname
,
mode
);
if
(
res
!=
FR_OK
)
{
m_del_obj
(
pyb_file_obj_t
,
o
);
nlr_raise
(
mp_obj_new_exception_arg1
(
&
mp_type_OSError
,
MP_OBJ_NEW_SMALL_INT
(
(
mp_int_t
)
fresult_to_errno_table
[
res
])));
nlr_raise
(
mp_obj_new_exception_arg1
(
&
mp_type_OSError
,
MP_OBJ_NEW_SMALL_INT
(
fresult_to_errno_table
[
res
])));
}
// for 'a' mode, we must begin at the end of the file
...
...
stmhal/modpyb.c
View file @
8cc2018d
...
...
@@ -367,6 +367,7 @@ STATIC const mp_map_elem_t pyb_module_globals_table[] = {
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_have_cdc
),
(
mp_obj_t
)
&
pyb_have_cdc_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_repl_uart
),
(
mp_obj_t
)
&
pyb_repl_uart_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_hid
),
(
mp_obj_t
)
&
pyb_hid_send_report_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_USB_VCP
),
(
mp_obj_t
)
&
pyb_usb_vcp_type
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_millis
),
(
mp_obj_t
)
&
pyb_millis_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_delay
),
(
mp_obj_t
)
&
pyb_delay_obj
},
...
...
stmhal/pin.c
View file @
8cc2018d
...
...
@@ -352,7 +352,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(pin_name_obj, pin_name);
/// Get the pin port.
STATIC
mp_obj_t
pin_port
(
mp_obj_t
self_in
)
{
pin_obj_t
*
self
=
self_in
;
return
MP_OBJ_NEW_SMALL_INT
(
(
mp_int_t
)
self
->
port
);
return
MP_OBJ_NEW_SMALL_INT
(
self
->
port
);
}
STATIC
MP_DEFINE_CONST_FUN_OBJ_1
(
pin_port_obj
,
pin_port
);
...
...
@@ -360,7 +360,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(pin_port_obj, pin_port);
/// Get the pin number.
STATIC
mp_obj_t
pin_pin
(
mp_obj_t
self_in
)
{
pin_obj_t
*
self
=
self_in
;
return
MP_OBJ_NEW_SMALL_INT
(
(
mp_int_t
)
self
->
pin
);
return
MP_OBJ_NEW_SMALL_INT
(
self
->
pin
);
}
STATIC
MP_DEFINE_CONST_FUN_OBJ_1
(
pin_pin_obj
,
pin_pin
);
...
...
stmhal/pybstdio.c
View file @
8cc2018d
...
...
@@ -84,8 +84,10 @@ int stdin_rx_chr(void) {
}
#endif
#endif
if
(
usb_vcp_rx_num
()
!=
0
)
{
return
usb_vcp_rx_get
();
byte
c
;
if
(
usb_vcp_recv_byte
(
&
c
)
!=
0
)
{
return
c
;
}
else
if
(
pyb_stdio_uart
!=
PYB_UART_NONE
&&
uart_rx_any
(
pyb_stdio_uart
))
{
return
uart_rx_char
(
pyb_stdio_uart
);
}
...
...
stmhal/qstrdefsport.h
View file @
8cc2018d
...
...
@@ -71,6 +71,12 @@ Q(millis)
Q
(
seek
)
Q
(
tell
)
// for USB VCP class
Q
(
USB_VCP
)
Q
(
send
)
Q
(
recv
)
Q
(
timeout
)
// for RTC class
Q
(
RTC
)
Q
(
info
)
...
...
stmhal/usb.c
View file @
8cc2018d
...
...
@@ -32,10 +32,13 @@
#include
"usbd_cdc_interface.h"
#include
"usbd_msc_storage.h"
#include
"misc.h"
#include
"mpconfig.h"
#include
"misc.h"
#include
"qstr.h"
#include
"obj.h"
#include
"runtime.h"
#include
"stream.h"
#include
"bufhelper.h"
#include
"usb.h"
#ifdef USE_DEVICE_MODE
...
...
@@ -99,18 +102,14 @@ void usb_vcp_set_interrupt_char(int c) {
}
}
int
usb_vcp_rx_num
(
void
)
{
return
USBD_CDC_RxNum
();
}
char
usb_vcp_rx_get
(
void
)
{
return
USBD_CDC_RxGet
();
int
usb_vcp_recv_byte
(
uint8_t
*
c
)
{
return
USBD_CDC_Rx
(
c
,
1
,
0
);
}
void
usb_vcp_send_strn
(
const
char
*
str
,
int
len
)
{
#ifdef USE_DEVICE_MODE
if
(
dev_is_enabled
)
{
USBD_CDC_Tx
(
str
,
len
);
USBD_CDC_Tx
Always
((
const
uint8_t
*
)
str
,
len
);
}
#endif
}
...
...
@@ -120,9 +119,9 @@ void usb_vcp_send_strn_cooked(const char *str, int len) {
if
(
dev_is_enabled
)
{
for
(
const
char
*
top
=
str
+
len
;
str
<
top
;
str
++
)
{
if
(
*
str
==
'\n'
)
{
USBD_CDC_Tx
(
"
\r\n
"
,
2
);
USBD_CDC_Tx
Always
((
const
uint8_t
*
)
"
\r\n
"
,
2
);
}
else
{
USBD_CDC_Tx
(
str
,
1
);
USBD_CDC_Tx
Always
((
const
uint8_t
*
)
str
,
1
);
}
}
}
...
...
@@ -135,6 +134,145 @@ void usb_hid_send_report(uint8_t *buf) {
#endif
}
/******************************************************************************/
// Micro Python bindings for USB VCP
typedef
struct
_pyb_usb_vcp_obj_t
{
mp_obj_base_t
base
;
}
pyb_usb_vcp_obj_t
;
STATIC
const
pyb_usb_vcp_obj_t
pyb_usb_vcp_obj
=
{{
&
pyb_usb_vcp_type
}};
STATIC
void
pyb_usb_vcp_print
(
void
(
*
print
)(
void
*
env
,
const
char
*
fmt
,
...),
void
*
env
,
mp_obj_t
self_in
,
mp_print_kind_t
kind
)
{
print
(
env
,
"USB_VCP()"
);
}
STATIC
mp_obj_t
pyb_usb_vcp_make_new
(
mp_obj_t
type_in
,
uint
n_args
,
uint
n_kw
,
const
mp_obj_t
*
args
)
{
// check arguments
mp_arg_check_num
(
n_args
,
n_kw
,
0
,
0
,
false
);
// return the USB VCP object
return
(
mp_obj_t
)
&
pyb_usb_vcp_obj
;
}
/// \method any()
/// Return `True` if any characters waiting, else `False`.
STATIC
mp_obj_t
pyb_usb_vcp_any
(
mp_obj_t
self_in
)
{
if
(
USBD_CDC_RxNum
()
>
0
)
{
return
mp_const_true
;
}
else
{
return
mp_const_false
;
}
}
STATIC
MP_DEFINE_CONST_FUN_OBJ_1
(
pyb_usb_vcp_any_obj
,
pyb_usb_vcp_any
);
/// \method send(data, *, timeout=5000)
/// Send data over the USB VCP:
///
/// - `data` is the data to send (an integer to send, or a buffer object).
/// - `timeout` is the timeout in milliseconds to wait for the send.
///
/// Return value: number of bytes sent.
STATIC
const
mp_arg_t
pyb_usb_vcp_send_args
[]
=
{
{
MP_QSTR_data
,
MP_ARG_REQUIRED
|
MP_ARG_OBJ
,
{.
u_obj
=
MP_OBJ_NULL
}
},
{
MP_QSTR_timeout
,
MP_ARG_KW_ONLY
|
MP_ARG_INT
,
{.
u_int
=
5000
}
},
};
#define PYB_USB_VCP_SEND_NUM_ARGS MP_ARRAY_SIZE(pyb_usb_vcp_send_args)
STATIC
mp_obj_t
pyb_usb_vcp_send
(
uint
n_args
,
const
mp_obj_t
*
args
,
mp_map_t
*
kw_args
)
{
// parse args
mp_arg_val_t
vals
[
PYB_USB_VCP_SEND_NUM_ARGS
];
mp_arg_parse_all
(
n_args
-
1
,
args
+
1
,
kw_args
,
PYB_USB_VCP_SEND_NUM_ARGS
,
pyb_usb_vcp_send_args
,
vals
);
// get the buffer to send from
mp_buffer_info_t
bufinfo
;
uint8_t
data
[
1
];
pyb_buf_get_for_send
(
vals
[
0
].
u_obj
,
&
bufinfo
,
data
);
// send the data
int
ret
=
USBD_CDC_Tx
(
bufinfo
.
buf
,
bufinfo
.
len
,
vals
[
1
].
u_int
);
return
mp_obj_new_int
(
ret
);
}
STATIC
MP_DEFINE_CONST_FUN_OBJ_KW
(
pyb_usb_vcp_send_obj
,
1
,
pyb_usb_vcp_send
);
/// \method recv(data, *, timeout=5000)
///
/// Receive data on the bus:
///
/// - `data` can be an integer, which is the number of bytes to receive,
/// or a mutable buffer, which will be filled with received bytes.
/// - `timeout` is the timeout in milliseconds to wait for the receive.
///
/// Return value: if `data` is an integer then a new buffer of the bytes received,
/// otherwise the number of bytes read into `data` is returned.
STATIC
mp_obj_t
pyb_usb_vcp_recv
(
uint
n_args
,
const
mp_obj_t
*
args
,
mp_map_t
*
kw_args
)
{
// parse args
mp_arg_val_t
vals
[
PYB_USB_VCP_SEND_NUM_ARGS
];
mp_arg_parse_all
(
n_args
-
1
,
args
+
1
,
kw_args
,
PYB_USB_VCP_SEND_NUM_ARGS
,
pyb_usb_vcp_send_args
,
vals
);
// get the buffer to receive into
mp_buffer_info_t
bufinfo
;
mp_obj_t
o_ret
=
pyb_buf_get_for_recv
(
vals
[
0
].
u_obj
,
&
bufinfo
);
// receive the data
int
ret
=
USBD_CDC_Rx
(
bufinfo
.
buf
,
bufinfo
.
len
,
vals
[
1
].
u_int
);
// return the received data
if
(
o_ret
==
MP_OBJ_NULL
)
{
return
mp_obj_new_int
(
ret
);
// number of bytes read into given buffer
}
else
{
return
mp_obj_str_builder_end_with_len
(
o_ret
,
ret
);
// create a new buffer
}
}
STATIC
MP_DEFINE_CONST_FUN_OBJ_KW
(
pyb_usb_vcp_recv_obj
,
1
,
pyb_usb_vcp_recv
);
STATIC
mp_uint_t
pyb_usb_vcp_read
(
mp_obj_t
self_in
,
void
*
buf
,
mp_uint_t
size
,
int
*
errcode
)
{
int
ret
=
USBD_CDC_Rx
((
byte
*
)
buf
,
size
,
-
1
);
return
ret
;
}
STATIC
mp_uint_t
pyb_usb_vcp_write
(
mp_obj_t
self_in
,
const
void
*
buf
,
mp_uint_t
size
,
int
*
errcode
)
{
int
ret
=
USBD_CDC_Tx
((
const
byte
*
)
buf
,
size
,
-
1
);
return
ret
;
}
mp_obj_t
pyb_usb_vcp___exit__
(
uint
n_args
,
const
mp_obj_t
*
args
)
{
return
mp_const_none
;
}
STATIC
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN
(
pyb_usb_vcp___exit___obj
,
4
,
4
,
pyb_usb_vcp___exit__
);
STATIC
const
mp_map_elem_t
pyb_usb_vcp_locals_dict_table
[]
=
{
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_send
),
(
mp_obj_t
)
&
pyb_usb_vcp_send_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_recv
),
(
mp_obj_t
)
&
pyb_usb_vcp_recv_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_read
),
(
mp_obj_t
)
&
mp_stream_read_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_readall
),
(
mp_obj_t
)
&
mp_stream_readall_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_readline
),
(
mp_obj_t
)
&
mp_stream_unbuffered_readline_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_write
),
(
mp_obj_t
)
&
mp_stream_write_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_close
),
(
mp_obj_t
)
&
mp_identity_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR___del__
),
(
mp_obj_t
)
&
mp_identity_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR___enter__
),
(
mp_obj_t
)
&
mp_identity_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR___exit__
),
(
mp_obj_t
)
&
pyb_usb_vcp___exit___obj
},
};
STATIC
MP_DEFINE_CONST_DICT
(
pyb_usb_vcp_locals_dict
,
pyb_usb_vcp_locals_dict_table
);
STATIC
const
mp_stream_p_t
pyb_usb_vcp_stream_p
=
{
.
read
=
pyb_usb_vcp_read
,
.
write
=
pyb_usb_vcp_write
,
};
const
mp_obj_type_t
pyb_usb_vcp_type
=
{
{
&
mp_type_type
},
.
name
=
MP_QSTR_USB_VCP
,
.
print
=
pyb_usb_vcp_print
,
.
make_new
=
pyb_usb_vcp_make_new
,
.
getiter
=
mp_identity
,
.
iternext
=
mp_stream_unbuffered_iter
,
.
stream_p
=
&
pyb_usb_vcp_stream_p
,
.
locals_dict
=
(
mp_obj_t
)
&
pyb_usb_vcp_locals_dict
,
};
/******************************************************************************/
// code for experimental USB OTG support
...
...
stmhal/usb.h
View file @
8cc2018d
...
...
@@ -41,13 +41,14 @@ typedef enum {
USB_STORAGE_MEDIUM_SDCARD
,
}
usb_storage_medium_t
;
const
mp_obj_type_t
pyb_usb_vcp_type
;
void
pyb_usb_dev_init
(
usb_device_mode_t
mode
,
usb_storage_medium_t
medium
);
void
pyb_usb_dev_stop
(
void
);
bool
usb_vcp_is_enabled
(
void
);
bool
usb_vcp_is_connected
(
void
);
void
usb_vcp_set_interrupt_char
(
int
c
);
int
usb_vcp_rx_num
(
void
);
char
usb_vcp_rx_get
(
void
);
int
usb_vcp_recv_byte
(
uint8_t
*
c
);
void
usb_vcp_send_strn
(
const
char
*
str
,
int
len
);
void
usb_vcp_send_strn_cooked
(
const
char
*
str
,
int
len
);
void
usb_hid_send_report
(
uint8_t
*
buf
);
// 4 bytes for mouse: ?, x, y, ?
...
...
stmhal/usbd_cdc_interface.c
View file @
8cc2018d
...
...
@@ -33,11 +33,18 @@
*/
/* Includes ------------------------------------------------------------------*/
#include
<stdbool.h>
#include
"stm32f4xx_hal.h"
#include
"usbd_cdc_msc_hid.h"
#include
"usbd_cdc_interface.h"
#include
"pendsv.h"
#include
"mpconfig.h"
#include
"misc.h"
#include
"qstr.h"
#include
"obj.h"
#include
"usb.h"
// CDC control commands
...
...
@@ -59,7 +66,7 @@
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
static
uint8_t
dev_is_connected
=
0
;
// indicates if we are connected
static
__IO
uint8_t
dev_is_connected
=
0
;
// indicates if we are connected
static
uint8_t
UserRxBuffer
[
APP_RX_DATA_SIZE
];
// received data from USB OUT endpoint is stored in this buffer
static
uint16_t
UserRxBufCur
=
0
;
// points to next available character in UserRxBuffer
...
...
@@ -399,7 +406,34 @@ void USBD_CDC_SetInterrupt(int chr, void *data) {
user_interrupt_data
=
data
;
}
void
USBD_CDC_Tx
(
const
char
*
str
,
uint32_t
len
)
{
// timout in milliseconds.
// Returns number of bytes written to the device.
int
USBD_CDC_Tx
(
const
uint8_t
*
buf
,
uint32_t
len
,
uint32_t
timeout
)
{
for
(
uint32_t
i
=
0
;
i
<
len
;
i
++
)
{
// Wait until the device is connected and the buffer has space, with a given timeout
uint32_t
start
=
HAL_GetTick
();
while
(
!
dev_is_connected
||
((
UserTxBufPtrIn
+
1
)
&
(
APP_TX_DATA_SIZE
-
1
))
==
UserTxBufPtrOut
)
{
// Wraparound of tick is taken care of by 2's complement arithmetic.
if
(
HAL_GetTick
()
-
start
>=
timeout
)
{
// timeout
return
i
;
}
__WFI
();
// enter sleep mode, waiting for interrupt
}
// Write data to device buffer
UserTxBuffer
[
UserTxBufPtrIn
]
=
buf
[
i
];
UserTxBufPtrIn
=
(
UserTxBufPtrIn
+
1
)
&
(
APP_TX_DATA_SIZE
-
1
);
}
// Success, return number of bytes read
return
len
;
}
// Always write all of the data to the device tx buffer, even if the
// device is not connected, or if the buffer is full. Has a small timeout
// to wait for the buffer to be drained, in the case the device is connected.
void
USBD_CDC_TxAlways
(
const
uint8_t
*
buf
,
uint32_t
len
)
{
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
// If the CDC device is not connected to the host then we don't have anyone to receive our data.
// The device may become connected in the future, so we should at least try to fill the buffer
...
...
@@ -433,23 +467,36 @@ void USBD_CDC_Tx(const char *str, uint32_t len) {
*/
}
UserTxBuffer
[
UserTxBufPtrIn
]
=
str
[
i
];
UserTxBuffer
[
UserTxBufPtrIn
]
=
buf
[
i
];
UserTxBufPtrIn
=
(
UserTxBufPtrIn
+
1
)
&
(
APP_TX_DATA_SIZE
-
1
);
}
}
// Returns number of bytes in the rx buffer.
int
USBD_CDC_RxNum
(
void
)
{
return
UserRxBufLen
-
UserRxBufCur
;
}
int
USBD_CDC_RxGet
(
void
)
{
// wait for buffer to have at least 1 character in it
while
(
USBD_CDC_RxNum
()
==
0
)
{
__WFI
();
}
// timout in milliseconds.
// Returns number of bytes read from the device.
int
USBD_CDC_Rx
(
uint8_t
*
buf
,
uint32_t
len
,
uint32_t
timeout
)
{
// loop to read bytes
for
(
uint32_t
i
=
0
;
i
<
len
;
i
++
)
{
// Wait until we have at least 1 byte to read
uint32_t
start
=
HAL_GetTick
();
while
(
!
dev_is_connected
||
UserRxBufLen
==
UserRxBufCur
)
{
// Wraparound of tick is taken care of by 2's complement arithmetic.
if
(
HAL_GetTick
()
-
start
>=
timeout
)
{
// timeout
return
i
;
}
__WFI
();
// enter sleep mode, waiting for interrupt
}
// get next character
int
c
=
UserRxBuffer
[
UserRxBufCur
++
];
// Copy byte from device to user buffer
buf
[
i
]
=
UserRxBuffer
[
UserRxBufCur
++
];
}
return
c
;
// Success, return number of bytes read
return
len
;
}
Prev
1
2
Next
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