linux下i2c接口的電容觸摸屏驅(qū)動開發(fā)2_第1頁
linux下i2c接口的電容觸摸屏驅(qū)動開發(fā)2_第2頁
linux下i2c接口的電容觸摸屏驅(qū)動開發(fā)2_第3頁
linux下i2c接口的電容觸摸屏驅(qū)動開發(fā)2_第4頁
linux下i2c接口的電容觸摸屏驅(qū)動開發(fā)2_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

原文地址:

/god_sperm/blog/item/2aaac228e8a1ece8e7cd400a.html

電容觸摸屏

2011-01-1415:36

1.Kconfig文件

增加宏定義2.Makefile文件

增加編譯處理3.添加程序源碼Touchscreenremotecontroldesigndocument

2010年11月08日星期一13:08Touchscreenremotecontroldesigndocument1.開發(fā)板環(huán)境

a)Mini2440開發(fā)板。Arm9處理器+64MSRAM+64MFlash+3.5’觸摸屏LCD

b)Linux2.6.32kernel,支持多點觸摸觸摸屏+Qtopia2.2.20圖形用戶界面系統(tǒng)

c)AVR單片機+加速度傳感器+紅外一體化接收頭+紅外發(fā)射二極管

2.主機開發(fā)環(huán)境

a)Vmware6.0安裝Fedora10系統(tǒng),按照友善之臂mini2440使用手冊來建立開發(fā)環(huán)境。最好在安裝fedora10的過程中將所有的可選項全部安裝,以免后續(xù)開發(fā)過程中遇到不可預(yù)知的問題。Fedora10默認不能以root用戶登陸圖形用戶界面,需要以普通用戶登陸之后在命令終端中su切換到root用戶,然后修改文件/etc/pam.d/gdm。將authrequiredpam_succeed_if.souser!=rootquiet這句注銷。

b)按照友善之臂用戶手冊建立交叉開發(fā)環(huán)境。安裝arm-linux-gcc4.3.2,arm-qtopia,x86-qtopia,root-qtopia,linux-2.6.32-friendlyarm到系統(tǒng)中。安裝的過程中有一個問題是,不能夠同時編譯arm-qtopia和x86-qtopia,如果這樣做,會發(fā)生不可預(yù)知的錯誤。典型問題是qt2的designer打開后是透明的,無法操作。

c)遙控器解碼目前采用FPGA平臺來完成的,所以主機具有FPGA開發(fā)環(huán)境(quartus9.0)

d)紅外發(fā)射與加速度傳感器的手勢操作室通過AVR單片機完成的,所以主機具有AVR單片機開發(fā)環(huán)境(Keil4)

3.圖形界面編碼

a)Arm-qtopia文件夾中安裝了qt2,在qt2的bin目錄下執(zhí)行designer就可以進入qt的圖形開發(fā)界面。你可以圖形化的創(chuàng)建自己的UI,可以直接建立各個控件之間或者控件與主窗口之間的信號與槽的鏈接。一般而言,做QT界面的嵌入式開發(fā),都會涉及到幾個基本的問題,那就是類的繼承、虛函數(shù)、構(gòu)造函數(shù)的重載。通過designer設(shè)計的界面保存后會生成相應(yīng)的源文件,這些文件用戶編輯是無效的,因為重新生成后所有用戶的更改都會消失。所以最有效的方式是用戶通過繼承主窗口類,然后在子類中通過虛函數(shù)來實現(xiàn)與父類函數(shù)的交互調(diào)用。代碼編寫完畢后,需要設(shè)置當(dāng)前的環(huán)境變量(調(diào)用友善已經(jīng)提供的適用于arm平臺的腳本就可以),編寫工程文件*.pro,編寫快捷方式*.desktop。最后編譯生成arm平臺的可執(zhí)行文件,查看Makefile的DESTDIR和TARGET可以知道目標(biāo)文件被生成在哪里。同時通過file命令查看文件類型。將可執(zhí)行文件拷貝到開發(fā)板的/opt/Qtopia/bin目錄下,將*.desktop拷貝到開發(fā)板的/opt/Qtopia/apps/Applications就可以在開發(fā)板的Applications目錄下看到相應(yīng)的文件快捷方式。附錄一闡明.pro文件格式與.desktop文件格式。

b)X86-qtopia是嵌入式界面的PC模擬平臺,利用qvfb來模擬arm平臺上的qtopia系統(tǒng)。開發(fā)過程就是普通的qt開發(fā),利用qt2的designer來做界面或者自己手寫代碼。同樣編寫pro文件與desktop文件,設(shè)置環(huán)境變量(X86平臺的腳本),編譯生成x86平臺的可執(zhí)行文件,拷貝至Qtopia安裝目錄下的image/opt/Qtopia/bin將desktop文件拷貝至Qtopia安裝目錄下的image/opt/Qtopia/apps/Applications目錄下,然后回到x86-qtopia的根目錄,執(zhí)行腳本run就可以利用qvfb啟動模擬器。主要是為了方便開發(fā)軟件而做了這樣一個pc的模擬。

c)遙控器的界面V1.0采用的是qtdesigner設(shè)計,可以給控件加載不同的背景效果來美化界面。遙控器的基本功能實現(xiàn),但是由于qtdesigner的控件相對較少,對于嵌入式開發(fā)平臺能夠使用的控件就更加不足,所以v1.0界面比較死板,button都是矩形,不能創(chuàng)建不規(guī)則形狀的控件,采用圖片做界面的背景會使得程序的響應(yīng)非常之慢。所以V1.0的界面就此擱置。

遙控器界面V2.0使用QT加皮膚的方法來使得界面更加美觀。參考資料為IBM文檔庫中的《使用QT制作Skin》。附錄二貼出原文以保存。程序源文件中已經(jīng)給出比較詳細的注釋,在此不分析源代碼,主要就是修改上述鏈接中提供的方法來實現(xiàn)。界面程序同時還打開串口與單片機通信,調(diào)用蜂鳴器實現(xiàn)按鍵發(fā)聲。所用代碼為友善之臂提供的example中的相關(guān)代碼。有一定修改,有注釋。在本程序中,使用CON3與單片機通信。設(shè)置波特率115200Bd,數(shù)據(jù)位8bits,停止位1bit,無校驗,無流控制。在圖形界面編碼中遇到幾個典型的問題:一是嵌入式C開發(fā)中volatile關(guān)鍵字的使用時為了強制編譯器每次使用到volatile變量時都從變量原始地址取值,防止編譯器的自動優(yōu)化。這樣一個關(guān)鍵字的使用是區(qū)別C程序員與嵌入式程序員的首要因素。第二個典型問題是在C++代碼中調(diào)用C庫函數(shù)的頭文件,一般會使用externC關(guān)鍵字來告訴編譯器正在使用C頭文件。第三個典型問題是函數(shù)的作用域問題以及C函數(shù)與C++函數(shù)重名的問題。在C++的類的成員函數(shù)中要使用C頭文件定義的函數(shù)需要使用::作用域符號,例如要使用C函數(shù)close()關(guān)閉蜂鳴器,則應(yīng)該使用::close()的調(diào)用方式來告訴編譯器當(dāng)前cpp文件中這個函數(shù)是定義在externC包含的C頭文件中的,而不是C++頭文件中定義的close。

程序編寫調(diào)試完畢后,執(zhí)行如下操作:

i.將可執(zhí)行文件拷貝到開發(fā)板的/opt/Qtopia/bin

ii.將.desktop拷貝到開發(fā)板的/opt/Qtopia/apps/Applications

iii.將skin文件夾拷貝到開發(fā)板的/opt/Qtopia/pics/remote/

