@@ -53,33 +53,46 @@ STATIC mp_obj_t fatfs_mount_mkfs(mp_uint_t n_args, const mp_obj_t *pos_args, mp_
5353 if (device == mp_const_none ) {
5454 // umount
5555 FRESULT res = FR_NO_FILESYSTEM ;
56- if (MP_STATE_PORT (fs_user_mount ) != NULL ) {
57- res = f_mount (NULL , MP_STATE_PORT (fs_user_mount )-> str , 0 );
58- m_del_obj (fs_user_mount_t , MP_STATE_PORT (fs_user_mount ));
59- MP_STATE_PORT (fs_user_mount ) = NULL ;
56+ for (size_t i = 0 ; i < MP_ARRAY_SIZE (MP_STATE_PORT (fs_user_mount )); ++ i ) {
57+ fs_user_mount_t * vfs = MP_STATE_PORT (fs_user_mount )[i ];
58+ if (vfs != NULL && !memcmp (mnt_str , vfs -> str , mnt_len + 1 )) {
59+ res = f_mount (NULL , vfs -> str , 0 );
60+ if (vfs -> flags & FSUSER_FREE_OBJ ) {
61+ m_del_obj (fs_user_mount_t , vfs );
62+ }
63+ MP_STATE_PORT (fs_user_mount )[i ] = NULL ;
64+ break ;
65+ }
6066 }
6167 if (res != FR_OK ) {
6268 nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError , "can't umount" ));
6369 }
6470 } else {
6571 // mount
66- if (MP_STATE_PORT (fs_user_mount ) != NULL ) {
67- nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError , "device already mounted" ));
72+ size_t i = 0 ;
73+ for (; i < MP_ARRAY_SIZE (MP_STATE_PORT (fs_user_mount )); ++ i ) {
74+ if (MP_STATE_PORT (fs_user_mount )[i ] == NULL ) {
75+ break ;
76+ }
77+ }
78+ if (i == MP_ARRAY_SIZE (MP_STATE_PORT (fs_user_mount ))) {
79+ nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError , "too many devices mounted" ));
6880 }
6981
7082 // create new object
7183 fs_user_mount_t * vfs ;
72- MP_STATE_PORT (fs_user_mount ) = vfs = m_new_obj (fs_user_mount_t );
84+ MP_STATE_PORT (fs_user_mount )[ i ] = vfs = m_new_obj (fs_user_mount_t );
7385 vfs -> str = mnt_str ;
7486 vfs -> len = mnt_len ;
87+ vfs -> flags = FSUSER_FREE_OBJ ;
7588
7689 // load block protocol methods
7790 mp_load_method (device , MP_QSTR_readblocks , vfs -> readblocks );
7891 mp_load_method_maybe (device , MP_QSTR_writeblocks , vfs -> writeblocks );
7992 mp_load_method_maybe (device , MP_QSTR_ioctl , vfs -> u .ioctl );
8093 if (vfs -> u .ioctl [0 ] != MP_OBJ_NULL ) {
8194 // device supports new block protocol, so indicate it
82- vfs -> u . old . count [ 1 ] = MP_OBJ_SENTINEL ;
95+ vfs -> flags |= FSUSER_HAVE_IOCTL ;
8396 } else {
8497 // no ioctl method, so assume the device uses the old block protocol
8598 mp_load_method_maybe (device , MP_QSTR_sync , vfs -> u .old .sync );
@@ -114,7 +127,7 @@ STATIC mp_obj_t fatfs_mount_mkfs(mp_uint_t n_args, const mp_obj_t *pos_args, mp_
114127 if (res != FR_OK ) {
115128 goto mkfs_error ;
116129 }
117- MP_STATE_PORT (fs_user_mount ) = NULL ;
130+ MP_STATE_PORT (fs_user_mount )[ i ] = NULL ;
118131 }
119132 } else {
120133 nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError , "can't mount" ));
@@ -141,30 +154,39 @@ STATIC mp_obj_t fatfs_mount(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t
141154MP_DEFINE_CONST_FUN_OBJ_KW (fsuser_mount_obj , 2 , fatfs_mount );
142155
143156STATIC mp_obj_t fatfs_umount (mp_obj_t bdev_or_path_in ) {
144- if (MP_STATE_PORT (fs_user_mount ) == NULL ) {
145- goto einval ;
146- }
147-
157+ size_t i = 0 ;
148158 if (MP_OBJ_IS_STR (bdev_or_path_in )) {
149159 mp_uint_t mnt_len ;
150160 const char * mnt_str = mp_obj_str_get_data (bdev_or_path_in , & mnt_len );
151- if (memcmp (mnt_str , MP_STATE_PORT (fs_user_mount )-> str , mnt_len + 1 )) {
152- goto einval ;
161+ for (; i < MP_ARRAY_SIZE (MP_STATE_PORT (fs_user_mount )); ++ i ) {
162+ fs_user_mount_t * vfs = MP_STATE_PORT (fs_user_mount )[i ];
163+ if (!memcmp (mnt_str , vfs -> str , mnt_len + 1 )) {
164+ break ;
165+ }
153166 }
154- } else if (bdev_or_path_in != MP_STATE_PORT (fs_user_mount )-> readblocks [1 ]) {
155- goto einval ;
167+ } else {
168+ for (; i < MP_ARRAY_SIZE (MP_STATE_PORT (fs_user_mount )); ++ i ) {
169+ fs_user_mount_t * vfs = MP_STATE_PORT (fs_user_mount )[i ];
170+ if (bdev_or_path_in == vfs -> readblocks [1 ]) {
171+ break ;
172+ }
173+ }
174+ }
175+
176+ if (i == MP_ARRAY_SIZE (MP_STATE_PORT (fs_user_mount ))) {
177+ nlr_raise (mp_obj_new_exception_arg1 (& mp_type_OSError , MP_OBJ_NEW_SMALL_INT (EINVAL )));
156178 }
157179
158- FRESULT res = f_mount (NULL , MP_STATE_PORT (fs_user_mount )-> str , 0 );
159- m_del_obj (fs_user_mount_t , MP_STATE_PORT (fs_user_mount ));
160- MP_STATE_PORT (fs_user_mount ) = NULL ;
180+ fs_user_mount_t * vfs = MP_STATE_PORT (fs_user_mount )[i ];
181+ FRESULT res = f_mount (NULL , vfs -> str , 0 );
182+ if (vfs -> flags & FSUSER_FREE_OBJ ) {
183+ m_del_obj (fs_user_mount_t , vfs );
184+ }
185+ MP_STATE_PORT (fs_user_mount )[i ] = NULL ;
161186 if (res != FR_OK ) {
162187 nlr_raise (mp_obj_new_exception_msg (& mp_type_OSError , "can't umount" ));
163188 }
164189 return mp_const_none ;
165-
166- einval :
167- nlr_raise (mp_obj_new_exception_arg1 (& mp_type_OSError , MP_OBJ_NEW_SMALL_INT (EINVAL )));
168190}
169191MP_DEFINE_CONST_FUN_OBJ_1 (fsuser_umount_obj , fatfs_umount );
170192
0 commit comments