Skip to content

Commit 891bd61

Browse files
committed
Merge remote-tracking branch 'upstream/master' into nrf5_no_sdk
2 parents bf79699 + 4a4490f commit 891bd61

86 files changed

Lines changed: 1233 additions & 719 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

esp8266/main.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ STATIC void mp_reset(void) {
5050
mp_init();
5151
mp_obj_list_init(mp_sys_path, 0);
5252
mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR_)); // current dir (or base dir of the script)
53-
mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR__slash_flash_slash_lib));
54-
mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR__slash_flash));
53+
mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR__slash_lib));
54+
mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR__slash_));
5555
mp_obj_list_init(mp_sys_argv, 0);
5656
MP_STATE_PORT(term_obj) = MP_OBJ_NULL;
5757
MP_STATE_PORT(dupterm_arr_obj) = MP_OBJ_NULL;

esp8266/modules/_boot.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@
55

66
try:
77
if bdev:
8-
vfs = uos.VfsFat(bdev)
9-
uos.mount(vfs, '/flash')
10-
uos.chdir('/flash')
8+
uos.mount(bdev, '/')
119
except OSError:
1210
import inisetup
1311
vfs = inisetup.setup()

esp8266/qstrdefsport.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,5 @@
2727
// qstrs specific to this port, only needed if they aren't auto-generated
2828

2929
// Entries for sys.path
30-
Q(/flash)
31-
Q(/flash/lib)
30+
Q(/)
31+
Q(/lib)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from machine import Signal
2+
3+
# 96Boards Carbon board
4+
# USR1 - User controlled led, connected to PD2
5+
# USR2 - User controlled led, connected to PA15
6+
# BT - Bluetooth indicator, connected to PB5.
7+
# Note - 96b_carbon uses (at the time of writing) non-standard
8+
# for Zephyr port device naming convention.
9+
LED = Signal(("GPIOA", 15), Pin.OUT)

extmod/crypto-algorithms/sha256.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
/*************************** HEADER FILES ***************************/
1616
#include <stdlib.h>
17-
#include <memory.h>
1817
#include "sha256.h"
1918

2019
/****************************** MACROS ******************************/

extmod/modlwip.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1143,8 +1143,11 @@ STATIC mp_uint_t lwip_socket_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_
11431143
ret |= MP_STREAM_POLL_WR;
11441144
}
11451145

1146-
if (flags & MP_STREAM_POLL_HUP && socket->state == STATE_PEER_CLOSED) {
1147-
ret |= MP_STREAM_POLL_HUP;
1146+
if (socket->state == STATE_PEER_CLOSED) {
1147+
// Peer-closed socket is both readable and writable: read will
1148+
// return EOF, write - error. Without this poll will hang on a
1149+
// socket which was closed by peer.
1150+
ret |= flags & (MP_STREAM_POLL_RD | MP_STREAM_POLL_WR);
11481151
}
11491152

11501153
} else {
@@ -1263,7 +1266,12 @@ STATIC void lwip_getaddrinfo_cb(const char *name, ip_addr_t *ipaddr, void *arg)
12631266
}
12641267

