1
1
/* mbed Microcontroller Library
2
- * Copyright (c) 2017 ARM Limited
2
+ * Copyright (c) 2019 ARM Limited
3
+ * SPDX-License-Identifier: Apache-2.0
3
4
*
4
5
* Licensed under the Apache License, Version 2.0 (the "License");
5
6
* you may not use this file except in compliance with the License.
14
15
* limitations under the License.
15
16
*/
16
17
17
- #include < errno.h>
18
- #include " platform/mbed_debug.h"
19
- #include " platform/mbed_wait_api.h"
20
18
#include " SDIOBlockDevice.h"
19
+ #include " platform/mbed_debug.h"
20
+ #include " sdio_device.h"
21
21
22
- namespace mbed
23
- {
22
+ using namespace mbed ;
24
23
25
24
/*
26
25
* defines
@@ -63,17 +62,14 @@ SDIOBlockDevice::SDIOBlockDevice(PinName cardDetect) : _cardDetect(cardDetect),
63
62
_sectors(0 ),
64
63
_init_ref_count(0 )
65
64
{
66
- _card_type = SDCARD_NONE;
67
-
68
65
// Only HC block size is supported.
69
66
_block_size = BLOCK_SIZE_HC;
70
67
_erase_size = BLOCK_SIZE_HC;
71
68
}
72
69
73
70
SDIOBlockDevice::~SDIOBlockDevice ()
74
71
{
75
- if (_is_initialized)
76
- {
72
+ if (_is_initialized) {
77
73
deinit ();
78
74
}
79
75
}
@@ -84,48 +80,39 @@ int SDIOBlockDevice::init()
84
80
85
81
lock ();
86
82
87
- if (!_is_initialized)
88
- {
83
+ if (!_is_initialized) {
89
84
_init_ref_count = 0 ;
90
85
}
91
86
92
87
_init_ref_count++;
93
88
94
- if (_init_ref_count != 1 )
95
- {
89
+ if (_init_ref_count != 1 ) {
96
90
unlock ();
97
91
return BD_ERROR_OK;
98
92
}
99
93
100
- if (isPresent () == false )
101
- {
94
+ if (isPresent () == false ) {
102
95
unlock ();
103
96
return SD_BLOCK_DEVICE_ERROR_NO_DEVICE;
104
97
}
105
98
106
- int status = SD_Init ();
107
- if (BD_ERROR_OK != status)
108
- {
99
+ int status = SDIO_Device_Init ();
100
+ if (BD_ERROR_OK != status) {
109
101
unlock ();
110
102
return BD_ERROR_DEVICE_ERROR;
111
103
}
112
104
113
- SD_GetCardInfo (&_cardInfo);
114
105
_is_initialized = true ;
115
- debug_if (SD_DBG, " SD initialized: type: %d version: %d class: %d\n " ,
116
- _cardInfo.CardType , _cardInfo.CardVersion , _cardInfo.Class );
117
- debug_if (SD_DBG, " SD size: %d MB\n " ,
118
- _cardInfo.LogBlockNbr / 2 / 1024 );
119
106
120
107
// get sectors count from cardinfo
121
- _sectors = _cardInfo.LogBlockNbr ;
122
- if (BLOCK_SIZE_HC != _cardInfo.BlockSize )
123
- {
108
+ _sectors = SDIO_Device_GetBlockCount ();
109
+ if (BLOCK_SIZE_HC != SDIO_Device_GetBlockSize ()) {
124
110
unlock ();
125
111
return SD_BLOCK_DEVICE_ERROR_UNSUPPORTED_BLOCKSIZE;
126
112
}
127
113
128
114
unlock ();
115
+
129
116
return status;
130
117
}
131
118
@@ -134,22 +121,20 @@ int SDIOBlockDevice::deinit()
134
121
debug_if (SD_DBG, " deinit Card...\r\n " );
135
122
lock ();
136
123
137
- if (!_is_initialized)
138
- {
124
+ if (!_is_initialized) {
139
125
_init_ref_count = 0 ;
140
126
unlock ();
141
127
return BD_ERROR_OK;
142
128
}
143
129
144
130
_init_ref_count--;
145
131
146
- if (_init_ref_count)
147
- {
132
+ if (_init_ref_count) {
148
133
unlock ();
149
134
return BD_ERROR_OK;
150
135
}
151
136
152
- int status = SD_DeInit ();
137
+ int status = SDIO_Device_DeInit ();
153
138
_is_initialized = false ;
154
139
155
140
_sectors = 0 ;
@@ -161,19 +146,16 @@ int SDIOBlockDevice::deinit()
161
146
int SDIOBlockDevice::read (void *buffer, bd_addr_t addr, bd_size_t size)
162
147
{
163
148
lock ();
164
- if (isPresent () == false )
165
- {
149
+ if (isPresent () == false ) {
166
150
unlock ();
167
151
return SD_BLOCK_DEVICE_ERROR_NO_DEVICE;
168
152
}
169
- if (!is_valid_read (addr, size))
170
- {
153
+ if (!is_valid_read (addr, size)) {
171
154
unlock ();
172
155
return SD_BLOCK_DEVICE_ERROR_PARAMETER;
173
156
}
174
157
175
- if (!_is_initialized)
176
- {
158
+ if (!_is_initialized) {
177
159
unlock ();
178
160
return SD_BLOCK_DEVICE_ERROR_NO_INIT;
179
161
}
@@ -185,76 +167,33 @@ int SDIOBlockDevice::read(void *buffer, bd_addr_t addr, bd_size_t size)
185
167
bd_addr_t blockCnt = size / _block_size;
186
168
addr = addr / _block_size;
187
169
188
- // make sure card is ready
189
- {
190
- uint32_t tickstart = HAL_GetTick ();
191
- while (SD_GetCardState () != SD_TRANSFER_OK)
192
- {
193
- // wait until SD ready
194
- if ((HAL_GetTick () - tickstart) >= MBED_CONF_SD_TIMEOUT)
195
- {
196
- unlock ();
197
- return SD_BLOCK_DEVICE_ERROR_READBLOCKS;
198
- }
199
- }
200
- }
201
-
202
170
// receive the data : one block/ multiple blocks is handled in ReadBlocks()
203
- int status = SD_ReadBlocks_DMA (_buffer, addr, blockCnt);
171
+ int status = SDIO_Device_ReadBlocks (_buffer, addr, blockCnt, MBED_CONF_SD_TIMEOUT );
204
172
debug_if (SD_DBG, " ReadBlocks dbgtest addr: %lld blockCnt: %lld \n " , addr, blockCnt);
205
-
206
- if (status == MSD_OK)
207
- {
208
- // wait until DMA finished
209
- uint32_t tickstart = HAL_GetTick ();
210
- while (SD_DMA_ReadPending () != SD_TRANSFER_OK)
211
- {
212
- if ((HAL_GetTick () - tickstart) >= MBED_CONF_SD_TIMEOUT)
213
- {
214
- unlock ();
215
- return SD_BLOCK_DEVICE_ERROR_READBLOCKS;
216
- }
217
- }
218
- // make sure card is ready
219
- tickstart = HAL_GetTick ();
220
- while (SD_GetCardState () != SD_TRANSFER_OK)
221
- {
222
- // wait until SD ready
223
- if ((HAL_GetTick () - tickstart) >= MBED_CONF_SD_TIMEOUT)
224
- {
225
- unlock ();
226
- return SD_BLOCK_DEVICE_ERROR_READBLOCKS;
227
- }
228
- }
229
- }
230
- else
231
- {
173
+ if (status != MSD_OK) {
232
174
debug_if (SD_DBG, " ReadBlocks failed! addr: %lld blockCnt: %lld \n " , addr, blockCnt);
233
- unlock ();
234
- return SD_BLOCK_DEVICE_ERROR_READBLOCKS;
175
+ status = SD_BLOCK_DEVICE_ERROR_READBLOCKS;
235
176
}
236
177
237
178
unlock ();
179
+
238
180
return status;
239
181
}
240
182
241
183
int SDIOBlockDevice::program (const void *buffer, bd_addr_t addr, bd_size_t size)
242
184
{
243
185
lock ();
244
186
245
- if (isPresent () == false )
246
- {
187
+ if (isPresent () == false ) {
247
188
unlock ();
248
189
return SD_BLOCK_DEVICE_ERROR_NO_DEVICE;
249
190
}
250
- if (!is_valid_program (addr, size))
251
- {
191
+ if (!is_valid_program (addr, size)) {
252
192
unlock ();
253
193
return SD_BLOCK_DEVICE_ERROR_PARAMETER;
254
194
}
255
195
256
- if (!_is_initialized)
257
- {
196
+ if (!_is_initialized) {
258
197
unlock ();
259
198
return SD_BLOCK_DEVICE_ERROR_NO_INIT;
260
199
}
@@ -266,101 +205,44 @@ int SDIOBlockDevice::program(const void *buffer, bd_addr_t addr, bd_size_t size)
266
205
bd_size_t blockCnt = size / _block_size;
267
206
addr = addr / _block_size;
268
207
269
- // make sure card is ready
270
- {
271
- uint32_t tickstart = HAL_GetTick ();
272
- while (SD_GetCardState () != SD_TRANSFER_OK)
273
- {
274
- // wait until SD ready
275
- if ((HAL_GetTick () - tickstart) >= MBED_CONF_SD_TIMEOUT)
276
- {
277
- unlock ();
278
- return SD_BLOCK_DEVICE_ERROR_WRITEBLOCKS;
279
- }
280
- }
281
- }
282
-
283
- int status = SD_WriteBlocks_DMA (_buffer, addr, blockCnt);
208
+ int status = SDIO_Device_WriteBlocks (_buffer, addr, blockCnt, MBED_CONF_SD_TIMEOUT);
284
209
debug_if (SD_DBG, " WriteBlocks dbgtest addr: %lld blockCnt: %lld \n " , addr, blockCnt);
285
210
286
- if (status == MSD_OK)
287
- {
288
- // wait until DMA finished
289
- uint32_t tickstart = HAL_GetTick ();
290
- while (SD_DMA_WritePending () != SD_TRANSFER_OK)
291
- {
292
- if ((HAL_GetTick () - tickstart) >= MBED_CONF_SD_TIMEOUT)
293
- {
294
- unlock ();
295
- return SD_BLOCK_DEVICE_ERROR_WRITEBLOCKS;
296
- }
297
- }
298
- // make sure card is ready
299
- tickstart = HAL_GetTick ();
300
- while (SD_GetCardState () != SD_TRANSFER_OK)
301
- {
302
- // wait until SD ready
303
- if ((HAL_GetTick () - tickstart) >= MBED_CONF_SD_TIMEOUT)
304
- {
305
- unlock ();
306
- return SD_BLOCK_DEVICE_ERROR_WRITEBLOCKS;
307
- }
308
- }
309
- }
310
- else
311
- {
211
+ if (status != MSD_OK) {
312
212
debug_if (SD_DBG, " WriteBlocks failed! addr: %lld blockCnt: %lld \n " , addr, blockCnt);
313
- unlock ();
314
- return SD_BLOCK_DEVICE_ERROR_WRITEBLOCKS;
213
+ status = SD_BLOCK_DEVICE_ERROR_WRITEBLOCKS;
315
214
}
316
215
317
216
unlock ();
217
+
318
218
return status;
319
219
}
320
220
321
221
int SDIOBlockDevice::trim (bd_addr_t addr, bd_size_t size)
322
222
{
323
223
debug_if (SD_DBG, " trim Card...\r\n " );
324
224
lock ();
325
- if (isPresent () == false )
326
- {
225
+ if (isPresent () == false ) {
327
226
unlock ();
328
227
return SD_BLOCK_DEVICE_ERROR_NO_DEVICE;
329
228
}
330
- if (!_is_valid_trim (addr, size))
331
- {
229
+ if (!_is_valid_trim (addr, size)) {
332
230
unlock ();
333
231
return SD_BLOCK_DEVICE_ERROR_PARAMETER;
334
232
}
335
233
336
- if (!_is_initialized)
337
- {
234
+ if (!_is_initialized) {
338
235
unlock ();
339
236
return SD_BLOCK_DEVICE_ERROR_NO_INIT;
340
237
}
341
238
342
239
bd_size_t blockCnt = size / _block_size;
343
240
addr = addr / _block_size;
344
241
345
- int status = SD_Erase (addr, blockCnt);
346
- if (status != 0 )
347
- {
242
+ int status = SDIO_Device_Erase (addr, blockCnt, MBED_CONF_SD_TIMEOUT);
243
+ if (status != 0 ) {
348
244
debug_if (SD_DBG, " Erase blocks failed! addr: %lld blockCnt: %lld \n " , addr, blockCnt);
349
- unlock ();
350
- return SD_BLOCK_DEVICE_ERROR_ERASEBLOCKS;
351
- }
352
- else
353
- {
354
- uint32_t tickstart = HAL_GetTick ();
355
- while (SD_GetCardState () != SD_TRANSFER_OK)
356
- {
357
- // wait until SD ready
358
- if ((HAL_GetTick () - tickstart) >= MBED_CONF_SD_TIMEOUT)
359
- {
360
- unlock ();
361
- return SD_BLOCK_DEVICE_ERROR_ERASEBLOCKS;
362
- }
363
- }
245
+ status = SD_BLOCK_DEVICE_ERROR_ERASEBLOCKS;
364
246
}
365
247
366
248
unlock ();
@@ -404,4 +286,7 @@ bool SDIOBlockDevice::isPresent(void)
404
286
}
405
287
}
406
288
407
- } // namespace mbed
289
+ const char *SDIOBlockDevice::get_type () const
290
+ {
291
+ return " SDIO" ;
292
+ }
0 commit comments