【摘要】 這篇文章介紹在Linux下如何編寫(xiě)FT5X06系列芯片驅(qū)動(dòng),完成觸摸屏的驅(qū)動(dòng)開(kāi)發(fā), FT5X06是一個(gè)系列,當(dāng)前使用的具體型號(hào)是FT5206,它是一個(gè)電容屏的觸摸芯片,內(nèi)置了8位的單片機(jī)(8051內(nèi)核),完成了坐標(biāo)換算等很多處理,在通過(guò)IIC,SPI方式傳遞給外部單片機(jī)。
1. 前言
這篇文章介紹在Linux下如何編寫(xiě)FT5X06系列芯片驅(qū)動(dòng),完成觸摸屏的驅(qū)動(dòng)開(kāi)發(fā), FT5X06是一個(gè)系列,當(dāng)前使用的具體型號(hào)是FT5206,它是一個(gè)電容屏的觸摸芯片,內(nèi)置了8位的單片機(jī)(8051內(nèi)核),完成了坐標(biāo)換算等很多處理,在通過(guò)IIC,SPI方式傳遞給外部單片機(jī)。
所說(shuō)起觸摸屏大家都不會(huì)陌生,現(xiàn)在手機(jī)、手表、家電、很多地方都支持觸摸了。最開(kāi)始的觸摸屏都是電阻屏,在諾基亞時(shí)代的時(shí)候,使用的觸摸屏都是電阻屏,后來(lái)Android興起的時(shí)候,手機(jī)都向電容屏發(fā)展了。電阻屏需要自己去校準(zhǔn),電阻屏的手機(jī)上都有這個(gè)功能,發(fā)現(xiàn)觸摸不靈敏之后,打開(kāi)校準(zhǔn)選項(xiàng),根據(jù)屏幕上十字圖標(biāo)指引,按順序點(diǎn)一下,完成坐標(biāo)校準(zhǔn),電阻屏的屏幕還是軟材質(zhì),必須要手指去戳才可以完成控制,而且只能支持單點(diǎn)觸控?,F(xiàn)在電容屏就很方便了,只需要手指去觸摸屏即可完成操作,比電阻屏方便很多,還支持多點(diǎn)觸控,當(dāng)初Android手機(jī)剛興起的時(shí)候,大街小巷的體驗(yàn)店,廣告都是切水果游戲,切水果這個(gè)游戲就充分體驗(yàn)了多點(diǎn)觸摸的效果,可以多個(gè)手指去切水果,當(dāng)初這個(gè)游戲還是火爆的。
當(dāng)前文章介紹的FT5206就是一顆電容屏的驅(qū)動(dòng)芯片,最高支持2點(diǎn)觸控,可以通過(guò)獲取兩個(gè)坐標(biāo)點(diǎn),這個(gè)系列的芯片最高支持10點(diǎn)觸控。
當(dāng)前使用的屏幕型號(hào)是S702,這個(gè)屏幕是友善之臂生產(chǎn)的LCD屏,S702這款屏幕采用的觸摸芯片就是FT5206,引出了IIC接口,支持筆中斷,官方的內(nèi)核里也提供了例子驅(qū)動(dòng)可以參考。
開(kāi)發(fā)板與觸摸芯片的連線示例:
屏幕的實(shí)物圖詳情看下圖的介紹:
2. FT5206寄存器介紹
FT5206支持通過(guò)IIC和SPI接口與外部主機(jī)通信,當(dāng)前使用的屏幕硬件上只是引出了IIC接口,下面就介紹下IIC接口的時(shí)序,設(shè)備地址,還有FT5206的寄存器。
IIC傳輸時(shí)序:
讀寫(xiě)時(shí)序流程:
字段的解釋:
下面的截圖是介紹FT5206內(nèi)部的寄存器地址,一些關(guān)鍵的地方我做了翻譯:
從圖上可以看出,基本上后面的寄存器地址都是重復(fù)的功能,只是坐標(biāo)點(diǎn)不一樣了,其中的TOUCH2,TOUCH3…這些都是存放觸摸屏的坐標(biāo)點(diǎn)的值。當(dāng)前的FT5206只是支持2點(diǎn)觸控,所有就只能讀取兩個(gè)寄存器坐標(biāo)的值。在前面第一個(gè)寄存器TD_STATUS里的低4位,存放了當(dāng)前同時(shí)按下的點(diǎn)數(shù)量,可以將兩個(gè)手指按在屏幕上測(cè)試讀取的值。 這些寄存器里讀取的坐標(biāo)值就是已經(jīng)轉(zhuǎn)換過(guò)后的值,也就是屏幕坐標(biāo),不需要再進(jìn)行二次轉(zhuǎn)換校準(zhǔn),非常方便。
3. 編寫(xiě)觸摸屏驅(qū)動(dòng)
Linux下編寫(xiě)標(biāo)準(zhǔn)的觸摸屏驅(qū)動(dòng)需要使用到輸入子系統(tǒng),當(dāng)前文章的重點(diǎn)是讀取觸摸屏的坐標(biāo),所以示例代碼里不會(huì)加輸入子系統(tǒng)的代碼,只是在驅(qū)動(dòng)層完成觸摸屏筆中斷響應(yīng),觸摸屏的坐標(biāo)點(diǎn)獲取并打印。
驅(qū)動(dòng)代碼里涉及的技術(shù)點(diǎn)有: IIC子系統(tǒng)、工作隊(duì)列、內(nèi)核中斷等知識(shí)點(diǎn)。
這是開(kāi)發(fā)板LCD屏幕的硬件原理圖:
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ù)總線編號(hào)獲取IIC適配器結(jié)構(gòu)體*/
iic_adapter=i2c_get_adapter(1);
/*2. 填充板級(jí)信息*/
iic_info.addr=0x38;
iic_info.irq=gpio_to_irq(EXYNOS4_GPX1(6));
strcpy(iic_info.type,DEVICE_NAME);
/*3. 注冊(cè)IIC設(shè)備端*/
iic_client=i2c_new_device(iic_adapter,&iic_info);
printk("IIC設(shè)備端驅(qū)動(dòng)安裝成功.\n");
return 0;
}
static void __exit iic_dev_exit(void)
{
/*1. 完成設(shè)備端注銷(xiāo)*/
i2c_unregister_device(iic_client);
printk("IIC設(shè)備端驅(qū)動(dòng)卸載成功.\n");
}
/*驅(qū)動(dòng)的入口:insmod xxx.ko*/
module_init(iic_dev_init);
/*驅(qū)動(dòng)的出口: rmmod xxx.ko*/
module_exit(iic_dev_exit);
/*模塊的許可證*/
MODULE_LICENSE("GPL");
/*模塊的作者*/
MODULE_AUTHOR("wbyq");
3.2 驅(qū)動(dòng)端代碼
#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. 讀取坐標(biāo)數(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)度工作: 將工作加入到工作隊(duì)列*/
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è)備名稱(chēng):%s\n",client->name);
touch_client=client;
/*1. 初始化工作隊(duì)列*/
INIT_WORK(&touch_work,tiny4412_touch_work_func);
/*2. 注冊(cè)中斷*/
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. 注銷(xiāo)中斷*/
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. 注冊(cè)IIC驅(qū)動(dòng)端*/
i2c_add_driver(&iic_driver);
printk("驅(qū)動(dòng)安裝成功.\n");
return 0;
}
static void __exit iic_drv_exit(void)
{
/*2. 注銷(xiāo)IIC驅(qū)動(dòng)端*/
i2c_del_driver(&iic_driver);
printk("驅(qū)動(dòng)卸載成功.\n");
}
/*驅(qū)動(dòng)的入口:insmod xxx.ko*/
module_init(iic_drv_init);
/*驅(qū)動(dòng)的出口: rmmod xxx.ko*/
module_exit(iic_drv_exit);
/*模塊的許可證*/
MODULE_LICENSE("GPL");
/*模塊的作者*/
MODULE_AUTHOR("wbyq");
-
觸摸屏
+關(guān)注
關(guān)注
42文章
2319瀏覽量
116827 -
驅(qū)動(dòng)
+關(guān)注
關(guān)注
12文章
1852瀏覽量
85688 -
ft5x06
+關(guān)注
關(guān)注
0文章
2瀏覽量
4992
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論