static int select_card(int card_no) { mutex_lock(&mmc_mutex); led(true); last_disk_activity = current_tick; mmc_enable_int_flash_clock(card_no == 0); if (!card_info[card_no].initialized) { setup_sci1(7); /* Initial rate: 375 kbps (need <= 400 per mmc specs) */ write_transfer(dummy, 10); /* allow the card to synchronize */ while (!(SSR1 & SCI_TEND)); } if (card_no == 0) /* internal */ and_b(~0x04, &PADRH); /* assert CS */ else /* external */ and_b(~0x02, &PADRH); /* assert CS */ if (card_info[card_no].initialized) { setup_sci1(card_info[card_no].bitrate_register); return 0; } else { return initialize_card(card_no); } }
int deviceHandler_CARD_readDir(file_handle* ffile, file_handle** dir, unsigned int type){ int num_entries = 1, ret = 0, i = 1, slot = ffile->fileBase>>24; card_dir *memcard_dir = NULL; if(!card_init[slot]) { //if some error ret = initialize_card(slot); if(ret != CARD_ERROR_READY) { return -1; //fail } } memcard_dir = (card_dir*)memalign(32,sizeof(card_dir)); memset(memcard_dir, 0, sizeof(card_dir)); /* Convert the Memory Card "file" data to fileBrowser_files */ *dir = malloc( num_entries * sizeof(file_handle) ); // Virtual Entry for entire card. memset(&(*dir)[0], 0, sizeof(file_handle)); sprintf((*dir)[0].name,"RAW Image"); (*dir)[0].fileAttrib = IS_SPECIAL; (*dir)[0].fileBase = ffile->fileBase; int usedSpace = 0; ret = CARD_FindFirst (slot, memcard_dir, true); while (CARD_ERROR_NOFILE != ret) { // Make sure we have room for this one if(i == num_entries){ ++num_entries; *dir = realloc( *dir, num_entries * sizeof(file_handle) ); } memset(&(*dir)[i], 0, sizeof(file_handle)); strcpy( (*dir)[i].name, (char*)memcard_dir->filename); (*dir)[i].name[CARD_FILENAMELEN] = '\0'; strcat( (*dir)[i].name, ".gci"); (*dir)[i].name[CARD_FILENAMELEN+4] = '\0'; (*dir)[i].fileAttrib = IS_FILE; (*dir)[i].size = memcard_dir->filelen + sizeof(GCI); (*dir)[i].fileBase = ffile->fileBase | (memcard_dir->fileno & 0xFFFFFF); ret = CARD_FindNext (memcard_dir); ++i; usedSpace += memcard_dir->filelen; } free(memcard_dir); usedSpace >>= 10; initial_CARD_info.freeSpaceInKB = initial_CARD_info.totalSpaceInKB-usedSpace; return num_entries; }
s32 deviceHandler_CARD_init(file_handle* file){ int slot = (!strncmp((const char*)initial_CARDB.name, file->name, 7)); file->status = initialize_card(slot); s32 memSize = 0, sectSize = 0; int ret = CARD_ProbeEx(slot,&memSize,§Size); if(ret==CARD_ERROR_READY) { initial_CARD_info.totalSpaceInKB = (memSize<<7); } else { print_gecko("CARD_ProbeEx failed %i\r\n", ret); } initial_CARD_info.freeSpaceInKB = 0; return file->status == CARD_ERROR_READY ? 1 : 0; }
s32 deviceHandler_CARD_readDir(file_handle* ffile, file_handle** dir, u32 type){ int num_entries = 1, ret = 0, i = 0, slot = (!strncmp((const char*)initial_CARDB.name, ffile->name, 7)); card_dir *memcard_dir = NULL; if(!card_init[slot]) { //if some error ret = initialize_card(slot); if(ret != CARD_ERROR_READY) { return -1; //fail } } CARD_SetGameAndCompany(); memcard_dir = (card_dir*)memalign(32,sizeof(card_dir)); memset(memcard_dir, 0, sizeof(card_dir)); /* Convert the Memory Card "file" data to fileBrowser_files */ *dir = malloc( num_entries * sizeof(file_handle) ); int usedSpace = 0; ret = CARD_FindFirst (slot, memcard_dir, true); while (CARD_ERROR_NOFILE != ret) { // Make sure we have room for this one if(i == num_entries){ ++num_entries; *dir = realloc( *dir, num_entries * sizeof(file_handle) ); } memset(&(*dir)[i], 0, sizeof(file_handle)); strcpy((*dir)[i].name, ffile->name); strncat((*dir)[i].name, (char*)memcard_dir->filename, CARD_FILENAMELEN); (*dir)[i].fileAttrib = IS_FILE; (*dir)[i].size = memcard_dir->filelen; memcpy( (*dir)[i].other, memcard_dir, sizeof(card_dir)); usedSpace += memcard_dir->filelen; ret = CARD_FindNext (memcard_dir); ++i; } free(memcard_dir); usedSpace >>= 10; initial_CARD_info.freeSpaceInKB = initial_CARD_info.totalSpaceInKB-usedSpace; return num_entries; }
// Checks if devices are available, prints name of device being detected for slow init devices void populateDeviceAvailability() { DrawFrameStart(); DrawMessageBox(D_INFO, "Detecting devices ...\nThis can be skipped by holding B next time"); DrawFrameFinish(); if(PAD_ButtonsHeld(0) & PAD_BUTTON_B) { deviceHandler_setAllDevicesAvailable(); return; } const DISC_INTERFACE* carda = &__io_gcsda; const DISC_INTERFACE* cardb = &__io_gcsdb; // DVD deviceHandler_setDeviceAvailable(DVD_DISC, swissSettings.hasDVDDrive); // SD Gecko DrawFrameStart(); DrawMessageBox(D_INFO, "Detecting devices [SD] ...\nThis can be skipped by holding B next time"); DrawFrameFinish(); deviceHandler_setDeviceAvailable(SD_CARD, carda->isInserted() || cardb->isInserted()); // IDE-EXI DrawFrameStart(); DrawMessageBox(D_INFO, "Detecting devices [IDE-EXI] ...\nThis can be skipped by holding B next time"); DrawFrameFinish(); deviceHandler_setDeviceAvailable(IDEEXI, ide_exi_inserted(0) || ide_exi_inserted(1)); // Qoob deviceHandler_setDeviceAvailable(QOOB_FLASH, 0); // Hidden by default, add auto detect at some point // WODE deviceHandler_setDeviceAvailable(WODE, 0); // Hidden by default, add auto detect at some point // Memory card DrawFrameStart(); DrawMessageBox(D_INFO, "Detecting devices [Memory Card] ...\nThis can be skipped by holding B next time"); DrawFrameFinish(); deviceHandler_setDeviceAvailable(MEMCARD, (initialize_card(0)==CARD_ERROR_READY) || (initialize_card(1)==CARD_ERROR_READY)); // WKF/WASP DrawFrameStart(); DrawMessageBox(D_INFO, "Detecting devices [WKF/WASP] ...\nThis can be skipped by holding B next time"); DrawFrameFinish(); deviceHandler_setDeviceAvailable(WKF, swissSettings.hasDVDDrive && (__wkfSpiReadId() != 0 && __wkfSpiReadId() != 0xFFFFFFFF)); // USB Gecko deviceHandler_setDeviceAvailable(USBGECKO, usb_isgeckoalive(1)); // BBA/SAMBA deviceHandler_setDeviceAvailable(SAMBA, exi_bba_exists()); // System, always there deviceHandler_setDeviceAvailable(SYS, 1); }
bool deviceHandler_CARD_test_b() { s32 memSize = 0, sectSize = 0; return ((initialize_card(1)==CARD_ERROR_READY) && (CARD_ProbeEx(1, &memSize,§Size)==CARD_ERROR_READY)); }