public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Frans Meulenbroeks <fransmeulenbroeks@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] cmd_i2c.c: added command to read to memory
Date: Sat, 20 Feb 2010 12:14:43 +0100	[thread overview]
Message-ID: <1266664483-19663-1-git-send-email-fransmeulenbroeks@gmail.com> (raw)

From: Frans <frans@frans.(none)>

Added a new function i2c read to read to memory.
That way it becomes possible to test against a value and
use that to influence the boot process.

Design decision was to stay close to the i2c md command with
respect to command syntax.

Signed-off-by: Frans Meulenbroeks <fransmeulenbroeks@gmail.com>
---
 common/cmd_i2c.c |   76 ++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 68 insertions(+), 8 deletions(-)

diff --git a/common/cmd_i2c.c b/common/cmd_i2c.c
index 62cbd33..0100aa9 100644
--- a/common/cmd_i2c.c
+++ b/common/cmd_i2c.c
@@ -150,6 +150,64 @@ int i2c_set_bus_speed(unsigned int)
 
 /*
  * Syntax:
+ *	i2c read {i2c_chip} {devaddr}{.0, .1, .2} {len} {memaddr}
+ */
+
+int do_i2c_read ( cmd_tbl_t *cmdtp, int argc, char *argv[])
+{
+	u_char	chip;
+	uint	devaddr, alen, length;
+	u_char  *memaddr;
+	int	j;
+
+	if (argc != 5) {
+		cmd_usage(cmdtp);
+		return 1;
+	}
+
+	/*
+	 * I2C chip address
+	 */
+	chip = simple_strtoul(argv[1], NULL, 16);
+
+	/*
+	 * I2C data address within the chip.  This can be 1 or
+	 * 2 bytes long.  Some day it might be 3 bytes long :-).
+	 */
+	devaddr = simple_strtoul(argv[2], NULL, 16);
+	alen = 1;
+	for (j = 0; j < 8; j++) {
+		if (argv[2][j] == '.') {
+			alen = argv[2][j+1] - '0';
+			if (alen > 4) {
+				cmd_usage(cmdtp);
+				return 1;
+			}
+			break;
+		} else if (argv[2][j] == '\0')
+			break;
+	}
+
+	/*
+	 * Length is the number of objects, not number of bytes.
+	 */
+	length = simple_strtoul(argv[3], NULL, 16);
+
+	/*
+	 * memaddr is the address where to store things in memory
+	 */
+	memaddr = (u_char *)simple_strtoul(argv[4], NULL, 16);
+
+	if (i2c_read(chip, devaddr, alen, memaddr, length) != 0)
+	{
+		puts ("Error reading the chip.\n");
+		return 1;
+	}
+	return 0;
+}
+
+/*
+ * Syntax:
  *	i2c md {i2c_chip} {addr}{.0, .1, .2} {len}
  */
 #define DISP_LINE_LEN	16
@@ -1249,15 +1306,17 @@ int do_i2c(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 	argv++;
 
 #if defined(CONFIG_I2C_MUX)
-	if (!strncmp(argv[0], "bu", 2))
+	if (!strcmp(argv[0], "bus", 3))
 		return do_i2c_add_bus(cmdtp, flag, argc, argv);
 #endif  /* CONFIG_I2C_MUX */
-	if (!strncmp(argv[0], "sp", 2))
+	if (!strncmp(argv[0], "speed", 5))
 		return do_i2c_bus_speed(cmdtp, flag, argc, argv);
 #if defined(CONFIG_I2C_MULTI_BUS)
-	if (!strncmp(argv[0], "de", 2))
+	if (!strncmp(argv[0], "dev", 3))
 		return do_i2c_bus_num(cmdtp, flag, argc, argv);
 #endif  /* CONFIG_I2C_MULTI_BUS */
+	if (!strncmp(argv[0], "read", 4))
+		return do_i2c_read(cmdtp, argc, argv);
 	if (!strncmp(argv[0], "md", 2))
 		return do_i2c_md(cmdtp, flag, argc, argv);
 	if (!strncmp(argv[0], "mm", 2))
@@ -1266,18 +1325,18 @@ int do_i2c(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
 		return do_i2c_mw(cmdtp, flag, argc, argv);
 	if (!strncmp(argv[0], "nm", 2))
 		return mod_i2c_mem (cmdtp, 0, flag, argc, argv);
-	if (!strncmp(argv[0], "cr", 2))
+	if (!strncmp(argv[0], "crc", 3))
 		return do_i2c_crc(cmdtp, flag, argc, argv);
-	if (!strncmp(argv[0], "pr", 2))
+	if (!strncmp(argv[0], "probe", 5))
 		return do_i2c_probe(cmdtp, flag, argc, argv);
-	if (!strncmp(argv[0], "re", 2)) {
+	if (!strncmp(argv[0], "reset", 5)) {
 		i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
 		return 0;
 	}
-	if (!strncmp(argv[0], "lo", 2))
+	if (!strncmp(argv[0], "loop", 4))
 		return do_i2c_loop(cmdtp, flag, argc, argv);
 #if defined(CONFIG_CMD_SDRAM)
-	if (!strncmp(argv[0], "sd", 2))
+	if (!strncmp(argv[0], "sdram", 5))
 		return do_sdram(cmdtp, flag, argc, argv);
 #endif
 	cmd_usage(cmdtp);
@@ -1296,6 +1355,7 @@ U_BOOT_CMD(
 #if defined(CONFIG_I2C_MULTI_BUS)
 	"i2c dev [dev] - show or set current I2C bus\n"
 #endif  /* CONFIG_I2C_MULTI_BUS */
+	"i2c read chip address[.0, .1, .2] #_of_objects memaddr - read from I2C device to memory\n"
 	"i2c md chip address[.0, .1, .2] [# of objects] - read from I2C device\n"
 	"i2c mm chip address[.0, .1, .2] - write to I2C device (auto-incrementing)\n"
 	"i2c mw chip address[.0, .1, .2] value [count] - write to I2C device (fill)\n"
-- 
1.5.4.3

             reply	other threads:[~2010-02-20 11:14 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-02-20 11:14 Frans Meulenbroeks [this message]
2010-02-22  7:27 ` [U-Boot] [PATCH] cmd_i2c.c: added command to read to memory Heiko Schocher
2010-02-22  8:35   ` Wolfgang Denk
2010-02-22  9:01     ` Heiko Schocher
2010-02-22 11:05 ` Detlev Zundel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1266664483-19663-1-git-send-email-fransmeulenbroeks@gmail.com \
    --to=fransmeulenbroeks@gmail.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox