Skip to content
This repository was archived by the owner on Jan 1, 2019. It is now read-only.

Commit 1d7fb82

Browse files
committed
stmhal: Change 64-bit arithmetic to 32-bit for SD card block addressing.
By measuring SD card addresses in blocks and not bytes, one can get away with using 32-bit numbers. This patch also uses proper atomic lock/unlock around SD card read/write, adds SD.info() function, and gives error code for failed read/writes.
1 parent 6ff42c5 commit 1d7fb82

File tree

8 files changed

+124
-81
lines changed

8 files changed

+124
-81
lines changed

stmhal/diskio.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ DRESULT disk_read (
127127

128128
#if MICROPY_HW_HAS_SDCARD
129129
case PD_SDCARD:
130-
if (!sdcard_read_blocks(buff, sector, count)) {
130+
if (sdcard_read_blocks(buff, sector, count) != 0) {
131131
return RES_ERROR;
132132
}
133133
return RES_OK;
@@ -160,7 +160,7 @@ DRESULT disk_write (
160160

161161
#if MICROPY_HW_HAS_SDCARD
162162
case PD_SDCARD:
163-
if (!sdcard_write_blocks(buff, sector, count)) {
163+
if (sdcard_write_blocks(buff, sector, count) != 0) {
164164
return RES_ERROR;
165165
}
166166
return RES_OK;

stmhal/hal/inc/stm32f4xx_hal_sd.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -630,8 +630,9 @@ void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd);
630630
* @{
631631
*/
632632
/* Blocking mode: Polling */
633-
HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks);
634-
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks);
633+
// dpgeorge: read/write functions renamed to emphasise that address is given by block number
634+
HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_BlockNumber(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint32_t BlockNumber, uint32_t BlockSize, uint32_t NumberOfBlocks);
635+
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_BlockNumber(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint32_t BlockNumber, uint32_t BlockSize, uint32_t NumberOfBlocks);
635636
HAL_SD_ErrorTypedef HAL_SD_Erase(SD_HandleTypeDef *hsd, uint64_t startaddr, uint64_t endaddr);
636637

637638
/* Non-Blocking mode: Interrupt */
@@ -646,8 +647,9 @@ void HAL_SD_XferCpltCallback(SD_HandleTypeDef *hsd);
646647
void HAL_SD_XferErrorCallback(SD_HandleTypeDef *hsd);
647648

648649
/* Non-Blocking mode: DMA */
649-
HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks);
650-
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks);
650+
// dpgeorge: read/write functions renamed to emphasise that address is given by block number
651+
HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_BlockNumber_DMA(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint32_t BlockNumber, uint32_t BlockSize, uint32_t NumberOfBlocks);
652+
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_BlockNumber_DMA(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint32_t BlockNumber, uint32_t BlockSize, uint32_t NumberOfBlocks);
651653
HAL_SD_ErrorTypedef HAL_SD_CheckWriteOperation(SD_HandleTypeDef *hsd, uint32_t Timeout);
652654
HAL_SD_ErrorTypedef HAL_SD_CheckReadOperation(SD_HandleTypeDef *hsd, uint32_t Timeout);
653655
/**

stmhal/hal/src/stm32f4xx_hal_sd.c

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -449,13 +449,13 @@ __weak void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd)
449449
* is managed by polling mode.
450450
* @param hsd: SD handle
451451
* @param pReadBuffer: pointer to the buffer that will contain the received data
452-
* @param ReadAddr: Address from where data is to be read
452+
* @param BlockNumber: Block number from where data is to be read (byte address = BlockNumber * BlockSize)
453453
* @param BlockSize: SD card Data block size
454454
* This parameter should be 512
455455
* @param NumberOfBlocks: Number of SD blocks to read
456456
* @retval SD Card error state
457457
*/
458-
HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks)
458+
HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_BlockNumber(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint32_t BlockNumber, uint32_t BlockSize, uint32_t NumberOfBlocks)
459459
{
460460
SDIO_CmdInitTypeDef sdio_cmdinitstructure;
461461
SDIO_DataInitTypeDef sdio_datainitstructure;
@@ -465,10 +465,16 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuff
465465
/* Initialize data control register */
466466
hsd->Instance->DCTRL = 0;
467467

468+
uint32_t ReadAddr;
468469
if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
469470
{
470471
BlockSize = 512;
471-
ReadAddr /= 512;
472+
ReadAddr = BlockNumber;
473+
}
474+
else
475+
{
476+
// should not overflow for standard-capacity cards
477+
ReadAddr = BlockNumber * BlockSize;
472478
}
473479

474480
/* Set Block Size for Card */
@@ -507,7 +513,7 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuff
507513
sdio_cmdinitstructure.CmdIndex = SD_CMD_READ_SINGLE_BLOCK;
508514
}
509515

