support for SAMA5D27 SDMMC peripheral

- MMC and SD Card driver
- ported from imxrt_usdhc.c

Squashed commit of the following:

commit 46cbe18ad6a6e41ec2727d839f86f5670577878a
Author: Adam Feuer <adam@starcat.io>
Date:   Wed Jul 15 10:28:02 2020 -0700

    nxstyle change - Public Function Prototypes

    - instead of Public Functions

commit 486b7b62e83a78ae15b114e34846900d8fef8248
Author: Adam Feuer <adam@starcat.io>
Date:   Wed Jul 15 10:06:51 2020 -0700

    nxstyle changes

commit 28280d585a40aac99fd0e538295828ea013739b7
Author: Adam Feuer <adam@starcat.io>
Date:   Wed Jul 15 10:06:29 2020 -0700

    removing unused enum value

commit 7da6ba437e7e023d348e63c497732fea985a2d1b
Author: Adam Feuer <adam@starcat.io>
Date:   Tue Jul 14 21:17:49 2020 -0700

    CI build error fixes

    - unused vars
    - incorrect method calls

commit 145a73449b9d1eaed8a6cbf47cb53fb5b7a551f6
Author: Adam Feuer <adam@starcat.io>
Date:   Tue Jul 14 17:29:56 2020 -0700

    adding #defines to prevent unused var warning

commit 47ed2c08235816caded26a019cf33899daed1621
Author: Adam Feuer <adam@starcat.io>
Date:   Tue Jul 14 16:29:07 2020 -0700

    removing obsolete config values

commit b43f129c03a8bb8dc57ae6984d124ce9e9306196
Author: Adam Feuer <adam@starcat.io>
Date:   Tue Jul 14 09:58:42 2020 -0700

    removed obsolete config setting

commit 23e3af846ac24cac928442c7af86c5d0ef183ad3
Merge: 8b47330fe5 6f6d61eec4
Author: Adam Feuer <adam@starcat.io>
Date:   Tue Jul 14 09:53:12 2020 -0700

    Merge remote-tracking branch 'upstream/master' into feature/sama5d27-sdmmc-support

commit 8b47330fe5bb49bbd1991f2f3e2c69bdfb833d2c
Author: Adam Feuer <adam@starcat.io>
Date:   Tue Jul 14 09:51:56 2020 -0700

    replaced license headers with Apache License 2.0

commit 865e69b9a84d077ab9e05c2056dc7a515222c6c7
Author: Adam Feuer <adam@starcat.io>
Date:   Thu Jul 9 18:38:01 2020 -0700

    SAMA5D2x SDMMC peripheral support (SD Card driver)

    - reading and writing at 25 MHz and 50Mhz
    - UHS_SDR50, UHS_DDR50, and UHS_SDR104 are supported
    - ported from imxrt_usdhc.c
    - only tested on SAMA5D27

    Squashed commit of the following:

    commit e3122baef2feaeb32bb00798ae56310b2cc5c448
    Author: Adam Feuer <adam@starcat.io>
    Date:   Thu Jul 9 18:30:03 2020 -0700

        added sdmmcnsh defconfig and basic docs

    commit 12a290d7465a0a006473ba67893bf891a7bcea83
    Author: Adam Feuer <adam@starcat.io>
    Date:   Thu Jul 9 17:50:06 2020 -0700

        nxstyle changes

    commit 33409c0f63c328dc200150ba883327cadf0300b2
    Author: Adam Feuer <adam@starcat.io>
    Date:   Thu Jul 9 16:15:00 2020 -0700

        add short delay to in recvshortcrc

        - to allow SDMMC to respond

    commit 3be7a7fb6f79900042d1fdbef72810f364ac5f62
    Author: Adam Feuer <adam@adamfeuer.com>
    Date:   Thu Jul 9 10:54:59 2020 -0700

        added SDR50 and SDR104 SDMMC bus modes

    commit 2888408866548ca53e582ea1525178a7733617b4
    Author: Adam Feuer <adam@adamfeuer.com>
    Date:   Thu Jul 9 10:54:25 2020 -0700

        comment formatting cleanup

    commit 06cf2c39193971155eaa6f9c89a39a88b53964a8
    Author: Adam Feuer <adam@adamfeuer.com>
    Date:   Thu Jul 9 10:34:01 2020 -0700

        removed unneeded comment

    commit ac89b69231bdf19563754865fda93d4bbbb4488d
    Author: Adam Feuer <adam@adamfeuer.com>
    Date:   Thu Jul 9 10:30:23 2020 -0700

        code cleanup

        - removing custinfo() logging
        - remove duplicate #defines
        - move var declarations to the beginning of methods

    commit bcd4abec7935ee9023ab72edfb02685dbeee243c
    Author: Adam Feuer <adam@adamfeuer.com>
    Date:   Wed Jul 8 16:34:31 2020 -0700

        handle SDMA Boundary Pause interrupt (DMAINT)

        - SDMMC_INT_DINT
        - add to waitints
        - add handler to sam_interrupt

    commit e9da026c1270e999df520ee2c60487195799f58c
    Author: Adam Feuer <adam@adamfeuer.com>
    Date:   Tue Jul 7 16:07:34 2020 -0700

        Kconfig setting for SDMMC bus speed

        - 25 and 50 MHz
        - 50 MHz is the default

    commit 9edc636b7f18f981d653f85970c3af0b80801778
    Author: Adam Feuer <adam@adamfeuer.com>
    Date:   Mon Jul 6 21:55:51 2020 -0700

        added HSEN bit change for high speed mode

        - above 26 MHz

    commit b8e91c95b0f7b2f8220f02b1eb42b6134e0660d0
    Author: Adam Feuer <adam@adamfeuer.com>
    Date:   Mon Jul 6 21:28:03 2020 -0700

        added calloc to fix bug

        - not sure why this works.

    commit 1ceaf2f8487fe39d4d6fb21adecd57e4c4992e07
    Author: Adam Feuer <adam@adamfeuer.com>
    Date:   Mon Jul 6 21:25:47 2020 -0700

        removing spurious typo characters

    commit 14ba51743bcca35686b07a76f5af17bcce078a5f
    Author: Adam Feuer <adam@adamfeuer.com>
    Date:   Sat Jul 4 18:10:46 2020 -0700

        nxstyle changes

    commit d8af26df47b7840117de0d3a44ec548b3a72bc2b
    Author: Adam Feuer <adam@adamfeuer.com>
    Date:   Sat Jul 4 17:01:11 2020 -0700

        nxstyle changes

    commit 0ae532bd62d02c5ac36aa2192f31fa1f7f1cde99
    Author: Adam Feuer <adam@adamfeuer.com>
    Date:   Sat Jul 4 16:37:17 2020 -0700

        remove long lines in comments - nxstyle

    commit 3d025a84f8e9ddb7f7a4570504118d782dd5574c
    Author: Adam Feuer <adam@adamfeuer.com>
    Date:   Sat Jul 4 16:36:52 2020 -0700

        removed custinfo logging

    commit 366b5d9d241a42d693583679cb49aa7bf25615aa
    Author: Adam Feuer <adam@adamfeuer.com>
    Date:   Sat Jul 4 16:35:08 2020 -0700

        removed custinfo logging

    commit c74396e4a4943873c7de5b6ffee193787c39baef
    Author: Adam Feuer <adam@adamfeuer.com>
    Date:   Sat Jul 4 16:34:36 2020 -0700

        fixed typo

    commit 7f51e99d7f4c1e5e0bf71a84fd0b2467157fea59
    Merge: c40f8c1039 2481b1bfd5
    Author: Adam Feuer <adam@adamfeuer.com>
    Date:   Sat Jul 4 15:33:06 2020 -0700

        Merge remote-tracking branch 'upstream/master' into feature/sama5d27-sdmmc-support

    commit c40f8c10390ecefeb3a113046edd6740b07ab31b
    Author: Adam Feuer <adam@adamfeuer.com>
    Date:   Thu Jul 2 22:08:20 2020 -0700

        SDMMC support for SAMA5D27
This commit is contained in:
Adam Feuer 2020-07-16 10:31:53 -07:00 committed by Abdelatif Guettouche
parent 954ee9d5f3
commit 65a866fbe2
23 changed files with 5962 additions and 207 deletions

View file

@ -121,6 +121,10 @@ config SAMA5_HAVE_EMAC1
bool
default n
config SAMA5_HAVE_SDMMC
bool
default n
config SAMA5_HAVE_HSMCI2
bool
default n
@ -285,6 +289,8 @@ config ARCH_CHIP_ATSAMA5D27
select SAMA5_HAVE_CAN0
select SAMA5_HAVE_CAN1
select SAMA5_HAVE_DDR32
select SAMA5_HAVE_SDMMC
select SAMA5_HAVE_GMAC
config ARCH_CHIP_ATSAMA5D28
bool "Atmel ATSAMA5D28"
@ -545,6 +551,12 @@ config SAMA5_TWI3
default n
depends on SAMA5_HAVE_TWI3
config SAMA5_SDMMC
bool "Secure Digital Multimedia Card Interface (SDMMC)"
default n
depends on SAMA5_HAVE_SDMMC
select ARCH_HAVE_SDIO
config SAMA5_HSMCI0
bool "High Speed Multimedia Card Interface 0 (HSMCI0)"
default n
@ -5056,4 +5068,32 @@ config SAMA5_EBICS3_HEAP_SIZE
endif #SAMA5_EBICS3_HEAP
endmenu # Heap Configuration
config SAMA5_SDMMC
bool "enable SDMMC controller"
default y if SAMA5_HAVE_SDMMC
select SDIO_DMA
select SCHED_WORKQUEUE
select SCHED_HPWORK
select MMCSD
select MMCSD_SDIO
select SDIO_BLOCKSETUP
select ARCH_HAVE_SDIO
select SAMA5_SDMMC_DMA
---help---
Enable SD Card interface SDMMC. Selects SAMA5_SDMMC SAMA5_SDMMC_DMA SDIO_DMA SCHED_WORKQUEUE SCHED_HPWORK SDIO_BLOCKSETUP
choice
prompt "SDMMC maximum bus speed"
default SAMA5_SDMMC_50MHZ
depends on SAMA5_SDMMC
config SAMA5_SDMMC_25MHZ
bool "SDMMC 25Mhz"
config SAMA5_SDMMC_50MHZ
bool "SDMMC 50Mhz"
endchoice # SDMMC bus speed
endif # ARCH_CHIP_SAMA5

View file

@ -213,6 +213,14 @@ endif
endif
endif
ifeq ($(CONFIG_SAMA5_SDMMC0),y)
CHIP_CSRCS += sam_sdmmc.c
else
ifeq ($(CONFIG_SAMA5_SDMMC1),y)
CHIP_CSRCS += sam_sdmmc.c
endif
endif
ifeq ($(CONFIG_SAMA5_HSMCI0),y)
CHIP_CSRCS += sam_hsmci.c sam_hsmci_clkdiv.c
else

View file

@ -317,6 +317,8 @@
#define SAM_AXIMX_MMUFLAGS MMU_IOFLAGS
#define SAM_DAP_MMUFLAGS MMU_IOFLAGS
#define SAM_L2CC_MMUFLAGS MMU_IOFLAGS
#define SAM_SDMMC0_MMUFLAGS MMU_IOFLAGS
#define SAM_SDMMC1_MMUFLAGS MMU_IOFLAGS
/* If the NFC is not being used, the NFC SRAM can be used as general purpose
* SRAM (cached). If the NFC is used, then the NFC SRAM should be treated
@ -429,8 +431,8 @@
#define SAM_EBICS1_VSECTION 0x60000000 /* 0x60000000-0x6fffffff: EBI Chip Select 1 */
#define SAM_EBICS2_VSECTION 0x70000000 /* 0x70000000-0x7fffffff: EBI Chip Select 2 */
#define SAM_EBICS3_VSECTION 0x80000000 /* 0x80000000-0x8fffffff: EBI Chip Select 3 */
#define SAM_QSPI0AES_VSECTION 0x90000000 /* 0x90000000-0x9fffffff: QSPI0 AES Memory */
#define SAM_QSPI1AES_VSECTION 0xa0000000 /* 0xa0000000-0xafffffff: QSPI1 AES Memory */
#define SAM_QSPI0AES_VSECTION 0x90000000 /* 0x90000000-0x97ffffff: QSPI0 AES Memory */
#define SAM_QSPI1AES_VSECTION 0x98000000 /* 0x98000000-0x9fffffff: QSPI1 AES Memory */
#define SAM_SDMMC0_VSECTION 0xa0000000 /* 0xa0000000-0xafffffff: SDMMC0 */
#define SAM_SDMMC1_VSECTION 0xb0000000 /* 0xb0000000-0xbfffffff: SDMMC1 */
#define SAM_NFCCR_VSECTION 0xc0000000 /* 0xc0000000-0xcfffffff: NFC Command Registers */
@ -461,6 +463,8 @@
/* Peripheral virtual base addresses */
#define SAM_SDMMC0_VBASE (SAM_SDMMC0_VSECTION)
#define SAM_SDMMC1_VBASE (SAM_SDMMC1_VSECTION)
#define SAM_LCDC_VBASE (SAM_PERIPHA_VSECTION+SAM_LCDC_OFFSET)
#define SAM_XDMAC1_VBASE (SAM_PERIPHA_VSECTION+SAM_XDMAC1_OFFSET)
#define SAM_ISC_VBASE (SAM_PERIPHA_VSECTION+SAM_ISC_OFFSET)
@ -640,7 +644,7 @@
* 1) If CONFIG_ARCH_ROMPGTABLE, then the page table resides in ROM and we
* will not use any page table in RAM.
* 2) We are executing out of SRAM. In this case, vectors will reside at
* the bottom of SRAM, following by .text, .data, .bss, and heep. The
* the bottom of SRAM, following by .text, .data, .bss, and heap. The
* page table will be squeezed into the end of internal SRAM in this
* case.
*

View file

@ -1,4 +1,4 @@
/************************************************************************************************************
/****************************************************************************
* arch/arm/src/sama5/hardware/_sama5d2x_pinmap.h
*
* Copyright (C) 2015 Gregory Nutt. All rights reserved.
@ -31,40 +31,42 @@
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
************************************************************************************************************/
****************************************************************************/
#ifndef __ARCH_ARM_SRC_SAMA5_HARDWARE__SAMA5D2X_PINMAP_H
#define __ARCH_ARM_SRC_SAMA5_HARDWARE__SAMA5D2X_PINMAP_H
/************************************************************************************************************
/****************************************************************************
* Included Files
************************************************************************************************************/
****************************************************************************/
#include <nuttx/config.h>
#include "chip.h"
#include "sam_pio.h"
/************************************************************************************************************
/****************************************************************************
* Pre-processor Definitions
************************************************************************************************************/
****************************************************************************/
/* PIO pin definitions **************************************************************************************/
/* Alternate Pin Functions.
/* PIO pin definitions ******************************************************
* Alternate Pin Functions.
*
* Alternative pin selections are provided with a numeric suffix like _1, _2, etc. Drivers, however, will
* use the pin selection without the numeric suffix. Additional definitions are required in the board.h
* file. For example, if we wanted the PCK0 on PB26, then the following definition should appear in the
* board.h header file for that board:
* Alternative pin selections are provided with a numeric suffix like _1, _2,
* etc. Drivers, however, will use the pin selection without the numeric
* suffix. Additional definitions are required in the board.h file. For
* example, if we wanted the PCK0 on PB26, then the following definition
* should appear in the board.h header file for that board:
*
* #define PIO_PMC_PCK0 PIO_PMC_PCK0_1
*
* The PCK logic will then automatically configure PB26 as the PCK0 pin.
*/
/* WARNING!!! WARNING!!! WARNING!!! WARNING!!! WARNING!!! WARNING!!! WARNING!!!
* Additional effort is required to select specific PIO options such as frequency, open-drain/push-pull,
* and pull-up/down! Just the basics are defined for most pins in this file at the present time.
/* WARNING!!! WARNING!!! WARNING!!! WARNING!!! WARNING!!! WARNING!!!
* Additional effort is required to select specific PIO options such as
* frequency, open-drain/push-pull, and pull-up/down! Just the basics are
* defined for most pins in this file at the present time.
*/
/* Analog-to-Digital Converter - ADC */
@ -537,7 +539,6 @@
#define PIO_PDMIC_DAT_1 (PIO_PERIPHD | PIO_CFG_DEFAULT | PIO_PORT_PIOB | PIO_PIN11)
#define PIO_PDMIC_DAT_2 (PIO_PERIPHD | PIO_CFG_DEFAULT | PIO_PORT_PIOB | PIO_PIN26)
/* Pulse Width Modulation Controller - PWM */
#define PIO_PWM0_EXTRG0 (PIO_PERIPHD | PIO_CFG_DEFAULT | PIO_PORT_PIOB | PIO_PIN3)
@ -601,28 +602,28 @@
/* Secure Data Memory Card - SDMMC */
#define PIO_SDMMC0_CD (PIO_PERIPHA | PIO_CFG_DEFAULT | PIO_PORT_PIOA | PIO_PIN13)
#define PIO_SDMMC0_CD (PIO_PERIPHA | PIO_CFG_DEFAULT | PIO_PORT_PIOA | PIO_PIN13 | PIO_CFG_DEGLITCH | PIO_INT_BOTHEDGES | PIO_INPUT )
#define PIO_SDMMC0_CK (PIO_PERIPHA | PIO_CFG_DEFAULT | PIO_PORT_PIOA | PIO_PIN0)
#define PIO_SDMMC0_CMD (PIO_PERIPHA | PIO_CFG_DEFAULT | PIO_PORT_PIOA | PIO_PIN1)
#define PIO_SDMMC0_DAT0 (PIO_PERIPHA | PIO_CFG_DEFAULT | PIO_PORT_PIOA | PIO_PIN2)
#define PIO_SDMMC0_DAT1 (PIO_PERIPHA | PIO_CFG_DEFAULT | PIO_PORT_PIOA | PIO_PIN3)
#define PIO_SDMMC0_DAT2 (PIO_PERIPHA | PIO_CFG_DEFAULT | PIO_PORT_PIOA | PIO_PIN4)
#define PIO_SDMMC0_DAT3 (PIO_PERIPHA | PIO_CFG_DEFAULT | PIO_PORT_PIOA | PIO_PIN5)
#define PIO_SDMMC0_DAT4 (PIO_PERIPHA | PIO_CFG_DEFAULT | PIO_PORT_PIOA | PIO_PIN6)
#define PIO_SDMMC0_DAT5 (PIO_PERIPHA | PIO_CFG_DEFAULT | PIO_PORT_PIOA | PIO_PIN7)
#define PIO_SDMMC0_DAT6 (PIO_PERIPHA | PIO_CFG_DEFAULT | PIO_PORT_PIOA | PIO_PIN8)
#define PIO_SDMMC0_DAT7 (PIO_PERIPHA | PIO_CFG_DEFAULT | PIO_PORT_PIOA | PIO_PIN9)
#define PIO_SDMMC0_CMD (PIO_PERIPHA | PIO_CFG_PULLUP | PIO_PORT_PIOA | PIO_PIN1)
#define PIO_SDMMC0_DAT0 (PIO_PERIPHA | PIO_CFG_PULLUP | PIO_PORT_PIOA | PIO_PIN2)
#define PIO_SDMMC0_DAT1 (PIO_PERIPHA | PIO_CFG_PULLUP | PIO_PORT_PIOA | PIO_PIN3)
#define PIO_SDMMC0_DAT2 (PIO_PERIPHA | PIO_CFG_PULLUP | PIO_PORT_PIOA | PIO_PIN4)
#define PIO_SDMMC0_DAT3 (PIO_PERIPHA | PIO_CFG_PULLUP | PIO_PORT_PIOA | PIO_PIN5)
#define PIO_SDMMC0_DAT4 (PIO_PERIPHA | PIO_CFG_PULLUP | PIO_PORT_PIOA | PIO_PIN6)
#define PIO_SDMMC0_DAT5 (PIO_PERIPHA | PIO_CFG_PULLUP | PIO_PORT_PIOA | PIO_PIN7)
#define PIO_SDMMC0_DAT6 (PIO_PERIPHA | PIO_CFG_PULLUP | PIO_PORT_PIOA | PIO_PIN8)
#define PIO_SDMMC0_DAT7 (PIO_PERIPHA | PIO_CFG_PULLUP | PIO_PORT_PIOA | PIO_PIN9)
#define PIO_SDMMC0_RSTN (PIO_PERIPHA | PIO_CFG_DEFAULT | PIO_PORT_PIOA | PIO_PIN10)
#define PIO_SDMMC0_VDDSEL (PIO_PERIPHA | PIO_CFG_DEFAULT | PIO_PORT_PIOA | PIO_PIN11)
#define PIO_SDMMC0_WP (PIO_PERIPHA | PIO_CFG_DEFAULT | PIO_PORT_PIOA | PIO_PIN12)
#define PIO_SDMMC1_CD (PIO_PERIPHE | PIO_CFG_DEFAULT | PIO_PORT_PIOA | PIO_PIN30)
#define PIO_SDMMC1_CK (PIO_PERIPHE | PIO_CFG_DEFAULT | PIO_PORT_PIOA | PIO_PIN22)
#define PIO_SDMMC1_CMD (PIO_PERIPHE | PIO_CFG_DEFAULT | PIO_PORT_PIOA | PIO_PIN28)
#define PIO_SDMMC1_DAT0 (PIO_PERIPHE | PIO_CFG_DEFAULT | PIO_PORT_PIOA | PIO_PIN18)
#define PIO_SDMMC1_DAT1 (PIO_PERIPHE | PIO_CFG_DEFAULT | PIO_PORT_PIOA | PIO_PIN19)
#define PIO_SDMMC1_DAT2 (PIO_PERIPHE | PIO_CFG_DEFAULT | PIO_PORT_PIOA | PIO_PIN20)
#define PIO_SDMMC1_DAT3 (PIO_PERIPHE | PIO_CFG_DEFAULT | PIO_PORT_PIOA | PIO_PIN21)
#define PIO_SDMMC1_CMD (PIO_PERIPHE | PIO_CFG_PULLUP | PIO_PORT_PIOA | PIO_PIN28)
#define PIO_SDMMC1_DAT0 (PIO_PERIPHE | PIO_CFG_PULLUP | PIO_PORT_PIOA | PIO_PIN18)
#define PIO_SDMMC1_DAT1 (PIO_PERIPHE | PIO_CFG_PULLUP | PIO_PORT_PIOA | PIO_PIN19)
#define PIO_SDMMC1_DAT2 (PIO_PERIPHE | PIO_CFG_PULLUP | PIO_PORT_PIOA | PIO_PIN20)
#define PIO_SDMMC1_DAT3 (PIO_PERIPHE | PIO_CFG_PULLUP | PIO_PORT_PIOA | PIO_PIN21)
#define PIO_SDMMC1_RSTN (PIO_PERIPHE | PIO_CFG_DEFAULT | PIO_PORT_PIOA | PIO_PIN27)
#define PIO_SDMMC1_WP (PIO_PERIPHE | PIO_CFG_DEFAULT | PIO_PORT_PIOA | PIO_PIN29)

