(本文的部分内容翻译自Documentation/i2c/instantiating-devices)
方式3:侦测一个指定的I2C设备
有时候,你对一个I2C设备没有足够的相关信息,甚至不能调用i2c_new_probed_device()。典型的例子是电脑主板上的硬件监控芯片。有几十个型号,可以存放在25个不同的地址。鉴于有大量的主板,它几乎是不可能建立一个详尽的监测芯片硬件列表。幸运的是,这些芯片的都有制造商和设备ID寄存器,所以他们可以被识别探测。
在这种情况下,I2C设备既不声明,也不明确初始化。相反,一旦驱动程序被加载,i2c-core将探测设备,如果被发现,任何一个I2C器件将自动初始化。为了防止这种机制的任何不当行为,适用下列限制:
* I2C设备驱动程序必须实现detect()方法, 通过读取专用寄存器表示一个可支持的设备;
* 只有在总线,很可能存在一个支持的设备并同意探测才回去侦测探测。例如,这样就避免了监控电视适配器上的硬件探测芯片(好绕口啊。。。)。
例如:
请参阅在drivers/hwmon/lm90.c的lm90_driver和lm90_detect()
当侦测到的设备被删除时或是所在总线注销时,成功侦测并且初始化的I2C设备最后要被首先自动销毁。
方式3 与之前所熟悉的2.4内核和早期的2.6内核的i2c子系统所做的工作本质上及其相似
两个显着的区别是:
* 现在,探测是I2C设备初始化的唯一方法,而这是当时唯一的办法。在可能的情况下,方法1和2应该是首选。 在没有别的办法时才可应用于方法3,因为它可以有 不良的副作用。
* 当所有I2C总线被探测到默认的返回时,I2C总线现在必须明确地说,它可以探测I2C驱动程序类。默认是一个空的类,这意味着没有探测发生。位域的目的是为了限制产生上述不良作用。
最后,方法3应尽可能避免。明确设备实例(方法1和2)是首选,因为它是更安全更快。(有一点不明白,手册推荐的i2c初始化的方法是方式1和方式2,但网上的文章都说更习惯使用方式3,这还需要更多实践检验)。