Messages in this thread | | | Date | Wed, 16 Nov 2011 18:38:06 +0100 | From | Jean Delvare <> | Subject | Re: [PATCH] i2c/busses: (mpc) Add support for SMBUS_READ_BLOCK_DATA |
| |
On Wed, 16 Nov 2011 09:28:29 -0800, York Sun wrote: > I am not sure if this mail will reach the list as I am not subscribed. > > In the v2 patch (actually both version), you wrote > > > + byte = readb(i2c->base + MPC_I2C_DR); > > + > > + /* Adjust length if first received byte is length */ > > + if (i == 0 && recv_len) { > > + if (byte == 0 || byte > I2C_SMBUS_BLOCK_MAX) > > + return -EPROTO; > > + length += byte; > > + /* > > + * For block reads, generate txack here if data length > > + * is 1 byte (total length is 2 bytes). > > + */ > > + if (length == 2) > > + writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA > > + | CCR_TXAK); > > + } > > + data[i] = byte; > > I am wondering if the first byte should be left out for data[] if the > recv_len is non-zero. If I understand correctly, this patch is to > support of SMBus with multiple byte read. The SMBus is different from > I2C bus on multiple byte. The first data is byte count vs slave data for > I2C. So you will receive all data preceded by the byte count, which is > one more than your loop.
That's why he wrote
length += byte;
and not
length = byte;
length is initialized to 1 for SMBus block reads.
-- Jean Delvare
| |