omap_dss.c
来自「xen虚拟机源代码安装包」· C语言 代码 · 共 1,094 行 · 第 1/3 页
C
1,094 行
{ struct omap_dss_s *s = (struct omap_dss_s *) opaque; int offset = addr - s->rfbi_base; switch (offset) { case 0x10: /* RFBI_SYSCONFIG */ if (value & 2) /* SOFTRESET */ omap_rfbi_reset(s); s->rfbi.idlemode = value & 0x19; break; case 0x40: /* RFBI_CONTROL */ s->rfbi.control = value & 0xf; s->rfbi.enable = value & 1; if (value & (1 << 4) && /* ITE */ !(s->rfbi.config[0] & s->rfbi.config[1] & 0xc)) omap_rfbi_transfer_start(s); break; case 0x44: /* RFBI_PIXELCNT */ s->rfbi.pixels = value; break; case 0x48: /* RFBI_LINE_NUMBER */ s->rfbi.skiplines = value & 0x7ff; break; case 0x4c: /* RFBI_CMD */ if ((s->rfbi.control & (1 << 2)) && s->rfbi.chip[0]) s->rfbi.chip[0]->write(s->rfbi.chip[0]->opaque, 0, value & 0xffff); if ((s->rfbi.control & (1 << 3)) && s->rfbi.chip[1]) s->rfbi.chip[1]->write(s->rfbi.chip[1]->opaque, 0, value & 0xffff); break; case 0x50: /* RFBI_PARAM */ if ((s->rfbi.control & (1 << 2)) && s->rfbi.chip[0]) s->rfbi.chip[0]->write(s->rfbi.chip[0]->opaque, 1, value & 0xffff); if ((s->rfbi.control & (1 << 3)) && s->rfbi.chip[1]) s->rfbi.chip[1]->write(s->rfbi.chip[1]->opaque, 1, value & 0xffff); break; case 0x54: /* RFBI_DATA */ /* TODO: take into account the format set up in s->rfbi.config[?] and * s->rfbi.data[?], but special-case the most usual scenario so that * speed doesn't suffer. */ if ((s->rfbi.control & (1 << 2)) && s->rfbi.chip[0]) { s->rfbi.chip[0]->write(s->rfbi.chip[0]->opaque, 1, value & 0xffff); s->rfbi.chip[0]->write(s->rfbi.chip[0]->opaque, 1, value >> 16); } if ((s->rfbi.control & (1 << 3)) && s->rfbi.chip[1]) { s->rfbi.chip[1]->write(s->rfbi.chip[1]->opaque, 1, value & 0xffff); s->rfbi.chip[1]->write(s->rfbi.chip[1]->opaque, 1, value >> 16); } if (!-- s->rfbi.pixels) omap_rfbi_transfer_stop(s); break; case 0x58: /* RFBI_READ */ if ((s->rfbi.control & (1 << 2)) && s->rfbi.chip[0]) s->rfbi.rxbuf = s->rfbi.chip[0]->read(s->rfbi.chip[0]->opaque, 1); else if ((s->rfbi.control & (1 << 3)) && s->rfbi.chip[1]) s->rfbi.rxbuf = s->rfbi.chip[0]->read(s->rfbi.chip[0]->opaque, 1); if (!-- s->rfbi.pixels) omap_rfbi_transfer_stop(s); break; case 0x5c: /* RFBI_STATUS */ if ((s->rfbi.control & (1 << 2)) && s->rfbi.chip[0]) s->rfbi.rxbuf = s->rfbi.chip[0]->read(s->rfbi.chip[0]->opaque, 0); else if ((s->rfbi.control & (1 << 3)) && s->rfbi.chip[1]) s->rfbi.rxbuf = s->rfbi.chip[0]->read(s->rfbi.chip[0]->opaque, 0); if (!-- s->rfbi.pixels) omap_rfbi_transfer_stop(s); break; case 0x60: /* RFBI_CONFIG0 */ s->rfbi.config[0] = value & 0x003f1fff; break; case 0x64: /* RFBI_ONOFF_TIME0 */ s->rfbi.time[0] = value & 0x3fffffff; break; case 0x68: /* RFBI_CYCLE_TIME0 */ s->rfbi.time[1] = value & 0x0fffffff; break; case 0x6c: /* RFBI_DATA_CYCLE1_0 */ s->rfbi.data[0] = value & 0x0f1f0f1f; break; case 0x70: /* RFBI_DATA_CYCLE2_0 */ s->rfbi.data[1] = value & 0x0f1f0f1f; break; case 0x74: /* RFBI_DATA_CYCLE3_0 */ s->rfbi.data[2] = value & 0x0f1f0f1f; break; case 0x78: /* RFBI_CONFIG1 */ s->rfbi.config[1] = value & 0x003f1fff; break; case 0x7c: /* RFBI_ONOFF_TIME1 */ s->rfbi.time[2] = value & 0x3fffffff; break; case 0x80: /* RFBI_CYCLE_TIME1 */ s->rfbi.time[3] = value & 0x0fffffff; break; case 0x84: /* RFBI_DATA_CYCLE1_1 */ s->rfbi.data[3] = value & 0x0f1f0f1f; break; case 0x88: /* RFBI_DATA_CYCLE2_1 */ s->rfbi.data[4] = value & 0x0f1f0f1f; break; case 0x8c: /* RFBI_DATA_CYCLE3_1 */ s->rfbi.data[5] = value & 0x0f1f0f1f; break; case 0x90: /* RFBI_VSYNC_WIDTH */ s->rfbi.vsync = value & 0xffff; break; case 0x94: /* RFBI_HSYNC_WIDTH */ s->rfbi.hsync = value & 0xffff; break; default: OMAP_BAD_REG(addr); }}static CPUReadMemoryFunc *omap_rfbi1_readfn[] = { omap_badwidth_read32, omap_badwidth_read32, omap_rfbi_read,};static CPUWriteMemoryFunc *omap_rfbi1_writefn[] = { omap_badwidth_write32, omap_badwidth_write32, omap_rfbi_write,};static uint32_t omap_venc_read(void *opaque, target_phys_addr_t addr){ struct omap_dss_s *s = (struct omap_dss_s *) opaque; int offset = addr - s->venc_base; switch (offset) { case 0x00: /* REV_ID */ case 0x04: /* STATUS */ case 0x08: /* F_CONTROL */ case 0x10: /* VIDOUT_CTRL */ case 0x14: /* SYNC_CTRL */ case 0x1c: /* LLEN */ case 0x20: /* FLENS */ case 0x24: /* HFLTR_CTRL */ case 0x28: /* CC_CARR_WSS_CARR */ case 0x2c: /* C_PHASE */ case 0x30: /* GAIN_U */ case 0x34: /* GAIN_V */ case 0x38: /* GAIN_Y */ case 0x3c: /* BLACK_LEVEL */ case 0x40: /* BLANK_LEVEL */ case 0x44: /* X_COLOR */ case 0x48: /* M_CONTROL */ case 0x4c: /* BSTAMP_WSS_DATA */ case 0x50: /* S_CARR */ case 0x54: /* LINE21 */ case 0x58: /* LN_SEL */ case 0x5c: /* L21__WC_CTL */ case 0x60: /* HTRIGGER_VTRIGGER */ case 0x64: /* SAVID__EAVID */ case 0x68: /* FLEN__FAL */ case 0x6c: /* LAL__PHASE_RESET */ case 0x70: /* HS_INT_START_STOP_X */ case 0x74: /* HS_EXT_START_STOP_X */ case 0x78: /* VS_INT_START_X */ case 0x7c: /* VS_INT_STOP_X__VS_INT_START_Y */ case 0x80: /* VS_INT_STOP_Y__VS_INT_START_X */ case 0x84: /* VS_EXT_STOP_X__VS_EXT_START_Y */ case 0x88: /* VS_EXT_STOP_Y */ case 0x90: /* AVID_START_STOP_X */ case 0x94: /* AVID_START_STOP_Y */ case 0xa0: /* FID_INT_START_X__FID_INT_START_Y */ case 0xa4: /* FID_INT_OFFSET_Y__FID_EXT_START_X */ case 0xa8: /* FID_EXT_START_Y__FID_EXT_OFFSET_Y */ case 0xb0: /* TVDETGP_INT_START_STOP_X */ case 0xb4: /* TVDETGP_INT_START_STOP_Y */ case 0xb8: /* GEN_CTRL */ case 0xc4: /* DAC_TST__DAC_A */ case 0xc8: /* DAC_B__DAC_C */ return 0; default: break; } OMAP_BAD_REG(addr); return 0;}static void omap_venc_write(void *opaque, target_phys_addr_t addr, uint32_t value){ struct omap_dss_s *s = (struct omap_dss_s *) opaque; int offset = addr - s->venc_base; switch (offset) { case 0x08: /* F_CONTROL */ case 0x10: /* VIDOUT_CTRL */ case 0x14: /* SYNC_CTRL */ case 0x1c: /* LLEN */ case 0x20: /* FLENS */ case 0x24: /* HFLTR_CTRL */ case 0x28: /* CC_CARR_WSS_CARR */ case 0x2c: /* C_PHASE */ case 0x30: /* GAIN_U */ case 0x34: /* GAIN_V */ case 0x38: /* GAIN_Y */ case 0x3c: /* BLACK_LEVEL */ case 0x40: /* BLANK_LEVEL */ case 0x44: /* X_COLOR */ case 0x48: /* M_CONTROL */ case 0x4c: /* BSTAMP_WSS_DATA */ case 0x50: /* S_CARR */ case 0x54: /* LINE21 */ case 0x58: /* LN_SEL */ case 0x5c: /* L21__WC_CTL */ case 0x60: /* HTRIGGER_VTRIGGER */ case 0x64: /* SAVID__EAVID */ case 0x68: /* FLEN__FAL */ case 0x6c: /* LAL__PHASE_RESET */ case 0x70: /* HS_INT_START_STOP_X */ case 0x74: /* HS_EXT_START_STOP_X */ case 0x78: /* VS_INT_START_X */ case 0x7c: /* VS_INT_STOP_X__VS_INT_START_Y */ case 0x80: /* VS_INT_STOP_Y__VS_INT_START_X */ case 0x84: /* VS_EXT_STOP_X__VS_EXT_START_Y */ case 0x88: /* VS_EXT_STOP_Y */ case 0x90: /* AVID_START_STOP_X */ case 0x94: /* AVID_START_STOP_Y */ case 0xa0: /* FID_INT_START_X__FID_INT_START_Y */ case 0xa4: /* FID_INT_OFFSET_Y__FID_EXT_START_X */ case 0xa8: /* FID_EXT_START_Y__FID_EXT_OFFSET_Y */ case 0xb0: /* TVDETGP_INT_START_STOP_X */ case 0xb4: /* TVDETGP_INT_START_STOP_Y */ case 0xb8: /* GEN_CTRL */ case 0xc4: /* DAC_TST__DAC_A */ case 0xc8: /* DAC_B__DAC_C */ break; default: OMAP_BAD_REG(addr); }}static CPUReadMemoryFunc *omap_venc1_readfn[] = { omap_badwidth_read32, omap_badwidth_read32, omap_venc_read,};static CPUWriteMemoryFunc *omap_venc1_writefn[] = { omap_badwidth_write32, omap_badwidth_write32, omap_venc_write,};static uint32_t omap_im3_read(void *opaque, target_phys_addr_t addr){ struct omap_dss_s *s = (struct omap_dss_s *) opaque; int offset = addr - s->im3_base; switch (offset) { case 0x0a8: /* SBIMERRLOGA */ case 0x0b0: /* SBIMERRLOG */ case 0x190: /* SBIMSTATE */ case 0x198: /* SBTMSTATE_L */ case 0x19c: /* SBTMSTATE_H */ case 0x1a8: /* SBIMCONFIG_L */ case 0x1ac: /* SBIMCONFIG_H */ case 0x1f8: /* SBID_L */ case 0x1fc: /* SBID_H */ return 0; default: break; } OMAP_BAD_REG(addr); return 0;}static void omap_im3_write(void *opaque, target_phys_addr_t addr, uint32_t value){ struct omap_dss_s *s = (struct omap_dss_s *) opaque; int offset = addr - s->im3_base; switch (offset) { case 0x0b0: /* SBIMERRLOG */ case 0x190: /* SBIMSTATE */ case 0x198: /* SBTMSTATE_L */ case 0x19c: /* SBTMSTATE_H */ case 0x1a8: /* SBIMCONFIG_L */ case 0x1ac: /* SBIMCONFIG_H */ break; default: OMAP_BAD_REG(addr); }}static CPUReadMemoryFunc *omap_im3_readfn[] = { omap_badwidth_read32, omap_badwidth_read32, omap_im3_read,};static CPUWriteMemoryFunc *omap_im3_writefn[] = { omap_badwidth_write32, omap_badwidth_write32, omap_im3_write,};struct omap_dss_s *omap_dss_init(struct omap_target_agent_s *ta, target_phys_addr_t l3_base, DisplayState *ds, qemu_irq irq, qemu_irq drq, omap_clk fck1, omap_clk fck2, omap_clk ck54m, omap_clk ick1, omap_clk ick2){ int iomemtype[5]; struct omap_dss_s *s = (struct omap_dss_s *) qemu_mallocz(sizeof(struct omap_dss_s)); s->irq = irq; s->drq = drq; s->state = ds; omap_dss_reset(s); iomemtype[0] = cpu_register_io_memory(0, omap_diss1_readfn, omap_diss1_writefn, s); iomemtype[1] = cpu_register_io_memory(0, omap_disc1_readfn, omap_disc1_writefn, s); iomemtype[2] = cpu_register_io_memory(0, omap_rfbi1_readfn, omap_rfbi1_writefn, s); iomemtype[3] = cpu_register_io_memory(0, omap_venc1_readfn, omap_venc1_writefn, s); iomemtype[4] = cpu_register_io_memory(0, omap_im3_readfn, omap_im3_writefn, s); s->diss_base = omap_l4_attach(ta, 0, iomemtype[0]); s->disc_base = omap_l4_attach(ta, 1, iomemtype[1]); s->rfbi_base = omap_l4_attach(ta, 2, iomemtype[2]); s->venc_base = omap_l4_attach(ta, 3, iomemtype[3]); s->im3_base = l3_base; cpu_register_physical_memory(s->im3_base, 0x1000, iomemtype[4]);#if 0 if (ds) graphic_console_init(ds, omap_update_display, omap_invalidate_display, omap_screen_dump, s);#endif return s;}void omap_rfbi_attach(struct omap_dss_s *s, int cs, struct rfbi_chip_s *chip){ if (cs < 0 || cs > 1) cpu_abort(cpu_single_env, "%s: wrong CS %i\n", __FUNCTION__, cs); s->rfbi.chip[cs] = chip;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?