⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 omap_mmc.c

📁 xen虚拟机源代码安装包
💻 C
📖 第 1 页 / 共 2 页
字号:
    case 0x08:	/* MMC_ARGH */        return s->arg >> 16;    case 0x0c:	/* MMC_CON */        return (s->dw << 15) | (s->mode << 12) | (s->enable << 11) |                 (s->be << 10) | s->clkdiv;    case 0x10:	/* MMC_STAT */        return s->status;    case 0x14:	/* MMC_IE */        return s->mask;    case 0x18:	/* MMC_CTO */        return s->cto;    case 0x1c:	/* MMC_DTO */        return s->dto;    case 0x20:	/* MMC_DATA */        /* TODO: support 8-bit access */        i = s->fifo[s->fifo_start];        if (s->fifo_len == 0) {            printf("MMC: FIFO underrun\n");            return i;        }        s->fifo_start ++;        s->fifo_len --;        s->fifo_start &= 31;        omap_mmc_transfer(s);        omap_mmc_fifolevel_update(s);        omap_mmc_interrupts_update(s);        return i;    case 0x24:	/* MMC_BLEN */        return s->blen_counter;    case 0x28:	/* MMC_NBLK */        return s->nblk_counter;    case 0x2c:	/* MMC_BUF */        return (s->rx_dma << 15) | (s->af_level << 8) |            (s->tx_dma << 7) | s->ae_level;    case 0x30:	/* MMC_SPI */        return 0x0000;    case 0x34:	/* MMC_SDIO */        return (s->cdet_wakeup << 2) | (s->cdet_enable) | s->sdio;    case 0x38:	/* MMC_SYST */        return 0x0000;    case 0x3c:	/* MMC_REV */        return s->rev;    case 0x40:	/* MMC_RSP0 */    case 0x44:	/* MMC_RSP1 */    case 0x48:	/* MMC_RSP2 */    case 0x4c:	/* MMC_RSP3 */    case 0x50:	/* MMC_RSP4 */    case 0x54:	/* MMC_RSP5 */    case 0x58:	/* MMC_RSP6 */    case 0x5c:	/* MMC_RSP7 */        return s->rsp[(offset - 0x40) >> 2];    /* OMAP2-specific */    case 0x60:	/* MMC_IOSR */    case 0x64:	/* MMC_SYSC */        return 0;    case 0x68:	/* MMC_SYSS */        return 1;						/* RSTD */    }    OMAP_BAD_REG(offset);    return 0;}static void omap_mmc_write(void *opaque, target_phys_addr_t offset,                uint32_t value){    int i;    struct omap_mmc_s *s = (struct omap_mmc_s *) opaque;    offset &= OMAP_MPUI_REG_MASK;    switch (offset) {    case 0x00:	/* MMC_CMD */        if (!s->enable)            break;        s->last_cmd = value;        for (i = 0; i < 8; i ++)            s->rsp[i] = 0x0000;        omap_mmc_command(s, value & 63, (value >> 15) & 1,                (sd_cmd_type_t) ((value >> 12) & 3),                (value >> 11) & 1,                (sd_rsp_type_t) ((value >> 8) & 7),                (value >> 7) & 1);        omap_mmc_update(s);        break;    case 0x04:	/* MMC_ARGL */        s->arg &= 0xffff0000;        s->arg |= 0x0000ffff & value;        break;    case 0x08:	/* MMC_ARGH */        s->arg &= 0x0000ffff;        s->arg |= value << 16;        break;    case 0x0c:	/* MMC_CON */        s->dw = (value >> 15) & 1;        s->mode = (value >> 12) & 3;        s->enable = (value >> 11) & 1;        s->be = (value >> 10) & 1;        s->clkdiv = (value >> 0) & (s->rev >= 2 ? 0x3ff : 0xff);        if (s->mode != 0)            printf("SD mode %i unimplemented!\n", s->mode);        if (s->be != 0)            printf("SD FIFO byte sex unimplemented!\n");        if (s->dw != 0 && s->lines < 4)            printf("4-bit SD bus enabled\n");        if (!s->enable)            omap_mmc_reset(s);        break;    case 0x10:	/* MMC_STAT */        s->status &= ~value;        omap_mmc_interrupts_update(s);        break;    case 0x14:	/* MMC_IE */        s->mask = value & 0x7fff;        omap_mmc_interrupts_update(s);        break;    case 0x18:	/* MMC_CTO */        s->cto = value & 0xff;        if (s->cto > 0xfd && s->rev <= 1)            printf("MMC: CTO of 0xff and 0xfe cannot be used!\n");        break;    case 0x1c:	/* MMC_DTO */        s->dto = value & 0xffff;        break;    case 0x20:	/* MMC_DATA */        /* TODO: support 8-bit access */        if (s->fifo_len == 32)            break;        s->fifo[(s->fifo_start + s->fifo_len) & 31] = value;        s->fifo_len ++;        omap_mmc_transfer(s);        omap_mmc_fifolevel_update(s);        omap_mmc_interrupts_update(s);        break;    case 0x24:	/* MMC_BLEN */        s->blen = (value & 0x07ff) + 1;        s->blen_counter = s->blen;        break;    case 0x28:	/* MMC_NBLK */        s->nblk = (value & 0x07ff) + 1;        s->nblk_counter = s->nblk;        s->blen_counter = s->blen;        break;    case 0x2c:	/* MMC_BUF */        s->rx_dma = (value >> 15) & 1;        s->af_level = (value >> 8) & 0x1f;        s->tx_dma = (value >> 7) & 1;        s->ae_level = value & 0x1f;        if (s->rx_dma)            s->status &= 0xfbff;        if (s->tx_dma)            s->status &= 0xf7ff;        omap_mmc_fifolevel_update(s);        omap_mmc_interrupts_update(s);        break;    /* SPI, SDIO and TEST modes unimplemented */    case 0x30:	/* MMC_SPI (OMAP1 only) */        break;    case 0x34:	/* MMC_SDIO */        s->sdio = value & (s->rev >= 2 ? 0xfbf3 : 0x2020);        s->cdet_wakeup = (value >> 9) & 1;        s->cdet_enable = (value >> 2) & 1;        break;    case 0x38:	/* MMC_SYST */        break;    case 0x3c:	/* MMC_REV */    case 0x40:	/* MMC_RSP0 */    case 0x44:	/* MMC_RSP1 */    case 0x48:	/* MMC_RSP2 */    case 0x4c:	/* MMC_RSP3 */    case 0x50:	/* MMC_RSP4 */    case 0x54:	/* MMC_RSP5 */    case 0x58:	/* MMC_RSP6 */    case 0x5c:	/* MMC_RSP7 */        OMAP_RO_REG(offset);        break;    /* OMAP2-specific */    case 0x60:	/* MMC_IOSR */        if (value & 0xf)            printf("MMC: SDIO bits used!\n");        break;    case 0x64:	/* MMC_SYSC */        if (value & (1 << 2))					/* SRTS */            omap_mmc_reset(s);        break;    case 0x68:	/* MMC_SYSS */        OMAP_RO_REG(offset);        break;    default:        OMAP_BAD_REG(offset);    }}static CPUReadMemoryFunc *omap_mmc_readfn[] = {    omap_badwidth_read16,    omap_mmc_read,    omap_badwidth_read16,};static CPUWriteMemoryFunc *omap_mmc_writefn[] = {    omap_badwidth_write16,    omap_mmc_write,    omap_badwidth_write16,};static void omap_mmc_cover_cb(void *opaque, int line, int level){    struct omap_mmc_s *host = (struct omap_mmc_s *) opaque;    if (!host->cdet_state && level) {        host->status |= 0x0002;        omap_mmc_interrupts_update(host);        if (host->cdet_wakeup)            /* TODO: Assert wake-up */;    }    if (host->cdet_state != level) {        qemu_set_irq(host->coverswitch, level);        host->cdet_state = level;    }}struct omap_mmc_s *omap_mmc_init(target_phys_addr_t base,                BlockDriverState *bd,                qemu_irq irq, qemu_irq dma[], omap_clk clk){    int iomemtype;    struct omap_mmc_s *s = (struct omap_mmc_s *)            qemu_mallocz(sizeof(struct omap_mmc_s));    s->irq = irq;    s->base = base;    s->dma = dma;    s->clk = clk;    s->lines = 1;	/* TODO: needs to be settable per-board */    s->rev = 1;    omap_mmc_reset(s);    iomemtype = cpu_register_io_memory(0, omap_mmc_readfn,                    omap_mmc_writefn, s);    cpu_register_physical_memory(s->base, 0x800, iomemtype);    /* Instantiate the storage */    s->card = sd_init(bd, 0);    return s;}struct omap_mmc_s *omap2_mmc_init(struct omap_target_agent_s *ta,                BlockDriverState *bd, qemu_irq irq, qemu_irq dma[],                omap_clk fclk, omap_clk iclk){    int iomemtype;    struct omap_mmc_s *s = (struct omap_mmc_s *)            qemu_mallocz(sizeof(struct omap_mmc_s));    s->irq = irq;    s->dma = dma;    s->clk = fclk;    s->lines = 4;    s->rev = 2;    omap_mmc_reset(s);    iomemtype = cpu_register_io_memory(0, omap_mmc_readfn,                    omap_mmc_writefn, s);    s->base = omap_l4_attach(ta, 0, iomemtype);    /* Instantiate the storage */    s->card = sd_init(bd, 0);    s->cdet = qemu_allocate_irqs(omap_mmc_cover_cb, s, 1)[0];    sd_set_cb(s->card, 0, s->cdet);    return s;}void omap_mmc_handlers(struct omap_mmc_s *s, qemu_irq ro, qemu_irq cover){    if (s->cdet) {        sd_set_cb(s->card, ro, s->cdet);        s->coverswitch = cover;        qemu_set_irq(cover, s->cdet_state);    } else        sd_set_cb(s->card, ro, cover);}void omap_mmc_enable(struct omap_mmc_s *s, int enable){    sd_enable(s->card, enable);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -