From: Wolfgang Grandegger <w...@denx.de>

Signed-off-by: Wolfgang Grandegger <w...@denx.de>
---
 common/Makefile  |    1 +
 common/cmd_can.c |  119 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 120 insertions(+), 0 deletions(-)
 create mode 100644 common/cmd_can.c

diff --git a/common/Makefile b/common/Makefile
index 3781738..b7f4c22 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -72,6 +72,7 @@ COBJS-$(CONFIG_CMD_BEDBUG) += bedbug.o cmd_bedbug.o
 COBJS-$(CONFIG_CMD_BMP) += cmd_bmp.o
 COBJS-$(CONFIG_CMD_BOOTLDR) += cmd_bootldr.o
 COBJS-$(CONFIG_CMD_CACHE) += cmd_cache.o
+COBJS-$(CONFIG_CMD_CAN) += cmd_can.o
 COBJS-$(CONFIG_CMD_CONSOLE) += cmd_console.o
 COBJS-$(CONFIG_CMD_CPLBINFO) += cmd_cplbinfo.o
 COBJS-$(CONFIG_DATAFLASH_MMC_SELECT) += cmd_dataflash_mmc_mux.o
diff --git a/common/cmd_can.c b/common/cmd_can.c
new file mode 100644
index 0000000..af7bf34
--- /dev/null
+++ b/common/cmd_can.c
@@ -0,0 +1,119 @@
+/*
+ * (C) Copyright 2007-2009, Wolfgang Grandegger <w...@denx.de>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+/*
+ * CAN device test command
+ */
+#include <common.h>
+#include <command.h>
+#include <can.h>
+
+static struct can_dev *can_dev;
+
+int do_can (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+       struct can_msg msg;
+       char op;
+       int i;
+
+       op = argv[1][0];
+
+       if (argc < 2) {
+               can_list ();
+               return 0;
+       }
+
+       if (!can_dev && op != 'i') {
+               can_dev = can_init (0, 0);
+               if (!can_dev)
+                       return 1;
+       }
+
+       if (op == 's') {
+               unsigned int level = 0;
+               if (argc > 2)
+                       level = simple_strtoul (argv[2], NULL, 10);
+               can_status (can_dev, level);
+       }
+
+       else if (op == 'i') {
+               unsigned int dev_num = 0, ibaud = 0;
+               struct can_dev *dev;
+
+               if (argc > 2)
+                       dev_num = simple_strtoul (argv[2], NULL, 10);
+               if (argc > 3) {
+                       ibaud = simple_strtoul (argv[3], NULL, 10);
+                       if (ibaud > 2)
+                               ibaud = 2;
+               }
+               dev = can_init (dev_num, ibaud);
+               if (!dev)
+                       return 1;
+               can_dev = dev;
+       }
+
+       else if (op == 'r') {
+               while (!can_recv (can_dev, &msg)) {
+                       printf ("<0x%03x>", msg.id & CAN_SFF_MASK);
+
+                       printf (" [%d]", msg.dlc);
+                       if (msg.id & CAN_RTR_FLAG)
+                               puts (" rtr");
+                       else {
+                               for (i = 0; i < msg.dlc; i++)
+                                       printf (" %02x", msg.data[i]);
+                       }
+                       puts ("\n");
+               }
+       } else if (op == 'x') {
+               memset (&msg, 0, sizeof (msg));
+               msg.id = 0x123;
+               if (argc > 2)
+                   msg.id = simple_strtoul (argv[2], NULL, 16);
+               for (i = 0; argc > (3 + i); i++, msg.dlc++) {
+                       msg.data[i] = simple_strtoul (argv[3 + i], NULL, 16);
+               }
+               if (argc == 2)
+                       printf ("Transmitting id %#x dlc %d\n",
+                               msg.id, msg.dlc);
+
+               if (can_xmit (can_dev, &msg))
+                       puts("FAILED\n");
+               else
+                       puts("OK\n");
+       } else {
+               printf ("Usage:\n%s\n", cmdtp->usage);
+               return 1;
+       }
+
+       return 0;
+}
+
+U_BOOT_CMD(
+       can, 3, 1, do_can,
+       "can - CAN bus commands\n",
+       "can status [level]\n"
+       "can init [dev] [baud-index]\n"
+       "can xmit [id] [d0] [d1] ... [d7]\n"
+       "can recv, abort with CTRL-C\n"
+);
-- 
1.6.2.5

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to