Linux gpio-mockup 虚拟GPIO设备安装与使用指南

Linux gpio-mockup 虚拟GPIO设备安装与使用指南

1. 简介

gpio-mockup 是 Linux 内核自带的一个虚拟GPIO控制器驱动,适用于开发、测试和CI环境下无真实GPIO硬件时的GPIO相关功能验证。配合 gpiod 工具可模拟真实GPIO芯片。

mockup虚拟GPIO的常见使用场景

  • 驱动开发与调试:在没有真实GPIO硬件的环境下,开发和调试GPIO相关的内核驱动或用户空间程序。
  • 自动化测试与CI/CD:在持续集成(CI)环境下自动化测试GPIO相关代码,无需真实硬件。
  • 用户空间GPIO工具开发:开发和调试如libgpiod、gpiod命令行工具等用户空间GPIO操作工具。
  • 教学与实验环境:在教学、培训、实验环境下演示GPIO子系统的用法和行为,无需物理硬件。
  • 模拟中断/事件处理:配合内核自带的测试工具(如gpio-mockup-sim),模拟GPIO输入变化和中断触发,测试中断处理逻辑。
  • 系统移植与适配:在移植新平台或适配新硬件前,先用mockup验证系统对GPIO的支持和配置流程。

优势

  • 无需真实硬件,任何Linux主机可用
  • 灵活配置引脚和芯片数量
  • 支持中断模拟,便于事件驱动测试
  • 行为与真实GPIO一致,测试结果具备参考价值

典型用户

  • Linux内核/驱动开发者
  • 自动化测试工程师
  • 嵌入式系统开发者
  • 教学/培训讲师
  • 上层应用开发与验证人员

2. 检查内核是否支持 gpio-mockup

modinfo gpio-mockup

有输出即表示内核已编译该模块。


3. 加载 gpio-mockup 模块创建虚拟GPIO

3.1 作为可加载模块(推荐)

创建一个16引脚的虚拟GPIO芯片
sudo modprobe gpio-mockup gpio_mockup_ranges=-1,16
  • 加载后会在 /dev/ 下生成新的 gpiochipN 设备(如 /dev/gpiochip0)。
  • 可通过 gpiodetectgpioinfo 查看。
创建多个虚拟芯片
sudo modprobe gpio-mockup gpio_mockup_ranges=-1,8,-1,12
  • 上述命令会创建两个虚拟芯片,分别有8和12个引脚。

3.2 作为内建(built-in,y)进内核时的用法

如果你的内核将 gpio-mockup 编译为内建(y),则无法通过 modprobe/rmmod 动态加载或卸载。

传递参数方法:
  • 只能通过内核启动参数传递参数。
  • gpio_mockup.gpio_mockup_ranges=... 形式添加到内核启动参数。
操作步骤:
  1. 编辑 /etc/default/grub,在 GRUB_CMDLINE_LINUX_DEFAULTGRUB_CMDLINE_LINUX 末尾添加:
    gpio_mockup.gpio_mockup_ranges=-1,8,-1,12
    
    例如:
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash gpio_mockup.gpio_mockup_ranges=-1,8,-1,12"
    
  2. 更新 grub 并重启:
    sudo update-grub
    sudo reboot
    
  3. 重启后用 gpiodetectgpioinfo 检查虚拟GPIO是否生效。

注意:

  • 内建驱动无法卸载,只能重启或重新编译内核去掉内建。
  • 如需更改参数,需修改 grub 并重启。
  • 也可在 grub 菜单临时编辑内核参数(启动时按 e,在 linux 行末尾添加参数,Ctrl+X 启动)。

3.3 常用参数与高级用法

除了最常用的 gpio_mockup_ranges 参数外,gpio-mockup 还支持以下常用参数,适合更复杂的测试和开发场景:

1. gpio_mockup_ranges
  • 作用:指定要创建的虚拟GPIO芯片数量和每个芯片的引脚数。
  • 格式gpio_mockup_ranges=,[,,]...
    • 通常设为 -1(自动分配)
    • 为该芯片的引脚数
  • 示例
    sudo modprobe gpio-mockup gpio_mockup_ranges=-1,8,-1,16
    
    创建两个芯片,分别有8和16个引脚。
2. gpio_mockup_named_lines
  • 作用:为每个虚拟GPIO芯片的引脚分配自定义名称,便于测试和识别。
  • 格式gpio_mockup_named_lines=chip0_line0,chip0_line1,...:chip1_line0,chip1_line1,...
  • 示例
    sudo modprobe gpio-mockup gpio_mockup_ranges=-1,2 gpio_mockup_named_lines=LED1,LED2
    
    这样 gpiochip0 的两个引脚会被命名为 LED1LED2,用 sudo gpioinfo 可见。
