1 // Copyright 2018 The Fuchsia Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #pragma once 6 7 #include <ddk/device.h> 8 #include <zircon/compiler.h> 9 #include "sdmmc.h" 10 11 12 #define SDIO_IO_RW_DIRECT 52 13 #define SDIO_IO_RW_DIRECT_EXTENDED 53 14 #define SDIO_SEND_OP_COND 5 15 16 #define SDIO_IO_RW_DIRECT_FLAGS SDMMC_RESP_R5 | SDMMC_CMD_TYPE_ABORT 17 #define SDIO_IO_RW_DIRECT_EXTENDED_FLAGS SDMMC_RESP_R5 | SDMMC_CMD_TYPE_ABORT | \ 18 SDMMC_RESP_DATA_PRESENT 19 #define SDIO_SEND_OP_COND_FLAGS SDMMC_RESP_R4 20 21 //(CMD5) Fields 22 #define SDIO_SEND_OP_COND_IO_OCR_33V (1 << 21) 23 #define SDIO_SEND_OP_COND_CMD_S18R (1 << 24) 24 25 //CMD5 RESP OCR Fields 26 #define SDIO_SEND_OP_COND_RESP_S18A (1 << 24) 27 #define SDIO_SEND_OP_COND_RESP_MEM_PRESENT (1 << 27) 28 #define SDIO_SEND_OP_COND_RESP_NUM_FUNC_LOC 28 29 #define SDIO_SEND_OP_COND_RESP_NUM_FUNC_MASK 0x70000000 30 31 // IO_RW_DIRECT CMD Fields 32 #define SDIO_IO_RW_DIRECT_WRITE_BYTE_LOC 0 33 #define SDIO_IO_RW_DIRECT_WRITE_BYTE_MASK 0x000000ff 34 #define SDIO_IO_RW_DIRECT_REG_ADDR_LOC 9 35 #define SDIO_IO_RW_DIRECT_REG_ADDR_MASK 0x03fffe00 36 #define SDIO_IO_RW_DIRECT_RAW_FLAG 0x08000000 37 #define SDIO_IO_RW_DIRECT_FN_IDX_LOC 28 38 #define SDIO_IO_RW_DIRECT_FN_IDX_MASK 0x70000000 39 #define SDIO_IO_RW_DIRECT_RW_FLAG 0x80000000 40 41 // IO_RW_DIRECT RESP Fields 42 #define SDIO_IO_RW_DIRECT_RESP_READ_BYTE_LOC 0 43 #define SDIO_IO_RW_DIRECT_RESP_READ_BYTE_MASK 0x000000ff 44 45 // IO_RW_EXTENDED Fields 46 #define SDIO_IO_RW_EXTD_BYTE_BLK_COUNT_LOC 0 47 #define SDIO_IO_RW_EXTD_BYTE_BLK_COUNT_MASK 0x000001ff 48 #define SDIO_IO_RW_EXTD_MAX_BLKS_PER_CMD 511 // 9 bits 49 #define SDIO_IO_RW_EXTD_REG_ADDR_LOC 9 50 #define SDIO_IO_RW_EXTD_REG_ADDR_MASK 0x03fffe00 51 #define SDIO_IO_RW_EXTD_OP_CODE_INCR 0x04000000 52 #define SDIO_IO_RW_EXTD_BLOCK_MODE 0x08000000 53 #define SDIO_IO_RW_EXTD_FN_IDX_LOC 28 54 #define SDIO_IO_RW_EXTD_FN_IDX_MASK 0x70000000 55 #define SDIO_IO_RW_EXTD_RW_FLAG 0x80000000 56 57 //SDIO CIA Fields.Refer Sec 6.8 SDIO SPEC 58 #define SDIO_CIA_CCCR_CCCR_SDIO_VER_ADDR 0x00 59 #define SDIO_CIA_CCCR_CCCR_VER_LOC 0 60 #define SDIO_CIA_CCCR_CCCR_VER_MASK 0x0f 61 #define SDIO_CIA_CCCR_SDIO_VER_LOC 4 62 #define SDIO_CIA_CCCR_SDIO_VER_MASK 0xf0 63 64 #define SDIO_CCCR_FORMAT_VER_1 0 65 #define SDIO_CCCR_FORMAT_VER_1_1 1 66 #define SDIO_CCCR_FORMAT_VER_2 2 67 #define SDIO_CCCR_FORMAT_VER_3 3 68 #define SDIO_SDIO_VER_1 0 69 #define SDIO_SDIO_VER_1_1 1 70 #define SDIO_SDIO_VER_1_2 2 71 #define SDIO_SDIO_VER_2 3 72 #define SDIO_SDIO_VER_3 4 73 74 #define SDIO_CIA_CCCR_NON_VENDOR_REG_SIZE 0x16 75 #define SDIO_CIA_CCCR_SD_FORMAT_VER_ADDR 0x01 76 #define SDIO_CIA_CCCR_IOEx_EN_FUNC_ADDR 0x02 77 #define SDIO_CIA_CCCR_IORx_FUNC_RDY_ADDR 0x03 78 79 #define SDIO_CIA_CCCR_IEN_INTR_EN_ADDR 0x04 80 #define SDIO_ALL_INTR_ENABLED_MASK 0xFE 81 82 #define SDIO_CIA_CCCR_INTx_INTR_PEN_ADDR 0x05 83 #define SDIO_CIA_CCCR_ASx_ABORT_SEL_CR_ADDR 0x06 84 #define SDIO_CIA_CCCR_ASx_ABORT_SOFT_RESET 0x08 85 86 #define SDIO_CIA_CCCR_BUS_INTF_CTRL_ADDR 0x07 87 #define SDIO_CIA_CCCR_INTF_CTRL_BW_LOC 0 88 #define SDIO_CIA_CCCR_INTF_CTRL_BW_MASK 0x03 89 #define SDIO_BW_1BIT 0 90 #define SDIO_BW_RSVD 1 91 #define SDIO_BW_4BIT 2 92 #define SDIO_CIA_CCCR_INTF_CTRL_BW_8BIT_SUPPRT 0x04 93 #define SDIO_CIA_CCCR_INTF_CTRL_CD_DISABLE 0x80 94 95 #define SDIO_CIA_CCCR_CARD_CAPS_ADDR 0x08 96 #define SDIO_CIA_CCCR_CARD_CAP_SDC 0x01 97 #define SDIO_CIA_CCCR_CARD_CAP_SMB 0x02 98 #define SDIO_CIA_CCCR_CARD_CAP_SRW 0x04 99 #define SDIO_CIA_CCCR_CARD_CAP_SBS 0x08 100 #define SDIO_CIA_CCCR_CARD_CAP_S4MI 0x10 101 #define SDIO_CIA_CCCR_CARD_CAP_E4MI 0x20 102 #define SDIO_CIA_CCCR_CARD_CAP_LSC 0x40 103 #define SDIO_CIA_CCCR_CARD_CAP_4BLS 0x80 104 105 #define SDIO_CIA_CCCR_COMMON_CIS_ADDR 0x09 // 0x09 - 0x0B 106 #define SDIO_CIS_ADDRESS_SIZE 3 //bytes 107 #define SDIO_CIA_CCCR_BUS_SUSPEND_ADDR 0x0C 108 #define SDIO_CIA_CCCR_FUNC_SEL_ADDR 0x0D 109 #define SDIO_CIA_CCCR_EXEC_FLAGS_ADDR 0x0E 110 #define SDIO_CIA_CCCR_RDY_FLAGS_ADDR 0x0F 111 #define SDIO_CIA_CCCR_FN0_BLKSIZE_ADDR 0x10 112 113 #define SDIO_CIA_CCCR_PWR_CTRL_ADDR 0x12 114 #define SDIO_CIA_CCCR_PWR_CTRL_SMPC 0x01 115 #define SDIO_CIA_CCCR_PWR_CTRL_EMPC 0x02 116 117 #define SDIO_CIA_CCCR_BUS_SPEED_SEL_ADDR 0x13 118 #define SDIO_CIA_CCCR_BUS_SPEED_SEL_SHS 0x01 119 #define SDIO_CIA_CCCR_BUS_SPEED_BSS_LOC 1 120 #define SDIO_CIA_CCCR_BUS_SPEED_BSS_MASK 0x0e 121 122 #define SDIO_BUS_SPEED_SDR12 0 123 #define SDIO_BUS_SPEED_SDR25 1 124 #define SDIO_BUS_SPEED_SDR50 2 125 #define SDIO_BUS_SPEED_SDR104 3 126 #define SDIO_BUS_SPEED_DDR50 4 127 #define SDIO_BUS_SPEED_EN_HS 1 128 129 #define SDIO_CIA_CCCR_UHS_SUPPORT_ADDR 0x14 130 #define SDIO_CIA_CCCR_UHS_SDR50 0x01 131 #define SDIO_CIA_CCCR_UHS_SDR104 0x02 132 #define SDIO_CIA_CCCR_UHS_DDR50 0x04 133 134 #define SDIO_UHS_SDR104_MAX_FREQ 208000000 135 #define SDIO_UHS_SDR50_MAX_FREQ 100000000 136 #define SDIO_UHS_DDR50_MAX_FREQ 50000000 137 #define SDIO_HS_MAX_FREQ 50000000 138 #define SDIO_DEFAULT_FREQ 25000000 139 140 #define SDIO_CIA_CCCR_DRV_STRENGTH_ADDR 0x15 141 #define SDIO_CIA_CCCR_DRV_STRENGTH_SDTA 0x01 142 #define SDIO_CIA_CCCR_DRV_STRENGTH_SDTB 0x02 143 #define SDIO_CIA_CCCR_DRV_STRENGTH_SDTD 0x04 144 #define SDIO_CIA_CCCR_DRV_STRENGTH_DTS_LOC 4 145 #define SDIO_CIA_CCCR_DRV_STRENGTH_DTS_MASK 0x30 146 #define SDIO_DRV_STRENGTH_TYPE_B 0 147 #define SDIO_DRV_STRENGTH_TYPE_A 1 148 #define SDIO_DRV_STRENGTH_TYPE_C 2 149 #define SDIO_DRV_STRENGTH_TYPE_D 3 150 151 #define SDIO_CIA_FBR_BASE_ADDR(f) ((f) * 0x100) 152 #define SDIO_CIA_FBR_STD_IF_CODE_ADDR 0x00 153 #define SDIO_CIA_FBR_STD_IF_CODE_LOC 0 154 #define SDIO_CIA_FBR_STD_IF_CODE_MASK 0x0f 155 #define SDIO_CIA_FBR_STD_IF_CODE_EXT_ADDR 0x01 156 #define SDIO_CIA_FBR_CIS_ADDR 0x09 157 #define SDIO_CIA_FBR_BLK_SIZE_ADDR 0x10 158 159 //Sec.16.5 CIS FIELDS 160 161 #define SDIO_CIS_TPL_FRMT_TCODE_OFF 0x00 162 #define SDIO_CIS_TPL_FRMT_TLINK_OFF 0x01 163 #define SDIO_CIS_TPL_FRMT_TBODY_OFF 0x02 164 165 #define SDIO_CIS_TPL_CODE_NULL 0x00 166 #define SDIO_CIS_TPL_CODE_CHECKSUM 0x10 167 #define SDIO_CIS_TPL_CODE_VES_1 0x15 168 #define SDIO_CIS_TPL_CODE_ALTSTR 0x16 169 #define SDIO_CIS_TPL_CODE_MANFID 0x20 170 #define SDIO_CIS_TPL_MANFID_MIN_BDY_SZ 4 171 #define SDIO_CIS_TPL_CODE_FUNCID 0x21 172 #define SDIO_CIS_TPL_CODE_FUNCE 0x22 173 #define SDIO_CIS_TPL_FUNC0_FUNCE_MIN_BDY_SZ 4 174 #define SDIO_CIS_TPL_FUNCx_FUNCE_MIN_BDY_SZ 42 175 #define SDIO_CIS_TPL_CODE_VENDOR_START 0x80 176 #define SDIO_CIS_TPL_CODE_VENDOR_END 0x8F 177 #define SDIO_CIS_TPL_CODE_SDIO_STD 0x91 178 #define SDIO_CIS_TPL_CODE_SDIO_EXT 0x92 179 #define SDIO_CIS_TPL_CODE_END 0xFF 180 #define SDIO_CIS_TPL_LINK_END 0xFF 181 182 #define SDIO_CIS_TPL_FUNCE_FUNC0_MAX_BLK_SIZE_LOC 1 183 #define SDIO_CIS_TPL_FUNCE_FUNCx_MAX_BLK_SIZE_LOC 12 184 #define SDIO_CIS_TPL_FUNCE_MAX_TRAN_SPEED_UNIT_LOC 0 185 #define SDIO_CIS_TPL_FUNCE_MAX_TRAN_SPEED_UNIT_MASK 0x07 186 #define SDIO_CIS_TPL_FUNCE_MAX_TRAN_SPEED_VAL_LOC 3 187 #define SDIO_CIS_TPL_FUNCE_MAX_TRAN_SPEED_VAL_MASK 0x78 188 189 //Sec.16.7.3 190 static const uint32_t sdio_cis_tpl_funce_tran_speed_val[16] = 191 {0, 100, 120, 130, 150, 200, 250, 300, 350, 400, 450, 500, 550, 600, 700, 800}; 192 static const uint32_t sdio_cis_tpl_funce_tran_speed_unit[8] = 193 {1, 10, 100, 1000, 0, 0, 0, 0 }; //Kbit/sec 194 195