1. 程式人生 > >Tslib的編譯和觸控式螢幕測試

Tslib的編譯和觸控式螢幕測試

1.編譯
前段時間非常的鬱悶…因為在執行生成校準程式ts_calibrate時總是出現一個錯誤:ts_open:Inappropriate ioctol for device
後來無數折騰後經過nanfansky指點才知道是自己板子的觸控式螢幕驅動不支援ioctl操作,狂汗…

重新編譯tslib

cd tslib-1.3

export CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc   //指定交叉編譯器

./autogen.sh   //生成config檔案

export PATH=/usr/local/arm/3.4.1/bin:$PATH

echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache 


./configure --host=arm-linux --cache-file=arm-linux.cache --enable-inputapi=no

vi src/ts_read_raw.c  //修改內容如下

make


****************************************************
在make之前,為了支援觸控式螢幕,開啟src/ts_read_raw.c檔案,檢視觸控式螢幕驅動程式資料結構,看與ts_read_raw.c結構中的哪個一樣,就將程式碼中的  char *defaulttseventtype="UCB1x00"; 修改為 自己板子上對應的驅動結構。
因為我的驅動對應的是h3600_ts_event結構

typedef struct {
  unsigned short pressure;
  unsigned short x;
  unsigned short y;
  unsigned short pad;
} TS_RET; 
所以修改為:
   char *defaulttseventtype="H3600";

************************************
如果不修改原始碼,也可以在後面的測試中重新指定環境變數
export TSLIB_TSEVENTTYPE=H3600 //通過這個對tslib中的裝置結構體定義 
*****************************************************


如果你觸控式螢幕驅動程式支援ioctl操作,上面的configure操作中的--enable-inputapi=no]你可以刪除。
然後就可以make了

*************************************************


2.測試:
2.1  我在/root/share下新建了一個tslib目錄,只copy了一些需要的檔案 

mkdir /root/share/tslib

mkdir /root/share/tslib/tests

mkdir /root/share/tslib/plugins

mkdir /root/share/tslib/lib

mkdir /root/share/tslib/etc


cp /root/2410s/tslib-1.3/tests/.libs/ts_* /root/share/tslib/tests/           //幾個所需的測試檔案,比如生成的校準檔案,測試檔案等等

cp /root/2410s/tslib-1.3/src/.libs/libts-0.0.so.0* /root/share/tslib/lib/    //幾個所需的庫檔案

cp /root/2410s/tslib-1.3/src/.libs/libts.so /root/share/tslib/lib/          //幾個所需的庫檔案           

