触摸屏驱动
a.先来了解下基本知识
1.ft5x6触摸屏驱动通过I2C接口与CPU进行连接,服务于I2C总线,同时触摸屏属于又是输入设备,因此又隶属于输入子系统。
2.ft5x06通过I2C接口连接CPU,直接将数字信号放入内部寄存器,(一些触摸屏管脚发出电压值为模拟信号,需要接ADC转换至数字信号供CPU读取)
3.ft5x06触摸屏的各个寄存器如下图
由寄存器表可以知道,当前按键的个数在02h地址的第四位,每个触摸点的X值的高8位都是在该地址内容的低4位,低8位在下一个地址中(用于之后的原始数据拼凑成X,Y值和触摸点个数值)
b.直接上代码(代码中有很详细的注释)
1.触摸屏驱动程序(文件名:tiny_ts.c)
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/i2c.h>
#include <linux/input.h>
#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/gpio.h>
#include <linux/platform_device.h>
#include <mach/gpio.h>
#include <plat/gpio-cfg.h>
#include <plat/ctouch.h>
#include <plat/ft5x0x_touch.h>
#define TS_NAME "ft5x0x_ts"
#define FT_FT5X0X_PT_MAX 5 //多点触摸最大值
struct ts_info{
int x;
int y;
int id;
};
struct ts_desc{
int irq;
struct i2c_client* ts_cli;
struct input_dev* ts_input;
int x_max; //触摸屏最大的X值,用于设置input_dev
int y_max; //触摸屏最大的Y值, 用于设置input_dev
int pressure_max; //触摸屏最大的压力值
int ts_num; //当前触摸的点数
struct ts_info ts_info[FT_FT5X0X_PT_MAX]; //触摸点信息的数组,最大可产生5个触摸点
struct work_struct ts_work_queue;
};
static struct ts_desc *ts;
/*I2C读取函数
*client:i2c_lient结构体
*buf:需要读取的地址
*count:需要读取寄存器的个数
*/
static int ts_i2c_read(struct i2c_client* client, char *buf, int count)
{
/*分析:传参过来buf[0] == 0
*然后先写,当len = 1时,表示写入buf数组的第一个元素buf[0]
*写入的第一个元素为0值,意思是告诉寄存器我要从0x00地址开始读取数据了
*然后再读,读取长度为count,表示我要从我刚才写入进去的0x00地址开始读取
*读取count字节数据(等于读取了0x00地址到0x00偏移了count-1地址空间的数据)
*/
struct i2c_adapter *adapt;
struct i2c_msg ts_msg[2];
adapt = client->adapter;
ts_msg[0].addr = client->addr;
ts_msg[0].flags = 0; //写,告诉触摸屏我要读哪个地址的数据
ts_msg[0].buf = buf;
ts_msg[0].