您的位置:首页 > 其它

I2C设备初始化方法2--初始化确定设备

2012-04-11 18:47 225 查看
(本文的部分内容翻译自Documentation/i2c/instantiating-devices)
方法2:初始化确定设备
这种方式使用于当一个大的设备使用I2C bus作为内部通讯使用。TV adapter是一种典型的情况,其中包括了调谐器、视频编码、音频编码等,一般通过一个类似I2C总线连接到主芯片上。你不知道I2C设备会预先连接的数量,所以方式1不能使用在这种情况下。所以另外的方法是初始化确定的设备。这种操作只要填充structi2c_board_info 然后调用i2c_new_device()即可。

例程取自于 sfe4001 网络驱动:

staticstruct i2c_board_info sfe4001_hwmon_info = {
I2C_BOARD_INFO("max6647", 0x4e),
};

intsfe4001_init(struct efx_nic *efx)
{
(...)
efx->board_info.hwmon_client =
i2c_new_device(&efx->i2c_adap,&sfe4001_hwmon_info);

(...)
}

上面的代码在未知的网络适配器上使用I2C总线初始化了一个I2C设备。

另外一种情况,当你不知道一个I2C设备是否存在(例如有一些可选项在低端的板子上是不存在的),或是在一个电路中与另外一个电路中的地址不同(涉及时未声明但在加工时改变)。在这种情况下可以使用i2c_new_probed_device() 代替 i2c_new_device()

例程取自于 pnx4008 OHCI 驱动:

staticconst unsigned short normal_i2c[] = { 0x2c, 0x2d, I2C_CLIENT_END };

staticint __devinit usb_hcd_pnx4008_probe(struct platform_device *pdev)
{
(...)
struct i2c_adapter *i2c_adap;
struct i2c_board_info i2c_info;

(...)
i2c_adap = i2c_get_adapter(2);
memset(&i2c_info, 0, sizeof(structi2c_board_info));
strlcpy(i2c_info.name,"isp1301_pnx", I2C_NAME_SIZE);
isp1301_i2c_client =i2c_new_probed_device(i2c_adap, &i2c_info,
normal_i2c, NULL);
i2c_put_adapter(i2c_adap);
(...)
}

上述代码在OHCI adapter未知情况下在I2C bus初始化了一个I2C设备。程序会先尝试0x2c地址,如果没找到,会再尝试地址0x2d,如果仍未找到,就放弃创建。

创建I2C设备的驱动程序还要负责销毁和清楚设备。这些工作通过调用i2c_unregister_device(),这个工作是针对得是之前的i2c_new_device() 或i2c_new_probed_device().
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: