aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal/include/mmcsd.h
blob: 8eaba8ed74974ee0af5bfeaddfb72797899a988e (plain)
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
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
/*
    ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
                 2011,2012 Giovanni Di Sirio.

    This file is part of ChibiOS/RT.

    ChibiOS/RT is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.

    ChibiOS/RT is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

/**
 * @file    mmcsd.h
 * @brief   MMC/SD cards common header.
 *
 * @addtogroup MMCSD
 * @{
 */

#ifndef _MMCSD_H_
#define _MMCSD_H_

#if HAL_USE_MMC_SPI || HAL_USE_SDC || defined(__DOXYGEN__)

/*===========================================================================*/
/* Driver constants.                                                         */
/*===========================================================================*/

/**
 * @brief   Fixed block size for MMC/SD block devices.
 */
#define MMCSD_BLOCK_SIZE                512

/**
 * @brief   Mask of error bits in R1 responses.
 */
#define MMCSD_R1_ERROR_MASK             0xFDFFE008

/**
 * @brief   Fixed pattern for CMD8.
 */
#define MMCSD_CMD8_PATTERN              0x000001AA

/**
 * @name    SD/MMC status conditions
 * @{
 */
#define MMCSD_STS_IDLE                  0
#define MMCSD_STS_READY                 1
#define MMCSD_STS_IDENT                 2
#define MMCSD_STS_STBY                  3
#define MMCSD_STS_TRAN                  4
#define MMCSD_STS_DATA                  5
#define MMCSD_STS_RCV                   6
#define MMCSD_STS_PRG                   7
#define MMCSD_STS_DIS                   8
/** @} */

/**
 * @name    SD/MMC commands
 * @{
 */
#define MMCSD_CMD_GO_IDLE_STATE         0
#define MMCSD_CMD_INIT                  1
#define MMCSD_CMD_ALL_SEND_CID          2
#define MMCSD_CMD_SEND_RELATIVE_ADDR    3
#define MMCSD_CMD_SET_BUS_WIDTH         6
#define MMCSD_CMD_SEL_DESEL_CARD        7
#define MMCSD_CMD_SEND_IF_COND          8
#define MMCSD_CMD_SEND_CSD              9
#define MMCSD_CMD_SEND_CID              10
#define MMCSD_CMD_STOP_TRANSMISSION     12
#define MMCSD_CMD_SEND_STATUS           13
#define MMCSD_CMD_SET_BLOCKLEN          16
#define MMCSD_CMD_READ_SINGLE_BLOCK     17
#define MMCSD_CMD_READ_MULTIPLE_BLOCK   18
#define MMCSD_CMD_SET_BLOCK_COUNT       23
#define MMCSD_CMD_WRITE_BLOCK           24
#define MMCSD_CMD_WRITE_MULTIPLE_BLOCK  25
#define MMCSD_CMD_ERASE_RW_BLK_START    32
#define MMCSD_CMD_ERASE_RW_BLK_END      33
#define MMCSD_CMD_ERASE                 38
#define MMCSD_CMD_APP_OP_COND           41
#define MMCSD_CMD_LOCK_UNLOCK           42
#define MMCSD_CMD_APP_CMD               55
#define MMCSD_CMD_READ_OCR              58
/** @} */

/**
 * @name   CSD record offsets
 */
/**
 * @brief  Slice position of values in CSD register.
 */
