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 + -
显示快捷键?