本文主要是介绍usb2-相关的input子系统及 写成input子系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
//设置支持的事件类型,如
input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL);//声明支持按键事件EV_KEY和相对坐标事件EV_REL
//也可用下面的形式
set_bit(EV_KEY,input_dev->evbit)
set_bit(EV_REL,input_dev->evbit)//设置号支持的类型后,再设置支持类型中的具体事项。
input_dev->keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_LEFT) |BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE);//设置支持的具体按键
input_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y) | BIT_MASK(REL_WHEEL);//设置支持的具体相对坐标
//也可用下面的形式
set_bit(BTN_LEFT,input_dev->keybit)
set_bit(BTN_RIGHT,input_dev->keybit)
set_bit(BTN_MIDDLE,input_dev->keybit)set_bit(REL_X,input_dev->relbit)
set_bit(REL_Y,input_dev->relbit)
set_bit(REL_WHEEL,input_dev->relbit)//在中断函数或其他需要的地方报告事件input_report_key(dev, BTN_LEFT, data[0] & 0x01);//data[0]是通过usb从单片机里取得的数据。input_report_key(dev, BTN_RIGHT, data[0] & 0x02);input_report_key(dev, BTN_MIDDLE, data[0] & 0x04);input_report_rel(dev, REL_X, data[1]);//data[1]中是x坐标值,相对坐标input_report_rel(dev, REL_Y, data[2]);//data[2]中是y坐标值input_report_rel(dev, REL_WHEEL, data[3]);//data[3]中是滚轮位置值
//函数原型
static inline void input_report_key(struct input_dev *dev, unsigned int code, int value)
{input_event(dev, EV_KEY, code, !!value);
}
static inline void input_report_rel(struct input_dev *dev, unsigned int code, int value)
{input_event(dev, EV_REL, code, value);
}void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
{unsigned long flags;if (is_event_supported(type, dev->evbit, EV_MAX)) {spin_lock_irqsave(&dev->event_lock, flags);add_input_randomness(type, code, value);input_handle_event(dev, type, code, value);spin_unlock_irqrestore(&dev->event_lock, flags);}
}
/*
void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
type:事件类型,见下面
code:每个type有不同的code,代表该类型中不同的事项,见下面
value:
对于按键事件,取值为1或0,1按下,0释放
对于坐标事件,取值为坐标值*/
linux/include/linux/input.h①type取值有
/** Event types*/#define EV_SYN 0x00
#define EV_KEY 0x01
#define EV_REL 0x02
#define EV_ABS 0x03
#define EV_MSC 0x04
#define EV_SW 0x05
#define EV_LED 0x11
#define EV_SND 0x12
#define EV_REP 0x14
#define EV_FF 0x15
#define EV_PWR 0x16
#define EV_FF_STATUS 0x17
#define EV_MAX 0x1f
#define EV_CNT (EV_MAX+1)
②code取值以下是内核预定义的事件类型EV_KEY所包含的具体按键(鼠标和键盘上的按键)
常用的用/**common**/标记
/** Keys and buttons** Most of the keys/buttons are modeled after USB HUT 1.12* (see http://www.usb.org/developers/hidpage).* Abbreviations in the comments:* AC - Application Control* AL - Application Launch Button* SC - System Control*///EV_KEY
#define KEY_RESERVED 0
#define KEY_ESC 1
#define KEY_1 2/**common**/
#define KEY_2 3/**common**/
#define KEY_3 4/**common**/
#define KEY_4 5/**common**/
#define KEY_5 6/**common**/
#define KEY_6 7/**common**/
#define KEY_7 8/**common**/
#define KEY_8 9/**common**/
#define KEY_9 10/**common**/
#define KEY_0 11/**common**/
#define KEY_MINUS 12
#define KEY_EQUAL 13
#define KEY_BACKSPACE 14
#define KEY_TAB 15
#define KEY_Q 16/**common**/
#define KEY_W 17/**common**/
#define KEY_E 18/**common**/
#define KEY_R 19/**common**/
#define KEY_T 20/**common**/
#define KEY_Y 21/**common**/
#define KEY_U 22/**common**/
#define KEY_I 23/**common**/
#define KEY_O 24/**common**/
#define KEY_P 25/**common**/
#define KEY_LEFTBRACE 26
#define KEY_RIGHTBRACE 27
#define KEY_ENTER 28
#define KEY_LEFTCTRL 29
#define KEY_A 30/**common**/
#define KEY_S 31/**common**/
#define KEY_D 32/**common**/
#define KEY_F 33/**common**/
#define KEY_G 34/**common**/
#define KEY_H 35/**common**/
#define KEY_J 36/**common**/
#define KEY_K 37/**common**/
#define KEY_L 38/**common**/
#define KEY_SEMICOLON 39
#define KEY_APOSTROPHE 40
#define KEY_GRAVE 41
#define KEY_LEFTSHIFT 42
#define KEY_BACKSLASH 43
#define KEY_Z 44/**common**/
#define KEY_X 45/**common**/
#define KEY_C 46/**common**/
#define KEY_V 47/**common**/
#define KEY_B 48/**common**/
#define KEY_N 49/**common**/
#define KEY_M 50/**common**/
#define KEY_COMMA 51
#define KEY_DOT 52
#define KEY_SLASH 53
#define KEY_RIGHTSHIFT 54
#define KEY_KPASTERISK 55
#define KEY_LEFTALT 56
#define KEY_SPACE 57
#define KEY_CAPSLOCK 58
#define KEY_F1 59
#define KEY_F2 60
#define KEY_F3 61
#define KEY_F4 62
#define KEY_F5 63
#define KEY_F6 64
#define KEY_F7 65
#define KEY_F8 66
#define KEY_F9 67
#define KEY_F10 68
#define KEY_NUMLOCK 69
#define KEY_SCROLLLOCK 70
#define KEY_KP7 71
#define KEY_KP8 72
#define KEY_KP9 73
#define KEY_KPMINUS 74
#define KEY_KP4 75
#define KEY_KP5 76
#define KEY_KP6 77
#define KEY_KPPLUS 78
#define KEY_KP1 79
#define KEY_KP2 80
#define KEY_KP3 81
#define KEY_KP0 82
#define KEY_KPDOT 83#define KEY_ZENKAKUHANKAKU 85
#define KEY_102ND 86
#define KEY_F11 87
#define KEY_F12 88
#define KEY_RO 89
#define KEY_KATAKANA 90
#define KEY_HIRAGANA 91
#define KEY_HENKAN 92
#define KEY_KATAKANAHIRAGANA 93
#define KEY_MUHENKAN 94
#define KEY_KPJPCOMMA 95
#define KEY_KPENTER 96
#define KEY_RIGHTCTRL 97
#define KEY_KPSLASH 98
#define KEY_SYSRQ 99
#define KEY_RIGHTALT 100
#define KEY_LINEFEED 101
#define KEY_HOME 102
#define KEY_UP 103
#define KEY_PAGEUP 104
#define KEY_LEFT 105
#define KEY_RIGHT 106
#define KEY_END 107
#define KEY_DOWN 108
#define KEY_PAGEDOWN 109
#define KEY_INSERT 110
#define KEY_DELETE 111
#define KEY_MACRO 112
#define KEY_MUTE 113
#define KEY_VOLUMEDOWN 114
#define KEY_VOLUMEUP 115
#define KEY_POWER 116 /* SC System Power Down */
#define KEY_KPEQUAL 117
#define KEY_KPPLUSMINUS 118
#define KEY_PAUSE 119
#define KEY_SCALE 120 /* AL Compiz Scale (Expose) */#define KEY_KPCOMMA 121
#define KEY_HANGEUL 122
#define KEY_HANGUEL KEY_HANGEUL
#define KEY_HANJA 123
#define KEY_YEN 124
#define KEY_LEFTMETA 125
#define KEY_RIGHTMETA 126
#define KEY_COMPOSE 127#define KEY_STOP 128 /* AC Stop */
#define KEY_AGAIN 129
#define KEY_PROPS 130 /* AC Properties */
#define KEY_UNDO 131 /* AC Undo */
#define KEY_FRONT 132
#define KEY_COPY 133 /* AC Copy */
#define KEY_OPEN 134 /* AC Open */
#define KEY_PASTE 135 /* AC Paste */
#define KEY_FIND 136 /* AC Search */
#define KEY_CUT 137 /* AC Cut */
#define KEY_HELP 138 /* AL Integrated Help Center */
#define KEY_MENU 139 /* Menu (show menu) */
#define KEY_CALC 140 /* AL Calculator */
#define KEY_SETUP 141
#define KEY_SLEEP 142 /* SC System Sleep */
#define KEY_WAKEUP 143 /* System Wake Up */
#define KEY_FILE 144 /* AL Local Machine Browser */
#define KEY_SENDFILE 145
#define KEY_DELETEFILE 146
#define KEY_XFER 147
#define KEY_PROG1 148
#define KEY_PROG2 149
#define KEY_WWW 150 /* AL Internet Browser */
#define KEY_MSDOS 151
#define KEY_COFFEE 152 /* AL Terminal Lock/Screensaver */
#define KEY_SCREENLOCK KEY_COFFEE
#define KEY_DIRECTION 153
#define KEY_CYCLEWINDOWS 154
#define KEY_MAIL 155
#define KEY_BOOKMARKS 156 /* AC Bookmarks */
#define KEY_COMPUTER 157
#define KEY_BACK 158 /* AC Back */
#define KEY_FORWARD 159 /* AC Forward */
#define KEY_CLOSECD 160
#define KEY_EJECTCD 161
#define KEY_EJECTCLOSECD 162
#define KEY_NEXTSONG 163
#define KEY_PLAYPAUSE 164
#define KEY_PREVIOUSSONG 165
#define KEY_STOPCD 166
#define KEY_RECORD 167
#define KEY_REWIND 168
#define KEY_PHONE 169 /* Media Select Telephone */
#define KEY_ISO 170
#define KEY_CONFIG 171 /* AL Consumer Control Configuration */
#define KEY_HOMEPAGE 172 /* AC Home */
#define KEY_REFRESH 173 /* AC Refresh */
#define KEY_EXIT 174 /* AC Exit */
#define KEY_MOVE 175
#define KEY_EDIT 176
#define KEY_SCROLLUP 177
#define KEY_SCROLLDOWN 178
#define KEY_KPLEFTPAREN 179
#define KEY_KPRIGHTPAREN 180
#define KEY_NEW 181 /* AC New */
#define KEY_REDO 182 /* AC Redo/Repeat */#define KEY_F13 183
#define KEY_F14 184
#define KEY_F15 185
#define KEY_F16 186
#define KEY_F17 187
#define KEY_F18 188
#define KEY_F19 189
#define KEY_F20 190
#define KEY_F21 191
#define KEY_F22 192
#define KEY_F23 193
#define KEY_F24 194#define KEY_PLAYCD 200
#define KEY_PAUSECD 201
#define KEY_PROG3 202
#define KEY_PROG4 203
#define KEY_DASHBOARD 204 /* AL Dashboard */
#define KEY_SUSPEND 205
#define KEY_CLOSE 206 /* AC Close */
#define KEY_PLAY 207
#define KEY_FASTFORWARD 208
#define KEY_BASSBOOST 209
#define KEY_PRINT 210 /* AC Print */
#define KEY_HP 211
#define KEY_CAMERA 212
#define KEY_SOUND 213
#define KEY_QUESTION 214
#define KEY_EMAIL 215
#define KEY_CHAT 216
#define KEY_SEARCH 217
#define KEY_CONNECT 218
#define KEY_FINANCE 219 /* AL Checkbook/Finance */
#define KEY_SPORT 220
#define KEY_SHOP 221
#define KEY_ALTERASE 222
#define KEY_CANCEL 223 /* AC Cancel */
#define KEY_BRIGHTNESSDOWN 224
#define KEY_BRIGHTNESSUP 225
#define KEY_MEDIA 226#define KEY_SWITCHVIDEOMODE 227 /* Cycle between available videooutputs (Monitor/LCD/TV-out/etc) */
#define KEY_KBDILLUMTOGGLE 228
#define KEY_KBDILLUMDOWN 229
#define KEY_KBDILLUMUP 230#define KEY_SEND 231 /* AC Send */
#define KEY_REPLY 232 /* AC Reply */
#define KEY_FORWARDMAIL 233 /* AC Forward Msg */
#define KEY_SAVE 234 /* AC Save */
#define KEY_DOCUMENTS 235#define KEY_BATTERY 236#define KEY_BLUETOOTH 237
#define KEY_WLAN 238
#define KEY_UWB 239#define KEY_UNKNOWN 240#define KEY_VIDEO_NEXT 241 /* drive next video source */
#define KEY_VIDEO_PREV 242 /* drive previous video source */
#define KEY_BRIGHTNESS_CYCLE 243 /* brightness up, after max is min */
#define KEY_BRIGHTNESS_ZERO 244 /* brightness off, use ambient */
#define KEY_DISPLAY_OFF 245 /* display device to off state */#define KEY_WIMAX 246/* Range 248 - 255 is reserved for special needs of AT keyboard driver */#define BTN_MISC 0x100
#define BTN_0 0x100
#define BTN_1 0x101
#define BTN_2 0x102
#define BTN_3 0x103
#define BTN_4 0x104
#define BTN_5 0x105
#define BTN_6 0x106
#define BTN_7 0x107
#define BTN_8 0x108
#define BTN_9 0x109#define BTN_MOUSE 0x110
#define BTN_LEFT 0x110/**common**/
#define BTN_RIGHT 0x111/**common**/
#define BTN_MIDDLE 0x112/**common**/
#define BTN_SIDE 0x113
#define BTN_EXTRA 0x114
#define BTN_FORWARD 0x115
#define BTN_BACK 0x116
#define BTN_TASK 0x117#define BTN_JOYSTICK 0x120
#define BTN_TRIGGER 0x120
#define BTN_THUMB 0x121
#define BTN_THUMB2 0x122
#define BTN_TOP 0x123
#define BTN_TOP2 0x124
#define BTN_PINKIE 0x125
#define BTN_BASE 0x126
#define BTN_BASE2 0x127
#define BTN_BASE3 0x128
#define BTN_BASE4 0x129
#define BTN_BASE5 0x12a
#define BTN_BASE6 0x12b
#define BTN_DEAD 0x12f#define BTN_GAMEPAD 0x130
#define BTN_A 0x130
#define BTN_B 0x131
#define BTN_C 0x132
#define BTN_X 0x133
#define BTN_Y 0x134
#define BTN_Z 0x135
#define BTN_TL 0x136
#define BTN_TR 0x137
#define BTN_TL2 0x138
#define BTN_TR2 0x139
#define BTN_SELECT 0x13a
#define BTN_START 0x13b
#define BTN_MODE 0x13c
#define BTN_THUMBL 0x13d
#define BTN_THUMBR 0x13e#define BTN_DIGI 0x140
#define BTN_TOOL_PEN 0x140
#define BTN_TOOL_RUBBER 0x141
#define BTN_TOOL_BRUSH 0x142
#define BTN_TOOL_PENCIL 0x143
#define BTN_TOOL_AIRBRUSH 0x144
#define BTN_TOOL_FINGER 0x145
#define BTN_TOOL_MOUSE 0x146
#define BTN_TOOL_LENS 0x147
#define BTN_TOUCH 0x14a
#define BTN_STYLUS 0x14b
#define BTN_STYLUS2 0x14c
#define BTN_TOOL_DOUBLETAP 0x14d
#define BTN_TOOL_TRIPLETAP 0x14e
#define BTN_TOOL_QUADTAP 0x14f /* Four fingers on trackpad */#define BTN_WHEEL 0x150
#define BTN_GEAR_DOWN 0x150
#define BTN_GEAR_UP 0x151#define KEY_OK 0x160
#define KEY_SELECT 0x161
#define KEY_GOTO 0x162
#define KEY_CLEAR 0x163
#define KEY_POWER2 0x164
#define KEY_OPTION 0x165
#define KEY_INFO 0x166 /* AL OEM Features/Tips/Tutorial */
#define KEY_TIME 0x167
#define KEY_VENDOR 0x168
#define KEY_ARCHIVE 0x169
#define KEY_PROGRAM 0x16a /* Media Select Program Guide */
#define KEY_CHANNEL 0x16b
#define KEY_FAVORITES 0x16c
#define KEY_EPG 0x16d
#define KEY_PVR 0x16e /* Media Select Home */
#define KEY_MHP 0x16f
#define KEY_LANGUAGE 0x170
#define KEY_TITLE 0x171
#define KEY_SUBTITLE 0x172
#define KEY_ANGLE 0x173
#define KEY_ZOOM 0x174
#define KEY_MODE 0x175
#define KEY_KEYBOARD 0x176
#define KEY_SCREEN 0x177
#define KEY_PC 0x178 /* Media Select Computer */
#define KEY_TV 0x179 /* Media Select TV */
#define KEY_TV2 0x17a /* Media Select Cable */
#define KEY_VCR 0x17b /* Media Select VCR */
#define KEY_VCR2 0x17c /* VCR Plus */
#define KEY_SAT 0x17d /* Media Select Satellite */
#define KEY_SAT2 0x17e
#define KEY_CD 0x17f /* Media Select CD */
#define KEY_TAPE 0x180 /* Media Select Tape */
#define KEY_RADIO 0x181
#define KEY_TUNER 0x182 /* Media Select Tuner */
#define KEY_PLAYER 0x183
#define KEY_TEXT 0x184
#define KEY_DVD 0x185 /* Media Select DVD */
#define KEY_AUX 0x186
#define KEY_MP3 0x187
#define KEY_AUDIO 0x188
#define KEY_VIDEO 0x189
#define KEY_DIRECTORY 0x18a
#define KEY_LIST 0x18b
#define KEY_MEMO 0x18c /* Media Select Messages */
#define KEY_CALENDAR 0x18d
#define KEY_RED 0x18e
#define KEY_GREEN 0x18f
#define KEY_YELLOW 0x190
#define KEY_BLUE 0x191
#define KEY_CHANNELUP 0x192 /* Channel Increment */
#define KEY_CHANNELDOWN 0x193 /* Channel Decrement */
#define KEY_FIRST 0x194
#define KEY_LAST 0x195 /* Recall Last */
#define KEY_AB 0x196
#define KEY_NEXT 0x197
#define KEY_RESTART 0x198
#define KEY_SLOW 0x199
#define KEY_SHUFFLE 0x19a
#define KEY_BREAK 0x19b
#define KEY_PREVIOUS 0x19c
#define KEY_DIGITS 0x19d
#define KEY_TEEN 0x19e
#define KEY_TWEN 0x19f
#define KEY_VIDEOPHONE 0x1a0 /* Media Select Video Phone */
#define KEY_GAMES 0x1a1 /* Media Select Games */
#define KEY_ZOOMIN 0x1a2 /* AC Zoom In */
#define KEY_ZOOMOUT 0x1a3 /* AC Zoom Out */
#define KEY_ZOOMRESET 0x1a4 /* AC Zoom */
#define KEY_WORDPROCESSOR 0x1a5 /* AL Word Processor */
#define KEY_EDITOR 0x1a6 /* AL Text Editor */
#define KEY_SPREADSHEET 0x1a7 /* AL Spreadsheet */
#define KEY_GRAPHICSEDITOR 0x1a8 /* AL Graphics Editor */
#define KEY_PRESENTATION 0x1a9 /* AL Presentation App */
#define KEY_DATABASE 0x1aa /* AL Database App */
#define KEY_NEWS 0x1ab /* AL Newsreader */
#define KEY_VOICEMAIL 0x1ac /* AL Voicemail */
#define KEY_ADDRESSBOOK 0x1ad /* AL Contacts/Address Book */
#define KEY_MESSENGER 0x1ae /* AL Instant Messaging */
#define KEY_DISPLAYTOGGLE 0x1af /* Turn display (LCD) on and off */
#define KEY_SPELLCHECK 0x1b0 /* AL Spell Check */
#define KEY_LOGOFF 0x1b1 /* AL Logoff */#define KEY_DOLLAR 0x1b2
#define KEY_EURO 0x1b3#define KEY_FRAMEBACK 0x1b4 /* Consumer - transport controls */
#define KEY_FRAMEFORWARD 0x1b5
#define KEY_CONTEXT_MENU 0x1b6 /* GenDesc - system context menu */
#define KEY_MEDIA_REPEAT 0x1b7 /* Consumer - transport control */#define KEY_DEL_EOL 0x1c0
#define KEY_DEL_EOS 0x1c1
#define KEY_INS_LINE 0x1c2
#define KEY_DEL_LINE 0x1c3#define KEY_FN 0x1d0
#define KEY_FN_ESC 0x1d1
#define KEY_FN_F1 0x1d2
#define KEY_FN_F2 0x1d3
#define KEY_FN_F3 0x1d4
#define KEY_FN_F4 0x1d5
#define KEY_FN_F5 0x1d6
#define KEY_FN_F6 0x1d7
#define KEY_FN_F7 0x1d8
#define KEY_FN_F8 0x1d9
#define KEY_FN_F9 0x1da
#define KEY_FN_F10 0x1db
#define KEY_FN_F11 0x1dc
#define KEY_FN_F12 0x1dd
#define KEY_FN_1 0x1de
#define KEY_FN_2 0x1df
#define KEY_FN_D 0x1e0
#define KEY_FN_E 0x1e1
#define KEY_FN_F 0x1e2
#define KEY_FN_S 0x1e3
#define KEY_FN_B 0x1e4#define KEY_BRL_DOT1 0x1f1
#define KEY_BRL_DOT2 0x1f2
#define KEY_BRL_DOT3 0x1f3
#define KEY_BRL_DOT4 0x1f4
#define KEY_BRL_DOT5 0x1f5
#define KEY_BRL_DOT6 0x1f6
#define KEY_BRL_DOT7 0x1f7
#define KEY_BRL_DOT8 0x1f8
#define KEY_BRL_DOT9 0x1f9
#define KEY_BRL_DOT10 0x1fa#define KEY_NUMERIC_0 0x200 /* used by phones, remote controls, */
#define KEY_NUMERIC_1 0x201 /* and other keypads */
#define KEY_NUMERIC_2 0x202
#define KEY_NUMERIC_3 0x203
#define KEY_NUMERIC_4 0x204
#define KEY_NUMERIC_5 0x205
#define KEY_NUMERIC_6 0x206
#define KEY_NUMERIC_7 0x207
#define KEY_NUMERIC_8 0x208
#define KEY_NUMERIC_9 0x209
#define KEY_NUMERIC_STAR 0x20a
#define KEY_NUMERIC_POUND 0x20b
以下是内核预定义的事件类型EV_REL的具体坐标
/** Relative axes*/#define REL_X 0x00/**common**/
#define REL_Y 0x01/**common**/
#define REL_Z 0x02
#define REL_RX 0x03
#define REL_RY 0x04
#define REL_RZ 0x05
#define REL_HWHEEL 0x06
#define REL_DIAL 0x07
#define REL_WHEEL 0x08/**common**/
#define REL_MISC 0x09
#define REL_MAX 0x0f
#define REL_CNT (REL_MAX+1)
以下是内核预定义的其他事件类型的的具体事项
/** Absolute axes*/#define ABS_X 0x00
#define ABS_Y 0x01
#define ABS_Z 0x02
#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
#define ABS_BRAKE 0x0a
#define ABS_HAT0X 0x10
#define ABS_HAT0Y 0x11
#define ABS_HAT1X 0x12
#define ABS_HAT1Y 0x13
#define ABS_HAT2X 0x14
#define ABS_HAT2Y 0x15
#define ABS_HAT3X 0x16
#define ABS_HAT3Y 0x17
#define ABS_PRESSURE 0x18
#define ABS_DISTANCE 0x19
#define ABS_TILT_X 0x1a
#define ABS_TILT_Y 0x1b
#define ABS_TOOL_WIDTH 0x1c
#define ABS_VOLUME 0x20
#define ABS_MISC 0x28#define ABS_MT_TOUCH_MAJOR 0x30 /* Major axis of touching ellipse */
#define ABS_MT_TOUCH_MINOR 0x31 /* Minor axis (omit if circular) */
#define ABS_MT_WIDTH_MAJOR 0x32 /* Major axis of approaching ellipse */
#define ABS_MT_WIDTH_MINOR 0x33 /* Minor axis (omit if circular) */
#define ABS_MT_ORIENTATION 0x34 /* Ellipse orientation */
#define ABS_MT_POSITION_X 0x35 /* Center X ellipse position */
#define ABS_MT_POSITION_Y 0x36 /* Center Y ellipse position */
#define ABS_MT_TOOL_TYPE 0x37 /* Type of touching device */
#define ABS_MT_BLOB_ID 0x38 /* Group a set of packets as a blob */
#define ABS_MT_TRACKING_ID 0x39 /* Unique ID of initiated contact */#define ABS_MAX 0x3f
#define ABS_CNT (ABS_MAX+1)/** Switch events*/#define SW_LID 0x00 /* set = lid shut */
#define SW_TABLET_MODE 0x01 /* set = tablet mode */
#define SW_HEADPHONE_INSERT 0x02 /* set = inserted */
#define SW_RFKILL_ALL 0x03 /* rfkill master switch, type "any"set = radio enabled */
#define SW_RADIO SW_RFKILL_ALL /* deprecated */
#define SW_MICROPHONE_INSERT 0x04 /* set = inserted */
#define SW_DOCK 0x05 /* set = plugged into dock */
#define SW_LINEOUT_INSERT 0x06 /* set = inserted */
#define SW_JACK_PHYSICAL_INSERT 0x07 /* set = mechanical switch set */
#define SW_VIDEOOUT_INSERT 0x08 /* set = inserted */
#define SW_MAX 0x0f
#define SW_CNT (SW_MAX+1)/** Misc events*/#define MSC_SERIAL 0x00
#define MSC_PULSELED 0x01
#define MSC_GESTURE 0x02
#define MSC_RAW 0x03
#define MSC_SCAN 0x04
#define MSC_MAX 0x07
#define MSC_CNT (MSC_MAX+1)/** LEDs*/#define LED_NUML 0x00
#define LED_CAPSL 0x01
#define LED_SCROLLL 0x02
#define LED_COMPOSE 0x03
#define LED_KANA 0x04
#define LED_SLEEP 0x05
#define LED_SUSPEND 0x06
#define LED_MUTE 0x07
#define LED_MISC 0x08
#define LED_MAIL 0x09
#define LED_CHARGING 0x0a
#define LED_MAX 0x0f
#define LED_CNT (LED_MAX+1)/** Autorepeat values*/#define REP_DELAY 0x00
#define REP_PERIOD 0x01
#define REP_MAX 0x01/** Sounds*/#define SND_CLICK 0x00
#define SND_BELL 0x01
#define SND_TONE 0x02
#define SND_MAX 0x07
#define SND_CNT (SND_MAX+1)
***************************************************************************************************************************************************************************************
下面是一个input模型驱动的例子代码,linux2.6.32.2 ,insmod之后会在/dev/input下出现event1(event0是触摸屏)设备文件. 如果在板子上打开一个便签或终端之类的可以输入的程序,则每隔1秒会自动输入一个数字,各是1 2 3 4 5 6 7 8,
可见只要是input子系统写的驱动,自动会跟上层应用程序对接了。大概原理是上层应用会定时读取/dev/input/eventx文件(所有的event文件)看一下是否有鼠标按下信息,键盘按键信息,屏幕触摸信息等。有读到的话,就显示出来。当然读取event文件是要按照input文件的各是来读的,后面附有一个测试读的例子。
//input_test.c
#include <linux/module.h>
#include <linux/init.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <linux/fs.h>
#include <linux/timer.h>
#include <linux/input.h>
#include <linux/delay.h>
/*! Input device structure. */static struct input_dev *test_dev = NULL;static struct timer_list report_timer;static unsigned short t_interval = HZ;//delay 1 s#define KEYCODES 8
static u16 test_keycodes[KEYCODES] = {KEY_1,KEY_2,KEY_3, KEY_4,KEY_5,KEY_6,KEY_7, KEY_8};
//timer的中断服务程序
static void handle_timer(unsigned long data)
{static int i=0;input_event(test_dev, EV_KEY, test_keycodes[i/2], ((i%2)==0)?1:0);if(++i >=2*KEYCODES) i=0;report_timer.expires = jiffies + t_interval;add_timer(&report_timer);
}
static int test_open(struct input_dev *dev)
{return 0;
}static void test_close(struct input_dev *dev)
{;
}static int init_inputdev()
{int i;//申请input_dev设备test_dev = input_allocate_device();if (!test_dev) {printk(KERN_ERR"test_dev: not enough memory for input device/n");return -ENOMEM;}//初始化input_dev结构体test_dev->keycode = &test_keycodes;test_dev->keycodesize = sizeof(unsigned char);test_dev->keycodemax = KEYCODES;test_dev->name = "input_song";test_dev->id.bustype = BUS_HOST;test_dev->open = test_open;test_dev->close = test_close;set_bit(EV_KEY, test_dev->evbit);//设定其支持的事件码for (i = 0; i < KEYCODES; i++)set_bit(test_keycodes[i], test_dev->keybit);//向系统注册input_dev设备 input_register_device(test_dev);/* Initialize the polling timer */init_timer(&report_timer);report_timer.expires = jiffies + t_interval;report_timer.function = handle_timer;add_timer(&report_timer);return 0;}
static int __init test_init(void)
{ if(init_inputdev()){printk(KERN_INFO "Cannot insmod ser_kpp/n");return 1;}else{printk(KERN_INFO "input drivers init/n");return 0;}
}
static void __exit test_cleanup(void)
{del_timer(&report_timer);input_unregister_device(test_dev);if (test_dev)input_free_device(test_dev);}module_init(test_init);
module_exit(test_cleanup);
MODULE_AUTHOR("song");
MODULE_DESCRIPTION("input test Driver");
MODULE_LICENSE("GPL");
makefile如下
ifneq ($(KERNELRELEASE),)
obj-m := input_test.o
else
KDIR := /opt/FriendlyARM/mini2440/linux-2.6.32.2
#KDIR := /lib/modules/`uname -r`/build
all: make -C $(KDIR) M=$(PWD) modules
clean: rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif
一个测试读event设备的例子。evtest.c
/** $Id: evtest.c,v 1.23 2005/02/06 13:51:42 vojtech Exp $** Copyright (c) 1999-2000 Vojtech Pavlik** Event device test program*//** This program is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Foundation; either version 2 of the License, or * (at your option) any later version.* * This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the* GNU General Public License for more details.* * You should have received a copy of the GNU General Public License* along with this program; if not, write to the Free Software* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA* * Should you need to contact me, the author, you can do so either by* e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:* Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic*/#include <stdint.h>#include <linux/input.h>#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>#ifndef EV_SYN
#define EV_SYN 0
#endifchar *events[EV_MAX + 1] = {[0 ... EV_MAX] = NULL,[EV_SYN] = "Sync", [EV_KEY] = "Key",[EV_REL] = "Relative", [EV_ABS] = "Absolute",[EV_MSC] = "Misc", [EV_LED] = "LED",[EV_SND] = "Sound", [EV_REP] = "Repeat",[EV_FF] = "ForceFeedback", [EV_PWR] = "Power",[EV_FF_STATUS] = "ForceFeedbackStatus",
};char *keys[KEY_MAX + 1] = {[0 ... KEY_MAX] = NULL,[KEY_RESERVED] = "Reserved", [KEY_ESC] = "Esc",[KEY_1] = "1", [KEY_2] = "2",[KEY_3] = "3", [KEY_4] = "4",[KEY_5] = "5", [KEY_6] = "6",[KEY_7] = "7", [KEY_8] = "8",[KEY_9] = "9", [KEY_0] = "0",[KEY_MINUS] = "Minus", [KEY_EQUAL] = "Equal",[KEY_BACKSPACE] = "Backspace", [KEY_TAB] = "Tab",[KEY_Q] = "Q", [KEY_W] = "W",[KEY_E] = "E", [KEY_R] = "R",[KEY_T] = "T", [KEY_Y] = "Y",[KEY_U] = "U", [KEY_I] = "I",[KEY_O] = "O", [KEY_P] = "P",[KEY_LEFTBRACE] = "LeftBrace", [KEY_RIGHTBRACE] = "RightBrace",[KEY_ENTER] = "Enter", [KEY_LEFTCTRL] = "LeftControl",[KEY_A] = "A", [KEY_S] = "S",[KEY_D] = "D", [KEY_F] = "F",[KEY_G] = "G", [KEY_H] = "H",[KEY_J] = "J", [KEY_K] = "K",[KEY_L] = "L", [KEY_SEMICOLON] = "Semicolon",[KEY_APOSTROPHE] = "Apostrophe", [KEY_GRAVE] = "Grave",[KEY_LEFTSHIFT] = "LeftShift", [KEY_BACKSLASH] = "BackSlash",[KEY_Z] = "Z", [KEY_X] = "X",[KEY_C] = "C", [KEY_V] = "V",[KEY_B] = "B", [KEY_N] = "N",[KEY_M] = "M", [KEY_COMMA] = "Comma",[KEY_DOT] = "Dot", [KEY_SLASH] = "Slash",[KEY_RIGHTSHIFT] = "RightShift", [KEY_KPASTERISK] = "KPAsterisk",[KEY_LEFTALT] = "LeftAlt", [KEY_SPACE] = "Space",[KEY_CAPSLOCK] = "CapsLock", [KEY_F1] = "F1",[KEY_F2] = "F2", [KEY_F3] = "F3",[KEY_F4] = "F4", [KEY_F5] = "F5",[KEY_F6] = "F6", [KEY_F7] = "F7",[KEY_F8] = "F8", [KEY_F9] = "F9",[KEY_F10] = "F10", [KEY_NUMLOCK] = "NumLock",[KEY_SCROLLLOCK] = "ScrollLock", [KEY_KP7] = "KP7",[KEY_KP8] = "KP8", [KEY_KP9] = "KP9",[KEY_KPMINUS] = "KPMinus", [KEY_KP4] = "KP4",[KEY_KP5] = "KP5", [KEY_KP6] = "KP6",[KEY_KPPLUS] = "KPPlus", [KEY_KP1] = "KP1",[KEY_KP2] = "KP2", [KEY_KP3] = "KP3",[KEY_KP0] = "KP0", [KEY_KPDOT] = "KPDot",[KEY_ZENKAKUHANKAKU] = "Zenkaku/Hankaku", [KEY_102ND] = "102nd",[KEY_F11] = "F11", [KEY_F12] = "F12",[KEY_RO] = "RO", [KEY_KATAKANA] = "Katakana",[KEY_HIRAGANA] = "HIRAGANA", [KEY_HENKAN] = "Henkan",[KEY_KATAKANAHIRAGANA] = "Katakana/Hiragana", [KEY_MUHENKAN] = "Muhenkan",[KEY_KPJPCOMMA] = "KPJpComma", [KEY_KPENTER] = "KPEnter",[KEY_RIGHTCTRL] = "RightCtrl", [KEY_KPSLASH] = "KPSlash",[KEY_SYSRQ] = "SysRq", [KEY_RIGHTALT] = "RightAlt",[KEY_LINEFEED] = "LineFeed", [KEY_HOME] = "Home",[KEY_UP] = "Up", [KEY_PAGEUP] = "PageUp",[KEY_LEFT] = "Left", [KEY_RIGHT] = "Right",[KEY_END] = "End", [KEY_DOWN] = "Down",[KEY_PAGEDOWN] = "PageDown", [KEY_INSERT] = "Insert",[KEY_DELETE] = "Delete", [KEY_MACRO] = "Macro",[KEY_MUTE] = "Mute", [KEY_VOLUMEDOWN] = "VolumeDown",[KEY_VOLUMEUP] = "VolumeUp", [KEY_POWER] = "Power",[KEY_KPEQUAL] = "KPEqual", [KEY_KPPLUSMINUS] = "KPPlusMinus",[KEY_PAUSE] = "Pause", [KEY_KPCOMMA] = "KPComma",[KEY_HANGUEL] = "Hanguel", [KEY_HANJA] = "Hanja",[KEY_YEN] = "Yen", [KEY_LEFTMETA] = "LeftMeta",[KEY_RIGHTMETA] = "RightMeta", [KEY_COMPOSE] = "Compose",[KEY_STOP] = "Stop", [KEY_AGAIN] = "Again",[KEY_PROPS] = "Props", [KEY_UNDO] = "Undo",[KEY_FRONT] = "Front", [KEY_COPY] = "Copy",[KEY_OPEN] = "Open", [KEY_PASTE] = "Paste",[KEY_FIND] = "Find", [KEY_CUT] = "Cut",[KEY_HELP] = "Help", [KEY_MENU] = "Menu",[KEY_CALC] = "Calc", [KEY_SETUP] = "Setup",[KEY_SLEEP] = "Sleep", [KEY_WAKEUP] = "WakeUp",[KEY_FILE] = "File", [KEY_SENDFILE] = "SendFile",[KEY_DELETEFILE] = "DeleteFile", [KEY_XFER] = "X-fer",[KEY_PROG1] = "Prog1", [KEY_PROG2] = "Prog2",[KEY_WWW] = "WWW", [KEY_MSDOS] = "MSDOS",[KEY_COFFEE] = "Coffee", [KEY_DIRECTION] = "Direction",[KEY_CYCLEWINDOWS] = "CycleWindows", [KEY_MAIL] = "Mail",[KEY_BOOKMARKS] = "Bookmarks", [KEY_COMPUTER] = "Computer",[KEY_BACK] = "Back", [KEY_FORWARD] = "Forward",[KEY_CLOSECD] = "CloseCD", [KEY_EJECTCD] = "EjectCD",[KEY_EJECTCLOSECD] = "EjectCloseCD", [KEY_NEXTSONG] = "NextSong",[KEY_PLAYPAUSE] = "PlayPause", [KEY_PREVIOUSSONG] = "PreviousSong",[KEY_STOPCD] = "StopCD", [KEY_RECORD] = "Record",[KEY_REWIND] = "Rewind", [KEY_PHONE] = "Phone",[KEY_ISO] = "ISOKey", [KEY_CONFIG] = "Config",[KEY_HOMEPAGE] = "HomePage", [KEY_REFRESH] = "Refresh",[KEY_EXIT] = "Exit", [KEY_MOVE] = "Move",[KEY_EDIT] = "Edit", [KEY_SCROLLUP] = "ScrollUp",[KEY_SCROLLDOWN] = "ScrollDown", [KEY_KPLEFTPAREN] = "KPLeftParenthesis",[KEY_KPRIGHTPAREN] = "KPRightParenthesis", [KEY_F13] = "F13",[KEY_F14] = "F14", [KEY_F15] = "F15",[KEY_F16] = "F16", [KEY_F17] = "F17",[KEY_F18] = "F18", [KEY_F19] = "F19",[KEY_F20] = "F20", [KEY_F21] = "F21",[KEY_F22] = "F22", [KEY_F23] = "F23",[KEY_F24] = "F24", [KEY_PLAYCD] = "PlayCD",[KEY_PAUSECD] = "PauseCD", [KEY_PROG3] = "Prog3",[KEY_PROG4] = "Prog4", [KEY_SUSPEND] = "Suspend",[KEY_CLOSE] = "Close", [KEY_PLAY] = "Play",[KEY_FASTFORWARD] = "Fast Forward", [KEY_BASSBOOST] = "Bass Boost",[KEY_PRINT] = "Print", [KEY_HP] = "HP",[KEY_CAMERA] = "Camera", [KEY_SOUND] = "Sound",[KEY_QUESTION] = "Question", [KEY_EMAIL] = "Email",[KEY_CHAT] = "Chat", [KEY_SEARCH] = "Search",[KEY_CONNECT] = "Connect", [KEY_FINANCE] = "Finance",[KEY_SPORT] = "Sport", [KEY_SHOP] = "Shop",[KEY_ALTERASE] = "Alternate Erase", [KEY_CANCEL] = "Cancel",[KEY_BRIGHTNESSDOWN] = "Brightness down", [KEY_BRIGHTNESSUP] = "Brightness up",[KEY_MEDIA] = "Media", [KEY_UNKNOWN] = "Unknown",[BTN_0] = "Btn0", [BTN_1] = "Btn1",[BTN_2] = "Btn2", [BTN_3] = "Btn3",[BTN_4] = "Btn4", [BTN_5] = "Btn5",[BTN_6] = "Btn6", [BTN_7] = "Btn7",[BTN_8] = "Btn8", [BTN_9] = "Btn9",[BTN_LEFT] = "LeftBtn", [BTN_RIGHT] = "RightBtn",[BTN_MIDDLE] = "MiddleBtn", [BTN_SIDE] = "SideBtn",[BTN_EXTRA] = "ExtraBtn", [BTN_FORWARD] = "ForwardBtn",[BTN_BACK] = "BackBtn", [BTN_TASK] = "TaskBtn",[BTN_TRIGGER] = "Trigger", [BTN_THUMB] = "ThumbBtn",[BTN_THUMB2] = "ThumbBtn2", [BTN_TOP] = "TopBtn",[BTN_TOP2] = "TopBtn2", [BTN_PINKIE] = "PinkieBtn",[BTN_BASE] = "BaseBtn", [BTN_BASE2] = "BaseBtn2",[BTN_BASE3] = "BaseBtn3", [BTN_BASE4] = "BaseBtn4",[BTN_BASE5] = "BaseBtn5", [BTN_BASE6] = "BaseBtn6",[BTN_DEAD] = "BtnDead", [BTN_A] = "BtnA",[BTN_B] = "BtnB", [BTN_C] = "BtnC",[BTN_X] = "BtnX", [BTN_Y] = "BtnY",[BTN_Z] = "BtnZ", [BTN_TL] = "BtnTL",[BTN_TR] = "BtnTR", [BTN_TL2] = "BtnTL2",[BTN_TR2] = "BtnTR2", [BTN_SELECT] = "BtnSelect",[BTN_START] = "BtnStart", [BTN_MODE] = "BtnMode",[BTN_THUMBL] = "BtnThumbL", [BTN_THUMBR] = "BtnThumbR",[BTN_TOOL_PEN] = "ToolPen", [BTN_TOOL_RUBBER] = "ToolRubber",[BTN_TOOL_BRUSH] = "ToolBrush", [BTN_TOOL_PENCIL] = "ToolPencil",[BTN_TOOL_AIRBRUSH] = "ToolAirbrush", [BTN_TOOL_FINGER] = "ToolFinger",[BTN_TOOL_MOUSE] = "ToolMouse", [BTN_TOOL_LENS] = "ToolLens",[BTN_TOUCH] = "Touch", [BTN_STYLUS] = "Stylus",[BTN_STYLUS2] = "Stylus2", [BTN_TOOL_DOUBLETAP] = "Tool Doubletap",[BTN_TOOL_TRIPLETAP] = "Tool Tripletap", [BTN_GEAR_DOWN] = "WheelBtn",[BTN_GEAR_UP] = "Gear up", [KEY_OK] = "Ok",[KEY_SELECT] = "Select", [KEY_GOTO] = "Goto",[KEY_CLEAR] = "Clear", [KEY_POWER2] = "Power2",[KEY_OPTION] = "Option", [KEY_INFO] = "Info",[KEY_TIME] = "Time", [KEY_VENDOR] = "Vendor",[KEY_ARCHIVE] = "Archive", [KEY_PROGRAM] = "Program",[KEY_CHANNEL] = "Channel", [KEY_FAVORITES] = "Favorites",[KEY_EPG] = "EPG", [KEY_PVR] = "PVR",[KEY_MHP] = "MHP", [KEY_LANGUAGE] = "Language",[KEY_TITLE] = "Title", [KEY_SUBTITLE] = "Subtitle",[KEY_ANGLE] = "Angle", [KEY_ZOOM] = "Zoom",[KEY_MODE] = "Mode", [KEY_KEYBOARD] = "Keyboard",[KEY_SCREEN] = "Screen", [KEY_PC] = "PC",[KEY_TV] = "TV", [KEY_TV2] = "TV2",[KEY_VCR] = "VCR", [KEY_VCR2] = "VCR2",[KEY_SAT] = "Sat", [KEY_SAT2] = "Sat2",[KEY_CD] = "CD", [KEY_TAPE] = "Tape",[KEY_RADIO] = "Radio", [KEY_TUNER] = "Tuner",[KEY_PLAYER] = "Player", [KEY_TEXT] = "Text",[KEY_DVD] = "DVD", [KEY_AUX] = "Aux",[KEY_MP3] = "MP3", [KEY_AUDIO] = "Audio",[KEY_VIDEO] = "Video", [KEY_DIRECTORY] = "Directory",[KEY_LIST] = "List", [KEY_MEMO] = "Memo",[KEY_CALENDAR] = "Calendar", [KEY_RED] = "Red",[KEY_GREEN] = "Green", [KEY_YELLOW] = "Yellow",[KEY_BLUE] = "Blue", [KEY_CHANNELUP] = "ChannelUp",[KEY_CHANNELDOWN] = "ChannelDown", [KEY_FIRST] = "First",[KEY_LAST] = "Last", [KEY_AB] = "AB",[KEY_NEXT] = "Next", [KEY_RESTART] = "Restart",[KEY_SLOW] = "Slow", [KEY_SHUFFLE] = "Shuffle",[KEY_BREAK] = "Break", [KEY_PREVIOUS] = "Previous",[KEY_DIGITS] = "Digits", [KEY_TEEN] = "TEEN",[KEY_TWEN] = "TWEN", [KEY_DEL_EOL] = "Delete EOL",[KEY_DEL_EOS] = "Delete EOS", [KEY_INS_LINE] = "Insert line",[KEY_DEL_LINE] = "Delete line",
};char *absval[5] = { "Value", "Min ", "Max ", "Fuzz ", "Flat " };char *relatives[REL_MAX + 1] = {[0 ... REL_MAX] = NULL,[REL_X] = "X", [REL_Y] = "Y",[REL_Z] = "Z", [REL_HWHEEL] = "HWheel",[REL_DIAL] = "Dial", [REL_WHEEL] = "Wheel", [REL_MISC] = "Misc",
};char *absolutes[ABS_MAX + 1] = {[0 ... ABS_MAX] = NULL,[ABS_X] = "X", [ABS_Y] = "Y",[ABS_Z] = "Z", [ABS_RX] = "Rx",[ABS_RY] = "Ry", [ABS_RZ] = "Rz",[ABS_THROTTLE] = "Throttle", [ABS_RUDDER] = "Rudder",[ABS_WHEEL] = "Wheel", [ABS_GAS] = "Gas",[ABS_BRAKE] = "Brake", [ABS_HAT0X] = "Hat0X",[ABS_HAT0Y] = "Hat0Y", [ABS_HAT1X] = "Hat1X",[ABS_HAT1Y] = "Hat1Y", [ABS_HAT2X] = "Hat2X",[ABS_HAT2Y] = "Hat2Y", [ABS_HAT3X] = "Hat3X",[ABS_HAT3Y] = "Hat 3Y", [ABS_PRESSURE] = "Pressure",[ABS_DISTANCE] = "Distance", [ABS_TILT_X] = "XTilt",[ABS_TILT_Y] = "YTilt", [ABS_TOOL_WIDTH] = "Tool Width",[ABS_VOLUME] = "Volume", [ABS_MISC] = "Misc",
};char *misc[MSC_MAX + 1] = {[ 0 ... MSC_MAX] = NULL,[MSC_SERIAL] = "Serial", [MSC_PULSELED] = "Pulseled",[MSC_GESTURE] = "Gesture", [MSC_RAW] = "RawData",[MSC_SCAN] = "ScanCode",
};char *leds[LED_MAX + 1] = {[0 ... LED_MAX] = NULL,[LED_NUML] = "NumLock", [LED_CAPSL] = "CapsLock", [LED_SCROLLL] = "ScrollLock", [LED_COMPOSE] = "Compose",[LED_KANA] = "Kana", [LED_SLEEP] = "Sleep", [LED_SUSPEND] = "Suspend", [LED_MUTE] = "Mute",[LED_MISC] = "Misc",
};char *repeats[REP_MAX + 1] = {[0 ... REP_MAX] = NULL,[REP_DELAY] = "Delay", [REP_PERIOD] = "Period"
};char *sounds[SND_MAX + 1] = {[0 ... SND_MAX] = NULL,[SND_CLICK] = "Click", [SND_BELL] = "Bell",[SND_TONE] = "Tone"
};char **names[EV_MAX + 1] = {[0 ... EV_MAX] = NULL,[EV_SYN] = events, [EV_KEY] = keys,[EV_REL] = relatives, [EV_ABS] = absolutes,[EV_MSC] = misc, [EV_LED] = leds,[EV_SND] = sounds, [EV_REP] = repeats,
};#define BITS_PER_LONG (sizeof(long) * 8)
#define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1)
#define OFF(x) ((x)%BITS_PER_LONG)
#define BIT(x) (1UL<<OFF(x))
#define LONG(x) ((x)/BITS_PER_LONG)
#define test_bit(bit, array) ((array[LONG(bit)] >> OFF(bit)) & 1)int main (int argc, char **argv)
{int fd, rd, i, j, k;struct input_event ev[64];int version;unsigned short id[4];unsigned long bit[EV_MAX][NBITS(KEY_MAX)];char name[256] = "Unknown";int abs[5];if (argc < 2) {printf("Usage: evtest /dev/input/eventX\n");printf("Where X = input device number\n");return 1;}if ((fd = open(argv[argc - 1], O_RDONLY)) < 0) {perror("evtest");return 1;}if (ioctl(fd, EVIOCGVERSION, &version)) {perror("evtest: can't get version");return 1;}printf("Input driver version is %d.%d.%d\n",version >> 16, (version >> 8) & 0xff, version & 0xff);ioctl(fd, EVIOCGID, id);printf("Input device ID: bus 0x%x vendor 0x%x product 0x%x version 0x%x\n",id[ID_BUS], id[ID_VENDOR], id[ID_PRODUCT], id[ID_VERSION]);ioctl(fd, EVIOCGNAME(sizeof(name)), name);printf("Input device name: \"%s\"\n", name);memset(bit, 0, sizeof(bit));ioctl(fd, EVIOCGBIT(0, EV_MAX), bit[0]);printf("Supported events:\n");for (i = 0; i < EV_MAX; i++)if (test_bit(i, bit[0])) {printf(" Event type %d (%s)\n", i, events[i] ? events[i] : "?");if (!i) continue;ioctl(fd, EVIOCGBIT(i, KEY_MAX), bit[i]);for (j = 0; j < KEY_MAX; j++) if (test_bit(j, bit[i])) {printf(" Event code %d (%s)\n", j, names[i] ? (names[i][j] ? names[i][j] : "?") : "?");if (i == EV_ABS) {ioctl(fd, EVIOCGABS(j), abs);for (k = 0; k < 5; k++)if ((k < 3) || abs[k])printf(" %s %6d\n", absval[k], abs[k]);}}}printf("Testing ... (interrupt to exit)\n");while (1) {rd = read(fd, ev, sizeof(struct input_event) * 64);if (rd < (int) sizeof(struct input_event)) {printf("yyy\n");perror("\nevtest: error reading");return 1;}for (i = 0; i < rd / sizeof(struct input_event); i++)if (ev[i].type == EV_SYN) {printf("Event: time %ld.%06ld, -------------- %s ------------\n",ev[i].time.tv_sec, ev[i].time.tv_usec, ev[i].code ? "Config Sync" : "Report Sync" );} else if (ev[i].type == EV_MSC && (ev[i].code == MSC_RAW || ev[i].code == MSC_SCAN)) {printf("Event: time %ld.%06ld, type %d (%s), code %d (%s), value %02x\n",ev[i].time.tv_sec, ev[i].time.tv_usec, ev[i].type,events[ev[i].type] ? events[ev[i].type] : "?",ev[i].code,names[ev[i].type] ? (names[ev[i].type][ev[i].code] ? names[ev[i].type][ev[i].code] : "?") : "?",ev[i].value);} else {printf("Event: time %ld.%06ld, type %d (%s), code %d (%s), value %d\n",ev[i].time.tv_sec, ev[i].time.tv_usec, ev[i].type,events[ev[i].type] ? events[ev[i].type] : "?",ev[i].code,names[ev[i].type] ? (names[ev[i].type][ev[i].code] ? names[ev[i].type][ev[i].code] : "?") : "?",ev[i].value);} }
}
用evtest读取刚刚的event1
[root@FriendlyARM plg]# ./evtest /dev/input/event1
Input driver version is 1.0.0
Input device ID: bus 0x19 vendor 0x0 product 0x0 version 0x0
Input device name: "input_song"
Supported events://支持的事件,有两种Event type 0 (Sync)Event type 1 (Key)Event code 2 (1)//code 2,表示按键1Event code 3 (2)Event code 4 (3)Event code 5 (4)Event code 6 (5)Event code 7 (6)Event code 8 (7)Event code 9 (8)
Testing ... (interrupt to exit)
Event: time -45878002.839866, type 1 (Key), code 9 (8), value 1//检测到事件,8按下
Event: time -45878001.839865, type 1 (Key), code 9 (8), value 0//检测到事件,8弹起
Event: time -45878000.839858, type 1 (Key), code 2 (1), value 1
Event: time -45877999.839865, type 1 (Key), code 2 (1), value 0
Event: time -45877998.839858, type 1 (Key), code 3 (2), value 1
Event: time -45877997.839865, type 1 (Key), code 3 (2), value 0
Event: time -45877996.839864, type 1 (Key), code 4 (3), value 1
Event: time -45877995.839862, type 1 (Key), code 4 (3), value 0
Event: time -45877994.839856, type 1 (Key), code 5 (4), value 1
Event: time -45877993.839858, type 1 (Key), code 5 (4), value 0
Event: time -45877992.839870, type 1 (Key), code 6 (5), value 1
Event: time -45877991.839859, type 1 (Key), code 6 (5), value 0
Event: time -45877990.839861, type 1 (Key), code 7 (6), value 1
Event: time -45877989.839863, type 1 (Key), code 7 (6), value 0
Event: time -45877988.839858, type 1 (Key), code 8 (7), value 1
这篇关于usb2-相关的input子系统及 写成input子系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!