我的触摸屏驱动源代码

本文档介绍了ADS7843触摸屏驱动的源代码,包括控制I/O初始化、中断处理、定时器管理和触摸屏中断响应等功能。通过GPIO设置和中断服务例程实现触摸屏的读取与校准,详细阐述了数据传输时序及中断处理流程。
摘要由CSDN通过智能技术生成

/*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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值