static void mmc_error(SIM_HBA *hba, int mmc_status) { SIM_MMC_EXT *ext = (SIM_MMC_EXT *)hba->ext; CCB_SCSIIO *ccb = ext->nexus; if (ccb) { switch (mmc_status) { case MMC_DATA_OVERRUN: ccb->cam_ch.cam_status = CAM_DATA_RUN_ERR; break; case MMC_NOT_PRESENT: mmc_sense(hba, SK_NOT_RDY, ASC_MEDIA_NOT_PRESENT, 0); break; case MMC_TIMEOUT: case MMC_COMMAND_FAILURE: mmc_reset(hba); ccb->cam_ch.cam_status = CAM_CMD_TIMEOUT; break; case MMC_READ_ERROR: // CRC errors case MMC_WRITE_ERROR: default: ccb->cam_ch.cam_status = CAM_CMD_TIMEOUT; break; } } }
void nes_reset(NES *nes) { joypad_reset(&(nes->pad)); mmc_reset (&(nes->mmc)); ppu_reset (&(nes->ppu)); apu_reset (&(nes->apu)); cpu_reset (&(nes->cpu)); }
void reset(bool hard_reset) { if(hard_reset) { memset(cpu_->mem_page[0], 0, NES_RAMSIZE); if(rominfo_->vram) { mem_trash_(rominfo_->vram, 0x2000 * rominfo_->vram_banks); } } apu_reset(); ppu_reset(hard_reset == true ? 1 : 0); mmc_reset(); nes6502_reset(); scanline_ = 241; }
static int tegra_mmc_core_init(struct mmc *mmc) { struct mmc_host *host = mmc->priv; unsigned int mask; debug(" mmc_core_init called\n"); mmc_reset(host, mmc); host->version = readw(&host->reg->hcver); debug("host version = %x\n", host->version); /* mask all */ writel(0xffffffff, &host->reg->norintstsen); writel(0xffffffff, &host->reg->norintsigen); writeb(0xe, &host->reg->timeoutcon); /* TMCLK * 2^27 */ /* * NORMAL Interrupt Status Enable Register init * [5] ENSTABUFRDRDY : Buffer Read Ready Status Enable * [4] ENSTABUFWTRDY : Buffer write Ready Status Enable * [3] ENSTADMAINT : DMA boundary interrupt * [1] ENSTASTANSCMPLT : Transfre Complete Status Enable * [0] ENSTACMDCMPLT : Command Complete Status Enable */ mask = readl(&host->reg->norintstsen); mask &= ~(0xffff); mask |= (TEGRA_MMC_NORINTSTSEN_CMD_COMPLETE | TEGRA_MMC_NORINTSTSEN_XFER_COMPLETE | TEGRA_MMC_NORINTSTSEN_DMA_INTERRUPT | TEGRA_MMC_NORINTSTSEN_BUFFER_WRITE_READY | TEGRA_MMC_NORINTSTSEN_BUFFER_READ_READY); writel(mask, &host->reg->norintstsen); /* * NORMAL Interrupt Signal Enable Register init * [1] ENSTACMDCMPLT : Transfer Complete Signal Enable */ mask = readl(&host->reg->norintsigen); mask &= ~(0xffff); mask |= TEGRA_MMC_NORINTSIGEN_XFER_COMPLETE; writel(mask, &host->reg->norintsigen); return 0; }
static int mmc_core_init(struct mmc *mmc) { struct mmc_host *host = (struct mmc_host *)mmc->priv; unsigned int mask; #if 0 if (mmc_card_detect(host) == 0) { printf("NO SD/MMC detected!\n"); return -1; } #endif mmc_reset(host); host->version = readw(&host->reg->hcver); /* mask all */ writel(0xffffffff, &host->reg->norintstsen); writel(0xffffffff, &host->reg->norintsigen); writeb(0xe, &host->reg->timeoutcon); /* TMCLK * 2^27 */ /* * NORMAL Interrupt Status Enable Register init * [5] ENSTABUFRDRDY : Buffer Read Ready Status Enable * [4] ENSTABUFWTRDY : Buffer write Ready Status Enable * [1] ENSTASTANSCMPLT : Transfre Complete Status Enable * [0] ENSTACMDCMPLT : Command Complete Status Enable */ mask = readl(&host->reg->norintstsen); mask &= ~(0xffff); mask |= (1 << 5) | (1 << 4) | (1 << 1) | (1 << 0); writel(mask, &host->reg->norintstsen); /* * NORMAL Interrupt Signal Enable Register init * [1] ENSTACMDCMPLT : Transfer Complete Signal Enable */ mask = readl(&host->reg->norintsigen); mask &= ~(0xffff); mask |= (1 << 1); writel(mask, &host->reg->norintsigen); return 0; }
// 内部函数实现 static void nes_do_reset(NES *nes) { // mmc need reset first mmc_reset(&(nes->mmc)); // reset cpu & ppu & apu cpu_reset(&(nes->cpu)); ppu_reset(&(nes->ppu)); apu_reset(&(nes->apu)); // reset joypad joypad_reset(&(nes->pad)); // reset replay replay_reset(&(nes->replay)); // restart ndb ndb_set_debug(&(nes->ndb), NDB_DEBUG_MODE_RESTART); }