【问题标题】:Writing kernel module(s) for a multi-function i2c device - one or many?为多功能 i2c 设备编写内核模块——一个还是多个?
【发布时间】:2016-10-05 11:24:09
【问题描述】:

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

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

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

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

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

我应该这样编码吗:

  1. 一个 i2c 客户端模块,并找到一种方法将内容列在 /sys 的正确位置。
  2. 一个平台模块和许多驱动程序模块,都共享一个 i2c 设备(不知何故)及其模块代码在特定功能的地方。

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

【问题讨论】:

  • 我很难在答案部分进行微调。在此之前,您是否可以共享您要使用的设备名称/编号?要回答您的问题,是的,您需要在相应的层中为设备本身编写驱动程序。例如,在 linux/driver/leds/ 中编写 led 驱动程序。由于 led 本身导出类 /sys/class/leds,您可能需要了解 led 核心层并在其之上进行编写。如果我知道设备本身,我将能够具体回答。

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


【解决方案1】:

在 linux 源代码中查看 wm8350 模块。它由一个绑定到i2c总线的核心模块和许多使用核心模块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);

【讨论】:

  • lxr.free-electrons.com/source/drivers/mfd/…struct wm8350 是在哪里创建的?内核如何知道使用指向它的指针调用wm8350_device_init? (我之前在其他模块中使用过module_init宏,并没有遇到带参数的xxx_device_init。)
  • 别担心上面的评论。我的错误印象是 wm8350_core 是一个将被“初始化”并启动其他内核的内核。 lxr.free-electrons.com/source/drivers/mfd/… 表明它是负责“初始化”wm8350-core 模块的 wm8350-i2c 模块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-04
  • 1970-01-01
相关资源
最近更新 更多