linux_code映射到android_code的具体过程

 

inputdispatcher按键的派发该文中,留下了下面的问题,现在回过头来具体看看其具体的转换过程:

STEP5:

frameworks\native\services\inputflinger\InputReader.cpp

 

void KeyboardInputMapper::process(constRawEvent* rawEvent) {

   switch (rawEvent->type) {

   case EV_KEY: {

       int32_t scanCode = rawEvent->code;

       int32_t usageCode = mCurrentHidUsage;

       mCurrentHidUsage = 0;

 

       if (isKeyboardOrGamepadKey(scanCode)) {

           int32_t keyCode;

           uint32_t flags;

           if (getEventHub()->mapKey(getDeviceId(),scanCode, usageCode, &keyCode, &flags))

//      这里应该是将linux_code的键值,转换为了android_key的键值。很关键的一个转换。后面专门分析如何转换。一般是通过generac.lk文件对应的。带验证。

{

                keyCode = AKEYCODE_UNKNOWN;

               flags = 0;

           }

           processKey(rawEvent->when, rawEvent->value!= 0, keyCode, scanCode, flags);

       }

       break;

}

。。。。。。

}

 

 

通过打印信息可以确认linux_code 转换到android_code就是在getEventHub()->mapKey(getDeviceId(), scanCode,usageCode, &keyCode, &flags)里面实现的,scancode为获取到的驱动发送过来linux_code的值,keyCode就是为通过getEventHub()->mapKey获取到的android_code的值。具体如何转换的,我们往下一步一步的看看:

 

Step 1:

\frameworks\native\services\inputflinger\ EventHub.cpp

status_t EventHub::mapKey(int32_t deviceId, int32_tscanCode, int32_t usageCode,

        int32_t* outKeycode, uint32_t* outFlags) const {

    AutoMutex_l(mLock);

    Device* device= getDeviceLocked(deviceId);

 

    if (device) {

        // Checkthe key character map first.

       sp<KeyCharacterMap> kcm = device->getKeyCharacterMap();

        if (kcm !=NULL) {

            if(!kcm->mapKey(scanCode, usageCode, outKeycode)) {

/*POWER键这个会检测不到,打印为:mapKey: scanCode=116, usageCode=0x00000000 ~Failed. */

               *outFlags = 0;

               return NO_ERROR;

            }

        }

 

        // Checkthe key layout next.

        if (device->keyMap.haveKeyLayout()){

            if(!device->keyMap.keyLayoutMap->mapKey(

                   scanCode, usageCode, outKeycode, outFlags)) {

               return NO_ERROR;

            }

        }

    }

 

    *outKeycode =0;

    *outFlags = 0;

    returnNAME_NOT_FOUND;

}

 

        constsp<KeyCharacterMap>& getKeyCharacterMap() const {

            if(combinedKeyMap != NULL) {

                                    

               return combinedKeyMap;

            }

            returnkeyMap.keyCharacterMap;

        }

 

Step 2:

\frameworks\native\libs\input\ KeyLayoutMap.cpp

const KeyLayoutMap::Key* KeyLayoutMap::getKey(int32_tscanCode, int32_t usageCode) const {

    if (usageCode){

        ssize_tindex = mKeysByUsageCode.indexOfKey(usageCode);

        if (index>= 0) {

            return&mKeysByUsageCode.valueAt(index);

        }

    }

    if (scanCode) {

        ssize_tindex = mKeysByScanCode.indexOfKey(scanCode);/*加载的时候已经进行了配对,这个就跟进当前linux_code的值,直接获取到了配对的android的值。*/

 

        if (index>= 0) {

            return&mKeysByScanCode.valueAt(index);

        }

    }

    return NULL;

}

/*

mKeysByScanCode是在设备device创建的时候就建立好了的,scancode就是linux_code.上面的就可以直接调用的。mKeysByScanCode创建的步骤如下。

*/

Step 1:

\frameworks\native\services\inputflinger\ EventHub.cpp

 

status_t EventHub::openDeviceLocked(const char*devicePath) {

    charbuffer[80];

 

   ALOGV("Opening device: %s", devicePath);

 

    int fd =open(devicePath, O_RDWR | O_CLOEXEC);

    ……

 

    // Load the keymap.

    // We need todo this for joysticks too because the key layout may specify axes.

    status_tkeyMapStatus = NAME_NOT_FOUND;

    if(device->classes & (INPUT_DEVICE_CLASS_KEYBOARD |INPUT_DEVICE_CLASS_JOYSTICK)) {

        // Load thekeymap for the device.

       keyMapStatus = loadKeyMapLocked(device);/*创建device的时候,就会加载对应的map*/

    }

    // Configurethe keyboard, gamepad or virtual keyboard.

    if(device->classes & INPUT_DEVICE_CLASS_KEYBOARD) {

        // Registerthe keyboard as a built-in keyboard if it is eligible.

        if(!keyMapStatus

               && mBuiltInKeyboardId == NO_BUILT_IN_KEYBOARD

               && isEligibleBuiltInKeyboard(device->identifier,

                       device->configuration, &device->keyMap)) {

            mBuiltInKeyboardId= device->id;

        }

 

STEP 2

status_t EventHub::loadKeyMapLocked(Device* device) {

    returndevice->keyMap.load(device->identifier,device->configuration);

}

 

STEP 3

\frameworks\native\libs\input\Keyboard.cpp

 

status_t KeyMap::load(const InputDeviceIdentifier&deviceIdenfifier,

        constPropertyMap* deviceConfiguration) {

    // Use theconfigured key layout if available.

    if(deviceConfiguration) {/*自己定义的映射文件才会有,默认是没有的*/

        String8keyLayoutName;

        if(deviceConfiguration->tryGetProperty(String8("keyboard.layout"),

               keyLayoutName)) {

           status_t status = loadKeyLayout(deviceIdenfifier, keyLayoutName);

            if(status == NAME_NOT_FOUND) {

               ALOGE("Configuration for keyboard device '%s' requested keyboardlayout '%s' but "

                       "it was not found.",

                       deviceIdenfifier.name.string(), keyLayoutName.string());

            }

        }

 

        String8keyCharacterMapName;

        if(deviceConfiguration->tryGetProperty(String8("keyboard.characterMap"),

               keyCharacterMapName)) {

           status_t status = loadKeyCharacterMap(deviceIdenfifier,keyCharacterMapName);

            if(status == NAME_NOT_FOUND) {

               ALOGE("Configuration for keyboard device '%s' requested keyboardcharacter "

                       "map '%s' but it was not found.",

                       deviceIdenfifier.name.string(), keyLayoutName.string());

            }

        }

 

        if(isComplete()) {

            returnOK;

        }

    }

 

    // Trysearching by device identifier.

    if(probeKeyMap(deviceIdenfifier, String8::empty())) {

        return OK;

    }

 

    // Fall back onthe Generic key map.

    // TODO Applysome additional heuristics here to figure out what kind of

    //      generic key map to use (US English, etc.)for typical external keyboards.

    if (probeKeyMap(deviceIdenfifier,String8("Generic"))) { /*没有特别的定义,一般会 android系统自带的Generic.kl*/

        return OK;

    }

 

    // Try theVirtual key map as a last resort.

    if(probeKeyMap(deviceIdenfifier, String8("Virtual"))) {

        return OK;

    }

 

    // Give up!

   ALOGE("Could not determine key map for device '%s' and no defaultkey maps were found!",

           deviceIdenfifier.name.string());

    returnNAME_NOT_FOUND;

}

 

 

STEP 4:

\frameworks\native\libs\input\Keyboard.cpp

 

bool KeyMap::probeKeyMap(const InputDeviceIdentifier&deviceIdentifier,

        constString8& keyMapName) {

    if(!haveKeyLayout()) {

        loadKeyLayout(deviceIdentifier, keyMapName);

    }

    if(!haveKeyCharacterMap()) {

       loadKeyCharacterMap(deviceIdentifier, keyMapName);

    }

    returnisComplete();

}

 

Step 5:

 

status_t KeyMap::loadKeyLayout(constInputDeviceIdentifier& deviceIdentifier,

        constString8& name) {

    String8path(getPath(deviceIdentifier, name,

           INPUT_DEVICE_CONFIGURATION_FILE_TYPE_KEY_LAYOUT));

    if(path.isEmpty()) {

        returnNAME_NOT_FOUND;

    }

 

    status_t status= KeyLayoutMap::load(path,&keyLayoutMap);

    if (status) {

        returnstatus;

    }

 

   keyLayoutFile.setTo(path);

    return OK;

}

 

STEP 6:

 

\frameworks\native\libs\input\ KeyLayoutMap.cpp

 

status_t KeyLayoutMap::load(const String8& filename,sp<KeyLayoutMap>* outMap) {

   outMap->clear();

 

    Tokenizer*tokenizer;

    status_t status= Tokenizer::open(filename, &tokenizer);

    if (status) {

       ALOGE("Error %d opening key layout map file %s.", status,filename.string());

    } else {

       sp<KeyLayoutMap> map = new KeyLayoutMap();

        if(!map.get()) {

           ALOGE("Error allocating key layout map.");

            status= NO_MEMORY;

        } else {

#if DEBUG_PARSER_PERFORMANCE

            nsecs_t startTime =systemTime(SYSTEM_TIME_MONOTONIC);

#endif

            Parser parser(map.get(), tokenizer);

            status= parser.parse();

#if DEBUG_PARSER_PERFORMANCE

            nsecs_telapsedTime = systemTime(SYSTEM_TIME_MONOTONIC) - startTime;

           ALOGD("Parsed key layout map file '%s' %d lines in %0.3fms.",

                   tokenizer->getFilename().string(), tokenizer->getLineNumber(),

                   elapsedTime / 1000000.0);

#endif

            if(!status) {

               *outMap = map;

            }

        }

        deletetokenizer;

    }

    return status;

}

 

 

STEP 7:

\frameworks\native\libs\input\ KeyLayoutMap.cpp

 

status_t KeyLayoutMap::Parser::parse() {

    while(!mTokenizer->isEof()) {

#if DEBUG_PARSER

       ALOGD("Parsing %s: '%s'.",mTokenizer->getLocation().string(),

               mTokenizer->peekRemainderOfLine().string());

#endif

 

       mTokenizer->skipDelimiters(WHITESPACE);

 

        if(!mTokenizer->isEol() && mTokenizer->peekChar() != '#') {

            String8keywordToken = mTokenizer->nextToken(WHITESPACE);

            if(keywordToken == "key") {

               mTokenizer->skipDelimiters(WHITESPACE);

               status_t status = parseKey();

                if(status) return status;

            } elseif (keywordToken == "axis") {

               mTokenizer->skipDelimiters(WHITESPACE);

               status_t status = parseAxis();

                if(status) return status;

            } elseif (keywordToken == "led") {

               mTokenizer->skipDelimiters(WHITESPACE);

               status_t status = parseLed();

                if(status) return status;

            } else{

               ALOGE("%s: Expected keyword, got '%s'.", mTokenizer->getLocation().string(),

                       keywordToken.string());

               return BAD_VALUE;

            }

 

           mTokenizer->skipDelimiters(WHITESPACE);

            if(!mTokenizer->isEol() && mTokenizer->peekChar() != '#') {

                ALOGE("%s: Expected end ofline or trailing comment, got '%s'.",

                       mTokenizer->getLocation().string(),

                       mTokenizer->peekRemainderOfLine().string());

               return BAD_VALUE;

            }

        }

 

       mTokenizer->nextLine();

    }

    returnNO_ERROR;

}

 

STEP 8:

\frameworks\native\libs\input\ KeyLayoutMap.cpp

 

status_t KeyLayoutMap::Parser::parseKey() {

String8 codeToken =mTokenizer->nextToken(WHITESPACE);

bool mapUsage = false;

if (codeToken == “usage”) {

        mapUsage =true;

       mTokenizer->skipDelimiters(WHITESPACE);

        codeToken =mTokenizer->nextToken(WHITESPACE);

}

 

char* end;

int32_t code = int32_t(strtol(codeToken.string(), &end, 0));

if (*end) {

        ALOGE(“%s:Expected key %s number, got ‘%s’.”, mTokenizer->getLocation().string(),

               mapUsage ? “usage” : “scan code”, codeToken.string());

        returnBAD_VALUE;

}

KeyedVector<int32_t, Key>& map =mapUsage ? mMap->mKeysByUsageCode : mMap->mKeysByScanCode; /*这里的map就是上面的mKeysByScanCodemKeysByScanCode中有配对的codekeyCode就是android_KEY,KEY就是linux_key.上面的调用就是通过从下面获取的KEY来通过generic.kl找到对应的android_key */

if (map.indexOfKey(code) >= 0) {

        ALOGE(“%s:Duplicate entry for key %s ‘%s’.”, mTokenizer->getLocation().string(),

               mapUsage ? “usage” : “scan code”, codeToken.string());

        returnBAD_VALUE;

}

 

mTokenizer->skipDelimiters(WHITESPACE);

String8 keyCodeToken =mTokenizer->nextToken(WHITESPACE);

int32_t keyCode = getKeyCodeByLabel(keyCodeToken.string());

if (!keyCode) {

        ALOGE(“%s:Expected key code label, got ‘%s’.”, mTokenizer->getLocation().string(),

               keyCodeToken.string());

        returnBAD_VALUE;

}

 

uint32_t flags = 0;

for (;;) {

       mTokenizer->skipDelimiters(WHITESPACE);

        if(mTokenizer->isEol() || mTokenizer->peekChar() == ‘#’) break;

 

        String8flagToken = mTokenizer->nextToken(WHITESPACE);

        uint32_tflag = getKeyFlagByLabel(flagToken.string());

        if (!flag){

            ALOGE(“%s:Expected key flag label, got ‘%s’.”, mTokenizer->getLocation().string(),

                   flagToken.string());

            returnBAD_VALUE;

        }

        if (flags& flag) {

            ALOGE(“%s:Duplicate key flag ‘%s’.”, mTokenizer->getLocation().string(),

                   flagToken.string());

            returnBAD_VALUE;

        }

        flags |= flag;

}

 

#if DEBUG_PARSER

ALOGD(“Parsed key %s: code=%d, keyCode=%d,flags=0x%08x.”,

           mapUsage ? “usage” : “scan code”, code, keyCode, flags);

#endif

Key key;

key.keyCode = keyCode;

key.flags = flags;

    map.add(code, key);/*键值对加入到MAP*/

    returnNO_ERROR;

}

 

注释:

普通手机或者平板常用的为音量加减,POWER按键,加载的都是generic.kl;generic.kcm则为字符按键。其处理流程与KL的大体相似,以后碰到在学习吧,这里就不进一步分析了。

 

 

system\usr\keylayout\ Generic.kl

 

key 1     ESCAPE

key 2     1

key 3     2

key 4     3

key 5     4

key 6     5

key 7     6

key 8     7

key 9     8

key 10    9

key 11    0

key 12    MINUS

key 13    EQUALS

key 14    DEL

key 15    TAB

key 16    Q

key 17    W

key 18    E

key 19    R

key 20    T

key 21    Y

key 22    U

key 23    I

key 24    O

key 25    P

key 26   LEFT_BRACKET

key 27   RIGHT_BRACKET

key 28    ENTER

key 29    CTRL_LEFT

key 30    A

key 31    S

key 32    D

key 33    F

key 34    G

key 35    H

key 36    J

key 37    K

key 38    L

key 39    SEMICOLON

key 40   APOSTROPHE

key 41    GRAVE

key 42   SHIFT_LEFT

key 43    BACKSLASH

key 44    Z

key 45    X

key 46    C

key 47    V

key 48    B

key 49    N

key 50    M

key 51    COMMA

key 52    PERIOD

key 53    SLASH

key 54   SHIFT_RIGHT

key 55   NUMPAD_MULTIPLY

key 56    ALT_LEFT

key 57    SPACE

key 58    CAPS_LOCK

key 59    F1

key 60    F2

key 61    F3

key 62    F4

key 63    F5

key 64    F6

key 65    F7

key 66    F8

key 67    F9

key 68    F10

key 69    NUM_LOCK

key 70   SCROLL_LOCK

key 71    NUMPAD_7

key 72    NUMPAD_8

key 73    NUMPAD_9

key 74   NUMPAD_SUBTRACT

key 75    NUMPAD_4

key 76    NUMPAD_5

key 77    NUMPAD_6

key 78   NUMPAD_ADD

key 79    NUMPAD_1

key 80    NUMPAD_2

key 81    NUMPAD_3

key 82    NUMPAD_0

key 83   NUMPAD_DOT

# key 84 (undefined)

key 85   ZENKAKU_HANKAKU

key 86    BACKSLASH

key 87    F11

key 88    F12

key 89    RO

# key 90 "KEY_KATAKANA"

# key 91 "KEY_HIRAGANA"

key 92    HENKAN

key 93   KATAKANA_HIRAGANA

key 94    MUHENKAN

key 95   NUMPAD_COMMA

key 96   NUMPAD_ENTER

key 97   CTRL_RIGHT

key 98   NUMPAD_DIVIDE

key 99    SYSRQ

key 100   ALT_RIGHT

# key 101 "KEY_LINEFEED"

key 102   MOVE_HOME

key 103   DPAD_UP

key 104   PAGE_UP

key 105   DPAD_LEFT

key 106  DPAD_RIGHT

key 107   MOVE_END

key 108   DPAD_DOWN

key 109   PAGE_DOWN

key 110   INSERT

key 111  FORWARD_DEL

# key 112 "KEY_MACRO"

key 113  VOLUME_MUTE

key 114  VOLUME_DOWN

key 115   VOLUME_UP

key 116   POWER

key 117   NUMPAD_EQUALS

# key 118 "KEY_KPPLUSMINUS"

key 119   BREAK

# key 120 (undefined)

key 121  NUMPAD_COMMA

key 122   KANA

key 123   EISU

key 124   YEN

key 125   META_LEFT

key 126  META_RIGHT

key 127   MENU

key 128  MEDIA_STOP

# key 129 "KEY_AGAIN"

# key 130 "KEY_PROPS"

# key 131 "KEY_UNDO"

# key 132 "KEY_FRONT"

# key 133 "KEY_COPY"

# key 134 "KEY_OPEN"

# key 135 "KEY_PASTE"

# key 136 "KEY_FIND"

# key 137 "KEY_CUT"

# key 138 "KEY_HELP"

key 139   MENU

key 140  CALCULATOR

# key 141 "KEY_SETUP"

key 142   SLEEP

key 143   WAKEUP

# key 144 "KEY_FILE"

# key 145 "KEY_SENDFILE"

# key 146 "KEY_DELETEFILE"

# key 147 "KEY_XFER"

# key 148 "KEY_PROG1"

# key 149 "KEY_PROG2"

key 150   EXPLORER

# key 151 "KEY_MSDOS"

key 152   POWER

# key 153 "KEY_DIRECTION"

# key 154 "KEY_CYCLEWINDOWS"

key 155   ENVELOPE

key 156   BOOKMARK

# key 157 "KEY_COMPUTER"

key 158   BACK

key 159   FORWARD

key 160  MEDIA_CLOSE

key 161  MEDIA_EJECT

key 162  MEDIA_EJECT

key 163  MEDIA_NEXT

key 164  MEDIA_PLAY_PAUSE

key 165   MEDIA_PREVIOUS

key 166  MEDIA_STOP

key 167  MEDIA_RECORD

key 168  MEDIA_REWIND

key 169   CALL

# key 170 "KEY_ISO"

key 171   MUSIC

key 172   HOME

# key 173 "KEY_REFRESH"

# key 174 "KEY_EXIT"

# key 175 "KEY_MOVE"

# key 176 "KEY_EDIT"

key 177   PAGE_UP

key 178   PAGE_DOWN

key 179  NUMPAD_LEFT_PAREN

key 180  NUMPAD_RIGHT_PAREN

# key 181 "KEY_NEW"

# key 182 "KEY_REDO"

# key 183   F13

# key 184   F14

# key 185   F15

# key 186   F16

# key 187   F17

# key 188   F18

# key 189   F19

# key 190   F20

# key 191   F21

# key 192   F22

# key 193   F23

# key 194   F24

# key 195 (undefined)

# key 196 (undefined)

# key 197 (undefined)

# key 198 (undefined)

# key 199 (undefined)

key 200  MEDIA_PLAY

key 201  MEDIA_PAUSE

# key 202 "KEY_PROG3"

# key 203 "KEY_PROG4"

# key 204 (undefined)

# key 205 "KEY_SUSPEND"

# key 206 "KEY_CLOSE"

key 207  MEDIA_PLAY

key 208  MEDIA_FAST_FORWARD

# key 209 "KEY_BASSBOOST"

# key 210 "KEY_PRINT"

# key 211 "KEY_HP"

key 212   CAMERA

key 213   MUSIC

# key 214 "KEY_QUESTION"

key 215   ENVELOPE

# key 216 "KEY_CHAT"

key 217   SEARCH

# key 218 "KEY_CONNECT"

# key 219 "KEY_FINANCE"

# key 220 "KEY_SPORT"

# key 221 "KEY_SHOP"

# key 222 "KEY_ALTERASE"

# key 223 "KEY_CANCEL"

key 224  BRIGHTNESS_DOWN

key 225  BRIGHTNESS_UP

key 226   HEADSETHOOK

 

key 256   BUTTON_1

key 257   BUTTON_2

key 258   BUTTON_3

key 259   BUTTON_4

key 260   BUTTON_5

key 261   BUTTON_6

key 262   BUTTON_7

key 263   BUTTON_8

key 264   BUTTON_9

key 265   BUTTON_10

key 266   BUTTON_11

key 267   BUTTON_12

key 268   BUTTON_13

key 269   BUTTON_14

key 270   BUTTON_15

key 271   BUTTON_16

 

key 288   BUTTON_1

key 289   BUTTON_2

key 290   BUTTON_3

key 291   BUTTON_4

key 292   BUTTON_5

key 293   BUTTON_6

key 294   BUTTON_7

key 295   BUTTON_8

key 296   BUTTON_9

key 297   BUTTON_10

key 298   BUTTON_11

key 299   BUTTON_12

key 300   BUTTON_13

key 301   BUTTON_14

key 302   BUTTON_15

key 303   BUTTON_16

 

 

key 304   BUTTON_A

key 305   BUTTON_B

key 306   BUTTON_C

key 307   BUTTON_X

key 308   BUTTON_Y

key 309   BUTTON_Z

key 310   BUTTON_L1

key 311   BUTTON_R1

key 312   BUTTON_L2

key 313   BUTTON_R2

key 314  BUTTON_SELECT

key 315  BUTTON_START

key 316  BUTTON_MODE

key 317  BUTTON_THUMBL

key 318  BUTTON_THUMBR

 

 

# key 352 "KEY_OK"

key 353  DPAD_CENTER

# key 354 "KEY_GOTO"

# key 355 "KEY_CLEAR"

# key 356 "KEY_POWER2"

# key 357 "KEY_OPTION"

# key 358 "KEY_INFO"

# key 359 "KEY_TIME"

# key 360 "KEY_VENDOR"

# key 361 "KEY_ARCHIVE"

key 362   GUIDE

# key 363 "KEY_CHANNEL"

# key 364 "KEY_FAVORITES"

# key 365 "KEY_EPG"

key 366   DVR

# key 367 "KEY_MHP"

# key 368 "KEY_LANGUAGE"

# key 369 "KEY_TITLE"

# key 370 "KEY_SUBTITLE"

# key 371 "KEY_ANGLE"

# key 372 "KEY_ZOOM"

# key 373 "KEY_MODE"

# key 374 "KEY_KEYBOARD"

# key 375 "KEY_SCREEN"

# key 376 "KEY_PC"

key 377   TV

# key 378 "KEY_TV2"

# key 379 "KEY_VCR"

# key 380 "KEY_VCR2"

# key 381 "KEY_SAT"

# key 382 "KEY_SAT2"

# key 383 "KEY_CD"

# key 384 "KEY_TAPE"

# key 385 "KEY_RADIO"

# key 386 "KEY_TUNER"

# key 387 "KEY_PLAYER"

# key 388 "KEY_TEXT"

# key 389 "KEY_DVD"

# key 390 "KEY_AUX"

# key 391 "KEY_MP3"

# key 392 "KEY_AUDIO"

# key 393 "KEY_VIDEO"

# key 394 "KEY_DIRECTORY"

# key 395 "KEY_LIST"

# key 396 "KEY_MEMO"

key 397   CALENDAR

# key 398 "KEY_RED"

# key 399 "KEY_GREEN"

# key 400 "KEY_YELLOW"

# key 401 "KEY_BLUE"

key 402  CHANNEL_UP

key 403  CHANNEL_DOWN

# key 404 "KEY_FIRST"

# key 405 "KEY_LAST"

# key 406 "KEY_AB"

# key 407 "KEY_NEXT"

# key 408 "KEY_RESTART"

# key 409 "KEY_SLOW"

# key 410 "KEY_SHUFFLE"

# key 411 "KEY_BREAK"

# key 412 "KEY_PREVIOUS"

# key 413 "KEY_DIGITS"

# key 414 "KEY_TEEN"

# key 415 "KEY_TWEN"

 

key 429   CONTACTS

 

# key 448 "KEY_DEL_EOL"

# key 449 "KEY_DEL_EOS"

# key 450 "KEY_INS_LINE"

# key 451 "KEY_DEL_LINE"

 

 

key 464   FUNCTION

key 465  ESCAPE            FUNCTION

key 466   F1                FUNCTION

key 467   F2                FUNCTION

key 468   F3                FUNCTION

key 469   F4                FUNCTION

key 470   F5                FUNCTION

key 471   F6                FUNCTION

key 472   F7                FUNCTION

key 473   F8                FUNCTION

key 474   F9                FUNCTION

key 475   F10               FUNCTION

key 476   F11               FUNCTION

key 477   F12               FUNCTION

key 478   1                 FUNCTION

key 479   2                 FUNCTION

key 480   D                 FUNCTION

key 481   E                 FUNCTION

key 482   F                 FUNCTION

key 483   S                 FUNCTION

key 484   B                 FUNCTION

 

 

# key 497 KEY_BRL_DOT1

# key 498 KEY_BRL_DOT2

# key 499 KEY_BRL_DOT3

# key 500 KEY_BRL_DOT4

# key 501 KEY_BRL_DOT5

# key 502 KEY_BRL_DOT6

# key 503 KEY_BRL_DOT7

# key 504 KEY_BRL_DOT8

 

key 580  APP_SWITCH

key 582  VOICE_ASSIST

 

# Keys defined by HID usages

key usage 0x0c006F BRIGHTNESS_UP

key usage 0x0c0070 BRIGHTNESS_DOWN

 

# Joystick and game controller axes.

# Axes that are not mapped will be assigned generic axisnumbers by the input subsystem.

axis 0x00 X

axis 0x01 Y

axis 0x02 Z

axis 0x03 RX

axis 0x04 RY

axis 0x05 RZ

axis 0x06 THROTTLE

axis 0x07 RUDDER

axis 0x08 WHEEL

axis 0x09 GAS

axis 0x0a BRAKE

axis 0x10 HAT_X

axis 0x11 HAT_Y

 

# LEDs

led 0x00 NUM_LOCK

led 0x01 CAPS_LOCK

led 0x02 SCROLL_LOCK

led 0x03 COMPOSE

led 0x04 KANA

led 0x05 SLEEP

led 0x06 SUSPEND

led 0x07 MUTE

led 0x08 MISC

led 0x09 MAIL

led 0x0a CHARGING

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值