重啟開發(fā)板就可以在Applications目錄下看到自定義的快捷方式。另外,根據(jù)qtopia系統(tǒng)的架構(gòu),可以自己創(chuàng)建一個目錄來存放自己的desktop文件。例如:在/opt/Qtopia/目錄下建立文件夾SEU,同時拷貝Applications目錄下的隱藏文件.directory到SEU文件夾下,然后修改.directory文件,重啟就可以看到SEU的分類目錄。

4紅外信號編解碼

a)暫無

5I2C電容觸摸屏驅(qū)動

a)I2C通信協(xié)議在這里使用100K的通信速率,其他不做介紹。linux系統(tǒng)下編寫I2C驅(qū)動,主要有兩種方式,一種是把I2C設(shè)備當(dāng)作一個普通的字符設(shè)備來處理,另一種是利用linuxI2C驅(qū)動體系結(jié)構(gòu)來完成。本文采用利用linuxI2C體系結(jié)構(gòu)來完成驅(qū)動。主要工作就是向linuxI2C體系結(jié)構(gòu)注冊觸摸屏設(shè)備,然后在中斷服務(wù)程序中向input子系統(tǒng)上報多點觸摸的坐標(biāo)以及手勢參數(shù)等等。關(guān)于I2C體系結(jié)構(gòu)詳見文章《實例解析linux內(nèi)核I2C體系結(jié)構(gòu)》原文鏈接為

/Column/Column190.htm

/Column/Column213.htm

b)友善之臂更新的linux-2.6.32的內(nèi)核中已經(jīng)做好了I2C的適配器的硬件驅(qū)動和適配器的algorithm。在源文件linux-/drivers/i2c/busses/i2c-s3c2410.c中完全實現(xiàn)。所以要驅(qū)動此I2C電容觸摸屏,只需要編寫觸摸屏的設(shè)備驅(qū)動即可。參考內(nèi)核自帶的I2C觸摸屏的驅(qū)動

linux-/drivers/input/touchscreen/migor_ts.c來編寫,只不過這個觸摸屏是單點觸摸屏。我們要做多點觸摸,所以必須使用2.6.32的內(nèi)核中已經(jīng)做好的支持多點觸摸的input子系統(tǒng)。參考鏈接為:《Linux的I2C設(shè)備驅(qū)動--mini2440上i2c接口觸摸屏驅(qū)動》

/home.php?mod=space&uid=273398&do=blog&id=149486

在創(chuàng)建和配置I2C設(shè)備linux-/arch/arm/mach-s3c2440/mach-mini2440.c中,應(yīng)添加代碼為:

#include<linux/i2c.h>/*I2Ctouchscreendevices*/

/*busconfiguration*/

staticstructs3c2410_platform_i2ci2c_ts_cfg__initdata={

.flags

=0,

.slave_addr=0x02,//7bitaddress

.frequency=100*1000,//100kHz

.sda_delay=2,

};/*I2Cdevicenameis"cypress_ts",7bitsaddressis0x02,interruputiseint20*/

staticstructi2c_board_infoi2c_ts_devices[]__initdata={

//I2C_BOARD_INFO("cypress_ts",0x02),

{

.type="cypress_ts",

.addr=0x02,

.irq=IRQ_EINT20,},

{}};在如下初始化函數(shù)中初始化I2C設(shè)備,注冊I2C觸摸屏

staticvoid__initmini2440_machine_init(void)

{

………………

/*i2ctouchscreendevices*/

s3c_i2c0_set_platdata(&i2c_ts_cfg);

i2c_register_board_info(0,i2c_ts_devices,ARRAY_SIZE(i2c_ts_devices));

/****************************/

………………

}

c)Input子系統(tǒng)簡單介紹如下:參見文章《linux內(nèi)核input子系統(tǒng)解析》原文鏈接為:/Column/Column289.htm

