# Copyright (c) 2016 Intel Corporation
# SPDX-License-Identifier: Apache-2.0

menuconfig DISK_ACCESS
	bool "Disk Interface"
	help
	  Enable disk access over a supported media backend like FLASH or RAM

if DISK_ACCESS

module = DISK
module-str = disk
source "subsys/logging/Kconfig.template.log_config"

config DISK_ACCESS_RAM
	bool "RAM Disk"
	help
	  RAM buffer used to emulate storage disk.
	  This option can be used to test the file
	  system.

if DISK_ACCESS_RAM

config DISK_RAM_VOLUME_SIZE
	int "RAM Disk size in kilobytes"
	default 96
	help
	  Size of the RAM Disk.

config DISK_RAM_VOLUME_NAME
	string "RAM Disk mount point or drive name"
	default "RAM"
	help
	  Disk name as per file system naming guidelines.

endif # DISK_ACCESS_RAM

config DISK_ACCESS_FLASH
	bool "Flash"
	select FLASH
	help
	  Flash device is used for the file system.

if DISK_ACCESS_FLASH

config DISK_FLASH_VOLUME_NAME
	string "Flash mount point or drive name"
	default "NAND"
	help
	  Disk name as per file system naming guidelines.

config DISK_FLASH_DEV_NAME
	string "Flash device name to be used as storage backend"

config DISK_FLASH_START
	hex "Flash device start address in hex"
	help
	  This is start address of the flash to be used as storage backend.

config DISK_FLASH_MAX_RW_SIZE
	int "Flash device max read-write size in decimal"
	help
	  This is the maximum number of bytes that the
	  flash_write API can accept per invocation.
	  API.

config DISK_FLASH_ERASE_ALIGNMENT
	hex "Flash device erase alignment in hex"
	help
	  This is the start address alignment required by
	  the flash component.

config DISK_ERASE_BLOCK_SIZE
	hex "Flash device erasable block size in hex"
	help
	  This is typically the minimum block size that
	  is erased at one time in flash storage.
	  Typically it is equal to the flash memory page size.

config DISK_VOLUME_SIZE
	hex "Flash device volume size in hex"
	help
	  This is the file system volume size in bytes.

endif # DISK_ACCESS_FLASH

config DISK_ACCESS_SDHC
	bool "SDHC card access"
	select FLASH
	help
	  File system on a SDHC card.

if DISK_ACCESS_SDHC

config DISK_ACCESS_SPI_SDHC
	bool "SDHC access over SPI"
	depends on SPI
	help
	  File system on a SDHC card accessed over SPI.

config DISK_ACCESS_USDHC
	bool "NXP i.MXRT USDHC driver"
	depends on (HAS_MCUX_USDHC1 || HAS_MCUX_USDHC2)
	help
	  File system on a SDHC card accessed over
	  NXP USDHC.

if DISK_ACCESS_USDHC

config DISK_ACCESS_USDHC1
	bool "NXP i.MXRT USDHC instance 1"
	depends on HAS_MCUX_USDHC1
	help
	  File system on a SDHC card accessed over
	  USDHC instance 1.

config DISK_ACCESS_USDHC2
	bool "NXP i.MXRT USDHC instance 2"
	depends on HAS_MCUX_USDHC2
	help
	  File system on a SDHC card accessed over
	  USDHC instance 2.

endif # DISK_ACCESS_USDHC

config DISK_SDHC_VOLUME_NAME
	string "SDHC Disk mount point or drive name"
	default "SD" if FAT_FILESYSTEM_ELM
	default "SDHC"
	help
	  Disk name as per file system naming guidelines.

endif # DISK_ACCESS_SDHC
endif # DISK_ACCESS