3. gpio_mockup_hogs
  • 作用:在加载时自动将指定引脚设置为特定方向和电平(“hog”),模拟上电时被外设占用的场景。
  • 格式gpio_mockup_hogs=::::[,::::]...
    • :芯片编号(0为第一个mockup芯片)
    • :引脚编号
    • :hog名称
    • inputoutput
    • 01(仅output时有效)
  • 示例
    sudo modprobe gpio-mockup gpio_mockup_ranges=-1,4 gpio_mockup_hogs=0:0:hog0:output:1,0:1:hog1:input:0
    
    这样第一个芯片的0号引脚会被"hog"为高电平输出,1号引脚为输入。
4. gpio_mockup_irq
  • 作用:为每个芯片分配模拟中断(IRQ),用于测试中断相关功能。
  • 格式gpio_mockup_irq=[,...]
    • :每个芯片分配的IRQ数量
  • 示例
    sudo modprobe gpio-mockup gpio_mockup_ranges=-1,8 gpio_mockup_irq=4
    
    为第一个芯片分配4个模拟IRQ。
5. 参数组合示例
sudo modprobe gpio-mockup \
  gpio_mockup_ranges=-1,4,-1,2 \
  gpio_mockup_named_lines=LED1,LED2,SW1,SW2:BTN1,BTN2 \
  gpio_mockup_hogs=0:0:hog0:output:1,1:1:hog1:input:0 \
  gpio_mockup_irq=2,1
  • 创建两个芯片(4引脚和2引脚),分别命名,设置hog,分配IRQ。
6. 其他用法说明
  • 与内核测试工具配合:可用 tools/gpio/gpio-mockup-sim 工具模拟输入变化和中断触发。
  • 多芯片、多场景模拟:可一次性创建多个芯片,模拟复杂硬件环境。
  • 命名和hog功能:便于自动化测试脚本识别和操作特定引脚。

更多参数和用法可参考 官方文档 或 modinfo gpio-mockup


4. gpiod 工具安装与基本用法

4.1 安装方法

Ubuntu/Debian 系统
sudo apt update
sudo apt install gpiod libgpiod-dev
RedHat/CentOS/Fedora 系统
sudo dnf install gpiod libgpiod-devel
# 或
sudo yum install gpiod libgpiod-devel

4.2 常用命令行工具

  • gpiodetect :列出系统中的 GPIO 芯片
  • gpioinfo :显示每个 GPIO 芯片的引脚信息
  • gpioget :读取 GPIO 引脚电平
  • gpioset :设置 GPIO 引脚电平
  • gpiomon :监控 GPIO 引脚的电平变化
  • gpiofind :查找特定名字的 GPIO 引脚

5. 使用 gpiod 工具测试虚拟GPIO

请确保已正确安装gpiod工具。

sudo gpiodetect                # 列出所有GPIO芯片
sudo gpioinfo gpiochip0        # 查看虚拟芯片详细信息
sudo gpioset gpiochip0 0=1     # 设置第0号引脚为高电平
# 注意:直接用gpioset设置后用gpioget读取,并不能验证mockup引脚的输出状态。
# 原因:gpiod工具设计为输入/输出互斥,mockup驱动不会把输出状态反馈到输入端。
# 这样做无法测试输出电平是否被设置成功。
sudo gpioget gpiochip0 0       # 读取第0号引脚电平
sudo gpiomon gpiochip0 0       # 监控第0号引脚电平变化

6. 卸载虚拟GPIO模块

  • 仅限模块(m)方式可用
    sudo rmmod gpio-mockup
    
  • 内建(y)方式无法卸载,只能重启或重新编译内核。

7. 常见问题

  • 找不到gpio-mockup模块
    • 请确认内核版本较新(4.15+),并已编译gpio-mockup模块。
  • gpiodetect无输出
    • 检查模块是否加载成功,或参数是否正确。
  • 权限问题
    • 需root权限或将用户加入gpio组。
  • 内建方式参数不生效
    • 请确认参数已正确添加到内核启动参数,并已重启。

8. 参考资料

  • Linux kernel documentation: gpio-mockup
  • libgpiod 官方文档
  • libgpiod man pages
  • 树莓派 GPIO 使用 gpiod

你可能感兴趣的:(linux,服务器)