同時可以分析2.6.32系統(tǒng)內(nèi)核源文件。上文只講述了子系統(tǒng)的結(jié)構(gòu)和工作原理,但是對于多點觸摸input子系統(tǒng)沒有過多解釋,參考linux自帶的documentMulti-touch(MT)Protocol可知,本系統(tǒng)的多點觸摸的上報機制應(yīng)該如下所示:

1.

ABS_MT_TRACKING_ID

2.

ABS_MT_POSITION_X

3.

ABS_MT_POSITION_Y

4.

SYN_MT_REPORT

5.

ABS_MT_TRACKING_ID

6.

ABS_MT_POSITION_X

7.

ABS_MT_POSITION_Y

8.

SYN_MT_REPORT

9.

SYN_REPORT

參考文檔《29內(nèi)核輸入子系統(tǒng)多點上報機制實現(xiàn)》

/tjd0227/archive/2010/06/13/5669620.aspx

d)附錄四會給出修改好的cypress_ts.c源文件,即為I2C觸摸屏的設(shè)備驅(qū)動。除此之外,還需要修改Kconfig文件和Makefile文件以使得能夠在menuconfig中選中我們的I2C觸摸屏驅(qū)動并編譯生成模塊或者直接編譯進內(nèi)核。具體操作為:修改linux-/drivers/input/touchscreen/Kconfig文件,添加如下代碼:

configTOUCHSCREEN_CYPRESS

tristate"CypressI2Ctouchscreen"

dependsonI2C

help

SayYheretoenablecypressi2ctouchscreensupport.

Ifunsure,sayN.

Tocompilethisdriverasamodule,chooseMhere:the

modulewillbecalledcypress_ts.

修改linux-/drivers/input/touchscreen/Makefile文件,添加如下代碼:

obj-$(CONFIG_TOUCHSCREEN_CYPRESS)+=cypress_ts.o

e)連接I2C觸摸屏到mini2440上,利用GPIO口或者CAMERA接口(CON20)的I2C信號線即可。在此利用CON20,連接SCL到I2CSCL,SDA到I2CSDA,VCC到VDD3.3V,GND到GND,連接INT到EINT20(利用20號中斷,在i2c_ts_devices[]__initdata中定義了設(shè)備名,器件地址,中斷號)

f)重新編譯內(nèi)核,拷貝生成的模塊文件cypress_ts.ko到開發(fā)板下執(zhí)行,即可以在開發(fā)板上創(chuàng)建設(shè)備/dev/input/event1給I2C電容觸摸屏。編寫測試程序,讀取觸摸屏上報給event1的數(shù)據(jù)值。簡單程序為:

staticintfd_cypress_ts=-1;

staticstructinput_eventev_ts;

fd_cypress_ts=open(“/dev/input/event1”,O_RDONLY);

read(fd_cypress_ts,&ev_ts,sizeof(ev_ts));

while(1){

printf(“%d%d%d”,ev_ts.type,ev_ts.code,ev_ts.value);

}附錄一pro文件格式,desktop文件格式

1.項目文件

項目文件(*.pro)用于生成Makefile文件,詳細介紹可以參考《qmake使用手冊》(qmake-manual.html);

#示例文件

TEMPLATE=app

DESTDIR=/home/helloapp

HEADERS+=hello.h

SOURCES+=hello.cpp

SOURCES+=main.cpp

DEFINES+=QT_DLL

CONFIG+=qtwarn_onrelease如果條目是單值的,比如template或者目的目錄,我們是用“=”,但如果是多值條目,我們使用“+=”來為這個類型添加現(xiàn)有的條目。使用“=”會用新值替換原有的值,例如,如果我們寫了DEFINES=QT_DLL,其它所有的定義都將被刪除。2.main.cpp

main.cpp文件格式的詳細介紹見“qtopia2.1官方文檔\html\mainfunc.html”;形式如下:

QTOPIA_ADD_APPLICATION(NAME,IMPLEMENTATION)

QTOPIA_MAINIMPLEMENTATION–應(yīng)用程序主窗口類

NAME

-“可執(zhí)行文件名”3.desktop文件

