亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? input-programming.txt

?? 嵌入式系統(tǒng)設(shè)計與實驗教材二源碼linux內(nèi)核移植與編譯
?? TXT
字號:
$Id: input-programming.txt,v 1.4 2001/05/04 09:47:14 vojtech Exp $Programming input drivers~~~~~~~~~~~~~~~~~~~~~~~~~1. Creating an input device driver~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~1.0 The simplest example~~~~~~~~~~~~~~~~~~~~~~~~Here comes a very simple example of an input device driver. The device hasjust one button and the button is accessible at i/o port BUTTON_PORT. Whenpressed or released a BUTTON_IRQ happens. The driver could look like:#include <linux/input.h>#include <linux/module.h>#include <linux/init.h>#include <asm/irq.h>#include <asm/io.h>static void button_interrupt(int irq, void *dummy, struct pt_regs *fp){	input_report_key(&button_dev, BTN_1, inb(BUTTON_PORT) & 1);}static int __init button_init(void){	if (request_irq(BUTTON_IRQ, button_interrupt, 0, "button", NULL)) {                printk(KERN_ERR "button.c: Can't allocate irq %d\n", button_irq);                return -EBUSY;        }		button_dev.evbit[0] = BIT(EV_KEY);	button_dev.keybit[LONG(BTN_0)] = BIT(BTN_0);		input_register_device(&button_dev);}static void __exit button_exit(void){        input_unregister_device(&button_dev);	free_irq(BUTTON_IRQ, button_interrupt);}module_init(button_init);module_exit(button_exit);1.1 What the example does~~~~~~~~~~~~~~~~~~~~~~~~~First it has to include the <linux/input.h> file, which interfaces to theinput subsystem. This provides all the definitions needed.In the _init function, which is called either upon module load or whenbooting the kernel, it grabs the required resources (it should also checkfor the presence of the device).Then it sets the input bitfields. This way the device driver tells the otherparts of the input systems what it is - what events can be generated oraccepted by this input device. Our example device can only generate EV_KEY typeevents, and from those only BTN_0 event code. Thus we only set these twobits. We could have used	set_bit(EV_KEY, button_dev.evbit);	set_bit(BTN_0, button_dev.keybit);as well, but with more than single bits the first approach tends to beshorter. Then the example driver registers the input device structure by calling	input_register_device(&button_dev);This adds the button_dev structure to linked lists of the input driver andcalls device handler modules _connect functions to tell them a new inputdevice has appeared. Because the _connect functions may call kmalloc(,GFP_KERNEL), which can sleep, input_register_device() must not be calledfrom an interrupt or with a spinlock held.While in use, the only used function of the driver is	button_interrupt()which upon every interrupt from the button checks its state and reports itvia the 	input_report_btn()call to the input system. There is no need to check whether the interruptroutine isn't reporting two same value events (press, press for example) tothe input system, because the input_report_* functions check thatthemselves.1.2 dev->open() and dev->close()~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~In case the driver has to repeatedly poll the device, because it doesn'thave an interrupt coming from it and the polling is too expensive to be doneall the time, or if the device uses a valuable resource (eg. interrupt), itcan use the open and close callback to know when it can stop polling orrelease the interrupt and when it must resume polling or grab the interruptagain. To do that, we would add this to our example driver:int button_used = 0;static int button_open(struct input_dev *dev){        if (button_used++)                return 0;	if (request_irq(BUTTON_IRQ, button_interrupt, 0, "button", NULL)) {                printk(KERN_ERR "button.c: Can't allocate irq %d\n", button_irq);                button_used--;                return -EBUSY;        }        return 0;}static void button_close(struct input_dev *dev){        if (!--button_used)                free_irq(IRQ_AMIGA_VERTB, button_interrupt);}static int __init button_init(void){	...	button_dev.open = button_open;	button_dev.close = button_close;	...}Note the button_used variable - we have to track how many times the openfunction was called to know when exactly our device stops being used.The open() callback should return a 0 in case of succes or any nonzero valuein case of failure. The close() callback (which is void) must always succeed.1.3 Basic event types~~~~~~~~~~~~~~~~~~~~~The most simple event type is EV_KEY, which is used for keys and buttons.It's reported to the input system via:	input_report_key(struct input_dev *dev, int code, int value)See linux/input.h for the allowable values of code (from 0 to KEY_MAX).Value is interpreted as a truth value, ie any nonzero value means keypressed, zero value means key released. The input code generates events onlyin case the value is different from before.In addition to EV_KEY, there are two more basic event types: EV_REL andEV_ABS. They are used for relative and absolute values supplied by thedevice. A relative value may be for example a mouse movement in the X axis.The mouse reports it as a relative difference from the last position,because it doesn't have any absolute coordinate system to work in. Absoluteevents are namely for joysticks and digitizers - devices that do work in anabsolute coordinate systems.Having the device report EV_REL buttons is as simple as with EV_KEY, simplyset the corresponding bits and call the	input_report_rel(struct input_dev *dev, int code, int value)function. Events are generated only for nonzero value. However EV_ABS requires a little special care. Before callinginput_register_devices, you have to fill additional fields in the input_devstruct for each absolute axis your device has. If our button device had alsothe ABS_X axis:	button_dev.absmin[ABS_X] = 0;	button_dev.absmax[ABS_X] = 255;	button_dev.absfuzz[ABS_X] = 4;	button_dev.absflat[ABS_X] = 8;This setting would be appropriate for a joystick X axis, with the minimum of0, maximum of 255 (which the joystick *must* be able to reach, no problem ifit sometimes reports more, but it must be able to always reach the min andmax values), with noise in the data up to +- 4, and with a center flatposition of size 8.If you don't need absfuzz and absflat, you can set them to zero, which meanthat the thing is precise and always returns to exactly the center position(if it has any).1.4 The void *private field~~~~~~~~~~~~~~~~~~~~~~~~~~~This field in the input structure can be used to point to any private datastructures in the input device driver, in case the driver handles more thanone device. You'll need it in the open and close callbacks.1.5 NBITS(), LONG(), BIT()~~~~~~~~~~~~~~~~~~~~~~~~~~These three macros frin input.h help some bitfield computations:	NBITS(x) - returns the length of a bitfield array in longs for x bits	LONG(x)  - returns the index in the array in longs for bit x	BIT(x)   - returns the indes in a long for bit x1.6 The number, id* and name fields~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~The dev->number is assigned by the input system to the input device when itis registered. It has no use except for identifying the device to the userin system messages.The dev->name should be set before registering the input device by the inputdevice driver. It's a string like 'Generic button device' containing anuser friendly name of the device.The id* fields contain the bus ID (PCI, USB, ...), vendor ID and device IDof the device. The bus IDs are defined in input.h. The vendor and device idsare defined in pci_ids.h, usb_ids.h and similar include files. These fieldsshould be set by the input device driver before registering it.The idtype field can be used for specific information for the input devicedriver.The id and name fields can be passed to userland via the evdev interface.1.7 The keycode, keycodemax, keycodesize fields~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~These two fields will be used for any inpur devices that report their dataas scancodes. If not all scancodes can be known by autodetection, they mayneed to be set by userland utilities. The keycode array then is an arrayused to map from scancodes to input system keycodes. The keycode max willcontain the size of the array and keycodesize the size of each entry in it(in bytes).1.8 Key autorepeat~~~~~~~~~~~~~~~~~~... is simple. It is handled by the input.c module. Hardware autorepeat isnot used, because it's not present in many devices and even where it ispresent, it is broken sometimes (at keyboards: Toshiba notebooks). To enableautorepeat for your device, just set EV_REP in dev->evbit. All will behandled by the input system.1.9 Other event types, handling output events~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~The other event types up to now are:EV_LED - used for the keyboad LEDs.EV_SND - used for keyboard beeps.They are very similar to for example key events, but they go in the otherdirection - from the system to the input device driver. If your input devicedriver can handle these events, it has to set the respective bits in evbit,*and* also the callback routine:	button_dev.event = button_event;int button_event(struct input_dev *dev, unsigned int type, unsigned int code, int value);{	if (type == EV_SND && code == EV_BELL) {		outb(value, BUTTON_BELL);		return 0;	}	return -1;}This callback routine can be called from an interrupt or a BH (although thatisn't a rule), and thus must not sleep, and must not take too long to finish.

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美在线观看18| 久久超碰97人人做人人爱| 97久久久精品综合88久久| 最新热久久免费视频| 97精品久久久午夜一区二区三区| 中文字幕一区二区三区精华液 | 欧美日精品一区视频| 夜夜嗨av一区二区三区四季av| 欧美老女人第四色| 美日韩黄色大片| 国产精品网友自拍| 日本久久一区二区| 日韩国产一二三区| 久久这里只有精品视频网| 成人av电影在线网| 亚洲成a人片在线观看中文| 日韩精品综合一本久道在线视频| 国产精品一区二区三区四区| 中文字幕一区二区在线观看 | 91视频在线观看| 亚洲成人激情综合网| 精品国产凹凸成av人网站| av电影天堂一区二区在线观看| 亚洲午夜久久久久| 精品国产一区二区亚洲人成毛片| 成人高清视频在线观看| 亚洲一区二区三区四区的| 日韩视频在线一区二区| 91最新地址在线播放| 日韩高清在线一区| 亚洲视频每日更新| 欧美成人性福生活免费看| 97精品视频在线观看自产线路二| 麻豆成人av在线| 1区2区3区精品视频| 精品久久久久一区二区国产| 91日韩一区二区三区| 久久国产精品第一页| 亚洲最大成人网4388xx| 国产三级精品三级在线专区| 欧美丰满高潮xxxx喷水动漫| eeuss国产一区二区三区| 日日夜夜免费精品视频| 亚洲少妇最新在线视频| 久久色成人在线| 91精品国产手机| 欧美日韩在线播放一区| 97精品久久久午夜一区二区三区| 久久99久久精品| 丝袜亚洲精品中文字幕一区| 一区免费观看视频| 久久久久久亚洲综合| 欧美一级二级在线观看| 欧洲另类一二三四区| 91一区在线观看| 丁香六月综合激情| 国产美女精品一区二区三区| 午夜一区二区三区视频| 一级女性全黄久久生活片免费| 国产精品欧美久久久久无广告| 久久免费国产精品| 久久一区二区三区国产精品| 欧美一卡2卡三卡4卡5免费| 欧美日韩一级大片网址| 91久久精品网| 日本韩国一区二区三区视频| 91美女片黄在线观看| 色综合天天综合网国产成人综合天 | 在线不卡一区二区| 欧美性感一区二区三区| 色婷婷亚洲综合| 欧美专区在线观看一区| 在线观看免费一区| 色妹子一区二区| 91国产免费观看| 欧美日韩一区三区四区| 欧美日韩国产一区二区三区地区| 欧美日韩中文精品| 欧美疯狂做受xxxx富婆| 欧美日韩1234| 欧美电影精品一区二区| 精品国产91洋老外米糕| 2020日本不卡一区二区视频| 久久免费电影网| 欧美国产国产综合| 亚洲图片你懂的| 亚洲成a人片在线不卡一二三区| 日韩精品一卡二卡三卡四卡无卡| 日韩制服丝袜av| 久久99国产精品尤物| 国产精品资源在线观看| 成人av电影观看| 91福利国产成人精品照片| 777午夜精品免费视频| 日韩视频123| 国产日韩欧美精品综合| 亚洲色图一区二区| 亚洲成人av一区二区三区| 老司机精品视频线观看86| 国产在线一区观看| 一本一道综合狠狠老| 欧美色图12p| 精品三级在线看| 中文字幕一区二区三| 亚洲国产成人va在线观看天堂| 蜜臀va亚洲va欧美va天堂| 国产91在线|亚洲| 欧美怡红院视频| 精品国产乱码久久久久久蜜臀| 国产精品欧美久久久久无广告| 亚洲在线视频一区| 国产做a爰片久久毛片| 97超碰欧美中文字幕| 欧美精品久久久久久久多人混战 | 91亚洲精品乱码久久久久久蜜桃 | 精品久久久久av影院| ...中文天堂在线一区| 亚洲va国产天堂va久久en| 国产精品一区二区在线观看网站 | 成人av网站在线| 制服丝袜亚洲精品中文字幕| 国产精品福利影院| 亚洲成人久久影院| 成人动漫一区二区| 日韩午夜精品电影| 亚洲精品成人a在线观看| 国产在线视频一区二区三区| 欧美视频一区二区在线观看| 久久久精品国产免大香伊| 午夜日韩在线观看| av一区二区三区四区| 日韩午夜激情电影| 亚洲欧美日韩在线不卡| 久久成人av少妇免费| 欧美日本国产一区| 成人欧美一区二区三区视频网页| 久久精品999| 777a∨成人精品桃花网| 亚洲人成精品久久久久久| 国产麻豆视频一区| 欧美高清激情brazzers| 亚洲一区二区高清| 99国产精品久久久久久久久久久| 欧美大片一区二区三区| 亚洲18色成人| 在线中文字幕不卡| 中文字幕在线不卡视频| 国产盗摄一区二区三区| 日韩一卡二卡三卡四卡| 日韩精品一级中文字幕精品视频免费观看 | 精品亚洲免费视频| 欧美日韩免费在线视频| 伊人婷婷欧美激情| 色伊人久久综合中文字幕| 亚洲国产精品精华液2区45| 精品在线观看视频| 欧美一区二区观看视频| 五月综合激情网| 欧美日韩国产不卡| 亚洲综合免费观看高清完整版| 97久久精品人人澡人人爽| 国产精品高清亚洲| 岛国精品在线播放| 中文字幕一区二区三区蜜月| 99精品一区二区| 亚洲精品国产一区二区精华液| 99re热视频精品| 一区二区三区精品久久久| 欧洲精品一区二区三区在线观看| 一二三区精品视频| 欧美三片在线视频观看| 亚洲va韩国va欧美va精品| 91精品一区二区三区久久久久久| 日本vs亚洲vs韩国一区三区| 欧美一级高清片在线观看| 国产综合久久久久影院| 国产视频一区不卡| 国产人成一区二区三区影院| 国产精品一区二区在线观看不卡| 国产情人综合久久777777| 99久久伊人精品| 一区二区三区日韩在线观看| 欧美日韩黄色影视| 狠狠色丁香婷婷综合| 中文字幕欧美激情| 色噜噜狠狠成人中文综合| 亚洲成人av一区| 久久女同性恋中文字幕| 不卡视频免费播放| 亚洲444eee在线观看| 欧美大片在线观看一区| jlzzjlzz亚洲日本少妇| 一区二区高清免费观看影视大全| 911精品产国品一二三产区| 美女视频黄 久久| 中文字幕一区视频| 69av一区二区三区| 国产乱码精品1区2区3区| 一区二区三区日韩欧美| 日韩免费性生活视频播放|