我正在使用Atmel uC每500毫秒将输入切换到我的BeagleBone上的GPIO线。我在Linux内核模块中注册了一个处理程序,但由于某些原因处理程序没有被调用。
我的模块代码如下 -
在调用insmod interrupt_test.ko时,我收到以下消息。
但是现在当我开始切换输入到这个GPIO引脚时,中断处理程序没有被调用,消息(中断接收)没有被显示。如何解决?问题的原因是什么?
我的模块代码如下 -
#define GPIO 54
#define GPIO_INT_NAME "gpio_int"
#define GPIO_HIGH gpio_get_value(GPIO)
#define GPIO_LOW (gpio_get_value(GPIO) == 0)
short int irq_any_gpio = 0;
int count =0;
enum { falling, rising } type;
static irqreturn_t r_irq_handler(int irq, void *dev_id)
{
count++;
printk(KERN_DEBUG "interrupt received (irq: %d)\n", irq);
if (irq == gpio_to_irq(GPIO))
{
type = GPIO_LOW ? falling : rising;
if(type == falling)
{
printk("gpio pin is low\n");
}
else
printk("gpio pin is high\n");
}
return IRQ_HANDLED;
}
void r_int_config(void) {
if (gpio_request(GPIO, GPIO_INT_NAME ))
{
printk("GPIO request failure: %s\n", GPIO_INT_NAME );
return;
}
if ( (irq_any_gpio = gpio_to_irq(GPIO)) < 0 ) {
printk("GPIO to IRQ mapping failure %s\n",GPIO_INT_NAME );
return;
}
printk(KERN_NOTICE "Mapped int %d\n", irq_any_gpio);
if (request_irq(irq_any_gpio,(irq_handler_t ) r_irq_handler, IRQF_TRIGGER_HIGH, GPIO_INT_NAME, NULL))
{
printk("Irq Request failure\n");
return;
}
return;
}
void r_int_release(void) {
free_irq(gpio_to_irq(GPIO), NULL);
gpio_free(GPIO);;
return;
}
int init_module(void)
{
printk("<1>Hello World\n");
r_int_config();
return 0;
}
在调用insmod interrupt_test.ko时,我收到以下消息。
[ 76.594543] Hello World
[ 76.597137] Mapped int 214
但是现在当我开始切换输入到这个GPIO引脚时,中断处理程序没有被调用,消息(中断接收)没有被显示。如何解决?问题的原因是什么?