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

我有一个i2c设备,内置于我正在开发的电路板中.它响应单个地址,但第一个字节(有时称为“命令”或“寄存器”)指示所寻址的功能.

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

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

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

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

我应该将其编码为:

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

(这是我自2.4版本或2.6版本以来的第一个内核模块,这是很久以前的事了.)

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

核心模块包括:

> drivers/mfd/wm8350-i2c.c – 将wm8350绑定到i2c总线
> drivers/mfd/wm8350-core.c – 创建子平台设备并为子设备提供API

GPIO模块包括:

> drivers/gpio/gpio-wm8350.c

在核心模块初始化期间wm8350_i2c_probe()被调用.它调用wm8350_device_init().它使用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);
点赞