| @@ -228,6 +228,7 @@ static SD_CARD_DESCRIPTOR sdCardDesc; | |||
| * Private functions | |||
| ******************************************************************************/ | |||
| static uint8_t SDHC_Init(void); | |||
| static void SDHC_InitGPIO(void); | |||
| static void SDHC_ReleaseGPIO(void); | |||
| static void SDHC_SetClock(uint32_t sysctl); | |||
| @@ -259,8 +260,10 @@ static int SDHC_ACMD41_SendOperationCond(uint32_t cond); | |||
| // initialize the SDHC Controller | |||
| // returns status of initialization(OK, nonInit, noCard, CardProtected) | |||
| uint8_t SDHC_Init(void) | |||
| static uint8_t SDHC_Init(void) | |||
| { | |||
| int i; | |||
| // Enable clock to SDHC peripheral | |||
| SIM_SCGC3 |= SIM_SCGC3_SDHC; | |||
| @@ -270,7 +273,7 @@ uint8_t SDHC_Init(void) | |||
| SIM_SCGC6 |= SIM_SCGC6_DMAMUX; | |||
| SIM_SCGC7 |= SIM_SCGC7_DMA; | |||
| // Switch of MPU unit (maybe bug of silicon) | |||
| // Enable DMA access via MPU (not currently used) | |||
| MPU_CESR &= ~MPU_CESR_VLD_MASK; | |||
| // De-init GPIO - to prevent unwanted clocks on bus | |||
| @@ -304,9 +307,13 @@ uint8_t SDHC_Init(void) | |||
| SDHC_IRQSTATEN_BRRSEN | SDHC_IRQSTATEN_BWRSEN | SDHC_IRQSTATEN_DINTSEN | | |||
| SDHC_IRQSTATEN_CRMSEN | SDHC_IRQSTATEN_TCSEN | SDHC_IRQSTATEN_CCSEN; | |||
| /* 80 initial clocks */ | |||
| SDHC_SYSCTL |= SDHC_SYSCTL_INITA; | |||
| while (SDHC_SYSCTL & SDHC_SYSCTL_INITA) { }; | |||
| // initial clocks... SD spec says only 74 clocks are needed, but if Teensy rebooted | |||
| // while the card was in middle of an operation, thousands of clock cycles can be | |||
| // needed to get the card to complete a prior command and return to a usable state. | |||
| for (i=0; i < 50; i++) { | |||
| SDHC_SYSCTL |= SDHC_SYSCTL_INITA; | |||
| while (SDHC_SYSCTL & SDHC_SYSCTL_INITA) { }; | |||
| } | |||
| // to do - check if this needed | |||
| SDHC_IRQSTAT |= SDHC_IRQSTAT_CRM; | |||