国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux輸入設備應用編程(鍵盤,按鍵,觸摸屏,鼠標)

這篇具有很好參考價值的文章主要介紹了Linux輸入設備應用編程(鍵盤,按鍵,觸摸屏,鼠標)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

一 輸入設備編程介紹

1.1?什么是輸入設備呢?

?1.2 什么是輸入設備的應用編程??

?1.3 input子系統(tǒng)

1.4? 數(shù)據(jù)讀取流程

1.5 應用程序如何解析數(shù)據(jù)

1.5.1 按鍵類事件:

?1.5.2 相對位移事件?

1.5.3 絕對位移事件?

二 讀取 struct input_event數(shù)據(jù)??


一 輸入設備編程介紹

本章學習Linux輸入設備的應用編程。

1.1?什么是輸入設備呢?

輸入設備其實就是能夠產生輸入事件的 設備就稱為輸入設備,常見的輸入設備包括鼠標、鍵盤、觸摸屏、按鈕等等,它們都能夠產生輸入事件,產 生輸入數(shù)據(jù)給計算機系統(tǒng)。

?1.2 什么是輸入設備的應用編程??

輸入設備的應用編程其主要是獲取輸入設備上報的數(shù)據(jù)、輸入設備當前狀態(tài)等,譬如獲取觸摸屏當 前觸摸點的 X、Y 軸位置信息以及觸摸屏當前處于按下還是松開狀態(tài),然后根據(jù)獲取到的數(shù)據(jù)做出對應的操作。

?1.3 input子系統(tǒng)

輸入設備種類非常多,每種設備上報的數(shù)據(jù)類型又不一樣,那么 Linux 系統(tǒng)如何管 理呢?

Linux 系統(tǒng)為了統(tǒng)一管理這些輸入設備,實現(xiàn)了一套能夠兼容所有輸入設備的框架,那么這個框架就 是 input 子系統(tǒng)。驅動開發(fā)人員基于 input 子系統(tǒng)開發(fā)輸入設備的驅動程序,input 子系統(tǒng)可以屏蔽硬件的差 異,向應用層提供一套統(tǒng)一的接口。 基于 input 子系統(tǒng)注冊成功的輸入設備,都會在/dev/input 目錄下生成對應的設備節(jié)點(設備文件),設 備節(jié)點名稱通常為 eventX(X 表示一個數(shù)字編號 0、1、2、3 等),如/dev/input/event0、/dev/input/event1、 /dev/input/event2 等,通過讀取這些設備節(jié)點可以獲取輸入設備上報的數(shù)據(jù)。

?Linux輸入設備應用編程(鍵盤,按鍵,觸摸屏,鼠標),Linux開發(fā)板學習,arm開發(fā),linux,c語言,c++,qt,arm

1.4? 數(shù)據(jù)讀取流程

我們要讀取觸摸屏的數(shù)據(jù),假設觸摸屏設備對應的設備節(jié)點為/dev/input/event0,那么數(shù)據(jù)讀取流程 如下:

①、應用程序打開/dev/input/event0 設備文件;

②、應用程序發(fā)起讀操作(譬如調用 read),如果沒有數(shù)據(jù)可讀則會進入休眠(阻塞 I/O 情況下);

③、當有數(shù)據(jù)可讀時,應用程序會被喚醒,讀操作獲取到數(shù)據(jù)返回;

④、應用程序對讀取到的數(shù)據(jù)進行解析。

當無數(shù)據(jù)可讀時,程序會進入休眠狀態(tài)(也就是阻塞),譬如應用程序讀觸摸屏數(shù)據(jù),如果當前并沒有 去觸碰觸摸屏,自然是無數(shù)據(jù)可讀;當我們用手指觸摸觸摸屏或者在屏上滑動時,此時就會產生觸摸數(shù)據(jù)、 應用程序就有數(shù)據(jù)可讀了,應用程序會被喚醒,成功讀取到數(shù)據(jù)。那么對于其它輸入設備亦是如此,無數(shù)據(jù) 可讀時應用程序會進入休眠狀態(tài)(阻塞式 I/O 方式下),當有數(shù)據(jù)可讀時才會被喚醒。

1.5 應用程序如何解析數(shù)據(jù)

應用程序打開輸入設備對應的設備文件,向其發(fā)起讀操作,那么這個讀操作獲取到的是什么樣的數(shù)據(jù)呢?其實每一次 read 操作獲取的都是一個 struct input_event 結構體類型數(shù)據(jù),該結構體定 義在頭文件中,它的定義如下:

struct input_event { 
 struct timeval time; 
 __u16 type; 
 __u16 code; 
 __s32 value; 
}; 

time :內核會記 錄每個上報的事件其發(fā)生的時間

typetype 用于描述發(fā)生了哪一種類型的事件(對事件的分類),Linux 系統(tǒng)所支持的輸入事件類 型如下所示:

#define EV_SYN 0x00 //同步類事件,用于同步事件 
#define EV_KEY 0x01 //按鍵類事件 
#define EV_REL 0x02 //相對位移類事件(譬如鼠標) 
#define EV_ABS 0x03 //絕對位移類事件(譬如觸摸屏) 
#define EV_MSC 0x04 //其它雜類事件 
#define EV_SW 0x05 
#define EV_LED 0x11 
#define EV_SND 0x12 
#define EV_REP 0x14 
#define EV_FF 0x15 
#define EV_PWR 0x16 
#define EV_FF_STATUS 0x17 
#define EV_MAX 0x1f 
#define EV_CNT (EV_MAX+1) 

?以上這些宏定義也是在頭文件中,所以在應用程序中需要包含該頭文件;一種輸入設備 通??梢援a生多種不同類型的事件,譬如點擊鼠標按鍵(左鍵、右鍵,或鼠標上的其它按鍵)時會上報按鍵 類事件,移動鼠標時則會上報相對位移類事件。

codecode 表示該類事件中的哪一個具體事件,以上列舉的每一種事件類型中都包含了一系列具 體事件,譬如一個鍵盤上通常有很多按鍵,譬如字母 A、B、C、D 或者數(shù)字 1、2、3、4 等,而 code 變量則告知應用程序是哪一個按鍵發(fā)生了輸入事件。每一種事件類型都包含多種不同的事件,譬如

1.5.1 按鍵類事件:

#define KEY_RESERVED 0 
#define KEY_ESC 1 //ESC 鍵 
#define KEY_1 2 //數(shù)字 1 鍵 
#define KEY_2 3 //數(shù)字 2 鍵 
#define KEY_TAB 15 //TAB 鍵 
#define KEY_Q 16 //字母 Q 鍵 
#define KEY_W 17 //字母 W 鍵 
#define KEY_E 18 //字母 E 鍵 
#define KEY_R 19 //字母 R 鍵 

?1.5.2 相對位移事件?

#define REL_X 0x00 //X 軸 
#define REL_Y 0x01 //Y 軸 
#define REL_Z 0x02 //Z 軸 
#define REL_RX 0x03 
#define REL_RY 0x04   
#define REL_RZ 0x05 
#define REL_HWHEEL 0x06 
#define REL_DIAL 0x07 
#define REL_WHEEL 0x08 
#define REL_MISC 0x09 
#define REL_MAX 0x0f 
#define REL_CNT (REL_MAX+1)

1.5.3 絕對位移事件?

觸摸屏設備是一種絕對位移設備,它能夠產生絕對位移事件;

對于觸摸屏來說,一個觸摸點所包含的信息可能有多種,譬如觸摸點的 X 軸坐標、Y 軸坐標、Z 軸坐標、按壓力大小以及接觸面積等,所以 code變量告知應用程序當前上報的是觸摸點的哪一種信息(X 坐標還是 Y 坐標、亦或者其它);?

#define ABS_X 0x00 //X 軸 
#define ABS_Y 0x01 //Y 軸 
#define ABS_Z 0x02 //Z 軸 
#define ABS_RX 0x03 
#define ABS_RY 0x04 
#define ABS_RZ 0x05 
#define ABS_THROTTLE 0x06 
#define ABS_RUDDER 0x07 
#define ABS_WHEEL 0x08 
#define ABS_GAS 0x09 
#define ABS_BRAKE 0x0a 
#define ABS_HAT0X 0x10 
#define ABS_HAT0Y 0x11 
#define ABS_HAT1X 0x12 
#define ABS_HAT1Y 0x13 
#define ABS_HAT2X 0x14 
#define ABS_HAT2Y 0x15 
#define ABS_HAT3X 0x16 
#define ABS_HAT3Y 0x17 
#define ABS_PRESSURE 0x18 
#define ABS_DISTANCE 0x19 
#define ABS_TILT_X 0x1a 
#define ABS_TILT_Y 0x1b 
#define ABS_TOOL_WIDTH 0x1c 