Exec

=example-可執(zhí)行文件名

Icon

=Example-圖標(biāo)文件名

Name[]=Example-顯示的快捷圖標(biāo)的標(biāo)題

原文連接:/daysummer/archive/2007/03/30/1546804.aspx附錄二《使用QT制作Skin》

軟件界面的風(fēng)格變化可以通過兩種機制完成,一種是通過設(shè)置主題(Themes),它使用界面庫本身所具有的對界面組件(Components)的控制能力切換顯示風(fēng)格;另外一種是通過提供不同系列的圖片來切換顯示界面,即這里所講的Skin。

制作表皮有幾個重要的因素值得考慮:

1.使用無邊界的窗口

在XWindow下,無邊界的窗口是指不受窗口管理器管理的邊界不規(guī)則的窗口。由于不受窗口管理器管理管理,所以軟件窗口界面沒有附加的標(biāo)題條(TitleBar)等。在Qt中,建立無邊界窗口的最簡單的方法是設(shè)置QWidget的WFlags的值是WStyle_NoBorder。它定義在qnamespace.h中。不規(guī)則窗口的特點則要求對整個窗口使用圖像掩碼。使用X窗口形狀的擴展(XShapeExtension)來達到要求。在Qt中可以直接使用,

QBitmapbm;

bm=*(Pixmaps[MASK]);

setMask(bm);

setBackgroundPixmap(*Pixmaps[BACKGROUND]);

2.窗口的移動

由于上述窗口不受窗口管理器的管理的特性,所以移動窗口需要特殊處理,一般的方法是截取根Widget的鼠標(biāo)按鈕事件,自己處理鼠標(biāo)點擊和移動的事件。

voidSkinDemo::mouseMoveEvent(QMouseEvent*e)

{

QPointnewpos=e->globalPos();

QPointupleft=pos0+newpos-last;

move(upleft);

}

voidSkinDemo::mousePressEvent(QMouseEvent*e)

{

last=e->globalPos();

pos0=e->globalPos()-e->pos();

}

這里我們?nèi)〉玫氖髽?biāo)位置是絕對位置,即相對于根窗口的位置,同時也記錄下窗口左上角的位置,當(dāng)鼠標(biāo)移動時,取得新的絕對位置,則窗口左上角的新位置應(yīng)該是原來位置與鼠標(biāo)移動的位置之差。3.按鈕的制作

對于表皮中的圖像按鈕,設(shè)置它的父類是QButton,這種按鈕由兩幅圖片構(gòu)成,一幅圖片是正常狀態(tài)(Normal),一幅圖片是按鈕按下時的狀態(tài)(Activated)。有時也可以設(shè)置成四種狀態(tài),即增加禁止?fàn)顟B(tài)(Disabled)和鼠標(biāo)指針進入時的狀態(tài)(Hovered)。

在例子(qt-skin-example.tar.gz)中,我們重新定義了鼠標(biāo)按下和鼠標(biāo)移動的事件處理函數(shù),并且含有按鈕的所有信息,主工作區(qū)的所有信息等。主工作區(qū)的信息是它的位置和尺寸,主窗口的信息是它所使用的背景圖片和圖片的掩碼(用來制造不規(guī)則窗口),所以整個主窗口的大小可以由圖片的尺寸來決定。幾個按鈕的信息包含它們的位置,它們的大小由圖片的大小來決定。

原文鏈接:/developerworks/cn/linux/guitoolkit/qt/skin/index.html附錄三I2C觸摸屏參數(shù)

a)總體特性

i.電容型觸摸屏

ii.大小為3.5”,分辨率為240x320

iii.采用Cypress的觸摸屏控制器cy8ctmg110

iv.支持單點、兩點觸摸及手勢識別

v.掃描速度0.5ms

vi.采用I2C通信協(xié)議

b)管腳分配

i.1.VDD

(2.40-5.25V)

ii.2.GND

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論