View file

@ -0,0 +1,603 @@
/****************************************************************************
* arch/arm/src/sama5/hardware/sam_sdmmc.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
#ifndef __ARCH_ARM_SRC_SAMA5_HARDWARE_SAMA5_SDMMC_H
#define __ARCH_ARM_SRC_SAMA5_HARDWARE_SAMA5_SDMMC_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include "chip.h"
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* Register Offsets *********************************************************/
#define SAMA5_SDMMC_DSADDR_OFFSET 0x0000 /* DMA System Address Register */
#define SAMA5_SDMMC_BLKATTR_OFFSET 0x0004 /* Block Size Register */
#define SAMA5_SDMMC_BSR_OFFSET 0x0004 /* Block Size Register */
#define SAMA5_SDMMC_BCR_OFFSET 0x0006 /* Block Count Register */
#define SAMA5_SDMMC_CMDARG_OFFSET 0x0008 /* Command Argument Register */
#define SAMA5_SDMMC_XFERTYP_OFFSET 0x000c /* Transfer Type Register SAMA5: Transfer Mode Register */
#define SAMA5_SDMMC_CMDRSP0_OFFSET 0x0010 /* Command Response 0 */
#define SAMA5_SDMMC_CMDRSP1_OFFSET 0x0014 /* Command Response 1 */
#define SAMA5_SDMMC_CMDRSP2_OFFSET 0x0018 /* Command Response 2 */
#define SAMA5_SDMMC_CMDRSP3_OFFSET 0x001c /* Command Response 3 */
#define SAMA5_SDMMC_DATAPORT_OFFSET 0x0020 /* Buffer Data Port Register */
#define SAMA5_SDMMC_PRSSTAT_OFFSET 0x0024 /* Present State Register */
#define SAMA5_SDMMC_PROCTL_OFFSET 0x0028 /* Protocol Control Register */
#define SAMA5_SDMMC_PWRCTL_OFFSET 0x0029 /* Power Control Control Register */
#define SAMA5_SDMMC_SYSCTL_OFFSET 0x002c /* System Control Register, or Clock Control Register/Timout Control Register */
#define SAMA5_SDMMC_TCR_OFFSET 0x002e /* Timout Control Register (8 bit) */
#define SAMA5_SDMMC_SRR_OFFSET 0x002f /* Software Reset Register (8 bit) */
#define SAMA5_SDMMC_IRQSTAT_OFFSET 0x0030 /* Interrupt Status Register */
#define SAMA5_SDMMC_IRQSTATEN_OFFSET 0x0034 /* Interrupt Status Enable Register */
#define SAMA5_SDMMC_EISTER_OFFSET 0x0036 /* SAMA5: Error Interrupt Status Register */
#define SAMA5_SDMMC_IRQSIGEN_OFFSET 0x0038 /* Interrupt Signal Enable Register */
#define SAMA5_SDMMC_AC12ERR_OFFSET 0x003c /* Auto CMD12 Error Status Register */
#define SAMA5_SDMMC_H2CR_OFFSET 0x003e /* Host Control 2 Register */
#define SAMA5_SDMMC_HTCAPBLT0_OFFSET 0x0040 /* Host Controller Capabilities 0 Register */
#define SAMA5_SDMMC_HTCAPBLT1_OFFSET 0x0044 /* Host Controller Capabilities 1 Register */
#define SAMA5_SDMMC_MIX_OFFSET 0x0048 /* Mixer Control Register SAMA5: Maximum Current Capabililities Register */
#define SAMA5_SDMMC_FEVT_OFFSET 0x0050 /* Force Event Register */
#define SAMA5_SDMMC_ADMAES_OFFSET 0x0054 /* ADMA Error Status Register */
#define SAMA5_SDMMC_ADSADDR_OFFSET 0x0058 /* ADMA System Address Register */
#define SAMA5_SDMMC_DLL_CONTROL_OFFSET 0x0060 /* DLL Control Register */
#define SAMA5_SDMMC_DLL_STATUS_OFFSET 0x0064 /* DLL Status Register */
#define SAMA5_SDMMC_CLK_TUNE_CTRL_OFFSET 0x0068 /* Clock tuning control Register */
/* 0x0070 0x00f8: reserved */
#define SAMA5_SDMMC_HOST_VERSION_OFFSET 0x00fe /* Host Controller Version Register */
#define SAMA5_SDMMC_APSR_OFFSET 0x0200 /* Additional Present State Register */
#define SAMA5_SDMMC_MC1R_OFFSET 0x0204 /* e.MMC Control 1 Register */
#define SAMA5_SDMMC_MC2R_OFFSET 0x0205 /* e.MMC Control 2 Register */
#define SAMA5_SDMMC_ACR_OFFSET 0x0208 /* AHB Control Register */
#define SAMA5_SDMMC_CC2R_OFFSET 0x020C /* Clock Control 2 Register */
#define SAMA5_SDMMC_RTC1R_OFFSET 0x0210 /* Retuning Timer Control 1 Register */
#define SAMA5_SDMMC_RTC2R_OFFSET 0x0211 /* Retuning Timer Control 2 Register */
#define SAMA5_SDMMC_RTCVR_OFFSET 0x0214 /* Retuning Timer Counter Value Register */
#define SAMA5_SDMMC_RTISTER_OFFSET 0x0218 /* Retuning Timer Interrupt Status Enable Register */
#define SAMA5_SDMMC_RTISIER_OFFSET 0x0219 /* Retuning Timer Interrupt Signal Enable Register */
#define SAMA5_SDMMC_RTISTR_OFFSET 0x021C /* Retuning Timer Interrupt Status Register */
#define SAMA5_SDMMC_RTSSR_OFFSET 0x021D /* Retuning Timer Status Slots Register */
#define SAMA5_SDMMC_TUNCR_OFFSET 0x0220 /* Tuning Control Register */
/* 0x0224 0x022C Reserved */
#define SAMA5_SDMMC_CACR_OFFSET 0x0230 /* Capabilities Control Register */
/* 0x0234 0x023C Reserved */
#define SAMA5_SDMMC_CALCR_OFFSET 0x0240 /* Calibration Control Register */
/* Register Addresses *******************************************************/
/* For SDMMC0... */
#define SAMA5_SDMMC0_DSADDR (SAM_SDMMC0_VBASE + SAMA5_SDMMC_DSADDR_OFFSET)
#define SAMA5_SDMMC0_BLKATTR (SAM_SDMMC0_VBASE + SAMA5_SDMMC_BLKATTR_OFFSET)
#define SAMA5_SDMMC0_CMDARG (SAM_SDMMC0_VBASE + SAMA5_SDMMC_CMDARG_OFFSET)
#define SAMA5_SDMMC0_XFERTYP (SAM_SDMMC0_VBASE + SAMA5_SDMMC_XFERTYP_OFFSET)
#define SAMA5_SDMMC0_CMDRSP0 (SAM_SDMMC0_VBASE + SAMA5_SDMMC_CMDRSP0_OFFSET)
#define SAMA5_SDMMC0_CMDRSP1 (SAM_SDMMC0_VBASE + SAMA5_SDMMC_CMDRSP1_OFFSET)
#define SAMA5_SDMMC0_CMDRSP2 (SAM_SDMMC0_VBASE + SAMA5_SDMMC_CMDRSP2_OFFSET)
#define SAMA5_SDMMC0_CMDRSP3 (SAM_SDMMC0_VBASE + SAMA5_SDMMC_CMDRSP3_OFFSET)
#define SAMA5_SDMMC0_DATAPORT (SAM_SDMMC0_VBASE + SAMA5_SDMMC_DATAPORT_OFFSET)
#define SAMA5_SDMMC0_PRSSTAT (SAM_SDMMC0_VBASE + SAMA5_SDMMC_PRSSTAT_OFFSET)
#define SAMA5_SDMMC0_PROCTL (SAM_SDMMC0_VBASE + SAMA5_SDMMC_PROCTL_OFFSET)
#define SAMA5_SDMMC0_PWRCTL (SAM_SDMMC0_VBASE + SAMA5_SDMMC_PWRCTL_OFFSET)
#define SAMA5_SDMMC0_SYSCTL (SAM_SDMMC0_VBASE + SAMA5_SDMMC_SYSCTL_OFFSET)
#define SAMA5_SDMMC0_IRQSTAT (SAM_SDMMC0_VBASE + SAMA5_SDMMC_IRQSTAT_OFFSET)
#define SAMA5_SDMMC0_IRQSTATEN (SAM_SDMMC0_VBASE + SAMA5_SDMMC_IRQSTATEN_OFFSET)
#define SAMA5_SDMMC0_IRQSIGEN (SAM_SDMMC0_VBASE + SAMA5_SDMMC_IRQSIGEN_OFFSET)
#define SAMA5_SDMMC0_AC12ERR (SAM_SDMMC0_VBASE + SAMA5_SDMMC_AC12ERR_OFFSET)
#define SAMA5_SDMMC0_HTCAPBLT0 (SAM_SDMMC0_VBASE + SAMA5_SDMMC_HTCAPBLT0_OFFSET)
#define SAMA5_SDMMC0_HTCAPBLT1 (SAM_SDMMC0_VBASE + SAMA5_SDMMC_HTCAPBLT1_OFFSET)
#define SAMA5_SDMMC0_MIX (SAM_SDMMC0_VBASE + SAMA5_SDMMC_MIX_OFFSET)
#define SAMA5_SDMMC0_FEVT (SAM_SDMMC0_VBASE + SAMA5_SDMMC_FEVT_OFFSET)
#define SAMA5_SDMMC0_ADMAES (SAM_SDMMC0_VBASE + SAMA5_SDMMC_ADMAES_OFFSET)
#define SAMA5_SDMMC0_ADSADDR (SAM_SDMMC0_VBASE + SAMA5_SDMMC_ADSADDR_OFFSET)
#define SAMA5_SDMMC_DLL_CONTROL (SAM_SDMMC0_VBASE + SAMA5_SDMMC_DLL_CONTROL_OFFSET)
#define SAMA5_SDMMC_DLL_STATUS (SAM_SDMMC0_VBASE + SAMA5_SDMMC_DLL_STATUS)
#define SAMA5_SDMMC_CLK_TUNE_CTRL (SAM_SDMMC0_VBASE + SAMA5_SDMMC_CLK_TUNE_CTRL)
#define SAMA5_SDMMC0_VENDOR (SAM_SDMMC0_VBASE + SAMA5_SDMMC_VENDOR_OFFSET)
#define SAMA5_SDMMC0_MMCBOOT (SAM_SDMMC0_VBASE + SAMA5_SDMMC_MMCBOOT_OFFSET)
#define SAMA5_SDMMC0_VENDOR2 (SAM_SDMMC0_VBASE + SAMA5_SDMMC_VENDOR2_OFFSET)
#define SAMA5_SDMMC0_TC (SAM_SDMMC0_VBASE + SAMA5_SDMMC_TC_OFFSET)
/* For SDMMC1... */
#define SAMA5_SDMMC1_DSADDR (SAM_SDMMC1_VBASE + SAMA5_SDMMC_DSADDR_OFFSET)
#define SAMA5_SDMMC1_BLKATTR (SAM_SDMMC1_VBASE + SAMA5_SDMMC_BLKATTR_OFFSET)
#define SAMA5_SDMMC1_CMDARG (SAM_SDMMC1_VBASE + SAMA5_SDMMC_CMDARG_OFFSET)
#define SAMA5_SDMMC1_XFERTYP (SAM_SDMMC1_VBASE + SAMA5_SDMMC_XFERTYP_OFFSET)
#define SAMA5_SDMMC1_CMDRSP0 (SAM_SDMMC1_VBASE + SAMA5_SDMMC_CMDRSP0_OFFSET)
#define SAMA5_SDMMC1_CMDRSP1 (SAM_SDMMC1_VBASE + SAMA5_SDMMC_CMDRSP1_OFFSET)
#define SAMA5_SDMMC1_CMDRSP2 (SAM_SDMMC1_VBASE + SAMA5_SDMMC_CMDRSP2_OFFSET)
#define SAMA5_SDMMC1_CMDRSP3 (SAM_SDMMC1_VBASE + SAMA5_SDMMC_CMDRSP3_OFFSET)
#define SAMA5_SDMMC1_DATAPORT (SAM_SDMMC1_VBASE + SAMA5_SDMMC_DATPORT_OFFSET)
#define SAMA5_SDMMC1_PRSSTAT (SAM_SDMMC1_VBASE + SAMA5_SDMMC_PRSSTAT_OFFSET)
#define SAMA5_SDMMC1_PROCTL (SAM_SDMMC1_VBASE + SAMA5_SDMMC_PROCTL_OFFSET)
#define SAMA5_SDMMC1_PWRCTL (SAM_SDMMC1_VBASE + SAMA5_SDMMC_PWRCTL_OFFSET)
#define SAMA5_SDMMC1_SYSCTL (SAM_SDMMC1_VBASE + SAMA5_SDMMC_SYSCTL_OFFSET)
#define SAMA5_SDMMC1_IRQSTAT (SAM_SDMMC1_VBASE + SAMA5_SDMMC_IRQSTAT_OFFSET)
#define SAMA5_SDMMC1_IRQSTATEN (SAM_SDMMC1_VBASE + SAMA5_SDMMC_IRQSTATEN_OFFSET)
#define SAMA5_SDMMC1_IRQSIGEN (SAM_SDMMC1_VBASE + SAMA5_SDMMC_IRQSIGEN_OFFSET)
#define SAMA5_SDMMC1_AC12ERR (SAM_SDMMC1_VBASE + SAMA5_SDMMC_AC12ERR_OFFSET)
#define SAMA5_SDMMC1_HTCAPBLT0 (SAM_SDMMC1_VBASE + SAMA5_SDMMC_HTCAPBLT0_OFFSET)
#define SAMA5_SDMMC1_HTCAPBLT1 (SAM_SDMMC1_VBASE + SAMA5_SDMMC_HTCAPBLT1_OFFSET)
#define SAMA5_SDMMC1_FEVT (SAM_SDMMC1_VBASE + SAMA5_SDMMC_FEVT_OFFSET)
#define SAMA5_SDMMC1_ADMAES (SAM_SDMMC1_VBASE + SAMA5_SDMMC_ADMAES_OFFSET)
#define SAMA5_SDMMC1_ADSADDR (SAM_SDMMC1_VBASE + SAMA5_SDMMC_ADSADDR_OFFSET)
#define SAMA5_SDMMC1_DLL_CONTROL (SAM_SDMMC1_VBASE + SAMA5_SDMMC_DLL_CONTROL_OFFSET)
#define SAMA5_SDMMC1_DLL_STATUS (SAM_SDMMC1_VBASE + SAMA5_SDMMC_DLL_STATUS)
#define SAMA5_USSDHC_CLK_TUNE_CTRL (SAM_SDMMC1_VBASE + SAMA5_SDMMC_CLK_TUNE_CTRL)
#define SAMA5_SDMMC1_VENDOR (SAM_SDMMC1_VBASE + SAMA5_SDMMC_VENDOR_OFFSET)
#define SAMA5_SDMMC1_MMCBOOT (SAM_SDMMC1_VBASE + SAMA5_SDMMC_MMCBOOT_OFFSET)
#define SAMA5_SDMMC1_VENDOR2 (SAM_SDMMC1_VBASE + SAMA5_SDMMC_VENDOR2_OFFSET)
#define SAMA5_SDMMC1_TC (SAM_SDMMC1_VBASE + SAMA5_SDMMC_TC_OFFSET)
/* Register Bit Definitions *************************************************/
/* DMA System Address Register */
#define SDMMC_DSADDR_SHIFT (0) /* Bits 2-31: DMA System Address */
#define SDMMC_DSADDR_MASK (0xfffffffc) /* Bits 0-1: 32 bit aligned, low bits Reserved */
/* Block Attributes Register */
#define SDMMC_BSR_BLKSIZE_SHIFT (0) /* Bits 0-9: Transfer Block Size */
/* Bits 10-11: Reserved */
#define SDMMC_BSR_BOUNDARY_SHIFT (12) /* Bits 12-14: Boundary */
/* Bit 15: Reserved */
/* Block Count Register (16-bit block count) */
/* Command Argument Register (32-bit cmd/arg data) */
/* Transfer Type Register */
#define SDMMC_XFERTYP_DMAEN (1 << 0) /* Bit 0: DMA Enable */
#define SDMMC_XFERTYP_BCEN (1 << 1) /* Bit 1: Block Count Enable */
#define SDMMC_XFERTYP_AC12EN (1 << 2) /* Bit 2: Auto CMD12 Enable */
/* Bit 3: Reserved */
#define SDMMC_XFERTYP_DTDSEL (1 << 4) /* Bit 4: Data Transfer Direction Select */
#define SDMMC_XFERTYP_MSBSEL (1 << 5) /* Bit 5: Multi/Single Block Select */
/* Bits 6-15: Reserved */
#define SDMMC_XFERTYP_RSPTYP_SHIFT (16) /* Bits 16-17: Response Type Select */
#define SDMMC_XFERTYP_RSPTYP_MASK (3 << SDMMC_XFERTYP_RSPTYP_SHIFT)
# define SDMMC_XFERTYP_RSPTYP_NONE (0 << SDMMC_XFERTYP_RSPTYP_SHIFT) /* No response */
# define SDMMC_XFERTYP_RSPTYP_LEN136 (1 << SDMMC_XFERTYP_RSPTYP_SHIFT) /* Response length 136 */
# define SDMMC_XFERTYP_RSPTYP_LEN48 (2 << SDMMC_XFERTYP_RSPTYP_SHIFT) /* Response length 48 */
# define SDMMC_XFERTYP_RSPTYP_LEN48BSY (3 << SDMMC_XFERTYP_RSPTYP_SHIFT) /* Response length 48, check busy */
/* Bit 18: Reserved */
#define SDMMC_XFERTYP_CCCEN (1 << 19) /* Bit 19: Command CRC Check Enable */
#define SDMMC_XFERTYP_CICEN (1 << 20) /* Bit 20: Command Index Check Enable */
#define SDMMC_XFERTYP_DPSEL (1 << 21) /* Bit 21: Data Present Select */
#define SDMMC_XFERTYP_CMDTYP_SHIFT (22) /* Bits 22-23: Command Type */
#define SDMMC_XFERTYP_CMDTYP_MASK (3 << SDMMC_XFERTYP_CMDTYP_SHIFT)
# define SDMMC_XFERTYP_CMDTYP_NORMAL (0 << SDMMC_XFERTYP_CMDTYP_SHIFT) /* Normal other commands */
# define SDMMC_XFERTYP_CMDTYP_SUSPEND (1 << SDMMC_XFERTYP_CMDTYP_SHIFT) /* Suspend CMD52 for writing bus suspend in CCCR */
# define SDMMC_XFERTYP_CMDTYP_RESUME (2 << SDMMC_XFERTYP_CMDTYP_SHIFT) /* Resume CMD52 for writing function select in CCCR */
# define SDMMC_XFERTYP_CMDTYP_ABORT (3 << SDMMC_XFERTYP_CMDTYP_SHIFT) /* Abort CMD12, CMD52 for writing I/O abort in CCCR */
#define SDMMC_XFERTYP_CMDINX_SHIFT (24) /* Bits 24-29: Command Index */
#define SDMMC_XFERTYP_CMDINX_MASK (0x3f << SDMMC_XFERTYP_CMDINX_SHIFT)
/* Bits 30-31: Reserved */
/* Command Response 0-3 (32-bit response data) */
/* Buffer Data Port Register (32-bit data content) */
/* Present State Register */
#define SDMMC_PRSSTAT_CIHB (1 << 0) /* Bit 0: Command Inhibit (CMD) */
#define SDMMC_PRSSTAT_CDIHB (1 << 1) /* Bit 1: Command Inhibit (DAT) */
#define SDMMC_PRSSTAT_DLA (1 << 2) /* Bit 2: Data Line Active */
#define SDMMC_PRSSTAT_SDSTB (1 << 3) /* Bit 3: Unused in SAMA5 */
#define SDMMC_PRSSTAT_IPGOFF (1 << 4) /* Bit 4: Unused */
#define SDMMC_PRSSTAT_HCKOFF (1 << 5) /* Bit 5: Unused */
#define SDMMC_PRSSTAT_PEROFF (1 << 6) /* Bit 6: Unused */
#define SDMMC_PRSSTAT_SDOFF (1 << 7) /* Bit 7: Unused */
#define SDMMC_PRSSTAT_WTA (1 << 8) /* Bit 8: Write Transfer Active */
#define SDMMC_PRSSTAT_RTA (1 << 9) /* Bit 9: Read Transfer Active */
#define SDMMC_PRSSTAT_BWEN (1 << 10) /* Bit 10: Buffer Write Enable */
#define SDMMC_PRSSTAT_BREN (1 << 11) /* Bit 11: Buffer Read Enable */
#define SDMMC_PRSSTAT_RTR (1 << 12) /* Bit 12: Retuning request */
/* Bits 13-14: Reserved */
#define SDMMC_PRSSTAT_TSCD (1 << 15) /* Bit 15: Tape Select Change Done */
#define SDMMC_PRSSTAT_CINS (1 << 16) /* Bit 16: Card Inserted */
/* Bit 17: Reserved */
#define SDMMC_PRSSTAT_CDPL (1 << 18) /* Bit 18: Card Detect Pin Level */
#define SDMMC_PRSSTAT_WPSPL (1 << 19) /* Bit 19: Write Protect Switch Pin Level */
#define SDMMC_PRSSTAT_CLSL (1 << 24) /* Bit 24: CMD Line Signal Level */
/* Bits 25-31: Reserved */
#define SDMMC_PRSSTAT_DLSL_SHIFT (20) /* Bits 20-23: DAT Line Signal Level */
#define SDMMC_PRSSTAT_DLSL_MASK (0x0f << SDMMC_PRSSTAT_DLSL_SHIFT)
# define SDMMC_PRSSTAT_DLSL_DAT0 (0x01 << SDMMC_PRSSTAT_DLSL_SHIFT)
# define SDMMC_PRSSTAT_DLSL_DAT1 (0x02 << SDMMC_PRSSTAT_DLSL_SHIFT)
# define SDMMC_PRSSTAT_DLSL_DAT2 (0x04 << SDMMC_PRSSTAT_DLSL_SHIFT)
# define SDMMC_PRSSTAT_DLSL_DAT3 (0x08 << SDMMC_PRSSTAT_DLSL_SHIFT)
/* Protocol Control Register */
#define SDMMC_PROCTL_LCTL (1 << 0) /* Bit 0: LED Control */
#define SDMMC_PROCTL_DTW_SHIFT (1) /* Bit 1: Data Transfer Width */
#define SDMMC_PROCTL_DTW_MASK (1 << SDMMC_PROCTL_DTW_SHIFT)
# define SDMMC_PROCTL_DTW_1BIT (0 << SDMMC_PROCTL_DTW_SHIFT) /* 1-bit mode */
# define SDMMC_PROCTL_DTW_4BIT (1 << SDMMC_PROCTL_DTW_SHIFT) /* 4-bit mode */
#define SDMMC_PROCTL_HSEN (1 << 2) /* Bit 2: High Speed Enable */
#define SDMMC_PROCTL_DMAS_SHIFT (3) /* Bits 3-4: DMA Select */
#define SDMMC_PROCTL_DMAS_MASK (3 << SDMMC_PROCTL_DMAS_SHIFT)
# define SDMMC_PROCTL_DMAS_SDMA (0 << SDMMC_PROCTL_DMAS_SHIFT) /* No DMA or simple DMA is selected */
# define SDMMC_PROCTL_DMAS_RES1 (1 << SDMMC_PROCTL_DMAS_SHIFT) /* Reserved */
# define SDMMC_PROCTL_DMAS_ADMA (2 << SDMMC_PROCTL_DMAS_SHIFT) /* ADMA is selected */
# define SDMMC_PROCTL_DMAS_RES2 (1 << SDMMC_PROCTL_DMAS_SHIFT) /* Reserved */
#define SDMMC_PROCTL_EXTDW_SHIFT (5) /* Bits 3-4: DMA Select */
#define SDMMC_PROCTL_EXTDW_MASK (1 << SDMMC_PROCTL_EXTDW_SHIFT)
/* Bits 6-7: Reserved */
#define SDMMC_PROCTL_SDBPWR_SHIFT (9) /* Bits 3-4: SD Bus Power */
#define SDMMC_PROCTL_SDBPWR_MASK (1 << SDMMC_PROCTL_SDBPWR_SHIFT)
/* Bits 10-15: Reserved */
#define SDMMC_PROCTL_SABGREQ (1 << 16) /* Bit 16: Stop At Block Gap Request */
#define SDMMC_PROCTL_CREQ (1 << 17) /* Bit 17: Continue Request */
#define SDMMC_PROCTL_RWCTL (1 << 18) /* Bit 18: Read Wait Control */
#define SDMMC_PROCTL_IABG (1 << 19) /* Bit 19: Interrupt At Block Gap */
#define SDMMC_PROCTL_RDDONENO8CLK (1 << 20) /* Bit 20: Read done to 8 clock */
#define SDMMC_PROCTL_RESV2023 (4 << 21) /* Bits 21-23: Reserved, write as 0x100 */
#define SDMMC_PROCTL_WECINT (1 << 24) /* Bit 24: Wakeup Event Enable On Card Interrupt */
#define SDMMC_PROCTL_WECINS (1 << 25) /* Bit 25: Wakeup Event Enable On SD Card Insertion */
#define SDMMC_PROCTL_WECRM (1 << 26) /* Bit 26: Wakeup Event Enable On SD Card Removal */
#define SDMMC_PROCTL_BURST_SHIFT (27) /* Bits 27-29: Burst Length */
#define SDMMC_PROCTL_BURST_MASK (7 << SDMMC_PROCTL_BUSRT_SHIFT)
# define SDMMC_PROCTL_BURST_INCR (1 << SDMMC_PROCTL_BURST_SHIFT) /* Burst for Incr */
# define SDMMC_PROCTL_BURST_4816 (2 << SDMMC_PROCTL_BURST_SHIFT) /* Burst for 4/8/16 */
# define SDMMC_PROCTL_BURST_4W8W16W (4 << SDMMC_PROCTL_BURST_SHIFT) /* Burst for 4w/8w/16w */
#define SDMMC_PROTCTL_NEBLKRD (1 << 30) /* Bit 30: Non-exect block read */
/* Bit 31: Reserved */
/* Power Control Register */
#define SDMMC_POWER_ON (0x01)
#define SDMMC_POWER_180 (0x0a)
#define SDMMC_POWER_300 (0x0c)
#define SDMMC_POWER_330 (0x0e)
/* System Control Register */
#define SDMMC_SYSCTL_INTCLKEN (1 << 0) /* Bit 0: Internal Clock Enable */
#define SDMMC_SYSCTL_INTCLKS (1 << 1) /* Bit 1: Internal Clock Stable */
#define SDMMC_SYSCTL_SDCLKEN (1 << 2) /* Bit 2: SD Clock Enable */
#define SDMMC_SYSCTL_CLKGSEL (1 << 5) /* Bit 5: Clock Generator Select */
#define SDMMC_SYSCTL_USDCLKFSEL (3 << 6) /* Bit 0: Upper bits of SDCLK Frequency Select */
#define SDMMC_SYSCTL_CLKFSEL (0xf0) /* Bit 0: SDCLK Frequency Select */
#define SDMMC_CLOCK_MUL_MASK (0x00ff0000)
#define SDMMC_CLOCK_MUL_SHIFT (16)
#define SDMMC_SYSCTL_DVS_SHIFT (4) /* Bits 4-7: Divisor */
#define SDMMC_SYSCTL_DVS_MASK (0x0f << SDMMC_SYSCTL_DVS_SHIFT)
# define SDMMC_SYSCTL_DVS_DIV(n) (((n) - 1) << SDMMC_SYSCTL_DVS_SHIFT) /* Divide by n, n=1..16 */
#define SDMMC_SYSCTL_SDCLKFS_SHIFT (8) /* Bits 8-15: SDCLK Frequency Select */
#define SDMMC_SYSCTL_SDCLKFS_MASK (0xff << SDMMC_SYSCTL_SDCLKFS_SHIFT)
# define SDMMC_SYSCTL_SDCLKFS_BYPASS (0x00 << SDMMC_SYSCTL_SDCLKFS_SHIFT) /* Bypass the prescaler */
# define SDMMC_SYSCTL_SDCLKFS_DIV2 (0x01 << SDMMC_SYSCTL_SDCLKFS_SHIFT) /* Base clock / 2 */
# define SDMMC_SYSCTL_SDCLKFS_DIV4 (0x02 << SDMMC_SYSCTL_SDCLKFS_SHIFT) /* Base clock / 4 */
# define SDMMC_SYSCTL_SDCLKFS_DIV8 (0x04 << SDMMC_SYSCTL_SDCLKFS_SHIFT) /* Base clock / 8 */
# define SDMMC_SYSCTL_SDCLKFS_DIV16 (0x08 << SDMMC_SYSCTL_SDCLKFS_SHIFT) /* Base clock / 16 */
# define SDMMC_SYSCTL_SDCLKFS_DIV32 (0x10 << SDMMC_SYSCTL_SDCLKFS_SHIFT) /* Base clock / 32 */
# define SDMMC_SYSCTL_SDCLKFS_DIV64 (0x20 << SDMMC_SYSCTL_SDCLKFS_SHIFT) /* Base clock / 64 */
# define SDMMC_SYSCTL_SDCLKFS_DIV128 (0x40 << SDMMC_SYSCTL_SDCLKFS_SHIFT) /* Base clock / 128 */
# define SDMMC_SYSCTL_SDCLKFS_DIV256 (0x80 << SDMMC_SYSCTL_SDCLKFS_SHIFT) /* Base clock / 256 */
#define SDMMC_SYSCTL_DTOCV_SHIFT (16) /* Bits 16-19: Data Timeout Counter Value */
#define SDMMC_SYSCTL_DTOCV_MASK (0x0f << SDMMC_SYSCTL_DTOCV_SHIFT)
# define SDMMC_SYSCTL_DTOCV_MUL(n) (((n) - 213) << SDMMC_SYSCTL_DTOCV_SHIFT) /* SDCLK x n, n=213..227 */
/* Bits 20-22: Reserved */
#define SDMMC_SYSCTL_IPPRSTN (1 << 23) /* Bit 23: Card /reset (default 1) */
#define SDMMC_SYSCTL_RSTA (1 << 24) /* Bit 24: Software Reset For ALL */
#define SDMMC_SYSCTL_RSTC (1 << 25) /* Bit 25: Software Reset For CMD Line */
#define SDMMC_SYSCTL_RSTD (1 << 26) /* Bit 26: Software Reset For DAT Line */
#define SDMMC_SYSCTL_INITA (1 << 27) /* Bit 27: Initialization Active (SAMA5: unused) */
#define SDMMC_SYSCTL_RSTT (1 << 28) /* Bit 28: Reset tuning (SAMA5: unused) */
/* Bits 29-31: Reserved */
#define SDMMC_DIVIDER_SHIFT (8)
#define SDMMC_DIV_MASK (0xff)
#define SDMMC_DIVIDER_HI_SHIFT (6)
#define SDMMC_DIV_MASK_LEN (8)
#define SDMMC_DIV_HI_MASK (0x300)
#define SDMMC_CLOCK_BASE_MASK (0x00003f00)
#define SDMMC_CLOCK_V3_BASE_MASK (0x0000ff00)
#define SDMMC_CLOCK_BASE_SHIFT (8)
/* Timeout Control Register */
#define SDMMC_TCR_MASK (0x0f) /* Bits 0-3 */
/* Interrupt Status Register, Interrupt Status Enable Register and Interrupt
* Signal Enable Register Common interrupt bit definitions
*/
#define SDMMC_INT_CC (1 << 0) /* Bit 0: Command Complete */
#define SDMMC_INT_TC (1 << 1) /* Bit 1: Transfer Complete */
#define SDMMC_INT_BGE (1 << 2) /* Bit 2: Block Gap Event */
#define SDMMC_INT_DINT (1 << 3) /* Bit 3: DMA Interrupt - indicates SDMA Boundary Pause */
#define SDMMC_INT_BWR (1 << 4) /* Bit 4: Buffer Write Ready */
#define SDMMC_INT_BRR (1 << 5) /* Bit 5: Buffer Read Ready */
#define SDMMC_INT_CINS (1 << 6) /* Bit 6: Card Insertion */
#define SDMMC_INT_CRM (1 << 7) /* Bit 7: Card Removal */
#define SDMMC_INT_CINT (1 << 8) /* Bit 8: Card Interrupt */
/* Bits 9-11: Reserved */
#define SDMMC_INT_RTR (1 << 12) /* Bit 12: Re-tuning event */
/* Bit 13: Reserved */
#define SDMMC_INT_TP (1 << 14) /* Bit 14: Tuning pass */
/* Bit 15: Reserved */
#define SDMMC_INT_CTOE (1 << 16) /* Bit 16: Command Timeout Error */
#define SDMMC_INT_CCE (1 << 17) /* Bit 17: Command CRC Error */
#define SDMMC_INT_CEBE (1 << 18) /* Bit 18: Command End Bit Error */
#define SDMMC_INT_CIE (1 << 19) /* Bit 19: Command Index Error */
#define SDMMC_INT_DTOE (1 << 20) /* Bit 20: Data Timeout Error */
#define SDMMC_INT_DCE (1 << 21) /* Bit 21: Data CRC Error */
#define SDMMC_INT_DEBE (1 << 22) /* Bit 22: Data End Bit Error */
#define SDMMC_INT_CURLIM (1 << 23) /* Bit 23: Current Limit Error */
#define SDMMC_INT_AC12E (1 << 24) /* Bit 24: Auto CMD12 Error */
#define SDMMC_INT_ADMAE (1 << 25) /* Bit 25: ADMA error */
/* Bits 26-31: Reserved */
#define SDMMC_INT_ALL 0x117f01ff
/* Auto CMD12 Error Status Register */
#define SDMMC_AC12ERR_NE (1 << 0) /* Bit 0: Auto CMD12 Not Executed */
#define SDMMC_AC12ERR_TOE (1 << 1) /* Bit 1: Auto CMD12 Timeout Error */
#define SDMMC_AC12ERR_EBE (1 << 2) /* Bit 2: Auto CMD12 End Bit Error */
#define SDMMC_AC12ERR_CE (1 << 3) /* Bit 3: Auto CMD12 CRC Error */
#define SDMMC_AC12ERR_IE (1 << 4) /* Bit 4: Auto CMD12 Index Error */
/* Bits 5-6: Reserved */
#define SDMMC_AC12ERR_CNI (1 << 7) /* Bit 7: Command Not Issued By Auto CMD12 Error */
/* Bits 8-21: Reserved */
#define SDMMC_AC12ERR_EXECUTE_TUNING (1 << 22) /* Bit 22: Execute Tuning */
#define SDMMC_AC12ERR_SMP_CLK_SEL (1 << 23) /* Bit 23: Sample clock sel */
/* Bits 24-31: Reserved */
/* Host Controller Capabilities */
#define SDMMC_HTCAPBLT_SDR50 (1 << 0) /* Bit 0: SDR50 support indication */
#define SDMMC_HTCAPBLT_SDR104 (1 << 1) /* Bit 1: SDR104 support indication */
#define SDMMC_HTCAPBLT_DDR50 (1 << 2) /* Bit 2: DDR50 support indication */
/* Bits 3-7: Reserved */
#define SDMMC_HTCAPBLT_TCR_SHIFT (8) /* Bits 8-11: Time count retuning */
#define SDMMC_HTCAPBLT_TCR_MASK (0xF << SDMMC_HTCAPBLT_TCR_SHIFT)
# define SDMMC_HTCAPBLT_TCR(n) ((n) << SDMMC_HTCAPBLT_TCR_SHIFT)
#define SDMMC_HTCAPBLT_USE_TUNING_SDR50 (1 << 13) /* Bit 13: Use tuning for SDR50 */
#define SDMMC_HTCAPBLT_RET_MODE_SHIFT (14) /* bit 14-15: Retuning mode */
#define SDMMC_HTCAPBLT_RET_MODE_MASK (3<<SDHC_HTCAPBLT_RET_MODE_SHIFT)
#define SDMMC_HTCAPBLT_RET_MODE_1 (0<<SDHC_HTCAPBLT_RET_MODE_SHIFT)
#define SDMMC_HTCAPBLT_RET_MODE_2 (1<<SDHC_HTCAPBLT_RET_MODE_SHIFT)
#define SDMMC_HTCAPBLT_RET_MODE_3 (2<<SDHC_HTCAPBLT_RET_MODE_SHIFT)
#define SDMMC_HTCAPBLT_MBL_SHIFT (16) /* Bits 16-18: Max Block Length */
#define SDMMC_HTCAPBLT_MBL_MASK (7 << SDMMC_HTCAPBLT_MBL_SHIFT)
# define SDMMC_HTCAPBLT_MBL_512BYTES (0 << SDMMC_HTCAPBLT_MBL_SHIFT)
# define SDMMC_HTCAPBLT_MBL_1KB (1 << SDMMC_HTCAPBLT_MBL_SHIFT)
# define SDMMC_HTCAPBLT_MBL_2KB (2 << SDMMC_HTCAPBLT_MBL_SHIFT)
# define SDMMC_HTCAPBLT_MBL_4KB (3 << SDMMC_HTCAPBLT_MBL_SHIFT)
/* Bit 19: Reserved */
#define SDMMC_HTCAPBLT_ADMAS (1 << 20) /* Bit 20: ADMA Support */
#define SDMMC_HTCAPBLT_HSS (1 << 21) /* Bit 21: High Speed Support */
#define SDMMC_HTCAPBLT_DMAS (1 << 22) /* Bit 22: DMA Support */
#define SDMMC_HTCAPBLT_SRS (1 << 23) /* Bit 23: Suspend/Resume Support */
#define SDMMC_HTCAPBLT_VS33 (1 << 24) /* Bit 24: Voltage Support 3.3 V */
#define SDMMC_HTCAPBLT_VS30 (1 << 25) /* Bit 25: Voltage Support 3.0 V */
#define SDMMC_HTCAPBLT_VS18 (1 << 26) /* Bit 26: Voltage Support 1.8 */
/* Bits 27-31: Reserved */
/* Capabilities 0 Register */
/* Capabilities 1 Register */
/* Force Event Register */
#define SDMMC_FEVT_AC12NE (1 << 0) /* Bit 0: Force Event Auto Command 12 Not Executed */
#define SDMMC_FEVT_AC12TOE (1 << 1) /* Bit 1: Force Event Auto Command 12 Time Out Error */
#define SDMMC_FEVT_AC12CE (1 << 2) /* Bit 2: Force Event Auto Command 12 CRC Error */
#define SDMMC_FEVT_AC12EBE (1 << 3) /* Bit 3: Force Event Auto Command 12 End Bit Error */
#define SDMMC_FEVT_AC12IE (1 << 4) /* Bit 4: Force Event Auto Command 12 Index Error */
/* Bits 5-6: Reserved */
#define SDMMC_FEVT_CNIBAC12E (1 << 7) /* Bit 7: Force Event Command Not Executed By Auto Command 12 Error */
/* Bits 8-15: Reserved */
#define SDMMC_FEVT_CTOE (1 << 16) /* Bit 16: Force Event Command Time Out Error */
#define SDMMC_FEVT_CCE (1 << 17) /* Bit 17: Force Event Command CRC Error */
#define SDMMC_FEVT_CEBE (1 << 18) /* Bit 18: Force Event Command End Bit Error */
#define SDMMC_FEVT_CIE (1 << 19) /* Bit 19: Force Event Command Index Error */
#define SDMMC_FEVT_DTOE (1 << 20) /* Bit 20: Force Event Data Time Out Error */
#define SDMMC_FEVT_DCE (1 << 21) /* Bit 21: Force Event Data CRC Error */
#define SDMMC_FEVT_DEBE (1 << 22) /* Bit 22: Force Event Data End Bit Error */
/* Bit 23: Reserved */
#define SDMMC_FEVT_AC12E (1 << 24) /* Bit 24: Force Event Auto Command 12 Error */
/* Bit 25: Reserved */
#define SDMMC_FEVT_TTNE (1 << 26) /* Bit 26: Force tuning error */
/* Bit 27: reserved */
#define SDMMC_FEVT_DMAE (1 << 28) /* Bit 28: Force Event DMA Error */
/* Bits 29-30: Reserved */
#define SDMMC_FEVT_CINT (1 << 31) /* Bit 31: Force Event Card Interrupt */
/* ADMA Error Status Register */
#define SDMMC_ADMAES_SHIFT (0) /* Bits 0-1: ADMA Error State (when ADMA Error is occurred) */
#define SDMMC_ADMAES_MASK (3 << SDMMC_ADMAES_ADMAES_SHIFT)
# define SDMMC_ADMAES_STOP (0 << SDMMC_ADMAES_ADMAES_SHIFT) /* Stop DMA */
# define SDMMC_ADMAES_FDS (1 << SDMMC_ADMAES_ADMAES_SHIFT) /* Fetch descriptor */
# define SDMMC_ADMAES_CADR (2 << SDMMC_ADMAES_ADMAES_SHIFT) /* Change address */
# define SDMMC_ADMAES_TFR (3 << SDMMC_ADMAES_ADMAES_SHIFT) /* Transfer data */
#define SDMMC_ADMAES_LME (1 << 2) /* Bit 2: ADMA Length Mismatch Error */
#define SDMMC_ADMAES_DCE (1 << 3) /* Bit 3: ADMA Descriptor Error */
/* Bits 4-31: Reserved */
/* ADMA System Address Register */
#define SDMMC_ADSADDR_SHIFT (0) /* Bits 1-31: ADMA System Address */
#define SDMMC_ADSADDR_MASK (0xfffffffc) /* Bits 0-1: Reserved */
/* Delay Line Control */
#define SDMMC_DL_CTRL_EN (1 << 0) /* Bit 0: Delay Line enable */
#define SDMMC_DL_CTRL_RST (1 << 1) /* Bit 1: Delay line reset */
#define SDMMC_DL_CTRL_SLV_FORCE_UP (1 << 2) /* Bit 2: SLV Force update */
#define SDMMC_DL_SLV_DLY_TGT0_SHIFT (3) /* Bits 3-6: Delay Target 0 */
#define SDMMC_DL_SLV_DLY_TGT0_MASK (0xf << SDMMC_DL_SLV_DLY_TGT0_SHIFT)
# define SDMMC_DL_SLV_DLY_TGT0(n) ((n) << SDMMC_DL_SLV_DLY_TGT0_SHIFT)
#define SDMMC_DL_CTRL_SLV_UPD (1 << 7) /* Bit 7: Delay Control Gate update */
#define SDMMC_DL_CTRL_SLV_OVR (1 << 8) /* Bit 8: Delay Control Gate override */
#define SDMMC_DL_CTRL_OVR_VAL_SHIFT (9) /* Bits 9-15: Override Value */
#define SDMMC_DL_CTRL_OVR_VAL_MASK (0x7f << SDMMC_DL_CTRL_OVR_VAL_SHIFT)
# define SDMMC_DL_CTRL_OVR_VAL(n) ((n) << SDMMC_DL_CTRL_OVR_VAL_SHIFT)
#define SDMMC_DL_SLV_DLY_TGT1_SHIFT (16) /* Bits 16-18: Delay Target 1 */
#define SDMMC_DL_SLV_DLY_TGT1_MASK (0x7 << SDMMC_DL_SLV_DLY_TGT1_SHIFT)
# define SDMMC_DL_SLV_DLY_TGT1(n) ((n) << SDMMC_DL_SLV_DLY_TGT1_SHIFT)
/* Bit 19: Reserved */
#define SDMMC_DL_CTRL_SLV_UPDINT_SHIFT (20) /* Bits 20-27: DLL Control SLV Update Interval */
#define SDMMC_DL_CTRL_SLV_UPDINT_MASK (0xff << SDMMC_DL_CTRL_SLV_UPDINT_SHIFT)
# define SDMMC_DL_CTRL_SLV_UPDINT(n) ((n) << SDMMC_DL_CTRL_SLV_UPDINT_SHIFT)
#define SDMMC_DL_CTRL_REF_UPDINT_SHIFT (28) /* Bits 28-31: DLL Control Reference Update Interval */
#define SDMMC_DL_CTRL_REF_UPDINT_MASK (0xf << SDMMC_DL_CTRL_REF_UPDINT_SHIFT)
# define SDMMC_DL_CTRL_REF_UPDINT(n) ((n)<< SDMMC_DL_CTRL_REF_UPDINT_SHIFT)
/* Delay Line Status */
#define SDMMC_DL_STAT_SLV_LOCK (1 << 0) /* Bit 0: Slave delay-line lock status */
#define SDMMC_DL_STAT_REF_LOCK (1 << 1) /* Bit 1: Reference delay-line lock status */
#define SDMMC_DL_STAT_SLV_SEL_SHIFT (2) /* Bits 2-8: Slave delay line select status */
#define SDMMC_DL_STAT_SLV_SEL_MASK (0x7f << SDMMC_DL_STAT_SLV_SEL_SHIFT)
# define SDMMC_DL_STAT_SLV_SEL(n) ((n) << SDMMC_DL_STAT_SLV_SEL_SHIFT)
#define SDMMC_DL_STAT_REF_SEL_SHIFT (9) /* Bits 9-15: Reference delay line select taps */
#define SDMMC_DL_STAT_REF_SEL_MASK (0x7f << SDMMC_DL_STAT_REF_SEL_SHIFT)
# define SDMMC_DL_STAT_REF_SEL(n) ((n) << SDMMC_DL_STAT_REF_SEL_SHIFT)
/* Bits 16-31: Reserved */
/* Tuning Control Register */
#define SDMMC_TC_SMPLPT_MASK (1 << 0) /* Bit 0: Sampling Point */
#define SDMMC_TC_SMPLPT_50_PCT (0 << 0) /* Sampling Point at 50% of window */
#define SDMMC_TC_SMPLPT_75_PCT (1 << 0) /* Sampling Point at 75% of window */
/* Host Version Register */
#define SDMMC_SPEC_1 0
#define SDMMC_SPEC_2 1
#define SDMMC_SPEC_3 2
#define SDMMC_MAX_DIV_SPEC_2 256
#define SDMMC_MAX_DIV_SPEC_3 2046
/* Software Reset Register */
#define SDMMC_RESET_ALL 0x01
#define SDMMC_RESET_CMD 0x02
#define SDMMC_RESET_DATA 0x04
/* Host Control 2 Register */
#define SDMMC_UHSMS_MASK (7) /* Bits 0-2: UHS Mode Select */
#define SDMMC_VS18EN (1 << 3) /* Bit 3: 1.8V Signaling Enable */
#define SDMMC_DRVSEL_MASK (0x3 << 4) /* Driver Strength Select */
#define SDMMC_EXTUN (1 << 6) /* Bit 6: Execute Tuning */
#define SDMMC_SCLKSEL (1 << 7) /* Bit 7: Sampling Clock Select */
#define SDMMC_ASINTEN (1 << 14) /* Bit 14: Asynchronous Interrupt Enable*/
#define SDMMC_PVALEN (1 << 15) /* Bit 15: Preset Value Enable */
/* Host Control 2 Register */
#define SDMMC_H2CR_UHS_MASK (0x0007)
#define SDMMC_H2CR_UHS_SDR12 (0x0000)
#define SDMMC_H2CR_UHS_SDR25 (0x0001)
#define SDMMC_H2CR_UHS_SDR50 (0x0002)
#define SDMMC_H2CR_UHS_SDR104 (0x0003)
#define SDMMC_H2CR_UHS_DDR50 (0x0004)
#define SDMMC_H2CR_HS400 (0x0005) /* Non-standard */
#define SDMMC_H2CR_VDD_180 (0x0008)
#define SDMMC_H2CR_DRV_TYPE_MASK (0x0030)
#define SDMMC_H2CR_DRV_TYPE_B (0x0000)
#define SDMMC_H2CR_DRV_TYPE_A (0x0010)
#define SDMMC_H2CR_DRV_TYPE_C (0x0020)
#define SDMMC_H2CR_DRV_TYPE_D (0x0030)
#define SDMMC_H2CR_EXEC_TUNING (0x0040)
#define SDMMC_H2CR_TUNED_CLK (0x0080)
#define SDMMC_H2CR_PRESET_VAL_ENABLE (0x8000)
/* SDMMC bus modes */
enum bus_mode
{
MMC_LEGACY,
SD_LEGACY,
MMC_HS,
SD_HS,
MMC_HS_52,
MMC_DDR_52,
UHS_SDR12, /* Single data rate, 12Mhz - default */
UHS_SDR25, /* Single data rate, 25Mhz */
UHS_SDR50, /* Single data rate, 50Mhz */
UHS_DDR50, /* Double data rate, 50Mhz */
UHS_SDR104, /* Single data rate, 100Mhz */
MMC_HS_200,
MMC_HS_400,
MMC_HS_400_ES,
MMC_MODES_END
};
/* MMC Power */
#define MMCSD_VDD_19_20 ((uint32_t)1 << 7) /* VDD voltage 1.9 - 2.0 */
#define MMCSD_VDD_29_30 ((uint32_t)1 << 17) /* VDD voltage 2.9-3.0 */
#define MMCSD_VDD_30_31 ((uint32_t)1 << 18) /* VDD voltage 3.0-3.1 */
#define MMCSD_VDD_32_33 ((uint32_t)1 << 20) /* VDD voltage 3.2-3.3 */
#define MMCSD_VDD_33_34 ((uint32_t)1 << 21) /* VDD voltage 3.3-3.4 */
/* SDMMC bus speed for IDMODE transfers */
#define SAMA5_SDMMC_BUS_SPEED_IDMODE 400000
/* SDMMC bus speed threshold for high-speed mode transfers-
* above this we need to set SDMMC_PROCTL_HSEN bit
*/
#define SAMA5_SDMMC_BUS_HIGH_SPEED_THRESHOLD 26000000
/* SDMMC maximum bus speed - only used if SD Card supports this speed;
* DDR (double data rate) signaling on rising and falling edges of the clock
* will also be used if card supports it.
*
* DDR50 in widebus mode = 400 megabits/s
*/
#ifdef CONFIG_SAMA5_SDMMC_50MHZ
# define SAMA5_SDMMC_BUS_SPEED 50000000
#else
# define SAMA5_SDMMC_BUS_SPEED 25000000
#endif
/* SDMA default buffer size - needed to reset the start address after an SDMA
* Buffer Boundary pause event.
*/
#define SDMMC_DEFAULT_BOUNDARY_SIZE (512 * 1024)
/****************************************************************************
* Public Types
****************************************************************************/
/****************************************************************************
* Public Data
****************************************************************************/
#endif /* __ARCH_ARM_SRC_SAMA5_HARDWARE_SAMA5_SDMMC_H */

