Commit 5c5b7581 authored by David S. Miller's avatar David S. Miller

Merge branch 'Extend-testptp-with-PTP-perout-waveform'

Vladimir Oltean says:

====================
Extend testptp with PTP perout waveform

Demonstrate the usage of the newly introduced flags in the
PTP_PEROUT_REQUEST2 ioctl:

https://www.spinics.net/lists/netdev/msg669346.html
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 0c17ac54 7570ebe0
...@@ -35,6 +35,8 @@ ...@@ -35,6 +35,8 @@
#define CLOCK_INVALID -1 #define CLOCK_INVALID -1
#endif #endif
#define NSEC_PER_SEC 1000000000LL
/* clock_adjtime is not available in GLIBC < 2.14 */ /* clock_adjtime is not available in GLIBC < 2.14 */
#if !__GLIBC_PREREQ(2, 14) #if !__GLIBC_PREREQ(2, 14)
#include <sys/syscall.h> #include <sys/syscall.h>
...@@ -132,6 +134,8 @@ static void usage(char *progname) ...@@ -132,6 +134,8 @@ static void usage(char *progname)
" 1 - external time stamp\n" " 1 - external time stamp\n"
" 2 - periodic output\n" " 2 - periodic output\n"
" -p val enable output with a period of 'val' nanoseconds\n" " -p val enable output with a period of 'val' nanoseconds\n"
" -H val set output phase to 'val' nanoseconds (requires -p)\n"
" -w val set output pulse width to 'val' nanoseconds (requires -p)\n"
" -P val enable or disable (val=1|0) the system clock PPS\n" " -P val enable or disable (val=1|0) the system clock PPS\n"
" -s set the ptp clock time from the system time\n" " -s set the ptp clock time from the system time\n"
" -S set the system time from the ptp clock time\n" " -S set the system time from the ptp clock time\n"
...@@ -169,7 +173,6 @@ int main(int argc, char *argv[]) ...@@ -169,7 +173,6 @@ int main(int argc, char *argv[])
int list_pins = 0; int list_pins = 0;
int pct_offset = 0; int pct_offset = 0;
int n_samples = 0; int n_samples = 0;
int perout = -1;
int pin_index = -1, pin_func; int pin_index = -1, pin_func;
int pps = -1; int pps = -1;
int seconds = 0; int seconds = 0;
...@@ -177,10 +180,13 @@ int main(int argc, char *argv[]) ...@@ -177,10 +180,13 @@ int main(int argc, char *argv[])
int64_t t1, t2, tp; int64_t t1, t2, tp;
int64_t interval, offset; int64_t interval, offset;
int64_t perout_phase = -1;
int64_t pulsewidth = -1;
int64_t perout = -1;
progname = strrchr(argv[0], '/'); progname = strrchr(argv[0], '/');
progname = progname ? 1+progname : argv[0]; progname = progname ? 1+progname : argv[0];
while (EOF != (c = getopt(argc, argv, "cd:e:f:ghi:k:lL:p:P:sSt:T:z"))) { while (EOF != (c = getopt(argc, argv, "cd:e:f:ghH:i:k:lL:p:P:sSt:T:w:z"))) {
switch (c) { switch (c) {
case 'c': case 'c':
capabilities = 1; capabilities = 1;
...@@ -197,6 +203,9 @@ int main(int argc, char *argv[]) ...@@ -197,6 +203,9 @@ int main(int argc, char *argv[])
case 'g': case 'g':
gettime = 1; gettime = 1;
break; break;
case 'H':
perout_phase = atoll(optarg);
break;
case 'i': case 'i':
index = atoi(optarg); index = atoi(optarg);
break; break;
...@@ -215,7 +224,7 @@ int main(int argc, char *argv[]) ...@@ -215,7 +224,7 @@ int main(int argc, char *argv[])
} }
break; break;
case 'p': case 'p':
perout = atoi(optarg); perout = atoll(optarg);
break; break;
case 'P': case 'P':
pps = atoi(optarg); pps = atoi(optarg);
...@@ -233,6 +242,9 @@ int main(int argc, char *argv[]) ...@@ -233,6 +242,9 @@ int main(int argc, char *argv[])
settime = 3; settime = 3;
seconds = atoi(optarg); seconds = atoi(optarg);
break; break;
case 'w':
pulsewidth = atoi(optarg);
break;
case 'z': case 'z':
flagtest = 1; flagtest = 1;
break; break;
...@@ -391,6 +403,16 @@ int main(int argc, char *argv[]) ...@@ -391,6 +403,16 @@ int main(int argc, char *argv[])
} }
} }
if (pulsewidth >= 0 && perout < 0) {
puts("-w can only be specified together with -p");
return -1;
}
if (perout_phase >= 0 && perout < 0) {
puts("-H can only be specified together with -p");
return -1;
}
if (perout >= 0) { if (perout >= 0) {
if (clock_gettime(clkid, &ts)) { if (clock_gettime(clkid, &ts)) {
perror("clock_gettime"); perror("clock_gettime");
...@@ -398,11 +420,24 @@ int main(int argc, char *argv[]) ...@@ -398,11 +420,24 @@ int main(int argc, char *argv[])
} }
memset(&perout_request, 0, sizeof(perout_request)); memset(&perout_request, 0, sizeof(perout_request));
perout_request.index = index; perout_request.index = index;
perout_request.start.sec = ts.tv_sec + 2; perout_request.period.sec = perout / NSEC_PER_SEC;
perout_request.start.nsec = 0; perout_request.period.nsec = perout % NSEC_PER_SEC;
perout_request.period.sec = 0; perout_request.flags = 0;
perout_request.period.nsec = perout; if (pulsewidth >= 0) {
if (ioctl(fd, PTP_PEROUT_REQUEST, &perout_request)) { perout_request.flags |= PTP_PEROUT_DUTY_CYCLE;
perout_request.on.sec = pulsewidth / NSEC_PER_SEC;
perout_request.on.nsec = pulsewidth % NSEC_PER_SEC;
}
if (perout_phase >= 0) {
perout_request.flags |= PTP_PEROUT_PHASE;
perout_request.phase.sec = perout_phase / NSEC_PER_SEC;
perout_request.phase.nsec = perout_phase % NSEC_PER_SEC;
} else {
perout_request.start.sec = ts.tv_sec + 2;
perout_request.start.nsec = 0;
}
if (ioctl(fd, PTP_PEROUT_REQUEST2, &perout_request)) {
perror("PTP_PEROUT_REQUEST"); perror("PTP_PEROUT_REQUEST");
} else { } else {
puts("periodic output request okay"); puts("periodic output request okay");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment