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

Writing kernel module(s) for a multi-function i2c device - one or many?

我有一个 i2c 设备,内置在我正在为其开发的板中。它响应单个地址,但第一个字节(有时称为 "command" 或 "register")指示所寻址的函数。

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

设备控制 LED(因此应该出现在 /sys/class/leds 中)。

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

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

我应该将其编码为:

  1. 一个 i2c 客户端模块,并找到一种方法将事物列在 /sys 中正确的位置。
  2. 一个平台模块和许多驱动程序模块,所有模块都(以某种方式)在特定于功能的地方共享单个 i2c 设备及其模块代码。

(这是我自 late-2.4 或 early-2.6 以来的第一个内核模块,那是很久以前的事了。)

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

核心模块包括:

GPIO模块包括:

核心模块初始化期间wm8350_i2c_probe() get called. It calls wm8350_device_init(). It create child platform devices using wm8350_client_dev_register()

子模块 drivers/gpio/gpio-wm8350.c 注册为 "platform: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);