| /**************************************************************************** |
| * arch/arm/src/cxd56xx/hardware/cxd56_emmc.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_CXD56XX_HARDWARE_CXD56_EMMC_H |
| #define __ARCH_ARM_SRC_CXD56XX_HARDWARE_CXD56_EMMC_H |
| |
| #define EMMC_CTRL (CXD56_EMMC_BASE + 0x00u) |
| #define EMMC_PWREN (CXD56_EMMC_BASE + 0x04u) |
| #define EMMC_CLKDIV (CXD56_EMMC_BASE + 0x08u) |
| #define EMMC_CLKSRC (CXD56_EMMC_BASE + 0x0Cu) |
| #define EMMC_CLKENA (CXD56_EMMC_BASE + 0x10u) |
| #define EMMC_TMOUT (CXD56_EMMC_BASE + 0x14u) |
| #define EMMC_CTYPE (CXD56_EMMC_BASE + 0x18u) |
| #define EMMC_BLKSIZ (CXD56_EMMC_BASE + 0x1Cu) |
| #define EMMC_BYTCNT (CXD56_EMMC_BASE + 0x20u) |
| #define EMMC_INTMASK (CXD56_EMMC_BASE + 0x24u) |
| #define EMMC_CMDARG (CXD56_EMMC_BASE + 0x28u) |
| #define EMMC_CMD (CXD56_EMMC_BASE + 0x2Cu) |
| #define EMMC_RESP0 (CXD56_EMMC_BASE + 0x30u) |
| #define EMMC_RESP1 (CXD56_EMMC_BASE + 0x34u) |
| #define EMMC_RESP2 (CXD56_EMMC_BASE + 0x38u) |
| #define EMMC_RESP3 (CXD56_EMMC_BASE + 0x3Cu) |
| #define EMMC_MINTSTS (CXD56_EMMC_BASE + 0x40u) |
| #define EMMC_RINTSTS (CXD56_EMMC_BASE + 0x44u) |
| #define EMMC_STATUS (CXD56_EMMC_BASE + 0x48u) |
| #define EMMC_FIFOTH (CXD56_EMMC_BASE + 0x4Cu) |
| #define EMMC_CDETECT (CXD56_EMMC_BASE + 0x50u) |
| #define EMMC_WRTPRT (CXD56_EMMC_BASE + 0x54u) |
| #define EMMC_GPIO (CXD56_EMMC_BASE + 0x58u) |
| #define EMMC_TCBCNT (CXD56_EMMC_BASE + 0x5Cu) |
| #define EMMC_TBBCNT (CXD56_EMMC_BASE + 0x60u) |
| #define EMMC_DEBNCE (CXD56_EMMC_BASE + 0x64u) |
| #define EMMC_USRID (CXD56_EMMC_BASE + 0x68u) |
| #define EMMC_VERID (CXD56_EMMC_BASE + 0x6Cu) |
| #define EMMC_HCON (CXD56_EMMC_BASE + 0x70u) |
| #define EMMC_UHS_REG (CXD56_EMMC_BASE + 0x74u) |
| #define EMMC_RST_N (CXD56_EMMC_BASE + 0x78u) |
| #define EMMC_BMOD (CXD56_EMMC_BASE + 0x80u) |
| #define EMMC_PLDMND (CXD56_EMMC_BASE + 0x84u) |
| #define EMMC_DBADDR (CXD56_EMMC_BASE + 0x88u) |
| #define EMMC_IDSTS (CXD56_EMMC_BASE + 0x8Cu) |
| #define EMMC_IDINTEN (CXD56_EMMC_BASE + 0x90u) |
| #define EMMC_DSCADDR (CXD56_EMMC_BASE + 0x94u) |
| #define EMMC_BUFADDR (CXD56_EMMC_BASE + 0x98u) |
| #define EMMC_CARDTHRCTL (CXD56_EMMC_BASE + 0x100u) |
| #define EMMC_BACK_END_POWER (CXD56_EMMC_BASE + 0x104u) |
| #define EMMC_UHS_REG_EXT (CXD56_EMMC_BASE + 0x108u) |
| #define EMMC_EMMC_DDR_REG (CXD56_EMMC_BASE + 0x10Cu) |
| #define EMMC_ENABLE_SHIFT (CXD56_EMMC_BASE + 0x110u) |
| #define EMMC_FIFO_DATA_BASE (CXD56_EMMC_BASE + 0x200u) |
| |
| /* EMMC_CTRL */ |
| |
| #define EMMC_CTRL_USE_IDMAC (1u << 25) |
| #define EMMC_CTRL_OD_PULLUP (1u << 24) |
| #define EMMC_CTRL_DMA_ENABLE (1u << 5) |
| #define EMMC_CTRL_INT_ENABLE (1u << 4) |
| #define EMMC_CTRL_DMA_RESET (1u << 2) |
| #define EMMC_CTRL_FIFO_RESET (1u << 1) |
| #define EMMC_CTRL_CTRL_RESET (1u << 0) |
| |
| /* EMMC_CLKENA */ |
| |
| #define EMMC_CLKENA_LOWPWR (1u << 16) |
| #define EMMC_CLKENA_ENABLE (1u << 0) |
| #define EMMC_CLKENA_DIS (EMMC_CLKENA_LOWPWR) |
| #define EMMC_CLKENA_ENA (EMMC_CLKENA_LOWPWR | EMMC_CLKENA_ENABLE) |
| |
| /* EMMC_TMOUT */ |
| |
| #define EMMC_TMOUT_DATA_SHIFT (8) |
| #define EMMC_TMOUT_RESP_SHIFT (0) |
| |
| /* EMMC_CTYPE */ |
| |
| #define EMMC_CTYPE_4BIT_MODE (1u << 0) |
| |
| /* EMMC_INTMASK */ |
| |
| #define EMMC_INTMASK_ALLMASK (0) |
| #define EMMC_INTMASK_NO_MASK (0x0000FFFEu) |
| #define EMMC_INTMASK_RXDR_MASK (~(1u << 5) & (EMMC_INTMASK_NO_MASK)) |
| #define EMMC_INTMASK_TXDR_MASK (~(1u << 4) & (EMMC_INTMASK_NO_MASK)) |
| #define EMMC_INTMASK_DTO_MASK (~(1u << 3) & (EMMC_INTMASK_NO_MASK)) |
| #define EMMC_INTMASK_CD_MASK (~(1u << 2) & (EMMC_INTMASK_NO_MASK)) |
| |
| /* EMMC_CMD */ |
| |
| #define EMMC_CMD_START_CMD (1u << 31) |
| #define EMMC_CMD_USE_HOLDREG (1u << 29) |
| #define EMMC_CMD_UPDATE_CLKREG (1u << 21) |
| #define EMMC_CMD_SEND_INIT (1u << 15) |
| #define EMMC_CMD_STOP_CMD (1u << 14) |
| #define EMMC_CMD_WAIT_PRE_DATA (1u << 13) |
| #define EMMC_CMD_WRITE (1u << 10) |
| #define EMMC_CMD_READ (0u << 10) |
| #define EMMC_CMD_DATA_EXPECTED (1u << 9) |
| #define EMMC_CMD_CHK_RESP_CRC (1u << 8) |
| #define EMMC_CMD_RESP_LENGTH (1u << 7) |
| #define EMMC_CMD_RESP_EXPECTED (1u << 6) |
| |
| /* EMMC_RINTSTS */ |
| |
| #define EMMC_INTSTS_INT_CLEAR (0xFFFFFFFFu) |
| #define EMMC_INTSTS_SDIO (0xFFFF0000u) |
| #define EMMC_INTSTS_EBE (1u << 15) /* End-bit error/write no CRC */ |
| #define EMMC_INTSTS_ACD (1u << 14) /* Auto command done */ |
| #define EMMC_INTSTS_BCI (1u << 13) /* Start-bit error/Busy Clear Interrupt */ |
| #define EMMC_INTSTS_HLE (1u << 12) /* Hardware locked write error */ |
| #define EMMC_INTSTS_FRUN (1u << 11) /* FIFO underrun/overrun error */ |
| #define EMMC_INTSTS_HTO (1u << 10) /* Data starvation-by-host timeout/Volt_switch_int */ |
| #define EMMC_INTSTS_DRTO (1u << 9) /* Data read timeout/Boot Data Start */ |
| #define EMMC_INTSTS_RTO (1u << 8) /* Response timeout/Boot Ack Received */ |
| #define EMMC_INTSTS_DCRC (1u << 7) /* Data CRC error */ |
| #define EMMC_INTSTS_RCRC (1u << 6) /* Response CRC error */ |
| #define EMMC_INTSTS_RXDR (1u << 5) /* Receive FIFO data request */ |
| #define EMMC_INTSTS_TXDR (1u << 4) /* Transmit FIFO data request */ |
| #define EMMC_INTSTS_DTO (1u << 3) /* Data transfer over */ |
| #define EMMC_INTSTS_CD (1u << 2) /* Command done */ |
| #define EMMC_INTSTS_RE (1u << 1) /* Response error */ |
| #define EMMC_INTSTS_CDET (1u << 0) /* Card detect */ |
| |
| /* EMMC_STATUS */ |
| |
| #define EMMC_STATUS_DATA_BUSY (1u << 9) |
| |
| /* EMMC_FIFOTH */ |
| |
| #define EMMC_FIFOTH_MSIZE_SHIFT (28) |
| #define EMMC_FIFOTH_RX_SHIFT (16) |
| #define EMMC_FIFOTH_TX_SHIFT (0) |
| |
| /* EMMC_UHS_REG */ |
| |
| #define EMMC_UHSREG_DDR_MODE (1u << 16) |
| #define EMMC_UHSREG_18_VOLT (1u << 0) |
| |
| /* EMMC_RST_N */ |
| |
| #define EMMC_RST_N_HW_RESET (0) |
| |
| /* EMMC_BMOD */ |
| |
| #define EMMC_BMOD_IDMAC_EN (1u << 7) |
| #define EMMC_BMOD_FIXED_BURST (1u << 1) |
| #define EMMC_BMOD_SW_RESET (1u << 0) |
| |
| /* EMMC_IDSTS */ |
| |
| #define EMMC_IDSTS_INT_CLEAR (0x000003FFu) |
| #define EMMC_IDSTS_FSM (0xFu << 13) /* DMAC FSM present state */ |
| #define EMMC_IDSTS_EB_RESP (1u << 11) /* This bit valids when EMMC_IDSTS_FBE */ |
| #define EMMC_IDSTS_EB_TRANS (1u << 10) /* This bit valids when EMMC_IDSTS_FBE */ |
| #define EMMC_IDSTS_AIS (1u << 9) /* Abnormal Interrupt Summary */ |
| #define EMMC_IDSTS_NIS (1u << 8) /* Normal Interrupt Summary */ |
| #define EMMC_IDSTS_CES (1u << 5) /* Card Error Summary */ |
| #define EMMC_IDSTS_DU (1u << 4) /* Descriptor Unavailable Interrupt */ |
| #define EMMC_IDSTS_FBE (1u << 2) /* Fatal Bus Error Interrupt */ |
| #define EMMC_IDSTS_RI (1u << 1) /* Receive Interrupt */ |
| #define EMMC_IDSTS_TI (1u << 0) /* Transmit Interrupt */ |
| |
| /* EMMC_IDINTEN */ |
| |
| #define EMMC_IDINTEN_ALLDIS (0) |
| #define EMMC_IDINTEN_ALLEN (EMMC_IDSTS_INT_CLEAR) |
| |
| /* EMMC_CARDTHRCTL */ |
| |
| #define EMMC_CARD_RD_THR_SHIFT (16) |
| #define EMMC_BSYCLR_INT_EN (1u << 1) |
| #define EMMC_CARD_RD_THE_EN (1u << 0) |
| |
| /* EMMC_UHS_REG_EXT */ |
| |
| #define EMMC_EXT_CLK_MUX_CTRL_SHIFT (30) |
| #define EMMC_CLK_DRV_PHASE_CTRL_SHIFT (23) |
| #define EMMC_CLK_SMPL_PHASE_CTRL_SHIFT (16) |
| |
| /* EMMC_EMMC_DDR_REG */ |
| |
| #define EMMC_DDRREG_HALF_START (1u << 0) |
| |
| /* EMMC_ENABLE_SHIFT */ |
| |
| #define EMMC_SHIFT_NEG_EDGE (1u << 1) |
| #define EMMC_SHIFT_POS_EDGE (1u << 0) |
| #define EMMC_SHIFT_DEFAULT (0) |
| |
| /* IDMAC descriptor */ |
| |
| #define EMMC_IDMAC_TRANS_SIZE (4 * 1024) /* Data trans size per chain desc */ |
| #define EMMC_IDMAC_DES0_OWN (1u << 31) /* Owner bit */ |
| #define EMMC_IDMAC_DES0_CES (1u << 30) /* Card Error Summary */ |
| #define EMMC_IDMAC_DES0_CH (1u << 4) /* Second Address Chained */ |
| #define EMMC_IDMAC_DES0_FD (1u << 3) /* First Descriptor */ |
| #define EMMC_IDMAC_DES0_LD (1u << 2) /* Last Descriptor */ |
| #define EMMC_IDMAC_DES0_DIC (1u << 1) /* Disable Interrupt on Completion */ |
| |
| /* Command Code */ |
| |
| #define GO_IDLE_STATE 0 |
| #define SEND_OP_COND 1 |
| #define ALL_SEND_CID 2 |
| #define SET_RELATIVE_ADDR 3 |
| #define SLEEP_AWAKE 5 |
| #define SWITCH 6 |
| #define SELECT_DESELECT 7 |
| #define SEND_EXT_CSD 8 |
| #define SEND_CSD 9 |
| #define STOP_TRANS 12 |
| #define SEND_STATUS 13 |
| #define READ_MULTIPLE_BLOCK 18 |
| #define SET_BLOCK_COUNT 23 |
| #define WRITE_MULTIPLE_BLOCK 25 |
| |
| /* OCR */ |
| |
| #define OCR_1_8VOLT (1u << 7) |
| #define OCR_3_3VOLT (0x1FFu << 15) |
| #define OCR_DUAL_VOLT (OCR_1_8VOLT | OCR_3_3VOLT) |
| #define OCR_SECTOR_MODE (2u << 29) |
| #define OCR_POWER_UP (1u << 31) |
| |
| /* Device Status */ |
| |
| #define R1STATUS_ADDRESS_OUT_OF_RANGE (1u << 31) |
| #define R1STATUS_ADDRESS_MISALIGE (1u << 30) |
| #define R1STATUS_BLOCK_LEN_ERROR (1u << 29) |
| #define R1STATUS_ERASE_SEQ_ERROR (1u << 28) |
| #define R1STATUS_ERASE_PARAM (1u << 27) |
| #define R1STATUS_WP_VIOLATION (1u << 26) |
| #define R1STATUS_DEVICE_IS_LOCKED (1u << 25) |
| #define R1STATUS_LOCK_UNLOCK_FAILED (1u << 24) |
| #define R1STATUS_COM_CRC_ERROR (1u << 23) |
| #define R1STATUS_ILLEGAL_COMMAND (1u << 22) |
| #define R1STATUS_DEVICE_ECC_FAILED (1u << 21) |
| #define R1STATUS_CC_ERROR (1u << 20) |
| #define R1STATUS_ERROR (1u << 19) |
| |
| /* 18bit: Hosts should ignore this bit |
| * 17bit: Hosts should ignore this bit |
| */ |
| |
| #define R1STATUS_CID_CSD_OVERWRITE (1u << 16) |
| #define R1STATUS_WP_ERASE_SKIP (1u << 15) |
| |
| /* 14bit: Reserved. Value must be 0 */ |
| |
| #define R1STATUS_ERASE_RESET (1u << 13) |
| #define R1STATUS_CURRENT_STATE (0xFu << 9) |
| #define R1STATUS_READY_FOR_DATA (1u << 8) |
| #define R1STATUS_SWITCH_ERROR (1u << 7) |
| #define R1STATUS_EXCEPTION_EVENT (1u << 6) |
| #define R1STATUS_APP_CMD (1u << 5) |
| |
| /* 4bit: Reserved. |
| * 3-2bit: Reserved for application specific command |
| * 1-0bit: Reserved for manufacturer testmode |
| */ |
| |
| #define R1STATUS_ALL_ERR \ |
| (R1STATUS_ADDRESS_OUT_OF_RANGE | \ |
| R1STATUS_ADDRESS_MISALIGE | \ |
| R1STATUS_BLOCK_LEN_ERROR | \ |
| R1STATUS_ERASE_SEQ_ERROR | \ |
| R1STATUS_ERASE_PARAM | \ |
| R1STATUS_WP_VIOLATION | \ |
| R1STATUS_LOCK_UNLOCK_FAILED | \ |
| R1STATUS_COM_CRC_ERROR | \ |
| R1STATUS_ILLEGAL_COMMAND | \ |
| R1STATUS_DEVICE_ECC_FAILED | \ |
| R1STATUS_CC_ERROR | \ |
| R1STATUS_ERROR | \ |
| R1STATUS_CID_CSD_OVERWRITE | \ |
| R1STATUS_WP_ERASE_SKIP | \ |
| R1STATUS_ERASE_RESET | \ |
| R1STATUS_SWITCH_ERROR) |
| |
| #define R1STATUS_ALL_STAT \ |
| (R1STATUS_DEVICE_IS_LOCKED | \ |
| R1STATUS_CURRENT_STATE | \ |
| R1STATUS_EXCEPTION_EVENT | \ |
| R1STATUS_APP_CMD) |
| |
| /* EMMC_R1STATUS_CURRENT_STATE */ |
| |
| #define R1STATUS_CURSTAT_IDLE (0 << 9) |
| #define R1STATUS_CURSTAT_READY (1 << 9) |
| #define R1STATUS_CURSTAT_IDENT (2 << 9) |
| #define R1STATUS_CURSTAT_STDY (3 << 9) |
| #define R1STATUS_CURSTAT_TRAN (4 << 9) |
| #define R1STATUS_CURSTAT_DATA (5 << 9) |
| #define R1STATUS_CURSTAT_RCV (6 << 9) |
| #define R1STATUS_CURSTAT_PRG (7 << 9) |
| #define R1STATUS_CURSTAT_DIS (8 << 9) |
| #define R1STATUS_CURSTAT_BTST (9 << 9) |
| #define R1STATUS_CURSTAT_SLP (10 << 9) |
| |
| /* Extended CSD */ |
| |
| #define EXTCSD_SIZE (SECTOR_SIZE) |
| #define EXTCSD_SECTORS (EXTCSD_SIZE / SECTOR_SIZE) |
| #define EXTCSD_HC_ERASE_GRP_SIZE (224u) |
| #define EXTCSD_SEC_COUNT (212u) |
| #define EXTCSD_HS_TIMING (185u) /* High Speed Timing */ |
| #define EXTCSD_HS_TIMING_HIGH_SPEED (0x01u) |
| #define EXTCSD_BUS_WIDTH (183u) |
| #define EXTCSD_BUS_WIDTH_4BIT_SDR (0x01u) |
| #define EXTCSD_BUS_WIDTH_4BIT_DDR (0x05u) |
| |
| /* Vendor-specific Extended CSD */ |
| |
| #define EXTCSD_PON (34u) /* Power Off Notification */ |
| #define EXTCSD_PON_POWERED_ON (0x01u) |
| #define EXTCSD_PON_POWERED_OFF_LONG (0x03u) |
| |
| #endif /* __ARCH_ARM_SRC_CXD56XX_HARDWARE_CXD56_EMMC_H */ |