如何在 Orange Pi RV2 K1 SOC 上使用硬件时间戳运行 ptp4l?

几个月前,我买了一块基于 K1 SoC 的 Orange Pi RV2,用来体验 RISC-V。

我在 Armbian 论坛发了这个问题,但没有得到回复,所以来这里试试,希望能找到更多熟悉 K1 的专家。

我最初安装了 Orange Pi Ubuntu,最近又安装了 Armbian。我已经能够使用 RPI5 交叉编译 RV2 镜像,这很棒。

让我非常惊讶的是,通过查看 ethtool -T,我发现 RV2 开发板的以太网支持硬件时间戳。

root@orangepirv2:/sys/class/net/eth0/queues# ethtool -T eth0
Time stamping parameters for eth0:
Capabilities:
hardware-transmit
software-transmit
hardware-receive
software-receive
software-system-clock
hardware-raw-clock
Hardware timestamp provider index: 0
Hardware timestamp provider qualifier: Precise (IEEE 1588 quality)
Hardware Transmit Timestamp Modes:
off
on
Hardware Receive Filter Modes:
none
all
ptpv1-l4-event
ptpv1-l4-sync
ptpv1-l4-delay-req
ptpv2-l4-event
ptpv2-l4-sync
ptpv2-l4-delay-req
ptpv2-event
ptpv2-sync
ptpv2-delay-req

不过,无论以主时钟还是从时钟模式运行 ptp4l,尝试使用「ptp4l -i eth0 -2 -m --tx_timestamp_timeout 100 -s」或「ptp4l -i eth0 -2 -m --tx_timestamp_timeout 100」时,

我发现添加「–tx_timestamp_timeout 100」后,ptp4l 能获取发送时间戳,这对 TX 来说没问题;问题出在接收 SYNC 或 DELAY_REQ 时。

在从时钟模式下收到 SYNC,或在主时钟模式下收到 DELAY_REQ 时,ptp4l 报告无法接收时间戳。

主时钟模式下的 ptp4l 可以发送 SYNC,并为后续的 FOLLOWUP 报文接收时间戳,因此 RV2 以太网可以返回 TX 时间戳,但接收时间戳不起作用。

我检查了 K1 以太网数据手册中的 PTP 部分寄存器,关于 RX 过滤器的配置看起来没有问题。

我只是怀疑,可能用于为 PTP 报文添加时间戳的过滤器没有正常工作。

root@orangepirv2:/sys/class/net/eth0/queues# /root/Downloads/linuxptp-code/ptp4l -i eth0 -2 -m --tx_timestamp_timeout 100
ptp4l[120447.510]: selected /dev/ptp0 as PTP clock
ptp4l[120447.512]: port 1 (eth0): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[120447.513]: port 0 (/var/run/ptp/ptp4l): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[120447.513]: port 0 (/var/run/ptp/ptp4lro): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[120453.808]: port 1 (eth0): LISTENING to MASTER on ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES
ptp4l[120453.808]: selected local clock c0742b.fffe.fcd1e0 as best master
ptp4l[120453.808]: port 1 (eth0): assuming the grand master role
ptp4l[120492.717]: port 1 (eth0): received DELAY_REQ without timestamp
ptp4l[120493.027]: port 1 (eth0): received DELAY_REQ without timestamp
ptp4l[120494.187]: port 1 (eth0): received DELAY_REQ without timestamp
ptp4l[120494.332]: port 1 (eth0): received DELAY_REQ without timestamp
ptp4l[120495.579]: port 1 (eth0): received DELAY_REQ without timestamp
ptp4l[120496.234]: port 1 (eth0): received DELAY_REQ without timestamp
ptp4l[120496.659]: port 1 (eth0): received DELAY_REQ without timestamp
ptp4l[120498.583]: port 1 (eth0): received DELAY_REQ without timestamp

root@orangepirv2:/sys/class/net/eth0/queues# /root/Downloads/linuxptp-code/ptp4l -i eth0 -2 -m --tx_timestamp_timeout 100 -s
ptp4l[120550.932]: selected /dev/ptp0 as PTP clock
ptp4l[120550.934]: port 1 (eth0): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[120550.935]: port 0 (/var/run/ptp/ptp4l): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[120550.935]: port 0 (/var/run/ptp/ptp4lro): INITIALIZING to LISTENING on INIT_COMPLETE
ptp4l[120550.996]: port 1 (eth0): received SYNC without timestamp
ptp4l[120551.996]: port 1 (eth0): received SYNC without timestamp
ptp4l[120551.997]: port 1 (eth0): new foreign master 2ccf67.fffe.1f909a-1
ptp4l[120552.996]: port 1 (eth0): received SYNC without timestamp
ptp4l[120553.996]: port 1 (eth0): received SYNC without timestamp
ptp4l[120554.996]: port 1 (eth0): received SYNC without timestamp
ptp4l[120555.996]: port 1 (eth0): received SYNC without timestamp
ptp4l[120555.997]: selected best master clock 2ccf67.fffe.1f909a
ptp4l[120555.997]: port 1 (eth0): LISTENING to UNCALIBRATED on RS_SLAVE
ptp4l[120556.996]: port 1 (eth0): received SYNC without timestamp
ptp4l[120557.996]: port 1 (eth0): received SYNC without timestamp

Armbian 使用的是内核 6.18 中的 driver/net/ethernet/spacemit 驱动。

Orange Pi 使用的是较旧的内核 6.6,以及 driver/net/ethernet/k1 驱动。

这两个驱动除了少量改动外基本相同,PTP 处理部分看起来也完全一样。

希望能在这里找到尝试过使用支持 PTP 的 Spacemit 以太网运行 ptp4l 的内核开发者,提供一些帮助。

我经常使用 PTP,所以只要看到支持硬件时间戳的开发板,就会忍不住想试试。目前我知道支持硬件时间戳的开发板只有 RPI5 和 BeagleBoneBlack(即使它只有 100M)。

我熟悉内核,因此调试驱动对我来说没问题。

祝你今天愉快,也感谢你读到这里!

Chi-Thanh