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

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

?? input-programming.txt

?? 嵌入式系統(tǒng)設(shè)計與實例開發(fā)實驗教材二源碼 多線程應(yīng)用程序設(shè)計 串行端口程序設(shè)計 AD接口實驗 CAN總線通信實驗 GPS通信實驗 Linux內(nèi)核移植與編譯實驗 IC卡讀寫實驗 SD驅(qū)動使
?? 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一区二区三区免费野_久草精品视频
精品亚洲国内自在自线福利| 欧美剧情电影在线观看完整版免费励志电影 | 麻豆一区二区三区| 成人免费视频一区| 欧美一级片在线看| 亚洲人123区| 高清不卡一二三区| 91.成人天堂一区| 亚洲人成伊人成综合网小说| 国产一区二区三区四区五区入口| 欧美中文字幕一区| 国产精品视频看| 麻豆视频观看网址久久| 色婷婷精品久久二区二区蜜臀av| 精品免费国产二区三区| 性欧美大战久久久久久久久| 国产成人福利片| 精品国产百合女同互慰| 日本免费在线视频不卡一不卡二| 99久久er热在这里只有精品15| 欧美成人高清电影在线| 亚洲成人激情社区| 色综合久久久久综合99| 亚洲欧洲美洲综合色网| 国产白丝精品91爽爽久久| www激情久久| 久久国产精品72免费观看| 欧美二区三区91| 午夜精品久久一牛影视| 欧美色综合天天久久综合精品| 1024成人网色www| 91在线观看视频| 亚洲欧美国产三级| 99久久国产免费看| 亚洲免费观看在线观看| 99re热这里只有精品视频| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 56国语精品自产拍在线观看| 一区二区国产盗摄色噜噜| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 91精品欧美久久久久久动漫 | 国产精品女主播av| 成人黄色综合网站| 国产精品欧美久久久久无广告 | 欧美精品一区二| 精品亚洲免费视频| 久久久久久久久久看片| 国产mv日韩mv欧美| 国产精品网站在线观看| av中文字幕一区| 亚洲一区二区免费视频| 欧美三级乱人伦电影| 日韩二区在线观看| 欧美xxxxx裸体时装秀| 激情小说欧美图片| 国产色产综合产在线视频| 丁香婷婷综合色啪| 亚洲精品国产视频| 精品污污网站免费看| 日本一区中文字幕 | 国产精品电影院| 在线观看日韩毛片| 久久精品国产精品亚洲综合| 久久蜜臀精品av| 99视频在线观看一区三区| 亚洲一线二线三线视频| 91精品国产欧美一区二区18| 国产在线国偷精品免费看| 国产精品美女一区二区三区| 欧美色中文字幕| 激情偷乱视频一区二区三区| 国产精品剧情在线亚洲| 欧美日韩久久久久久| 国产不卡免费视频| 性感美女极品91精品| 亚洲国产精品成人综合色在线婷婷| 色综合视频在线观看| 日本福利一区二区| 裸体歌舞表演一区二区| 亚洲欧美另类小说视频| 欧美精品一区二区在线观看| 欧美专区日韩专区| 成人激情免费网站| 久久99久久精品| 亚洲午夜激情网页| 国产欧美一区二区精品仙草咪| 欧美日韩一区二区三区四区| 成人性生交大片免费看在线播放| 日韩精品久久久久久| 一区二区在线看| 国产精品色眯眯| 日韩一级视频免费观看在线| 欧洲精品一区二区三区在线观看| 国产一区二区三区黄视频| 香港成人在线视频| 亚洲天堂网中文字| 国产欧美一区在线| 精品国产凹凸成av人网站| 欧美顶级少妇做爰| 欧美日韩国产中文| 91啪九色porn原创视频在线观看| 国产一区三区三区| 蜜桃免费网站一区二区三区| 亚洲一区二区高清| 亚洲精品久久嫩草网站秘色| 日本一区二区三区高清不卡| 精品欧美久久久| 日韩视频免费直播| 91精品国产福利在线观看 | 欧美一区二区三区免费观看视频| 91网站在线播放| www.爱久久.com| 成人黄色777网| av中文字幕一区| 不卡高清视频专区| 成人18视频在线播放| 国产.欧美.日韩| 成人av在线影院| 91在线精品一区二区| 99久久婷婷国产综合精品电影| 国产91清纯白嫩初高中在线观看| 国产在线精品一区二区夜色| 激情偷乱视频一区二区三区| 国产一区二区伦理片| 国产夫妻精品视频| 成人av在线资源| 在线视频中文字幕一区二区| 色菇凉天天综合网| 欧美天堂一区二区三区| 欧美日韩免费不卡视频一区二区三区| 欧美三级一区二区| 欧美一区二区福利视频| 精品国产人成亚洲区| 欧美国产丝袜视频| 亚洲精品视频在线观看网站| 亚洲国产日韩一级| 美女视频黄免费的久久| 国产精品一区二区在线播放| 波多野结衣精品在线| 欧美亚洲日本国产| 欧美精品一区二| 亚洲欧美偷拍三级| 视频一区中文字幕国产| 国产精品亚洲成人| 91丝袜美腿高跟国产极品老师| 欧美三区在线观看| 精品三级av在线| 中文字幕日本不卡| 日日摸夜夜添夜夜添精品视频 | 精品国产乱码久久久久久1区2区| 国产亚洲一二三区| 亚洲成人精品一区| 成人综合婷婷国产精品久久| 在线观看www91| 久久精品欧美一区二区三区麻豆| 亚洲色图19p| 极品销魂美女一区二区三区| 91丝袜高跟美女视频| 日韩精品一区二| 亚洲久草在线视频| 激情av综合网| 欧美日韩国产另类不卡| 国产精品久久久久久久久免费桃花 | 亚洲成a人v欧美综合天堂 | 91捆绑美女网站| 欧美mv日韩mv国产| 亚洲国产欧美一区二区三区丁香婷 | 91免费观看视频| 欧美变态口味重另类| 亚洲国产精品久久久男人的天堂 | 国产偷国产偷精品高清尤物| 一区二区三区精品在线| 国产精品456| 欧美一级日韩不卡播放免费| 亚洲综合色噜噜狠狠| 国产传媒久久文化传媒| 欧美成人一区二区| 五月激情综合婷婷| 色av成人天堂桃色av| 国产精品久久久久影院亚瑟 | 日韩极品在线观看| 91福利小视频| 国产精品美女久久久久久| 国产精品一区二区果冻传媒| 日韩一区二区三区免费观看| 一区二区成人在线视频| 成人av在线观| 中文成人av在线| 成人精品电影在线观看| 久久久久久影视| 国产一区二区三区黄视频 | 最新日韩av在线| 国产91丝袜在线播放0| 欧美精品一区二区高清在线观看| 日韩在线播放一区二区| 欧美日韩一级片在线观看| 亚洲一区二区成人在线观看| 欧美午夜电影一区| 亚洲va天堂va国产va久| 欧美视频日韩视频在线观看|