i2c_probe: update for use in scripting
authorEric Nelson <eric.nelson@boundarydevices.com>
Sun, 23 Sep 2012 10:12:56 +0000 (10:12 +0000)
committerHeiko Schocher <hs@denx.de>
Tue, 16 Oct 2012 03:47:21 +0000 (05:47 +0200)
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

index b59470e7f68947e4a5071c261a4a1baec05b16bf..82e63e13224cb6c45d129585a4dd3de59f69ae2c 100644 (file)
@@ -605,18 +605,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++) {
@@ -628,8 +638,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');
 
@@ -642,7 +654,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);
 }
 
 /*
@@ -1380,7 +1392,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 write memaddress chip address[.0, .1, .2] length - write memory to i2c\n"
        "i2c reset - re-init the I2C Controller\n"