[U-Boot] [PATCH] common/i2c: Add i2c write command

Add i2c write command to write data from memory to i2c devices.
Signed-off-by: York Sun yorksun@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"

On Sun, Sep 16, 2012 at 01:02:30PM -0500, York Sun wrote:
Add i2c write command to write data from memory to i2c devices.
Signed-off-by: York Sun yorksun@freescale.com
This feels like eeprom write, to an i2c-connected eeprom. Is that what you have this for, or something else?

Tom,
It's like eeprom write but it writes to general devices, not specificly to system eeprom. I would have to use i2c mw command a lot without this.
York
-------- Original Message -------- From: Tom Rini Sent: Mon, Sep 17, 2012 05:16 PM To: sun york-R58495 CC: u-boot@lists.denx.de; u-boot-release@linux.freescale.net; Heiko Schocher Subject: Re: [U-Boot] [PATCH] common/i2c: Add i2c write command
On Sun, Sep 16, 2012 at 01:02:30PM -0500, York Sun wrote:
Add i2c write command to write data from memory to i2c devices.
Signed-off-by: York Sun yorksun@freescale.com
This feels like eeprom write, to an i2c-connected eeprom. Is that what you have this for, or something else?
-- Tom

On Mon, Sep 17, 2012 at 11:29:00PM +0000, sun york-R58495 wrote:
Tom,
It's like eeprom write but it writes to general devices, not specificly to system eeprom. I would have to use i2c mw command a lot without this.
Right. I guess what I'm getting at is, are you writing to some sort of other device or writing bits to storage attached to i2c? Does it really not make sense to just use 'eeprom write' even if it's not technically for The System EEPROM but rather some storage (or a number of storage chips) attached via i2c?
I'm not objecting to i2c write mind you, I was wishing for something like this when I stumbled on CONFIG_CMD_EEPROM which did what I needed.

On 09/17/2012 06:36 PM, Tom Rini wrote:
On Mon, Sep 17, 2012 at 11:29:00PM +0000, sun york-R58495 wrote:
Tom,
It's like eeprom write but it writes to general devices, not specificly to system eeprom. I would have to use i2c mw command a lot without this.
Right. I guess what I'm getting at is, are you writing to some sort of other device or writing bits to storage attached to i2c? Does it really not make sense to just use 'eeprom write' even if it's not technically for The System EEPROM but rather some storage (or a number of storage chips) attached via i2c?
I'm not objecting to i2c write mind you, I was wishing for something like this when I stumbled on CONFIG_CMD_EEPROM which did what I needed.
Tom,
I have a case under debugging where I need to use i2c write to devices. One device (EEPROM) has two-byte address length and most others (including other EEPROMs) have one byte address length. I also have other non-storage devices but I wouldn't use "i2c write" because "i2c mw" will be sufficient. eeprom command has its limitation for the case of variable device address and variable address length.
York

On 09/17/2012 08:57 PM, York Sun wrote:
I have a case under debugging where I need to use i2c write to devices. One device (EEPROM) has two-byte address length and most others (including other EEPROMs) have one byte address length. I also have other non-storage devices but I wouldn't use "i2c write" because "i2c mw" will be sufficient. eeprom command has its limitation for the case of variable device address and variable address length.
Tom,
Do I need to change this patch in any way? I see it is still "under review" in patchwork.
York

-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
On 09/25/12 12:59, York Sun wrote:
On 09/17/2012 08:57 PM, York Sun wrote:
I have a case under debugging where I need to use i2c write to devices. One device (EEPROM) has two-byte address length and most others (including other EEPROMs) have one byte address length. I also have other non-storage devices but I wouldn't use "i2c write" because "i2c mw" will be sufficient. eeprom command has its limitation for the case of variable device address and variable address length.
Tom,
Do I need to change this patch in any way? I see it is still "under review" in patchwork.
I am fine with it. This falls to Heiko now, thanks.
- -- Tom

Hello Tom, York,
On 25.09.2012 22:21, Tom Rini wrote: [...]
Tom,
Do I need to change this patch in any way? I see it is still "under review" in patchwork.
I am fine with it. This falls to Heiko now, thanks.
It looks good to me too. I add it in the next merge window.
bye, Heiko

Hello York Sun,
On 16.09.2012 20:02, York Sun wrote:
Add i2c write command to write data from memory to i2c devices.
Signed-off-by: York Sunyorksun@freescale.com
common/cmd_i2c.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+)
Applied to u-boot-i2c master
Thanks!
bye, Heiko
participants (4)
-
Heiko Schocher
-
sun york-R58495
-
Tom Rini
-
York Sun