chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用Linux系統(tǒng)下的輸入設(shè)備進(jìn)行應(yīng)用編程

嵌入式開發(fā)愛好者 ? 來(lái)源:嵌入式開發(fā)愛好者 ? 作者:嵌入式開發(fā)愛好者 ? 2022-11-10 10:10 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

今天主要來(lái)聊一聊,如何使用Linux系統(tǒng)下的輸入設(shè)備進(jìn)行應(yīng)用編程。

第一:什么是輸入設(shè)備

先來(lái)了解一下什么是輸入設(shè)備(稱為input設(shè)備),常見的輸入設(shè)備有鼠標(biāo)、鍵盤、觸摸屏、遙控器、畫圖板等,用戶通過輸入設(shè)備與系統(tǒng)進(jìn)行交互。

由上面可知,輸入設(shè)備種類非常多,那么Linux系統(tǒng)如何管理呢?Linux系統(tǒng)為了統(tǒng)一管理這些輸入設(shè)備,實(shí)現(xiàn)了一套能夠兼容所有輸入設(shè)備的框架,那么這個(gè)框架就是input子系統(tǒng)。驅(qū)動(dòng)開發(fā)人員基于input子系統(tǒng)開發(fā)輸入設(shè)備的驅(qū)動(dòng)程序,input子系統(tǒng)可以屏蔽硬件的差異,向應(yīng)用層提供一套統(tǒng)一的接口。

基于input子系統(tǒng)注冊(cè)成功的輸入設(shè)備,都會(huì)在/dev/input目錄下生產(chǎn)對(duì)應(yīng)的設(shè)備節(jié)點(diǎn)(設(shè)備文件),設(shè)備文件節(jié)點(diǎn)名稱通常為eventX()(X表示一個(gè)數(shù)字編號(hào)0,1,2,3,等),譬如/dev/input/event0、/dev/input/event1、/dev/input/event2 等,通過讀取這些設(shè)備節(jié)點(diǎn)可以獲取輸入設(shè)備上報(bào)的數(shù)據(jù)。

第二:讀取數(shù)據(jù)的流程

如果我們要讀取觸摸屏的數(shù)據(jù),假設(shè)觸摸屏設(shè)備對(duì)應(yīng)的設(shè)備節(jié)點(diǎn)為/dev/input/event0,那么數(shù)據(jù)讀取流程如下:

1、應(yīng)用程序打開/dev/input/event0設(shè)備文件。

2、應(yīng)用程序發(fā)去讀操作(譬如調(diào)用read),如果沒有數(shù)據(jù)可讀則會(huì)進(jìn)入休眠(阻塞I/O情況下)。

3、當(dāng)有數(shù)據(jù)可讀時(shí),應(yīng)用程序會(huì)被喚醒,讀操作獲取到數(shù)據(jù)返回。

4、應(yīng)用程序?qū)ψx取到的數(shù)據(jù)進(jìn)行解析。

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

第三:應(yīng)用程序該如何解析

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

structinput_event{
structtimeval time;
__u16 type;
__u16 code;
__s32value;
};

結(jié)構(gòu)體中的time成員變量是一個(gè)struct timeval類型的變量,該結(jié)構(gòu)體在前面給大家介紹過,內(nèi)核會(huì)記錄每個(gè)上報(bào)的事件及發(fā)生的時(shí)間,并通過變量 time 返回給應(yīng)用程序。時(shí)間參數(shù)通常不是那么重要,而其它3 個(gè)成員變量 type、code、value 更為重要。

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

#define EV_SYN 0x00 //同步類事件,用于同步事件
#define EV_KEY 0x01 //按鍵類事件
#define EV_REL 0x02 //相對(duì)位移類事件(譬如鼠標(biāo))
#define EV_ABS 0x03 //絕對(duì)位移類事件(譬如觸摸屏)
#define EV_MSC 0x04 //其它雜類事件

以上這些宏定義也是在頭文件中,所以在有應(yīng)用程序中需要包含該頭文件:一種輸入設(shè)備通??梢援a(chǎn)生多種不同類型的事件,譬如點(diǎn)擊鼠標(biāo)按鍵(左鍵、右鍵,或鼠標(biāo)上的其他按鍵)時(shí)會(huì)上報(bào)按鍵類事件,移動(dòng)鼠標(biāo)時(shí)則會(huì)上報(bào)相對(duì)位移類事件。

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

#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 鍵

相對(duì)位移事件

#define REL_X 0x00 //X 軸
#define REL_Y 0x01 //Y 軸
#define REL_Z 0x02 //Z 軸
#define REL_RX 0x03
#define REL_RY 0x04

絕對(duì)位移事件

觸摸屏設(shè)備是一種絕對(duì)位移設(shè)備,它能產(chǎn)生絕對(duì)位移事件;譬如對(duì)于觸摸屏來(lái)說,一個(gè)觸摸點(diǎn)所包含的信息可能有多種,譬如觸摸點(diǎn)的X軸坐標(biāo)、Y軸坐標(biāo)、Z軸坐標(biāo),按壓大小以及接觸面積等,所以code變量告知應(yīng)用程序當(dāng)前上報(bào)的是觸摸點(diǎn)的哪一種信息。

#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

以上除了列舉出來(lái)的之外,還有很多,大家可以預(yù)覽頭文件。

value:內(nèi)核每次上報(bào)事件都會(huì)向應(yīng)用層發(fā)送一個(gè)數(shù)據(jù)value,對(duì)value值的解釋隨著code的變化而變化。譬如對(duì)于按鍵事件(type=1)來(lái)說,如果code=2(鍵盤上的數(shù)字鍵1,也就是KEY_1),那么如果value等于1,則表示KEY_1鍵按下;value等于0表示KEY_1鍵松開,如果value等于2則表示KEY_1鍵長(zhǎng)按。在絕對(duì)位移事件中(type=3),如果 code=0(觸摸點(diǎn) X 坐標(biāo) ABS_X),那么 value 值就等于觸摸點(diǎn)的 X 軸坐標(biāo)值;同理,如果 code=1(觸摸點(diǎn) Y 坐標(biāo) ABS_Y),此時(shí)value 值便等于觸摸點(diǎn)的 Y 軸坐標(biāo)值;所以對(duì) value 值的解釋需要根據(jù)不同的 code 值而定!

第四:數(shù)據(jù)同步方法

應(yīng)用程序讀取輸入設(shè)備上報(bào)的數(shù)據(jù)時(shí),一次 read 操作只能讀取一個(gè) struct input_event 類型數(shù)據(jù),譬如對(duì)于觸摸屏來(lái)說,一個(gè)觸摸點(diǎn)的信息包含了 X 坐標(biāo)、Y 坐標(biāo)以及其它信息,對(duì)于這樣情況,應(yīng)用程序需要執(zhí)行多次 read 操作才能把一個(gè)觸摸點(diǎn)的信息全部讀取出來(lái),這樣才能得到觸摸點(diǎn)的完整信息。那么應(yīng)用程序如何得知本輪已經(jīng)讀取到完整的數(shù)據(jù)了呢?其實(shí)這就是通過同步事件來(lái)實(shí)現(xiàn)的,內(nèi)核將本輪需要上報(bào)、發(fā)送給接收者的數(shù)據(jù)全部上報(bào)完畢后,接著會(huì)上報(bào)一個(gè)同步事件,以告知應(yīng)用程序本輪數(shù)據(jù)已經(jīng)完整、可以進(jìn)行同步了。

所有的輸入設(shè)備都需要上報(bào)同步事件通常是SYN_REPORT,而value值通常為0。

第五:讀取struct input_event數(shù)據(jù)代碼實(shí)現(xiàn)

對(duì)輸入設(shè)備調(diào)用read()會(huì)讀取到一個(gè)struct input_event類型數(shù)據(jù)。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
int main(int argc, char *argv[])
{
 struct input_event in_ev = {0};
 int fd = -1;
  /* 校驗(yàn)傳參 */
 if (2 != argc) {
 fprintf(stderr, "usage: %s 
", argv[0]);
 exit(-1);
 }
 /* 打開文件 */
 if (0 > (fd = open(argv[1], O_RDONLY))) {
 perror("open error");
 exit(-1);
 }
 for ( ; ; ) {
 /* 循環(huán)讀取數(shù)據(jù) */
 if (sizeof(struct input_event) !=
 read(fd, &in_ev, sizeof(struct input_event))) {
 perror("read error");
 exit(-1);
 }
 printf("type:%d code:%d value:%d
",
 in_ev.type, in_ev.code, in_ev.value);
 }
}

分析:該案件是,在出廠系統(tǒng)中,該案件驅(qū)動(dòng)基于input子系統(tǒng)而實(shí)現(xiàn),所以在/dev/input目錄下存在KEY0的設(shè)備節(jié)點(diǎn),具體是哪個(gè)設(shè)備節(jié)點(diǎn),可以查看/proc/bus/input/devices文件得知。

3121c894-6042-11ed-8abf-dac502259ad0.png

執(zhí)行結(jié)果如下:

3163918e-6042-11ed-8abf-dac502259ad0.png

程序運(yùn)行后,執(zhí)行按下 KEY0、松開 KEY0 等操作,終端將會(huì)打印出相應(yīng)的信息,如上圖所示。

第一行中 type 等于 1,表示上報(bào)的是按鍵事件 EV_KEY,code=114,打開 input-event-codes.h 頭文件進(jìn)行查找,可以發(fā)現(xiàn) cpde=114 對(duì)應(yīng)的是鍵盤上的 KEY_VOLUMEDOWN 按鍵,這個(gè)開發(fā)板出廠系統(tǒng)已經(jīng)配置好的。而 value=1 表示按鍵按下,所以整個(gè)第一行的意思就是按鍵 KEY_VOLUMEDOWN被按下。

第二行,表示上報(bào)了 EV_SYN 同步類事件(type=0)中的 SYN_REPORT 事件(code=0),表示本輪數(shù)據(jù)已經(jīng)完整、報(bào)告同步。

第三行,type 等于 1,表示按鍵類事件,code 等于 114、value 等于 0,所以表示按鍵 KEY_VOLUMEDOWN被松開。

第四行,又上報(bào)了同步事件。

所以整個(gè)上面 4 行的打印信息就是開發(fā)板上的 KEY0 按鍵被按下以及松開這個(gè)過程,內(nèi)核所上報(bào)的事件以及發(fā)送給應(yīng)用層的數(shù)據(jù) value。我們?cè)囋囬L(zhǎng)按按鍵 KEY0,按住不放,如下所示:

31915678-6042-11ed-8abf-dac502259ad0.png

可以看到上報(bào)按鍵事件時(shí),對(duì)應(yīng)的 value 等于 2,表示長(zhǎng)按狀態(tài)。

總結(jié):使用好標(biāo)準(zhǔn)的輸入設(shè)備系統(tǒng),對(duì)實(shí)現(xiàn)輸入功能具有重要意義。

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 觸摸屏
    +關(guān)注

    關(guān)注

    42

    文章

    2452

    瀏覽量

    121464
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11686

    瀏覽量

    218615

原文標(biāo)題:Linux系統(tǒng)中輸入設(shè)備的控制方法

文章出處:【微信號(hào):嵌入式開發(fā)愛好者,微信公眾號(hào):嵌入式開發(fā)愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    【「Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)」閱讀體驗(yàn)】Linux內(nèi)核開發(fā)基礎(chǔ)

    感謝電子發(fā)燒友論壇提供的《Linux設(shè)備驅(qū)動(dòng)開發(fā)(第2版)》閱讀機(jī)會(huì),測(cè)評(píng)將從Linux內(nèi)核開發(fā)基礎(chǔ)、Linux內(nèi)核平臺(tái)抽象和設(shè)備驅(qū)動(dòng)程序、
    發(fā)表于 01-12 22:45

    如何在Linux中列出USB設(shè)備

    Linux操作系統(tǒng)提供了許多命令來(lái)列出系統(tǒng)中連接的USB設(shè)備,這些命令非常有用,無(wú)論是查看已連接設(shè)備的信息,還是
    發(fā)表于 12-24 08:19

    飛凌嵌入式ElfBoard-Linux系統(tǒng)中的文件分類

    從本質(zhì)上講,Linux系統(tǒng)就是由文件組成的,一切皆文件是linux系統(tǒng)設(shè)計(jì)的核心理念,接下來(lái)介紹一文件類型的種類:1.普通文件:指用戶存儲(chǔ)
    發(fā)表于 12-09 08:59

    【書籍評(píng)測(cè)活動(dòng)NO.67】成為硬核Linux開發(fā)者:《Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)》

    景化應(yīng)用的完整體系。從Linux內(nèi)核開發(fā)的環(huán)境搭建、模塊編程,到設(shè)備樹、總線驅(qū)動(dòng),再到內(nèi)存優(yōu)化、DMA 技術(shù),最后到IIO、GPIO、輸入系統(tǒng)
    發(fā)表于 11-17 17:52

    基于Hbird-e-sdk Linux環(huán)境使用Uart0 對(duì)串口進(jìn)行輸入的軟件代碼參考

    本次代碼是基于hbird-e-sdksoftware參考示例demo_gpio的中斷代碼實(shí)現(xiàn)相應(yīng)更改,然后通過蜂鳥調(diào)試器連接的UART0實(shí)現(xiàn)對(duì)串口的輸入(PC/LINUX) 一.軟件頭文件修改
    發(fā)表于 10-31 06:32

    飛凌嵌入式ElfBoard-系統(tǒng)應(yīng)用編程之文件I/O

    1.1 文件I/O的簡(jiǎn)單概念本章節(jié)僅作為初識(shí)簡(jiǎn)單概念,在后續(xù)章節(jié)會(huì)對(duì)相關(guān)概念進(jìn)行深入介紹。在linux系統(tǒng)中有一個(gè)概念,一切皆文件,所有的設(shè)備都以文件形式存在。幾乎所有的
    發(fā)表于 10-24 08:57

    是否可以通過 CLI 在 Linux 上通過 Nu-Link 對(duì) M2354 MCU 進(jìn)行編程?

    是否可以通過 CLI 在 Linux 上通過 Nu-Link 對(duì) M2354 MCU 進(jìn)行編程? 我正在嘗試從運(yùn)行 armbian 最小版本的基于 arm 的 PC 對(duì) M2354 MCU 進(jìn)
    發(fā)表于 08-18 08:10

    開源系統(tǒng)適配:聚徽分享國(guó)產(chǎn)工控平板在 Linux / 鴻蒙系統(tǒng)的技術(shù)優(yōu)化

    工控平板進(jìn)行技術(shù)優(yōu)化,實(shí)現(xiàn)與 Linux、鴻蒙系統(tǒng)的高效適配,成為行業(yè)關(guān)注的焦點(diǎn)。 一、Linux 系統(tǒng)
    的頭像 發(fā)表于 06-13 16:29 ?897次閱讀

    不借助Linux系統(tǒng),在Windows如何搭建ZMC900E交叉編譯環(huán)境

    嵌入式Linux系統(tǒng),由于系統(tǒng)資源的匱乏,通常無(wú)法安裝本地編譯器進(jìn)行本地開發(fā),而需要在借助一臺(tái)主機(jī)進(jìn)行交叉開發(fā)。一般情況
    的頭像 發(fā)表于 05-21 11:34 ?789次閱讀
    不借助<b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b>,在Windows<b class='flag-5'>下</b>如何搭建ZMC900E交叉編譯環(huán)境

    飛凌嵌入式ElfBoard ELF 1板卡-input子系統(tǒng)之input子系統(tǒng)簡(jiǎn)介

    Linux系統(tǒng)中,Input子系統(tǒng)是一個(gè)用于處理輸入設(shè)備的軟件框架。它提供了一種統(tǒng)一的接口和機(jī)制,使得各種
    發(fā)表于 04-15 10:27

    Linux的作用

    。 2、嵌入式系統(tǒng)Linux可以被嵌入到各種嵌入式設(shè)備中,如智能路由器、智能電視等。它提供了一個(gè)靈活的平臺(tái),可以根據(jù)設(shè)備的需求進(jìn)行定制和優(yōu)
    發(fā)表于 04-04 01:57

    LinuxVim編輯器的使用技巧

    【Vim】常用總結(jié)? 簡(jiǎn)介? image 什么是vim?? Linux兩大編輯神器之一 vim ? Linux/Unix使用最多的編輯器 ? vi的改進(jìn)版 ? 可能是最難上手的編輯
    的頭像 發(fā)表于 04-01 17:36 ?1152次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>下</b>Vim編輯器的使用技巧

    飛凌嵌入式ElfBoard ELF 1板卡-Linux設(shè)備驅(qū)動(dòng)的分類

    設(shè)備和塊設(shè)備都映射到了虛擬文件系統(tǒng)目錄下。應(yīng)用程序可以通過系統(tǒng)調(diào)用接口open、close、write、read等相關(guān)API進(jìn)行訪問字符
    發(fā)表于 03-10 17:00

    Linux系統(tǒng)安裝中文環(huán)境和中文輸入法(),觸覺智能嵌入式開發(fā)板

    觸覺智能經(jīng)驗(yàn)分享,Linux系統(tǒng)安裝中文環(huán)境和中文輸入法(
    的頭像 發(fā)表于 02-26 16:26 ?924次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b>安裝中文環(huán)境和中文<b class='flag-5'>輸入</b>法(<b class='flag-5'>下</b>),觸覺智能嵌入式開發(fā)板

    Linux系統(tǒng)安裝中文環(huán)境和中文輸入法(上),觸覺智能嵌入式開發(fā)板

    觸覺智能經(jīng)驗(yàn)分享,Linux系統(tǒng)安裝中文環(huán)境和中文輸入法(上)
    的頭像 發(fā)表于 02-26 16:23 ?1253次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b>安裝中文環(huán)境和中文<b class='flag-5'>輸入</b>法(上),觸覺智能嵌入式開發(fā)板