代码之家  ›  专栏  ›  技术社区  ›  md.jamal

从键盘输入端口读取扫描代码

  •  0
  • md.jamal  · 技术社区  · 5 年前

    链接是这样写的 http://www-ug.eecg.toronto.edu/msl/nios_devices/datasheets/PS2%20Keyboard%20Protocol.htm

    当8042从键盘接收到一个有效的扫描码时,它就被转换成它的set 1等价物。然后将转换后的扫描代码放入输入缓冲区,设置IBF(输入缓冲区已满)标志,并断言IRQ 1

    #include <linux/kernel.h>
    #include <linux/module.h>
    #include <linux/ioport.h>
    #include <linux/delay.h>
    
    #define I8042_COMMAND_REG       0x64
    #define I8042_STATUS_REG        0x64
    #define I8042_DATA_REG          0x60
    
    static inline int i8042_read_data(void)
    {
            return inb(I8042_DATA_REG);
    }
    
    static inline int i8042_read_status(void)
    {
            return inb(I8042_STATUS_REG);
    }
    
    static inline void i8042_write_data(int val)
    {
            outb(val, I8042_DATA_REG);
    }
    
    static inline void i8042_write_command(int val)
    {
            outb(val, I8042_COMMAND_REG);
    }
    
    
    
    int __init  hello_init(void)
    {
    
        int status = i8042_read_status();
        int data;
    
        while (!(status & 0x02)) {
            status = i8042_read_status();
        }
    
        data = i8042_read_data();
        pr_info("Data:%02x\n", data);
    
        return 0;
    }
    
    void  __exit hello_exit(void)
    {
    
    }
    
    MODULE_LICENSE("GPL");
    module_init(hello_init);
    module_exit(hello_exit);
    

    上面的代码被删除了,当我按键时它不起作用。 但是如果我把条件换成!(status&0x01)它正常工作。这是正确的。

    0 回复  |  直到 5 年前