status_t HOST_Init(void *host) { sdif_transfer_callback_t sdifCallback = {0}; sdif_host_t *sdifHost = (sdif_host_t *)host; /* Sets callback in host driver. */ EVENT_InitTimer(); /* Initialize SDIF. */ sdifHost->config.endianMode = kHOST_EndianModeLittle; sdifHost->config.responseTimeout = 0xFFU; sdifHost->config.cardDetDebounce_Clock = 0xFFFFFFU; sdifHost->config.dataTimeout = 0xFFFFFFU; SDIF_Init(sdifHost->base, &(sdifHost->config)); /* Set callback for SDHC driver. */ sdifCallback.TransferComplete = SDIF_TransferCompleteCallback; /* Create handle for SDHC driver */ SDIF_TransferCreateHandle(sdifHost->base, &g_sdifHandle, &sdifCallback, NULL); /* Create transfer complete event. */ if (false == EVENT_Create(kEVENT_TransferComplete)) { return kStatus_Fail; } /* Define transfer function. */ sdifHost->transfer = SDIF_TransferFunction; /* Enable the card power here for mmc card case, because mmc card don't need card detect*/ SDIF_EnableCardPower(sdifHost->base, true); return kStatus_Success; }
/** * Gets event from cache or allocates a new one. Must be called * under synchronization. */ STATIC Event * RWLOCK_GetExclusiveEvent(RWLock * lock) { if (lock->eventsInCache > 0) { Event * e = lock->eventCache[lock->eventsInCache-1]; lock->eventCache[lock->eventsInCache-1] = NULL; lock->eventsInCache--; ASSERT(e); return e; } else { return EVENT_Create(); } }