SD_API_STATUS CSDHCBase::Start() { SD_API_STATUS status = SD_API_STATUS_INSUFFICIENT_RESOURCES; m_fDriverShutdown = FALSE; // allocate the interrupt event m_hevInterrupt = CreateEvent(NULL, FALSE, FALSE,NULL); if (NULL == m_hevInterrupt) { goto EXIT; } // initialize the interrupt event RETAILMSG(0,(_T("CSDHCBase::Start() m_dwSysIntr = %x\r\n"), m_dwSysIntr)); // jylee if (!InterruptInitialize (m_dwSysIntr, m_hevInterrupt, NULL, 0)) { goto EXIT; } m_fInterruptInitialized = TRUE; // create the interrupt thread for controller interrupts m_htIST = CreateThread(NULL, 0, ISTStub, this, 0, NULL); if (NULL == m_htIST) { goto EXIT; } for (DWORD dwSlot = 0; dwSlot < m_cSlots; ++dwSlot) { PCSDHCSlotBase pSlot = GetSlot(dwSlot); status = pSlot->Start(); if (!SD_API_SUCCESS(status)) { goto EXIT; } } // wake up the interrupt thread to check the slot ::SetInterruptEvent(m_dwSysIntr); status = SD_API_STATUS_SUCCESS; EXIT: if (!SD_API_SUCCESS(status)) { // Clean up Stop(); } RETAILMSG(0,(_T("CSDHCBase::-Start() status = %x\r\n"), status)); // jylee return status; }
// New Start function for Card detect of HSMMC ch1 on SMDK6410. SD_API_STATUS CSDHControllerCh1::Start() { SD_API_STATUS status = SD_API_STATUS_INSUFFICIENT_RESOURCES; m_fDriverShutdown = FALSE; // allocate the interrupt event m_hevInterrupt = CreateEvent(NULL, FALSE, FALSE,NULL); if (NULL == m_hevInterrupt) { goto EXIT; } // initialize the interrupt event if (!InterruptInitialize (m_dwSysIntr, m_hevInterrupt, NULL, 0)) { goto EXIT; } m_fInterruptInitialized = TRUE; // create the interrupt thread for controller interrupts m_htIST = CreateThread(NULL, 0, ISTStub, this, 0, NULL); if (NULL == m_htIST) { goto EXIT; } // allocate the card detect event m_hevCardDetectEvent = CreateEvent(NULL, FALSE, FALSE,NULL); if (NULL == m_hevCardDetectEvent) { goto EXIT; } // initialize the interrupt event if (!InterruptInitialize (m_dwSDDetectSysIntr, m_hevCardDetectEvent, NULL, 0)) { goto EXIT; } // create the card detect interrupt thread m_htCardDetectThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)SD_CardDetectThread, this, 0, NULL); if (NULL == m_htCardDetectThread) { goto EXIT; } for (DWORD dwSlot = 0; dwSlot < m_cSlots; ++dwSlot) { PCSDHCSlotBase pSlot = GetSlot(dwSlot); status = pSlot->Start(); if (!SD_API_SUCCESS(status)) { goto EXIT; } } // wake up the interrupt thread to check the slot ::SetInterruptEvent(m_dwSDDetectSysIntr); status = SD_API_STATUS_SUCCESS; EXIT: if (!SD_API_SUCCESS(status)) { // Clean up Stop(); } return status; }