1 1.1 nisimura /*- 2 1.1 nisimura * Copyright (c) 2012 The NetBSD Foundation, Inc. 3 1.1 nisimura * All rights reserved. 4 1.1 nisimura * 5 1.1 nisimura * This code is derived from software contributed to The NetBSD Foundation 6 1.1 nisimura * by Paul Fleischer <paul (at) xpg.dk> 7 1.1 nisimura * 8 1.1 nisimura * Redistribution and use in source and binary forms, with or without 9 1.1 nisimura * modification, are permitted provided that the following conditions 10 1.1 nisimura * are met: 11 1.1 nisimura * 1. Redistributions of source code must retain the above copyright 12 1.1 nisimura * notice, this list of conditions and the following disclaimer. 13 1.1 nisimura * 2. Redistributions in binary form must reproduce the above copyright 14 1.1 nisimura * notice, this list of conditions and the following disclaimer in the 15 1.1 nisimura * documentation and/or other materials provided with the distribution. 16 1.1 nisimura * 17 1.1 nisimura * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 18 1.1 nisimura * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 19 1.1 nisimura * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 20 1.1 nisimura * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 21 1.1 nisimura * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 1.1 nisimura * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 1.1 nisimura * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24 1.1 nisimura * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25 1.1 nisimura * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26 1.1 nisimura * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27 1.1 nisimura * POSSIBILITY OF SUCH DAMAGE. 28 1.1 nisimura */ 29 1.1 nisimura 30 1.1 nisimura /* 31 1.1 nisimura * Copyright (c) 2006 Uwe Stuehler <uwe (at) openbsd.org> 32 1.1 nisimura * 33 1.1 nisimura * Permission to use, copy, modify, and distribute this software for any 34 1.1 nisimura * purpose with or without fee is hereby granted, provided that the above 35 1.1 nisimura * copyright notice and this permission notice appear in all copies. 36 1.1 nisimura * 37 1.1 nisimura * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 38 1.1 nisimura * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 39 1.1 nisimura * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 40 1.1 nisimura * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 41 1.1 nisimura * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 42 1.1 nisimura * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 43 1.1 nisimura * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 44 1.1 nisimura */ 45 1.1 nisimura #ifndef _SDIF_H_ 46 1.1 nisimura #define _SDIF_H_ 47 1.1 nisimura 48 1.1 nisimura #include <sys/types.h> 49 1.1 nisimura #include <sys/queue.h> 50 1.1 nisimura 51 1.1 nisimura /* Delay function used by SD/MMC drivers */ 52 1.1 nisimura void sdmmc_delay(int); 53 1.1 nisimura 54 1.1 nisimura #define SDMMC_SECTOR_SIZE_SB 9 55 1.1 nisimura #define SDMMC_SECTOR_SIZE (1 << SDMMC_SECTOR_SIZE_SB) /* =512 */ 56 1.1 nisimura 57 1.1 nisimura struct sdmmc_csd { 58 1.1 nisimura int csdver; /* CSD structure format */ 59 1.1 nisimura u_int mmcver; /* MMC version (for CID format) */ 60 1.1 nisimura int capacity; /* total number of sectors */ 61 1.1 nisimura int read_bl_len; /* block length for reads */ 62 1.1 nisimura int write_bl_len; /* block length for writes */ 63 1.1 nisimura int r2w_factor; 64 1.1 nisimura int tran_speed; /* transfer speed (kbit/s) */ 65 1.1 nisimura int ccc; /* Card Command Class for SD */ 66 1.1 nisimura /* ... */ 67 1.1 nisimura }; 68 1.1 nisimura 69 1.1 nisimura struct sdmmc_cid { 70 1.1 nisimura int mid; /* manufacturer identification number */ 71 1.1 nisimura int oid; /* OEM/product identification number */ 72 1.1 nisimura char pnm[8]; /* product name (MMC v1 has the longest) */ 73 1.1 nisimura int rev; /* product revision */ 74 1.1 nisimura int psn; /* product serial number */ 75 1.1 nisimura int mdt; /* manufacturing date */ 76 1.1 nisimura }; 77 1.1 nisimura 78 1.1 nisimura struct sdmmc_scr { 79 1.1 nisimura int sd_spec; 80 1.1 nisimura int bus_width; 81 1.1 nisimura }; 82 1.1 nisimura 83 1.1 nisimura typedef uint32_t sdmmc_response[4]; 84 1.1 nisimura 85 1.1 nisimura struct sdmmc_command { 86 1.1 nisimura uint16_t c_opcode; /* SD or MMC command index */ 87 1.1 nisimura uint32_t c_arg; /* SD/MMC command argument */ 88 1.1 nisimura sdmmc_response c_resp; /* response buffer */ 89 1.1 nisimura /*bus_dmamap_t c_dmamap;*/ 90 1.1 nisimura void *c_data; /* buffer to send or read into */ 91 1.1 nisimura int c_datalen; /* length of data buffer */ 92 1.1 nisimura int c_blklen; /* block length */ 93 1.1 nisimura int c_flags; /* see below */ 94 1.1 nisimura #define SCF_ITSDONE (1U << 0) /* command is complete */ 95 1.1 nisimura #define SCF_RSP_PRESENT (1U << 1) 96 1.1 nisimura #define SCF_RSP_BSY (1U << 2) 97 1.1 nisimura #define SCF_RSP_136 (1U << 3) 98 1.1 nisimura #define SCF_RSP_CRC (1U << 4) 99 1.1 nisimura #define SCF_RSP_IDX (1U << 5) 100 1.1 nisimura #define SCF_CMD_READ (1U << 6) /* read command (data expected) */ 101 1.1 nisimura /* non SPI */ 102 1.1 nisimura #define SCF_CMD_AC (0U << 8) 103 1.1 nisimura #define SCF_CMD_ADTC (1U << 8) 104 1.1 nisimura #define SCF_CMD_BC (2U << 8) 105 1.1 nisimura #define SCF_CMD_BCR (3U << 8) 106 1.1 nisimura #define SCF_CMD_MASK (3U << 8) 107 1.1 nisimura /* SPI */ 108 1.1 nisimura #define SCF_RSP_SPI_S1 (1U << 10) 109 1.1 nisimura #define SCF_RSP_SPI_S2 (1U << 11) 110 1.1 nisimura #define SCF_RSP_SPI_B4 (1U << 12) 111 1.1 nisimura #define SCF_RSP_SPI_BSY (1U << 13) 112 1.1 nisimura /* response types */ 113 1.1 nisimura #define SCF_RSP_R0 0 /* none */ 114 1.1 nisimura #define SCF_RSP_R1 (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX) 115 1.1 nisimura #define SCF_RSP_R1B (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX|SCF_RSP_BSY) 116 1.1 nisimura #define SCF_RSP_R2 (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_136) 117 1.1 nisimura #define SCF_RSP_R3 (SCF_RSP_PRESENT) 118 1.1 nisimura #define SCF_RSP_R4 (SCF_RSP_PRESENT) 119 1.1 nisimura #define SCF_RSP_R5 (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX) 120 1.1 nisimura #define SCF_RSP_R5B (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX|SCF_RSP_BSY) 121 1.1 nisimura #define SCF_RSP_R6 (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX) 122 1.1 nisimura #define SCF_RSP_R7 (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX) 123 1.1 nisimura /* SPI */ 124 1.1 nisimura #define SCF_RSP_SPI_R1 (SCF_RSP_SPI_S1) 125 1.1 nisimura #define SCF_RSP_SPI_R1B (SCF_RSP_SPI_S1|SCF_RSP_SPI_BSY) 126 1.1 nisimura #define SCF_RSP_SPI_R2 (SCF_RSP_SPI_S1|SCF_RSP_SPI_S2) 127 1.1 nisimura #define SCF_RSP_SPI_R3 (SCF_RSP_SPI_S1|SCF_RSP_SPI_B4) 128 1.1 nisimura #define SCF_RSP_SPI_R4 (SCF_RSP_SPI_S1|SCF_RSP_SPI_B4) 129 1.1 nisimura #define SCF_RSP_SPI_R5 (SCF_RSP_SPI_S1|SCF_RSP_SPI_S2) 130 1.1 nisimura #define SCF_RSP_SPI_R7 (SCF_RSP_SPI_S1|SCF_RSP_SPI_B4) 131 1.1 nisimura int c_error; /* errno value on completion */ 132 1.1 nisimura 133 1.1 nisimura /* Host controller owned fields for data xfer in progress */ 134 1.1 nisimura int c_resid; /* remaining I/O */ 135 1.1 nisimura u_char *c_buf; /* remaining data */ 136 1.1 nisimura }; 137 1.1 nisimura 138 1.1 nisimura /* 139 1.1 nisimura * Decoded PC Card 16 based Card Information Structure (CIS), 140 1.1 nisimura * per card (function 0) and per function (1 and greater). 141 1.1 nisimura */ 142 1.1 nisimura struct sdmmc_cis { 143 1.1 nisimura uint16_t manufacturer; 144 1.1 nisimura #define SDMMC_VENDOR_INVALID 0xffff 145 1.1 nisimura uint16_t product; 146 1.1 nisimura #define SDMMC_PRODUCT_INVALID 0xffff 147 1.1 nisimura uint8_t function; 148 1.1 nisimura #define SDMMC_FUNCTION_INVALID 0xff 149 1.1 nisimura u_char cis1_major; 150 1.1 nisimura u_char cis1_minor; 151 1.1 nisimura char cis1_info_buf[256]; 152 1.1 nisimura char *cis1_info[4]; 153 1.1 nisimura }; 154 1.1 nisimura 155 1.1 nisimura #define SMF_INITED 0x0001 156 1.1 nisimura #define SMF_SD_MODE 0x0002 /* host in SD mode (MMC otherwise) */ 157 1.1 nisimura #define SMF_IO_MODE 0x0004 /* host in I/O mode (SD mode only) */ 158 1.1 nisimura #define SMF_MEM_MODE 0x0008 /* host in memory mode (SD or MMC) */ 159 1.1 nisimura #define SMF_CARD_PRESENT 0x4000 /* card presence noticed */ 160 1.1 nisimura #define SMF_CARD_ATTACHED 0x8000 /* card driver(s) attached */ 161 1.1 nisimura #define SMF_CARD_SDHC 0x0010 /* card is sdhc */ 162 1.1 nisimura 163 1.1 nisimura #define SMC_CAPS_AUTO_STOP 0x0001 /* send CMD12 automagically by host */ 164 1.1 nisimura #define SMC_CAPS_4BIT_MODE 0x0002 /* 4-bits data bus width */ 165 1.1 nisimura #define SMC_CAPS_DMA 0x0004 /* DMA transfer */ 166 1.1 nisimura #define SMC_CAPS_SPI_MODE 0x0008 /* SPI mode */ 167 1.1 nisimura #define SMC_CAPS_POLL_CARD_DET 0x0010 /* Polling card detect */ 168 1.1 nisimura #define SMC_CAPS_SINGLE_ONLY 0x0020 /* only single read/write */ 169 1.1 nisimura 170 1.1 nisimura #endif 171