【问题标题】:How to associate a kernel module to a specific device (driver instance)?如何将内核模块关联到特定设备(驱动程序实例)?
【发布时间】:2013-04-26 02:53:52
【问题描述】:

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,它将被两个不同的内核模块使用。

我如何声明和使用这样一个导出的函数来执行以下操作:

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的句柄,但这似乎是一种违规。

【问题讨论】:

  • 我不明白。为什么要在两个不同的模块(两个不同的驱动程序)中使用一个函数?或者您的意思是两个不同的实例使用相同的驱动程序?
  • 我希望每个内核模块都与不同的实例进行交互。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 它与我在问题中的建议有何不同?
    • 您说要使用 pdev 但您认为这是违规行为。我认为只有 pdev,也许,是不够的(我不知道你真正的问题)。但是,是的,它是相同的东西,就像@Shuduo 回答:传递参​​数和值 或任何你想识别实例的东西。
    • 是的,这两个答案都是微不足道的,无论如何感谢您的努力。显然有时内核中没有奇迹般的解决方案。
    • 如果可行的话,微不足道是好的。它容易做,容易理解,错误少。奇迹是这些简单的解决方案有效:)
    猜你喜欢
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 2018-05-13
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多