blob: 90d202c5f11c50c33838c71e2337433ee7d628c2 [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#pragma once
#include <ddk/device.h>
#include <magenta/compiler.h>
__BEGIN_CDECLS;
//
// Common SD/MMC defines
//
#define SDHC_BLOCK_SIZE 512
#define SDMMC_RESP_LEN_EMPTY (0x0 << 16)
#define SDMMC_RESP_LEN_136 (0x1 << 16)
#define SDMMC_RESP_LEN_48 (0x2 << 16)
#define SDMMC_RESP_LEN_48B (0x3 << 16)
#define SDMMC_RESP_CRC_CHECK (0x1 << 19)
#define SDMMC_RESP_CMD_IDX_CHECK (0x1 << 20)
#define SDMMC_RESP_DATA_PRESENT (0x1 << 21)
#define SDMMC_CMD_TYPE_NORMAL (0x0 << 22)
#define SDMMC_CMD_TYPE_SUSPEND (0x1 << 22)
#define SDMMC_CMD_TYPE_RESUME (0x2 << 22)
#define SDMMC_CMD_TYPE_ABORT (0x3 << 22)
#define SDMMC_RESP_NONE (0x0)
#define SDMMC_RESP_R1 (SDMMC_RESP_LEN_48 | SDMMC_RESP_CMD_IDX_CHECK | SDMMC_RESP_CRC_CHECK)
#define SDMMC_RESP_R1b (SDMMC_RESP_LEN_48B | SDMMC_RESP_CMD_IDX_CHECK | SDMMC_RESP_CRC_CHECK)
#define SDMMC_RESP_R2 (SDMMC_RESP_LEN_136 | SDMMC_RESP_CRC_CHECK)
#define SDMMC_RESP_R3 (SDMMC_RESP_LEN_48)
#define SDMMC_RESP_R4 (SDMMC_RESP_LEN_48)
#define SDMMC_RESP_R5 (SDMMC_RESP_LEN_48 | SDMMC_RESP_CMD_IDX_CHECK | SDMMC_RESP_CRC_CHECK)
#define SDMMC_RESP_R5b (SDMMC_RESP_LEN_48B | SDMMC_RESP_CMD_IDX_CHECK | SDMMC_RESP_CRC_CHECK)
#define SDMMC_RESP_R6 (SDMMC_RESP_LEN_48 | SDMMC_RESP_CMD_IDX_CHECK | SDMMC_RESP_CRC_CHECK)
#define SDMMC_RESP_R7 (SDMMC_RESP_LEN_48 | SDMMC_RESP_CMD_IDX_CHECK | SDMMC_RESP_CRC_CHECK)
#define SDMMC_CMD_DMA_EN (1 << 0)
#define SDMMC_CMD_BLKCNT_EN (1 << 1)
#define SDMMC_CMD_AUTO12 (1 << 2)
#define SDMMC_CMD_AUTO23 (2 << 2)
#define SDMMC_CMD_READ (1 << 4)
#define SDMMC_CMD_MULTI_BLK (1 << 5)
#define SDMMC_COMMAND(c) ((c) << 24)
//
// SD Commands
//
#define SDMMC_GO_IDLE_STATE (SDMMC_COMMAND(0) )
#define SDMMC_ALL_SEND_CID (SDMMC_COMMAND(2) | SDMMC_RESP_R2)
#define SDMMC_SEND_RELATIVE_ADDR (SDMMC_COMMAND(3) | SDMMC_RESP_R6)
#define SDMMC_SET_DSR (SDMMC_COMMAND(4) )
#define SDMMC_IO_SET_OP_COND (SDMMC_COMMAND(5) | SDMMC_RESP_R4)
#define SDMMC_SWITCH_FUNC (SDMMC_COMMAND(6) | SDMMC_RESP_R1)
#define SDMMC_SELECT_CARD (SDMMC_COMMAND(7) | SDMMC_RESP_R1b)
#define SDMMC_SEND_IF_COND (SDMMC_COMMAND(8) | SDMMC_RESP_R7)
#define SDMMC_SEND_CSD (SDMMC_COMMAND(9) | SDMMC_RESP_R2)
#define SDMMC_SEND_CID (SDMMC_COMMAND(10) | SDMMC_RESP_R2)
#define SDMMC_VOLTAGE_SWITCH (SDMMC_COMMAND(11) | SDMMC_RESP_R1)
#define SDMMC_STOP_TRANSMISSION (SDMMC_COMMAND(12) | SDMMC_RESP_R1b | SDMMC_CMD_TYPE_ABORT)
#define SDMMC_SEND_STATUS (SDMMC_COMMAND(13) | SDMMC_RESP_R1)
#define SDMMC_GO_INACTIVE_STATE (SDMMC_COMMAND(15) )
#define SDMMC_SET_BLOCKLEN (SDMMC_COMMAND(16) | SDMMC_RESP_R1)
#define SDMMC_READ_BLOCK (SDMMC_COMMAND(17) | SDMMC_RESP_R1 | SDMMC_RESP_DATA_PRESENT | SDMMC_CMD_READ)
#define SDMMC_READ_MULTIPLE_BLOCK (SDMMC_COMMAND(18) | SDMMC_RESP_R1 | SDMMC_RESP_DATA_PRESENT | SDMMC_CMD_READ | SDMMC_CMD_MULTI_BLK | SDMMC_CMD_BLKCNT_EN)
#define SDMMC_SEND_TUNING_BLOCK (SDMMC_COMMAND(19) | SDMMC_RESP_R1 | SDMMC_RESP_DATA_PRESENT | SDMMC_CMD_READ)
#define SDMMC_SPEED_CLASS_CONTROL (SDMMC_COMMAND(20) | SDMMC_RESP_R1b)
#define SDMMC_SET_BLOCK_COUNT (SDMMC_COMMAND(23) | SDMMC_RESP_R1)
#define SDMMC_WRITE_BLOCK (SDMMC_COMMAND(24) | SDMMC_RESP_R1 | SDMMC_RESP_DATA_PRESENT)
#define SDMMC_WRITE_MULTIPLE_BLOCK (SDMMC_COMMAND(25) | SDMMC_RESP_R1 | SDMMC_RESP_DATA_PRESENT | SDMMC_CMD_MULTI_BLK | SDMMC_CMD_BLKCNT_EN)
#define SDMMC_PROGRAM_CSD (SDMMC_COMMAND(27) | SDMMC_RESP_R1 | SDMMC_RESP_DATA_PRESENT)
#define SDMMC_SET_WRITE_PROT (SDMMC_COMMAND(28) | SDMMC_RESP_R1b)
#define SDMMC_CLR_WRITE_PROT (SDMMC_COMMAND(29) | SDMMC_RESP_R1b)
#define SDMMC_SEND_WRITE_PROT (SDMMC_COMMAND(30) | SDMMC_RESP_R1 | SDMMC_RESP_DATA_PRESENT | SDMMC_CMD_READ)
#define SDMMC_ERASE_WR_BLK_START (SDMMC_COMMAND(32) | SDMMC_RESP_R1)
#define SDMMC_ERASE_WR_BLK_END (SDMMC_COMMAND(33) | SDMMC_RESP_R1)
#define SDMMC_ERASE (SDMMC_COMMAND(38) | SDMMC_RESP_R1b)
#define SDMMC_LOCK_UNLOCK (SDMMC_COMMAND(42) | SDMMC_RESP_R1)
#define SDMMC_APP_CMD (SDMMC_COMMAND(55) | SDMMC_RESP_R1)
#define SDMMC_GEN_CMD (SDMMC_COMMAND(56) | SDMMC_RESP_R1 | SD_CMD_ISDATA)
#define SDMMC_SET_BUS_WIDTH (SDMMC_COMMAND(6) | SDMMC_RESP_R1)
#define SDMMC_SD_STATUS (SDMMC_COMMAND(13) | SDMMC_RESP_R1)
#define SDMMC_SEND_NUM_WR_BLOCKS (SDMMC_COMMAND(22) | SDMMC_RESP_R1 | SDMMC_RESP_DATA_PRESENT | SDMMC_CMD_READ)
#define SDMMC_SET_WR_BLK_ERASE_COUNT (SDMMC_COMMAND(23) | SDMMC_RESP_R1)
#define SDMMC_SD_SEND_OP_COND (SDMMC_COMMAND(41) | SDMMC_RESP_R3)
#define SDMMC_SET_CLR_CARD_DETECT (SDMMC_COMMAND(42) | SDMMC_RESP_R1)
#define SDMMC_SEND_SCR (SDMMC_COMMAND(51) | SDMMC_RESP_R1 | SDMMC_RESP_DATA_PRESENT | SDMMC_CMD_READ)
//
// MMC Commands
//
#define MMC_SEND_OP_COND (SDMMC_COMMAND(1) | SDMMC_RESP_R3)
#define MMC_ALL_SEND_CID (SDMMC_COMMAND(2) | SDMMC_RESP_R2)
#define MMC_SET_RELATIVE_ADDR (SDMMC_COMMAND(3) | SDMMC_RESP_R1)
#define MMC_SWITCH (SDMMC_COMMAND(6) | SDMMC_RESP_R1b)
#define MMC_SELECT_CARD (SDMMC_COMMAND(7) | SDMMC_RESP_R1)
#define MMC_SEND_EXT_CSD (SDMMC_COMMAND(8) | SDMMC_RESP_R1 | SDMMC_RESP_DATA_PRESENT | SDMMC_CMD_READ)
#define MMC_SEND_CSD (SDMMC_COMMAND(9) | SDMMC_RESP_R2)
#define MMC_SEND_STATUS (SDMMC_COMMAND(13) | SDMMC_RESP_R1)
#define MMC_SEND_TUNING_BLOCK (SDMMC_COMMAND(21) | SDMMC_RESP_R1)
// CID fields (SD/MMC)
#define MMC_CID_SPEC_VRSN_40 3
// EXT_CSD fields (MMC)
#define MMC_EXT_CSD_BUS_WIDTH 183
#define MMC_EXT_CSD_BUS_WIDTH_8_DDR 6
#define MMC_EXT_CSD_BUS_WIDTH_4_DDR 5
#define MMC_EXT_CSD_BUS_WIDTH_8 2
#define MMC_EXT_CSD_BUS_WIDTH_4 1
#define MMC_EXT_CSD_BUS_WIDTH_1 0
#define MMC_EXT_CSD_HS_TIMING 185
#define MMC_EXT_CSD_HS_TIMING_LEGACY 0
#define MMC_EXT_CSD_HS_TIMING_HS 1
#define MMC_EXT_CSD_HS_TIMING_HS200 2
#define MMC_EXT_CSD_HS_TIMING_HS400 3
#define MMC_EXT_CSD_DEVICE_TYPE 196
// Device register (CMD13 response) fields (SD/MMC)
#define MMC_STATUS_ADDR_OUT_OF_RANGE (1 << 31)
#define MMC_STATUS_ADDR_MISALIGN (1 << 30)
#define MMC_STATUS_BLOCK_LEN_ERR (1 << 29)
#define MMC_STATUS_ERASE_SEQ_ERR (1 << 28)
#define MMC_STATUS_ERASE_PARAM (1 << 27)
#define MMC_STATUS_WP_VIOLATION (1 << 26)
#define MMC_STATUS_DEVICE_LOCKED (1 << 25)
#define MMC_STATUS_LOCK_UNLOCK_FAILED (1 << 24)
#define MMC_STATUS_COM_CRC_ERR (1 << 23)
#define MMC_STATUS_ILLEGAL_COMMAND (1 << 22)
#define MMC_STATUS_DEVICE_ECC_FAILED (1 << 21)
#define MMC_STATUS_CC_ERR (1 << 20)
#define MMC_STATUS_ERR (1 << 19)
#define MMC_STATUS_CXD_OVERWRITE (1 << 16)
#define MMC_STATUS_WP_ERASE_SKIP (1 << 15)
#define MMC_STATUS_ERASE_RESET (1 << 13)
#define MMC_STATUS_CURRENT_STATE_MASK (0xf << 9)
#define MMC_STATUS_READY_FOR_DATA (1 << 8)
#define MMC_STATUS_SWITCH_ERR (1 << 7)
#define MMC_STATUS_EXCEPTION_EVENT (1 << 6)
#define MMC_STATUS_APP_CMD (1 << 5)
__END_CDECLS;