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