summaryrefslogtreecommitdiff
path: root/nuttx/drivers/mmcsd/mmcsd_spi.h
blob: 31a888e70764f8e96a2b0ffcee253a1d5726b86f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
/****************************************************************************
 * drivers/mmcsd/mmcsd_spi.h
 *
 *   Copyright (C) 2008-2009 Gregory Nutt. All rights reserved.
 *   Author: Gregory Nutt <gnutt@nuttx.org>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 * 3. Neither the name NuttX nor the names of its contributors may be
 *    used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 ****************************************************************************/

#ifndef __DRIVERS_MMCSD_MMCSD_SPI_H
#define __DRIVERS_MMCSD_MMCSD_SPI_H

/****************************************************************************
 * Included Files
 ****************************************************************************/

#include <nuttx/config.h>

/****************************************************************************
 * Pre-processor Definitions
 ****************************************************************************/

/* SPI *******************************************************************/

/* SPI Command Set */

#define CMD0   0x40  /* GO_IDLE_STATE: Resets all cards to idle state */
#define CMD1   0x41  /* SEND_OP_COND: Sends capacity support information */
#define CMD6   0x46  /* SWITCH_FUNC: Checks switchable function */
#define CMD8   0x48  /* SEND_IF_COND: Sends SD Memory Card interface condition */
#define CMD9   0x49  /* SEND_CSD: Asks  card to send its card specific data (CSD) */
#define CMD10  0x4a  /* SEND_CID: Asks card to send its card identification (CID) */
#define CMD12  0x4c  /* STOP_TRANSMISSION: Forces the card to stop transmission */
#define CMD13  0x4d  /* SEND_STATUS: Asks card to send its status register */
#define CMD16  0x50  /* SET_BLOCKLEN: Sets a block length (in bytes) */
#define CMD17  0x51  /* READ_SINGLE_BLOCK: Reads a block of the selected size */
#define CMD18  0x52  /* READ_MULTIPLE_BLOCK: Continuously transfers blocks from card to host */
#define CMD20  0x54  /* CMD_WRITEBLOCK: Write block to memory (MMC) */
#define CMD24  0x58  /* WRITE_BLOCK: Writes a block of the selected size */
#define CMD25  0x59  /* WRITE_MULTIPLE_BLOCK: Continuously writes blocks of data */
#define CMD27  0x5b  /* PROGRAM_CSD: Set programmable bits of the CSD */
#define CMD28  0x5c  /* SET_WRITE_PROT: Sets the write protection bit of group */
#define CMD29  0x5d  /* CLR_WRITE_PROT: Clears the write protection bit of group */
#define CMD30  0x5e  /* SEND_WRITE_PROT: Asks card to send state of write protection bits */
#define CMD32  0x60  /* ERASE_WR_BLK_START_ADDR: Sets address of first block to erase */
#define CMD33  0x61  /* ERASE_WR_BLK_END_ADDR: Sets address of last block to erase */
#define CMD34  0x62  /* UNTAG_SECTOR: (MMC) */
#define CMD35  0x63  /* TAG_ERASE_GROUP_START: (MMC) */
#define CMD36  0x64  /* TAG_ERASE_GOUPR_END: (MMC) */
#define CMD37  0x65  /* UNTAG_ERASE_GROUP: (MMC) */
#define CMD38  0x66  /* ERASE: Erases all previously selected write blocks */
#define CMD40  0x68  /* CRC_ON_OFF: (MMC) */
#define CMD42  0x6a  /* LOCK_UNLOCK: Used to Set/Reset the Password or lock/unlock card */
#define CMD55  0x77  /* APP_CMD: Tells card that the next command is an application specific command */
#define CMD56  0x78  /* GEN_CMD: Used transfer a block to or get block from card */
#define CMD58  0x7a  /* READ_OCR :Reads the OCR register of a card */
#define CMD59  0x7b  /* CRC_ON_OFF: Turns the CRC option on or off */
#define ACMD13 0x4d  /* SD_STATUS: Send the SD Status */
#define ACMD22 0x56  /* SEND_NUM_WR_BLOCKS: Send number of the errorfree blocks */
#define ACMD23 0x57  /* SET_WR_BLK_ERASE_COUNT: Set number blocks to erase before writing */
#define ACMD41 0x69  /* SD_SEND_OP_COND: Sends host capacity support information */
#define ACMD42 0x6a  /* SET_CLR_CARD_DETECT: Connect/disconnect pull-up resistor on CS */
#define ACMD51 0x73  /* SEND_SCR: Reads the SD Configuration Register (SCR) */

/* SPI 8-bit R1 response */

#define MMCSD_SPIR1_OK            0x00 /* No error bits set */
#define MMCSD_SPIR1_IDLESTATE     0x01 /* Idle state */
#define MMCSD_SPIR1_ERASERESET    0x02 /* Erase reset */
#define MMCSD_SPIR1_ILLEGALCMD    0x04 /* Illegal command */
#define MMCSD_SPIR1_CRCERROR      0x08 /* Com CRC error */
#define MMCSD_SPIR1_ERASEERROR    0x10 /* Erase sequence error */
#define MMCSD_SPIR1_ADDRERROR     0x20 /* Address error */
#define MMCSD_SPIR1_PARAMERROR    0x40 /* Parameter error */

/* SPI 8-bit R2 response */

