?? fip.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 + -