RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux驅動開發(fā)-編寫FT5X06觸摸屏驅動

DS小龍哥-嵌入式技術 ? 2022-09-17 15:27 ? 次閱讀

【摘要】 這篇文章介紹在Linux下如何編寫FT5X06系列芯片驅動,完成觸摸屏的驅動開發(fā), FT5X06是一個系列,當前使用的具體型號是FT5206,它是一個電容屏的觸摸芯片,內置了8位的單片機(8051內核),完成了坐標換算等很多處理,在通過IIC,SPI方式傳遞給外部單片機。

1. 前言

這篇文章介紹在Linux下如何編寫FT5X06系列芯片驅動,完成觸摸屏的驅動開發(fā), FT5X06是一個系列,當前使用的具體型號是FT5206,它是一個電容屏的觸摸芯片,內置了8位的單片機(8051內核),完成了坐標換算等很多處理,在通過IIC,SPI方式傳遞給外部單片機。

image-20220118132721456

所說起觸摸屏大家都不會陌生,現在手機、手表、家電、很多地方都支持觸摸了。最開始的觸摸屏都是電阻屏,在諾基亞時代的時候,使用的觸摸屏都是電阻屏,后來Android興起的時候,手機都向電容屏發(fā)展了。電阻屏需要自己去校準,電阻屏的手機上都有這個功能,發(fā)現觸摸不靈敏之后,打開校準選項,根據屏幕上十字圖標指引,按順序點一下,完成坐標校準,電阻屏的屏幕還是軟材質,必須要手指去戳才可以完成控制,而且只能支持單點觸控?,F在電容屏就很方便了,只需要手指去觸摸屏即可完成操作,比電阻屏方便很多,還支持多點觸控,當初Android手機剛興起的時候,大街小巷的體驗店,廣告都是切水果游戲,切水果這個游戲就充分體驗了多點觸摸的效果,可以多個手指去切水果,當初這個游戲還是火爆的。

當前文章介紹的FT5206就是一顆電容屏的驅動芯片,最高支持2點觸控,可以通過獲取兩個坐標點,這個系列的芯片最高支持10點觸控。

當前使用的屏幕型號是S702,這個屏幕是友善之臂生產的LCD屏,S702這款屏幕采用的觸摸芯片就是FT5206,引出了IIC接口,支持筆中斷,官方的內核里也提供了例子驅動可以參考。

開發(fā)板與觸摸芯片的連線示例:

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下編寫標準的觸摸屏驅動需要使用到輸入子系統(tǒng),當前文章的重點是讀取觸摸屏的坐標,所以示例代碼里不會加輸入子系統(tǒng)的代碼,只是在驅動層完成觸摸屏筆中斷響應,觸摸屏的坐標點獲取并打印。

驅動代碼里涉及的技術點有: IIC子系統(tǒng)、工作隊列、內核中斷等知識點。

這是開發(fā)板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");
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 觸摸屏
    +關注

    關注

    42

    文章

    2301

    瀏覽量

    116117
  • 驅動
    +關注

    關注

    12

    文章

    1838

    瀏覽量

    85262
  • ft5x06
    +關注

    關注

    0

    文章

    2

    瀏覽量

    4987
收藏 人收藏

    評論

    相關推薦

    開發(fā)觸摸屏驅動板需要考慮哪些因素

    驅動板是現代電子設備中不可或缺的一部分,它負責將用戶的觸摸操作轉化為設備可以理解的信號。觸摸屏驅動板需要通過多個關鍵步驟來實現其功能,以
    的頭像 發(fā)表于 10-29 14:05 ?335次閱讀

    linux內核中通用HID觸摸驅動

    linux內核中,為HID觸摸面板實現了一個通用的驅動程序,位于/drivers/hid/hid-multitouch.c文件中。hid觸摸驅動
    的頭像 發(fā)表于 10-29 10:55 ?537次閱讀
    <b class='flag-5'>linux</b>內核中通用HID<b class='flag-5'>觸摸</b><b class='flag-5'>驅動</b>

    TSC2101觸摸屏、電池和音頻WinCE驅動程序

    電子發(fā)燒友網站提供《TSC2101觸摸屏、電池和音頻WinCE驅動程序.pdf》資料免費下載
    發(fā)表于 10-23 10:13 ?0次下載
    TSC2101<b class='flag-5'>觸摸屏</b>、電池和音頻WinCE<b class='flag-5'>驅動</b>程序

    觸摸屏驅動板無法燒寫程序的相關原因

    每次聽到別人說是什么原因導致觸摸屏驅動板無法燒寫程序,就很想去討論一下。今天就跟大家聊聊到底是什么原因導致的。
    的頭像 發(fā)表于 10-21 11:19 ?216次閱讀

    linux驅動程序如何加載進內核

    Linux系統(tǒng)中,驅動程序是內核與硬件設備之間的橋梁。它們允許內核與硬件設備進行通信,從而實現對硬件設備的控制和管理。 驅動程序的編寫 驅動
    的頭像 發(fā)表于 08-30 15:02 ?439次閱讀

    Linux 驅動開發(fā)與應用開發(fā),你知道多少?

    一、Linux驅動開發(fā)與應用開發(fā)的區(qū)別開發(fā)層次不同:Linux
    的頭像 發(fā)表于 08-30 12:16 ?746次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>驅動</b><b class='flag-5'>開發(fā)</b>與應用<b class='flag-5'>開發(fā)</b>,你知道多少?

    RK3568多次insmod觸摸驅動后提示中斷不匹配

    ;linux/delay.h> // 定義 ft5x06 設備的 GPIO 描述符 struct gpio_desc *reset_gpio, *irq_gpio; // ft5x06 中斷
    發(fā)表于 07-24 23:44

    LCD觸摸屏的PCB設計

    液晶顯示(LCD)和觸摸屏技術已經成為各種電子設備的核心組成部分,從智能手機到電視和醫(yī)療設備。在這些設備中,PCB的設計對于LCD和觸摸屏的性能和可靠性至關重要。下面將討論LCD
    的頭像 發(fā)表于 07-18 11:17 ?2061次閱讀
    LCD<b class='flag-5'>屏</b>和<b class='flag-5'>觸摸屏</b>的PCB設計

    觸摸屏和plc的程序怎么編寫

    編寫觸摸屏和PLC程序是一個復雜的過程,涉及到多個方面的知識。 一、觸摸屏和PLC概述 觸摸屏概述 觸摸屏是一種交互式輸入設備,用戶可以通過
    的頭像 發(fā)表于 07-01 14:46 ?2407次閱讀

    人機界面觸摸屏如何觸摸校正屏幕

    人機界面(Human-Machine Interface,簡稱HMI)觸摸屏是一種廣泛應用于工業(yè)自動化、智能家居、醫(yī)療設備等領域的交互設備。觸摸屏的校正對于確保設備的正常運行和提高用戶體驗至關重要
    的頭像 發(fā)表于 07-01 14:36 ?1620次閱讀

    ESP32-S2-HMI-DevKit-1開發(fā)板如何實現lcd豎顯示?

    ESP32-S2-HMI-DevKit-1開發(fā)板上用到的一些外設的手冊,lcd(rm68120),觸摸屏ft5x06),溫濕度傳感器(hdc1080)等,這個可以從哪去下載,多謝。
    發(fā)表于 06-28 06:50

    組態(tài)軟件和觸摸屏軟件的區(qū)別是什么?

    是在PC上使用,它可以使用PC上的大屏幕和鍵盤鼠標輸入,而觸摸屏軟件則需要使用觸摸屏幕進行操作。 3. 軟件開發(fā)環(huán)境不同:組態(tài)軟件需要在PC上安裝開發(fā)環(huán)境和配置工具,而
    的頭像 發(fā)表于 04-24 14:04 ?1166次閱讀

    手機觸摸屏失靈的原因及解決方法 手機觸摸屏失靈怎么關機

    手機觸摸屏失靈的原因及解決方法: 一、原因: 軟件問題:當手機運行過程中出現一些錯誤或者存儲空間不足時,可能會導致觸摸屏失靈。此時,重啟或者進行軟件更新可能會解決問題。 硬件問題:如果手機摔落、遭受
    的頭像 發(fā)表于 01-24 17:48 ?2.1w次閱讀

    電容觸摸屏的分辨率怎么調

    電容觸摸屏的分辨率調整是通過調整觸摸屏的控制器的參數來實現的。觸摸屏的分辨率是指能夠在屏幕上識別的最小觸摸點的像素數量。分辨率越高,觸摸屏
    的頭像 發(fā)表于 01-23 16:59 ?1933次閱讀

    電容觸摸屏原理 電容觸摸屏和電阻觸摸屏有什么區(qū)別

    電容觸摸屏和電阻觸摸屏是兩種常見的觸摸屏技術,它們在原理、結構和應用方面都有很大的區(qū)別。下面將詳細介紹電容觸摸屏的原理、結構和特點,并與電阻觸摸屏
    的頭像 發(fā)表于 01-22 16:13 ?4494次閱讀
    RM新时代网站-首页