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'

在每个组目录中,都有一组可用于配置新芯片的属性。此外,用户可以在芯片的目录中 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-up''pull-down'

value - 允许读取线路的当前值,这可能是

如果线路是从用户空间驱动的,则与拉动不同