diff options
-rw-r--r-- | extmod/modos.c | 15 | ||||
-rw-r--r-- | ports/nrf/Makefile | 1 | ||||
-rw-r--r-- | ports/nrf/modules/os/modos.c | 169 | ||||
-rw-r--r-- | ports/nrf/mpconfigport.h | 17 |
4 files changed, 42 insertions, 160 deletions
diff --git a/extmod/modos.c b/extmod/modos.c index 6df49d7f84..da14fd81f8 100644 --- a/extmod/modos.c +++ b/extmod/modos.c @@ -48,6 +48,13 @@ #include "extmod/vfs_posix.h" #endif +#if MICROPY_MBFS +#if MICROPY_VFS +#error "MICROPY_MBFS requires MICROPY_VFS to be disabled" +#endif +#include "ports/nrf/modules/os/microbitfs.h" +#endif + #if MICROPY_PY_OS_UNAME #include "genhdr/mpversion.h" #endif @@ -187,6 +194,14 @@ STATIC const mp_rom_map_elem_t os_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_VfsPosix), MP_ROM_PTR(&mp_type_vfs_posix) }, #endif #endif + + #if MICROPY_MBFS + // For special micro:bit filesystem only. + { MP_ROM_QSTR(MP_QSTR_listdir), MP_ROM_PTR(&os_mbfs_listdir_obj) }, + { MP_ROM_QSTR(MP_QSTR_ilistdir), MP_ROM_PTR(&os_mbfs_ilistdir_obj) }, + { MP_ROM_QSTR(MP_QSTR_stat), MP_ROM_PTR(&os_mbfs_stat_obj) }, + { MP_ROM_QSTR(MP_QSTR_remove), MP_ROM_PTR(&os_mbfs_remove_obj) }, + #endif }; STATIC MP_DEFINE_CONST_DICT(os_module_globals, os_module_globals_table); diff --git a/ports/nrf/Makefile b/ports/nrf/Makefile index 0a57471849..45e44aed5a 100644 --- a/ports/nrf/Makefile +++ b/ports/nrf/Makefile @@ -324,7 +324,6 @@ DRIVERS_SRC_C += $(addprefix modules/,\ machine/timer.c \ machine/rtcounter.c \ machine/temp.c \ - os/modos.c \ os/microbitfs.c \ board/modboard.c \ board/led.c \ diff --git a/ports/nrf/modules/os/modos.c b/ports/nrf/modules/os/modos.c index 6ff7200a12..31bf1b2920 100644 --- a/ports/nrf/modules/os/modos.c +++ b/ports/nrf/modules/os/modos.c @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * Copyright (c) 2013, 2014 Damien P. George + * Copyright (c) 2013-2023 Damien P. George * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,84 +24,16 @@ * THE SOFTWARE. */ -#include <stdint.h> -#include <string.h> +// This file is never compiled standalone, it's included directly from +// extmod/modos.c via MICROPY_PY_OS_INCLUDEFILE. -#include "py/mpstate.h" #include "py/runtime.h" -#include "py/objtuple.h" -#include "py/objstr.h" -#include "lib/oofatfs/ff.h" -#include "lib/oofatfs/diskio.h" -#include "modules/os/microbitfs.h" #include "extmod/modmachine.h" -#include "extmod/vfs.h" -#include "extmod/vfs_fat.h" -#include "extmod/vfs_lfs.h" -#include "genhdr/mpversion.h" - -#if MICROPY_HW_ENABLE_RNG #include "drivers/rng.h" -#endif // MICROPY_HW_ENABLE_RNG - -/// \module os - basic "operating system" services -/// -/// The `os` module contains functions for filesystem access and `urandom`. -/// -/// The filesystem has `/` as the root directory, and the available physical -/// drives are accessible from here. They are currently: -/// -/// /flash -- the internal flash filesystem -/// /sd -- the SD card (if it exists) -/// -/// On boot up, the current directory is `/flash` if no SD card is inserted, -/// otherwise it is `/sd`. - -STATIC const qstr os_uname_info_fields[] = { - MP_QSTR_sysname, MP_QSTR_nodename, - MP_QSTR_release, MP_QSTR_version, MP_QSTR_machine -}; -STATIC const MP_DEFINE_STR_OBJ(os_uname_info_sysname_obj, "pyboard"); -STATIC const MP_DEFINE_STR_OBJ(os_uname_info_nodename_obj, "pyboard"); -STATIC const MP_DEFINE_STR_OBJ(os_uname_info_release_obj, MICROPY_VERSION_STRING); -STATIC const MP_DEFINE_STR_OBJ(os_uname_info_version_obj, MICROPY_GIT_TAG " on " MICROPY_BUILD_DATE); -STATIC const MP_DEFINE_STR_OBJ(os_uname_info_machine_obj, MICROPY_HW_BOARD_NAME " with " MICROPY_HW_MCU_NAME); -STATIC MP_DEFINE_ATTRTUPLE( - os_uname_info_obj, - os_uname_info_fields, - 5, - (mp_obj_t)&os_uname_info_sysname_obj, - (mp_obj_t)&os_uname_info_nodename_obj, - (mp_obj_t)&os_uname_info_release_obj, - (mp_obj_t)&os_uname_info_version_obj, - (mp_obj_t)&os_uname_info_machine_obj -); - -STATIC mp_obj_t os_uname(void) { - return (mp_obj_t)&os_uname_info_obj; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_0(os_uname_obj, os_uname); - -#if MICROPY_VFS -/// \function sync() -/// Sync all filesystems. -STATIC mp_obj_t os_sync(void) { - #if MICROPY_VFS_FAT - for (mp_vfs_mount_t *vfs = MP_STATE_VM(vfs_mount_table); vfs != NULL; vfs = vfs->next) { - // this assumes that vfs->obj is fs_user_mount_t with block device functions - disk_ioctl(MP_OBJ_TO_PTR(vfs->obj), CTRL_SYNC, NULL); - } - #endif - return mp_const_none; -} -MP_DEFINE_CONST_FUN_OBJ_0(mod_os_sync_obj, os_sync); -#endif -#if MICROPY_HW_ENABLE_RNG -/// \function urandom(n) -/// Return a bytes object with n random bytes, generated by the hardware -/// random number generator. -STATIC mp_obj_t os_urandom(mp_obj_t num) { +#if MICROPY_PY_OS_URANDOM +// Return a bytes object with n random bytes, generated by the hardware random number generator. +STATIC mp_obj_t mp_os_urandom(mp_obj_t num) { mp_int_t n = mp_obj_get_int(num); vstr_t vstr; vstr_init_len(&vstr, n); @@ -110,91 +42,14 @@ STATIC mp_obj_t os_urandom(mp_obj_t num) { } return mp_obj_new_bytes_from_vstr(&vstr); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(os_urandom_obj, os_urandom); +STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_os_urandom_obj, mp_os_urandom); #endif -#if MICROPY_PY_MACHINE_UART -// Get or set the UART object that the REPL is repeated on. +#if MICROPY_PY_OS_DUPTERM // TODO should accept any object with read/write methods. -STATIC mp_obj_t os_dupterm(mp_uint_t n_args, const mp_obj_t *args) { - if (n_args == 0) { - if (MP_STATE_VM(dupterm_objs[0]) == MP_OBJ_NULL) { - return mp_const_none; - } else { - return MP_STATE_VM(dupterm_objs[0]); - } - } else { - if (args[0] == mp_const_none) { - MP_STATE_VM(dupterm_objs[0]) = MP_OBJ_NULL; - } else if (mp_obj_get_type(args[0]) == &machine_uart_type) { - MP_STATE_VM(dupterm_objs[0]) = args[0]; - } else { - mp_raise_ValueError(MP_ERROR_TEXT("need a UART object")); - } - return mp_const_none; +void mp_os_dupterm_stream_detached_attached(mp_obj_t stream_detached, mp_obj_t stream_attached) { + if (!(stream_attached == mp_const_none || mp_obj_get_type(stream_attached) == &machine_uart_type)) { + mp_raise_ValueError(MP_ERROR_TEXT("need a UART object")); } } -MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_os_dupterm_obj, 0, 1, os_dupterm); -#endif // MICROPY_PY_MACHINE_UART - -STATIC const mp_rom_map_elem_t os_module_globals_table[] = { - { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_os) }, - - { MP_ROM_QSTR(MP_QSTR_uname), MP_ROM_PTR(&os_uname_obj) }, - -#if MICROPY_VFS - { MP_ROM_QSTR(MP_QSTR_chdir), MP_ROM_PTR(&mp_vfs_chdir_obj) }, - { MP_ROM_QSTR(MP_QSTR_getcwd), MP_ROM_PTR(&mp_vfs_getcwd_obj) }, - { MP_ROM_QSTR(MP_QSTR_ilistdir), MP_ROM_PTR(&mp_vfs_ilistdir_obj) }, - { MP_ROM_QSTR(MP_QSTR_listdir), MP_ROM_PTR(&mp_vfs_listdir_obj) }, - { MP_ROM_QSTR(MP_QSTR_mkdir), MP_ROM_PTR(&mp_vfs_mkdir_obj) }, - { MP_ROM_QSTR(MP_QSTR_remove), MP_ROM_PTR(&mp_vfs_remove_obj) }, - { MP_ROM_QSTR(MP_QSTR_rename), MP_ROM_PTR(&mp_vfs_rename_obj) }, - { MP_ROM_QSTR(MP_QSTR_rmdir), MP_ROM_PTR(&mp_vfs_rmdir_obj) }, - { MP_ROM_QSTR(MP_QSTR_stat), MP_ROM_PTR(&mp_vfs_stat_obj) }, - { MP_ROM_QSTR(MP_QSTR_statvfs), MP_ROM_PTR(&mp_vfs_statvfs_obj) }, - { MP_ROM_QSTR(MP_QSTR_unlink), MP_ROM_PTR(&mp_vfs_remove_obj) }, // unlink aliases to remove - - { MP_ROM_QSTR(MP_QSTR_sync), MP_ROM_PTR(&mod_os_sync_obj) }, - -#elif MICROPY_MBFS - { MP_ROM_QSTR(MP_QSTR_listdir), MP_ROM_PTR(&os_mbfs_listdir_obj) }, - { MP_ROM_QSTR(MP_QSTR_ilistdir), MP_ROM_PTR(&os_mbfs_ilistdir_obj) }, // uses ~136 bytes - { MP_ROM_QSTR(MP_QSTR_stat), MP_ROM_PTR(&os_mbfs_stat_obj) }, // uses ~228 bytes - { MP_ROM_QSTR(MP_QSTR_remove), MP_ROM_PTR(&os_mbfs_remove_obj) }, -#endif - - /// \constant sep - separation character used in paths - { MP_ROM_QSTR(MP_QSTR_sep), MP_ROM_QSTR(MP_QSTR__slash_) }, - -#if MICROPY_HW_ENABLE_RNG - { MP_ROM_QSTR(MP_QSTR_urandom), MP_ROM_PTR(&os_urandom_obj) }, -#endif - - // these are MicroPython extensions -#if MICROPY_PY_MACHINE_UART - { MP_ROM_QSTR(MP_QSTR_dupterm), MP_ROM_PTR(&mod_os_dupterm_obj) }, -#endif -#if MICROPY_VFS - { MP_ROM_QSTR(MP_QSTR_mount), MP_ROM_PTR(&mp_vfs_mount_obj) }, - { MP_ROM_QSTR(MP_QSTR_umount), MP_ROM_PTR(&mp_vfs_umount_obj) }, - #if MICROPY_VFS_FAT - { MP_ROM_QSTR(MP_QSTR_VfsFat), MP_ROM_PTR(&mp_fat_vfs_type) }, - #endif - #if MICROPY_VFS_LFS1 - { MP_ROM_QSTR(MP_QSTR_VfsLfs1), MP_ROM_PTR(&mp_type_vfs_lfs1) }, - #endif - #if MICROPY_VFS_LFS2 - { MP_ROM_QSTR(MP_QSTR_VfsLfs2), MP_ROM_PTR(&mp_type_vfs_lfs2) }, - #endif -#endif -}; - -STATIC MP_DEFINE_CONST_DICT(os_module_globals, os_module_globals_table); - -const mp_obj_module_t mp_module_os = { - .base = { &mp_type_module }, - .globals = (mp_obj_dict_t*)&os_module_globals, -}; - -MP_REGISTER_EXTENSIBLE_MODULE(MP_QSTR_os, mp_module_os); +#endif // MICROPY_PY_OS_DUPTERM diff --git a/ports/nrf/mpconfigport.h b/ports/nrf/mpconfigport.h index 85db263648..3ab1e0814f 100644 --- a/ports/nrf/mpconfigport.h +++ b/ports/nrf/mpconfigport.h @@ -76,6 +76,10 @@ #define MICROPY_PY_ARRAY_SLICE_ASSIGN (CORE_FEAT) #endif +#ifndef MICROPY_PY_SYS_PLATFORM +#define MICROPY_PY_SYS_PLATFORM "nrf" +#endif + #ifndef MICROPY_PY_SYS_STDFILES #define MICROPY_PY_SYS_STDFILES (CORE_FEAT) #endif @@ -92,6 +96,10 @@ #define MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE (CORE_FEAT) #endif +#ifndef MICROPY_HW_ENABLE_RNG +#define MICROPY_HW_ENABLE_RNG (0) +#endif + #ifndef MICROPY_EMIT_THUMB #define MICROPY_EMIT_THUMB (EXTRA_FEAT) #endif @@ -133,9 +141,14 @@ #define MICROPY_FATFS_MAX_SS (4096) #endif -// Use port specific os module rather than extmod variant. -#define MICROPY_PY_OS (0) +#define MICROPY_PY_OS (1) +#define MICROPY_PY_OS_INCLUDEFILE "ports/nrf/modules/os/modos.c" #define MICROPY_PY_OS_DUPTERM (1) +#define MICROPY_PY_OS_DUPTERM_STREAM_DETACHED_ATTACHED (1) +#define MICROPY_PY_OS_SEP (1) +#define MICROPY_PY_OS_SYNC (MICROPY_VFS) +#define MICROPY_PY_OS_UNAME (1) +#define MICROPY_PY_OS_URANDOM (MICROPY_HW_ENABLE_RNG) #define MICROPY_STREAMS_NON_BLOCK (1) #define MICROPY_CAN_OVERRIDE_BUILTINS (1) |