核心驅動 i2c-mux-gpio

作者:Peter Korsgaard <peter.korsgaard@barco.com>

描述

i2c-mux-gpio 是一個 i2c 多路複用器驅動程式,提供從主 I2C 匯流排和透過 GPIO 引腳控制的硬體 MUX 訪問 I2C 匯流排段的能力。

例如。

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

主 I2C 匯流排的 SCL/SDA 根據 GPIO 引腳 1..N 的設定複用到匯流排段 1..M。

用法

i2c-mux-gpio 使用平臺匯流排,因此您需要提供一個 struct platform_device,其中 platform_data 指向一個 struct i2c_mux_gpio_platform_data,其中包含主匯流排的 I2C 介面卡號、要建立的匯流排段數以及用於控制它的 GPIO 引腳。 有關詳細資訊,請參見 include/linux/platform_data/i2c-mux-gpio.h。

例如,像這樣提供 4 個匯流排段,透過 3 個 GPIO 引腳控制的 MUX

#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 引腳編號,則可以提供晶片名稱 (.chip_name) 和相對 GPIO 引腳編號,i2c-mux-gpio 驅動程式將為您完成這項工作,包括在 GPIO 晶片未立即可用時進行延遲探測。

設備註冊

註冊 i2c-mux-gpio 裝置時,應將它使用的任何 GPIO 引腳的數量作為裝置 ID 傳遞。 這保證了每個例項都有一個不同的 ID。

或者,如果您不需要穩定的裝置名稱,您可以簡單地將 PLATFORM_DEVID_AUTO 作為裝置 ID 傳遞,平臺核心會將動態 ID 分配給您的裝置。 如果您在註冊時不知道絕對 GPIO 引腳編號,這甚至是唯一的選擇。