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;
/* 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;
- }
-
- /* 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);
+ } else {
+ /* 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) */
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 */
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 */
}
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_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;
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--;
__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;
//#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
void EXTI4_IRQHandler(void);
void SDIO_IRQHandler(void);
void DMA2_Stream3_IRQHandler(void);
+void OTG_FS_IRQHandler(void);
void DMA2_Stream6_IRQHandler(void);
void OTG_HS_IRQHandler(void);
#include "stm32f2xx_hal.h"
#include "usbd_def.h"
-extern USBD_HandleTypeDef hUsbDeviceHS;
+extern USBD_HandleTypeDef hUsbDeviceFS;
/* USB_Device init function */
void MX_USB_DEVICE_Init(void);
*/
/*---------- -----------*/
-#define USBD_MAX_NUM_INTERFACES 1
+#define USBD_MAX_NUM_INTERFACES 2
/*---------- -----------*/
#define USBD_MAX_NUM_CONFIGURATION 1
/*---------- -----------*/
#define USBD_LPM_ENABLED 0
/*---------- -----------*/
#define USBD_SELF_POWERED 1
-/*---------- -----------*/
-#define MSC_MEDIA_PACKET 512
/****************************************/
/* #define for FS and HS identification */
/** @defgroup USBD_DESC_Exported_Variables
* @{
*/
-extern USBD_DescriptorsTypeDef HS_Desc;
+extern USBD_DescriptorsTypeDef FS_Desc;
/**
* @}
*/
Mcu.Family=STM32F2
Mcu.IP0=DMA
Mcu.IP1=FSMC
-Mcu.IP10=USB_OTG_HS
+Mcu.IP10=USB_OTG_FS
+Mcu.IP11=USB_OTG_HS
Mcu.IP2=NVIC
Mcu.IP3=RCC
Mcu.IP4=SDIO
Mcu.IP5=SPI1
-Mcu.IP6=TIM4
-Mcu.IP7=UART4
-Mcu.IP8=USB_DEVICE
-Mcu.IP9=USB_OTG_FS
-Mcu.IPNb=11
+Mcu.IP6=SYS
+Mcu.IP7=TIM4
+Mcu.IP8=UART4
+Mcu.IP9=USB_DEVICE
+Mcu.IPNb=12
Mcu.Name=STM32F205V(B-C-E-F-G)Tx
Mcu.Package=LQFP100
Mcu.Pin0=PE2
Mcu.Pin8=PH0-OSC_IN
Mcu.Pin80=PE0
Mcu.Pin81=PE1
-Mcu.Pin82=VP_TIM4_VS_ControllerModeClock
-Mcu.Pin83=VP_USB_DEVICE_VS_USB_DEVICE_MSC_HS
+Mcu.Pin82=VP_SYS_VS_Systick
+Mcu.Pin83=VP_TIM4_VS_ControllerModeClock
+Mcu.Pin84=VP_USB_DEVICE_VS_USB_DEVICE_MSC_HS
Mcu.Pin9=PH1-OSC_OUT
-Mcu.PinsNb=84
+Mcu.PinsNb=85
Mcu.ThirdPartyNb=0
Mcu.UserConstants=
Mcu.UserName=STM32F205VCTx
-MxCube.Version=4.11.0
-MxDb.Version=DB.4.0.110
+MxCube.Version=5.4.0
+MxDb.Version=DB.5.0.40
+NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:false\:false\:false
NVIC.DMA2_Stream3_IRQn=true\:0\:0\:false\:false\:true\:true\:true
NVIC.DMA2_Stream6_IRQn=true\:0\:0\:false\:false\:true\:true\:true
+NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:false\:false\:false
NVIC.EXTI4_IRQn=true\:10\:0\:true\:false\:true\:true\:true
NVIC.ForceEnableDMAVector=true
+NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:false\:false\:false
+NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:false\:false\:false
+NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:false\:false\:false
NVIC.OTG_HS_IRQn=true\:0\:0\:false\:false\:true\:false\:true
+NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:false\:false\:false
NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
NVIC.SDIO_IRQn=true\:0\:0\:true\:false\:true\:true\:true
+NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:false
NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:true\:true
+NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:false\:false\:false
PA0-WKUP.Locked=true
PA0-WKUP.Mode=Asynchronous
PA0-WKUP.Signal=UART4_TX
PA7.Mode=Full_Duplex_Master
PA7.Signal=SPI1_MOSI
PA8.GPIOParameters=GPIO_Speed
-PA8.GPIO_Speed=GPIO_SPEED_HIGH
+PA8.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH
PA8.Mode=Clock-out-1
PA8.Signal=RCC_MCO_1
PA9.GPIOParameters=GPIO_Label
PB14.GPIO_Label=nTERM_EN
PB14.Locked=true
PB14.Signal=GPIO_Output
-PB15.GPIOParameters=GPIO_Label
+PB15.GPIOParameters=GPIO_PuPd,GPIO_Label
PB15.GPIO_Label=LED_IO
+PB15.GPIO_PuPd=GPIO_PULLDOWN
PB15.Locked=true
PB15.Signal=GPIO_Output
PB2.GPIOParameters=GPIO_PuPd,GPIO_Label
PB6.Locked=true
PB6.Signal=GPIO_Analog
PB7.GPIOParameters=GPIO_Speed_High_Default
-PB7.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM
+PB7.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM
PB7.Signal=FSMC_NL
PB8.GPIOParameters=GPIO_PuPd,GPIO_Label
PB8.GPIO_Label=nSD_WP
PC9.GPIO_PuPd=GPIO_PULLUP
PC9.Mode=SD_4_bits_Wide_bus
PC9.Signal=SDIO_D1
+PCC.Checker=false
+PCC.Line=STM32F2x5
+PCC.MCU=STM32F205V(B-C-E-F-G)Tx
+PCC.PartNumber=STM32F205VCTx
+PCC.Seq0=0
+PCC.Series=STM32F2
+PCC.Temperature=25
+PCC.Vdd=3.3
PD0.GPIOParameters=GPIO_Speed_High_Default
-PD0.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM
+PD0.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM
PD0.Mode=16b-da1
PD0.Signal=FSMC_DA2
PD1.GPIOParameters=GPIO_Speed_High_Default
-PD1.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM
+PD1.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM
PD1.Mode=16b-da1
PD1.Signal=FSMC_DA3
PD10.GPIOParameters=GPIO_Speed_High_Default
-PD10.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM
+PD10.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM
PD10.Mode=16b-da1
PD10.Signal=FSMC_DA15
PD11.Locked=true
PD13.Locked=true
PD13.Signal=GPIO_Output
PD14.GPIOParameters=GPIO_Speed_High_Default
-PD14.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM
+PD14.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM
PD14.Mode=16b-da1
PD14.Signal=FSMC_DA0
PD15.GPIOParameters=GPIO_Speed_High_Default
-PD15.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM
+PD15.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM
PD15.Mode=16b-da1
PD15.Signal=FSMC_DA1
PD2.GPIOParameters=GPIO_PuPd
PD3.Locked=true
PD3.Signal=GPIO_Input
PD4.GPIOParameters=GPIO_Speed_High_Default
-PD4.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM
+PD4.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM
PD4.Mode=MuxedPsram1
PD4.Signal=FSMC_NOE
PD5.GPIOParameters=GPIO_Speed_High_Default
-PD5.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM
+PD5.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM
PD5.Mode=MuxedPsram1
PD5.Signal=FSMC_NWE
PD6.GPIOParameters=GPIO_Label
PD6.Locked=true
PD6.Signal=GPIO_Analog
PD7.GPIOParameters=GPIO_Speed_High_Default
-PD7.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM
+PD7.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM
PD7.Mode=NorPsramChipSelect1_1
PD7.Signal=FSMC_NE1
PD8.GPIOParameters=GPIO_Speed_High_Default
-PD8.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM
+PD8.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM
PD8.Mode=16b-da1
PD8.Signal=FSMC_DA13
PD9.GPIOParameters=GPIO_Speed_High_Default
-PD9.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM
+PD9.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM
PD9.Mode=16b-da1
PD9.Signal=FSMC_DA14
PE0.GPIOParameters=GPIO_Speed_High_Default
-PE0.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM
+PE0.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM
PE0.Mode=2ByteEnable1
PE0.Signal=FSMC_NBL0
PE1.GPIOParameters=GPIO_Speed_High_Default
-PE1.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM
+PE1.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM
PE1.Mode=2ByteEnable1
PE1.Signal=FSMC_NBL1
PE10.GPIOParameters=GPIO_Speed_High_Default
-PE10.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM
+PE10.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM
PE10.Mode=16b-da1
PE10.Signal=FSMC_DA7
PE11.GPIOParameters=GPIO_Speed_High_Default
-PE11.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM
+PE11.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM
PE11.Mode=16b-da1
PE11.Signal=FSMC_DA8
PE12.GPIOParameters=GPIO_Speed_High_Default
-PE12.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM
+PE12.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM
PE12.Mode=16b-da1
PE12.Signal=FSMC_DA9
PE13.GPIOParameters=GPIO_Speed_High_Default
-PE13.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM
+PE13.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM
PE13.Mode=16b-da1
PE13.Signal=FSMC_DA10
PE14.GPIOParameters=GPIO_Speed_High_Default
-PE14.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM
+PE14.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM
PE14.Mode=16b-da1
PE14.Signal=FSMC_DA11
PE15.GPIOParameters=GPIO_Speed_High_Default
-PE15.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM
+PE15.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM
PE15.Mode=16b-da1
PE15.Signal=FSMC_DA12
PE2.GPIOParameters=GPIO_PuPd,GPIO_Label
PE6.Locked=true
PE6.Signal=GPIO_Input
PE7.GPIOParameters=GPIO_Speed_High_Default
-PE7.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM
+PE7.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM
PE7.Mode=16b-da1
PE7.Signal=FSMC_DA4
PE8.GPIOParameters=GPIO_Speed_High_Default
-PE8.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM
+PE8.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM
PE8.Mode=16b-da1
PE8.Signal=FSMC_DA5
PE9.GPIOParameters=GPIO_Speed_High_Default
-PE9.GPIO_Speed_High_Default=GPIO_SPEED_MEDIUM
+PE9.GPIO_Speed_High_Default=GPIO_SPEED_FREQ_MEDIUM
PE9.Mode=16b-da1
PE9.Signal=FSMC_DA6
PH0-OSC_IN.Mode=HSE-External-Oscillator
RCC.FCLKCortexFreq_Value=108000000
RCC.FamilyName=M
RCC.HCLKFreq_Value=108000000
-RCC.HSE_VALUE=20000000
+RCC.HSE_VALUE=12000000
RCC.HSI_VALUE=16000000
RCC.I2SClocksFreq_Value=96000000
-RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSE_VALUE,LSI_VALUE,MCO1PinFreq_Value,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLP,PLLQ,RCC_MCO1Source,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S
+RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSE_VALUE,LSI_VALUE,MCO1PinFreq_Value,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLP,PLLQ,PLLSourceVirtual,RCC_MCO1Source,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S
RCC.LSE_VALUE=32768
RCC.LSI_VALUE=32000
RCC.MCO1PinFreq_Value=108000000
RCC.MCO2PinFreq_Value=108000000
RCC.PLLCLKFreq_Value=108000000
-RCC.PLLM=20
+RCC.PLLM=12
RCC.PLLN=432
RCC.PLLP=RCC_PLLP_DIV4
RCC.PLLQ=9
+RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE
RCC.RCC_MCO1Source=RCC_MCO1SOURCE_PLLCLK
RCC.RTCFreq_Value=32000
-RCC.RTCHSEDivFreq_Value=10000000
+RCC.RTCHSEDivFreq_Value=6000000
RCC.SYSCLKFreq_VALUE=108000000
RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK
RCC.VCOI2SOutputFreq_Value=192000000
RCC.VCOInputFreq_Value=1000000
RCC.VCOOutputFreq_Value=432000000
RCC.VcooutputI2S=96000000
-SH.FSMC_NL.0=FSMC_NL,MuxedPsram1
+SH.FSMC_NL.0=FSMC_NL,AddressValid1
SH.FSMC_NL.ConfNb=1
SH.GPXTI4.0=GPIO_EXTI4
SH.GPXTI4.ConfNb=1
SPI1.CLKPhase=SPI_PHASE_2EDGE
SPI1.CLKPolarity=SPI_POLARITY_HIGH
SPI1.CalculateBaudRate=13.5 MBits/s
-SPI1.IPParameters=VirtualType,Mode,CalculateBaudRate,BaudRatePrescaler,CLKPolarity,CLKPhase
+SPI1.Direction=SPI_DIRECTION_2LINES
+SPI1.IPParameters=VirtualType,Mode,CalculateBaudRate,BaudRatePrescaler,CLKPolarity,CLKPhase,Direction
SPI1.Mode=SPI_MODE_MASTER
SPI1.VirtualType=VM_MASTER
UART4.BaudRate=9600
UART4.IPParameters=VirtualMode,BaudRate
UART4.VirtualMode=Asynchronous
-USB_DEVICE.IPParameters=VirtualMode-MSC_HS,USBD_HandleTypeDef-MSC_HS,VirtualModeHS
+USB_DEVICE.CLASS_NAME_HS=MSC
+USB_DEVICE.IPParameters=VirtualMode-MSC_HS,USBD_HandleTypeDef-MSC_HS,VirtualModeHS,CLASS_NAME_HS
USB_DEVICE.USBD_HandleTypeDef-MSC_HS=hUsbDeviceHS
USB_DEVICE.VirtualMode-MSC_HS=Msc
USB_DEVICE.VirtualModeHS=Msc_HS
USB_OTG_HS.IPParameters=VirtualMode-Device_HS,dma_enable-Device_HS
USB_OTG_HS.VirtualMode-Device_HS=Device_HS
USB_OTG_HS.dma_enable-Device_HS=ENABLE
+VP_SYS_VS_Systick.Mode=SysTick
+VP_SYS_VS_Systick.Signal=SYS_VS_Systick
VP_TIM4_VS_ControllerModeClock.Mode=Clock Mode
VP_TIM4_VS_ControllerModeClock.Signal=TIM4_VS_ControllerModeClock
VP_USB_DEVICE_VS_USB_DEVICE_MSC_HS.Mode=MSC_HS
}
FSMC_Initialized = 1;
/* Peripheral clock enable */
- #__FSMC_CLK_ENABLE();
+ __FSMC_CLK_ENABLE();
/** FSMC GPIO Configuration
PE7 ------> FSMC_DA4
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
HAL_GPIO_Init(BOOT1_GPIO_Port, &GPIO_InitStruct);
- /*Configure GPIO pins : PBPin PBPin */
- GPIO_InitStruct.Pin = nTERM_EN_Pin|LED_IO_Pin;
+ /*Configure GPIO pins : PBPin */
+ GPIO_InitStruct.Pin = nTERM_EN_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+ /*Configure GPIO pins : PBPin */
+ GPIO_InitStruct.Pin = LED_IO_Pin;
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+ GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+ GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
+ HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+
/*Configure GPIO pins : PD11 PDPin */
GPIO_InitStruct.Pin = GPIO_PIN_11|NWAIT_UNUSED_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
*/
/* 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 "usb_otg_fs.h"
+//#include "usb_otg_fs.h"
#include "gpio.h"
#include "fsmc.h"
/* 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_USB_DEVICE_Init();
MX_UART4_Init();
- MX_USB_OTG_FS_PCD_Init();
/* USER CODE BEGIN 2 */
mainInit();
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
- RCC_OscInitStruct.PLL.PLLM = 20;
+ RCC_OscInitStruct.PLL.PLLM = 12;
RCC_OscInitStruct.PLL.PLLN = 432;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
RCC_OscInitStruct.PLL.PLLQ = 9;
#include "sdio.h"
#include "gpio.h"
-#include "dma.h"
/* USER CODE BEGIN 0 */
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);
}
__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 */
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);
/* USER CODE END 0 */
/* External variables --------------------------------------------------------*/
-extern PCD_HandleTypeDef hpcd_USB_OTG_HS;
+extern PCD_HandleTypeDef hpcd_USB_OTG_FS;
+extern HCD_HandleTypeDef hhcd_USB_OTG_HS;
extern DMA_HandleTypeDef hdma_sdio_tx;
extern DMA_HandleTypeDef hdma_sdio_rx;
extern SD_HandleTypeDef hsd;
/* USER CODE END DMA2_Stream3_IRQn 1 */
}
+/**
+* @brief This function handles USB On The Go FS global interrupt.
+*/
+void OTG_FS_IRQHandler(void)
+{
+ /* USER CODE BEGIN OTG_FS_IRQn 0 */
+
+ /* USER CODE END OTG_FS_IRQn 0 */
+ HAL_PCD_IRQHandler(&hpcd_USB_OTG_FS);
+ /* USER CODE BEGIN OTG_FS_IRQn 1 */
+
+ /* USER CODE END OTG_FS_IRQn 1 */
+}
+
+
/**
* @brief This function handles DMA2 Stream6 global interrupt.
*/
/* USER CODE BEGIN OTG_HS_IRQn 0 */
/* USER CODE END OTG_HS_IRQn 0 */
- HAL_PCD_IRQHandler(&hpcd_USB_OTG_HS);
+ //HAL_HCD_IRQHandler(&hhcd_USB_OTG_HS);
/* USER CODE BEGIN OTG_HS_IRQn 1 */
/* USER CODE END OTG_HS_IRQn 1 */
#include "usb_device.h"
#include "usbd_core.h"
#include "usbd_desc.h"
-#include "usbd_msc.h"
-#include "usbd_storage_if.h"
+#include "usbd_hid.h"
/* USB Device Core handle declaration */
-USBD_HandleTypeDef hUsbDeviceHS;
+USBD_HandleTypeDef hUsbDeviceFS;
/* init function */
void MX_USB_DEVICE_Init(void)
{
/* Init Device Library,Add Supported Class and Start the library*/
- USBD_Init(&hUsbDeviceHS, &HS_Desc, DEVICE_HS);
+ USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS);
- USBD_RegisterClass(&hUsbDeviceHS, &USBD_MSC);
+ USBD_RegisterClass(&hUsbDeviceFS, &USBD_HID);
- USBD_MSC_RegisterStorage(&hUsbDeviceHS, &USBD_Storage_Interface_fops_HS);
-
- USBD_Start(&hUsbDeviceHS);
+ USBD_Start(&hUsbDeviceFS);
}
/**
#include "usbd_def.h"
#include "usbd_core.h"
-PCD_HandleTypeDef hpcd_USB_OTG_HS;
+PCD_HandleTypeDef hpcd_USB_OTG_FS;
/* External functions --------------------------------------------------------*/
void SystemClock_Config(void);
USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev)
{
/* Init USB_IP */
- if (pdev->id == DEVICE_HS) {
+ if (pdev->id == DEVICE_FS) {
/* Link The driver to the stack */
+ hpcd_USB_OTG_FS.pData = pdev;
+ pdev->pData = &hpcd_USB_OTG_FS;
+
+ hpcd_USB_OTG_FS.Instance = USB_OTG_FS;
+ hpcd_USB_OTG_FS.Init.dev_endpoints = 7;
+ hpcd_USB_OTG_FS.Init.speed = PCD_SPEED_FULL;
+ hpcd_USB_OTG_FS.Init.dma_enable = DISABLE;
+ hpcd_USB_OTG_FS.Init.ep0_mps = DEP0CTL_MPS_64;
+ hpcd_USB_OTG_FS.Init.phy_itface = PCD_PHY_EMBEDDED;
+ hpcd_USB_OTG_FS.Init.Sof_enable = DISABLE;
+ hpcd_USB_OTG_FS.Init.low_power_enable = DISABLE;
+ hpcd_USB_OTG_FS.Init.vbus_sensing_enable = DISABLE; // VBUS NOT CONNECTED ?? CHECK.
+ 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, 0x40);
+ HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_FS, 2, 0x40);
+
+ HAL_NVIC_SetPriority(OTG_FS_IRQn, 0, 0);
+ HAL_NVIC_EnableIRQ(OTG_FS_IRQn);
+
+ } else if (pdev->id == DEVICE_HS) {
+ /* Link The driver to the stack */
+ /*
hpcd_USB_OTG_HS.pData = pdev;
pdev->pData = &hpcd_USB_OTG_HS;
HAL_PCD_Init(&hpcd_USB_OTG_HS);
HAL_PCD_SetRxFiFo(&hpcd_USB_OTG_HS, 0x200);
- HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_HS, 0, 0x80);
- HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_HS, 1, 0x174);
+ HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_HS, 0, 0x40);
+ HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_HS, 1, 0x40);
+ HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_HS, 2, 0x174);
+ */
}
return USBD_OK;
}
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
s2s_ledOff();
GPIO_InitTypeDef ledDef = {
- LED_Pin, // Pin
+ LED_IO_Pin, // Pin
GPIO_MODE_OUTPUT_PP, // Mode
GPIO_NOPULL, // Pull(ups)
GPIO_SPEED_FREQ_LOW, // Speed (2MHz)
0 // Alternate function
};
- HAL_GPIO_Init(LED_GPIO_Port, &ledDef);
+ HAL_GPIO_Init(LED_IO_GPIO_Port, &ledDef);
}
void s2s_ledOn()
{
- HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
+ HAL_GPIO_WritePin(LED_IO_GPIO_Port, LED_IO_Pin, GPIO_PIN_RESET);
}
void s2s_ledOff()
{
- HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
+ HAL_GPIO_WritePin(LED_IO_GPIO_Port, LED_IO_Pin, GPIO_PIN_SET);
}
#include "usb_device/usbd_msc_storage_sd.h"\r
\r
\r
-const char* Notice = "Copyright (C) 2016 Michael McMaster <michael@codesrc.com>";\r
+const char* Notice = "Copyright (C) 2019 Michael McMaster <michael@codesrc.com>";\r
uint32_t lastSDPoll;\r
\r
static int isUsbStarted;\r
\r
void mainInit()\r
{\r
+ // DISable the ULPI chip\r
+ // NO SEE AN4879: CLOCK IS INPUT ONLY YOU IDIOT.\r
+ HAL_GPIO_WritePin(nULPI_RESET_GPIO_Port, nULPI_RESET_Pin, GPIO_PIN_RESET);\r
+\r
s2s_timeInit();\r
s2s_ledInit();\r
s2s_fpgaInit();\r
scsiInit();\r
\r
// Is a USB host connected ?\r
+/* TODO DEAL WITH THIS\r
if (isUsbStarted)\r
{\r
USBD_Stop(&hUsbDeviceFS);\r
s2s_delay_ms(128);\r
USBD_Start(&hUsbDeviceFS);\r
}\r
+*/ \r
}\r
\r
+/* TODO DEAL WITH THIS\r
// Can we speed up the SD card ?\r
// Don't combine with the above block because that won't\r
// run if the SD card is present at startup.\r
USBD_Start(&hUsbDeviceFS);\r
isUsbStarted = 1;\r
}\r
+ */\r
}\r
else\r
{\r
}
/**
-* @brief USBD_HS_InterfaceStrDescriptor
+* @brief USBD_FS_InterfaceStrDescriptor
* return the interface string descriptor
* @param speed : current device speed
* @param length : pointer to data length variable