基于 Linux 内核 GPIO 的简易逻辑分析仪¶
- 作者:
Wolfram Sang
简介¶
本文档简要描述了如何在隔离的 CPU 上运行基于 GPIO 的内核简易逻辑分析仪。
简易逻辑分析仪将利用系统上的几个处于输入模式的 GPIO 线快速采样这些数字线,如果满足奈奎斯特准则,将生成一个时间序列日志,其中包含这些线上出现的近似波形。一种使用方法是用导线(即数字探头)分析连接到这些 GPIO 线的外部流量,充当一个常见的逻辑分析仪。
另一个特性是窥探片上外设,如果这些外设的 I/O 单元可以在用作外设的输入或输出的同时,以 GPIO 输入模式使用。这意味着您可以例如在没有任何布线的情况下窥探 I2C 流量(如果您的硬件支持)。在引脚控制子系统中,此类引脚控制器被称为“非严格的”:某个引脚可以与某个外设同时用作 GPIO 输入线。
请注意,这是一个最后手段的分析仪,可能会受到延迟、不确定的代码路径和不可屏蔽中断的影响。它被称为“简易的”是有原因的。然而,例如对于远程开发,它可能有助于获得第一印象并辅助进一步的调试。
设置¶
您的内核必须启用 CONFIG_DEBUG_FS 和 CONFIG_CPUSETS。理想情况下,您的运行时环境不使用 cpusets,否则隔离 CPU 内核是最简单的。如果您确实需要 cpusets,请检查简易逻辑分析仪的辅助脚本是否会干扰您的其他设置。
告诉内核哪些 GPIO 用作探头。对于基于设备树的系统,您需要使用以下绑定。由于这些绑定仅用于调试,因此没有官方架构
i2c-analyzer {
compatible = "gpio-sloppy-logic-analyzer";
probe-gpios = <&gpio6 21 GPIO_OPEN_DRAIN>, <&gpio6 4 GPIO_OPEN_DRAIN>;
probe-names = "SCL", "SDA";
};
请注意,您必须为指定的每个 GPIO 提供一个名称。目前最多支持 8 个探头。可能可以支持 32 个,但尚未实现。
用法¶
逻辑分析仪可以通过 debugfs 中的文件进行配置。但是,强烈建议不要直接使用它们,而是使用脚本 tools/gpio/gpio-sloppy-logic-analyzer
。除了更广泛地检查参数之外,它还会隔离 CPU 内核,以便您在测量时受到最少的干扰。
该脚本有一个帮助选项来解释参数。对于上述 DT 片段,该片段在 Renesas Salvator-XS 开发板上以 400kHz 分析 I2C 总线,使用了以下设置:隔离的 CPU 应为 CPU1,因为它是 big.LITTLE 设置中的大核。由于 CPU1 是默认值,我们不需要参数。总线速度为 400kHz。因此,采样定理指出我们需要以至少 800kHz 的频率进行采样。然而,I2C 起始条件中两个信号的下降沿发生得更快,因此我们需要更高的采样频率,例如 -s 1500000
表示 1.5MHz。此外,我们不想立即采样,而是等待空闲总线上的起始条件。因此,我们需要将触发设置为 SDA 上的下降沿,而 SCL 保持高电平,即 -t 1H+2F
。最后一个是持续时间,这里我们假设为 15 毫秒,这导致参数 -d 15000
。因此,总共
gpio-sloppy-logic-analyzer -s 1500000 -t 1H+2F -d 15000
请注意,该过程将返回到提示符,但子进程仍在后台采样。除非此过程已完成,否则您将无法在当前或指定的目录中找到结果文件。对于上面的示例,我们需要触发 I2C 通信
i2cdetect -y -r <your bus number>
结果是一个 .sr 文件,可使用免费的 sigrok 项目中的 PulseView 或 sigrok-cli 进行使用。它是一个 zip 文件,其中还包含二进制样本数据,可供其他软件使用。文件名是逻辑分析仪实例名称加上自 epoch 以来的时间戳。