天天看点

嵌入式设备驱动——自动创建设备节点https://blog.csdn.net/fontlose/article/details/8225651   (参考资料)

//主要用到的四个方法在linux/device.h定义:

 

//创建类和释放类的函数  创建成后将创建/sys/class/name文件夹

extern struct class *class_create(struct module *owner, const char *name);

extern void class_destroy(struct class *cls);

 

 

//在低版本的内核提供class_device_create来创建设备节点 和 删除设备的方法 

extern struct class_device *class_device_create(struct class *cls,

						struct class_device *parent,

						dev_t devt,

						struct device *device,

						const char *fmt, ...)

					__attribute__((format(printf,5,6)));

extern void class_device_destroy(struct class *cls, dev_t devt);

 

 

//在高版本的内核提供device_create来创建设备节点 和 删除设备的方法 

extern struct device *device_create(struct class *cls, 

				    struct device *parent,

				    dev_t devt, void *drvdata,

				    const char *fmt, ...)

				    __attribute__((format(printf, 5, 6)));

extern void device_destroy(struct class *cls, dev_t devt);

 

//如果你不知道你的到底哪个函数,可以直接到内核头文件目录下找device.h,搜索一下定义的是哪个函数

 
           
#include <linux/module.h>

#include <linux/errno.h>

#include <linux/kernel.h>

#include <linux/device.h>

#include <linux/kdev_t.h>

#include <linux/err.h>

MODULE_AUTHOR("my name");

MODULE_LICENSE("Dual BSD/GPL");

static int major_i=66;

static int minor_i=0;

struct class* mclass;

static int node_init(void)

{

  /*class_create 成后在/sys/class创建noddev文件夹*/    

  mclass=class_create(THIS_MODULE,"noddev");

  if(IS_ERR(mclass))

  {

    printk(KERN_ALERT "fail to create class\n");

    return -1;

  }  

  /*class_device_create 在/dev下创建 noddev0设备*/

  device_create(mclass,NULL,MKDEV(major_i,minor_i),NULL,"noddev0");  

  /*这里最后一个参数可以用格式化参数 const char *fmt, ...*/

  device_create(mclass,NULL,MKDEV(major_i,minor_i+20),NULL,"noddev%d",minor_i+20);

  printk(KERN_ALERT "create node success:\n");

  printk(KERN_ALERT "  ls -l /dev/noddev*\n");

  printk(KERN_ALERT "  ls -l /sys/class/noddev\n");

  return 0;

}

 

static void node_exit(void)

{    

  /*删除创建的设备文件*/

  device_destroy(mclass,MKDEV(major_i,minor_i));

  device_destroy(mclass,MKDEV(major_i,minor_i+20)); 

  class_destroy(mclass); /*删除类*/

  printk(KERN_ALERT "goodbye\n");

}

module_init(node_init);

module_exit(node_exit);
           

https://blog.csdn.net/fontlose/article/details/8225651   (参考资料)

继续阅读