Linux:我的char驱动程序在sysfs中创建一个节点,但在重新加载后无法清除它

时间:2015-04-01 13:36:36

标签: c linux driver

我正在写一个简单的char驱动程序。我使用device_create()在sysfs中创建节点,并且它已正确创建。我也自动在/ dev中获取节点。我的问题是class_distroy()和device_destroy()不会清除init上的/ sys / devices / virtual / tdmcdev / tdm /目录。 我的init和密码在下面

    ...
    /* Node in the /dev/  */
    tdm->dev_major = 0; //for dynamic major        

    tdm_dev = MKDEV(tdm->dev_major, 0);
    tdm->dev_major = MAJOR(tdm_dev);
    err = alloc_chrdev_region(&tdm_dev, 0, 1, "tdm"); //One node to read/write data frame
    if (err) {
            printk("can't alloc minor for /dev/tdm\n");
            return -ENODEV;
    }

    cdev_init(&(tdm->cdev), &tdm_dev_fops);
    tdm->cdev.owner = THIS_MODULE;
    err = cdev_add(&(tdm->cdev), tdm_dev, 1);
    if (err) {
            printk("cdev_add() failed for /dev/tdm\n");
            unregister_chrdev_region(tdm_dev, 1);
            return -ENODEV;
    }

    /* Node /sys/devices/virtual/tdmcdev/tdm/  */
    tdm->dev_class = class_create(THIS_MODULE, "tdmcdev");
    if (IS_ERR(device_create(tdm->dev_class, NULL, tdm_dev, NULL, "tdm"))) {
            printk("device_create() failed for the tdm device\n");
            class_destroy(tdm->dev_class);
            cdev_del(&(tdm->cdev));
            unregister_chrdev_region(tdm_dev, 1);
            return -ENOMEM;
    }
    ... 

我的密码

    dev_t tdm_dev = MKDEV(tdm->dev_major, 0);

    device_destroy(tdm->dev_class, tdm_dev);
    class_destroy(tdm->dev_class);

    cdev_del(&(tdm->cdev));
    unregister_chrdev_region(tdm_dev, 1);
    ...

在MIPS CPU上的Linux OpenWrt 3.10.49上。 有人看到的东西不按顺序吗?

感谢。 迪米塔尔

1 个答案:

答案 0 :(得分:1)

这似乎是一个愚蠢的。 我正在使用动态专业,所以从值0开始。 我必须在alloc_chrdev_region()之后移动tdm-> dev_major = MAJOR(tdm_dev),这样才能得到适当的主要内容,我可以在之后清理

由于 迪米塔尔