输入子系统¶
输入核心¶
- 
struct input_value¶
- 输入值表示 
定义:
struct input_value {
    __u16 type;
    __u16 code;
    __s32 value;
};
成员
- type
- 值的类型 (EV_KEY, EV_ABS, 等) 
- code
- 值代码 
- value
- 值 
- 
struct input_dev¶
- 表示一个输入设备 
定义:
struct input_dev {
    const char *name;
    const char *phys;
    const char *uniq;
    struct input_id id;
    unsigned long propbit[BITS_TO_LONGS(INPUT_PROP_CNT)];
    unsigned long evbit[BITS_TO_LONGS(EV_CNT)];
    unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];
    unsigned long relbit[BITS_TO_LONGS(REL_CNT)];
    unsigned long absbit[BITS_TO_LONGS(ABS_CNT)];
    unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)];
    unsigned long ledbit[BITS_TO_LONGS(LED_CNT)];
    unsigned long sndbit[BITS_TO_LONGS(SND_CNT)];
    unsigned long ffbit[BITS_TO_LONGS(FF_CNT)];
    unsigned long swbit[BITS_TO_LONGS(SW_CNT)];
    unsigned int hint_events_per_packet;
    unsigned int keycodemax;
    unsigned int keycodesize;
    void *keycode;
    int (*setkeycode)(struct input_dev *dev,const struct input_keymap_entry *ke, unsigned int *old_keycode);
    int (*getkeycode)(struct input_dev *dev, struct input_keymap_entry *ke);
    struct ff_device *ff;
    struct input_dev_poller *poller;
    unsigned int repeat_key;
    struct timer_list timer;
    int rep[REP_CNT];
    struct input_mt *mt;
    struct input_absinfo *absinfo;
    unsigned long key[BITS_TO_LONGS(KEY_CNT)];
    unsigned long led[BITS_TO_LONGS(LED_CNT)];
    unsigned long snd[BITS_TO_LONGS(SND_CNT)];
    unsigned long sw[BITS_TO_LONGS(SW_CNT)];
    int (*open)(struct input_dev *dev);
    void (*close)(struct input_dev *dev);
    int (*flush)(struct input_dev *dev, struct file *file);
    int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value);
    struct input_handle __rcu *grab;
    spinlock_t event_lock;
    struct mutex mutex;
    unsigned int users;
    bool going_away;
    struct device dev;
    struct list_head        h_list;
    struct list_head        node;
    unsigned int num_vals;
    unsigned int max_vals;
    struct input_value *vals;
    bool devres_managed;
    ktime_t timestamp[INPUT_CLK_MAX];
    bool inhibited;
};
成员
- name
- 设备名称 
- phys
- 设备在系统层次结构中的物理路径 
- uniq
- 设备的唯一标识码 (如果设备有) 
- id
- 设备的 ID (struct input_id) 
- propbit
- 设备属性和怪癖的位图 
- evbit
- 设备支持的事件类型位图 (EV_KEY, EV_REL, 等) 
- keybit
- 此设备拥有的键/按钮位图 
- relbit
- 设备的相对轴位图 
- absbit
- 设备的绝对轴位图 
- mscbit
- 设备支持的杂项事件位图 
- ledbit
- 设备上存在的 LED 位图 
- sndbit
- 设备支持的声音效果位图 
- ffbit
- 设备支持的力反馈效果位图 
- swbit
- 设备上存在的开关位图 
- hint_events_per_packet
- 设备在一个数据包中生成的平均事件数 (在 EV_SYN/SYN_REPORT 事件之间)。事件处理程序使用它来估计保存事件所需的缓冲区大小。 
- keycodemax
- keycode 表的大小 
- keycodesize
- keycode 表中元素的大小 
- keycode
- 此设备的扫描码到 keycode 的映射 
- setkeycode
- 用于更改当前 keymap 的可选方法,用于实现稀疏 keymap。 如果未提供,将使用默认机制。 该方法在持有 event_lock 时被调用,因此不得休眠 
- getkeycode
- 用于检索当前 keymap 的可选旧方法。 
- ff
- 如果设备支持力反馈效果,则与设备关联的力反馈结构 
- poller
- 如果设备设置为使用轮询模式,则与设备关联的轮询器结构 
- repeat_key
- 存储上次按下的键的代码; 用于实现软件自动重复 
- timer
- 用于软件自动重复的定时器 
- rep
- 自动重复参数 (延迟,速率) 的当前值 
- mt
- 指向多点触控状态的指针 
- absinfo
- struct input_absinfo元素的数组,保存有关绝对轴的信息 (当前值,最小,最大,平坦,模糊,分辨率)
- key
- 反映设备键/按钮的当前状态 
- led
- 反映设备 LED 的当前状态 
- snd
- 反映声音效果的当前状态 
- sw
- 反映设备开关的当前状态 
- open
- 当第一个用户调用 - input_open_device()时调用此方法。 驱动程序必须准备好设备以开始生成事件 (启动轮询线程,请求 IRQ,提交 URB 等)。 open() 的含义是开始向输入核心提供事件。
- close
- 当最后一个用户调用 - input_close_device()时调用此方法。 close() 的含义是停止向输入核心提供事件。
- flush
- 清除设备。 最常用于在断开连接时摆脱加载到设备中的力反馈效果 
- event
- 事件处理程序,用于发送 _to_ 设备的事件,例如 EV_LED 或 EV_SND。 期望设备执行请求的操作 (打开 LED,播放声音等)。 调用受 event_lock 保护,不得休眠 
- grab
- 当前已抓取设备的输入句柄 (通过 EVIOCGRAB ioctl)。 当句柄抓取设备时,它将成为来自该设备的所有输入事件的唯一接收者 
- event_lock
- 当输入核心接收并处理设备的新事件时 (在 - input_event()中) 获取此自旋锁。 在设备已向输入核心注册后访问和/或修改设备参数 (例如 keymap 或 absmin, absmax, absfuzz 等) 的代码必须获取此锁。
- mutex
- 序列化对 open(),close() 和 flush() 方法的调用 
- users
- 存储打开此设备的用户 (输入处理程序) 数。 - input_open_device()和- input_close_device()使用它来确保仅在第一个用户打开设备时调用 dev->open(),并且仅在最后一个用户关闭设备时调用 dev->close()
- going_away
- 标记正在注销的设备,并导致 input_open_device*() 失败并显示 -ENODEV。 
- dev
- 设备模型对此设备的视图 
- h_list
- 与设备关联的输入句柄列表。 访问列表时,必须持有 dev->mutex 
- node
- 用于将设备放置到 input_dev_list 上 
- num_vals
- 当前帧中排队的值的数量 
- max_vals
- 帧中排队的最大值数量 
- vals
- 当前帧中排队的值的数组 
- devres_managed
- 表示设备由 devres 框架管理,不需要显式注销或释放。 
- timestamp
- 用于存储驱动程序调用的 input_set_timestamp 设置的时间戳 
- inhibited
- 表示输入设备被抑制。 如果是这种情况,则输入核心会忽略设备生成的任何事件。 当设备被抑制时,会调用设备的 close(),当设备被取消抑制时,会调用其 open()。 
- 
struct input_handler¶
- 实现输入设备的接口之一 
定义:
struct input_handler {
    void *private;
    void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value);
    unsigned int (*events)(struct input_handle *handle, struct input_value *vals, unsigned int count);
    bool (*filter)(struct input_handle *handle, unsigned int type, unsigned int code, int value);
    bool (*match)(struct input_handler *handler, struct input_dev *dev);
    int (*connect)(struct input_handler *handler, struct input_dev *dev, const struct input_device_id *id);
    void (*disconnect)(struct input_handle *handle);
    void (*start)(struct input_handle *handle);
    bool passive_observer;
    bool legacy_minors;
    int minor;
    const char *name;
    const struct input_device_id *id_table;
    struct list_head        h_list;
    struct list_head        node;
};
成员
- private
- 驱动程序特定数据 
- event
- 事件处理程序。 输入核心在禁用中断并持有 dev->event_lock 自旋锁的情况下调用此方法,因此它可能不会休眠 
- events
- 事件序列处理程序。 输入核心在禁用中断并持有 dev->event_lock 自旋锁的情况下调用此方法,因此它可能不会休眠。 该方法必须返回传递给它的事件数。 
- filter
- 与 event 类似; 将常规事件处理程序与“过滤器”分开。 
- match
- 在将设备的 ID 与处理程序的 id_table 进行比较后调用,以执行设备和处理程序之间的精细匹配 
- connect
- 在将处理程序附加到输入设备时调用 
- disconnect
- 从输入设备断开处理程序 
- start
- 为给定的句柄启动处理程序。 此函数由输入核心在 connect() 方法之后立即调用,并且当“抓取”设备的进程释放它时也会调用 
- passive_observer
- 仅对观察来自设备的数据流感兴趣的驱动程序设置为 - true,如果存在其他用户。 当为它们的句柄调用- input_open_device()时,此类驱动程序不会导致启动底层硬件设备
- legacy_minors
- 使用旧次要范围的驱动程序设置为 - true
- minor
- 此驱动程序可以提供的设备的 32 个旧次要设备的范围的开始 
- name
- 处理程序的名称,显示在 /proc/bus/input/handlers 中 
- id_table
- 指向此驱动程序可以处理的 input_device_ids 表的指针 
- h_list
- 与处理程序关联的输入句柄列表 
- node
- 用于将驱动程序放置到 input_handler_list 上 
描述
输入处理程序附加到输入设备并创建输入句柄。 任何给定的输入设备可能同时附加多个处理程序。 所有这些处理程序都将获得由设备生成的输入事件的副本。
相同的结构用于实现输入过滤器。 输入核心允许过滤器首先运行,并且如果任何过滤器指示应该过滤该事件 (通过从它们的 filter() 方法返回 true) 则不会将事件传递给常规处理程序。
请注意,输入核心会序列化对 connect() 和 disconnect() 方法的调用。
- 
struct input_handle¶
- 将输入设备与输入处理程序链接 
定义:
struct input_handle {
    void *private;
    int open;
    const char *name;
    struct input_dev *dev;
    struct input_handler *handler;
    unsigned int (*handle_events)(struct input_handle *handle,struct input_value *vals, unsigned int count);
    struct list_head        d_node;
    struct list_head        h_node;
};
成员
- private
- 处理程序特定数据 
- open
- 计数器,显示句柄是否“打开”,即是否应从其设备传递事件 
- name
- 创建它的处理程序赋予句柄的名称 
- dev
- 句柄附加到的输入设备 
- handler
- 通过此句柄与设备一起使用的处理程序 
- handle_events
- 事件序列处理程序。 它由输入核心根据 handler 中指定的事件处理方法设置。 请参阅 input_handle_setup_event_handler()。 输入核心在禁用中断并持有 dev->event_lock 自旋锁的情况下调用此方法,因此它可能不会休眠。 
- d_node
- 用于将句柄放在设备的已附加句柄列表中 
- h_node
- 用于将句柄放在从中获取事件的处理程序句柄列表中 
参数
- struct input_dev *dev
- 驱动程序使用的输入设备 
- int n_events
- 调用 input_sync() 之间的平均事件数 
描述
如果从设备发送的事件速率异常大,请使用此函数设置预期的事件速率。 这将允许处理程序为事件流设置适当的缓冲区大小,以最大程度地减少信息丢失。
- 
struct ff_device¶
- 输入设备的力反馈部分 
定义:
struct ff_device {
    int (*upload)(struct input_dev *dev, struct ff_effect *effect, struct ff_effect *old);
    int (*erase)(struct input_dev *dev, int effect_id);
    int (*playback)(struct input_dev *dev, int effect_id, int value);
    void (*set_gain)(struct input_dev *dev, u16 gain);
    void (*set_autocenter)(struct input_dev *dev, u16 magnitude);
    void (*destroy)(struct ff_device *);
    void *private;
    unsigned long ffbit[BITS_TO_LONGS(FF_CNT)];
    struct mutex mutex;
    int max_effects;
    struct ff_effect *effects;
    struct file *effect_owners[] ;
};
成员
- upload
- 调用以将新效果上传到设备 
- erase
- 调用以从设备中擦除效果 
- playback
- 调用以请求设备开始播放指定的效果 
- set_gain
- 调用以设置指定的增益 
- set_autocenter
- 调用以自动对中设备 
- destroy
- 在销毁父输入设备时由输入核心调用 
- private
- 驱动程序特定数据,将自动释放 
- ffbit
- 设备真正支持的力反馈能力位图 (不是像 input_dev->ffbit 中那样模拟的) 
- mutex
- 用于序列化对设备的访问的互斥锁 
- max_effects
- 设备支持的最大效果数 
- effects
- 指向当前加载到设备中的效果数组的指针 
- effect_owners
- 效果所有者的数组; 当拥有效果的文件句柄关闭时,效果将自动擦除 
描述
每个力反馈设备必须实现 upload() 和 playback() 方法; erase() 是可选的。 仅当驱动程序设置 FF_GAIN 和 FF_AUTOCENTER 位时,才需要实现 set_gain() 和 set_autocenter()。
请注意,调用 playback(),set_gain() 和 set_autocenter() 时,将持有 dev->event_lock 自旋锁,并且中断已关闭,因此可能不会休眠。
参数
- struct input_dev *dev
- 生成事件的设备 
- unsigned int type
- 事件的类型 
- unsigned int code
- 事件代码 
- int value
- 事件的值 
描述
实现各种输入设备的驱动程序应使用此函数来报告输入事件。 另请参阅 input_inject_event()。
注意
可以在使用 input_allocate_device() 分配输入设备后立即安全地使用 input_event(),甚至在使用 input_register_device() 注册它之前,但是该事件将不会到达任何输入处理程序。 这种 input_event() 的早期调用可用于“播种”开关的初始状态或绝对轴的初始位置等。
- 
void input_inject_event(struct input_handle *handle, unsigned int type, unsigned int code, int value)¶
- 从输入处理程序发送输入事件 
参数
- struct input_handle *handle
- 用于发送事件的输入句柄 
- unsigned int type
- 事件的类型 
- unsigned int code
- 事件代码 
- int value
- 事件的值 
描述
类似于 input_event(),但如果设备被“抓取”并且注入事件的句柄不是拥有该设备的句柄,则会忽略该事件。
参数
- struct input_dev *dev
- 发出绝对事件的输入设备 
描述
如果调用者请求的 absinfo 结构体已经分配,此函数将不执行任何操作。
- 
void input_copy_abs(struct input_dev *dst, unsigned int dst_axis, const struct input_dev *src, unsigned int src_axis)¶
- 将 absinfo 从一个 input_dev 复制到另一个 input_dev 
参数
- struct input_dev *dst
- 要将 abs 设置复制到的目标输入设备 
- unsigned int dst_axis
- 选择目标轴的 ABS_* 值 
- const struct input_dev *src
- 要从中复制 abs 设置的源输入设备 
- unsigned int src_axis
- 选择源轴的 ABS_* 值 
描述
通过从指定的源输入设备的源轴复制,来设置所选目标轴的 absinfo。这对于设置组合式触摸屏/笔硬件的笔/手写笔输入设备非常有用,其中笔使用与触摸屏相同的坐标。
- 
int input_grab_device(struct input_handle *handle)¶
- 抓取设备以供独占使用 
参数
- struct input_handle *handle
- 想要拥有该设备的输入句柄 
描述
当设备被输入句柄抓取时,设备生成的所有事件都只传递给此句柄。 此外,当设备被抓取时,其他输入句柄注入的事件将被忽略。
- 
void input_release_device(struct input_handle *handle)¶
- 释放先前抓取的设备 
参数
- struct input_handle *handle
- 拥有该设备的输入句柄 
描述
释放先前抓取的设备,以便其他输入句柄可以开始接收输入事件。 释放后,附加到设备的所有处理程序都会调用其 start() 方法,以便它们有机会将设备状态与系统的其余部分同步。
- 
int input_open_device(struct input_handle *handle)¶
- 打开输入设备 
参数
- struct input_handle *handle
- 通过其访问设备的句柄 
描述
当输入处理程序想要开始接收来自给定输入设备的事件时,应调用此函数。
- 
void input_close_device(struct input_handle *handle)¶
- 关闭输入设备 
参数
- struct input_handle *handle
- 通过其访问设备的句柄 
描述
当输入处理程序想要停止接收来自给定输入设备的事件时,应调用此函数。
- 
int input_scancode_to_scalar(const struct input_keymap_entry *ke, unsigned int *scancode)¶
- 转换 - struct input_keymap_entry中的扫描码
参数
- const struct input_keymap_entry *ke
- 包含要转换的扫描码的 keymap 条目。 
- unsigned int *scancode
- 指向应存储转换后的扫描码的位置的指针。 
描述
此函数用于将 struct keymap_entry 中存储的扫描码转换为旧版 keymap 处理方法可以理解的标量形式。 这些方法希望扫描码表示为 “unsigned int”。
参数
- struct input_dev *dev
- 正在查询其 keymap 的输入设备 
- struct input_keymap_entry *ke
- keymap 条目 
描述
任何有兴趣检索当前 keymap 的人都应调用此函数。 目前,evdev 处理程序使用它。
参数
- struct input_dev *dev
- 正在更新其 keymap 的输入设备 
- const struct input_keymap_entry *ke
- 新的 keymap 条目 
描述
任何需要更新当前 keymap 的人都应调用此函数。 目前,键盘和 evdev 处理程序使用它。
参数
- struct input_dev *dev
- 需要重置其状态的输入设备 
描述
此函数尝试重置打开的输入设备的状态,并将内部状态和硬件状态彼此同步。 我们将所有键标记为已释放,恢复 LED 状态、重复率等。
参数
- void
- 无参数 
描述
返回准备好的 struct input_dev 或 NULL。
注意
使用 input_free_device() 释放尚未注册的设备; input_unregister_device() 应该用于已注册的设备。
参数
- struct device *dev
- 拥有正在创建的输入设备的设备 
描述
返回准备好的 struct input_dev 或 NULL。
托管的输入设备不需要显式注销或释放,因为它会在所有者设备与其驱动程序解除绑定(或绑定失败)时自动完成。 一旦分配了托管的输入设备,就可以像常规输入设备一样以相同的方式进行设置和注册。 没有特殊的 devm_input_device_[un]register() 变体,常规的变体既适用于托管设备,也适用于非托管设备,如果您需要它们。 但是,在大多数情况下,托管的输入设备不需要显式注销或释放。
注意
所有者设备设置为输入设备的父设备,用户不应覆盖它。
参数
- struct input_dev *dev
- 要释放的输入设备 
描述
仅当尚未调用 input_register_device() 或调用失败时,才应使用此函数。 注册设备后,使用 input_unregister_device(),内存将在最后一个引用被删除后释放。
设备应由 input_allocate_device() 分配。
注意
如果存在对输入设备的引用,则在删除最后一个引用之前,不会释放内存。
参数
- struct input_dev *dev
- 要设置时间戳的输入设备 
- ktime_t timestamp
- 事件在 CLOCK_MONOTONIC 中发生的时刻 
描述
此函数旨在向输入系统提供事件实际发生时间的更准确的时间。 驱动程序应尽快调用此函数以获取时间戳,确保 input_set_timestamp 中的时钟转换正确完成。
在时间戳获取和调用 input_set_timestamp 之间进入暂停状态的系统可能会导致不准确的转换。
参数
- struct input_dev *dev
- 要从中获取时间戳的输入设备 
描述
有效的时间戳是非零值的时间戳。
- 
void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int code)¶
- 将设备标记为能够处理某个事件 
参数
- struct input_dev *dev
- 能够发出或接受事件的设备 
- unsigned int type
- 事件的类型(EV_KEY、EV_REL 等...) 
- unsigned int code
- 事件代码 
描述
除了在相应的能力位图中设置相应的位之外,该函数还调整 dev->evbit。
参数
- struct input_dev *dev
- 输入设备 
- int delay
- 重复延迟 
- int period
- 重复周期 
描述
在输入设备上启用软件自动重复。
参数
- struct input_dev *dev
- 要注册的设备 
描述
此函数向输入核心注册设备。 设备必须使用 input_allocate_device() 分配,并在注册之前设置其所有功能。 如果函数失败,则必须使用 input_free_device() 释放设备。 成功注册设备后,可以使用 input_unregister_device() 注销设备; 在这种情况下,不应调用 input_free_device()。
请注意,此函数也用于注册托管的输入设备(使用 devm_input_allocate_device() 分配的设备)。 此类托管的输入设备不需要显式注销或释放,它们的拆卸由 devres 基础架构控制。 同样值得注意的是,托管输入设备的拆卸在内部是一个两步过程:注册的托管输入设备首先被注销,但保留在内存中并且仍然可以处理 input_event() 调用(尽管事件不会传递到任何地方)。 托管输入设备的释放将在稍后发生,当 devres 堆栈被解开到进行设备分配的点时。
参数
- struct input_dev *dev
- 要注销的设备 
描述
此函数注销输入设备。 设备注销后,调用者不应尝试访问它,因为它可能随时被释放。
- 
int input_register_handler(struct input_handler *handler)¶
- 注册新的输入处理程序 
参数
- struct input_handler *handler
- 要注册的处理程序 
描述
此函数在系统中注册新的输入处理程序(接口)用于输入设备,并将其附加到所有与处理程序兼容的输入设备。
- 
void input_unregister_handler(struct input_handler *handler)¶
- 注销一个输入处理程序 
参数
- struct input_handler *handler
- 要注销的处理程序 
描述
此函数将处理程序与其输入设备断开连接,并将其从已知处理程序的列表中移除。
- 
int input_handler_for_each_handle(struct input_handler *handler, void *data, int (*fn)(struct input_handle*, void*))¶
- 句柄迭代器 
参数
- struct input_handler *handler
- 要迭代的输入处理程序 
- void *data
- 回调函数的数据 
- int (*fn)(struct input_handle *, void *)
- 为每个句柄调用的函数 
描述
迭代 **bus** 的设备列表,并为每个设备调用 **fn**,传递 **data**,并在 **fn** 返回非零值时停止。 该函数使用 RCU 遍历列表,因此可能在原子上下文中使用。 **fn** 回调函数从 RCU 临界区调用,因此不得睡眠。
- 
int input_register_handle(struct input_handle *handle)¶
- 注册一个新的输入句柄 
参数
- struct input_handle *handle
- 要注册的句柄 
描述
此函数将新的输入句柄放到设备和处理程序的列表中,以便在使用 input_open_device() 打开后,事件可以通过它流动。
此函数应从处理程序的 connect() 方法中调用。
- 
void input_unregister_handle(struct input_handle *handle)¶
- 注销一个输入句柄 
参数
- struct input_handle *handle
- 要注销的句柄 
描述
此函数从设备和处理程序的列表中删除输入句柄。
此函数应从处理程序的 disconnect() 方法中调用。
- 
int input_get_new_minor(int legacy_base, unsigned int legacy_num, bool allow_dynamic)¶
- 分配一个新的输入次设备号 
参数
- int legacy_base
- 要搜索的旧范围的开始 
- unsigned int legacy_num
- 旧范围的大小 
- bool allow_dynamic
- 我们是否也可以从动态范围中获取 ID 
描述
此函数从输入主命名空间分配一个新的设备次设备号。 调用者可以通过指定 **legacy_base** 和 **legacy_num** 参数来请求旧的次设备号,以及如果在旧范围中没有空闲 ID,是否可以从动态范围分配 ID。
- 
void input_free_minor(unsigned int minor)¶
- 释放先前分配的次设备号 
参数
- unsigned int minor
- 要释放的次设备号 
描述
此函数释放先前分配的输入次设备号,以便以后可以重复使用。
- 
int input_ff_upload(struct input_dev *dev, struct ff_effect *effect, struct file *file)¶
- 将效果上传到力反馈设备 
参数
- struct input_dev *dev
- 输入设备 
- struct ff_effect *effect
- 要上传的效果 
- struct file *file
- 效果的所有者 
参数
- struct input_dev *dev
- 从中删除效果的输入设备 
- int effect_id
- 要删除的效果的 ID 
- struct file *file
- 请求的假定所有者 
描述
此函数从指定的设备中删除力反馈效果。 仅当效果是通过请求删除的同一文件句柄上传时,才会删除该效果。
- 
int input_ff_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)¶
- 力反馈事件的通用处理程序 
参数
- struct input_dev *dev
- 要将效果发送到的输入设备 
- unsigned int type
- 事件类型(除 EV_FF 之外的任何内容都将被忽略) 
- unsigned int code
- 事件代码 
- int value
- 事件值 
参数
- struct input_dev *dev
- 支持力反馈的输入设备 
- unsigned int max_effects
- 设备支持的最大效果数 
描述
此函数为输入设备的力反馈部分分配所有必需的内存,并安装所有默认处理程序。 在调用此函数之前,应已设置 **dev->ffbit**。 创建 ff 设备后,您需要在注册输入设备之前设置其上传、擦除、播放和其他处理程序
参数
- struct input_dev *dev
- 支持力反馈的输入设备 
描述
此函数仅在错误路径中需要,因为输入核心会在设备销毁时自动释放力反馈结构。
- 
int input_ff_create_memless(struct input_dev *dev, void *data, int (*play_effect)(struct input_dev*, void*, struct ff_effect*))¶
- 创建无内存的力反馈设备 
参数
- struct input_dev *dev
- 支持力反馈的输入设备 
- void *data
- 要传递到 **play_effect** 的特定于驱动程序的数据 
- int (*play_effect)(struct input_dev *, void *, struct ff_effect *)
- 用于播放 FF 效果的特定于驱动程序的方法 
多点触摸库¶
- 
struct input_mt_slot¶
- 表示输入 MT 插槽的状态 
定义:
struct input_mt_slot {
    int abs[ABS_MT_LAST - ABS_MT_FIRST + 1];
    unsigned int frame;
    unsigned int key;
};
成员
- abs
- 保存此插槽的 ABS_MT 轴的当前值 
- frame
- 调用 - input_mt_report_slot_state()的最后一个帧
- key
- 此插槽的可选驱动程序指定 
- 
struct input_mt¶
- 跟踪的触点的状态 
定义:
struct input_mt {
    int trkid;
    int num_slots;
    int slot;
    unsigned int flags;
    unsigned int frame;
    int *red;
    struct input_mt_slot slots[] ;
};
成员
- trkid
- 存储下一个触点的 MT 跟踪 ID 
- num_slots
- 设备使用的 MT 插槽数 
- slot
- 当前正在传输的 MT 插槽 
- flags
- input_mt 操作标志 
- frame
- 每次调用 - input_mt_sync_frame()时都会递增
- red
- 内核内跟踪的降低成本矩阵 
- slots
- 保存跟踪的触点的当前值的插槽数组 
- 
struct input_mt_pos¶
- 接触位置 
定义:
struct input_mt_pos {
    s16 x, y;
};
成员
- x
- 水平坐标 
- y
- 垂直坐标 
- 
int input_mt_init_slots(struct input_dev *dev, unsigned int num_slots, unsigned int flags)¶
- 初始化 MT 输入插槽 
参数
- struct input_dev *dev
- 支持 MT 事件和手指跟踪的输入设备 
- unsigned int num_slots
- 设备使用的插槽数 
- unsigned int flags
- 要在核心中处理的 mt 任务 
描述
此函数为输入设备中 MT 插槽处理分配所有必需的内存,准备 ABS_MT_SLOT 和 ABS_MT_TRACKING_ID 事件以供使用,并设置适当的缓冲区。 根据设置的标志,它还执行指针仿真和帧同步。
可以重复调用。 如果尝试使用不同的插槽数重新初始化,则返回 -EINVAL。
参数
- struct input_dev *dev
- 具有已分配的 MT 插槽的输入设备 
描述
此函数仅在错误路径中需要,因为输入核心会在设备销毁时自动释放 MT 插槽。
参数
- struct input_dev *dev
- 具有已分配的 MT 插槽的输入设备 
- unsigned int tool_type
- 在此插槽中使用的工具类型 
- bool active
- 如果触点处于活动状态,则为 true,否则为 false 
描述
通过 ABS_MT_TRACKING_ID 报告触点,并可选择报告 ABS_MT_TOOL_TYPE。 如果 active 为 true 并且插槽当前未激活,或者如果工具类型已更改,则将新的跟踪 ID 分配给该插槽。 仅当设置了相应的 absbit 字段时,才会报告工具类型。
如果触点处于活动状态,则返回 true。
参数
- struct input_dev *dev
- 具有已分配的 MT 插槽的输入设备 
- int count
- 触点数 
描述
通过 BTN_TOOL_FINGER、BTN_TOOL_DOUBLETAP、BTN_TOOL_TRIPLETAP 和 BTN_TOOL_QUADTAP 报告触点计数。
输入核心确保只有为此设备设置的 KEY 事件才会产生输出。
参数
- struct input_dev *dev
- 具有已分配的 MT 插槽的输入设备 
- bool use_count
- 将活动触点数报告为手指计数 
描述
通过 BTN_TOUCH、ABS_X、ABS_Y 和 ABS_PRESSURE 执行旧式指针仿真。 如果 use_count 为 true,则仿真触摸板手指计数。
输入核心确保只有为此设备设置的 KEY 和 ABS 轴才会产生输出。
参数
- struct input_dev *dev
- 具有已分配的 MT 插槽的输入设备 
描述
释放自上次调用此函数后未见到的所有槽位。
参数
- struct input_dev *dev
- 具有已分配的 MT 插槽的输入设备 
描述
关闭当前帧,并为新帧准备内部状态。根据标志,将未使用的槽位标记为非活动状态,并执行指针模拟。
- 
int input_mt_assign_slots(struct input_dev *dev, int *slots, const struct input_mt_pos *pos, int num_pos, int dmax)¶
- 执行最佳匹配分配 
参数
- struct input_dev *dev
- 具有已分配的 MT 插槽的输入设备 
- int *slots
- 要填充的槽位分配 
- const struct input_mt_pos *pos
- 要匹配的位置数组 
- int num_pos
- 位置数量 
- int dmax
- ABS_MT_POSITION 最大位移 (零表示无限) 
描述
针对当前触点执行最佳匹配,并返回槽位分配列表。新的触点被分配到未使用的槽位。
分配是平衡的,因此所有坐标位移都低于欧几里得距离 dmax。 如果找不到这样的分配,则某些触点将被分配到未使用的槽位。
成功时返回零,失败时返回负错误。
参数
- struct input_dev *dev
- 具有已分配的 MT 插槽的输入设备 
- int key
- 要查找的槽位的键值 
描述
如果存在,则返回给定键值的槽位,否则,在第一个未使用的槽位上设置键值并返回。
如果找不到可用的槽位,则返回 -1。请注意,为了使此函数正常工作,必须在每一帧调用 input_mt_sync_frame()。
矩阵键盘/小键盘¶
- 
struct matrix_keymap_data¶
- 矩阵键盘的键盘映射 
定义:
struct matrix_keymap_data {
    const uint32_t *keymap;
    unsigned int    keymap_size;
};
成员
- 键盘映射
- 指向使用 KEY() 宏编码的 uint32 值数组的指针,表示键盘映射 
- keymap_size
- 此键盘映射中条目的数量(已初始化) 
描述
平台代码应使用此结构向实现类矩阵键盘/小键盘的驱动程序提供键盘映射。
稀疏键盘映射支持¶
- 
struct key_entry¶
- 用于稀疏键盘映射的键盘映射条目 
定义:
struct key_entry {
    int type;
    u32 code;
    union {
        u16 keycode;
        struct {
            u8 code;
            u8 value;
        } sw;
    };
};
成员
- type
- 键条目的类型 (KE_KEY, KE_SW, KE_VSW, KE_END); 驱动程序可以扩展列表,使用自己的私有定义。 
- code
- 设备特定的数据,用于标识按钮/开关 
- {unnamed_union}
- 匿名 
- keycode
- 分配给键/按钮的 KEY_* 代码 
- sw
- 具有 KE_SW 和 KE_VSW 使用的代码/值的结构体 
- sw.code
- 分配给开关的 SW_* 代码 
- sw.value
- 当切换 KE_SW 开关时,应在输入事件中发送的值。 KE_VSW 开关会忽略此字段,并希望驱动程序提供事件的值。 
描述
此结构定义了稀疏键盘映射中的一个条目,某些输入设备使用该映射,传统的基于表的方法不适用。
- 
struct key_entry *sparse_keymap_entry_from_scancode(struct input_dev *dev, unsigned int code)¶
- 执行稀疏键盘映射查找 
参数
- struct input_dev *dev
- 使用稀疏键盘映射的输入设备 
- unsigned int code
- 扫描码 
描述
此函数用于在使用稀疏键盘映射的输入设备中执行 struct key_entry 查找。
- 
struct key_entry *sparse_keymap_entry_from_keycode(struct input_dev *dev, unsigned int keycode)¶
- 执行稀疏键盘映射查找 
参数
- struct input_dev *dev
- 使用稀疏键盘映射的输入设备 
- unsigned int keycode
- 键码 
描述
此函数用于在使用稀疏键盘映射的输入设备中执行 struct key_entry 查找。
- 
int sparse_keymap_setup(struct input_dev *dev, const struct key_entry *keymap, int (*setup)(struct input_dev*, struct key_entry*))¶
- 为输入设备设置稀疏键盘映射 
参数
- struct input_dev *dev
- 输入设备 
- const struct key_entry *keymap
- 键盘映射采用 - key_entry结构数组的形式,以- KE_END类型的条目结束
- int (*setup)(struct input_dev *, struct key_entry *)
- 可用于根据设备的需求调整键盘映射条目的函数,可以为 - NULL
描述
该函数计算大小并分配原始键盘映射的副本,然后适当地设置输入设备事件位。 当不再需要键盘映射的已分配副本时,会自动释放它。
- 
void sparse_keymap_report_entry(struct input_dev *dev, const struct key_entry *ke, unsigned int value, bool autorelease)¶
- 报告与给定键条目对应的事件 
参数
- struct input_dev *dev
- 应报告事件的输入设备 
- const struct key_entry *ke
- 描述事件的键条目 
- unsigned int value
- 应报告的值( - KE_SW条目忽略)
- bool autorelease
- 指示是否应在报告按下事件后立即为 - KE_KEY条目发出释放事件,所有其他条目忽略
描述
此函数用于报告给定 struct key_entry 描述的输入事件。
- 
bool sparse_keymap_report_event(struct input_dev *dev, unsigned int code, unsigned int value, bool autorelease)¶
- 报告与给定扫描码对应的事件 
参数
- struct input_dev *dev
- 使用稀疏键盘映射的输入设备 
- unsigned int code
- 扫描码 
- unsigned int value
- 应报告的值( - KE_SW条目忽略)
- bool autorelease
- 指示是否应在报告按下事件后立即为 - KE_KEY条目发出释放事件,所有其他条目忽略
描述
此函数用于在使用稀疏键盘映射的输入设备中执行查找并报告相应的事件。 如果查找成功,则返回 true,否则返回 false。
PS/2 协议支持¶
- 
enum ps2_disposition¶
- 指示应如何处理收到的字节 
常量
- PS2_PROCESS
- 传递到主协议处理程序,正常处理 
- PS2_IGNORE
- 跳过该字节 
- PS2_ERROR
- 不处理该字节,中止正在进行的命令 
- 
struct ps2dev¶
- 表示使用 PS/2 协议的设备 
定义:
struct ps2dev {
    struct serio *serio;
    struct mutex cmd_mutex;
    wait_queue_head_t wait;
    unsigned long flags;
    u8 cmdbuf[8];
    u8 cmdcnt;
    u8 nak;
    ps2_pre_receive_handler_t pre_receive_handler;
    ps2_receive_handler_t receive_handler;
};
成员
- serio
- PS/2 设备使用的 serio 端口 
- cmd_mutex
- 一个互斥锁,确保一次只执行一个命令 
- wait
- 一个等待队列,用于从 serio 中断处理程序发出完成信号 
- flags
- 各种内部标志,指示 PS/2 命令执行的阶段 
- cmdbuf
- 保存命令响应的缓冲区 
- cmdcnt
- 命令响应的未完成字节数 
- nak
- 设备拒绝命令时发送的字节 
- pre_receive_handler
- 检查通信错误并返回接收到的数据字节的处置 ( - enum ps2_disposition)
- receive_handler
- 特定 PS/2 协议(例如键盘或鼠标协议)的主处理程序 
参数
- struct ps2dev *ps2dev
- 要向其发送数据的 PS/2 设备 
- u8 byte
- 要发送到设备的数据 
- unsigned int timeout
- 发送数据和接收确认的超时时间 
描述
该函数不处理重传,调用者应在需要时处理它。
ps2_sendbyte() 只能从进程上下文中调用。
参数
- struct ps2dev *ps2dev
- 执行命令的 PS/2 设备 
参数
- struct ps2dev *ps2dev
- 应排空的 PS/2 设备 
- size_t maxbytes
- 要排空的最大字节数 
- unsigned int timeout
- 排空设备的时间 
- 
bool ps2_is_keyboard_id(u8 id_byte)¶
- 根据已知的键盘 ID 列表检查接收到的 ID 字节 
参数
- u8 id_byte
- 应检查的数据字节 
参数
- struct ps2dev *ps2dev
- 应执行命令的 PS/2 设备 
- u8 *param
- 一个缓冲区,包含要随命令一起发送的参数,或者存放命令执行结果的地方,或者两者兼有。 
- unsigned int command
- 命令字,编码了命令本身,以及应该发送到设备的附加参数字节数和期望的命令响应长度。 
描述
未序列化。调用者应使用 ps2_begin_command() 和 ps2_end_command() 来确保复杂命令的正确序列化。
参数
- struct ps2dev *ps2dev
- 应执行命令的 PS/2 设备 
- u8 *param
- 一个缓冲区,包含要随命令一起发送的参数,或者存放命令执行结果的地方,或者两者兼有。 
- unsigned int command
- 命令字,编码了命令本身,以及应该发送到设备的附加参数字节数和期望的命令响应长度。 
注意
ps2_command() 序列化命令执行,以便一次只能为一个单独的端口或整个 8042 控制器执行一个命令。
参数
- struct ps2dev *ps2dev
- 应执行命令的 PS/2 设备 
- u8 command
- 命令字节 
描述
该命令使用高级设备(如罗技或 Synaptics 触摸板)理解的“切片”语法发送。 该命令编码为:0xE6 0xE8 rr 0xE8 ss 0xE8 tt 0xE8 uu,其中 (rr*64)+(ss*16)+(tt*4)+uu 是命令。
- 
void ps2_init(struct ps2dev *ps2dev, struct serio *serio, ps2_pre_receive_handler_t pre_receive_handler, ps2_receive_handler_t receive_handler)¶
- 初始化 ps2dev 结构 
参数
- struct ps2dev *ps2dev
- 要初始化的结构 
- struct serio *serio
- 与 PS/2 设备关联的 serio 端口 
- ps2_pre_receive_handler_t pre_receive_handler
- 验证处理程序,用于检查基本通信状态 
- ps2_receive_handler_t receive_handler
- 主协议处理程序 
描述
准备 ps2dev 结构,以便在 PS/2 设备的驱动程序中使用。
参数
- struct serio *serio
- 设备的 serio 端口 
- u8 data
- 从设备接收的数据字节 
- unsigned int flags
- 标志,例如 - SERIO_PARITY或- SERIO_TIMEOUT,指示数据传输的状态
描述
ps2_interrupt() 调用预接收处理程序,可选地处理来自设备的命令确认和响应,最后将数据传递给主协议处理程序以供进一步处理。