dev_sdmmc.h revision 1.1 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