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

为多功能i2c设备编写内核模块-一个还是多个?,c,linux,linux-kernel,kernel-module,i2c,C,Linux,Linux Kernel,Kernel Module,I2c,我有一个i2c设备,内置在我正在开发的板中。它只响应一个地址,但有时称为命令或寄存器的第一个字节指示所寻址的函数 我可以通过i2cset/get/detect从用户空间使用该设备,因此我知道一切正常 设备控制LED,因此应显示在/sys/class/led中 它还有GPIO,因此应该出现在/sys/class/GPIO中 还有六个不同的地方可以显示设备的部分功能 我应该将其编码为: 一个i2c客户机模块,并找到一种方法在/sys中的正确位置列出内容。 一个平台模块和多个驱动程序模块,都以某种方式

我有一个i2c设备,内置在我正在开发的板中。它只响应一个地址,但有时称为命令或寄存器的第一个字节指示所寻址的函数

我可以通过i2cset/get/detect从用户空间使用该设备,因此我知道一切正常

设备控制LED,因此应显示在/sys/class/led中

它还有GPIO,因此应该出现在/sys/class/GPIO中

还有六个不同的地方可以显示设备的部分功能

我应该将其编码为:

一个i2c客户机模块,并找到一种方法在/sys中的正确位置列出内容。 一个平台模块和多个驱动程序模块,都以某种方式共享单个i2c设备,其模块代码位于功能特定的位置。
这是我自2.4晚期或2.6早期以来的第一个内核模块,这是很久以前的事了。

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

核心模块包括:

-将wm8350绑定到i2c总线 -创建子平台设备并为子设备提供API GPIO模块包括:

在核心模块初始化期间调用。它叫。它使用创建子平台设备

子模块注册为平台的模块:wm8350 gpio,其入口点为

为了访问核心模块,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);

对我来说,很难在答题区发表文章。在此之前,您是否可以共享您将要使用的设备名称/编号?要回答您的问题,是的,您需要在相应的层中为设备本身编写驱动程序。例如,在linux/driver/led/中编写led驱动程序。当led本身导出class/sys/class/led时,您可能需要了解led核心层并在其上写入。如果我知道设备本身,我将能够回答具体问题。结构wm8350是在哪里创建的?内核如何知道使用指向它的指针调用wm8350_device_init?我以前在其他模块中使用过module_init宏,没有遇到带参数的xxx_device_init。不要担心上面的注释。我错误地认为wm8350_core是一个将被初始化并启动其他内核的内核。显示负责初始化wm8350核心模块的wm8350-i2c模块。