9.触摸屏驱动移植实战

1.触摸屏驱动概览##########################

1.1、常用的2种触摸屏
(1)电阻触摸屏。驱动一般分2种:一种是SoC内置触摸屏控制器,一种是外置的专门触摸屏控制芯片,通过I2C接口和SoC通信。
(2)电容触摸屏。驱动只有一种,外接专用的电容式触摸屏控制芯片,I2C接口和SoC通信。
1.2、X210使用的触摸屏
(1)X210V3使用的触摸屏:ft5x06
(2)X210V3S使用的触摸屏:gslX680
1.3、学习触摸屏驱动的关键点
(1)input子系统相关知识
(2)中断上下半部
(3)I2C子系统
(4)触摸屏芯片本身知识
1.4、竞争状态和同步


2.内核中的竞争状态和互斥##########################

2.1、一些概念
(1)竞争状态(简称竟态)
(2)临界段、互斥锁、死锁
(3)同步(多CPU、多任务、中断)
2.2、解决竟态的方法
(1)原子操作 automic_t
(2)信号量、互斥锁
(3)自旋锁
2.3、自旋锁和信号量的使用要点
(1)自旋锁不能递归

(2)自旋锁可以用在中断上下文(信号量不可以,因为可能睡眠),但是在中断上下文中获取自旋锁之前要先禁用本地中断

(3)自旋锁的核心要求是:拥有自旋锁的代码必须不能睡眠,要一直持有CPU直到释放自旋锁

(4)信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进程上下文使用,而自旋锁适合于保持时间非常短的情况,它可以在任何上下文使用。如果被保护的共享资源只在进程上下文访问,使用信号量保护该共享资源非常合适,如果对共享资源的访问时间非常短,自旋锁也可以。但是如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),就必须使用自旋锁。自旋锁保持期间是抢占失效的,而信号量和读写信号量保持期间是可以被抢占的。自旋锁只有在内核可抢占或SMP(多处理器)的情况下才真正需要,在单CPU且不可抢占的内核下,自旋锁的所有操作都是空操作。


3.中断的上下半部1################################

3.1、中断处理的注意点
(1)中断上下文,不能和用户空间数据交互
(2)不能交出CPU(不能休眠、不能schedule)
(3)ISR运行时间尽可能短,越长则系统响应特性越差
3.2、中断下半部2种解决方案
(1)为什么要分上半部(top half,又叫顶半部)和下半部(bottom half,又叫底半部)
(2)下半部处理策略1:tasklet(小任务)
(3)下半部处理策略2:workqueue(工作队列)

前面说过tasklet被放在一个全局的tasklet_vec的链表中,链表中的元素是tasklet_struct结构体。内核中有个ksoftirqd()的内核线程,它会周期的遍历软中断的向量列表,如果发现哪个软中断向量被挂起了(pending),就执行相应的处理函数。

9.触摸屏驱动移植实战_第1张图片

中断上下半部使用原则

顶半部:任务量少,紧急,屏蔽中断,时间少

tasklet:任务量中等,较紧急,屏蔽中断,时间较多

wrokqueue:任务量多,不急迫,不会屏蔽中断,时间多,会睡眠,

详细的方面请参考我的博客:https://blog.csdn.net/qq_40732350/article/details/83239069

 

3 电阻触摸屏原理   #########

9.触摸屏驱动移植实战_第2张图片

计算触点的X,Y坐标分为如下两步:

1. 计算Y坐标,在Y+电极施加驱动电压Vdrive, Y-电极接地,X+做为引出端测量得到接触点的电压,由于ITO层均匀导电,触点电压与Vdrive电压之比等于触点Y坐标与屏高度之比。

2. 计算X坐标,在X+电极施加驱动电压Vdrive, X-电极接地,Y+做为引出端测量得到接触点的电压,由于ITO层均匀导电,触点电压与Vdrive电压之比等于触点X坐标与屏宽度之比。

 

4 电容触摸屏原理   ########

gsl1680是电容触摸屏

参考:

http://www.cnblogs.com/panzhang/p/4657041.html

9.触摸屏驱动移植实战_第3张图片

 

 

5 重要结构体   ######

struct gsl_ts {
	struct i2c_client *client;  //设备
	struct input_dev *input;  //input设备
	struct work_struct work;  //工作队列结点
	struct workqueue_struct *wq;  //工作队列
	struct gsl_ts_data *dd;  //私有数据
	u8 *touch_data;
	u8 device_id;  //设备id
	int irq;
};

struct gsl_ts_data {
	u8 x_index;
	u8 y_index;
	u8 z_index;
	u8 id_index;
	u8 touch_index;
	u8 data_reg;
	u8 status_reg;
	u8 data_size;
	u8 touch_bytes;
	u8 update_data;
	u8 touch_meta_data;
	u8 finger_size;
};

 

 

 

 

 

 

 


4.触摸屏——gslX680 驱动的移植实践####################

触摸屏设备驱动程序的初始化函数、退出函数和中断处理函数的关系如图所示。
当模块加载时,会调用初始化函数s3c2410ts init(),在该函数中会调用probe()函数,该函数中会进一步调用request irq()函数注册两个中断。

这两个中断的处理函数分别是stylus-updown()和stylus action(), request-irq()函数会操作内核中的一个中断描述符数组结构irq desc,该数组结构比较复杂,主要的功能就是记录中断号对应的中断处理函数。

当中断到来时,会到中断描述符数组中询问中断号对应的中断处理函数,然后执行该函数。在本实例中,这两个中断的处理函数分别是stylus updown()和stylus action()

卸载模块时,会调用退出函数s3c2410ts exit(),在该函数中,会调用free irq()来释放设备所使用的中断号。free irg(函数也会操作中断描述符数组结构irq desc,,将该设备所对应的中断处理函数删除。

中断处理函数stylusupdown()中会调用touchtimer fire(),这个函数也被定时器触发,触发的条件是,缓冲区中的数据不为0,也就是有触摸事件产生。

9.触摸屏驱动移植实战_第4张图片

 

 

 

 

 

 

 

 

 

 

 

 


 

你可能感兴趣的:(驱动开发)