@@ -186,10 +186,17 @@ int SDIOBlockDevice::read(void *buffer, bd_addr_t addr, bd_size_t size)
186
186
addr = addr / _block_size;
187
187
188
188
// make sure card is ready
189
- while (SD_GetCardState () != SD_TRANSFER_OK)
190
189
{
191
- // wait until SD ready
192
- wait_ms (1 );
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
+ }
193
200
}
194
201
195
202
// receive the data : one block/ multiple blocks is handled in ReadBlocks()
@@ -199,27 +206,32 @@ int SDIOBlockDevice::read(void *buffer, bd_addr_t addr, bd_size_t size)
199
206
if (status == MSD_OK)
200
207
{
201
208
// wait until DMA finished
209
+ uint32_t tickstart = HAL_GetTick ();
202
210
while (SD_DMA_ReadPending () != SD_TRANSFER_OK)
203
211
{
204
- uint32_t tickstart = HAL_GetTick ();
205
212
if ((HAL_GetTick () - tickstart) >= MBED_CONF_SD_TIMEOUT)
206
213
{
207
214
unlock ();
208
215
return SD_BLOCK_DEVICE_ERROR_READBLOCKS;
209
216
}
210
217
}
211
218
// make sure card is ready
219
+ tickstart = HAL_GetTick ();
212
220
while (SD_GetCardState () != SD_TRANSFER_OK)
213
221
{
214
222
// wait until SD ready
215
- wait_ms (10 );
223
+ if ((HAL_GetTick () - tickstart) >= MBED_CONF_SD_TIMEOUT)
224
+ {
225
+ unlock ();
226
+ return SD_BLOCK_DEVICE_ERROR_READBLOCKS;
227
+ }
216
228
}
217
229
}
218
230
else
219
231
{
220
232
debug_if (SD_DBG, " ReadBlocks failed! addr: %lld blockCnt: %lld \n " , addr, blockCnt);
221
- debug_if (SD_DBG, " hsd.errorcode: %lu 0x%lx \n " , hsd. ErrorCode , hsd. ErrorCode );
222
- status = SD_BLOCK_DEVICE_ERROR_READBLOCKS;
233
+ unlock ( );
234
+ return SD_BLOCK_DEVICE_ERROR_READBLOCKS;
223
235
}
224
236
225
237
unlock ();
@@ -255,10 +267,17 @@ int SDIOBlockDevice::program(const void *buffer, bd_addr_t addr, bd_size_t size)
255
267
addr = addr / _block_size;
256
268
257
269
// make sure card is ready
258
- while (SD_GetCardState () != SD_TRANSFER_OK)
259
270
{
260
- // wait until SD ready
261
- wait_ms (1 );
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
+ }
262
281
}
263
282
264
283
int status = SD_WriteBlocks_DMA (_buffer, addr, blockCnt);
@@ -267,27 +286,32 @@ int SDIOBlockDevice::program(const void *buffer, bd_addr_t addr, bd_size_t size)
267
286
if (status == MSD_OK)
268
287
{
269
288
// wait until DMA finished
289
+ uint32_t tickstart = HAL_GetTick ();
270
290
while (SD_DMA_WritePending () != SD_TRANSFER_OK)
271
291
{
272
- uint32_t tickstart = HAL_GetTick ();
273
292
if ((HAL_GetTick () - tickstart) >= MBED_CONF_SD_TIMEOUT)
274
293
{
275
294
unlock ();
276
- status = SD_BLOCK_DEVICE_ERROR_WRITEBLOCKS;
295
+ return SD_BLOCK_DEVICE_ERROR_WRITEBLOCKS;
277
296
}
278
297
}
279
298
// make sure card is ready
299
+ tickstart = HAL_GetTick ();
280
300
while (SD_GetCardState () != SD_TRANSFER_OK)
281
301
{
282
302
// wait until SD ready
283
- wait_ms (1 );
303
+ if ((HAL_GetTick () - tickstart) >= MBED_CONF_SD_TIMEOUT)
304
+ {
305
+ unlock ();
306
+ return SD_BLOCK_DEVICE_ERROR_WRITEBLOCKS;
307
+ }
284
308
}
285
309
}
286
310
else
287
311
{
288
312
debug_if (SD_DBG, " WriteBlocks failed! addr: %lld blockCnt: %lld \n " , addr, blockCnt);
289
- debug_if (SD_DBG, " hsd.errorcode: %lu 0x%lx \n " , hsd. ErrorCode , hsd. ErrorCode );
290
- status = SD_BLOCK_DEVICE_ERROR_WRITEBLOCKS;
313
+ unlock ( );
314
+ return SD_BLOCK_DEVICE_ERROR_WRITEBLOCKS;
291
315
}
292
316
293
317
unlock ();
@@ -322,14 +346,20 @@ int SDIOBlockDevice::trim(bd_addr_t addr, bd_size_t size)
322
346
if (status != 0 )
323
347
{
324
348
debug_if (SD_DBG, " Erase blocks failed! addr: %lld blockCnt: %lld \n " , addr, blockCnt);
325
- status = SD_BLOCK_DEVICE_ERROR_ERASEBLOCKS;
349
+ unlock ();
350
+ return SD_BLOCK_DEVICE_ERROR_ERASEBLOCKS;
326
351
}
327
352
else
328
353
{
354
+ uint32_t tickstart = HAL_GetTick ();
329
355
while (SD_GetCardState () != SD_TRANSFER_OK)
330
356
{
331
357
// wait until SD ready
332
- wait_ms (10 );
358
+ if ((HAL_GetTick () - tickstart) >= MBED_CONF_SD_TIMEOUT)
359
+ {
360
+ unlock ();
361
+ return SD_BLOCK_DEVICE_ERROR_ERASEBLOCKS;
362
+ }
333
363
}
334
364
}
335
365
0 commit comments