Name: Alias support for input_device_id tables Author: Rusty Russell Status: Experimental Support aliases for input hotplug. Index: linux-2.6.10-bk14-Module/scripts/mod/file2alias-input.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ linux-2.6.10-bk14-Module/scripts/mod/file2alias-input.h 2005-01-12 13:28:48.430431832 +1100 @@ -0,0 +1,528 @@ +#ifndef _LINUX_FILE2ALIAS_INPUT_H +#define _LINUX_FILE2ALIAS_INPUT_H + +#define NBITS(x) ((((x)-1)/(sizeof(long)*8))+1) +#include "../../include/linux/input.h" + +struct input_table +{ + int val; + const char *name; +}; + +static struct input_table ev_names[] += { + { -1, "E" }, + { EV_SYN, "syn" }, + { EV_KEY, "key" }, + { EV_REL, "rel" }, + { EV_ABS, "abs" }, + { EV_MSC, "msc" }, + { EV_LED, "led" }, + { EV_SND, "snd" }, + { EV_REP, "rep" }, + { EV_FF, "ff" }, + { EV_PWR, "pwr" }, + { EV_FF_STATUS, "ffstatus" }, + { }, +}; + +static struct input_table key_names[] += { + { -1, "K" }, + { 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, "leftctrl" }, + { 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, "zenkakuhankaku" }, + { KEY_102ND, "102nd" }, + { KEY_F11, "f11" }, + { KEY_F12, "f12" }, + { KEY_RO, "ro" }, + { KEY_KATAKANA, "katakana" }, + { KEY_HIRAGANA, "hiragana" }, + { KEY_HENKAN, "henkan" }, + { KEY_KATAKANAHIRAGANA, "katakanahiragana" }, + { 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, "xfer" }, + { 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, "iso" }, + { 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, "kpleftparen" }, + { KEY_KPRIGHTPAREN, "kprightparen" }, + + { 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, "fastforward" }, + { KEY_BASSBOOST, "bassboost" }, + { 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, "alterase" }, + { KEY_CANCEL, "cancel" }, + { KEY_BRIGHTNESSDOWN, "brightnessdown" }, + { KEY_BRIGHTNESSUP, "brightnessup" }, + { KEY_MEDIA, "media" }, + + { KEY_UNKNOWN, "unknown" }, + + { BTN_MISC, "btn_misc" }, + { BTN_0, "btn_0" }, + { BTN_1, "btn_1" }, + { BTN_2, "btn_2" }, + { BTN_3, "btn_3" }, + { BTN_4, "btn_4" }, + { BTN_5, "btn_5" }, + { BTN_6, "btn_6" }, + { BTN_7, "btn_7" }, + { BTN_8, "btn_8" }, + { BTN_9, "btn_9" }, + { BTN_MOUSE, "btn_mouse" }, + { BTN_LEFT, "btn_left" }, + { BTN_RIGHT, "btn_right" }, + { BTN_MIDDLE, "btn_middle" }, + { BTN_SIDE, "btn_side" }, + { BTN_EXTRA, "btn_extra" }, + { BTN_FORWARD, "btn_forward" }, + { BTN_BACK, "btn_back" }, + { BTN_TASK, "btn_task" }, + { BTN_JOYSTICK, "btn_joystick" }, + { BTN_TRIGGER, "btn_trigger" }, + { BTN_THUMB, "btn_thumb" }, + { BTN_THUMB2, "btn_thumb2" }, + { BTN_TOP, "btn_top" }, + { BTN_TOP2, "btn_top2" }, + { BTN_PINKIE, "btn_pinkie" }, + { BTN_BASE, "btn_base" }, + { BTN_BASE2, "btn_base2" }, + { BTN_BASE3, "btn_base3" }, + { BTN_BASE4, "btn_base4" }, + { BTN_BASE5, "btn_base5" }, + { BTN_BASE6, "btn_base6" }, + { BTN_DEAD, "btn_dead" }, + { BTN_GAMEPAD, "btn_gamepad" }, + { BTN_A, "btn_a" }, + { BTN_B, "btn_b" }, + { BTN_C, "btn_c" }, + { BTN_X, "btn_x" }, + { BTN_Y, "btn_y" }, + { BTN_Z, "btn_z" }, + { BTN_TL, "btn_tl" }, + { BTN_TR, "btn_tr" }, + { BTN_TL2, "btn_tl2" }, + { BTN_TR2, "btn_tr2" }, + { BTN_SELECT, "btn_select" }, + { BTN_START, "btn_start" }, + { BTN_MODE, "btn_mode" }, + { BTN_THUMBL, "btn_thumbl" }, + { BTN_THUMBR, "btn_thumbr" }, + { BTN_DIGI, "btn_digi" }, + { BTN_TOOL_PEN, "btn_tool_pen" }, + { BTN_TOOL_RUBBER, "btn_tool_rubber" }, + { BTN_TOOL_BRUSH, "btn_tool_brush" }, + { BTN_TOOL_PENCIL, "btn_tool_pencil" }, + { BTN_TOOL_AIRBRUSH, "btn_tool_airbrush" }, + { BTN_TOOL_FINGER, "btn_tool_finger" }, + { BTN_TOOL_MOUSE, "btn_tool_mouse" }, + { BTN_TOOL_LENS, "btn_tool_lens" }, + { BTN_TOUCH, "btn_touch" }, + { BTN_STYLUS, "btn_stylus" }, + { BTN_STYLUS2, "btn_stylus2" }, + { BTN_TOOL_DOUBLETAP, "btn_tool_doubletap" }, + { BTN_TOOL_TRIPLETAP, "btn_tool_tripletap" }, + { BTN_WHEEL, "btn_wheel" }, + { BTN_GEAR_DOWN, "btn_gear_down" }, + { BTN_GEAR_UP, "btn_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, "del_eol" }, + { KEY_DEL_EOS, "del_eos" }, + { KEY_INS_LINE, "ins_line" }, + { KEY_DEL_LINE, "del_line" }, + + { KEY_FN, "fn" }, + { KEY_FN_ESC, "fn_ESC" }, + { KEY_FN_F1, "fn_F1" }, + { KEY_FN_F2, "fn_F2" }, + { KEY_FN_F3, "fn_F3" }, + { KEY_FN_F4, "fn_F4" }, + { KEY_FN_F5, "fn_F5" }, + { KEY_FN_F6, "fn_F6" }, + { KEY_FN_F7, "fn_F7" }, + { KEY_FN_F8, "fn_F8" }, + { KEY_FN_F9, "fn_F9" }, + { KEY_FN_F1, "fn_F1" }, + { KEY_FN_F11, "fn_F11" }, + { KEY_FN_F12, "fn_F12" }, + { KEY_FN_1, "fn_1" }, + { KEY_FN_2, "fn_2" }, + { KEY_FN_D, "fn_D" }, + { KEY_FN_E, "fn_E" }, + { KEY_FN_F, "fn_F" }, + { KEY_FN_S, "fn_S" }, + { KEY_FN_B, "fn_B" }, + + { }, +}; + +static struct input_table rel_names[] += { + { -1, "R" }, + { REL_X, "x" }, + { REL_Y, "y" }, + { REL_Z, "z" }, + { REL_HWHEEL, "hwheel" }, + { REL_DIAL, "dial" }, + { REL_WHEEL, "wheel" }, + { REL_MISC, "misc" }, + { REL_MAX, "max" }, + { }, +}; + +static struct input_table abs_names[] += { + { -1, "A" }, + { 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, "hat3y" }, + { ABS_PRESSURE, "pressure" }, + { ABS_DISTANCE, "distance" }, + { ABS_TILT_X, "tilt_x" }, + { ABS_TILT_Y, "tilt_y" }, + { ABS_TOOL_WIDTH, "tool_width" }, + { ABS_VOLUME, "volume" }, + { ABS_MISC, "misc" }, + { ABS_MAX, "max" }, + { }, +}; + +static struct input_table misc_names[] += { + { -1, "M" }, + { MSC_SERIAL, "serial" }, + { MSC_PULSELED, "pulseled" }, + { MSC_GESTURE, "gesture" }, + { MSC_MAX, "max" }, + { }, +}; + +static struct input_table led_names[] += { + { -1, "L" }, + { LED_NUML, "numl" }, + { LED_CAPSL, "capsl" }, + { LED_SCROLLL, "scrolll" }, + { LED_COMPOSE, "compose" }, + { LED_KANA, "kana" }, + { LED_SLEEP, "sleep" }, + { LED_SUSPEND, "suspend" }, + { LED_MUTE, "mute" }, + { LED_MISC, "misc" }, + { LED_MAX, "max" }, + { }, +}; + +static struct input_table sound_names[] += { + { -1, "S" }, + { SND_CLICK, "click" }, + { SND_BELL, "bell" }, + { SND_TONE, "tone" }, + { SND_MAX, "max" }, + { }, +}; + +static struct input_table ff_names[] += { + { -1, "F" }, + { FF_STATUS_STOPPED, "status_stopped" }, + { FF_STATUS_PLAYING, "status_playing" }, + { FF_STATUS_MAX, "status_max" }, + { FF_RUMBLE, "rumble" }, + { FF_PERIODIC, "periodic" }, + { FF_CONSTANT, "constant" }, + { FF_SPRING, "spring" }, + { FF_FRICTION, "friction" }, + { FF_DAMPER, "damper" }, + { FF_INERTIA, "inertia" }, + { FF_RAMP, "ramp" }, + { FF_SQUARE, "square" }, + { FF_TRIANGLE, "triangle" }, + { FF_SINE, "sine" }, + { FF_SAW_UP, "saw_up" }, + { FF_SAW_DOWN, "saw_down" }, + { FF_CUSTOM, "custom" }, + { FF_GAIN, "gain" }, + { FF_AUTOCENTER, "autocenter" }, + { }, +}; +#endif /* _LINUX_FILE2ALIAS_INPUT_H */ Index: linux-2.6.10-bk14-Module/scripts/mod/file2alias.c =================================================================== --- linux-2.6.10-bk14-Module.orig/scripts/mod/file2alias.c 2004-12-28 12:31:11.000000000 +1100 +++ linux-2.6.10-bk14-Module/scripts/mod/file2alias.c 2005-01-12 13:28:48.476424840 +1100 @@ -47,6 +47,9 @@ sprintf(str + strlen(str), "*"); \ } while(0) +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#define MAX_ALIAS_LENGTH 2048 + /* Looks like "usb:vNpNdlNdhNdcNdscNdpNicNiscNipN" */ static int do_usb_entry(const char *filename, struct usb_device_id *id, char *alias) @@ -204,6 +207,127 @@ return 1; } +#include "file2alias-input.h" + +static int print_bit(char *alias, unsigned int bit, struct input_table *names) +{ + unsigned int i; + + for (i = 1; names[i].name; i++) { + if (names[i].val == bit) + return sprintf(alias, "%s%s,*", + names[0].name, names[i].name); + } + printf("Warning: No name found for bit %i among %s\n", + bit, names[0].name); + return 0; +} + +static int print_bits(char *alias, + unsigned int offset, + kernel_ulong_t mask, + struct input_table *names) +{ + unsigned int bit; + + if (strlen(alias) > MAX_ALIAS_LENGTH) + return 0; + + alias += strlen(alias); + + /* Offset is in longs, convert to bits. */ + offset *= 8 * sizeof(mask); + for (bit = 0; bit < 8 * sizeof(mask); bit++) + if (mask & (1<flags = TO_NATIVE(id->flags); + id->id.bustype = TO_NATIVE(id->id.bustype); + id->id.vendor = TO_NATIVE(id->id.vendor); + id->id.product = TO_NATIVE(id->id.product); + id->id.version = TO_NATIVE(id->id.version); + + strcpy(alias, "input:"); + ADD(alias, "b", id->flags&INPUT_DEVICE_ID_MATCH_BUS, id->id.bustype); + ADD(alias, "e", id->flags&INPUT_DEVICE_ID_MATCH_VENDOR, id->id.vendor); + ADD(alias, "p", id->flags&INPUT_DEVICE_ID_MATCH_PRODUCT, + id->id.product); + ADD(alias, "v", id->flags&INPUT_DEVICE_ID_MATCH_VERSION, + id->id.version); + + if (alias[strlen(alias)-1] != '*') + strcat(alias, "*"); + if (id->flags & INPUT_DEVICE_ID_MATCH_EVBIT) { + for (i = 0; i < ARRAY_SIZE(id->evbit); i++) { + id->evbit[i] = TO_NATIVE(id->evbit[i]); + if (!print_bits(alias, i, id->evbit[i], ev_names)) + goto too_long; + } + } + if (id->flags & INPUT_DEVICE_ID_MATCH_KEYBIT) { + for (i = 0; i < ARRAY_SIZE(id->keybit); i++) { + id->keybit[i] = TO_NATIVE(id->keybit[i]); + if (!print_bits(alias, i, id->keybit[i], key_names)) + goto too_long; + } + } + if (id->flags & INPUT_DEVICE_ID_MATCH_RELBIT) { + for (i = 0; i < ARRAY_SIZE(id->relbit); i++) { + id->relbit[i] = TO_NATIVE(id->relbit[i]); + if (!print_bits(alias, i, id->relbit[i], rel_names)) + goto too_long; + } + } + if (id->flags & INPUT_DEVICE_ID_MATCH_ABSBIT) { + for (i = 0; i < ARRAY_SIZE(id->absbit); i++) { + id->absbit[i] = TO_NATIVE(id->absbit[i]); + if (!print_bits(alias, i, id->absbit[i], abs_names)) + goto too_long; + } + } + if (id->flags & INPUT_DEVICE_ID_MATCH_MSCBIT) { + for (i = 0; i < ARRAY_SIZE(id->mscbit); i++) { + id->mscbit[i] = TO_NATIVE(id->mscbit[i]); + if (!print_bits(alias, i, id->mscbit[i], misc_names)) + goto too_long; + } + } + if (id->flags & INPUT_DEVICE_ID_MATCH_LEDBIT) { + for (i = 0; i < ARRAY_SIZE(id->ledbit); i++) { + id->ledbit[i] = TO_NATIVE(id->ledbit[i]); + if (!print_bits(alias, i, id->ledbit[i], led_names)) + goto too_long; + } + } + if (id->flags & INPUT_DEVICE_ID_MATCH_SNDBIT) { + for (i = 0; i < ARRAY_SIZE(id->sndbit); i++) { + id->sndbit[i] = TO_NATIVE(id->sndbit[i]); + if (!print_bits(alias, i, id->sndbit[i], sound_names)) + goto too_long; + } + } + if (id->flags & INPUT_DEVICE_ID_MATCH_FFBIT) { + for (i = 0; i < ARRAY_SIZE(id->ffbit); i++) { + id->ffbit[i] = TO_NATIVE(id->ffbit[i]); + if (!print_bits(alias, i, id->ffbit[i], ff_names)) + goto too_long; + } + } + return 1; + +too_long: + printf("Truncating extremely long alias for %s\n", filename); + return 0; +} + /* Ignore any prefix, eg. v850 prepends _ */ static inline int sym_is(const char *symbol, const char *name) { @@ -221,7 +345,7 @@ struct module *mod) { unsigned int i; - char alias[500]; + char alias[MAX_ALIAS_LENGTH + 100]; /* A bit of slop. */ int (*do_entry)(const char *, void *entry, char *alias) = function; if (size % id_size || size < id_size) { @@ -276,6 +400,9 @@ else if (sym_is(symname, "__mod_pnp_card_device_table")) do_table(symval, sym->st_size, sizeof(struct pnp_card_device_id), do_pnp_card_entry, mod); + else if (sym_is(symname, "__mod_input_device_table")) + do_table(symval, sym->st_size, sizeof(struct input_device_id), + do_input_entry, mod); } /* Now add out buffered information to the generated C source */ Index: linux-2.6.10-bk14-Module/include/linux/mod_devicetable.h =================================================================== --- linux-2.6.10-bk14-Module.orig/include/linux/mod_devicetable.h 2004-02-18 23:54:34.000000000 +1100 +++ linux-2.6.10-bk14-Module/include/linux/mod_devicetable.h 2005-01-12 13:28:48.496421800 +1100 @@ -164,5 +164,4 @@ } devs[PNP_MAX_DEVICES]; }; - #endif /* LINUX_MOD_DEVICETABLE_H */ Index: linux-2.6.10-bk14-Module/include/linux/input.h =================================================================== --- linux-2.6.10-bk14-Module.orig/include/linux/input.h 2005-01-12 13:09:11.000000000 +1100 +++ linux-2.6.10-bk14-Module/include/linux/input.h 2005-01-12 13:28:48.516418760 +1100 @@ -12,6 +12,7 @@ #ifdef __KERNEL__ #include #include +#include #else #include #include @@ -762,6 +763,29 @@ #define FF_MAX 0x7f +/* + * Structure for hotplug & device<->driver matching. + */ + +#define INPUT_DEVICE_ID_MATCH_BUS 1 +#define INPUT_DEVICE_ID_MATCH_VENDOR 2 +#define INPUT_DEVICE_ID_MATCH_PRODUCT 4 +#define INPUT_DEVICE_ID_MATCH_VERSION 8 + +#define INPUT_DEVICE_ID_MATCH_EVBIT 0x010 +#define INPUT_DEVICE_ID_MATCH_KEYBIT 0x020 +#define INPUT_DEVICE_ID_MATCH_RELBIT 0x040 +#define INPUT_DEVICE_ID_MATCH_ABSBIT 0x080 +#define INPUT_DEVICE_ID_MATCH_MSCBIT 0x100 +#define INPUT_DEVICE_ID_MATCH_LEDBIT 0x200 +#define INPUT_DEVICE_ID_MATCH_SNDBIT 0x400 +#define INPUT_DEVICE_ID_MATCH_FFBIT 0x800 + +#define INPUT_DEVICE_ID_MATCH_DEVICE\ + (INPUT_DEVICE_ID_MATCH_BUS | INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT) +#define INPUT_DEVICE_ID_MATCH_DEVICE_AND_VERSION\ + (INPUT_DEVICE_ID_MATCH_DEVICE | INPUT_DEVICE_ID_MATCH_VERSION) + #ifdef __KERNEL__ /* @@ -860,48 +884,8 @@ struct list_head node; }; -/* - * Structure for hotplug & device<->driver matching. - */ - -#define INPUT_DEVICE_ID_MATCH_BUS 1 -#define INPUT_DEVICE_ID_MATCH_VENDOR 2 -#define INPUT_DEVICE_ID_MATCH_PRODUCT 4 -#define INPUT_DEVICE_ID_MATCH_VERSION 8 - -#define INPUT_DEVICE_ID_MATCH_EVBIT 0x010 -#define INPUT_DEVICE_ID_MATCH_KEYBIT 0x020 -#define INPUT_DEVICE_ID_MATCH_RELBIT 0x040 -#define INPUT_DEVICE_ID_MATCH_ABSBIT 0x080 -#define INPUT_DEVICE_ID_MATCH_MSCIT 0x100 -#define INPUT_DEVICE_ID_MATCH_LEDBIT 0x200 -#define INPUT_DEVICE_ID_MATCH_SNDBIT 0x400 -#define INPUT_DEVICE_ID_MATCH_FFBIT 0x800 - -#define INPUT_DEVICE_ID_MATCH_DEVICE\ - (INPUT_DEVICE_ID_MATCH_BUS | INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT) -#define INPUT_DEVICE_ID_MATCH_DEVICE_AND_VERSION\ - (INPUT_DEVICE_ID_MATCH_DEVICE | INPUT_DEVICE_ID_MATCH_VERSION) - -struct input_device_id { - - unsigned long flags; - - struct input_id id; - - unsigned long evbit[NBITS(EV_MAX)]; - unsigned long keybit[NBITS(KEY_MAX)]; - unsigned long relbit[NBITS(REL_MAX)]; - unsigned long absbit[NBITS(ABS_MAX)]; - unsigned long mscbit[NBITS(MSC_MAX)]; - unsigned long ledbit[NBITS(LED_MAX)]; - unsigned long sndbit[NBITS(SND_MAX)]; - unsigned long ffbit[NBITS(FF_MAX)]; - - unsigned long driver_info; -}; - struct input_handle; +struct input_device_id; struct input_handler { @@ -1012,5 +996,26 @@ extern struct class_simple *input_class; -#endif +#endif /* KERNEL */ + +#if defined(__KERNEL__) || defined(KERNEL_ELFCLASS) +/* Shared with scripts/mod/file2alias.c: be careful */ +struct input_device_id +{ + kernel_ulong_t flags; + + struct input_id id; + + kernel_ulong_t evbit[NBITS(EV_MAX)]; + kernel_ulong_t keybit[NBITS(KEY_MAX)]; + kernel_ulong_t relbit[NBITS(REL_MAX)]; + kernel_ulong_t absbit[NBITS(ABS_MAX)]; + kernel_ulong_t mscbit[NBITS(MSC_MAX)]; + kernel_ulong_t ledbit[NBITS(LED_MAX)]; + kernel_ulong_t sndbit[NBITS(SND_MAX)]; + kernel_ulong_t ffbit[NBITS(FF_MAX)]; + + kernel_ulong_t driver_info; +}; +#endif /* __KERNEL__ or file2alias */ #endif