1

总结:设备驱动模块中的platform_data字段是否可以struct device免费使用?

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

4

1 回答 1

1

这样的指针可以存储在drvdata字段中(它被巧妙地隐藏了,因此如果您查看 的定义就不会看到它struct device)。

通过 的第四个参数对其进行初始化device_create,并用 读取dev_get_drvdata

mydev = device_create(myclass, NULL, dev, &mymod, "mydev");
...
struct mymodule *mymodp = dev_get_drvdata(dev);
于 2013-09-23T08:16:09.063 回答