<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于MinuGUI的嵌入式智能儀器觸摸屏設(shè)計(jì)

          基于MinuGUI的嵌入式智能儀器觸摸屏設(shè)計(jì)

          作者: 時(shí)間:2013-05-09 來源:網(wǎng)絡(luò) 收藏

          2.1 驅(qū)動(dòng)的編寫

          驅(qū)動(dòng)在Linux框架下屬于字符設(shè)備驅(qū)動(dòng)。

          驅(qū)動(dòng)的入口函數(shù)為ads7843 _ ts_ init ( ) , 在該函數(shù)中,初始化I/O口, 注冊筆中斷和設(shè)備節(jié)點(diǎn), 完成設(shè)備文件系統(tǒng)創(chuàng)建標(biāo)準(zhǔn)字符設(shè)備的初始化工作[ 8 - 10 ]。設(shè)備操作的結(jié)構(gòu)通過ads7843_ts_fop s定義。

          STatic struct file_operatiONs ads7843_ts_fop s = {

          read: ads7843_ts_read,

          poll: ads7843_ts_poll,

          ioctl: ads7843_ts_ioctl,

          fasync: ads7843_ts_fasync,

          open: ads7843_ts_open,

          release: ads7843_ts_release,

          };

          這樣, 只需根據(jù)實(shí)際需要正確定義該結(jié)構(gòu)中的幾個(gè)函數(shù)過程, 就可完成設(shè)備驅(qū)動(dòng)的開發(fā)。

          當(dāng)設(shè)備被打開時(shí), 首先執(zhí)行到ads7843_ts_open ( )函數(shù),并在該函數(shù)中, 初始化一個(gè)緩沖區(qū), 用于存儲(chǔ)坐標(biāo)數(shù)據(jù)。在觸摸屏被按下后, 系統(tǒng)首先觸發(fā)中斷, 在ads7843_ts_interrup t ( )中斷程序中, 判斷in_timehandle全局變量的狀態(tài), in_ timehandle在定時(shí)器函數(shù)中被改變, 也就是說進(jìn)入中斷后, 先經(jīng)過定時(shí)器延時(shí)20ms, 完成觸摸屏的軟件去抖, 再判斷觸摸屏是否被按下。然后通過read_xy ()函數(shù)分別切換至X和Y 通道, 完成觸點(diǎn)電壓的AD轉(zhuǎn)換, 并讀取12 位坐標(biāo)值。

          static void ads7843_ ts_ interrup t ( int IRq, void 3 dev_ id,

          struct p t_regs3 regs)

          {

          sp in_lock_irq (tsdevlock) ;

          if ( in_timehandle 》 0)

          {

          sp in_unlock_irq (tsdevlock) ;

          return;

          }

          disable_irq ( IRQ_GPIO_ADS7843) ;

          ads7843_ts_starttimer ( ) ;

          sp in_unlock_irq (tsdevlock) ;

          }

          應(yīng)用程序調(diào)用read ( ) 函數(shù)時(shí), 進(jìn)入驅(qū)動(dòng)的ads7843_ts_read ( )接口函數(shù)。在該接口函數(shù)中獲取采樣結(jié)果, 判斷是否要對坐標(biāo)進(jìn)行校準(zhǔn), 將最終結(jié)果寫入到緩沖區(qū)中,并通過copy_to_user ( )函數(shù)將其從內(nèi)核空間復(fù)制到用戶空間, 以使應(yīng)用程序能夠使用。在ads7843_ts_read ( )函數(shù)中采用了非阻塞型操作, 使得在沒有數(shù)據(jù)到達(dá)的時(shí)候立即返回, 然后用異步觸發(fā)fasync ( )來通知數(shù)據(jù)的到來。ads7843 _ ts_poll ()函數(shù)用于驅(qū)動(dòng)程序的非阻塞操作, ads7843_ts_fasync ( )函數(shù)用于驅(qū)動(dòng)異步觸發(fā)。ads7843_ts_ioctl ( )函數(shù)中, 提供了可從用戶態(tài)控制的參數(shù), 如觸摸屏是否在驅(qū)動(dòng)中校準(zhǔn)、屏幕的最大最小坐標(biāo)值等。ads7843_ts_release( )函數(shù)用來關(guān)閉觸摸屏設(shè)備。

          2.2 觸摸屏的校準(zhǔn)

          開發(fā)過程中,觸摸屏作為輸入設(shè)備與LCD配合使用。為了能使從觸摸屏采樣得到坐標(biāo)與屏幕的顯示坐標(biāo)對應(yīng),還需要做一個(gè)映射, 也就是要對觸摸屏進(jìn)行校準(zhǔn)。如圖4所示, 所用的觸摸屏和液晶屏都是標(biāo)準(zhǔn)的矩形, 只要安裝合理,可以認(rèn)為觸摸屏的X 方向坐標(biāo)只與顯示屏X 方向相關(guān), Y方向坐標(biāo)只與顯示屏的Y方向相關(guān)。假設(shè)顯示屏的分辨率是W ×H, 顯示區(qū)域的左上角對應(yīng)的觸摸屏采樣坐標(biāo)是( x1 , y1 ) ,右下角對應(yīng)的坐標(biāo)是( x2 , y2 ) , 那么觸摸屏上任意一點(diǎn)采樣坐標(biāo)( x, y) 與顯示屏坐標(biāo)( xd , yd )的對應(yīng)關(guān)系可以按照如下公式計(jì)算:

          這樣, 在測得( x1 , y1 )和( x2 , y2 ) 點(diǎn)觸摸屏的采樣值后, 利用上述公式編制校準(zhǔn)函數(shù),在觸摸屏工作的過程中, 計(jì)算出實(shí)際觸摸點(diǎn)對應(yīng)的顯示坐標(biāo),完成觸摸屏的校準(zhǔn)。

          基于MinuGUI的嵌入式智能儀器觸摸屏設(shè)計(jì)

          圖4 觸摸屏的校準(zhǔn)

          3 觸摸屏用戶應(yīng)用程序

          創(chuàng)建的Linux設(shè)備文件系統(tǒng)觸摸屏節(jié)點(diǎn)為/dev/ts.在應(yīng)用程序中,可以像打開文件一樣用open函數(shù)打開設(shè)備文件, 然后用read ()函數(shù)讀取由驅(qū)動(dòng)傳遞到用戶空間的數(shù)據(jù)。應(yīng)用程序的開發(fā)采用MiniGU I進(jìn)行, MiniGU I是由北京飛漫公司開發(fā), 可應(yīng)用于實(shí)時(shí)系統(tǒng)中的輕量級(jí)圖形用戶界面支持系統(tǒng)。其函數(shù)接口與Windows SDK類似, 開發(fā)方便。

          MiniGU I的輸入抽象層( IAL: Input Abstract Layer)提供了對觸摸屏、鼠標(biāo)等輸入設(shè)備的豐富支持, 并支持PXA255處理器平臺(tái)。只要經(jīng)過簡單的設(shè)置就可以在應(yīng)用程序中使用觸摸屏。配置安裝MiniGU I時(shí), 使用22enable2px255bial項(xiàng), 由于在安裝MiniGU I時(shí)采用了內(nèi)嵌資源的靜態(tài)編譯方式, 所以在編譯之前, 需在MiniGU I的src / sysres/目錄下建立mgetc2pxa1c 文件,并在其中用下面語句設(shè)置系統(tǒng)參數(shù), 將觸摸屏設(shè)為輸入設(shè)備。

          static char * SYSTEM_VALUES[ ] = { “ fbcon” ,“ PX255B” , “ /dev/ ts” , “ none” };

          MiniGU I對觸摸屏輸入的處理方式如圖5 所示。

          基于MinuGUI的嵌入式智能儀器觸摸屏設(shè)計(jì)

          圖5 MiniGUI 中的觸摸屏輸入

          MiniGUI 通過觸摸屏設(shè)備驅(qū)動(dòng)程序接收原始的輸入數(shù)據(jù), 把它轉(zhuǎn)換為MiniGUI 抽象的觸摸屏事件和數(shù)據(jù)。

          相關(guān)的底層事件處理例程把這些觸摸事件轉(zhuǎn)換為上層的觸摸消息, 放到相應(yīng)的消息隊(duì)列中。應(yīng)用程序通過消息循環(huán)獲取這些消息, 交由窗口過程處理。編制針對觸摸屏的應(yīng)用程序時(shí),需要做的只是在窗口接收到諸如MSG _LBUTTONDOWN 等觸屏消息時(shí), 調(diào)用相應(yīng)的語句, 完成預(yù)期操作。

          4 結(jié)論

          觸摸屏接口增強(qiáng)了儀器系統(tǒng)的人機(jī)交互功能,方便了操作人員的使用; 接口電路和驅(qū)動(dòng)程序的模塊化方便了儀器的后續(xù)改進(jìn)和新產(chǎn)品的開發(fā),并可根據(jù)需要移植應(yīng)用到各種不同場合。的觸摸屏接口已經(jīng)成功應(yīng)用在故障診斷巡檢儀器中,其工作穩(wěn)定,運(yùn)行可靠,具有很好的實(shí)用價(jià)值。

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          上一頁 1 2 下一頁

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();