510-
sdio_cmdinitstructure.Argument = (uint32_t)ReadAddr;
516+
sdio_cmdinitstructure.Argument = ReadAddr;
511517
SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
512518

513519
/* Read block(s) in polling mode */
@@ -633,13 +639,13 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuff
633639
* transfer is managed by polling mode.
634640
* @param hsd: SD handle
635641
* @param pWriteBuffer: pointer to the buffer that will contain the data to transmit
636-
* @param WriteAddr: Address from where data is to be written
642+
* @param BlockNumber: Block number to where data is to be written (byte address = BlockNumber * BlockSize)
637643
* @param BlockSize: SD card Data block size
638644
* This parameter should be 512.
639645
* @param NumberOfBlocks: Number of SD blocks to write
640646
* @retval SD Card error state
641647
*/
642-
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks)
648+
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_BlockNumber(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint32_t BlockNumber, uint32_t BlockSize, uint32_t NumberOfBlocks)
643649
{
644650
SDIO_CmdInitTypeDef sdio_cmdinitstructure;
645651
SDIO_DataInitTypeDef sdio_datainitstructure;
@@ -651,10 +657,16 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBu
651657
/* Initialize data control register */
652658
hsd->Instance->DCTRL = 0;
653659

660+
uint32_t WriteAddr;
654661
if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
655662
{
656663
BlockSize = 512;
657-
WriteAddr /= 512;
664+
WriteAddr = BlockNumber;
665+
}
666+
else
667+
{
668+
// should not overflow for standard-capacity cards
669+
WriteAddr = BlockNumber * BlockSize;
658670
}
659671

660672
/* Set Block Size for Card */
@@ -684,7 +696,7 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBu
684696
sdio_cmdinitstructure.CmdIndex = SD_CMD_WRITE_SINGLE_BLOCK;
685697
}
686698

687-
sdio_cmdinitstructure.Argument = (uint32_t)WriteAddr;
699+
sdio_cmdinitstructure.Argument = WriteAddr;
688700
SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
689701

690702
/* Check for error conditions */
@@ -851,13 +863,13 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBu
851863
* to check the completion of the read process
852864
* @param hsd: SD handle
853865
* @param pReadBuffer: Pointer to the buffer that will contain the received data
854-
* @param ReadAddr: Address from where data is to be read
866+
* @param BlockNumber: Block number from where data is to be read (byte address = BlockNumber * BlockSize)
855867
* @param BlockSize: SD card Data block size
856868
* This paramater should be 512.
857869
* @param NumberOfBlocks: Number of blocks to read.
858870
* @retval SD Card error state
859871
*/
860-
HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks)
872+
HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_BlockNumber_DMA(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint32_t BlockNumber, uint32_t BlockSize, uint32_t NumberOfBlocks)
861873
{
862874
SDIO_CmdInitTypeDef sdio_cmdinitstructure;
863875
SDIO_DataInitTypeDef sdio_datainitstructure;
@@ -898,10 +910,16 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pRead
898910
/* Enable the DMA Stream */
899911
HAL_DMA_Start_IT(hsd->hdmarx, (uint32_t)&hsd->Instance->FIFO, (uint32_t)pReadBuffer, (uint32_t)(BlockSize * NumberOfBlocks));
900912

913+
uint32_t ReadAddr;
901914
if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
902915
{
903916
BlockSize = 512;
904-
ReadAddr /= 512;
917+
ReadAddr = BlockNumber;
918+
}
919+
else
920+
{
921+
// should not overflow for standard-capacity cards
922+
ReadAddr = BlockNumber * BlockSize;
905923
}
906924

907925
/* Set Block Size for Card */
@@ -941,7 +959,7 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pRead
941959
sdio_cmdinitstructure.CmdIndex = SD_CMD_READ_SINGLE_BLOCK;
942960
}
943961