#define MMCSD_SPIR2_CARDLOCKED    0x0001 /* Card is locked */
#define MMCSD_SPIR2_WPERASESKIP   0x0002 /* WP erase skip */
#define MMCSD_SPIR2_LOCKFAIL      0x0002 /* Lock/unlock cmd failed */
#define MMCSD_SPIR2_ERROR         0x0004 /* Error */
#define MMCSD_SPIR2_CCERROR       0x0008 /* CC error */
#define MMCSD_SPIR2_CARDECCFAIL   0x0010 /* Card ECC failed */
#define MMCSD_SPIR2_WPVIOLATION   0x0020 /* WP violoation */
#define MMCSD_SPIR2_ERASEPARAM    0x0040 /* Erase parameter */
#define MMCSD_SPIR2_OUTOFRANGE    0x0080 /* Out of range */
#define MMCSD_SPIR2_CSDOVERWRITE  0x0080 /* CSD overwrite */
#define MMCSD_SPIR2_IDLESTATE     0x0100 /* In idle state */
#define MMCSD_SPIR2_ERASERESET    0x0200 /* Erase reset */
#define MMCSD_SPIR2_ILLEGALCMD    0x0400 /* Illegal command */
#define MMCSD_SPIR2_CRCERROR      0x0800 /* Com CRC error */
#define MMCSD_SPIR2_ERASEERROR    0x1000 /* Erase sequence error */
#define MMCSD_SPIR2_ADDRERROR     0x2000 /* Address error */
#define MMCSD_SPIR2_PARAMERROR    0x4000 /* Parameter error */

/* Last 4 bytes of the 5 byte R7 response */

#define MMCSD_SPIR7_VERSION_SHIFT (28)   /* Bits 28-31: Command version number */
#define MMCSD_SPIR7_VERSION_MASK  ((uint32_t)0x0f << MMCSD_SPIR7_VERSION_SHIFT)
#define MMCSD_SPIR7_VOLTAGE_SHIFT (8)    /* Bits 8-11: Voltage accepted */
#define MMCSD_SPIR7_VOLTAGE_MASK  ((uint32_t)0x0f << MMCSD_SPIR7_VOLTAGE_SHIFT)
#define   MMCSD_SPIR7_VOLTAGE_27  ((uint32_t)0x01 << MMCSD_SPIR7_VOLTAGE_SHIFT) /* 2.7-3.6V */
#define MMCSD_SPIR7_ECHO_SHIFT    (0)    /* Bits 0-7: Echoed check pattern */
#define MMCSD_SPIR7_ECHO_MASK     ((uint32_t)0xff << MMCSD_SPIR7_ECHO_SHIFT)

/* Data Response */

#define MMCSD_SPIDR_MASK          0x1f   /* Mask for valid data response bits */
#define MMCSD_SPIDR_ACCEPTED      0x05   /* Data accepted */
#define MMCSD_SPIDR_CRCERROR      0x0b   /* Data rejected due to CRC error */
#define MMCSD_SPIDR_WRERROR       0x0d   /* Data rejected due to write error */

/* Data Tokens */

#define MMCSD_SPIDT_STARTBLKSNGL  0xfe   /* First byte of block, single block */
#define MMCSD_SPIDT_STARTBLKMULTI 0xfc   /* First byte of block, multi-block */
#define MMCSD_SPIDT_STOPTRANS     0xfd   /* Stop transmission */

/* Data error token */

#define MMCSD_SPIDET_UPPER        0xf0   /* The upper four bits are zero */
#define MMCSD_SPIDET_ERROR        0x01   /* Error */
#define MMCSD_SPIDET_CCERROR      0x02   /* CC error */
#define MMCSD_SPIDET_CARDECCFAIL  0x04   /* Card ECC failed */
#define MMCSD_SPIDET_OUTOFRANGE   0x08   /* Out of range */

/* Operating Conditions register */

#define MMCSD_OCR_V27             ((uint32_t)1 << 15) /* Bit 15: 2.7-2.8V */
#define MMCSD_OCR_V28             ((uint32_t)1 << 16) /* Bit 16: 2.8-2.9V */
#define MMCSD_OCR_V29             ((uint32_t)1 << 17) /* Bit 17: 2.9-3.0V */
#define MMCSD_OCR_V30             ((uint32_t)1 << 18) /* Bit 18: 3.0-3.1V */
#define MMCSD_OCR_V31             ((uint32_t)1 << 19) /* Bit 19: 3.1-3.2V */
#define MMCSD_OCR_V32             ((uint32_t)1 << 20) /* Bit 20: 3.2-3.3V */
#define MMCSD_OCR_V33             ((uint32_t)1 << 21) /* Bit 21: 3.3-3.4V */
#define MMCSD_OCR_V34             ((uint32_t)1 << 22) /* Bit 22: 3.4-3.5V */
#define MMCSD_OCR_V35             ((uint32_t)1 << 23) /* Bit 23: 3.5-3.6V */
#define MMCSD_OCR_CCS             ((uint32_t)1 << 30) /* Bit 30: Card capacity status */
#define MMCSD_OCR_BUSY            ((uint32_t)1 << 31) /* Bit 31: Card powered up status bit */

/****************************************************************************
 * Public Types
 ****************************************************************************/

/****************************************************************************
 * Public Functions
 ****************************************************************************/

#undef EXTERN
#if defined(__cplusplus)
#define EXTERN extern "C"
extern "C" {
#else
#define EXTERN extern
#endif

#undef EXTERN
#if defined(__cplusplus)
}
#endif
#endif /* __DRIVERS_MMCSD_MMCSD_SPI_H */