Linux kernel sysfs:可以自由使用struct device platform\u数据字段吗?

Linux kernel sysfs:可以自由使用struct device platform\u数据字段吗?,linux-kernel,device-driver,sysfs,Linux Kernel,Device Driver,Sysfs,摘要:struct device的platform\u data字段是否可以在设备驱动程序模块中自由使用 我正在为我的角色设备驱动程序模块创建一个非常简单的sysfs条目,以允许我控制一个内部变量(因为我知道使用ioctl()和proc文件系统是不推荐的。)我调用class\u create()在/sys/class/中创建一个类,然后调用device\u create()创建新的设备条目。然后我调用device\u create\u file()为驱动程序设置加载和存储例程。我想在这些例行程序

摘要:
struct device
platform\u data
字段是否可以在设备驱动程序模块中自由使用

我正在为我的角色设备驱动程序模块创建一个非常简单的sysfs条目,以允许我控制一个内部变量(因为我知道使用
ioctl()
proc
文件系统是不推荐的。)我调用
class\u create()
/sys/class/
中创建一个类,然后调用
device\u create()
创建新的设备条目。然后我调用
device\u create\u file()
为驱动程序设置加载和存储例程。我想在这些例行程序中锁定我的驱动程序。我的驱动程序的主结构中有一个互斥锁。我可以使用
platform\u data
字段来存储指向此结构的指针,就像我在模块的
open()
例程中使用
struct file
private\u data
字段一样,还是保留此字段?在
设备\u 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\u data
字段可用,那么我可以避免使用globals。但是,如果它在我的下面移动,我的内核最多只能是oops,而且可能会死机。

这样的指针可以存储在
drvdata
字段中(该字段被巧妙地隐藏起来,因此如果您查看
结构设备的定义,您将看不到它)

通过
device\u create
的第四个参数初始化它,并使用
dev\u get\u drvdata
读取它:

mydev=device\u create(myclass,NULL,dev,&mymod,“mydev”);
...
结构mymodule*mymodp=dev\u get\u drvdata(dev);

这样一个指针可以存储在
drvdata
字段中(该字段被巧妙地隐藏起来,以便在查看
struct device
的定义时不会看到它)

通过
device\u create
的第四个参数初始化它,并使用
dev\u get\u drvdata
读取它:

mydev=device\u create(myclass,NULL,dev,&mymod,“mydev”);
...
结构mymodule*mymodp=dev\u get\u drvdata(dev);

谢谢,这正是我想要的。我在LDD3工作(我希望他们能写第四版,因为学习曲线很陡峭。)看看内核代码,有一个类似的dev_set_drvdata(),它可以设置dev->p->driver_数据(如果还没有)。谢谢,这正是我想要的。我在LDD3工作(我希望他们能写第四版,因为学习曲线很陡峭。)看看内核代码,有一个类似的dev_set_drvdata(),它可以设置dev->p->driver_数据(如果还没有)。很容易知道。