canfdtest: Add CAN FD Bit Rate Switch support

Added the '-b' command line option, to be used in conjunction with the '-d'
option that enables CAN FD, to set the BRS bit in a CAN FD frame. When
enabled, the data part of the CAN FD frame is transmitted at a higher speed.
All remaining parts of the CAN FD frame use the classic CAN speed.

Signed-off-by: RICCIARDI-Adrien <adrien.ricciardi@hotmail.fr>
pull/366/head
RICCIARDI-Adrien 2022-06-22 10:50:12 +02:00
parent 2b0ed067dd
commit 6d3bf51e0a
1 changed files with 16 additions and 1 deletions

View File

@ -56,6 +56,7 @@ static canid_t can_id_ping = CAN_MSG_ID_PING;
static canid_t can_id_pong = CAN_MSG_ID_PONG; static canid_t can_id_pong = CAN_MSG_ID_PONG;
static int has_pong_id = 0; static int has_pong_id = 0;
static int is_can_fd = 0; static int is_can_fd = 0;
static int bit_rate_switch = 0;
static void print_usage(char *prg) static void print_usage(char *prg)
{ {
@ -64,6 +65,7 @@ static void print_usage(char *prg)
"Usage: %s [options] <can-interface>\n" "Usage: %s [options] <can-interface>\n"
"\n" "\n"
"Options:\n" "Options:\n"
" -b (enable CAN FD Bit Rate Switch)\n"
" -d (use CAN FD frames instead of classic CAN)\n" " -d (use CAN FD frames instead of classic CAN)\n"
" -f COUNT (number of frames in flight, default: %d)\n" " -f COUNT (number of frames in flight, default: %d)\n"
" -g (generate messages)\n" " -g (generate messages)\n"
@ -213,6 +215,9 @@ static int send_frame(struct canfd_frame *frame)
else else
len = sizeof(struct can_frame); len = sizeof(struct can_frame);
if (bit_rate_switch)
frame->flags |= CANFD_BRS;
while ((ret = send(sockfd, frame, len, 0)) != len) { while ((ret = send(sockfd, frame, len, 0)) != len) {
if (ret >= 0) { if (ret >= 0) {
fprintf(stderr, "send returned %zd", ret); fprintf(stderr, "send returned %zd", ret);
@ -413,8 +418,12 @@ int main(int argc, char *argv[])
signal(SIGHUP, signal_handler); signal(SIGHUP, signal_handler);
signal(SIGINT, signal_handler); signal(SIGINT, signal_handler);
while ((opt = getopt(argc, argv, "df:gi:l:o:vx?")) != -1) { while ((opt = getopt(argc, argv, "bdf:gi:l:o:vx?")) != -1) {
switch (opt) { switch (opt) {
case 'b':
bit_rate_switch = 1;
break;
case 'd': case 'd':
is_can_fd = 1; is_can_fd = 1;
break; break;
@ -455,6 +464,12 @@ int main(int argc, char *argv[])
} }
} }
/* BRS can be enabled only if CAN FD is enabled */
if (bit_rate_switch && !is_can_fd) {
printf("Bit rate switch (-b) needs CAN FD (-d) to be enabled\n");
return 1;
}
if ((argc - optind) != 1) if ((argc - optind) != 1)
print_usage(basename(argv[0])); print_usage(basename(argv[0]));
intf_name = argv[optind]; intf_name = argv[optind];