S3C2440驱动篇之触摸屏驱动分析

发布者:superstar11最新更新时间:2024-06-14 来源: elecfans关键字:S3C2440  触摸屏驱动  linux 手机看文章 扫描二维码
随时随地手机看文章
  •     if(ownADC)  

  •     {      //读取一次转换值   

  •         data0 = ioread32(base_addr+S3C2410_ADCDAT0);  

  •         data1 = ioread32(base_addr+S3C2410_ADCDAT1);  

  •   

  •         xp += data0 & S3C2410_ADCDAT0_XPDATA_MASK;  

  •         yp += data1 & S3C2410_ADCDAT1_YPDATA_MASK;  

  •         count++;  

  •   

  •         if(count<(1<<2)) //如果转换次数小于4次,重启AD转换   

  •         {  

  •             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   //如果转换4次,启动1个时间滴答的定时器,最终调用touch_timer_fire功能1或功能3   

  •         {  

  •             mod_timer(&touch_timer,jiffies+1);  

  •             iowrite32(WAIT4INT(1),base_addr+S3C2410_ADCTSC); //置触摸屏等待抬起中断   

  •         }  

  •     }  

  •   

  •     return IRQ_HANDLED;  

  • }  

  •   

  • static int __init s3c2440ts_init(void)  

  • {  

  •     int ret;      

  •   

  •     adc_clk = clk_get(NULL,'adc');  

  •     if(!adc_clk)  

  •     {  

  •         printk(KERN_ERR 'Failed to get adc clockn');  

  •         return -ENOENT;  

  •     }  

  •   

  •     clk_enable(adc_clk);  

  •   

  •     base_addr = ioremap(S3C2410_PA_ADC,0x20);  

  •     if(base_addr==NULL)  

  •     {  

  •         printk(KERN_ERR 'Failed to remap registern');  

  •         ret = -EINVAL;  

  •         goto err_remap;  

  •     }  

  •     //初始化AD转换参数,置触摸屏等待按下中断www.linuxidc.com   

  •     iowrite32(S3C2410_ADCCON_PRSCEN|S3C2410_ADCCON_PRSCVL(0xff),base_addr+S3C2410_ADCCON);  

  •     iowrite32(0xffff,base_addr+S3C2410_ADCDLY);  

  •     iowrite32(WAIT4INT(0),base_addr+S3C2410_ADCTSC);  

  •     //输入设备申请空间,位于include/linux/input.h   

  •     dev = input_allocate_device();  

  •     if(!dev)  

  •     {  

  •         printk(KERN_ERR 'unable to allocate input_devn');  

  •         ret = -ENOMEM;  

  •         goto err_alloc;  

  •     }  

  •   

  •     /*下面初始化输入设备,即给输入设备结构体input_dev的成员设置值。evbit字段用于描述支持的事件, 

  •       这里支持同步事件、按键事件、绝对坐标事件,BIT宏实际就是对1进行位操作,定义在linux/bitops.h中*/  

  •     dev->evbit[0] = BIT(EV_SYN)|BIT(EV_KEY)|BIT(EV_ABS);  

  •     /*keybit字段用于描述按键的类型,在input.h中定义了很多,这里用BTN_TOUCH类型来表示触摸屏的点击*/  

  •     dev->keybit[BITS_TO_LONGS(BTN_TOUCH)] = BIT(BTN_TOUCH);  

  •     /*对于触摸屏来说,使用的是绝对坐标系统。这里设置该坐标系统中X和Y坐标的最小值和最大值(0-1023范围) 

  •          ABS_X和ABS_Y就表示X坐标和Y坐标,ABS_PRESSURE就表示触摸屏是按下还是抬起状态*/  

  •     input_set_abs_params(dev,ABS_X,0,0x3ff,0,0);  

  •     input_set_abs_params(dev,ABS_Y,0,0x3ff,0,0);  

  •     input_set_abs_params(dev,ABS_PRESSURE,0,1,0,0);  

  •   

  •     dev->name = DEVICE_NAME;             /*设备名称*/  

  •     dev->id.bustype = BUS_RS232;         /*总线类型*/  

  •     dev->id.vendor = 0xDEAD;             /*经销商ID号*/  

  •     dev->id.product = 0xBEEF;            /*产品ID号*/  

  •     dev->id.version = S3C2410TSVERSION;  /*版本ID号*/  

  •   

  •     //申请中断,IRQ_ADC为AD、触摸屏共享   

  •     ret = request_irq(IRQ_ADC,stylus_action,IRQF_SHARED|IRQF_SAMPLE_RANDOM,DEVICE_NAME,dev);  

  •     if(ret)  

  •     {  

  •         printk(KERN_ERR 'request IRQ_ADC failn');  

  •         ret = -EINVAL;  

  •         goto err_alloc;  

  •     }  

  •   

  •     ret = request_irq(IRQ_TC,stylus_updown,IRQF_SAMPLE_RANDOM,DEVICE_NAME,dev);  

  •     if(ret)  

  •     {  

  •         printk(KERN_ERR 'requers IRQ_TS failn');  

  •         ret = -EINVAL;  

  •         goto err_adcirq;  

  •     }  

  •   

  •     printk(KERN_INFO '%s successfully loadn',DEVICE_NAME);  

  •   

  •     /*把dev触摸屏设备注册到输入子系统中*/  

  •     input_register_device(dev);  

  •     return 0;  

  •   

  •   

  •   

  • err_adcirq:  

  •     free_irq(IRQ_ADC,dev);  

  •   

  • err_alloc:  

  •     iounmap(base_addr);  

  •   

  • err_remap:  

  •     clk_disable(adc_clk);  

  •     clk_put(adc_clk);  

  •       

  •     return ret;  

  • }  

  •   

  • static void __exit s3c2440ts_exit(void)  

  • {  

  •     disable_irq(IRQ_ADC);  

  •     disable_irq(IRQ_TC);  

  •     free_irq(IRQ_ADC,dev);  

  •     free_irq(IRQ_TC,dev);  

  •   

  •     if(adc_clk);  

  •     {  

  •         clk_disable(adc_clk);  

  •         clk_put(adc_clk);  

  •         adc_clk = NULL;  

  •     }  

  •       

  •     input_unregister_device(dev);  

  •     iounmap(base_addr);  

  • }  

  •   

  • module_init(s3c2440ts_init);  

  • module_exit(s3c2440ts_exit);  

  •   

  • MODULE_LICENSE('GPL');  

  • MODULE_AUTHOR('Zechin Liao');  


  • [1] [2]
    关键字:S3C2440  触摸屏驱动  linux 引用地址:S3C2440驱动篇之触摸屏驱动分析

    上一篇:S3C2440驱动篇之ADC驱动分析
    下一篇:S3C2440裸机实验

    推荐阅读最新更新时间:2024-11-03 12:18

    基于ARM微处理器和Linux的无线气象数据通信系统
    自动气象站数据采集器一般基于单片机或PC/104总线控制器设计,具有与PC兼容性好、功耗低、体积紧凑等特点,然而如何设计出功能强大,网络传输功能强的自动气象站数据采集器,满足现代气象检测的要求,是一个值得研究的课题。 文中基于ARM微处理器和Linux操作系统平台,借助前端无线传感器网络的数据输入,利用嵌入式Qt的开发优势并设计数据通信格式,完成无线气象数据通信系统的设计,实现了数据的可靠传输。为天气预报、科学研究、气象灾害预警等提供实时的气象观测数据。 1 无线气象数据通信系统的基本组成 如图1所示,无线气象数据通信系统主要由无线传感器网络节点、协调器、数据通信器(数据通信器以S3C2440AL为核心)、远程服务器等组成,
    [单片机]
    基于ARM微处理器和<font color='red'>Linux</font>的无线气象数据通信系统
    arm-Linux 编译动态库 简单实例
    本文讲述了一个简单的例子 ,很好的解释了“编译动态库”。 一、准备工作 1.使用oracle VM Virtualbox软件安装Ubuntu虚拟机 2.下载好相关的软件并传输到虚拟机下,安装好交叉编译器。 二、编译应用 该例子以 1.c , 2.c, 2.h组成 1. 代码编辑 下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:2.h,一个.c文件:2.c,我们将这个文件编译成一个动态库:libtest2.so。 在Linux下编辑代码,可以使用vi,也可以使用gedit; 使用degit编辑 2.c, 2.h 如下图所示 然后我们用交叉编译器命令 :(用交叉编译是为了让生
    [单片机]
    arm-<font color='red'>Linux</font> 编译动态库 简单实例
    S3C2440-WDT
    当系统运行受到外部干扰或者系统错误,程序有时会出现跑飞,导致整个系统瘫痪。他会设置一段时间,当超出这段 时间,从程序中跳出进入中断处理程序。WatchDog本质上是一种定时器,那么普通定时器拥有的特性它也应该具备,是的当它计时超时时也会引起事件的发生,只是这个事件除了可以是系统中断外,他也可以是一个系统重启信号(Reset Signal)。可以这么说,能发送系统重启信号的定时器我们就叫它WatchDog。看门狗定时器中断是我们不希望看到的,因此我们要想方设法避免它发生。主要的方法就是在中断发生前,重新对看门狗定时器的寄存器进行赋值,使它的定时器重新开始记时,这种方法俗称喂狗。 S3C2440看门狗定时器的功能: 作为常规时钟,
    [单片机]
    S3C2440-WDT
    S3C2440 FCLK、HCLK、PCLK的配置
    三星官方搭载的wince系统的FLCK值为400MHz,HCLK值为100MHz、PCLK值为50MHz。那么这些值通过什么方法计算出来呢?大概过程如下,这些值在外部晶振12MHz的基础上通过PLL的作用倍频到我们需要的核心频率如400MHz,由于该频率过高,需要通过对预分频器进行适当的设置获取外围设备能够正常工作的频率如HCLK 100MHz、PLCK 50MHz。 在这里有必要说明FCLK、HCLK、PCLK的含义,FCLK为内核时钟,HCLK为总线时钟(包括USB时钟),PCLK为I/O接口时钟(如常用的SPI、I2C、UART的时钟配置都是通过PCLK时钟为基准的)。 在WINCE6.0 BSP中,设置MPLLCON与设置
    [单片机]
    <font color='red'>S3C2440</font> FCLK、HCLK、PCLK的配置
    【嵌入式】arm-linux-gcc/ld/objcopy/objdump参数概述
    arm-linux-gcc   -o 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件   -Wall 指定产生全部的警告信息   -O2 编译器对程序提供的编译优化选项,在编译的时候使用该选项,可以使生成的执行文件的执行效率提高   -c 表示只要求编译器进行编译,而不要进行链接,生成以源文件的文件名命名但把其后缀由 .c 或 .cc 变成 .o 的目标文件   -S 只激活预处理和编译,就是指把文件编译成为汇编代码 arm-linux-ld   直接指定代码段,数据段,BSS段的起始地址 -Ttest startaddr -Tdata startaddr -Tbss startaddr
    [单片机]
    如何将lua移植到arm平台的linux内核
    将脚本移植到内核是一件很酷的事情,lua已经被移植到NetBSD的内核中,也有一个叫lunatik的项目把lua移植到了linux内核,只可惜只支持x86,不支持arm,在网上搜索了下,没有找到现成的,于是自己研究了下,现将它分享出来。 移植到arm平台,主要是要重新实现setjmp和longjmp两个函数,网上相关的资料很少,最后终于找到一个klibc的项目,里面有setmp和longjmp的arm平台的实现,于是直接拿来用了,不用说,当看到脚本在内核中执行并打印出 hello,world 的时候,还是很exciting的。这里讲下使用的方法,具体的代码可以去下面的位置下载: https://github.com/
    [单片机]
    基于ATM9TDMI+Linux的SOHO 路由器设计方案
      0 引言   当前SOHO 路由器设计,采用ARM7TDMI+μClinux 设计架构,ARM7 内核微处理器工作频率为50M 左右,而以太网控制芯片工作频率一般为100M,处理器速度难以满足高速接入网用户要求;μClinux 操作系统,不具有内存保护机制,任何程序都有可能导致内核崩溃,系统稳定性较差。本文采用ARM920T 内核微处理器,工作频率200M,足以满足高速接入网用户要求,它具有先进的MMU 体系结构,支持WinCE、EPOC32、Linux 操作系统。Linux 操作系统,具有内存保护机制和强大的网络控制功能,能防止恶意程序对系统的破坏并实现*滤防火墙,有效地提高了系统的稳定性和安全性。   1 SOHO 路
    [单片机]
    基于ATM9TDMI+<font color='red'>Linux</font>的SOHO 路由器设计方案
    小广播
    设计资源 培训 开发板 精华推荐

    最新单片机文章
    何立民专栏 单片机及嵌入式宝典

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

     
    EEWorld订阅号

     
    EEWorld服务号

     
    汽车开发圈

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