QT 觸控螢幕 TSLIB庫

2021-05-25 13:41:50 字數 3227 閱讀 3133

tslib

是linux

觸控螢幕驅動與

qt之間的一層庫,用於支援

event

事件,在

qt中也配有

linux_input

選項支援觸控螢幕,不過由於事件結構與

linux

驅動傳遞的

input event

不匹配,因而不配使用。

a)qt編譯

qt的編譯中需要在

./configure

中新增-qt-mouse-tslib –i /tslib

編譯生成的標頭檔案路徑

–l /tslib

編譯生成的庫檔案路徑

編譯時設定體系

會決定使用的庫是

*.so

還是*.dll

b)tslib編譯

tslib

的編譯方法在網上比較多見,注意的是在配置

configure

時,最好加上選項

—prefix=/路徑,

這樣make install

能才能將庫和同檔案新增到指定目錄,否則會在預設的

/usr/local/

目錄下

c)tslib

執行的環境變數 由於

tslib

庫的呼叫需要用到較多的環境變數,然而這些環境只在

tslib

中有需求,比較好的策略是執行乙個程式建立程序,新增環境變數,然後呼叫

exec

執行編譯好的

qt程式,繼承關係,保證環境變數的使用

看看環境變數用處:

ld_library_path=/usr/local/tslib/liblibts.so path

qws_mouse_proto=tslib:/dev/event3qt read device path

tslib_confile=/usr/local/tslib/etc/ts.confwhich plugin to be used

tslib_plugindir=/usr/local/tslib/ts

plugin dir

整個設計而言,思路還是挺清晰的

通過讀取

ts.config

決定使用的

plugin

,對於每乙個

plugin

的編寫,如果要保持通用性的話,介面是不變的,所以

plugin

返回給libts.so

的結構是固定的,在**中具體為

tslib_module_info *,

而該結構中提供對應

plugin

的一些方法,實現載入的

plugin

不同呼叫不同的操作方法。

linux ts driver

中通過通知

qt有滑鼠事件產生,通過

readmousedata

呼叫libts.so

中的介面,再呼叫對應的

plugin

介面,從而讀取

input event

資料。

qt中如何知道有滑鼠事件產生呢?沒錯,需要環境變數

qws_mouse_proto,

讀取ts device

所對應的

/dev/eventx,

利用inotify

機制,監控

/dev/eventx

是否有變化(當驅動向裝置檔案中寫入事件報告時會產生變化),一旦監控到則呼叫

readmousedata。

a) 動態庫的使用

dlopen()

功能:開啟乙個動態鏈結庫

包含標頭檔案:

#include

函式定義

void * dlopen( const char * pathname, int mode );

函式描述:

在dlopen的()函式以指定模式開啟指定的

動態連線庫

檔案,並返回乙個控制代碼給呼叫程序。使用dlclose()來解除安裝開啟的庫。

mode:分為這兩種

rtld_lazy 暫緩決定,等有需要時再解出符號

rtld_now

立即決定,返回前解除所有未決定的符號。

rtld_local

rtld_global 允許匯出符號

rtld_group

rtld_world

返回值:

開啟錯誤返回null

成功,返回庫引用

編譯時候要加入 -ldl (指定dl庫)

例如gcc test.c -o test –ldl

dlsym

使用dlsym通過函式名稱獲取函式指標,返回值即為指向函式的指標,供呼叫使用

dlsym()

的函式原型是

void* dlsym(void* handle,const char* symbol)

該函式在檔案中。

handle

是由dlopen開啟動態鏈結庫後返回的指標,symbol就是要求獲取的函式的名稱,函式返回值是void*,指向函式的位址,供呼叫使用

比如,在tslib中,

struct tslib_module_info * (*init)(struct tsdev *, const char *);

init=dlsym(handle,」mod_init」);

init(ts,params);

即為呼叫庫中的mod_init函式

b)event read

在tslib

中呼叫read

讀取input_event

結構,實際上是與核心中

evdev.c

的evdev_read

對應。

在evdev_read

中,使用

input_event_to_user

,最終呼叫

copy_to_user

,將input_event

結構的資料傳遞給使用者空間 在

evdev_ioctl

中,使用

evdev_ioctl_handler,

最終使用

evdev_do_ioctl

,與使用者空間進行

ioctl

qt觸控螢幕的適配層tslib

使用ts calibrate校準觸控螢幕時,要觸控5個點,這時假如gui應用端在執行其他響應觸控事件 滑鼠事件 的程式就會出現錯亂。所以安全的做法應該是在校準觸控螢幕時進行鎖屏操作。解決這兩個問題之前來看看tslib校準方面的原理,假如將原理搞清楚,剩下就是方法實現的問題了。tslib 是觸控螢幕驅...

linux arm移植觸控螢幕tslib

tar zxvf tslib 1.4.tar.gz cd tslib autogen.sh echo ac cv func malloc 0 nonnull yes arm linux.cache configure host arm linux cache file arm linux.cache...

QT 觸控螢幕 驅動

要 本文主要介紹了在嵌入式 linux 系統下基於 qt embeded 的觸控螢幕驅動的設計,通過對 linux 裝置 驅動和qt embedded裝置驅動介面的工作原理和機制介紹,並結合大量源 進行分析,提出了基於qt embeded 的觸控螢幕驅動的開發方案。linux 下的裝置驅動基礎 li...