摘要: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
字段可用,那么我可以避免使用全局变量。但如果它在我的身下移动,我的内核最多也会哎呀,可能会感到恐慌。
答案 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);