Linux下的触摸屏驱动
作者:网络转载 发布时间:[ 2013/1/10 10:03:12 ] 推荐标签:
下面是这个模块加载函数中调用的一个配置端口函数
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);
}
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11