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的文件夹

转载于:https://www.cnblogs.com/Blue-Moon/p/3219915.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在设备驱动程序中,可以使用`platform_device_register()`函数来注册一个平台设备并指定其`class`。该函数的第二个参数是一个指向`platform_device`结构体的指针,该结构体包含了设备的信息,其中一个成员是`dev`,可以通过该成员来指定设备的`class`。 例如,以下代码注册了一个名为`my_device`的平台设备,并将其`class`设置为`my_class`: ``` static struct platform_device my_device = { .name = "my_device", .id = -1, .dev = { .class = &my_class, }, }; int my_driver_probe(struct platform_device *pdev) { // do driver initialization here } static int __init my_driver_init(void) { platform_device_register(&my_device); platform_driver_register(&my_driver); return 0; } static void __exit my_driver_exit(void) { platform_driver_unregister(&my_driver); platform_device_unregister(&my_device); } module_init(my_driver_init); module_exit(my_driver_exit); ``` 其中,`my_class`是一个指向设备所属类的指针,可以通过`class_create()`函数创建。例如: ``` static struct class *my_class; static int __init my_driver_init(void) { my_class = class_create(THIS_MODULE, "my_class"); if (IS_ERR(my_class)) return PTR_ERR(my_class); platform_device_register(&my_device); platform_driver_register(&my_driver); return 0; } static void __exit my_driver_exit(void) { platform_driver_unregister(&my_driver); platform_device_unregister(&my_device); class_destroy(my_class); } module_init(my_driver_init); module_exit(my_driver_exit); ``` 这样就可以在`/sys/class/my_class/`路径下找到`my_device`设备的相关信息了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值