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

标签 c linux driver

我正在编写一个简单的字符驱动程序。我使用 device_create() 在 sysfs 中创建节点并且它已正确创建。我也自动在/dev 中获取我的节点。我的问题是 class_distroy() 和 device_destroy() 不清理在初始化时创建的/sys/devices/virtual/tdmcdev/tdm/目录。 下面是我的初始化和关闭代码

    ...
    /* 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 上。 有没有人看到不正常的地方?

谢谢。 迪米塔尔

最佳答案

它看起来很愚蠢。 我使用的是动态专业,所以从值 0 开始。 当然,我必须在 alloc_chrdev_region() 之后移动 tdm->dev_major = MAJOR(tdm_dev) 所以得到合适的专业,我可以清理后记

谢谢 迪米塔尔

关于c - Linux:我的 char 驱动程序在 sysfs 中创建了一个节点,但在重新加载后无法清除它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29392269/

相关文章:

c++ - 在哪里可以找到带有源代码的简约 WDM 驱动程序模板?

api - 对 GPU 驱动程序的 Vulkan API 调用

c - 使用 Switch 语句的质数计数器(输出错误)?

linux - 在 sed 命令中使用管道中的 STDIN 替换文件中的值

c - SDL2 音频问题 C 编程(不是混音器)

python - 求助.....串口编程

linux - 两个相互依赖的后台进程

linux - 在 Linux 中通过 PCI 将视频数据传输到设备的最佳方式

无法理解这个 C 程序的工作原理?

c - c中fscanf返回值的问题