基於 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 以來的時間戳。