device_create與device_register


//device_create的定義如下
struct device *device_create(struct class *class, struct device *parent,
                 dev_t devt, void *drvdata, const char *fmt, ...)
{
    va_list vargs;
    struct device *dev;

    va_start(vargs, fmt);
    dev = device_create_vargs(class, parent, devt, drvdata, fmt, vargs);
    va_end(vargs);
    return dev;
}
//device_create_vargs的定義如下
struct device *device_create_vargs(struct class *class, struct device *parent,
                   dev_t devt, void *drvdata, const char *fmt,
                   va_list args)
{
    struct device *dev = NULL;
    int retval = -ENODEV;

    if (class == NULL || IS_ERR(class))
        goto error;

    dev = kzalloc(sizeof(*dev), GFP_KERNEL);
    if (!dev) {
        retval = -ENOMEM;
        goto error;
    }

    dev->devt = devt;
    dev->class = class;
    dev->parent = parent;
    dev->release = device_create_release;
    dev_set_drvdata(dev, drvdata);

    retval = kobject_set_name_vargs(&dev->kobj, fmt, args);
    if (retval)
        goto error;

    retval = device_register(dev);
    if (retval)
        goto error;

    return dev;

error:
    put_device(dev);
    return ERR_PTR(retval);
}

 

看第39行調用了device_register(dev),在調用device_register之前構造了一個device變量dev, 並將該dev的devt,class,parent,device_create_release等變量賦值了。 所以執行device_register(dev)時會在/sys/class生成一個名字為dev->init_name的文件夾。而且該dev的父設備是paretn

如果我不設置class的值

像下面這樣 struct device hello ={  .init_name = "hello", } device_register(&hello); 像這樣只設置了device變量 hello的 init_name成員,那么他會默認的把文件夾建立在/sys/device目錄下, 此時你會在/sys/device目錄看見一個名字為hello的文件夾


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM