📄 integratorcp.c
字号:
void *parent; int parent_irq; int parent_fiq;} icp_pic_state;static void icp_pic_update(icp_pic_state *s){ uint32_t flags; if (s->parent_irq != -1) { flags = (s->level & s->irq_enabled); pic_set_irq_new(s->parent, s->parent_irq, flags != 0); } if (s->parent_fiq != -1) { flags = (s->level & s->fiq_enabled); pic_set_irq_new(s->parent, s->parent_fiq, flags != 0); }}static void icp_pic_set_irq(void *opaque, int irq, int level){ icp_pic_state *s = (icp_pic_state *)opaque; if (level) s->level |= 1 << irq; else s->level &= ~(1 << irq); icp_pic_update(s);}static uint32_t icp_pic_read(void *opaque, target_phys_addr_t offset){ icp_pic_state *s = (icp_pic_state *)opaque; offset -= s->base; switch (offset >> 2) { case 0: /* IRQ_STATUS */ return s->level & s->irq_enabled; case 1: /* IRQ_RAWSTAT */ return s->level; case 2: /* IRQ_ENABLESET */ return s->irq_enabled; case 4: /* INT_SOFTSET */ return s->level & 1; case 8: /* FRQ_STATUS */ return s->level & s->fiq_enabled; case 9: /* FRQ_RAWSTAT */ return s->level; case 10: /* FRQ_ENABLESET */ return s->fiq_enabled; case 3: /* IRQ_ENABLECLR */ case 5: /* INT_SOFTCLR */ case 11: /* FRQ_ENABLECLR */ default: printf ("icp_pic_read: Bad register offset 0x%x\n", offset); return 0; }}static void icp_pic_write(void *opaque, target_phys_addr_t offset, uint32_t value){ icp_pic_state *s = (icp_pic_state *)opaque; offset -= s->base; switch (offset >> 2) { case 2: /* IRQ_ENABLESET */ s->irq_enabled |= value; break; case 3: /* IRQ_ENABLECLR */ s->irq_enabled &= ~value; break; case 4: /* INT_SOFTSET */ if (value & 1) pic_set_irq_new(s, 0, 1); break; case 5: /* INT_SOFTCLR */ if (value & 1) pic_set_irq_new(s, 0, 0); break; case 10: /* FRQ_ENABLESET */ s->fiq_enabled |= value; break; case 11: /* FRQ_ENABLECLR */ s->fiq_enabled &= ~value; break; case 0: /* IRQ_STATUS */ case 1: /* IRQ_RAWSTAT */ case 8: /* FRQ_STATUS */ case 9: /* FRQ_RAWSTAT */ default: printf ("icp_pic_write: Bad register offset 0x%x\n", offset); return; } icp_pic_update(s);}static CPUReadMemoryFunc *icp_pic_readfn[] = { icp_pic_read, icp_pic_read, icp_pic_read};static CPUWriteMemoryFunc *icp_pic_writefn[] = { icp_pic_write, icp_pic_write, icp_pic_write};static icp_pic_state *icp_pic_init(uint32_t base, void *parent, int parent_irq, int parent_fiq){ icp_pic_state *s; int iomemtype; s = (icp_pic_state *)qemu_mallocz(sizeof(icp_pic_state)); if (!s) return NULL; s->handler = icp_pic_set_irq; s->base = base; s->parent = parent; s->parent_irq = parent_irq; s->parent_fiq = parent_fiq; iomemtype = cpu_register_io_memory(0, icp_pic_readfn, icp_pic_writefn, s); cpu_register_physical_memory(base, 0x007fffff, iomemtype); /* ??? Save/restore. */ return s;}/* CP control registers. */typedef struct { uint32_t base;} icp_control_state;static uint32_t icp_control_read(void *opaque, target_phys_addr_t offset){ icp_control_state *s = (icp_control_state *)opaque; offset -= s->base; switch (offset >> 2) { case 0: /* CP_IDFIELD */ return 0x41034003; case 1: /* CP_FLASHPROG */ return 0; case 2: /* CP_INTREG */ return 0; case 3: /* CP_DECODE */ return 0x11; default: cpu_abort (cpu_single_env, "icp_control_read: Bad offset %x\n", offset); return 0; }}static void icp_control_write(void *opaque, target_phys_addr_t offset, uint32_t value){ icp_control_state *s = (icp_control_state *)opaque; offset -= s->base; switch (offset >> 2) { case 1: /* CP_FLASHPROG */ case 2: /* CP_INTREG */ case 3: /* CP_DECODE */ /* Nothing interesting implemented yet. */ break; default: cpu_abort (cpu_single_env, "icp_control_write: Bad offset %x\n", offset); }}static CPUReadMemoryFunc *icp_control_readfn[] = { icp_control_read, icp_control_read, icp_control_read};static CPUWriteMemoryFunc *icp_control_writefn[] = { icp_control_write, icp_control_write, icp_control_write};static void icp_control_init(uint32_t base){ int iomemtype; icp_control_state *s; s = (icp_control_state *)qemu_mallocz(sizeof(icp_control_state)); iomemtype = cpu_register_io_memory(0, icp_control_readfn, icp_control_writefn, s); cpu_register_physical_memory(base, 0x007fffff, iomemtype); s->base = base; /* ??? Save/restore. */}/* Board init. */static void integratorcp_init(int ram_size, int vga_ram_size, int boot_device, DisplayState *ds, const char **fd_filename, int snapshot, const char *kernel_filename, const char *kernel_cmdline, const char *initrd_filename, uint32_t cpuid){ CPUState *env; uint32_t bios_offset; icp_pic_state *pic; void *cpu_pic; env = cpu_init(); cpu_arm_set_model(env, cpuid); bios_offset = ram_size + vga_ram_size; /* ??? On a real system the first 1Mb is mapped as SSRAM or boot flash. */ /* ??? RAM shoud repeat to fill physical memory space. */ /* SDRAM at address zero*/ cpu_register_physical_memory(0, ram_size, IO_MEM_RAM); /* And again at address 0x80000000 */ cpu_register_physical_memory(0x80000000, ram_size, IO_MEM_RAM); integratorcm_init(ram_size >> 20, bios_offset); cpu_pic = arm_pic_init_cpu(env); pic = icp_pic_init(0x14000000, cpu_pic, ARM_PIC_CPU_IRQ, ARM_PIC_CPU_FIQ); icp_pic_init(0xca000000, pic, 26, -1); icp_pit_init(0x13000000, pic, 5); pl011_init(0x16000000, pic, 1, serial_hds[0]); pl011_init(0x17000000, pic, 2, serial_hds[1]); icp_control_init(0xcb000000); pl050_init(0x18000000, pic, 3, 0); pl050_init(0x19000000, pic, 4, 1); if (nd_table[0].vlan) { if (nd_table[0].model == NULL || strcmp(nd_table[0].model, "smc91c111") == 0) { smc91c111_init(&nd_table[0], 0xc8000000, pic, 27); } else { fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd_table[0].model); exit (1); } } pl110_init(ds, 0xc0000000, pic, 22, 0); arm_load_kernel(ram_size, kernel_filename, kernel_cmdline, initrd_filename, 0x113);}static void integratorcp926_init(int ram_size, int vga_ram_size, int boot_device, DisplayState *ds, const char **fd_filename, int snapshot, const char *kernel_filename, const char *kernel_cmdline, const char *initrd_filename){ integratorcp_init(ram_size, vga_ram_size, boot_device, ds, fd_filename, snapshot, kernel_filename, kernel_cmdline, initrd_filename, ARM_CPUID_ARM926);}static void integratorcp1026_init(int ram_size, int vga_ram_size, int boot_device, DisplayState *ds, const char **fd_filename, int snapshot, const char *kernel_filename, const char *kernel_cmdline, const char *initrd_filename){ integratorcp_init(ram_size, vga_ram_size, boot_device, ds, fd_filename, snapshot, kernel_filename, kernel_cmdline, initrd_filename, ARM_CPUID_ARM1026);}QEMUMachine integratorcp926_machine = { "integratorcp926", "ARM Integrator/CP (ARM926EJ-S)", integratorcp926_init,};QEMUMachine integratorcp1026_machine = { "integratorcp1026", "ARM Integrator/CP (ARM1026EJ-S)", integratorcp1026_init,};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -