]> rtime.felk.cvut.cz Git - can-utils.git/blobdiff - cangen.c
candump: Enable HW timestamping before using it
[can-utils.git] / cangen.c
index 6cf6c0783da46cfaa764962dec8114eee4d3a804..d0862675bd5446dde9533b15c5371ae997c38fb1 100644 (file)
--- a/cangen.c
+++ b/cangen.c
@@ -1,7 +1,3 @@
-/*
- *  $Id$
- */
-
 /*
  * cangen.c - CAN frames generator for testing purposes
  *
@@ -88,8 +84,10 @@ void print_usage(char *prg)
        fprintf(stderr, "         -e            (generate extended frame mode "
                "(EFF) CAN frames)\n");
        fprintf(stderr, "         -f            (generate CAN FD CAN frames)\n");
+       fprintf(stderr, "         -b            (generate CAN FD CAN frames"
+               " with bitrate switch (BRS))\n");
        fprintf(stderr, "         -R            (send RTR frame)\n");
-       fprintf(stderr, "         -m            (mix -e -f -R frames)\n");
+       fprintf(stderr, "         -m            (mix -e -f -b -R frames)\n");
        fprintf(stderr, "         -I <mode>     (CAN ID"
                " generation mode - see below)\n");
        fprintf(stderr, "         -L <mode>     (CAN data length code (dlc)"
@@ -140,6 +138,7 @@ int main(int argc, char **argv)
        unsigned char ignore_enobufs = 0;
        unsigned char extended = 0;
        unsigned char canfd = 0;
+       unsigned char brs = 0;
        unsigned char mix = 0;
        unsigned char id_mode = MODE_RANDOM;
        unsigned char data_mode = MODE_RANDOM;
@@ -174,7 +173,7 @@ int main(int argc, char **argv)
        signal(SIGHUP, sigterm);
        signal(SIGINT, sigterm);
 
-       while ((opt = getopt(argc, argv, "ig:efmI:L:D:xp:n:vRh?")) != -1) {
+       while ((opt = getopt(argc, argv, "ig:ebfmI:L:D:xp:n:vRh?")) != -1) {
                switch (opt) {
 
                case 'i':
@@ -193,6 +192,11 @@ int main(int argc, char **argv)
                        canfd = 1;
                        break;
 
+               case 'b':
+                       brs = 1; /* bitrate switch implies CAN FD */
+                       canfd = 1;
+                       break;
+
                case 'm':
                        mix = 1;
                        canfd = 1; /* to switch the socket into CAN FD mode */
@@ -273,7 +277,7 @@ int main(int argc, char **argv)
        }
 
        ts.tv_sec = gap / 1000;
-       ts.tv_nsec = ((int)(gap * 1000000)) % 1000000000;
+       ts.tv_nsec = (long)(((long long)(gap * 1000000)) % 1000000000ll);
 
        /* recognize obviously missing commandline option */
        if (id_mode == MODE_FIX && frame.can_id > 0x7FF && !extended) {
@@ -353,6 +357,7 @@ int main(int argc, char **argv)
        }
 
        while (running) {
+               frame.flags = 0;
 
                if (count && (--count == 0))
                        running = 0;
@@ -360,6 +365,8 @@ int main(int argc, char **argv)
                if (canfd){
                        mtu = CANFD_MTU;
                        maxdlen = CANFD_MAX_DLEN;
+                       if (brs)
+                               frame.flags |= CANFD_BRS;
                } else {
                        mtu = CAN_MTU;
                        maxdlen = CAN_MAX_DLEN;
@@ -451,7 +458,7 @@ resend:
                if (gap) /* gap == 0 => performance test :-] */
                        if (nanosleep(&ts, NULL))
                                return 1;
-                   
+
                if (id_mode == MODE_INCREMENT)
                        frame.can_id++;
 
@@ -480,7 +487,9 @@ resend:
                        i = random();
                        extended = i&1;
                        canfd = i&2;
-                       rtr_frame = ((i&12) == 12); /* reduce RTR frames to 1/4 */
+                       if (canfd)
+                               brs = i&4;
+                       rtr_frame = ((i&24) == 24); /* reduce RTR frames to 1/4 */
                }
        }