📄 skyeye_mach_pxa270.c
字号:
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/select.h>
#include "armdefs.h"
#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 information
extern 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
typedef struct pxa270_io_t
{
/*interrupt controller */
u32 icpr;
u32 icip;
u32 icfp;
u32 icmr;
u32 iccr;
u32 iclr;
/*real time clock(RTC) */
u32 rcnr;
u32 rtar;
u32 rtsr;
u32 rttr;
//chy: maybe not regs ????
u32 rt_scale; /*core frequence to 32.768K */
u32 rt_count;
/*os timer */
u32 oscr;
u32 osmr0, osmr1, osmr2, osmr3;
u32 ower;
u32 ossr;
u32 oier;
//chy: maybe not regs ????
u32 os_scale; //chy: I can not find it in pxa-regs.h????
/*full function uart controller */
u32 ffrbr;
u32 ffthr;
u32 ffier;
u32 ffiir;
u32 fffcr;
u32 fflcr;
u32 ffmcr;
u32 fflsr;
u32 ffmsr;
u32 ffspr;
u32 ffisr;
u32 ffdll;
u32 ffdlh;
u32 ff_scale;
/*bluetooth function uart controller */
u32 btrbr;
u32 btthr;
u32 btier;
u32 btiir;
u32 btfcr;
u32 btlcr;
u32 btmcr;
u32 btlsr;
u32 btmsr;
u32 btspr;
u32 btisr;
u32 btdll;
u32 btdlh;
/*standard uart controller */
u32 strbr;
u32 stthr;
u32 stier;
u32 stiir;
u32 stfcr;
u32 stlcr;
u32 stmcr;
u32 stlsr;
u32 stmsr;
u32 stspr;
u32 stisr;
u32 stdll;
u32 stdlh;
/*core clock */
u32 cccr;
u32 cken;
u32 oscc;
//ywc,2004-11-30,add io of LCD and Touchscreen
/*LCD*/
/* remove them later. */
u32 lccr0;
u32 lccr1;
u32 lccr2;
u32 lccr3;
u32 fdadr0;
u32 fdadr1;
u32 fsadr0;
u32 fsadr1;
/*TouchScreen */
u32 ts_int;
u32 ts_buffer[8];
u32 ts_addr_begin;
u32 ts_addr_end;
//ywc,2004-11-30,add io of LCD and Touchscreen,end
} pxa270_io_t;
static pxa270_io_t pxa270_io;
static void refresh_irq (ARMul_State *);
static void
pxa270_io_reset ()
{
memset (&pxa270_io, 0, sizeof (pxa270_io));
//chy 2003-08-25
pxa270_io.cccr = 0x121; // 1 0010 0001
pxa270_io.cken = 0x17def;
pxa270_io.ts_int = 1 << 15;
pxa270_io.ts_addr_begin = 0x40000300;
pxa270_io.ts_addr_end = 0x4000031f;
//ywc,2004-11-30,evaluate io of LCD and Touchscreen,end
};
void
pxa270_io_write_byte (ARMul_State * state, ARMword addr, ARMword data)
{
printf ("SKYEYE: pxa270_io_write_byte error\n");
exit (-1);
}
void
pxa270_io_write_halfword (ARMul_State * state, ARMword addr, ARMword data)
{
printf ("SKYEYE: pxa270_io_write_halfword error\n");
exit (-1);
}
//ywc,2004-11-30,add for pxa's LCD simulation
static int once = 0;
static u32 *fdadr0ADDRESS;
//ywc,2004-11-30,add for pxa's LCD simulation,end
static void
pxa270_io_write_word (ARMul_State * state, ARMword addr, ARMword data)
{
pxa_ioregnum_t ioregaddr = addr;
//ywc,2004-11-30,add for pxa's LCD simulation
u32 tmp;
mem_bank_t *mbp;
//ywc,2004-11-30,add for pxa's LCD simulation,end
//printf("SKYEYE:pxa270_io_write_word: io addr 0x%x, value 0x%x\n",ioregaddr,data);
switch (ioregaddr)
{
/*RTC*/ case RCNR:
pxa270_io.rcnr = data;
break;
case RTAR:
pxa270_io.rtar = data;
break;
case RTSR:
pxa270_io.rtsr |= (data & 0xc);
pxa270_io.rtsr &= ~(data & 0x3);
break;
case RTTR:
pxa270_io.rttr = data & 0x3ffffff;
break;
/*OS timer */
case OSCR:
pxa270_io.oscr = data;
break;
case OSMR0:
pxa270_io.osmr0 = data;
break;
case OSMR1:
pxa270_io.osmr1 = data;
break;
case OSMR2:
pxa270_io.osmr2 = data;
break;
case OSMR3:
pxa270_io.osmr3 = data;
break;
case OWER:
pxa270_io.ower |= data & 0x1;
break;
case OSSR:
pxa270_io.ossr &= ~(data & 0xf);
break;
case OIER:
pxa270_io.oier = data & 0xf;
break;
/*interrupt control */
//ywc,2004-11-30,for touchscreen use ICPR
case ICPR:
pxa270_io.icpr = data;
//printf("\n write ICPR=%x",pxa270_io.icpr);
//printf("\n");
break;
//ywc,2004-11-30,for touchscreen use ICPR,end
//case ICIP:
//case ICFP:
/*read only */
// break;
case ICMR:
pxa270_io.icmr = data;
break;
case ICLR:
pxa270_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 */
pxa270_io.ffiir &= ~0x2;
pxa270_io.ffiir |= 0x1;
pxa270_io.fflsr &= ~0x60;
//tx_cnt++;
//pxa270_io.ffier|=0x2;
/*
if(tx_cnt>63){
tx_cnt=0;
pxa270_io.ffiir|=0x2;
pxa270_io.fflsr|=0x60;
refresh_irq(state);
}
*/
//printf("SKYEYE: write FFTHR %x, iir %x,lsr %x, ier %x\n",data, pxa270_io.ffiir,pxa270_io.fflsr,pxa270_io.ffier);
}
break;
case FFIER:
pxa270_io.ffier = data & 0xff;
break;
case FFFCR: //write only
pxa270_io.fffcr = data & 0xc7;
//pxa270_io.ffiir = data & 0xc7 ;
//if(pxa270_io.fffcr & 2
//printf("SKYEYE: write FFFCR %x, but is ffiir %x\n",pxa270_io.fffcr,pxa270_io.ffiir);
break;
case FFLCR:
pxa270_io.fflcr = data & 0xff;
break;
//core clock
case CCCR:
pxa270_io.cccr = data & 0x3ff;
break;
case CKEN:
pxa270_io.cken = data & 0x17def;
break;
case OSCC:
pxa270_io.oscc = data & 0x3;
break;
//ywc,2004-11-30,add for pxa's LCD simulation
#if 0
case LCCR0:
tmp = pxa270_io.lccr0;
pxa270_io.lccr0 = data;
if ((!(tmp & LCCR0_ENB)) && (pxa270_io.lccr0 & LCCR0_ENB))
{
if (once)
break;
once++;
/*
printf("\nFDADR0=%x,FDADR1=%x",pxa270_io.fdadr0,pxa270_io.fdadr1);
printf("\n");
pxa270_io.lcd_addr_begin = pxa270_io.fdadr0 + 16*(2+2);
printf("\nlcd_addr_begin=%x",pxa270_io.lcd_addr_begin);
printf("\n");
*/
pxa270_update_lcd (state);
}
break;
case LCCR1:
pxa270_io.lccr1 = data;
break;
case LCCR2:
pxa270_io.lccr2 = data;
break;
case LCCR3:
pxa270_io.lccr3 = data;
break;
case FDADR0:
pxa270_io.fdadr0 = data;
//printf("\nFDADR0=%x",pxa270_io.fdadr0);
//printf("\n");
/*
mbp = bank_ptr(pxa270_io.fdadr0);
if(!mbp){
fprintf(stderr, "No bank at address 0x%x", pxa270_io.fdadr0);
return;
}
fdadr0ADDRESS=(u32 *) &state->mem.rom[mbp - skyeye_config.mem.mem_banks][(pxa270_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:
pxa270_io.fdadr1 = data;
//printf("\nFDADR1=%x",pxa270_io.fdadr1);
//printf("\n");
break;
case FSADR0:
pxa270_io.fsadr0 = data;
//printf("\nFSADR0=%x",pxa270_io.fsadr0);
//printf("\n");
break;
case FSADR1:
pxa270_io.fsadr1 = data;
//printf("\nFSADR1=%x",pxa270_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
//printf("SKYEYE: pxa270_io_write_word: unknown addr 0x%x, reg15 0x%x \n", addr,state->Reg[15]);
;
};
};
ARMword
pxa270_io_read_byte (ARMul_State * state, ARMword addr)
{
printf ("SKYEYE: pxa270_io_read_byte error\n");
exit (-1);
}
ARMword
pxa270_io_read_halfword (ARMul_State * state, ARMword addr)
{
printf ("SKYEYE: pxa270_io_read_halfword error\n");
exit (-1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -