字符设备驱动分步注册代码

#include <linux/init.h>

#include <linux/module.h>

#include <linux/fs.h>

#include <linux/io.h>

#include <linux/device.h>

#include <linux/uaccess.h>

#include <linux/cdev.h>

#include <linux/slab.h>

#include "head.h"

int ret, i=0;

char kbuf[128];

unsigned int major, minor=0;

struct class *clas;

struct device *dev;

struct cdev *cdev;

dev_t dev_all;

static int __init demo_init(void)

{

    //申请字符设备驱动空间

    cdev=cdev_alloc();

    if(cdev==NULL)

    {

        printk("cdev_alloc failed\n");

        ret=ENOMEM;

        goto err1;

    }

    //对字符设备驱动空间初始化

    cdev_init(cdev,&fops);

    //申请设备号

    ret=alloc_chrdev_region(&dev_all,minor,3,"chardev");

    if(ret)

    {

        printk("alloc_chrdev_region failed\n");

        goto err2;

    }

    major=MAJOR(dev_all);

    minor=MINOR(dev_all);

    //注册

    ret=cdev_add(cdev,dev_all,3);

    if(ret==-1)

    {

        printk("alloc_add failed\n");

        goto err3;

    }

    //提交目录信息

    clas=class_create(THIS_MODULE,"chardev");

    if(IS_ERR(clas))

    {

        printk("clas creation failed\n");

        ret=PTR_ERR(clas);

        goto err4;

    }

    //提交设备文件信息

    for(i=0;i<3;i++)

    {

        dev=device_create(clas,NULL,MKDEV(major,i),NULL,"chardev%d",i);

        if(IS_ERR(dev))

        {

            printk("device_create failed\n");

            ret=PTR_ERR(dev);

            goto err5;

        }

    }

    printk("cdev created successfully\n");

    return 0;

err5:

    for(--i;i>=0;i--)

    {

        device_destroy(clas,MKDEV(major,i));

    }

    class_destroy(clas);

err4:

    cdev_del(cdev);    

err3:

    unregister_chrdev_region(dev_all,3);

err2:

    kfree(cdev);

err1:

    return -ret;

}

static void __exit demo_exit(void)

{

    //注销设备文件信息

    int i=0;

    for(i=0;i<3;i++)

    {

        device_destroy(clas,MKDEV(major,i));

    }

    //注销目录信息

    class_destroy(clas);

    //注销

    cdev_del(cdev);

    //注销设备号

    unregister_chrdev_region(dev_all,3);

    //删除驱动空间

    kfree(cdev);

}

module_init(demo_init);

module_exit(demo_exit);

MODULE_LICENSE("GPL");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值