View file

@ -0,0 +1,619 @@
/************************************************************************************
* arch/arm/src/sama5/hardware/sama5d2_sdmmc.h
*
* Copyright (C) 2018 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org> & Contributors
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
************************************************************************************/
#ifndef __ARCH_ARM_SRC_SAMA5_HARDWARE_SAMA5D2_SDMMC_H
#define __ARCH_ARM_SRC_SAMA5_HARDWARE_SAMA5D2_SDMMC_H
/************************************************************************************
* Included Files
************************************************************************************/
#include <nuttx/config.h>
#include "chip.h"
/************************************************************************************
* Pre-processor Definitions
************************************************************************************/
/* Register Offsets *****************************************************************/
#define SAMA5D2_SDMMC_SSAR_OFFSET 0x0000 /* SDMA System Address / Argument 2 Register */
#define SAMA5D2_SDMMC_BSR_OFFSET 0x0004 /* Block Size Register */
#define SAMA5D2_SDMMC_BCR_OFFSET 0x0006 /* Block Count Register */
#define SAMA5D2_SDMMC_ARG1R_OFFSET 0x0008 /* Argument 1 Register */
#define SAMA5D2_SDMMC_TMR_OFFSET 0x000c /* Transfer Mode Register */
#define SAMA5D2_SDMMC_CR_OFFSET 0x000e /* Command Register */
#define SAMA5D2_SDMMC_RR0_OFFSET 0x0010 /* Response Register 0 */
#define SAMA5D2_SDMMC_RR1_OFFSET 0x0014 /* Response Register 1 */
#define SAMA5D2_SDMMC_RR2_OFFSET 0x0018 /* Response Register 2 */
#define SAMA5D2_SDMMC_RR3_OFFSET 0x001c /* Response Register 3 */
#define SAMA5D2_SDMMC_BDPR_OFFSET 0x0020 /* Buffer Data Port Register */
#define SAMA5D2_SDMMC_PSR_OFFSET 0x0024 /* Present State Register */
#define SAMA5D2_SDMMC_HCR1_OFFSET 0x0028 /* Host Control 1 Register */
#define SAMA5D2_SDMMC_PR_OFFSET 0x0029 /* Power Control Register */
#define SAMA5D2_SDMMC_BGCR_OFFSET 0x002a /* Block Gap Control Register */
#define SAMA5D2_SDMMC_WCR_OFFSET 0x002b /* Wakeup Control Register */
#define SAMA5D2_SDMMC_CCR_OFFSET 0x002c /* Clock Control Register */
#define SAMA5D2_SDMMC_TCR_OFFSET 0x002e /* Timeout Control Register */
#define SAMA5D2_SDMMC_SRR_OFFSET 0x002f /* Software Reset Register */
#define SAMA5D2_SDMMC_NISTR_OFFSET 0x0030 /* Normal Interrupt Status Register */
#define SAMA5D2_SDMMC_EISTR_OFFSET 0x0032 /* Error Interrupt Status Register */
#define SAMA5D2_SDMMC_NISTER_OFFSET 0x0034 /* Normal Interrupt Status Enable Register */
#define SAMA5D2_SDMMC_EISTER_OFFSET 0x0036 /* Error Interrupt Status Enable Register */
#define SAMA5D2_SDMMC_NISIER_OFFSET 0x0038 /* Normal Interrupt Signal Enable Register */
#define SAMA5D2_SDMMC_EISIER_OFFSET 0x003a /* Error Interrupt Signal Enable Register */
#define SAMA5D2_SDMMC_ACESR_OFFSET 0x003c /* Auto CMD Error Status Register */
#define SAMA5D2_SDMMC_HC2R_OFFSET 0x003e /* Host Control 2 Register */
#define SAMA5D2_SDMMC_CA0R_OFFSET 0x0040 /* Capabilities 0 Register */
#define SAMA5D2_SDMMC_CA1R_OFFSET 0x0044 /* Capabilities 1 Register */
#define SAMA5D2_SDMMC_MCCAR_OFFSET 0x0048 /* Maximum Current Capabilities Register */
#define SAMA5D2_SDMMC_FERACES_OFFSET 0x0050 /* Force Event Register for Auto CMD Error Status */
#define SAMA5D2_SDMMC_FEREIS_OFFSET 0x0052 /* Force Event Register for Error Interrupt Status */
#define SAMA5D2_SDMMC_AESR_OFFSET 0x0054 /* ADMA Error Status Register */
#define SAMA5D2_SDMMC_ASAR0_OFFSET 0x0054 /* ADMA System Address Register 0 */
#define SAMA5D2_SDMMC_PVRX_OFFSET(x) (0x60 + x * 0x02) /* Preset Value Register */
#define SAMA5D2_SDMMC_PVR0_OFFSET SAMA5D2_SDMMC_PVRX_OFFSET(0) /* Initialization */
#define SAMA5D2_SDMMC_PVR1_OFFSET SAMA5D2_SDMMC_PVRX_OFFSET(1) /* Default Speed */
#define SAMA5D2_SDMMC_PVR2_OFFSET SAMA5D2_SDMMC_PVRX_OFFSET(2) /* High Speed */
#define SAMA5D2_SDMMC_PVR3_OFFSET SAMA5D2_SDMMC_PVRX_OFFSET(3) /* SDR12 */
#define SAMA5D2_SDMMC_PVR4_OFFSET SAMA5D2_SDMMC_PVRX_OFFSET(4) /* SDR25 */
#define SAMA5D2_SDMMC_PVR5_OFFSET SAMA5D2_SDMMC_PVRX_OFFSET(5) /* SDR50 */
#define SAMA5D2_SDMMC_PVR6_OFFSET SAMA5D2_SDMMC_PVRX_OFFSET(6) /* SDR104/HS200 */
#define SAMA5D2_SDMMC_PVR7_OFFSET SAMA5D2_SDMMC_PVRX_OFFSET(7) /* DDR50 */
#define SAMA5D2_SDMMC_SISR_OFFSET 0x00fc /* Slot Interrupt Status Register */
#define SAMA5D2_SDMMC_HCVR_OFFSET 0x00fe /* Host Controller Version Register */
#define SAMA5D2_SDMMC_APSR_OFFSET 0x0200 /* Additional Present State Register */
#define SAMA5D2_SDMMC_MC1R_OFFSET 0x0204 /* e.MMC Control 1 Register */
#define SAMA5D2_SDMMC_MC2R_OFFSET 0x0204 /* e.MMC Control 2 Register */
#define SAMA5D2_SDMMC_ACR_OFFSET 0x0208 /* AHB Control Register */
#define SAMA5D2_SDMMC_CC2R_OFFSET 0x020c /* Clock Control 2 Register */
#define SAMA5D2_SDMMC_RTC1R_OFFSET 0x0210 /* Retuning Control 1 Register */
#define SAMA5D2_SDMMC_RTC2R_OFFSET 0x0211 /* Retuning Control 2 Register */
#define SAMA5D2_SDMMC_RTCVR_OFFSET 0x0214 /* Retuning Counter Value Register */
#define SAMA5D2_SDMMC_RTISTER_OFFSET 0x0218 /* Retuning Interrupt Status Enable Register */
#define SAMA5D2_SDMMC_RTISIER_OFFSET 0x0219 /* Retuning Interrupt Signal Enable Register */
#define SAMA5D2_SDMMC_RTISTR_OFFSET 0x021c /* Retuning Interrupt Status Register */
#define SAMA5D2_SDMMC_RTSSR_OFFSET 0x021d /* Retuning Status Slots Register */
#define SAMA5D2_SDMMC_TUNCR_OFFSET 0x0220 /* Tuning Control Register */
#define SAMA5D2_SDMMC_CACR_OFFSET 0x0230 /* Capabilities Control Register */
#define SAMA5D2_SDMMC_CALCR_OFFSET 0x0240 /* Calibration Control Register */
/* Register Addresses ***************************************************************/
/* For SDMMC0 ... */
#define SAMA5D2_SDMMC0_SSAR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_SSAR_OFFSET)
#define SAMA5D2_SDMMC0_BSR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_BSR_OFFSET)
#define SAMA5D2_SDMMC0_BCR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_BCR_OFFSET)
#define SAMA5D2_SDMMC0_ARG1R (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_ARG1R_OFFSET)
#define SAMA5D2_SDMMC0_TMR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_TMR_OFFSET)
#define SAMA5D2_SDMMC0_CR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_CR_OFFSET)
#define SAMA5D2_SDMMC0_RR0 (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_RR0_OFFSET)
#define SAMA5D2_SDMMC0_RR1 (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_RR1_OFFSET)
#define SAMA5D2_SDMMC0_RR2 (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_RR2_OFFSET)
#define SAMA5D2_SDMMC0_RR3 (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_RR3_OFFSET)
#define SAMA5D2_SDMMC0_BDPR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_BDPR_OFFSET)
#define SAMA5D2_SDMMC0_PSR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_PSR_OFFSET)
#define SAMA5D2_SDMMC0_HCR1 (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_HCR1_OFFSET)
#define SAMA5D2_SDMMC0_PR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_PR_OFFSET)
#define SAMA5D2_SDMMC0_BGCR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_BGCR_OFFSET)
#define SAMA5D2_SDMMC0_WCR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_WCR_OFFSET)
#define SAMA5D2_SDMMC0_CCR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_CCR_OFFSET)
#define SAMA5D2_SDMMC0_TCR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_TCR_OFFSET)
#define SAMA5D2_SDMMC0_SRR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_SRR_OFFSET)
#define SAMA5D2_SDMMC0_NISTR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_NISTR_OFFSET)
#define SAMA5D2_SDMMC0_EISTR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_EISTR_OFFSET)
#define SAMA5D2_SDMMC0_NISTER (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_NISTER_OFFSET)
#define SAMA5D2_SDMMC0_EISTER (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_EISTER_OFFSET)
#define SAMA5D2_SDMMC0_NISIER (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_NISIER_OFFSET)
#define SAMA5D2_SDMMC0_EISIER (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_EISIER_OFFSET)
#define SAMA5D2_SDMMC0_ACESR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_ACESR_OFFSET)
#define SAMA5D2_SDMMC0_HC2R (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_HC2R_OFFSET)
#define SAMA5D2_SDMMC0_CA0R (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_CA0R_OFFSET)
#define SAMA5D2_SDMMC0_CA1R (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_CA1R_OFFSET)
#define SAMA5D2_SDMMC0_MCCAR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_MCCAR_OFFSET)
#define SAMA5D2_SDMMC0_FERACES (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_FERACES_OFFSET)
#define SAMA5D2_SDMMC0_FEREIS (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_FEREIS_OFFSET)
#define SAMA5D2_SDMMC0_AESR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_AESR_OFFSET)
#define SAMA5D2_SDMMC0_ASAR0 (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_ASAR0_OFFSET)
#define SAMA5D2_SDMMC0_PVRX(x) (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_PVRX_OFFSET(x))
#define SAMA5D2_SDMMC0_PVR0 (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_PVR0_OFFSET)
#define SAMA5D2_SDMMC0_PVR1 (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_PVR1_OFFSET)
#define SAMA5D2_SDMMC0_PVR2 (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_PVR2_OFFSET)
#define SAMA5D2_SDMMC0_PVR3 (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_PVR3_OFFSET)
#define SAMA5D2_SDMMC0_PVR4 (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_PVR4_OFFSET)
#define SAMA5D2_SDMMC0_PVR5 (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_PVR5_OFFSET)
#define SAMA5D2_SDMMC0_PVR6 (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_PVR6_OFFSET)
#define SAMA5D2_SDMMC0_PVR7 (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_PVR7_OFFSET)
#define SAMA5D2_SDMMC0_SISR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_SISR_OFFSET)
#define SAMA5D2_SDMMC0_HCVR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_HCVR_OFFSET)
#define SAMA5D2_SDMMC0_APSR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_APSR_OFFSET)
#define SAMA5D2_SDMMC0_MC1R (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_MC1R_OFFSET)
#define SAMA5D2_SDMMC0_MC2R (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_MC2R_OFFSET)
#define SAMA5D2_SDMMC0_ACR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_ACR_OFFSET)
#define SAMA5D2_SDMMC0_CC2R (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_CC2R_OFFSET)
#define SAMA5D2_SDMMC0_RTC1R (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_RTC1R_OFFSET)
#define SAMA5D2_SDMMC0_RTC2R (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_RTC2R_OFFSET)
#define SAMA5D2_SDMMC0_RTCVR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_RTCVR_OFFSET)
#define SAMA5D2_SDMMC0_RTISTER (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_RTISTER_OFFSET)
#define SAMA5D2_SDMMC0_RTISIER (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_RTISIER_OFFSET)
#define SAMA5D2_SDMMC0_RTISTR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_RTISTR_OFFSET)
#define SAMA5D2_SDMMC0_RTSSR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_RTSSR_OFFSET)
#define SAMA5D2_SDMMC0_TUNCR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_TUNCR_OFFSET)
#define SAMA5D2_SDMMC0_CACR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_CACR_OFFSET)
#define SAMA5D2_SDMMC0_CALCR (SAM_SDMMC0_VBASE + SAMA5D2_SDMMC_CALCR_OFFSET)
/* For SDMMC1 ... */
#define SAMA5D2_SDMMC1_SSAR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_SSAR_OFFSET)
#define SAMA5D2_SDMMC1_BSR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_BSR_OFFSET)
#define SAMA5D2_SDMMC1_BCR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_BCR_OFFSET)
#define SAMA5D2_SDMMC1_ARG1R (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_ARG1R_OFFSET)
#define SAMA5D2_SDMMC1_TMR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_TMR_OFFSET)
#define SAMA5D2_SDMMC1_CR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_CR_OFFSET)
#define SAMA5D2_SDMMC1_RR0 (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_RR0_OFFSET)
#define SAMA5D2_SDMMC1_RR1 (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_RR1_OFFSET)
#define SAMA5D2_SDMMC1_RR2 (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_RR2_OFFSET)
#define SAMA5D2_SDMMC1_RR3 (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_RR3_OFFSET)
#define SAMA5D2_SDMMC1_BDPR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_BDPR_OFFSET)
#define SAMA5D2_SDMMC1_PSR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_PSR_OFFSET)
#define SAMA5D2_SDMMC1_HCR1 (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_HCR1_OFFSET)
#define SAMA5D2_SDMMC1_PR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_PR_OFFSET)
#define SAMA5D2_SDMMC1_BGCR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_BGCR_OFFSET)
#define SAMA5D2_SDMMC1_WCR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_WCR_OFFSET)
#define SAMA5D2_SDMMC1_CCR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_CCR_OFFSET)
#define SAMA5D2_SDMMC1_TCR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_TCR_OFFSET)
#define SAMA5D2_SDMMC1_SRR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_SRR_OFFSET)
#define SAMA5D2_SDMMC1_NISTR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_NISTR_OFFSET)
#define SAMA5D2_SDMMC1_EISTR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_EISTR_OFFSET)
#define SAMA5D2_SDMMC1_NISTER (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_NISTER_OFFSET)
#define SAMA5D2_SDMMC1_EISTER (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_EISTER_OFFSET)
#define SAMA5D2_SDMMC1_NISIER (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_NISIER_OFFSET)
#define SAMA5D2_SDMMC1_EISIER (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_EISIER_OFFSET)
#define SAMA5D2_SDMMC1_ACESR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_ACESR_OFFSET)
#define SAMA5D2_SDMMC1_HC2R (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_HC2R_OFFSET)
#define SAMA5D2_SDMMC1_CA0R (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_CA0R_OFFSET)
#define SAMA5D2_SDMMC1_CA1R (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_CA1R_OFFSET)
#define SAMA5D2_SDMMC1_MCCAR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_MCCAR_OFFSET)
#define SAMA5D2_SDMMC1_FERACES (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_FERACES_OFFSET)
#define SAMA5D2_SDMMC1_FEREIS (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_FEREIS_OFFSET)
#define SAMA5D2_SDMMC1_AESR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_AESR_OFFSET)
#define SAMA5D2_SDMMC1_ASAR0 (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_ASAR0_OFFSET)
#define SAMA5D2_SDMMC1_PVRX(x) (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_PVRX_OFFSET(x))
#define SAMA5D2_SDMMC1_PVR0 (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_PVR0_OFFSET)
#define SAMA5D2_SDMMC1_PVR1 (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_PVR1_OFFSET)
#define SAMA5D2_SDMMC1_PVR2 (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_PVR2_OFFSET)
#define SAMA5D2_SDMMC1_PVR3 (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_PVR3_OFFSET)
#define SAMA5D2_SDMMC1_PVR4 (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_PVR4_OFFSET)
#define SAMA5D2_SDMMC1_PVR5 (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_PVR5_OFFSET)
#define SAMA5D2_SDMMC1_PVR6 (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_PVR6_OFFSET)
#define SAMA5D2_SDMMC1_PVR7 (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_PVR7_OFFSET)
#define SAMA5D2_SDMMC1_SISR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_SISR_OFFSET)
#define SAMA5D2_SDMMC1_HCVR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_HCVR_OFFSET)
#define SAMA5D2_SDMMC1_APSR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_APSR_OFFSET)
#define SAMA5D2_SDMMC1_MC1R (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_MC1R_OFFSET)
#define SAMA5D2_SDMMC1_MC2R (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_MC2R_OFFSET)
#define SAMA5D2_SDMMC1_ACR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_ACR_OFFSET)
#define SAMA5D2_SDMMC1_CC2R (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_CC2R_OFFSET)
#define SAMA5D2_SDMMC1_RTC1R (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_RTC1R_OFFSET)
#define SAMA5D2_SDMMC1_RTC2R (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_RTC2R_OFFSET)
#define SAMA5D2_SDMMC1_RTCVR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_RTCVR_OFFSET)
#define SAMA5D2_SDMMC1_RTISTER (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_RTISTER_OFFSET)
#define SAMA5D2_SDMMC1_RTISIER (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_RTISIER_OFFSET)
#define SAMA5D2_SDMMC1_RTISTR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_RTISTR_OFFSET)
#define SAMA5D2_SDMMC1_RTSSR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_RTSSR_OFFSET)
#define SAMA5D2_SDMMC1_TUNCR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_TUNCR_OFFSET)
#define SAMA5D2_SDMMC1_CACR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_CACR_OFFSET)
#define SAMA5D2_SDMMC1_CALCR (SAM_SDMMC1_VBASE + SAMA5D2_SDMMC_CALCR_OFFSET)
/* Register Bit Definitions *********************************************************/
/* Block Size Register (0x04) */
#define SDMMC_BSR_BLKSIZE_SHIFT (0) /* Bits 0-9: Transfer Block Size */
#define SDMMC_BSR_BLKSIZE_MASK (0x3ff << SDMMC_BSR_SIZE_SHIFT)
# define SDMMC_BSR_BLKSIZE(n) ((n & SDMMC_BSR_BLKSIZE_MASK) << SDMMC_BSR_BLKSIZE_SHIFT)
#define SDMMC_BSR_BOUNDARY_SHIFT (12) /* Bits 12-14: Buffer Boundary */
# define SDMMC_BSR_BOUNDARY_4K (0 << SDMMC_BSR_BOUNDARY_SHIFT)
# define SDMMC_BSR_BOUNDARY_8K (1 << SDMMC_BSR_BOUNDARY_SHIFT)
# define SDMMC_BSR_BOUNDARY_16K (2 << SDMMC_BSR_BOUNDARY_SHIFT)
# define SDMMC_BSR_BOUNDARY_32K (3 << SDMMC_BSR_BOUNDARY_SHIFT)
# define SDMMC_BSR_BOUNDARY_64K (4 << SDMMC_BSR_BOUNDARY_SHIFT)
# define SDMMC_BSR_BOUNDARY_128K (5 << SDMMC_BSR_BOUNDARY_SHIFT)
# define SDMMC_BSR_BOUNDARY_256K (6 << SDMMC_BSR_BOUNDARY_SHIFT)
# define SDMMC_BSR_BOUNDARY_512K (7 << SDMMC_BSR_BOUNDARY_SHIFT)
/* Block Count Register (0x06) */
#define SDMMC_BCR_BLKCNT_SHIFT (0) /* Bits 0-15: Blocks Count For Current Transfer */
#define SDMMC_BCR_BLKCNT_MASK (0xffff << SDMMC_BCR_BLKCNT_SHIFT)
# define SDMMC_BCR_BLKCNT(n) ((n) << SDMMC_BCR_BLKCNT_SHIFT)
/* Transfer Mode Register (0x0c) */
#define SDMMC_TMR_MSBSEL (1 << 5) /* Bit 5: Multi/Single Block Selection */
#define SDMMC_TMR_DTDSEL (1 << 4) /* Bit 4: Data Transfer Direction Selection */
#define SDMMC_TMR_ACMDEN_SHIFT (2)
# define SDMMC_TMR_ACMDEN_DISABLED (0 << SDMMC_TMR_ACMDEN_SHIFT)
# define SDMMC_TMR_ACMDEN_CMD12 (1 << SDMMC_TMR_ACMDEN_SHIFT)
# define SDMMC_TMR_ACMDEN_CMD23 (2 << SDMMC_TMR_ACMDEN_SHIFT)
#define SDMMC_TMR_BCEN (1 << 1) /* Bit 1: Block Count Enable */
#define SDMMC_TMR_DMAEN (1 << 0) /* Bit 0: DMA Enable */
#define SDMMC_TMR_SINGLE (0)
#define SDMMC_TMR_INFINITE (SDMMC_TMR_MSBSEL)
#define SDMMC_TMR_MULTIPLE (SDMMC_TMR_MSBSEL | SDMMC_TMR_BCEN)
/* Command Register (0x0e) */
#define SDMMC_CR_RSPTYP_SHIFT (0) /* Bits 0-1: Response Type Select */
#define SDMMC_CR_RSPTYP_MASK (3 << SDMMC_CR_RSPTYP_SHIFT)
# define SDMMC_CR_RSPTYP_NORESP (0 << SDMMC_CR_RSPTYP_SHIFT) /* No response */
# define SDMMC_CR_RSPTYP_RL136 (1 << SDMMC_CR_RSPTYP_SHIFT) /* Response length 136 */
# define SDMMC_CR_RSPTYP_RL48 (2 << SDMMC_CR_RSPTYP_SHIFT) /* Response length 48 */
# define SDMMC_CR_RSPTYP_RL48BUSY (3 << SDMMC_CR_RSPTYP_SHIFT) /* Response length 48 with Busy */
#define SDMMC_CR_CMDCCCEN (1 << 3) /* Bit 3: Command CRC Check Enable */
#define SDMMC_CR_CMDCICEN (1 << 4) /* Bit 4: Command Index Check Enable */
#define SDMMC_CR_DPSEL (1 << 5) /* Bit 5: Data Present Select */
#define SDMMC_CR_CMDTYP_SHIFT (6) /* Bits 6-7: Command Type */
#define SDMMC_CR_CMDTYP_MASK (3 << SDMMC_CR_CMDTYP_SHIFT)
# define SDMMC_CR_CMDTYP_NORMAL (0 << SDMMC_CR_CMDTYP_SHIFT) /* Other commands */
# define SDMMC_CR_CMDTYP_SUSPEND (1 << SDMMC_CR_CMDTYP_SHIFT) /* CMD52 to write "Bus Suspend" in CCCR */
# define SDMMC_CR_CMDTYP_RESUME (2 << SDMMC_CR_CMDTYP_SHIFT) /* CMD52 to write "Function Select" in CCCR */
# define SDMMC_CR_CMDTYP_ABORT (3 << SDMMC_CR_CMDTYP_SHIFT) /* CMD12, CMD52 to write "I/O Abort" in CCCR */
#define SDMMC_CR_CMDINX_SHIFT (8) /* Bits 8-13: Command Index */
#define SDMMC_CR_CMDINX_MASK (0x3f << SDMMC_CR_CMDINX_SHIFT)
/* Present State Register (0x24) */
#define SDMMC_PSR_CMDINHC (1 << 0) /* Bit 0: Command Inhibit (CMD) */
#define SDMMC_PSR_CMDINHD (1 << 1) /* Bit 1: Command Inhibit (DAT) */
#define SDMMC_PSR_DLACT (1 << 2) /* Bit 2: Data Line Active */
/* Bits 3-7: Reserved */
#define SDMMC_PSR_WTACT (1 << 8) /* Bit 8: Write Transfer Active */
#define SDMMC_PSR_RTACT (1 << 9) /* Bit 9: Read Transfer Active */
#define SDMMC_PSR_BUFWREN (1 << 10) /* Bit 10: Buffer Write Enable */
#define SDMMC_PSR_BUFRDEN (1 << 11) /* Bit 11: Buffer Read Enable */
/* Bits 12-15: Reserved */
#define SDMMC_PSR_CARDINS (1 << 16) /* Bit 16: Card Inserted */
#define SDMMC_PSR_CARDSS (1 << 17) /* Bit 17: Card State Stable */
#define SDMMC_PSR_CARDDPL (1 << 18) /* Bit 18: Card Detect Pin Level */
#define SDMMC_PSR_WRPPL (1 << 19) /* Bit 19: Write Protect Pin Level */
#define SDMMC_PSR_DATLL_SHIFT (20)
#define SDMMC_PSR_DATLL_MASK (0x0f << SDMMC_PSR_DATLL_SHIFT)
# define SDMMC_PSR_DATLL_DAT0 (0x01 << SDMMC_PSR_DATLL_SHIFT)
# define SDMMC_PSR_DATLL_DAT1 (0x02 << SDMMC_PSR_DATLL_SHIFT)
# define SDMMC_PSR_DATLL_DAT2 (0x04 << SDMMC_PSR_DATLL_SHIFT)
# define SDMMC_PSR_DATLL_DAT3 (0x08 << SDMMC_PSR_DATLL_SHIFT)
#define SDMMC_PSR_CMDLL (1 << 24) /* Bit 24: CMD Line Level */
/* Host Control 1 Register (0x28) */
#define SDMMC_HC1R_LEDCTRL (1 << 0) /* Bit 0: LED Control */
#define SDMMC_HC1R_DW_SHIFT (1) /* Bit 1: Data Width */
#define SDMMC_HC1R_DW_MASK (1 << SDMMC_HC1R_DW_SHIFT)
# define SDMMC_HC1R_DW_1BIT (0 << SDMMC_HC1R_DW_SHIFT) /* 1-bit mode */
# define SDMMC_HC1R_DW_4BIT (1 << SDMMC_HC1R_DW_SHIFT) /* 4-bit mode */
#define SDMMC_H1CR_HSEN (1 << 2) /* Bit 2: High Speed Enable */
#define SDMMC_H1CR_DMASEL_SHIFT (3) /* Bits 3-4: DMA Select */
#define SDMMC_H1CR_DMASEL_MASK (3 << SDMMC_DMASEL_SHIFT)
# define SDMMC_H1CR_DMASEL_SDMA (0 << SDMMC_DMASEL_SHIFT) /* SDMA is selected */
# define SDMMC_H1CR_DMASEL_ADMA32 (2 << SDMMC_DMASEL_SHIFT) /* 32-bit Address ADMA2 is selected */
#define SDMMC_H1CR_EXTDW (1 << 5) /* Bit 5: Extended Data Width (e.MMC) */
#define SDMMC_H1CR_CARDDTL (1 << 6) /* Bit 6: Card Detect Test Level */
#define SDMMC_H1CR_CARDDSEL (1 << 7) /* Bit 7: Card Detect Signal Selection */
/* Power Control Register (0x29) */
#define SDMMC_PCR_SDBPWR (1 << 0) /* Bit 0: SD Bus Power */
/* Block Gap Control Register (0x2a) */
#define SDMMC_BGCR_STPBGR (1 << 0) /* Bit 0: Stop At Block Gap Request */
#define SDMMC_BGCR_CONTR (1 << 1) /* Bit 1: Continue Request */
#define SDMMC_BGCR_RWCTRL (1 << 2) /* Bit 2: Read Wait Control */
#define SDMMC_BGCR_INTBG (1 << 3) /* Bit 3: Interrupt at Block Gap */
/* Wakeup Control Register (0x2b) */
#define SDMMC_WCR_WKENCINT (1 << 0) /* Bit 0: Wakeup Event Enable on Card Interrupt */
#define SDMMC_WCR_WKENCINS (1 << 1) /* Bit 1: Wakeup Event Enable on Card Insertion */
#define SDMMC_WCR_WKENCREM (1 << 2) /* Bit 2: Wakeup Event Enable on Card Removal */
/* Clock Control Register (0x2c) */
#define SDMMC_CCR_INTCLKEN (1 << 0) /* Bit 0: Internal Clock Enable */
#define SDMMC_CCR_INTCLKS (1 << 1) /* Bit 1: Internal Clock Stable */
#define SDMMC_CCR_SDCLKEN (1 << 2) /* Bit 2: SD Clock Enable */
#define SDMMC_CCR_CLKGSEL (1 << 5) /* Bit 5: Clock Generator Select */
#define SDMMC_CCR_USDCLKFSEL_SHIFT (6) /* Bits 6-7: Upper Bits of SDCLK Frequency Select */
#define SDMMC_CCR_USDCLKFSEL_MASK (3 << SDMMC_CCR_USDCLKFSEL_SHIFT)
#define SDMMC_CCR_SDCLKFSEL_SHIFT (8) /* Bits 8-15: SDCLK Frequency Select */
#define SDMMC_CCR_SDCLKFSEL_MASK (0xff << SDMMC_CCR_SDCLKFSEL_SHIFT)
# define SDMMC_CCR_SDCLKFSEL(n) (((n & 0xff) << SDMMC_CCR_SDCLKFSEL_SHIFT) | \
((n & 0x300) >> 2))
# define SDMMC_CCR_SDCLKFSEL_VAL(reg) (((reg & 0xff00) >> SDMMC_CCR_SDCLKFSEL_SHIFT) | \
((reg & 0x0030) << 2))
/* Timeout Control Register (0x2e) */
#define SDMMC_TCR_DTCVAL_SHIFT (0) /* Bits 0-3: Data Timeout Counter Value */
#define SDMMC_TCR_DTCVAL_MASK (0x0f << SDMMC_TCR_DTCVAL_SHIFT)
# define SDMMC_TCR_DTCVAL(n) ((n & SDMMC_TCR_DTCVAL_MASK) << SDMMC_TCR_DTCVAL_SHIFT)
/* Software Reset Register (0x2f) */
#define SDMMC_SRR_SWRSTALL (1 << 0) /* Bit 0: Software Reset for All */
#define SDMMC_SRR_SWRSTCMD (1 << 1) /* Bit 1: Software Reset for CMD Line */
#define SDMMC_SRR_SWRSTDAT (1 << 2) /* Bit 2: Software Reset for DAT Line */
/* Normal Interrupt Status Register (0x30) */
#define SDMMC_NISTR_CMDC (1 << 0) /* Bit 0: Command Complete */
#define SDMMC_NISTR_TRFC (1 << 1) /* Bit 1: Transfer Complete */
#define SDMMC_NISTR_BLKGE (1 << 2) /* Bit 2: Block Gap Event */
#define SDMMC_NISTR_DMAINT (1 << 3) /* Bit 3: DMA Interrupt */
#define SDMMC_NISTR_BWRRDY (1 << 4) /* Bit 4: Buffer Write Ready */
#define SDMMC_NISTR_BRDRDY (1 << 5) /* Bit 5: Buffer Read Ready */
#define SDMMC_NISTR_CINS (1 << 6) /* Bit 6: Card Insertion */
#define SDMMC_NISTR_CREM (1 << 7) /* Bit 7: Card Removal */
#define SDMMC_NISTR_CINT (1 << 8) /* Bit 8: Card Interrupt */
#define SDMMC_NISTR_BOOTAR (1 << 14) /* Bit 14: Boot Acknowledge Received (e.MMC) */
#define SDMMC_NISTR_ERRINT (1 << 15) /* Bit 15: Error Interrupt */
/* Error Interrupt Status Register (0x32) */
#define SDMMC_EISTR_CMDTEO (1 << 0) /* Bit 0: Command TImeout Error */
#define SDMMC_EISTR_CMDCRC (1 << 1) /* Bit 1: Command CRC Error */
#define SDMMC_EISTR_CMDEND (1 << 2) /* Bit 2: Command End Bit Error */
#define SDMMC_EISTR_CMDIDX (1 << 3) /* Bit 3: Command Index Error */
#define SDMMC_EISTR_DATTEO (1 << 4) /* Bit 4: Data Timeout Error */
#define SDMMC_EISTR_DATCRC (1 << 5) /* Bit 5: Data CRC Error */
#define SDMMC_EISTR_DATEND (1 << 6) /* Bit 6: Data End Bit Error */
#define SDMMC_EISTR_CURLIM (1 << 7) /* Bit 7: Current Limit Error */
#define SDMMC_EISTR_ACMD (1 << 8) /* Bit 8: Auto CMD Error */
#define SDMMC_EISTR_ADMA (1 << 9) /* Bit 9: ADMA Error */
#define SDMMC_EISTR_BOOTAE (1 << 12) /* Bit 12: Boot Acknowledge Error (e.MMC) */
/* Normal Interrupt Status Enable Register (0x34) */
#define SDMMC_NISTER_CMDC (1 << 0) /* Bit 0: Command Complete Status Enable */
#define SDMMC_NISTER_TRFC (1 << 1) /* Bit 1: Transfer Complete Status Enable */
#define SDMMC_NISTER_BLKGE (1 << 2) /* Bit 2: Block Gap Event Status Enable */
#define SDMMC_NISTER_DMAINT (1 << 3) /* Bit 3: DMA Interrupt Status Enable */
#define SDMMC_NISTER_BWRRDY (1 << 4) /* Bit 4: Buffer Write Ready Status Enable */
#define SDMMC_NISTER_BRDRDY (1 << 5) /* Bit 5: Buffer Read Ready Status Enable */
#define SDMMC_NISTER_CINS (1 << 6) /* Bit 6: Card Insertion Status Enable */
#define SDMMC_NISTER_CREM (1 << 7) /* Bit 7: Card Removal Status Enable */
#define SDMMC_NISTER_CINT (1 << 8) /* Bit 8: Card Interrupt Status Enable */
#define SDMMC_NISTER_BOOTAR (1 << 14) /* Bit 14: Boot Acknowledge Received Status Enable (e.MMC) */
/* Error Interrupt Status Enable Register (0x36) */
#define SDMMC_EISTER_CMDTEO (1 << 0) /* Bit 0: Command TImeout Error Status Enable */
#define SDMMC_EISTER_CMDCRC (1 << 1) /* Bit 1: Command CRC Error Status Enable */
#define SDMMC_EISTER_CMDEND (1 << 2) /* Bit 2: Command End Bit Error Status Enable */
#define SDMMC_EISTER_CMDIDX (1 << 3) /* Bit 3: Command Index Error Status Enable */
#define SDMMC_EISTER_DATTEO (1 << 4) /* Bit 4: Data Timeout Error Status Enable */
#define SDMMC_EISTER_DATCRC (1 << 5) /* Bit 5: Data CRC Error Status Enable */
#define SDMMC_EISTER_DATEND (1 << 6) /* Bit 6: Data End Bit Error Status Enable */
#define SDMMC_EISTER_CURLIM (1 << 7) /* Bit 7: Current Limit Error Status Enable */
#define SDMMC_EISTER_ACMD (1 << 8) /* Bit 8: Auto CMD Error Status Enable */
#define SDMMC_EISTER_ADMA (1 << 9) /* Bit 9: ADMA Error Status Enable */
#define SDMMC_EISTER_BOOTAE (1 << 12) /* Bit 12: Boot Acknowledge Error Status Enable (e.MMC) */
/* Normal Interrupt Signal Enable Register (0x38) */
#define SDMMC_NISIER_CMDC (1 << 0) /* Bit 0: Command Complete Signal Enable */
#define SDMMC_NISIER_TRFC (1 << 1) /* Bit 1: Transfer Complete Signal Enable */
#define SDMMC_NISIER_BLKGE (1 << 2) /* Bit 2: Block Gap Event Signal Enable */
#define SDMMC_NISIER_DMAINT (1 << 3) /* Bit 3: DMA Interrupt Signal Enable */
#define SDMMC_NISIER_BWRRDY (1 << 4) /* Bit 4: Buffer Write Ready Signal Enable */
#define SDMMC_NISIER_BRDRDY (1 << 5) /* Bit 5: Buffer Read Ready Signal Enable */
#define SDMMC_NISIER_CINS (1 << 6) /* Bit 6: Card Insertion Signal Enable */
#define SDMMC_NISIER_CREM (1 << 7) /* Bit 7: Card Removal Signal Enable */
#define SDMMC_NISIER_CINT (1 << 8) /* Bit 8: Card Interrupt Signal Enable */
#define SDMMC_NISIER_BOOTAR (1 << 14) /* Bit 14: Boot Acknowledge Received Signal Enable (e.MMC) */
/* Error Interrupt Signal Enable Register (0x3a) */
#define SDMMC_EISIER_CMDTEO (1 << 0) /* Bit 0: Command TImeout Error Signal Enable */
#define SDMMC_EISIER_CMDCRC (1 << 1) /* Bit 1: Command CRC Error Signal Enable */
#define SDMMC_EISIER_CMDEND (1 << 2) /* Bit 2: Command End Bit Error Signal Enable */
#define SDMMC_EISIER_CMDIDX (1 << 3) /* Bit 3: Command Index Error Signal Enable */
#define SDMMC_EISIER_DATTEO (1 << 4) /* Bit 4: Data Timeout Error Signal Enable */
#define SDMMC_EISIER_DATCRC (1 << 5) /* Bit 5: Data CRC Error Signal Enable */
#define SDMMC_EISIER_DATEND (1 << 6) /* Bit 6: Data End Bit Error Signal Enable */
#define SDMMC_EISIER_CURLIM (1 << 7) /* Bit 7: Current Limit Error Signal Enable */
#define SDMMC_EISIER_ACMD (1 << 8) /* Bit 8: Auto CMD Error Signal Enable */
#define SDMMC_EISIER_ADMA (1 << 9) /* Bit 9: ADMA Error Signal Enable */
#define SDMMC_EISIER_BOOTAE (1 << 12) /* Bit 12: Boot Acknowledge Error Signal Enable (e.MMC) */
/* Auto CMD Error Status Register (0x3c) */
#define SDMMC_ACESR_ACMD12NE (1 << 0) /* Bit 0: Auto CMD12 Not Executed */
#define SDMMC_ACESR_ACMDTER (1 << 1) /* Bit 1: Auto Command Timeout Error */
#define SDMMC_ACESR_ACMDCRC (1 << 2) /* Bit 2: Auto CMD CRC Error */
#define SDMMC_ACESR_ACMDEND (1 << 3) /* Bit 3: Auto CMD End Bit Error */
#define SDMMC_ACESR_ACMDIDX (1 << 4) /* Bit 4: Auto CMD Index Error */
#define SDMMC_ACESR_CMDNI (1 << 7) /* Bit 7: Command Not Issued by Auto CMD12 Error */
/* Host Control 2 Register (0x3e) */
#define SDMMC_HC2R_UHSMS_SHIFT (0) /* Bits 0-2: UHS Mode Select */
#define SDMMC_HC2R_UHSMS_MASK (0x07 << SDMMC_HC2R_UHSMS_SHIFT)
# define SDMMC_HC2R_UHSMS_SDR12 (0 << SDMMC_HC2R_UHSMS_SHIFT) /* UHS SDR12 Mode */
# define SDMMC_HC2R_UHSMS_SDR25 (1 << SDMMC_HC2R_UHSMS_SHIFT) /* UHS SDR25 Mode */
# define SDMMC_HC2R_UHSMS_SDR50 (2 << SDMMC_HC2R_UHSMS_SHIFT) /* UHS SDR50 Mode */
# define SDMMC_HC2R_UHSMS_SDR104 (3 << SDMMC_HC2R_UHSMS_SHIFT) /* UHS SDR104 Mode */
# define SDMMC_HC2R_UHSMS_DDR50 (4 << SDMMC_HC2R_UHSMS_SHIFT) /* UHS DDR50 Mode */
#define SDMMC_HC2R_HS200EN_SHIFT (0) /* Bits 0-3: HS200 Mode Enable (e.MMC) */
#define SDMMC_HC2R_HS200EN_MASK (0x0f << SDMMC_HC2R_HS200EN_SHIFT)
# define SDMMC_HC2R_HS200EN_ENABLE (0x0b << SDMMC_HC2R_HS200EN_SHIFT) /* HS200 mode is enabled */
#define SDMMC_HC2R_VS18EN (1 << 3) /* Bit 3: 1.8V Signaling Enable */
#define SDMMC_HC2R_DRVSEL_SHIFT (4) /* Bits 4-5: Driver Strength Select */
#define SDMMC_HC2R_DRVSEL_MASK (3 << SDMMC_HC2R_DRVSEL_SHIFT)
# define SDMMC_HC2R_DRVSEL_TYPEB (0 << SDMMC_HC2R_DRVSEL_SHIFT) /* Driver Type B is selected (Default) */
# define SDMMC_HC2R_DRVSEL_TYPEA (1 << SDMMC_HC2R_DRVSEL_SHIFT) /* Driver Type A is selected */
# define SDMMC_HC2R_DRVSEL_TYPEC (2 << SDMMC_HC2R_DRVSEL_SHIFT) /* Driver Type C is selected */
# define SDMMC_HC2R_DRVSEL_TYPED (3 << SDMMC_HC2R_DRVSEL_SHIFT) /* Driver Type D is selected */
#define SDMMC_HC2R_EXTUN (1 << 6) /* Bit 6: Execute Tuning */
#define SDMMC_HC2R_SCLKSEL (1 << 7) /* Bit 7: Sampling Clock Select */
#define SDMMC_HC2R_ASINTEN (1 << 14) /* Bit 14: Asynchronous Interrupt Enable */
#define SDMMC_HC2R_PVALEN (1 << 15) /* Bit 15: Preset Value Enable */
/* Capabilities 0 Register (0x40) */
#define SDMMC_CA0R_TEOCLKF_SHIFT (0) /* Bits 0-5: Timeout Clock Frequency */
#define SDMMC_CA0R_TEOCLKF_MASK (0x3f << SDMMC_CA0R_TEOCLKF_SHIFT)
#define SDMMC_CA0R_TEOCLKF(n) ((n &0x3f) << SDMMC_CA0R_TEOCLKF_SHIFT)
#define SDMMC_CA0R_TEOCLKU (1 << 7) /* Bit 7: Timeout Clock Unit */
#define SDMMC_CA0R_TEOCLKU_KHz (0 << 7) /* KHz */
#define SDMMC_CA0R_TEOCLKU_MHz (1 << 7) /* MHz */
#define SDMMC_CA0R_BASECLKF_SHIFT (8) /* Bits 8-15: Base Clock Frequency */
#define SDMMC_CA0R_BASECLKF_MASK (0xf << SDMMC_BASECLKF_SHIFT)
#define SDMMC_CA0R_BASECLKF(n) ((n & 0xf) << SDMMC_BASECLKF_SHIFT)
#define SDMMC_CA0R_MAXBLKL_SHIFT (16) /* Bits 16-17: Max Block Length */
#define SDMMC_CA0R_MAXBLKL_MASK (3 << SDMMC_CA0R_MAXBLKL_SHIFT)
#define SDMMC_CA0R_MAXBLKL_512 (0 << SDMMC_CA0R_MAXBLKL_SHIFT) /* 512 bytes */
#define SDMMC_CA0R_MAXBLKL_1024 (1 << SDMMC_CA0R_MAXBLKL_SHIFT) /* 1024 bytes */
#define SDMMC_CA0R_MAXBLKL_2048 (2 << SDMMC_CA0R_MAXBLKL_SHIFT) /* 2048 bytes */
#define SDMMC_CA0R_MAXBLKL_NONE (3 << SDMMC_CA0R_MAXBLKL_SHIFT) /* Reserved */
#define SDMMC_CA0R_ED8SUP (1 << 18) /* Bit 18: 8-Bit Support for Embedded Device */
#define SDMMC_CA0R_ADMA2SUP (1 << 19) /* Bit 19: ADMA2 Support */
#define SDMMC_CA0R_HSSUP (1 << 21) /* Bit 21: High Speed Support */
#define SDMMC_CA0R_SDMASUP (1 << 22) /* Bit 22: SDMA Support */
#define SDMMC_CA0R_SRSUP (1 << 23) /* Bit 23: Suspend/Resume Support */
#define SDMMC_CA0R_V33VSUP (1 << 24) /* Bit 24: Voltable Support 3.3V */
#define SDMMC_CA0R_V30VSUP (1 << 25) /* Bit 25: Voltable Support 3.0V */
#define SDMMC_CA0R_V18VSUP (1 << 26) /* Bit 26: Voltable Support 1.8V */
#define SDMMC_CA0R_SB64SUP (1 << 28) /* Bit 28: 64-Bit System Bus Support */
#define SDMMC_CA0R_ASINTSUP (1 << 29) /* Bit 29: Asynchronous Interrupt Support */
#define SDMMC_CA0R_SLTYPE_SHIFT (30) /* Bits 30-31: Slot Type */
#define SDMMC_CA0R_SLTYPE_MASK (3 << SDMMC_CA0R_SLTYPE_SHIFT)
#define SDMMC_CA0R_SLTYPE_REMOVABLE (0 << SDMMC_CA0R_SLTYPE_SHIFT) /* Removable Card Slot */
#define SDMMC_CA0R_SLTYPE_EMBEDDED (1 << SDMMC_CA0R_SLTYPE_SHIFT) /* Embedded Slot for One Device */
/* Capabilities 1 Register (0x44) */
#define SDMMC_CA1R_SDR50SUP (1 << 0) /* Bit 0: SDR50 Support */
#define SDMMC_CA1R_SDR104SUP (1 << 1) /* Bit 1: SDR104 Support */
#define SDMMC_CA1R_DDR50SUP (1 << 2) /* Bit 2: DDR50 Support */
#define SDMMC_CA1R_DRVASUP (1 << 4) /* Bit 4: Driver Type A Support */
#define SDMMC_CA1R_DRVCSUP (1 << 5) /* Bit 5: Driver Type C Support */
#define SDMMC_CA1R_DRVDSUP (1 << 6) /* Bit 6: Driver Type D Support */
#define SDMMC_CA1R_TCNTRT_SHIFT (8) /* Bits 8-11: Timer Count For Retuning */
#define SDMMC_CA1R_TCNTRT_MASK (0x0f << SDMMC_CA1R_TCNTRT_SHIFT)
#define SDMMC_CA1R_TCNTRT(n) ((n & 0x0f) << SDMMC_CA1R_TCNTRT_SHIFT)
#define SDMMC_CA1R_TSDR50 (1 << 13) /* Bit 13: Use Tuning for SDR50 */
#define SDMMC_CA1R_RTMOD_SHIFT (14) /* Bits 14-15: Retuning Modes */
#define SDMMC_CA1R_RTMOD_MASK (3 << SDMMC_CA1R_RTMOD_SHIFT)
#define SDMMC_CA1R_RTMOD_MODE1 (0 << SDMMC_CA1R_RTMOD_SHIFT) /* MODE1: Timer */
#define SDMMC_CA1R_RTMOD_MODE2 (1 << SDMMC_CA1R_RTMOD_SHIFT) /* MODE2: Timer and Retuning Request */
#define SDMMC_CA1R_RTMOD_MODE3 (2 << SDMMC_CA1R_RTMOD_SHIFT) /* MODE3: Auto Retuning Timer and Retuning Request */
#define SDMMC_CA1R_CLKMULT_SHIFT (16) /* Bits 16-23: Clock Multiplier */
#define SDMMC_CA1R_CLKMULT_MASK (0xf << SDMMC_CA1R_CLKMULT_SHIFT)
#define SDMMC_CA1R_CLKMULT(n) ((n & 0xf) << SDMMC_CA1R_CLKMULT_SHIFT)
/* Preset Value Register (0x60 + x * 0x02 [x=0..7]) */
#define SDMMC_PVRx_SDCLKFSEL_SHIFT (0) /* Bits 0-9: SDCLK Frequency Select */
#define SDMMC_PVRx_SDCLKFSEL_MASK (0x3f << SDMMC_PVRx_SDCLKFSEL_SHIFT)
#define SDMMC_PVRx_SDCLKFSEL(n) ((n & 0x3f) << SDMMC_PVRx_SDCLKFSEL_SHIFT)
#define SDMMC_PVRx_CLKGSEL (1 << 10) /* Bit 10: Clock Generator Select */
#define SDMMC_PVRx_DRVSEL_SHIFT (14) /* Bits 14-15: Driver Strength Select */
#define SDMMC_PVRx_DRVSEL_MASK (3 << SDMMC_PVRx_DRVSEL_SHIFT)
#define SDMMC_PVRx_DRVSEL(n) ((n & 3) << SDMMC_PVRx_DRVSEL_SHIFT)
/* Slot Interrupt Status Register (0xfc) */
#define SDMMC_SISR_INTSSL0 (1 << 0) /* Bit 0: Interrupt Signal for Slot 0 */
#define SDMMC_SISR_INTSSL1 (1 << 1) /* Bit 1: Interrupt Signal for Slot 1 */
/* Host Controller Version Register (0xfe) */
#define SDMMC_HCVR_SVER_SHIFT (0) /* Bits 0-7: Specification Version Number */
#define SDMMC_HCVR_SVER_MASK (0xf << SDMMC_HCVR_SVER_SHIFT)
#define SDMMC_HCVR_SVER(reg) ((reg & SDMMC_HCVR_SVER_MASK) >> SDMMC_HCVR_SVER_SHIFT)
#define SDMMC_HCVR_VVER_SHIFT (8) /* Bits 8-15: Vendor Version Number */
#define SDMMC_HCVR_VVER_MASK (0xf << SDMMC_HCVR_VVER_SHIFT)
#define SDMMC_HCVR_VVER(reg) ((reg & SDMMC_HCVR_VVER_MASK) >> SDMMC_HCVR_VVER_SHIFT)
/* Additional Present State Register (0x200) */
#define SDMMC_APSR_HDATLL_SHIFT (0) /* Bits 0-3: DAT[7:4] High Line Level */
#define SDMMC_APSR_HDATLL_MASK (0xf << SDMMC_APSR_HDATLL_SHIFT)
#define SDMMC_APSR_HDATLL(reg) ((reg & SDMMC_APSR_HDATLL_MASK) >> SDMMC_APSR_HDATLL_SHIFT)
/* e.MMC Control 1 Register (0x204) */
#define SDMMC_MC1R_CMDTYPE_SHIFT (0) /* Bits 0-1: e.MMC Command Type */
#define SDMMC_MC1R_CMDTYPE_MASK (3 << SDMMC_MC1R_CMDTYPE_SHIFT)
#define SDMMC_MC1R_CMDTYPE_NORMAL (0 << SDMMC_MC1R_CMDTYPE_SHIFT)
#define SDMMC_MC1R_CMDTYPE_WAITIRQ (1 << SDMMC_MC1R_CMDTYPE_SHIFT)
#define SDMMC_MC1R_CMDTYPE_STREAM (2 << SDMMC_MC1R_CMDTYPE_SHIFT)
#define SDMMC_MC1R_CMDTYPE_BOOT (3 << SDMMC_MC1R_CMDTYPE_SHIFT)
#define SDMMC_MC1R_DDR (1 << 3) /* Bit 3: e.MMC HSDDR Mode */
#define SDMMC_MC1R_OPD (1 << 4) /* Bit 4: e.MMC Open Drain Mode */
#define SDMMC_MC1R_BOOTA (1 << 5) /* Bit 5: e.MMC Boot Acknowledge Mode */
#define SDMMC_MC1R_RSTN (1 << 6) /* Bit 6: e.MMC Reset Signal */
#define SDMMC_MC1R_FCD (1 << 7) /* Bit 7: e.MMC Force Card Detect */
/* e.MMC Control 2 Register (0x205) */
#define SDMMC_MC2R_SRESP (1 << 0) /* Bit 0: e.MMC Abort Wait IRQ */
#define SDMMC_MC2R_ABOOT (1 << 1) /* Bit 1: e.MMC Abort Boot */
/* Capabilities Control Register (0x230) */
#define SDMMC_CACR_CAPWREN (1 << 0) /* Bit 0: Capabilities Write Enable */
#define SDMMC_CACR_KEY_SHIFT (8) /* Bits 8-15: Key */
#define SDMMC_CACR_KEY_MASK (0xff << SDMMC_CACR_KEY_SHIFT)
#define SDMMC_CACR_KEY_ENABLE (0x46 << SDMMC_CACR_KEY_SHIFT)
#define SDMMC_CACR_KEY_DISABLE (0x00 << SDMMC_CACR_KEY_SHIFT)
/************************************************************************************
* Public Types
************************************************************************************/
/************************************************************************************
* Public Data
************************************************************************************/
/************************************************************************************
* Public Function Prototypes
************************************************************************************/
#endif /* __ARCH_ARM_SRC_SAMA5_HARDWARE_SAMA5D2_SDMMC_H */

