LCOV - code coverage report
Current view: top level - extmod - vfs_lfs.c (source / functions) Hit Total Coverage
Test: unix_coverage_v1.22.0-325-gd11ca092f.info Lines: 6 6 100.0 %
Date: 2024-04-17 08:48:33 Functions: 1 1 100.0 %
Branches: 2 2 100.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * This file is part of the MicroPython project, http://micropython.org/
       3                 :            :  *
       4                 :            :  * The MIT License (MIT)
       5                 :            :  *
       6                 :            :  * Copyright (c) 2019-2020 Damien P. George
       7                 :            :  *
       8                 :            :  * Permission is hereby granted, free of charge, to any person obtaining a copy
       9                 :            :  * of this software and associated documentation files (the "Software"), to deal
      10                 :            :  * in the Software without restriction, including without limitation the rights
      11                 :            :  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
      12                 :            :  * copies of the Software, and to permit persons to whom the Software is
      13                 :            :  * furnished to do so, subject to the following conditions:
      14                 :            :  *
      15                 :            :  * The above copyright notice and this permission notice shall be included in
      16                 :            :  * all copies or substantial portions of the Software.
      17                 :            :  *
      18                 :            :  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      19                 :            :  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      20                 :            :  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
      21                 :            :  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      22                 :            :  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
      23                 :            :  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
      24                 :            :  * THE SOFTWARE.
      25                 :            :  */
      26                 :            : 
      27                 :            : #include "py/runtime.h"
      28                 :            : #include "py/mphal.h"
      29                 :            : 
      30                 :            : #if MICROPY_VFS && (MICROPY_VFS_LFS1 || MICROPY_VFS_LFS2)
      31                 :            : 
      32                 :            : #include "shared/timeutils/timeutils.h"
      33                 :            : #include "extmod/vfs.h"
      34                 :            : #include "extmod/vfs_lfs.h"
      35                 :            : 
      36                 :            : enum { LFS_MAKE_ARG_bdev, LFS_MAKE_ARG_readsize, LFS_MAKE_ARG_progsize, LFS_MAKE_ARG_lookahead, LFS_MAKE_ARG_mtime };
      37                 :            : 
      38                 :            : static const mp_arg_t lfs_make_allowed_args[] = {
      39                 :            :     { MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
      40                 :            :     { MP_QSTR_readsize, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 32} },
      41                 :            :     { MP_QSTR_progsize, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 32} },
      42                 :            :     { MP_QSTR_lookahead, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 32} },
      43                 :            :     { MP_QSTR_mtime, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = true} },
      44                 :            : };
      45                 :            : 
      46                 :            : #if MICROPY_VFS_LFS1
      47                 :            : 
      48                 :            : #include "lib/littlefs/lfs1.h"
      49                 :            : 
      50                 :            : #define LFS_BUILD_VERSION (1)
      51                 :            : #define LFSx_MACRO(s) LFS1##s
      52                 :            : #define LFSx_API(s) lfs1_##s
      53                 :            : #define MP_VFS_LFSx(s) mp_vfs_lfs1_##s
      54                 :            : #define MP_OBJ_VFS_LFSx mp_obj_vfs_lfs1_t
      55                 :            : #define MP_OBJ_VFS_LFSx_FILE mp_obj_vfs_lfs1_file_t
      56                 :            : #define MP_TYPE_VFS_LFSx mp_type_vfs_lfs1
      57                 :            : #define MP_TYPE_VFS_LFSx_(s) mp_type_vfs_lfs1##s
      58                 :            : 
      59                 :            : typedef struct _mp_obj_vfs_lfs1_t {
      60                 :            :     mp_obj_base_t base;
      61                 :            :     mp_vfs_blockdev_t blockdev;
      62                 :            :     vstr_t cur_dir;
      63                 :            :     struct lfs1_config config;
      64                 :            :     lfs1_t lfs;
      65                 :            : } mp_obj_vfs_lfs1_t;
      66                 :            : 
      67                 :            : typedef struct _mp_obj_vfs_lfs1_file_t {
      68                 :            :     mp_obj_base_t base;
      69                 :            :     mp_obj_vfs_lfs1_t *vfs;
      70                 :            :     lfs1_file_t file;
      71                 :            :     struct lfs1_file_config cfg;
      72                 :            :     uint8_t file_buffer[0];
      73                 :            : } mp_obj_vfs_lfs1_file_t;
      74                 :            : 
      75                 :            : const char *mp_vfs_lfs1_make_path(mp_obj_vfs_lfs1_t *self, mp_obj_t path_in);
      76                 :            : mp_obj_t mp_vfs_lfs1_file_open(mp_obj_t self_in, mp_obj_t path_in, mp_obj_t mode_in);
      77                 :            : 
      78                 :            : #include "extmod/vfs_lfsx.c"
      79                 :            : #include "extmod/vfs_lfsx_file.c"
      80                 :            : 
      81                 :            : #undef LFS_BUILD_VERSION
      82                 :            : #undef LFSx_MACRO
      83                 :            : #undef LFSx_API
      84                 :            : #undef MP_VFS_LFSx
      85                 :            : #undef MP_OBJ_VFS_LFSx
      86                 :            : #undef MP_OBJ_VFS_LFSx_FILE
      87                 :            : #undef MP_TYPE_VFS_LFSx
      88                 :            : #undef MP_TYPE_VFS_LFSx_
      89                 :            : 
      90                 :            : #endif // MICROPY_VFS_LFS1
      91                 :            : 
      92                 :            : #if MICROPY_VFS_LFS2
      93                 :            : 
      94                 :            : #include "lib/littlefs/lfs2.h"
      95                 :            : 
      96                 :            : #define LFS_BUILD_VERSION (2)
      97                 :            : #define LFSx_MACRO(s) LFS2##s
      98                 :            : #define LFSx_API(s) lfs2_##s
      99                 :            : #define MP_VFS_LFSx(s) mp_vfs_lfs2_##s
     100                 :            : #define MP_OBJ_VFS_LFSx mp_obj_vfs_lfs2_t
     101                 :            : #define MP_OBJ_VFS_LFSx_FILE mp_obj_vfs_lfs2_file_t
     102                 :            : #define MP_TYPE_VFS_LFSx mp_type_vfs_lfs2
     103                 :            : #define MP_TYPE_VFS_LFSx_(s) mp_type_vfs_lfs2##s
     104                 :            : 
     105                 :            : // Attribute ids for lfs2_attr.type.
     106                 :            : #define LFS_ATTR_MTIME (1) // 64-bit little endian, nanoseconds since 1970/1/1
     107                 :            : 
     108                 :            : typedef struct _mp_obj_vfs_lfs2_t {
     109                 :            :     mp_obj_base_t base;
     110                 :            :     mp_vfs_blockdev_t blockdev;
     111                 :            :     bool enable_mtime;
     112                 :            :     vstr_t cur_dir;
     113                 :            :     struct lfs2_config config;
     114                 :            :     lfs2_t lfs;
     115                 :            : } mp_obj_vfs_lfs2_t;
     116                 :            : 
     117                 :            : typedef struct _mp_obj_vfs_lfs2_file_t {
     118                 :            :     mp_obj_base_t base;
     119                 :            :     mp_obj_vfs_lfs2_t *vfs;
     120                 :            :     uint8_t mtime[8];
     121                 :            :     lfs2_file_t file;
     122                 :            :     struct lfs2_file_config cfg;
     123                 :            :     struct lfs2_attr attrs[1];
     124                 :            :     uint8_t file_buffer[0];
     125                 :            : } mp_obj_vfs_lfs2_file_t;
     126                 :            : 
     127                 :            : const char *mp_vfs_lfs2_make_path(mp_obj_vfs_lfs2_t *self, mp_obj_t path_in);
     128                 :            : mp_obj_t mp_vfs_lfs2_file_open(mp_obj_t self_in, mp_obj_t path_in, mp_obj_t mode_in);
     129                 :            : 
     130                 :       1154 : static void lfs_get_mtime(uint8_t buf[8]) {
     131                 :            :     // On-disk storage of timestamps uses 1970 as the Epoch, so convert from host's Epoch.
     132                 :       1154 :     uint64_t ns = timeutils_nanoseconds_since_epoch_to_nanoseconds_since_1970(mp_hal_time_ns());
     133                 :            :     // Store "ns" to "buf" in little-endian format (essentially htole64).
     134         [ +  + ]:      10386 :     for (size_t i = 0; i < 8; ++i) {
     135                 :       9232 :         buf[i] = ns;
     136                 :       9232 :         ns >>= 8;
     137                 :            :     }
     138                 :       1154 : }
     139                 :            : 
     140                 :            : #include "extmod/vfs_lfsx.c"
     141                 :            : #include "extmod/vfs_lfsx_file.c"
     142                 :            : 
     143                 :            : #endif // MICROPY_VFS_LFS2
     144                 :            : 
     145                 :            : #endif // MICROPY_VFS && (MICROPY_VFS_LFS1 || MICROPY_VFS_LFS2)

Generated by: LCOV version 1.15-5-g462f71d