字符设备驱动3(新接口)

驱动注册接口:
老接口:register_chrdev();
新接口:register_chrdev_region(注册设备号)/alloc_chrdev_region+cdev(申请分配一个设备号)
cdev结构体:在cdev.h文件中

struct cdev {
    struct kobject kobj;
    struct module *owner;
    const struct file_operations *ops;
    struct list_head list;
    dev_t dev; //设备号
    unsigned int count;
};
MKDEV(ma,mi)//宏定义,分别填写主次设备号,用来生成设备号
int register_chrdev_region(dev_t from, unsigned count, const char *name) //向内核注册主次设备号(知道需要的主次设备号)
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,const char *name) //向内核注册主次设备号(那内核自动分配主次设备号)
void cdev_init(struct cdev *cdev, const struct file_operations *fops)   //将fileoperations结构体填充到cdev结构体中
int cdev_add(struct cdev *p, dev_t dev, unsigned count) //向内核注册设备号和驱动设备
void cdev_del(struct cdev *p) //真正注销字符设备驱动用cdev_del
void unregister_chrdev_region(dev_t from, unsigned count) //去注销申请的主次设备号


cdev_alloc //将指针实例化,用堆的方式分配内存,(在cdev_del的时候自动进行释放)
cdev_init //将fileoperations结构体填充到cdev结构体中
cdev_add //向内核注册设备号和驱动设备
cdev_del //去注销申请的主次设备号
使用新接口注册主要是更改chrdev__init();和chrdev__exit()
需要注意的是当程序出错时,需要把之前注册的信息注销掉。
老接口:register_chrdev();不能指定此设备号,此设备号就是0;

之前的程序需要手动创建文件节点,可以通过udev(mdev)应用程序来自动创建和删除设备节点
sys文件系统是内核和应用程序交互的一个窗口,/sys/class/里面是不同设备的类
calss_create:创建并填充一个类,然后通过__class_register向内核注册,内核通过这个类向应用层的udev发送uenvet
class_create(owner, name)
device_create:创建类里面的设备
struct device *device_create(struct class *class, struct device *parent, dev_t devt, void *drvdata, const char *fmt, …)

猜你喜欢

转载自blog.csdn.net/jiushimanya/article/details/82252740