觸摸屏校正總結_第1頁
觸摸屏校正總結_第2頁
觸摸屏校正總結_第3頁
觸摸屏校正總結_第4頁
觸摸屏校正總結_第5頁
已閱讀5頁,還剩4頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、移植 tslib-1.4 所遇到的問題分析與總結(elephant 半原創 )一:移植環境1 :主機環境: Ret Hat Enterprise 52 : 交叉工具鏈: arm-linux-gcc-4.3.23:開發平臺:友善之臂 mini2440+統寶3.5寸屏4:所需的軟件資源:tslib-1.4.tar.gz qt-x11-opensource-src-4.5.3.tar.gz qt-embedded-opensource-src-4.5.3.tar.gz ( QT 的移植是參考網上找到一篇較好的移植手冊,但是此手冊的作者不知道是無心之失還是咋的,給的資料有所保留。不過思路比較清晰以及解

2、析的比較詳細,還是非常值得參考的)參照的文章鏈接地址為:二:交叉編譯tslib-1.4在移植好觸摸屏的驅動后( 在移植內核的時候完成) ,一般都要移植一個tslib 來配合,在用戶層對觸摸屏的數據進行 濾波和矯正 ,同時也可以給應用程序一個統一的接口,很多GUI 都支持 tslib 的接口。我移植到開發板的 QT 版本是 QT4 ,所以用 tslib-1.4 進行觸摸屏校正,因為QT4 只是支持 tslib-1.4 (目前最新版) , QT2 支持的是 tslib-1.3 版本,所以在移植過程中先要看清楚自己移植的是什么版本。簡單描述tslib 校正觸摸屏原理:Tslib 是觸摸屏驅動和應用層

3、之間的適配層,它從觸摸屏驅動處獲得原始的設備坐標數據,通過一系列的去噪、去抖、 坐標變換 等操作, 來去除噪聲并將原始的設備坐標轉換為相應的屏幕坐標 。通過 tslib/src/tslib.h 文件可以看出,在tslib 中為應用層提供了 2 個主要的接口ts_open(),ts_close();ts_read()和 ts_read_raw() ,其中 ts_read() 為正常情況下的接口, ts_read_raw() 為校準情況下使用的接口。從tslib 默認的 ts.conf 文件中可以看出包括如下基本插件: (強烈建議通讀這個配置文件并理解這個文件所寫的內容)pthres 為 Tsli

4、b 提供的觸摸屏靈敏度門檻 插件;variance 為 Tslib 提供的觸摸屏濾波算法 插件;dejitter 為 Tslib 提供的觸摸屏去噪算法 插件;linear 為 Tslib 提供的觸摸屏坐標變換 插件。tslib 從觸摸屏驅動采樣到的設備坐標進行處理再提供給應用端的過程大體如下:raw device -> variance -> dejitter -> linear -> applicationmodulemodule module module再來看看 ts_calibrate 主要做了哪些事情,校準情況下, tslib 對驅動采樣到的數據進行處理的一般

5、過程如下:1 。讀取屏上5 個點的坐標(Top Left,Top Right,Bottom Left,Bottom Right,Center) ,在進行一系列的變換, 取樣的 5 個點,實際上是包含 3 個不同的 X 值, 3 個不同的 Y 值。和 scaling值一共 7 個值,一起保存到 /etc/pointercal中 . (觸摸屏校準文件)2 . 這個 /etc/pointercal 文件主要是供 linear 插件使用。而我們每次的觸摸的操作都進行多 次觸摸坐標變換。至此已經找到解決問題的大體的方法了。在校準觸摸屏后只需及時的讓linear 插件再次讀取新的 /etc/pointer

6、acal 文件,這樣新校準的坐標信息就及時的更新到上層應用。下面就要考慮具體實現的問題了。1 。 從 linear .c 文 件 可 以 看 出 在 該 模 塊 初 始 化 時 讀 取 了 /etc/pointercal 文 件 。 只 要 在 linear_read() 中讀取新的 /etc/pointercal 文件即可。2 。校準后保存了一個新的 pointercal 文件, 但 ts_lib 怎么知道當前的 pointercal 文件是應該讀取的新文件 。剛開始的時候我們在linear .c 的 linear_read() 函數中采取計數輪詢的方式查看/etc/poinercal 文件

7、的最后更新時間,如果當前的更新時間大于上次更新時間,就去讀取下pointercal 文件。我們暫且不說在一臺剛下流水線的機器,它的 rtc 時間是不確定,再進行時間比較時會出現錯誤。另外始終的輪詢的方式和 ts_lib 的采樣間隔時間值很小。這樣用戶在進行觸摸屏常按操作時,會非常明顯的消耗系統資源。3 。此時想到的辦法就是進程通信, ts_lib 是個 動態庫運 行于系統中,他存在系統中不是以進程方式,但可以采取折衷方法,將調用 ts_lib 的進程號(實際上就是X 的進程號)保存到一個配置文件中。這樣在使用 ts_calibrate 校準觸摸屏后,利用信號的方式給ts_lib 發送用戶自定義

8、信號, ts_lib 的 lineral.c 中加一個簡單的信號處理函數。在接受到信號后就去讀取下新的pointercal 文件。正常情況下不做任何的輪詢和讀取操作。從上說的 3 個步驟中 完全解決了校準后應用端觸摸及時生效的問題 。還有個次要問題就是如何鎖屏?這需要從內核入手了,查看linux2.6 內核 /drivers/input/evdev.c 從該驅動提供的ioctl 中看到對基于evdev 的輸入設備都提供 EVIOCGRAB 實現。顧名思義, grab 就是將當前的輸入操作抓取到當前的操作中,讓當前操作之外的所有應用端讀不到觸摸屏的觸摸操作。由驅動源碼就很容易知道該如何實現鎖屏解

9、鎖操作了。源碼如下:truct tsdev *ts;char *tsdevice = "/dev/input/event0"ts = ts_open(tsdevice, 0);int ts_tmpfd = ts_fd(ts);if (ts_tmpfd= -1)perror("ts_open");exit(1);unsigned long val =1;int ioctl_ret=ioctl(ts_tmpfd,EVIOCGRAB,&val);printf("now lock the ts ioctl ret is:%dn",io

10、ctl_ret);if (ioctl_ret!=0)printf("Error: %sn", strerror(errno);exit(1);printf("lock the ts success n");現在開始交叉編譯tslib ,在開始編譯前需要確定自己的開發環境是否安裝了 autoconfautomake 和 libtool 等軟件包。之前我的虛擬機并不是完全安裝,在編譯過程中出現很多問題,在這里我建議大家虛擬機完全安裝。不過如果確實不想重裝系統的話,也可以手動安裝,之前我自己就是手動安裝的,雖然成功安裝了 tslib 軟件,但是在后續的 QT

11、移植過程中出現很多不可預知的錯誤,因此還是建議大家的虛擬機是完全安裝的。可以利用命令查看自己虛擬機上的autoconf 版本:autoconf V在開始編譯tslib 前還有一個問題需要特別注意:就是要確定在編譯時所用的工具是交叉工具鏈而不是PC平臺下的GCC工具,因為我要運行的平臺是嵌入式ARM架構而不是PC的X86架構。關于這一點,在網上找到很多資料都沒有說明,幾經尋找之下,終于在CSDN博客上看到網友yihui8 的文章,對這一點作了說明。(還是網友yihui8 厚道)。網友 yihui8 博客地址(詳細解析tslib-1.4 交叉編譯): 第一步:解壓源碼包:tar xvzf tsli

12、b-1.4.tar.gz cd tslib第二步:進入 tslib 之后關鍵是要設置交叉編譯環境(下面是根據我自己的實際情況所添加的) 如果不設置交叉編譯環境,在移植到開發板時,執行./ts_calibrate 程序時會出現以下錯誤:./ts_calibrate: line 1: syntax error :” ( ” unexpected.$export PATH=$PATH:/usr/local/arm/4.3.2/bin$export CC=arm-linux-gcc$export CXX=arm-linux-g+設置好交叉編譯環境后就可以開始安裝了:執行 ./autogen.shdai

13、q®daiq_desk top: ZmoikZcvs/apps/ts 1 ib$ > /autogenB shLibtoolize. libtoolize: putting auxiliary files in.'.libtoolize; copying file . /Itmaia* shJlibtq口Li工e; You should add he contents £ the fuLlowHg files tc aclpcal.n4 : libtoolise: /usr/shar&/aclocal/libtool.>4J libtooliEe

14、: /nsr/share/aclocal/ltop+ions- >4' libtcolise: /usr/share:/acloc al/ltversion.航4'lLbt4olis«:肛?/aGLQGal/ltAugar.皿4libtoolize: /usr/share/aclocal/ltobsolete.libtcolize; Ccnsidex adding AC_CONFIG_MACRO_DIRCn4)J to configuxe.ac and Ixbtoolize: reiunning. libtoolizej to keep the correct

15、libtool macr os in-tree, libtoolize; ConsideT adding _I to ACLOCAL_AMFLGS in Makefile, am.Dine.Aclocal., Dene.Autoheadezr. . . D one.Autamake.configure, as:21: installing */canfig. guess'Configure, ac:21: install/ config, subJcanfi£ure- ac: 7 : installing , /in£tall-sli,c(?nf ijuxe, ac

16、: 7: installing . /missing p Lua ins/Mak efile, am: instailing '. /depcompDone.Auto conf. . Dons,Now you can do . /confiuie, make, make install-執行./autogen.sh之后可能會有上述信息出現,但是我的機器上灰常不給力,只是顯示出其 中幾行信息,一開始以為是出錯,但是最后還是移植成功,證明這步就算只出現幾行信息 并無多大關系。接著執行以下命令:./configure -prefix=/usr/local/tslib/ -host=arm-l

17、inux ac_cv_func_malloc_0_nonnull=yes 有些開發板在執行此命令時需要添加一enable inputapi=no或者一enable input=no,至于是哪一個就需要根據tslib目錄下的configure文件才可以知道。(建議這個文件還是看一下)。 由于友善之臂 mini2440的觸摸屏驅動是支持ioctl操作的(在內核移植時做觸摸屏驅動時可 以看到源碼中是支持ioctl的),因此我在這里并沒有加上一enable inputapi=no.(2)如果沒有加上 ac_cv_func_malloc_0_nonnull=yes 會 出現交叉編譯錯誤:undefine

18、d reference to 'rpl_malloc'.這是由 ac_cv_func_ma110c_0_nonnull檢查弓I起的, 為了不讓它檢查,產生一個cache文件daiq_tslib . cache,欺騙configure 再執行:因此為了編譯的順利進行,在配置的時 候需要力口上這一句:ac_cv_func_ma110c_0_nonnull=yes最后執行make & make instal l就可以在指定的路徑上成功安裝tslib。我的指定路徑是/usr/local/tslib/,在這個文件下安裝成功的話會有四個目錄:lib/ etc/ include/ b

19、in/ .安裝好tslib之后將動態鏈接庫文件拷貝到根文件系統中,(注意 tslib依賴的是動態鏈接庫 文件),如果忘記拷貝動態鏈接庫的話會出現以下錯誤:error wAile loadable shared Libriric.3: LiAiL曲匕甌mt occn shized objisct filesmuch (工Jx sr dlirectomy拷貝進去之后需要在自己的根文件系統的/etc/profile(在文件的一開始添加下面的內容)設置tslib的環境變量(要根據自己的實際情況來設置),下面是我的開發板所設置的有關tslib的環境變量:# Ash profile#vim syntax=

20、sh#No core files by defaultecho "Set ENV for tslib "export QTDIR=/usr/local/Trolltech/QtEmbedded-4.5.3-arm(文件系統中QT的安裝目錄)export TSLIB_ROOT=/usr/local/tslib(tslib 的目錄)export TSLIB_CONSOLEDEV=CEneexport TSLIB_FBDEVICE/dev/fb0export TSLIB_TSDEVIC=/ dev/input/ event。exportTSLIB_PLUGINDI=$TSLIB_

21、ROOTb /tsexportTSLIB_CONFFILETSLIB_ROO!etc/ts . confexportTSLIB_CALIBFILE=$TSLIB_ROOTetc / pointercalexport POINTERCAL_FILE=$TSLIB_ROOT/etc/pointercalexport QWS_DISPLAY=LinuxFb:dev/fb0export set QWS_SIZE=320x240export QWS_MOUSE_PROTO :/ dev/input/ eventOexportLD_LIBRARY_PATHTSLIB_ROOHb:$QTDIR/lib:/u

22、sr/local/lib:$LD_LIBRARY_PATHecho “the env is successful ”當配置好這些環境變量后下載到開發板,執行./ts_calibrate時如果出現:ts_open: No such directory說明環境變量設置有問題,可以用env命令查看一下有沒有你剛才設置的環境變量。在設置環境變量這一個環節上是比較重要的,要保證在每一個目錄下都存在你需要用到的文件。補充:tslib環境變量配置說明:在采用觸摸屏的移動終端中,觸摸屏性能的調試是個重要問題之一,因為電 磁噪聲的緣故,觸摸屏容易存在點擊不準確、有抖動等問題。Tslib是一個開源的程序,能夠為觸

23、摸屏驅動獲得的采樣提供諸如濾波、去 抖、校準等功能,通常作為觸摸屏驅動的適配層,為上層的應用提供了一個 統一的接口。在 Qtopia 4.* 版本中,默認的Tslib版本為Tslib 1.4 。在 Qtopia 2.*版本中,默認的Tslib 版本為Tslib 1.3 。在嵌入式中,由于觸摸屏的種類多樣、質量不一,采用 Tslib的參考配置往 往無法獲得較好的觸摸屏觸摸效果,同樣需要經過大量的測試才能得到滿意 的配置參數,惡劣情況下,甚至需要對 Tslib的算法進行進一步的優化。下 面就Tslib的環境變量、配置文件等進行簡要的介紹。1) 環境變量為了實現Tslib的正確運行,需要對如下的 T

24、slib的環境變量進行配置:2) TSLIB_TSDEVICE /觸摸屏設備文件名Default (no inputapi): /dev/touchscreen/ucb1x00Default (inputapi): /dev/input/event0TSLIB_CALIB校準的數據文件,由ts_calibrate校準程序生成Default: $sysconfdir/pointercalTSLIB_CON配置文件名Default: $sysconfdir/ts.confTSLIB_PLUGINDIR /插件目錄Default: $datadir/pluginsTSLIB_CONSOLEDEVIC

