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

📄 ads7843_mydriver.c

📁 xscale pxa255 处理器
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************
** File name :  ads7843_mydriver.c
**     
** Description :
**     ADS7843(Touch Screen Controller)
**      
** Compile environment and method of compile & link
**      gcc version 2.95.2 20000313 (Debian GNU/Linux)
**
** Usage :
**      Touch screen controller Device Driver for X-Hyper255 Board 
**  
**
** Modification history :
**      Date        Version  Programmer & Tester   
**      2008.1.17    0.1      Brian Liu             
**
*******************************************************************************/

#include <linux/config.h>
#include <linux/types.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/delay.h>
#include <linux/fs.h>
#include <linux/poll.h>
#include <linux/string.h>

#include <linux/devfs_fs_kernel.h>

#include <asm/uaccess.h>
#include <asm/hardware.h>
#include <asm/irq.h>

#include "ads7843_ts.h"



#define PRINTK printk
#define DELAY 30

static int head, tail;
static TS_EVENT cur_data, samples[3], buf[BUFSIZE];
static struct fasync_struct *fasync;
static unsigned long in_timehandle = 0;
unsigned int count =0;
static void ts_clear(void);
static void print_par(void);

static void read_xy(void);

/******************************************************************************/
#define PORT0       (*(volatile unsigned short *)(0xf011 0000))  //nCS2(0x0800 0000))
#define PORT0_temp  (*(volatile unsigned short *)(0xa060 5010))

//对ADS7843-DCLK -CS -DIN系统数据线进行位设置
void SetBit(char bits)
{
	char value=0;
	value = bits;
	PORT0_temp |= value;
	PORT0 = PORT0_temp;
}

void ClearBit(char bits)
{
	char value=0;
	value = ~(bits);
	PORT0_temp &= value;
	PORT0 = PORT0_temp;
}

/*******************************************************************************/	
//PXA255通过ADS7843-DIN数据线(Q6)写控制字(SPIMDATA_ASKX和
//SPIMDATA_ASKY和SPIMDATA_NOP)给触摸屏
void ads7843_din(char command)
{
        int i;

		ClearBit(ADS7843_CS);
        udelay(DELAY);

        for(i = 0; i < 8; i++)
        {
		        ClearBit( ADS7843_CLK);        
                if((command >> i)&0x1)
                	{
		                SetBit(ADS7843_DIN);
				          } 
				        else 
				        	{
		                ClearBit(ADS7843_DIN);
				          }
                udelay(DELAY);
                SetBit(ADS7843_CLK);
        }

}


void ads7843_askx(void)
{
        ads7843_din(SPIMDATA_ASKX);
}

void ads7843_asky(void)
{
        ads7843_din(SPIMDATA_ASKY);
}

void ads7843_nop(void)
{
        ads7843_din(SPIMDATA_NOP);
}

/*
int sa1100_ts_measure_x(void)
{
    char i;
    int touch_data = 0;

	
        ClearBit(ADS7843_CS);

        udelay(DELAY); 

        for(i = 0; i < 8; i++)
        {
                ClearBit(ADS7843_CLK);
                udelay(DELAY);
                if((  SPIMDATA_ASKX >> i) & 0x01){
                        SetBit(ADS7843_DIN);
				} else {
                        ClearBit(ADS7843_DIN);
				}
                udelay(DELAY);
                SetBit(ADS7843_CLK);
        }

        ClearBit(ADS7843_CLK);
        udelay(DELAY);

        while(!(GPLR0 & GPIO_bit(ADS7843_BUSY)))
				printk("BUSY1\n");

        ClearBit(ADS7843_CLK);

        for(i = 0; i < 15; i++)
        {
                touch_data <<= 1;
                if(GPLR0 & GPIO_bit(ADS7843_DOUT))
                	{
                        touch_data |= 0x01;
				          } 
				        else 
				        	{
                        touch_data &= 0xffffe;
				          }
		        SetBit(ADS7843_CLK);
               udelay(DELAY);
		        ClearBit(ADS7843_CLK);
        }
        touch_data >>= 3;
        return (touch_data & 0xfff);

}
*/

/********************************************************************************/
int sa1100_ts_measure_x(void)
{
    char i;
    int touch_data = 0;

	  ads7843_askx(void);
    
        while(!(GPLR0 & GPIO_bit(ADS7843_BUSY)))
				printk("BUSY1\n");
        SetBit(ADS7843_CLK);
        udelay(DELAY);
        ClearBit(ADS7843_CLK);
        udelay(DELAY);
        
        for(i = 0; i < 12; i++)
        {
                
                if(GPLR0 & GPIO_bit(ADS7843_DOUT))//GPIO_bit(4)应该是(1<<4)即GPIO4引脚为高电平,不前不知是在哪个文件中定义的
                	{
                        touch_data |= 0x01;
				          } 
				        else 
				        	{
                        touch_data &= ~0x01;
				          }
			      touch_data <<= 1;
		        SetBit(ADS7843_CLK);
               udelay(DELAY);
		        ClearBit(ADS7843_CLK);
		           udelay(DELAY);
        }
        touch_data >>= 1;
        return (touch_data );

}
/******************************************************************************/
/*
int sa1100_ts_measure_y(void)
{
    char i;
    int touch_data = 0;

        XHYPER255_ClearBit(0, ADS7843_CS);

      udelay(DELAY);

        for(i = 0; i < 8; i++)
        {
                XHYPER255_ClearBit(0, ADS7843_CLK);
                udelay(DELAY);
                if((  SPIMDATA_ASKY >> i) & 0x01){
                        XHYPER255_SetBit(0, ADS7843_DIN);
				} else {
                        XHYPER255_ClearBit(0, ADS7843_DIN);
				}
                udelay(DELAY);
                XHYPER255_SetBit(0, ADS7843_CLK);

        }

        XHYPER255_ClearBit(0, ADS7843_CLK);
        udelay(DELAY);

        while(!(GPLR0 & GPIO_bit(ADS7843_BUSY)))
				printk("BUSY2\n");
	
        ClearBit(ADS7843_CLK);

        for(i = 0; i < 15; i++)
        {
                touch_data <<= 1;
                if(GPLR0 & GPIO_bit(ADS7843_DOUT)){
                        touch_data |= 0x01;
				} else {
                        touch_data &= 0xffffe;
				}
                XHYPER255_SetBit(0, ADS7843_CLK);
                udelay(DELAY);
                XHYPER255_ClearBit(0, ADS7843_CLK);

        }
        touch_data >>= 3;
        return (touch_data & 0xfff);

}
*/
/********************************************************************************/
int sa1100_ts_measure_y(void)
{
    char i;
    int touch_data = 0;

	  ads7843_asky(void);
    
        while(!(GPLR0 & GPIO_bit(ADS7843_BUSY)))
				printk("BUSY1\n");
        SetBit(ADS7843_CLK);
        udelay(DELAY);
        ClearBit(ADS7843_CLK);
        udelay(DELAY);
        
        for(i = 0; i < 12; i++)
        {
                
                if(GPLR0 & GPIO_bit(ADS7843_DOUT))
                	{
                        touch_data |= 0x01;
				          } 
				        else 
				        	{
                        touch_data &= ~0x01;
				          }
			      touch_data <<= 1;
		        SetBit(ADS7843_CLK);
               udelay(DELAY);
		        ClearBit(ADS7843_CLK);
		           udelay(DELAY);
        }
        touch_data >>= 1;
        return (touch_data );

}



/******************************************************************************/
void Ads7843_Enable_IRQ(void)  //片选,在这期间可以响应中断
{

	ClearBit(ADS7843_CS);								// CS Low
	udelay(DELAY);
	ads7843_nop(void); //
	udelay(DELAY);
	SetBit(ADS7843_CS);								// CS High - Conversion END

}

static int ads7843_ts_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
/* Microwindows style (should change to TS_CAL when the specification is ready) */
   switch (cmd)
   {
      case 3:
	 raw_max_x = arg;
	 break;
      case 4:
	 raw_max_y = arg;
	 break;
      case 5:
	 res_x = arg;
	 break;
      case 6:
	 res_y = arg;
	 break;
      case 10:
	 raw_min_x = arg;
	 break;
      case 11:
	 raw_min_y = arg;
	 break;
      case 12:
/* New attribute for portrait modes */
	 xyswap = arg;
/* Allen Add */
      case 13:	       /* 0 = Enable calibration ; 1 = Calibration OK */
	 cal_ok = arg;
      case 14:	       /* Clear all buffer data */
	 ts_clear();
	 break;
      case 15:	       /* X axis reversed setting */
	 x_rev = arg;
	 break;
      case 16:	       /* Y axis reversed setting */
	 y_rev = arg;
	 break;
      case 17:	       /* Clear all buffer data */
	 print_par();
	 break;
/* Allen */
   }

   return 0;
}

//清空缓冲区
static void ts_clear(void)
{
   int i;

   for (i=0; i < BUFSIZE; i++)
   {
       buf[i].pressure=(short)NULL;
       buf[i].x=(int)NULL;
       buf[i].y=(int)NULL;
       buf[i].millisecs=(int)NULL;
   }

   head = 0;
   tail = 0;

}

static void print_par(void)
{
   printk(" Kernel ==> cal_ok = %d\n",cal_ok);
   printk(" Kernel ==> raw_max_x = %d\n",raw_max_x);
   printk(" Kernel ==> raw_max_y = %d\n",raw_max_y);
   printk(" Kernel ==> res_x = %d\n",res_x);
   printk(" Kernel ==> res_y = %d\n",res_y);
   printk(" Kernel ==> raw_min_x = %d\n",raw_min_x);

⌨️ 快捷键说明

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