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 <Mike.Engel@digi.com>

https://jira.digi.com/browse/DEL-6588
This commit is contained in:
Mike Engel 2019-06-04 18:19:02 +02:00
parent 953f10971c
commit 41289be92e
3 changed files with 70 additions and 6 deletions

View File

@ -63,8 +63,14 @@ Once the binary is in the target, launch the application:
Usage: %s -i <can-iface> -b <bitrate> [options]" Usage: %s -i <can-iface> -b <bitrate> [options]"
-i <can-iface> Name of the CAN interface" -i <can-iface> Name of the CAN interface"
-b <bitrate> Bitrate to use (Hz)" -b <bitrate> Bitrate to use (Hz)"
"-s <sample-ponit> Bitrate Sample Point\n"
-f <filters> Comma-separated filter list in the format" -f <filters> Comma-separated filter list in the format"
id:mask (id and mask values in hex)" id:mask (id and mask values in hex)"
"-o Enable CAN FD support\n"
"--- CAN FD options ---\n"
" -d <dbitrate> Maximum data bitrate for CAN FD (Hz)\n"
" -a <dsample-point> CAN FD data bitate sample point\n"
"---\n"
-p Print message info" -p Print message info"
-c Print message counter" -c Print message counter"
-h Help" -h Help"
@ -89,10 +95,16 @@ Example application using libdigiapix CAN support"
"Usage: %s -i <can-iface> -b <bitrate> [options]" "Usage: %s -i <can-iface> -b <bitrate> [options]"
"-i <can-iface> Name of the CAN interface" "-i <can-iface> Name of the CAN interface"
"-b <bitrate> Bitrate to use (Hz)" "-b <bitrate> Bitrate to use (Hz)"
"-s <sample_point> CAN bitrate sample point\n"
"-n <num_msgs> Number of messages to send (default 1)" "-n <num_msgs> Number of messages to send (default 1)"
"-t <delay> Inter frame delay in ms (default 100)" "-t <delay> Inter frame delay in ms (default 100)"
"-I <msg_id> Message id in hex (default 123)" "-I <msg_id> Message id in hex (default 123)"
"-l <data_length> Payload length (default 8)" "-l <data_length> Payload length (default 8)"
"-o Enable CAN FD support\n"
"--- CAN FD options ---\n"
" -d <dbitrate> Maximum data bitrate for CAN FD (Hz)\n"
" -p <dsample-point> CAN FD data bitate sample point\n"
"---\n"
"-r Generate a random ID (will ignore the -I parameter)" "-r Generate a random ID (will ignore the -I parameter)"
"-p Generate a random payload (will ignore the -l parameter)" "-p Generate a random payload (will ignore the -l parameter)"
"-e Use extended id" "-e Use extended id"

View File

@ -49,8 +49,14 @@ static void usage_and_exit(char *name, int exitval)
"Usage: %s -i <can-iface> -b <bitrate> [options]\n\n" "Usage: %s -i <can-iface> -b <bitrate> [options]\n\n"
"-i <can-iface> Name of the CAN interface\n" "-i <can-iface> Name of the CAN interface\n"
"-b <bitrate> Bitrate to use (Hz)\n" "-b <bitrate> Bitrate to use (Hz)\n"
"-s <sample-point> Bitrate Sample Point\n"
"-f <filters> Comma-separated filter list in the format\n" "-f <filters> Comma-separated filter list in the format\n"
" id:mask (id and mask values in hex)\n" " id:mask (id and mask values in hex)\n"
"-o Enable CAN FD support\n"
"--- CAN FD options ---\n"
" -d <dbitrate> Maximum data bitrate for CAN FD (Hz)\n"
" -a <dsample-point> CAN FD data bitate sample point\n"
"---\n"
"-p Print message info\n" "-p Print message info\n"
"-c Print message counter\n" "-c Print message counter\n"
"-h Help\n" "-h Help\n"
@ -58,7 +64,8 @@ static void usage_and_exit(char *name, int exitval)
"Examples:\n" "Examples:\n"
"%s -i can0 -b 500000 -f 023:fff,006:00f\n" "%s -i can0 -b 500000 -f 023:fff,006:00f\n"
"%s -i can1 -b 100000\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); exit(exitval);
} }
@ -201,6 +208,7 @@ int main(int argc, char **argv)
int nfilters = 0; int nfilters = 0;
int opt; int opt;
int ret; int ret;
float sp = 0.0;
struct can_filter deffilter; struct can_filter deffilter;
deffilter.can_id = 0; deffilter.can_id = 0;
@ -212,7 +220,7 @@ int main(int argc, char **argv)
ldx_can_set_defconfig(&ifcfg); 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) { switch (opt) {
case 'i': case 'i':
iface = optarg; iface = optarg;
@ -222,6 +230,20 @@ int main(int argc, char **argv)
ifcfg.bitrate = strtoul(optarg, NULL, 10); ifcfg.bitrate = strtoul(optarg, NULL, 10);
break; 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': case 'f':
ret = parse_filters(optarg, &cfilter, &nfilters); ret = parse_filters(optarg, &cfilter, &nfilters);
if (ret) { if (ret) {
@ -230,6 +252,10 @@ int main(int argc, char **argv)
} }
break; break;
case 'o':
ifcfg.canfd_enabled = true;
break;
case 'p': case 'p':
prn_msg_info = true; prn_msg_info = true;
break; break;

View File

@ -61,19 +61,26 @@ static void usage_and_exit(char *name, int exitval)
"Usage: %s -i <can-iface> -b <bitrate> [options]\n\n" "Usage: %s -i <can-iface> -b <bitrate> [options]\n\n"
"-i <can-iface> Name of the CAN interface\n" "-i <can-iface> Name of the CAN interface\n"
"-b <bitrate> Bitrate to use (Hz)\n" "-b <bitrate> Bitrate to use (Hz)\n"
"-s <sample-point> CAN bitrate sample point\n"
"-n <num_msgs> Number of messages to send (default 1)\n" "-n <num_msgs> Number of messages to send (default 1)\n"
"-t <delay> Inter frame delay in ms (default 100)\n" "-t <delay> Inter frame delay in ms (default 100)\n"
"-I <msg_id> Message id in hex (default 123)\n" "-I <msg_id> Message id in hex (default 123)\n"
"-l <data_length> Payload length (default 8)\n" "-l <data_length> Payload length (default 8)\n"
"-o Enable CAN FD support\n"
"--- CAN FD options ---\n"
" -d <dbitrate> Maximum data bitrate for CAN FD (Hz)\n"
" -p <dsample-point> CAN FD data bitate sample point\n"
"---\n"
"-r Generate a random ID (will ignore the -I parameter)\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" "-e Use extended id\n"
"-R Set RTR\n" "-R Set RTR\n"
"\n" "\n"
"Examples:\n" "Examples:\n"
"%s -i can0 -b 500000 -n 100 -R\n" "%s -i can0 -b 500000 -n 100 -R\n"
"%s -i can1 -b 100000\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); exit(exitval);
} }
@ -180,6 +187,7 @@ int main(int argc, char **argv)
uint32_t msg_id = 0x123; uint32_t msg_id = 0x123;
uint8_t msg_len = 8; uint8_t msg_len = 8;
uint8_t flags = 0; uint8_t flags = 0;
float sp = 0.0;
struct canfd_frame frame; struct canfd_frame frame;
srand (time(NULL)); srand (time(NULL));
@ -190,7 +198,7 @@ int main(int argc, char **argv)
ldx_can_set_defconfig(&ifcfg); 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) { switch (opt) {
case 'i': case 'i':
iface = optarg; iface = optarg;
@ -200,6 +208,10 @@ int main(int argc, char **argv)
ifcfg.bitrate = strtoul(optarg, NULL, 10); ifcfg.bitrate = strtoul(optarg, NULL, 10);
break; break;
case 'd':
ifcfg.dbitrate = strtoul(optarg, NULL, 10);
break;
case 'n': case 'n':
num_msgs = strtoul(optarg, NULL, 10); num_msgs = strtoul(optarg, NULL, 10);
break; break;
@ -208,6 +220,16 @@ int main(int argc, char **argv)
ms_delay = strtoul(optarg, NULL, 10); ms_delay = strtoul(optarg, NULL, 10);
break; 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': case 'I':
msg_id = strtoul(optarg, NULL, 16); msg_id = strtoul(optarg, NULL, 16);
break; break;
@ -220,6 +242,10 @@ int main(int argc, char **argv)
flags |= EXT_ID_MASK; flags |= EXT_ID_MASK;
break; break;
case 'o':
ifcfg.canfd_enabled = true;
break;
case 'r': case 'r':
flags |= RANDOM_ID_MASK; flags |= RANDOM_ID_MASK;
break; break;
@ -228,7 +254,7 @@ int main(int argc, char **argv)
flags |= RTR_BIT_MASK; flags |= RTR_BIT_MASK;
break; break;
case 'p': case 'c':
flags |= RANDOM_DLC_MASK; flags |= RANDOM_DLC_MASK;
break; break;