搜尋
首頁php教程PHP开发一個嵌入式Linux系統的鍵盤驅動實作 (1)(2)

初始化部分。這部分包括硬體層和軟體層上的初始化。在本例中,需要先對矩陣電路和SN74hc164晶片所使用到的GPIO連接埠作配置,以使CPU可以對它們進行控制和存取。為了要將某個GPIO連接埠配置成輸入輸出或中斷來源,需要在對應的GPIO控制暫存器中設定正確的值,特定的值可以透過查閱S3C2410開發板手冊來取得。例如,為了將GPB1設定成SN74hc164的輸入端,需要將GPBCON這個控製字中2,3兩位設定成二進位的01,為了將GPG6設定成電壓低跳變中斷源,需要將GPGCON中12,13兩位元設定成二進制的10。在完成了硬體初始化操作以後,就是軟體層上的初始化了。首先將鍵盤中斷處理函數註冊到系統,然後設定一個定時器結構,以便在中斷發生時將其掛到核心的定時器佇列中去,該計時器將觸發對鍵盤的掃描操作。最後透過SN74hc164將矩陣電路的16列置零。

中斷處理部分。如前所述,這部分軟體應該完成的工作就是掃描特殊鍵盤,確定哪個鍵被按下,並且拿到穩定的掃描碼,然後呼叫內核導出函數handle_scancode。在這個應用中,該特殊鍵盤的佈局與PC標準鍵盤的佈局比較相似,所以我們直接將PC鍵盤上對應鍵的系統掃描碼作為我們特殊鍵盤上各個鍵的掃描碼,同時我們將PC鍵盤驅動程序中掃描碼到鍵碼的轉換函數pckbd_translate作為我們的kbd_translate函數。

決定哪一個鍵被按下的演算法如下。在中斷到來時,我們已經可以根據中斷號確定被按下的鍵在哪一行,我們還需要確定被按下的鍵在哪一列。為此,我們先給串聯的兩個SN74hc164晶片送一個CLR訊號,清除,然後送16個1,使得特殊鍵盤的列都是高電位,此時我們在鍵盤的行埠讀到的都是高電位。在16個時脈下,給SN74hc164晶片送入1個0和15個1,使得0在每一列上都唯一出現一次,同時在鍵盤行埠進行掃描。當按下鍵所在列置0時,其所在行就會讀到一個低電位。使用這種“走0法”,我們就可以確定鍵盤上哪個鍵被按下了。但這種簡單的掃描演算法還不夠,因為在這種類型的矩陣掃描鍵盤中,鍵的每次按下和抬起都會有10~20ms(這段時間的長短由硬體特性決定)的毛刺抖動存在,如圖2所示,所以為了獲得穩定的按鍵訊息,必須要想辦法去掉這種抖動,才能避免將使用者的一次按鍵誤當作幾次按鍵來處理。去毛刺的一種常見的方法是在有鍵盤中斷到達時,並不立即去掃描鍵盤,而是先等待一段時間,等跳過毛刺抖動以後再去掃描鍵盤,其偽代碼如下所示:

等待一段時間,跳過抖動;

掃描鍵盤;

if 鍵盤上沒有鍵被按下

結束返回;

if 鍵盤上有鍵被按下

再次等待一段時間然後檢查同樣的鍵是否依然處於被按下狀態;

if 同樣的鍵任然是按下

將讀到的掃描碼返回;

else

直接返回;

這種解決方案固然可行,但是它使用了忙等的方法去毛刺,在忙等期間,系統做不了任何有用的工作。這對於計算資源本身就很有限的嵌入式Linux系統來說,是一種奢侈的浪費。在本應用中,我們設計了適合嵌入式系統的去毛邊解決方案,使用效果良好。

由於Linux核心提供了定時器佇列,所以我們可以使用這個機制來避免忙等,提高系統的效能。當鍵盤上有鍵被按下時,鍵盤中斷處理程序首先關閉中斷源,進入輪詢模式,將一個timerlist物件掛入定時器佇列以後就結束了。掛入核心的定時器按時地被觸發,它所觸發的函數完成以下一些工作:先對整個鍵盤上所有的鍵進行一次掃描,並且將掃描得到的結果保存到一個靜態2維數組變數snap_shot_matrix[16 ][4]中。這個變數描述的是在本次鍵盤掃描的這個時刻,鍵盤上所有鍵的按下情況。如果某個鍵沒有被按下,即處於放開狀態,那麼將snap_shot_matrix中對應的值置為0,如果某個鍵處於按下狀態,那麼將snap_shot_matrix中對應的值為自增1操作,若該值在自增1以後大於某個預先指定的數,我們就可以認為這是一個穩定值,並且將另一個大小為16*4的2維數組變數current_matrix對應座標中的值置1,否則置0 。這個變數描述的就是目前鍵盤上按鍵狀況的穩定值了。也就是說我們先把在本次掃描中得到的採樣資料作處理以後保存到snap_shot_matrix中,然後依據該變數中的值,過濾得到current_matrix,透過這樣一個過程來做去毛邊處理。在得到了本次掃描的穩定值current_matrix以後,我們將其與上次得到的穩定值previous_matrix作比較,從而確定與上次掃描時相比,此刻鍵盤上的按鍵情況是否發生了變化,以及此刻鍵盤上是否有鍵按下。如果發現鍵盤上沒有任何按鍵被按下,則開啟鍵盤中斷,再次切回中斷模式。如果鍵盤上有鍵被按下,且是不同於上次掃描到的被按下鍵,我們立刻呼叫按鍵處理函數process_key,它會呼叫鍵盤驅動中的上層函數handle_scancode。如果鍵盤上按下的鍵就是上次按下的那個鍵,我們將遞增一個計數器,當這個計數器達到某個指定值以後,我們就啟動所謂的Auto repeat功能,即用戶一直按著某個鍵,驅動程式自動重複產生鍵盤輸入。此計數器在被按下鍵發生變化時置0。但是只要鍵盤上仍然有鍵處於被按下狀態,我們就將當前讀到的鍵盤穩定值current_matrix拷貝到previous_matrix中去,並且再次將前面描述的定時器對象掛到內核定時器隊列中,過一段時間以後再次掃描整個鍵盤,直到鍵盤上沒有按鍵。

4 結束語

隨著資訊社會以及電腦軟硬體技術的進步,嵌入式資訊產品的設計和應用得到了迅速的發展,需要為自己的嵌入式Linux系統添加特殊鍵盤驅動的需求也越來越普遍。本文在介紹了Linux中鍵盤驅動程式的整體框架以後,以S3C2410開發板上的一個特殊鍵盤為例子,重點描述了在嵌入式Linux環境下,為特殊鍵盤編寫驅動程式時需要完成的工作,為類似的開發提供了一種思路和參考。


(T114)

 以上就是一個嵌入式Linux系統的鍵盤驅動實作 (1)(2)的內容,更多相關內容請關注PHP中文網(www.php.cn)!


陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。