i2c_new_dummy有什么作用?

时间:2013-03-30 12:58:18

标签: c linux-kernel linux-device-driver

我正在开发一个mfd驱动程序。有一个i2c总线,由四个i2c客户端设备共享(在单个IC上)。将适配器连接到每个客户端时使用i2c_new_dummy API。

为什么有必要为不同的客户端使用不同的适配器逻辑? mfd设备实际上如何工作?

1 个答案:

答案 0 :(得分:7)

众所周知,I2C总线将有来自规范定义的127个客户端;一个7bit 地址1bit用于读/写

第一个字节是I2C设备地址,与此地址匹配的设备将下拉ACK位。接下来是数据,大​​多数时候这将是寄存器的地址。

因此,如果您有四个I2C个客户端,您将获得四个设备和四个客户端句柄,即使它们包含在 SOC 中。

但有时你不需要那么多。

另一种情况是当前 SOC ,一个芯片(如tps65910)将具有很多功能,包括开启电压, CODEC ,等等。每个驱动程序都将使用I2C来设置寄存器。您不能为一个驱动程序请求一个句柄,因此这就是它调用i2c_new_dummy

的原因

来自内核的评论 i2c-core.c

/**
 * i2c_new_dummy - return a new i2c device bound to a dummy driver
 * @adapter: the adapter managing the device
 * @address: seven bit address to be used
 * Context: can sleep
 *
 * This returns an I2C client bound to the "dummy" driver, intended for use
 * with devices that consume multiple addresses.  Examples of such chips
 * include various EEPROMS (like 24c04 and 24c08 models).
 *
 * These dummy devices have two main uses.  First, most I2C and SMBus calls
 * except i2c_transfer() need a client handle; the dummy will be that handle.
 * And second, this prevents the specified address from being bound to a
 * different driver.
 *
 * This returns the new i2c client, which should be saved for later use with
 * i2c_unregister_device(); or NULL to indicate an error.
 */