25、E/制臺設備文件名Default: /dev/ttyTSLIB_FBDEVICE /FrameBuffer 設備名Default: /dev/fb03) 以上環境變量在實際開發中的實際配置可以根據實際情況決定。4) 2)配置文件除了環境變量以外,Tslib的配置文件ts.conf同樣是個十分重要的部 分,在ts.conf中配置了需要加載的插件、插件加載順序以及插件的一 些約束參數,這些配置參數對觸摸屏的觸摸效果具有十分重要的影響。下面是Tslib 1.4 中的ts.conf 的參考配置:5) # Uncomment if you wish to use the linux input laye

26、r eventinterface# module raw input# Uncomment if you're using a Sharp Zaurus SL-5500/SL-5000d# module_raw collie# Uncommentif you're using a Sharp Zaurus SL-C700/C750/C760/C860# module_raw corgi# Uncomment if you're using a device with a UCB1200/1300/1400 TS interface# module raw ucb1x00

27、# Uncomment if you're using an HP iPaq h3600 or similar# module_raw h3600# Uncomment if you're using a Hitachi Webpad# module_raw mk712# Uncomment if you're using an IBM Arctic II# module raw arctic2module pthres pmin=1module variance delta=30module dejitter delta=100 module linear6) 其中p

28、thres為Tslib提供的觸摸屏靈敏度門檻插件;variance 為 Tslib提供的觸摸屏濾波算法插件;dejitter 為Tslib提供的觸摸屏去噪 算法插件;linear為Tslib提供的觸摸屏坐標變換插件。7) tslib的實際配置:8) 去掉module_raw input 前面的#號,同時把其他#號注釋項全部刪 除,以免給后來的操作帶來麻煩。我的最終 ts.conf內容為:module_raw input module pthres pmin=1 module variance delta=30 module dejitter delta=100 module linear在執行

