博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
S3C2410触摸屏驱动代码分析3
阅读量:2345 次
发布时间:2019-05-10

本文共 5216 字,大约阅读时间需要 17 分钟。

/*

这段代码完成对刚才得到的y 值进行修正,将结果保存在cheat_diff_y

量中

*/

//y = y - (max + min);

//y = y / (TIMES - 2);

adc_state = 1;

mode_y_axis();

start_adc_y();

/*

开始进行y 坐标的转换,注意此处由start_adc_y()函数引发一次AD

断,开始进行Y 坐标的转换,特别需要注意的是此处adc_state 的值变为1,表示转换的第

二阶段(即Y 坐标转换阶段的开始)。

Y坐标转换的代码是下面的由鲜绿颜色标注的代码

*/

}

}

else if (adc_state == 1)

{ //进行Y 坐标转换,原理同上,自己

分析

if (time == 0)

{

x = 0;

//max = 0;

//min = 0xffffffff;

}

if (time < TIMES)

{

disable_ts_adc();

data[time] = (ADCDAT1 & 0x3ff);

//if (tmp > max) max = tmp;

//if (tmp < min) min = tmp;

//x += tmp;

start_adc_y();

time ++;

}

else

{

for (i = 0; i < TIMES; i++)

{

for (j = 0; j < TIMES - i; j++)

{

if (data[j] > data[j+1])

{

tmp = data[j];

data[j] = data[j+1];

data[j+1] = tmp;

}

}

}

time = 0;

x = 0;

for (i = TIMES / 6; i < TIMES*5/6; i++)

{

x += data[i];

}

x /= (TIMES*2/3);

x &= 0x3ff;

if (cheat < 400)

{

for (i = 0; i < CHEAT_NUMBER; i++)

{

if (x > cheat_x[i])

{

cheat_diff_x = x - cheat_x[i];

}

else

{

cheat_diff_x = cheat_x[i] - x;

}

if (cheat_diff_x < 5)

{

x = cheat_x[i];

break;

}

else if (cheat_x[i] == 0)

{

cheat_x[i] = x;

break;

}

}

}

adc_state = 0;

/*

再次将adc_state 清为0,表示一次转换的结束(包括X 坐标和Y 坐标)。

*/

tsdev.penStatus = PEN_DOWN;

/*

将笔的状态设定为按下

*/

x=1024-x;//only for 240*320!

y=1024-y;//only for 240*320!

/*

将刚才得到的坐标进行转换成LCD 屏上的坐标。

*/

DPRINTK("PEN DOWN: x: %08d, y: %08d\n", y, x);

//printk("PEN DOWN: x: %08d, y: %08d\n", y, x);

wait_up_int();

/*

等待笔从屏上拿起。如果笔从屏上拿起将再次触发触摸屏中断。

*/

tsEvent();

/*

将刚才的结果写入到环形缓冲区中。注意tsEvent 为函数指针,该函数指

针在ts_open()中被定义为:

tsEvent = tsEvent_raw;

所以此处应调用tsEvent_raw()函数。

*/

}

}

}

static void s3c2410_isr_adc(int irq, void *dev_id, struct pt_regs *reg)

{

#if 0

DPRINTK("Occured Touch Screen Interrupt\n");

DPRINTK("SUBSRCPND = 0x%08lx\n", SUBSRCPND);

#endif

spin_lock_irq(&(tsdev.lock));

/*

首先获得触摸屏设备的自旋锁。在一次转换过程中,不允许多个转换的请求发生。

*/

if (tsdev.penStatus == PEN_UP)

s3c2410_get_XY();//进行一次x/y 坐标的转换

#ifdef HOOK_FOR_DRAG

else

s3c2410_get_XY();

#endif

spin_unlock_irq(&(tsdev.lock));

/*

释放这把锁。

*/

}

static void s3c2410_isr_tc(int irq, void *dev_id, struct pt_regs *reg)

{

volatile int i;

#if 0

DPRINTK("Occured Touch Screen Interrupt\n");

DPRINTK("SUBSRCPND = 0x%08lx\n", SUBSRCPND);

#endif

spin_lock_irq(&(tsdev.lock));

/*

首先获得触摸屏设备的锁

*/

/*

由于在ts_open()函数中有如下代码:

tsdev.penStatus = PEN_UP

所以发生中断时执行红颜色相关的代码

*/

if (tsdev.penStatus == PEN_UP) {//处理一次A/D 转换

//for (i = 0; i < 8000; i++)

start_ts_adc();

/*

开始进行第一次触摸屏转换

*/

} else {//处理在同一段时间内多次按下触摸屏

tsdev.penStatus = PEN_UP;

//DPRINTK("PEN UP: x: %08d, y: %08d\n", x, y);

DPRINTK("PEN UP: x: %08d, y: %08d\n", y, x);

wait_down_int();

cheat ++;

tsEvent();

}

spin_unlock_irq(&(tsdev.lock));

}

#ifdef HOOK_FOR_DRAG

static void ts_timer_handler(unsigned long data)

{

spin_lock_irq(&(tsdev.lock));

if (tsdev.penStatus == PEN_DOWN) {

start_ts_adc();

}

spin_unlock_irq(&(tsdev.lock));

}

#endif

static int s3c2410_ts_open(struct inode *inode, struct file *filp)

