Linux2.6 设备注册

1.什么叫做Linux2.6设备的注册

        linux2.6设备注册  他是一个最规范的设备注册的手段;

        特点:

                主设备号和次设备号都不限制;

                主设备号范围:0-4096; 次设备号范围:0-1,048,576

2.linux2.6设备注册及注销的流程

        注册流程:

                1)申请设备号;

                2)初始化linux2.6的核心结构体;

                3)向内核注册一个linux2.6的核心结构体;

                4)创建一个类的结构体;

                5)创建设备文件;

        注销的流程

                1)销毁设备文件;

                2)销毁类结构体;

                3)向内核取消注册一个linux2.6的核心结构体;

                4)取消设备号;

3.linux2.6设备注册相关函数

       1) 函数功能:向内核申请一个可以使用的设备号

        头文件:#include <linux/fs.h>

        函数原型:int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,const char *name)

        参数:               

                dev_t *dev:设备号存储的位置  包含了主设备和次设备

                unsigned baseminor:次设备号的起始位置

                unsigned count:要申请的设备号的个数

                const char *name:设备号的名字  ,会出现在/proc/devices文件里

        返回值:

                成功返回0;  失败返回 负数

        2) 函数功能:释放设备号

        头文件:#include <linux/fs.h>

        函数原型:void unregister_chrdev_region(dev_t from, unsigned count)

        参数:                              

                from:释放的设备号的起始的位置

                count:要释放的设备号的个数

        3) 函数功能:初始化一个linux2.6的核心构体

        头文件:#include <linux/cdev.h>

        函数原型:void cdev_init(struct cdev *cdev, const struct file_operations *fops)

        参数:               

                 struct cdev *cdev:linux2.6设备注册的核心结构体

                const struct file_operations *fops:这个就是我们操作集合的结构体

        返回值:无

        4) 函数功能:向内核注册一个linux2.6的核心结构体

        头文件:#include <linux/cdev.h>

        函数原型:int cdev_add(struct cdev *p, dev_t dev, unsigned count)

        参数: 

                struct cdev *p:linux2.6的核心结构体

                dev_t dev:申请的设备号;

                unsigned count:注册的设备的个数, 一般填写1

        返回值:

                成功返回 0;  失败返回 负数

         5) 函数功能:从内核取消注册一个linux2.6的核心结构体

        头文件:#include <linux/cdev.h>

        函数原型:void cdev_del(struct cdev *p)

        参数:struct cdev *p:linux2.6的核心结构体 

        返回值:无

        6) 函数功能:创建一个类的核心结构体

        头文件:#include <linux/device.h>

        函数原型:struct class * class_create(struct module *owner, const char *name)

        参数:   

                struct module *owner:固定填写THIS_MODULE

                const char *name:类的名字  

        返回值:

                成功返回 我们创建的类的结构体的指针

                失败返回  NULL

        7) 函数功能:自动的生成一个设备文件

        头文件:#include <linux/device.h>

        函数原型:struct device *device_create(struct class *class, struct device *parent,dev_t devt, void *drvdata, const char *fmt, ...)

        参数:   

                struct class *class:创建的类

                struct device *parent:父节点设备,填NULL

                dev_t devt:设备号

                void *drvdata:传给我们设备的私有数据 ,填写NULL

                const char *fmt, ...:你要创建的设备文件的名字

        返回值:

                成功返回 设备文件的核心结构体 ,主要用于摧毁该设备

        8) 函数功能:摧毁创建的设备文件

        头文件:#include <linux/device.h>

        函数原型:void device_destroy(struct class *class, dev_t devt)

        参数:   

                struct class *class:创建的类结构体

                dev_t devt :设备号

        返回值:无

        9) 函数功能:摧毁一个类结构体

        头文件:#include <linux/device.h>

        函数原型:void class_destroy(struct class *cls)

        参数:struct class *cls:类的核心结构体

        返回值:无

4.linux2.6的设备注册,不会自动生成设备文件,要想使用自己写的驱动,要生成一个设备文件

        生成方式:

        1)手动生成:mknod /dev/myled c 主设备号 次设备号

        2)自动生成:依赖类的核心结构体,首先创建一个类的核心结构体,然后再自动生成一个设备文件;

    //1.向内核申请一个可以使用的设备号
    ret= alloc_chrdev_region(&mydev, 0, 1,"beep");
    if(ret < 0)
    {
        printk("设备号申请失败\n");
        return -1;
    }
    printk("dev:%d\n",mydev);
    printk("主设备号:%d\n",MAJOR(mydev));
    printk("次设备号:%d\n",MINOR(mydev));
    
    //2.初始化linux2.6的核心结构体
    myfops.owner=THIS_MODULE;
    myfops.open=myopen;
    myfops.release=myclose;
    cdev_init(&mycdev,&myfops);
    
    //3.向内核注册一个Linux2.6的核心结构体
    cdev_add(&mycdev, mydev, 1);

    //4.创建一个类的核心结构体
    myclass = class_create(THIS_MODULE,"bee");
    if(myclass == NULL)
    {
        printk("类的核心结构体创建失败\n");
        return -1;
    }

    //5.创建设备文件
    mydevice = device_create(myclass, NULL,mydev,NULL,"beep");
    if(mydevice = NULL)
    {
        printk("创建设备文件失败\n");
        return -1;
    }

//1.销毁设备
    device_destroy(myclass, mydev);
    //2.销毁类结构体
    class_destroy(myclass);
    //3.从内核取消注册一个linux2.6的核心结构体
    cdev_del(&mycdev);
    //4.释放设备号
    unregister_chrdev_region(mydev,1);

   

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程小白菜123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值