摘要:在设备驱动模块中可以免费使用struct device的struct device字段吗?
我正在为我的字符设备驱动程序模块创建一个非常简单的sysfs条目,以允许我控制内部变量(因为我知道使用ioctl()和proc文件系统是不推荐的)。我调用class_create()在/sys/class/中创建一个类,然后调用device_create()创建一个新的设备条目。然后,我调用device_create_file()为驱动程序设置加载和存储例程。我想把我的司机锁在这些程序里。我的司机的主要结构里有一个互斥物。我是否可以使用platform_data字段来存储指向此结构的指针,就像在模块的open()例程中存储struct file的private_data字段一样,还是保留了该字段?在device_create之后,它被设置为NULL,所以它看起来没问题,但我不确定。
我想做的是:
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字段可用,那么我可以避免使用全局字段。但是如果它在我下面移动,我的内核充其量只能运行,而且可能会恐慌。
发布于 2013-09-23 08:16:09
这样的指针可以存储在drvdata字段中(该字段已经巧妙地隐藏起来,如果您查看struct device的定义,就不会看到它)。
通过device_create的第四个参数初始化它,并使用dev_get_drvdata读取它
mydev = device_create(myclass, NULL, dev, &mymod, "mydev");
...
struct mymodule *mymodp = dev_get_drvdata(dev);https://stackoverflow.com/questions/18950917
复制相似问题