static void SDDiskInit(sSdCard *pSd) { uint8_t sdConnected[BOARD_NUM_MCI]; uint8_t i; msdBuffer = (uint8_t *)BUF_START_ADDR; /* Infinite loop */ for (i = 0; i < BOARD_NUM_MCI; i ++) sdConnected[i]=0; for (i = 0; i < BOARD_NUM_MCI; i ++) { if (CardIsConnected(i)) { if (sdConnected[i] == 0) { sdConnected[i] = 1; printf("-I- connect to solt %x \n\r",i); CardInit(i); pSd = &sdDrv[i]; SD_DumpCID(pSd->CID); SD_DumpCSD(pSd->CSD); SD_DumpExtCSD(pSd->EXT); MEDSdusb_Initialize(&medias[0], pSd); } } else if (sdConnected[i]) { sdConnected[i] = 0; printf("** Card %d Disconnected\n\r",i); } } LUN_Init(&(luns[0]), &(medias[0]), msdBuffer, MSD_BUFFER_SIZE, 0, 0, 0, 0, MSDCallbacks_Data); }
//------------------------------------------------------------------------------ /// Initializes a Media instance and the associated physical interface /// \param media Pointer to the Media instance to initialize /// \return 1 if success. //------------------------------------------------------------------------------ unsigned char MEDSdusb_Initialize(Media *media, unsigned char mciID) { TRACE_INFO("MEDSdusb init\n\r"); // Initialize SDcard //-------------------------------------------------------------------------- if (!CardIsConnected(mciID)) return 0; // Configure SDcard pins ConfigurePIO(mciID); #if defined(MCI2_INTERFACE) DMAD_Initialize(BOARD_MCI_DMA_CHANNEL, DMAD_NO_DEFAULT_IT); #endif // Initialize the MCI driver if(mciID == 0) { IRQ_ConfigureIT(BOARD_SD_MCI_ID, MCI0_IRQ_PRIORITY, MCI0_IrqHandler); MCI_Init(mciDrv, BOARD_SD_MCI_BASE, BOARD_SD_MCI_ID, BOARD_SD_SLOT, MCI_INTERRUPT_MODE); IRQ_EnableIT(BOARD_SD_MCI_ID); } else { #ifdef BOARD_SD_MCI1_ID IRQ_ConfigureIT(BOARD_SD_MCI1_ID, MCI0_IRQ_PRIORITY, MCI0_IrqHandler); MCI_Init(mciDrv, BOARD_SD_MCI1_BASE, BOARD_SD_MCI1_ID, BOARD_SD_SLOT, MCI_INTERRUPT_MODE); IRQ_EnableIT(BOARD_SD_MCI1_ID); #else TRACE_ERROR("SD/MMC card initialization failed (MCI1 not supported)\n\r"); #endif } #if MCI_BUSY_CHECK_FIX && defined(BOARD_SD_DAT0) MCI_SetBusyFix(mciDrv, &pinSdDAT0); #endif // Initialize the SD card driver if (SD_Init(sdDrv, (SdDriver *)mciDrv)) { TRACE_ERROR("SD/MMC card initialization failed\n\r"); return 0; } else { TRACE_INFO("SD/MMC card initialization successful\n\r"); TRACE_INFO("Card size: %d MB\n\r", (int)(MMC_GetTotalSizeKB(sdDrv)/1024)); } MCI_SetSpeed(mciDrv, sdDrv->transSpeed, sdDrv->transSpeed, BOARD_MCK); // Initialize media fields //-------------------------------------------------------------------------- media->interface = sdDrv; media->write = MEDSdusb_Write; media->read = MEDSdusb_Read; media->lock = 0; media->unlock = 0; media->handler = 0; media->flush = 0; media->blockSize = SD_BLOCK_SIZE; media->baseAddress = 0; media->size = SD_TOTAL_BLOCK(sdDrv); media->mappedRD = 0; media->mappedWR = 0; media->writeProtected = CardIsProtected(mciID); media->removable = 1; media->state = MED_STATE_READY; media->transfer.data = 0; media->transfer.address = 0; media->transfer.length = 0; media->transfer.callback = 0; media->transfer.argument = 0; return 1; }
//------------------------------------------------------------------------------ /// Detect if there is SD card in socket //------------------------------------------------------------------------------ unsigned char MEDSdcard_Detect(Media * media, unsigned char mciID) { return CardIsConnected(mciID); }
/** * \brief hsmci_multimedia_card Application entry point. * * \return Unused (ANSI-C compatibility). */ int main(void) { uint8_t connected = 0; /* Disable watchdog */ WDT_Disable( WDT ) ; SCB_EnableICache(); SCB_EnableDCache(); TimeTick_Configure(); /* Output example information*/ printf("-- MultiMedia Card Example %s --\n\r", SOFTPACK_VERSION); printf("-- %s\n\r", BOARD_NAME); printf("-- Compiled: %s %s --\n\r", __DATE__, __TIME__); bMciID = 0; /* Initialize PIO pins */ _ConfigurePIOs(); /* Initialize drivers */ _ConfigureDrivers(); /* Card insert detection loop */ for(;;) { if (CardIsConnected(bMciID)) { if (connected == 0) { connected = 1; /* Delay before card initialize */ Wait(300); /* Do card test */ CardInit(bMciID); DumpMenu(); } } else if (connected) { connected = 0; printf("** Card Disconnected\n\r"); } if (DBG_IsRxReady()) { uint8_t key = DBG_GetChar(); switch(key) { /* Change performance test block size */ case 'c': case 'C': { if (performanceMultiBlock >= NB_MULTI_BLOCKS) performanceMultiBlock = 1; else performanceMultiBlock <<= 1; printf("-!- Performance Multi set to %d\n\r", (int)performanceMultiBlock); } break; /* Show help information */ default: if (!connected) { DumpMenu(); } else { switch(key){ /* Dump block contents */ case 'd': case 'D': BlockDump(bMciID); break; /* Initialize the card again */ case 'I': case 'i': CardInit(bMciID); break; /* Run test on whole disk */ case 't': case 'T': if (SD_GetCardType(&sdDrv[bMciID]) & CARD_TYPE_bmSDIO) SdioTest(bMciID); if (SD_GetCardType(&sdDrv[bMciID]) & CARD_TYPE_bmSDMMC) DiskTest(bMciID, 1, 1, 1); printf("\n\r"); break; /* Run performance test */ case 'P': case 'p': if (SD_GetCardType(&sdDrv[bMciID]) & CARD_TYPE_bmSDIO) SdioPerformanceTest(bMciID); if (SD_GetCardType(&sdDrv[bMciID]) & CARD_TYPE_bmSDMMC) DiskPerformanceTest(bMciID, 1, 1, 0); printf("\n\r"); break; /* Read/Verify ONLY test */ case 'r': case 'R': DiskTest(bMciID, 0, 0, 1); printf("\n\r"); break; /* Read/Verify ONLY performance test */ case 'V': case 'v': DiskPerformanceTest(bMciID, 0, 1, 1); printf("\n\r"); break; /* Show help information */ default: DumpMenu(); } } break; } } } }