Add i2c write command to write data from memory to i2c devices.

Signed-off-by: York Sun <york...@freescale.com>
---
 common/cmd_i2c.c |   50 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)

diff --git a/common/cmd_i2c.c b/common/cmd_i2c.c
index 2cdc4ed..6099115 100644
--- a/common/cmd_i2c.c
+++ b/common/cmd_i2c.c
@@ -223,6 +223,54 @@ static int do_i2c_read ( cmd_tbl_t *cmdtp, int flag, int 
argc, char * const argv
        return 0;
 }
 
+static int do_i2c_write(cmd_tbl_t *cmdtp, int flag, int argc, char * const 
argv[])
+{
+       u_char  chip;
+       uint    devaddr, alen, length;
+       u_char  *memaddr;
+
+       if (argc != 5)
+               return cmd_usage(cmdtp);
+
+       /*
+        * memaddr is the address where to store things in memory
+        */
+       memaddr = (u_char *)simple_strtoul(argv[1], NULL, 16);
+
+       /*
+        * I2C chip address
+        */
+       chip = simple_strtoul(argv[2], 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[3], NULL, 16);
+       alen = get_alen(argv[3]);
+       if (alen > 3)
+               return cmd_usage(cmdtp);
+
+       /*
+        * Length is the number of objects, not number of bytes.
+        */
+       length = simple_strtoul(argv[4], NULL, 16);
+
+       while (length-- > 0) {
+               if (i2c_write(chip, devaddr++, alen, memaddr++, 1) != 0) {
+                       puts("Error writing to the chip.\n");
+                       return 1;
+               }
+/*
+ * No write delay with FRAM devices.
+ */
+#if !defined(CONFIG_SYS_I2C_FRAM)
+               udelay(11000);
+#endif
+       }
+       return 0;
+}
+
 /*
  * Syntax:
  *     i2c md {i2c_chip} {addr}{.0, .1, .2} {len}
@@ -1282,6 +1330,7 @@ static cmd_tbl_t cmd_i2c_sub[] = {
        U_BOOT_CMD_MKENT(nm, 2, 1, do_i2c_nm, "", ""),
        U_BOOT_CMD_MKENT(probe, 0, 1, do_i2c_probe, "", ""),
        U_BOOT_CMD_MKENT(read, 5, 1, do_i2c_read, "", ""),
+       U_BOOT_CMD_MKENT(write, 5, 0, do_i2c_write, "", ""),
        U_BOOT_CMD_MKENT(reset, 0, 1, do_i2c_reset, "", ""),
 #if defined(CONFIG_CMD_SDRAM)
        U_BOOT_CMD_MKENT(sdram, 1, 1, do_sdram, "", ""),
@@ -1333,6 +1382,7 @@ U_BOOT_CMD(
        "i2c nm chip address[.0, .1, .2] - write to I2C device (constant 
address)\n"
        "i2c probe - show devices 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"
 #if defined(CONFIG_CMD_SDRAM)
        "i2c sdram chip - print SDRAM configuration information\n"
-- 
1.7.9.5


_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to