mini2440 简单touch screen驱动程序

发布者:Wanderlust123最新更新时间:2022-10-13 来源: csdn关键字:mini2440  touch  screen  驱动程序 手机看文章 扫描二维码
随时随地手机看文章

模块加载后打印出水平和垂直方向的ad转换结果,没有做坐标的转换,只为学习一下touch screen接口的编程方法,代码记录如下:


#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

 

#include

#include

 

static struct input_dev *ts_dev; //定时器用于处理长按和滑动

 

static struct ts_regs_t{

unsigned long adccon;

unsigned long adctsc;

unsigned long adcdly;

unsigned long adcdat0;

unsigned long adcdat1;

unsigned long adcupdn;

};

static volatile struct ts_regs_t *ts_regs;

static volatile unsigned long *clkcon;

static struct clk *adc_clk;

static struct timer_list ts_timer;

 

void enable_adc_clock(void){

(*clkcon) |= (1<<15);

}

 

void enter_wait4down_mode(void){

ts_regs->adctsc = 0xd3; //等待中断模式,检测触摸屏按下

}

 

void enter_wait4up_mode(void){

ts_regs->adctsc = 0x1d3; //等待中断模式,检测触摸屏松开

}

 

//进入测量xy坐标的工作模式

void enter_measure_xy_mode(void){

ts_regs->adctsc = (1<<3)|(1<<2);

}

 

//启动ac转换

void start_adc(void){

ts_regs->adccon |= (1<<0);

}

 

//adc中断处理函数

static irqreturn_t grh_handle_adc_irq(int irq, void *dev_id){

static int adc_count = 0;

static int xv=0, yv=0;

 

if(ts_regs->adcdat0 & (1<<15)){

enter_wait4down_mode();

adc_count = 0;

xv = yv = 0;

}

else{ //多次取值取平均值

if(adc_count == 4){

printk(KERN_EMERG"count=%d x=%d y=%dr", adc_count, xv>>2, yv>>2);

 

//上报事件

input_report_abs(ts_dev, ABS_X, xv>>2);

input_report_abs(ts_dev, ABS_Y, yv>>2);

input_report_abs(ts_dev, ABS_PRESSURE, 1);

input_report_key(ts_dev, BTN_TOUCH, 1);

input_sync(ts_dev);

adc_count = 0;

xv = yv = 0;

enter_wait4up_mode();

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

}

else{

adc_count ++;

xv += (ts_regs->adcdat0)&0x3ff;

yv += (ts_regs->adcdat1)&0x3ff;

enter_measure_xy_mode();

start_adc();

}

}

return IRQ_HANDLED;

}

 

 

//tc中断处理函数

static irqreturn_t grh_handle_tc_irq(int irq, void *dev_id){

if(ts_regs->adcdat0 & (1<<15)){

//printk(KERN_EMERG"pen up!n");

enter_wait4down_mode();

}

else{

//printk(KERN_EMERG"pen downn");

//enter_wait4up_mode();

enter_measure_xy_mode();

start_adc();

}

return IRQ_HANDLED;

}

 

//定时器超时处理函数

static void grh_handle_timer_int(unsigned long num){

if(ts_regs->adcdat0 & (1<<15)){

//上报事件

input_report_abs(ts_dev, ABS_PRESSURE, 0);

input_report_key(ts_dev, BTN_TOUCH, 0);

input_sync(ts_dev);

 

enter_wait4down_mode();

}

else{

enter_measure_xy_mode();

start_adc();

}

}

 

 

