From 41289be92e61c4732be053182a255cd4329f63ad Mon Sep 17 00:00:00 2001 From: Mike Engel Date: Tue, 4 Jun 2019 18:19:02 +0200 Subject: [PATCH] apix_can_example: Add CANFD support to configure data bitrate This commit adds CANFD support to configure the data bitrate and to enable the CANFD feature. Signed-off-by: Mike Engel https://jira.digi.com/browse/DEL-6588 --- apix-can-examples/README.md | 12 ++++++++++ apix-can-examples/can-recv-example.c | 30 ++++++++++++++++++++++-- apix-can-examples/can-send-example.c | 34 ++++++++++++++++++++++++---- 3 files changed, 70 insertions(+), 6 deletions(-) diff --git a/apix-can-examples/README.md b/apix-can-examples/README.md index 1898518..528de91 100644 --- a/apix-can-examples/README.md +++ b/apix-can-examples/README.md @@ -63,8 +63,14 @@ Once the binary is in the target, launch the application: Usage: %s -i -b [options]" -i Name of the CAN interface" -b Bitrate to use (Hz)" + "-s Bitrate Sample Point\n" -f Comma-separated filter list in the format" id:mask (id and mask values in hex)" + "-o Enable CAN FD support\n" + "--- CAN FD options ---\n" + " -d Maximum data bitrate for CAN FD (Hz)\n" + " -a CAN FD data bitate sample point\n" + "---\n" -p Print message info" -c Print message counter" -h Help" @@ -89,10 +95,16 @@ Example application using libdigiapix CAN support" "Usage: %s -i -b [options]" "-i Name of the CAN interface" "-b Bitrate to use (Hz)" + "-s CAN bitrate sample point\n" "-n Number of messages to send (default 1)" "-t Inter frame delay in ms (default 100)" "-I Message id in hex (default 123)" "-l Payload length (default 8)" + "-o Enable CAN FD support\n" + "--- CAN FD options ---\n" + " -d Maximum data bitrate for CAN FD (Hz)\n" + " -p CAN FD data bitate sample point\n" + "---\n" "-r Generate a random ID (will ignore the -I parameter)" "-p Generate a random payload (will ignore the -l parameter)" "-e Use extended id" diff --git a/apix-can-examples/can-recv-example.c b/apix-can-examples/can-recv-example.c index 68bcd7b..ec18ca9 100644 --- a/apix-can-examples/can-recv-example.c +++ b/apix-can-examples/can-recv-example.c @@ -49,8 +49,14 @@ static void usage_and_exit(char *name, int exitval) "Usage: %s -i -b [options]\n\n" "-i Name of the CAN interface\n" "-b Bitrate to use (Hz)\n" + "-s Bitrate Sample Point\n" "-f Comma-separated filter list in the format\n" " id:mask (id and mask values in hex)\n" + "-o Enable CAN FD support\n" + "--- CAN FD options ---\n" + " -d Maximum data bitrate for CAN FD (Hz)\n" + " -a CAN FD data bitate sample point\n" + "---\n" "-p Print message info\n" "-c Print message counter\n" "-h Help\n" @@ -58,7 +64,8 @@ static void usage_and_exit(char *name, int exitval) "Examples:\n" "%s -i can0 -b 500000 -f 023:fff,006:00f\n" "%s -i can1 -b 100000\n" - "\n", name, name, name); + "%s -i can1 -b 100000 -d 100000 -o -p\n" + "\n", name, name, name, name); exit(exitval); } @@ -201,6 +208,7 @@ int main(int argc, char **argv) int nfilters = 0; int opt; int ret; + float sp = 0.0; struct can_filter deffilter; deffilter.can_id = 0; @@ -212,7 +220,7 @@ int main(int argc, char **argv) ldx_can_set_defconfig(&ifcfg); - while ((opt = getopt(argc, argv, "i:b:f:pc")) > 0) { + while ((opt = getopt(argc, argv, "i:b:f:d:s:a:opc")) > 0) { switch (opt) { case 'i': iface = optarg; @@ -222,6 +230,20 @@ int main(int argc, char **argv) ifcfg.bitrate = strtoul(optarg, NULL, 10); break; + case 'd': + ifcfg.dbitrate = strtoul(optarg, NULL, 10); + break; + + case 's': + sp = strtof(optarg, NULL); + ifcfg.bit_timing.sample_point = (__u32)(sp * 1000); + break; + + case 'a': + sp = strtof(optarg, NULL); + ifcfg.dbit_timing.sample_point = (__u32)(sp * 1000); + break; + case 'f': ret = parse_filters(optarg, &cfilter, &nfilters); if (ret) { @@ -230,6 +252,10 @@ int main(int argc, char **argv) } break; + case 'o': + ifcfg.canfd_enabled = true; + break; + case 'p': prn_msg_info = true; break; diff --git a/apix-can-examples/can-send-example.c b/apix-can-examples/can-send-example.c index 383e0db..95ad389 100644 --- a/apix-can-examples/can-send-example.c +++ b/apix-can-examples/can-send-example.c @@ -61,19 +61,26 @@ static void usage_and_exit(char *name, int exitval) "Usage: %s -i -b [options]\n\n" "-i Name of the CAN interface\n" "-b Bitrate to use (Hz)\n" + "-s CAN bitrate sample point\n" "-n Number of messages to send (default 1)\n" "-t Inter frame delay in ms (default 100)\n" "-I Message id in hex (default 123)\n" "-l Payload length (default 8)\n" + "-o Enable CAN FD support\n" + "--- CAN FD options ---\n" + " -d Maximum data bitrate for CAN FD (Hz)\n" + " -p CAN FD data bitate sample point\n" + "---\n" "-r Generate a random ID (will ignore the -I parameter)\n" - "-p Generate a random payload (will ignore the -l parameter)\n" + "-c Generate a random payload (will ignore the -l parameter)\n" "-e Use extended id\n" "-R Set RTR\n" "\n" "Examples:\n" "%s -i can0 -b 500000 -n 100 -R\n" "%s -i can1 -b 100000\n" - "\n", name, name, name); + "%s -i can1 -b 100000 -d 100000 -n 10 -o\n" + "\n", name, name, name, name); exit(exitval); } @@ -180,6 +187,7 @@ int main(int argc, char **argv) uint32_t msg_id = 0x123; uint8_t msg_len = 8; uint8_t flags = 0; + float sp = 0.0; struct canfd_frame frame; srand (time(NULL)); @@ -190,7 +198,7 @@ int main(int argc, char **argv) ldx_can_set_defconfig(&ifcfg); - while ((opt = getopt(argc, argv, "i:b:n:t:I:l:erRp")) > 0) { + while ((opt = getopt(argc, argv, "i:b:n:t:I:l:a:d:s:t:oerRc")) > 0) { switch (opt) { case 'i': iface = optarg; @@ -200,6 +208,10 @@ int main(int argc, char **argv) ifcfg.bitrate = strtoul(optarg, NULL, 10); break; + case 'd': + ifcfg.dbitrate = strtoul(optarg, NULL, 10); + break; + case 'n': num_msgs = strtoul(optarg, NULL, 10); break; @@ -208,6 +220,16 @@ int main(int argc, char **argv) ms_delay = strtoul(optarg, NULL, 10); break; + case 's': + sp = strtof(optarg, NULL); + ifcfg.bit_timing.sample_point = (__u32)(sp * 1000); + break; + + case 'a': + sp = strtof(optarg, NULL); + ifcfg.dbit_timing.sample_point = (__u32)(sp * 1000); + break; + case 'I': msg_id = strtoul(optarg, NULL, 16); break; @@ -220,6 +242,10 @@ int main(int argc, char **argv) flags |= EXT_ID_MASK; break; + case 'o': + ifcfg.canfd_enabled = true; + break; + case 'r': flags |= RANDOM_ID_MASK; break; @@ -228,7 +254,7 @@ int main(int argc, char **argv) flags |= RTR_BIT_MASK; break; - case 'p': + case 'c': flags |= RANDOM_DLC_MASK; break;