View file

@ -1,5 +1,5 @@
/****************************************************************************
* arch/arm/src/sama5/sam_pmc.c
* arch/arm/src/sama5/sam_hsmci_clkdiv.c
*
* Copyright (C) 2014 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>

View file

@ -386,8 +386,10 @@ void sam_pioirq(pio_pinset_t pinset)
#if defined(SAM_PIO_ISLR_OFFSET)
uint32_t regval;
#endif
#if defined(SAM_PIO_ISLR_OFFSET) || defined(_PIO_INT_AIM)
uint32_t base = sam_piobase(pinset);
int pin = sam_piopin(pinset);
#endif
#if defined(SAM_PIO_ISLR_OFFSET)
/* Enable writing to PIO registers. The following registers are protected:

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,142 @@
/****************************************************************************
* arch/arm/src/sama5/sam_sdmmc.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
#ifndef __ARCH_ARM_SRC_SAMA5_SDMMC_H
#define __ARCH_ARM_SRC_SAMA5_SDMMC_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <nuttx/sdio.h>
#include <nuttx/mmcsd.h>
#include "chip.h"
#include "hardware/sam_sdmmc.h"
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/****************************************************************************
* Public Types
****************************************************************************/
/****************************************************************************
* Inline Functions
****************************************************************************/
#ifndef __ASSEMBLY__
/****************************************************************************
* Public Data
****************************************************************************/
#undef EXTERN
#if defined(__cplusplus)
#define EXTERN extern "C"
extern "C"
{
#else
#define EXTERN extern
#endif
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
/****************************************************************************
* Name: sam_sdmmc_set_sdio_card_isr
*
* Description:
* SDIO card generates interrupt via SDIO_DATA_1 pin.
* Called by board-specific logic to register an ISR for SDIO card.
*
* Input Parameters:
* func - callback function.
* arg - arg to be passed to the function.
*
* Returned Value:
* None
*
****************************************************************************/
void sam_sdmmc_set_sdio_card_isr(FAR struct sdio_dev_s *dev,
int (*func)(void *), void *arg);
/****************************************************************************
* Name: sam_sdmmc_sdio_initialize
*
* Description:
* Initialize SDMMC for operation.
*
* Input Parameters:
* slotno - Not used.
*
* Returned Value:
* A reference to a SDIO interface structure. NULL is returned on
* failures.
*
****************************************************************************/
FAR struct sdio_dev_s *sam_sdmmc_sdio_initialize(int slotno);
/****************************************************************************
* Name: sdio_mediachange
*
* Description:
* Called by board-specific logic -- possibly from an interrupt handler --
* in order to signal to the driver that a card has been inserted or
* removed from the slot
*
* Input Parameters:
* dev - An instance of the SDIO driver device state structure.
* cardinslot - true is a card has been detected in the slot; false if a
* card has been removed from the slot. Only transitions
* (inserted->removed or removed->inserted should be reported)
*
* Returned Value:
* None
*
****************************************************************************/
void sdio_mediachange(FAR struct sdio_dev_s *dev, bool cardinslot);
/****************************************************************************
* Name: sdio_wrprotect
*
* Description:
* Called by board-specific logic to report if the card in the slot is
* mechanically write protected.
*
* Input Parameters:
* dev - An instance of the SDIO driver device state structure.
* wrprotect - true is a card is writeprotected.
*
* Returned Value:
* None
*
****************************************************************************/
void sdio_wrprotect(FAR struct sdio_dev_s *dev, bool wrprotect);
#endif /* __ASSEMBLY__ */
#endif /* __ARCH_ARM_SRC_SAMA5_SDMMC_H */

View file

@ -85,6 +85,7 @@
/****************************************************************************
* Public Types
****************************************************************************/
/* An opaque handle used to represent a timer channel */
typedef void *TC_HANDLE;
@ -216,7 +217,7 @@ tc_handler_t sam_tc_attach(TC_HANDLE handle, tc_handler_t handler,
* Name: sam_tc_getpending
*
* Description:
* Return the current contents of the interrutp status register, clearing
* Return the current contents of the interrupt status register, clearing
* all pending interrupts.
*
* Input Parameters:

View file

@ -14,7 +14,7 @@
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
@ -110,6 +110,7 @@ const uintptr_t g_spiobase[SAM_NPIO] =
/****************************************************************************
* Private Data
****************************************************************************/
/* Maps a port number to the standard port character */
#if defined(CONFIG_DEBUG_GPIO_INFO) && SAM_NPIO > 0
@ -131,6 +132,7 @@ static const char g_portchar[SAM_NPIO] =
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
/****************************************************************************
* Name: sam_issecure
*
@ -411,7 +413,9 @@ int sam_configpio(pio_pinset_t cfgset)
irqstate_t flags;
int ret;
/* Get the base address and pin mask associated with this pin configuration */
/* Get the base address and pin mask associated with this pin
* configuration
*/
base = sam_piobase(cfgset);
if (base == 0)
@ -464,7 +468,10 @@ int sam_configpio(pio_pinset_t cfgset)
{
putreg32(pin, base + SAM_SPIO_SIONR_OFFSET);
}
/* Set the mask register to modify only the specific pin being configured. */
/* Set the mask register to modify only the specific pin being
* configured.
*/
putreg32(pin, base + SAM_PIO_MSKR_OFFSET);
@ -485,7 +492,9 @@ int sam_configpio(pio_pinset_t cfgset)
break;
case PIO_ANALOG:
/* REVISIT */
ret = OK;
break;
@ -581,26 +590,28 @@ bool sam_pioread(pio_pinset_t pinset)
return 0;
}
/************************************************************************************
/****************************************************************************
* Name: sam_pio_forceclk
*
* Description:
* Enable PIO clocking. Needed only for SAMA5D3/D4 compatibility. For the SAMA5D2,
* there is a common clock for all PIO ports and that clock is always enabled.
* Enable PIO clocking. Needed only for SAMA5D3/D4 compatibility. For the
* SAMA5D2, there is a common clock for all PIO ports and that clock is
* always enabled.
*
************************************************************************************/
****************************************************************************/
void sam_pio_forceclk(pio_pinset_t pinset, bool enable)
{
}
/************************************************************************************
/****************************************************************************
* Function: sam_dumppio
*
* Description:
* Dump all PIO registers associated with the base address of the provided pinset.
* Dump all PIO registers associated with the base address of the provided
* pinset.
*
************************************************************************************/
****************************************************************************/
#ifdef CONFIG_DEBUG_GPIO_INFO
int sam_dumppio(uint32_t pinset, const char *msg)
@ -632,17 +643,22 @@ int sam_dumppio(uint32_t pinset, const char *msg)
}
gpioinfo(" MSKR: %08x CFGR: %08x PDSR: %08x LOCKSR: %08x\n",
getreg32(base + SAM_PIO_MSKR_OFFSET), getreg32(base + SAM_PIO_CFGR_OFFSET),
getreg32(base + SAM_PIO_PDSR_OFFSET), getreg32(base + SAM_PIO_LOCKSR_OFFSET));
getreg32(base + SAM_PIO_MSKR_OFFSET),
getreg32(base + SAM_PIO_CFGR_OFFSET),
getreg32(base + SAM_PIO_PDSR_OFFSET),
getreg32(base + SAM_PIO_LOCKSR_OFFSET));
gpioinfo(" ODSR: %08x IMR: %08x ISR: %08x\n",
getreg32(base + SAM_PIO_ODSR_OFFSET), getreg32(base + SAM_PIO_IMR_OFFSET),
getreg32(base + SAM_PIO_ODSR_OFFSET),
getreg32(base + SAM_PIO_IMR_OFFSET),
getreg32(base + SAM_PIO_ISR_OFFSET));
if (secure)
{
gpioinfo(" SCDR: %08x WPMR: %08x WPSR: %08x IOSSR: %08x\n",
getreg32(SAM_SPIO_SCDR), getreg32(SAM_SPIO_WPMR),
getreg32(SAM_SPIO_WPSR), getreg32(base + SAM_SPIO_IOSSR_OFFSET));
getreg32(SAM_SPIO_SCDR),
getreg32(SAM_SPIO_WPMR),
getreg32(SAM_SPIO_WPSR),
getreg32(base + SAM_SPIO_IOSSR_OFFSET));
}
else
{

View file

@ -34,4 +34,98 @@ config SAMA5D2XULT_USBHOST_PRIO
default 100
depends on USBHOST
config SAMA5_SDMMC
bool "enable SDMMC controller"
default y if SAMA5_HAVE_SDMMC
select SDIO_DMA
select SCHED_WORKQUEUE
select SCHED_HPWORK
select MMCSD
select MMCSD_SDIO
select SDIO_BLOCKSETUP
select ARCH_HAVE_SDIO
select SAMA5_SDMMC_DMA
---help---
Enable SD Card interface SDMMC0. Selects SAMA5_SDMMC SAMA5_SDMMC0 SAMA5_SDMMC_DMA SDIO_DMA SCHED_WORKQUEUE SCHED_HPWORK SDIO_BLOCKSETUP
config SAMA5_SDMMC0
bool "Enable SDMMC0 (built-in eMMC)"
default n if SAMA5_SDMMC
depends on SAMA5_SDMMC
config SAMA5_SDMMC0_SIZE
int "SDMMC0 size in bytes"
default 4294967296
depends on SAMA5_SDMMC0
---help---
Size of eMMC flash in bytes. Default: 4GB
config SAMA5D27_SDMMC0_MOUNT
bool "Mount SDMMC0 at startup"
default n
depends on SAMA5_SDMMC0
config SAMA5D27_SDMMC0_MOUNT_BLKDEV
string "SDMMC0 block device name"
default mmc0
depends on SAMA5_SDMMC0
config SAMA5D27_SDMMC0_MOUNT_MOUNTPOINT
string "SDMMC0 mountpoint"
default "/mnt/sdmmc0"
depends on SAMA5_SDMMC0
config SAMA5D27_SDMMC0_MOUNT_FSTYPE
string "SDMMC0 file system type"
default "vfat"
depends on SAMA5_SDMMC0
config CONFIG_SAMA5_SDMMC1_WIDTH_D1_D8
bool "SDMMC0 data bus width 8 bits"
default y
depends on SAMA5_SDMMC0
config SAMA5_SDMMC1
bool "Enable SDMMC1"
default y if SAMA5_SDMMC
select SAMA5_SDMMC1_WIDTH_D1_D4
depends on SAMA5_SDMMC
config SAMA5_SDMMC1_SIZE
int "SDMMC1 size in bytes"
default 1073741824
depends on SAMA5_SDMMC1
---help---
Size of SD Card in bytes. Default: 16GB
config SAMA5D27_SDMMC1_MOUNT
bool "Mount SDMMC1 at startup"
default n
depends on SAMA5_SDMMC1
config SAMA5D27_SDMMC1_MOUNT_BLKDEV
string "SDMMC1 block device name"
default mmc1
depends on SAMA5_SDMMC1
config SAMA5D27_SDMMC1_MOUNT_MOUNTPOINT
string "SDMMC1 mountpoint"
default "/mnt/sdmmc1"
depends on SAMA5_SDMMC1
config SAMA5D27_SDMMC1_MOUNT_FSTYPE
string "SDMMC1 file system type"
default "vfat"
depends on SAMA5_SDMMC1
config MMCSD_HAVE_CARDDETECT
bool "SDMMC1 card detect"
default y
depends on SAMA5_SDMMC1
config SAMA5_SDMMC1_WIDTH_D1_D4
bool "SDMMC1 data bus width 4 bits"
default y
depends on SAMA5_SDMMC1
endif # ARCH_BOARD_SAMA5D2_XULT

View file

@ -780,8 +780,10 @@ Configurations
netnsh:
This is a network enabled configuration based on the NuttShell (NSH)
REVISIT: More to be provided.
This is a network enabled configuration based on the NuttShell (NSH).
The CDC-ECM driver is enabled, so you can plug a USB cable into the
USB-Micro port (USB-A) and the board will appear as an CDC-ECM
ethernet adapter.
nsh:
@ -952,3 +954,10 @@ Configurations
NOTE: If you want the RTC to preserve time over power cycles, you
will need to install a battery in the battery holder (J12) and close
the jumper, JP13.
sdmmcnsh:
This is a configuration based on the NuttShell (NSH). The SDMMC
peripheral is enabled, and can read and write to a VFAT filesystem
on the SD Card.

View file

@ -0,0 +1,147 @@
#
# 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_AUDIO_FORMAT_MP3 is not set
# CONFIG_DISABLE_OS_API is not set
# CONFIG_NSH_ARGCAT is not set
# CONFIG_NSH_CMDOPT_HEXDUMP is not set
# CONFIG_NSH_CMDPARMS is not set
# CONFIG_SAMA5_UART0 is not set
CONFIG_ARCH="arm"
CONFIG_ARCH_BOARD="sama5d2-xult"
CONFIG_ARCH_BOARD_SAMA5D2_XULT=y
CONFIG_ARCH_BUTTONS=y
CONFIG_ARCH_CHIP="sama5"
CONFIG_ARCH_CHIP_ATSAMA5D27=y
CONFIG_ARCH_CHIP_SAMA5=y
CONFIG_ARCH_CHIP_SAMA5D2=y
CONFIG_ARCH_INTERRUPTSTACK=2048
CONFIG_ARCH_IRQBUTTONS=y
CONFIG_ARCH_LOWVECTORS=y
CONFIG_ARCH_STACKDUMP=y
CONFIG_AUDIO=y
CONFIG_AUDIO_NUM_BUFFERS=8
CONFIG_BOARDCTL_ROMDISK=y
CONFIG_BOARD_LOOPSPERMSEC=65775
CONFIG_BOOT_RUNFROMSDRAM=y
CONFIG_BUILTIN=y
CONFIG_CONSOLE_SYSLOG=y
CONFIG_DEBUG_FULLOPT=y
CONFIG_DEBUG_SYMBOLS=y
CONFIG_DEV_LOOP=y
CONFIG_DEV_ZERO=y
CONFIG_EXAMPLES_HELLO=y
CONFIG_EXAMPLES_TCPBLASTER=y
CONFIG_EXAMPLES_TCPECHO=y
CONFIG_EXAMPLES_WGET=y
CONFIG_EXAMPLES_WGET_URL="http://10.0.0.1/"
CONFIG_FAT_LCNAMES=y
CONFIG_FAT_LFN=y
CONFIG_FS_AUTOMOUNTER=y
CONFIG_FS_FAT=y
CONFIG_FS_PROCFS=y
CONFIG_FS_PROCFS_EXCLUDE_VERSION=y
CONFIG_HAVE_CXX=y
CONFIG_HAVE_CXXINITIALIZE=y
CONFIG_HIDKBD_POLLUSEC=80000
CONFIG_I2S=y
CONFIG_INTELHEX_BINARY=y
CONFIG_IOB_NBUFFERS=72
CONFIG_IOB_THROTTLE=16
CONFIG_MAX_TASKS=16
CONFIG_MAX_WDOGPARMS=2
CONFIG_NETDB_BUFSIZE=128
CONFIG_NETINIT_NETLOCAL=y
CONFIG_NETINIT_NOMAC=y
CONFIG_NETUTILS_TELNETC=y
CONFIG_NETUTILS_WEBCLIENT=y
CONFIG_NET_ARP_IPIN=y
CONFIG_NET_ARP_SEND=y
CONFIG_NET_BROADCAST=y
CONFIG_NET_CDCECM=y
CONFIG_NET_ETH_PKTSIZE=1514
CONFIG_NET_ICMP=y
CONFIG_NET_ICMP_SOCKET=y
CONFIG_NET_ROUTE=y
CONFIG_NET_STATISTICS=y
CONFIG_NET_TCP=y
CONFIG_NET_TCPBACKLOG=y
CONFIG_NET_TCP_NOTIFIER=y
CONFIG_NET_TCP_WRITE_BUFFERS=y
CONFIG_NET_UDP=y
CONFIG_NFILE_DESCRIPTORS=8
CONFIG_NFILE_STREAMS=8
CONFIG_NSH_ARCHINIT=y
CONFIG_NSH_BUILTIN_APPS=y
CONFIG_NSH_FILEIOSIZE=512
CONFIG_NSH_PROMPT_STRING="nsh> "
CONFIG_NSH_QUOTE=y
CONFIG_NSH_READLINE=y
CONFIG_PREALLOC_MQ_MSGS=4
CONFIG_PREALLOC_TIMERS=4
CONFIG_PREALLOC_WDOGS=16
CONFIG_RAM_SIZE=268435456
CONFIG_RAM_START=0x20000000
CONFIG_RAM_VSTART=0x20000000
CONFIG_RAW_BINARY=y
CONFIG_READLINE_CMD_HISTORY=y
CONFIG_READLINE_CMD_HISTORY_LEN=100
CONFIG_READLINE_CMD_HISTORY_LINELEN=120
CONFIG_READLINE_TABCOMPLETION=y
CONFIG_RR_INTERVAL=200
CONFIG_SAMA5D27_SDMMC0_MOUNT_BLKDEV="/dev/mmcsd0"
CONFIG_SAMA5D27_SDMMC0_MOUNT_MOUNTPOINT="/mnt/mmcsd0"
CONFIG_SAMA5D27_SDMMC1_MOUNT=y
CONFIG_SAMA5D27_SDMMC1_MOUNT_BLKDEV="/dev/mmcsd1"
CONFIG_SAMA5D27_SDMMC1_MOUNT_MOUNTPOINT="/mnt/mmcsd1"
CONFIG_SAMA5D2XULT_528MHZ=y
CONFIG_SAMA5D2XULT_USBHOST_STACKSIZE=2048
CONFIG_SAMA5_BOOT_SDRAM=y
CONFIG_SAMA5_DDRCS_HEAP_END=0x2fa00000
CONFIG_SAMA5_DDRCS_RESERVE=y
CONFIG_SAMA5_EHCI=y
CONFIG_SAMA5_HSMC=y
CONFIG_SAMA5_OHCI=y
CONFIG_SAMA5_PIOA_IRQ=y
CONFIG_SAMA5_PIOB_IRQ=y
CONFIG_SAMA5_PIOC_IRQ=y
CONFIG_SAMA5_PIO_IRQ=y
CONFIG_SAMA5_RTC=y
CONFIG_SAMA5_SDMMC0=y
CONFIG_SAMA5_SDMMC0_SIZE=1073741824
CONFIG_SAMA5_SDMMC=y
CONFIG_SAMA5_TRNG=y
CONFIG_SAMA5_UART1=y
CONFIG_SAMA5_UDPHS=y
CONFIG_SAMA5_UHPHS=y
CONFIG_SCHED_HPWORKPRIORITY=192
CONFIG_SCHED_LPNTHREADS=2
CONFIG_SCHED_WAITPID=y
CONFIG_SDCLONE_DISABLE=y
CONFIG_SERIAL_TERMIOS=y
CONFIG_SIG_DEFAULT=y
CONFIG_SIG_EVTHREAD=y
CONFIG_START_DAY=31
CONFIG_START_MONTH=7
CONFIG_START_YEAR=2014
CONFIG_SYMTAB_ORDEREDBYNAME=y
CONFIG_SYSLOG_TIMESTAMP=y
CONFIG_SYSTEM_NSH=y
CONFIG_SYSTEM_PING=y
CONFIG_SYSTEM_VI=y
CONFIG_TTY_SIGINT=y
CONFIG_TTY_SIGSTP=y
CONFIG_UART1_SERIAL_CONSOLE=y
CONFIG_USBDEV=y
CONFIG_USBDEV_DMA=y
CONFIG_USBDEV_DUALSPEED=y
CONFIG_USBDEV_TRACE=y
CONFIG_USBDEV_TRACE_NRECORDS=512
CONFIG_USBHOST_HIDKBD=y
CONFIG_USBHOST_MSC=y
CONFIG_USER_ENTRYPOINT="nsh_main"
CONFIG_WDOG_INTRESERVE=2

View file

@ -65,8 +65,8 @@
#if defined(CONFIG_SAMA5_BOOT_SDRAM)
/* When booting from SDRAM, NuttX is loaded in SDRAM by an intermediate
* bootloader.
* That bootloader had to have already configured the PLL and SDRAM for proper
* operation.
* That bootloader had to have already configured the PLL and SDRAM for
* proper operation.
*
* In this case, we don not reconfigure the clocking.
* Rather, we need to query the register settings to determine the clock
@ -317,6 +317,24 @@
* ---- ------- ---- --------
*/
/* SDIO - Used for both Port 0 & 1 ******************************************/
/* 386 KHz for initial inquiry stuff */
#define BOARD_SDMMC_IDMODE_PRESCALER SDMMC_SYSCTL_SDCLKFS_DIV256
#define BOARD_SDMMC_IDMODE_DIVISOR SDMMC_SYSCTL_DVS_DIV(2)
/* 24.8MHz for other modes */
#define BOARD_SDMMC_MMCMODE_PRESCALER SDMMC_SYSCTL_SDCLKFS_DIV8
#define BOARD_SDMMC_MMCMODE_DIVISOR SDMMC_SYSCTL_DVS_DIV(1)
#define BOARD_SDMMC_SD1MODE_PRESCALER SDMMC_SYSCTL_SDCLKFS_DIV8
#define BOARD_SDMMC_SD1MODE_DIVISOR SDMMC_SYSCTL_DVS_DIV(1)
#define BOARD_SDMMC_SD4MODE_PRESCALER SDMMC_SYSCTL_SDCLKFS_DIV8
#define BOARD_SDMMC_SD4MODE_DIVISOR SDMMC_SYSCTL_DVS_DIV(1)
/****************************************************************************
* Assembly Language Macros
****************************************************************************/

View file

@ -59,6 +59,14 @@ CSRCS += sam_at25.c
endif
endif
ifeq ($(CONFIG_SAMA5_SDMMC0),y)
CSRCS += sam_sdmmc.c
else
ifeq ($(CONFIG_SAMA5_SDMMC1),y)
CSRCS += sam_sdmmc.c
endif
endif
ifeq ($(CONFIG_SAMA5_HSMCI0),y)
CSRCS += sam_hsmci.c
else

View file

@ -23,6 +23,8 @@
****************************************************************************/
#include <nuttx/config.h>
#include <syslog.h>
#include <debug.h>
#include <nuttx/board.h>
@ -68,6 +70,7 @@ int board_app_initialize(uintptr_t arg)
#ifndef CONFIG_BOARD_LATE_INITIALIZE
/* Perform board initialization */
mcinfo("Entry\n");
return sam_bringup();
#else
return OK;

View file

@ -25,8 +25,10 @@
#include <nuttx/config.h>
#include <sys/mount.h>
#include <stdlib.h>
#include <syslog.h>
#include <debug.h>
#include <string.h>
#include <nuttx/irq.h>
#include <nuttx/kthread.h>
@ -34,6 +36,8 @@
#include <nuttx/usb/usbhost.h>
#include <nuttx/usb/usbdev_trace.h>
#include "sama5d2-xult.h"
#ifdef CONFIG_CDCACM
# include <nuttx/usb/cdcacm.h>
#endif
@ -51,7 +55,10 @@
# include <nuttx/usb/rndis.h>
#endif
#include "sama5d2-xult.h"
#ifdef CONFIG_MMCSD
# include <nuttx/mmcsd.h>
# include "sam_sdmmc.h"
#endif
/****************************************************************************
* Pre-processor Definitions
@ -124,6 +131,102 @@ static void sam_i2ctool(void)
# define sam_i2ctool()
#endif
/****************************************************************************
* Name: nsh_sdmmc_initialize
*
* Description:
* Initialize SDMMC drivers
*
****************************************************************************/
#ifdef CONFIG_SAMA5_SDMMC
static int nsh_sdmmc_initialize(void)
{
struct sdio_dev_s *sdmmc0;
struct sdio_dev_s *sdmmc1;
int ret = 0;
/* Get an instance of the SDIO interface */
#ifdef CONFIG_SAMA5_SDMMC0
sdmmc0 = sam_sdmmc_sdio_initialize(SDMMC0_SLOTNO);
if (!sdmmc0)
{
syslog(LOG_ERR, "ERROR: Failed to initialize SD/MMC\n");
}
else
{
/* Bind the SDIO interface to the MMC/SD driver */
ret = mmcsd_slotinitialize(SDMMC0_MINOR, sdmmc0);
if (ret != OK)
{
syslog(LOG_ERR,
"ERROR: Failed to bind SDIO to the MMC/SD driver (slot 0): "
"%d\n",
ret);
}
}
#ifdef CONFIG_SAMA5D27_SDMMC0_MOUNT
/* Mount the volume on SDMMC0 */
ret = mount(CONFIG_SAMA5D27_SDMMC0_MOUNT_BLKDEV,
CONFIG_SAMA5D27_SDMMC0_MOUNT_MOUNTPOINT,
CONFIG_SAMA5D27_SDMMC0_MOUNT_FSTYPE,
0, NULL);
if (ret < 0)
{
_err("ERROR: Failed to mount %s: %d\n",
CONFIG_SAMA5D27_SDMMC0_MOUNT_MOUNTPOINT, errno);
}
#endif
#endif
#ifdef CONFIG_SAMA5_SDMMC1
sdmmc1 = sam_sdmmc_sdio_initialize(SDMMC1_SLOTNO);
if (!sdmmc1)
{
syslog(LOG_ERR, "ERROR: Failed to initialize SD/MMC\n");
}
else
{
/* Bind the SDIO interface to the MMC/SD driver */
ret = mmcsd_slotinitialize(SDMMC1_MINOR, sdmmc1);
if (ret != OK)
{
syslog(LOG_ERR,
"ERROR: Failed to bind SDIO to the MMC/SD driver (slot 0): "
"%d\n",
ret);
}
}
#ifdef CONFIG_SAMA5D27_SDMMC1_MOUNT
/* Mount the volume on SDMMC1 */
ret = mount(CONFIG_SAMA5D27_SDMMC1_MOUNT_BLKDEV,
CONFIG_SAMA5D27_SDMMC1_MOUNT_MOUNTPOINT,
CONFIG_SAMA5D27_SDMMC1_MOUNT_FSTYPE,
0, NULL);
if (ret < 0)
{
_err("ERROR: Failed to mount %s: %d\n",
CONFIG_SAMA5D27_SDMMC1_MOUNT_MOUNTPOINT, errno);
}
#endif
#endif
return OK;
}
#else
# define nsh_sdmmc_initialize() (OK)
#endif
/****************************************************************************
* Public Functions
****************************************************************************/
@ -144,6 +247,14 @@ int sam_bringup(void)
sam_i2ctool();
#ifdef HAVE_SDMMC
#ifdef CONFIG_SAMA5_SDMMC
/* Initialize SDMCC-based MMC/SD card support */
nsh_sdmmc_initialize();
#endif
#endif
#ifdef HAVE_HSMCI
#ifdef CONFIG_SAMA5_HSMCI0
/* Initialize the HSMCI0 driver */
@ -191,7 +302,7 @@ int sam_bringup(void)
#ifdef CONFIG_SAMA5D4EK_HSMCI1_MOUNT
else
{
/* REVISIT: A delay seems to be required here or the mount will fail. */
/* REVISIT: A delay seems required here or the mount will fail. */
/* Mount the volume on HSMCI1 */

View file

@ -1,5 +1,5 @@
/****************************************************************************
* boards/arm/sama5/sama5d2-xult/src/sam_hsmci.c
* boards/arm/sama5/sama5d2-xult/src/sam_sdmmc.c
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@ -18,38 +18,37 @@
*
****************************************************************************/
/* The SAMA5D3-Xplained provides a two SD memory card slots:
* (1) a full size SD card slot (J10), and
* (2) a microSD memory card slot (J11).
/* The SAMA5D2-XULT provides a built-in 4GB eMMC (SDMMC0), and one SD
* full-size memory card slot at J19 (SDMMC1).
*
* The full size SD card slot connects via HSMCI0. The card detect discrete
* is available on PB17 (pulled high). The write protect descrete is tied to
* ground (via PP6) and not available to software. The slot supports 8-bit
* wide transfer mode, but the NuttX driver currently uses only the 4-bit
* wide transfer mode
* SDMMC0: There is a Micron 4Gx8 eMMC managed NAND Flash (MTFC4GLDEA-0M WT)
* connected to SDMMC0.
*
* PD17 MCI0_CD
* PD1 MCI0_DA0
* PD2 MCI0_DA1
* PD3 MCI0_DA2
* PD4 MCI0_DA3
* PD5 MCI0_DA4
* PD6 MCI0_DA5
* PD7 MCI0_DA6
* PD8 MCI0_DA7
* PD9 MCI0_CK
* PD0 MCI0_CDA
* PA1 SDMMC0_CMD
* PA2 SDMMC0_DAT0
* PA3 SDMMC0_DAT1
* PA4 SDMMC0_DAT2
* PA5 SDMMC0_DAT3
* PA6 SDMMC0_DAT4
* PA7 SDMMC0_DAT5
* PA8 SDMMC0_DAT6
* PA9 SDMMC0_DAT7
* PA0 SDMMC0_CK
* PA10 SDMMC0_RSTN
*
* The microSD connects vi HSMCI1. The card detect discrete is available on
* PB18 (pulled high):
* SDMMC1: The full size SD card slot connects via SDMMC1. The card detect
* discrete is available on PA30 (pulled high). The write protect discrete
* is tied to ground and not available to software. The slot only supports
* 4-bit wide transfer mode.
*
* PA30 SDMMC1_CD
* PA18 SDMMC1_DAT0
* PA19 SDMMC1_DAT1
* PA20 SDMMC1_DAT2
* PA21 SDMMC1_DAT3
* PD22 SDMMC1_CK
* PA28 SDMMC1_CDA
*
* PD18 MCI1_CD
* PB20 MCI1_DA0
* PB21 MCI1_DA1
* PB22 MCI1_DA2
* PB23 MCI1_DA3
* PB24 MCI1_CK
* PB19 MCI1_CDA
*/
/****************************************************************************
@ -66,22 +65,26 @@
#include <nuttx/sdio.h>
#include <nuttx/mmcsd.h>
#include "chip.h"
#include "arm_internal.h"
#include "arm_arch.h"
#include "sam_pio.h"
#include "sam_hsmci.h"
#include "sam_sdmmc.h"
#include "sama5d3-xplained.h"
#include "sama5d2-xult.h"
#ifdef HAVE_HSMCI
#ifdef HAVE_SDMMC
/****************************************************************************
* Private Types
****************************************************************************/
/* This structure holds static information unique to one HSMCI peripheral */
/* This structure holds static information unique to one SDMMC peripheral */
struct sam_hsmci_state_s
struct sam_sdmmc_state_s
{
struct sdio_dev_s *hsmci; /* R/W device handle */
struct sdio_dev_s *sdmmc; /* R/W device handle */
pio_pinset_t pincfg; /* Card detect PIO pin configuration */
uint8_t irq; /* Interrupt number (same as pid) */
uint8_t slotno; /* Slot number */
@ -93,29 +96,29 @@ struct sam_hsmci_state_s
* Private Data
****************************************************************************/
/* HSCMI device state */
/* SDMMC device state */
#ifdef CONFIG_SAMA5_HSMCI0
static int sam_hsmci0_cardetect(int irq, void *regs, FAR void *arg);
#ifdef CONFIG_SAMA5_SDMMC0
static int sam_sdmmc0_cardetect(int irq, void *regs, FAR void *arg);
static struct sam_hsmci_state_s g_hsmci0 =
static struct sam_sdmmc_state_s g_sdmmc0 =
{
.pincfg = PIO_MCI0_CD,
.irq = IRQ_MCI0_CD,
.pincfg = PIO_SDMMC0_CD,
.irq = -1,
.slotno = 0,
.handler = sam_hsmci0_cardetect,
.handler = sam_sdmmc0_cardetect,
};
#endif
#ifdef CONFIG_SAMA5_HSMCI1
static int sam_hsmci1_cardetect(int irq, void *regs, FAR void *arg);
#ifdef CONFIG_SAMA5_SDMMC1
static int sam_sdmmc1_cardetect(int irq, void *regs, FAR void *arg);
static struct sam_hsmci_state_s g_hsmci1 =
static struct sam_sdmmc_state_s g_sdmmc1 =
{
.pincfg = PIO_MCI1_CD,
.irq = IRQ_MCI1_CD,
.pincfg = PIO_SDMMC1_CD,
.irq = IRQ_SDMMC1_CD,
.slotno = 1,
.handler = sam_hsmci1_cardetect,
.handler = sam_sdmmc1_cardetect,
};
#endif
@ -127,11 +130,11 @@ static struct sam_hsmci_state_s g_hsmci1 =
* Name: sam_cardinserted_internal
*
* Description:
* Check if a card is inserted into the selected HSMCI slot
* Check if a card is inserted into the selected SDMMC slot
*
****************************************************************************/
bool sam_cardinserted_internal(struct sam_hsmci_state_s *state)
bool sam_cardinserted_internal(struct sam_sdmmc_state_s *state)
{
bool inserted;
@ -143,14 +146,14 @@ bool sam_cardinserted_internal(struct sam_hsmci_state_s *state)
}
/****************************************************************************
* Name: sam_hsmci_cardetect, sam_hsmci0_cardetect, and sam_hsmci1_cardetect
* Name: sam_sdmmc_cardetect, sam_sdmmc0_cardetect, and sam_sdmmc1_cardetect
*
* Description:
* Card detect interrupt handlers
*
****************************************************************************/
static int sam_hsmci_cardetect(struct sam_hsmci_state_s *state)
static int sam_sdmmc_cardetect(struct sam_sdmmc_state_s *state)
{
/* Get the current card insertion state */
@ -160,59 +163,59 @@ static int sam_hsmci_cardetect(struct sam_hsmci_state_s *state)
if (cd != state->cd)
{
/* Yes... remember that new state and inform the HSMCI driver */
/* Yes... remember that new state and inform the SDMMC driver */
state->cd = cd;
/* Report the new state to the SDIO driver */
sdio_mediachange(state->hsmci, cd);
sdio_mediachange(state->sdmmc, cd);
}
return OK;
}
#ifdef CONFIG_SAMA5_HSMCI0
static int sam_hsmci0_cardetect(int irq, void *regs, FAR void *arg)
#ifdef CONFIG_SAMA5_SDMMC0
static int sam_sdmmc0_cardetect(int irq, void *regs, FAR void *arg)
{
return sam_hsmci_cardetect(&g_hsmci0);
return sam_sdmmc_cardetect(&g_sdmmc0);
}
#endif
#ifdef CONFIG_SAMA5_HSMCI1
static int sam_hsmci1_cardetect(int irq, void *regs, FAR void *arg)
#ifdef CONFIG_SAMA5_SDMMC1
static int sam_sdmmc1_cardetect(int irq, void *regs, FAR void *arg)
{
return sam_hsmci_cardetect(&g_hsmci1);
return sam_sdmmc_cardetect(&g_sdmmc1);
}
#endif
/****************************************************************************
* Name: sam_hsmci_state
* Name: sam_sdmmc_state
*
* Description:
* Initialize HSMCI PIOs.
* Initialize SDMMC PIOs.
*
****************************************************************************/
static struct sam_hsmci_state_s *sam_hsmci_state(int slotno)
static struct sam_sdmmc_state_s *sam_sdmmc_state(int slotno)
{
struct sam_hsmci_state_s *state = NULL;
struct sam_sdmmc_state_s *state = NULL;
#ifdef CONFIG_SAMA5_HSMCI0
#ifdef CONFIG_SAMA5_HSMCI1
#ifdef CONFIG_SAMA5_SDMMC0
#ifdef CONFIG_SAMA5_SDMMC1
if (slotno == 0)
#endif
{
state = &g_hsmci0;
state = &g_sdmmc0;
}
#ifdef CONFIG_SAMA5_HSMCI1
#ifdef CONFIG_SAMA5_SDMMC1
else
#endif
#endif
#ifdef CONFIG_SAMA5_HSMCI1
#ifdef CONFIG_SAMA5_SDMMC1
{
state = &g_hsmci1;
state = &g_sdmmc1;
}
#endif
@ -224,21 +227,24 @@ static struct sam_hsmci_state_s *sam_hsmci_state(int slotno)
****************************************************************************/
/****************************************************************************
* Name: sam_hsmci_initialize
* Name: sam_sdmmc_initialize
*
* Description:
* Perform architecture specific initialization
*
****************************************************************************/
int sam_hsmci_initialize(int slotno, int minor)
int sam_sdmmc_initialize(int slotno, int minor)
{
struct sam_hsmci_state_s *state;
struct sam_sdmmc_state_s *state;
int ret;
/* Get the static HSMI description */
mcinfo("Entry.\n");
mcinfo("slotno: %d\n", slotno);
state = sam_hsmci_state(slotno);
/* Get the static SDMMC description */
state = sam_sdmmc_state(slotno);
if (!state)
{
ferr("ERROR: No state for slotno %d\n", slotno);
@ -253,8 +259,8 @@ int sam_hsmci_initialize(int slotno, int minor)
/* First, get an instance of the SDIO interface */
state->hsmci = sdio_initialize(slotno);
if (!state->hsmci)
state->sdmmc = sam_sdmmc_sdio_initialize(slotno);
if (!state->sdmmc)
{
ferr("ERROR: Failed to initialize SDIO slot %d\n", slotno);
return -ENODEV;
@ -262,7 +268,7 @@ int sam_hsmci_initialize(int slotno, int minor)
/* Now bind the SDIO interface to the MMC/SD driver */
ret = mmcsd_slotinitialize(minor, state->hsmci);
ret = mmcsd_slotinitialize(minor, state->sdmmc);
if (ret != OK)
{
ferr("ERROR: Failed to bind SDIO to the MMC/SD driver: %d\n", ret);
@ -274,10 +280,10 @@ int sam_hsmci_initialize(int slotno, int minor)
sam_pioirq(state->pincfg);
irq_attach(state->irq, state->handler, NULL);
/* Then inform the HSMCI driver if there is or is not a card in the slot. */
/* Then inform the SDMMC driver if there is or is not a card in the slot. */
state->cd = sam_cardinserted_internal(state);
sdio_mediachange(state->hsmci, state->cd);
sdio_mediachange(state->sdmmc, state->cd);
/* Enable card detect interrupts */
@ -289,17 +295,17 @@ int sam_hsmci_initialize(int slotno, int minor)
* Name: sam_cardinserted
*
* Description:
* Check if a card is inserted into the selected HSMCI slot
* Check if a card is inserted into the selected SDMMC slot
*
****************************************************************************/
bool sam_cardinserted(int slotno)
{
struct sam_hsmci_state_s *state;
struct sam_sdmmc_state_s *state;
/* Get the HSMI description */
/* Get the SDMMC description */
state = sam_hsmci_state(slotno);
state = sam_sdmmc_state(slotno);
if (!state)
{
ferr("ERROR: No state for slotno %d\n", slotno);
@ -315,7 +321,7 @@ bool sam_cardinserted(int slotno)
* Name: sam_writeprotected
*
* Description:
* Check if a card is inserted into the selected HSMCI slot
* Check if a card is inserted into the selected SDMMC slot
*
****************************************************************************/
@ -326,4 +332,5 @@ bool sam_writeprotected(int slotno)
return false;
}
#endif /* HAVE_HSMCI */
#endif /* HAVE_SDMMC */

View file

@ -42,7 +42,7 @@
/* Configuration ************************************************************/
#define HAVE_HSMCI 1
#define HAVE_SDMMC 1
#define HAVE_AT25 1
#define HAVE_NAND 1
#define HAVE_USBHOST 1
@ -50,26 +50,26 @@
#define HAVE_USBMONITOR 1
#define HAVE_NETWORK 1
/* HSMCI */
/* SDMMC */
/* Can't support MMC/SD if the card interface(s) are not enable */
#if !defined(CONFIG_SAMA5_HSMCI0) && !defined(CONFIG_SAMA5_HSMCI1)
# undef HAVE_HSMCI
#if !defined(CONFIG_SAMA5_SDMMC) && !defined(CONFIG_SAMA5_SDMMC0)
# undef HAVE_SDMMC
#endif
/* Can't support MMC/SD features if mountpoints are disabled */
#if defined(HAVE_HSMCI) && defined(CONFIG_DISABLE_MOUNTPOINT)
#if defined(HAVE_SDMMC) && defined(CONFIG_DISABLE_MOUNTPOINT)
# warning Mountpoints disabled. No MMC/SD support
# undef HAVE_HSMCI
# undef HAVE_SDMCC
#endif
/* We need PIO interrupts on PIOD to support card detect interrupts */
#if defined(HAVE_HSMCI) && !defined(CONFIG_SAMA5_PIOD_IRQ)
# warning PIOD interrupts not enabled. No MMC/SD support.
# undef HAVE_HSMCI
#if defined(HAVE_SDMMC) && !defined(CONFIG_SAMA5_PIOA_IRQ)
# warning PIOA interrupts not enabled. No MMC/SD support.
# undef HAVE_SDMMC
#endif
/* NAND FLASH */
@ -95,27 +95,27 @@
#endif
/* If we are going to mount the NAND, then they user must also have told
* us what to do with it by setting one of CONFIG_SAMA5D3XPLAINED_NAND_FTL or
* CONFIG_SAMA5D3XPLAINED_NAND_NXFFS.
* us what to do with it by setting one of CONFIG_SAMA5D2XULT_NAND_FTL or
* CONFIG_SAMA5D2XULT_NAND_NXFFS.
*/
#ifndef CONFIG_MTD
# undef CONFIG_SAMA5D3XPLAINED_NAND_NXFFS
# undef CONFIG_SAMA5D3XPLAINED_NAND_FTL
# undef CONFIG_SAMA5D2XULT_NAND_NXFFS
# undef CONFIG_SAMA5D2XULT_NAND_FTL
#endif
#if !defined(CONFIG_FS_NXFFS) || !defined(CONFIG_NXFFS_NAND)
# undef CONFIG_SAMA5D3XPLAINED_NAND_NXFFS
# undef CONFIG_SAMA5D2XULT_NAND_NXFFS
#endif
#if !defined(CONFIG_SAMA5D3XPLAINED_NAND_FTL) && !defined(CONFIG_SAMA5D3XPLAINED_NAND_NXFFS)
#if !defined(CONFIG_SAMA5D2XULT_NAND_FTL) && !defined(CONFIG_SAMA5D2XULT_NAND_NXFFS)
# undef HAVE_NAND
#endif
#if defined(CONFIG_SAMA5D3XPLAINED_NAND_FTL) && defined(CONFIG_SAMA5D3XPLAINED_NAND_NXFFS)
# warning Both CONFIG_SAMA5D3XPLAINED_NAND_FTL and CONFIG_SAMA5D3XPLAINED_NAND_NXFFS are set
# warning Ignoring CONFIG_SAMA5D3XPLAINED_NAND_NXFFS
# undef CONFIG_SAMA5D3XPLAINED_NAND_NXFFS
#if defined(CONFIG_SAMA5D2XULT_NAND_FTL) && defined(CONFIG_SAMA5D2XULT_NAND_NXFFS)
# warning Both CONFIG_SAMA5D2XULT_NAND_FTL and CONFIG_SAMA5D2XULT_NAND_NXFFS are set
# warning Ignoring CONFIG_SAMA5D2XULT_NAND_NXFFS
# undef CONFIG_SAMA5DXULT_NAND_NXFFS
#endif
/* AT25 Serial FLASH */
@ -142,14 +142,14 @@
# undef CONFIG_SAMA5D3XPLAINED_AT25_NXFFS
#endif
#if !defined(CONFIG_SAMA5D3XPLAINED_AT25_FTL) && !defined(CONFIG_SAMA5D3XPLAINED_AT25_NXFFS)
#if !defined(CONFIG_SAMA5D2XULT_AT25_FTL) && !defined(CONFIG_SAMA5D2XULT_AT25_NXFFS)
# undef HAVE_AT25
#endif
#if defined(CONFIG_SAMA5D3XPLAINED_AT25_FTL) && defined(CONFIG_SAMA5D3XPLAINED_AT25_NXFFS)
# warning Both CONFIG_SAMA5D3XPLAINED_AT25_FTL and CONFIG_SAMA5D3XPLAINED_AT25_NXFFS are set
# warning Ignoring CONFIG_SAMA5D3XPLAINED_AT25_NXFFS
# undef CONFIG_SAMA5D3XPLAINED_AT25_NXFFS
#if defined(CONFIG_SAMA5D2XULT_AT25_FTL) && defined(CONFIG_SAMA5D2XULT_AT25_NXFFS)
# warning Both CONFIG_SAMA5D2XULT_AT25_FTL and CONFIG_SAMA5D2XULT_AT25_NXFFS are set
# warning Ignoring CONFIG_SAMA5D2XULT_AT25_NXFFS
# undef CONFIG_SAMA5D2XULT_AT25_NXFFS
#endif
/* Assign minor device numbers. For example, if we also use MINOR number 0
@ -178,16 +178,25 @@
# define CONFIG_NSH_MMCSDMINOR 0
#endif
#ifdef HAVE_HSMCI
#ifdef HAVE_SDMMC
# define HSMCI0_SLOTNO 0
# define HSMCI1_SLOTNO 1
# ifdef CONFIG_SAMA5_HSMCI0
# define HSMCI0_MINOR CONFIG_NSH_MMCSDMINOR
# define HSMCI1_MINOR (CONFIG_NSH_MMCSDMINOR+1)
# if ( defined(CONFIG_SAMA5_SDMMC0) && defined(CONFIG_SAMA5_SDMMC1) )
# define SDMMC0_SLOTNO 0
# define SDMMC1_SLOTNO 1
# else
# define HSMCI1_MINOR CONFIG_NSH_MMCSDMINOR
# if ( defined(CONFIG_SAMA5_SDMMC0) )
# define SDMMC0_SLOTNO 0
# endif
# if ( defined(CONFIG_SAMA5_SDMMC1) )
# define SDMMC1_SLOTNO 0
# endif
# endif
# ifdef CONFIG_SAMA5_SDMMC0
# define SDMMC0_MINOR CONFIG_NSH_MMCSDMINOR
# define SDMMC1_MINOR (CONFIG_NSH_MMCSDMINOR+1)
# else
# define SDMMC1_MINOR CONFIG_NSH_MMCSDMINOR
# endif
#else
#endif
@ -300,33 +309,51 @@
PIO_INT_BOTHEDGES | PIO_PORT_PIOB | PIO_PIN6)
#define IRQ_BTN_USER SAM_IRQ_PB6
/* HSMCI Card Slots *********************************************************/
/* The SAMA5D2-XULT provides a SD memory card slots:
* a full size SD card slot (J19)
/* SDMMC clocking
*
* The full size SD card slot connects via HSMCI0. The card detect discrete
* is available on PD17 (pulled high). The write protect discrete is tied to
* ground (via PP6) and not available to software. The slot supports 8-bit
* wide transfer mode, but the NuttX driver currently uses only the 4-bit
* wide transfer mode
* Multimedia Card Interface clock (MCCK or MCI_CK) is Master Clock (MCK)
* divided by (2*(CLKDIV+1)).
*
* PD17 MCI0_CD
* PD1 MCI0_DA0
* PD2 MCI0_DA1
* PD3 MCI0_DA2
* PD4 MCI0_DA3
* PD5 MCI0_DA4
* PD6 MCI0_DA5
* PD7 MCI0_DA6
* PD8 MCI0_DA7
* PD9 MCI0_CK
* PD0 MCI0_CDA
* MCI_SPEED = MCK / (2*(CLKDIV+1))
* CLKDIV = MCI / MCI_SPEED / 2 - 1
*
* Where CLKDIV has a range of 0-255.
*/
#define PIO_MCI0_CD (PIO_INPUT | PIO_CFG_DEFAULT | PIO_CFG_DEGLITCH | \
PIO_INT_BOTHEDGES | PIO_PORT_PIOA | PIO_PIN11)
#define IRQ_MCI0_CD SAM_IRQ_PA11
/* MCK = 96MHz, CLKDIV = 119, MCI_SPEED = 96MHz / 2 * (119+1) = 400 KHz */
#define SDMMC_INIT_CLKDIV (119 << SDMMC_MR_CLKDIV_SHIFT)
/* MCK = 96MHz, CLKDIV = 3, MCI_SPEED = 96MHz / 2 * (3+1) = 12 MHz */
#define SDMMC_MMCXFR_CLKDIV (3 << SDMMC_MR_CLKDIV_SHIFT)
/* MCK = 96MHz, CLKDIV = 1, MCI_SPEED = 96MHz / 2 * (1+1) = 24 MHz */
#define SDMMC_SDXFR_CLKDIV (1 << SDMMC_MR_CLKDIV_SHIFT)
#define SDMMC_SDWIDEXFR_CLKDIV SDMMC_SDXFR_CLKDIV
/* SDMMC Card Slots *********************************************************/
/* The SAMA5D2-XULT provides a SD memory card slot:
* a full size SD card slot (J19)
*
* The full size SD card slot connects via SDMMC1. The card detect discrete
* is available on PA30 (pulled high). The write protect discrete is tied to
* ground and not available to software. The slot only supports 4-bit
* wide transfer mode, and the NuttX driver currently uses only the 4-bit
* wide transfer mode.
*
* PA30 SDMMC1_CD
* PA18 SDMMC1_DAT0
* PA19 SDMMC1_DAT1
* PA20 SDMMC1_DAT2
* PA21 SDMMC1_DAT3
* PA22 SDMMC1_CK
* PA28 SDMMC1_CDA
*/
#define IRQ_SDMMC1_CD SAM_IRQ_PA30
/* USB Ports ****************************************************************/
@ -414,6 +441,42 @@
int sam_bringup(void);
/****************************************************************************
* Name: sam_sdmmc_initialize
*
* Description:
* Initialize and configure one SDMMC slot
*
****************************************************************************/
#ifdef HAVE_SDMMC
int sam_sdmmc_initialize(int slotno, int minor);
#endif
/****************************************************************************
* Name: sam_cardinserted
*
* Description:
* Check if a card is inserted into the selected SDMMC slot
*
****************************************************************************/
#ifdef HAVE_SDMMC
bool sam_cardinserted(int slotno);
#endif
/****************************************************************************
* Name: sam_writeprotected
*
* Description:
* Check if the card in the MMCSD slot is write protected
*
****************************************************************************/
#ifdef HAVE_HSMCI
bool sam_writeprotected(int slotno);
#endif
/****************************************************************************
* Name: sam_usbinitialize
*

View file

@ -171,8 +171,8 @@
/* AT24 Serial EEPROM
*
* A AT24C512 Serial EEPPROM was used for tested I2C. There are other I2C/TWI
* devices on-board, but the serial EEPROM is the simplest test.
* A AT24C512 Serial EEPPROM was used for tested I2C. There are other
* I2C/TWI devices on-board, but the serial EEPROM is the simplest test.
*
* There is, however, no AT24 EEPROM on board the SAMA5D3x-EK: The Serial
* EEPROM was mounted on an external adaptor board and connected to the
@ -243,9 +243,9 @@
# define AT24_MINOR _AT24_MINOR
#endif
/* MMC/SD minor numbers: The NSH device minor extended is extended to support
* two devices. If CONFIG_NSH_MMCSDMINOR is zero, these will be: /dev/mmcsd0
* and /dev/mmcsd1.
/* MMC/SD minor numbers: The NSH device minor extended is extended to
* support two devices. If CONFIG_NSH_MMCSDMINOR is zero, these will be:
* /dev/mmcsd0 and /dev/mmcsd1.
*/
#ifndef CONFIG_NSH_MMCSDMINOR
@ -450,7 +450,7 @@
* (2) a microSD memory card slot (J6 labeled MCI1).
*
* The full size SD card slot connects via HSMCI0. The card detect discrete
* is available on PB17 (pulled high). The write protect descrete is tied to
* is available on PB17 (pulled high). The write protect discrete is tied to
* ground (via PP6) and not available to software. The slot supports 8-bit
* wide transfer mode, but the NuttX driver currently uses only the 4-bit
* wide transfer mode
@ -602,7 +602,7 @@
* (MICREL KSZ9021/31) operating at 10/100/1000 Mbps.
* The board supports RGMII interface mode. The Ethernet interface
* consists of 4 pairs of low voltage differential pair signals
* designated from GRX± and GTx± plus control signals for link
* designated from GRX and GTx plus control signals for link
* activity indicators. These signals can be used to connect to a
* 10/100/1000 BaseT RJ45 connector integrated on the main board.
*
@ -688,7 +688,7 @@
#ifndef __ASSEMBLY__
/****************************************************************************
* Public Functions
* Public Function Prototypes
****************************************************************************/
/****************************************************************************

View file

@ -14,7 +14,7 @@ Files in this directory
dev_null.c and dev_zero.c
These files provide the standard /dev/null and /dev/zero devices. See
include/nuttx/drivers/driers.h for prototypes of functions that should
include/nuttx/drivers/drivers.h for prototypes of functions that should
be called if you want to register these devices (devnull_register()
and devzero_register()).