Linux自动创建设备节点

来源:Linux认证    发布时间:2012-11-10    Linux认证视频    评论

    在驱动用加入对udev的支持主要做的就是:在驱动初始化的代码里调用class_create(…)为该设备创建一个class,再为每个设备调用device_create(…)( 在2.6较早的内核中用class_device_create)创建对应的设备。
   
    内核中定义的struct class结构体,顾名思义,一个struct class结构体类型变量对应一个类,内核同时提供了class_create(…)函数,可以用它来创建一个类,这个类存放于sysfs下面,一旦创建好了这个类,再调用 device_create(…)函数来在/dev目录下创建相应的设备节点。这样,加载模块的时候,用户空间中的udev会自动响应 device_create(…)函数,去/sysfs下寻找对应的类从而创建设备节点。
   
    struct class定义在头文件include/linux/device.h中class_create(…)在/drivers/base/class.c中实现device_create(…)函数在/drivers/base/core.c中实现class_destroy(…),device_destroy(…)也在/drivers/base/core.c中实现调用过程类似如下:
   
    static struct class *spidev_class;
   
    /*-------------------------------------------------------------------------*/
   
    static int spidev_probe(struct spi_device *spi)
   
    {
   
    …
   
    dev = device_create(spidev_class, &spi->dev, spidev->devt,
   
    spidev, "spidev%d.%d",
   
    spi->master->bus_num, spi->chip_select);
   
    …
   
    }
   
    static int spidev_remove(struct spi_device *spi)
   
    {
   
    ……
   
    device_destroy(spidev_class, spidev->devt);
   
    ……
   
    return 0;
   
    }
   
    static struct spi_driver spidev_spi = {
   
    .driver = {
   
    .name =        "spidev",
   
    .owner =    THIS_MODULE,
   
    },
   
    .probe =    spidev_probe,
   
    .remove =    __devexit_p(spidev_remove),
   
    };
   
    /*-------------------------------------------------------------------------*/
   
    static int __init spidev_init(void)
   
    {
   
    …
   
    spidev_class = class_create(THIS_MODULE, "spidev");
   
    if (IS_ERR(spidev_class)) {
   
    unregister_chrdev(SPIDEV_MAJOR, spidev_spi.driver.name);
   
    return PTR_ERR(spidev_class);
   
    }
   
    …
   
    }
   
    module_init(spidev_init);
   
    static void __exit spidev_exit(void)
   
    {
   
    ……
   
    class_destroy(spidev_class);
   
    ……
   
    }
   
    module_exit(spidev_exit);
   
    MODULE_DESCRIPTION("User mode SPI device interface");
   
    MODULE_LICENSE("GPL");
   
    下面以一个简单字符设备驱动来展示如何使用这几个函数
   
    #include <linux/module.h>
   
    #include <linux/kernel.h>
   
    #include <linux/init.h>
   
    #include <linux/fs.h>
   
    #include <linux/cdev.h>
   
    #include <linux/device.h>
   
    int HELLO_MAJOR = 0;
   
    int HELLO_MINOR = 0;
   
    int NUMBER_OF_DEVICES = 2;
   
    struct class *my_class;
   
    struct cdev cdev;

    相关推荐:

    Linux中重定向命令行的总结

    scp在linux中复制文件/目录

    linux和windows共享文件夹

上一页12下一页

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答