为多功能i2c设备编写内核模块 - 一个还是多个?

时间:2016-10-05 11:24:09

标签: c linux linux-kernel kernel-module i2c

我有一个i2c设备,内置于我正在开发的电路板中。它响应单个地址,但第一个字节(有时称为"命令"或"寄存器")决定了所处理的功能。

我可以使用i2cset/get/detect用户空间中的设备,所以我知道一切正常。

设备控制LED(因此应显示在/sys/class/leds)。

它还有GPIO(因此应该出现在/sys/class/gpio)。

还有六个不同的地方应该出现部分设备的功能。

我应该将其编码为:

  1. 一个i2c客户端模块,找到一种在/sys的正确位置列出内容的方法。
  2. 一个平台模块和许多驱动程序模块,所有驱动程序模块都在功能特定的位置共享单个i2c设备(以某种方式)和模块代码。
  3. (这是我自2.4版本或2.6版本以来的第一个内核模块,它是很久以前的事了。)

1 个答案:

答案 0 :(得分:2)

在linux源代码中看看wm8350模块。它由一个绑定到i2c总线的核心模块和许多使用核心模块API访问芯片寄存器的子平台模块组成。

核心模块包括:

GPIO模块包括:

在核心模块初始化期间wm8350_i2c_probe()被调用。它调用wm8350_device_init()。它使用wm8350_client_dev_register()创建子平台设备。

子模块drivers/gpio/gpio-wm8350.c注册为"平台的模块:wm8350-gpio"它的切入点是wm8350_gpio_probe()

为了访问核心模块,GPIO模块执行:

107 static int wm8350_gpio_probe(struct platform_device *pdev)
108 {
109         struct wm8350 *wm8350 = dev_get_drvdata(pdev->dev.parent);

然后它调用类似

的东西
36         return wm8350_set_bits(wm8350, WM8350_GPIO_CONFIGURATION_I_O,
37                                1 << offset);