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

📄 fip.c

📁 这是一个SIGMA方案的PMP播放器的UCLINUX程序,可播放DVD,VCD,CD MP3...有很好的参考价值.
💻 C
字号:
#include "fip.h"#include "fipuser_player.h"#include "fip_private.h"#include "fip_scancodes.h"unsigned int fip_fifo[FIP_FIFO_SIZE];unsigned int fip_fifo_first, fip_fifo_last;static unsigned int fipkeyold;static int fipkeyrepeat;static int fipkeyerrors;static int fip_busy(){// return the busy bit	FIP_DELAY(10);	return (((*FIP_TRISTATE_MODE_REG) & 0x2) == 0x2);}#ifndef FIP_NO_INTERRUPT/* *  Push a scancode into the FIFO *  Called from interrupt. */void fip_receive_scancode(unsigned long sc){//		diag_printf("receive_scancode: sc= %08x\n",sc);				if(FIP_FIFO_FULL()) {				DPRINTF("receive_scancode: warning - FIFO full -loosing data\n");		}		FIP_FIFO_IN(sc);		return;}/* Pop a scancode from the FIFO */	                                    unsigned long fip_read_scancode(unsigned long timeout){	unsigned int fipkeys = 0;	FIP_FIFO_LOCK();	if(!FIP_FIFO_EMPTY())		goto fifo_out;	if (timeout)	{		FIP_FIFO_UNLOCK(); // unlock and wait...		FIP_FIFO_WAIT(timeout);   // and wait...		FIP_FIFO_LOCK();	}	if(!FIP_FIFO_EMPTY())		goto fifo_out;		FIP_FIFO_UNLOCK();	return 0;	fifo_out:			FIP_FIFO_OUT(&fipkeys);	FIP_FIFO_UNLOCK();	return fipkeys;}#endif /* !FIP_NO_INTERRUPT */		void fip_wait_ready(){	while(fip_busy());}#ifdef FIP_REVA// Called by timer1 interrupt (fiq)static unsigned fip_poll_revA(void){	int pio1,i;	unsigned int fipkeys;		fip_wait_ready ();	*FIP_COMMAND_REG = FIP_CMD_DATA_SET_RW_MODE_READ_KEYS;	// clock in the data:		fipkeys=0;	i=0;	do {		// wait for a rising edge		do {			pio1 = *PIO_1_DATA_REG;		} while((pio1 & 0x100)==0);		fipkeys |=  ((pio1 & 0x80) >> 7) << 31;		fipkeys = fipkeys >> 1;		// wait for the falling edge		do {			pio1 = *PIO_1_DATA_REG;		} while((pio1 & 0x100));		i++;			} while(i<40);  // ((fipkeys & SC_PANEL_MASK) != SC_PANEL_RELEASE) && (i<40)); // while the 4 msbs are not 0	return fipkeys;}#endif /* FIP_REVA */#ifdef FIP_REVBstatic unsigned long fip_poll_revB(void){		fip_wait_ready ();	*FIP_COMMAND_REG = FIP_CMD_DATA_SET_RW_MODE_READ_KEYS;	return *FIP_KEY_DATA1_REG;       }#endif /* FIP_REVB */#ifndef FIP_NO_INTERRUPT// Called by timer1 interrupt (fiq)// Timer interrupt is NOT cleared - it must be cleared before or afterint fip_timer(void){	int rc=0;	unsigned long fipkeys;		if(fip_poll)		fipkeys=fip_poll();	else 		return 0;	if(fipkeys == 0xffffffff);	else if(fipkeys != fipkeyold) {		fip_receive_scancode(fipkeys);		rc=1;		fipkeyrepeat = 0;	} else if(fipkeys != SC_PANEL_RELEASE) {		fipkeyrepeat++;		if(fipkeyrepeat == FIP_KEY_REPEAT) {			fip_receive_scancode(fipkeys);			rc=1;			fipkeyrepeat = 0;		}	}	fipkeyold = fipkeys;		return rc;}#endif /* FIP_NO_INTERRUPT */void fip_init(void){	unsigned long dw;	unsigned long rev;	*(FIP_CLK_DIV_REG) = 40; // * 3;	// select display mode	*(FIP_COMMAND_REG) = FIP_DISPLAY_MODE; // XXX : What is that ?	fip_wait_ready();	// select brightness of display and turn it on	*(FIP_COMMAND_REG) = FIP_CMD_DISP_CTRL_TURN_DISPLAY_ON | 0x7;	fip_wait_ready();	// select write to display and fixed addressing	*(FIP_COMMAND_REG) = FIP_CMD_DATA_SET_ADR_MODE_FIXED_ADR;	fip_wait_ready();#ifdef FIP_FORCE_REV    rev=FIP_FORCE_REV;#else     rev =  *(SYS_REVID_REG);#endif    switch(rev) {    case 0:#ifdef FIP_REVA	    DPRINTF("FIP USING REVA PIO method\n",40);    	fip_poll=&fip_poll_revA;#endif		break;	default:#ifdef FIP_REVB	    DPRINTF("FIP USING REVB NORMAL METHOD\n",40);	    fip_poll=&fip_poll_revB;#endif		break;	}					fipkeyrepeat = 0;	fipkeyold = SC_PANEL_RELEASE;#ifdef FIP_REVA		if(rev=0) {		// set PIO_1 bit 7&8 to be input		dw  = (1<<7 | 1 <<8) << 16; 		*(PIO_1_DIR_REG) = dw;	}#endif /* FIP_PIO */	#ifndef FIP_NO_INTERRUPT	// disable timer 1	*(TIMER1_CNTL_REG) = 0x0000;	// program the load register (148 * 160) = 23680 (assume system clock is 148Mhz)	*(TIMER1_LOAD_REG) = FIP_TIMER_LOAD_VALUE;	*(TIMER1_CNTL_REG) = FIP_TIMER_PRESCALE;	 // enable timer	*(TIMER1_CNTL_REG) = 0x90 | FIP_TIMER_PRESCALE;	fip_fifo_first = 0;	fip_fifo_last = 0;	#endif /* !FIP_NO_INTERRUPT */}

⌨️ 快捷键说明

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