# Copyright (c) 2016 Intel Corporation
# Copyright (c) 2020 Nordic Semiconductor ASA
# Copyright (c) 2023 Husqvarna AB
# SPDX-License-Identifier: Apache-2.0

config FAT_FILESYSTEM_ELM
	bool "ELM FAT file system support"
	depends on FILE_SYSTEM
	select DISK_ACCESS
	help
	  Use the ELM FAT File system implementation.

if FAT_FILESYSTEM_ELM

menu "ELM FAT file system settings"
	visible if FAT_FILESYSTEM_ELM

config FS_FATFS_READ_ONLY
	bool "Read-only support for all volumes"
	help
	  Excludes write code from ELM FAT file system driver.
	  Select this when using FAT for read-only access to slightly
	  reduce code size.
	  This option affects FF_FS_READONLY defined in ffconf.h, inside
	  ELM FAT module.

config FS_FATFS_MKFS
	bool
	help
	  Adds code for creating disks with FAT file system.
	  This option affects FF_USE_MKFS defined in ffconf.h, inside
	  ELM FAT module.

config FS_FATFS_MOUNT_MKFS
	bool "Allow formatting volume when mounting fails"
	default y
	select FS_FATFS_MKFS
	help
	  This option adds code that allows fs_mount to attempt to format
	  a volume if no file system is found.
	  If formatting is not needed, disabling this flag will slightly
	  reduce application size.
	  Note: This option is destructive to data and will automatically
	  destroy your disk, if mount attempt fails. In case when your
	  disk can be detached from a device and recovered using other
	  system, it may be worth disabling this option.
	  When this option is disabled, disk needs to be FAT formatted
	  prior to connecting to a device, otherwise it will not be
	  mountable.

if FS_FATFS_MOUNT_MKFS

config FS_FATFS_MAX_ROOT_ENTRIES
	int "Max number of entries in FAT FS root directory"
	default 512
	range 1 32768
	help
	  Sets how many root directory entries will be allocated when
	  formatting new FAT system to a device.
	  Note that this should be multiply of FS_FATFS_MAX_SS / 32.

endif # FS_FATFS_MOUNT_MKFS

config FS_FATFS_EXFAT
	bool "ExFAT support"
	select FS_FATFS_LFN
	help
	  Enable the exFAT format support for FatFs.

config FS_FATFS_NUM_FILES
	int "Maximum number of opened files"
	default 4
	help
	  Affects how many file objects area available for parallel
	  use by FAT driver. Each object is of size sizeof(FIL), where
	  FIL is defined in ff.h of ELM FAT driver, and is pre-allocated
	  at compile-time.
	  This affects use of fs_open on FAT type mounted file systems.

config FS_FATFS_NUM_DIRS
	int "Maximum number of opened directories"
	default 4
	help
	  Affects how many directory objects area available for parallel
	  use by FAT driver. Each object is of size sizeof(DIR), where
	  DIR is defined in ff.h of ELM FAT driver, and is pre-allocated
	  at compile-time.
	  This affects use of fs_opendir on FAT type mounted file systems.

config FS_FATFS_LFN
	bool "Long filenames (LFN)"
	help
	  Without long filenames enabled, file names are limited to 8.3 format.
	  This option increases working buffer size.

if FS_FATFS_LFN

choice FS_FATFS_LFN_MODE
	prompt "LFN memory mode"
	default FS_FATFS_LFN_MODE_BSS

config FS_FATFS_LFN_MODE_BSS
	bool "Static buffer"
	help
	  Enable LFN with static working buffer on the BSS. Always NOT thread-safe.
	  This option affects FF_USE_LFN defined in ffconf.h, inside
	  ELM FAT module, by setting its value to 1.

config FS_FATFS_LFN_MODE_STACK
	bool "Stack buffer"
	help
	  Enable LFN with dynamic working buffer on the STACK.
	  This option affects FF_USE_LFN defined in ffconf.h, inside
	  ELM FAT module, by setting its value to 2.

