datasheet

Tiny210触摸屏之触摸屏控制器驱动

2018-10-12来源: eefocus 关键字:Tiny210  触摸屏  控制器驱动

tiny_ts.c驱动源码:

#include "linux/errno.h"

#include "linux/kernel.h"

#include "linux/module.h"

#include "linux/slab.h"

#include "linux/input.h"

#include "linux/init.h"

#include "linux/serio.h"

#include "linux/delay.h"

#include "linux/platform_device.h"

#include "linux/clk.h"

#include "asm/io.h"

#include "asm/irq.h"

#include "asm/plat-s3c24xx/ts.h"

#include "asm/arch/regs-adc.h"

#include "asm/arch/regs-gpio.h"

#define MHZ (1000*1000)

#define PRINT_MHZ(m)             ((m) / MHZ), ((m / 1000) % 1000)

struct tiny_ts_regs {

    unsigned long tsadccon1;

    unsigned long tscon1;

    unsigned long tsdly1;

    unsigned long tsdatx1;

    unsigned long tsdaty1;

    unsigned long tspenstat1;

    unsigned long clrintadc1;

    unsigned long reserved;

    unsigned long clrintpen1;

};

static struct input_dev *tiny_ts_dev;

static volatile struct tiny_ts_regs *tiny_ts_regs;

static unsigned long *tsadccon0;

static struct timer_list ts_timer;

static void enter_wait_pen_down_mode(void)

{

    tiny_ts_regs->tscon1 = 0xd3;

}

static void enter_wait_pen_up_mode(void)

{

    tiny_ts_regs->tscon1 = 0x1d3;

}

static void enter_measure_xy_mode(void)

{

    tiny_ts_regs->tscon1 = (1<<3)|(1<<2);

}

static void start_adc(void)

{

    tiny_ts_regs->tsadccon1 |= (1<<0);

}

static int tiny_filter_ts(int x[], int y[])

{

#define ERR_LIMIT 10

    int avr_x, avr_y;

    int det_x, det_y;

    avr_x = (x[0] + x[1])/2;

    avr_y = (y[0] + y[1])/2;

    det_x = (x[2] > avr_x) ? (x[2] - avr_x) : (avr_x - x[2]);

    det_y = (y[2] > avr_y) ? (y[2] - avr_y) : (avr_y - y[2]);

    if ((det_x > ERR_LIMIT) || (det_y > ERR_LIMIT))

        return 0;

    avr_x = (x[1] + x[2])/2;

    avr_y = (y[1] + y[2])/2;

    det_x = (x[3] > avr_x) ? (x[3] - avr_x) : (avr_x - x[3]);

    det_y = (y[3] > avr_y) ? (y[3] - avr_y) : (avr_y - y[3]);

    if ((det_x > ERR_LIMIT) || (det_y > ERR_LIMIT))

        return 0;

    

    return 1;

}

static void tiny_ts_timer_function(unsigned long data)

{

    if (tiny_ts_regs->tsdatx1 & (1<<15))

    {

        // 已经松开 

        input_report_abs(s3c_ts_dev, ABS_PRESSURE, 0);

        input_report_key(s3c_ts_dev, BTN_TOUCH, 0);

        input_sync(s3c_ts_dev);

        enter_wait_pen_down_mode();

    }

    else

    {

        // 测量X/Y坐标 

        enter_measure_xy_mode();

        start_adc();

    }

}

static irqreturn_t pen_down_up_irq(int irq, void *dev_id)

{

    if (tiny_ts_regs->tsdatx1 & (1<<15))

    {

        //printk("pen up\n");

        input_report_abs(s3c_ts_dev, ABS_PRESSURE, 0);

        input_report_key(s3c_ts_dev, BTN_TOUCH, 0);

        input_sync(s3c_ts_dev);

        enter_wait_pen_down_mode();

    }

    else

    {

        //printk("pen down\n");

        //enter_wait_pen_up_mode();

        enter_measure_xy_mode();

        start_adc();

    }

    return IRQ_HANDLED;

}

static irqreturn_t adc_irq(int irq, void *dev_id)

{

    static int cnt = 0;

    static int x[4], y[4];

    int adcdat0, adcdat1;

    

    // 优化措施2: 如果ADC完成时, 发现触摸笔已经松开, 则丢弃此次结果 

    adcdat0 = tiny_ts_regs->tsdatx1;

    adcdat1 = tiny_ts_regs->tsdaty1;

    if (tiny_ts_regs->tsdatx1 & (1<<15))

    {

        // 已经松开 

        cnt = 0;

        input_report_abs(s3c_ts_dev, ABS_PRESSURE, 0);

        input_report_key(s3c_ts_dev, BTN_TOUCH, 0);

        input_sync(s3c_ts_dev);

        enter_wait_pen_down_mode();

    }

    else

    {

        // printk("adc_irq cnt = %d, x = %d, y = %d\n", ++cnt, adcdat0 & 0x3ff, adcdat1 & 0x3ff);

        // 优化措施3: 多次测量求平均值 

        x[cnt] = adcdat0 & 0x3ff;

        y[cnt] = adcdat1 & 0x3ff;

        ++cnt;

        if (cnt == 4)

        {

            // 优化措施4: 软件过滤 

            if (tiny_filter_ts(x, y))

            {            

                //printk("x = %d, y = %d\n", (x[0]+x[1]+x[2]+x[3])/4, (y[0]+y[1]+y[2]+y[3])/4);

                input_report_abs(s3c_ts_dev, ABS_X, (x[0]+x[1]+x[2]+x[3])/4);

                input_report_abs(s3c_ts_dev, ABS_Y, (y[0]+y[1]+y[2]+y[3])/4);

                input_report_abs(s3c_ts_dev, ABS_PRESSURE, 1);

                input_report_key(s3c_ts_dev, BTN_TOUCH, 1);

                input_sync(s3c_ts_dev);

            }

            cnt = 0;

            enter_wait_pen_up_mode();

            // 启动定时器处理长按/滑动的情况 

            mod_timer(&ts_timer, jiffies + HZ/100);

        }

        else

        {

            enter_measure_xy_mode();

            start_adc();

        }        

    }

    

    return IRQ_HANDLED;

}

