Hi Rory,

On Thu, 7 Oct 2010 14:37:57 -0700, Rory Filer wrote:
> I'm working on a proof-of-concept device which contains several chips 
> connected to the same adapter (/dev/ic2-0) on the I2C bus. Some of these have 
> kernel-space drivers (e.g. GPIO Expander) and some don't. For the ones that 
> don't I've opted to use the method described in the kernel 
> Documentation/i2c/dev-interface document. This works great and does all I 
> need for now. This is the general procedure I'm following as outlined in 
> kernel - Documentation/i2c/dev-interface. 
> 
> - open /dev/i2c-N
> - Set the chip's address by calling ioctl(file, I2C_SLAVE, address)
> - interact with the chip using read/write or smb calls, etc.
> - close the file when done
> 
> I'm assuming that a kernel space chip driver like our gpio expander 
> (pca953x.c) also uses the same adapter driver as my user-space application 
> since that expander chip is on the same bus.

Let's clarify right away: i2c-dev (which handles /dev/i2c-* nodes) is
NOT an adapter driver. It is a bridge driver between user-space and
your adapter driver. Your adapter driver is most likely one living in
drivers/i2c/busses, and depends on the actual hardware you run on.

> My question is, what happens if a kernel driver is using the bus at the same 
> time my user-mode application is?

It will work fine.

> Even if the user space app. may not be running when the chip driver runs, the 
> adapter has an address written into it via the ioctl() call, I noted above.

Incorrect. The address isn't written to the adapter, it is a setting
local to i2c-dev and even specific to the file handle you got when
opening a /dev/i2c-* node. Each subsequent read, write or smbus call in
your user-space driver automatically includes the slave address, which
is only valid for the read, write or smbus call in question.

> Can unpredictable results occur in this scenario?

No.

> I think I could protect against it by writing a thread to serialize accesses 
> to the I2C bus, but that only works if my entire application is running 
> inside one process. I'm hoping someone on the list might be able to advise.

The i2c-core module already serializes all accesses to every given i2c
adapter through i2c_transfer() and i2c_smbus_xfer().

-- 
Jean Delvare
http://khali.linux-fr.org/wishlist.html
--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to