mirror of
https://github.com/apache/nuttx.git
synced 2026-09-28 15:54:57 +08:00
Add eMMC driver support
- Fix DMA addressing issues within litex_sendsetup/litex_recvsetup - Extend with handling specific to eMMC commands during init & use. - Cleanup of 4-bit BUS handling for SD and eMMC - For eMMC, Send CMD0 during init as per JEDEC v4.41 for pre-idle
This commit is contained in:
committed by
David Sidrane
parent
eb0e05be0d
commit
50a8ec62c4
@@ -860,10 +860,12 @@ static int litex_recvsetup(struct sdio_dev_s *dev, uint8_t *buffer,
|
||||
|
||||
/* flush CPU d-cache */
|
||||
|
||||
#ifndef CONFIG_LITEX_COHERENT_DMA
|
||||
up_invalidate_dcache_all();
|
||||
#endif
|
||||
|
||||
putreg32(0, LITEX_SDBLOCK2MEM_DMA_ENABLE);
|
||||
putreg32((uintptr_t)buffer >> 32, LITEX_SDBLOCK2MEM_DMA_BASE);
|
||||
putreg32((uintptr_t)(&buffer[4]), LITEX_SDBLOCK2MEM_DMA_BASE);
|
||||
putreg32((uintptr_t)buffer, LITEX_SDBLOCK2MEM_DMA_BASE + 0x04);
|
||||
putreg32(nbytes, LITEX_SDBLOCK2MEM_DMA_LENGTH);
|
||||
putreg32(1, LITEX_SDBLOCK2MEM_DMA_ENABLE);
|
||||
@@ -903,10 +905,12 @@ static int litex_sendsetup(struct sdio_dev_s *dev,
|
||||
|
||||
/* flush CPU d-cache */
|
||||
|
||||
#ifndef CONFIG_LITEX_COHERENT_DMA
|
||||
up_invalidate_dcache_all();
|
||||
#endif
|
||||
|
||||
putreg32(0, LITEX_SDMEM2BLOCK_DMA_ENABLE);
|
||||
putreg32((uintptr_t)buffer >> 32, LITEX_SDMEM2BLOCK_DMA_BASE);
|
||||
putreg32((uintptr_t)(&buffer[4]), LITEX_SDMEM2BLOCK_DMA_BASE);
|
||||
putreg32((uintptr_t)buffer, LITEX_SDMEM2BLOCK_DMA_BASE + 0x04);
|
||||
putreg32(nbytes, LITEX_SDMEM2BLOCK_DMA_LENGTH);
|
||||
putreg32(1, LITEX_SDMEM2BLOCK_DMA_ENABLE);
|
||||
|
||||
@@ -5,6 +5,44 @@
|
||||
|
||||
if ARCH_BOARD_ARTY_A7
|
||||
|
||||
|
||||
config LITEX_SDIO
|
||||
bool "SDIO"
|
||||
default n
|
||||
select SCHED_HPWORK
|
||||
select MMCSD
|
||||
select MMCSD_SDIO
|
||||
select SDIO_BLOCKSETUP
|
||||
select ARCH_HAVE_SDIO
|
||||
select SDIO_DMA
|
||||
|
||||
config LITEX_SDIO1
|
||||
bool "Enable SDIO1"
|
||||
default y if LITEX_SDIO
|
||||
select LITEX_SDIO_DMA
|
||||
depends on LITEX_SDIO
|
||||
|
||||
config LITEX_IDMODE_FREQ
|
||||
int "ID mode frequency"
|
||||
default 400000
|
||||
depends on LITEX_SDIO
|
||||
---help---
|
||||
Initial, ID mode SD frequency
|
||||
|
||||
config LITEX_MMCXFR_FREQ
|
||||
int "MMC transfer frequency"
|
||||
default 25000000
|
||||
depends on LITEX_SDIO
|
||||
---help---
|
||||
Frequency to use for transferring data to/from an MMC card
|
||||
|
||||
config LITEX_SD4BIT_FREQ
|
||||
int "SD 4-bit transfer frequency"
|
||||
default 50000000
|
||||
depends on LITEX_SDIO
|
||||
---help---
|
||||
Frequency to use for transferring data to/from an SD card using all four data lines.
|
||||
|
||||
config LITEX_SDIO_MOUNT
|
||||
bool "Mount SDIO at startup"
|
||||
default n
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
#
|
||||
# This file is autogenerated: PLEASE DO NOT EDIT IT.
|
||||
#
|
||||
# You can use "make menuconfig" to make any modifications to the installed .config file.
|
||||
# You can then do "make savedefconfig" to generate a new defconfig file that includes your
|
||||
# modifications.
|
||||
#
|
||||
# CONFIG_DISABLE_PTHREAD is not set
|
||||
# CONFIG_FS_PROCFS_EXCLUDE_BLOCKS is not set
|
||||
# CONFIG_FS_PROCFS_EXCLUDE_ENVIRON is not set
|
||||
# CONFIG_FS_PROCFS_EXCLUDE_MEMDUMP is not set
|
||||
# CONFIG_FS_PROCFS_EXCLUDE_MEMINFO is not set
|
||||
# CONFIG_FS_PROCFS_EXCLUDE_MOUNT is not set
|
||||
# CONFIG_FS_PROCFS_EXCLUDE_MOUNTS is not set
|
||||
# CONFIG_FS_PROCFS_EXCLUDE_PROCESS is not set
|
||||
# CONFIG_FS_PROCFS_EXCLUDE_UPTIME is not set
|
||||
# CONFIG_FS_PROCFS_EXCLUDE_USAGE is not set
|
||||
# CONFIG_FS_PROCFS_EXCLUDE_VERSION is not set
|
||||
# CONFIG_NSH_DISABLEBG is not set
|
||||
# CONFIG_NSH_DISABLE_LOSMART is not set
|
||||
# CONFIG_NSH_DISABLE_UNAME is not set
|
||||
# CONFIG_STANDARD_SERIAL is not set
|
||||
CONFIG_ARCH="risc-v"
|
||||
CONFIG_ARCH_BOARD="arty_a7"
|
||||
CONFIG_ARCH_BOARD_ARTY_A7=y
|
||||
CONFIG_ARCH_CHIP="litex"
|
||||
CONFIG_ARCH_CHIP_LITEX=y
|
||||
CONFIG_ARCH_INTERRUPTSTACK=8192
|
||||
CONFIG_ARCH_RISCV=y
|
||||
CONFIG_ARCH_STACKDUMP=y
|
||||
CONFIG_BINFMT_DISABLE=y
|
||||
CONFIG_BOARD_LOOPSPERMSEC=10000
|
||||
CONFIG_BUILTIN=y
|
||||
CONFIG_DEBUG_FULLOPT=y
|
||||
CONFIG_DEBUG_SYMBOLS=y
|
||||
CONFIG_DEFAULT_SMALL=y
|
||||
CONFIG_DEV_ZERO=y
|
||||
CONFIG_EXAMPLES_HELLO=y
|
||||
CONFIG_EXAMPLES_HELLO_STACKSIZE=8192
|
||||
CONFIG_FAT_DMAMEMORY=y
|
||||
CONFIG_FAT_FORCE_INDIRECT=y
|
||||
CONFIG_FAT_LFN=y
|
||||
CONFIG_FS_FAT=y
|
||||
CONFIG_FS_FATTIME=y
|
||||
CONFIG_FS_PROCFS=y
|
||||
CONFIG_GRAN=y
|
||||
CONFIG_IDLETHREAD_STACKSIZE=8192
|
||||
CONFIG_INIT_ENTRYPOINT="nsh_main"
|
||||
CONFIG_INIT_STACKSIZE=8192
|
||||
CONFIG_INTELHEX_BINARY=y
|
||||
CONFIG_LIBC_PERROR_STDOUT=y
|
||||
CONFIG_LIBC_STRERROR=y
|
||||
CONFIG_LITEX_SDIO=y
|
||||
CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6
|
||||
CONFIG_NSH_ARCHINIT=y
|
||||
CONFIG_NSH_BUILTIN_APPS=y
|
||||
CONFIG_NSH_FILEIOSIZE=64
|
||||
CONFIG_NSH_STRERROR=y
|
||||
CONFIG_POSIX_SPAWN_DEFAULT_STACKSIZE=8192
|
||||
CONFIG_PTHREAD_STACK_DEFAULT=8192
|
||||
CONFIG_RAM_SIZE=268435456
|
||||
CONFIG_RAM_START=0x40000000
|
||||
CONFIG_RAW_BINARY=y
|
||||
CONFIG_RR_INTERVAL=200
|
||||
CONFIG_SCHED_WAITPID=y
|
||||
CONFIG_STACK_COLORATION=y
|
||||
CONFIG_START_DAY=20
|
||||
CONFIG_START_MONTH=3
|
||||
CONFIG_START_YEAR=2020
|
||||
CONFIG_SYSTEM_NSH=y
|
||||
CONFIG_TASK_NAME_SIZE=12
|
||||
CONFIG_TESTING_GETPRIME=y
|
||||
CONFIG_UART0_RXBUFSIZE=128
|
||||
CONFIG_UART0_SERIAL_CONSOLE=y
|
||||
CONFIG_UART0_TXBUFSIZE=128
|
||||
+171
-29
File diff suppressed because it is too large
Load Diff
@@ -32,6 +32,32 @@
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/* CMD6 (MMC_SWITCH) argument
|
||||
* MMC_SWITCH argument format:
|
||||
*
|
||||
* [31:26] Always 0
|
||||
* [25:24] Access Mode
|
||||
* [23:16] Location of target Byte in EXT_CSD
|
||||
* [15:08] Value Byte
|
||||
* [07:03] Always 0
|
||||
* [02:00] Command Set
|
||||
*/
|
||||
#define MMCSD_CMD6_BUSWIDTH_RWSHIFT (16)
|
||||
# define MMCSD_CMD6_BUSWIDTH_RW ((uint32_t)0xb7 << MMCSD_CMD6_BUSWIDTH_RWSHIFT) /* R/W */
|
||||
|
||||
#define MMCSD_CMD6_WRITE_BYTE_SHIFT (24)
|
||||
# define MMCSD_CMD6_MODE_CMD_SET ((uint32_t)0x00 << MMCSD_CMD6_WRITE_BYTE_SHIFT) /* Change the command set */
|
||||
# define MMCSD_CMD6_MODE_SET_BITS ((uint32_t)0x01 << MMCSD_CMD6_WRITE_BYTE_SHIFT) /* Set bits which are 1 in value */
|
||||
# define MMCSD_CMD6_MODE_CLEAR_BITS ((uint32_t)0x02 << MMCSD_CMD6_WRITE_BYTE_SHIFT) /* Clear bits which are 1 in value */
|
||||
# define MMCSD_CMD6_MODE_WRITE_BYTE ((uint32_t)0x03 << MMCSD_CMD6_WRITE_BYTE_SHIFT) /* Set target to value */
|
||||
|
||||
#define MMCSD_CMD6_BUS_WIDTH_SHIFT (8)
|
||||
# define MMCSD_CMD6_BUS_WIDTH_1 ((uint32_t)0x00 << MMCSD_CMD6_BUS_WIDTH_SHIFT) /* Card is in 1 bit mode */
|
||||
# define MMCSD_CMD6_BUS_WIDTH_4 ((uint32_t)0x01 << MMCSD_CMD6_BUS_WIDTH_SHIFT) /* Card is in 4 bit mode */
|
||||
# define MMCSD_CMD6_CSD_BUS_WIDTH_8 ((uint32_t)0x02 << MMCSD_CMD6_BUS_WIDTH_SHIFT) /* Card is in 8 bit mode */
|
||||
# define MMCSD_CMD6_DDR_BUS_WIDTH_4 ((uint32_t)0x05 << MMCSD_CMD6_BUS_WIDTH_SHIFT) /* Card is in 4 bit DDR mode */
|
||||
# define MMCSD_CMD6_DDR_BUS_WIDTH_8 ((uint32_t)0x06 << MMCSD_CMD6_BUS_WIDTH_SHIFT) /* Card is in 8 bit DDR mode */
|
||||
|
||||
/* CMD8 Argument:
|
||||
* [31:12]: Reserved (shall be set to '0')
|
||||
* [11:8]: Supply Voltage (VHS) 0x1 (Range: 2.7-3.6 V)
|
||||
|
||||
Reference in New Issue
Block a user