代码
#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 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 ++;
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);
usr_timer.expires = jiffies + HZ/1;
usr_timer.function = &usr_timer_test_callback;
usr_timer.data = ((unsigned long)0);
add_timer(&usr_timer);
}
static void usr_timer_exit(void)
{
del_timer(&usr_timer);
}
static int usr_drv_init(void)
{
int i;
usr_dev = input_allocate_device();
set_bit(EV_KEY, usr_dev->evbit);
set_bit(KEY_L, usr_dev->keybit);
set_bit(KEY_S, usr_dev->keybit);
set_bit(KEY_ENTER, usr_dev->keybit);
input_register_device(usr_dev);
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
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