]> git.sur5r.net Git - u-boot/commitdiff
soft_i2c.c add option for repeated start in i2c_read()
authorAndrew Dyer <adyer@righthandtech.com>
Mon, 29 Dec 2008 23:36:01 +0000 (17:36 -0600)
committerWolfgang Denk <wd@denx.de>
Tue, 27 Jan 2009 21:26:31 +0000 (22:26 +0100)
This patch adds a #define to optionally change the behaviour of
i2c_read() in soft_i2c.c to send an I2C repeated start instead of a
stop-start between sending the device address pointer write and
reading back the data.  The current behaviour is retained as the
default.

While most devices will work either way, I have a smart battery(*)
that requires repeated start, and someone at some point found a
device that required a stop-start.

(*) http://www.inspired-energy.com/Standard_Products/NL2054/NL2054%20Rev1.0%20Data%20Sheet.pdf

Signed-off-by: Andrew Dyer <adyer@righthandtech.com>
README
drivers/i2c/soft_i2c.c

diff --git a/README b/README
index ad792d394fbbf092ba810c3821f6fe8962d4e19c..afcc6714b16439e3cfd1ee83fe121a640dfa5066 100644 (file)
--- a/README
+++ b/README
@@ -1509,6 +1509,15 @@ The following options need to be configured:
                Bus on the MPC8260. But it should be not so difficult
                to add this option to other architectures.
 
                Bus on the MPC8260. But it should be not so difficult
                to add this option to other architectures.
 
+               CONFIG_SOFT_I2C_READ_REPEATED_START
+
+               defining this will force the i2c_read() function in
+               the soft_i2c driver to perform an I2C repeated start
+               between writing the address pointer and reading the
+               data.  If this define is omitted the default behaviour
+               of doing a stop-start sequence will be used.  Most I2C
+               devices can use either method, but some require one or
+               the other.
 
 - SPI Support: CONFIG_SPI
 
 
 - SPI Support: CONFIG_SPI
 
index a27de5a7ec7887e836461bb1648cb64f8ab35b9a..da6cec1fa28090bf708c25f35317d85a27771f35 100644 (file)
@@ -385,8 +385,18 @@ int  i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len)
                        }
                        shift -= 8;
                }
                        }
                        shift -= 8;
                }
-               send_stop();    /* reportedly some chips need a full stop */
+
+               /* Some I2C chips need a stop/start sequence here,
+                * other chips don't work with a full stop and need
+                * only a start.  Default behaviour is to send the
+                * stop/start sequence.
+                */
+#ifdef CONFIG_SOFT_I2C_READ_REPEATED_START
                send_start();
                send_start();
+#else
+               send_stop();
+               send_start();
+#endif
        }
        /*
         * Send the chip address again, this time for a read cycle.
        }
        /*
         * Send the chip address again, this time for a read cycle.