📄 ads7843_mydriver.c
字号:
/******************************************************************************
** 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 + -