soft_i2c.c add option for repeated start in i2c_read()
PATCH 1/1 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
--- README | 9 +++++++++ drivers/i2c/soft_i2c.c | 12 +++++++++++- 2 files changed, 20 insertions(+), 1 deletions(-)
README +9 -0
@@ -1496,6 +1496,15 @@ The following options need to be configured: Bus on the MPC8260. But it should be not so difficult 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
drivers/i2c/soft_i2c.c +11 -1
@@ -385,8 +385,18 @@ int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len) } 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 (); +#else +send_stop (); +send_start (); +#endif }/* * Send the chip address again, this time for a read cycle.
Signature · 1 line
1.5.6.3
Wolfgang Denk
AppliedPATCH 1/1 soft_i2c.c add option for repeated start in i2c_read()
Dear Andrew Dyer,
Quoted 11 lines · In message <[email protected]> you wrote:
This patch adds a #define to optionally change the behaviour of
i2c_read()insoft_i2c.cto 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.
Quoted 7 lines
(*) http://www.inspired-energy.com/Standard_Products/NL2054/NL2054%20Rev1.0%20Data%20Sheet.pdf
Signed-off-by Andrew Dyer <[email protected]>--- README | 9 +++++++++ drivers/i2c/soft_i2c.c | 12 +++++++++++- 2 files changed, 20 insertions(+), 1 deletions(-)
Applied, thanks.
Best regards,
Wolfgang Denk
Signature · 5 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de A wise person makes his own decisions, a weak one obeys public opinion. -- Chinese proverb