?value:內核每次上報事件都會向應用層發(fā)送一個數(shù)據(jù) value,對 value 值的解釋隨著 code 的變化而 變化。

  • 如對于按鍵事件(type=1)來說,如果 code=2(鍵盤上的數(shù)字鍵 1,也就是 KEY_1),那 么如果 value 等于 1,則表示 KEY_1 鍵按下;value 等于 0 表示 KEY_1 鍵松開,如果 value 等于 2? 則表示 KEY_1 鍵長按。
  • 再比如,在絕對位移事件中(type=3),如果 code=0(觸摸點 X 坐標 ABS_X), 那么 value 值就等于觸摸點的 X 軸坐標值;同理,如果 code=1(觸摸點 Y 坐標 ABS_Y),此時 value 值便等于觸摸點的 Y 軸坐標值;所以對 value 值的解釋需要根據(jù)不同的 code 值而定!

二 讀取 struct input_event數(shù)據(jù)??

根據(jù)前面的介紹可知,對輸入設備調用read()會讀取到一個struct input_event類型數(shù)據(jù),現(xiàn)寫一個簡單地應用程序,將讀取到的struct input_event類型數(shù)據(jù)中的每一個元素打印出來、并對它們進行解析。

?2.1 開發(fā)板的按鍵測試

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <linux/input.h>

void main(int argc,char *argv[])
{
    struct input_event in_ev = {0};
    int fd = -1;    //打開設備文件返回的句柄
    if(argc != 2)
    {
        fprintf(stderr,"格式:%s  <input-dev> \n <input-dev>為設備文件路徑\n",argv[0]);
        exit(-1);
    }
    fd = open(argv[1],O_RDONLY);
    if(fd < 0)
    {
        perror("");
        exit(-1);
    }
    while(1)
    {
         if (sizeof(struct input_event) != read(fd, &in_ev, sizeof(struct input_event))) 
         {
             perror("");
             exit(-1);
         }
        printf("type(對事件的分類):%d code(具體事件):%d value(狀態(tài)):%d\n", in_ev.type, in_ev.code, in_ev.value);
    }

}

執(zhí)行程序時需要傳入?yún)?shù),這個參數(shù)就是對應的輸入設備的設備節(jié)點(設備文件),程序中會對傳參進行校驗。程序中首先調用open()函數(shù)打開設備文件,之后在while循環(huán)中調用read()函數(shù)讀取文件,將讀取到的數(shù)據(jù)存放在struct input_event結構體對象中,之后將結構體對象中的各個成員變量打印出來。注意,程序中使用了阻塞式I/O方式讀取設備文件,所以當無數(shù)據(jù)可讀時read調用會被阻塞,知道有數(shù)據(jù)可讀時才會被喚醒!

?Linux輸入設備應用編程(鍵盤,按鍵,觸摸屏,鼠標),Linux開發(fā)板學習,arm開發(fā),linux,c語言,c++,qt,arm

交叉編譯并拷貝到開飯板上?,用cat指令獲得設備節(jié)點路徑?cat /proc/bus/input/devices

Linux輸入設備應用編程(鍵盤,按鍵,觸摸屏,鼠標),Linux開發(fā)板學習,arm開發(fā),linux,c語言,c++,qt,arm

測試程序,獲取輸入設備信息?

?Linux輸入設備應用編程(鍵盤,按鍵,觸摸屏,鼠標),Linux開發(fā)板學習,arm開發(fā),linux,c語言,c++,qt,arm

code = 1時(按鍵事件時),對應的value等于2,表示長按狀態(tài)。

value等于1,表示按下狀態(tài)。

value等于0,表示松開狀態(tài)。

?2.2 開發(fā)板USB接鍵盤按鍵測試

除了測試開發(fā)板上的KEY0按鍵之外,我們還可以測試鍵盤上的按鍵,首先找到一個USB鍵盤連接到開發(fā)板的USB HOST接口上,當鍵盤插入之后,終端將會打印出相應的驅動加載信息:

Linux輸入設備應用編程(鍵盤,按鍵,觸摸屏,鼠標),Linux開發(fā)板學習,arm開發(fā),linux,c語言,c++,qt,arm

?驅動加載成功之后,可以查看下該鍵盤設備對應的設備節(jié)點,使用命令"cat /proc/bus/input/devices",在打印信息中找到鍵盤設備的信息:

Linux輸入設備應用編程(鍵盤,按鍵,觸摸屏,鼠標),Linux開發(fā)板學習,arm開發(fā),linux,c語言,c++,qt,arm
查看到鍵盤的設備信息

?使用的是一個機械師的USB鍵盤"BY Tech Gaming Keyboard",對應的設備節(jié)點為/dev/input/event4,運行測試程序并按下、松開鍵盤上的按鍵:

Linux輸入設備應用編程(鍵盤,按鍵,觸摸屏,鼠標),Linux開發(fā)板學習,arm開發(fā),linux,c語言,c++,qt,arm

Linux輸入設備應用編程(鍵盤,按鍵,觸摸屏,鼠標),Linux開發(fā)板學習,arm開發(fā),linux,c語言,c++,qt,arm文章來源地址http://www.zghlxwxcb.cn/news/detail-753209.html

到了這里,關于Linux輸入設備應用編程(鍵盤,按鍵,觸摸屏,鼠標)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 嵌入式培訓機構四個月實訓課程筆記(完整版)-Linux ARM驅動編程第三天-ARM Linux ADC和觸摸屏開發(fā) (物聯(lián)技術666)

    嵌入式培訓機構四個月實訓課程筆記(完整版)-Linux ARM驅動編程第三天-ARM Linux ADC和觸摸屏開發(fā) (物聯(lián)技術666)

    鏈接:https://pan.baidu.com/s/1V0E9IHSoLbpiWJsncmFgdA?pwd=1688 提取碼:1688 ? 教學內容: 1 、 ADC S3C2440 的 A/D 轉換器包含一個 8 通道的模擬輸入轉換器,可以將模擬輸入信號轉換成 10 位數(shù)字編碼。 在 A/D 轉換時鐘頻率為 2.5MHz 時,其最大轉換率為 500KSPS ( 5 個時鐘周期完成一次轉換) 輸

    2024年02月20日
    瀏覽(26)
  • 應用在手機觸摸屏中的電容式觸摸芯片

    應用在手機觸摸屏中的電容式觸摸芯片

    觸控屏(Touch panel)又稱為觸控面板,是個可接收觸頭等輸入訊號的感應式液晶顯示裝置,當接觸了屏幕上的圖形按鈕時,屏幕上的觸覺反饋系統(tǒng)可根據(jù)預先編程的程式驅動各種連結裝置,可用以取代機械式的按鈕面板,并借由液晶顯示畫面制造出生動的影音效果。 手機觸摸

    2024年02月07日
    瀏覽(27)
  • 應用在游戲機觸摸屏中的觸摸感應芯片

    應用在游戲機觸摸屏中的觸摸感應芯片

    觸屏游戲機的屏幕是由液晶屏和觸控層組成的。觸控層分為電容式觸屏和電阻式觸屏兩種。電容式觸屏是將懸空電極和屏幕玻璃上的電極組成靜電場,當人體接近屏幕時,就會改變靜電場分布,從而實現(xiàn)觸摸的位置探測。而電阻式觸屏則是利用玻璃上的兩層電極之間通電形成一個

    2024年01月18日
    瀏覽(31)
  • 【Unity InputSystem】實用指南:在PC端(鼠標與鍵盤)、手機端(觸摸屏)、主機手柄上同步實現(xiàn)角色移動與跳躍功能

    【Unity InputSystem】實用指南:在PC端(鼠標與鍵盤)、手機端(觸摸屏)、主機手柄上同步實現(xiàn)角色移動與跳躍功能

    隨著Unity的不斷發(fā)展,開發(fā)者對于項目的輸入系統(tǒng)要求也日益提高。在進行多平臺適配和跨平臺移植時,常常需要改變輸入系統(tǒng),這給開發(fā)者帶來了不少困擾。而Unity官方推出的InputSystem插件,則是為了解決這一問題而推出的全新輸入方式。 相較于舊版的InputManager,InputSystem的

    2024年03月13日
    瀏覽(31)
  • Linux 多點電容觸摸屏實驗

    Linux 多點電容觸摸屏實驗

    1、多點觸摸(MT)協(xié)議詳解 電容觸摸屏驅動其實就是以下幾種 linux 驅動框架的組合: ①、IIC 設備驅動,因為電容觸摸 IC 基本都是 IIC 接口的,因此大框架就是 IIC 設備驅動。 ②、通過中斷引腳(INT)向 linux 內核上報觸摸信息,因此需要用到 linux 中斷驅動框架。坐標的上報在中斷

    2024年02月06日
    瀏覽(25)
  • Linux 觸摸屏 (IIC驅動詳解)

    Linux 觸摸屏 (IIC驅動詳解)

    本文使用觸摸屏iic驅動,驅動編寫中要使用 總線,設備,驅動 分層的思想,IIC總線,觸摸屏驅動,觸摸屏設備, ? 一般 SOC 的 I2C 總線驅動都是由半導體廠商編寫的,比如 I.MX6U 的 I2C 適配器驅動 NXP 已經編寫好了,這個不需要用戶去編寫。因此 I2C 總線驅動對我們這些 SOC 使

    2023年04月11日
    瀏覽(29)
  • 電容觸摸屏驅動(Linux驅動開發(fā)篇)

    電容觸摸屏驅動(Linux驅動開發(fā)篇)

    電容屏只需要手指輕觸即可,而電阻屏是需要手指 給予一定的壓力才有反應,而且電容屏不需要校準。 如果要做人機交互設備的開發(fā),多點電容觸摸屏基本是不可能繞過去的。 正點原子ATK-7016 這款屏幕 其實是由 TFT LCD+觸摸屏組合起來的。底下是 LCD 面板,上面是觸摸面板,

    2024年02月05日
    瀏覽(24)
  • linux下安裝qt、qt觸摸屏校準tslib

    選擇安裝選項:在安裝程序啟動后,按照提示進行操作。你可以選擇安裝路徑、安裝組件、個性化設置等。 開始安裝:在確認安裝選項后,點擊 “安裝” 按鈕開始安裝 Qt。這個過程可能需要一些時間,取決于你選擇的組件和系統(tǒng)性能。 配置 Qt:安裝完成后,打開終端并進入

    2024年02月09日
    瀏覽(17)
  • 【ChatGpt】ChatGpt解答了 “我一下午都沒解決的“ Linux觸摸屏驅動的問題

    【ChatGpt】ChatGpt解答了 “我一下午都沒解決的“ Linux觸摸屏驅動的問題

    現(xiàn)實問題: 有一個基于Linux4.19內核開發(fā)了,在海思SS528芯片運行的系統(tǒng),用鼠標可以正常使用。 現(xiàn)在要求使用一塊公司開發(fā)的 多點觸控屏 連接這個系統(tǒng),能正常使用。 分析問題: 要在LInux系統(tǒng)使用觸控屏,可能需要移植 tslib 的庫,這個有以前做過,可以自己解決。 移植后

    2024年02月07日
    瀏覽(22)
  • 從應用層到MCU,看Windows處理鍵盤輸入 [1.在應用層調試Notepad.exe (按鍵消費者)]

    從應用層到MCU,看Windows處理鍵盤輸入 [1.在應用層調試Notepad.exe (按鍵消費者)]

    文本編輯器/文本編輯框是應用層常見的鍵盤處理程序。微軟泄露的WinXP源碼下有文本編輯器Notepad的實現(xiàn): 文本編輯器的實現(xiàn)并不復雜,微軟又(被迫)提供了Sample,因此本文就不重復造輪子了。本文從調試器的角度觀察Notepad.exe如何消費鍵盤按鍵. 首先評估一下調試Notepad.exe的難

    2024年02月08日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包