config FS_FATFS_LFN_MODE_HEAP
	bool "Heap buffer"
	depends on HEAP_MEM_POOL_SIZE > 0
	help
	  Enable LFN with dynamic working buffer on the HEAP.
	  This option affects FF_USE_LFN defined in ffconf.h, inside
	  ELM FAT module, by setting its value to 3.

endchoice

config FS_FATFS_FF_USE_LFN
	int
	default 1 if FS_FATFS_LFN_MODE_BSS
	default 2 if FS_FATFS_LFN_MODE_STACK
	default 3 if FS_FATFS_LFN_MODE_HEAP
	help
	  Translates FS_FATFS_LFN_MODE selection to FF_USE_LFN, defined in ffconf.h,
	  inside ELM FAT module.

config FS_FATFS_MAX_LFN
	int "Max filename length"
	range 12 255
	default 255
	help
	  The working buffer occupies (FS_FATFS_MAX_LFN + 1) * 2 bytes and
	  additional 608 bytes at exFAT enabled.
	  It should be set 255 to support full featured LFN operations.

endif # FS_FATFS_LFN

config FS_FATFS_CODEPAGE
	int "FatFS code page (character set)"
	default 437
	help
	  Valid code page values:
	   437 - U.S.
	   720 - Arabic
	   737 - Greek
	   771 - KBL
	   775 - Baltic
	   850 - Latin 1
	   852 - Latin 2
	   855 - Cyrillic
	   857 - Turkish
	   860 - Portuguese
	   861 - Icelandic
	   862 - Hebrew
	   863 - Canadian French
	   864 - Arabic
	   865 - Nordic
	   866 - Russian
	   869 - Greek 2
	   932 - Japanese (DBCS)
	   936 - Simplified Chinese (DBCS)
	   949 - Korean (DBCS)
	   950 - Traditional Chinese (DBCS)
	   0 - Include all supported code pages
	  This option affects FF_CODE_PAGE defined in ffconf.h, inside
	  ELM FAT module.

config FS_FATFS_MAX_SS
	int "Maximum supported sector size"
	range 512 4096
	default 512
	help
	  Value set here will be used as maximum supported read/write
	  sector size, with 512 being minimum value.
	  Option affects write/read granularity and will increase
	  size of buffers used by FAT driver, which in practice affects
	  how much RAM each FATFS object, used with FAT mount point,
	  requires, which is this value plus some constant amount,
	  independent from this setting.
	  This will affect your compile time RAM allocation, when
	  mount point is defined as static/global life time variable,
	  or stack.
	  When this value is set to 512, all mount points will use
	  512 as sector size, all other values will cause FAT driver
	  to query device for sector size on mount.
	  This option affects FF_MAX_SS defined in ffconf.h, inside
	  ELM FAT module.

config FS_FATFS_MIN_SS
	int "Minimum expected sector size"
	range 512 FS_FATFS_MAX_SS
	default 512
	help
	  Specifies minimum sector size the FAT FS driver is expected to
	  support. Set this to FS_FATFS_MAX_FS when you have single
	  device with FAT FS or all connected devices use the same
	  sector size, to have slight reduction in code in FAT FS driver.
	  The reduction comes from the fact that FAT FS does not have to
	  query every connected device for sector size.
	  This option affects FF_MIN_SS defined in ffconf.h, inside
	  ELM FAT module.

config FS_FATFS_WINDOW_ALIGNMENT
	int "Memory alignment for the member \"win\" in FATFS"
	default 1
	help
	  Specifies alignment, in bytes of FAT FS window buffer that is
	  used for device's read/write operations. MMC controllers may
	  require read/write buffer to start at memory address with
	  specific alignment, for example 16 or 512 bytes, the value
	  provided here is used as such alignment. Note that the window
	  buffer is internal element of FATFS structure, which means
	  that, in worst scenario, value provided here may cause FATFS
	  structure to have size of twice the value.

config FS_FATFS_REENTRANT
	bool "FatFs reentrant"
	depends on !FS_FATFS_LFN_MODE_BSS
	help
	  Enable the FatFs re-entrancy (thread safe) option for file/directory
	  access for each volume. Will create a zephyr mutex object for each
	  FatFs volume and a FatFs system mutex.

endmenu

endif # FAT_FILESYSTEM_ELM