cp /root/2410s/tslib-1.3/plugins/*.so /root/share/tslib/plugins/            //觸控式螢幕外掛模組庫

cp /root/2410s/tslib-1.3/etc/ts.conf /root/share/tslib/etc/                 //配置檔案     


2.2 連線板子
執行minicom

mount –t nfs –o nolock 192.168.0.155:/root/share /mnt/nfs使板子mount上PC,共享路徑/root/share

2.3 做連結
ln -s /dev/fb/0 /dev/fb0

//幀緩衝裝置板子上為/dev/fb/0,但程式預設為/dev/fb0,所以做了一個連結/dev/fb0到/dev/fb/0

ln -sf /dev/touchscreen/0raw /dev/ts

//qtopia要開啟/dev/ts,你沒有這個檔案, 所以 dev下邊應該有觸控平的節點, 
相當於, qtopia啟動要找 /dev/ts, 但是你只有/dev/touchscreen/0raw,
所以你把ts連結到你的觸控式螢幕的檔案就可以了!
我得觸控式螢幕裝置節點檔案為/dev/touchscreen/0raw
所以,建立連結 /dev/ts 到/dev/touchscreen/0raw
(這裡要自己針對自己板子具體的檔案進行設定,要不然也會報錯)


2.4 指定環境變數
export QWS_MOUSE_PROTO=TPanel:/dev/touchscreen/0raw

export T_ROOT=/mnt/nfs/tslib

export LD_LIBRARY_PATH=$T_ROOT/lib  //指定tslib庫檔案路徑

export TSLIB_CONSOLEDEVICE=none  //tslib執行需要的控制檯,這裡就是LCD螢幕 ,設定控制檯裝置為none,否則預設為/dev/tty, 

export TSLIB_FBDEVICE=/dev/fb0    //指定幀緩衝裝置

export TSLIB_TSDEVICE=/dev/touchscreen/0raw         //指定觸控式螢幕裝置節點檔案

export TSLIB_CALIBFILE=$T_ROOT/etc/pointercal     //指定觸控式螢幕校準檔案pintercal的存放位置


********************************************************************
注:qte的/src/kernel/qwsmouse_qws.cpp裡面校準檔案預設開啟是在/etc下面為/etc/pointercal,
可是我得板子的根檔案系統為只讀,所以我放在/mnt/nfs/tslib/etc下面了,
所以在交叉編譯qte的時候需要修改qwsmouse_qws.cpp
**************************************************


export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf   //指定TSLIB配置檔案的位置

export TSLIB_PLUGINDIR=$T_ROOT/plugins    //指定觸控式螢幕外掛所在路徑

2.5 校準
執行校準程式校準螢幕(5點校準)
cd $T_ROOT/tests

./ts_calibrate   //板子上陸續出現5個游標,點選完畢後會生成校準檔案pintercal存放在$T_ROOT/etc/下面

********************************************

ts_calibrate是一個應用程式,在螢幕上畫幾個按鈕,將使用者點選後從ts驅動獲得的資料和
屏上的座標位置通過一套演算法來獲得校準資料寫到一個校準檔案裡。 
******************************************


3. 可能遇到的錯誤分析:
在測試的時候,執行./ts_calibrate又出現了令人十分之鬱悶的錯誤:
ts_config: Success
追查後應該是在開啟ts_config中出現了錯誤(居然報Success,無慾至極)
在網上發現多是這個錯誤(這是1.4版本的錯):
Couldnt load module input 
No raw modules loaded
tsconfig: Success
我沒有上面那兩行的錯誤,不過應該是一樣的錯誤原因


那麼錯誤就定位在 ts_config 裡。並且可以進一步確定是在載入外掛模組時出的錯
查詢了ts_load_module.c這個檔案發現網上和自己的不太一樣(網上公佈的原始碼是1.4或者是0.1.1的吧)我的是1.3的
我下載了tslib-0.1.1的後重新實驗 就發現錯誤的是這樣子的(第一個錯誤是由ts.conf所決定的)
Couldnt load module pthres 
No raw modules loaded
tsconfig: Success


閱讀了tslib 的原始碼,知道了cstdlib 庫裡的一個函式: getenv 
是用來得到指定系統環境變數的值。是為了測試 tslib 是否得到正確的環境變數。
其環境變數預設的值在readme中有註明。


載入外掛模組時出出錯分析:
ts_calibrate會開啟ts_config
ts_config函式裡首先會讀取 tslib 配置檔案(ts.conf,由 TSLIB_CONFFILE環境變數指定,在tslib/etc下面),
然後根據這個檔案逐個載入外掛庫

1.3版本的ts.conf內容為
module mousebuts
moudle variance xlimit=50 ylimit=50 pthreshold=3
moudle dejitter xdelta=1 ydelta=1 pthreshold=3
moudle linear


ts_config又會呼叫ts_load_module載入庫。從這個函式裡,程式先是得到配置檔案中指定載入的模組名,
然後根據模組名構造了一個 so 檔案檔名,然後呼叫了系統函式 dlopen 載入庫!

Linux 下的載入dlopen 類似於 Windows 下動態連結庫的函式:dlopen
錯誤就應該出在構造的庫檔名是錯誤的---其指定的檔案不存在
---從而導致 dlopen無法載入。所以才提示找不到檔案或目錄!

那麼這樣就是應該把需要的mousebuts.so variance.so dejitter.so linear.so應該複製到/tslib/plugins中
(上面修正後作了這一步,就可以拉,就不會出現錯誤拉)



**************************************

這裡來談一談tslib-1.4,和1.3有一點點不一樣,主要是配置檔案的差別
一般來說,tsllib-1.4種一個完整的ts.conf配置檔案如下所示: 
module_raw input 
module pthres 
module variance delta=30 
module dejitter delta=100 
module linear 


出現這個錯誤
Couldnt load module input 
No raw modules loaded
tsconfig: Success

第一行告訴tslib從linux的輸入裝置讀取資料,需要用到input這個模組,也就是plugin目錄下的input.so檔案,
所以你的TSLIB_PLUGINDIR一定要配置正確,讓tslib能夠找到模組檔案。
其他引數分別控制觸控點的連續下壓、變化寬度、軌跡變化和線性校準。 
也是要把其對應的需要的幾個庫檔案複製到/tslib/plugins中

第二行導致"No raw modules loaded."的原因有兩個:
注意:一是你的ts.conf中沒有指定module_raw,自帶的ts.conf的所有module_raw都被註釋掉了,
# Uncomment if you wish to use the linux input layer event interface
# module_raw input

# Uncomment if you're using a Sharp Zaurus SL-5500/SL-5000d
# module_raw collie

# Uncomment if 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

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

你應該開啟至少一個module_raw選項,有人就選擇了input,去掉了它的註釋
得到module_raw input

另一個原因就是你沒有正確配置TSLIB_PLUGINDIR,tslib從你指定的目錄中沒有找到plugin需要的模組檔案,
請檢查你的路徑和檔案。

tslib下載:
tslib-1.3 

檔案:
tslib-1.3.tar.bz2
大小:
32KB
下載:
下載
tslib-0.1.1 

檔案:
tslib-0.1.1.tar.bz2
大小:
46KB
下載:
下載