1 /*
2 * Copyright 2002 Red Hat Inc., Durham, North Carolina.3 *4 * All Rights Reserved.5 *6 * Permission is hereby granted, free of charge, to any person obtaining7 * a copy of this software and associated documentation files (the8 * "Software"), to deal in the Software without restriction, including9 * without limitation on the rights to use, copy, modify, merge,10 * publish, distribute, sublicense, and/or sell copies of the Software,11 * and to permit persons to whom the Software is furnished to do so,12 * subject to the following conditions:13 *14 * The above copyright notice and this permission notice (including the15 * next paragraph) shall be included in all copies or substantial16 * portions of the Software.17 *18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,19 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND21 * NON-INFRINGEMENT. IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS22 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN23 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE25 * SOFTWARE.26 *27 * This is a simple test program that reads from /dev/input/event*,28 * decoding events into a human readable form.29 */
30
31 /*
32 * Authors:33 * Rickard E. (Rik) Faith 34 *35 */
36
37 #include
38 #include
39 #include
40 #include
41 #include
42 #include
43 #include
44 #include
45 #include
46
47 struct input_event event;48
49 int main(int argc, char **argv)50 {51 char name[64]; /*RATS: Use ok, but could be better*/
52 char buf[256] = { 0, }; /*RATS: Use ok*/
53 unsigned char mask[EV_MAX/8 + 1]; /*RATS: Use ok*/
54 intversion;55 int fd = 0;56 intrc;57 inti, j;58 char *tmp;59
60 #define test_bit(bit) (mask[(bit)/8] & (1 << ((bit)%8)))
61
62 for (i = 0; i < 32; i++) {63 sprintf(name, "/dev/input/event%d", i);64 if ((fd = open(name, O_RDONLY, 0)) >= 0) {65 ioctl(fd, EVIOCGVERSION, &version);66 ioctl(fd, EVIOCGNAME(sizeof(buf)), buf);67 ioctl(fd, EVIOCGBIT(0, sizeof(mask)), mask);68 printf("%s\n", name);69 printf("evdev version: %d.%d.%d\n",70 version >> 16, (version >> 8) & 0xff, version & 0xff);71 printf("name: %s\n", buf);72 printf("features:");73 for (j = 0; j < EV_MAX; j++) {74 if(test_bit(j)) {75 const char *type = "unknown";76 switch(j) {77 case EV_KEY: type = "keys/buttons"; break;78 case EV_REL: type = "relative"; break;79 case EV_ABS: type = "absolute"; break;80 case EV_MSC: type = "reserved"; break;81 case EV_LED: type = "leds"; break;82 case EV_SND: type = "sound"; break;83 case EV_REP: type = "repeat"; break;84 case EV_FF: type = "feedback"; break;85 }86 printf("%s", type);87 }88 }89 printf("\n");90 close(fd);91 }92 }93
94 if (argc > 1) {95 sprintf(name, "/dev/input/event%d", atoi(argv[1]));96 if ((fd = open(name, O_RDWR, 0)) >= 0) {97 printf("%s: open, fd = %d\n", name, fd);98 for (i = 0; i < LED_MAX; i++) {99 event.time.tv_sec = time(0);100 event.time.tv_usec = 0;101 event.type =EV_LED;102 event.code =i;103 event.value = 0;104 write(fd, &event, sizeof(event));105 }106
107 while ((rc = read(fd, &event, sizeof(event))) > 0) {108 printf("%-24.24s.%06lu type 0x%04x; code 0x%04x;"
109 "value 0x%08x;",110 ctime(&event.time.tv_sec),111 event.time.tv_usec,112 event.type, event.code, event.value);113 switch (event.type) {114 caseEV_KEY:115 if (event.code >BTN_MISC) {116 printf("Button %d %s",117 event.code & 0xff,118 event.value ? "press" : "release");119 } else{120 printf("Key %d (0x%x) %s",121 event.code & 0xff,122 event.code & 0xff,123 event.value ? "press" : "release");124 }125 break;126 caseEV_REL:127 switch (event.code) {128 case REL_X: tmp = "X"; break;129 case REL_Y: tmp = "Y"; break;130 case REL_HWHEEL: tmp = "HWHEEL"; break;131 case REL_DIAL: tmp = "DIAL"; break;132 case REL_WHEEL: tmp = "WHEEL"; break;133 case REL_MISC: tmp = "MISC"; break;134 default: tmp = "UNKNOWN"; break;135 }136 printf("Relative %s %d", tmp, event.value);137 break;138 caseEV_ABS:139 switch (event.code) {140 case ABS_X: tmp = "X"; break;141 case ABS_Y: tmp = "Y"; break;142 case ABS_Z: tmp = "Z"; break;143 case ABS_RX: tmp = "RX"; break;144 case ABS_RY: tmp = "RY"; break;145 case ABS_RZ: tmp = "RZ"; break;146 case ABS_THROTTLE: tmp = "THROTTLE"; break;147 case ABS_RUDDER: tmp = "RUDDER"; break;148 case ABS_WHEEL: tmp = "WHEEL"; break;149 case ABS_GAS: tmp = "GAS"; break;150 case ABS_BRAKE: tmp = "BRAKE"; break;151 case ABS_HAT0X: tmp = "HAT0X"; break;152 case ABS_HAT0Y: tmp = "HAT0Y"; break;153 case ABS_HAT1X: tmp = "HAT1X"; break;154 case ABS_HAT1Y: tmp = "HAT1Y"; break;155 case ABS_HAT2X: tmp = "HAT2X"; break;156 case ABS_HAT2Y: tmp = "HAT2Y"; break;157 case ABS_HAT3X: tmp = "HAT3X"; break;158 case ABS_HAT3Y: tmp = "HAT3Y"; break;159 case ABS_PRESSURE: tmp = "PRESSURE"; break;160 case ABS_DISTANCE: tmp = "DISTANCE"; break;161 case ABS_TILT_X: tmp = "TILT_X"; break;162 case ABS_TILT_Y: tmp = "TILT_Y"; break;163 case ABS_MISC: tmp = "MISC"; break;164 default: tmp = "UNKNOWN"; break;165 }166 printf("Absolute %s %d", tmp, event.value);167 break;168 case EV_MSC: printf("Misc"); break;169 case EV_LED: printf("Led"); break;170 case EV_SND: printf("Snd"); break;171 case EV_REP: printf("Rep"); break;172 case EV_FF: printf("FF"); break;173 break;174 }175 printf("\n");176 }177 printf("rc = %d, (%s)\n", rc, strerror(errno));178 close(fd);179 }180 }181 return 0;182 }