sysfs:免费使用struct device platform_data字段?

时间:2013-09-23 02:22:19

标签: linux-kernel device-driver sysfs

摘要:platform_data struct device字段可以在设备驱动程序模块中免费使用吗?

我正在为我的角色设备驱动程序模块创建一个非常简单的sysfs条目,以允许我控制内部变量(因为我知道使用ioctl()并且不推荐使用proc文件系统。)我调用{ {1}}在class_create()中创建一个类,然后在/sys/class/创建一个新的设备条目。然后我调用device_create()来设置我的加载并存储驱动程序的例程。我想在这些例程中锁定我的驱动程序。我的驱动程序的主要结构中有一个互斥锁。我是否可以使用device_create_file()字段来存储指向此结构的指针,就像模块的platform_data例程中的private_data struct file字段一样,或者这是保留的?它在open()之后设置为NULL,所以看起来没问题,但我不确定。

我想做的是:

device_create

因此,这将创建可以写入的条目struct mymodule mymod; // main module structure, has a mutex called lockmx static ssize_t mydev_store_val(struct device *dev, struct device_attribute *attr, const char *buf,size_t count) { struct mymodule *mymodp=(struct mymodule*)dev->platform_data; if(mutex_lock_interruptible(&mymodp->lockmx)) return 0; // get data from buf mutex_unlock(&mymodp->lockmx); return count; } DEVICE_ATTR(mydeva,S_IWUSR|S_IRUGO,NULL,mydev_store_val); static int __init modinit(void) { ... dev_t dev; // alloc'ed already myclass=class_create(THIS_MODULE,"myclass"); mydev=device_create(myclass,NULL,dev,NULL,"mydev"); mydev->platform_data=&mymod; device_create_file(mydev,&dev_attr_mydeva); ... } 。如果/sys/class/myclass/mydev/mydeva字段可用,那么我可以避免使用全局变量。但如果它在我的身下移动,我的内核最多也会哎呀,可能会感到恐慌。

1 个答案:

答案 0 :(得分:1)

这样的指针可以存储在drvdata字段中(已经巧妙地隐藏了,以便在查看struct device的定义时不会看到它。)

通过device_create的第四个参数初始化它,并使用dev_get_drvdata读取它:

mydev = device_create(myclass, NULL, dev, &mymod, "mydev");
...
struct mymodule *mymodp = dev_get_drvdata(dev);