|
|
@@ -0,0 +1,589 @@
|
|
|
+diff --git b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sd.c a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sd.c
|
|
|
+index 4df41a0..7312d0e 100755
|
|
|
+--- b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sd.c
|
|
|
++++ a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sd.c
|
|
|
+@@ -178,7 +178,6 @@
|
|
|
+
|
|
|
+ /* Includes ------------------------------------------------------------------*/
|
|
|
+ #include "stm32f2xx_hal.h"
|
|
|
+-
|
|
|
+ #ifdef HAL_SD_MODULE_ENABLED
|
|
|
+
|
|
|
+ /** @addtogroup STM32F2xx_HAL_Driver
|
|
|
+@@ -893,7 +892,7 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pRead
|
|
|
+ SDIO_IT_STBITERR));
|
|
|
+
|
|
|
+ /* Enable SDIO DMA transfer */
|
|
|
+- __HAL_SD_SDIO_DMA_ENABLE();
|
|
|
++ // MM disabled, as this fails on fast cards. __HAL_SD_SDIO_DMA_ENABLE();
|
|
|
+
|
|
|
+ /* Configure DMA user callbacks */
|
|
|
+ hsd->hdmarx->XferCpltCallback = SD_DMA_RxCplt;
|
|
|
+@@ -902,26 +901,29 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pRead
|
|
|
+ /* Enable the DMA Stream */
|
|
|
+ HAL_DMA_Start_IT(hsd->hdmarx, (uint32_t)&hsd->Instance->FIFO, (uint32_t)pReadBuffer, (uint32_t)(BlockSize * NumberOfBlocks)/4);
|
|
|
+
|
|
|
++ sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT;
|
|
|
++ sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
|
|
|
++ sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE;
|
|
|
++
|
|
|
+ if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
|
|
|
+ {
|
|
|
+ BlockSize = 512;
|
|
|
+ ReadAddr /= 512;
|
|
|
+- }
|
|
|
++ } else {
|
|
|
+
|
|
|
+- /* Set Block Size for Card */
|
|
|
+- sdio_cmdinitstructure.Argument = (uint32_t)BlockSize;
|
|
|
+- sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN;
|
|
|
+- sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT;
|
|
|
+- sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
|
|
|
+- sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE;
|
|
|
+- SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
|
|
|
++ /* Set Block Size for Card */
|
|
|
++ sdio_cmdinitstructure.Argument = (uint32_t)BlockSize;
|
|
|
++ sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN;
|
|
|
++
|
|
|
++ SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
|
|
|
+
|
|
|
+- /* Check for error conditions */
|
|
|
+- errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN);
|
|
|
++ /* Check for error conditions */
|
|
|
++ errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN);
|
|
|
+
|
|
|
+- if (errorstate != SD_OK)
|
|
|
+- {
|
|
|
+- return errorstate;
|
|
|
++ if (errorstate != SD_OK)
|
|
|
++ {
|
|
|
++ return errorstate;
|
|
|
++ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Configure the SD DPSM (Data Path State Machine) */
|
|
|
+@@ -931,6 +933,11 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pRead
|
|
|
+ sdio_datainitstructure.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO;
|
|
|
+ sdio_datainitstructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
|
|
|
+ sdio_datainitstructure.DPSM = SDIO_DPSM_ENABLE;
|
|
|
++
|
|
|
++ // We cannot enable DMA too early on UHS-I class 3 SD cards, or else the
|
|
|
++ // data is just discarded before the dpsm is started.
|
|
|
++ __HAL_SD_SDIO_DMA_ENABLE();
|
|
|
++
|
|
|
+ SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure);
|
|
|
+
|
|
|
+ /* Check number of blocks command */
|
|
|
+@@ -1017,28 +1024,30 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWri
|
|
|
+ HAL_DMA_Start_IT(hsd->hdmatx, (uint32_t)pWriteBuffer, (uint32_t)&hsd->Instance->FIFO, (uint32_t)(BlockSize * NumberOfBlocks)/4);
|
|
|
+
|
|
|
+ /* Enable SDIO DMA transfer */
|
|
|
+- __HAL_SD_SDIO_DMA_ENABLE();
|
|
|
++ // MM disabled, as this fails on fast cards. __HAL_SD_SDIO_DMA_ENABLE();
|
|
|
++
|
|
|
++ sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT;
|
|
|
++ sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
|
|
|
++ sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE;
|
|
|
+
|
|
|
+ if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
|
|
|
+ {
|
|
|
+ BlockSize = 512;
|
|
|
+ WriteAddr /= 512;
|
|
|
+- }
|
|
|
++ } else {
|
|
|
++ /* Set Block Size for Card */
|
|
|
++ sdio_cmdinitstructure.Argument = (uint32_t)BlockSize;
|
|
|
++ sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN;
|
|
|
+
|
|
|
+- /* Set Block Size for Card */
|
|
|
+- sdio_cmdinitstructure.Argument = (uint32_t)BlockSize;
|
|
|
+- sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN;
|
|
|
+- sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT;
|
|
|
+- sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO;
|
|
|
+- sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE;
|
|
|
+- SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
|
|
|
++ SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
|
|
|
+
|
|
|
+- /* Check for error conditions */
|
|
|
+- errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN);
|
|
|
++ /* Check for error conditions */
|
|
|
++ errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN);
|
|
|
+
|
|
|
+- if (errorstate != SD_OK)
|
|
|
+- {
|
|
|
+- return errorstate;
|
|
|
++ if (errorstate != SD_OK)
|
|
|
++ {
|
|
|
++ return errorstate;
|
|
|
++ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Check number of blocks command */
|
|
|
+@@ -1049,13 +1058,34 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWri
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
++ /* MM: Prepare for write */
|
|
|
++ sdio_cmdinitstructure.Argument = (uint32_t)(hsd->RCA << 16);
|
|
|
++ sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_CMD;
|
|
|
++ SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
|
|
|
++ errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD);
|
|
|
++ if (errorstate != SD_OK)
|
|
|
++ {
|
|
|
++ return errorstate;
|
|
|
++ }
|
|
|
++ sdio_cmdinitstructure.Argument = (uint32_t)NumberOfBlocks;
|
|
|
++ sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCK_COUNT;
|
|
|
++ SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
|
|
|
++ errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCK_COUNT);
|
|
|
++ if (errorstate != SD_OK)
|
|
|
++ {
|
|
|
++ return errorstate;
|
|
|
++ }
|
|
|
++
|
|
|
++ /* /MM */
|
|
|
++
|
|
|
+ /* Send CMD25 WRITE_MULT_BLOCK with argument data address */
|
|
|
+ sdio_cmdinitstructure.CmdIndex = SD_CMD_WRITE_MULT_BLOCK;
|
|
|
+ }
|
|
|
+-
|
|
|
++
|
|
|
+ sdio_cmdinitstructure.Argument = (uint32_t)WriteAddr;
|
|
|
+ SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure);
|
|
|
+
|
|
|
++
|
|
|
+ /* Check for error conditions */
|
|
|
+ if(NumberOfBlocks > 1)
|
|
|
+ {
|
|
|
+@@ -1078,6 +1108,11 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWri
|
|
|
+ sdio_datainitstructure.TransferDir = SDIO_TRANSFER_DIR_TO_CARD;
|
|
|
+ sdio_datainitstructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK;
|
|
|
+ sdio_datainitstructure.DPSM = SDIO_DPSM_ENABLE;
|
|
|
++
|
|
|
++ // We cannot enable DMA too early on UHS-I class 3 SD cards, or else the
|
|
|
++ // data is just discarded before the dpsm is started.
|
|
|
++ __HAL_SD_SDIO_DMA_ENABLE();
|
|
|
++
|
|
|
+ SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure);
|
|
|
+
|
|
|
+ hsd->SdTransferErr = errorstate;
|
|
|
+@@ -1116,7 +1151,9 @@ HAL_SD_ErrorTypedef HAL_SD_CheckReadOperation(SD_HandleTypeDef *hsd, uint32_t Ti
|
|
|
+
|
|
|
+ timeout = Timeout;
|
|
|
+
|
|
|
+- /* Wait until the Rx transfer is no longer active */
|
|
|
++ /* Wait until the Rx transfer is no longer active. IE. fifo is empty.
|
|
|
++Once FIFO is empty, the DMA will have finished and DmaTransferCplt should
|
|
|
++be true */
|
|
|
+ while((__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXACT)) && (timeout > 0))
|
|
|
+ {
|
|
|
+ timeout--;
|
|
|
+@@ -1916,10 +1953,12 @@ HAL_SD_ErrorTypedef HAL_SD_HighSpeed (SD_HandleTypeDef *hsd)
|
|
|
+ __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
|
|
|
+
|
|
|
+ /* Test if the switch mode HS is ok */
|
|
|
+- if ((SD_hs[13]& 2) != 2)
|
|
|
+- {
|
|
|
+- errorstate = SD_UNSUPPORTED_FEATURE;
|
|
|
+- }
|
|
|
++ // MM: These bits (0 to 271) are reserved in the spec I'm looking at ???
|
|
|
++ // Should be safe to ignore the result.
|
|
|
++ //if ((SD_hs[13]& 2) != 2)
|
|
|
++ //{
|
|
|
++ //errorstate = SD_UNSUPPORTED_FEATURE;
|
|
|
++ //}
|
|
|
+ }
|
|
|
+
|
|
|
+ return errorstate;
|
|
|
+diff --git b/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_hal_conf.h a/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_hal_conf.h
|
|
|
+index ef23c94..c899300 100755
|
|
|
+--- b/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_hal_conf.h
|
|
|
++++ a/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_hal_conf.h
|
|
|
+@@ -76,7 +76,7 @@
|
|
|
+ //#define HAL_SMARTCARD_MODULE_ENABLED
|
|
|
+ //#define HAL_WWDG_MODULE_ENABLED
|
|
|
+ #define HAL_PCD_MODULE_ENABLED
|
|
|
+-//#define HAL_HCD_MODULE_ENABLED
|
|
|
++#define HAL_HCD_MODULE_ENABLED
|
|
|
+ #define HAL_GPIO_MODULE_ENABLED
|
|
|
+ #define HAL_DMA_MODULE_ENABLED
|
|
|
+ #define HAL_RCC_MODULE_ENABLED
|
|
|
+diff --git b/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_it.h a/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_it.h
|
|
|
+index a2efe1f..4c7075a 100755
|
|
|
+--- b/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_it.h
|
|
|
++++ a/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_it.h
|
|
|
+@@ -46,11 +46,13 @@
|
|
|
+ /* Exported functions ------------------------------------------------------- */
|
|
|
+
|
|
|
+ void SysTick_Handler(void);
|
|
|
++void EXTI3_IRQHandler(void);
|
|
|
+ void EXTI4_IRQHandler(void);
|
|
|
+ void SDIO_IRQHandler(void);
|
|
|
+ void DMA2_Stream3_IRQHandler(void);
|
|
|
+ void OTG_FS_IRQHandler(void);
|
|
|
+ void DMA2_Stream6_IRQHandler(void);
|
|
|
+
|
|
|
+ #ifdef __cplusplus
|
|
|
+ }
|
|
|
+diff --git b/STM32CubeMX/SCSI2SD-V6/Src/fsmc.c a/STM32CubeMX/SCSI2SD-V6/Src/fsmc.c
|
|
|
+index c257924..5261aa9 100755
|
|
|
+--- b/STM32CubeMX/SCSI2SD-V6/Src/fsmc.c
|
|
|
++++ a/STM32CubeMX/SCSI2SD-V6/Src/fsmc.c
|
|
|
+@@ -66,12 +66,28 @@ void MX_FSMC_Init(void)
|
|
|
+ hsram1.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
|
|
|
+ hsram1.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;
|
|
|
+ /* Timing */
|
|
|
++
|
|
|
++ // 1 clock to read the address, + 1 for synchroniser skew
|
|
|
+ Timing.AddressSetupTime = 2;
|
|
|
+ Timing.AddressHoldTime = 1;
|
|
|
++
|
|
|
++ // Writes to device:
|
|
|
++ // 1 for synchroniser skew (dbx also delayed)
|
|
|
++ // 1 to skip hold time
|
|
|
++ // 1 to write data.
|
|
|
++
|
|
|
++ // Reads from device:
|
|
|
++ // 3 for syncroniser
|
|
|
++ // 1 to write back to fsmc bus.
|
|
|
+ Timing.DataSetupTime = 4;
|
|
|
++
|
|
|
++ // Allow a clock for us to release signals
|
|
|
++ // Need to avoid both devices acting as outputs
|
|
|
++ // on the multiplexed lines at the same time.
|
|
|
+ Timing.BusTurnAroundDuration = 1;
|
|
|
+- Timing.CLKDivision = 16;
|
|
|
+- Timing.DataLatency = 17;
|
|
|
++
|
|
|
++ Timing.CLKDivision = 16; // Ignored for async
|
|
|
++ Timing.DataLatency = 17; // Ignored for async
|
|
|
+ Timing.AccessMode = FSMC_ACCESS_MODE_A;
|
|
|
+ /* ExtTiming */
|
|
|
+
|
|
|
+@@ -91,7 +107,7 @@ static void HAL_FSMC_MspInit(void){
|
|
|
+ }
|
|
|
+ FSMC_Initialized = 1;
|
|
|
+ /* Peripheral clock enable */
|
|
|
+- #__FSMC_CLK_ENABLE();
|
|
|
++ __FSMC_CLK_ENABLE();
|
|
|
+
|
|
|
+ /** FSMC GPIO Configuration
|
|
|
+ PE7 ------> FSMC_DA4
|
|
|
+@@ -103,9 +119,6 @@ static void HAL_FSMC_MspInit(void){
|
|
|
+ PE13 ------> FSMC_DA10
|
|
|
+ PE14 ------> FSMC_DA11
|
|
|
+ PE15 ------> FSMC_DA12
|
|
|
+- PD8 ------> FSMC_DA13
|
|
|
+- PD9 ------> FSMC_DA14
|
|
|
+- PD10 ------> FSMC_DA15
|
|
|
+ PD14 ------> FSMC_DA0
|
|
|
+ PD15 ------> FSMC_DA1
|
|
|
+ PD0 ------> FSMC_DA2
|
|
|
+@@ -113,28 +126,31 @@ static void HAL_FSMC_MspInit(void){
|
|
|
+ PD4 ------> FSMC_NOE
|
|
|
+ PD5 ------> FSMC_NWE
|
|
|
+ PD7 ------> FSMC_NE1
|
|
|
++ PD8 ------> FSMC_DA13
|
|
|
++ PD9 ------> FSMC_DA14
|
|
|
++ PD10 ------> FSMC_DA15
|
|
|
+ PB7 ------> FSMC_NL
|
|
|
+ PE0 ------> FSMC_NBL0
|
|
|
+ PE1 ------> FSMC_NBL1
|
|
|
+ */
|
|
|
++ // MM: GPIO_SPEED_FREQ_MEDIUM is rated up to 50MHz, which is fine as all the
|
|
|
++ // fsmc timings are > 1 (ie. so clock speed / 2 is around 50MHz).
|
|
|
++
|
|
|
+ /* GPIO_InitStruct */
|
|
|
+- GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10
|
|
|
+- |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
|
|
|
+- |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1;
|
|
|
++ GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
|
|
|
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
|
|
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|
|
+- GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;
|
|
|
++ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; //HIGH;
|
|
|
+ GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
|
|
|
+
|
|
|
+ HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
|
|
|
+
|
|
|
+ /* GPIO_InitStruct */
|
|
|
+- GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14
|
|
|
+- |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4
|
|
|
+- |GPIO_PIN_5|GPIO_PIN_7;
|
|
|
++ GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1
|
|
|
++ |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10;
|
|
|
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
|
|
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|
|
+- GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;
|
|
|
++ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; //HIGH;
|
|
|
+ GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
|
|
|
+
|
|
|
+ HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
|
|
|
+@@ -143,7 +159,7 @@ static void HAL_FSMC_MspInit(void){
|
|
|
+ GPIO_InitStruct.Pin = GPIO_PIN_7;
|
|
|
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
|
|
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|
|
+- GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;
|
|
|
++ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;//HIGH;
|
|
|
+ GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
|
|
|
+
|
|
|
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
|
|
+@@ -186,9 +202,6 @@ static void HAL_FSMC_MspDeInit(void){
|
|
|
+ PE13 ------> FSMC_DA10
|
|
|
+ PE14 ------> FSMC_DA11
|
|
|
+ PE15 ------> FSMC_DA12
|
|
|
+- PD8 ------> FSMC_DA13
|
|
|
+- PD9 ------> FSMC_DA14
|
|
|
+- PD10 ------> FSMC_DA15
|
|
|
+ PD14 ------> FSMC_DA0
|
|
|
+ PD15 ------> FSMC_DA1
|
|
|
+ PD0 ------> FSMC_DA2
|
|
|
+@@ -196,18 +209,18 @@ static void HAL_FSMC_MspDeInit(void){
|
|
|
+ PD4 ------> FSMC_NOE
|
|
|
+ PD5 ------> FSMC_NWE
|
|
|
+ PD7 ------> FSMC_NE1
|
|
|
++ PD8 ------> FSMC_DA13
|
|
|
++ PD9 ------> FSMC_DA14
|
|
|
++ PD10 ------> FSMC_DA15
|
|
|
+ PB7 ------> FSMC_NL
|
|
|
+ PE0 ------> FSMC_NBL0
|
|
|
+ PE1 ------> FSMC_NBL1
|
|
|
+ */
|
|
|
+
|
|
|
+- HAL_GPIO_DeInit(GPIOE, GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10
|
|
|
+- |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
|
|
|
+- |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1);
|
|
|
++ HAL_GPIO_DeInit(GPIOE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
|
|
|
+
|
|
|
+- HAL_GPIO_DeInit(GPIOD, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_14
|
|
|
+- |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4
|
|
|
+- |GPIO_PIN_5|GPIO_PIN_7);
|
|
|
++ HAL_GPIO_DeInit(GPIOD, GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1
|
|
|
++ |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10);
|
|
|
+
|
|
|
+ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7);
|
|
|
+
|
|
|
+diff --git b/STM32CubeMX/SCSI2SD-V6/Src/gpio.c a/STM32CubeMX/SCSI2SD-V6/Src/gpio.c
|
|
|
+index 21529ff..5682f25 100755
|
|
|
+--- b/STM32CubeMX/SCSI2SD-V6/Src/gpio.c
|
|
|
++++ a/STM32CubeMX/SCSI2SD-V6/Src/gpio.c
|
|
|
+@@ -68,17 +68,17 @@ void MX_GPIO_Init(void)
|
|
|
+ __GPIOB_CLK_ENABLE();
|
|
|
+ __GPIOD_CLK_ENABLE();
|
|
|
+
|
|
|
+- /*Configure GPIO pins : PEPin PEPin PEPin */
|
|
|
++ /*Configure GPIO pins : PEPin PEPin PEPin PEPin */
|
|
|
+ GPIO_InitStruct.Pin = FPGA_GPIO2_Pin|UNUSED_PE5_Pin|UNUSED_PE6_Pin;
|
|
|
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
|
|
+ GPIO_InitStruct.Pull = GPIO_PULLDOWN;
|
|
|
+ HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
|
|
|
+
|
|
|
+- /*Configure GPIO pin : PtPin */
|
|
|
++ /*Configure GPIO pin : PE3 */
|
|
|
+ GPIO_InitStruct.Pin = FPGA_GPIO3_Pin;
|
|
|
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
|
|
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|
|
+- HAL_GPIO_Init(FPGA_GPIO3_GPIO_Port, &GPIO_InitStruct);
|
|
|
++ HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
|
|
|
+
|
|
|
+ /*Configure GPIO pin : PE4 */
|
|
|
+ GPIO_InitStruct.Pin = GPIO_PIN_4;
|
|
|
+@@ -96,10 +96,8 @@ void MX_GPIO_Init(void)
|
|
|
+ GPIO_InitStruct.Pull = GPIO_PULLDOWN;
|
|
|
+ HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
|
|
|
+
|
|
|
+- /*Configure GPIO pins : PAPin PAPin PAPin PAPin
|
|
|
+- PA10 */
|
|
|
+- GPIO_InitStruct.Pin = UNUSED_PA0_Pin|UNUSED_PA1_Pin|UNUSED_PA2_Pin|UNUSED_PA3_Pin
|
|
|
+- |GPIO_PIN_10;
|
|
|
++ /*Configure GPIO pins : PAPin PAPin PAPin PAPin */
|
|
|
++ GPIO_InitStruct.Pin = UNUSED_PA0_Pin|UNUSED_PA1_Pin|UNUSED_PA2_Pin|UNUSED_PA3_Pin;
|
|
|
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
|
|
+ GPIO_InitStruct.Pull = GPIO_PULLDOWN;
|
|
|
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
|
|
+@@ -125,14 +123,26 @@ void MX_GPIO_Init(void)
|
|
|
+ GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
|
|
|
+ HAL_GPIO_Init(nTERM_EN_GPIO_Port, &GPIO_InitStruct);
|
|
|
+
|
|
|
+- /*Configure GPIO pins : PBPin PBPin PBPin PB14
|
|
|
+- PB15 PBPin PBPin */
|
|
|
+- GPIO_InitStruct.Pin = BOOT1_Pin|UNUSED_PB12_Pin|UNUSED_PB13_Pin|GPIO_PIN_14
|
|
|
+- |GPIO_PIN_15|UNUSED_PB5_Pin|UNUSED_PB6_Pin;
|
|
|
++ /*Configure GPIO pins : PBPin PBPin PBPin */
|
|
|
++ GPIO_InitStruct.Pin = BOOT1_Pin|UNUSED_PB5_Pin|UNUSED_PB6_Pin;
|
|
|
++ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
|
|
++ GPIO_InitStruct.Pull = GPIO_PULLDOWN;
|
|
|
++ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
|
|
++
|
|
|
++ /*Configure GPIO pins : PBPin PBPin */
|
|
|
++ GPIO_InitStruct.Pin = UNUSED_PB12_Pin|UNUSED_PB13_Pin;
|
|
|
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
|
|
+ GPIO_InitStruct.Pull = GPIO_PULLDOWN;
|
|
|
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
|
|
+
|
|
|
++ /*Configure GPIO pins : PD6, PD12 */
|
|
|
++ // PD6: FSMC NWAIT, not used yet.PULLED UP in fpga pin config
|
|
|
++ // PD12: FPGA_GPIO1, not used.
|
|
|
++ GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_12;
|
|
|
++ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
|
|
++ GPIO_InitStruct.Pull = GPIO_PULLUP;
|
|
|
++ HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
|
|
|
++
|
|
|
+ /*Configure GPIO pins : PDPin PDPin */
|
|
|
+ GPIO_InitStruct.Pin = UNUSED_PD11_Pin|FSMC_UNUSED_CLK_Pin;
|
|
|
+ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
|
|
+@@ -160,11 +170,18 @@ void MX_GPIO_Init(void)
|
|
|
+ GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
|
|
|
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
|
|
+
|
|
|
+- /*Configure GPIO pin : PD6 */
|
|
|
+- GPIO_InitStruct.Pin = GPIO_PIN_6;
|
|
|
+- GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
|
|
|
+- GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|
|
+- HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
|
|
|
++ /*Configure GPIO pin : PA10 */
|
|
|
++ // USB Host OTG ID pin
|
|
|
++ GPIO_InitStruct.Pin = GPIO_PIN_10;
|
|
|
++ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
|
|
++ GPIO_InitStruct.Pull = GPIO_PULLDOWN;
|
|
|
++ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
|
|
++
|
|
|
++ // USB Host pins, currently unused.
|
|
|
++ GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;
|
|
|
++ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
|
|
++ GPIO_InitStruct.Pull = GPIO_PULLDOWN;
|
|
|
++ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
|
|
+
|
|
|
+ /*Configure GPIO pins : PBPin PBPin */
|
|
|
+ GPIO_InitStruct.Pin = nSD_WP_Pin|nSD_CD_Pin;
|
|
|
+diff --git b/STM32CubeMX/SCSI2SD-V6/Src/main.c a/STM32CubeMX/SCSI2SD-V6/Src/main.c
|
|
|
+index 48e1f9a..a80e078 100755
|
|
|
+--- b/STM32CubeMX/SCSI2SD-V6/Src/main.c
|
|
|
++++ a/STM32CubeMX/SCSI2SD-V6/Src/main.c
|
|
|
+@@ -32,12 +32,11 @@
|
|
|
+ */
|
|
|
+ /* Includes ------------------------------------------------------------------*/
|
|
|
+ #include "stm32f2xx_hal.h"
|
|
|
+-#include "dma.h"
|
|
|
+ #include "sdio.h"
|
|
|
+ #include "spi.h"
|
|
|
+-#include "tim.h"
|
|
|
+ #include "usart.h"
|
|
|
+ #include "usb_device.h"
|
|
|
+ #include "gpio.h"
|
|
|
+ #include "fsmc.h"
|
|
|
+
|
|
|
+@@ -87,14 +87,11 @@ int main(void)
|
|
|
+
|
|
|
+ /* Initialize all configured peripherals */
|
|
|
+ MX_GPIO_Init();
|
|
|
+- MX_DMA_Init();
|
|
|
+- SystemClock_Config();
|
|
|
+ MX_FSMC_Init();
|
|
|
+ MX_SDIO_SD_Init();
|
|
|
+ MX_SPI1_Init();
|
|
|
+- MX_TIM4_Init();
|
|
|
+- MX_USART3_UART_Init();
|
|
|
+- MX_USB_DEVICE_Init();
|
|
|
++ MX_USART3_UART_Init(); // Not used, but we don't want the pins floating.
|
|
|
+
|
|
|
+ /* USER CODE BEGIN 2 */
|
|
|
+ mainInit();
|
|
|
+diff --git b/STM32CubeMX/SCSI2SD-V6/Src/sdio.c a/STM32CubeMX/SCSI2SD-V6/Src/sdio.c
|
|
|
+index e8b2ad8..0f9a34b 100755
|
|
|
+--- b/STM32CubeMX/SCSI2SD-V6/Src/sdio.c
|
|
|
++++ a/STM32CubeMX/SCSI2SD-V6/Src/sdio.c
|
|
|
+@@ -36,7 +36,6 @@
|
|
|
+ #include "sdio.h"
|
|
|
+
|
|
|
+ #include "gpio.h"
|
|
|
+-#include "dma.h"
|
|
|
+
|
|
|
+ /* USER CODE BEGIN 0 */
|
|
|
+
|
|
|
+@@ -59,9 +58,6 @@ void MX_SDIO_SD_Init(void)
|
|
|
+ hsd.Init.BusWide = SDIO_BUS_WIDE_1B;
|
|
|
+ hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
|
|
|
+ hsd.Init.ClockDiv = 0;
|
|
|
+- HAL_SD_Init(&hsd, &SDCardInfo);
|
|
|
+-
|
|
|
+- HAL_SD_WideBusOperation_Config(&hsd, SDIO_BUS_WIDE_4B);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+@@ -143,6 +140,7 @@ void HAL_SD_MspInit(SD_HandleTypeDef* hsd)
|
|
|
+ __HAL_LINKDMA(hsd,hdmarx,hdma_sdio_rx);
|
|
|
+
|
|
|
+ /* Peripheral interrupt init*/
|
|
|
++ HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
|
|
|
+ HAL_NVIC_SetPriority(SDIO_IRQn, 0, 0);
|
|
|
+ HAL_NVIC_EnableIRQ(SDIO_IRQn);
|
|
|
+ /* USER CODE BEGIN SDIO_MspInit 1 */
|
|
|
+diff --git b/STM32CubeMX/SCSI2SD-V6/Src/spi.c a/STM32CubeMX/SCSI2SD-V6/Src/spi.c
|
|
|
+index cfb19ce..25e0745 100755
|
|
|
+--- b/STM32CubeMX/SCSI2SD-V6/Src/spi.c
|
|
|
++++ a/STM32CubeMX/SCSI2SD-V6/Src/spi.c
|
|
|
+@@ -54,6 +54,7 @@ void MX_SPI1_Init(void)
|
|
|
+ hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
|
|
|
+ hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
|
|
|
+ hspi1.Init.NSS = SPI_NSS_SOFT;
|
|
|
++ // (96MHz / 2) / 4 = 12MHz. FPGA device allows up to 25MHz write
|
|
|
+ hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
|
|
|
+ hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
|
|
|
+ hspi1.Init.TIMode = SPI_TIMODE_DISABLED;
|
|
|
+diff --git b/STM32CubeMX/SCSI2SD-V6/Src/stm32f2xx_hal_msp.c a/STM32CubeMX/SCSI2SD-V6/Src/stm32f2xx_hal_msp.c
|
|
|
+index e6b7783..b7ab0a3 100755
|
|
|
+--- b/STM32CubeMX/SCSI2SD-V6/Src/stm32f2xx_hal_msp.c
|
|
|
++++ a/STM32CubeMX/SCSI2SD-V6/Src/stm32f2xx_hal_msp.c
|
|
|
+@@ -50,14 +50,6 @@ void HAL_MspInit(void)
|
|
|
+ HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
|
|
|
+
|
|
|
+ /* System interrupt init*/
|
|
|
+- /* MemoryManagement_IRQn interrupt configuration */
|
|
|
+- HAL_NVIC_SetPriority(MemoryManagement_IRQn, 0, 0);
|
|
|
+- /* BusFault_IRQn interrupt configuration */
|
|
|
+- HAL_NVIC_SetPriority(BusFault_IRQn, 0, 0);
|
|
|
+- /* UsageFault_IRQn interrupt configuration */
|
|
|
+- HAL_NVIC_SetPriority(UsageFault_IRQn, 0, 0);
|
|
|
+- /* DebugMonitor_IRQn interrupt configuration */
|
|
|
+- HAL_NVIC_SetPriority(DebugMonitor_IRQn, 0, 0);
|
|
|
+ /* SysTick_IRQn interrupt configuration */
|
|
|
+ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
|
|
|
+
|
|
|
+diff --git b/STM32CubeMX/SCSI2SD-V6/Src/usbd_conf.c a/STM32CubeMX/SCSI2SD-V6/Src/usbd_conf.c
|
|
|
+index 272d388..07387ca 100755
|
|
|
+--- b/STM32CubeMX/SCSI2SD-V6/Src/usbd_conf.c
|
|
|
++++ a/STM32CubeMX/SCSI2SD-V6/Src/usbd_conf.c
|
|
|
+@@ -108,7 +108,18 @@ void HAL_PCD_MspDeInit(PCD_HandleTypeDef* hpcd)
|
|
|
+ PA11 ------> USB_OTG_FS_DM
|
|
|
+ PA12 ------> USB_OTG_FS_DP
|
|
|
+ */
|
|
|
+- HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_11|GPIO_PIN_12);
|
|
|
++ // HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_11|GPIO_PIN_12);
|
|
|
++ // MM: Don't let pins float.
|
|
|
++ GPIO_InitTypeDef GPIO_InitStruct;
|
|
|
++ GPIO_InitStruct.Pin = GPIO_PIN_9;
|
|
|
++ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
|
|
++ GPIO_InitStruct.Pull = GPIO_PULLDOWN;
|
|
|
++ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
|
|
++
|
|
|
++ GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
|
|
|
++ GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
|
|
++ GPIO_InitStruct.Pull = GPIO_PULLDOWN;
|
|
|
++ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
|
|
+
|
|
|
+ /* Peripheral interrupt Deinit*/
|
|
|
+ HAL_NVIC_DisableIRQ(OTG_FS_IRQn);
|
|
|
+@@ -294,9 +305,11 @@ USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev)
|
|
|
+ hpcd_USB_OTG_FS.Init.use_dedicated_ep1 = DISABLE;
|
|
|
+ HAL_PCD_Init(&hpcd_USB_OTG_FS);
|
|
|
+
|
|
|
++ // Sum of all FIFOs must be <= 320.
|
|
|
+ HAL_PCD_SetRxFiFo(&hpcd_USB_OTG_FS, 0x80);
|
|
|
+ HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 0x40);
|
|
|
+- HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_FS, 1, 0x80);
|
|
|
++ HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_FS, 1, 0x40);
|
|
|
++ HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_FS, 2, 0x40);
|
|
|
+ }
|
|
|
+ return USBD_OK;
|
|
|
+ }
|