static int s3c_ts_init(void)

{

    struct clk* clk;

    

    // 1. 分配一个input_dev结构体 

    tiny_ts_dev = input_allocate_device();

    // 2. 设置 

    // 2.1 能产生哪类事件 

    set_bit(EV_KEY, tiny_ts_dev->evbit);

    set_bit(EV_ABS, tiny_ts_dev->evbit);

    // 2.2 能产生这类事件里的哪些事件 

    set_bit(BTN_TOUCH, tiny_ts_dev->keybit);

    input_set_abs_params(tiny_ts_dev, ABS_X, 0, 0x3FF, 0, 0);

    input_set_abs_params(tiny_ts_dev, ABS_Y, 0, 0x3FF, 0, 0);

    input_set_abs_params(tiny_ts_dev, ABS_PRESSURE, 0, 1, 0, 0);

    // 3. 注册 

    input_register_device(tiny_ts_dev);

    // 4. 硬件相关的操作 

    // 4.1 使能时钟(CLKCON[15]) 

    clk = clk_get(NULL, "adc");

    if (!clk || IS_ERR(clk)) {

        printk(KERN_INFO "failed to get adc clock source\n");

    }

    clk_enable(clk);

    printk("Tiny_TS clock got enabled :: %ld.ld Mhz\n", PRINT_MHZ(clk_get_rate(tiny_clk)));

    // 4.2 设置S3C2440的ADC/TS寄存器 

[1] [2]

关键字:Tiny210  触摸屏  控制器驱动

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/2018/ic-news101241698.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:Tiny210触摸屏之一线触摸屏驱动
下一篇:最后一页

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

新型Silicon Labs Tiny Gecko MCU有效延长 IoT连接设备电池寿命

中国,北京-2018年3月8日-Silicon Labs(亦称“芯科科技”,NASDAQ:SLAB)扩展其广受欢迎的EFM32™ Tiny Gecko微控制器(MCU)系列产品,旨在满足开发人员进行下一代安全、电池供电型物联网(IoT)连接设备的设计需求。Silicon Labs新型EFM32TG11 Tiny Gecko MCU为需要长电池寿命的设备提供了低成本的超低功耗解决方案,且不会减弱功能和降低安全性。Tiny Gecko 11 MCU是智能电表、个人医疗设备和家庭自动化产品的理想选择,这些产品通常具有多个传感器、本地显示和触摸控制。新型MCU可在IoT设计中作为独立微控制器或搭配网络协处理器使用,这为开发人员提供了出色
发表于 2018-03-09
新型Silicon Labs Tiny Gecko MCU有效延长 IoT连接设备电池寿命

Tiny6410 交叉编译helloworld程序

在工作目录下建立helloworld.c文件 #include <stdio.h>  main()  {      printf("helloworld!\n");  }  保存关闭后。 编译helloworld文件: root@snail:/home/workdir/qt/project/helloworld# arm-linux-gcc helloworld.c -o hellow
发表于 2017-01-12
Tiny6410 交叉编译helloworld程序

Tiny6410 设备驱动之helloworld

;  //模块初始化  static int __init hello_init(void)  {      printk(KERN_ALERT "Hello world!\n");      return 0;  }  //模块退出  static void  __exit 
发表于 2017-01-12
Tiny6410 设备驱动之helloworld

Tiny6410 LED字符设备驱动

; #define LED_3_OFF   7  #define LED_4_ON    8  #define LED_4_OFF   9       static int led_open (struct inode *inode,struct file *filp)    
发表于 2017-01-12
Tiny6410 LED字符设备驱动

瑞萨单片机教程之R8C/Tiny

第二节  Tiny系列 1.1  Tiny系列     瑞萨正在拓展在SuperH、M16C、H8、H8S等瑞萨所提供的高性能MCU各族及各系列上安装了闪存的品种,该产品群多达28类,品种超过了200种,想必也只有瑞萨能拥有如此之多的闪存MCU产品。在这些瑞萨的闪存MCU中,内置高性能内核与闪存,同时实现少引脚和小型封装的单芯片MCU,就是“Tiny系列”。 8〜32位齐全的Tiny系列(Tiny的定位图) Tiny系列拥有以下众多优点。 ① 高性能CPU(16位、32位)、小型化的20〜80引脚的少引脚封装
发表于 2016-05-17

S3C6410,Tiny6410,Mini6410,MoblieDDR内存驱动

0   扩展内存命令 [22] (见下表)   芯片号 [21:20] 映射到外部存储芯片地址的位   命令 [19:18] 具体命令(见下表)   Bank地址 [17:16] 当以MRS或EMRS命令访问时,映射到外部存储器的Bank地址位  
发表于 2016-04-26
S3C6410,Tiny6410,Mini6410,MoblieDDR内存驱动

小广播

何立民专栏

单片机及嵌入式宝典

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

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