?? mou_tp.c
字號:
#define pISR_ZDMA0 (*(unsigned *)(_ISR_STARTADDRESS+0x6c))#define pISR_TICK (*(unsigned *)(_ISR_STARTADDRESS+0x70))#define pISR_EINT4567 (*(unsigned *)(_ISR_STARTADDRESS+0x74))#define pISR_EINT3 (*(unsigned *)(_ISR_STARTADDRESS+0x78))#define pISR_EINT2 (*(unsigned *)(_ISR_STARTADDRESS+0x7c))#define pISR_EINT1 (*(unsigned *)(_ISR_STARTADDRESS+0x80))#define pISR_EINT0 (*(unsigned *)(_ISR_STARTADDRESS+0x84))/* PENDING BIT *///CAUTION:You must clear the pending bit as general special register.// it's different way with KS32C6x00 #define BIT_ADC (0x1)#define BIT_RTC (0x1<<1)#define BIT_UTXD1 (0x1<<2)#define BIT_UTXD0 (0x1<<3)#define BIT_SIO (0x1<<4)#define BIT_IIC (0x1<<5)#define BIT_URXD1 (0x1<<6)#define BIT_URXD0 (0x1<<7)#define BIT_TIMER5 (0x1<<8)#define BIT_TIMER4 (0x1<<9)#define BIT_TIMER3 (0x1<<10)#define BIT_TIMER2 (0x1<<11)#define BIT_TIMER1 (0x1<<12)#define BIT_TIMER0 (0x1<<13)#define BIT_UERR01 (0x1<<14)#define BIT_WDT (0x1<<15)#define BIT_BDMA1 (0x1<<16)#define BIT_BDMA0 (0x1<<17)#define BIT_ZDMA1 (0x1<<18)#define BIT_ZDMA0 (0x1<<19)#define BIT_TICK (0x1<<20)#define BIT_EINT4567 (0x1<<21)#define BIT_EINT3 (0x1<<22)#define BIT_EINT2 (0x1<<23)#define BIT_EINT1 (0x1<<24)#define BIT_EINT0 (0x1<<25)#define BIT_GLOBAL (0x1<<26)#define I8 signed char#define U8 unsigned char /* unsigned 8 bits. */#define I16 signed short /* signed 16 bits. */#define U16 unsigned short /* unsigned 16 bits. */#define I32 signed int /* signed 32 bits. */#define U32 unsigned int /* unsigned 32 bits. */#define I16P I16 /* signed 16 bits OR MORE ! */#define U16P U16 /* unsigned 16 bits OR MORE ! *//****************************************************************H/W CONNECTIONS:TP_DCLK GPC9 OUTTP_CS GPC5 OUTTP_DIN GPC6 OUTTP_DOUT GPC7 INTP_BUSY GPD6 INTP_IRQ GPC4 IN****************************************************************/// A/D 通道選擇命令字和工作寄存器#define CHX 0x90 //通道Y+的選擇控制字 //0x94#define CHY 0xD0 //通道X+的選擇控制字 //0xD4int g_xOffset=12;int g_yOffset=-19;/* * write to ads7843's pin */#define TP_DCLK(a) rPDATE= (rPDATE&~(0x1<<3))|(!a<<3)#define TP_CS(a) rPDATE= (rPDATE&~(0x1<<4))|(a<<4)#define TP_DIN(a) rPDATE= (rPDATE&~0x1<<6)|(a<<6&0x1<<6)/* * read from ads7843's pin */#define TP_DOUT ((rPDATE>>7) & 0x1) #define TP_BUSY ((rPDATD>>6) & 0x1)#define TP_IRQ ((rPDATG>>7) & 0x1)int Read_X(void);int Read_Y(void);void TP_GetAdXY(int *x,int *y);void TP_EINT3(void);void TP_init(void);int g_bLastTouched=0;static void WR_CMD (U8 cmd) { U8 buf; U8 i,j; TP_CS(1); TP_DIN(0); TP_DCLK(1); TP_CS(0); //芯片允許 for(i=0;i<8;i++) { buf=(cmd>>(7-i))&0x1; //MSB在前,LSB在后 TP_DIN(buf); //時鐘上升沿鎖存DIN for(j=0;j<25;j++);; //200ns TP_DCLK(1); //開始發送命令字 for(j=0;j<25;j++);; //200ns TP_DCLK(0); //時鐘脈沖,一共8個 }}static U16 RD_AD(void) { U16 buf=0,temp; U8 i,j; TP_DIN(0); TP_DCLK(1); for(i=0;i<12;i++) { for(j=0;j<25;j++); //200ns TP_DCLK(0); for(j=0;j<5;j++); temp=TP_DOUT; //時鐘下降沿讀取,一共12個,MSB在前,LSB在后 buf|=(temp<<(11-i)); for(j=0;j<25;j++); //200ns TP_DCLK(1); } for(i=0;i<4;i++) { for(j=0;j<25;j++); //200ns TP_DCLK(1); for(j=0;j<25;j++); //200ns TP_DCLK(0); //4個沒用時鐘 } TP_CS(1); //禁止芯片 buf&=0x0fff; //屏蔽高4 bit return(buf);}int Read_X(void) { int i; WR_CMD(CHX); for(i=0;i<1;i++); i=RD_AD(); return i; }int Read_Y(void) { int i; WR_CMD(CHY); for(i=0;i<1;i++); i=RD_AD(); return i; }void TP_GetAdXY(int *x,int *y) { int adx,ady; adx=Read_X(); ady=Read_Y(); *x=adx; *y=ady;}extern SCREENDEVICE scrdev;/* * Open up the mouse device. * Returns the fd if successful, or negative if unsuccessful. */static int PD_Open(MOUSEDEVICE *pmd){ int j=0; int a=0; int b=0; int bNoCursor=0; const char cal_filename[] = "/etc/pointercal"; int items; FILE* f = fopen(cal_filename, "r"); if ( f == NULL ) { EPRINTF("Error %d opening pointer calibration file %s. Using default settings.\n", errno, cal_filename); } else { items = fscanf(f, "%d %d",&a, &b); if ( items != 2 ) { EPRINTF("Improperly formatted pointer calibration file %s. Using default settings\n", cal_filename); } else { g_xOffset = a; g_yOffset = b; bNoCursor = 1; } fclose(f); } rPCONE=0x21569;//0x6552a;//0x2B;
rPUPE=0xff; //0xff;
rPDATG=0xFF;
//PORT F GROUP
//rPCONF[21:0]
//| BIT21|....................................| BIT0
//|IISCLK|PF7|IISDO|IISLRCK|PF4|PF3|PF2|IICSDA|IICSCL
//| 100|000| 100| 100| 00| 00| 00| 10| 10
//rPUPF[8:0]
//| 1| 0| 1| 1| 0| 0| 0| 1| 1
rPCONF=0x9256A;//0x2A;
rPUPF=0xff;;
//printf("PD_Open called in mou_cleo.c.4\n"); TP_DCLK(1); TP_CS(1); // 讀取設置信息。 // 如果設置信息正確那么隱藏光標。 if (bNoCursor) { GdHideCursor(&scrdev); } return 1;}/* * Close the mouse device. */static void PD_Close(void){ //close_touch();}/* * Get mouse buttons supported */static int PD_GetButtonInfo(void){ return MWBUTTON_L;}/* * Get default mouse acceleration settings */static void PD_GetDefaultAccel(int *pscale,int *pthresh){ /* * Get default mouse acceleration settings * This doesn't make sense for a touch panel. * Just return something inconspicuous for now. */ *pscale = 3; *pthresh = 5;}#define X_MIN 160#define X_MAX 1860#define Y_MIN 128#define Y_MAX 1930static int PD_Read(MWCOORD *px, MWCOORD *py, MWCOORD *pz, int *pb){ static int xPhys, yPhys; int x,y; float fx,fy; //printf("PD_Read\n"); // Execute the state machine which reads the touch TP_GetAdXY(&xPhys,&yPhys); /* * Read the tpanel state and position. * Returns the position data in x, y, and button data in b. * Returns -1 on error. * Returns 0 if no new data is available. * Returns 1 if position data is relative (i.e. mice). * Returns 2 if position data is absolute (i.e. touch panels). * Returns 3 if position data is not available, but button data is. * This routine does not block. * * Unlike a mouse, this driver returns absolute postions, not deltas. */ //Convert values into logical values if ((xPhys < X_MIN) || (xPhys > X_MAX) || (yPhys < Y_MIN) || (yPhys > Y_MAX)) { //printf("Position invalid. X = %d, Y = %d\n",xPhys,yPhys); if (g_bLastTouched == 1) { //printf("Return button state only.\n"); *pb = 0; g_bLastTouched = 0; return 3; } else { return 0; } } fx = (float)1 - ((float)xPhys / (float)(X_MAX)); fy = ((float)yPhys / (float)(Y_MAX)); x= fy*320; y = fx*240; if ((x != 0) || (y != 0)) { x=x-g_xOffset; y=y-g_yOffset; //printf("x is %d y is %d.\n",x,y); *px = x; *py = y; *pb = MWBUTTON_L; g_bLastTouched = 1; return 2; } else { //printf("x=0 and y=0 %d %d\n",xPhys,yPhys); return 0; }}static int PD_Poll(void){ return 1;}MOUSEDEVICE mousedev = { PD_Open, PD_Close, PD_GetButtonInfo, PD_GetDefaultAccel, PD_Read, PD_Poll};#ifdef TESTint main1(){ MWCOORD x, y, z; int b; int result; DPRINTF("Opening touch panel...\n"); if((result=PD_Open(0)) < 0) DPRINTF("Error %d, result %d opening touch-panel\n", errno, result); DPRINTF("Reading touch panel...\n"); while(1) { result = PD_Read(&x, &y, &z, &b); if( result > 0) { /* DPRINTF("%d,%d,%d,%d,%d\n", result, x, y, z, b); */ } }}#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -