触摸屏驱动s3c2410_ts.c分析

这篇博客详细介绍了Linux设备驱动工程师如何分析S3C2410_ts.c,涉及触摸屏硬件原理、驱动初始化、中断服务函数以及ADC中断处理。在初始化中,设置采样延时、分配输入设备并注册中断处理程序。中断服务函数处理触摸屏的按下和弹起事件,读取ADC转换数据,并报告给输入系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux设备驱动工程师之路——触摸屏驱动s3c2410_ts.c分析

K-Style

转载请自 http://blog.youkuaiyun.com/ayangke 

一、触摸屏硬件知识

 

1.模块原理图

S3C2440有8路的ADC通道其中触摸屏控制器接口XP,XM,YP,YM与四路ADC通道复用四个IO引脚。从原理图看出8路ADC只有一个A/D转换器,通过一个8选1开关MUX来选通哪一路A/D通道进行转换。触摸屏控制会产生两个中断,一个触摸屏中断INT_ADC,一个ADC_转换完成中断INT_ADC。ADC需要时钟才能工作,因为它需要设置采样率。


再复习一下ARM裸机实验时触摸屏寄存器操作流程

流程:

         初始化

         1设置采样延时和分频值ADCDLY ADCCON

         2中断相关设置

         3设置触摸屏AD转换为等待中断模式 ADCTSC

         中断服务函数

         4清相关挂起寄存器

         5设置转换模式,一般为连续x,y转换

6 启动转换

          7 转换完成后读取x y坐标ADCDAT0ADCDAT1

          8 设置触摸屏AD转换为等待中断模式,设置等待弹起中断ADCTSC

9 弹起中断发生后,设置触摸屏转换为等待中断模式,等待下一次触笔按下rADCTSC

         程序

二、触摸屏驱动程序

 

1.模块初始化

  1. static int __init s3c2410ts_init(void)  
  2. {  
  3.     struct input_dev *input_dev;  
  4.   
  5.     //获取时钟  
  6.     adc_clock = clk_get(NULL, "adc");  
  7.     if (!adc_clock) {  
  8.         printk(KERN_ERR "failed to get adc clock source\n");  
  9.         return -ENOENT;  
  10.     }  
  11.     clk_enable(adc_clock);  
  12.     //使能时钟  
  13.     //需要时钟的是因为触摸屏要用到ADC转换,而完成ADC转换则需要时钟(采用时间)  
  14.   
  15.     //映射ADC的IO内存  
  16.     base_addr=ioremap(S3C2410_PA_ADC,0x20);  
  17.     if (base_addr == NULL) {  
  18.         printk(KERN_ERR "Failed to remap register block\n");  
  19.         return -ENOMEM;  
  20.     }  
  21.   
  22.     //初始化触摸屏的IO引脚  
  23.     /* Configure GPIOs */  
  24.     s3c2410_ts_connect();  
  25.   
  26.     //设置预分频值  
  27.     iowrite32(S3C2410_ADCCON_PRSCEN | S3C2410_ADCCON_PRSCVL(0xFF),\  
  28.              base_addr+S3C2410_ADCCON);  
  29.     iowrite32(0xffff,  base_addr+S3C2410_ADCDLY);//设置采用延时  
  30.     iowrite32(WAIT4INT(0), base_addr+S3C2410_ADCTSC);  
  31. //设置触摸屏控制器为等待按下中断  
  32.   
  33.     /* Initialise input stuff */  
  34.     //申请一个input设备  
  35.     input_dev = input_allocate_device();  
  36.   
  37.     if (!input_dev) {  
  38.         printk(KERN_ERR "Unable to allocate the input device !!\n");  
  39.         return -ENOMEM;  
  40.     }  
  41.   
  42.     dev = input_dev;  
  43.       
  44.     //设置可被支持的事件为同步、按键、绝对坐标事件  
  45. dev->evbit[0] = BIT(EV_SYN) | BIT(EV_KEY) | BIT(EV_ABS);  
  46. //设置按键时间类型为触摸屏  
  47.     dev->keybit[BITS_TO_LONGS(BTN_TOUCH)] = BIT(BTN_TOUCH);  
  48.   
  49.     //设置事件数值范围X,Y坐标范围为0到3FF,按键数值范围从0,到1  
  50.   &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值