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

    关注

    42

    文章

    2243

    浏览量

    114789
  • 驱动
    +关注

    关注

    12

    文章

    1769

    浏览量

    84794
  • ft5x06
    +关注

    关注

    0

    文章

    2

    浏览量

    4977
收藏 人收藏

    评论

    相关推荐

    RK3568多次insmod触摸驱动后提示中断不匹配

    ; linux/delay.h> // 定义 ft5x06设备的 GPIO 描述符 struct gpio_desc *reset_gpio, *irq_gpio; // ft5x06中断
    发表于07-24 23:44

    LCD触摸屏的PCB设计

    液晶显示 (LCD)和 触摸屏技术已经成为各种电子设备的核心组成部分,从智能手机到电视和医疗设备。在这些设备中,PCB的设计对于LCD和 触摸屏的性能和可靠性至关重要。下面将讨论LCD
    的头像 发表于07-18 11:17 829次阅读
    LCD<b class='flag-5'>屏</b>和<b class='flag-5'>触摸屏</b>的PCB设计

    触摸屏和plc的程序怎么编写

    编写 触摸屏和PLC程序是一个复杂的过程,涉及到多个方面的知识。 一、 触摸屏和PLC概述 触摸屏概述 触摸屏是一种交互式输入设备,用户可以通过
    的头像 发表于07-01 14:46 735次阅读

    人机界面触摸屏如何触摸校正屏幕

    人机界面(Human-Machine Interface,简称HMI) 触摸屏是一种广泛应用于工业自动化、智能家居、医疗设备等领域的交互设备。 触摸屏的校正对于确保设备的正常运行和提高用户体验至关重要
    的头像 发表于07-01 14:36 563次阅读

    ESP32-S2-HMI-DevKit-1开发板如何实现lcd竖显示?

    ESP32-S2-HMI-DevKit-1 开发板上用到的一些外设的手册,lcd(rm68120), 触摸屏ft5x06),温湿度传感器(hdc1080)等,这个可以从哪去下载,多谢。
    发表于06-28 06:50

    组态软件和触摸屏软件的区别是什么?

    是在PC上使用,它可以使用PC上的大屏幕和键盘鼠标输入,而 触摸屏软件则需要使用 触摸屏幕进行操作。 3. 软件 开发环境不同:组态软件需要在PC上安装 开发环境和配置工具,而
    的头像 发表于04-24 14:04 681次阅读

    手机触摸屏失灵的原因及解决方法 手机触摸屏失灵怎么关机

    手机 触摸屏失灵的原因及解决方法: 一、原因: 软件问题:当手机运行过程中出现一些错误或者存储空间不足时,可能会导致 触摸屏失灵。此时,重启或者进行软件更新可能会解决问题。 硬件问题:如果手机摔落、遭受
    的头像 发表于01-24 17:48 1.7w次阅读

    电容触摸屏原理 电容触摸屏和电阻触摸屏有什么区别

    电容 触摸屏和电阻 触摸屏是两种常见的 触摸屏技术,它们在原理、结构和应用方面都有很大的区别。下面将详细介绍电容 触摸屏的原理、结构和特点,并与电阻 触摸屏
    的头像 发表于01-22 16:13 2499次阅读

    方法|如何为开发板调试新的触摸屏

    方法|如何为 开发板调试新的 触摸屏
    的头像 发表于11-30 11:30 686次阅读
    方法|如何为<b class='flag-5'>开发</b>板调试新的<b class='flag-5'>触摸屏</b>

    嵌入式Linux触摸屏图形组态软件的研究

    德赢Vwin官网 网站提供《嵌入式 Linux触摸屏图形组态软件的研究.pdf》资料免费下载
    发表于10-13 09:24 0次下载
    嵌入式<b class='flag-5'>Linux</b>的<b class='flag-5'>触摸屏</b>图形组态软件的研究

    如何添加触摸屏驱动到TouchGFX中?

    使用STM32CubeMX移植TouchGFX 一文中介绍了如何用TouchGFX点亮屏幕,但是此时屏幕还没有 触摸的功能。下面将介绍如何添加 触摸屏 驱动到TouchGFX中
    的头像 发表于10-09 14:41 1549次阅读

    Linux模块相关命令Linux驱动模块的编写与挂载

    Linux模块相关命令 Linux 驱动模块的 编写与挂载
    发表于10-01 12:20 314次阅读
    <b class='flag-5'>Linux</b>模块相关命令 <b class='flag-5'>Linux</b><b class='flag-5'>驱动</b>模块的<b class='flag-5'>编写</b>与挂载

    触摸屏漏电乱点怎么处理?触摸屏时好时坏的原因及维修常见方法

    触摸屏漏电乱点怎么处理如果 触摸屏出现漏电或乱点的问题,您可以尝试以下几种处理方法:1.清洁屏幕:使用柔软的纤维布轻轻擦拭 触摸屏表面,确保屏幕干净,没有污垢或油脂等物质。污垢可能会导致 触摸屏
    的头像 发表于09-16 08:20 6020次阅读
    <b class='flag-5'>触摸屏</b>漏电乱点怎么处理?<b class='flag-5'>触摸屏</b>时好时坏的原因及维修常见方法

    触摸屏漏电乱点怎么处理触摸屏时好时坏的原因

    触摸屏时好时坏可能存在以下一些常见原因:   1. 软件问题: 触摸屏问题有时可能是由于设备上的软件问题引起的,例如操作系统的故障、 驱动程序的失效或冲突等。这些问题可能导致 触摸屏的响应
    发表于09-14 15:33 2625次阅读

    触摸屏物体识别技术有哪些触摸屏怎么区分电容和电阻

    电容式 触摸屏通过感应电场变化来识别和跟踪 触摸物体。常见的电容式 触摸屏包括表面电容式 触摸屏和投影电容式 触摸屏
    发表于09-06 15:41 2334次阅读