内核驱动 i2c-mux-gpio

描述

i2c-mux-gpio 是一个i2c mux驱动程序,提供从主i2c总线和通过GPIO管脚控制的硬件MUX访问i2c总线段。

例如:

 ----------              ----------  Bus segment 1   - - - - -
|          | SCL/SDA    |          |-------------- |           |
|          |------------|          |
|          |            |          | Bus segment 2 |           |
|  Linux   | GPIO 1..N  |   MUX    |---------------   Devices
|          |------------|          |               |           |
|          |            |          | Bus segment M
|          |            |          |---------------|           |
 ----------              ----------                  - - - - -

主I2C总线的SCL/SDA多路复用到总线段1..N,根据GPIO管脚1..N的设置。

使用方法

i2c-mux-gpio 使用平台总线,因此需要提供一个结构体 platform_device,其 platform_data 指向一个结构体 i2c_mux_gpio_platform_data,其中包含主总线的I2C适配器编号、要创建的总线段的数量以及用于控制它的GPIO引脚。

例如,一个MUX提供了通过3个GPIO管脚控制的4个总线段:

#include <linux/platform_data/i2c-mux-gpio.h>
#include <linux/platform_device.h>

static const unsigned myboard_gpiomux_gpios[] = {
      AT91_PIN_PC26, AT91_PIN_PC25, AT91_PIN_PC24
};

static const unsigned myboard_gpiomux_values[] = {
      0, 1, 2, 3
};

static struct i2c_mux_gpio_platform_data myboard_i2cmux_data = {
      .parent         = 1,
      .base_nr        = 2, /* optional */
      .values         = myboard_gpiomux_values,
      .n_values       = ARRAY_SIZE(myboard_gpiomux_values),
      .gpios          = myboard_gpiomux_gpios,
      .n_gpios        = ARRAY_SIZE(myboard_gpiomux_gpios),
      .idle           = 4, /* optional */
};

static struct platform_device myboard_i2cmux = {
      .name           = "i2c-mux-gpio",
      .id             = 0,
      .dev            = {
              .platform_data  = &myboard_i2cmux_data,
      },
};

如果你在注册时不知道绝对的GPIO pin号,你可以提供一个芯片名称(.chip_name)和相对的GPIO pin号,i2c-mux-gpio驱动程序会为你做这些工作,包括延迟探测如果GPIO芯片不能立即可用。

设备注册

当注册你的i2c-mux-gpio设备时,你应该传递它使用的任何GPIO引脚的编号作为设备ID。这保证了每个实例都有一个不同的ID。

或者,如果您不需要一个稳定的设备名称,您可以简单地传递PLATFORM_DEVID_AUTO作为设备ID,平台核心将为您的设备分配一个动态ID。如果您在注册时不知道GPIO pin号的绝对值,这甚至是唯一的选择。

posted @ 2021-08-16 18:56  闹闹爸爸  阅读(906)  评论(0编辑  收藏  举报