4.2 ENET IEEE-1588
4.2.1 Introduction
ENET IEEE-1588 드라이버는 네트워크 통신에서 clock의 정확한 동기를 가능하게 하는 일련의 기능을 수행한다.
드라이버는 IEEE-1588 전체 프로토콜을 지원하기 위한 프로토콜 스택이 필요하다. LinuxPTP 스택을 준수한다.
IEEE 1588이나 유사한 시간 동기화 프로토콜 구현을 허용하기 위해, ENET MAC은 들어오고(incoming) 나가는(outgoing) 프레임의 정확한 타임스탬프를 지원하는 타임스탬프 모듈과 결합된다.
4.2.1.1 Transmit Timestamping
전송 시에는 1588개의 이벤트 프레임에만 타임스탬프가 필요하다. 클라이언트 애플리케이션(예: MAC 드라이버)은 1588개의 이벤트 프레임을 감지하고 ff_tx_ts_frm 신호를 프레임과 함께 설정해야 한다.
전송된 모든 프레임에 대해, MAC은 프레임 시퀀스 번호(tx_ts_id(3:0))와 전송 상태가 합쳐진 tx_is(31:0)에서 캡쳐된 타임스탬프를 반환한다. 전송 상태 비트 tx_ts_stat(5)는 애플리케이션이 프레임에 대해 확인된 ff_tx_ts_frm 신호를 가지고 있음을 나타낸다.
ff_tx_ts_frm이 '1'로 설정이 되면, MAC은 TS_TIMESTAMP 레지스터에 프레임에 대한 타임스탬프를 추가로 기록한다. 인터럽트 비트 EIR(TS_AVAIL)은 새로운 타임스탬프를 사용할 수 있음을 나타내도록 설정한다.
(타임스탬프를 사용할 수 있는 시점을 알기 위한 EIR(TS_AVAIL) 인터럽트를 기다리는) 타임스탬프가 필요한 프레임을 전송할 때, 소프트웨어는 ff_tx_ts_frm 신호를 설정하여 핸드셰이킹 절차를 구현한다. 그러면 TS_TIMESTAMP 레지스터에서 타임스탬프를 읽을 수 있다. 이것은 모든 이벤트 프레임에 대해 수행된다. 다른 프렘임은 ff_tx_ts_frm 지시자를 사용하지 않으므로 타임스탬프 캡처를 방해하지 않는다.
4.2.1.2 Receive Timestamping
프레임이 수신될 때, 프레임 SFD 필드가 감지되면 MAC은 타이머 값을 래치하고 캡쳐된 타임스탬프를 ff_rx_ts(31:0)에 제공한다. 이것은 모든 수신된 프레임에서 수행된다.
DMA 컨트롤러는 프레임에서 제공된 타임스탬프를 소프트웨어에서 액세스하기 위한 수신 디스크립터 내의 해당 필드로 전송하는지 확인해야 한다.
4.2.2 Software Operation
1588 드라이버에는 아래와 같은 기능이 있다 :
- 모듈 초기화 - 디바이스별 구조로 모듈을 초기화하고 문자(character) 드라이버를 등록한다.
- 인터럽트 서비스 루틴 - TS_AVAIL, TS_TIMER와 같은 이벤트를 지원한다. 드라이버는 FEC 드라이버와 인터럽트 서비스 루틴을 공유한다.
4.2.2.1 Source Code Structure
아래 테이블은 drivers/net/ethernet/freescale 디렉토리에 있는 소스 파일 목록이다 .
Table 37. ENET 1588 File List
File | Description |
drivers/net/ethernet/frescale/fec.h | 레지스터 정의 헤더 파일 |
drivers/net/ethernet/freescale/fec_ptp.c | ENET 1588 타이머 |
4.2.2.2 Menu Configuration Options
기본적으로 ENET 1588은 활성화되어 있다.
4.2.2.3 Programming Interface
1588 드라이버는 Linuxptp 프로토콜 스택 인터페이스를 준수한다.
스택별 정의가 헤더 파일(fec.h)에 추가된다.
4.2.3 1588 Stack Introduction
이 릴리즈는 다음 유형의 1588 Stack을 지원한다 :
- Linuxptp stack
이 소프트웨어는 LinuxOS용 IEEE 표준 1588에 따라 Precision Time Protocol (PTP)의 구현이다. 이중 설계의 목표는 표준의 강력한 구현을 제공하고 Linux OS 커널에서 제공하는 가장 관련성이 높고 현대적인(modern) Application Programming Interfaces (API)를 사용하는 것이다. 레거시 API와 다른 플랫폼을 지원하는 것은 목표가 아니다. 소프트웨어 저작권은 저작자에게 있으며 GNU General Public License에 따라 사용이 허가된다.
소프트웨어 개발은 Source Forge에서 호스팅된다 : sourceforge.net/projects/linuxptp/
4.2.3.1 Linuxptp Stack Features
Linuxptp는 아래 기능을 지원한다 :
- Ordinary/Boundary Clock
- Best master clock algorithm
- Transport over UDP/IPv4, UDP/IPv6, and IEEE 802.3
- Transparent clock (E2E/P2P)
- 슬레이브 전용
- 마지막 스테이션 역할로 IEEE 802.1AS-2011 지원
4.2.3.2 Using Linuxptp
아래 명령으로 ptp4 1588 스택 바이너리를 실행한다.
Linuxptp :
Transport on UDP IPV4 with E2E delay mechanism: ptp4l -A -4 -H -m -i eth0
Transport on UDP IPV4 with P2P delay mechanism: ptp4l -P -A -4 -H -m -i eth0
Transport on UDP IPV6 with E2E delay mechanism: ptp4l -A -6 -H -m -i eth0
Transport on UDP IPV6 with P2P delay mechanism: ptp4l -P -A -6 -H -m -i eth0
Transport on IEEE 802.3 with E2E delay mechanism: ptp4l -A -2 -H -m -i eth0
Transport on IEEE 802.3 with P2P delay mechanism: ptp4l -P -A -2 -H -m -i eth0
※ Ordinary Clock : Ordinary Clock은 다른 포트로 전송하기 위해 메세지를 대기열에 넣지 않는 1포트 디바이스이다. 따라서 PTP 이벤트 메세지가 네트워크 스택의 MII 인터페이스에서 타임스탬프되는 한 정확도가 좋아야 한다.
※ Boundary Clock : Boundary Clock은 모든 IEEE 1588 메세지의 전송을 차단하는 라우터나 디바이스에 의해 정의된 서브넷에서 IEEE 1588 clock의 동기화를 허용하는 IEEE 1588 컴포넌트이다. Boundary Clock은 일반적으로 라우터와 유사한 디바이스에서 발생하는 통신 지연(latency)에서 큰 변동(fluctuation)을 제거하는 역할을 한다.