Tslib步驟以及出現問題的解決方案【轉】


轉自:http://forum.eepw.com.cn/thread/267828/1

 

嵌入式設備中觸摸屏使用非常廣泛,但觸摸屏的坐標和屏的坐標是不對稱的,需要校准。校准廣泛使用的是開源的tslib。
Tslib是一個開源的程序,能夠為觸摸屏驅動獲得的采樣提供諸如濾波、去抖、校准等功能,通常作為觸摸屏驅動的適配層,為上層的應用提供了一個統一的接口。
 
1.Tslib工具交叉編譯與安裝
編譯tslib-1.4.tar.gz步驟:
# tar  zxvf  tslib-1.4.tar.gz
# cd  tslib
# export  PATH=/opt/gcc-3.4.6/bin:$PATH
# ./autogen.sh
# ./configure  --host=mipsel-linux  --prefix=/TSLIB
# make
# make  install
注意:以上步驟使用root用戶權限執行
在/TSLIB目錄下生成的文件夾則是需要移植的工具包。
A)可能遇到的問題與解決方法(ubuntu系統)
下面是我在移植Tslib工具過程中所遇到的一些問題與解決方法:
問題1.執行./autogen.sh提示
./autogen.sh: 4: autoreconf:not found
解決方法:
沒有安裝automake 工具,
(ubuntu 10.04)用下面的命令安裝:
sudo apt-get install autoconf automake libtool
 
問題2.執行./autogen.sh后出現錯誤信息:
libtoolize: `configure.in' does not exist
Try `libtoolize --help' for more information.
autoreconf: libtoolize failed with exit status: 1
解決方法:
#whereis libtoolize
libtoolize: /usr/bin/libtoolize /usr/local/bin/libtoolize
發現出現該錯誤信息是由於系統中安裝了兩個ilbtoolize工具鏈。將/usr/local/bin/libtoolize刪除后問題解決(將/usr/bin/libtoolize刪除后問題依然存在)。
 
問題3.執行./autogen.sh出現錯誤信息:
/autogen.sh: 4: autoreconf: not found 
解決方法:
安裝autoconf工具包。
 
問題4.執行make后出現錯誤信息:“…/usr/local ”is a directory …..
解決方法:該問題出現原因是由於配置好環境變量后,但系統編譯時仍無法找到工具鏈導致。打開新的窗口,重新配置環境變量后編譯此問題解決。
 
問題5.執行make后出現錯誤信息:
ts_test.o: In function `main':
ts_test.c:(.text+0x3b4): undefined reference to `rpl_malloc'
fbutils.o: In function `open_framebuffer':
fbutils.c:(.text+0x2f8): undefined reference to `rpl_malloc'
collect2: ld returned 1 exit status
解決方法:
執行# ./configure  --host=mipsel-linux  --prefix=/TSLIB后,在config.h中將“#define malloc  rpl_malloc malloc”注釋掉,編譯通過。
 
問題6.執行make后出現錯誤信息:
In function ‘open’,
inlined from ‘main’ at ts_calibrate.c:227:
/usr/include/bits/fcntl2.h:51: error: call to ‘__open_missing_mode’ declared with attribute error: open with O_CREAT in second argument needs 3 arguments
In function ‘open’,
    inlined from ‘main’ at ts_calibrate.c:229:
/usr/include/bits/fcntl2.h:51: error: call to ‘__open_missing_mode’ declared with attribute error: open with O_CREAT in second argument needs 3 arguments
解決方法:
sudo vim /home/loongson/workspace/tslib/tests/ts_calibrate.c +227將cal_fd = open (calfile, O_CREAT | O_RDWR);改為
cal_fd = open (calfile, O_CREAT | O_RDWR,0666);
229行
將cal_fd = open ("/etc/pointercal", O_CREAT | O_RDWR);
改為cal_fd = open ("/etc/pointercal", O_CREAT | O_RDWR,0666);
 
B)可能遇到的問題與解決方法(2F系統):
問題1. 執行./autogen.sh后出現錯誤信息:
Configure.ac:25:error:possibly undefined macro:AC_DISABLE_STATIC
     If this token and others are legitimate,please use m4_pattern_allow.
     See the Autoconf documentation.
Configure.ac:26:error:possibly undefined macro:AC_ENABLE_SHARED
Configure.ac:27:error:possibly undefined macro:AC_LIBTOOL_DLOPEN
Configure.ac:28:error:possibly undefined macro:AC_PROG_LIBTOOL
解決方法:重新安裝libtool到/usr目錄下。
 
2.Tslib移植
Tslib移植步驟如下:
1.將安裝目錄TSLIB拷貝到文件系統的根目錄下。
2.在文件系統/etc下創建一個空的校准文件pointercal(此步驟可省略)。執行ts_calibrate並校准完畢后,校准數據會被存放在該文件中(文件系統需可寫,若是cramfs文件系統可參考備注1)。
3.修改TSLIB/etc/ts.conf文件,打開module_raw input。(注意:module_raw inut前不能有空格,參照問題2)
4.制作一個可運行腳本run.sh,內容如下:
(備注:以下環境變量的配置也可寫在文件系統的/etc/profile文件下) [cpp] view plaincopyprint?在CODE上查看代碼片派生到我的代碼片

  1. #!/bin/sh  
  2.   
  3. export TSLIB_ROOT=/TSLIB  
  4.   
  5. export LD_LIBRARY_PATH=$TSLIB_ROOT/lib:$LD_LIBRARY_PATH  
  6.   
  7. export TSLIB_CONSOLEDEVICE=none  
  8.   
  9. export TSLIB_FBDEVICE=/dev/fb0   //frambuffer設備節點  
  10.   
  11. export TSLIB_TSDEVICE=/dev/event0  //觸摸屏設備節點  
  12.   
  13. export TSLIB_TSEVENTTYPE=INPUT  
  14.   
  15. export TSLIB_CALIBFILE=/etc/pointercal   //校准文件  
  16.   
  17. export TSLIB_CONFFILE=/TSLIB/etc/ts.conf   //動態庫加載的配置文件  
  18.   
  19. export TSLIB_PLUGINDIR=/TSLIB/lib/ts  //動態庫路徑  
  20.   
  21. cd /TSLIB/bin  
  22.   
  23. ./ts_calibrate    //運行校正程序  

