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

📄 skyeye_mach_pxa250.c

📁 这是Skyeye 0.9 版本的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#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
//chy 2005-09-19, the define of pxa27x_io_t is in pxa.h
static pxa250_io_t pxa250_io;


static void refresh_irq (ARMul_State *);
static void
pxa250_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

};
void
pxa250_io_write_byte (ARMul_State * state, ARMword addr, ARMword data)
{
  printf ("SKYEYE: pxa250_io_write_byte error\n");
  exit (-1);
}

void
pxa250_io_write_halfword (ARMul_State * state, ARMword addr, ARMword data)
{
  printf ("SKYEYE: pxa250_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
pxa250_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: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:
      pxa250_io.ossr &= ~(data & 0xf);
      break;
    case OIER:
      pxa250_io.oier = data & 0xf;
      break;

      /*interrupt control */
      //ywc,2004-11-30,for touchscreen use ICPR
    case ICPR:
      pxa250_io.icpr = data;
      //printf("\n write ICPR=%x",pxa250_io.icpr);
      //printf("\n");
      break;
      //ywc,2004-11-30,for touchscreen use ICPR,end

      //case ICIP:
      //case ICFP:
      /*read only */
      //      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]);
      ;
    };

};

ARMword
pxa250_io_read_byte (ARMul_State * state, ARMword addr)
{
  printf ("SKYEYE: pxa250_io_read_byte error\n");
  exit (-1);
}

ARMword
pxa250_io_read_halfword (ARMul_State * state, ARMword addr)
{
  printf ("SKYEYE: pxa250_io_read_halfword error\n");
  exit (-1);
}

ARMword
pxa250_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;

⌨️ 快捷键说明

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