/* CSD version 2.0 */
#define MMCSD_CSD_20_CRC_SLICE                  7,1
#define MMCSD_CSD_20_FILE_FORMAT_SLICE          11,10
#define MMCSD_CSD_20_TMP_WRITE_PROTECT_SLICE    12,12
#define MMCSD_CSD_20_PERM_WRITE_PROTECT_SLICE   13,13
#define MMCSD_CSD_20_COPY_SLICE                 14,14
#define MMCSD_CSD_20_FILE_FORMAT_GRP_SLICE      15,15
#define MMCSD_CSD_20_WRITE_BL_PARTIAL_SLICE     21,21
#define MMCSD_CSD_20_WRITE_BL_LEN_SLICE         25,12
#define MMCSD_CSD_20_R2W_FACTOR_SLICE           28,26
#define MMCSD_CSD_20_WP_GRP_ENABLE_SLICE        31,31
#define MMCSD_CSD_20_WP_GRP_SIZE_SLICE          38,32
#define MMCSD_CSD_20_ERASE_SECTOR_SIZE_SLICE    45,39
#define MMCSD_CSD_20_ERASE_BLK_EN_SLICE         46,46
#define MMCSD_CSD_20_C_SIZE_SLICE               69,48
#define MMCSD_CSD_20_DSR_IMP_SLICE              76,76
#define MMCSD_CSD_20_READ_BLK_MISALIGN_SLICE    77,77
#define MMCSD_CSD_20_WRITE_BLK_MISALIGN_SLICE   78,78
#define MMCSD_CSD_20_READ_BL_PARTIAL_SLICE      79,79
#define MMCSD_CSD_20_READ_BL_LEN_SLICE          83,80
#define MMCSD_CSD_20_CCC_SLICE                  95,84
#define MMCSD_CSD_20_TRANS_SPEED_SLICE          103,96
#define MMCSD_CSD_20_NSAC_SLICE                 111,104
#define MMCSD_CSD_20_TAAC_SLICE                 119,112
#define MMCSD_CSD_20_STRUCTURE_SLICE            127,126

/* CSD version 1.0 */
#define MMCSD_CSD_10_CRC_SLICE                  MMCSD_CSD_20_CRC_SLICE
#define MMCSD_CSD_10_FILE_FORMAT_SLICE          MMCSD_CSD_20_FILE_FORMAT_SLICE
#define MMCSD_CSD_10_TMP_WRITE_PROTECT_SLICE    MMCSD_CSD_20_TMP_WRITE_PROTECT_SLICE
#define MMCSD_CSD_10_PERM_WRITE_PROTECT_SLICE   MMCSD_CSD_20_PERM_WRITE_PROTECT_SLICE
#define MMCSD_CSD_10_COPY_SLICE                 MMCSD_CSD_20_COPY_SLICE
#define MMCSD_CSD_10_FILE_FORMAT_GRP_SLICE      MMCSD_CSD_20_FILE_FORMAT_GRP_SLICE
#define MMCSD_CSD_10_WRITE_BL_PARTIAL_SLICE     MMCSD_CSD_20_WRITE_BL_PARTIAL_SLICE
#define MMCSD_CSD_10_WRITE_BL_LEN_SLICE         MMCSD_CSD_20_WRITE_BL_LEN_SLICE
#define MMCSD_CSD_10_R2W_FACTOR_SLICE           MMCSD_CSD_20_R2W_FACTOR_SLICE
#define MMCSD_CSD_10_WP_GRP_ENABLE_SLICE        MMCSD_CSD_20_WP_GRP_ENABLE_SLICE
#define MMCSD_CSD_10_WP_GRP_SIZE_SLICE          MMCSD_CSD_20_WP_GRP_SIZE_SLICE
#define MMCSD_CSD_10_ERASE_SECTOR_SIZE_SLICE    MMCSD_CSD_20_ERASE_SECTOR_SIZE_SLICE
#define MMCSD_CSD_10_ERASE_BLK_EN_SLICE         MMCSD_CSD_20_ERASE_BLK_EN_SLICE
#define MMCSD_CSD_10_C_SIZE_MULT_SLICE          49,47
#define MMCSD_CSD_10_VDD_W_CURR_MAX_SLICE       52,50
#define MMCSD_CSD_10_VDD_W_CURR_MIN_SLICE       55,53
#define MMCSD_CSD_10_VDD_R_CURR_MAX_SLICE       58,56
#define MMCSD_CSD_10_VDD_R_CURR_MIX_SLICE       61,59
#define MMCSD_CSD_10_C_SIZE_SLICE               73,62
#define MMCSD_CSD_10_DSR_IMP_SLICE              MMCSD_CSD_20_DSR_IMP_SLICE
#define MMCSD_CSD_10_READ_BLK_MISALIGN_SLICE    MMCSD_CSD_20_READ_BLK_MISALIGN_SLICE
#define MMCSD_CSD_10_WRITE_BLK_MISALIGN_SLICE   MMCSD_CSD_20_WRITE_BLK_MISALIGN_SLICE
#define MMCSD_CSD_10_READ_BL_PARTIAL_SLICE      MMCSD_CSD_20_READ_BL_PARTIAL_SLICE
#define MMCSD_CSD_10_READ_BL_LEN_SLICE          83, 80
#define MMCSD_CSD_10_CCC_SLICE                  MMCSD_CSD_20_CCC_SLICE
#define MMCSD_CSD_10_TRANS_SPEED_SLICE          MMCSD_CSD_20_TRANS_SPEED_SLICE
#define MMCSD_CSD_10_NSAC_SLICE                 MMCSD_CSD_20_NSAC_SLICE
#define MMCSD_CSD_10_TAAC_SLICE                 MMCSD_CSD_20_TAAC_SLICE
#define MMCSD_CSD_10_STRUCTURE_SLICE            MMCSD_CSD_20_STRUCTURE_SLICE
/** @} */

