Linux内核:如何捕获按键并用另一个按键代替?

荒谬的

我试图涉足低级编程。我的目标是让用户在终端中键入一个密钥,捕获该密钥并输出另一个密钥。因此,例如,如果用户键入“ a”,我将键入“ b”,如果用户键入“ b”,我将输出“ c”,依此类推。

这样做的步骤是什么?我已经熟悉如何访问Linux内核源代码,对其进行编译和使用。

谢谢。

山姆·普罗岑科

考虑下一个简单的内核模块:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/interrupt.h>
#include <asm/io.h>

#define KBD_IRQ             1       /* IRQ number for keyboard (i8042) */
#define KBD_DATA_REG        0x60    /* I/O port for keyboard data */
#define KBD_SCANCODE_MASK   0x7f
#define KBD_STATUS_MASK     0x80

static irqreturn_t kbd2_isr(int irq, void *dev_id)
{
    char scancode;

    scancode = inb(KBD_DATA_REG);
    /* NOTE: i/o ops take a lot of time thus must be avoided in HW ISRs */
    pr_info("Scan Code %x %s\n",
            scancode & KBD_SCANCODE_MASK,
            scancode & KBD_STATUS_MASK ? "Released" : "Pressed");

    return IRQ_HANDLED;
}

static int __init kbd2_init(void)
{
    return request_irq(KBD_IRQ, kbd2_isr, IRQF_SHARED, "kbd2", (void *)kbd2_isr);
}

static void __exit kbd2_exit(void)
{
    free_irq(KBD_IRQ, (void *)kbd2_isr);
}

module_init(kbd2_init);
module_exit(kbd2_exit);

MODULE_LICENSE("GPL");

这是最小的和最原始的按键记录器可以很容易地将其重做以替换扫描代码

免责声明

  • 该模块不是跨平台的(仅在x86架构上可用,因为它正在使用inb()功能)
  • 我相信它仅适用于PS / 2键盘(不适用于USB键盘)
  • pr_info()在硬件IRQ处理程序中执行缓慢的I / O操作(我的意思是),应避免这种情况(应使用理想的线程IRQ)。

但我认为这是很好的教育目的-它真的很小,证明这个想法相当不错(不与API搞乱像input_devinput_register_device()serio_write()input_event()input_report_key(),等)。

细节

实际的中断处理程序(在键盘驱动程序中)请求为共享中断,这使我们也可以请求该中断,从而在我们的ISR中(除了原始键盘驱动程序中的ISR之外)也可以处理该中断中断请求在中完成kbd2_init()

