On Wed, 09 Nov 2011 12:41:36 +0200, Antti Palosaari wrote:
> On 11/09/2011 11:56 AM, Mauro Carvalho Chehab wrote:
> > Due to the way I2C locks are bound, doing something like the above and
> > something like:
> >
> > struct i2c_msg msg[2] = {
> > {
> > .addr = i2c_cfg->addr,
> > .flags = 0,
> > .buf = buf,
> > },
> > {
> > .addr = i2c_cfg->addr,
> > .flags = 0,
> > .buf = buf2,
> > }
> >
> > };
> >
> > ret = i2c_transfer(i2c_cfg->adapter, msg, 2);
> >
> > Produces a different result. In the latter case, I2C core avoids having any
> > other
> > transaction in the middle of the 2 messages.
>
> In my understanding adding more messages than one means those should be
> handled as one I2C transaction using REPEATED START.
> I see one big problem here, it is our adapters. I think again, for the
> experience I have, most of our I2C-adapters can do only 3 different
> types of I2C xfers;
> * I2C write
> * I2C write + I2C read (combined with REPEATED START)
> * I2C read (I suspect many adapters does not support that)
> That means, I2C REPEATED writes are not possible.
Also, some adapters _or slaves_ won't support more than one repeated
start in a given transaction, so splitting block reads in continuous
chunks won't always work either. Which makes some sense if you think
about it: if both the slave and the controller supported larger blocks
then there would be no need to split the transfer into multiple
messages in the first place.
--
Jean Delvare
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html