内核驱动 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号的绝对值,这甚至是唯一的选择。
本文来自博客园,作者:闹闹爸爸,转载请注明原文链接:https://www.cnblogs.com/wanglouxiaozi/p/15149445.html