|
发表于 2014-12-8 12:36:32
18164 浏览 2 回复
Linux按键驱动程序的问题
我现在使用的是讯为itop-4412精英版,调试一个Linux按键驱动。Kernel使用的是3.0版本。我用内核模块加载的方式加载驱动,但是进入不了中断处理程序。file:///D:\Software\QQ2011\Users\550580649\Image\C2C\A32$}0IAE6M5TXK@%RT`5{L.png比如用Home键,这个对应GPX1_1,中断是XEINT9[img]file:///D:\Software\QQ2011\Users\550580649\Image\C2C\~B4B8[XZ9R]{Z8DZAQZJW(W.png[/img],驱动程序中.open函数里调用request_irq(IRQ_EINT9, buttons_irq, IRQ_TYPE_EDGE_BOTH, "S1", NULL);触发是双边沿和下降沿触发都没法进入到buttons_irq中断处理函数。中断处理函数只是打印一句printk。我在应用层直接open这个驱动文件,然后执行while(1){sleep(1);}语句进入循环。以下是我的程序,请帮我查查哪里有错误?
驱动程序:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/irq.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <mach/regs-gpio.h>
#include <mach/gpio.h>
#include <plat/gpio-cfg.h>
#include <plat/irqs.h>
#include <mach/irqs.h>
#include <mach/irqs-exynos4.h>
#include <linux/hardware.h>
#include <linux/device.h>
static struct class *buttondrv_class;
static struct device *buttondev;
static irqreturn_t buttons_irq(int irq, void *dev_id)
{
printk("buttons_irq\n");
return 0;
}
static int button_drv_open(struct inode *inode, struct file *file)
{
request_irq(IRQ_EINT9, buttons_irq, S5P_IRQ_TYPE_EDGE_FALLING, "K1",NULL);
return 0;
}
int button_drv_close(struct inode *inode, struct file *file)
{
free_irq(IRQ_EINT9, NULL);
return 0;
}
static struct file_operations button_drv_fops = {
.owner = THIS_MODULE,
.open = button_drv_open,
.release = button_drv_close,
};
int major;
static int button_drv_init(void)
{
major = register_chrdev(0, "button_drv", &button_drv_fops);
buttondrv_class = class_create(THIS_MODULE, "button_drv");
buttondev = device_create(buttondrv_class, NULL, MKDEV(major, 0), NULL, "button", 0);
return 0;
}
static void button_drv_exit(void)
{
unregister_chrdev(major, "button_drv");
device_destroy(buttondrv_class, MKDEV(major, 0));
class_destroy(buttondrv_class);
return 0;
}
module_init(button_drv_init);
module_exit(button_drv_exit);
MODULE_LICENSE("Dual BSD/GPL");
应用程序:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int fd;
fd = open("/dev/button", O_RDWR);
if (fd < 0)
{
printf("can't open!\n");
}
while (1)
{
sleep(5);
}
return 0;
}
|
|
|
|
|
|
|
|
确认一下request_irq()是不是注册成功呢,看下返回值。 |
|
|
|
|
|
|
|
发表于 2014-12-19 10:32:05
按键的驱动内核已经有了,在drivers/input/keyboard/gpio-keys.c,值需要自己在arch/arm/mach-exynos/mach-itop4412.c里面仿照我们的按键定义格式,实现自己的按键定义就可以了 |
|
|
|
|
|
|
登录或注册
扫一扫关注迅为公众号
|