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

本文介绍了两种I2C设备初始化方法:使用i2c_new_device()为已知设备初始化,适用于内部使用I2C总线的大设备;使用i2c_new_probed_device()为不确定存在的设备初始化,适用于可选设备或地址不固定的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(本文的部分内容翻译自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().


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值