实例:触摸屏驱动-2.用input子系统报告事件 分类: linux_内核_input模型 2013-07-10 09:39 327人阅读 评论(0) 收藏
2013-07-10 09:39
741 查看
触摸屏驱动-2.用input子系统报告事件 2010-10-24
18:05:15
分类: LINUX
插入生成的ko文件后,会生成文件/dev/event0。
手指在触摸屏压下或抬起时,LED亮或灭,执行命令"read_ts /dev/event0"可在终端打印触摸屏的状态。
驱动代码如下:
应用测试文件read_ts.c代码如下:
18:05:15
分类: LINUX
插入生成的ko文件后,会生成文件/dev/event0。
手指在触摸屏压下或抬起时,LED亮或灭,执行命令"read_ts /dev/event0"可在终端打印触摸屏的状态。
驱动代码如下:
#include <linux/module.h> #include <linux/init.h> #include <linux/ioport.h> #include <linux/interrupt.h> #include <linux/input.h> #include <asm/io.h> #include <asm/arch/regs-gpio.h> MODULE_LICENSE("GPL"); MODULE_AUTHOR("zhanglong"); struct touchscreen { unsigned long adccon, adctsc, adcdly, adcdat0, adcdat1, adcupdn; struct clk *ts_clk; int down; void (*wait4irq)(struct touchscreen *, int); //set ts in wait-for-irq mode int (*isdown)(struct touchscreen *); //check stylus down or not struct input_dev dev; }; unsigned long ts_virt; struct touchscreen s3c2440_ts; void s3c2440_ts_wait4irq(struct touchscreen *ts, int down) { if (down) { iowrite32( 0x3 | ( 1 << 4) | ( 1 << 6) | (1 << 7) , ts->adctsc); } else { iowrite32( 0x3 | ( 1 << 4) | ( 1 << 6) | (1 << 7) | (1 << 8) , ts->adctsc); } } int s3c2440_ts_isdown(struct touchscreen *ts) { int down; down = ioread32(ts->adcupdn); iowrite32(0, ts->adcupdn); return (down & 1); } irqreturn_t s3c2440_tstc_handle(int irq, struct touchscreen *ts) { if(IRQ_TC == irq) { if(ts->isdown(ts)) { //stylus down ts->wait4irq(ts, 0); input_report_abs(&ts->dev, ABS_PRESSURE, 1); s3c2410_gpio_setpin(S3C2410_GPF4, 0); //LED on } else { //stylus up ts->wait4irq(ts, 1); input_report_abs(&ts->dev, ABS_PRESSURE, 0); input_sync(&ts->dev); s3c2410_gpio_setpin(S3C2410_GPF4, 1); //LED off } } return IRQ_HANDLED; } int test_init(void) { int ret; ret = request_mem_region(0x58000000, 0x1000, "s3c2440-ts"); if(NULL == ret) { printk("request_mem_region failed .\n"); ret = -EBUSY; goto err0; } ts_virt = ioremap(0x58000000, 0x1000); s3c2440_ts.down = 0; s3c2440_ts.adccon = ts_virt; s3c2440_ts.adctsc = ts_virt + 0x04; s3c2440_ts.adcdly = ts_virt + 0x08; s3c2440_ts.adcdat0 = ts_virt + 0x0c; s3c2440_ts.adcdat1 = ts_virt + 0x10; s3c2440_ts.adcupdn = ts_virt + 0x14; //--- s3c2440_ts.wait4irq = s3c2440_ts_wait4irq; s3c2440_ts.isdown = s3c2440_ts_isdown; ret = request_irq(IRQ_TC, s3c2440_tstc_handle, 0, "s3c2440-ts", &s3c2440_ts); if(0 != ret) { printk("request irq[1] failed .\n"); ret = -EBUSY; goto err1; } s3c2440_ts.ts_clk = clk_get(NULL, "adc"); clk_use(s3c2440_ts.ts_clk); clk_enable(s3c2440_ts.ts_clk); s3c2440_ts.wait4irq(&s3c2440_ts, 1); s3c2440_ts.dev.evbit[0] = BIT(EV_ABS) | BIT(EV_SYN); input_set_abs_params(&s3c2440_ts.dev, ABS_PRESSURE, 0, 1, 0, 0); input_register_device(&s3c2440_ts.dev); return 0; err1: iounmap(ts_virt); release_mem_region(0x58000000, 0x1000); err0: return ret; } void test_exit(void) { input_unregister_device(&s3c2440_ts.dev); free_irq(IRQ_TC, &s3c2440_ts); clk_disable(s3c2440_ts.ts_clk); clk_unuse(s3c2440_ts.ts_clk); clk_put(s3c2440_ts.ts_clk); iounmap(ts_virt); release_mem_region(0x58000000, 0x1000); } module_init(test_init); module_exit(test_exit); |
#include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <linux/input.h> int main(int argc, char **argv) { int fd; struct input_event evt; if (argc < 2) { printf("Usage: %s <file>\n", argv[0]); return 0; } fd = open(argv[1], O_RDWR); if (fd < 0) { perror("open failed.\n"); return 0; } while(1) { read(fd, &evt, sizeof(struct input_event)); switch(evt.type) { case EV_ABS: printf("touch screen: "); if (evt.code == ABS_X) { printf("X: %d\n", evt.value); } else if (evt.code == ABS_Y) { printf("Y: %d\n", evt.value); } else if (evt.code == ABS_PRESSURE) { char *s; s = evt.value == 0 ? "up\n" : "down\n"; printf(s); } break; case EV_SYN: printf("-------------------------\n"); break; } } close(fd); return 0; } |
相关文章推荐
- bus, device, driver之间是怎么一回事,继续 分类: linux_内核_设备模型 2013-07-10 09:35 234人阅读 评论(0) 收藏
- 《LINUX3.0内核源代码分析》第二章:中断和异常 分类: linux_内核_中断 2013-07-10 14:44 502人阅读 评论(0) 收藏
- 实例:触摸屏驱动-2.用input子系统报告事件
- 《LINUX3.0内核源代码分析》第二章:中断和异常(2) 分类: linux_内核_中断 2013-07-10 14:46 347人阅读 评论(0) 收藏
- WatchDog 分类: linux_内核_字符设备 2013-07-10 09:42 256人阅读 评论(0) 收藏
- linux中断机制 分类: linux_内核_中断 2013-07-10 14:43 453人阅读 评论(0) 收藏
- Linux netstat命令详解 分类: ubuntu 测试 2013-07-10 13:53 198人阅读 评论(0) 收藏
- V4L2驱动的移植与应用(三) 分类: arm-linux-Ubuntu 2013-08-16 08:41 473人阅读 评论(0) 收藏
- OTG驱动分析(二) 分类: arm-linux-Ubuntu USB OTG驱动 2015-06-02 17:34 319人阅读 评论(0) 收藏
- linux input输入子系统分析《三》:S3C2440的触摸屏驱动实例
- Linux 下的Bluetooth 架构 分类: Android驱动 2012-03-16 11:07 492人阅读 评论(0) 收藏 举报 实战Linux Bluetooth编程(一) 协议栈概述
- 裁剪Ubuntu内核和模块管理2 分类: arm-linux-Ubuntu 2013-07-22 16:29 257人阅读 评论(0) 收藏
- linux input输入子系统分析《三》:S3C2440的触摸屏驱动实例
- linux下驱动模块化编译,动态加载以及卸载 分类: arm-linux-Ubuntu 2015-05-30 16:24 172人阅读 评论(0) 收藏
- 编译、裁剪、安装、删除 Ubuntu内核和模块管理 分类: arm-linux-Ubuntu 2013-07-22 16:29 319人阅读 评论(0) 收藏
- Linux 下的Bluetooth 架构 分类: Android驱动 2012-03-16 11:07 492人阅读 评论(0) 收藏 举报 实战Linux Bluetooth编程(一) 协议栈概述
- ubuntu下动态链接库的编译和使用实例 分类: arm-linux-Ubuntu 2013-07-22 16:29 272人阅读 评论(0) 收藏
- Davinci DM6446开发攻略——LINUX GPIO驱动源码移植 分类: DSP 2013-07-22 16:30 381人阅读 评论(0) 收藏
- linux input输入子系统分析《三》:S3C2440的触摸屏驱动实例
- linux input输入子系统分析《三》:S3C2440的触摸屏驱动实例