Just an update to my earlier question: I found that the utility mii-tool can be used to read/write registers of the PHY through the MII interface. This is independent of LinuxPTP and can be used to program the DP83640 to output PTP synchronized clocks or issue triggers at a user specified PTP time on its GPIO pins. One form of a "periodic trigger" is a PPS signal. I used the output clock successfully to clock an FPGA that in turn clocks a 250 MHz ADC and captured its data.
A version of mii-tool modified to suit my purposes has been posted at
http://support.xia.com/default.asp?W801
The utility can be called from the Linux shell at any time by the user; I suppose on could integrate it into a program if necessary. As is it's good enough for my purposes to synchronize the snippets of the ADC stream from multiple devices.

Regards,

Wolfgang

Wolfgang Hennig wrote:


Richard Cochran wrote:
On Tue, Apr 18, 2017 at 12:54:23PM -0700, Wolfgang Hennig wrote:
I'm working on a project where a Xilinx Zynq uses a DP83640 (eval board) as the Ethernet PHY. I'm running Ubuntu/Linaro 15 on the Zynq's ARM processor and successfully modified kernel options and compiled/installed LinuxPTP to synchronize time over the network. Now I would like to use the DP83640's configurable reference clock (output on a GPIO pin) to clock logic in the
FPGA section of the Zynq. To do that I would need to read/write the
DP83640's internal registers, but I don't know how.

It seems that there is some functionality in setting the registers in
dp83640.c. In an earlier post in this list:
We don't have any support for enabling the clock output.  You can hack
this in using something like this:

    ext_write(0, phydev, PAGE6, PTP_COC, coc);
That worked pretty well.
I put it in dp838640_config_init (as a first test).

I should add that I did not (yet) find where/how to modify the xemacps
driver per https://lwn.net/Articles/392150/
    1. Before mdio_register, add
        bus->locktype = MDIOBUS_ATOMIC_RW;
    2. In the .ndo_start_xmit function, add
        skb_tx_timestamp()
    3. In the NAPI poll function, add
        skb_rx_timestamp()
That info is obsolete.  All you need is a MAC driver that uses phylib
and calls skb_tx_timestamp().

and so the HW timestamping might have been provided by the Zynq's build in
TSU instead of the DP83640. How would you tell?
If your Zynq driver implements time stamping or PHC, then you should
disable or remove that code.
There was definitely an issue there. Three changes in/for the xemacps driver were required:
1) turn off option CONFIG_XILINX_PS_EMAC_HWTSTAMP for the kernel compile
2) in ~line 2800 of xilinx_emacps.c, function xemacps_ioctl, add the #else section below so that it responds with the PHY's HW timestamping capabilities when queried by ptp4l. (Interestingly, ethtool -T always reports the PHY's capabilities)
    switch (cmd) {
    case SIOCGMIIPHY:
    case SIOCGMIIREG:
    case SIOCSMIIREG:
        return phy_mii_ioctl(phydev, rq, cmd);
#ifdef CONFIG_XILINX_PS_EMAC_HWTSTAMP
    case SIOCSHWTSTAMP:
        return xemacps_hwtstamp_ioctl(ndev, rq, cmd);
#else
case SIOCSHWTSTAMP:
        return phy_mii_ioctl(phydev, rq, cmd);
#endif
3) I added skb_tx_timestamp(skb) in line 2256 of xilinx_emacps.c, before the for loop over nr_frags. Seems to work, didn't experiment with other locations.



I now get offsets from master of about 100ns through our local network and <10ns when connecting 2 boards back to back. The DP83640's CLK_OUT signals are pretty well synchronized (looking at an oscilloscope I see the edges drifting by about 10ns relative to each other).


Thank you very much for the hints, Richard, that was very helpful.

Wolfgang

BTW you can check sysfs to see the PHC device names:

What:        /sys/class/ptp/ptpN/clock_name
Description:
        This file contains the name of the PTP hardware clock
        as a human readable string. The purpose of this
        attribute is to provide the user with a "friendly
        name" and to help distinguish PHY based devices from
        MAC based ones. The string does not necessarily have
        to be any kind of unique id.


Does it matter where in the
function one adds skb_tx_timestamp()?
See the comment in include/linux/skbuff.h.

Thanks,
Richard


--
Wolfgang Hennig, Ph.D.
XIA LLC
31057 Genstar Rd.
Hayward CA 94544


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Linuxptp-users mailing list
Linuxptp-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-users

Reply via email to