0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

DS小龙哥-嵌入式技术 2022-09-17 15:27 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

【摘要】 这篇文章介绍在Linux下如何编写FT5X06系列芯片驱动,完成触摸屏的驱动开发, FT5X06是一个系列,当前使用的具体型号是FT5206,它是一个电容屏的触摸芯片,内置了8位的单片机(8051内核),完成了坐标换算等很多处理,在通过IIC,SPI方式传递给外部单片机。

1. 前言

这篇文章介绍在Linux下如何编写FT5X06系列芯片驱动,完成触摸屏的驱动开发, FT5X06是一个系列,当前使用的具体型号是FT5206,它是一个电容屏的触摸芯片,内置了8位的单片机(8051内核),完成了坐标换算等很多处理,在通过IIC,SPI方式传递给外部单片机。

image-20220118132721456

所说起触摸屏大家都不会陌生,现在手机、手表、家电、很多地方都支持触摸了。最开始的触摸屏都是电阻屏,在诺基亚时代的时候,使用的触摸屏都是电阻屏,后来Android兴起的时候,手机都向电容屏发展了。电阻屏需要自己去校准,电阻屏的手机上都有这个功能,发现触摸不灵敏之后,打开校准选项,根据屏幕上十字图标指引,按顺序点一下,完成坐标校准,电阻屏的屏幕还是软材质,必须要手指去戳才可以完成控制,而且只能支持单点触控。现在电容屏就很方便了,只需要手指去触摸屏即可完成操作,比电阻屏方便很多,还支持多点触控,当初Android手机刚兴起的时候,大街小巷的体验店,广告都是切水果游戏,切水果这个游戏就充分体验了多点触摸的效果,可以多个手指去切水果,当初这个游戏还是火爆的。

当前文章介绍的FT5206就是一颗电容屏的驱动芯片,最高支持2点触控,可以通过获取两个坐标点,这个系列的芯片最高支持10点触控。

当前使用的屏幕型号是S702,这个屏幕是友善之臂生产的LCD屏,S702这款屏幕采用的触摸芯片就是FT5206,引出了IIC接口,支持笔中断,官方的内核里也提供了例子驱动可以参考。

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

image-20220118134314453

屏幕的实物图详情看下图的介绍:

image-20220118133946228

2. FT5206寄存器介绍

FT5206支持通过IIC和SPI接口与外部主机通信,当前使用的屏幕硬件上只是引出了IIC接口,下面就介绍下IIC接口的时序,设备地址,还有FT5206的寄存器。

IIC传输时序:

image-20220118135118906

读写时序流程:

image-20220118135237716

字段的解释:

image-20220118135300623

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

image-20220118135549700image-20220118135610826

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

3. 编写触摸屏驱动

Linux下编写标准的触摸屏驱动需要使用到输入子系统,当前文章的重点是读取触摸屏的坐标,所以示例代码里不会加输入子系统的代码,只是在驱动层完成触摸屏笔中断响应,触摸屏的坐标点获取并打印。

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

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

image-20220118140556674

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");
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 触摸屏
    +关注

    关注

    42

    文章

    2496

    浏览量

    122457
  • 驱动
    +关注

    关注

    12

    文章

    1988

    浏览量

    88683
  • ft5x06
    +关注

    关注

    0

    文章

    2

    浏览量

    5073
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    低电压触摸屏控制器AD7879/AD7889:技术解析与应用指南

    低电压触摸屏控制器AD7879/AD7889:技术解析与应用指南 引言 在当今的电子设备中,触摸屏的应用越来越广泛,从智能手机到工业控制终端,触摸屏为用户提供了直观、便捷的交互方式。而低电压
    的头像 发表于 04-01 15:35 140次阅读

    触拓科技商超导览触摸屏数字标牌广告#导览 #触摸屏 #触拓

    触摸屏
    深圳市触拓科技有限公司
    发布于 :2025年12月25日 17:24:28

    Linux驱动开发的必备知识

    、内核模块编程: 掌握内核模块的编写、编译、加载和卸载方法。 了解内核模块的初始化和清理函数的编写5、设备驱动框架: 熟悉字符设备、块设备、网络设备等
    发表于 12-04 07:58

    【免费送书】成为硬核Linux开发者:《Linux 设备驱动开发(第 2 版)》

    Linux系统的设备驱动开发,一直给人门槛较高的印象,主要因内核机制抽象、需深度理解硬件原理、开发调试难度大所致。2021年,一本讲解驱动
    的头像 发表于 11-18 08:06 1755次阅读
    【免费送书】成为硬核<b class='flag-5'>Linux</b><b class='flag-5'>开发</b>者:《<b class='flag-5'>Linux</b> 设备<b class='flag-5'>驱动</b><b class='flag-5'>开发</b>(第 2 版)》

    应用 I 触摸屏静电浪涌防护方案

    一、应用背景触摸屏(又称触控或、触控面板)是一种可接收触头输入信号的感应式液晶显示装置。用户通过手指与屏幕直接触碰,就可与计算机等设备进行交互。触摸屏被广泛运用在各个行业,其中较为常见的就是手机
    的头像 发表于 11-03 13:37 1019次阅读
    应用 I <b class='flag-5'>触摸屏</b>静电浪涌防护方案

    OBOO鸥柏触摸屏:国产化“芯”力量,驱动轨道交通数字孪生高效交互

    OBOO鸥柏触摸屏:国产化芯片赋能,轨道交通数字孪生“智”变新仿真引擎近日,OBOO鸥柏触摸屏一体机凭借其数字孪生仿真技术与轨道交通场景的深度融合,成为商显行业焦点。鸥柏触摸屏该系列工业显示一体机
    的头像 发表于 09-21 12:25 783次阅读
    OBOO鸥柏<b class='flag-5'>触摸屏</b>:国产化“芯”力量,<b class='flag-5'>驱动</b>轨道交通数字孪生高效交互

    如何做电子产品的触摸屏点击耐划寿命测试

    电子产品的触摸屏点击耐划寿命测试是评估触摸屏耐用性的关键环节,直接关系到产品的使用寿命和用户体验。
    的头像 发表于 08-15 10:35 2679次阅读
    如何做电子产品的<b class='flag-5'>触摸屏</b>点击耐划寿命测试

    使用恩智浦FRDM-MCXN947开发板移植触摸屏

    触摸屏信号包含通信信号和复位信号。这里4个管脚全部配置为GPIO,用GPIO模拟IIC。
    的头像 发表于 08-13 17:02 5405次阅读
    使用恩智浦FRDM-MCXN947<b class='flag-5'>开发</b>板移植<b class='flag-5'>触摸屏</b>

    6通道、高效率白光LED驱动器,带有触摸屏驱动器电源 skyworksinc

    电子发烧友网为你提供()6通道、高效率白光LED驱动器,带有触摸屏驱动器电源相关产品参数、数据手册,更有6通道、高效率白光LED驱动器,带有触摸屏
    发表于 07-23 18:33
    6通道、高效率白光LED<b class='flag-5'>驱动</b>器,带有<b class='flag-5'>触摸屏</b><b class='flag-5'>驱动</b>器电源 skyworksinc

    智能设备触摸屏的功能性测试

    多功能触摸屏测试系统WH-1121-W凭借其强大的性能和广泛的适用性,在多个行业中都发挥着重要作用。在 3C 电子行业,智能手机、平板电脑、笔记本电脑等产品的触摸屏测试都离不开它,通过精准测试确保
    的头像 发表于 07-17 09:27 5184次阅读
    智能设备<b class='flag-5'>触摸屏</b>的功能性测试

    工业智能网关:PLC触摸屏数据采集场景覆盖指南

    针对"能否采集PLC触摸屏数据"问题,本文通过功能模块化拆解,结合真实应用场景,解析工业智能网关在PLC触摸屏数据采集中的技术实现与商业价值。
    的头像 发表于 07-16 10:36 1518次阅读
    工业智能网关:PLC<b class='flag-5'>触摸屏</b>数据采集场景覆盖指南

    聚徽分享——解决工控触摸屏触摸不灵敏问题的实用技巧

    在工业自动化场景中,工控触摸屏作为人机交互的核心设备,其灵敏度直接影响生产效率与操作准确性。当触摸屏出现触摸不灵敏的情况时,及时排查并解决问题至关重要。以下是一些实用的解决技巧。 清洁屏幕表面 日常
    的头像 发表于 06-26 17:26 1730次阅读

    工业智能网关能够采集PLC触摸屏

    工业智能网关能够采集PLC触摸屏的数据。工业智能网关作为连接工业场景本地设备(如PLC、传感器、触摸屏等)与远端业务系统的网络通信设备,具备数据采集、协议解析、边缘计算等功能,可实现对PLC触摸屏
    的头像 发表于 06-25 14:30 1116次阅读
    工业智能网关能够采集PLC<b class='flag-5'>触摸屏</b>吗

    昆仑通态物联网触摸屏配置教程

    昆仑通态物联网触摸屏配置教程
    发表于 06-09 14:59 0次下载

    ESP32驱动ST7789触摸屏开发指南:LVGL主题设置与示波器面板

    本文介绍如何使用ESP32微控制器驱动ST7789 TFT液晶和XPT2046触摸芯片,通过LVGL图形库实现主题切换功能,并开发一个实用的触摸屏
    的头像 发表于 04-28 18:07 3935次阅读
    ESP32<b class='flag-5'>驱动</b>ST7789<b class='flag-5'>触摸屏</b><b class='flag-5'>开发</b>指南:LVGL主题设置与示波器面板