关于字符设备驱动(3)

device_createde 函数的调用关系如下:

device_createde | ---- device_create_vargs | ---- device_register | ---- device_initialize | ---- device_add | ---- kobject_add | ---- device_create_file | ---- device_add_class_symlinks | ---- kobject_uevent

这四个函数的的头文件都是 #include <linux/device.h>

下面是一个例子

#include <linux/module.h> #include <linux/init.h> #include <linux/kernel.h> #include <linux/cdev.h> // for cdev_add #include <linux/device.h> // for class_create #include <linux/err.h> //for IS_ERR #include <linux/fs.h> //for alloc_chrdev_region static dev_t devno; static struct cdev * dev; static struct class * class; static struct device * device; static struct file_operations ops = { .owner = THIS_MODULE, }; static int __init init_testko(void) { printk("test ko init\n"); if (alloc_chrdev_region(&devno, 0, 1, "Hello")) { printk("device number register failed!\n"); return -1; } printk("device number register success, major : %u\n", MAJOR(devno)); dev = cdev_alloc(); dev->owner = THIS_MODULE; dev->ops = &ops; if (cdev_add(dev, devno, 1)) { printk("cdev_add failed!\n"); unregister_chrdev_region(devno, 1); return -1; } class = class_create(THIS_MODULE, "HELLO"); if (IS_ERR(class)) { cdev_del(dev); unregister_chrdev_region(devno, 1); return PTR_ERR(class); } device = device_create(class, NULL,devno, NULL, "hello"); if (IS_ERR(device)) { class_destroy(class); cdev_del(dev); unregister_chrdev_region(devno, 1); return PTR_ERR(device); } return 0; } static void __exit exit_testko(void) { device_destroy(class, devno); class_destroy(class); cdev_del(dev); unregister_chrdev_region(devno, 1); printk("test ko exit\n"); } MODULE_LICENSE("GPL"); MODULE_AUTHOR("KEVIN"); module_init(init_testko); module_exit(exit_testko);

这个实例代码可以完成使用Insmod命令插入模块的时候自动在/dev目录下创建hello设备文件。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/693ef441c9831a83cea8cf2d502c7db2.html