(備注:若需在qt或SDL等圖形界面使用tslib,需要另外配置其他環境變量,這里不作敘述)
5.將文件系統和帶觸摸屏驅動的內核燒寫到目標板上,上電運行run.sh即可看到校准界面。按屏幕光標點觸5次后,程序在/etc下生成pointercal坐標校准文件(/etc目錄需可寫)。
6.校正完成后可執行/TSLIB/bin/ts_print查看輸出坐標是否正確。
 
可能遇到的問題與解決方法
下面是我在運行Tslib工具是所遇到的問題與解決方法:
問題1.運行run.sh出錯,提示“ts_open:no such file or directory”
解決方法:
引起此錯誤的情況較多,觸屏校正程序執行時會先去打開觸屏的設備節點,LOONGSON-1B開發板的觸屏設備節點對應為/dev/event0,查看系統環境變量是否配置正確,查看/dev/目錄下是否存在觸屏的設備節點event0。
 
問題2.出現:no raw modules load
tsconfig:no such file or directory
解決方法:
/TSLIB/etc/ts_conf 文件中語句modle_raw input前可能存在空格,把空格去掉。
 
問題3.結合圖形界面使用tslib時,出現無法load module的錯誤
解決方法:
如Tslib讀取觸點坐標的例子程序ts_pirnt中,加載h3600.so、pthres.so、…等等模塊時使用了dlopen()函數打開;在/TSLIB/etc/ts_conf配置沒有錯誤的情況下,出現load module的錯誤可能是編譯程序時沒有把libts庫加入一起編譯,導致程序使用dlopen()打開.so文件出現錯誤所致。
 
備注
若文件系統不可寫,校正后程序就無法在文件系統的/etc/目錄下創建pointercal校准文件。一般根文件系統/tmp目錄都設置為ramfs類型,該文件夾內可寫;在根文件系統中/etc目錄下,創建一個名為pointercal的空鏈接文件,操作如下:
#cd /etc
#ln –s ../tmp/pointercal pointercal
這樣在執行校准程序后就會在/tmp目錄下生成一個校准文件pointercal。
 
3.Tslib ts_calibrate校准原理
    Tslib 是觸摸屏驅動和應用層之間的適配層,它從觸摸屏驅動處獲得原始的設備坐標數據,通過一系列的去噪、去抖、坐標變換等操作,來去除噪聲並將原始的設備坐標轉換為相應的屏幕坐標。tslib為應用層提供了2個主要的接口ts_open(),ts_close();ts_read()和ts_read_raw(),其中ts_read()讀取校正后的相對坐標數據,ts_read_raw()讀取校正前的實際坐標。
    從tslib默認的ts.conf文件中可以看出,tslib 從觸摸屏驅動采樣到的設備坐標進行處理再提供給應用端的過程大體如下:
  raw device --> variance --> dejitter --> linear --> application
  module         module       module      module
    校准情況下,tslib對驅動采樣到的數據進行處理的一般過程如下:
    1.讀取屏上5個點的坐標(Top Left,Top Right,Bottom Left,Bottom Right,Center),在進行一系列的變換,取樣的5個點,實際上是包含3個不同的X值,3個不同的Y值。和scaling 值一共7個值,一起保存到/etc/pointercal中.
    2.這個/etc/pointercal文件主要是供linear插件使用。而我們每次的觸摸的操作都進行多次觸摸坐標變換。
 
4.Tslib配置文件ts.conf介紹
    Tslib 的配置文件ts.conf 同樣是個十分重要的部分,在ts.conf 中配置了需要加載的插件、插件加載順序以及插件的一些約束參數,這些配置參數對觸摸屏的觸摸效果具有十分重要的影響。
其中:pthres 為Tslib 提供的觸摸屏靈敏度門檻插件 默認參數為pmin=1;
     variance 為Tslib提供的觸摸屏濾波算法插件 默認參數為delta=30;
     dejitter 為Tslib 提供的觸摸屏去噪算法插件 默認參數為delta=100;
      linear為Tslib 提供的觸摸屏坐標變換插件。
    由於各種因素的影響,在不同的硬件平台上,相關參數可能需要調整。以上參數的相互關系為:采樣間隔越大,采樣點越少,采樣越失真,但因為信息量少,容易出現丟筆划等丟失信息情況,但表現出來的圖形效果將會越好;去噪算法跟采樣間隔應密切互動,采樣間隔越大,去噪約束應越小,反之采樣間隔越小,去噪約束應越大。去抖算法為相對獨立的部分,去抖算法越復雜,帶來的計算量將會變大,系統負載將會變重,但良好的去抖算法可以更好的去除抖動,在進行圖形繪制時將會得到更好的效果;靈敏度和ts 門檻值為觸摸屏的靈敏指標,一般不需要進行變動,參考參考值即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM