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...