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

📄 skyeye_mach_omap5912.c

📁 skyeye for pxa270
💻 C
📖 第 1 页 / 共 3 页
字号:
#include <sys/time.h>#include <sys/types.h>#include <unistd.h>#include "armdefs.h"#include "omap5912.h"/*ywc 2005-03-30*/#include "skyeye_flash.h"/* 2007-01-18 added by Anthony Lee : for new uart device frame */#include "skyeye_uart.h"//ywc,2004-11-30,declare a external array which stores touchscreen event informationextern unsigned int Pen_buffer[8];	// defined in skyeye_lcd.c//ywc,2004-11-30,declare a external array which stores touchscreen event information,end//define omap uart interrupt type#define REC_LINE_STA	0x6#define RX_TM_OUT	0xc#define RHR_INT		0x4#define THR_INT		0x2//chy 2005-09-19, the define of omap27x_io_t is in omap.h//static omap5912_io_t omap5912_io;static struct omap5912_io_t omap5912_io;static voidomap5912_io_reset (){	memset(&omap5912_io, 0, sizeof(struct omap5912_io_t));#if 1	omap5912_io.timer.mpu_read_timer[0] = 0xea5f/500;	omap5912_io.timer.mpu_load_timer[0] = 0xea5f/500;	omap5912_io.timer.mpu_read_timer[1] = 0xffffffff/(50*1024*1024);	omap5912_io.timer.mpu_load_timer[1] = 0xffffffff/(50*1024*1024);#endif#if 1	omap5912_io.uart.lsr = 0x60;	omap5912_io.uart.iir = 0x1;	omap5912_io.uart.tcr = 0xf;	omap5912_io.uart.mdr1 = 0x7;	omap5912_io.uart.blr = 0x40;	omap5912_io.uart.wer = 0x7f;#endif	omap5912_io.uart.msr = 0x90;		omap5912_io.os_timer.os_timer_tick_cntr = (0xff);	omap5912_io.ic.mpu_l2_mir = 0xffffffff;	omap5912_io.ic.mpu_l2_itr = 0x0;	omap5912_io.ic.mpu_l1_mir = 0xffffffff;	omap5912_io.ic.mpu_l1_itr = 0x0;}staticomap_set_intr (u32 interrupt){}static intomap_pending_intr (u32 interrupt){}static voidomap5912_update_l2_int (ARMul_State * state){	ARMword requests;	int i;		//printf(" here mpu2_itr data = %x\n", omap5912_io.ic.mpu_l2_itr);	requests = omap5912_io.ic.mpu_l2_itr & ((~omap5912_io.ic.mpu_l2_mir) & 0xffffffff);//	printf("mpu2 requests %x\n",requests);//	printf(" here mpu1_itr data = %x\n", omap5912_io.ic.mpu_l1_itr);	if ((requests & (1<<14)))			       //uart1 14	{		omap5912_io.ic.mpu_l1_itr |= 0x1;             //l2 interrupt mapped to l1 IRQ0		//printf("requests_l2_test\n");	}	#if 1		for (i=31; i>=0; i--)		{			if (omap5912_io.ic.mpu_l1_itr & (1 << i))				break;		}		if (i <=31)		{			omap5912_io.ic.mpu_l1_sir_irq_code = i;		}	#endif//	printf(" here mpu1_itr data = %x\n", omap5912_io.ic.mpu_l1_itr);}static voidomap5912_update_int (ARMul_State * state){	//uart1 and os timer int is mapped to l2 int        ARMword requests;	//printf("irq sig initial: %x\n", state->NirqSig);	omap5912_update_l2_int(state);	//printf(" here test  mpu1_itr data = %x\n", omap5912_io.ic.mpu_l1_itr);	requests = omap5912_io.ic.mpu_l1_itr & ((~omap5912_io.ic.mpu_l1_mir) & 0xffffffff);	//printf("requests %x\n",requests);	state->NirqSig = (requests) ? LOW : HIGH;	state->NfiqSig = HIGH;	//printf("irq sig in l1:%x\n", state->NirqSig);}static voidomap_update_intr (void *mach){        struct machine_config *mc = (struct machine_config *) mach;        ARMul_State *state = (ARMul_State *) mc->state;	omap5912_update_int(state);}static voidomap5912_io_do_cycle (ARMul_State * state){	struct timeval tv;	unsigned char buf;	int i = 0;	tv.tv_sec = 0;	tv.tv_usec = 0;	/** mpu timer interrupt update*/#if 1		if ((omap5912_io.timer.mpu_cntl_timer[0] & 0x23) == 0x23) //bit5 enable clock; bit1 auto or oneshot;bit0 start decrem		{			//omap5912_io.timer.mpu_read_timer[0] &= 0x0000000f;			omap5912_io.timer.mpu_read_timer[0]--;			//printf("omap5912_io.timer.mpu_load_timer[0] = %x\n",omap5912_io.timer.mpu_load_timer[0]);			//printf("omap5912_io.timer.mpu_read_timer[0] = %x\n",omap5912_io.timer.mpu_read_timer[0]);			if (omap5912_io.timer.mpu_read_timer[0] == 0)			{				//printf("omap5912_io.timer.mpu_read_timer[0] = %x\n",omap5912_io.timer.mpu_read_timer[0]);				omap5912_io.timer.mpu_read_timer[0] = (omap5912_io.timer.mpu_load_timer[0]);				//printf("omap5912_io.timer.mpu_read_timer[0] = %x\n",omap5912_io.timer.mpu_read_timer[0]);				omap5912_io.ic.mpu_l1_itr |= (1 << 26);				/*shoulod add some code to determin which priority the interrpt is!1*/		#if 1				for (i=31; i>=0; i--)				{					if (omap5912_io.ic.mpu_l1_itr & (1 << i))						break;				}				if (i <=31)				{					omap5912_io.ic.mpu_l1_sir_irq_code = i;					//omap5912_io.ic.mpu_l1_itr &= ~(1 << i);				}		#endif				omap5912_update_int(state);				return;			}				//omap5912_update_int(state);		}#endif	/*uart interrupt update*/#if 0	if ((omap5912_io.uart.ier & 0xf) == 0x5)	{		//printf("uart_lsr%x\n", omap5912_io.uart.lsr);		//printf("uart_ier%x\n", omap5912_io.uart.ier);		if (skyeye_uart_read(-1, &buf, 1, &tv, NULL) > 0)		{			//if (buf == 1) buf = 3;			//printf("buf%x\n", buf);			omap5912_io.uart.rhr = buf;			omap5912_io.uart.lsr |= (0x1); //bit 0: no data in receive bugger			//omap5912_io.uart.iir |= RHR_INT;		}		//omap5912_io.uart.iir &= 0x0 ;		if ((omap5912_io.uart.ier & 0x1) && (omap5912_io.uart.lsr & 0x1))		{			omap5912_io.uart.iir = RHR_INT;			omap5912_io.ic.mpu_l2_itr |= (1<<14);		#if 1		for (i=31; i>=0; i--)		{			if (omap5912_io.ic.mpu_l2_itr & (1 << i))				break;		}		if (i <=31)		{			omap5912_io.ic.mpu_l2_sir_irq = i;			//printf("i = %d\n", i);		}		#endif		}		omap5912_update_int(state);		return;			}#endif		omap5912_update_int(state);}static voidomap5912_io_write_word (ARMul_State * state, ARMword addr, ARMword data){	omap_ioreg_t ioregaddr = addr;#if 1	if ((addr >= UART1_RHR) && (addr <= UART1_WER))	{		switch (addr) { 		/**uart 1*/		case UART1_THR:		{				int i;			//omap5912_io.uart.thr = data;			//omap5912_io.uart.dll = data;			unsigned char c = data;			if (skyeye_uart_write(-1, &c, 1, NULL) < 0)			{				return;			}			//omap5912_io.uart.iir = 0x1;			omap5912_io.uart.lsr = 0x60;			//omap5912_io.uart.iir = THR_INT & (0xff);		#if 1			//if transmit interrupt comes			if ((omap5912_io.uart.ier & 0xf) == 0x2)			//if ((omap5912_io.uart.iir & 0xf) == THR_INT)			{				//printf("whyhere\n");				omap5912_io.ic.mpu_l2_itr |= (1<<14);				for (i=31; i>=0; i--)				{						if (omap5912_io.ic.mpu_l2_itr & (1 << i))						break;				}				if (i <=31)				{					omap5912_io.ic.mpu_l2_sir_irq = i;				}				omap5912_update_int(state);			}		#endif		}			//printf("data in thr=%x\n", data);			break;				case  UART1_IER:			omap5912_io.uart.ier = data;		//	omap5912_io.uart.dlh = data;		//	printf("data in ier=%x\n", data);			break;		case UART1_FCR:			omap5912_io.uart.fcr = data;		//	omap5912_io.uart.efr = data;			break;		case UART1_LCR:			omap5912_io.uart.lcr = data;			break;		case UART1_MCR:			omap5912_io.uart.mcr = data;		//	omap5912_io.uart.xon1 = data;			break;		case UART1_XON2:			omap5912_io.uart.xon2 = data;			break;		case UART1_TCR:			omap5912_io.uart.tcr = data;			//omap5912_io.uart.xoff1 = data;			break;		case UART1_SPR:			omap5912_io.uart.spr = data;			//omap5912_io.uart.tlr = data;			//omap5912_io.uart.xoff2 = data;			break;		case UART1_MDR1:			omap5912_io.uart.mdr1 = data;			break;		case UART1_MDR2:			omap5912_io.uart.mdr2 = data;			break;		case UART1_TXFLL:			omap5912_io.uart.txfll = data;			break;		case UART1_TXFLH:			omap5912_io.uart.txflh = data;			break;		case UART1_RXFLL:			omap5912_io.uart.rxfll = data;			break;		case UART1_SFREGH: 			omap5912_io.uart.sfregh = data;			//omap5912_io.uart.rxflh = data;			break;		case UART1_BLR:			omap5912_io.uart.blr = data;			break;		case UART1_ACREG:			omap5912_io.uart.acreg = data;			break;		case UART1_SCR:			omap5912_io.uart.scr = data;			break;		case UART1_SSR:			omap5912_io.uart.ssr = data;			break;		case UART1_EBLR:			omap5912_io.uart.eblr = data;			break;		case UART1_SYSC:			omap5912_io.uart.sysc = data;			break;		case UART1_SYSS:			omap5912_io.uart.syss = data;			break;		case UART1_WER:			omap5912_io.uart.wer = data;			break;		default:			break;		}//?endswitch	}//endif#endif		if ((ioregaddr >= MPU_L1_ILR0) && (ioregaddr <=MPU_L1_ILR31))	{		int offset = (ioregaddr - MPU_L1_ILR0)/4;		omap5912_io.ic.mpu_l1_ilr[offset] = data;		//printf("mpu l1 ilr[%d] 0x%x\n",offset,data);		return;	}	if ((ioregaddr >= MPU_L2_ILR0) && (ioregaddr <=MPU_L2_ILR31))	{		int offset = (ioregaddr - MPU_L2_ILR0)/4;		omap5912_io.ic.mpu_l2_ilr[offset] = data;		//printf("mpu l2 ilr[%d] 0x%x\n",offset/4,data);		return;	}	if ((ioregaddr >= MPU_L2_ILR0_S1) && (ioregaddr <=MPU_L2_ILR31_S1))	{		int offset = (ioregaddr - MPU_L2_ILR0_S1)/4;		omap5912_io.ic.mpu_l2_ilr_s1[offset] = data;		//printf("mpu l2 ilr[%d] 0x%x\n",offset/4,data);		return;	}	if ((ioregaddr >= MPU_L2_ILR0_S2) && (ioregaddr <=MPU_L2_ILR31_S2))	{		int offset = (ioregaddr - MPU_L2_ILR0_S2)/4;		omap5912_io.ic.mpu_l2_ilr_s2[offset] = data;		//printf("mpu l2 ilr[%d] 0x%x\n",offset/4,data);		return;	}	if ((ioregaddr >= MPU_L2_ILR0_S3) && (ioregaddr <=MPU_L2_ILR31_S3))	{		int offset = (ioregaddr - MPU_L2_ILR0_S3)/4;		omap5912_io.ic.mpu_l2_ilr_s3[offset] = data;		//printf("mpu l2 ilr[%d] 0x%x\n",offset/4,data);		return;	}	switch (ioregaddr) { 		/*os timer*/		case OS_TIMER_TICK_VAL:			omap5912_io.os_timer.os_timer_tick_val = data & (0x00ffffff);			break;		case OS_TIMER_CTRL:			omap5912_io.os_timer.os_timer_ctrl = data;			printf("timeros control register %x\n", data);			break;		/*		case TIMER_32K_SYNCHRONIZED:			omap5912_io.timer_32k_synchronized = data;			printf("write 32k synchronized%x\n", data);			break;		*/		/*mpu timer*/		case MPU_CNTL_TIMER1:			omap5912_io.timer.mpu_cntl_timer[0] = data;			break;		case MPU_LOAD_TIMER1:			//omap5912_io.timer.mpu_load_timer[0] = 1000/8/6; //what size should be set?			omap5912_io.timer.mpu_load_timer[0] = data/1000; //what size should be set?			//printf("timer1 load register %x\n", omap5912_io.timer.mpu_load_timer[0]);			break;		case MPU_CNTL_TIMER2:			omap5912_io.timer.mpu_cntl_timer[1] = data;			break;		case MPU_LOAD_TIMER2:			//omap5912_io.timer.mpu_load_timer[1] = (0xffffffff)/(100*1024*1024); //what size should be set?			omap5912_io.timer.mpu_load_timer[1] = data; //what size should be set?			//printf("timer2 load register %x\n", omap5912_io.timer.mpu_load_timer[1]);			break;		case MPU_CNTL_TIMER3:			omap5912_io.timer.mpu_cntl_timer[2] = data;			break;		case MPU_LOAD_TIMER3:			omap5912_io.timer.mpu_load_timer[2] = data;			break;				/**uart 1*/#if 0		case UART1_THR:		{	omap5912_io.uart.thr = (data & 0xff);			unsigned char c = (data & 0xff);			j = skyeye_uart_write(-1, &c, 1, NULL);			omap5912_io.uart.lsr |= 0x60;		//	printf("here,j =%d\n", j);		}			break;#endif		/** interrupt control*/		case MPU_L2_ITR:			omap5912_io.ic.mpu_l2_itr = data;			//printf("write mpu2_itr data = %x\n", data);			break;		case MPU_L2_MIR:			omap5912_io.ic.mpu_l2_mir = data;			//printf("write mpu2_imr data = %x\n", data);			break;		case MPU_L2_CONTROL:		#if 1			{			int i;			i = omap5912_io.ic.mpu_l2_sir_irq;			//printf("sirirq i = %x\n", i);			omap5912_io.ic.mpu_l2_itr &= ~(1 << i);			}			#endif			omap5912_io.ic.mpu_l2_control = data;			//printf("write mpu2_control data = %x\n", data);			break;		case MPU_L2_ISR:			omap5912_io.ic.mpu_l2_isr = data;	//	printf("write mpu2_l2 isr data = %x\n", data);			break;		case MPU_L2_OCP_CFG:			omap5912_io.ic.mpu_l2_ocp_cfg = data;			//printf("write mpu2_l2 ocp cfg  data = %x\n", data);			break;		case MPU_L1_ITR:			omap5912_io.ic.mpu_l1_itr = (data &0xffffffff);			//printf("write mpu1_itr data = %x\n", data);			break;		case MPU_L1_MIR:			omap5912_io.ic.mpu_l1_mir = data;			//printf("write mpu1_imr data = %x\n", data);			break;		case MPU_L1_CONTROL:			#if 1

⌨️ 快捷键说明

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