QT 觸控螢幕 驅動

2021-05-01 04:52:00 字數 3862 閱讀 3196

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

linux 系統主要將裝置分成 3 種型別:字元裝置、 塊裝置和網路介面。每個模組通常實現其中一種型別,相應的模組可分為字元模組、塊模組和網路模組 3 種。然而這種分類方式並不是非常嚴格,程式設計師可以構造乙個大的模組,在其中實現不同型別的裝置驅動程式。為了實現良好的伸縮性和擴充套件性,通常還要為每個功能建立乙個不同的模組。

字元裝置是能夠像位元組流一樣被訪問的裝置,由字元裝置驅動程式來實現這種特性。它通常至少 需要實現 open、close、read 和 write 系統呼叫。字 符裝置可以通過檔案系統節點來訪問,比如字元終 端(/dev/console)和串列埠(/dev/ttys0)就是字元 裝置的例子。塊裝置也是通過/dev 目錄下的檔案系統節點被訪 問的。塊裝置能夠容納檔案系統。linux 允許應用程式像字元裝置那樣讀寫塊裝置,可以一次傳遞任意多位元組的資料。因此,塊裝置與字元裝置的區別僅僅在於核心內部管理資料的方式。也就是核心和驅動程式的介面不同。另外,塊裝置的介面必須支援掛裝檔案系統。

網路介面是乙個能夠和其他主機交換資料的裝置。 它由核心中的網路子系統驅動,負責傳送和接收資料報,它無須了解每項事務是如何對映到實際傳輸的資料報的。

linux 中還存在其他型別的驅動程式模組,這些模組利用核心提供的公共服務來處理特定型別的裝置。 因此我們能夠和通用序列匯流排(usb)模組、串列埠模組等通訊。

在本系統中,控制器將觸控螢幕採集的原始電壓訊號通過專用 a/d 轉換為座標資料,經過 rs-232 匯流排傳送給嵌入式系統(見圖 2)。linux 系統利用核心提供的串列埠模組來處理觸控螢幕裝置,將該裝置以檔案/dev/ttys0 的形式存放在/dev 目錄下,提供了 open、read、write、close 等系統呼叫。我們只需像操作普通 資料檔案一樣對串列埠裝置進行操作,將觸控螢幕的座標 資料送往上層的 qt/embedded 應用層。

3 、qt 下觸控螢幕的驅動

qt/embedded 中與使用者輸入事件相關的訊號,是 建立在對底層輸入裝置的介面呼叫之上的,一般通過 對裝置檔案的 i/o 讀寫來實現。大部分這樣的驅動程式已經被封裝進 qt 庫當中,形成了相應的裝置驅動介面,如顯示卡驅動、滑鼠、鍵盤、串列埠和並口等。其中滑鼠裝置的抽象基類為 qwsmouse handler,從 該類又重新派生出一些具體的滑鼠類裝置的實現類。在 3.3.4 版本系列的 qt/embedded 中,滑鼠類裝置的派生結構如圖 3 所示。

圖 3 滑鼠類裝置的派生結構圖(灰色線框表示可省略類結構)

滑鼠類裝置的載入方式與 keyboard 裝置載入方 式是類似的,在系統構造 qwsserver 物件時,呼叫成 員函式 qwsserver:: openmouse,程式在qwsserver:: openmouse 函式中再呼叫qmousedrive***ctory::create () 或qmousedriverplugin:: create ()。該函式根據 linux 系統的環境變數qws_mouse_proto獲得滑鼠類裝置的裝置型別和裝置節點。開啟並返回相應裝置的基類指標 qwsmousehandler 給系統,系統通過操作該基類派生出的具體子類裝置指標qwscustommousehandler,獲得對具體滑鼠類裝置的呼叫操作(見圖 4)。

圖 4 軟體流程圖

觸控螢幕和滑鼠類裝置在功能上基本是一致的,因 此,在 qt 庫中一般把觸控螢幕模擬成滑鼠裝置來實現 對觸控螢幕裝置的操作。但由於觸控螢幕和滑鼠底層介面並不一樣,會造成對上層介面的不一致。例如,從鼠 標驅動介面中幾乎不會得到絕對位置資訊,一般只會 讀到相對移動量。另外,滑鼠的移動加速度也需要考慮在內,而觸控螢幕介面則幾乎是清一色的絕對位置信 息和壓力資訊。針對此類差別,qt/embedded 將同一類裝置的介面部分也給予區別和抽象,具體實現在 qmousedriverinte***ce 類中。

在本系統中,linux 系統從 com1 口讀入觸控螢幕

的座標資料,但由於與觸控螢幕的底層介面並不一致,需通過新增 qwscustommousehandler 程式介面類來實現對觸控螢幕的控制。檢視qt/embedded源**qwsmouselinuxtp_qws.cpp 和 qwsmousevr41xx_qws.cpp,可知 qt 提供了 linuxtp 和 vr41xx 觸控螢幕的驅動介面類。如果使用的就是這兩種觸控螢幕介面,可直接在執行 qt 的 configure 配置時加入配置選項-qt-mouse-。由於我們的觸控螢幕並非以上兩種,因此需新增驅動介面。

由前面滑鼠裝置驅動類的派生結構可知,新增驅 動介面先要通過呼叫qmousedrive***ctory或qmousedriverplugin 類根據相應的裝置名生成相對應的 qwscustommousehandler 物件,這些具體的裝置驅動 介面類都是由 qwsmousehandler 類派生出來的,都 繼承了 qwsmousehandler 類。然後再由系統呼叫qwscustommousehandler:: readmousedata (),獲取到的觸控螢幕定位和狀態資訊都直接送到滑鼠裝置驅動類的抽象層 qwsmousehandler 類,qt/embedded 通過 qwsmousehandler 類來實現對滑鼠裝置的操作。

可以通過兩種方式新增裝置驅動介面類,一種是 通過呼叫 qmousedrive***ctory 生成相應的 qwscustommousehandler,一種是由 qmousedriverplugin 添 加生成相應的 qwscustommousehandler。我們採用第 一種方案,在原有的介面 qwsmouselinuxtp_qws.cpp 上 進行修改,以適合新的觸控螢幕裝置驅動介面。

首先,我們在 qwsmouselinuxtp_qws.cpp 修改,先 把 ts_event 的結構改為相應裝置的資料結構,再把 qwslinuxtpmousehandlerprivate 函式中開啟的裝置 檔案節點由/dev/ts 改為自己的裝置檔案/dev/ttys1。然 後修改 readmousedata()函式,按自己的資料結構 讀取裝置檔案,傳遞給 qpoint 類對滑鼠進行定位或轉 換為滑鼠按鍵狀態。這個函式的操作可以參照windows 下的滑鼠驅動源**。

其實這樣修改以後,已經能正常使用觸控螢幕裝置 了,但是為了在該系統平台上同時使用滑鼠和觸控螢幕 操作還必須完成兩個步驟:乙個是要正確的設定qws_ mouse_proto 環境變數,閱讀 qwindowsystem_ qws.cpp 中 qwsserver:: openmouse () 函式可知,該環 境變數可同時設定多個裝置[: ],多個裝置之間以空格隔開,由此可設定 qws_mouse_proto="auto linuxtp", qt/embedded 通過該環境變數生成相應的滑鼠和觸控螢幕驅動介面,對裝置進行操作。然後再對qt/embedded的滑鼠驅動介面類的源**進行修改。由於觸控螢幕是採用了系統的串列埠,而qt/embedded 自動搜尋滑鼠介面時發現串列埠正在工作中,就會把它當作乙個滑鼠裝置進行操作,這就發生了裝置衝突。因此,我們要在 qmousepc_qws.cpp 檔案中將串列埠滑鼠的子驅動去掉,找到函式 qwspcmousehandlerprivate:: opendevices () 中的**如下,把它注釋掉就行了。

else if (driver=="microsoft") else if (driver=="mousesystems")

關於觸控螢幕的校準,閱讀 qwsmouselinuxtp_qws.h 檔案(**如下),可知在qwsmouselinuxtphandler 中已經實現了座標的校準,一般直接讀取座標的位置 和狀態即可。

class qwslinuxtpmousehandler:

public qwscalibratedmousehandler

;最後只需要在配置 qt/embedded 的安裝configure 加入選項-qt-mouse-,重新編譯,該 qt/embedded平台上的應用程式即能夠按照定製的要求提供對觸控螢幕的支援

觸控螢幕驅動

輸入子系統體系 核心層 linux dir drivers input input.c 提供最核心函式 裝置事件層 linux dir drivers input evdev.c 提供handler 提供輸入裝置產生的原始資料並上報給應用程式,這適用於 所有輸入裝置,該觸控螢幕也不例外 編寫基於輸入...

觸控螢幕驅動分析

觸控螢幕的主要分為四種,分別是電阻式,電容感應式,紅外線式以及表面聲波式。我們現在我們主要談論是電阻式觸控螢幕。看下圖可以大概了解電阻式觸控螢幕。電阻式觸控螢幕的屏體部分是一塊與顯示器表面相匹配的多層復合薄膜,由一層玻璃或有機玻璃作為基層,表面塗有一層透明 的導電層,上面再蓋有一層外表面的硬化處理,...

觸控螢幕驅動分析

模組初始化 static int init s3c2410ts init void 獲得adc時鐘,並使能 對adc暫存器位址對映到記憶體 配置暫存器 gpio口 xm,xp,ym,yp,adc有關的暫存器 申請input裝置 設定可支援的事件為同步 按鍵 絕對座標事件 設定按鍵時間型別為觸控螢幕 ...