核心驅動 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 引腳編號,這甚至是唯一的選擇。