Hello Lubomir,

Am 28.01.2015 09:32, schrieb Lubomir Popov:
Hi Heiko,

Hello Lubomir,

Am 24.11.2014 17:00, schrieb Lubomir Popov:
I2C chips do exist that require a write of some multi-byte data to occur in
a single bus transaction (aka atomic transfer), otherwise either the write
does not come into effect at all, or normal operation of internal circuitry
cannot be guaranteed. The current implementation of the 'i2c write' command
(transfer of multiple bytes from a memory buffer) in fact performs a separate
transaction for each byte to be written and thus cannot support such types of
I2C slave devices.

This patch provides an alternative by allowing 'i2c write' to execute the
write transfer of the given number of bytes in a single bus transaction if
CONFIG_SYS_I2C_BULK_WRITE is defined in the board header (otherwise the old
method shall compile).

Signed-off-by: Lubomir Popov <l-po...@ti.com>
---
   common/cmd_i2c.c |   15 ++++++++++++++-
   1 file changed, 14 insertions(+), 1 deletion(-)

Could you rebase your patch against current mainline, please?
As we have now DM in i2c subsystem your patch does not apply clean
anymore ... thanks!

It looks like you are referring V1 of the patch here. The correct
version is V2 (http://patchwork.ozlabs.org/patch/415117/). If it
doesn't apply as well, I shall try to find some time to fix it.

Sorry, was the wrong EMail I replied ... but the v2 does not
apply to current mainline. If you can fix it, that would be great.

Thanks!

bye,
Heiko

Thanks,
Lubo


bye,
Heiko

diff --git a/common/cmd_i2c.c b/common/cmd_i2c.c
index 3a75f94..7116458 100644
--- a/common/cmd_i2c.c
+++ b/common/cmd_i2c.c
@@ -280,10 +280,22 @@ static int do_i2c_write(cmd_tbl_t *cmdtp, int flag, int 
argc, char * const argv[
                return cmd_usage(cmdtp);

        /*
-        * Length is the number of objects, not number of bytes.
+        * Length is the number of bytes.
         */
        length = simple_strtoul(argv[4], NULL, 16);

+#if defined(CONFIG_SYS_I2C_BULK_WRITE)
+       /*
+        * Write all bytes in a single I2C transaction. If the target
+        * device is an EEPROM, it is your responsibility to not cross
+        * a page bounady.
+        */
+       if (i2c_write(chip, devaddr, alen, memaddr, length) != 0) {
+               puts("Error writing to the chip.\n");
+               return 1;
+       }
+#else
+       /* Perform <length> separate write transactions of one byte each */
        while (length-- > 0) {
                if (i2c_write(chip, devaddr++, alen, memaddr++, 1) != 0) {
                        puts("Error writing to the chip.\n");
@@ -296,6 +308,7 @@ static int do_i2c_write(cmd_tbl_t *cmdtp, int flag, int 
argc, char * const argv[
                udelay(11000);
   #endif
        }
+#endif
        return 0;
   }


--
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany




--
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to