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