/*===========================================================================*/
/* Driver pre-compile time settings.                                         */
/*===========================================================================*/

/*===========================================================================*/
/* Derived constants and error checks.                                       */
/*===========================================================================*/

/*===========================================================================*/
/* Driver data structures and types.                                         */
/*===========================================================================*/

/**
 * @brief   @p MMCSDBlockDevice specific methods.
 */
#define _mmcsd_block_device_methods                                         \
  _base_block_device_methods

/**
 * @brief   @p MMCSDBlockDevice specific data.
 * @note    It is empty because @p MMCSDBlockDevice is only an interface
 *          without implementation.
 */
#define _mmcsd_block_device_data                                            \
  _base_block_device_data                                                   \
  /* Card CID.*/                                                            \
  uint32_t              cid[4];                                             \
  /* Card CSD.*/                                                            \
  uint32_t              csd[4];                                             \
  /* Total number of blocks in card.*/                                      \
  uint32_t              capacity;

/**
 * @extends BaseBlockDeviceVMT
 *
 * @brief   @p MMCSDBlockDevice virtual methods table.
 */
struct MMCSDBlockDeviceVMT {
  _base_block_device_methods
};

/**
 * @extends BaseBlockDevice
 *
 * @brief   MCC/SD block device class.
 * @details This class represents a, block-accessible, MMC/SD device.
 */
typedef struct {
  /** @brief Virtual Methods Table.*/
  const struct MMCSDBlockDeviceVMT *vmt;
  _mmcsd_block_device_data
} MMCSDBlockDevice;

/*===========================================================================*/
/* Driver macros.                                                            */
/*===========================================================================*/

/**
 * @name    Macro Functions
 * @{
 */
/**
 * @brief   Returns the card capacity in blocks.
 *
 * @param[in] ip        pointer to a @p MMCSDBlockDevice or derived class
 *
 * @return              The card capacity.
 *
 * @api
 */
#define mmcsdGetCardCapacity(ip)  ((ip)->capacity)
/** @} */

/*===========================================================================*/
/* External declarations.                                                    */
/*===========================================================================*/

#ifdef __cplusplus
extern "C" {
#endif
  uint32_t mmcsdGetCapacity(uint32_t csd[4]);
#ifdef __cplusplus
}
#endif

#endif /* HAL_USE_MMC_SPI || HAL_USE_MMC_SDC*/

#endif /* _MMCSD_H_ */

/** @} */