📄 skyeye_mach_s3c4510b.c
字号:
(INT_UARTRX1); s3c4510b_update_int (state); return; } } } } } s3c4510b_update_int (state); } #endif //end koodailar 2005.12.18--------------------------------------------------- /* IO Read Routine * */ ARMword s3c4510b_io_read_byte (ARMul_State * state, ARMword addr) { //printf("SKYEYE: s3c4510b_io_read_byte error\n"); s3c4510b_io_read_word (state, addr); } ARMword s3c4510b_io_read_halfword (ARMul_State * state, ARMword addr) { //printf("SKYEYE: s3c4510b_io_read_halfword error\n"); s3c4510b_io_read_word (state, addr); } ARMword s3c4510b_io_read_word (ARMul_State * state, ARMword addr) { ARMword data = -1; switch (addr) { case SYSCFG: data = io.syscfg; break; case CLKCON: data = io.clkcon; break; case INTMOD: data = io.intmod; break; case INTPND: data = io.intpnd; break; case INTMSK: data = io.intmsk; break; case INTOFFSET: case INTPNDTST: data = io.intpndtst; break; case INTOSET_FIQ: data = io.intoset_fiq; break; case INTOSET_IRQ: { /*find which interrupt is pending */ int i; for (i = 0; i < 26; i++) { if (io.intpnd & (1 << i)) break; } if (i < 26) { data = (i << 2); } else data = 0x54; /*no interrupt is pending, 0x54 is init data. */ } //data = io.intoset_irq; break; /*UART*/ case ULCON0: data = io.ulcon0; break; case ULCON1: data = io.ulcon1; break; case UCON0: data = io.ucon0; break; case UCON1: data = io.ucon1; break; case USTAT0: data = io.ustat0; io.ustat0 &= ~0xf; break; case USTAT1: data = io.ustat1; io.ustat1 &= ~0xf; break; //case UTXBUF0: //case UTXBUF1: case URXBUF0: data = io.urxbuf0; io.ustat0 &= ~UART_LSR_DR; break; case URXBUF1: data = io.urxbuf1; io.ustat1 &= ~UART_LSR_DR; break; case UBRDIV0: data = io.ubrdiv0; break; case UBRDIV1: data = io.ubrdiv1; break; /*Timer */ case TMOD: data = io.tmod; break; case TDATA0: data = io.tdata0; break; case TDATA1: data = io.tdata1; break; case TCNT0: data = io.tcnt0; break; case TCNT1: data = io.tcnt1; break; default: SKYEYE_DBG ("%s (addr = 0x%08x)\n", __FUNCTION__, addr); break; } return data; } /* IO Write Routine * */ void s3c4510b_io_write_byte (ARMul_State * state, ARMword addr, ARMword data) { //printf("SKYEYE: s3c4510b_io_write_byte error\n"); s3c4510b_io_write_word (state, addr, data); } void s3c4510b_io_write_halfword (ARMul_State * state, ARMword addr, ARMword data) { //printf("SKYEYE: s3c4510b_io_write_halfword error\n"); s3c4510b_io_write_word (state, addr, data); } void s3c4510b_io_write_word (ARMul_State * state, ARMword addr, ARMword data) { switch (addr) { case SYSCFG: io.syscfg = data; break; case CLKCON: io.clkcon = data; break; case INTMOD: io.intmod = data; break; case INTPND: /*when write bit 1, we clear apropiate pendind bit. * */ io.intpnd &= (~data & INT_MASK_INIT); break; case INTMSK: io.intmsk = data; break; case INTOFFSET: case INTPNDTST: io.intpndtst = io.intpnd = data; break; case INTOSET_FIQ: io.intoset_fiq = data; break; case INTOSET_IRQ: io.intoset_irq = data; break; /*UART*/ case ULCON0: io.ulcon0 = data; break; case ULCON1: io.ulcon1 = data; break; case UCON0: io.ucon0 = data; break; case UCON1: io.ucon1 = data; break; case USTAT0: io.ustat0 = data; break; case USTAT1: io.ustat1 = data; break; case UTXBUF0: { char c = data; write (skyeye_config.uart.fd_out, &c, 1); io.ustat0 |= (UART_LSR_THRE | UART_LSR_TEMT); if ((io.ucon0 & 0xc) == 0xc) { /*enable interrupt */ s3c4510b_set_interrupt (INT_UARTTX0); s3c4510b_update_int (state); } } break; case UTXBUF1: break; case UBRDIV0: io.ubrdiv0 = data; break; case UBRDIV1: io.ubrdiv1 = data; break; /*Timer */ case TMOD: io.tmod = data; if (ENABLE_TIMER0) io.tcnt0 = io.tdata0; if (ENABLE_TIMER1) io.tcnt1 = io.tdata1; break; case TDATA0: if (!ENABLE_TIMER0) io.tdata0 = data; /*we manually set tdata0 register, uclinux's data is so big */ io.tdata0 = 0xfff; break; case TDATA1: //if (!ENABLE_TIMER1) io.tdata1 = data; break; case TCNT0: io.tcnt0 = data; break; case TCNT1: io.tcnt1 = data; break; default: SKYEYE_DBG ("%s(0x%08x) = 0x%08x\n", __FUNCTION__, addr, data); break; } } void s3c4510b_mach_init (ARMul_State * state, machine_config_t * this_mach) { ARMul_SelectProcessor (state, ARM_v4_Prop); state->lateabtSig = HIGH; this_mach->mach_io_do_cycle = s3c4510b_io_do_cycle; this_mach->mach_io_reset = s3c4510b_io_reset; this_mach->mach_io_read_word = s3c4510b_io_read_word; this_mach->mach_io_write_word = s3c4510b_io_write_word; this_mach->mach_io_read_halfword = s3c4510b_io_read_halfword; this_mach->mach_io_write_halfword = s3c4510b_io_write_halfword; this_mach->mach_io_read_byte = s3c4510b_io_read_byte; this_mach->mach_io_write_byte = s3c4510b_io_write_byte; this_mach->mach_update_int = s3c4510b_update_int; this_mach->mach_set_intr = s3c4510b_set_interrupt; this_mach->mach_pending_intr = s3c4510b_pending_intr; this_mach->mach_update_intr = s3c4510b_update_intr; //this_mach->mach_mem_read_byte = s3c4510b_mem_read_byte; //this_mach->mach_mem_write_byte = s3c4510b_mem_write_byte; this_mach->state = (void *) state; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -