Linux: 我的 char 驱动程序在 sysfs 中创建了一个节点,但在重新加载后无法清除它
Linux: My char driver creates a node in sysfs but can not clean it after reloading
我正在编写一个简单的字符驱动程序。我使用 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);
...
它在 Linux MIPS CPU 上的 OpenWrt 3.10.49 上。
有没有人发现有问题?
谢谢。
迪米塔尔
它看起来很愚蠢。
我使用的是动态专业,所以从值 0 开始。
当然,我必须在 alloc_chrdev_region() 之后移动 tdm->dev_major = MAJOR(tdm_dev) 所以得到合适的专业,我可以清理 afterwords
谢谢
迪米塔尔
我正在编写一个简单的字符驱动程序。我使用 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);
...
它在 Linux MIPS CPU 上的 OpenWrt 3.10.49 上。 有没有人发现有问题?
谢谢。 迪米塔尔
它看起来很愚蠢。 我使用的是动态专业,所以从值 0 开始。 当然,我必须在 alloc_chrdev_region() 之后移动 tdm->dev_major = MAJOR(tdm_dev) 所以得到合适的专业,我可以清理 afterwords
谢谢 迪米塔尔