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