Skip to content
This repository was archived by the owner on Oct 28, 2023. 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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy