女人荫蒂被添全过程13种图片,亚洲+欧美+在线,欧洲精品无码一区二区三区 ,在厨房拨开内裤进入毛片

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何使用Linux系統下的輸入設備進行應用編程

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

掃碼添加小助手

加入工程師交流群

今天主要來聊一聊,如何使用Linux系統下的輸入設備進行應用編程

第一:什么是輸入設備

先來了解一下什么是輸入設備(稱為input設備),常見的輸入設備有鼠標、鍵盤、觸摸屏、遙控器、畫圖板等,用戶通過輸入設備與系統進行交互。

由上面可知,輸入設備種類非常多,那么Linux系統如何管理呢?Linux系統為了統一管理這些輸入設備,實現了一套能夠兼容所有輸入設備的框架,那么這個框架就是input子系統。驅動開發人員基于input子系統開發輸入設備的驅動程序,input子系統可以屏蔽硬件的差異,向應用層提供一套統一的接口

基于input子系統注冊成功的輸入設備,都會在/dev/input目錄下生產對應的設備節點(設備文件),設備文件節點名稱通常為eventX()(X表示一個數字編號0,1,2,3,等),譬如/dev/input/event0、/dev/input/event1、/dev/input/event2 等,通過讀取這些設備節點可以獲取輸入設備上報的數據。

第二:讀取數據的流程

如果我們要讀取觸摸屏的數據,假設觸摸屏設備對應的設備節點為/dev/input/event0,那么數據讀取流程如下:

1、應用程序打開/dev/input/event0設備文件。

2、應用程序發去讀操作(譬如調用read),如果沒有數據可讀則會進入休眠(阻塞I/O情況下)。

3、當有數據可讀時,應用程序會被喚醒,讀操作獲取到數據返回。

4、應用程序對讀取到的數據進行解析。

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

第三:應用程序該如何解析

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

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

結構體中的time成員變量是一個struct timeval類型的變量,該結構體在前面給大家介紹過,內核會記錄每個上報的事件及發生的時間,并通過變量 time 返回給應用程序。時間參數通常不是那么重要,而其它3 個成員變量 type、code、value 更為重要。

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

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

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

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

#define KEY_RESERVED 0
#define KEY_ESC 1 //ESC 鍵
#define KEY_1 2 //數字 1 鍵
#define KEY_2 3 //數字 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 鍵

相對位移事件

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

絕對位移事件

觸摸屏設備是一種絕對位移設備,它能產生絕對位移事件;譬如對于觸摸屏來說,一個觸摸點所包含的信息可能有多種,譬如觸摸點的X軸坐標、Y軸坐標、Z軸坐標,按壓大小以及接觸面積等,所以code變量告知應用程序當前上報的是觸摸點的哪一種信息。

#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

以上除了列舉出來的之外,還有很多,大家可以預覽頭文件。

value:內核每次上報事件都會向應用層發送一個數據value,對value值的解釋隨著code的變化而變化。譬如對于按鍵事件(type=1)來說,如果code=2(鍵盤上的數字鍵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 值的解釋需要根據不同的 code 值而定!

第四:數據同步方法

應用程序讀取輸入設備上報的數據時,一次 read 操作只能讀取一個 struct input_event 類型數據,譬如對于觸摸屏來說,一個觸摸點的信息包含了 X 坐標、Y 坐標以及其它信息,對于這樣情況,應用程序需要執行多次 read 操作才能把一個觸摸點的信息全部讀取出來,這樣才能得到觸摸點的完整信息。那么應用程序如何得知本輪已經讀取到完整的數據了呢?其實這就是通過同步事件來實現的,內核將本輪需要上報、發送給接收者的數據全部上報完畢后,接著會上報一個同步事件,以告知應用程序本輪數據已經完整、可以進行同步了。

所有的輸入設備都需要上報同步事件通常是SYN_REPORT,而value值通常為0。

第五:讀取struct input_event數據代碼實現

對輸入設備調用read()會讀取到一個struct input_event類型數據。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
int main(int argc, char *argv[])
{
 struct input_event in_ev = {0};
 int fd = -1;
  /* 校驗傳參 */
 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 ( ; ; ) {
 /* 循環讀取數據 */
 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);
 }
}

分析:該案件是,在出廠系統中,該案件驅動基于input子系統而實現,所以在/dev/input目錄下存在KEY0的設備節點,具體是哪個設備節點,可以查看/proc/bus/input/devices文件得知。

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

執行結果如下:

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

程序運行后,執行按下 KEY0、松開 KEY0 等操作,終端將會打印出相應的信息,如上圖所示。

第一行中 type 等于 1,表示上報的是按鍵事件 EV_KEY,code=114,打開 input-event-codes.h 頭文件進行查找,可以發現 cpde=114 對應的是鍵盤上的 KEY_VOLUMEDOWN 按鍵,這個開發板出廠系統已經配置好的。而 value=1 表示按鍵按下,所以整個第一行的意思就是按鍵 KEY_VOLUMEDOWN被按下。

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

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

第四行,又上報了同步事件。

所以整個上面 4 行的打印信息就是開發板上的 KEY0 按鍵被按下以及松開這個過程,內核所上報的事件以及發送給應用層的數據 value。我們試試長按按鍵 KEY0,按住不放,如下所示:

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

可以看到上報按鍵事件時,對應的 value 等于 2,表示長按狀態。

總結:使用好標準的輸入設備系統,對實現輸入功能具有重要意義。

審核編輯:郭婷

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 觸摸屏
    +關注

    關注

    42

    文章

    2383

    瀏覽量

    118374
  • Linux
    +關注

    關注

    87

    文章

    11506

    瀏覽量

    213390

原文標題:Linux系統中輸入設備的控制方法

文章出處:【微信號:嵌入式開發愛好者,微信公眾號:嵌入式開發愛好者】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    開源系統適配:聚徽分享國產工控平板在 Linux / 鴻蒙系統的技術優化

    工控平板進行技術優化,實現與 Linux、鴻蒙系統的高效適配,成為行業關注的焦點。 一、Linux 系統
    的頭像 發表于 06-13 16:29 ?258次閱讀

    不借助Linux系統,在Windows如何搭建ZMC900E交叉編譯環境

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

    飛凌嵌入式ElfBoard ELF 1板卡-input子系統之input子系統簡介

    Linux系統中,Input子系統是一個用于處理輸入設備的軟件框架。它提供了一種統一的接口和機制,使得各種
    發表于 04-15 10:27

    Linux的作用

    。 2、嵌入式系統Linux可以被嵌入到各種嵌入式設備中,如智能路由器、智能電視等。它提供了一個靈活的平臺,可以根據設備的需求進行定制和優
    發表于 04-04 01:57

    LinuxVim編輯器的使用技巧

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

    飛凌嵌入式ElfBoard ELF 1板卡-Linux設備驅動的分類

    設備和塊設備都映射到了虛擬文件系統目錄下。應用程序可以通過系統調用接口open、close、write、read等相關API進行訪問字符
    發表于 03-10 17:00

    Linux系統安裝中文環境和中文輸入法(),觸覺智能嵌入式開發板

    觸覺智能經驗分享,Linux系統安裝中文環境和中文輸入法(
    的頭像 發表于 02-26 16:26 ?510次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>系統</b>安裝中文環境和中文<b class='flag-5'>輸入</b>法(<b class='flag-5'>下</b>),觸覺智能嵌入式開發板

    Linux系統安裝中文環境和中文輸入法(上),觸覺智能嵌入式開發板

    觸覺智能經驗分享,Linux系統安裝中文環境和中文輸入法(上)
    的頭像 發表于 02-26 16:23 ?594次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>系統</b>安裝中文環境和中文<b class='flag-5'>輸入</b>法(上),觸覺智能嵌入式開發板

    Linux系統中shell命令解析

    shell是Linux系統的用戶界面,提供了用戶與內核交互的一種接口,它接收用戶輸入的命令并到送到內核去執行,因此也被稱為Linux的命令解釋器。
    的頭像 發表于 11-05 15:40 ?889次閱讀

    Linux應用編程的基本概念

    Linux應用編程涉及到在Linux環境開發和運行應用程序的一系列概念。以下是一些涵蓋Linux應用
    的頭像 發表于 10-24 17:19 ?623次閱讀

    linux系統設備驅動一般分幾類

    視頻設備驅動 USB設備驅動 其他設備驅動 下面將對這些設備驅動進行詳細的介紹。 字符設備驅動
    的頭像 發表于 08-30 15:13 ?969次閱讀

    Linux設備驅動程序分類有哪些

    Linux設備驅動程序是操作系統與硬件設備之間的橋梁,負責實現硬件設備與操作系統之間的通信和控制
    的頭像 發表于 08-30 15:11 ?1197次閱讀

    linux驅動程序如何加載進內核

    Linux系統中,驅動程序是內核與硬件設備之間的橋梁。它們允許內核與硬件設備進行通信,從而實現對硬件
    的頭像 發表于 08-30 15:02 ?1053次閱讀

    Linux 驅動開發與應用開發,你知道多少?

    一、Linux驅動開發與應用開發的區別開發層次不同:Linux驅動開發主要是針對硬件設備進行編程,處于操作
    的頭像 發表于 08-30 12:16 ?1555次閱讀
    <b class='flag-5'>Linux</b> 驅動開發與應用開發,你知道多少?

    CY7C65211在linux設備進行測試,提示等待設備EEPOM超時如何解決?

    我使用貴公司提供的SDK中的測試代碼,在linux設備進行測試,提示等待設備EEPOM超時。這個問題應該如何解決?或者您能為我提供一些寶貴的建議
    發表于 07-05 06:08
    主站蜘蛛池模板: 镇赉县| 黔西县| 赤水市| 瓮安县| 百色市| 麻城市| 乌什县| 仁布县| 富蕴县| 阳谷县| 民县| 枝江市| 淮滨县| 丰顺县| 吉首市| 中阳县| 邳州市| 松阳县| 阜平县| 沛县| 新乐市| 阜宁县| 阳信县| 柳林县| 丰台区| 封开县| 沂南县| 密山市| 永春县| 盐亭县| 天长市| 乡宁县| 连云港市| 米泉市| 醴陵市| 浙江省| 海宁市| 简阳市| 张家界市| 榆林市| 永寿县|