No subject


Tue Oct 15 21:54:23 CEST 2013


=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
If "CONFIG_SYS_I2C_EEPROM_ADDR_LEN =3D=3D 1":
addr[0] =3D offset >> 8;

If "CONFIG_SYS_I2C_EEPROM_ADDR_LEN > 1":
addr[0] =3D offset >> 16;

And in both cases then OR with "dev_addr":
addr[0] |=3D dev_addr;
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

In other words it gets both real I2S slave address + MSB bits of offset.
But note that "offset" value stays unchanged.

So if you pass both "addr[0]" (which already has MSB bits of "offset")
and "offset" itself then you'll get completely incorrect I2C command.

> @@ -339,7 +339,7 @@ int eeprom_write (unsigned dev_addr, unsigned offset,=
 uchar *buffer, unsigned cn
>  		/* Write is enabled ... now write eeprom value.
>  		 */
>  #endif
> -		if (i2c_write (addr[0], addr[1], alen-1, buffer, len) !=3D 0)
> +		if (i2c_write(addr[0], offset, alen - 1, buffer, len))
>  			rcode =3D 1;
>=20
>  #endif

Same goes to "eeprom_write".

Moreover I'd say that this address/offset tricks are very
EEPROM-specific and because of this we'd better keep it here and don't
modify generic I2C code.

Regards,
Alexey



More information about the U-Boot mailing list