本文來自網絡:http://blog.csdn.net/xishuang_gongzi/article/details/49422879linux
環境:
host:Ubuntu12.04
target:freescale imx6
交叉編譯鏈:4.6.2
tslib源代碼:在https://github.com/kergoth/tslib下載到較新版本
tslib安裝目標路徑:/imx_disk/xx/qt/tslibgit
安裝步驟:
1.準備工做
確保如下軟件已安裝github
# apt-get install autoconf(或autoconf2.13) # apt-get install automake # apt-get install libtool 網絡
2.下載
https://github.com/kergoth/tslib下載新版本函數
3.配置
解壓源代碼tslib-master.zip,並進入源代碼文件夾工具
# unzip tslib-master # cd tslib-master 測試
配置ui
# ./autogen.sh # echo "ac_cv_func_malloc_0_nonnull=yes" > arm-none-Linux-gnueabi.cachespa
# ./configure CC=/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-fsl-linux-gnueabi-gcc --host=arm-none-linux-gnueabi --cache-file=arm-none-linux-gnueabi.cache --prefix=/imx_disk/xx/qt/tslib/tslib.net
注意,prefix選項更換爲你的安裝路徑。
4 修改源碼:
①因爲觸摸屏驅動沒有提供ioctl接口,須要屏蔽tslib中ioctl相關代碼。不然運行有錯誤。
vi ./plugins/input-raw.c
屏蔽掉static int check_fd(struct tslib_input *i)中全部ioctl相關代碼,只保留一句i->using_syn = 1;。最終代碼以下:
②若ts_calibrate 測試,無反應,多是觸摸屏驅動中沒有report 壓力值。通常電容屏驅動不上傳壓力值,咱們使用ft5x06觸摸芯片,驅動中probe函數中設置set_bit(ABS_PRESSURE, input_dev->absbit);,而後隨報點上傳壓力值input_report_abs(data->input_dev, ABS_PRESSURE, 1); 觸摸點爲0時說明觸摸結束,input_report_abs(data->input_dev, ABS_PRESSURE, 0);
5.編譯
# make
6.安裝
# make install
7.移植至開發板
將安裝路徑下的整個tslib文件夾,下載至開發板的上,我存放的路徑爲/usr/local
8. 修改ts.conf內容
打開安裝路徑下的/etc/ts.conf文件,修改其內容。
# vi /usr/local/tslib/etc/ts.conf
下面是ts.conf文件的第一行與第二行
# Uncomment if you wish to use the linux input layer event interface # module_raw input
去掉# module_raw input前面的註釋,必定要注意中間的空格也去掉,module頂格。
配置文件ts.conf內容以下:
module_raw input
module pthres pmin=1
module variance delta=30
module dejitter delta=100
module linear
module_raw有許多種,這裏只使用input(即Linux的input子系統)後面的幾個module尚未深刻了解,它們使用的庫就在tslib/lib/ts中,最後三個模塊的字面意思是「方差(濾波)」、「去抖動(去噪)」、「線性(座標變換)」
9. 設置開發板環境變量
經過超級終端, 打開環境變量文件/etc/profile
# vi /etc/profile
添加以下內容:
export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_ROOT=/usr/local/tslib export TSLIB_TSDEVICE=/dev/input/event2
#export QWS_MOUSE_PROTO=tslib:/dev/input/event2 export TSLIB_CALIBFILE=/etc/pointercal export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib
其中,TSLIB_ROOT更換爲本身實際存放的路徑;
另外,TSLIB_TSDEVICE 和QWS_MOUSE_PROTO這兩項須要查看本身的板子的觸摸屏設備對應/dev/input/下那個文件。
說明:
TSLIB_TSDEVICE //觸摸屏設備文件名。
TSLIB_CALIBFILE //校準的數據文件,由ts_calibrate校準程序生成。
SLIB_CONFFILE //配置文件名。
TSLIB_PLUGINDIR //插件目錄
TSLIB_CONSOLEDEVICE //控制檯設備文件名
TSLIB_FBDEVICE //設備名
以上環境變量在實際開發中的實際配置能夠根據實際狀況決定。而這些指定的設備節點必定要和你的開發板上的/dev目錄下的設備節點相對應。
10 觸摸屏設備檢查
①檢查系統中是否包含觸摸屏設備和鼠標設備
使用cat /proc/bus/input/devices查看
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="ft5x0x_ts"
P: Phys=
S: Sysfs=/devices/virtual/input/input15
U: Uniq=
H: Handlers=event2
B: PROP=0
B: EV=b
B: KEY=0
B: ABS=2650000 1000000
②檢查是否包含觸摸屏設備和鼠標設備的文件,不存在則創建便可
ls /dev/ 查看是否包含上述的文件名event2
若是不包含,能夠用cat命令查看上面的S: Sysfs後跟的設備名,便可找到設備的主設備號和次設備好。就能夠建立設備了。如:
cat /sys/devices/virtual/input/input15/event2/uevent
MAJOR=13
MINOR=66
DEVNAME=input/event2
③就能夠在/dev/input下創建設備event2了。
#mknod /dev/input/event1 c 13 66
④檢測觸摸屏驅動是否正常
首先初步檢測驅動:
#cat /dev/input/event2
輕按觸摸屏。。。終端輸出亂碼,代表觸摸屏正常!
再編寫簡單應用層代碼測試:
11 運行
運行校準程序:
/usr/local/tslib/bin/ts_calibrate
xres = 1280, yres = 800
Took 3 samples...
Top left : X = 28 Y = 45
Took 6 samples...
Top right : X = 1221 Y = 47
Took 54 samples...
Bot right : X = 1215 Y = 754
Took 26 samples...
Bot left : X = 40 Y = 769
Took 4 samples...
Center : X = 635 Y = 403
16.143372 0.996495 -0.004317
1.869019 0.005320 0.978174
Calibration constants: 1057972 65306 -282 122488 348 64105 65536
生成的校準文件名爲pointercal,位於/etc目錄下。
運行測試程序:
./ts_test
便可。
屏幕最上方會出現三個按鈕,分別爲「Drag」、「Draw」和「Quit」,默認是第一個,所以,用觸摸筆點擊任何一處,十字光標便會到那裏。
下面是點擊「Draw」按鈕並用觸摸筆寫字的提示信息的一小部分:
1302603922.770286: 98 302 1
1302603922.800295: 107 300 1
1302603922.815277: 118 297 1
1302603922.830291: 130 294 1
1302603922.845288: 143 290 1
1302603922.845288: 151 288 1
1302603922.875166: 168 284 0
第一列爲timeval結構體的兩個成員:tv_sec和tv_usec,中間兩列分別是X和Y的座標,最後爲pressure,這裏能夠理解成「觸摸事件」,爲1表示觸摸筆點擊了(接觸)屏幕,爲0表示觸摸筆離開了屏幕
12 錯誤處理
①./autogen.sh執行失敗是由於缺乏工具,經過sudo apt-get install autoconf automake libtool安裝相應工具。
②
Couldnt open tslib config file: No such file or directory
ts_config: No such file or directory
緣由:通常爲環境變量 TSLIB_PLUGINDIR 設置問題。能夠查看ts_config.c代碼,打印出具體路徑查看錯誤緣由
③打不開module input
Couldnt load module input
No raw modules loaded.
tsconfig: Success
緣由分析:
查看ts.conf中module_raw的配置
編譯選項須要增長 --enable_input=yes 不然沒有input.so文件
④
ts open
tslib: Selected device is not a Linux input event device
緣由分析:input-raw.c 函數須要根據底層驅動作適當修改。
觸摸屏驅動沒有提供ioctl接口,要刪除代碼中與ioctl有關的全部函數。
⑤Segmentation fault
解決:通常是由於配置文件ts.conf格式錯誤。參數前面不能有空格。
⑥
#ts_calibrate
ts_open: No such file or directory
多是觸摸屏驅動沒有加載,找不到設備節點