基于mini2440触摸屏驱动

发布者:和谐共融最新更新时间:2024-06-28 来源: elecfans关键字:mini2440  触摸屏驱动 手机看文章 扫描二维码
随时随地手机看文章

驱动路径:drivers/input/touchscreen/s3c2410_ts.c

在static int __init s3c2410ts_init(void)函数中注册了两个中断

1.if (request_irq(IRQ_ADC, stylus_action, IRQF_SHARED|IRQF_SAMPLE_RANDOM,
  's3c2410_action', dev))

2.if (request_irq(IRQ_TC, stylus_updown, IRQF_SAMPLE_RANDOM,
   's3c2410_action', dev))

中断处理函数stylus_action和stylus_updown。当点击触摸屏时进入该函数,在该函数中启动ad转换,转换完成就触发中断进入stylus_action在stylus_action中读取数据。

首先来看一下stylus_updown函数 

 

  1. static irqreturn_t stylus_updown(int irq, void *dev_id)   

  2. {   

  3.     unsigned long data0;   

  4.     unsigned long data1;   

  5.     int updown;   

  6.   

  7.     if (down_trylock(&ADC_LOCK) == 0) {      //判断是否adc可用,down_trylock可以用来获取信号量,不会休眠   

  8.         OwnADC = 1;   

  9.         data0 = ioread32(base_addr+S3C2410_ADCDAT0);   

  10.         data1 = ioread32(base_addr+S3C2410_ADCDAT1);   

  11.   

  12.         updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN));   

  13.   

  14.         if (updown) {   //判断触摸屏是否按下   

  15.             touch_timer_fire(0);  //启动adc   

  16.         } else {   

  17.             OwnADC = 0;   

  18.             up(&ADC_LOCK);   

  19.         }   

  20.     }   

  21.   

  22.     return IRQ_HANDLED;   

  23. }  


下面开一下touch_timer_fire是怎么个玩法

  1. static void touch_timer_fire(unsigned long data)   

  2. {   

  3.     unsigned long data0;   

  4.     unsigned long data1;   

  5.     int updown;   

  6.   

  7.     data0 = ioread32(base_addr+S3C2410_ADCDAT0);   

  8.     data1 = ioread32(base_addr+S3C2410_ADCDAT1);   

  9.   

  10.     updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN));   

  11.   

  12.     if (updown) {  //判断现在是否还按下   

  13.         if (count != 0) {   //采样完成,count的值我下面会讲解   

  14.             long tmp;   

  15.                                                                                         //应为是240×320,需要x,y调换一下            

  16.             tmp = xp;   

  17.             xp = yp;   

  18.             yp = tmp;   

  19.                                                                                  //在stylus_action中取得是连续四次采样的结果需要处以4                   

  20.                         xp >>= 2;   

  21.                         yp >>= 2;   

  22.   

  23.             input_report_abs(dev, ABS_X, xp); //x,y坐标报告   

  24.             input_report_abs(dev, ABS_Y, yp);   

  25.   

  26.             input_report_key(dev, BTN_TOUCH, 1);   

  27.             input_report_abs(dev, ABS_PRESSURE, 1);   

  28.             input_sync(dev);  //同步   

  29.         }   

  30.   

  31.         xp = 0;   //否则开始采用   

  32.         yp = 0;   

  33.         count = 0;   

  34.   

  35.         iowrite32(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, base_addr+S3C2410_ADCTSC);   

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

  37.     } else {   //是否抬起   

  38.         count = 0;   

  39.   

  40.         input_report_key(dev, BTN_TOUCH, 0);   

  41.         input_report_abs(dev, ABS_PRESSURE, 0);   

  42.         input_sync(dev);   

  43.   

  44.         iowrite32(WAIT4INT(0), base_addr+S3C2410_ADCTSC);   

  45.         if (OwnADC) {   

  46.             OwnADC = 0;   

  47.             up(&ADC_LOCK);   

  48.         }   

  49.     }   

  50. }  


注意:当第一次按下时,count==0,启动ad,当转换完成将触发中断,进入stylus_action中断处理函数,好家伙来看一下哦

  1. static irqreturn_t stylus_action(int irq, void *dev_id)   

  2. {   

  3.     unsigned long data0;   

  4.     unsigned long data1;   

  5.   

  6.     if (OwnADC) {   

  7.         data0 = ioread32(base_addr+S3C2410_ADCDAT0);   

  8.         data1 = ioread32(base_addr+S3C2410_ADCDAT1);   

  9.   

  10.         xp += data0 & S3C2410_ADCDAT0_XPDATA_MASK;   

  11.         yp += data1 & S3C2410_ADCDAT1_YPDATA_MASK;   

  12.         count++;   

  13.   

  14.         if (count < (1<<2)) {  //如果小于4,继续启动adc   

  15.             iowrite32(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, base_addr+S3C2410_ADCTSC);   

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

  17.         } else {  //已经采样了4次,等待1ms后调用touch_timer函数。   

  18.             mod_timer(&touch_timer, jiffies+1);   

  19.             iowrite32(WAIT4INT(1), base_addr+S3C2410_ADCTSC);   

  20.         }   

  21.     }   

  22.   

  23.     return IRQ_HANDLED;   

  24. }  


接下来就得看一下touch_timer在忙些什么请看招。。。。。。。。。。。

static struct timer_list touch_timer =
  TIMER_INITIALIZER(touch_timer_fire, 0, 0); 重新初始化


关键字:mini2440  触摸屏驱动 引用地址:基于mini2440触摸屏驱动

上一篇:关于S3C2440的串口号
下一篇:Uncompressing Linux...done, booting the kernel解决办法

推荐阅读最新更新时间:2026-03-20 15:05

