diff options
| author | York Sun <yorksun@freescale.com> | 2012-09-16 08:02:30 +0000 | 
|---|---|---|
| committer | Heiko Schocher <hs@denx.de> | 2012-10-16 05:47:21 +0200 | 
| commit | ff5d2dce1e8b24e9f4d85db3906c5d2e25b0cedf (patch) | |
| tree | 3346dc16982d91c4f6abd4bbaf7ff36fe639e4b1 /common/cmd_i2c.c | |
| parent | f539094f4886779432053f5ddf7bfb2f45d182e1 (diff) | |
| download | olio-uboot-2014.01-ff5d2dce1e8b24e9f4d85db3906c5d2e25b0cedf.tar.xz olio-uboot-2014.01-ff5d2dce1e8b24e9f4d85db3906c5d2e25b0cedf.zip | |
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>
Diffstat (limited to 'common/cmd_i2c.c')
| -rw-r--r-- | common/cmd_i2c.c | 50 | 
1 files changed, 50 insertions, 0 deletions
| diff --git a/common/cmd_i2c.c b/common/cmd_i2c.c index 795814d88..b59470e7f 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" |