【轉載】tslib移植_freescale imx6

本文來自網絡: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;。最終代碼以下:

 

[cpp]  view plain  copy
 
 print?
  1. static int check_fd(struct tslib_input *i)  
  2. {  
  3. /*  struct tsdev *ts = i->module.dev; 
  4.     int version; 
  5.     long evbit[BITS_TO_LONGS(EV_CNT)]; 
  6.     long absbit[BITS_TO_LONGS(ABS_CNT)]; 
  7.     long keybit[BITS_TO_LONGS(KEY_CNT)]; 
  8.  
  9.     if (ioctl(ts->fd, EVIOCGVERSION, &version) < 0) { 
  10.         fprintf(stderr, "tslib: Selected device is not a Linux input event device\n"); 
  11.         return -1; 
  12.     } 
  13.  
  14.     if (version < EV_VERSION) { 
  15.         fprintf(stderr, "tslib: Selected device uses a different version of the event protocol than tslib was compiled for\n"); 
  16.         return -1; 
  17.     } 
  18.  
  19.     if ( (ioctl(ts->fd, EVIOCGBIT(0, sizeof(evbit)), evbit) < 0) || 
  20.         !(evbit[BIT_WORD(EV_ABS)] & BIT_MASK(EV_ABS)) || 
  21.         !(evbit[BIT_WORD(EV_KEY)] & BIT_MASK(EV_KEY)) ) { 
  22.         fprintf(stderr, "tslib: Selected device is not a touchscreen (must support ABS and KEY event types)\n"); 
  23.         return -1; 
  24.     } 
  25.  
  26.     if ((ioctl(ts->fd, EVIOCGBIT(EV_ABS, sizeof(absbit)), absbit)) < 0 || 
  27.         !(absbit[BIT_WORD(ABS_X)] & BIT_MASK(ABS_X)) || 
  28.         !(absbit[BIT_WORD(ABS_Y)] & BIT_MASK(ABS_Y))) { 
  29.         fprintf(stderr, "tslib: Selected device is not a touchscreen (must support ABS_X and ABS_Y events)\n"); 
  30.         return -1; 
  31.     }*/  
  32.   
  33.     /* Since some touchscreens (eg. infrared) physically can't measure pressure, 
  34.     the input system doesn't report it on those. Tslib relies on pressure, thus 
  35.     we set it to constant 255. It's still controlled by BTN_TOUCH/BTN_LEFT - 
  36.     when not touched, the pressure is forced to 0. */  
  37.     /* Since some touchscreens (eg. infrared) physically can't measure pressure, 
  38.     the input system doesn't report it on those. Tslib relies on pressure, thus 
  39.     we set it to constant 255. It's still controlled by BTN_TOUCH/BTN_LEFT - 
  40.     when not touched, the pressure is forced to 0. */  
  41.   
  42. /*  if (!(absbit[BIT_WORD(ABS_PRESSURE)] & BIT_MASK(ABS_PRESSURE))) { 
  43.         i->current_p = 255; 
  44.  
  45.         if ((ioctl(ts->fd, EVIOCGBIT(EV_KEY, sizeof(keybit)), keybit) < 0) || 
  46.             !(keybit[BIT_WORD(BTN_TOUCH)] & BIT_MASK(BTN_TOUCH) || 
  47.               keybit[BIT_WORD(BTN_LEFT)] & BIT_MASK(BTN_LEFT))) { 
  48.             fprintf(stderr, "tslib: Selected device is not a touchscreen (must support BTN_TOUCH or BTN_LEFT events)\n"); 
  49.             return -1; 
  50.         } 
  51.     } 
  52.  
  53.     if (evbit[BIT_WORD(EV_SYN)] & BIT_MASK(EV_SYN)) 
  54.         i->using_syn = 1; 
  55.  
  56.     if (i->grab_events == GRAB_EVENTS_WANTED) { 
  57.         if (ioctl(ts->fd, EVIOCGRAB, (void *)1)) { 
  58.             fprintf(stderr, "tslib: Unable to grab selected input device\n"); 
  59.             return -1; 
  60.         } 
  61.         i->grab_events = GRAB_EVENTS_ACTIVE; 
  62.     }*/  
  63.   
  64.     i->using_syn = 1;  
  65.     return 0;  
  66. }  

 

②若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 
輕按觸摸屏。。。終端輸出亂碼,代表觸摸屏正常!
再編寫簡單應用層代碼測試:

 

[cpp]  view plain  copy
 
 print?
  1. #include<stdio.h>  
  2. #include<sys/types.h>  
  3. #include<sys/stat.h>  
  4. #include<fcntl.h>  
  5. #include<unistd.h>  
  6. #include <linux/input.h>  
  7. int main(int argc, char *argv[])  
  8. {  
  9.     struct input_event event;  
  10.     char *device = argv[1];  
  11.     int ret = 0;  
  12.     int fd = open(device, O_RDWR);  
  13.     if(fd < 0){  
  14.         fprintf(stderr, "open %s failed!",device);  
  15.         return -1;  
  16.     }  
  17.     ret = read(fd, &event, sizeof(event));  
  18.     if(ret < (int)sizeof(event)){  
  19.         fprintf(stderr, "could not get event");  
  20.         return -1;  
  21.     }  
  22.     printf("%04x %04x %08x", event.type, event.code, event.value);  
  23.     return 0;  
  24. }  

 

 

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

多是觸摸屏驅動沒有加載,找不到設備節點

相關文章
相關標籤/搜索