mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-22 12:54:37 +00:00
soft_i2c.c add option for repeated start in i2c_read()
This patch adds a #define to optionally change the behaviour of i2c_read() in soft_i2c.c to send an I2C repeated start instead of a stop-start between sending the device address pointer write and reading back the data. The current behaviour is retained as the default. While most devices will work either way, I have a smart battery(*) that requires repeated start, and someone at some point found a device that required a stop-start. (*) http://www.inspired-energy.com/Standard_Products/NL2054/NL2054%20Rev1.0%20Data%20Sheet.pdf Signed-off-by: Andrew Dyer <adyer@righthandtech.com>
This commit is contained in:
parent
3429071700
commit
2ac6985a74
2 changed files with 20 additions and 1 deletions
9
README
9
README
|
@ -1509,6 +1509,15 @@ The following options need to be configured:
|
||||||
Bus on the MPC8260. But it should be not so difficult
|
Bus on the MPC8260. But it should be not so difficult
|
||||||
to add this option to other architectures.
|
to add this option to other architectures.
|
||||||
|
|
||||||
|
CONFIG_SOFT_I2C_READ_REPEATED_START
|
||||||
|
|
||||||
|
defining this will force the i2c_read() function in
|
||||||
|
the soft_i2c driver to perform an I2C repeated start
|
||||||
|
between writing the address pointer and reading the
|
||||||
|
data. If this define is omitted the default behaviour
|
||||||
|
of doing a stop-start sequence will be used. Most I2C
|
||||||
|
devices can use either method, but some require one or
|
||||||
|
the other.
|
||||||
|
|
||||||
- SPI Support: CONFIG_SPI
|
- SPI Support: CONFIG_SPI
|
||||||
|
|
||||||
|
|
|
@ -385,8 +385,18 @@ int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len)
|
||||||
}
|
}
|
||||||
shift -= 8;
|
shift -= 8;
|
||||||
}
|
}
|
||||||
send_stop(); /* reportedly some chips need a full stop */
|
|
||||||
|
/* Some I2C chips need a stop/start sequence here,
|
||||||
|
* other chips don't work with a full stop and need
|
||||||
|
* only a start. Default behaviour is to send the
|
||||||
|
* stop/start sequence.
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_SOFT_I2C_READ_REPEATED_START
|
||||||
send_start();
|
send_start();
|
||||||
|
#else
|
||||||
|
send_stop();
|
||||||
|
send_start();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Send the chip address again, this time for a read cycle.
|
* Send the chip address again, this time for a read cycle.
|
||||||
|
|
Loading…
Add table
Reference in a new issue