Linux 的 PTP 硬體時鐘基礎設施

此補丁集引入了 Linux 中對 IEEE 1588 PTP 時鐘的支援。 結合 SO_TIMESTAMPING 套接字選項,這提供了一種標準化方法,用於開發 PTP 使用者空間程式、將 Linux 與外部時鐘同步以及使用 PTP 硬體時鐘的輔助功能。

一個新的類驅動程式匯出一個核心介面用於特定時鐘驅動程式和一個使用者空間介面。 該基礎設施支援一整套 PTP 硬體時鐘功能。

  • 基本時鐘操作 - 設定時間 - 獲取時間 - 透過給定的偏移量原子地移動時鐘 - 調整時鐘頻率

  • 輔助時鐘功能 - 時間戳外部事件 - 可從使用者空間配置的週期輸出訊號 - 來自使用者空間的低通濾波器 (LPF) 訪問 - 透過 PPS 子系統同步 Linux 系統時間

PTP 硬體時鐘核心 API

PTP 時鐘驅動程式向類驅動程式註冊自身。 類驅動程式處理與使用者空間的所有互動。 時鐘驅動程式的作者只需實現程式設計時鐘硬體的細節。 時鐘驅動程式透過簡單的訊息傳遞介面通知類驅動程式非同步事件(警報和外部時間戳)。

類驅動程式支援多個 PTP 時鐘驅動程式。 在正常使用情況下,只需要一個 PTP 時鐘。 但是,為了測試和開發,在單個系統中擁有多個時鐘可能很有用,以便進行效能比較。

PTP 硬體時鐘使用者空間 API

類驅動程式還為每個註冊的時鐘建立一個字元裝置。 使用者空間可以使用來自字元裝置的開啟檔案描述符作為 POSIX 時鐘 ID,並且可以呼叫 clock_gettime、clock_settime 和 clock_adjtime。 這些呼叫實現了基本的時鐘操作。

使用者空間程式可以使用標準化的 ioctl 控制時鐘。 程式可以查詢、啟用、配置和停用輔助時鐘功能。 使用者空間可以透過阻塞 read() 和 poll() 接收帶有時間戳的事件。

編寫時鐘驅動程式

時鐘驅動程式包含 include/linux/ptp_clock_kernel.h 並透過向註冊方法提供“struct ptp_clock_info”來註冊自身。 時鐘驅動程式必須實現介面中的所有功能。 如果時鐘不提供特定的輔助功能,則驅動程式應僅從這些函式返回 -EOPNOTSUPP。

驅動程式必須確保介面中的所有方法都是可重入的。 由於大多數硬體實現將時間值視為作為兩個 32 位暫存器訪問的 64 位整數,因此驅動程式應使用 spin_lock_irqsave/spin_unlock_irqrestore 來防止併發訪問。 此鎖定無法在類驅動程式中完成,因為時鐘驅動程式的中斷服務例程也可能需要該鎖。

PTP 硬體時鐘對 '.adjphase' 的要求

“struct ptp_clock_info”介面具有“.adjphase”函式。 此函式對 PHC 有一組要求才能實現。

  • PHC 在內部實現伺服演算法,用於校正在 '.adjphase' 呼叫中傳遞的偏移量。

  • 當呼叫其他 PTP 調整函式時,PHC 伺服演算法將被停用。

注意: '.adjphase' 不是一個簡單的時間調整功能,它會根據提供的偏移量'跳躍' PHC 時鐘時間。 它應該使用內部演算法校正提供的偏移量。

支援的硬體

  • Freescale eTSEC gianfar

    • 2 個時間戳外部觸發器,可程式設計極性(可選中斷)

    • 2 個警報暫存器(可選中斷)

    • 3 個週期訊號(可選中斷)

  • 國家半導體 DP83640

    • 6 個 GPIO 可程式設計為輸入或輸出

    • 6 個具有專用功能(LED/JTAG/時鐘)的 GPIO 也可以用作通用輸入或輸出

    • GPIO 輸入可以對外部觸發器進行時間戳

    • GPIO 輸出可以產生週期訊號

    • 1 箇中斷引腳

  • 英特爾 IXP465

    • 輔助從/主模式快照(可選中斷)

    • 目標時間(可選中斷)

  • 瑞薩(IDT)ClockMatrix™

    • 最多 4 個獨立的 PHC 通道

    • 整合低通濾波器 (LPF),透過 .adjPhase 訪問(符合 ITU-T G.8273.2)

    • 可程式設計輸出週期訊號

    • 可程式設計輸入可以對外部觸發器進行時間戳

    • 透過韌體 (idtcm.bin) 進行驅動程式和/或硬體配置
      • LPF 設定(頻寬、相位限制、自動保持、物理層輔助(符合 ITU-T G.8273.2))

      • 可程式設計輸出 PTP 時鐘,任何高達 1GHz 的頻率(到其他 PHY/MAC 時間戳器,到 ASSP/SoC/FPGA 的 refclk)

      • 鎖定到 GNSS 輸入,GNSS 和使用者空間 PHC 控制之間的自動切換(可選)

  • NVIDIA Mellanox

    • GPIO
      • 某些 ConnectX-6 Dx 及更高版本的產品支援一個 GPIO,它可以對外部觸發器進行時間戳,以及一個 GPIO 來產生週期訊號。

      • 某些 ConnectX-5 及更早版本的產品支援一個 GPIO,配置為對外部觸發器進行時間戳或產生週期訊號。

    • PHC 例項
      • 所有 ConnectX 裝置都有一個自由執行的計數器

      • ConnectX-6 Dx 及更高版本的裝置具有 UTC 格式的計數器