linux中触摸屏驱动的实现(3)——基于s3c6410处理器

发布者:机器人总动员最新更新时间:2022-06-13 来源: eefocus关键字:linux  触摸屏驱动  s3c6410  处理器 手机看文章 扫描二维码
随时随地手机看文章

1、上一篇分析的是两个中断处理函数中的其中一个触摸屏中断,现在来分析另外一个ADC中断,对应的中断函数是stylus_action。当触摸屏在自动X/Y位置转换模式和独立的X/Y位置转换模式时,当坐标数据转换之后会产生IRQ_ADC中断,进而调用stylus_action函数,此函数源码如下:


static irqreturn_t stylus_action(int irqno, void *param)

{

unsigned long data0;

unsigned long data1;


//printk("stylus_action.n");


data0 = readl(ts_base+S3C_ADCDAT0);

data1 = readl(ts_base+S3C_ADCDAT1);  读两个寄存器的值


if(ts->resol_bit==12) {    12位分辨率

#if defined(CONFIG_TOUCHSCREEN_NEW)

ts->yp += S3C_ADCDAT0_XPDATA_MASK_12BIT - (data0 & S3C_ADCDAT0_XPDATA_MASK_12BIT);

ts->xp += S3C_ADCDAT1_YPDATA_MASK_12BIT - (data1 & S3C_ADCDAT1_YPDATA_MASK_12BIT);

#else 

ts->xp += data0 & S3C_ADCDAT0_XPDATA_MASK_12BIT;获得触摸点的X坐标,把它加到ts->xp上。


其中:#define S3C_ADCDAT0_XPDATA_MASK_12BIT (0x0FFF)  也就是屏蔽位

ts->yp += data1 & S3C_ADCDAT1_YPDATA_MASK_12BIT;和上面一样,获得触摸点Y坐标,加到ts->yp上。

#endif

}

else {   10位分频率

#if defined(CONFIG_TOUCHSCREEN_NEW)

ts->yp += S3C_ADCDAT0_XPDATA_MASK - (data0 & S3C_ADCDAT0_XPDATA_MASK);

ts->xp += S3C_ADCDAT1_YPDATA_MASK - (data1 & S3C_ADCDAT1_YPDATA_MASK);

#else

ts->xp += data0 & S3C_ADCDAT0_XPDATA_MASK;

ts->yp += data1 & S3C_ADCDAT1_YPDATA_MASK;

#endif 

}


ts->count++;  


if (ts->count < (1<shift)) {     如果缓冲区未满,再次激活ADC转化器。

writel(S3C_ADCTSC_PULL_UP_DISABLE | AUTOPST, ts_base+S3C_ADCTSC);

writel(readl(ts_base+S3C_ADCCON) | S3C_ADCCON_ENABLE_START, ts_base+S3C_ADCCON);

} else {

mod_timer(&touch_timer, jiffies+1);  修改touch_timer定时器,将其时间延后一个单位。在下一个定时器时刻将调用touch_timer定时器指定的函数。这个定时器的定义如下:


static struct timer_list touch_timer =

TIMER_INITIALIZER(touch_timer_fire, 0, 0);

writel(WAIT4INT(1), ts_base+S3C_ADCTSC);    将触摸屏设为等待中断模式

}


if(ts->s3c_adc_con==ADC_TYPE_2) {    清中断

        __raw_writel(0x0, ts_base+S3C_ADCCLRWK);

        __raw_writel(0x0, ts_base+S3C_ADCCLRINT);

}


return IRQ_HANDLED;

}


touch_timer定时器用来当缓冲区不为空时,不断地触发touch_timer_fire函数。此函数读取触摸屏的坐标信息,并传递给内核输入子系统。还记得吗?touch_timer_fire这个函数的源码在上一篇博客中已经分析了。


2、再说下上面的定时器定义函数。


static struct timer_list touch_timer =

TIMER_INITIALIZER(touch_timer_fire, 0, 0);看下面,可知触摸屏设备驱动程序将touch_timer定时器函数设置为touch_timer_fire,过期时间为0,数据为0.即加载完触摸屏驱动程序后,就会执行一次定时器数touch_timer_fire。


#define TIMER_INITIALIZER(_function, _expires, _data) { 

.entry = { .prev = TIMER_ENTRY_STATIC },

.function = (_function),

.expires = (_expires),

.data = (_data),

.base = &boot_tvec_bases,

}

关键字:linux  触摸屏驱动  s3c6410  处理器 引用地址:linux中触摸屏驱动的实现(3)——基于s3c6410处理器

上一篇:linux中触摸屏驱动的实现(1)——基于s3c6410处理器
下一篇:linux中LCD设备驱动(5)——基于s3c6410平台

推荐阅读最新更新时间:2024-11-08 21:55

OK6410A 开发板 (八) 105 linux-5.11 OK6410A 进程通信机制2 共享内存
共享内存 posix 提供一套 , XSI(systemv) 提供一套 共享内存的实现 有很多种 1.posix mmap && open mmap 共享文件映射mmap(/dev/shm/xxx) 也用到了 shmem_vm_ops ,封装出了 posix 共享内存 // 共享匿名映射 用到了 shmem_vm_ops // 共享文件映射mmap(/dev/zero) 也用到了 shmem_vm_ops ,封装出了 posix 共享内存 2.XSI(systemv) 3.memfd_create和fd跨进程共享 4.dma-buf 共享内存实现方案有多种,posix共享内存是其中的一种
[单片机]
用于自动驾驶的嵌入式AI处理器
汽车中的技术正经历着一个根本性的技术转变。软件监控发动机,播放音乐,提醒司机注意来往的交通危险,并提供更多的功能。然而,随着汽车的自主化, 软件慢,芯片快 这句老话显得格外重要。当汽车自己驾驶时,没有出错的余地,随着越来越接近自动驾驶,芯片将需要迎来新的创新。 为什么边缘人工智能需要最先进的芯片? 人工智能需要一个特定的架构,更适合人工智能应用处理。现在的趋势是使用Tensor架构,而不是通常分别用于CPU、DPU或GPU的线性或矢量处理。尖端芯片或专用协处理器正在成为设备上、边缘、甚至云端AI处理的主流。边缘人工智能在其位置性、隐私性、延迟性、功耗限制和移动性支持方面有其他好处(除了其架构)。 从技术角度来看,为什么
[汽车电子]
用于自动驾驶的嵌入式AI<font color='red'>处理器</font>
OK6410A学习笔记二:嵌入式Linux驱动开发环境的配置和测试
环境配置: Window7 32-bit OS + VMware Workstation 6.5 + Ubuntu9.10 FORLINX OK6410A开发板 嵌入式Linux驱动开发环境的搭建 1. 安装arm-linux-gcc交叉编译器,并设置环境变量 2. 将飞凌提供的FORLINX_linux-3.0.1.tar.gz拷贝到/usr/src,解压并进入linux-3.0.1目录 3. 执行以下命令:#make oldconfig; #make prepare; 这两个命令用来测试交叉编译器和驱动开发需要的源文件包是否能正常使用,可能会出现提示arm-linux-gcc找
[单片机]
OK6410A学习笔记二:嵌入式<font color='red'>Linux</font><font color='red'>驱动</font>开发环境的配置和测试
arm平台linux异常处理流程
异常处理 异常向量的位置 arch/arm/kernel/traps.c中的early_trap_init函数将异常向量复制到某特定位置,这样当异常发生时,arm就能找到异常向量。 /* * Copy the vectors, stubs and kuser helpers (in entry-armv.S) * into the vector page, mapped at 0xffff0000, and ensure these * are visible to the instruction stream. */ memcpy((void *)vectors, __vectors_start, __vectors
[单片机]
基于ARM-LINUX的温度传感器驱动-DS18B20
DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等。主要根据应用场合的不同而改变其外观。封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。 技术性能描述 1. 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。 2. 测温范围 -55℃~+125℃,固有测温分辨率0.5℃。 3. 支持多点组网功能,多
[单片机]
基于ARM-<font color='red'>LINUX</font>的温度传感器<font color='red'>驱动</font>-DS18B20
利用MLD自动化操作系统移植降低Linux的成本
随着基于 Linux 的嵌入式系统得到日益广泛的应用,人们不禁要问,类似 Linux 这样的免费开放源代码操作系统的真正成本到底是多少?其实,最主要的成本是在劳动力上。要将 Linux 内核移植到定制嵌入式处理系统,您必须对产品所需要的内核功能、这些功能对其他内核服务的依赖程度以及您的工程团队的技能都有深入的了解。更重要的是,要了解可以借助哪些新技术来使这些任务自动化,以达到节省成本的目标。 开放源代码与商业操作系统 我们很多人都看过为如何使用 Linux 源代码提供指导的 GNU 通用公共许可证 (GPL)。要确定在系统中使用 Linux 的成本,一般来说,第一步是了解 Linux 的哪些部分是真正免费且不受法律约束的,哪些
[嵌入式]
Linux(ARM-S3C2410)内核滴答定时器驱动
/*============================================================*/ 与硬件平台相关 /*============================================================*/ 1):arch/arm/plat-s3c24xx/time.c static void __init s3c2410_timer_init (void) { s3c2410_timer_setup(); setup_irq(IRQ_TIMER4, &s3c2410_timer_irq);
[单片机]
Linux驱动:s3c2410/s3c2440 ts驱动分析》
前言 前面结合“平台总线-设备-驱动”模型分析了ts(触摸)驱动的加载过程,现在进入驱动程序分析下其具体的实现。涉及到输入子系统、s3c2440的ADC转换和触摸控制器。 涉及的寄存器 image.png 调用probe函数 根据上一篇的分析,驱动层通过platform_driver_register注册后,会调用到该驱动层的probe函数。 s3c2410ts_probe函数分析 1. 硬件寄存器设置 获取设备参数 struct s3c2410_ts_mach_info *info; info = ( struct s3c2410_ts_mach_info *)pdev- dev.platform_data;
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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