29、校正程序時(如./ts_calibrate 或./ts_test )可能出現的錯誤:1 :運行./ts_testNo raw modules loaded.ts_config: No such directory出現這樣的錯誤提示,可以很明確的告訴你,你的庫缺少了一些*.so文件()ts.conf文件中應該有一行(在配置文件上有很多的raw ,但是全部是被注釋掉的,但是至少需要打開一個。因為觸摸屏是使用input子系統的,所以將 module_raw input前面的#號去掉,并且前面不留空格,千萬別留空格啊,有一個網友就是因為這個小小的空格搞到他郁悶了很久,幸好我比他醒目,絕不留 空格,哈哈

30、。)module_raw input/nand1/tslib-1.4/lib/ts目錄下應該有個文件叫input.so(這個文件比較重要,我第二次移植過程中不小心把input裁剪掉了,當插件庫$TSLIB_ROOT/lib/ts目錄下沒有這個文件時會提示如下錯誤)No raw modules loaded.ts_config: No such directory2:在做測試的時候,運行./ts_calibrate 出現了 tslib-1.4 經典的錯誤:(出現這個錯誤你不要沮喪,反 而應該高興,說明你之前的步驟已經全部沒錯了,只要把這個經典的錯誤解決就萬事大吉了。很慶幸,這個錯誤有很多網友都已

31、經有辦法解決了)經典錯誤:Couldnt load module inputNo raw modules loadedtsconfig: Success錯誤分析:那么錯誤就定位在ts_config 里。并且可以進一步確定是在加載插件模塊時出的錯。閱讀了 tslib 的源代碼,知道了 cstdlib 庫里的一個函數: getenv是用來得到指定系統環境變量的值。是為了測試tslib是否得到正確的環境變量。其環境變量默認的值在 readme中有注明。加載插件模塊時出出錯分析:ts_calibrate 會打開 ts_configts_config 函數里首先會讀取 tslib 配置文件(ts.con

32、f ,由TSLIB_CONFFILE環境變量指定,在tslib/etc 下面),然后根據這個文件逐個加載插件庫,1.4版本的ts.conf內容為:Module_raw input (讀readme 文件可以找到這個字符串 )module pthres pmin=1module variance delta=30module dejtter delta=100module linearts_config 又會調用ts_load_module加載庫。從這個函數里,程序先是得到配置文件中指定加載的模塊名,然后根據模塊名構造了一個so文件文件名,然后調用了系統函數dlopen加載庫!Linux 下的加載dlopen 類似于 Windows 下動態鏈接庫的函數:dlopen錯誤就應該出在構造的庫文件名是錯誤的-其指定的文件不存在-

溫馨提示

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

評論

0/150

提交評論