该模块的工作原理如下:

  1. 捕获按键事件(kbd2_isr()每个按键事件都会调用硬件中断处理程序
  2. 读取按键扫描代码(通过inb()功能)
  3. 并通过打印 pr_info()

现在,您要替换该扫描代码。我相信您可以outb()为此使用功能(在x86上)。所以我留给你。

如果您想知道为什么我们请求编号为1的IRQ,请参阅drivers / input / serio / i8042-io.h

#else
# define I8042_KBD_IRQ  1

另外,请确保检查此IRQ是否在drivers / input / serio / i8042.c中共享

error = request_irq(I8042_KBD_IRQ, i8042_interrupt, IRQF_SHARED,
                    "i8042", i8042_platform_device);

这是i8042键盘控制器的文档:AT键盘控制器

有用的常数

为了避免幻数,可以使用下一个定义。

driver / input / serio / i8042-io.h

/*
 * Register numbers.
 */

#define I8042_COMMAND_REG       0x64
#define I8042_STATUS_REG        0x64
#define I8042_DATA_REG          0x60

include / linux / i8042.h

/*
 * Status register bits.
 */

#define I8042_STR_PARITY        0x80
#define I8042_STR_TIMEOUT       0x40
#define I8042_STR_AUXDATA       0x20
#define I8042_STR_KEYLOCK       0x10
#define I8042_STR_CMDDAT        0x08
#define I8042_STR_MUXERR        0x04
#define I8042_STR_IBF           0x02
#define I8042_STR_OBF           0x01

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在JQuery中用另一个按键代替?

来自分类Dev

当另一个键被按下时如何模拟一个按键?

来自分类Dev

jQuery按键事件等待0.5秒等待另一个用户按键

来自分类Dev

如何使用另一个数组按键/值从数组中提取对象

来自分类Dev

PHP按键对另一个数组(表)进行排序

来自分类Dev

Microsoft Visual Studio热键等待另一个按键

来自分类Dev

按键中的值搜索数组并获取另一个键的值

来自分类Dev

当按下按钮或按键时,如何在AvalonDock中从一个选项卡转到另一个选项卡?

来自分类Dev

按键对列表进行排序并以与第一个相同的方式对另一个列表进行排序?

来自分类Dev

在按键上将一个文本区域附加到另一个文本区域

来自分类Dev

如何在Linux中捕获按键(按键记录)?

来自分类Dev

如何按键对对象数组进行排序,然后按排序顺序将另一个键推送到新数组?

来自分类Dev

使javascript聊天机器人将聊天命令转换为另一个程序中的按键

来自分类Dev

每当我插入另一个键盘时,按键重复率都会重置为某个值

来自分类Dev

使javascript聊天机器人将聊天命令转换为另一个程序中的按键

来自分类Dev

即使另一个应用程序具有焦点,也检测(并覆盖)F1 键的按键

来自分类Dev

按键事件未记录第一个按键

来自分类Dev

如何杀死一个按键触发的过程?

来自分类Dev

使用PHP,按键搜索一个数组,然后用匹配键中的值替换另一个数组中的值

来自分类Dev

默认情况下双启动到一个操作系统,按键后到另一个操作系统

来自分类Dev

如何遍历一个范围并用值填充另一个工作表的单元格?

来自分类Dev

JavaScript EventListener多个按键按下在一个按键触发按键后停止

来自分类Dev

ngModel后期绑定一个按键

来自分类Dev

保持一个按键事件,vba

来自分类Dev

Linux内核模块在另一个模块中调用函数

来自分类Dev

Linux内核模块在另一个模块中调用函数

来自分类Dev

React javascript两个对象数组,我想按键查找和过滤,其结果,我想按另一个键计数

来自分类Dev

如何在Linux内核中处理键盘按键?

来自分类Dev

传递一个管道运行的输出,并用作另一个管道的参数

Related 相关文章

  1. 1

    如何在JQuery中用另一个按键代替?

  2. 2

    当另一个键被按下时如何模拟一个按键?

  3. 3

    jQuery按键事件等待0.5秒等待另一个用户按键

  4. 4

    如何使用另一个数组按键/值从数组中提取对象

  5. 5

    PHP按键对另一个数组(表)进行排序

  6. 6

    Microsoft Visual Studio热键等待另一个按键

  7. 7

    按键中的值搜索数组并获取另一个键的值

  8. 8

    当按下按钮或按键时,如何在AvalonDock中从一个选项卡转到另一个选项卡?

  9. 9

    按键对列表进行排序并以与第一个相同的方式对另一个列表进行排序?

  10. 10

    在按键上将一个文本区域附加到另一个文本区域

  11. 11

    如何在Linux中捕获按键(按键记录)?

  12. 12

    如何按键对对象数组进行排序,然后按排序顺序将另一个键推送到新数组?

  13. 13

    使javascript聊天机器人将聊天命令转换为另一个程序中的按键

  14. 14

    每当我插入另一个键盘时,按键重复率都会重置为某个值

  15. 15

    使javascript聊天机器人将聊天命令转换为另一个程序中的按键

  16. 16

    即使另一个应用程序具有焦点,也检测(并覆盖)F1 键的按键

  17. 17

    按键事件未记录第一个按键

  18. 18

    如何杀死一个按键触发的过程?

  19. 19

    使用PHP,按键搜索一个数组,然后用匹配键中的值替换另一个数组中的值

  20. 20

    默认情况下双启动到一个操作系统,按键后到另一个操作系统

  21. 21

    如何遍历一个范围并用值填充另一个工作表的单元格?

  22. 22

    JavaScript EventListener多个按键按下在一个按键触发按键后停止

  23. 23

    ngModel后期绑定一个按键

  24. 24

    保持一个按键事件,vba

  25. 25

    Linux内核模块在另一个模块中调用函数

  26. 26

    Linux内核模块在另一个模块中调用函数

  27. 27

    React javascript两个对象数组,我想按键查找和过滤,其结果,我想按另一个键计数

  28. 28

    如何在Linux内核中处理键盘按键?

  29. 29

    传递一个管道运行的输出,并用作另一个管道的参数

热门标签

归档