944-
sdio_cmdinitstructure.Argument = (uint32_t)ReadAddr;
962+
sdio_cmdinitstructure.Argument = ReadAddr;
945963
SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
946964

947965
/* Check for error conditions */
@@ -968,13 +986,13 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pRead
968986
* to check the completion of the write process (by SD current status polling).
969987
* @param hsd: SD handle
970988
* @param pWriteBuffer: pointer to the buffer that will contain the data to transmit
971-
* @param WriteAddr: Address from where data is to be read
989+
* @param BlockNumber: Block number to where data is to be written (byte address = BlockNumber * BlockSize)
972990
* @param BlockSize: the SD card Data block size
973991
* This parameter should be 512.
974992
* @param NumberOfBlocks: Number of blocks to write
975993
* @retval SD Card error state
976994
*/
977-
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks)
995+
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_BlockNumber_DMA(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint32_t BlockNumber, uint32_t BlockSize, uint32_t NumberOfBlocks)
978996
{
979997
SDIO_CmdInitTypeDef sdio_cmdinitstructure;
980998
SDIO_DataInitTypeDef sdio_datainitstructure;
@@ -1015,10 +1033,16 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWri
10151033
/* Enable SDIO DMA transfer */
10161034
__HAL_SD_SDIO_DMA_ENABLE();
10171035

1036+
uint32_t WriteAddr;
10181037
if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
10191038
{
10201039
BlockSize = 512;
1021-
WriteAddr /= 512;
1040+
WriteAddr = BlockNumber;
1041+
}
1042+
else
1043+
{
1044+
// should not overflow for standard-capacity cards
1045+
WriteAddr = BlockNumber * BlockSize;
10221046
}
10231047

10241048
/* Set Block Size for Card */
@@ -1049,7 +1073,7 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWri
10491073
sdio_cmdinitstructure.CmdIndex = SD_CMD_WRITE_MULT_BLOCK;
10501074
}
10511075

1052-
sdio_cmdinitstructure.Argument = (uint32_t)WriteAddr;
1076+
sdio_cmdinitstructure.Argument = WriteAddr;
10531077
SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
10541078

10551079
/* Check for error conditions */

stmhal/sdcard.c

Lines changed: 57 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -141,54 +141,46 @@ uint64_t sdcard_get_capacity_in_bytes(void) {
141141
return cardinfo.CardCapacity;
142142
}
143143

