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

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

3天內(nèi)不再提示

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

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

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

1. 前言

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

image-20220118132721456

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

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

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

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

image-20220118134314453

屏幕的實物圖詳情看下圖的介紹:

image-20220118133946228

2. FT5206寄存器介紹

FT5206支持通過IIC和SPI接口與外部主機通信,當前使用的屏幕硬件上只是引出了IIC接口,下面就介紹下IIC接口的時序,設(shè)備地址,還有FT5206的寄存器。

IIC傳輸時序:

image-20220118135118906

讀寫時序流程:

image-20220118135237716

字段的解釋:

image-20220118135300623

下面的截圖是介紹FT5206內(nèi)部的寄存器地址,一些關(guān)鍵的地方我做了翻譯:

image-20220118135549700image-20220118135610826

從圖上可以看出,基本上后面的寄存器地址都是重復的功能,只是坐標點不一樣了,其中的TOUCH2,TOUCH3…這些都是存放觸摸屏的坐標點的值。當前的FT5206只是支持2點觸控,所有就只能讀取兩個寄存器坐標的值。在前面第一個寄存器TD_STATUS里的低4位,存放了當前同時按下的點數(shù)量,可以將兩個手指按在屏幕上測試讀取的值。 這些寄存器里讀取的坐標值就是已經(jīng)轉(zhuǎn)換過后的值,也就是屏幕坐標,不需要再進行二次轉(zhuǎn)換校準,非常方便。

3. 編寫觸摸屏驅(qū)動

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

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

這是開發(fā)板LCD屏幕的硬件原理圖:

image-20220118140556674

3.1 設(shè)備端代碼(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. 根據(jù)總線編號獲取IIC適配器結(jié)構(gòu)體*/
	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設(shè)備端*/
	iic_client=i2c_new_device(iic_adapter,&iic_info);
	
    printk("IIC設(shè)備端驅(qū)動安裝成功.\n");
    return 0;
}
static void __exit iic_dev_exit(void)
{
	/*1. 完成設(shè)備端注銷*/
	i2c_unregister_device(iic_client);
	
    printk("IIC設(shè)備端驅(qū)動卸載成功.\n");
}

/*驅(qū)動的入口:insmod xxx.ko*/
module_init(iic_dev_init);
/*驅(qū)動的出口: rmmod xxx.ko*/
module_exit(iic_dev_exit);
/*模塊的許可證*/
MODULE_LICENSE("GPL");
/*模塊的作者*/
MODULE_AUTHOR("wbyq");

3.2 驅(qū)動端代碼

#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;

/*工作函數(shù)*/
void tiny4412_touch_work_func(struct work_struct *work)
{
	u8 touch_buff[7];
	u16 x,y;
	/*1. 讀取坐標數(shù)據(jù)*/
	i2c_smbus_read_i2c_block_data(touch_client,0,7,touch_buff);
	/*2. 打印數(shù)據(jù)*/
	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);
}

/*
中斷的服務(wù)函數(shù)
*/
irqreturn_t tiny4412_touch_irq_handler(int irq, void *dev)
{
	/*調(diào)度工作: 將工作加入到工作隊列*/
	schedule_work(&touch_work);	
	return IRQ_HANDLED;
}

static int iic_probe(struct i2c_client *client, const struct i2c_device_id *dev_id)
{
	printk("設(shè)備地址:0x%X\n",client->addr);
	printk("設(shè)備名稱:%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驅(qū)動端*/
	i2c_add_driver(&iic_driver);
    printk("驅(qū)動安裝成功.\n");
    return 0;
}

static void __exit iic_drv_exit(void)
{
	/*2. 注銷IIC驅(qū)動端*/
	i2c_del_driver(&iic_driver);
    printk("驅(qū)動卸載成功.\n");
}

/*驅(qū)動的入口:insmod xxx.ko*/
module_init(iic_drv_init);
/*驅(qū)動的出口: rmmod xxx.ko*/
module_exit(iic_drv_exit);
/*模塊的許可證*/
MODULE_LICENSE("GPL");
/*模塊的作者*/
MODULE_AUTHOR("wbyq");
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 觸摸屏
    +關(guān)注

    關(guān)注

    42

    文章

    2284

    瀏覽量

    115795
  • 驅(qū)動
    +關(guān)注

    關(guān)注

    12

    文章

    1818

    瀏覽量

    85110
  • ft5x06
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    4980
收藏 人收藏

    評論

    相關(guān)推薦

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

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

    linux內(nèi)核中通用HID觸摸驅(qū)動

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

    TSC2101觸摸屏、電池和音頻WinCE驅(qū)動程序

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

    觸摸屏驅(qū)動板無法燒寫程序的相關(guān)原因

    每次聽到別人說是什么原因?qū)е?b class='flag-5'>觸摸屏驅(qū)動板無法燒寫程序,就很想去討論一下。今天就跟大家聊聊到底是什么原因?qū)е碌摹?/div>
    的頭像 發(fā)表于 10-21 11:19 ?127次閱讀

    linux驅(qū)動程序如何加載進內(nèi)核

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

    Linux 驅(qū)動開發(fā)與應(yīng)用開發(fā),你知道多少?

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

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

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

    LCD觸摸屏的PCB設(shè)計

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

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

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

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

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

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

    ESP32-S2-HMI-DevKit-1開發(fā)板上用到的一些外設(shè)的手冊,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 ?1042次閱讀

    手機觸摸屏失靈的原因及解決方法 手機觸摸屏失靈怎么關(guān)機

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

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

    電容觸摸屏和電阻觸摸屏是兩種常見的觸摸屏技術(shù),它們在原理、結(jié)構(gòu)和應(yīng)用方面都有很大的區(qū)別。下面將詳細介紹電容觸摸屏的原理、結(jié)構(gòu)和特點,并與電阻觸摸屏
    的頭像 發(fā)表于 01-22 16:13 ?3811次閱讀

    方法|如何為開發(fā)板調(diào)試新的觸摸屏

    方法|如何為開發(fā)板調(diào)試新的觸摸屏
    的頭像 發(fā)表于 11-30 11:30 ?854次閱讀
    方法|如何為<b class='flag-5'>開發(fā)</b>板調(diào)試新的<b class='flag-5'>觸摸屏</b>