我有一个 platform_device
实例,我想向它传递一个函数指针,我想知道最干净、最通用的方法是什么。
最佳的做法是,如果我在内核中有一些杂项资源,我可以为我想要的任何东西传递 void*
,但这些是唯一可用的资源:
31 #define IORESOURCE_TYPE_BITS 0x00001f00 /* Resource type */
32 #define IORESOURCE_IO 0x00000100 /* PCI/ISA I/O ports */
33 #define IORESOURCE_MEM 0x00000200
34 #define IORESOURCE_REG 0x00000300 /* Register offsets */
35 #define IORESOURCE_IRQ 0x00000400
36 #define IORESOURCE_DMA 0x00000800
37 #define IORESOURCE_BUS 0x00001000
实际上我有一个用于平台设备的容器,但它是在探测函数中动态分配和初始化的。
我的问题是如何将通用指针作为资源传递给设备?或者我怎样才能以最干净的方式做到这一点?
按照您在问题中链接的 LWN 文章底部所述使用 platform_data
。在您的情况下,您的数据结构将如下所示。这显然是未经测试的,但你明白了。您的 platform_data 结构将保存您在定义设备细节的同时设置的函数指针。
int sleep_function_chip1(struct platform_device *pdev)
{
// Go to sleep
return 0;
}
int resume_function_chip1(struct platform_device *pdev)
{
// Resume
return 0;
}
struct my_platform_data {
int (*sleep_function)(struct platform_device *);
int (*resume_function)(struct platform_device *);
};
// Instance of my_platform_data for a particular hardware (called chip1 for now)
static struct my_platform_data my_platform_data_chip1 = {
.sleep_function = &sleep_function_chip1,
.resume_function = &resume_function_chip1,
};
// Second instance of my_platform_data for a different hardware (called chip2 for now)
static struct my_platform_data my_platform_data_chip2 = {
.sleep_function = &sleep_function_chip2,
.resume_function = &resume_function_chip2,
};
// Now include that data when you create the descriptor for
// your platform
static struct platform_device my_platform_device_chip1 = {
.name = "my_device",
.id = 0,
.dev = {
.platform_data = &my_platform_data_chip1,
}
};
int some_driver_function() {
struct platform_device *pdev;
pdev = // wherever you store this
// Any time you need that data, extract the platform_data pointer
struct my_platform_data *pd = (struct my_platform_data*)pdev->dev.platform_data;
// Call the function pointer
pd->sleep_function(pdev);
}
我是一名优秀的程序员,十分优秀!