omap1.c

来自「xen虚拟机源代码安装包」· C语言 代码 · 共 2,284 行 · 第 1/5 页

C
2,284
字号
{    if (s->compat1509) {        if (diff & (1 << 31))			/* MCBSP3_CLK_HIZ_DI */            omap_clk_onoff(omap_findclk(s, "mcbsp3.clkx"),                            (value >> 31) & 1);        if (diff & (1 << 1))			/* CLK32K */            omap_clk_onoff(omap_findclk(s, "clk32k_out"),                            (~value >> 1) & 1);    }}static inline void omap_pin_modconf1_update(struct omap_mpu_state_s *s,                uint32_t diff, uint32_t value){    if (diff & (1 << 31))			/* CONF_MOD_UART3_CLK_MODE_R */         omap_clk_reparent(omap_findclk(s, "uart3_ck"),                         omap_findclk(s, ((value >> 31) & 1) ?                                 "ck_48m" : "armper_ck"));    if (diff & (1 << 30))			/* CONF_MOD_UART2_CLK_MODE_R */         omap_clk_reparent(omap_findclk(s, "uart2_ck"),                         omap_findclk(s, ((value >> 30) & 1) ?                                 "ck_48m" : "armper_ck"));    if (diff & (1 << 29))			/* CONF_MOD_UART1_CLK_MODE_R */         omap_clk_reparent(omap_findclk(s, "uart1_ck"),                         omap_findclk(s, ((value >> 29) & 1) ?                                 "ck_48m" : "armper_ck"));    if (diff & (1 << 23))			/* CONF_MOD_MMC_SD_CLK_REQ_R */         omap_clk_reparent(omap_findclk(s, "mmc_ck"),                         omap_findclk(s, ((value >> 23) & 1) ?                                 "ck_48m" : "armper_ck"));    if (diff & (1 << 12))			/* CONF_MOD_COM_MCLK_12_48_S */         omap_clk_reparent(omap_findclk(s, "com_mclk_out"),                         omap_findclk(s, ((value >> 12) & 1) ?                                 "ck_48m" : "armper_ck"));    if (diff & (1 << 9))			/* CONF_MOD_USB_HOST_HHC_UHO */         omap_clk_onoff(omap_findclk(s, "usb_hhc_ck"), (value >> 9) & 1);}static void omap_pin_cfg_write(void *opaque, target_phys_addr_t addr,                uint32_t value){    struct omap_mpu_state_s *s = (struct omap_mpu_state_s *) opaque;    int offset = addr - s->pin_cfg_base;    uint32_t diff;    switch (offset) {    case 0x00:	/* FUNC_MUX_CTRL_0 */        diff = s->func_mux_ctrl[offset >> 2] ^ value;        s->func_mux_ctrl[offset >> 2] = value;        omap_pin_funcmux0_update(s, diff, value);        return;    case 0x04:	/* FUNC_MUX_CTRL_1 */        diff = s->func_mux_ctrl[offset >> 2] ^ value;        s->func_mux_ctrl[offset >> 2] = value;        omap_pin_funcmux1_update(s, diff, value);        return;    case 0x08:	/* FUNC_MUX_CTRL_2 */        s->func_mux_ctrl[offset >> 2] = value;        return;    case 0x0c:	/* COMP_MODE_CTRL_0 */        s->comp_mode_ctrl[0] = value;        s->compat1509 = (value != 0x0000eaef);        omap_pin_funcmux0_update(s, ~0, s->func_mux_ctrl[0]);        omap_pin_funcmux1_update(s, ~0, s->func_mux_ctrl[1]);        return;    case 0x10:	/* FUNC_MUX_CTRL_3 */    case 0x14:	/* FUNC_MUX_CTRL_4 */    case 0x18:	/* FUNC_MUX_CTRL_5 */    case 0x1c:	/* FUNC_MUX_CTRL_6 */    case 0x20:	/* FUNC_MUX_CTRL_7 */    case 0x24:	/* FUNC_MUX_CTRL_8 */    case 0x28:	/* FUNC_MUX_CTRL_9 */    case 0x2c:	/* FUNC_MUX_CTRL_A */    case 0x30:	/* FUNC_MUX_CTRL_B */    case 0x34:	/* FUNC_MUX_CTRL_C */    case 0x38:	/* FUNC_MUX_CTRL_D */        s->func_mux_ctrl[(offset >> 2) - 1] = value;        return;    case 0x40:	/* PULL_DWN_CTRL_0 */    case 0x44:	/* PULL_DWN_CTRL_1 */    case 0x48:	/* PULL_DWN_CTRL_2 */    case 0x4c:	/* PULL_DWN_CTRL_3 */        s->pull_dwn_ctrl[(offset & 0xf) >> 2] = value;        return;    case 0x50:	/* GATE_INH_CTRL_0 */        s->gate_inh_ctrl[0] = value;        return;    case 0x60:	/* VOLTAGE_CTRL_0 */        s->voltage_ctrl[0] = value;        return;    case 0x70:	/* TEST_DBG_CTRL_0 */        s->test_dbg_ctrl[0] = value;        return;    case 0x80:	/* MOD_CONF_CTRL_0 */        diff = s->mod_conf_ctrl[0] ^ value;        s->mod_conf_ctrl[0] = value;        omap_pin_modconf1_update(s, diff, value);        return;    default:        OMAP_BAD_REG(addr);    }}static CPUReadMemoryFunc *omap_pin_cfg_readfn[] = {    omap_badwidth_read32,    omap_badwidth_read32,    omap_pin_cfg_read,};static CPUWriteMemoryFunc *omap_pin_cfg_writefn[] = {    omap_badwidth_write32,    omap_badwidth_write32,    omap_pin_cfg_write,};static void omap_pin_cfg_reset(struct omap_mpu_state_s *mpu){    /* Start in Compatibility Mode.  */    mpu->compat1509 = 1;    omap_pin_funcmux0_update(mpu, mpu->func_mux_ctrl[0], 0);    omap_pin_funcmux1_update(mpu, mpu->func_mux_ctrl[1], 0);    omap_pin_modconf1_update(mpu, mpu->mod_conf_ctrl[0], 0);    memset(mpu->func_mux_ctrl, 0, sizeof(mpu->func_mux_ctrl));    memset(mpu->comp_mode_ctrl, 0, sizeof(mpu->comp_mode_ctrl));    memset(mpu->pull_dwn_ctrl, 0, sizeof(mpu->pull_dwn_ctrl));    memset(mpu->gate_inh_ctrl, 0, sizeof(mpu->gate_inh_ctrl));    memset(mpu->voltage_ctrl, 0, sizeof(mpu->voltage_ctrl));    memset(mpu->test_dbg_ctrl, 0, sizeof(mpu->test_dbg_ctrl));    memset(mpu->mod_conf_ctrl, 0, sizeof(mpu->mod_conf_ctrl));}static void omap_pin_cfg_init(target_phys_addr_t base,                struct omap_mpu_state_s *mpu){    int iomemtype = cpu_register_io_memory(0, omap_pin_cfg_readfn,                    omap_pin_cfg_writefn, mpu);    mpu->pin_cfg_base = base;    cpu_register_physical_memory(mpu->pin_cfg_base, 0x800, iomemtype);    omap_pin_cfg_reset(mpu);}/* Device Identification, Die Identification */static uint32_t omap_id_read(void *opaque, target_phys_addr_t addr){    struct omap_mpu_state_s *s = (struct omap_mpu_state_s *) opaque;    switch (addr) {    case 0xfffe1800:	/* DIE_ID_LSB */        return 0xc9581f0e;    case 0xfffe1804:	/* DIE_ID_MSB */        return 0xa8858bfa;    case 0xfffe2000:	/* PRODUCT_ID_LSB */        return 0x00aaaafc;    case 0xfffe2004:	/* PRODUCT_ID_MSB */        return 0xcafeb574;    case 0xfffed400:	/* JTAG_ID_LSB */        switch (s->mpu_model) {        case omap310:            return 0x03310315;        case omap1510:            return 0x03310115;        default:            cpu_abort(cpu_single_env, "%s: bad mpu model\n", __FUNCTION__);        }        break;    case 0xfffed404:	/* JTAG_ID_MSB */        switch (s->mpu_model) {        case omap310:            return 0xfb57402f;        case omap1510:            return 0xfb47002f;        default:            cpu_abort(cpu_single_env, "%s: bad mpu model\n", __FUNCTION__);        }        break;    }    OMAP_BAD_REG(addr);    return 0;}static void omap_id_write(void *opaque, target_phys_addr_t addr,                uint32_t value){    OMAP_BAD_REG(addr);}static CPUReadMemoryFunc *omap_id_readfn[] = {    omap_badwidth_read32,    omap_badwidth_read32,    omap_id_read,};static CPUWriteMemoryFunc *omap_id_writefn[] = {    omap_badwidth_write32,    omap_badwidth_write32,    omap_id_write,};static void omap_id_init(struct omap_mpu_state_s *mpu){    int iomemtype = cpu_register_io_memory(0, omap_id_readfn,                    omap_id_writefn, mpu);    cpu_register_physical_memory(0xfffe1800, 0x800, iomemtype);    cpu_register_physical_memory(0xfffed400, 0x100, iomemtype);    if (!cpu_is_omap15xx(mpu))        cpu_register_physical_memory(0xfffe2000, 0x800, iomemtype);}/* MPUI Control (Dummy) */static uint32_t omap_mpui_read(void *opaque, target_phys_addr_t addr){    struct omap_mpu_state_s *s = (struct omap_mpu_state_s *) opaque;    int offset = addr - s->mpui_base;    switch (offset) {    case 0x00:	/* CTRL */        return s->mpui_ctrl;    case 0x04:	/* DEBUG_ADDR */        return 0x01ffffff;    case 0x08:	/* DEBUG_DATA */        return 0xffffffff;    case 0x0c:	/* DEBUG_FLAG */        return 0x00000800;    case 0x10:	/* STATUS */        return 0x00000000;    /* Not in OMAP310 */    case 0x14:	/* DSP_STATUS */    case 0x18:	/* DSP_BOOT_CONFIG */        return 0x00000000;    case 0x1c:	/* DSP_MPUI_CONFIG */        return 0x0000ffff;    }    OMAP_BAD_REG(addr);    return 0;}static void omap_mpui_write(void *opaque, target_phys_addr_t addr,                uint32_t value){    struct omap_mpu_state_s *s = (struct omap_mpu_state_s *) opaque;    int offset = addr - s->mpui_base;    switch (offset) {    case 0x00:	/* CTRL */        s->mpui_ctrl = value & 0x007fffff;        break;    case 0x04:	/* DEBUG_ADDR */    case 0x08:	/* DEBUG_DATA */    case 0x0c:	/* DEBUG_FLAG */    case 0x10:	/* STATUS */    /* Not in OMAP310 */    case 0x14:	/* DSP_STATUS */        OMAP_RO_REG(addr);    case 0x18:	/* DSP_BOOT_CONFIG */    case 0x1c:	/* DSP_MPUI_CONFIG */        break;    default:        OMAP_BAD_REG(addr);    }}static CPUReadMemoryFunc *omap_mpui_readfn[] = {    omap_badwidth_read32,    omap_badwidth_read32,    omap_mpui_read,};static CPUWriteMemoryFunc *omap_mpui_writefn[] = {    omap_badwidth_write32,    omap_badwidth_write32,    omap_mpui_write,};static void omap_mpui_reset(struct omap_mpu_state_s *s){    s->mpui_ctrl = 0x0003ff1b;}static void omap_mpui_init(target_phys_addr_t base,                struct omap_mpu_state_s *mpu){    int iomemtype = cpu_register_io_memory(0, omap_mpui_readfn,                    omap_mpui_writefn, mpu);    mpu->mpui_base = base;    cpu_register_physical_memory(mpu->mpui_base, 0x100, iomemtype);    omap_mpui_reset(mpu);}/* TIPB Bridges */struct omap_tipb_bridge_s {    target_phys_addr_t base;    qemu_irq abort;    int width_intr;    uint16_t control;    uint16_t alloc;    uint16_t buffer;    uint16_t enh_control;};static uint32_t omap_tipb_bridge_read(void *opaque, target_phys_addr_t addr){    struct omap_tipb_bridge_s *s = (struct omap_tipb_bridge_s *) opaque;    int offset = addr - s->base;    switch (offset) {    case 0x00:	/* TIPB_CNTL */        return s->control;    case 0x04:	/* TIPB_BUS_ALLOC */        return s->alloc;    case 0x08:	/* MPU_TIPB_CNTL */        return s->buffer;    case 0x0c:	/* ENHANCED_TIPB_CNTL */        return s->enh_control;    case 0x10:	/* ADDRESS_DBG */    case 0x14:	/* DATA_DEBUG_LOW */    case 0x18:	/* DATA_DEBUG_HIGH */        return 0xffff;    case 0x1c:	/* DEBUG_CNTR_SIG */        return 0x00f8;    }    OMAP_BAD_REG(addr);    return 0;}static void omap_tipb_bridge_write(void *opaque, target_phys_addr_t addr,                uint32_t value){    struct omap_tipb_bridge_s *s = (struct omap_tipb_bridge_s *) opaque;    int offset = addr - s->base;    switch (offset) {    case 0x00:	/* TIPB_CNTL */        s->control = value & 0xffff;        break;    case 0x04:	/* TIPB_BUS_ALLOC */        s->alloc = value & 0x003f;        break;    case 0x08:	/* MPU_TIPB_CNTL */        s->buffer = value & 0x0003;        break;    case 0x0c:	/* ENHANCED_TIPB_CNTL */        s->width_intr = !(value & 2);        s->enh_control = value & 0x000f;        break;    case 0x10:	/* ADDRESS_DBG */    case 0x14:	/* DATA_DEBUG_LOW */    case 0x18:	/* DATA_DEBUG_HIGH */    case 0x1c:	/* DEBUG_CNTR_SIG */        OMAP_RO_REG(addr);        break;    default:        OMAP_BAD_REG(addr);    }}static CPUReadMemoryFunc *omap_tipb_bridge_readfn[] = {    omap_badwidth_read16,    omap_tipb_bridge_read,    omap_tipb_bridge_read,};static CPUWriteMemoryFunc *omap_tipb_bridge_writefn[] = {    omap_badwidth_write16,    omap_tipb_bridge_write,    omap_tipb_bridge_write,};static void omap_tipb_bridge_reset(struct omap_tipb_bridge_s *s){    s->control = 0xffff;    s->alloc = 0x0009;    s->buffer = 0x0000;    s->enh_control = 0x000f;}struct omap_tipb_bridge_s *omap_tipb_bridge_init(target_phys_addr_t base,                qemu_irq abort_irq, omap_clk clk){    int iomemtype;    struct omap_tipb_bridge_s *s = (struct omap_tipb_bridge_s *)            qemu_mallocz(sizeof(struct omap_tipb_bridge_s));    s->abort = abort_irq;    s->base = base;    omap_tipb_bridge_reset(s);    iomemtype = cpu_register_io_memory(0, omap_tipb_bridge_readfn,                    omap_tipb_bridge_writefn, s);    cpu_register_physical_memory(s->base, 0x100, iomemtype);    return s;}/* Dummy Traffic Controller's Memory Interface */static uint32_t omap_tcmi_read(void *opaque, target_phys_addr_t addr){    struct omap_mpu_state_s *s = (struct omap_mpu_state_s *) opaque;    int offset = addr - s->tcmi_base;    uint32_t ret;    switch (offset) {    case 0x00:	/* IMIF_PRIO */    case 0x04:	/* EMIFS_PRIO */    case 0x08:	/* EMIFF_PRIO */    case 0x0c:	/* EMIFS_CONFIG */    case 0x10:	/* EMIFS_CS0_CONFIG */    case 0x14:	/* EMIFS_CS1_CONFIG */    case 0x18:	/* EMIFS_CS2_CONFIG */    case 0x1c:	/* EMIFS_CS3_CONFIG */    case 0x24:	/* EMIFF_MRS */    case 0x28:	/* TIMEOUT1 */    case 0x2c:	/* TIMEOUT2 */    case 0x30:	/* TIMEOUT3 */    case 0x3c:	/* EMIFF_SDRAM_CONFIG_2 */    case 0x40:	/* EMIFS_CFG_DYN_WAIT */        return s->tcmi_regs[offset >> 2];    case 0x20:	/* EMIFF_SDRAM_CONFIG */        ret = s->tcmi_regs[offset >> 2];        s->tcmi_regs[offset >> 2] &= ~1; /* XXX: Clear SLRF on SDRAM access */        /* XXX: We can try using the VGA_DIRTY flag for this */        return ret;    }    OMAP_BAD_REG(addr);    return 0;}static void omap_tcmi_write(void *opaque, target_phys_addr_t addr,

⌨️ 快捷键说明

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