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

📄 bf537_io.c

📁 SkyEye是一个可以运行嵌入式操作系统的硬件仿真工具
💻 C
📖 第 1 页 / 共 3 页
字号:
		}		else if (addr >= UART_IO_START_ADDR			 && addr < UART_IO_END_ADDR) {			return uart_read_long (addr);		}		else if (addr >= DEU_IO_START_ADDR && addr < DEU_IO_END_ADDR) {			return deu_read_long (addr);		}		else if (addr >= EBIU_IO_START_ADDR			 && addr < EBIU_IO_END_ADDR) {			return ebiu_read_long (addr);		}		else if (addr >= SIC_IO_START_ADDR && addr < SIC_IO_END_ADDR) {			return sic_read_long (addr);		}		else if (addr >= L1MEM_IO_START_ADDR			 && addr < L1MEM_IO_END_ADDR) {			return l1mem_read_long (addr);		}		else if (addr >= L1DMEM_IO_START_ADDR			 && addr < L1DMEM_IO_END_ADDR) {			return l1dmem_read_long (addr);		}		else if (addr >= CORE_INT_IO_START_ADDR			 && addr < CORE_INT_IO_END_ADDR) {			return core_int_read_long (addr);		}		else if (addr >= RTC_IO_START_ADDR && addr < RTC_IO_END_ADDR) {			return rtc_read_long (addr);		}		else if (addr >= CORE_TIMER_IO_START_ADDR			 && addr < CORE_TIMER_IO_END_ADDR) {			return core_timer_read_long (addr);		}		else if (addr >= TBUF_IO_START_ADDR			 && addr < TBUF_IO_END_ADDR) {			return tbuf_read_long (addr);		}		else if (addr >= PORT_IO_START_ADDR && addr <= PORT_IO_END_ADDR){			return port_read_long (addr);		}		else if(addr >= ETH_IO_START_ADDR && addr <= ETH_IO_END_ADDR){			return eth_read_long (addr);		}		else {			IO_ERR;		}	}}static voidbf537_io_write_byte (void * state, bu32 addr, bu8 v){	switch (addr) {	default:		if (addr >= DMA_IO_START_ADDR && addr < DMA_IO_END_ADDR) {			dma_write_byte (addr, v);		}		else if (addr >= UART_IO_START_ADDR			 && addr < UART_IO_END_ADDR) {			uart_write_byte (addr, v);		}		else {			IO_ERR;		}	}	return;}static voidbf537_io_write_word (void * state, bu32 addr, bu16 v){	if (addr >= DMA_IO_START_ADDR && addr < DMA_IO_END_ADDR) {		dma_write_word (addr, v);	}	else if (addr >= UART_IO_START_ADDR		 && addr < UART_IO_END_ADDR) {		uart_write_word (addr, v);	}	else if (addr >= EBIU_IO_START_ADDR		 && addr < EBIU_IO_END_ADDR) {		ebiu_write_word (addr, v);	}	else if (addr >= WD_IO_START_ADDR && addr < WD_IO_END_ADDR) {		wd_write_word (addr, v);	}	else if (addr >= DPMC_IO_START_ADDR		 && addr < DPMC_IO_END_ADDR) {		dpmc_write_word (addr, v);	}	else if (addr >= RTC_IO_START_ADDR && addr < RTC_IO_END_ADDR) {		rtc_write_word (addr, v);	}	else if (addr >= PF_IO_START_ADDR && addr < PF_IO_END_ADDR) {		pf_write_word (addr, v);	}	else if (addr >= PORT_IO_START_ADDR && addr <= PORT_IO_END_ADDR){                port_write_word (addr, v);	}	else {		IO_ERR;	}	return;}static voidbf537_io_write_long (void * state, bu32 addr, bu32 v){	switch (addr) {	default:		if (addr >= DMA_IO_START_ADDR && addr < DMA_IO_END_ADDR) {			dma_write_long (addr, v);		}		else if (addr >= UART_IO_START_ADDR			 && addr < UART_IO_END_ADDR) {			uart_write_long (addr, v);		}		else if (addr >= EBIU_IO_START_ADDR			 && addr < EBIU_IO_END_ADDR) {			ebiu_write_long (addr, v);		}		else if (addr >= CORE_INT_IO_START_ADDR			 && addr < CORE_INT_IO_END_ADDR) {			core_int_write_long (addr, v);		}		else if (addr >= SIC_IO_START_ADDR && addr < SIC_IO_END_ADDR) {			sic_write_long (addr, v);		}		else if (addr >= L1MEM_IO_START_ADDR			 && addr < L1MEM_IO_END_ADDR) {			l1mem_write_long (addr, v);		}		else if (addr >= L1DMEM_IO_START_ADDR			 && addr < L1DMEM_IO_END_ADDR) {			l1dmem_write_long (addr, v);		}		else if (addr >= RTC_IO_START_ADDR && addr < RTC_IO_END_ADDR) {			rtc_write_long (addr, v);		}		else if (addr >= CORE_TIMER_IO_START_ADDR			 && addr < CORE_TIMER_IO_END_ADDR) {			core_timer_write_long (addr, v);		}		else if (addr >= TBUF_IO_START_ADDR			 && addr < TBUF_IO_END_ADDR) {		  	tbuf_write_long (addr, v);		}		else if(addr >= ETH_IO_START_ADDR && addr <= ETH_IO_END_ADDR){                        eth_write_long (addr, v);                }		else {			IO_ERR;		}	}	return;}static bu16uart_read_word (bu32 addr){	bu16 data;	//printf("bf537_uart_read,addr=%x\n",addr);	bu32 offset = addr - UART_IO_START_ADDR;		/*	if(offset != 0 && offset != 0x14 && offset != 0xc && offset!=0x4)		printf("###############offset=0x%x\n",offset);	*/	static int read_num = 0;	switch (offset) {	case 0x0:		// RbR		if (bf537_io.uart.lcr & 0x80) {			data = bf537_io.uart.dlh;		}		if (read_num == 0) {			read_num = 1;			return 'k';		}		if (read_num == 1) {			bf537_io.uart.lsr &= ~0x1;			bf537_io.sic.sic_isr &= ~0x800;			data = bf537_io.uart.rbr & 0xff;			//bf537_io.uart.iir = 0x1;			read_num = 0;			//fprintf (PF, "*****read rbr=%x,pc=%x,isr=%x\n", data,			//	 PCREG, bf537_io.sic.sic_isr);		}		break;	case 0x4:		// ier		if (bf537_io.uart.lcr & 0x80)			data = bf537_io.uart.dlh;		else			data = bf537_io.uart.ier;		break;	case 0x8:		// iir		data = bf537_io.uart.iir;		//printf("read iir=%x,pc=%x\n",data,PCREG);		bf537_io.uart.iir = 0x1;		break;	case 0xc:		// lcr		data = bf537_io.uart.lcr;		break;	case 0x10:		// MCR		data = 0x0;		break;	case 0x14:		// LSR		data = bf537_io.uart.lsr;		//printf("read lsr=%x,pc=%x\n",data,PCREG);		break;	case 0x1c:		// SCR		data = bf537_io.uart.lcr;		break;	case 0x24:		// SCR		data = bf537_io.uart.gctl;		break;	default:		IO_ERR;		DBG_PRINT ("uart_read(%s=0x%08x)\n", "uart_reg", addr);		break;	}	return (data);}static voiduart_write_word (bu32 addr, bu16 data){	bu32 offset = addr - UART_IO_START_ADDR;		/*	if(offset != 0 && offset != 0xc)		printf("in %s,offset=%x,value = %x\n", __FUNCTION__, offset,data);	*/	switch (offset) {	case 0x0:		// THR		{			unsigned char c = data & 0xff;			/*There is no TSR ,so we set TEMT and THRE together */			bf537_io.uart.lsr |= 0x60;			bf537_io.sic.sic_isr &= ~0x1000;			bf537_io.uart.iir = 0x1;			/* 2007-01-18 modified by Anthony Lee : for new uart device frame */			skyeye_uart_write(-1, &c, 1, NULL);		}		break;	case 0x4:		//FCR		/*just walkaround code to open uart */		if (bf537_io.uart.lcr & 0x80) {			bf537_io.uart.dlh = data;		}		else {			bf537_io.uart.ier = data;			/*generate RX interrupt */			if (data & 0x1) {			}			/*generate TX interrupt */			if (data & 0x2) {			}		}		break;	case 0xc:		// SCR		bf537_io.uart.lcr = data;		break;	case 0x24:		bf537_io.uart.gctl = data;		break;	default:		IO_ERR;		//printf("%c", data); fflush(stdout);		DBG_PRINT ("uart_write(%s=0x%08x)\n", "uart_reg", addr);		break;	}}static bu32uart_read_long (bu32 addr){	bu16 ret;	IO_ERR;	return ret;}static voiduart_write_long (bu32 addr, bu32 value){	uart_write_word(addr, (value & 0xffff));	//IO_ERR;	return;}static bu8uart_read_byte (bu32 addr){	bu8 ret;	IO_ERR;	return ret;}static voiduart_write_byte (bu32 addr, bu8 value){	IO_ERR;	return;}static bu16ebiu_read_word (bu32 addr){	int offset = addr - EBIU_IO_START_ADDR;	switch (offset) {	case 0:		return bf537_io.ebiu.amgctl;	case 4:		return bf537_io.ebiu.ambctl0;	case 8:		return bf537_io.ebiu.ambctl1;	case 0x10:		return bf537_io.ebiu.sdgctl;	case 0x1c:		return bf537_io.ebiu.sdstat;	default:		IO_ERR;	}	return;}static bu32ebiu_read_long (bu32 addr){	int offset = addr - EBIU_IO_START_ADDR;	switch (offset) {	case 0:		return bf537_io.ebiu.amgctl;	case 4:		return bf537_io.ebiu.ambctl0;	case 8:		return bf537_io.ebiu.ambctl1;	case 0x10:		return bf537_io.ebiu.sdgctl;	default:		IO_ERR;	}	return;}static voidebiu_write_long (bu32 addr, bu32 v){	int offset = addr - EBIU_IO_START_ADDR;	switch (offset) {	case 0:		bf537_io.ebiu.amgctl = v;		break;	case 4:		bf537_io.ebiu.ambctl0 = v;		break;	case 8:		bf537_io.ebiu.ambctl1 = v;		break;	case 0x10:		bf537_io.ebiu.sdgctl = v;		break;	default:		IO_ERR;	}	return;}static voidebiu_write_word (bu32 addr, bu16 v){	int offset = addr - EBIU_IO_START_ADDR;	switch (offset) {	case 0:		bf537_io.ebiu.amgctl = v;		break;	case 4:		bf537_io.ebiu.ambctl0 = v;		break;	case 8:		bf537_io.ebiu.ambctl1 = v;		break;	case 0x18:		bf537_io.ebiu.sdrrc = v;		break;	default:		IO_ERR;	}	return;}static bu8dma_read_byte (bu32 addr){	bu8 ret = 0;	IO_ERR;	return ret;}static voiddma_write_byte (bu32 addr, bu8 value){	IO_ERR;	/*	   int channel = addr&0x3c0;	   int offset = (addr&0x3f)>>2;	   bf537_io.dma.bf537_dma_channel[channel][offset] = value;	 */	return;}static bu16dma_read_word (bu32 addr){	bu16 ret;	int channel = (addr & 0x3c0) >> 6;	int offset = (addr & 0x3f) >> 2;	ret = bf537_io.dma.bf537_dma_channel[channel][offset];	return ret;}static voiddma_write_word (bu32 addr, bu16 value){	int i;	int channel = (addr & 0x3c0) >> 6;	int offset = (addr & 0x3f) >> 2;	DBG_PRINT("\nIn %s,channel=0x%x,offset = %x,value=%x\n",__FUNCTION__, channel,offset,value);	switch (offset) {	case 0x2:		/* CONFIG */ 		bf537_io.dma.bf537_dma_channel[channel][offset] = value;		if (!(value & 0x1))                        break;		if (channel == BF537_MDMA_D0) {			unsigned int src =				bf537_io.dma.bf537_dma_channel[BF537_MDMA_S0][START_ADDR];			unsigned int dst =				bf537_io.dma.bf537_dma_channel[BF537_MDMA_D0][START_ADDR];			short x_modify =                                (short)bf537_io.dma.bf537_dma_channel[BF537_MDMA_D0][X_MODIFY];			unsigned int size =				bf537_io.dma.bf537_dma_channel[BF537_MDMA_D0][X_COUNT] * \				abs(x_modify);			/* if two-demisbf537_io. is used */			if(bf537_io.dma.bf537_dma_channel[BF537_MDMA_D0][DMA_CONFIG] & 0x10){				size = size * bf537_io.dma.bf537_dma_channel[BF537_MDMA_D0][Y_COUNT] * \					bf537_io.dma.bf537_dma_channel[BF537_MDMA_D0][Y_MODIFY];			}			/* if 16 width is used */			if((((bf537_io.dma.bf537_dma_channel[BF537_MDMA_D0][DMA_CONFIG] & 0xc) >> 2)) == 0x1){				size = size / 2;			}			i = size;			//mem_cpy(start_addr,end_addr,size);			/*work around code for dma copy to isram */			/* 			if (dst >= 0xffa00000) {				return;			}*/				/***************************************/			DBG_PRINT (				 "DMA copy begin from 0x%x to 0x%x,size=0x%x\n",				 src, dst, size);			for (; i >= 0; i--) {					if(x_modify > 0)					put_byte (saved_state.memory, dst++,					  get_byte (saved_state.memory,						    src++));				else					 put_byte (saved_state.memory, dst--,                                          get_byte (saved_state.memory,                                                    src--));			}		}		break;	default:		bf537_io.dma.bf537_dma_channel[channel][offset] = value;		break;	}	return;}static bu32dma_read_long (bu32 addr){	bu32 ret;	int channel = (addr & 0x3c0) >> 6;	int offset = (addr & 0x3f) >> 2;	ret = bf537_io.dma.bf537_dma_channel[channel][offset];	return ret;}static voiddma_write_long (bu32 addr, bu32 value){	int channel = (addr & 0x3c0) >> 6;	int offset = (addr & 0x3f) >> 2;	DBG_PRINT("\nIn %s channel=0x%x,offset = %x,value=%x\n",__FUNCTION__,channel,offset,value); 	bf537_io.dma.bf537_dma_channel[channel][offset] = value;	return;}static voidcore_int_write_long (bu32 addr, bu32 v){	int offset = addr - CORE_INT_IO_START_ADDR;	//printf("%x,%x\n",addr,v);	switch (offset) {	case 0x104:		bf537_io.core_int.imask = (v | 0x1f) & 0xffff;		break;	case 0x108:		bf537_io.core_int.ipend = v;		break;	case 0x10c:		bf537_io.core_int.ilat = v;		//printf("write ilat %x\n",v);		break;	case 0x110:		bf537_io.core_int.iprio= v;		break;	default:		if (offset >= 0 && offset < 0x100) {			bf537_io.core_int.evt[offset >> 2] = v;			return;		}		IO_ERR;	}}static bu32

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -