📄 skyeye_mach_pxa250.c
字号:
#include <sys/time.h>#include <sys/types.h>#include <unistd.h>//koodailar add for mingw 2005.12.18 ----------------------------------------#ifdef __MINGW32__#include "arch/arm/common/armdefs.h"#include "utils/stub/mingw_help.h"#else#include "armdefs.h"#endif// end ----------------------------------------------------------------------#include "pxa.h"/*ywc 2005-03-30*/#include "skyeye_flash.h"#define F_CORE (100 * 1024 * 1024) //core frequence#define F_RTC 32768 //RTC#define F_OS 3686400 //OS timer#define RT_SCALE (F_CORE / F_RTC) / 50#define OS_SCALE (F_CORE / F_OS / 10) / 50#define FF_SCALE 200 //FF UART//ywc,2004-11-30,declare a external array which stores touchscreen event informationextern unsigned long Pen_buffer[8]; // defined in skyeye_lcd.c//ywc,2004-11-30,declare a external array which stores touchscreen event information,end//chy: lubbock, cerf, idp are different board// I can add a union to cover the difference in the future//chy: refer to linux/include/asm-arm/arch-pxa/pxa-regs.h//chy 2005-09-19, the define of pxa27x_io_t is in pxa.hstatic pxa250_io_t pxa250_io;static void refresh_irq (ARMul_State *);static voidpxa250_io_reset (){ memset (&pxa250_io, 0, sizeof (pxa250_io)); //chy 2003-08-25 pxa250_io.cccr = 0x121; // 1 0010 0001 pxa250_io.cken = 0x17def; pxa250_io.ts_int = 1 << 15; pxa250_io.ts_addr_begin = 0x40000300; pxa250_io.ts_addr_end = 0x4000031f; //ywc,2004-11-30,evaluate io of LCD and Touchscreen,end};voidpxa250_io_write_byte (ARMul_State * state, ARMword addr, ARMword data){ return;}voidpxa250_io_write_halfword (ARMul_State * state, ARMword addr, ARMword data){ return;}pxa_set_intr (u32 interrupt){ pxa250_io.icpr |= (1 << interrupt);}static intpxa_pending_intr (u32 interrupt){ return ((pxa250_io.icpr & (1 << interrupt)));}static voidpxa_update_intr (void *mach){ struct machine_config *mc = (struct machine_config *) mach; ARMul_State *state = (ARMul_State *) mc->state; pxa250_io.icip = (pxa250_io.icmr & pxa250_io.icpr) & ~pxa250_io.iclr; pxa250_io.icfp = (pxa250_io.icmr & pxa250_io.icpr) & pxa250_io.iclr; state->NirqSig = pxa250_io.icip ? LOW : HIGH; state->NfiqSig = pxa250_io.icfp ? LOW : HIGH;}static voidpxa250_update_int (ARMul_State * state){ pxa250_io.icip = (pxa250_io.icmr & pxa250_io.icpr) & ~pxa250_io.iclr; pxa250_io.icfp = (pxa250_io.icmr & pxa250_io.icpr) & pxa250_io.iclr; state->NirqSig = pxa250_io.icip ? LOW : HIGH; state->NfiqSig = pxa250_io.icfp ? LOW : HIGH;}static voidpxa250_io_write_word (ARMul_State * state, ARMword addr, ARMword data){ pxa_ioregnum_t ioregaddr = addr; //printf("SKYEYE:pxa250_io_write_word: io addr 0x%x, RCNR 0x%x\n",ioregaddr,RCNR); switch (ioregaddr) { /*RTC*/ case RCNR: pxa250_io.rcnr = data; break; case RTAR: pxa250_io.rtar = data; break; case RTSR: pxa250_io.rtsr |= (data & 0xc); pxa250_io.rtsr &= ~(data & 0x3); break; case RTTR: pxa250_io.rttr = data & 0x3ffffff; break; /*OS timer */ case OSCR: pxa250_io.oscr = data; break; case OSMR0: pxa250_io.osmr0 = data; break; case OSMR1: pxa250_io.osmr1 = data; break; case OSMR2: pxa250_io.osmr2 = data; break; case OSMR3: pxa250_io.osmr3 = data; break; case OWER: pxa250_io.ower |= data & 0x1; break; case OSSR: /* When the status register is updated, the results are seen immediately in the icpr */ pxa250_io.ossr &= ~(data & 0xf); pxa250_io.icpr &= ~(0xf << OS_IRQ_SHF); pxa250_io.icpr |= (pxa250_io.ossr << OS_IRQ_SHF); break; case OIER: pxa250_io.oier = data & 0xf; break; /*interrupt control */ //ywc,2004-11-30,for touchscreen use ICPR case ICPR: /*read only - see 4.2.2.5 Intel PXA255 Processor Developer's Manual */ break; case ICMR: pxa250_io.icmr = data; break; case ICLR: pxa250_io.iclr = data; break; //ffuart contril case FFTHR: { /*static tx_cnt=0; */ unsigned char c = data; write (skyeye_config.uart.fd_out, &c, 1); /*chy 2004-07-21 from luzhetao: after write char, should set some value */ pxa250_io.ffiir &= ~0x2; pxa250_io.ffiir |= 0x1; pxa250_io.fflsr &= ~0x60; //tx_cnt++; //pxa250_io.ffier|=0x2; /* if(tx_cnt>63){ tx_cnt=0; pxa250_io.ffiir|=0x2; pxa250_io.fflsr|=0x60; refresh_irq(state); } */ //printf("SKYEYE: write FFTHR %x, iir %x,lsr %x, ier %x\n",data, pxa250_io.ffiir,pxa250_io.fflsr,pxa250_io.ffier); } break; case FFIER: pxa250_io.ffier = data & 0xff; break; case FFFCR: //write only pxa250_io.fffcr = data & 0xc7; //pxa250_io.ffiir = data & 0xc7 ; //if(pxa250_io.fffcr & 2 //printf("SKYEYE: write FFFCR %x, but is ffiir %x\n",pxa250_io.fffcr,pxa250_io.ffiir); break; case FFLCR: pxa250_io.fflcr = data & 0xff; break; //core clock case CCCR: pxa250_io.cccr = data & 0x3ff; break; case CKEN: pxa250_io.cken = data & 0x17def; break; case OSCC: pxa250_io.oscc = data & 0x3; break; //ywc,2004-11-30,add for pxa's LCD simulation#if 0 case LCCR0: tmp = pxa250_io.lccr0; pxa250_io.lccr0 = data; if ((!(tmp & LCCR0_ENB)) && (pxa250_io.lccr0 & LCCR0_ENB)) { if (once) break; once++; /* printf("\nFDADR0=%x,FDADR1=%x",pxa250_io.fdadr0,pxa250_io.fdadr1); printf("\n"); pxa250_io.lcd_addr_begin = pxa250_io.fdadr0 + 16*(2+2); printf("\nlcd_addr_begin=%x",pxa250_io.lcd_addr_begin); printf("\n"); */ pxa250_update_lcd (state); } break; case LCCR1: pxa250_io.lccr1 = data; break; case LCCR2: pxa250_io.lccr2 = data; break; case LCCR3: pxa250_io.lccr3 = data; break; case FDADR0: pxa250_io.fdadr0 = data; //printf("\nFDADR0=%x",pxa250_io.fdadr0); //printf("\n"); /* mbp = bank_ptr(pxa250_io.fdadr0); if(!mbp){ fprintf(stderr, "No bank at address 0x%x", pxa250_io.fdadr0); return; } fdadr0ADDRESS=(u32 *) &state->mem.rom[mbp - skyeye_config.mem.mem_banks][(pxa250_io.fdadr0 - mbp->addr)]; printf("\n %p",fdadr0ADDRESS); */ // printf("\n 0: %x",*((u32 *)fdadr0ADDRESS)); // printf("\n 1: %x",*((u32 *)fdadr0ADDRESS+1)); // printf("\n 2: %x",*((u32 *)fdadr0ADDRESS+2)); // printf("\n 3: %x",*((u32 *)fdadr0ADDRESS+3)); //printf("\n"); break; case FDADR1: pxa250_io.fdadr1 = data; //printf("\nFDADR1=%x",pxa250_io.fdadr1); //printf("\n"); break; case FSADR0: pxa250_io.fsadr0 = data; //printf("\nFSADR0=%x",pxa250_io.fsadr0); //printf("\n"); break; case FSADR1: pxa250_io.fsadr1 = data; //printf("\nFSADR1=%x",pxa250_io.fsadr1); //printf("\n"); break;#endif //ywc,2004-11-30,add for pxa's LCD simulation,end#if 0 case FFIIR: //read only case FFMCR: //no use case FFMSR: //read only no use case FFSPR: // no use case FFISR: // no use#endif default: //chy 2003-09-03 if debug, uncommit it //log_msg("SKYEYE: pxa250_io_write_word: unknown addr 0x%x, reg15 0x%x \n", addr,state->Reg[15]); ; };};ARMwordpxa250_io_read_byte (ARMul_State * state, ARMword addr){ return 0;}ARMwordpxa250_io_read_halfword (ARMul_State * state, ARMword addr){ return 0;}ARMwordpxa250_io_read_word (ARMul_State * state, ARMword addr){ u32 data; pxa_ioregnum_t ioregaddr = addr; //ywc,2004-11-30,add for pxa's Touchscreen simulation u32 ts_addr; //ywc,2004-11-30,add for pxa's Touchscreen simulation,end //ywc 2004-11-30 read the touch srceen data buffer,return to the ts device driver ts_addr = addr & ~3; // 1 word==4 byte if (ts_addr >= pxa250_io.ts_addr_begin && ts_addr <= pxa250_io.ts_addr_end) { data = pxa250_io. ts_buffer[(ts_addr - pxa250_io.ts_addr_begin) / 4]; return data; } //ywc 2004-11-30 read the touch srceen data buffer,return to the ts device driver,end switch (addr) { /*RTC*/ case RCNR: data = pxa250_io.rcnr; break; case RTAR: data = pxa250_io.rtar; break; case RTSR: data = pxa250_io.rtsr; break; case RTTR: data = pxa250_io.rttr; break; /*OS timer */ case OSCR: data = pxa250_io.oscr; break; case OSMR0: data = pxa250_io.osmr0; break; case OSMR1: data = pxa250_io.osmr1; break; case OSMR2: data = pxa250_io.osmr2; break; case OSMR3: data = pxa250_io.osmr3; break; case OWER: data = pxa250_io.ower; break; case OSSR: data = pxa250_io.ossr; break; case OIER: data = pxa250_io.oier; break; /*interrupt controler */ case ICPR: data = pxa250_io.icpr; break; case ICIP: data = (pxa250_io.icmr & pxa250_io.icpr) & ~pxa250_io.iclr; break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -