电阻触摸屏硬件原理
触摸屏就是 2 层很薄的膜,引出 4 条线。
上面一层膜:XP 边(P 表示正极的意思),XM 边(M 表示负极的意思)。
下面一层膜:YP 边,YM 边
平时这两层膜接触不到,当有触摸时,即按压时,上下两层膜就会粘在一起。基于欧姆定律测试 x,y 坐标:
A,测试 X 坐标:
①,XP 接 3.3V
②,XM 接地-0V。
③,YP 与 YM 都不接。这样上面一层相当于个电阻了。
④,测试 YP 电压。
B,测试 Y 坐标:
①,YP 接 3.3V
②,YM 接地-0V。
③,XP 与 XM 都不接。这样上面一层相当于个电阻了。
④,测试 XP 电压。
分辨率:10位
最大时钟:2.5MHz(PCLK 50MHz,ADCCON设置预分频系数 ->1MHz)
4个控制信号引脚:TSXP,TSYP,TSXM,TSYM
输入模拟电压范围:0~3.3V
触摸屏工作模式:
普通转换模式:不使用触摸屏,用于普通的A/D转换
分离的x/y轴坐标转换模式:测量x或y坐标,分别产生中断
自动x/y轴坐标转换模式 :测量x和y坐标,产生一个中断
等待中断模式:等待Pen Up或Pen Down中断,触摸屏被按下/松开产生中断,要转入上面的两种模式中的一种测量x,y坐标
寄存器设置
ADCCON:预分频使能,预分频系数,A/D转换通道,启动A/D转换
ADCTSC :选择工作模式:0xd3等待按下,0x1d3等待松开,自动测量x,y模式
ADCDLY :延时时钟(采样延时值,等待电压稳定后发出IRQ_TC中断)
ADCDAT0:bit15判断按下/松开,bit[9:0]x轴坐标值 ADCDAT0&3ff
ADCDAT1:bit15判断按下/松开,bit[9:0]y轴坐标值 ADCDAT1&3ff
触摸屏驱动
触摸屏驱动是基于输入子系统做的,右边软件相关的由系统提供的evdev.c做好,我们只做左边硬件相关的。
1 分配一个input_dev结构体
2. 设置
2.1 能产生哪类事件
2.2 能产生这类事件里的哪些事件
3. 注册
4. 硬件相关的操作
4.1 使能时钟(为了省电,模块关闭)
4.2 设置ADC/TS寄存器
4.3 定时器处理长按,滑动的情况
触摸屏使用过程:
1,按下产生中断INT_TC。
2,在“按下”中断处理程序里面,启动 ADC 转换 X、Y 坐标电压值。
3,启动 ADC 不会瞬间完成,一般来说启动就不管了。ADC 结束,产生 ADC中断INT_ADC(与‘按下’中断不同)。
4,在 ADC 中断处理函数里面,用 input_event() 来上报,启动定时器(处理长按、滑动的过程中也可以连续不断的转换这个坐标电压值,上报出来)。
5,定时器时间到,再到第 2 步,再次启动 ADC 。就是按下时产生一个“粘点”中断,过了一段时间(定时器),就会再启动一次 ADC 中断,这样就能处理“粘点”滑动的过程。
6,松开。
驱动程序
struct s3c_ts_regs {
//寄存器结构体
unsigned long adccon;
unsigned long adctsc;
unsigned long adcdly;
unsigned long adcdat0;
unsigned long adcdat1;
unsigned long adcupdn;
};
static struct input_dev *s3c_ts_dev; //定义input_dev结构体
static volatile struct s3c_ts_regs *s3c_ts_regs;
static struct timer_list ts_timer; //定义定时器
static void enter_wait_pen_down_mode(void){
//进入等待按下模式
s3c_ts_regs->adctsc = 0xd3;
}
static void enter_wait_pen_up_mode(void){
//进入等待松开模式
s3c_ts_regs->adctsc = 0x1d3;
}
static void enter_measure_xy_mode(void){
//进入测量模式
s3c_ts_regs->adctsc = (1<<3)|(1<<2);
}
static