nseries.c

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

C
1,146
字号
    s->normal = 1;    s->vscr = 0;    s->invert = 0;    s->onoff = 1;    s->gamma = 0;}static uint32_t mipid_txrx(void *opaque, uint32_t cmd, int len){    struct mipid_s *s = (struct mipid_s *) opaque;    uint8_t ret;    if (len > 9)        cpu_abort(cpu_single_env, "%s: FIXME: bad SPI word width %i\n",                        __FUNCTION__, len);    if (s->p >= sizeof(s->resp) / sizeof(*s->resp))        ret = 0;    else        ret = s->resp[s->p ++];    if (s->pm --> 0)        s->param[s->pm] = cmd;    else        s->cmd = cmd;    switch (s->cmd) {    case 0x00:	/* NOP */        break;    case 0x01:	/* SWRESET */        mipid_reset(s);        break;    case 0x02:	/* BSTROFF */        s->booster = 0;        break;    case 0x03:	/* BSTRON */        s->booster = 1;        break;    case 0x04:	/* RDDID */        s->p = 0;        s->resp[0] = (s->id >> 16) & 0xff;        s->resp[1] = (s->id >>  8) & 0xff;        s->resp[2] = (s->id >>  0) & 0xff;        break;    case 0x06:	/* RD_RED */    case 0x07:	/* RD_GREEN */        /* XXX the bootloader sometimes issues RD_BLUE meaning RDDID so         * for the bootloader one needs to change this.  */    case 0x08:	/* RD_BLUE */        s->p = 0;        /* TODO: return first pixel components */        s->resp[0] = 0x01;        break;    case 0x09:	/* RDDST */        s->p = 0;        s->resp[0] = s->booster << 7;        s->resp[1] = (5 << 4) | (s->partial << 2) |                (s->sleep << 1) | s->normal;        s->resp[2] = (s->vscr << 7) | (s->invert << 5) |                (s->onoff << 2) | (s->te << 1) | (s->gamma >> 2);        s->resp[3] = s->gamma << 6;        break;    case 0x0a:	/* RDDPM */        s->p = 0;        s->resp[0] = (s->onoff << 2) | (s->normal << 3) | (s->sleep << 4) |                (s->partial << 5) | (s->sleep << 6) | (s->booster << 7);        break;    case 0x0b:	/* RDDMADCTR */        s->p = 0;        s->resp[0] = 0;        break;    case 0x0c:	/* RDDCOLMOD */        s->p = 0;        s->resp[0] = 5;	/* 65K colours */        break;    case 0x0d:	/* RDDIM */        s->p = 0;        s->resp[0] = (s->invert << 5) | (s->vscr << 7) | s->gamma;        break;    case 0x0e:	/* RDDSM */        s->p = 0;        s->resp[0] = s->te << 7;        break;    case 0x0f:	/* RDDSDR */        s->p = 0;        s->resp[0] = s->selfcheck;        break;    case 0x10:	/* SLPIN */        s->sleep = 1;        break;    case 0x11:	/* SLPOUT */        s->sleep = 0;        s->selfcheck ^= 1 << 6;	/* POFF self-diagnosis Ok */        break;    case 0x12:	/* PTLON */        s->partial = 1;        s->normal = 0;        s->vscr = 0;        break;    case 0x13:	/* NORON */        s->partial = 0;        s->normal = 1;        s->vscr = 0;        break;    case 0x20:	/* INVOFF */        s->invert = 0;        break;    case 0x21:	/* INVON */        s->invert = 1;        break;    case 0x22:	/* APOFF */    case 0x23:	/* APON */        goto bad_cmd;    case 0x25:	/* WRCNTR */        if (s->pm < 0)            s->pm = 1;        goto bad_cmd;    case 0x26:	/* GAMSET */        if (!s->pm)            s->gamma = ffs(s->param[0] & 0xf) - 1;        else if (s->pm < 0)            s->pm = 1;        break;    case 0x28:	/* DISPOFF */        s->onoff = 0;        fprintf(stderr, "%s: Display off\n", __FUNCTION__);        break;    case 0x29:	/* DISPON */        s->onoff = 1;        fprintf(stderr, "%s: Display on\n", __FUNCTION__);        break;    case 0x2a:	/* CASET */    case 0x2b:	/* RASET */    case 0x2c:	/* RAMWR */    case 0x2d:	/* RGBSET */    case 0x2e:	/* RAMRD */    case 0x30:	/* PTLAR */    case 0x33:	/* SCRLAR */        goto bad_cmd;    case 0x34:	/* TEOFF */        s->te = 0;        break;    case 0x35:	/* TEON */        if (!s->pm)            s->te = 1;        else if (s->pm < 0)            s->pm = 1;        break;    case 0x36:	/* MADCTR */        goto bad_cmd;    case 0x37:	/* VSCSAD */        s->partial = 0;        s->normal = 0;        s->vscr = 1;        break;    case 0x38:	/* IDMOFF */    case 0x39:	/* IDMON */    case 0x3a:	/* COLMOD */        goto bad_cmd;    case 0xb0:	/* CLKINT / DISCTL */    case 0xb1:	/* CLKEXT */        if (s->pm < 0)            s->pm = 2;        break;    case 0xb4:	/* FRMSEL */        break;    case 0xb5:	/* FRM8SEL */    case 0xb6:	/* TMPRNG / INIESC */    case 0xb7:	/* TMPHIS / NOP2 */    case 0xb8:	/* TMPREAD / MADCTL */    case 0xba:	/* DISTCTR */    case 0xbb:	/* EPVOL */        goto bad_cmd;    case 0xbd:	/* Unknown */        s->p = 0;        s->resp[0] = 0;        s->resp[1] = 1;        break;    case 0xc2:	/* IFMOD */        if (s->pm < 0)            s->pm = 2;        break;    case 0xc6:	/* PWRCTL */    case 0xc7:	/* PPWRCTL */    case 0xd0:	/* EPWROUT */    case 0xd1:	/* EPWRIN */    case 0xd4:	/* RDEV */    case 0xd5:	/* RDRR */        goto bad_cmd;    case 0xda:	/* RDID1 */        s->p = 0;        s->resp[0] = (s->id >> 16) & 0xff;        break;    case 0xdb:	/* RDID2 */        s->p = 0;        s->resp[0] = (s->id >>  8) & 0xff;        break;    case 0xdc:	/* RDID3 */        s->p = 0;        s->resp[0] = (s->id >>  0) & 0xff;        break;    default:    bad_cmd:        fprintf(stderr, "%s: unknown command %02x\n", __FUNCTION__, s->cmd);        break;    }    return ret;}static void *mipid_init(void){    struct mipid_s *s = (struct mipid_s *) qemu_mallocz(sizeof(*s));    s->id = 0x838f03;    mipid_reset(s);    return s;}static void n8x0_spi_setup(struct n800_s *s){    void *tsc = s->ts.opaque;    void *mipid = mipid_init();    omap_mcspi_attach(s->cpu->mcspi[0], s->ts.txrx, tsc, 0);    omap_mcspi_attach(s->cpu->mcspi[0], mipid_txrx, mipid, 1);}/* This task is normally performed by the bootloader.  If we're loading * a kernel directly, we need to enable the Blizzard ourselves.  */static void n800_dss_init(struct rfbi_chip_s *chip){    uint8_t *fb_blank;    chip->write(chip->opaque, 0, 0x2a);		/* LCD Width register */    chip->write(chip->opaque, 1, 0x64);    chip->write(chip->opaque, 0, 0x2c);		/* LCD HNDP register */    chip->write(chip->opaque, 1, 0x1e);    chip->write(chip->opaque, 0, 0x2e);		/* LCD Height 0 register */    chip->write(chip->opaque, 1, 0xe0);    chip->write(chip->opaque, 0, 0x30);		/* LCD Height 1 register */    chip->write(chip->opaque, 1, 0x01);    chip->write(chip->opaque, 0, 0x32);		/* LCD VNDP register */    chip->write(chip->opaque, 1, 0x06);    chip->write(chip->opaque, 0, 0x68);		/* Display Mode register */    chip->write(chip->opaque, 1, 1);		/* Enable bit */    chip->write(chip->opaque, 0, 0x6c);	    chip->write(chip->opaque, 1, 0x00);		/* Input X Start Position */    chip->write(chip->opaque, 1, 0x00);		/* Input X Start Position */    chip->write(chip->opaque, 1, 0x00);		/* Input Y Start Position */    chip->write(chip->opaque, 1, 0x00);		/* Input Y Start Position */    chip->write(chip->opaque, 1, 0x1f);		/* Input X End Position */    chip->write(chip->opaque, 1, 0x03);		/* Input X End Position */    chip->write(chip->opaque, 1, 0xdf);		/* Input Y End Position */    chip->write(chip->opaque, 1, 0x01);		/* Input Y End Position */    chip->write(chip->opaque, 1, 0x00);		/* Output X Start Position */    chip->write(chip->opaque, 1, 0x00);		/* Output X Start Position */    chip->write(chip->opaque, 1, 0x00);		/* Output Y Start Position */    chip->write(chip->opaque, 1, 0x00);		/* Output Y Start Position */    chip->write(chip->opaque, 1, 0x1f);		/* Output X End Position */    chip->write(chip->opaque, 1, 0x03);		/* Output X End Position */    chip->write(chip->opaque, 1, 0xdf);		/* Output Y End Position */    chip->write(chip->opaque, 1, 0x01);		/* Output Y End Position */    chip->write(chip->opaque, 1, 0x01);		/* Input Data Format */    chip->write(chip->opaque, 1, 0x01);		/* Data Source Select */    fb_blank = memset(qemu_malloc(800 * 480 * 2), 0xff, 800 * 480 * 2);    /* Display Memory Data Port */    chip->block(chip->opaque, 1, fb_blank, 800 * 480 * 2, 800);    free(fb_blank);}static void n8x0_dss_setup(struct n800_s *s, DisplayState *ds){    s->blizzard.opaque = s1d13745_init(0, ds);    s->blizzard.block = s1d13745_write_block;    s->blizzard.write = s1d13745_write;    s->blizzard.read = s1d13745_read;    omap_rfbi_attach(s->cpu->dss, 0, &s->blizzard);}static void n8x0_cbus_setup(struct n800_s *s){    qemu_irq dat_out = omap2_gpio_in_get(s->cpu->gpif, N8X0_CBUS_DAT_GPIO)[0];    qemu_irq retu_irq = omap2_gpio_in_get(s->cpu->gpif, N8X0_RETU_GPIO)[0];    qemu_irq tahvo_irq = omap2_gpio_in_get(s->cpu->gpif, N8X0_TAHVO_GPIO)[0];    struct cbus_s *cbus = cbus_init(dat_out);    omap2_gpio_out_set(s->cpu->gpif, N8X0_CBUS_CLK_GPIO, cbus->clk);    omap2_gpio_out_set(s->cpu->gpif, N8X0_CBUS_DAT_GPIO, cbus->dat);    omap2_gpio_out_set(s->cpu->gpif, N8X0_CBUS_SEL_GPIO, cbus->sel);    cbus_attach(cbus, s->retu = retu_init(retu_irq, 1));    cbus_attach(cbus, s->tahvo = tahvo_init(tahvo_irq, 1));}static void n8x0_usb_power_cb(void *opaque, int line, int level){    struct n800_s *s = opaque;    tusb6010_power(s->usb, level);}static void n8x0_usb_setup(struct n800_s *s){    qemu_irq tusb_irq = omap2_gpio_in_get(s->cpu->gpif, N8X0_TUSB_INT_GPIO)[0];    qemu_irq tusb_pwr = qemu_allocate_irqs(n8x0_usb_power_cb, s, 1)[0];    struct tusb_s *tusb = tusb6010_init(tusb_irq);    /* Using the NOR interface */    omap_gpmc_attach(s->cpu->gpmc, N8X0_USB_ASYNC_CS,                    tusb6010_async_io(tusb), 0, 0, tusb);    omap_gpmc_attach(s->cpu->gpmc, N8X0_USB_SYNC_CS,                    tusb6010_sync_io(tusb), 0, 0, tusb);    s->usb = tusb;    omap2_gpio_out_set(s->cpu->gpif, N8X0_TUSB_ENABLE_GPIO, tusb_pwr);}/* This task is normally performed by the bootloader.  If we're loading * a kernel directly, we need to set up GPMC mappings ourselves.  */static void n800_gpmc_init(struct n800_s *s){    uint32_t config7 =            (0xf << 8) |	/* MASKADDRESS */            (1 << 6) |		/* CSVALID */            (4 << 0);		/* BASEADDRESS */    cpu_physical_memory_write(0x6800a078,		/* GPMC_CONFIG7_0 */                    (void *) &config7, sizeof(config7));}/* Setup sequence done by the bootloader */static void n8x0_boot_init(void *opaque){    struct n800_s *s = (struct n800_s *) opaque;    uint32_t buf;    /* PRCM setup */#define omap_writel(addr, val)	\    buf = (val);			\    cpu_physical_memory_write(addr, (void *) &buf, sizeof(buf))    omap_writel(0x48008060, 0x41);		/* PRCM_CLKSRC_CTRL */    omap_writel(0x48008070, 1);			/* PRCM_CLKOUT_CTRL */    omap_writel(0x48008078, 0);			/* PRCM_CLKEMUL_CTRL */    omap_writel(0x48008090, 0);			/* PRCM_VOLTSETUP */    omap_writel(0x48008094, 0);			/* PRCM_CLKSSETUP */    omap_writel(0x48008098, 0);			/* PRCM_POLCTRL */    omap_writel(0x48008140, 2);			/* CM_CLKSEL_MPU */    omap_writel(0x48008148, 0);			/* CM_CLKSTCTRL_MPU */    omap_writel(0x48008158, 1);			/* RM_RSTST_MPU */    omap_writel(0x480081c8, 0x15);		/* PM_WKDEP_MPU */

⌨️ 快捷键说明

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