GPIO 聚合器

GPIO 聚合器提供了一种聚合 GPIO 并将其作为新的 gpio_chip 公开的机制。这支持以下用例。

使用 Sysfs 聚合 GPIO

GPIO 控制器使用 /dev/gpiochip* 字符设备导出到用户空间。对这些设备的访问控制由标准的 UNIX 文件系统权限提供,以全有或全无的方式:要么用户可以访问 GPIO 控制器,要么不能访问。

GPIO 聚合器通过将一组或多个 GPIO 聚合到新的 gpio_chip 中,为它们提供访问控制,该 gpio_chip 可以使用标准的 UNIX 文件所有权和权限分配给组或用户。此外,这简化并加强了将 GPIO 导出到虚拟机,因为虚拟机可以只抓取完整的 GPIO 控制器,不再需要关心要抓取哪些 GPIO 以及不抓取哪些 GPIO,从而减少了攻击面。

聚合的 GPIO 控制器通过写入 sysfs 中的只写属性文件来实例化和销毁。

/sys/bus/platform/drivers/gpio-aggregator/

“new_device” ...

用户空间可以通过写入字符串来描述要聚合到 “new_device” 文件中的 GPIO,从而请求内核实例化一个聚合的 GPIO 控制器,使用以下格式

[<gpioA>] [<gpiochipB> <offsets>] ...

其中

“<gpioA>” ...

是 GPIO 线名称,

“<gpiochipB>” ...

是 GPIO 芯片标签,并且

“<offsets>” ...

是由逗号分隔的 GPIO 偏移量和/或用破折号表示的 GPIO 偏移量范围的列表。

示例:通过将 “e6052000.gpio” 的 GPIO 线 19 和 “e6050000.gpio” 的 GPIO 线 20-21 聚合到新的 gpio_chip 中来实例化新的 GPIO 聚合器

$ echo 'e6052000.gpio 19 e6050000.gpio 20-21' > new_device
“delete_device” ...

用户空间可以在使用后通过将其设备名称写入 “delete_device” 文件来请求内核销毁聚合的 GPIO 控制器。

示例:销毁先前创建的聚合 GPIO 控制器,假设为 “gpio-aggregator.0”

$ echo gpio-aggregator.0 > delete_device

通用 GPIO 驱动程序

GPIO 聚合器还可以用作 DT 中描述的简单 GPIO 操作设备的通用驱动程序,而无需专用的内核驱动程序。这在工业控制中很有用,并且与例如 spidev 类似,它允许用户从用户空间与 SPI 设备通信。

将设备绑定到 GPIO 聚合器可以通过修改 gpio-aggregator 驱动程序或写入 Sysfs 中的 “driver_override” 文件来执行。

示例:如果 “door” 是 DT 中描述的 GPIO 操作设备,使用其自身的兼容值

door {
        compatible = "myvendor,mydoor";

        gpios = <&gpio2 19 GPIO_ACTIVE_HIGH>,
                <&gpio2 20 GPIO_ACTIVE_LOW>;
        gpio-line-names = "open", "lock";
};

可以通过以下方式将其绑定到 GPIO 聚合器

  1. 将其兼容值添加到 gpio_aggregator_dt_ids[]

  2. 使用 “driver_override” 手动绑定

$ echo gpio-aggregator > /sys/bus/platform/devices/door/driver_override
$ echo door > /sys/bus/platform/drivers/gpio-aggregator/bind

之后,已创建一个新的 gpiochip “door”

$ gpioinfo door
gpiochip12 - 2 lines:
        line   0:       "open"       unused   input  active-high
        line   1:       "lock"       unused   input  active-high