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]"
-i <can-iface> Name of the CAN interface"
-b <bitrate> Bitrate to use (Hz)"
"-s <sample-ponit> Bitrate Sample Point\n"
-f <filters> 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 <dbitrate> Maximum data bitrate for CAN FD (Hz)\n"
" -a <dsample-point> 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 <can-iface> -b <bitrate> [options]"
"-i <can-iface> Name of the CAN interface"
"-b <bitrate> Bitrate to use (Hz)"
"-s <sample_point> CAN bitrate sample point\n"
"-n <num_msgs> Number of messages to send (default 1)"
"-t <delay> Inter frame delay in ms (default 100)"
"-I <msg_id> Message id in hex (default 123)"
"-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)"
"-p Generate a random payload (will ignore the -l parameter)"
"-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"
"-i <can-iface> Name of the CAN interface\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"
" 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"
"-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;

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"
"-i <can-iface> Name of the CAN interface\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"
"-t <delay> Inter frame delay in ms (default 100)\n"
"-I <msg_id> Message id in hex (default 123)\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"
"-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;