12651268
// lwip.getaddrinfo
1266-
STATIC mp_obj_t lwip_getaddrinfo(mp_obj_t host_in, mp_obj_t port_in) {
1269+
STATIC mp_obj_t lwip_getaddrinfo(size_t n_args, const mp_obj_t *args) {
1270+
if (n_args > 2) {
1271+
mp_warning("getaddrinfo constraints not supported");
1272+
}
1273+
1274+
mp_obj_t host_in = args[0], port_in = args[1];
12671275
const char *host = mp_obj_str_get_str(host_in);
12681276
mp_int_t port = mp_obj_get_int(port_in);
12691277

@@ -1299,7 +1307,7 @@ STATIC mp_obj_t lwip_getaddrinfo(mp_obj_t host_in, mp_obj_t port_in) {
12991307
tuple->items[4] = netutils_format_inet_addr((uint8_t*)&state.ipaddr, port, NETUTILS_BIG);
13001308
return mp_obj_new_list(1, (mp_obj_t*)&tuple);
13011309
}
1302-
STATIC MP_DEFINE_CONST_FUN_OBJ_2(lwip_getaddrinfo_obj, lwip_getaddrinfo);
1310+
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(lwip_getaddrinfo_obj, 2, 6, lwip_getaddrinfo);
13031311

13041312
// Debug functions
13051313

extmod/moduselect.c

Lines changed: 103 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,11 @@ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_select_select_obj, 3, 4, select_select);
182182
typedef struct _mp_obj_poll_t {
183183
mp_obj_base_t base;
184184
mp_map_t poll_map;
185+
short iter_cnt;
186+
short iter_idx;
187+
int flags;
188+
// callee-owned tuple
189+
mp_obj_t ret_tuple;
185190
} mp_obj_poll_t;
186191

187192
/// \method register(obj[, eventmask])
@@ -219,9 +224,7 @@ STATIC mp_obj_t poll_modify(mp_obj_t self_in, mp_obj_t obj_in, mp_obj_t eventmas
219224
}
220225
MP_DEFINE_CONST_FUN_OBJ_3(poll_modify_obj, poll_modify);
221226

222-
/// \method poll([timeout])
223-
/// Timeout is in milliseconds.
224-
STATIC mp_obj_t poll_poll(uint n_args, const mp_obj_t *args) {
227+
STATIC mp_uint_t poll_poll_internal(uint n_args, const mp_obj_t *args) {
225228
mp_obj_poll_t *self = args[0];
226229

227230
// work out timeout (its given already in ms)
@@ -239,67 +242,130 @@ STATIC mp_obj_t poll_poll(uint n_args, const mp_obj_t *args) {
239242
}
240243
}
241244

245+
self->flags = flags;
246+
242247
mp_uint_t start_tick = mp_hal_ticks_ms();
248+
mp_uint_t n_ready;
243249
for (;;) {
244250
// poll the objects
245-
mp_uint_t n_ready = poll_map_poll(&self->poll_map, NULL);
246-
251+
n_ready = poll_map_poll(&self->poll_map, NULL);
247252
if (n_ready > 0 || (timeout != -1 && mp_hal_ticks_ms() - start_tick >= timeout)) {
248-
// one or more objects are ready, or we had a timeout
249-
mp_obj_list_t *ret_list = mp_obj_new_list(n_ready, NULL);
250-
n_ready = 0;
251-
for (mp_uint_t i = 0; i < self->poll_map.alloc; ++i) {
252-
if (!MP_MAP_SLOT_IS_FILLED(&self->poll_map, i)) {
253-
continue;
254-
}
255-
poll_obj_t *poll_obj = (poll_obj_t*)self->poll_map.table[i].value;
256-
if (poll_obj->flags_ret != 0) {
257-
mp_obj_t tuple[2] = {poll_obj->obj, MP_OBJ_NEW_SMALL_INT(poll_obj->flags_ret)};
258-
ret_list->items[n_ready++] = mp_obj_new_tuple(2, tuple);
259-
if (flags & FLAG_ONESHOT) {
260-
// Don't poll next time, until new event flags will be set explicitly
261-
poll_obj->flags = 0;
262-
}
263-
}
264-
}
265-
return ret_list;
253+
break;
266254
}
267255
MICROPY_EVENT_POLL_HOOK
268256
}
257+
258+
return n_ready;
259+
}
260+
261+
STATIC mp_obj_t poll_poll(uint n_args, const mp_obj_t *args) {
262+
mp_obj_poll_t *self = args[0];
263+
mp_uint_t n_ready = poll_poll_internal(n_args, args);
264+
265+
// one or more objects are ready, or we had a timeout
266+
mp_obj_list_t *ret_list = mp_obj_new_list(n_ready, NULL);
267+
n_ready = 0;
268+
for (mp_uint_t i = 0; i < self->poll_map.alloc; ++i) {
269+
if (!MP_MAP_SLOT_IS_FILLED(&self->poll_map, i)) {
270+
continue;
271+
}
272+
poll_obj_t *poll_obj = (poll_obj_t*)self->poll_map.table[i].value;
273+
if (poll_obj->flags_ret != 0) {
274+
mp_obj_t tuple[2] = {poll_obj->obj, MP_OBJ_NEW_SMALL_INT(poll_obj->flags_ret)};
275+
ret_list->items[n_ready++] = mp_obj_new_tuple(2, tuple);
276+
if (self->flags & FLAG_ONESHOT) {
277+
// Don't poll next time, until new event flags will be set explicitly
278+
poll_obj->flags = 0;
279+
}
280+
}
281+
}
282+
return ret_list;
269283
}
270284
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(poll_poll_obj, 1, 3, poll_poll);
271285

272-
STATIC const mp_map_elem_t poll_locals_dict_table[] = {
273-
{ MP_OBJ_NEW_QSTR(MP_QSTR_register), (mp_obj_t)&poll_register_obj },
274-
{ MP_OBJ_NEW_QSTR(MP_QSTR_unregister), (mp_obj_t)&poll_unregister_obj },
275-
{ MP_OBJ_NEW_QSTR(MP_QSTR_modify), (mp_obj_t)&poll_modify_obj },
276-
{ MP_OBJ_NEW_QSTR(MP_QSTR_poll), (mp_obj_t)&poll_poll_obj },
286+
STATIC mp_obj_t poll_ipoll(size_t n_args, const mp_obj_t *args) {
287+
mp_obj_poll_t *self = MP_OBJ_TO_PTR(args[0]);
288+
289+
if (self->ret_tuple == MP_OBJ_NULL) {
290+
self->ret_tuple = mp_obj_new_tuple(2, NULL);
291+
}
292+
293+
int n_ready = poll_poll_internal(n_args, args);
294+
self->iter_cnt = n_ready;
295+
self->iter_idx = 0;
296+
297+
return args[0];
298+
}
299+
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(poll_ipoll_obj, 1, 3, poll_ipoll);
300+
301+
STATIC mp_obj_t poll_iternext(mp_obj_t self_in) {
302+
mp_obj_poll_t *self = MP_OBJ_TO_PTR(self_in);
303+
304+
if (self->iter_cnt == 0) {
305+
return MP_OBJ_STOP_ITERATION;
306+
}
307+
308+
self->iter_cnt--;
309+
310+
for (mp_uint_t i = self->iter_idx; i < self->poll_map.alloc; ++i) {
311+
self->iter_idx++;
312+
if (!MP_MAP_SLOT_IS_FILLED(&self->poll_map, i)) {
313+
continue;
314+
}
315+
poll_obj_t *poll_obj = (poll_obj_t*)self->poll_map.table[i].value;
316+
if (poll_obj->flags_ret != 0) {
317+
mp_obj_tuple_t *t = MP_OBJ_TO_PTR(self->ret_tuple);
318+
t->items[0] = poll_obj->obj;
319+
t->items[1] = MP_OBJ_NEW_SMALL_INT(poll_obj->flags_ret);
320+
if (self->flags & FLAG_ONESHOT) {
321+
// Don't poll next time, until new event flags will be set explicitly
322+
poll_obj->flags = 0;
323+
}
324+
return MP_OBJ_FROM_PTR(t);
325+
}
326+
}
327+
328+
assert(!"inconsistent number of poll active entries");
329+
self->iter_cnt = 0;
330+
return MP_OBJ_STOP_ITERATION;
331+
}
332+
333+
STATIC const mp_rom_map_elem_t poll_locals_dict_table[] = {
334+
{ MP_ROM_QSTR(MP_QSTR_register), MP_ROM_PTR(&poll_register_obj) },
335+
{ MP_ROM_QSTR(MP_QSTR_unregister), MP_ROM_PTR(&poll_unregister_obj) },
336+
{ MP_ROM_QSTR(MP_QSTR_modify), MP_ROM_PTR(&poll_modify_obj) },
337+
{ MP_ROM_QSTR(MP_QSTR_poll), MP_ROM_PTR(&poll_poll_obj) },
338+
{ MP_ROM_QSTR(MP_QSTR_ipoll), MP_ROM_PTR(&poll_ipoll_obj) },
277339
};
278340
STATIC MP_DEFINE_CONST_DICT(poll_locals_dict, poll_locals_dict_table);
279341

280342
STATIC const mp_obj_type_t mp_type_poll = {
281343
{ &mp_type_type },
282344
.name = MP_QSTR_poll,
283-
.locals_dict = (mp_obj_t)&poll_locals_dict,
345+
.getiter = mp_identity_getiter,
346+
.iternext = poll_iternext,
347+
.locals_dict = (void*)&poll_locals_dict,
284348
};
285349

286350
/// \function poll()
287351
STATIC mp_obj_t select_poll(void) {
288352
mp_obj_poll_t *poll = m_new_obj(mp_obj_poll_t);
289353
poll->base.type = &mp_type_poll;
290354
mp_map_init(&poll->poll_map, 0);
355+
poll->iter_cnt = 0;
356+
poll->ret_tuple = MP_OBJ_NULL;
291357
return poll;
292358
}
293359
MP_DEFINE_CONST_FUN_OBJ_0(mp_select_poll_obj, select_poll);
294360

295-
STATIC const mp_map_elem_t mp_module_select_globals_table[] = {
296-
{ MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_uselect) },
297-
{ MP_OBJ_NEW_QSTR(MP_QSTR_select), (mp_obj_t)&mp_select_select_obj },
298-
{ MP_OBJ_NEW_QSTR(MP_QSTR_poll), (mp_obj_t)&mp_select_poll_obj },
299-
{ MP_OBJ_NEW_QSTR(MP_QSTR_POLLIN), MP_OBJ_NEW_SMALL_INT(MP_STREAM_POLL_RD) },
300-
{ MP_OBJ_NEW_QSTR(MP_QSTR_POLLOUT), MP_OBJ_NEW_SMALL_INT(MP_STREAM_POLL_WR) },
301-
{ MP_OBJ_NEW_QSTR(MP_QSTR_POLLERR), MP_OBJ_NEW_SMALL_INT(MP_STREAM_POLL_ERR) },
302-
{ MP_OBJ_NEW_QSTR(MP_QSTR_POLLHUP), MP_OBJ_NEW_SMALL_INT(MP_STREAM_POLL_HUP) },
361+
STATIC const mp_rom_map_elem_t mp_module_select_globals_table[] = {
362+
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_uselect) },
363+
{ MP_ROM_QSTR(MP_QSTR_select), MP_ROM_PTR(&mp_select_select_obj) },
364+
{ MP_ROM_QSTR(MP_QSTR_poll), MP_ROM_PTR(&mp_select_poll_obj) },
365+
{ MP_ROM_QSTR(MP_QSTR_POLLIN), MP_OBJ_NEW_SMALL_INT(MP_STREAM_POLL_RD) },
366+
{ MP_ROM_QSTR(MP_QSTR_POLLOUT), MP_OBJ_NEW_SMALL_INT(MP_STREAM_POLL_WR) },
367+
{ MP_ROM_QSTR(MP_QSTR_POLLERR), MP_OBJ_NEW_SMALL_INT(MP_STREAM_POLL_ERR) },
368+
{ MP_ROM_QSTR(MP_QSTR_POLLHUP), MP_OBJ_NEW_SMALL_INT(MP_STREAM_POLL_HUP) },
303369
};
304370

