linux 触摸屏测试源码_Linux下的触摸屏驱动

下面是这个模块加载函数中调用的一个配置端口函数

static inline void s3c2410_ts_connect(void)

{

//将触摸屏用到的四个端口配置成触摸屏模式

s3c2410_gpio_cfgpin(S3C2410_GPG(12), S3C2410_GPG12_XMON);

s3c2410_gpio_cfgpin(S3C2410_GPG(13), S3C2410_GPG13_nXPON);

s3c2410_gpio_cfgpin(S3C2410_GPG(14), S3C2410_GPG14_YMON);

s3c2410_gpio_cfgpin(S3C2410_GPG(15), S3C2410_GPG15_nYPON);

}

我们来分析两种情况,第一种情况,如果没有按下触摸屏

驱动中定义了一个定时器

static struct timer_list touch_timer =

TIMER_INITIALIZER(touch_timer_fire, 0, 0);

因为这个定时器的期限时间设置为0,这表示当驱动加载后就会执行一次定时函数touch_timer_fire

static void touch_timer_fire(unsigned long data)

{

unsigned long data0;

unsigned long data1;

int updown;

data0 = ioread32(base_addr+S3C2410_ADCDAT0);  //读取X坐标

data1 = ioread32(base_addr+S3C2410_ADCDAT1);  //读取Y坐标

updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN)); //触摸屏是否被按下,如果按下updowm=1

if (updown) {

if (count != 0) {

long tmp;

tmp = xp;

xp = yp;

yp = tmp;

xp >>= 2;

yp >>= 2;

input_report_abs(dev, ABS_X, xp);

input_report_abs(dev, ABS_Y, yp);

input_report_key(dev, BTN_TOUCH, 1);

input_report_abs(dev, ABS_PRESSURE, 1);

input_sync(dev);

}

xp = 0;

yp = 0;

count = 0;

iowrite32(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, base_addr+S3C2410_ADCTSC);

iowrite32(ioread32(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_START, base_addr+S3C2410_ADCCON);

} else { //没有被按下

count = 0;        //初始化count为0,表示当前AD转换没发生

input_report_key(dev, BTN_TOUCH, 0);  //向input子系统报告未按下

input_report_abs(dev, ABS_PRESSURE, 0);

input_sync(dev);

iowrite32(WAIT4INT(0), base_addr+S3C2410_ADCTSC); //等待按键中断

if (OwnADC) { //OwnADC是获取一把锁标示,在此为0

OwnADC = 0;

up(&ADC_LOCK);

}

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值