linux 输入子系统代码例子
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 //返回输入数据
更多推荐



所有评论(0)