1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- * PTP hardware clock infrastructure for Linux
- This patch set introduces support for IEEE 1588 PTP clocks in
- Linux. Together with the SO_TIMESTAMPING socket options, this
- presents a standardized method for developing PTP user space
- programs, synchronizing Linux with external clocks, and using the
- ancillary features of PTP hardware clocks.
- A new class driver exports a kernel interface for specific clock
- drivers and a user space interface. The infrastructure supports a
- complete set of PTP hardware clock functionality.
- + Basic clock operations
- - Set time
- - Get time
- - Shift the clock by a given offset atomically
- - Adjust clock frequency
- + Ancillary clock features
- - One short or periodic alarms, with signal delivery to user program
- - Time stamp external events
- - Period output signals configurable from user space
- - Synchronization of the Linux system time via the PPS subsystem
- ** PTP hardware clock kernel API
- A PTP clock driver registers itself with the class driver. The
- class driver handles all of the dealings with user space. The
- author of a clock driver need only implement the details of
- programming the clock hardware. The clock driver notifies the class
- driver of asynchronous events (alarms and external time stamps) via
- a simple message passing interface.
- The class driver supports multiple PTP clock drivers. In normal use
- cases, only one PTP clock is needed. However, for testing and
- development, it can be useful to have more than one clock in a
- single system, in order to allow performance comparisons.
- ** PTP hardware clock user space API
- The class driver also creates a character device for each
- registered clock. User space can use an open file descriptor from
- the character device as a POSIX clock id and may call
- clock_gettime, clock_settime, and clock_adjtime. These calls
- implement the basic clock operations.
- User space programs may control the clock using standardized
- ioctls. A program may query, enable, configure, and disable the
- ancillary clock features. User space can receive time stamped
- events via blocking read() and poll(). One shot and periodic
- signals may be configured via the POSIX timer_settime() system
- call.
- ** Writing clock drivers
- Clock drivers include include/linux/ptp_clock_kernel.h and register
- themselves by presenting a 'struct ptp_clock_info' to the
- registration method. Clock drivers must implement all of the
- functions in the interface. If a clock does not offer a particular
- ancillary feature, then the driver should just return -EOPNOTSUPP
- from those functions.
- Drivers must ensure that all of the methods in interface are
- reentrant. Since most hardware implementations treat the time value
- as a 64 bit integer accessed as two 32 bit registers, drivers
- should use spin_lock_irqsave/spin_unlock_irqrestore to protect
- against concurrent access. This locking cannot be accomplished in
- class driver, since the lock may also be needed by the clock
- driver's interrupt service routine.
- ** Supported hardware
- + Freescale eTSEC gianfar
- - 2 Time stamp external triggers, programmable polarity (opt. interrupt)
- - 2 Alarm registers (optional interrupt)
- - 3 Periodic signals (optional interrupt)
- + National DP83640
- - 6 GPIOs programmable as inputs or outputs
- - 6 GPIOs with dedicated functions (LED/JTAG/clock) can also be
- used as general inputs or outputs
- - GPIO inputs can time stamp external triggers
- - GPIO outputs can produce periodic signals
- - 1 interrupt pin
- + Intel IXP465
- - Auxiliary Slave/Master Mode Snapshot (optional interrupt)
- - Target Time (optional interrupt)
|