summaryrefslogtreecommitdiff
path: root/lib/fatfs/wl_fatfsgen.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/fatfs/wl_fatfsgen.py')
-rwxr-xr-xlib/fatfs/wl_fatfsgen.py33
1 files changed, 24 insertions, 9 deletions
diff --git a/lib/fatfs/wl_fatfsgen.py b/lib/fatfs/wl_fatfsgen.py
index 4a685434..13ef5168 100755
--- a/lib/fatfs/wl_fatfsgen.py
+++ b/lib/fatfs/wl_fatfsgen.py
@@ -1,11 +1,18 @@
#!/usr/bin/env python
-# SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
+# SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
+from typing import Optional
-from construct import Const, Int32ul, Struct
+from construct import Const
+from construct import Int32ul
+from construct import Struct
from fatfs_utils.exceptions import WLNotInitialized
-from fatfs_utils.utils import (FULL_BYTE, UINT32_MAX, FATDefaults, crc32, generate_4bytes_random,
- get_args_for_partition_generator)
+from fatfs_utils.utils import crc32
+from fatfs_utils.utils import FATDefaults
+from fatfs_utils.utils import FULL_BYTE
+from fatfs_utils.utils import generate_4bytes_random
+from fatfs_utils.utils import get_args_for_partition_generator
+from fatfs_utils.utils import UINT32_MAX
from fatfsgen import FATFS
@@ -53,6 +60,7 @@ class WLFATFS:
WL_STATE_HEADER_SIZE = 64
WL_STATE_COPY_COUNT = 2 # always 2 copies for power failure safety
WL_SECTOR_SIZE = 0x1000
+ WL_SAFE_MODE_DUMP_SECTORS = 2
WL_STATE_T_DATA = Struct(
'pos' / Int32ul,
@@ -97,7 +105,8 @@ class WLFATFS:
temp_buff_size: int = FATDefaults.TEMP_BUFFER_SIZE,
device_id: int = None,
root_entry_count: int = FATDefaults.ROOT_ENTRIES_COUNT,
- media_type: int = FATDefaults.MEDIA_TYPE) -> None:
+ media_type: int = FATDefaults.MEDIA_TYPE,
+ wl_mode: Optional[str] = None) -> None:
self._initialized = False
self._version = version
self._temp_buff_size = temp_buff_size
@@ -105,6 +114,7 @@ class WLFATFS:
self.partition_size = size
self.total_sectors = self.partition_size // FATDefaults.WL_SECTOR_SIZE
self.wl_state_size = WLFATFS.WL_STATE_HEADER_SIZE + WLFATFS.WL_STATE_RECORD_SIZE * self.total_sectors
+ self.wl_mode = wl_mode
# determine the number of required sectors (roundup to sector size)
self.wl_state_sectors = (self.wl_state_size + FATDefaults.WL_SECTOR_SIZE - 1) // FATDefaults.WL_SECTOR_SIZE
@@ -114,6 +124,9 @@ class WLFATFS:
wl_sectors = (WLFATFS.WL_DUMMY_SECTORS_COUNT + WLFATFS.WL_CFG_SECTORS_COUNT +
self.wl_state_sectors * WLFATFS.WL_STATE_COPY_COUNT)
+ if self.wl_mode is not None and self.wl_mode == 'safe':
+ wl_sectors += WLFATFS.WL_SAFE_MODE_DUMP_SECTORS
+
self.plain_fat_sectors = self.total_sectors - wl_sectors
self.plain_fatfs = FATFS(
explicit_fat_type=explicit_fat_type,
@@ -202,13 +215,15 @@ class WLFATFS:
if __name__ == '__main__':
desc = 'Create a FAT filesystem with support for wear levelling and populate it with directory content'
args = get_args_for_partition_generator(desc, wl=True)
- wl_fatfs = WLFATFS(sectors_per_cluster=args.sectors_per_cluster,
- size=args.partition_size,
+ wl_fatfs = WLFATFS(size=args.partition_size,
sector_size=args.sector_size,
- root_entry_count=args.root_entry_count,
+ fat_tables_cnt=args.fat_count,
+ sectors_per_cluster=args.sectors_per_cluster,
explicit_fat_type=args.fat_type,
long_names_enabled=args.long_name_support,
- use_default_datetime=args.use_default_datetime)
+ use_default_datetime=args.use_default_datetime,
+ root_entry_count=args.root_entry_count,
+ wl_mode=args.wl_mode)
wl_fatfs.plain_fatfs.generate(args.input_directory)
wl_fatfs.init_wl()