📄 skyeye_mach_s3c2410x.c
字号:
io.timer.tcfg1 = data; break; case TCON: { io.timer.tcon = data; if (io.timer.tcon) { } } break; case TCNTB0: case TCNTB1: case TCNTB2: case TCNTB3: case TCNTB4: { int n = (offset - 0xC) / 0xC; //io.timer.tcntb[n] = data; /* temp data taken from linux source */ io.timer.tcntb[n] = 25350 / 20; } break; case TCMPB0: case TCMPB1: case TCMPB2: case TCMPB3: { int n = (offset - 0x10) / 0xC; io.timer.tcmpb[n] = data; } break; default: break; }}static ARMwords3c2410x_io_read_word (ARMul_State * state, ARMword addr){ ARMword data = -1; int i; /* uart */ if ((addr >= UART_CTL_BASE0) && (addr < (UART_CTL_BASE0 + UART_CTL_SIZE))) { s3c2410x_uart_read ((u32) ((addr - UART_CTL_BASE0) % 0x4000), (u32 *) & data, (addr - UART_CTL_BASE0) / 0x4000); return data; } if ((addr >= PWM_CTL_BASE) && (addr < (PWM_CTL_BASE + PWM_CTL_SIZE))) { s3c2410x_timer_read ((u32) (addr - PWM_CTL_BASE), (u32 *) & data); return data; } /* * 2007-02-09 by Anthony Lee * changed 0xC0 to 0xA4 for running linux-2.6.20, * because GSTATUS1 is 0xB0, the "0xC0" make it like S3C2400 */ if((addr >= GPIO_CTL_BASE) && (addr < (GPIO_CTL_BASE + 0xA4))){ int offset = addr - GPIO_CTL_BASE; return io.gpio_ctl[offset]; } switch (addr) { case SRCPND: data = io.srcpnd; break; case INTMOD: data = io.intmod; break; case INTMSK: data = io.intmsk; break; case PRIORITY: data = io.priority; break; case INTPND: case INTOFFSET: { /*find which interrupt is pending */ int i; for (i = 0; i < 32; i++) { if (io.srcpnd & (1 << i)) break; } if (i < 32) { io.intoffset = i; io.intpnd = (1 << i); if (addr == INTPND) data = (1 << i); else data = i; } else data = 0; } io.intpnd = (1 << io.intoffset); //printf ("io.intoffset:%x, io.intpnd:%x (0x%08x) = 0x%08x\n", io.intoffset, io.intpnd, addr, data); break; case SUBSRCPND: data = io.subsrcpnd; break; case INTSUBMSK: data = io.intsubmsk; break; case EINTMASK: data = io.eintmask; break; case EINTPEND: data = io.eintpend; break; /* GPIO Register */ case GSTATUS1: data = 0x32410000; break; /* Clock and Power Management Registers */ case LOCKTIME: data = io.clkpower.locktime; break; case MPLLCON: data = io.clkpower.mpllcon; break; case UPLLCON: data = io.clkpower.upllcon; break; case CLKCON: data = io.clkpower.clkcon; break; case CLKSLOW: data = io.clkpower.clkslow; break; case CLKDIVN: data = io.clkpower.clkdivn; break; case BWSCON: data = io.memctl.bwscon; break; case BANKCON0: data = io.memctl.bankcon[0]; break; case BANKCON1: data = io.memctl.bankcon[1]; break; case BANKCON2: data = io.memctl.bankcon[2]; break; case BANKCON3: data = io.memctl.bankcon[3]; break; case BANKCON4: data = io.memctl.bankcon[4]; break; case BANKCON5: data = io.memctl.bankcon[5]; break; case BANKCON6: data = io.memctl.bankcon[6]; break; case BANKCON7: data = io.memctl.bankcon[7]; break; case REFRESH: data = io.memctl.refresh; break; case BANKSIZE: data = io.memctl.banksize; break; case MRSRB6: data = io.memctl.mrsrb6; break; case MRSRB7: data = io.memctl.mrsrb7; break; case WDCON: data = io.wd_timer.wtcon; break; case WDDAT: data = io.wd_timer.wtdat; break; case WDCNT: data = io.wd_timer.wtcnt; break; default: //fprintf(stderr, "ERROR: %s(0x%08x) \n", __FUNCTION__, addr); break; } return data;}static ARMwords3c2410x_io_read_byte (ARMul_State * state, ARMword addr){ s3c2410x_io_read_word (state, addr);}static ARMwords3c2410x_io_read_halfword (ARMul_State * state, ARMword addr){ s3c2410x_io_read_word (state, addr);}static voids3c2410x_io_write_word (ARMul_State * state, ARMword addr, ARMword data){ if ((addr >= UART_CTL_BASE0) && (addr < UART_CTL_BASE0 + UART_CTL_SIZE)) { s3c2410x_uart_write (state, (addr - UART_CTL_BASE0) % 0x4000, data, (addr - UART_CTL_BASE0) / 0x4000); return; } if ((addr >= PWM_CTL_BASE) && (addr < (PWM_CTL_BASE + PWM_CTL_SIZE))) { s3c2410x_timer_write (state, addr - PWM_CTL_BASE, data); return; } /* * 2007-02-09 by Anthony Lee * changed 0xC0 to 0xA4 for running linux-2.6.20, * because GSTATUS1 is 0xB0, the "0xC0" make it like S3C2400 */ if((addr >= GPIO_CTL_BASE) && (addr < (GPIO_CTL_BASE + 0xA4))){ int offset = addr - GPIO_CTL_BASE; io.gpio_ctl[offset] = data; return; } switch (addr) { case SRCPND: io.srcpnd &= (~data & INT_MASK_INIT); //2006-04-04 chy, for eCos on s3c2410. SRCPND will change the INTPND, INTOFFSET, so when write SRCPND, the interrupt should be update s3c2410x_update_int (state); break; case INTMOD: io.intmod = data; break; case INTMSK: io.intmsk = data; s3c2410x_update_int (state); break; case PRIORITY: io.priority = data; break; case INTPND: io.intpnd &= (~data & INT_MASK_INIT); io.intoffset = 0; //printf ("io.intoffset:%x, io.intpnd:%x (0x%08x) = 0x%08x, pc:%x\n", io.intoffset, io.intpnd, addr, data, state->pc); break; /*read only */ //case INTOFFSET: // break; case SUBSRCPND: io.subsrcpnd &= (~data & INT_SUBMSK_INIT); break; case INTSUBMSK: io.intsubmsk = data; break; /* ext interrupt */ case EINTMASK: io.eintmask = data; break; case EINTPEND: io.eintpend &= (~data & 0x00FFFFF0); break; case CLKCON: io.clkpower.clkcon = data; break; case CLKSLOW: io.clkpower.clkslow = data; break; case CLKDIVN: io.clkpower.clkdivn = data; break; case BWSCON: io.memctl.bwscon = data; break; case MPLLCON: io.clkpower.mpllcon = data; break; case BANKCON0: io.memctl.bankcon[0] = data; break; case BANKCON1: io.memctl.bankcon[1] = data; break; case BANKCON2: io.memctl.bankcon[2] = data; break; case BANKCON3: io.memctl.bankcon[3] = data; break; case BANKCON4: io.memctl.bankcon[4] = data; break; case BANKCON5: io.memctl.bankcon[5] = data; break; case BANKCON6: io.memctl.bankcon[6] = data; break; case BANKCON7: io.memctl.bankcon[7] = data; break; case REFRESH: io.memctl.refresh = data; break; case BANKSIZE: io.memctl.banksize = data; break; case MRSRB6: io.memctl.mrsrb6 = data; break; case MRSRB7: io.memctl.mrsrb7 = data; break; case WDCON: io.wd_timer.wtcon = data; break; case WDDAT: io.wd_timer.wtdat = data; break; case WDCNT: io.wd_timer.wtcnt = data; break; default: SKYEYE_DBG ("io_write_word(0x%08x) = 0x%08x\n", addr, data); fprintf(stderr, "ERROR: %s(0x%08x) = 0x%08x\n", __FUNCTION__, addr ,data); break; }}static voids3c2410x_io_write_byte (ARMul_State * state, ARMword addr, ARMword data){ SKYEYE_DBG ("SKYEYE: s3c2410x_io_write_byte error\n"); s3c2410x_io_write_word (state, addr, data);}static voids3c2410x_io_write_halfword (ARMul_State * state, ARMword addr, ARMword data){ SKYEYE_DBG ("SKYEYE: s3c2410x_io_write_halfword error\n"); s3c2410x_io_write_word (state, addr, data);}voids3c2410x_mach_init (ARMul_State * state, machine_config_t * this_mach){ ARMul_SelectProcessor (state, ARM_v4_Prop); this_mach->mach_io_do_cycle = s3c2410x_io_do_cycle; this_mach->mach_io_reset = s3c2410x_io_reset; this_mach->mach_io_read_byte = s3c2410x_io_read_byte; this_mach->mach_io_write_byte = s3c2410x_io_write_byte; this_mach->mach_io_read_halfword = s3c2410x_io_read_halfword; this_mach->mach_io_write_halfword = s3c2410x_io_write_halfword; this_mach->mach_io_read_word = s3c2410x_io_read_word; this_mach->mach_io_write_word = s3c2410x_io_write_word; this_mach->mach_update_int = s3c2410x_update_int; this_mach->mach_set_intr = s3c2410x_set_ext_intr; this_mach->mach_pending_intr = s3c2410x_pending_ext_intr; this_mach->mach_update_intr = s3c2410x_update_intr; this_mach->state = (void *) state;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -