#
# For a description of the syntax of this configuration file,
# see the file kconfig-language.txt in the NuttX tools repository.
#

config FS_FAT
	bool "FAT file system"
	default n
	depends on !DISABLE_MOUNTPOINT
	select FS_READABLE
	select FS_WRITABLE
	---help---
		Enable FAT filesystem support

if FS_FAT

config FAT_LCNAMES
	bool "FAT upper/lower names"
	default n
	---help---
		Enable use of the NT-style upper/lower case 8.3
		file name support.

config FAT_LFN
	bool "FAT long file names"
	default n
	---help---
		Enable FAT long file names.  NOTE:  Microsoft claims
		patents on FAT long file name technology.  Please read the
		disclaimer in the top-level COPYING file and only enable this
		feature if you understand these issues.

config FAT_MAXFNAME
	int "FAT maximum file name size"
	depends on FAT_LFN
	default 32
	---help---
		If FAT_LFN is defined, then the default, maximum long file
		name is 255 bytes.  This can eat up a lot of memory (especially stack
		space).  If you are willing to live with some non-standard, short long
		file names, then define this value to be something more reasonable.  A
		good choice would be the same value as selected for NAME_MAX which will
		limit the visibility of longer file names anyway.

config FS_FATTIME
	bool "FAT timestamps"
	default n
	---help---
		Support FAT date and time. NOTE:  There is not
		much sense in supporting FAT date and time unless you have a
		hardware RTC or other way to get the time and date.

config FAT_FORCE_INDIRECT
	bool "Force direct transfers"
	default n
	---help---
		Normally, the default behavior for the FAT file system is to perform
		data transfers indirectly though specially allocated sector buffers
		or, under certain circumstances, directly through user provided
		buffers .  These circumstances are:  (1) The transfer is being
		performed from the beginning of a sector (2) the user-provided
		buffer will hold the full sector of data.

		Some hardware, however, may require special DMA-capable memory or
		specially aligned memory in order to perform the transfers.  In this
		case, there may be no circumstance where the user buffer can be used.
		Selecting this option will disable all attempts to use the user-
		provided buffer:  All transfers will be force to be performed
		indirectly through the FAT file systems sector buffers.

		Note: This will have the negative impact of:  (1) An extra data
		copy to transfer the data between the user buffer and the FAT file
		systems internal sector buffers, and (2) A loss of performance
		because I/O will be limited to one sector at a time.

		This would typically be used with CONFIG_FAT_DMAMEMORY so that
		special memory allocators are also used and transfers are also
		performed using only that specially allocated memory.
		CONFIG_FAT_DMAMEMORY, on the other hand, is often used without
		CONFIG_FAT_FORCE_INDIRECT when the user memory buffers may come
		from mixed locations, some of which are DMA-able and some of
		which are not.  But CONFIG_FAT_FORCE_INDIRECT could be used
		without CONFIG_FAT_DMAMEMORY if there is, for example, only a
		memory aligment constraints.

			FORCE_   DMA    DIRECT EXAMPLE USAGE
			INDIRECT MEMORY RETRY
			  Y        Y      *    Use specially allocated memory;
			                       Never use caller provided buffer
			  Y        N      *    Not recommended
			  N        Y     **    Special memory required; user memory
			                       has mixed capability; sometimes
			                       caller memory is not usable
			  N        N      Y    No special memory but there are
			                       alignment requirements; return is
			                       caller buffer is not properly aligned
			  N        N      N    User memory can always be used for
			                       transfer.

			*  CONFIG_DIRECT_RETRY cannot be selected with CONFIG_FORCE_INDIRECT
			** CONFIG_DIRECT_RETRY is automatically selected with CONFIG_DMA_MEMORY

config FAT_DMAMEMORY
	bool "DMA memory allocator"
	default n
	select FAT_DIRECT_RETRY if !FAT_FORCE_INDIRECT
	---help---
		The FAT file system allocates two I/O buffers for data transfer, each
		are the size of one device sector.  One of the buffers is allocated
		once for each FAT volume that is mounted; the other buffers are
		allocated each time a FAT file is opened.

		Some hardware, however, may require special DMA-capable memory in
		order to perform the transfers.  If FAT_DMAMEMORY is defined
		then the architecture-specific hardware must provide the functions
		fat_dma_alloc() and fat_dma_free():  fat_dmalloc() will allocate
		DMA-capable memory of the specified size; fat_dmafree() is the
		corresponding function that will be called to free the DMA-capable
		memory.

			FORCE_   DMA    DIRECT EXAMPLE USAGE
			INDIRECT MEMORY RETRY
			  Y        Y      *    Use specially allocated memory;
			                       Never use caller provided buffer
			  Y        N      *    Not recommended
			  N        Y     **    Special memory required; user memory
			                       has mixed capability; sometimes
			                       caller memory is not usable
			  N        N      Y    No special memory but there are
			                       alignment requirements; return is
			                       caller buffer is not properly aligned
			  N        N      N    User memory can always be used for
			                       transfer.

			*  CONFIG_DIRECT_RETRY cannot be selected with CONFIG_FORCE_INDIRECT
			** CONFIG_DIRECT_RETRY is automatically selected with CONFIG_DMA_MEMORY

config FAT_DIRECT_RETRY
	bool "Direct transfer retry"
	default y if FAT_DMAMEMORY
	default n if !FAT_DMAMEMORY
	depends on !FAT_FORCE_INDIRECT
	---help---
		The FAT file system contains internal, well aligned sector buffers
		for indirect data transfer.  These transfers are indirect in the
		sense that that the actual transfer occurs into/out of the sector
		buffers and an additional copy is necessary to/from the user-
		provided I/O buffers.  But under certain conditions, the FAT file
		system will use the caller-provided I/O buffers directly to improve
		efficiency.  Those conditions are (1) CONFIG_FAT_FORCE_INDIRECT is
		not defined, (2) The access is to/from the beginning of a sector,
		and (3) the user provided buffer is large enough to hold an entire
		sector.

		The lower level SDIO driver may have, certain requirements on the
		memory buffer in order to perform the transfer.  Perhaps special
		DMA memory should be used (with CONFIG_FAT_DMAMEMORY) or perhaps
		some special memory alignment is required to interace with the
		hardware.

		If this option is selected, then the FAT file system will first
		try the user provided I/O buffer under above conditions.  If the
		transfer fails with -EFAULT. then the FAT file system will try one
		more time using the internal sector buffers.

			FORCE_   DMA    DIRECT EXAMPLE USAGE
			INDIRECT MEMORY RETRY
			  Y        Y      *    Use specially allocated memory;
			                       Never use caller provided buffer
			  Y        N      *    Not recommended
			  N        Y     **    Special memory required; user memory
			                       has mixed capability; sometimes
			                       caller memory is not usable
			  N        N      Y    No special memory but there are
			                       alignment requirements; return is
			                       caller buffer is not properly aligned
			  N        N      N    User memory can always be used for
			                       transfer.

			*  CONFIG_DIRECT_RETRY cannot be selected with CONFIG_FORCE_INDIRECT
			** CONFIG_DIRECT_RETRY is automatically selected with CONFIG_DMA_MEMORY

endif # FAT