diff options
author | Zhenhua Luo <zhenhua.luo@freescale.com> | 2014-11-06 11:40:46 +0800 |
---|---|---|
committer | Martin Jansa <Martin.Jansa@gmail.com> | 2014-11-19 15:21:04 +0100 |
commit | c8c17e074aa7d46f276915909fd12f48ce032266 (patch) | |
tree | a89f2b565130ae8ab226d5042785f153b35f3616 | |
parent | 940aa02a4e52cad477c1a581ee27f908051e873c (diff) | |
download | meta-openembedded-c8c17e074aa7d46f276915909fd12f48ce032266.tar.gz |
ptpd: add FSL QorIQ DPAA and eTSEC support
This patch is for Freescale QorIQ DPAA and eTSEC which support 1588 hardware
assist module, and mainly uses SO_TIMESTAMPING API for HW timestamp and PHC
API.
Signed-off-by: Yangbo Lu <yangbo.lu@freescale.com>
Signed-off-by: Zhenhua Luo <zhenhua.luo@freescale.com>
Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
-rw-r--r-- | meta-networking/recipes-daemons/ptpd/ptpd/ptpd-add-dpaa-etsec-support.patch | 621 | ||||
-rw-r--r-- | meta-networking/recipes-daemons/ptpd/ptpd_2.3.1-rc2.bb | 4 |
2 files changed, 624 insertions, 1 deletions
diff --git a/meta-networking/recipes-daemons/ptpd/ptpd/ptpd-add-dpaa-etsec-support.patch b/meta-networking/recipes-daemons/ptpd/ptpd/ptpd-add-dpaa-etsec-support.patch new file mode 100644 index 000000000..abb393310 --- /dev/null +++ b/meta-networking/recipes-daemons/ptpd/ptpd/ptpd-add-dpaa-etsec-support.patch | |||
@@ -0,0 +1,621 @@ | |||
1 | Add FSL QorIQ DPAA and eTSEC support | ||
2 | |||
3 | This patch is for Freescale QorIQ DPAA and eTSEC which support 1588 hardware | ||
4 | assist module, and mainly uses SO_TIMESTAMPING API for HW timestamp and PHC | ||
5 | API. | ||
6 | |||
7 | Signed-off-by: Lu Yangbo <yangbo.lu@freescale.com> | ||
8 | Upstream-Status: Submitted [http://sourceforge.net/p/ptpd/patches/56/] | ||
9 | |||
10 | diff --git a/src/bmc.c b/src/bmc.c | ||
11 | index f4c74bd..925daba 100644 | ||
12 | --- a/src/bmc.c | ||
13 | +++ b/src/bmc.c | ||
14 | @@ -249,6 +249,7 @@ void s1(MsgHeader *header,MsgAnnounce *announce,PtpClock *ptpClock, const RunTim | ||
15 | ptpClock->timePropertiesDS.ptpTimescale = IS_SET(header->flagField1, PTPT); | ||
16 | ptpClock->timePropertiesDS.timeSource = announce->timeSource; | ||
17 | |||
18 | +#ifndef FSL_1588 | ||
19 | #if defined(MOD_TAI) && NTP_API == 4 | ||
20 | /* | ||
21 | * update kernel TAI offset, but only if timescale is | ||
22 | @@ -261,6 +262,7 @@ void s1(MsgHeader *header,MsgAnnounce *announce,PtpClock *ptpClock, const RunTim | ||
23 | INFO("Set kernel UTC offset to %d\n", ptpClock->timePropertiesDS.currentUtcOffset); | ||
24 | } | ||
25 | #endif /* MOD_TAI */ | ||
26 | +#endif | ||
27 | |||
28 | /* Leap second handling */ | ||
29 | |||
30 | @@ -280,9 +282,11 @@ void s1(MsgHeader *header,MsgAnnounce *announce,PtpClock *ptpClock, const RunTim | ||
31 | ptpClock->leapSecondPending = FALSE; | ||
32 | ptpClock->leapSecondInProgress = FALSE; | ||
33 | timerStop(LEAP_SECOND_PAUSE_TIMER, ptpClock->itimer); | ||
34 | +#ifndef FSL_1588 | ||
35 | #ifdef HAVE_SYS_TIMEX_H | ||
36 | unsetTimexFlags(STA_INS | STA_DEL,TRUE); | ||
37 | #endif /* HAVE_SYS_TIMEX_H */ | ||
38 | +#endif /* FSL_1588 */ | ||
39 | } | ||
40 | |||
41 | /* | ||
42 | @@ -295,6 +299,7 @@ void s1(MsgHeader *header,MsgAnnounce *announce,PtpClock *ptpClock, const RunTim | ||
43 | ((!previousLeap59 && ptpClock->timePropertiesDS.leap59) || | ||
44 | (!previousLeap61 && ptpClock->timePropertiesDS.leap61)))) { | ||
45 | #ifdef HAVE_SYS_TIMEX_H | ||
46 | +#ifndef FSL_1588 | ||
47 | WARNING("Leap second pending! Setting kernel to %s " | ||
48 | "one second at midnight\n", | ||
49 | ptpClock->timePropertiesDS.leap61 ? "add" : "delete"); | ||
50 | @@ -304,6 +309,7 @@ void s1(MsgHeader *header,MsgAnnounce *announce,PtpClock *ptpClock, const RunTim | ||
51 | setTimexFlags(ptpClock->timePropertiesDS.leap61 ? STA_INS : STA_DEL, | ||
52 | FALSE); | ||
53 | } | ||
54 | +#endif | ||
55 | #else | ||
56 | WARNING("Leap second pending! No kernel leap second " | ||
57 | "API support - expect a clock jump at " | ||
58 | diff --git a/src/dep/net.c b/src/dep/net.c | ||
59 | index 34d23ad..9075847 100644 | ||
60 | --- a/src/dep/net.c | ||
61 | +++ b/src/dep/net.c | ||
62 | @@ -85,6 +85,9 @@ | ||
63 | #include <linux/ethtool.h> | ||
64 | #endif /* SO_TIMESTAMPING */ | ||
65 | |||
66 | +#if defined(FSL_1588) | ||
67 | +char fsl_1588_if_name[IFACE_NAME_LENGTH]; | ||
68 | +#endif | ||
69 | /** | ||
70 | * shutdown the IPv4 multicast for specific address | ||
71 | * | ||
72 | @@ -461,6 +464,9 @@ testInterface(char * ifaceName, RunTimeOpts* rtOpts) | ||
73 | if(getInterfaceInfo(ifaceName, &info) != 1) | ||
74 | return FALSE; | ||
75 | |||
76 | +#if defined(FSL_1588) | ||
77 | + memcpy(fsl_1588_if_name, ifaceName, IFACE_NAME_LENGTH); | ||
78 | +#endif | ||
79 | switch(rtOpts->transport) { | ||
80 | |||
81 | case UDP_IPV4: | ||
82 | @@ -666,6 +672,27 @@ end: | ||
83 | } | ||
84 | #endif /* SO_TIMESTAMPING */ | ||
85 | |||
86 | +#if defined(FSL_1588) | ||
87 | +/* select HWTSTAMP_TX_ON or HWTSTAMP_TX_OFF */ | ||
88 | +void hwtstamp_tx_ctl(NetPath *netPath, Boolean enable) | ||
89 | +{ | ||
90 | + struct ifreq hwtstamp; | ||
91 | + struct hwtstamp_config hwconfig; | ||
92 | + | ||
93 | + memset(&hwtstamp, 0, sizeof(hwtstamp)); | ||
94 | + strncpy(hwtstamp.ifr_name, fsl_1588_if_name, sizeof(hwtstamp.ifr_name)); | ||
95 | + hwtstamp.ifr_data = (void *)&hwconfig; | ||
96 | + memset(&hwconfig, 0, sizeof(hwconfig)); | ||
97 | + hwconfig.tx_type = | ||
98 | + enable ? | ||
99 | + HWTSTAMP_TX_ON : HWTSTAMP_TX_OFF; | ||
100 | + hwconfig.rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_SYNC; | ||
101 | + if (ioctl(netPath->eventSock, SIOCSHWTSTAMP, &hwtstamp) < 0 | ||
102 | + || ioctl(netPath->generalSock, SIOCSHWTSTAMP, &hwtstamp) < 0) | ||
103 | + printf("error:hwtstamp_tx_ctl\n"); | ||
104 | +} | ||
105 | +#endif | ||
106 | + | ||
107 | |||
108 | /** | ||
109 | * Initialize timestamping of packets | ||
110 | @@ -682,10 +709,17 @@ netInitTimestamping(NetPath * netPath, RunTimeOpts * rtOpts) | ||
111 | Boolean result = TRUE; | ||
112 | #if defined(SO_TIMESTAMPING) && defined(SO_TIMESTAMPNS)/* Linux - current API */ | ||
113 | DBG("netInitTimestamping: trying to use SO_TIMESTAMPING\n"); | ||
114 | +#if defined(FSL_1588) | ||
115 | + val = SOF_TIMESTAMPING_TX_HARDWARE | | ||
116 | + SOF_TIMESTAMPING_RX_HARDWARE | | ||
117 | + SOF_TIMESTAMPING_RAW_HARDWARE; | ||
118 | +#else | ||
119 | val = SOF_TIMESTAMPING_TX_SOFTWARE | | ||
120 | SOF_TIMESTAMPING_RX_SOFTWARE | | ||
121 | SOF_TIMESTAMPING_SOFTWARE; | ||
122 | +#endif | ||
123 | |||
124 | +#ifndef FSL_1588 | ||
125 | /* unless compiled with PTPD_EXPERIMENTAL, check if we support the desired tstamp capabilities */ | ||
126 | #ifndef PTPD_EXPERIMENTAL | ||
127 | #ifdef ETHTOOL_GET_TS_INFO | ||
128 | @@ -716,6 +750,7 @@ netInitTimestamping(NetPath * netPath, RunTimeOpts * rtOpts) | ||
129 | val = 1; | ||
130 | #endif /* ETHTOOL_GET_TS_INFO */ | ||
131 | #endif /* PTPD_EXPERIMENTAL */ | ||
132 | +#endif /* FSL_1588 */ | ||
133 | |||
134 | if(val == 1) { | ||
135 | if (setsockopt(netPath->eventSock, SOL_SOCKET, SO_TIMESTAMPNS, &val, sizeof(int)) < 0) { | ||
136 | @@ -902,6 +937,9 @@ netInit(NetPath * netPath, RunTimeOpts * rtOpts, PtpClock * ptpClock) | ||
137 | |||
138 | DBG("Listening on IP: %s\n",inet_ntoa( | ||
139 | ((struct sockaddr_in*)&(netPath->interfaceInfo.afAddress))->sin_addr)); | ||
140 | +#if defined(FSL_1588) | ||
141 | + hwtstamp_tx_ctl(&ptpClock->netPath, FALSE);/* HWTSTAMP_TX_OFF */ | ||
142 | +#endif | ||
143 | |||
144 | #ifdef PTPD_PCAP | ||
145 | if (rtOpts->pcap == TRUE) { | ||
146 | @@ -1319,7 +1357,11 @@ netRecvEvent(Octet * buf, TimeInternal * time, NetPath * netPath, int flags) | ||
147 | #if defined(SO_TIMESTAMPING) && defined(SO_TIMESTAMPNS) | ||
148 | if(cmsg->cmsg_type == SO_TIMESTAMPING || | ||
149 | cmsg->cmsg_type == SO_TIMESTAMPNS) { | ||
150 | +#if defined(FSL_1588) | ||
151 | + ts = (struct timespec *)CMSG_DATA(cmsg) + 2; | ||
152 | +#else | ||
153 | ts = (struct timespec *)CMSG_DATA(cmsg); | ||
154 | +#endif | ||
155 | time->seconds = ts->tv_sec; | ||
156 | time->nanoseconds = ts->tv_nsec; | ||
157 | timestampValid = TRUE; | ||
158 | @@ -1520,6 +1562,9 @@ netSendEvent(Octet * buf, UInteger16 length, NetPath * netPath, | ||
159 | ssize_t ret; | ||
160 | struct sockaddr_in addr; | ||
161 | |||
162 | +#if defined(FSL_1588) | ||
163 | + hwtstamp_tx_ctl(netPath, TRUE);/* HWTSTAMP_TX_ON */ | ||
164 | +#endif | ||
165 | addr.sin_family = AF_INET; | ||
166 | addr.sin_port = htons(PTP_EVENT_PORT); | ||
167 | |||
168 | @@ -1559,6 +1604,9 @@ netSendEvent(Octet * buf, UInteger16 length, NetPath * netPath, | ||
169 | DBG("Error sending unicast event message\n"); | ||
170 | else | ||
171 | netPath->sentPackets++; | ||
172 | +#if defined(FSL_1588) | ||
173 | + usleep(100); | ||
174 | +#endif | ||
175 | #ifndef SO_TIMESTAMPING | ||
176 | /* | ||
177 | * Need to forcibly loop back the packet since | ||
178 | @@ -1574,10 +1622,14 @@ netSendEvent(Octet * buf, UInteger16 length, NetPath * netPath, | ||
179 | #else | ||
180 | if(!netPath->txTimestampFailure) { | ||
181 | if(!getTxTimestamp(netPath, tim)) { | ||
182 | +#if defined(FSL_1588) | ||
183 | + printf("getTxTimestamp: get tx timestamp error\n"); | ||
184 | +#else | ||
185 | netPath->txTimestampFailure = TRUE; | ||
186 | if (tim) { | ||
187 | clearTime(tim); | ||
188 | } | ||
189 | +#endif | ||
190 | } | ||
191 | } | ||
192 | |||
193 | @@ -1609,9 +1661,15 @@ netSendEvent(Octet * buf, UInteger16 length, NetPath * netPath, | ||
194 | DBG("Error sending multicast event message\n"); | ||
195 | else | ||
196 | netPath->sentPackets++; | ||
197 | +#if defined(FSL_1588) | ||
198 | + usleep(100); | ||
199 | +#endif | ||
200 | #ifdef SO_TIMESTAMPING | ||
201 | if(!netPath->txTimestampFailure) { | ||
202 | if(!getTxTimestamp(netPath, tim)) { | ||
203 | +#if defined(FSL_1588) | ||
204 | + printf("getTxTimestamp: get tx timestamp error\n"); | ||
205 | +#else | ||
206 | if (tim) { | ||
207 | clearTime(tim); | ||
208 | } | ||
209 | @@ -1620,6 +1678,7 @@ netSendEvent(Octet * buf, UInteger16 length, NetPath * netPath, | ||
210 | |||
211 | /* Try re-enabling MULTICAST_LOOP */ | ||
212 | netSetMulticastLoopback(netPath, TRUE); | ||
213 | +#endif | ||
214 | } | ||
215 | } | ||
216 | #endif /* SO_TIMESTAMPING */ | ||
217 | @@ -1638,6 +1697,9 @@ netSendGeneral(Octet * buf, UInteger16 length, NetPath * netPath, | ||
218 | ssize_t ret; | ||
219 | struct sockaddr_in addr; | ||
220 | |||
221 | +#if defined(FSL_1588) | ||
222 | + hwtstamp_tx_ctl(netPath, TRUE);/* HWTSTAMP_TX_ON */ | ||
223 | +#endif | ||
224 | addr.sin_family = AF_INET; | ||
225 | addr.sin_port = htons(PTP_GENERAL_PORT); | ||
226 | |||
227 | @@ -1707,6 +1769,9 @@ netSendPeerGeneral(Octet * buf, UInteger16 length, NetPath * netPath, RunTimeOpt | ||
228 | ssize_t ret; | ||
229 | struct sockaddr_in addr; | ||
230 | |||
231 | +#if defined(FSL_1588) | ||
232 | + hwtstamp_tx_ctl(netPath, TRUE);/* HWTSTAMP_TX_ON */ | ||
233 | +#endif | ||
234 | addr.sin_family = AF_INET; | ||
235 | addr.sin_port = htons(PTP_GENERAL_PORT); | ||
236 | |||
237 | @@ -1762,6 +1827,9 @@ netSendPeerEvent(Octet * buf, UInteger16 length, NetPath * netPath, RunTimeOpts | ||
238 | ssize_t ret; | ||
239 | struct sockaddr_in addr; | ||
240 | |||
241 | +#if defined(FSL_1588) | ||
242 | + hwtstamp_tx_ctl(netPath, TRUE);/* HWTSTAMP_TX_ON */ | ||
243 | +#endif | ||
244 | addr.sin_family = AF_INET; | ||
245 | addr.sin_port = htons(PTP_EVENT_PORT); | ||
246 | |||
247 | @@ -1788,6 +1856,9 @@ netSendPeerEvent(Octet * buf, UInteger16 length, NetPath * netPath, RunTimeOpts | ||
248 | DBG("Error sending unicast peer event message\n"); | ||
249 | else | ||
250 | netPath->sentPackets++; | ||
251 | +#if defined(FSL_1588) | ||
252 | + usleep(100); | ||
253 | +#endif | ||
254 | |||
255 | #ifndef SO_TIMESTAMPING | ||
256 | /* | ||
257 | @@ -1804,10 +1875,14 @@ netSendPeerEvent(Octet * buf, UInteger16 length, NetPath * netPath, RunTimeOpts | ||
258 | #else | ||
259 | if(!netPath->txTimestampFailure) { | ||
260 | if(!getTxTimestamp(netPath, tim)) { | ||
261 | +#if defined(FSL_1588) | ||
262 | + printf("getTxTimestamp: get tx timestamp error\n"); | ||
263 | +#else | ||
264 | netPath->txTimestampFailure = TRUE; | ||
265 | if (tim) { | ||
266 | clearTime(tim); | ||
267 | } | ||
268 | +#endif | ||
269 | } | ||
270 | } | ||
271 | |||
272 | @@ -1839,9 +1914,15 @@ netSendPeerEvent(Octet * buf, UInteger16 length, NetPath * netPath, RunTimeOpts | ||
273 | DBG("Error sending multicast peer event message\n"); | ||
274 | else | ||
275 | netPath->sentPackets++; | ||
276 | +#if defined(FSL_1588) | ||
277 | + usleep(100); | ||
278 | +#endif | ||
279 | #ifdef SO_TIMESTAMPING | ||
280 | if(!netPath->txTimestampFailure) { | ||
281 | if(!getTxTimestamp(netPath, tim)) { | ||
282 | +#if defined(FSL_1588) | ||
283 | + printf("getTxTimestamp: get tx timestamp error\n"); | ||
284 | +#else | ||
285 | if (tim) { | ||
286 | clearTime(tim); | ||
287 | } | ||
288 | @@ -1850,6 +1931,7 @@ netSendPeerEvent(Octet * buf, UInteger16 length, NetPath * netPath, RunTimeOpts | ||
289 | |||
290 | /* Try re-enabling MULTICAST_LOOP */ | ||
291 | netSetMulticastLoopback(netPath, TRUE); | ||
292 | +#endif | ||
293 | } | ||
294 | } | ||
295 | #endif /* SO_TIMESTAMPING */ | ||
296 | diff --git a/src/dep/ntpengine/ntpdcontrol.c b/src/dep/ntpengine/ntpdcontrol.c | ||
297 | index d773284..e84af9e 100644 | ||
298 | --- a/src/dep/ntpengine/ntpdcontrol.c | ||
299 | +++ b/src/dep/ntpengine/ntpdcontrol.c | ||
300 | @@ -170,6 +170,15 @@ get_systime( | ||
301 | { | ||
302 | double dtemp; | ||
303 | |||
304 | +#if defined(FSL_1588) | ||
305 | + struct timespec tp; | ||
306 | + clock_gettime(clkid, &tp); | ||
307 | + tv.tv_sec = tp.tv_sec; | ||
308 | + tv.tv_usec = tp.tv_nsec / 1000; | ||
309 | + | ||
310 | + now->l_i = tv.tv_sec + JAN_1970; | ||
311 | + dtemp = tv.tv_usec / 1e6; | ||
312 | +#else /* FSL_1588 */ | ||
313 | #if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_GETCLOCK) | ||
314 | struct timespec ts; /* seconds and nanoseconds */ | ||
315 | |||
316 | @@ -195,6 +204,7 @@ get_systime( | ||
317 | dtemp = tv.tv_usec / 1e6; | ||
318 | |||
319 | #endif /* HAVE_CLOCK_GETTIME || HAVE_GETCLOCK */ | ||
320 | +#endif /* FSL_1588 */ | ||
321 | |||
322 | /* | ||
323 | * Renormalize to seconds past 1900 and fraction. | ||
324 | diff --git a/src/dep/ptpd_dep.h b/src/dep/ptpd_dep.h | ||
325 | index 8778988..03ae642 100644 | ||
326 | --- a/src/dep/ptpd_dep.h | ||
327 | +++ b/src/dep/ptpd_dep.h | ||
328 | @@ -14,6 +14,7 @@ | ||
329 | #define PTPD_DBGV | ||
330 | #endif | ||
331 | |||
332 | +#define FSL_1588 1 | ||
333 | /** \name System messages*/ | ||
334 | /**\{*/ | ||
335 | |||
336 | @@ -280,6 +281,11 @@ UInteger16 msgPackManagementResponse(Octet * buf,MsgHeader*,MsgManagement*,PtpCl | ||
337 | * -Init network stuff, send and receive datas*/ | ||
338 | /**\{*/ | ||
339 | |||
340 | +#if defined(FSL_1588) | ||
341 | +extern char fsl_1588_if_name[IFACE_NAME_LENGTH]; | ||
342 | +/* select HWTSTAMP_TX_ON or HWTSTAMP_TX_OFF */ | ||
343 | +void hwtstamp_tx_ctl(NetPath *netPath, Boolean enable); | ||
344 | +#endif | ||
345 | Boolean testInterface(char* ifaceName, RunTimeOpts* rtOpts); | ||
346 | Boolean netInit(NetPath*,RunTimeOpts*,PtpClock*); | ||
347 | Boolean netShutdown(NetPath*); | ||
348 | @@ -357,6 +363,10 @@ void restartLogging(RunTimeOpts* rtOpts); | ||
349 | void logStatistics(RunTimeOpts *rtOpts, PtpClock *ptpClock); | ||
350 | void displayStatus(PtpClock *ptpClock, const char *prefixMessage); | ||
351 | void displayPortIdentity(PortIdentity *port, const char *prefixMessage); | ||
352 | +#if defined(FSL_1588) | ||
353 | +clockid_t get_clockid(int fd); | ||
354 | +int clock_adjtime(clockid_t id, struct timex *tx); | ||
355 | +#endif | ||
356 | Boolean nanoSleep(TimeInternal*); | ||
357 | void getTime(TimeInternal*); | ||
358 | void setTime(TimeInternal*); | ||
359 | @@ -378,12 +388,15 @@ void adjTime(Integer32); | ||
360 | void adjFreq_wrapper(RunTimeOpts * rtOpts, PtpClock * ptpClock, double adj); | ||
361 | Boolean adjFreq(double); | ||
362 | double getAdjFreq(void); | ||
363 | +#ifndef FSL_1588 | ||
364 | void informClockSource(PtpClock* ptpClock); | ||
365 | +#endif | ||
366 | |||
367 | /* Observed drift save / recovery functions */ | ||
368 | void restoreDrift(PtpClock * ptpClock, RunTimeOpts * rtOpts, Boolean quiet); | ||
369 | void saveDrift(PtpClock * ptpClock, RunTimeOpts * rtOpts, Boolean quiet); | ||
370 | |||
371 | +#ifndef FSL_1588 | ||
372 | /* Helper function to manage ntpadjtime / adjtimex flags */ | ||
373 | void setTimexFlags(int flags, Boolean quiet); | ||
374 | void unsetTimexFlags(int flags, Boolean quiet); | ||
375 | @@ -393,6 +406,7 @@ Boolean checkTimexFlags(int flags); | ||
376 | #if defined(MOD_TAI) && NTP_API == 4 | ||
377 | void setKernelUtcOffset(int utc_offset); | ||
378 | #endif /* MOD_TAI */ | ||
379 | +#endif | ||
380 | |||
381 | #endif /* HAVE_SYS_TIMEX_H */ | ||
382 | |||
383 | diff --git a/src/dep/servo.c b/src/dep/servo.c | ||
384 | index 06215e6..6651a20 100644 | ||
385 | --- a/src/dep/servo.c | ||
386 | +++ b/src/dep/servo.c | ||
387 | @@ -1013,10 +1013,12 @@ if(rtOpts->ntpOptions.enableEngine && rtOpts->panicModeNtp) { | ||
388 | /* Adjust the clock first -> the PI controller runs here */ | ||
389 | adjFreq_wrapper(rtOpts, ptpClock, runPIservo(&ptpClock->servo, ptpClock->offsetFromMaster.nanoseconds)); | ||
390 | warn_operator_fast_slewing(rtOpts, ptpClock, ptpClock->servo.observedDrift); | ||
391 | +#ifndef FSL_1588 | ||
392 | /* Unset STA_UNSYNC */ | ||
393 | unsetTimexFlags(STA_UNSYNC, TRUE); | ||
394 | /* "Tell" the clock about maxerror, esterror etc. */ | ||
395 | informClockSource(ptpClock); | ||
396 | +#endif /* FSL_1588 */ | ||
397 | #endif /* HAVE_SYS_TIMEX_H */ | ||
398 | } | ||
399 | |||
400 | diff --git a/src/dep/sys.c b/src/dep/sys.c | ||
401 | index 52b274c..8551724 100644 | ||
402 | --- a/src/dep/sys.c | ||
403 | +++ b/src/dep/sys.c | ||
404 | @@ -344,7 +344,14 @@ int writeMessage(FILE* destination, int priority, const char * format, va_list a | ||
405 | * it also can cause problems in nested debug statements (which are solved by turning the signal | ||
406 | * handling synchronous, and not calling this function inside asycnhronous signal processing) | ||
407 | */ | ||
408 | +#if defined(FSL_1588) | ||
409 | + struct timespec tp; | ||
410 | + clock_gettime(clkid, &tp); | ||
411 | + now.tv_sec = tp.tv_sec; | ||
412 | + now.tv_usec = tp.tv_nsec / 1000; | ||
413 | +#else | ||
414 | gettimeofday(&now, 0); | ||
415 | +#endif | ||
416 | strftime(time_str, MAXTIMESTR, "%F %X", localtime((time_t*)&now.tv_sec)); | ||
417 | fprintf(destination, "%s.%06d ", time_str, (int)now.tv_usec ); | ||
418 | fprintf(destination,PTPD_PROGNAME"[%d].%s (%-9s ", | ||
419 | @@ -1174,13 +1181,33 @@ nanoSleep(TimeInternal * t) | ||
420 | return TRUE; | ||
421 | } | ||
422 | |||
423 | +#if defined(FSL_1588) | ||
424 | +clockid_t get_clockid(int fd) | ||
425 | +{ | ||
426 | +#define CLOCKFD 3 | ||
427 | +#define FD_TO_CLOCKID(fd) ((~(clockid_t) (fd) << 3) | CLOCKFD) | ||
428 | + return FD_TO_CLOCKID(fd); | ||
429 | +} | ||
430 | + | ||
431 | +/* When glibc offers the syscall, this will go away. */ | ||
432 | +#include <sys/syscall.h> | ||
433 | +int clock_adjtime(clockid_t id, struct timex *tx) | ||
434 | +{ | ||
435 | + return syscall(__NR_clock_adjtime, id, tx); | ||
436 | +} | ||
437 | +#endif | ||
438 | + | ||
439 | void | ||
440 | getTime(TimeInternal * time) | ||
441 | { | ||
442 | -#if defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) | ||
443 | +#if defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) || defined(FSL_1588) | ||
444 | |||
445 | struct timespec tp; | ||
446 | +#if defined(FSL_1588) | ||
447 | + if (clock_gettime(clkid, &tp) < 0) { | ||
448 | +#else | ||
449 | if (clock_gettime(CLOCK_REALTIME, &tp) < 0) { | ||
450 | +#endif | ||
451 | PERROR("clock_gettime() failed, exiting."); | ||
452 | exit(0); | ||
453 | } | ||
454 | @@ -1201,7 +1228,7 @@ void | ||
455 | setTime(TimeInternal * time) | ||
456 | { | ||
457 | |||
458 | -#if defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) | ||
459 | +#if defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) || defined(FSL_1588) | ||
460 | |||
461 | struct timespec tp; | ||
462 | tp.tv_sec = time->seconds; | ||
463 | @@ -1215,9 +1242,13 @@ setTime(TimeInternal * time) | ||
464 | |||
465 | #endif /* _POSIX_TIMERS */ | ||
466 | |||
467 | -#if defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) | ||
468 | |||
469 | +#if defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) || defined(FSL_1588) | ||
470 | +#if defined(FSL_1588) | ||
471 | + if (clock_settime(clkid, &tp) < 0) { | ||
472 | +#else | ||
473 | if (clock_settime(CLOCK_REALTIME, &tp) < 0) { | ||
474 | +#endif | ||
475 | PERROR("Could not set system time"); | ||
476 | return; | ||
477 | } | ||
478 | @@ -1595,7 +1626,11 @@ adjFreq(double adj) | ||
479 | #endif /* HAVE_STRUCT_TIMEX_TICK */ | ||
480 | DBG2(" adj is %.09f; t freq is %d (float: %.09f)\n", adj, t.freq, dFreq); | ||
481 | |||
482 | +#if defined(FSL_1588) | ||
483 | + return !clock_adjtime(clkid, &t); | ||
484 | +#else | ||
485 | return !adjtimex(&t); | ||
486 | +#endif | ||
487 | } | ||
488 | |||
489 | |||
490 | @@ -1609,7 +1644,11 @@ getAdjFreq(void) | ||
491 | |||
492 | memset(&t, 0, sizeof(t)); | ||
493 | t.modes = 0; | ||
494 | +#if defined(FSL_1588) | ||
495 | + clock_adjtime(clkid, &t); | ||
496 | +#else | ||
497 | adjtimex(&t); | ||
498 | +#endif | ||
499 | |||
500 | dFreq = (t.freq + 0.0) / ((1<<16) / 1000.0); | ||
501 | |||
502 | @@ -1764,6 +1803,7 @@ saveDrift(PtpClock * ptpClock, RunTimeOpts * rtOpts, Boolean quiet) | ||
503 | fclose(driftFP); | ||
504 | } | ||
505 | |||
506 | +#ifndef FSL_1588 | ||
507 | void | ||
508 | setTimexFlags(int flags, Boolean quiet) | ||
509 | { | ||
510 | @@ -1922,6 +1962,7 @@ setKernelUtcOffset(int utc_offset) { | ||
511 | } | ||
512 | } | ||
513 | #endif /* MOD_TAI */ | ||
514 | +#endif /* FSL_1588 */ | ||
515 | |||
516 | |||
517 | #else | ||
518 | diff --git a/src/protocol.c b/src/protocol.c | ||
519 | index c73728b..90554f3 100644 | ||
520 | --- a/src/protocol.c | ||
521 | +++ b/src/protocol.c | ||
522 | @@ -615,6 +615,7 @@ if(!rtOpts->panicModeNtp || !ptpClock->panicMode) | ||
523 | timerStart(STATISTICS_UPDATE_TIMER, rtOpts->statsUpdateInterval, ptpClock->itimer); | ||
524 | #endif /* PTPD_STATISTICS */ | ||
525 | |||
526 | +#ifndef FSL_1588 | ||
527 | #ifdef HAVE_SYS_TIMEX_H | ||
528 | |||
529 | /* | ||
530 | @@ -632,6 +633,7 @@ if(!rtOpts->panicModeNtp || !ptpClock->panicMode) | ||
531 | unsetTimexFlags(STA_INS | STA_DEL, TRUE); | ||
532 | } | ||
533 | #endif /* HAVE_SYS_TIMEX_H */ | ||
534 | +#endif /* FSL_1588 */ | ||
535 | break; | ||
536 | default: | ||
537 | DBG("to unrecognized state\n"); | ||
538 | @@ -934,6 +936,7 @@ doState(RunTimeOpts *rtOpts, PtpClock *ptpClock) | ||
539 | WARNING("Leap second event imminent - pausing " | ||
540 | "clock and offset updates\n"); | ||
541 | ptpClock->leapSecondInProgress = TRUE; | ||
542 | +#ifndef FSL_1588 | ||
543 | #ifdef HAVE_SYS_TIMEX_H | ||
544 | if(!checkTimexFlags(ptpClock->timePropertiesDS.leap61 ? | ||
545 | STA_INS : STA_DEL)) { | ||
546 | @@ -944,6 +947,7 @@ doState(RunTimeOpts *rtOpts, PtpClock *ptpClock) | ||
547 | STA_INS : STA_DEL, FALSE); | ||
548 | } | ||
549 | #endif /* HAVE_SYS_TIMEX_H */ | ||
550 | +#endif /* FSL_1588 */ | ||
551 | /* | ||
552 | * start pause timer from now until [pause] after | ||
553 | * midnight, plus an extra second if inserting | ||
554 | @@ -1290,6 +1294,9 @@ handle(RunTimeOpts *rtOpts, PtpClock *ptpClock) | ||
555 | int ret; | ||
556 | ssize_t length = -1; | ||
557 | |||
558 | +#if defined(FSL_1588) | ||
559 | + hwtstamp_tx_ctl(&ptpClock->netPath, FALSE);/* HWTSTAMP_TX_OFF */ | ||
560 | +#endif | ||
561 | TimeInternal timeStamp = { 0, 0 }; | ||
562 | fd_set readfds; | ||
563 | |||
564 | @@ -1437,9 +1444,11 @@ handleAnnounce(MsgHeader *header, ssize_t length, | ||
565 | ptpClock->leapSecondInProgress=FALSE; | ||
566 | ptpClock->timePropertiesDS.leap59 = FALSE; | ||
567 | ptpClock->timePropertiesDS.leap61 = FALSE; | ||
568 | +#ifndef FSL_1588 | ||
569 | #ifdef HAVE_SYS_TIMEX_H | ||
570 | unsetTimexFlags(STA_INS | STA_DEL, TRUE); | ||
571 | #endif /* HAVE_SYS_TIMEX_H */ | ||
572 | +#endif /* FSL_1588 */ | ||
573 | } | ||
574 | } | ||
575 | DBG2("___ Announce: received Announce from current Master, so reset the Announce timer\n"); | ||
576 | diff --git a/src/ptpd.c b/src/ptpd.c | ||
577 | index 3fad379..471b1e9 100644 | ||
578 | --- a/src/ptpd.c | ||
579 | +++ b/src/ptpd.c | ||
580 | @@ -78,6 +78,21 @@ main(int argc, char **argv) | ||
581 | PtpClock *ptpClock; | ||
582 | Integer16 ret; | ||
583 | |||
584 | +#if defined(FSL_1588) | ||
585 | + char device[] = "/dev/ptp0"; | ||
586 | + int fd; | ||
587 | + | ||
588 | + fd = open(device, O_RDWR); | ||
589 | + if (fd < 0) { | ||
590 | + fprintf(stderr, "opening %s: %s\n", device, strerror(errno)); | ||
591 | + return -1; | ||
592 | + } | ||
593 | + clkid = get_clockid(fd); | ||
594 | + if (clkid == -1) { | ||
595 | + fprintf(stderr, "failed to read clock id\n"); | ||
596 | + return -1; | ||
597 | + } | ||
598 | +#endif | ||
599 | startupInProgress = TRUE; | ||
600 | |||
601 | /* Initialize run time options with command line arguments */ | ||
602 | diff --git a/src/ptpd.h b/src/ptpd.h | ||
603 | index 009f51c..6641649 100644 | ||
604 | --- a/src/ptpd.h | ||
605 | +++ b/src/ptpd.h | ||
606 | @@ -172,6 +172,15 @@ | ||
607 | #include <linux/rtc.h> | ||
608 | #endif /* HAVE_LINUX_RTC_H */ | ||
609 | |||
610 | +#ifdef FSL_1588 | ||
611 | +#ifndef SO_TIMESTAMPING | ||
612 | +#define SO_TIMESTAMPING 37 | ||
613 | +#endif | ||
614 | +#ifndef HAVE_SYS_TIMEX_H | ||
615 | +#define HAVE_SYS_TIMEX_H 1 | ||
616 | +#endif | ||
617 | +clockid_t clkid; | ||
618 | +#endif | ||
619 | /** \name arith.c | ||
620 | * -Timing management and arithmetic*/ | ||
621 | /**\{*/ | ||
diff --git a/meta-networking/recipes-daemons/ptpd/ptpd_2.3.1-rc2.bb b/meta-networking/recipes-daemons/ptpd/ptpd_2.3.1-rc2.bb index db74e4463..274ea331b 100644 --- a/meta-networking/recipes-daemons/ptpd/ptpd_2.3.1-rc2.bb +++ b/meta-networking/recipes-daemons/ptpd/ptpd_2.3.1-rc2.bb | |||
@@ -21,7 +21,9 @@ def get_sub(d): | |||
21 | except: | 21 | except: |
22 | return parts[0] | 22 | return parts[0] |
23 | 23 | ||
24 | SRC_URI = "http://downloads.sourceforge.net/project/ptpd/ptpd/${@get_sub(d)}/ptpd-${PV}.tar.gz" | 24 | SRC_URI = "http://downloads.sourceforge.net/project/ptpd/ptpd/${@get_sub(d)}/ptpd-${PV}.tar.gz \ |
25 | file://ptpd-add-dpaa-etsec-support.patch \ | ||
26 | " | ||
25 | 27 | ||
26 | SRC_URI[md5sum] = "1ef2f1f2825080a865bbce0eb61246d4" | 28 | SRC_URI[md5sum] = "1ef2f1f2825080a865bbce0eb61246d4" |
27 | SRC_URI[sha256sum] = "2802aab758649bb222859dfcb62a5d282709ccb4d3f1df3f26f739cc091d0c8d" | 29 | SRC_URI[sha256sum] = "2802aab758649bb222859dfcb62a5d282709ccb4d3f1df3f26f739cc091d0c8d" |