|
static int request_irqs(void)
{
struct key_info *k;
int i;
for (i = 0; i < sizeof key_info_table / sizeof key_info_table[1]; i++)
{
k = key_info_table + i;
//set_external_irq(k->irq_no, EXT_BOTH_EDGES, GPIO_PULLUP_DIS);
set_irq_type(k->irq_no, IRQT_BOTHEDGE);
if (request_irq(k->irq_no, &buttons_irq, SA_INTERRUPT, DEVICE_NAME,i))
{
//printk("irq request failed by %d \n");
return -1;
}
}
printk("irq request successfully!\n");
return 0;
}
static void free_irqs(void)
{
struct key_info *k;
int i;
for (i = 0; i < sizeof key_info_table / sizeof key_info_table[1]; i++)
{
k = key_info_table + i;
free_irq(k->irq_no, buttons_irq);
}
}
static int button_init(void)
{
int ret,i;
dev_t devno = MKDEV(button_major,0);
ret = register_chrdev_region(devno, 1, "button");
if(ret)
return ret;
button_p = kmalloc(sizeof(button_dev), GFP_KERNEL);
if(!button_p)
{
ret = -ENOMEM;
goto fail;
}
memset(button_p, 0, sizeof(button_dev));
button_setup(button_p, 0);
for(i=0;i<4;i++)
{
s3c2410_gpio_cfgpin(led_table.gpio, led_table.gpio_status);
s3c2410_gpio_setpin(led_table.gpio, 1);
printk("led%d initialized!\n",i+1);
}
ret = request_irqs();
if(ret)
{
printk(DEVICE_NAME " can't request irqs\n");
goto fail;
}
printk("int request ok!\n");
return 0;
fail:
unregister_chrdev_region(devno, 1);
return ret;
}
static void button_exit(void)
{
cdev_del(&button_p->cdev);
kfree(button_p);
unregister_chrdev_region(MKDEV(button_major,0), 1);
free_irqs();
}
上面是部分程序.
问题是, 先insmod 这个模块, 执行正常, 然后rmmod 这个模块. 不重启, 再insmod 出错,
提示是:
button can't request irqs
insmod: cannot insert './key.ko': Operation not permitted
请教 是free_irq没有成功吗? 还是什么别的原因?
另外 ,关于创建文件节点的问题, 以前移植过一个linux2.4的led驱动(无cdev结构), 在insmod之前要自己手动创建文件节点. 这次的驱动带了cdev结构, 所以不需要创建设备节点就能正常工作... 是因为有了cdev结构才不需要创建设备节点吗?
多谢指教.
|
|