我用的是linux 5.6.2版本,我写了一个开发板(exynos4412-fs4412)的按键驱动,用 insmod xxxx.ko 插入成功,测试也成功,然后用 rmmod xxxxx.ko 卸载掉,当我再次 insmod xxxx.ko 时,出现如下图片中错误
相关的函数为:
static int init key_drv_init(void){
int ret;
printk("----------------%s---------------\n",FUNCTION__);
// 1 give space
key_dev = kzalloc(sizeof(struct dev_desc),GFP_KERNEL);
// 2 apply equip number
key_dev->dev_major = register_chrdev(0,"key_dev",&key_fops);
// 3 create equip node
key_dev->cls = class_create(THIS_MODULE,"key_cls");
key_dev->dev = device_create(key_dev->cls,NULL,MKDEV(key_dev->dev_major,0),NULL,"key0");
// 1 get interrupt number
key_dev->irqno = get_irqno_from_node();
// 2 apply interrupt // include handle function in it
ret = request_irq(key_dev->irqno,key_irq_handler,IRQF_TRIGGER_RISING|IRQF_TRIGGER_FALLING,
"key_dev_eint_one",NULL); // IRQF_TRIGGER_FALLING
if(ret!=0){
printk("request_irq error\n");
return ret;
}
// 4 address io
key_dev->reg_virt_base = ioremap(GPX1_1DATE,8);
// A: initial queue head
init_waitqueue_head(&key_dev->wq_head);
// one:initial tasklet or work
//tasklet_init(&key_dev->mytasklet,tasklet_half_irq_func,88);
//tasklet_init(&key_dev->mytasklet,tasklet_half_irq_func,88);
INIT_WORK(&key_dev->mywork, work_half_irq_func);
return 0;
}
static void __exit key_drv_exit(void){
//tasklet_kill(&key_dev->mytasklet);
iounmap(key_dev->reg_virt_base);
free_irq(key_dev->irqno,NULL);
device_destroy(key_dev->cls,MKDEV(key_dev->dev_major,0)); //destory device
class_destroy(key_dev->cls);
unregister_chrdev(key_dev->dev_major,"key_dev"); //release equipment number
kfree(key_dev);
printk("----------------%s---------------\n",__FUNCTION__);
}