static int ts_init(void){ 

ts_dev = input_allocate_device();

 

//设置能够产生哪些事件

set_bit(EV_KEY, ts_dev->evbit);

set_bit(EV_ABS, ts_dev->evbit);

set_bit(BTN_TOUCH, ts_dev->keybit); /*触摸屏按键事件*/

input_set_abs_params(ts_dev, ABS_X, 0, 0x3ff, 0, 0); /*设置绝对位移取值范围*/

input_set_abs_params(ts_dev, ABS_Y, 0, 0x3ff, 0, 0); /*设置绝对位移取值范围*/

input_set_abs_params(ts_dev, ABS_PRESSURE, 0, 1, 0, 0); /*设置压力的取值范围,只有0和1*/

/*注册*/

input_register_device(ts_dev);

 

//ioremap

ts_regs = ioremap(0x58000000, sizeof(struct ts_regs_t));

clkcon = ioremap(0x4C00000C, 4);

 

//使能时钟,使得adc可以正常工作

adc_clk = clk_get(NULL, "adc");

    if (!adc_clk) {  

        printk(KERN_ERR "failed to get adc clock sourcen");  

        return -ENOENT;  

    }  

    clk_enable(adc_clk);

 

/*

bit[14] PRESCEN=1 使能预分频

bit[13:6] PRESCVL=49 预分频数值为49(pclk=50.625M) adcclk = 50.625M/50=1.0125MHz

bit[2] STDBM=0 不进入等待模式

bit[1] READ_START=0

bit[0] ENABLE_START=0

*/

ts_regs->adccon = (1<<14)|(49<<6);

ts_regs->adcdly = 0xffff; //设定延时,保证数据的准确性

 

 

//注册中断

if( request_irq(IRQ_TC, grh_handle_tc_irq, IRQF_SAMPLE_RANDOM, "irq_tc", ts_dev) ){

printk(KERN_EMERG"allocate IRQ_TC error!n");

return -EIO;

}

 

if( request_irq(IRQ_ADC, grh_handle_adc_irq, IRQF_SHARED|IRQF_SAMPLE_RANDOM, "irq_adc", ts_dev) ){

printk(KERN_EMERG"allocate IRQ_ADC error!n");

return -EIO;

}

 

init_timer(&ts_timer);

ts_timer.function = grh_handle_timer_int;

add_timer(&ts_timer);

 

enter_wait4down_mode();//等待中断模式,检测触摸屏按下

return 0;

}

 

static void ts_exit(void){

iounmap(ts_regs);

iounmap(clkcon);

free_irq(IRQ_TC, ts_dev);

free_irq(IRQ_ADC, ts_dev);

input_unregister_device(ts_dev);

input_free_device(ts_dev);

del_timer(&ts_timer);

}

 

module_init(ts_init);

module_exit(ts_exit);

MODULE_AUTHOR("GRH");

MODULE_VERSION("1.0");

MODULE_DESCRIPTION("TOUCH SCREEN DRIVER");

MODULE_LICENSE("GPL");


关键字:mini2440  touch  screen  驱动程序 引用地址:mini2440 简单touch screen驱动程序

上一篇:mini2440 按键驱动异步信号通知模式 实验
下一篇:mini2440内核停在booting the kernel问题以及无法运行linuxrc问题的解决方法

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

若新iPhone取消3D Touch,部分厂商将受影响
去年9月,苹果发布了三款新iPhone,其中配备LCD屏幕的iPhoneXR成为三款新iPhone中唯一一款取消了3DTouch的iPhone机型。   3DTouch是苹果公司于2015年推出iPhone6s系列机型所搭载的功能,其使得iPhone的屏幕具备压感能力,用户只要通过对搭载3DTouch技术的屏幕施加按压,便能获得多一个‘维度’的交互,例如,利用3DTouch可以打开app的右键菜单,或者实现预览信息等功能。 不过,也许很快3DTouch即将消失在iPhone上。    据华尔街日报报道,苹果正考虑取消所有2019款iPhone上的3DTouch功能,从而削减成本。   这意味着今年所有的新iPho
[手机便携]
若新iPhone取消3D <font color='red'>Touch</font>,部分厂商将受影响
玩转mini2440开发板之【linux内核的编译和下载】
今天首先来玩一玩linux内核的编译和下载。 1、背景交代 开发环境:64位的Ubuntu 14.04; 编译工具:arm-linux-gcc 4.4.3; 下载工具:SuperViVi USB Transfer Utility; 调试工具:SecureCRT 7.2.6; 开发板材:友善之臂mini2440(64M版本); 内核版本:linux-2.6.32.2-20150709; 2、编译步骤 首先按照友善之臂官方手册(mini2440用户手册-20140103)的介绍,将linux 2.6.32.2的源码解压出来,我本人是解压到/opt/FriendlyARM/mini2440/linux-2.6.32.2-2015
[单片机]
玩转<font color='red'>mini2440</font>开发板之【linux内核的编译和下载】
IMX257 混杂设备miscdevice驱动程序
在Linux驱动中把无法归类的五花八门的设备定义为混杂设备(用miscdevice结构体表述)。miscdevice共享一个主设备号MISC_MAJOR(即10),但次设备号不同。 所有的miscdevice设备形成了一个链表,对设备访问时内核根据次设备号查找对应的miscdevice设备,然后调用其file_operations结构中注册的文件操作接口进行操作。 在内核中用struct miscdevice表示miscdevice设备,然后调用其file_operations结构中注册的文件操作接口进行操作。miscdevice的API实现在drivers/char/misc.c中。 一、混杂设备介绍 1. miscdevi
[单片机]
IMX257 混杂设备miscdevice<font color='red'>驱动程序</font>
linux-2.6.32在mini2440开发板上移植-移植I2C-EEPROM 驱动
1 在内核中配置I2C 驱动 Linux-2.6.32.2 对S2C2440 的I2C 接口提供了完善的驱动,因此我们只需在内核中配置一下即可使用。 在内核源代码目录执行:make menuconfig,进入内核配置主菜单,依次选择进入如下子菜单: Device Drivers --- * I2C support --- I2C Hardware Bus support --- 如图,我们看到这里已经选择好了“ * S3C2410 I2C Driver”,这里的S3C2410 也可以适用于S3C2440,因为它们的I2C 端口及寄存器定义都是完全相同的。 以上配置所对
[单片机]
linux-2.6.32在<font color='red'>mini2440</font>开发板上移植-移植I2C-EEPROM 驱动
u-boot-2009.08在mini2440上的移植 增加I2C EEPROM功能
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-eabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,参考文章: 10.1,实现u-boot的I2C EEPROM功能 mini2440开发板上的AT24C08A芯片提供了8kbyte的非易失的EEPROM存储空间,而且是通过I2C协议进行读写的,U-boot提供了对I2C和EEPROM的操作支持。 打开/include
[单片机]
AVR CH451驱动程序
AVR CH451驱动程序头文件 #ifndef _CH451_H #define _CH451_H #include avr/io.h //CH451命令宏定义 #define CH451_RESET 0x0201 //复位 #define CH451_LEFT MOV 0x0300 //设置移动方式-左移 #define CH451_LEFTCYC 0x0301 //设置移动方式-左循 #define CH451_RIGHT MOV 0x0302 //设置移动方式-右移 #define CH451_RIGHTCYC 0x0303 //设置移动方式-右循
[单片机]
MSP430应用技巧3:MSP-FET430UIF V3驱动程序的安装
原先一直使用正版windows操作系统和CCS进行MSP430的程序设计,在升级CCS以后,插上仿真器都会要求升级仿真器上的firmware,更新后一直使用正常。由于计算机硬盘损坏,装了个和谐的windows win7旗舰版操作系统(这里说明的是,Dell公司很不像话,操作系统的镜像虽然在硬盘上,但是操作系统也是用户花钱购置的,你不能硬盘坏了,操作系统就不能用了吧,为这事情我和Dell公司沟通很多次,三位支持工程师给我了三种不同的回答,第一个说给我一个正版的光盘寄过来,我等了一周没有消息了;第二个说给我个正版的链接,我自己装就好了,呵呵,仔细一看哪个连接是Microsoft的Win7 SP2的更新,真不知这位工程师怎么配在Dell
[单片机]
MSP430应用技巧3:MSP-FET430UIF V3<font color='red'>驱动程序</font>的安装
I2C总线键盘电路以及驱动程序设计
一、概述   本文介绍一种采用MAX7348 的串行I2C 总线的键盘电路以及驱动程序的设计。   I2C 需要连线少,仅需一条串行时钟线和一条串行数据线。允许多主机控制,具有裁决和同步功能,可随意添加或摘除总线上的子器件等诸多优点,所以已经被广泛应用。   二、MAX7348   MAX7348 是美国MAXIM 公司生产的2 线接口、低EMI 键盘开关和发声控制器,可监控多达40 个按键,可对按键去抖并保存在FIFO 中,去抖时间用户可在9 ~ 40ms 之间任意设置,MAX7348 自带的音调发生器在控制器的作用下可自动发出按键声和报警声,在发声期间,输出还可以设置为高电平或低电平,以驱动电子发声器、继电器或指示灯。
[电源管理]
I2C总线键盘电路以及<font color='red'>驱动程序</font>设计
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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