Patchwork [U-Boot] i2c_probe: update for use in scripting

login
register
mail settings
Submitter Eric Nelson
Date Sept. 23, 2012, 8:12 p.m.
Message ID <1348431176-19960-1-git-send-email-eric.nelson@boundarydevices.com>
Download mbox | patch
Permalink /patch/186277/
State Accepted
Delegated to: Heiko Schocher
Headers show

Comments

Eric Nelson - Sept. 23, 2012, 8:12 p.m.
Allow the use of an I2C address to test and return success
if one or more devices is found.

This allows device presence to alter the flow of a script.
e.g.
   if i2c probe 0x04 ; then
	echo found Hannstar touch ;
   fi

Signed-off-by: Eric Nelson <eric.nelson@boundarydevices.com>
---
 common/cmd_i2c.c |   20 ++++++++++++++++----
 1 files changed, 16 insertions(+), 4 deletions(-)
Heiko Schocher - Oct. 16, 2012, 3:58 a.m.
Hello Eric Nelson,

On 23.09.2012 22:12, Eric Nelson wrote:
> Allow the use of an I2C address to test and return success
> if one or more devices is found.
>
> This allows device presence to alter the flow of a script.
> e.g.
>     if i2c probe 0x04 ; then
> 	echo found Hannstar touch ;
>     fi
>
> Signed-off-by: Eric Nelson<eric.nelson@boundarydevices.com>
> ---
>   common/cmd_i2c.c |   20 ++++++++++++++++----
>   1 files changed, 16 insertions(+), 4 deletions(-)

Applied to u-boot-i2c master

Thanks!

bye,
Heiko

Patch

diff --git a/common/cmd_i2c.c b/common/cmd_i2c.c
index 795814d..b64b975 100644
--- a/common/cmd_i2c.c
+++ b/common/cmd_i2c.c
@@ -557,18 +557,28 @@  mod_i2c_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const arg
 
 /*
  * Syntax:
- *	i2c probe {addr}{.0, .1, .2}
+ *	i2c probe {addr}
+ *
+ * Returns zero (success) if one or more I2C devices was found
  */
 static int do_i2c_probe (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
 	int j;
+	int addr = -1;
+	int found = 0;
 #if defined(CONFIG_SYS_I2C_NOPROBES)
 	int k, skip;
 	uchar bus = GET_BUS_NUM;
 #endif	/* NOPROBES */
 
+	if (argc == 2)
+		addr = simple_strtol(argv[1], 0, 16);
+
 	puts ("Valid chip addresses:");
 	for (j = 0; j < 128; j++) {
+		if ((0 <= addr) && (j != addr))
+			continue;
+
 #if defined(CONFIG_SYS_I2C_NOPROBES)
 		skip = 0;
 		for (k=0; k < NUM_ELEMENTS_NOPROBE; k++) {
@@ -580,8 +590,10 @@  static int do_i2c_probe (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv
 		if (skip)
 			continue;
 #endif
-		if (i2c_probe(j) == 0)
+		if (i2c_probe(j) == 0) {
 			printf(" %02X", j);
+			found++;
+		}
 	}
 	putc ('\n');
 
@@ -594,7 +606,7 @@  static int do_i2c_probe (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv
 	putc ('\n');
 #endif
 
-	return 0;
+	return (0 == found);
 }
 
 /*
@@ -1331,7 +1343,7 @@  U_BOOT_CMD(
 	"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"
 	"i2c nm chip address[.0, .1, .2] - write to I2C device (constant address)\n"
-	"i2c probe - show devices on the I2C bus\n"
+	"i2c probe [address] - test for and show device(s) on the I2C bus\n"
 	"i2c read chip address[.0, .1, .2] length memaddress - read to memory \n"
 	"i2c reset - re-init the I2C Controller\n"
 #if defined(CONFIG_CMD_SDRAM)