//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的文件夾
