From 1e563e2b731d928942f43e1341c8c50b0faf1c01 Mon Sep 17 00:00:00 2001
From: guowenxue <guowenxue@gmail.com>
Date: Fri, 31 May 2024 11:39:31 +0800
Subject: [PATCH]  APPS:IGKBoard-IMX6ULL: Add test-apps source code:

---
 drivers/test-apps/can_test.c |  191 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 191 insertions(+), 0 deletions(-)

diff --git a/drivers/test-apps/can_test.c b/drivers/test-apps/can_test.c
new file mode 100644
index 0000000..7570d51
--- /dev/null
+++ b/drivers/test-apps/can_test.c
@@ -0,0 +1,191 @@
+/*********************************************************************************
+ *      Copyright:  (C) 2024 LingYun IoT System Studio
+ *                  All rights reserved.
+ *
+ *       Filename:  can_test.c
+ *    Description:  This file is socket CAN loop test program
+ *
+ *        Version:  1.0.0(05/26/2024)
+ *         Author:  Guo Wenxue <guowenxue@gmail.com>
+ *      ChangeLog:  1, Release initial version on "05/26/2024 05:42:49 PM"
+ *
+ ********************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <net/if.h>
+#include <sys/socket.h>
+#include <linux/can.h>
+#include <linux/can/raw.h>
+#include <getopt.h>
+
+// 打印使用帮助信息
+void print_usage(const char *progname)
+{
+    printf("Usage: %s -i <can_interface> -m <mode>\n", progname);
+    printf("Options:\n");
+    printf("  -i, --interface    CAN interface (e.g., can0)\n");
+    printf("  -m, --mode         Mode: send or receive\n");
+    printf("  -h, --help         Display this help message\n");
+}
+
+void send_can_message(const char *ifname)
+{
+    int                     fd;
+    struct sockaddr_can     addr;
+    struct ifreq            ifr;
+    struct can_frame        frame;
+
+    // 创建socket
+    fd = socket(PF_CAN, SOCK_RAW, CAN_RAW);
+    if (fd < 0)
+    {
+        perror("socket");
+        exit(1);
+    }
+
+    // 指定CAN接口
+    strcpy(ifr.ifr_name, ifname);
+    ioctl(fd, SIOCGIFINDEX, &ifr);
+    addr.can_family = AF_CAN;
+    addr.can_ifindex = ifr.ifr_ifindex;
+
+    // 绑定socket到CAN接口
+    if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0)
+    {
+        perror("bind");
+        exit(1);
+    }
+
+    // 构造CAN帧
+    frame.can_id = 0x123; // 设置CAN ID
+    frame.can_dlc = 2;    // 数据长度
+    frame.data[0] = 0x11; // 数据
+    frame.data[1] = 0x22; // 数据
+
+    // 发送CAN帧
+    if (write(fd, &frame, sizeof(struct can_frame)) != sizeof(struct can_frame))
+    {
+        perror("write");
+        exit(1);
+    }
+
+    // 关闭socket
+    close(fd);
+}
+
+void receive_can_message(const char *ifname)
+{
+    int                     fd;
+    struct sockaddr_can     addr;
+    struct ifreq            ifr;
+    struct can_frame        frame;
+
+    // 创建socket
+    fd = socket(PF_CAN, SOCK_RAW, CAN_RAW);
+    if (fd < 0) {
+        perror("socket");
+        exit(1);
+    }
+
+    // 指定CAN接口
+    strcpy(ifr.ifr_name, ifname);
+    ioctl(fd, SIOCGIFINDEX, &ifr);
+    addr.can_family = AF_CAN;
+    addr.can_ifindex = ifr.ifr_ifindex;
+
+    // 绑定socket到CAN接口
+    if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0)
+    {
+        perror("bind");
+        exit(1);
+    }
+
+    // 接收CAN帧
+    while (1)
+    {
+        int nbytes = read(fd, &frame, sizeof(struct can_frame));
+        if (nbytes < 0)
+        {
+            perror("read");
+            exit(1);
+        }
+
+        if (nbytes < sizeof(struct can_frame))
+        {
+            fprintf(stderr, "read: incomplete CAN frame\n");
+            exit(1);
+        }
+
+        // 打印接收到的CAN帧
+        printf("Received CAN frame: ID=0x%X DLC=%d data=", frame.can_id, frame.can_dlc);
+        for (int i = 0; i < frame.can_dlc; i++)
+            printf("%02X ", frame.data[i]);
+
+        printf("\n");
+    }
+
+    // 关闭socket
+    close(fd);
+}
+
+int main(int argc, char **argv)
+{
+    int              opt, index = 0;
+    const char      *ifname = NULL;
+    const char      *mode = NULL;
+
+    // 定义长选项
+    static struct option long_options[] =
+    {
+        {"interface", required_argument, 0, 'i'},
+        {"mode",      required_argument, 0, 'm'},
+        {"help",      no_argument,       0, 'h'},
+        {0, 0, 0, 0}
+    };
+
+    while ((opt = getopt_long(argc, argv, "i:m:h", long_options, &index)) != -1)
+    {
+        switch (opt) {
+            case 'i':
+                ifname = optarg;
+                break;
+            case 'm':
+                mode = optarg;
+                break;
+            case 'h':
+                print_usage(argv[0]);
+                return 0;
+            default:
+                print_usage(argv[0]);
+                return 1;
+        }
+    }
+
+    if (ifname == NULL || mode == NULL)
+    {
+        print_usage(argv[0]);
+        return 1;
+    }
+
+    if (strcmp(mode, "send") == 0)
+    {
+        send_can_message(ifname);
+    }
+    else if (strcmp(mode, "receive") == 0)
+    {
+        receive_can_message(ifname);
+    }
+    else
+    {
+        fprintf(stderr, "Invalid mode: %s\n", mode);
+        print_usage(argv[0]);
+        return 1;
+    }
+
+    return 0;
+}
+

--
Gitblit v1.9.1