我在 Jetson AGX Orin Developer Kit 64GB上开启了ptp4l.service服务,设置ptp4l使用软件时间戳,将AGX设置为slave,但是ptp4l无法正常运行。我用网线将AGX的以太网口连接到了另一台Orin NX的网口,Orin NX的ptp4l设置为master。
后来我写了三个cpp文件测试软件时间戳和硬件时间戳的获取,在AGX上的运行情况是:第一个multicast_sender_software.cpp使用软件时间戳,使用组播,接口绑定eth0,结果是poll超时;第二个multicast_sender_hardware.cpp使用硬件时间戳,使用组播,接口绑定eth0,poll没有超时,但是硬件时间戳返回0;第三个unicast_sender.cpp使用单播,没有绑定eth0,获取软件时间戳,能够获取到非零的软件时间戳。
在Orin NX上的运行情况是multicast_sender_software返回非零时间戳;multicast_sender_hardware poll超时;unicast_sender返回非零时间戳。
请问怎样设置AGX的操作系统才能正常获取到正常的软件时间戳或硬件时间戳?
我在后面附上了我运行的三个cpp文件,麻烦你们查看一下,看看能不能复现我的问题。我的理解是,如果multicast_sender_software或multicast_sender_hardware能够输出非零的时间戳,那么也能解决ptp4l.service服务获取tx timestamp超时的问题。
详细的信息如下:
service文件内容如下
[Unit]
Description=Precision Time Protocol (PTP) service
Documentation=man:ptp4l
[Service]
Type=simple
ExecStart=/usr/sbin/ptp4l -f /etc/linuxptp/ptp4l.conf -i eth0 -S -l 7
[Install]
WantedBy=multi-user.target
ptp4l.service的日志如下,其中包含了错误信息"timed out while polling for tx timestamp"
Dec 12 18:29:19 tegra ptp4l[5658]: [4953.913] port 1: new foreign master 48b02d.fffe.e9ffbd-1
Dec 12 18:29:23 tegra ptp4l[5658]: [4957.914] selected best master clock 48b02d.fffe.e9ffbd
Dec 12 18:29:23 tegra ptp4l[5658]: [4957.914] foreign master not using PTP timescale
Dec 12 18:29:23 tegra ptp4l[5658]: [4957.914] port 1: LISTENING to UNCALIBRATED on RS_SLAVE
Dec 12 18:29:24 tegra ptp4l[5658]: [4958.885] port 1: delay timeout
Dec 12 18:29:25 tegra ptp4l[5658]: [4959.885] timed out while polling for tx timestamp
Dec 12 18:29:25 tegra ptp4l[5658]: [4959.885] increasing tx_timestamp_timeout may correct this issue, but it is likely caused by a driver bug
Dec 12 18:29:25 tegra ptp4l[5658]: [4959.885] port 1: send delay request failed
Dec 12 18:29:25 tegra ptp4l[5658]: [4959.885] port 1: UNCALIBRATED to FAULTY on FAULT_DETECTED (FT_UNSPECIFIED)
Dec 12 18:29:25 tegra ptp4l[5658]: [4959.885] waiting 2^{4} seconds to clear fault on port 1
使用strace捕获ptp4l进程的关键信息如下,可以看到poll timeout
sendto(13, "\1\2\0,\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0<mf\377\376\2E~\0\1\0\277"..., 44, 0, {sa_family=AF_INET, sin_port=htons(319), sin_addr=inet_addr("224.0.1.129")}, 16) = 44
ppoll([{fd=13, events=POLLPRI}], 1, {tv_sec=1, tv_nsec=0}, NULL, 0) = 0 (Timeout)
三个cpp文件在下面的压缩包中,分别为软件组播multicast_sender_software.cpp、硬件组播multicast_sender_hardware.cpp、软件单播unicast_sender.cpp
linuxptp-test.tar.gz (2.4 KB)
这三个文件编译后在我的AGX上运行的输出如下:
multicast_sender_software:
Current timestamping flags:
- SOF_TIMESTAMPING_TX_SOFTWARE
- SOF_TIMESTAMPING_SOFTWARE
Multicast message sent, waiting for timestamp...
Poll timeout waiting for timestamp
multicast_sender_hardware:
Current timestamping flags:
- SOF_TIMESTAMPING_TX_HARDWARE
- SOF_TIMESTAMPING_RAW_HARDWARE
Multicast message sent, waiting for timestamp...
Time elapsed between sendto and recvmsg: 652181 nanoseconds
Software timestamp: 0.0
Hardware timestamp: 0.0
unicast_sender:
Current timestamping flags:
- SOF_TIMESTAMPING_TX_SOFTWARE
- SOF_TIMESTAMPING_SOFTWARE
Message sent, waiting for timestamp...
Time elapsed between sendto and recvmsg: 15648 nanoseconds
Software timestamp: 1734001851.518463409
另外AGX上运行ethtool命令的结果如下
robot@tegra:~/ptptest$ ethtool -T eth0
Time stamping parameters for eth0:
Capabilities:
hardware-transmit
software-transmit
hardware-receive
software-receive
software-system-clock
hardware-raw-clock
PTP Hardware Clock: 1
Hardware Transmit Timestamp Modes:
off
on
onestep-sync
Hardware Receive Filter Modes:
none
ptpv1-l4-sync
ptpv1-l4-delay-req
ptpv2-l4-sync
ptpv2-l4-delay-req
ptpv2-l2-sync
ptpv2-l2-delay-req
ptpv2-event