锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

Linux驱动开发-编写FT5X06触摸屏驱动

时间:2022-09-05 12:00:00 x2电容材质

1. 前言

本文介绍在Linux下如何编写FT5X06系列芯片驱动,完成触摸屏驱动开发, FT5X06是一个系列,目前使用的具体型号是FT5206是电容屏触摸芯片,内置8位单片机(8051核心),完成坐标转换等多种处理。IIC,SPI方法传递给外部单片机。

image-20220118132721456

说到触摸屏,大家都很熟悉。现在手机、手表、家电和很多地方都支持触摸。最开始的触摸屏都是电阻屏,在诺基亚时代的时候,使用的触摸屏都是电阻屏,后来Android手机兴起时,发展成电容屏。电阻屏幕需要自己校准,电阻屏幕手机有这个功能,发现触摸不敏感,打开校准选项,根据屏幕交叉图标指南,按顺序,完成坐标校准,电阻屏幕或软材料,必须用手指戳才能完成控制,只能支持单点触摸。现在电容屏很方便,只需要用手指触摸屏就可以完成操作,比电阻屏方便多了,还支持多点触摸。Android手机刚出现的时候,街上的体验店和广告都是切水果的游戏。切水果的游戏充分体验了多触摸的效果,可以用多个手指切水果。一开始这个游戏还是很受欢迎的。

当前文章介绍FT5206是电容屏的驱动芯片,最高支持2点触摸,可获得两个坐标点,该系列芯片最高支持10点触摸。

目前使用的屏幕型号是S702,这个屏幕是友好之臂生产的LCD屏,S这款屏幕使用的触摸芯片是702FT5206,引出了IIC接口,支持笔中断,官方核心也提供例子驱动参考。

开发板与触摸芯片的连接示例:

详情见下图介绍:

2. FT5206寄存器介绍

FT5206支持通过IIC和SPI接口与外部主机通信,目前使用的屏幕硬件只被引出IIC接口,下面介绍一下IIC接口顺序、设备地址和FT5206的寄存器。

IIC传输时序:

读写时序流程:

解释字段:

下面的截图是介绍FT5206内部的寄存器地址,我翻译了一些关键的地方:

从图中可以看出,基本上后面的寄存器地址是重复功能,但坐标点不同,其中TOUCH2,TOUCH3…这些都是存储触摸屏的坐标点值。当前的FT5206只支持2点触摸,只能读取两个寄存器坐标的值。第一个寄存器在前面TD_STATUS低4位存储当前同时按下的点数,两个手指可以按在屏幕上测试读取值。 这些寄存器读取的坐标值是转换后的值,即屏幕坐标,不需要二次转换校准,非常方便。

3. 编写触摸屏驱动

Linux标准触摸屏驱动需要用于输入子系统。目前文章的重点是读取触摸屏的坐标,因此在示例代码中不会添加输入子系统的代码,而是在驱动层中断触摸屏笔的响应,获取并打印触摸屏的坐标点。

驱动代码中涉及的技术点包括: IIC子系统、工作队列、核心中断等知识点。

这是开发板LCD屏幕硬件原理图:

3.1 设备端代码(FT5206)

#include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include   #define DEVICE_NAME "FT5X06_DEV"  static struct i2c_adapter *iic_adapter; static struct i2c_client *iic_client; static struct i2c_board_info  iic_info;  static int __init iic_dev_init(void) { 
          /*1. 根据总线编号获取IIC适配器结构体*/  iic_adapter=i2c_get_adapter(1);
	/*2. 填充板级信息*/
	iic_info.addr=0x38;
	iic_info.irq=gpio_to_irq(EXYNOS4_GPX1(6));
	strcpy(iic_info.type,DEVICE_NAME);
	
	/*3. 注册IIC设备端*/
	iic_client=i2c_new_device(iic_adapter,&iic_info);
	
    printk("IIC设备端驱动安装成功.\n");
    return 0;
}


static void __exit iic_dev_exit(void)
{ 
        
	/*1. 完成设备端注销*/
	i2c_unregister_device(iic_client);
	
    printk("IIC设备端驱动卸载成功.\n");
}

/*驱动的入口:insmod xxx.ko*/
module_init(iic_dev_init);
/*驱动的出口: rmmod xxx.ko*/
module_exit(iic_dev_exit);
/*模块的许可证*/
MODULE_LICENSE("GPL");
/*模块的作者*/
MODULE_AUTHOR("wbyq");

3.2 驱动端代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

static struct work_struct touch_work;
static struct i2c_client *touch_client;

/*工作函数*/
void tiny4412_touch_work_func(struct work_struct *work)
{ 
        
	u8 touch_buff[7];
	u16 x,y;
	/*1. 读取坐标数据*/
	i2c_smbus_read_i2c_block_data(touch_client,0,7,touch_buff);
	/*2. 打印数据*/
	x=(touch_buff[3]&0xF)<<8|touch_buff[4];
	y=(touch_buff[5]&0xF)<<8|touch_buff[6];
	printk("x=%d,y=%d,p=%d\n",x,y,touch_buff[2]&0xF);
}

/* 中断的服务函数 */
irqreturn_t tiny4412_touch_irq_handler(int irq, void *dev)
{ 
        
	/*调度工作: 将工作加入到工作队列*/
	schedule_work(&touch_work);	
	return IRQ_HANDLED;
}

static int iic_probe(struct i2c_client *client, const struct i2c_device_id *dev_id)
{ 
        
	printk("设备地址:0x%X\n",client->addr);
	printk("设备名称:%s\n",client->name);

	touch_client=client;
		
	/*1. 初始化工作队列*/
	INIT_WORK(&touch_work,tiny4412_touch_work_func);
	
	/*2. 注册中断*/
	request_irq(client->irq,tiny4412_touch_irq_handler,IRQF_TRIGGER_RISING|IRQF_TRIGGER_FALLING,client->name,NULL);

	return 0;
}

static int iic_remove(struct i2c_client *client)
{ 
        
	/*1. 注销中断*/
	free_irq(client->irq,NULL);
	
	return 0;
}

static  struct i2c_device_id iic_dev_id[]=
{ 
        
	{ 
        "FT5X06_DEV",0},
	{ 
        }
};

static struct i2c_driver iic_driver=
{ 
        
	.probe=iic_probe,
	.remove=iic_remove,
	.driver=
		{ 
        
			.name="iic_driver"
		},
	.id_table=iic_dev_id
};

static int __init iic_drv_init(void)
{ 
        
	/*1. 注册IIC驱动端*/
	i2c_add_driver(&iic_driver);
    printk("驱动安装成功.\n");
    return 0;
}

static void __exit iic_drv_exit(void)
{ 
        
	/*2. 注销IIC驱动端*/
	i2c_del_driver(&iic_driver);
    printk("驱动卸载成功.\n");
}

/*驱动的入口:insmod xxx.ko*/
module_init(iic_drv_init);
/*驱动的出口: rmmod xxx.ko*/
module_exit(iic_drv_exit);
/*模块的许可证*/
MODULE_LICENSE("GPL");
/*模块的作者*/
MODULE_AUTHOR("wbyq");
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章