输入子系统模型解析

输入子系统模型解析

1.为什么需要输入子系统?
2.输入子系统的介绍
3.输入子系统案例分析
这里写图片描述

范例代码

#include<linux/init.h>
#include<linux/module.h>
#include<linux/input.h>
#include<linux/miscdevice.h>
#include<linux/fs.h>
#include<linux/interrupt.h>
#include<linux/io.h>
#include<linux/irq.h>
#include<linux/slab.h>
#include<linux/vmalloc.h>
#include<asm/uaccess.h>
#include<linux/sched.h>
MODULE_LICENSE("GPL");
#define GPX1CON 0x11000C20
#define GPX1DAT 0x11000C24
unsigned int *gpx1con;
unsigned int *gpx1dat;
unsigned int key_num = 0;
wait_queue_head_t key_queue;
struct work_struct *work1;
struct timer_list key_timer;
struct input_dev *button_dev;
void work1_fun(struct work_struct *work)
{
    mod_timer(&key_timer,jiffies+HZ/10);

}
void key_timer_func(unsigned long data)
{
    unsigned int key_val;
    key_val = readl(gpx1dat)&(0x1<<1);
    if(key_val==0)
    {
        key_num = 1;
        input_report_key(button_dev,KEY_1,1);
    }
        //printk("\nhome key down\n");
    key_val = readl(gpx1dat)&(0x1<<2);
    if(key_val==0)
    {
        key_num = 2;
        input_report_key(button_dev,KEY_2,1);
    }
    //wake_up(&key_queue);//按键按下则唤醒进程
    //printk("\n back key down\n")
    input_sync(button_dev);
}
irqreturn_t key_int(int irq,void *dev_id)
{
    //检测是否发生了按键中断


    //消除按键中断


    //提交下半部分
    schedule_work(work1);

    return 0;


}
void keyinit()
{
    gpx1con = ioremap(GPX1CON,4);

    writel(readl(gpx1con)&~(0xff<<4)|(0xff<<4),gpx1con);

    gpx1dat = ioremap(GPX1DAT,4);
}
static int button_init()
{
    button_dev = input_allocate_device();//分配输入设备结构


    set_bit(EV_KEY,button_dev->evbit);//申明所支持的事件类型

    set_bit(KEY_1,button_dev->keybit);//申报可能商报的值编号
    set_bit(KEY_2,button_dev->keybit);

    input_register_device(button_dev);//注册输入设备

    request_irq(IRQ_EINT(9),key_int,IRQF_TRIGGER_FALLING,"key",(void *)1);
    request_irq(IRQ_EINT(10),key_int,IRQF_TRIGGER_FALLING,"key",(void *)2);

    keyinit();

    work1 = kmalloc(sizeof(struct work_struct),GFP_KERNEL);//创建工作

    INIT_WORK(work1,work1_fun);

    init_timer(&key_timer);//初始化定时器

    key_timer.function = key_timer_func;//添加超时函数

    add_timer(&key_timer);//向内核注册

    init_waitqueue_head(&key_queue);//初始化等待队列

    return 0;
static void button_exit()
{

    input_unregister_device(button_dev);

}
module_init(button_init);
module_exit(button_exit);
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值