diff --git a/stm32cube/stm32h5xx/README b/stm32cube/stm32h5xx/README index cfdf6a9a2..83f3c30e1 100644 --- a/stm32cube/stm32h5xx/README +++ b/stm32cube/stm32h5xx/README @@ -67,4 +67,11 @@ Patch List: Impacted files: stm32cube/stm32h5xx/drivers/src/stm32h5xx_hal_sdio.c + *Fix SDIO polling mode data transfer issues + Fixes two related issues in the STM32H5 SDIO driver: incorrect block count calculation + that caused the card to hang, and improper buffer size handling that led to misaligned FIFO writes. + Together, these changes ensure correct and stable data transfer in polling mode. + Impacted file: + stm32cube/stm32h5xx/drivers/src/stm32h5xx_hal_sdio.c + See release_note.html from STM32Cube diff --git a/stm32cube/stm32h5xx/drivers/src/stm32h5xx_hal_sdio.c b/stm32cube/stm32h5xx/drivers/src/stm32h5xx_hal_sdio.c index 782099845..20215fd9b 100644 --- a/stm32cube/stm32h5xx/drivers/src/stm32h5xx_hal_sdio.c +++ b/stm32cube/stm32h5xx/drivers/src/stm32h5xx_hal_sdio.c @@ -1022,7 +1022,7 @@ HAL_StatusTypeDef HAL_SDIO_ReadExtended(SDIO_HandleTypeDef *hsdio, const HAL_SDI cmd |= Argument->Block_Mode << 27U; cmd |= Argument->OpCode << 26U; cmd |= (Argument->Reg_Addr & 0x1FFFFU) << 9U; - cmd |= (Size_byte & 0x1FFU); + cmd |= ((nbr_of_block == 0U)? Size_byte : nbr_of_block)& 0x1FFU; errorstate = SDMMC_SDIO_CmdReadWriteExtended(hsdio->Instance, cmd); if (errorstate != HAL_SDIO_ERROR_NONE) { @@ -1167,7 +1167,7 @@ HAL_StatusTypeDef HAL_SDIO_WriteExtended(SDIO_HandleTypeDef *hsdio, const HAL_SD uint8_t byteCount; uint32_t data; uint32_t dataremaining; - uint8_t *u32tempbuff = pData; + uint32_t *u32tempbuff = (uint32_t *) pData; uint32_t nbr_of_block; /* Check the parameters */ @@ -1227,7 +1227,7 @@ HAL_StatusTypeDef HAL_SDIO_WriteExtended(SDIO_HandleTypeDef *hsdio, const HAL_SD cmd |= Argument->Block_Mode << 27U; cmd |= Argument->OpCode << 26U; cmd |= (Argument->Reg_Addr & 0x1FFFFU) << 9U; - cmd |= (Size_byte & 0x1FFU); + cmd |= ((nbr_of_block == 0U)? Size_byte : nbr_of_block)& 0x1FFU; errorstate = SDMMC_SDIO_CmdReadWriteExtended(hsdio->Instance, cmd); if (errorstate != HAL_SDIO_ERROR_NONE) { diff --git a/stm32cube/stm32h7rsxx/README b/stm32cube/stm32h7rsxx/README index 2ba0203a1..10ef2a543 100644 --- a/stm32cube/stm32h7rsxx/README +++ b/stm32cube/stm32h7rsxx/README @@ -53,5 +53,12 @@ Patch List: the card identification sequence is skipped. Impacted files: stm32cube/stm32h7rsxx/drivers/src/stm32h7rsxx_hal_sdio.c + + *Fix SDIO polling mode data transfer issues + Fixes two related issues in the STM32H7RS SDIO driver: incorrect block count calculation + that caused the card to hang, and improper buffer size handling that led to misaligned FIFO writes. + Together, these changes ensure correct and stable data transfer in polling mode. + Impacted file: + stm32cube/stm32h7rsxx/drivers/src/stm32h7rsxx_hal_sdio.c See release_note.html from STM32Cube diff --git a/stm32cube/stm32h7rsxx/drivers/src/stm32h7rsxx_hal_sdio.c b/stm32cube/stm32h7rsxx/drivers/src/stm32h7rsxx_hal_sdio.c index 3c4f22b13..d950c8c62 100644 --- a/stm32cube/stm32h7rsxx/drivers/src/stm32h7rsxx_hal_sdio.c +++ b/stm32cube/stm32h7rsxx/drivers/src/stm32h7rsxx_hal_sdio.c @@ -1011,7 +1011,7 @@ HAL_StatusTypeDef HAL_SDIO_ReadExtended(SDIO_HandleTypeDef *hsdio, const HAL_SDI cmd |= Argument->Block_Mode << 27U; cmd |= Argument->OpCode << 26U; cmd |= (Argument->Reg_Addr & 0x1FFFFU) << 9U; - cmd |= (Size_byte & 0x1FFU); + cmd |= ((nbr_of_block == 0U)? Size_byte : nbr_of_block)& 0x1FFU; errorstate = SDMMC_SDIO_CmdReadWriteExtended(hsdio->Instance, cmd); if (errorstate != HAL_SDIO_ERROR_NONE) { @@ -1156,7 +1156,7 @@ HAL_StatusTypeDef HAL_SDIO_WriteExtended(SDIO_HandleTypeDef *hsdio, const HAL_SD uint8_t byteCount; uint32_t data; uint32_t dataremaining; - uint8_t *u32tempbuff = pData; + uint32_t *u32tempbuff = (uint32_t *) pData; uint32_t nbr_of_block; /* Check the parameters */ @@ -1216,7 +1216,7 @@ HAL_StatusTypeDef HAL_SDIO_WriteExtended(SDIO_HandleTypeDef *hsdio, const HAL_SD cmd |= Argument->Block_Mode << 27U; cmd |= Argument->OpCode << 26U; cmd |= (Argument->Reg_Addr & 0x1FFFFU) << 9U; - cmd |= (Size_byte & 0x1FFU); + cmd |= ((nbr_of_block == 0U)? Size_byte : nbr_of_block)& 0x1FFU; errorstate = SDMMC_SDIO_CmdReadWriteExtended(hsdio->Instance, cmd); if (errorstate != HAL_SDIO_ERROR_NONE) { diff --git a/stm32cube/stm32h7xx/README b/stm32cube/stm32h7xx/README index 040848ab5..65f4258f9 100644 --- a/stm32cube/stm32h7xx/README +++ b/stm32cube/stm32h7xx/README @@ -68,4 +68,11 @@ Patch List: Impacted files: stm32cube/stm32h7xx/drivers/src/stm32h7xx_hal_sdio.c + *Fix SDIO polling mode data transfer issues + Fixes two related issues in the STM32H7 SDIO driver: incorrect block count calculation + that caused the card to hang, and improper buffer size handling that led to misaligned FIFO writes. + Together, these changes ensure correct and stable data transfer in polling mode. + Impacted file: + stm32cube/stm32h7xx/drivers/src/stm32h7xx_hal_sdio.c + See release_note.html from STM32Cube diff --git a/stm32cube/stm32h7xx/drivers/src/stm32h7xx_hal_sdio.c b/stm32cube/stm32h7xx/drivers/src/stm32h7xx_hal_sdio.c index 9deaf4c46..622ab8860 100644 --- a/stm32cube/stm32h7xx/drivers/src/stm32h7xx_hal_sdio.c +++ b/stm32cube/stm32h7xx/drivers/src/stm32h7xx_hal_sdio.c @@ -1002,7 +1002,7 @@ HAL_StatusTypeDef HAL_SDIO_ReadExtended(SDIO_HandleTypeDef *hsdio, HAL_SDIO_Exte cmd |= Argument->Block_Mode << 27U; cmd |= Argument->OpCode << 26U; cmd |= (Argument->Reg_Addr & 0x1FFFFU) << 9U; - cmd |= (Size_byte & 0x1FFU); + cmd |= ((nbr_of_block == 0U)? Size_byte : nbr_of_block)& 0x1FFU; errorstate = SDMMC_SDIO_CmdReadWriteExtended(hsdio->Instance, cmd); if (errorstate != HAL_SDIO_ERROR_NONE) { @@ -1147,7 +1147,7 @@ HAL_StatusTypeDef HAL_SDIO_WriteExtended(SDIO_HandleTypeDef *hsdio, HAL_SDIO_Ext uint8_t byteCount; uint32_t data; uint32_t dataremaining; - uint8_t *u32tempbuff = pData; + uint32_t *u32tempbuff = (uint32_t *) pData; uint32_t nbr_of_block; /* Check the parameters */ @@ -1207,7 +1207,7 @@ HAL_StatusTypeDef HAL_SDIO_WriteExtended(SDIO_HandleTypeDef *hsdio, HAL_SDIO_Ext cmd |= Argument->Block_Mode << 27U; cmd |= Argument->OpCode << 26U; cmd |= (Argument->Reg_Addr & 0x1FFFFU) << 9U; - cmd |= (Size_byte & 0x1FFU); + cmd |= ((nbr_of_block == 0U)? Size_byte : nbr_of_block)& 0x1FFU; errorstate = SDMMC_SDIO_CmdReadWriteExtended(hsdio->Instance, cmd); if (errorstate != HAL_SDIO_ERROR_NONE) { diff --git a/stm32cube/stm32n6xx/README b/stm32cube/stm32n6xx/README index 485ffc3e5..e8906c410 100644 --- a/stm32cube/stm32n6xx/README +++ b/stm32cube/stm32n6xx/README @@ -55,7 +55,7 @@ Patch List: -soc/system_stm32n6xx_s.c *Fix SDIO initialization failure when skipping card identification sequence - Fixes an issue in the STM32HN6 SDIO driver where HAL_SDIO_Init() fails if + Fixes an issue in the STM32N6 SDIO driver where HAL_SDIO_Init() fails if the card identification sequence is skipped. Impacted files: stm32cube/stm32n6xx/drivers/src/stm32n6xx_hal_sdio.c @@ -67,4 +67,9 @@ Patch List: stm32cube/stm32n6xx/drivers/src/stm32n6xx_hal_xspi.c Internal reference: 212765 - See release_note.html from STM32Cube + *Fix SDIO polling mode data transfer issues + Fixes two related issues in the STM32N6 SDIO driver: incorrect block count calculation + that caused the card to hang, and improper buffer size handling that led to misaligned FIFO writes. + Together, these changes ensure correct and stable data transfer in polling mode. + Impacted file: + stm32cube/stm32n6xx/drivers/src/stm32n6xx_hal_sdio.c diff --git a/stm32cube/stm32n6xx/drivers/src/stm32n6xx_hal_sdio.c b/stm32cube/stm32n6xx/drivers/src/stm32n6xx_hal_sdio.c index a48940503..599c5470c 100644 --- a/stm32cube/stm32n6xx/drivers/src/stm32n6xx_hal_sdio.c +++ b/stm32cube/stm32n6xx/drivers/src/stm32n6xx_hal_sdio.c @@ -1002,7 +1002,7 @@ HAL_StatusTypeDef HAL_SDIO_ReadExtended(SDIO_HandleTypeDef *hsdio, HAL_SDIO_Exte cmd |= Argument->Block_Mode << 27U; cmd |= Argument->OpCode << 26U; cmd |= (Argument->Reg_Addr & 0x1FFFFU) << 9U; - cmd |= (Size_byte & 0x1FFU); + cmd |= ((nbr_of_block == 0U)? Size_byte : nbr_of_block)& 0x1FFU; errorstate = SDMMC_SDIO_CmdReadWriteExtended(hsdio->Instance, cmd); if (errorstate != HAL_SDIO_ERROR_NONE) { @@ -1147,7 +1147,7 @@ HAL_StatusTypeDef HAL_SDIO_WriteExtended(SDIO_HandleTypeDef *hsdio, HAL_SDIO_Ext uint8_t byteCount; uint32_t data; uint32_t dataremaining; - uint8_t *u32tempbuff = pData; + uint32_t *u32tempbuff = (uint32_t *) pData; uint32_t nbr_of_block; /* Check the parameters */ @@ -1207,7 +1207,7 @@ HAL_StatusTypeDef HAL_SDIO_WriteExtended(SDIO_HandleTypeDef *hsdio, HAL_SDIO_Ext cmd |= Argument->Block_Mode << 27U; cmd |= Argument->OpCode << 26U; cmd |= (Argument->Reg_Addr & 0x1FFFFU) << 9U; - cmd |= (Size_byte & 0x1FFU); + cmd |= ((nbr_of_block == 0U)? Size_byte : nbr_of_block)& 0x1FFU; errorstate = SDMMC_SDIO_CmdReadWriteExtended(hsdio->Instance, cmd); if (errorstate != HAL_SDIO_ERROR_NONE) { diff --git a/stm32cube/stm32u5xx/README b/stm32cube/stm32u5xx/README index 863404ffd..e942206df 100644 --- a/stm32cube/stm32u5xx/README +++ b/stm32cube/stm32u5xx/README @@ -54,4 +54,11 @@ Patch List: Impacted files: stm32cube/stm32u5xx/drivers/src/stm32u5xx_hal_sdio.c + *Fix SDIO polling mode data transfer issues + Fixes two related issues in the STM32U5 SDIO driver: incorrect block count calculation + that caused the card to hang, and improper buffer size handling that led to misaligned FIFO writes. + Together, these changes ensure correct and stable data transfer in polling mode. + Impacted file: + stm32cube/stm32u5xx/drivers/src/stm32u5xx_hal_sdio.c + See release_note.html from STM32Cube diff --git a/stm32cube/stm32u5xx/drivers/src/stm32u5xx_hal_sdio.c b/stm32cube/stm32u5xx/drivers/src/stm32u5xx_hal_sdio.c index a87a5c2a2..a735b288a 100644 --- a/stm32cube/stm32u5xx/drivers/src/stm32u5xx_hal_sdio.c +++ b/stm32cube/stm32u5xx/drivers/src/stm32u5xx_hal_sdio.c @@ -1002,7 +1002,7 @@ HAL_StatusTypeDef HAL_SDIO_ReadExtended(SDIO_HandleTypeDef *hsdio, HAL_SDIO_Exte cmd |= Argument->Block_Mode << 27U; cmd |= Argument->OpCode << 26U; cmd |= (Argument->Reg_Addr & 0x1FFFFU) << 9U; - cmd |= (Size_byte & 0x1FFU); + cmd |= ((nbr_of_block == 0U)? Size_byte : nbr_of_block)& 0x1FFU; errorstate = SDMMC_SDIO_CmdReadWriteExtended(hsdio->Instance, cmd); if (errorstate != HAL_SDIO_ERROR_NONE) { @@ -1147,7 +1147,7 @@ HAL_StatusTypeDef HAL_SDIO_WriteExtended(SDIO_HandleTypeDef *hsdio, HAL_SDIO_Ext uint8_t byteCount; uint32_t data; uint32_t dataremaining; - uint8_t *u32tempbuff = pData; + uint32_t *u32tempbuff = (uint32_t *) pData; uint32_t nbr_of_block; /* Check the parameters */ @@ -1207,7 +1207,7 @@ HAL_StatusTypeDef HAL_SDIO_WriteExtended(SDIO_HandleTypeDef *hsdio, HAL_SDIO_Ext cmd |= Argument->Block_Mode << 27U; cmd |= Argument->OpCode << 26U; cmd |= (Argument->Reg_Addr & 0x1FFFFU) << 9U; - cmd |= (Size_byte & 0x1FFU); + cmd |= ((nbr_of_block == 0U)? Size_byte : nbr_of_block)& 0x1FFU; errorstate = SDMMC_SDIO_CmdReadWriteExtended(hsdio->Instance, cmd); if (errorstate != HAL_SDIO_ERROR_NONE) {