日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > 綜合技術(shù) > input子系統(tǒng)――架構(gòu)、驅(qū)動(dòng)、應(yīng)用程序

input子系統(tǒng)――架構(gòu)、驅(qū)動(dòng)、應(yīng)用程序

來源:程序員人生   發(fā)布時(shí)間:2015-01-17 09:41:02 閱讀次數(shù):2687次

1、input子系統(tǒng)架構(gòu)

input子系統(tǒng)由驅(qū)動(dòng)層drivers,輸入子系統(tǒng)核心層input core,事件處理層event handler組成。

1個(gè)輸入事件,通過輸入裝備發(fā)給系統(tǒng)如鼠標(biāo)移動(dòng),鍵盤按鍵按下等通過device driver->input core(handler->event函數(shù))->event handler->user space的順序到達(dá)用戶空間傳給利用程序。

1個(gè)輸失事件,通過系統(tǒng)發(fā)給輸入裝備,通過user space->event handler->input core(dev->event函數(shù))->device driver

1、驅(qū)動(dòng)功能層:負(fù)責(zé)和底層的硬件裝備打交道,將底層硬件裝備對(duì)用戶輸入的響應(yīng)轉(zhuǎn)換為標(biāo)準(zhǔn)的輸入事件以后再向上發(fā)送給輸入系統(tǒng)核心層

2、Input系統(tǒng)核心層:由driver/input/input.c及相干頭文件實(shí)現(xiàn),他對(duì)下提供了裝備驅(qū)動(dòng)層的接口,對(duì)上提供了事件處理層的變成接口。

3、事件處理層將硬件裝備上報(bào)的事件分發(fā)到用戶空間和內(nèi)核。


結(jié)構(gòu)圖以下:



2、編寫input驅(qū)動(dòng)需要的函數(shù)

1)包括頭文件<linux/input.h>,他是input子系統(tǒng)的接口,提供了必要的定義消息

2)Input_allocate_device()

分配了1個(gè)Input device的結(jié)構(gòu),設(shè)置他的bit field來告知input子系統(tǒng)他能產(chǎn)生或接收甚么事件。

3)input_register_device(struct input_dev *dev)

dev結(jié)構(gòu)體添加到input_dev_list全局鏈表中去

通過input_attach_handler(struct input_dev *dev, struct input_handler *handler)來查找對(duì)應(yīng)的handler

input_attach_handler里面實(shí)際調(diào)用了input_match_device(const struct input_device_id *id,struct input_dev *dev)

1旦input_attach_handler找到了對(duì)應(yīng)的handler,就履行handler->connect

4)input_report_key(struct input_dev *dev, unsigned int code, int value)

5)input_sync(struct input_dev *dev)

告知事件的接收者,到此為止為1次完全的消息。比如我們?cè)?span style="font-family:Arial">touch screen上取得了xy的值,要使作為1次事件,那末將input_sync加在report xy值得后面。

6)其他的事件type,輸失事件處理

其他的事件有:

EV_LED:用作鍵盤的LED

EV_SND:用作鍵盤的蜂鳴器

他和鍵盤事件很相似,只不過鍵盤事件是INPUT_PASS_TO_DEVICE,而輸失事件是INPUT_PASS_TO_HANDLERS,從系統(tǒng)到輸入裝備的驅(qū)動(dòng)程序,如果你的驅(qū)動(dòng)程序要處理這些事件,必須設(shè)置evbit中相應(yīng)位,而且要實(shí)現(xiàn)1個(gè)回調(diào)函數(shù)。

struct input_dev *button_dev;

button_dev->event = button_event;這個(gè)便是處理輸失事件的回調(diào)函數(shù)



3、普通按鍵實(shí)現(xiàn)input驅(qū)動(dòng)例子

/* drivers->input core->event handler function: this file is button driver date: 20150101 author: lei_wang */ #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/irq.h> #include <asm/irq.h> #include <asm/io.h> #include <mach/regs-gpio.h> #include <mach/hardware.h> #include <linux/interrupt.h> #include <linux/gpio.h> #include <linux/input.h> static struct input_dev *button_dev; static irqreturn_t button_intr(int irq, void *dev_id) { int val; val = s3c2410_gpio_getpin(S3C2410_GPG(0)); // printk(KERN_INFO "key value is %d ", val); input_report_key(button_dev, BTN_0, val); input_sync(button_dev); return IRQ_RETVAL(IRQ_HANDLED); } static int __init button_init(void) { int ret; ret = request_irq(IRQ_EINT8, button_intr, IRQ_TYPE_EDGE_BOTH, "button0", NULL); if (ret) { printk(KERN_ERR "%s request failed ", __func__); return -ENODEV; } button_dev = input_allocate_device(); if (!button_dev) { printk(KERN_ERR "button.c: Not enough memory "); free_irq(IRQ_EINT8, NULL); return -ENOMEM; } button_dev->name = "button0"; button_dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY); button_dev->keybit[BIT_WORD(BTN_0)] = BIT_MASK(BTN_0); ret = input_register_device(button_dev); if (ret) { printk(KERN_ERR "button.c: Failed to register device "); input_free_device(button_dev); free_irq(IRQ_EINT8, NULL); return -ENODEV; } printk(KERN_INFO "button init ok! "); return 0; } static void __exit button_exit(void) { input_unregister_device(button_dev); input_free_device(button_dev); free_irq(IRQ_EINT8, NULL); printk(KERN_INFO "button exit ok! "); } module_init(button_init); module_exit(button_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Realsil Luckywang");


