cancel_work(&mywork); destroy_workqueue(wk_info->own_workqueue); kobject_put(wk_info->sysfs_obj); sysfs_remove_file(wk_info->sysfs_obj, &etx_attr.attr); device_destroy(wk_info->work_class, wk_info->dev); class_destroy(wk_info->work_class); cdev_del(&wk_info->chrdev); unregiste...
class_create 一共有两个参数,参数 owner 一般为 THIS_MODULE,参数 name 是类名字。设备类名对应 /sys/class 目录的子目录名。返回值是个指向结构体 class 的指针,也就是创建的类。 卸载驱动程序的时候需要删除掉类,类删除函数为 class_destroy void class_destroy(struct class *cls); // cls要删除的类 ②...
<1>因为我们创建设备节点的时候,是先注册驱动,再创建逻辑类,最后创建设备节点的。所以销毁的时候需要反过来。先销毁设备节点,再销毁逻辑类,最后卸载驱动。 <2>class_destroy()执行的效果是删除函数__class_create()或宏class_create()在目录/sys/class下创建的逻辑类对应的文件夹。device_destroy()用于销毁设备节点。
class_destroy(timed_output_class); } 调用class_destroy()删除这个类 .这两个函数非常简单, 当内核执行这两个函数以后就可以在/sys/class/目录下看到timed_output这个目录了. Timed_output设备的注册和删除 int timed_output_dev_register(struct timed_output_dev *tdev); void timed_output_dev_unregister(str...
class_destroy(wk_info->work_class); err_add: unregister_chrdev_region(wk_info->dev,1); cdev_del(&wk_info->chrdev); return ret; } static void __exit work_queue_exit(void) { struct my_work_info*wk_info = g_data; cancel_work(&mywork); ...
class_destroy(myclass); ret=PTR_ERR(mydevice);gotofail; } 在代码中,调用class_create()和device_create()函数,必须使用IS_ERR()函数判断返回的指针是否是有效的,如果是无效的,需要调用PTR_ERR()函数将无效的指针转换为错误号,并进行错误号返回。
(dev_id,0),NULL,"third_drv");// 根据class来初始化class_device,会创建出对应的设备文件printk("init\n");return0;}staticvoid__exitthird_exit(void){unregister_chrdev(dev_id,dev_name);class_device_unregister(third_class_dev);// 后创建的先卸载class_destroy(third_class);printk("exit\n");}...
class_destroy(dev_class); r_class: unregister_chrdev_region(dev,1); return -1; } /* ** Module exit function */ static void __exit etx_driver_exit(void) { wait_queue_flag = 2; wake_up_interruptible(&wait_queue_etx); device_destroy(dev_class,dev); ...
class_destroy(cls);out_err_1: unregister_chrdev(major,"hello"); return result;}static void hello_exit(void){ printk("hello_exit \n"); device_destroy(cls, devno); class_destroy(cls); unregister_chrdev(major,"hello"); return;}module_init(hello_init);module_exit(hello_exit);MODULE_LICEN...
r_device:class_destroy(dev_class);r_class:unregister_chrdev_region(dev,1);return-1;} staticvoid__exitmy_driver_exit(void){waitqueue_flag =2;wake_up_interruptible(&my_waitqueue);device_destroy(dev_class, dev);class_destroy(dev_class);cdev_del(&my_cdev);unregister_chrdev_region(dev,1);...