144-
bool sdcard_read_blocks(uint8_t *dest, uint32_t block_num, uint32_t num_blocks) {
144+
mp_uint_t sdcard_read_blocks(uint8_t *dest, uint32_t block_num, uint32_t num_blocks) {
145145
// check that dest pointer is aligned on a 4-byte boundary
146146
if (((uint32_t)dest & 3) != 0) {
147-
return false;
147+
return SD_ERROR;
148148
}
149149

150150
// check that SD card is initialised
151151
if (sd_handle.Instance == NULL) {
152-
return false;
152+
return SD_ERROR;
153153
}
154154

155155
// We must disable IRQs because the SDIO peripheral has a small FIFO
156156
// buffer and we can't let it fill up in the middle of a read.
157157
// This will not be needed when SD uses DMA for transfer.
158-
__disable_irq();
159-
HAL_SD_ErrorTypedef err = HAL_SD_ReadBlocks(&sd_handle, (uint32_t*)dest, (uint64_t)block_num * SDCARD_BLOCK_SIZE, SDCARD_BLOCK_SIZE, num_blocks);
160-
__enable_irq();
158+
mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION();
159+
HAL_SD_ErrorTypedef err = HAL_SD_ReadBlocks_BlockNumber(&sd_handle, (uint32_t*)dest, block_num, SDCARD_BLOCK_SIZE, num_blocks);
160+
MICROPY_END_ATOMIC_SECTION(atomic_state);
161161

162-
if (err != SD_OK) {
163-
return false;
164-
}
165-
166-
return true;
162+
return err;
167163
}
168164

169-
bool sdcard_write_blocks(const uint8_t *src, uint32_t block_num, uint32_t num_blocks) {
165+
mp_uint_t sdcard_write_blocks(const uint8_t *src, uint32_t block_num, uint32_t num_blocks) {
170166
// check that src pointer is aligned on a 4-byte boundary
171167
if (((uint32_t)src & 3) != 0) {
172-
return false;
168+
return SD_ERROR;
173169
}
174170

175171
// check that SD card is initialised
176172
if (sd_handle.Instance == NULL) {
177-
return false;
173+
return SD_ERROR;
178174
}
179175

180176
// We must disable IRQs because the SDIO peripheral has a small FIFO
181177
// buffer and we can't let it drain to empty in the middle of a write.
182178
// This will not be needed when SD uses DMA for transfer.
183-
__disable_irq();
184-
HAL_SD_ErrorTypedef err = HAL_SD_WriteBlocks(&sd_handle, (uint32_t*)src, (uint64_t)block_num * SDCARD_BLOCK_SIZE, SDCARD_BLOCK_SIZE, num_blocks);
185-
__enable_irq();
186-
187-
if (err != SD_OK) {
188-
return false;
189-
}
179+
mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION();
180+
HAL_SD_ErrorTypedef err = HAL_SD_WriteBlocks_BlockNumber(&sd_handle, (uint32_t*)src, block_num, SDCARD_BLOCK_SIZE, num_blocks);
181+
MICROPY_END_ATOMIC_SECTION(atomic_state);
190182

191-
return true;
183+
return err;
192184
}
193185

194186
#if 0
@@ -205,7 +197,7 @@ bool sdcard_read_blocks_dma(uint8_t *dest, uint32_t block_num, uint32_t num_bloc
205197
}
206198

207199
// do the read
208-
if (HAL_SD_ReadBlocks_DMA(&sd_handle, (uint32_t*)dest, (uint64_t)block_num * SDCARD_BLOCK_SIZE, SDCARD_BLOCK_SIZE) != SD_OK) {
200+
if (HAL_SD_ReadBlocks_BlockNumber_DMA(&sd_handle, (uint32_t*)dest, block_num, SDCARD_BLOCK_SIZE) != SD_OK) {
209201
return false;
210202
}
211203

@@ -230,7 +222,7 @@ bool sdcard_write_blocks_dma(const uint8_t *src, uint32_t block_num, uint32_t nu
230222

231223
SD_Error status;
232224

233-
status = HAL_SD_WriteBlock_DMA(&sd_handle, (uint32_t*)src, (uint64_t)block_num * SDCARD_BLOCK_SIZE, SDCARD_BLOCK_SIZE, num_blocks);
225+
status = HAL_SD_WriteBlocks_BlockNumber_DMA(&sd_handle, (uint32_t*)src, block_num, SDCARD_BLOCK_SIZE, num_blocks);
234226
if (status != SD_OK) {
235227
return false;
236228
}
@@ -247,14 +239,17 @@ bool sdcard_write_blocks_dma(const uint8_t *src, uint32_t block_num, uint32_t nu
247239

248240
/******************************************************************************/
249241
// Micro Python bindings
242+
//
243+
// Note: these function are a bit ad-hoc at the moment and are mainly intended
244+
// for testing purposes. In the future SD should be a proper class with a
245+
// consistent interface and methods to mount/unmount it.
250246

251-
static mp_obj_t sd_present(mp_obj_t self) {
247+
STATIC mp_obj_t sd_present(mp_obj_t self) {
252248
return MP_BOOL(sdcard_is_present());
253249
}
250+
STATIC MP_DEFINE_CONST_FUN_OBJ_1(sd_present_obj, sd_present);
254251

255-
static MP_DEFINE_CONST_FUN_OBJ_1(sd_present_obj, sd_present);
256-
257-
static mp_obj_t sd_power(mp_obj_t self, mp_obj_t state) {
252+
STATIC mp_obj_t sd_power(mp_obj_t self, mp_obj_t state) {
258253
bool result;
259254
if (mp_obj_is_true(state)) {
260255
result = sdcard_power_on();
@@ -264,40 +259,59 @@ static mp_obj_t sd_power(mp_obj_t self, mp_obj_t state) {
264259
}
265260
return MP_BOOL(result);
266261
}
262+
STATIC MP_DEFINE_CONST_FUN_OBJ_2(sd_power_obj, sd_power);
267263

268-
static MP_DEFINE_CONST_FUN_OBJ_2(sd_power_obj, sd_power);
264+
STATIC mp_obj_t sd_info(mp_obj_t self) {
265+
HAL_SD_ErrorTypedef HAL_SD_Init(SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypedef *SDCardInfo);
266+
if (sd_handle.Instance == NULL) {
267+
return mp_const_none;
268+
}
269+
HAL_SD_CardInfoTypedef cardinfo;
270+
HAL_SD_Get_CardInfo(&sd_handle, &cardinfo);
271+
// cardinfo.SD_csd and cardinfo.SD_cid have lots of info but we don't use them
272+
mp_obj_t tuple[3] = {
273+
mp_obj_new_int_from_ull(cardinfo.CardCapacity),
274+
mp_obj_new_int_from_uint(cardinfo.CardBlockSize),
275+
mp_obj_new_int(cardinfo.CardType),
276+
};
277+
return mp_obj_new_tuple(3, tuple);
278+
}
279+
STATIC MP_DEFINE_CONST_FUN_OBJ_1(sd_info_obj, sd_info);
269280

270-
static mp_obj_t sd_read(mp_obj_t self, mp_obj_t block_num) {
281+
STATIC mp_obj_t sd_read(mp_obj_t self, mp_obj_t block_num) {
271282
uint8_t *dest = m_new(uint8_t, SDCARD_BLOCK_SIZE);
272-
if (!sdcard_read_blocks(dest, mp_obj_get_int(block_num), 1)) {
283+
mp_uint_t ret = sdcard_read_blocks(dest, mp_obj_get_int(block_num), 1);
284+
285+
if (ret != 0) {
273286
m_free(dest, SDCARD_BLOCK_SIZE);
274-
return mp_const_none;
287+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_Exception, "sdcard_read_blocks failed [%u]", ret));
275288
}
289+
276290
return mp_obj_new_bytearray_by_ref(SDCARD_BLOCK_SIZE, dest);
277291
}
292+
STATIC MP_DEFINE_CONST_FUN_OBJ_2(sd_read_obj, sd_read);
278293

279-
static MP_DEFINE_CONST_FUN_OBJ_2(sd_read_obj, sd_read);
280-
281-
static mp_obj_t sd_write(mp_obj_t self, mp_obj_t block_num, mp_obj_t source) {
294+
STATIC mp_obj_t sd_write(mp_obj_t self, mp_obj_t block_num, mp_obj_t data) {
282295
mp_buffer_info_t bufinfo;
283-
uint8_t tmp[1];
284-
285-
pyb_buf_get_for_send(source, &bufinfo, tmp);
296+
mp_get_buffer_raise(data, &bufinfo, MP_BUFFER_READ);
286297
if (bufinfo.len % SDCARD_BLOCK_SIZE != 0) {
287-
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "writes must be aligned to SDCARD_BLOCK_SIZE (%d) bytes", SDCARD_BLOCK_SIZE));
298+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "writes must be a multiple of %d bytes", SDCARD_BLOCK_SIZE));
288299
}
289300

290-
if (!sdcard_write_blocks(bufinfo.buf, mp_obj_get_int(block_num), bufinfo.len / SDCARD_BLOCK_SIZE)) {
291-
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_Exception, "sdcard_write_blocks failed"));
301+
mp_uint_t ret = sdcard_write_blocks(bufinfo.buf, mp_obj_get_int(block_num), bufinfo.len / SDCARD_BLOCK_SIZE);
302+
303+
if (ret != 0) {
304+
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_Exception, "sdcard_write_blocks failed [%u]", ret));
292305
}
306+
293307
return mp_const_none;
294308
}
295-
296-
static MP_DEFINE_CONST_FUN_OBJ_3(sd_write_obj, sd_write);
309+
STATIC MP_DEFINE_CONST_FUN_OBJ_3(sd_write_obj, sd_write);
297310

298311
STATIC const mp_map_elem_t sdcard_locals_dict_table[] = {
299312
{ MP_OBJ_NEW_QSTR(MP_QSTR_present), (mp_obj_t)&sd_present_obj },
300313
{ MP_OBJ_NEW_QSTR(MP_QSTR_power), (mp_obj_t)&sd_power_obj },
314+
{ MP_OBJ_NEW_QSTR(MP_QSTR_info), (mp_obj_t)&sd_info_obj },
301315
{ MP_OBJ_NEW_QSTR(MP_QSTR_read), (mp_obj_t)&sd_read_obj },
302316
{ MP_OBJ_NEW_QSTR(MP_QSTR_write), (mp_obj_t)&sd_write_obj },
303317
};

0 commit comments

Comments
 (0)