总结:设备驱动模块中的platform_data
字段是否可以struct device
免费使用?
我正在为我的字符设备驱动程序模块创建一个非常简单的 sysfs 条目,以允许我控制一个内部变量(因为我知道使用ioctl()
并且proc
不推荐使用文件系统。)我调用class_create()
创建一个类,/sys/class/
然后device_create()
创建一个新的设备条目。然后我调用device_create_file()
为驱动程序设置我的加载和存储例程。我想将我的驱动程序锁定在这些例程中。我的驱动程序的主要结构中有一个互斥锁。我可以使用该platform_data
字段来存储指向该结构的指针,就像我在模块例程中使用的private_data
字段一样,还是保留它?之后它被设置为NULL,所以它看起来不错,但我不确定。struct file
open()
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
可以写入的条目。如果该platform_data
字段可用,那么我可以避免使用全局变量。但是,如果它在我下面移动,我的内核充其量只能是 oops 并且可能会恐慌。