Skip to content
Snippets Groups Projects
Commit 32b420c3 authored by ave's avatar ave
Browse files

Implement os.statvfs

parent 0a48935d
No related branches found
No related tags found
No related merge requests found
...@@ -47,6 +47,7 @@ set(MICROPY_SOURCE_PORT ...@@ -47,6 +47,7 @@ set(MICROPY_SOURCE_PORT
${MICROPY_PORT_DIR}/gccollect.c ${MICROPY_PORT_DIR}/gccollect.c
${MICROPY_PORT_DIR}/mphalport.c ${MICROPY_PORT_DIR}/mphalport.c
${MICROPY_PORT_DIR}/fatfs_port.c ${MICROPY_PORT_DIR}/fatfs_port.c
${MICROPY_PORT_DIR}/flow3r_statvfs.c
${MICROPY_PORT_DIR}/help.c ${MICROPY_PORT_DIR}/help.c
${MICROPY_PORT_DIR}/modutime.c ${MICROPY_PORT_DIR}/modutime.c
${MICROPY_PORT_DIR}/machine_pin.c ${MICROPY_PORT_DIR}/machine_pin.c
...@@ -102,6 +103,7 @@ set(IDF_COMPONENTS ...@@ -102,6 +103,7 @@ set(IDF_COMPONENTS
esp_timer esp_timer
esp_netif esp_netif
esp_psram esp_psram
fatfs
freertos freertos
hal hal
heap heap
...@@ -115,6 +117,7 @@ set(IDF_COMPONENTS ...@@ -115,6 +117,7 @@ set(IDF_COMPONENTS
spi_flash spi_flash
ulp ulp
vfs vfs
wear_levelling
xtensa xtensa
) )
......
...@@ -47,6 +47,8 @@ ...@@ -47,6 +47,8 @@
#include <unistd.h> #include <unistd.h>
#include <dirent.h> #include <dirent.h>
void get_statvfs(char* drive, uint32_t *out);
typedef struct _mp_obj_vfs_posix_t { typedef struct _mp_obj_vfs_posix_t {
mp_obj_base_t base; mp_obj_base_t base;
vstr_t root; vstr_t root;
...@@ -325,6 +327,39 @@ STATIC mp_obj_t vfs_posix_stat(mp_obj_t self_in, mp_obj_t path_in) { ...@@ -325,6 +327,39 @@ STATIC mp_obj_t vfs_posix_stat(mp_obj_t self_in, mp_obj_t path_in) {
} }
STATIC MP_DEFINE_CONST_FUN_OBJ_2(vfs_posix_stat_obj, vfs_posix_stat); STATIC MP_DEFINE_CONST_FUN_OBJ_2(vfs_posix_stat_obj, vfs_posix_stat);
STATIC mp_obj_t vfs_posix_statvfs(mp_obj_t self_in, mp_obj_t path_in) {
mp_obj_vfs_posix_t *self = MP_OBJ_TO_PTR(self_in);
const char *path = vfs_posix_get_path_str(self, path_in);
char device_path[3];
if (strncmp(path, "/sd", 3) == 0) {
strcpy(device_path, "1:");
} else if (strncmp(path, "/flash", 6) == 0) {
strcpy(device_path, "0:");
} else {
mp_raise_OSError(2);
return mp_const_none;
}
uint32_t statvfs_array[10] = {0};
get_statvfs(device_path, statvfs_array);
// https://man7.org/linux/man-pages/man3/statvfs.3.htm
mp_obj_tuple_t *t = MP_OBJ_TO_PTR(mp_obj_new_tuple(10, NULL));
t->items[0] = MP_OBJ_NEW_SMALL_INT(0); // bsize
t->items[1] = MP_OBJ_NEW_SMALL_INT(statvfs_array[1]); // frsize
t->items[2] = MP_OBJ_NEW_SMALL_INT(0); // blocks
t->items[3] = MP_OBJ_NEW_SMALL_INT(statvfs_array[3]); // bfree
t->items[4] = MP_OBJ_NEW_SMALL_INT(statvfs_array[4]); // bavail
t->items[5] = MP_OBJ_NEW_SMALL_INT(0);
t->items[6] = MP_OBJ_NEW_SMALL_INT(0);
t->items[7] = MP_OBJ_NEW_SMALL_INT(0);
t->items[8] = MP_OBJ_NEW_SMALL_INT(0);
t->items[9] = MP_OBJ_NEW_SMALL_INT(255); // namemax
return MP_OBJ_FROM_PTR(t);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_2(vfs_posix_statvfs_obj, vfs_posix_statvfs);
STATIC const mp_rom_map_elem_t vfs_posix_locals_dict_table[] = { STATIC const mp_rom_map_elem_t vfs_posix_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_mount), MP_ROM_PTR(&vfs_posix_mount_obj) }, { MP_ROM_QSTR(MP_QSTR_mount), MP_ROM_PTR(&vfs_posix_mount_obj) },
{ MP_ROM_QSTR(MP_QSTR_umount), MP_ROM_PTR(&vfs_posix_umount_obj) }, { MP_ROM_QSTR(MP_QSTR_umount), MP_ROM_PTR(&vfs_posix_umount_obj) },
...@@ -338,6 +373,7 @@ STATIC const mp_rom_map_elem_t vfs_posix_locals_dict_table[] = { ...@@ -338,6 +373,7 @@ STATIC const mp_rom_map_elem_t vfs_posix_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_rename), MP_ROM_PTR(&vfs_posix_rename_obj) }, { MP_ROM_QSTR(MP_QSTR_rename), MP_ROM_PTR(&vfs_posix_rename_obj) },
{ MP_ROM_QSTR(MP_QSTR_rmdir), MP_ROM_PTR(&vfs_posix_rmdir_obj) }, { MP_ROM_QSTR(MP_QSTR_rmdir), MP_ROM_PTR(&vfs_posix_rmdir_obj) },
{ MP_ROM_QSTR(MP_QSTR_stat), MP_ROM_PTR(&vfs_posix_stat_obj) }, { MP_ROM_QSTR(MP_QSTR_stat), MP_ROM_PTR(&vfs_posix_stat_obj) },
{ MP_ROM_QSTR(MP_QSTR_statvfs), MP_ROM_PTR(&vfs_posix_statvfs_obj) },
}; };
STATIC MP_DEFINE_CONST_DICT(vfs_posix_locals_dict, vfs_posix_locals_dict_table); STATIC MP_DEFINE_CONST_DICT(vfs_posix_locals_dict, vfs_posix_locals_dict_table);
......
#include "esp_vfs.h"
#include "esp_vfs_fat.h"
void get_statvfs(char* drive, uint32_t *out) {
FATFS *fs;
uint32_t fre_clust;
if (f_getfree(drive, &fre_clust, &fs) != FR_OK) {
return;
}
uint32_t fre_sect = (fre_clust * fs->csize);
uint32_t tot_sect = (fs->n_fatent - 2) * fs->csize;
uint32_t sector_size = fs->ssize;
out[1] = fs->ssize; // frsize, mapped to sector size
out[3] = fre_sect; // bfree, mapped to free sectors
out[4] = tot_sect; // bavail, mapped to total sectors
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment