在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            關 閉

            新聞中心

            EEPW首頁 > 工控自動化 > 設計應用 > 基于Linux內(nèi)核的鍵盤模擬實現(xiàn)

            基于Linux內(nèi)核的鍵盤模擬實現(xiàn)

            作者: 時間:2012-08-17 來源:網(wǎng)絡 收藏

            1 引言

            本文引用地址:http://www.biyoush.com/article/202221.htm

            當前,由于資源完全公開,使得的發(fā)展日益廣泛快速?;?a class="contentlabel" href="http://www.biyoush.com/news/listbylabel/label/Linux">Linux的各種應用已逐漸深入日常生活的方方面面,尤其是在嵌入式領域,由于可裁減定制,因此可隨意地根據(jù)用戶需求進行整個系統(tǒng)的定制與重構(gòu)。其中,我們可以通過對各種標準外部設備的驅(qū)動進行改造,從而實現(xiàn)用戶對標準設備的特定需求,例如可以通過對來實現(xiàn)操作的自動化,從而可以避免重復的操作。

            2 Linux支持的外部調(diào)用接口

            由于Linux作為系統(tǒng)最深層次的核心,因此外部的開發(fā)人員并不能直接對內(nèi)核進行操作。然而在一些應用程序的開發(fā)過程中,又不得不使用內(nèi)核的某些功能,因此就提供了一些外部接口供開發(fā)人員直接與底層內(nèi)核打交道。

            2.1 中斷

            在Linux 下,硬件中斷叫做IRQ(Interrupt Requests)。有兩種IRQ,短類型和長類型。短IRQ需要很短的時間,在此期間機器的其他部分被鎖定,而且沒有其他中斷被處理。一個長IRQ需要較長的時間,在此期間可能發(fā)生其他中斷(但不是發(fā)自同一個設備)。如果可能的話,最好把一個中段聲明為長類型。如果CPU接到一個中斷,它就會停止一切工作(除非它正在處理一個更重要的中斷,在這種情況下要等到更重要的中斷處理結(jié)束后才會處理這個中斷),把相關的參數(shù)存儲到棧里,然后調(diào)用中斷處理程序。這意味著在中斷處理程序本身中有些事情是不允許的,因為這時系統(tǒng)處在一個未知狀態(tài)。解決這個問題的方法是讓中斷處理程序做需要馬上做的事,通常是從硬件讀取信息或給硬件發(fā)送信息,然后把對新信息的處理調(diào)度到以后去做。

            實現(xiàn)的方法是在接到相關的IRQ(在Intel平臺上有16個IRQ)時調(diào)用中斷處理程序。這個函數(shù)接到IRQ號碼、函數(shù)名、標志、一個/proc/interrupts的名字和傳給中斷處理程序的一個參數(shù)。標志中可以包括 SA_SHIRQ來表明你希望和其他處理程序共享此IRQ(通常很多設備公用一個IRQ),或者一個SA_INTERRUPT表明這是一個緊急中斷。這個函數(shù)僅在此IRQ沒有其他處理程序或需要共享所有處理程序時才會成功運行。

            2.2 系統(tǒng)調(diào)用

            系統(tǒng)調(diào)用發(fā)生在用戶進程,通過一些特殊的函數(shù)來請求內(nèi)核提供服務。這時,用戶進程被掛起,內(nèi)核驗證用戶請求,嘗試執(zhí)行并把結(jié)果反饋給用戶進程,接著用戶進程重新啟動。一般當前系統(tǒng)的系統(tǒng)調(diào)用作為一張表sys_call_table進行定義的,是由指向?qū)崿F(xiàn)各種系統(tǒng)調(diào)用的內(nèi)核函數(shù)的函數(shù)指針組成的表。具體參數(shù)參見Linux內(nèi)核源代碼arch/i386/kernel/entry.S文件中:

            ENTRY(sys_call_table)

            l long SYMBOL_NAME(sys_ni_syscall)

            /* 0 - old setup() system call*/

            l long SYMBOL_NAME(sys_exit)

            l long SYMBOL_NAME(sys_ni_syscall)

            /* streams2 */

            l long SYMBOL_NAME(sys_vfork)

            /* 190 */

            2.3 鉤子函數(shù)

            鉤子(HOOK)是Linux系統(tǒng)中非常重要的系統(tǒng)接口,用它可以截獲并處理送給其他應用程序的消息,來完成普通應用程序難以實現(xiàn)的功能。鉤子可以監(jiān)視系統(tǒng)或進程中的各種事件消息,截獲發(fā)往目標的消息并進行處理。這樣就可以在系統(tǒng)中安裝自定義的鉤子,監(jiān)視系統(tǒng)中特定事件的發(fā)生,完成特定的功能,比如截獲、鼠標的輸入,屏幕取詞,日志監(jiān)視等等??梢?,利用鉤子可以實現(xiàn)許多特殊而有用的功能。

            3 鍵盤工作機理

            CPU對外部設備的管理是通過中斷程序進行的,鍵盤也是一種外部設備,因此,CPU對鍵盤的管理也是通過中斷進行的。當你擊打鍵盤的時候,鍵盤控制器會向CPU提出中斷申請,CPU響應此中斷進行處理,這就完成了一次很簡單與人之間通過鍵盤進行的交互。

            首先,當輸入一個鍵盤值的時候,鍵盤將會發(fā)送相應的scancodes給鍵盤驅(qū)動。一個獨立的擊鍵可以產(chǎn)生一個六個scancodes的隊列。鍵盤驅(qū)動中的 handle_ scancode()函數(shù)解析scancodes流并通過kdb_translate()函數(shù)里的轉(zhuǎn)換表(translation-table)將擊鍵事件和鍵的釋放事件(key release events)轉(zhuǎn)換成連續(xù)的keycode。例如,'a'的keycode是30。擊鍵'a'的時候便會產(chǎn)生keycode 30。釋放a鍵的時候會產(chǎn)生keycode 158(128+30)。

            然后,這些keycode通過對keymap的查詢被轉(zhuǎn)換成相應key符號。獲得的字符被送入raw tty隊列—tty_flip_buffer。receive_buf()函數(shù)周期性的從tty_flip_buffer中獲得字符,然后把這些字符送入 tty read隊列。

            當用戶進程需要得到用戶的輸入的時候,它會在進程的標準輸入(stdin)調(diào)用read()函數(shù)。sys_read()函數(shù)調(diào)用定義在相應的tty設備(如/dev/tty0)的file_operations結(jié)構(gòu)中指向tty_read的read()函數(shù)來讀取字符并且返回給用戶進程。

            4 鍵盤的實現(xiàn)

            通常情況下,對鍵盤的實現(xiàn)一般是通過寫一個自己的鍵盤中斷句柄來實現(xiàn),但這種方法容易導致系統(tǒng)崩潰。因此,在這種方法的基礎上可以利用勾子函數(shù)來實現(xiàn)。

            如附圖所示,這里主要用到的勾子函數(shù)包括handle_ scancode(),put_queue(),receive_buf(),tty_read()和sys_read()等函數(shù)。

            4.1 handle_scancode函數(shù)

            handle_scancode函數(shù)是鍵盤驅(qū)動程序中的一個入口函數(shù)(參見文件/usr/src/linux/drives/char/keyboard.c):

            void handle_scancode(unsigned char scancode, int down);

            這里通過替換原始的handle_scancode()函數(shù)來實現(xiàn)紀錄所有的scancode。即將原始的值保存,把新的值注冊進去,從而實現(xiàn)所需要的功能,最后再調(diào)用回到原始值的情況下。當此新的功能函數(shù)完成后,我們就可以記錄下鍵盤上的正確的擊鍵行為了(其中可以包括一些特殊的key,如ctrl, alt,shift,print screen等等)。

            4.2 put_queue函數(shù)

            handle_scancode()函數(shù)會調(diào)用put_queue函數(shù),用來將字符放入tty_queue。

            put_queue函數(shù)在內(nèi)核中定義如下:

            void put_queue(int ch)

            {

            wake_up(keypress_wait);

            if (tty) {

            tty_insert_flip_char(tty, ch, 0);

            con_schedule_flip(tty); }}

            4.3 receive_buf函數(shù)

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

            DIY機械鍵盤相關社區(qū):機械鍵盤DIY


            linux相關文章:linux教程



            上一頁 1 2 下一頁

            評論


            相關推薦

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

            關閉