omap2.c

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

C
2,270
字号
    [109] = { 0x9e000, 0x1000, 32 | 16 | 8 }, /* MS_PRO */    [110] = { 0x9f000, 0x1000, 32 | 16 | 8 }, /* L4TAO10 */    [111] = { 0xa0000, 0x1000, 32          }, /* RNG */    [112] = { 0xa1000, 0x1000, 32 | 16 | 8 }, /* L4TAO11 */    [113] = { 0xa2000, 0x1000, 32          }, /* DES3DES */    [114] = { 0xa3000, 0x1000, 32 | 16 | 8 }, /* L4TAO12 */    [115] = { 0xa4000, 0x1000, 32          }, /* SHA1MD5 */    [116] = { 0xa5000, 0x1000, 32 | 16 | 8 }, /* L4TAO13 */    [117] = { 0xa6000, 0x1000, 32          }, /* AES */    [118] = { 0xa7000, 0x1000, 32 | 16 | 8 }, /* L4TA37 */    [119] = { 0xa8000, 0x2000, 32          }, /* PKA */    [120] = { 0xaa000, 0x1000, 32 | 16 | 8 }, /* L4TA38 */    [121] = { 0xb0000, 0x1000, 32          }, /* MG */    [122] = { 0xb1000, 0x1000, 32 | 16 | 8 },    [123] = { 0xb2000, 0x1000, 32          }, /* HDQ/1-Wire */    [124] = { 0xb3000, 0x1000, 32 | 16 | 8 }, /* L4TA39 */};static struct omap_l4_agent_info_s {    int ta;    int region;    int regions;    int ta_region;} omap_l4_agent_info[54] = {    { 0,           0, 3, 2 }, /* L4IA initiatior agent */    { L4TAO(1),    3, 2, 1 }, /* Control and pinout module */    { L4TAO(2),    5, 2, 1 }, /* 32K timer */    { L4TAO(3),    7, 3, 2 }, /* PRCM */    { L4TA(1),    10, 2, 1 }, /* BCM */    { L4TA(2),    12, 2, 1 }, /* Test JTAG */    { L4TA(3),    14, 6, 3 }, /* Quad GPIO */    { L4TA(4),    20, 4, 3 }, /* WD timer 1/2 */    { L4TA(7),    24, 2, 1 }, /* GP timer 1 */    { L4TA(9),    26, 2, 1 }, /* ATM11 ETB */    { L4TA(10),   28, 5, 4 }, /* Display subsystem */    { L4TA(11),   33, 5, 4 }, /* Camera subsystem */    { L4TA(12),   38, 2, 1 }, /* sDMA */    { L4TA(13),   40, 5, 4 }, /* SSI */    { L4TAO(4),   45, 2, 1 }, /* USB */    { L4TA(14),   47, 2, 1 }, /* Win Tracer1 */    { L4TA(15),   49, 2, 1 }, /* Win Tracer2 */    { L4TA(16),   51, 2, 1 }, /* Win Tracer3 */    { L4TA(17),   53, 2, 1 }, /* Win Tracer4 */    { L4TA(18),   55, 2, 1 }, /* XTI */    { L4TA(19),   57, 2, 1 }, /* UART1 */    { L4TA(20),   59, 2, 1 }, /* UART2 */    { L4TA(21),   61, 2, 1 }, /* UART3 */    { L4TAO(5),   63, 2, 1 }, /* I2C1 */    { L4TAO(6),   65, 2, 1 }, /* I2C2 */    { L4TAO(7),   67, 2, 1 }, /* McBSP1 */    { L4TAO(8),   69, 2, 1 }, /* McBSP2 */    { L4TA(5),    71, 2, 1 }, /* WD Timer 3 (DSP) */    { L4TA(6),    73, 2, 1 }, /* WD Timer 4 (IVA) */    { L4TA(8),    75, 2, 1 }, /* GP Timer 2 */    { L4TA(22),   77, 2, 1 }, /* GP Timer 3 */    { L4TA(23),   79, 2, 1 }, /* GP Timer 4 */    { L4TA(24),   81, 2, 1 }, /* GP Timer 5 */    { L4TA(25),   83, 2, 1 }, /* GP Timer 6 */    { L4TA(26),   85, 2, 1 }, /* GP Timer 7 */    { L4TA(27),   87, 2, 1 }, /* GP Timer 8 */    { L4TA(28),   89, 2, 1 }, /* GP Timer 9 */    { L4TA(29),   91, 2, 1 }, /* GP Timer 10 */    { L4TA(30),   93, 2, 1 }, /* GP Timer 11 */    { L4TA(31),   95, 2, 1 }, /* GP Timer 12 */    { L4TA(32),   97, 2, 1 }, /* EAC */    { L4TA(33),   99, 2, 1 }, /* FAC */    { L4TA(34),  101, 2, 1 }, /* IPC */    { L4TA(35),  103, 2, 1 }, /* SPI1 */    { L4TA(36),  105, 2, 1 }, /* SPI2 */    { L4TAO(9),  107, 2, 1 }, /* MMC SDIO */    { L4TAO(10), 109, 2, 1 },    { L4TAO(11), 111, 2, 1 }, /* RNG */    { L4TAO(12), 113, 2, 1 }, /* DES3DES */    { L4TAO(13), 115, 2, 1 }, /* SHA1MD5 */    { L4TA(37),  117, 2, 1 }, /* AES */    { L4TA(38),  119, 2, 1 }, /* PKA */    { -1,        121, 2, 1 },    { L4TA(39),  123, 2, 1 }, /* HDQ/1-Wire */};#define omap_l4ta(bus, cs)	omap_l4ta_get(bus, L4TA(cs))#define omap_l4tao(bus, cs)	omap_l4ta_get(bus, L4TAO(cs))struct omap_target_agent_s *omap_l4ta_get(struct omap_l4_s *bus, int cs){    int i, iomemtype;    struct omap_target_agent_s *ta = 0;    struct omap_l4_agent_info_s *info = 0;    for (i = 0; i < bus->ta_num; i ++)        if (omap_l4_agent_info[i].ta == cs) {            ta = &bus->ta[i];            info = &omap_l4_agent_info[i];            break;        }    if (!ta) {        fprintf(stderr, "%s: bad target agent (%i)\n", __FUNCTION__, cs);        exit(-1);    }    ta->bus = bus;    ta->start = &omap_l4_region[info->region];    ta->regions = info->regions;    ta->base = bus->base + ta->start[info->ta_region].offset;    ta->component = ('Q' << 24) | ('E' << 16) | ('M' << 8) | ('U' << 0);    ta->status = 0x00000000;    ta->control = 0x00000200;	/* XXX 01000200 for L4TAO */    iomemtype = cpu_register_io_memory(0, omap_l4ta_readfn,                    omap_l4ta_writefn, ta);    cpu_register_physical_memory(ta->base, 0x200, iomemtype);    return ta;}target_phys_addr_t omap_l4_attach(struct omap_target_agent_s *ta, int region,                int iotype){    target_phys_addr_t base;    size_t size;    if (region < 0 || region >= ta->regions) {        fprintf(stderr, "%s: bad io region (%i)\n", __FUNCTION__, region);        exit(-1);    }    base = ta->bus->base + ta->start[region].offset;    size = ta->start[region].size;    if (iotype)        cpu_register_physical_memory(base, size, iotype);    return base;}/* TEST-Chip-level TAP */static uint32_t omap_tap_read(void *opaque, target_phys_addr_t addr){    struct omap_mpu_state_s *s = (struct omap_mpu_state_s *) opaque;    target_phys_addr_t reg = addr - s->tap_base;    switch (reg) {    case 0x204:	/* IDCODE_reg */        switch (s->mpu_model) {        case omap2420:        case omap2422:        case omap2423:            return 0x5b5d902f;	/* ES 2.2 */        case omap2430:            return 0x5b68a02f;	/* ES 2.2 */        case omap3430:            return 0x1b7ae02f;	/* ES 2 */        default:            cpu_abort(cpu_single_env, "%s: Bad mpu model\n", __FUNCTION__);        }    case 0x208:	/* PRODUCTION_ID_reg for OMAP2 */    case 0x210:	/* PRODUCTION_ID_reg for OMAP3 */        switch (s->mpu_model) {        case omap2420:            return 0x000254f0;	/* POP ESHS2.1.1 in N91/93/95, ES2 in N800 */        case omap2422:            return 0x000400f0;        case omap2423:            return 0x000800f0;        case omap2430:            return 0x000000f0;        case omap3430:            return 0x000000f0;        default:            cpu_abort(cpu_single_env, "%s: Bad mpu model\n", __FUNCTION__);        }    case 0x20c:        switch (s->mpu_model) {        case omap2420:        case omap2422:        case omap2423:            return 0xcafeb5d9;	/* ES 2.2 */        case omap2430:            return 0xcafeb68a;	/* ES 2.2 */        case omap3430:            return 0xcafeb7ae;	/* ES 2 */        default:            cpu_abort(cpu_single_env, "%s: Bad mpu model\n", __FUNCTION__);        }    case 0x218:	/* DIE_ID_reg */        return ('Q' << 24) | ('E' << 16) | ('M' << 8) | ('U' << 0);    case 0x21c:	/* DIE_ID_reg */        return 0x54 << 24;    case 0x220:	/* DIE_ID_reg */        return ('Q' << 24) | ('E' << 16) | ('M' << 8) | ('U' << 0);    case 0x224:	/* DIE_ID_reg */        return ('Q' << 24) | ('E' << 16) | ('M' << 8) | ('U' << 0);    }    OMAP_BAD_REG(addr);    return 0;}static void omap_tap_write(void *opaque, target_phys_addr_t addr,                uint32_t value){    OMAP_BAD_REG(addr);}static CPUReadMemoryFunc *omap_tap_readfn[] = {    omap_badwidth_read32,    omap_badwidth_read32,    omap_tap_read,};static CPUWriteMemoryFunc *omap_tap_writefn[] = {    omap_badwidth_write32,    omap_badwidth_write32,    omap_tap_write,};void omap_tap_init(struct omap_target_agent_s *ta,                struct omap_mpu_state_s *mpu){    mpu->tap_base = omap_l4_attach(ta, 0, cpu_register_io_memory(0,                            omap_tap_readfn, omap_tap_writefn, mpu));}/* Power, Reset, and Clock Management */struct omap_prcm_s {    target_phys_addr_t base;    qemu_irq irq[3];    struct omap_mpu_state_s *mpu;    uint32_t irqst[3];    uint32_t irqen[3];    uint32_t sysconfig;    uint32_t voltctrl;    uint32_t scratch[20];    uint32_t clksrc[1];    uint32_t clkout[1];    uint32_t clkemul[1];    uint32_t clkpol[1];    uint32_t clksel[8];    uint32_t clken[12];    uint32_t clkctrl[4];    uint32_t clkidle[7];    uint32_t setuptime[2];    uint32_t wkup[3];    uint32_t wken[3];    uint32_t wkst[3];    uint32_t rst[4];    uint32_t rstctrl[1];    uint32_t power[4];    uint32_t rsttime_wkup;    uint32_t ev;    uint32_t evtime[2];};static void omap_prcm_int_update(struct omap_prcm_s *s, int dom){    qemu_set_irq(s->irq[dom], s->irqst[dom] & s->irqen[dom]);    /* XXX or is the mask applied before PRCM_IRQSTATUS_* ? */}static uint32_t omap_prcm_read(void *opaque, target_phys_addr_t addr){    struct omap_prcm_s *s = (struct omap_prcm_s *) opaque;    int offset = addr - s->base;    switch (offset) {    case 0x000:	/* PRCM_REVISION */        return 0x10;    case 0x010:	/* PRCM_SYSCONFIG */        return s->sysconfig;    case 0x018:	/* PRCM_IRQSTATUS_MPU */        return s->irqst[0];    case 0x01c:	/* PRCM_IRQENABLE_MPU */        return s->irqen[0];    case 0x050:	/* PRCM_VOLTCTRL */        return s->voltctrl;    case 0x054:	/* PRCM_VOLTST */        return s->voltctrl & 3;    case 0x060:	/* PRCM_CLKSRC_CTRL */        return s->clksrc[0];    case 0x070:	/* PRCM_CLKOUT_CTRL */        return s->clkout[0];    case 0x078:	/* PRCM_CLKEMUL_CTRL */        return s->clkemul[0];    case 0x080:	/* PRCM_CLKCFG_CTRL */    case 0x084:	/* PRCM_CLKCFG_STATUS */        return 0;    case 0x090:	/* PRCM_VOLTSETUP */        return s->setuptime[0];    case 0x094:	/* PRCM_CLKSSETUP */        return s->setuptime[1];    case 0x098:	/* PRCM_POLCTRL */        return s->clkpol[0];    case 0x0b0:	/* GENERAL_PURPOSE1 */    case 0x0b4:	/* GENERAL_PURPOSE2 */    case 0x0b8:	/* GENERAL_PURPOSE3 */    case 0x0bc:	/* GENERAL_PURPOSE4 */    case 0x0c0:	/* GENERAL_PURPOSE5 */    case 0x0c4:	/* GENERAL_PURPOSE6 */    case 0x0c8:	/* GENERAL_PURPOSE7 */    case 0x0cc:	/* GENERAL_PURPOSE8 */    case 0x0d0:	/* GENERAL_PURPOSE9 */    case 0x0d4:	/* GENERAL_PURPOSE10 */    case 0x0d8:	/* GENERAL_PURPOSE11 */    case 0x0dc:	/* GENERAL_PURPOSE12 */    case 0x0e0:	/* GENERAL_PURPOSE13 */    case 0x0e4:	/* GENERAL_PURPOSE14 */    case 0x0e8:	/* GENERAL_PURPOSE15 */    case 0x0ec:	/* GENERAL_PURPOSE16 */    case 0x0f0:	/* GENERAL_PURPOSE17 */    case 0x0f4:	/* GENERAL_PURPOSE18 */    case 0x0f8:	/* GENERAL_PURPOSE19 */    case 0x0fc:	/* GENERAL_PURPOSE20 */        return s->scratch[(offset - 0xb0) >> 2];    case 0x140:	/* CM_CLKSEL_MPU */        return s->clksel[0];    case 0x148:	/* CM_CLKSTCTRL_MPU */        return s->clkctrl[0];    case 0x158:	/* RM_RSTST_MPU */        return s->rst[0];    case 0x1c8:	/* PM_WKDEP_MPU */        return s->wkup[0];    case 0x1d4:	/* PM_EVGENCTRL_MPU */        return s->ev;    case 0x1d8:	/* PM_EVEGENONTIM_MPU */        return s->evtime[0];    case 0x1dc:	/* PM_EVEGENOFFTIM_MPU */        return s->evtime[1];    case 0x1e0:	/* PM_PWSTCTRL_MPU */        return s->power[0];    case 0x1e4:	/* PM_PWSTST_MPU */        return 0;    case 0x200:	/* CM_FCLKEN1_CORE */        return s->clken[0];    case 0x204:	/* CM_FCLKEN2_CORE */        return s->clken[1];    case 0x210:	/* CM_ICLKEN1_CORE */        return s->clken[2];    case 0x214:	/* CM_ICLKEN2_CORE */        return s->clken[3];    case 0x21c:	/* CM_ICLKEN4_CORE */        return s->clken[4];    case 0x220:	/* CM_IDLEST1_CORE */        /* TODO: check the actual iclk status */        return 0x7ffffff9;    case 0x224:	/* CM_IDLEST2_CORE */        /* TODO: check the actual iclk status */        return 0x00000007;    case 0x22c:	/* CM_IDLEST4_CORE */        /* TODO: check the actual iclk status */        return 0x0000001f;    case 0x230:	/* CM_AUTOIDLE1_CORE */        return s->clkidle[0];    case 0x234:	/* CM_AUTOIDLE2_CORE */        return s->clkidle[1];    case 0x238:	/* CM_AUTOIDLE3_CORE */        return s->clkidle[2];    case 0x23c:	/* CM_AUTOIDLE4_CORE */        return s->clkidle[3];    case 0x240:	/* CM_CLKSEL1_CORE */        return s->clksel[1];    case 0x244:	/* CM_CLKSEL2_CORE */        return s->clksel[2];    case 0x248:	/* CM_CLKSTCTRL_CORE */        return s->clkctrl[1];    case 0x2a0:	/* PM_WKEN1_CORE */        return s->wken[0];    case 0x2a4:	/* PM_WKEN2_CORE */        return s->wken[1];    case 0x2b0:	/* PM_WKST1_CORE */        return s->wkst[0];    case 0x2b4:	/* PM_WKST2_CORE */        return s->wkst[1];    case 0x2c8:	/* PM_WKDEP_CORE */        return 0x1e;    case 0x2e0:	/* PM_PWSTCTRL_CORE */        return s->power[1];    case 0x2e4:	/* PM_PWSTST_CORE */        return 0x000030 | (s->power[1] & 0xfc00);    case 0x300:	/* CM_FCLKEN_GFX */        return s->clken[5];    case 0x310:	/* CM_ICLKEN_GFX */        return s->clken[6];    case 0x320:	/* CM_IDLEST_GFX */        /* TODO: check the actual iclk status */        return 0x00000001;    case 0x340:	/* CM_CLKSEL_GFX */        return s->clksel[3];    case 0x348:	/* CM_CLKSTCTRL_GFX */        return s->clkctrl[2];    case 0x350:	/* RM_RSTCTRL_GFX */        return s->rstctrl[0];    case 0x358:	/* RM_RSTST_GFX */        return s->rst[1];    case 0x3c8:	/* PM_WKDEP_GFX */        return s->wkup[1];    case 0x3e0:	/* PM_PWSTCTRL_GFX */        return s->power[2];    case 0x3e4:	/* PM_PWSTST_GFX */        return s->power[2] & 3;    case 0x400:	/* CM_FCLKEN_WKUP */        return s->clken[7];    case 0x410:	/* CM_ICLKEN_WKUP */        return s->clken[8];    case 0x420:	/* CM_IDLEST_WKUP */        /* TODO: check the actual iclk status */        return 0x0000003f;    case 0x430:	/* CM_AUTOIDLE_WKUP */        return s->clkidle[4];    case 0x440:	/* CM_CLKSEL_WKUP */        return s->clksel[4];    case 0x450:	/* RM_RSTCTRL_WKUP */        return 0;    case 0x454:	/* RM_RSTTIME_WKUP */        return s->rsttime_wkup;    case 0x458:	/* RM_RSTST_WKUP */        return s->rst[2];    case 0x4a0:	/* PM_WKEN_WKUP */        return s->wken[2];    case 0x4b0:	/* PM_WKST_WKUP */        return s->wkst[2];    case 0x500:	/* CM_CLKEN_PLL */        return s->clken[9];    case 0x520:	/* CM_IDLEST_CKGEN */

⌨️ 快捷键说明

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