Configfs GPIO 模拟器

Configfs GPIO 模拟器 (gpio-sim) 提供了一种创建模拟 GPIO 芯片用于测试的方式。这些芯片暴露的引脚可以通过标准 GPIO 字符设备接口访问,也可以通过 sysfs 属性进行操作。

创建模拟芯片

gpio-sim 模块注册了一个名为 'gpio-sim' 的 configfs 子系统。有关 configfs 文件系统的详细信息,请参阅 configfs 文档。

用户可以创建 configfs 组和项目的层次结构,并修改暴露属性的值。一旦芯片实例化,这个层次结构将被转换为适当的设备属性。一般结构如下:

组: /config/gpio-sim

这是 gpio-sim configfs 树的顶级目录。

组: /config/gpio-sim/gpio-device

属性: /config/gpio-sim/gpio-device/dev_name

属性: /config/gpio-sim/gpio-device/live

这是一个表示 GPIO 平台设备的目录。'dev_name' 属性是只读的,允许用户空间读取平台设备名称(例如 'gpio-sim.0')。'live' 属性允许在设备完全配置后触发其实际创建。接受的值为:'1' 表示启用模拟设备,'0' 表示禁用并拆除它。

组: /config/gpio-sim/gpio-device/gpio-bankX

属性: /config/gpio-sim/gpio-device/gpio-bankX/chip_name

属性: /config/gpio-sim/gpio-device/gpio-bankX/num_lines

该组表示顶级平台设备下的 GPIO 引脚组。 'chip_name' 属性是只读的,允许用户空间读取该引脚组的设备名称。 'num_lines' 属性允许指定该引脚组暴露的引脚数量。

组: /config/gpio-sim/gpio-device/gpio-bankX/lineY

属性: /config/gpio-sim/gpio-device/gpio-bankX/lineY/name

该组表示偏移 Y 处的一个单独引脚。'name' 属性允许设置引脚名称,如同 'gpio-line-names' 属性所表示的那样。

项: /config/gpio-sim/gpio-device/gpio-bankX/lineY/hog

属性: /config/gpio-sim/gpio-device/gpio-bankX/lineY/hog/name

属性: /config/gpio-sim/gpio-device/gpio-bankX/lineY/hog/direction

该项使得 gpio-sim 模块占用关联的引脚。'name' 属性指定要使用的内核内部消费者名称。'direction' 属性指定占用的方向,并且必须是以下之一:'input'(输入)、'output-high'(高电平输出)和 'output-low'(低电平输出)。

在每个 bank 目录下,有一组属性可用于配置新芯片。此外,用户可以在芯片目录内 mkdir() 子目录,这些子目录允许为特定线路传递附加配置。这些子目录的名称必须采用以下形式:'line<offset>'(例如 'line0''line20' 等),因为模块将使用该名称将配置分配给给定偏移处的特定线路。

配置完成后,必须将 'live' 属性设置为 1 才能实例化芯片。可以将其设回 0 以销毁模拟芯片。模块将同步等待新的模拟设备成功探测,如果未发生,写入 'live' 将导致错误。

模拟 GPIO 芯片也可以在设备树中定义。兼容字符串必须是:"gpio-simulator"。支持的属性有:

"gpio-sim,label" - 芯片标签

其他标准 GPIO 属性(如 "gpio-line-names""ngpios""gpio-hog")也受支持。详情请参阅 GPIO 文档。

一个定义 GPIO 模拟器的设备树代码示例

gpio-sim {
    compatible = "gpio-simulator";

    bank0 {
        gpio-controller;
        #gpio-cells = <2>;
        ngpios = <16>;
        gpio-sim,label = "dt-bank0";
        gpio-line-names = "", "sim-foo", "", "sim-bar";
    };

    bank1 {
        gpio-controller;
        #gpio-cells = <2>;
        ngpios = <8>;
        gpio-sim,label = "dt-bank1";

        line3 {
            gpio-hog;
            gpios = <3 0>;
            output-high;
            line-name = "sim-hog-from-dt";
        };
    };
};

操作模拟引脚

每个模拟 GPIO 芯片在其设备目录下为每个暴露的引脚创建一个独立的 sysfs 组(例如 /sys/devices/platform/gpio-sim.X/gpiochipY/)。每个组的名称形式为:'sim_gpioX',其中 X 是引脚的偏移量。每个组内有两个属性:

pull - 允许读取和设置当前模拟的拉(pull)设置,

写入时,值必须是以下之一:'pull-up'(上拉),'pull-down'(下拉)

value - 允许读取引脚的当前值,该值可能

与上拉/下拉值不同,如果引脚正由用户空间驱动