Linux输入子系统(input subsystem)之按键输入和LE(3)

/* [cgw]: 根据文件标识符fd,设置能够获得这个文件的进程(owner)
    * getpid()获得当前进程ID
    */
    fcntl(fd, F_SETOWN, getpid());

/* [cgw]: 获得file->f_flags标志 */
    Oflags = fcntl(fd, F_GETFL);
   
    /* [cgw]: 置位FASYNC使能异步通知 */
    fcntl(fd, F_SETFL, Oflags | FASYNC);

while (1)
    {
        /* [cgw]: 休眠 */
        sleep(1000);
    }
   
    return 0;
}

makefile

KERN_DIR = /work/system/linux-2.6.22.6

all:
    make -C $(KERN_DIR) M=`pwd` modules

clean:
    make -C $(KERN_DIR) M=`pwd` modules clean
    rm -rf modules.order

obj-m    += input_subsys_drv.o

2. 实验

2.1

安装驱动程序:

insmod input_subsys_drv.ko

1 # insmod input_subsys_drv.ko 2 input: input_subsys_dev as /class/input/input1 3 input subsys open! 4 input subsys init!

运行应用程序

./input_subsys_test

# ./input_subsys_test
type: 0x1 code: 0x26 value: 0x1
type: 0x1 code: 0x26 value: 0x0
led event!
value: 0xaa
led write!
type: 0x11 code: 0x7 value: 0xaa
type: 0x1 code: 0x1f value: 0x1
type: 0x1 code: 0x1f value: 0x0
led event!
value: 0xee
led write!
type: 0x11 code: 0x7 value: 0xee

3. 现象分析

按一下按键KEY_L,终端输出:

type: 0x1 code: 0x26 value: 0x1 //按键按下 type: 0x1 code: 0x26 value: 0x0 //按键弹起 led event! //应用程序操作write, 发送LED控制事件,调用led_event() value: 0xaa //读到的LED亮的命令 led write! //返回应用程序继执行 type: 0x11 code: 0x7 value: 0xaa //因为应用程序发送了事件给驱动程序,驱动把这个事件作为一个输入事件(相当于按键输入事件),同样通过异步通知反馈到应用程序

Linux输入子系统(input subsystem)之按键输入和LE

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/41ad193549dc2e8766bf450b628a3b4c.html