⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 skyeye_mach_s3c2410x.c

📁 SkyEye是一个可以运行嵌入式操作系统的硬件仿真工具
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -