微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 在驱动模块初始化函数中实现设备节点的自动创建

在驱动模块初始化函数中实现设备节点的自动创建

时间:08-15 来源:互联网 点击:

st vargs;

struct device *dev;

va_start(vargs, fmt);

dev = device_create_vargs(class, parent, devt, NULL, fmt, vargs);

va_end(vargs);

return dev;

}

第一个参数指定所要创建的设备所从属的类,第二个参数是这个设备的父设备,如果没有就指定为NULL,第三个参数是设备号,第四个参数是设备名称,第五个参数是从设备号。

下面以一个简单字符设备驱动来展示如何使用这几个函数

#include

#include

#include

#include

#include

#include

MODULE_LICENSE (GPL);

int hello_major = 555;

int hello_minor = 0;

int number_of_devices = 1;

struct cdev cdev;

dev_t dev = 0;

struct file_operations hello_fops = {

.owner = THIS_MODULE

};

static void char_reg_setup_cdev (void)

{

int error, devno = MKDEV (hello_major, hello_minor);

cdev_init (cdev, hello_fops);

cdev.owner = THIS_MODULE;

cdev.ops = hello_fops;

error = cdev_add (cdev, devno , 1);

if (error)

printk (KERN_NOTICE Error %d adding char_reg_setup_cdev, error);

}

struct class *my_class;

static int __init hello_2_init (void)

{

int result;

dev = MKDEV (hello_major, hello_minor);

result = register_chrdev_region (dev, number_of_devices, hello);

if (result0) {

printk (KERN_WARNING hello: can't get major number %dn, hello_major);

return result;

}

char_reg_setup_cdev ();

/* create your own class under /sysfs */

my_class = class_create(THIS_MODULE, my_class);

if(IS_ERR(my_class))

{

printk(Err: failed in creating class.n);

return -1;

}

/* register your own device in sysfs, and this will cause udev to create corresponding device node */

device_create( my_class, NULL, MKDEV(hello_major, 0), hello %d, 0 );

printk (KERN_INFO Registered character drivern);

return 0;

}

static void __exit hello_2_exit (void)

{

dev_t devno = MKDEV (hello_major, hello_minor);

cdev_del (cdev);

device_destroy(my_class, MKDEV(adc_major, 0)); //delete device node under /dev

class_destroy(my_class); //delete class created by us

unregister_chrdev_region (devno, number_of_devices);

printk (KERN_INFO char driver cleaned upn);

}

module_init (hello_2_init);

module_exit (hello_2_exit);

这样,模块加载后,就能在/dev目录下找到hello0这个设备节点了。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top