305371
STATIC MP_DEFINE_CONST_DICT(mp_module_select_globals, mp_module_select_globals_table);

extmod/vfs.c

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include <stdint.h>
2828
#include <string.h>
2929

30+
#include "py/runtime0.h"
3031
#include "py/runtime.h"
3132
#include "py/objstr.h"
3233
#include "py/mperrno.h"
@@ -50,8 +51,16 @@ mp_vfs_mount_t *mp_vfs_lookup_path(const char *path, const char **path_out) {
5051
++path;
5152
is_abs = 1;
5253
}
54+
if (*path == '\0') {
55+
// path is "" or "/" so return virtual root
56+
return MP_VFS_ROOT;
57+
}
5358
for (mp_vfs_mount_t *vfs = MP_STATE_VM(vfs_mount_table); vfs != NULL; vfs = vfs->next) {
5459
size_t len = vfs->len - 1;
60+
if (len == 0) {
61+
*path_out = path - is_abs;
62+
return vfs;
63+
}
5564
if (strncmp(path, vfs->str + 1, len) == 0) {
5665
if (path[len] == '/') {
5766
*path_out = path + len;
@@ -62,10 +71,9 @@ mp_vfs_mount_t *mp_vfs_lookup_path(const char *path, const char **path_out) {
6271
}
6372
}
6473
}
65-
if (*path == '\0') {
66-
// path was "" or "/" so return virtual root
67-
return MP_VFS_ROOT;
68-
}
74+
75+
// if we get here then there's nothing mounted on /
76+
6977
if (is_abs) {
7078
// path began with / and was not found
7179
return MP_VFS_NONE;
@@ -162,13 +170,24 @@ mp_obj_t mp_vfs_mount(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args
162170

163171
// check that the destination mount point is unused
164172
const char *path_out;
165-
if (mp_vfs_lookup_path(mp_obj_str_get_str(pos_args[1]), &path_out) != MP_VFS_NONE) {
166-
mp_raise_OSError(MP_EPERM);
173+
mp_vfs_mount_t *existing_mount = mp_vfs_lookup_path(mp_obj_str_get_str(pos_args[1]), &path_out);
174+
if (existing_mount != MP_VFS_NONE && existing_mount != MP_VFS_ROOT) {
175+
if (vfs->len != 1 && existing_mount->len == 1) {
176+
// if root dir is mounted, still allow to mount something within a subdir of root
177+
} else {
178+
// mount point in use
179+
mp_raise_OSError(MP_EPERM);
180+
}
167181
}
168182

169183
// insert the vfs into the mount table
170184
mp_vfs_mount_t **vfsp = &MP_STATE_VM(vfs_mount_table);
171185
while (*vfsp != NULL) {
186+
if ((*vfsp)->len == 1) {
187+
// make sure anything mounted at the root stays at the end of the list
188+
vfs->next = *vfsp;
189+
break;
190+
}
172191
vfsp = &(*vfsp)->next;
173192
}
174193
*vfsp = vfs;
@@ -228,10 +247,21 @@ MP_DEFINE_CONST_FUN_OBJ_KW(mp_vfs_open_obj, 0, mp_vfs_open);
228247
mp_obj_t mp_vfs_chdir(mp_obj_t path_in) {
229248
mp_obj_t path_out;
230249
mp_vfs_mount_t *vfs = lookup_path(path_in, &path_out);
231-
if (vfs != MP_VFS_ROOT) {
250+
MP_STATE_VM(vfs_cur) = vfs;
251+
if (vfs == MP_VFS_ROOT) {
252+
// If we change to the root dir and a VFS is mounted at the root then
253+
// we must change that VFS's current dir to the root dir so that any
254+
// subsequent relative paths begin at the root of that VFS.
255+
for (vfs = MP_STATE_VM(vfs_mount_table); vfs != NULL; vfs = vfs->next) {
256+
if (vfs->len == 1) {
257+
mp_obj_t root = mp_obj_new_str("/", 1, false);
258+
mp_vfs_proxy_call(vfs, MP_QSTR_chdir, 1, &root);
259+
break;
260+
}
261+
}
262+
} else {
232263
mp_vfs_proxy_call(vfs, MP_QSTR_chdir, 1, &path_out);
233264
}
234-
MP_STATE_VM(vfs_cur) = vfs;
235265
return mp_const_none;
236266
}
237267
MP_DEFINE_CONST_FUN_OBJ_1(mp_vfs_chdir_obj, mp_vfs_chdir);
@@ -241,6 +271,10 @@ mp_obj_t mp_vfs_getcwd(void) {
241271
return MP_OBJ_NEW_QSTR(MP_QSTR__slash_);
242272
}
243273
mp_obj_t cwd_o = mp_vfs_proxy_call(MP_STATE_VM(vfs_cur), MP_QSTR_getcwd, 0, NULL);
274+
if (MP_STATE_VM(vfs_cur)->len == 1) {
275+
// don't prepend "/" for vfs mounted at root
276+
return cwd_o;
277+
}
244278
const char *cwd = mp_obj_str_get_str(cwd_o);
245279
vstr_t vstr;
246280
vstr_init(&vstr, MP_STATE_VM(vfs_cur)->len + strlen(cwd) + 1);
@@ -267,8 +301,15 @@ mp_obj_t mp_vfs_listdir(size_t n_args, const mp_obj_t *args) {
267301
// list the root directory
268302
mp_obj_t dir_list = mp_obj_new_list(0, NULL);
269303
for (vfs = MP_STATE_VM(vfs_mount_table); vfs != NULL; vfs = vfs->next) {
270-
mp_obj_list_append(dir_list, mp_obj_new_str_of_type(mp_obj_get_type(path_in),
271-
(const byte*)vfs->str + 1, vfs->len - 1));
304+
if (vfs->len == 1) {
305+
// vfs is mounted at root dir, delegate to it
306+
mp_obj_t root = mp_obj_new_str("/", 1, false);
307+
mp_obj_t dir_list2 = mp_vfs_proxy_call(vfs, MP_QSTR_listdir, 1, &root);
308+
dir_list = mp_binary_op(MP_BINARY_OP_ADD, dir_list, dir_list2);
309+
} else {
310+
mp_obj_list_append(dir_list, mp_obj_new_str_of_type(mp_obj_get_type(path_in),
311+
(const byte*)vfs->str + 1, vfs->len - 1));
312+
}
272313
}
273314
return dir_list;
274315
}

0 commit comments

Comments
 (0)