如何将内核模块与特定设备(驱动程序实例)相关联?

时间:2013-05-02 02:39:07

标签: c linux-kernel linux-device-driver kernel-module kernel

dev-audio声明了两个设备:

struct platform_device s5pv210_device_iis0 = {
 63         .name = "samsung-i2s",
 64         .id = 0,
 65         .num_resources    = ARRAY_SIZE(s5pv210_iis0_resource),
 66         .resource         = s5pv210_iis0_resource,
 67         .dev = {
 68                 .platform_data = &i2sv5_pdata,
 69         },
 70 };   
 76 static struct resource s5pv210_iis1_resource[] = {
 77         [0] = DEFINE_RES_MEM(S5PV210_PA_IIS1, SZ_256),
 78         [1] = DEFINE_RES_DMA(DMACH_I2S1_TX),
 79         [2] = DEFINE_RES_DMA(DMACH_I2S1_RX),
 80 };
 81 
 82 struct platform_device s5pv210_device_iis1 = {
 83         .name             = "samsung-i2s",
 84         .id               = 1,
 85         .num_resources    = ARRAY_SIZE(s5pv210_iis1_resource),
 86         .resource         = s5pv210_iis1_resource,
 87         .dev = {
 88                 .platform_data = &i2sv3_pdata,
 89         },
 90 };
 91 
 92 static struct resource s5pv210_iis2_resource[] = {
 93         [0] = DEFINE_RES_MEM(S5PV210_PA_IIS2, SZ_256),
 94         [1] = DEFINE_RES_DMA(DMACH_I2S2_TX),
 95         [2] = DEFINE_RES_DMA(DMACH_I2S2_RX),
 96 };

这两个设备是i2s driver的两个实例。

假设我在i2s driver中添加了一个函数EXPORT_SYMBOL,它将被2个不同的内核模块使用。

如何声明并使用此类导出函数执行以下操作:

if (called from kernel module 1):
 i2s_rxctrl the device id=0
elif (called from kernel module 2):
 i2s_rxctrl the device id=1

内核模块与设备ID的一对一映射。

基本上我要问的是如何使导出的符号为Object oriented style,因此对于每个实例,它将执行特定于设备的代码。我想给内核模块一个句柄*pdev,但这似乎是违规行为。

2 个答案:

答案 0 :(得分:0)

我认为您始终可以将参数和值传递给内核模块,并在驱动程序代码中进行检查。

答案 1 :(得分:0)

您可以创建自定义结构,其中包含所有必要信息,以便跨不同模块唯一标识您的实例(为什么不,也请* pdev)。然后,将此结构传递给您的库。由于您的自定义结构,库可以正确操作。