内核驱动 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 @   闹闹爸爸  阅读(947)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示