mini2440触摸屏驱动----非input子系统实现方法
触摸屏的驱动程序在不是使用input子系统的实现过程中,其实和普通的字符设备驱动没有太大的差别,只要按照触摸屏那几个步骤正常进行就可以。 ①s3c2410_ts_init函数,这是整个程序的入口处。实现了各类初始化的作用。 /*设备初始化函数*/ static int __init s3c2410_ts_init(void) { int ret; tsEvent = tsEvent_dummy; /* 注册字符设备 第一个参数为0表示自动分配 */ ret = register_chrdev(0, DEVICE_NAME, &s3c2410_fops); //普通的注册失败判
[单片机]
如何添加触摸屏驱动到TouchGFX中?
使用STM32CubeMX移植TouchGFX一文中介绍了如何用TouchGFX点亮屏幕,但是此时屏幕还没有触摸的功能。下面将介绍如何添加触摸屏驱动到TouchGFX中 1. STM32CubeMX配置 在使用STM32CubeMX移植TouchGFX文中的STM32CubeMX配置基础上,再激活一个定时器,用来给IIC通信提供微秒(us)延时。本文通过软件来模拟IIC通信,因此不使用STM32CubeMX来进行IIC配置 2.KEIL中添加触摸芯片驱动 本文中的RGB (800 * 480)屏触摸驱动IC为FT5206芯片,该驱动芯片通过 4 根线与外部连接:CT_RST(PI8), CT_INT(PH7), CT_
[单片机]
如何添加<font color='red'>触摸屏</font><font color='red'>驱动</font>到TouchGFX中?
STM32:编写XPT2046电阻触摸屏驱动(模拟SPI)
一、环境介绍 单片机采用: STM32F103ZET6 编程软件: keil5 编程语言: C语言 编程风格: 寄存器开发. 目标芯片: XPT2046---标准SPI接口时序 二、XPT2046芯片介绍 2.1 功能 XPT2046是一颗12位的ADC芯片,可以当做普通的ADC芯片使用,但是一般都是用在电阻触摸屏上,方便定位触摸屏坐标。 图1: XPT2046内部原理图 图2:电阻触摸屏---引出的4条线就接在XPT2046的YNXNYPXP上 (XPT2046支持笔中断输出--低电平有效,这个引脚可以配置到单片机的中断脚上,或者轮询判断这个引脚状态,判断触摸屏是否已经按下) 可以单独买一个触摸屏+一个XPT2
[单片机]
STM32:编写XPT2046电阻<font color='red'>触摸屏</font><font color='red'>驱动</font>(模拟SPI)
S3C2440触摸屏驱动实例开发讲解
一、开发环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand, Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2 二、前提知识 1、Linux输入子系统(Input Subsystem): 在Linux中,输入子系统是由输入子系统设备驱动层、输入子系统核心层(Input Core)和输入子系统事件处理层(Event Handler)组成。其中设备驱动层提供对硬件各寄存器的读写访问和将底层硬件对用户输入访问的响应转换为标准的输入事件,再通过核心层提交给事件处理 层;而核心层对下提供了设备驱动层的编程接口,对上又提供了事件处理层的编程接口;而事件处理层
[单片机]
S3C2440<font color='red'>触摸屏</font><font color='red'>驱动</font>实例开发讲解
Linux驱动学习笔记之触摸屏驱动
触摸屏归纳为输入子系统,这里主要是针对电阻屏,其使用过程如下 当用触摸笔按下时,产生中断。 在中断处理函数处理函数中启动ADC转换x,y坐标。 ADC结束,产生ADC中断 在ADC中断处理函数里上报(input_event)启动定时器 再次启动定时器(可以处理滑动、长按) 松开按键 其驱动程序的写法和之前写输入子系统的写法基本上一致。 写出入口函数,出口函数并加以修饰,加入相关头文件,然后开始完善各函数,在入口函数中分配input_dev结构体,设置(能产生哪类事件,能产生这类事件中的哪些事件),注册设备,硬件相关的操作等。出口函数中主要对之前注册、分配的一些资源进行释放。 还应根据2440数据手册ADC转换和触摸屏那一章,对
[单片机]
了解S3C2440触摸屏驱动的原理及其应用
一、开发环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand, Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2 二、前提知识 1、Linux输入子系统(Input Subsystem): 在Linux中,输入子系统是由输入子系统设备驱动层、输入子系统核心层(Input Core)和输入子系统事件处理层(Event Handler)组成。其中设备驱动层提供对硬件各寄存器的读写访问和将底层硬件对用户输入访问的响应转换为标准的输入事件,再通过核心层提交给事件处理层;而核心层对下提供了设备驱动层的编程接口,对上又提供了事件处理层的编程接口;而事件处理层就为我们用
[单片机]
了解S3C2440<font color='red'>触摸屏</font><font color='red'>驱动</font>的原理及其应用
S3C2410触摸屏驱动代码分析1
/* * s3c2410-ts.c * * touchScreen driver for SAMSUNG S3C2410 * * Author: Janghoon Lyu nandy@mizi.com * Date : $Date: 2002/06/04 07:11:00 $ * * $Revision: 1.1.2.6 $ * * Based on pt036001b-ts.c * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main dir
[单片机]
S3C2410触摸屏驱动代码分析2
#define mode_x_axis_n() { ADCTSC = XP_EXTVLT | XM_GND | YP_AIN | YM_HIZ | XP_PULL_UP_DIS | XP_PST(NOP_MODE); } /*基本配置和上面相同,就是不进行x 坐标的转换*/ #define mode_y_axis() { ADCTSC = XP_AIN | XM_HIZ | YP_EXTVLT | YM_GND | XP_PULL_UP_DIS | XP_PST(Y_AXIS_MODE); } /*对Y 坐标开始进行测量 */ #define start_adc_x() { ADCCON = PRESCALE_EN | PR
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved