2020-11-05 itop4412 开发板input按键驱动例程

终于要远离嵌入式应用可以转到安卓的驱动了,还是很激动的,终于可以做linux的驱动了,今天搞了一天,input子系统还是有点复杂啊,今天查找各种资料草草完成input子系统的按键输入设备例程,先记下来,再进行优化:

按键驱动:

/*以后写驱动可以讲头文件一股脑的加载代码前面*/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <mach/gpio.h>
#include <plat/gpio-cfg.h>
#include <linux/miscdevice.h>
#include <linux/platform_device.h>
#include <mach/regs-gpio.h>
#include <asm/io.h>
#include <linux/regulator/consumer.h>
#include <linux/delay.h>
#include <linux/input.h>

/*中断函数头文件*/
#include <linux/interrupt.h>
#include <linux/irq.h>

#define IRQ_DEBUG
#ifdef IRQ_DEBUG
#define DPRINTK(x...) printk("IRQ_CTL DEBUG:" x)
#else
#define DPRINTK(x...)
#endif

#define DRIVER_NAME "irq_test"

#define KEY_GPIO(i) EXYNOS4_GPX1(i+1)
#define KEY_QWER(i) (KEY_Q+i)

struct input_dev *button_input_dev;
struct timer_list buttons_timer;
static struct ping_desc *buttons_id;

struct  ping_desc{
    unsigned  char   *name;          //中断设备名称
    int              pin_irq;          //按键的外部中断标志位
    unsigned  int    pin;                //引脚
    unsigned  int    irq_ctl;           //触发中断状态:   IRQ_TYPE_EDGE_BOTH
    unsigned  int    button;         //dev_id,对应键盘的 L ,  S,  空格,  enter      
};

static  struct ping_desc buttons_desc[2]=
{
       {"key1", IRQ_EINT(9), EXYNOS4_GPX1(1), IRQ_TYPE_EDGE_FALLING,KEY_Q},
       {"key2", IRQ_EINT(10), EXYNOS4_GPX1(2), IRQ_TYPE_EDGE_FALLING,KEY_W},
};
       

irqreturn_t buttons_irq(int irq, void *dev_id) {

    /*上报事件*/
/*    int i=0;
        for(i = 0; i < 2; i++){
            printk("key%d Down!\n", i+1);   
            if(irq==buttons_desc[1].pin_irq){
                input_report_key(button_input_dev, buttons_desc[i].button, gpio_get_value(KEY_GPIO(i)));
                input_sync(button_input_dev);
            }
        }
*/
    int i=0;
    for(i = 0; i < 2; i++){
        if(irq == buttons_desc[i].pin_irq){
            printk("key%d Down!\n", i);	
            input_report_key(button_input_dev, buttons_desc[i].button, gpio_get_value(buttons_desc[i].pin));
            input_sync(button_input_dev);
        }
    }

    return IRQ_HANDLED;
}

static int irq_probe(struct platform_device *pdev)
{

    char *banner = "probe ...\n";
    printk(banner);

    return 0;
}

static int irq_remove (struct platform_device *pdev)
{
    return 0;
}

static int irq_suspend (struct platform_device *pdev, pm_message_t state)
{
    DPRINTK("irq suspend:power off!\n");
    return 0;
}

static int irq_resume (struct platform_device *pdev)
{
    DPRINTK("irq resume:power on!\n");
    return 0;
}

static struct platform_driver irq_driver = {
    .probe = irq_probe,
    .remove = irq_remove,
    .suspend = irq_suspend,
    .resume = irq_resume,
    .driver = {
       .name = DRIVER_NAME,
       .owner = THIS_MODULE,
     },
};

static void __exit irq_test_exit(void)
{
    /*7.释放中断函数,删除定时器,卸载释放驱动*/
    int i;


    input_unregister_device(button_input_dev);    //卸载类下的驱动设备
    for(i = 0;i < 2;i++) {
        free_irq(buttons_desc[i].pin_irq,NULL);   //释放中断函数
    }
    input_free_device(button_input_dev);               //释放驱动结构体
    platform_driver_unregister(&irq_driver);

    return; 

}

static int __init irq_test_init(void)
{
    int i,j;
    int error;

    char *banner = "input device key_irq_test Initialize\n";
    printk(banner);

    for(i=0; i<2; i++){
        if (request_irq(buttons_desc[i].pin_irq, buttons_irq,IRQ_TYPE_EDGE_FALLING,buttons_desc[i].name,NULL)) {
                printk(KERN_ERR "itop4412_irq.c: Can't allocate irq %d\n", buttons_desc[i].pin_irq);
                return -EBUSY;
        }
    }

    button_input_dev = input_allocate_device();
    if(!button_input_dev){
        printk(KERN_ERR "itop4412_irq.c: Not enough memory\n");
        error = -ENOMEM;
        goto err_free_irq;
    }

    button_input_dev->name = "input key dev";

    set_bit(EV_KEY, button_input_dev->evbit);
    //让该设备支持qwer键
    for(j = 0;j < 2;j++) {
        set_bit(buttons_desc[j].button, button_input_dev->keybit);
    }
    

    error = input_register_device(button_input_dev);
    if (error) {
        printk(KERN_ERR "button.c: Failed to register device\n");
        goto err_free_dev; 
    }
        
    
    platform_driver_register(&irq_driver);

    return 0;

err_free_dev:
    input_free_device(button_input_dev);
err_free_irq:
    for(i--;i < 2;i++) {
        free_irq(buttons_desc[i].pin_irq,NULL);
    }
    return error;
}

module_init(irq_test_init);
module_exit(irq_test_exit);

MODULE_LICENSE("Dual BSD/GPL");

测试程序:

#include <stdio.h>
#include <sys/types.h>
#include <sys/fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <linux/input.h>
 
int main(int argc, char **argv)
{
    int fd;
    struct input_event event;
    fd = open(argv[1],O_RDWR);
    if(fd < 0){
        perror("open error:");
        return fd;
    }
 
    while(1){
        read(fd,&event,sizeof(event));
        
        if(event.type == EV_KEY){
            if(event.code == KEY_Q){
                    printf("Q:霸王拳\n");
                }
             if(event.code == KEY_W){
                    printf("W:降龙十八掌\n");
                }
        }
        
    }
 
    close(fd);
    return 0;

}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 2012 年,四核 ARM 处理器还是个新鲜事物,但短短一年时间之后,嵌入式多核系统 已经深入人心,并开始大面积普及应用,以极快的速度向工控、仪表等行业延伸,这些都是我 们始料不及的。 面对这样的形势,我们是固守还是迎接新的挑战?答案是肯定的,世界的潮流永远是浩 浩荡荡,不会停止前进的脚步。 如果我们固守,老旧的芯片价格将越来越贵,例如多年前大量使用的 SDRAM 价格已经 很高昂,几年前的 DDR2 也开始不便宜,现在的 DDR3 反倒性价比更高,其他芯片包括存储 介质也是这样。 如果我们停滞不前,一些新系统、新架构所带来的生产力将不能在新产品中体现,竞争 能力以及产品优势随之会受到影响。 同时,以前掌握的知识和能力将逐渐陈旧,越来越不能适应时代不断发展、需求不断进 步给我们提出的新要求。 发展是硬道理,尤其在信息技术这个领域,只有不断学习,积极改变才能把握先机,赢 得更多的机遇和挑战。 从架构上来讲,多核系统比单核要复杂很多,性能也成倍增长,但掌握它真的很难吗? 实际上,从嵌入式系统开发的角度来看,所谓的‘四核’其实并没有多少改变,留给我 们开发人员的工作跟以前也没有多少差别,因为 Linux 本身一直是支持多核的。 实际开发的时候,我们会发现,多核系统的驱动和应用程序的编程方式、编程理念、编 译工具、以及开发方法和原来单核系统并无差别。 作为一款开发板的产品手册,我们将尽可能详尽的为大家讲解 Exynos 4412 这款处理器 的系统应用特点,对于开发过程中可能碰到的难点和问题给予较全面的说明。 欢迎广大用户提出宝贵意见,便于我们更好的改进和提高!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值