我有一个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模块包括:
在核心模块初始化期间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);