Android添加新键值

platform
  mstar828
  Android 5.0.1

添加按键F13(内核中已经定义键值为183),在android上层自定义键值映射600,流程如下:

  • frameworks/base/data/keyboards/Generic.kl
......

key 183   F13
  • frameworks/native/include/input/InputEventLabels.h
static const InputEventLabel KEYCODES[] = {

    ......

    DEFINE_KEYCODE(F13),
    { NULL, 0 }
};
  • frameworks/native/include/android/keycodes.h
enum {

    ......

    AKEYCODE_F13 = 600,
}
  • frameworks/base/core/res/res/values/attr.xml
<attr>

    ......

    <enum name="KEYCODE_F13" value="600" />
</attr>
  • frameworks/base/core/java/android/view/KeyEevent.java
public class KeyEvent extends InputEvent implements Parcelable {

    ......

    public static final int KEYCODE_F13 = 600;     
}
  • frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {

    ......

    switch (keyCode) {
        case KeyEvent.KEYCODE_F13:{

            ......

            break;
        }
    }

}
<think>我们正在处理一个关于在HID键盘数组中添加键值的问题。根据提供的引用和上下文,用户希望了解如何向`hid_keyboard`数组添加键值。以下是我的思考过程: 1. **理解问题**:用户提到“我想在hid_keyboard数组中添加键值”,这表明用户需要修改HID键盘驱动以支持的按键。引用[5]提到在Android添加自定义键值,涉及修改Linux内核的输入头文件和HID驱动。 2. **分析引用**: - 引用[5]:介绍了在Linux内核中添加自定义键值的两个步骤: a. 在`include/uapi/linux/input.h`中添加键值定义(例如`#define KEY_LXL 123`)。 b. 在`drivers/hid/hid-input.c`中的映射数组中添加对应的映射项。 - 引用[1]和[2]:涉及键值映射到Android层以及应用获取键值的方法,但用户的问题更偏向底层驱动。 - 引用[4]:展示了STM32CubeMX中HID键盘报文的示例,说明键码值如何通过报告描述符传递。 3. **关键步骤**: - 在Linux内核中,HID键盘的键值映射通常通过`hid_keyboard`数组(或类似结构)实现。该数组定义了从HID Usage ID到Linux键码(KEY_*)的映射。 - 添加键值需要: a. 定义一个的Linux键码(如果尚未定义)。 b. 在`hid_keyboard`数组中添加一个映射项,将HID Usage ID映射到该键码。 4. **具体操作**: - **步骤1:定义的键码**(如果按键的Usage ID没有对应的键码): 在`include/uapi/linux/input-event-codes.h`(旧版本可能在`input.h`)中添加的键码,例如: ```c #define KEY_NEWKEY 240 // 选择一个未使用的值(通常大于139) ``` - **步骤2:在HID驱动中添加映射**: 找到`hid_keyboard`数组(通常在`drivers/hid/hid-input.c`),并添加的映射项。例如: ```c static const struct hid_usage_id hid_keyboard[] = { { HID_UP_KEYBOARD, 0x01, KEY_ESC }, ... // 现有映射 { HID_UP_KEYBOARD, 0x65, KEY_NEWKEY }, // 假设0x65是按键的HID Usage ID { } // 结束标记 }; ``` - **步骤3:重编译内核并更**。 5. **注意事项**: - 确保选择的键码值在Linux输入子系统允许的范围内(0-255)。 - 修改内核需要重编译并刷入设备。 - 如果按键是标准HID键盘按键,其Usage ID应参考HID使用表(HID Usage Tables)。 6. **用户可能的深层需求**:用户可能希望自定义一个物理按键的功能,或者支持一个非标准键盘的按键。因此,除了内核修改,还需要考虑上层(如Android)的键值映射(如`kl`文件)和应用层处理。 7. **生成相关问题**:基于此,可以生成一些相关问题,帮助用户深入理解或解决可能遇到的问题。 现在,我将按照要求组织回答,使用中文,并确保格式正确。</think>### 如何在 `hid_keyboard` 数组中添加键值 在 Linux HID 驱动中添加键值需修改内核代码,主要涉及两个步骤(以 Linux 5.10 内核为例): #### 1. **定义键值(Linux 层)** - 编辑头文件 `include/uapi/linux/input-event-codes.h` 在 `KEY_MAX` 前添加自定义键值(值需在 139-255 范围内): ```c #define KEY_CUSTOM1 240 // 示例:自定义键值 240 ``` #### 2. **修改 `hid_keyboard` 映射数组** - 编辑 `drivers/hid/hid-input.c` 在 `hid_keyboard` 数组中添加 HID Usage ID 到 Linux 键值的映射: ```c static const struct hid_usage_id hid_keyboard[] = { ... // 原有映射 { HID_UP_KEYBOARD, 0x65, KEY_CUSTOM1 }, // 示例:HID Usage 0x65 映射到 KEY_CUSTOM1 { } // 结束标记 }; ``` **参数说明**: - `HID_UP_KEYBOARD`:HID 使用页(键盘设备) - `0x65`:HID Usage ID(需参考 [HID Usage Tables]) - `KEY_CUSTOM1`:上一步定义的 Linux 键值 #### 3. **同步 Android 层(可选)** - 修改按键布局文件(`.kl` 文件)将 Linux 键值映射到 Android 键值: ``` key 240 MEDIA_PLAY_PAUSE # 示例:将 KEY_CUSTOM1 映射为播放/暂停 ``` - 在 App 中通过 `onKeyDown` 捕获键值: ```java public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE) { // 处理自定义按键 } } ``` #### 注意事项: 1. **HID Usage ID 选择** 需确保按键的 Usage ID 符合 [HID Usage Tables] 规范(如多媒体键常用 `0xCD-0xE8` 范围)。 2. **键值冲突** 通过 `cat /proc/bus/input/devices` 确认键值未被占用。 3. **内核编译** 修改后需重编译内核并刷入设备。 4. **USB HID 报告描述符** 若为自定义硬件,需同步修改设备的报告描述符(参考引用[4]的报文结构)。 > **示例场景**:添加一个 "F11" 键(HID Usage ID `0x44`) > - 内核层:`{ HID_UP_KEYBOARD, 0x44, KEY_F11 }` > - Android 层:`.kl` 文件添加 `key 546 F11`(引用[2]) --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值