Makefile以下:

obj-m = button.o KERNELDIR ?=/home/lei/linux⑵.6.32.2 modules: $(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules clean: rm -rf *.o *.mod.c *.order *.symvers


Include/linux/bitops.h中定義了

#define BIT(nr) (1UL << (nr))

#define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG))

#define BIT_WORD(nr) ((nr) / BITS_PER_LONG)

#define BTN_0 0x100

button_dev->evbit[0] = BIT_MASK(EV_KEY);

button_dev->keybit[BIT_WORD(BTN_0)] = BIT_MASK(BTN_0);

說明:

1)上面的0x100表示BTN_0這個(gè)bit在所有的bit中是0x100(bit 256)位,那末

BIT_WORD(BTN_0)代表bit 256keybit這個(gè)數(shù)組的第幾個(gè)數(shù)組(第8個(gè))

BIT_MASK(BTN_0)代表bit 256keybit這個(gè)數(shù)組的第幾個(gè)數(shù)組里面的值(第8個(gè)數(shù)組的bit0)

2)事件類型type――編碼code――值value

evbit是事件數(shù)組,evbit這個(gè)事件數(shù)組里面可以放很多事件類型,比如keyabs

事件key里面又有很多具體編碼BTN_0BTN_TOUCH

事件abs里面也有很多具體編碼ABS_XABS_Y

不同編碼有不同的值


另外http://blog.csdn.net/ylyuanlu/article/details/6704744 這篇博客對(duì)以下說的挺詳細(xì)的

1)input子系統(tǒng)的struct input_dev、struct handler的注冊(cè)

2)struct input_dev與struct input_handler怎樣相互匹配(類似于device和driver匹配)

3)事件處理進(jìn)程



4、例子對(duì)應(yīng)的利用程序

/* 20150101 just a simple input test code lei_wang */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <linux/input.h> int main() { int fd; int version; int ret; struct input_event ev; fd = open("/dev/input/event1", O_RDONLY); if (fd < 0) { printf("open file failed "); exit(1); } ioctl(fd, EVIOCGVERSION, &version); printf("evdev driver version is 0x%x: %d.%d.%d ", version, version>>16, (version>>8) & 0xff, version & 0xff); while (1) { ret = read(fd, &ev, sizeof(struct input_event)); if (ret < 0) { printf("read event error! "); exit(1); } if (ev.type == EV_KEY) printf("type %d,code %d, value %d ", ev.type, ev.code, ev.value); } return 0; }

以上只是1個(gè)簡(jiǎn)單的利用程序測(cè)試。當(dāng)你按下K1的時(shí)候,串口終端會(huì)有顯示的input dev上報(bào)的按鍵的消息。

編寫利用程序的時(shí)候如何肯定是哪一個(gè)eventX呢,cat /proc/bus/input/devices,輸出打印消息以下:


這里插入了鼠標(biāo),通過比較VID、PID來找到對(duì)應(yīng)的usb mouse裝備,然后找到對(duì)應(yīng)的mouse0、event1


另外還有很多里面ioctl調(diào)用的內(nèi)容沒有實(shí)驗(yàn),具體可以參考這篇博客http://www.cnblogs.com/leaven/archive/2011/02/12/1952793.html,對(duì)ioctl的每一個(gè)case和read調(diào)用都試1遍,找到自己的體會(huì)。


生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 亚洲国产精品麻豆 | 自拍色图 | 韩国日本美国免费毛片 | 久久国产一区二区 | 欧洲精品久久久 | 亚洲另类视频 | 久久国产精品免费一区二区三区 | 99精品视频在线观看 | 国产精品日韩在线观看 | 91高清免费看| 让男人欲仙欲死的床技 | 久久99久久99精品免观看粉嫩 | 性做久久久久久久免费看 | 亚洲精品电影网在线观看 | 国产一区二区三区久久 | 成人影院免费观看 | 欧美一区二区三区久久 | 婷婷综合 | 爱爱免费视频网站 | 日本在线免费观看 | 福利毛片| 国产成人免费视频网站视频社区 | 精品视频免费观看 | 久久一区视频 | 国产欧美精品一区aⅴ影院 岛国av免费看 | 亚洲精彩视频在线观看 | 天堂中文在线视频 | 黄色成人在线 | 狠狠干2024 | 日韩毛片在线看 | 中文字幕日本视频 | 黄色网av| 午夜精品久久久久久久99热浪潮 | 日韩三级电影在线观看 | www.伊人网| 一区二区三区在线视频播放 | 亚洲精品一区二区三 | 日本一区二区三区免费观看 | 国产精品久久久久久久久久免费 | 日韩一区二区三区视频 | 91视频免费观看 |