i2c_smbus_write_* will never work

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,
i found a problem while using the driver at91_i2c.c from the arm linux
project: It is never possible to do a write operation. 

The following is a description of the error:
If you look at i2c_smbus_xfer_emulated() in i2c-core.c a message array
msg[2] with 2 messages is initialized. In the second message (msg[1]) the
flags member is always set to I2C_M_RD. 

So if you call any of the following methods
-i2c_smbus_read_byte     
-i2c_smbus_write_byte
-i2c_smbus_read_byte_data
-i2c_smbus_write_byte_data

the flag is set to I2C_M_RD. 

In the driver at91_i2c.c the bit MREAD of the TWI Master Mode Register is
always set according to the flags member of the second message and this
member is always set to I2C_M_RD. MREAD is responsible for read/write, so it
is never possible to do a write operation. 

This is the answer of the Atmel people who maintain the i2c driver for the
AT91RM9200:

Hi Peter.
Andrew forwarded me your e-mail concerning the
possible change of at91_i2c.c you proposed to
correct the explained I2C_M_RD bit which get set
incorrectly in the I2C emulating function
(i2c_smbus_xfer_emulated).

I have looked at the code, and saw that your founding
to be true ( well at least for the one I'm currently
working on now which is linux-2.4.25-vrs2 ),
that msg[1].flag is always READ. This however,
as far as I can tell, is incorrect.

What I do suggested to Andrew (and now to you)
is not to change the at91_i2c.c module to work around
the problem, but rather eliminate the source of the
problem, thus rather fix the i2c_smbus_xfer_emulated
function in i2c-core.c.

So my recommendation would be to fix-up the emulation
function by ensuring that msg[1].flags = msg[0].flags.
This *should* fix the problem.

By doing it this way, one also ensures that the at91_i2c
driver stays generic and compatible between devices on
the shared bus.
So I suggest you contact the i2c maintainer/developers,
and submitting a patch to the emulation function.
This is now an i2c issue, and not an arm specific one.


Hope this helps.

Kind regards,
Pieter Loubser

wbr
Peter

--------------------------------------------------------------
Peter K?gler
EL-ME AG
Gewerbering 1
D-84072 Au i. d. Hallertau

Tel.:     +49 / 8752 / 864 - 527
Fax.:     +49 / 8752 / 864 - 100
mailto.:  p.koegler at el-me.de         
Web:      www.el-me.de
 



[Index of Archives]     [Linux Kernel]     [Linux Hardware Monitoring]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux