1 Star 0 Fork 0

AnQi/linux_study

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
input_button.c 2.52 KB
一键复制 编辑 原始数据 按行查看 历史
AnQi 提交于 2018-07-18 16:11 . stash
/*
* input_button.c
*
* Created on: 2018年6月27日
* Author: anqi
*/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/input.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/sched.h>
#include <linux/pm.h>
#include <linux/bitops.h>
#include <asm/gpio.h>
#include <asm/io.h>
#include <asm/arch/regs-gpio.h>
MODULE_LICENSE("Dual BSD/GPL");
typedef struct
{
int irq;
char *name;
unsigned long pin;
unsigned long key_val;
}btn_dev_t;
#define GPF0
static btn_dev_t key_desc[2] =
{
{IRQ_ENT0, "s2", S3C2410_GPF0, BTN_0},
{IRQ_ENT2, "s3", S3C2410_GPF2, BTN_0},
};
static irqreturn_t gpio_keys_isr(int irq, void *dev_id)
{
int pinval;
struct platform_device *pdev = dev_id;
struct input_dev *input = platform_get_drvdata(pdev);
for(int i = 0; i < 2; i++)
{
/*读gpio电平*/
pinval = s3c2410_gpio_getpin(key_desc[i]->pin);
if(pinval)
{
input_event(input, EV_KEY, key_desc[i].key_val, 1);
}
else
{
input_event(input, EV_KEY, key_desc[i].key_val, 0);
}
input_sync(input);
}
return IRQ_HANDLED;
}
int btn_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct input_dev *input;
input = input_allocate_device();
if (!input)
{
return -ENOMEM;
}
platform_set_drvdata(pdev, input);//放input到drvdata里
//1.input->evbit[0] = BIT_MASK(EV_KEY);
//
input->name = "btn_input";
set_bit(EV_KEY, input->evbit); //支持key事件
input_set_capability(input, EV_KEY, BTN_0);
input_set_capability(input, EV_KEY, BTN_1);
// input->open = gpio_keys_open;
// input->close = gpio_keys_close;
//
// input->id.bustype = BUS_HOST;
// input->id.vendor = 0x0001;
// input->id.product = 0x0001;
// input->id.version = 0x0100;
for(int i = 0; i < 2; i++)
{
request_irq(key_desc[i].irq, gpio_keys_isr, IRQF_TRIGGER_LOW, key_desc[i].name,
pdev);
}
input_register_device(input);
return 0;
}
int btn_remove(struct platform_device *pdev)
{
for(int i = 0; i < 2; i++)
{
free_irq(key_desc[i].irq, pdev);
}
return 0;
}
struct platform_driver btn_drv =
{
.probe = btn_probe,
.remove = btn_remove,
.driver = {
.name = "btn_input",
.owner = THIS_MODULE,
},
};
static int __init btnInput_init(void)
{
return platform_driver_register(&btn_drv);
}
static void __exit btnInput_exit(void)
{
platform_driver_unregister(&btn_drv);
}
module_init(btnInput_init);
module_exit(btnInput_exit);
MODULE_AUTHOR("qian.gao");
MODULE_DESCRIPTION("btn input test");
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/mygit245/linux_study.git
git@gitee.com:mygit245/linux_study.git
mygit245
linux_study
linux_study
master

搜索帮助