{

tsdev.head = tsdev.tail = 0;

/*

环形缓冲区的头部和尾部指针分别指向缓冲区队列的头。

*/

tsdev.penStatus = PEN_UP;

/*

笔的状态设定为抬起状态。

*/

#ifdef HOOK_FOR_DRAG

init_timer(&ts_timer);

ts_timer.function = ts_timer_handler;

/*

初始化定时器

*/

#endif

tsEvent = tsEvent_raw;

/*

设置读取环形缓冲区内数据的函数

*/

init_waitqueue_head(&(tsdev.wq));

/*

初始化等待队列

*/

MOD_INC_USE_COUNT;

/*

模块引用数增加1

*/

return 0;

}

static int s3c2410_ts_release(struct inode *inode, struct file *filp)

{

#ifdef HOOK_FOR_DRAG

del_timer(&ts_timer);

//删除定时器

#endif

MOD_DEC_USE_COUNT;

//模块引用数减1

return 0;

}

static struct file_operations s3c2410_fops = {

owner: THIS_MODULE,

open: s3c2410_ts_open,

read:s3c2410_ts_read,

release: s3c2410_ts_release,

#ifdef USE_ASYNC

fasync: s3c2410_ts_fasync,

#endif

poll: s3c2410_ts_poll,

};

void tsEvent_dummy(void) {}

#ifdef CONFIG_PM

static int s3c2410_ts_pm_callback(struct pm_dev *pm_dev, pm_request_t req,

void *data)

{

switch (req) {

case PM_SUSPEND:

tsEvent = tsEvent_dummy;

break;

case PM_RESUME:

tsEvent = tsEvent_raw;

wait_down_int();

break;

}

return 0;

}

#endif

#ifdef CONFIG_DEVFS_FS

static devfs_handle_t devfs_ts_dir, devfs_tsraw;

#endif

static int __init s3c2410_ts_init(void)

{

int ret;

tsEvent = tsEvent_dummy;

/*

tsEvent 为函数指针,指向函数tsEvent_dummy(),不过该函数为空函数,相关定义如

下:

static void (*tsEvent)(void);

……

void tsEvent_dummy(void) {}

*/

ret = register_chrdev(0, DEVICE_NAME, &s3c2410_fops);

if (ret < 0) {

printk(DEVICE_NAME " can't get major number\n");

return ret;

}

tsMajor = ret;

/*

首先调用register_chrdev()函数来进行设备的注册。

DEVICE_NEME 定义为:

#define DEVICE_NAME "s3c2410-ts"

即该设备的节点名为/dev/s3c2410-ts

register_chrdev 函数的第一个实参0,表明该设备的主设备号由系统动态分配,其具体

分配的主设备号可以在文件/proc/devices 文件中查到,然后才可以利用该主设备号用mknod

来创建设备节点。

*/

/* set gpio to XP, YM, YP and YM */

#if 0

set_GPIO_mode(GPIO106_nYPON_MD);

set_GPIO_mode(GPIO105_YMON_MD);

set_GPIO_mode(GPIO104_nXPON_MD);

set_GPIO_mode(GPIO103_XMON_MD);

GPUP(GPIO106_nYPON) |= GPIO_bit(GPIO106_nYPON);

GPUP(GPIO105_YMON) &= GPIO_bit(GPIO105_YMON);

GPUP(GPIO104_nXPON) |= GPIO_bit(GPIO104_nXPON);

GPUP(GPIO103_XMON) &= GPIO_bit(GPIO103_XMON);

#else

set_gpio_ctrl(GPIO_YPON);

set_gpio_ctrl(GPIO_YMON);

set_gpio_ctrl(GPIO_XPON);

set_gpio_ctrl(GPIO_XMON);

/*

设置处理器上GPIO 引脚(触摸屏相关)为触摸屏引脚。set_gpio_ctrl 宏完成相关引脚

的设置,一般完成引脚功能的设置和PULLUP 寄存器的设置。

*/

#endif

/* Enable touch interrupt */

ret = request_irq(IRQ_ADC_DONE, s3c2410_isr_adc, SA_INTERRUPT,

DEVICE_NAME, s3c2410_isr_adc);

/*

注册ADC 中断,其中:

转载地址:http://eznvb.baihongyu.com/

你可能感兴趣的文章
我要学ASP.NET MVC 3.0(十七): MVC 3.0 实例之表格中数据的筛选
查看>>
Displaying a Sorted, Paged, and Filtered Grid of Data in ASP.NET MVC
查看>>
C#中的操作符
查看>>
ADO.NET Ling to Sql 语法
查看>>
ASP.NET MVC 2博客系列之一:强类型HTML辅助方法
查看>>
详解Asp.net MVC DropDownLists
查看>>
Asp.net MVC防止图片盗链的实现方法,通过自定义RouteHandler来操作
查看>>
VS2010的智能提示没有了的可能原因
查看>>
Creating a Cascading Dropdown in ASP.net MVC 3 and jQuery (1)
查看>>
创建联动的 DropdownList in ASP.net MVC 3 and jQuery (2)
查看>>
HTTP触发Jenkins参数化构建(CORS Plugin)
查看>>
来自 Serenity 的 Java 8 的一些使用技巧
查看>>
ubuntu12.04--子进程 已安装 post-installation 脚本 返回了错误号 1
查看>>
系统--电脑开机一声长响
查看>>
系统--A disk read error occurred Press Ctrl+Alt+d...
查看>>
Some projects cannot be imported because they a...
查看>>
ubuntu-android--make: *** [out/host/linux-x86/o...
查看>>
原子变量与synchronized详细解释
查看>>
java.lang.OutOfMemoryError: PermGen space及其解决方法
查看>>
如何让ajaxfileupload.js支持IE9,IE10,并可以传递多个参数?
查看>>