基于 Linux Kernel 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
。 最后是持续时间,让我们假设这里是 15ms,这将导致参数 -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 以来的时间戳。