/*C头文件*/
#include "au_types.h"
#define DEVICE_NAME "tpanel"
#define IRQ_1 7
#define GPIO_1_PORT GPIO_1
#define GPIO_1_PORT_ADDR GPIO_1_BASE
// 触摸屏返回值结构体
typedef struct
{
uint32 pressure;
uint32 x;
uint32 y;
}TS_RET;
// 校准值结构体
typedef struct
{
int32 x;
int32 y;
}TS_POINT;
static TS_POINT TsPoint[10];
#define TS_IOC_MAGIC 0xd9
#define CALIBRATE _IOW(TS_IOC_MAGIC, 1, sizeof(TsPoint))
#define CALIBRATE_START _IOW(TS_IOC_MAGIC, 2, sizeof(uint8))
// 以下为触摸屏控制器管脚设置
#define ADS7843_CSS() writew(0xff, (GPIO_1_PORT_ADDR + 0x200)) // cs = 1 (p1.7)
#define ADS7843_CSC() writew(0x00, (GPIO_1_PORT_ADDR + 0x200)) // cs = 0
#define ADS7843_DCLKS() writew(0xff, (GPIO_1_PORT_ADDR + 0x40)) // dclk = 1(p1.4)
#define ADS7843_DCLKC() writew(0x00, (GPIO_1_PORT_ADDR + 0x40)) // dclk = 0
#define ADS7843_DINS() writew(0xff, (GPIO_1_PORT_ADDR + 0x20)) // din = 1(p.3)
#define ADS7843_DINC() writew(0x00, (GPIO_1_PORT_ADDR + 0x20)) // din = 0
#define ADS7843_DOUTR() readw(GPIO_1_PORT_ADDR + 0x10) // dout p1.2
// ADS7843控制字
#define AIN_X 0xD4
#define AIN_Y 0x94
// ADS7846控制字
//#define AIN_X 0xD0
//#define AIN_Y 0x90
//#define DELAY_200NS 200 // 操作时序控制宏(即延时控制值)
#define DELAY_200NS 400 // 操作时序控制宏(即延时控制值)
#define PEN_DOWN 1 // 笔按下
#define PEN_UP 2 // 笔抬起
#define PEN_FLEETING 4 // 笔拖拽
#define MAX_TS_BUF 16 // 最大缓冲区数
#define BUF_HEAD (TsDev.buf[TsDev.head]) // 取队列头值
#define BUF_TAIL (TsDev.buf[TsDev.tail]) // 取队列尾值
#define INCBUF(x, mod) ((++(x)) & ((mod)-1)) // 位移加一
#define TS_TIMER_DELAY (HZ/28) // 定时时长为36ms
//#define TS_TIMER_DELAY (HZ/15)
#define TS_TIMER_DELAY1 (HZ/10) // 定时时长为100ms
/*C源代码*/
#include <linux/config.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/types.h>
#include <linux/kernel.h> // printk
#include <linux/fs.h> // file结构
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/delay.h>
#include <linux/string.h>
#include <linux/poll.h>
#include <linux/interrupt.h>
#include <linux/devfs_fs_kernel.h>
#include <linux/timer.h>
#include <asm/hardware.h>
#include <asm/irq.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <asm/ioctl.h>
#include "hi_gpio.h"
#include "touch_screen.h"
#define _CALIBRATE_ 1 // 使用校准参数,否则使用固定的校准值
// 以下为触摸屏较正用
#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 460
#define NR_EQUATIONS 6
#define LSHIFT(x) ((x)<<10)
#define RSHIFT(x) ((x)>>12)
static int Vars[NR_EQUATIONS*4];
static int CalibrateOk = FALSE; // 是否校准过
#define Vars1 Vars
#define Vars2 (Vars + NR_EQUATIONS)
#define Vars3 (Vars + NR_EQUATIONS * 2)
#define Vars4 (Vars + NR_EQUATIONS * 3)
// 触摸屏设备结构体
typedef struct
{
uint32 penStatus;
TS_RET buf[MAX_TS_BUF];
uint32 head, tail;
wait_queue_head_t wq;
spinlock_t lock;
}TS_DEV;
static TS_DEV TsDev;
static struct timer_list ts_timer; // 定义定时器变量
static uint32 touch_screen_major = 0; // 触摸屏设备号
static uint8 Ready = 1;
/*********************************************************
* 名称:DelayNo()
* 功能:短软件延时。
* 入口参数:i 延时参数,值越大,延时越久
* 出口参数:无
**********************************************************/
void DelayNo(uint32 i)
{
for(; i>0; i--);
}
/**********************************************************
* 名称:TestDelayNo()
* 功能:测试短软件延时,以便于产生正确的时序。
* 入口参数:无
* 出口参数:无
***********************************************************/
void TestDelayNo(void)
{
while(1)
{
ADS7843_DCLKS();
DelayNo(DELAY_200NS);
ADS7843_DCLKC();
DelayNo(DELAY_200NS);
}
}
/*********************************************************
* 名称:ADS7843_IOInit()
* 功能:初始化ADS7843的控制I/O,CS=1,DCLK=0,DIN=0。
* 入口参数:无
* 出口参数:无
**********************************************************/
void ADS7843_IOInit(void)
{
ADS7843_CSS(); // CS = 1
ADS7843_DCLKC(); // DCLK = 0
ADS7843_DINC(); // DIN = 0
DelayNo(DELAY_200NS);
}
/**********************************************************
* 名称:ADS7843_IRQR()
* 功能:ADS7843的PENIRQ引脚测量,返回当前此引脚的电平值。
* 入口参数:无
* 出口参数:返回为0表示PENIRQ为低电平状态,否则为高电平。
***********************************************************/
uint8 ADS7843_IRQR(void)
{
uint8 dat[3];
uint8 val;
DelayNo(1);
val = readw(GPIO_1_PORT_ADDR + 0x80);
if(val) dat[0] = 1;
else dat[0] = 0;
//DelayNo(1);
val = readw(GPIO_1_PORT_ADDR + 0x80);
if(v