嵌入式Linux中基於 Qt/Embeded觸控式螢幕驅動的設計
摘要:本文主要介紹了在嵌入式 Linux 系統下基於 Qt/Embeded 的觸控式螢幕驅動的設計,通過對 Linux 裝置 驅動和Qt/Embedded裝置驅動介面的工作原理和機制介紹,並結合大量原始碼進行分析,提出了基於Qt/Embeded 的觸控式螢幕驅動的開發方案。
嵌入式 Linux 以其開源性、核心的健壯性和穩定性、可裁減性,以及有著專業的商業公司和世界頂尖的自由軟體開發者的支援和維護等各方面優勢,吸引了嵌入式系統開發商的目光,成為嵌入式作業系統的新寵。觸控式螢幕由於其友善的人機互動性、操作簡單靈活、輸入速度快,大大簡化了嵌入式系統的輸入而被 廣泛運用。本文介紹了基於嵌入式 Linux 系統平臺上 Qt/Embedded 的觸控式螢幕驅動的設計。該方案已成功運 用於工程機械安全儀和電能質量監測儀專案,實現了 GUI(圖形使用者操作介面)介面對觸控式螢幕的支援,並能根據觸控式螢幕的不同進行定製。
1、 Qt/Embedded 簡介
Qt/Embedded 是著名的 Trolltech 公司釋出的專門面向嵌入式系統的GUI 和應用開發的開發庫。它是一種全面的 C++圖形介面應用開發架構,繼承了Qt 的全部標準 API,提供了比 Xlib 和 XWindows 系統更加緊湊的視窗生成系統,對 FrameBuffer 直接進行操作(見圖 1)。完全模組化的設計和高效的編譯系統減少了記憶體的消耗,這些使 Qt/Embedded 成為嵌入式環境 中,功能強大而全面的GUI開發工具。由於Qt/Embedded 的強大功能,被廣泛用於各種領域,從消費電子(行動電話、掌上電腦、機頂盒)到工業控制(醫療成像 裝置、 移動資訊系統)。
2 、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 函式中再呼叫QmouseDriverFactory::create () 或QmouseDriverPlugin:: create ()。該函式根據 Linux 系統的環境變數QWS_MOUSE_PROTO獲得滑鼠類裝置的裝置型別和裝置節點。開啟並返回相應裝置的基類指標 QWSMouseHandler 給系統,系統通過操作該基類派生出的具體子類裝置指標QWSCustomMouseHandler,獲得對具體滑鼠類裝置的呼叫操作(見圖 4)。
圖 4 軟體流程圖
觸控式螢幕和滑鼠類裝置在功能上基本是一致的,因 此,在 Qt 庫中一般把觸控式螢幕模擬成滑鼠裝置來實現 對觸控式螢幕裝置的操作。但由於觸控式螢幕和滑鼠底層介面並不一樣,會造成對上層介面的不一致。例如,從鼠 標驅動介面中幾乎不會得到絕對位置資訊,一般只會 讀到相對移動量。另外,滑鼠的移動加速度也需要考慮在內,而觸控式螢幕介面則幾乎是清一色的絕對位置信 息和壓力資訊。針對此類差別,Qt/Embedded 將同一類裝置的介面部分也給予區別和抽象,具體實現在 QmouseDriverInterface 類中。
在本系統中,Linux 系統從 COM1 口讀入觸控式螢幕
的座標資料,但由於與觸控式螢幕的底層介面並不一致,需通過新增 QWSCustomMouseHandler 程式介面類來實現對觸控式螢幕的控制。檢視Qt/Embedded原始碼qwsmouselinuxtp_qws.cpp 和 qwsmousevr41xx_qws.cpp,可知 Qt 提供了 linuxtp 和 vr41xx 觸控式螢幕的驅動介面類。如果使用的就是這兩種觸控式螢幕介面,可直接在執行 Qt 的 configure 配置時加入配置選項-qt-mouse-<driver>。由於我們的觸控式螢幕並非以上兩種,因此需新增驅動介面。
由前面滑鼠裝置驅動類的派生結構可知,新增驅 動介面先要通過呼叫QmouseDriverFactory或QmouseDriverPlugin 類根據相應的裝置名生成相對應的 QWSCustomMouseHandler 物件,這些具體的裝置驅動 介面類都是由 QWSMouseHandler 類派生出來的,都 繼承了 QWSMouseHandler 類。然後再由系統呼叫QWSCustomMouseHandler:: readMouseData (),獲取到的觸控式螢幕定位和狀態資訊都直接送到滑鼠裝置驅動類的抽象層 QWSMouseHandler 類,Qt/Embedded 通過 QWSMouseHandler 類來實現對滑鼠裝置的操作。
可以通過兩種方式新增裝置驅動介面類,一種是 通過呼叫 QmouseDriverFactory 生成相應的 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 () 函式可知,該環 境變數可同時設定多個裝置<Driver> [: <Device>],多個裝置之間以空格隔開,由此可設定 QWS_MOUSE_PROTO="Auto LinuxTP", Qt/Embedded 通過該環境變數生成相應的滑鼠和觸控式螢幕驅動介面,對裝置進行操作。然後再對Qt/Embedded的滑鼠驅動介面類的原始碼進行修改。由於觸控式螢幕是採用了系統的串列埠,而Qt/Embedded 自動搜尋滑鼠介面時發現串列埠正在工作中,就會把它當作一個滑鼠裝置進行操作,這就發生了裝置衝突。因此,我們要在 qmousepc_qws.cpp 檔案中將串列埠滑鼠的子驅動去掉,找到函式 QWSPcMouseHandlerPrivate:: openDevices () 中的程式碼如下,把它註釋掉就行了。
else if (driver=="Microsoft") {
QString dev="device".isEmpty()? QString("/dev/ttyS0") : device;
fd = open ( dev.latin1 (), O_RDWR | O_NDELAY );
if ( fd >= 0 )
sub[nsub++] = newQWSPcMouseSubHandler_ms(fd);
} else if (driver=="MouseSystems"){
QStringdev="device".isEmpty()?QString("/dev/ttyS0"). : device;
fd = open ( dev.latin1 (), O_RDWR | O_NDELAY );
if ( fd >= 0 ) sub[nsub++] = new QWSPcMouseSubHandler_mous esystems (fd);
}
關於觸控式螢幕的校準,閱讀 qwsmouselinuxtp_qws.h 檔案(程式碼如下),可知在QWSMouseLinuxTPHandler 中已經實現了座標的校準,一般直接讀取座標的位置 和狀態即可。
class QWSLinuxTPMouseHandler:
public QWSCalibratedMouseHandler
{
};
最後只需要在配置 Qt/Embedded 的安裝configure 加入選項-qt-mouse-<linuxtp>,重新編譯,該 Qt/Embedded平臺上的應用程式即能夠按照定製的要求提供對觸控式螢幕的支援。
4、 結束語
本方案與 Qt 下普通滑鼠驅動使用一致的框架,設計簡潔,條理清楚。已經成功的運用於電能質量監測儀平臺,並且執行穩定,定位準確,反應靈敏。友好的 GUI 介面和便捷的人機介面,使電能質量檢測儀更具亮點。同時,開放原始碼的優勢在此方案中得到充分的體現,通過大量地閱讀原始碼,可以充分的理解軟體工作機制並按使用者的要求進行定製,做出真正適合使用者的產品。
相關推薦
嵌入式Linux中基於 Qt/Embeded觸控式螢幕驅動的設計
摘要:本文主要介紹了在嵌入式 Linux 系統下基於 Qt/Embeded 的觸控式螢幕驅動的設計,通過對 Linux 裝置 驅動和Qt/Embedded裝置驅動介面的工作原理和機制介紹,並結合大量原始碼進行分析,提出了基於Qt/Embeded 的觸控式螢幕驅動的開發方案。
嵌入式LINUX學習-基於4412-LIUNX SHELL基礎知識總結筆記
1、SHELL是什麼? Shell 是一個用 C 語言編寫的程式,它是使用者使用 Linux 的橋樑。Shell 既是一種命令語言,又是一種程式設計語言。Shell 是指一種應用程式,這個應用程式提供了一個介面,使用者通過這個介面訪問作業系統核心的服務。Ken Thompson 的 s
嵌入式LINUX學習-基於4412-LIUNX基礎知識總結筆記
硬碟主分割槽、擴充套件分割槽和邏輯分割槽是什麼? 硬碟分割槽是針對一個硬碟進行操作的,它可以分為:主分割槽、擴充套件分割槽、邏輯分割槽。其中主分割槽就是包含 作業系統啟動所必需的檔案和資料的硬碟分割槽,要在硬碟上安裝作業系統,則該硬碟必須要有一個主分割槽, 而且其主分割槽的數
嵌入式Linux中tmp目錄大小修改
嵌入式專案過程中有的時候需要擴充套件下/tmp目錄的大小,如何實現: 通過df -h可以檢視到/tmp目錄的大小,檔案型別 Filesystem Size Use
Linux中基於hadoop安裝hive(CentOS7+hadoop2.8.0+hive2.1.1)
2安裝 3.3測試 關鍵字:Linux Java CentOS Hadoop Hive 說明:安裝hive前提是要先安裝hadoop叢集,並且hive只需要再hadoop的namenode節點叢集裡安裝即可(需要再所有n
嵌入式linux中的dhcp伺服器
1.重新編譯核心,新增對dhcp的支援 2.busybox是否帶有dhcp的應用,如無,則需要重新編譯busybox,或者直接下一個獨立的也可。 3.dhcp伺服器在etc目錄下的配置檔案,udhcpd.conf 需要配置這個檔案,包括分配的ip,dns等。 我的檔案系統中直接具有dhcp的軟體,分別為u
嵌入式Linux中TP除錯筆記
觸控式螢幕一般是通過IIC來傳輸觸控點的座標給Linux核心,一般而言,其步驟是:當人觸控觸控式螢幕時,觸控式螢幕會產生一箇中斷訊號給Linux核心,核心接收到中斷訊號後便會通過IIC去觸控IC裡讀取資料,因此除錯TP驅動時,應該進行下列步驟(這裡我以ft6x6為例):步驟一
tmpfs在嵌入式linux中的使用
建立有最大容量的 tmpfs 檔案系統很容易。要建立一個新的最大 32 MB 的 tmpfs 檔案系統,請鍵入:# mount tmpfs /dev/shm -t tmpfs -o size=32m這次,我們沒有把 tmpfs 檔案系統安裝在 /mnt/tmpfs,而是建立在 /dev/shm,這正好是 t
Linux中基於hadoop安裝hive(RHEL7.0+hadoop2.8.3+hive2.3.2)
2安裝 3.3測試 關鍵字:Linux Java CentOS Hadoop Hive 說明:安裝hive前提是要先安裝hadoop叢集,並且hive只需要再hadoop的namenode節點叢集裡安裝即可(需要再所有n
對嵌入式Linux中的根檔案系統的理解和解析
當我們在Windows下,提到檔案系統時,你的第一反應是想到的是什麼?是不是Windows下的一些Fat32、NTFS等的檔案系統的型別。而在Linux中,你可能會想到Ext2、Ext3,但你還必須要有一個根檔案系統的概念。根檔案系統首先是一種檔案系統,該檔案系統不僅具有普通檔案系統的儲存資料檔案的功
libxml2庫在嵌入式linux中的應用
在實際的專案開發過程中,往往有這麼一個通用的架構:主應用程式,配置檔案,和配置檔案控制程式。主應用程式往往是根據配置檔案內容來執行的,而控制程式是為給人機互動的。 我也是最近想了解一下這種架構方式,於是在網上找了一些關於配置檔案相關的資訊,最終確認使用xml
嵌入式Linux下基於FFmpeg的視訊硬體編解碼
摘要: 對FFmpeg多媒體解決方案中的視訊編解碼流程進行研究。結合對S3C6410處理器視訊硬體編解碼方法的分析,闡述了嵌入式Linux下基於FFmpeg的H.264視訊硬體編解碼在S3C6410處理器上的實現方法,為嵌入式多媒體開發提供參考。 引言 目前,智慧手機、PDA和平板電腦等越來越多的嵌入式裝
在Linux中設定Qt環境變數
本文講述的是在Linux中設定Qt環境變數,環境的搭建是前提,不過配置好環境是很重要的,建議在配置之前,最好在虛擬機器裡面先走一趟,那麼在真實環境下就不會出現不該出現的錯誤。在使用linux中可能會出現一系列的問題,那麼本文將會幫你解決。 環境配置 下載 qt-x11-op
olsrd路由協議移植到嵌入式linux中使用
1、在olsrd-0.6.4.1資料夾中開啟Makefile.inc檔案,將編譯鏈換成arm交叉編譯器(如下圖),需要注意的是這裡arm-linux-gcc的版本必須與編譯linux核心時的版本一致,否側生成的可執行程式無法再板子上執行。 2、輸入指令"make cle
Ubuntu中基於QT的系統網線連線狀態的實時監視
1.必要準備 需包: #include <QNetworkInterface> 2.實現獲取當前的網線連線狀態 以下是自己在網路上搜到的一個解決方法,且沒有加入iface.flags().testFlag(QNetworkInte
嵌入式Linux中tftp和nfs的筆記
一、tftp 我用的ubuntu14.04已經安裝好tftp服務,這裡記錄下網上的安裝方法: 1、伺服器安裝tftp, apt-get install tftpd-hpa, tftp-hpa 我沒有安裝xinetd,能夠成功從伺服器下載檔案到開發板
基於嵌入式Linux/Qt 開發RFID智能倉儲指紋管理系統
基於嵌入式Linux/Qt 開發RFID智能倉儲指紋管理系統 基於嵌入式Linux/Qt 開發RFID智能倉儲指紋管理系統 Qt 是一個用於桌面系統和嵌入式開發的跨平臺應用程序框架。它包括一個直觀的API和一個豐富的類庫,以及用於GUI開發和國際化的集成工具,另外它支持Java
基於S3C2440的嵌入式Linux驅動——看門狗(watchdog)驅動解讀
csdn note 動作 strong 申請 信號 error started 讀者 本文將介紹看門狗驅動的實現。 目標平臺:TQ2440 CPU:s3c2440 內核版本:2.6.30 1. 看門狗概述 看門狗其實就是一個定時器,當該定時器溢出前必須對看門狗進
嵌入式Linux之我行——PWM在ARM Linux中的原理和蜂鳴器驅動例項開發
嵌入式Linux之我行,主要講述和總結了本人在學習嵌入式linux中的每個步驟。一為總結經驗,二希望能給想入門嵌入式Linux的朋友提供方便。如有錯誤之處,謝請指正。 一、開發環境 主 機:VMWare--Fedora 9 開發板:Mini2440--64MB N
嵌入式Linux驅動學習之USART串列埠控制:基於AT91SAM9261EK
普通微控制器的串列埠操作比較容易,但是基於Linux系統的串列埠操作難不難呢?其實,基於Linux作業系統的串列埠操作分為兩個部分:串列埠驅動部分(底層驅動與設備註冊)與串列埠的應用程式(使用者程式)。一般廠家或是Linux核心已經提供了基於開發板的串列埠驅動,只需