linux 输入子系统代码例子

代码


#include <linux/module.h>

#include <linux/init.h>
#include <linux/fs.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/sched.h>
#include <linux/pm.h>
#include <linux/slab.h>
#include <linux/sysctl.h>
#include <linux/proc_fs.h>
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <linux/input.h>
#include <linux/gpio_keys.h>
#include <linux/workqueue.h>
#include <linux/gpio.h>
#include <linux/gpio/consumer.h>
#include <linux/of.h>
#include <linux/of_platform.h>
#include <linux/of_gpio.h>
#include <linux/of_irq.h>
#include <linux/spinlock.h>


static struct input_dev *usr_dev;

static DECLARE_WAIT_QUEUE_HEAD(usr_waitq);
// static struct fasync_struct * usr_async;
static volatile int usr_press ;

static struct timer_list  usr_timer;
int usr_time_tick = 0;
static void usr_timer_test_callback(unsigned long a)
{
    usr_timer.expires = jiffies + HZ/1;
	add_timer(&usr_timer);
	usr_time_tick ++;

    
    // printk("usr_timer %d \n",usr_time_tick%2);
    input_event(usr_dev, EV_KEY, KEY_L,usr_time_tick%2);
    input_event(usr_dev, EV_KEY, KEY_S,usr_time_tick%2);
    input_event(usr_dev, EV_KEY, KEY_ENTER,usr_time_tick%2);
	input_sync(usr_dev);
}

static void usr_timer_init(void)
{
    init_timer(&usr_timer);//先初始化timer
	
    usr_timer.expires = jiffies + HZ/1;
    usr_timer.function = &usr_timer_test_callback;//设置回调函数
    usr_timer.data = ((unsigned long)0);//设置data参数,一般传入0即可
    
    add_timer(&usr_timer);//把定时器添加到系统中,激活定时器
}

static void usr_timer_exit(void)
{
    del_timer(&usr_timer);
}




/************************************************************************************/

/* 驱动入口函数 */
static int usr_drv_init(void)
{	
    int i;
    /* 1. 分配一个input_dev结构体 */
	usr_dev = input_allocate_device();

     /* 2. 设置 */
	/* 2.1 能产生哪类事件 */
	set_bit(EV_KEY, usr_dev->evbit);   
    // set_bit(EV_REP, usr_dev->evbit);

	/* 2.2 能产生这类操作里的哪些事件: L,S,ENTER,LEFTSHIT */
	set_bit(KEY_L, usr_dev->keybit);
	set_bit(KEY_S, usr_dev->keybit);
	set_bit(KEY_ENTER, usr_dev->keybit);
	// set_bit(KEY_LEFTSHIFT, buttons_dev->keybit);
    
    /* 3. 注册 */
	input_register_device(usr_dev);

    /* 4. 硬件相关的操作 */
    usr_timer_init();

}
 
/* 驱动出口函数 */
static void usr_drv_exit(void)
{
    usr_timer_exit();
    input_unregister_device(usr_dev);
	input_free_device(usr_dev);
 
}
 
module_init(usr_drv_init);
module_exit(usr_drv_exit);
 
MODULE_LICENSE("Dual BSD/GPL");
 

Makefile

KERN_DIR = /home/linux/workspace/Hi3516/system/SDK/rp-hi3516dv300-sdk020/osdrv/opensource/kernel/linux-4.9.y-smp
#KERN_DIR = /work/Hi3516_SDK/system/kernel/linux-4.9.y-smp


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

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

obj-m	+= usr_Drv.o
usr_Drv-objs := usr_drv.o 

编译命令

make ARCH=arm CROSS_COMPILE=arm-himix200-linux-

加载/卸载驱动

insmod usr_Drv.ko
rmmod usr_Drv

判断加载成功

ls -l /proc/进程id(ps获取)/fd //查看进程打开的文件
ls /dev/input/  //查看驱动安装情况,成功会多出一个eventx
cat /proc/bus/input/devices  //查看input输入子系统设备信息

测试调试命令

hexdump /dev/input/eventx  //调试查看event2是否输出正常(十六进制)

cat /dev/tty1  //查看数据输出(1s刷新一个ls)。
查看输出结果:当输入ENTER键时,才会有数据输出到命令行。
exec 0 </dev/tty1 //将tty1的输入定位到标准输入,程序1s会查看一次当前文档。

app应用调用方式

open( /dev/input/eventx )
read //返回结构体数据,包含时间,数据类型,事件类型,和数据值
或者
open(/dev/tty1)
read //返回输入数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值