采用 MODULE_DEVICE_TABLE 注册的i2c设备是怎么设置i2c通道的呢?


现在在看一个wifi模块的驱动,在其i2c接口注册部分迷糊了,下面是其i2c device注册的代码:

   
  static const struct i2c_device_id wifi_rf_i2c_id[]
  
= {{RDA_WIFI_RF_I2C_DEVNAME, 0}, {}};
MODULE_DEVICE_TABLE(i2c, wifi_rf_i2c_id);

下面是其i2c driver部分注册的代码:

   
  static unsigned short wifi_rf_force[]
  
= {0, RDA_WIFI_RF_ADDR, I2C_CLIENT_END, I2C_CLIENT_END};
static const unsigned short *const wifi_rf_forces[] = {wifi_rf_force, NULL};

static struct i2c_client_address_data rda_wifi_rf_addr_data = {
.forces = wifi_rf_forces,
};

static struct i2c_driver rda_wifi_rf_driver = {
.probe = rda_wifi_rf_probe,
.remove = rda_wifi_rf_remove,
.detect = rda_wifi_rf_detect,
.driver.name = RDA_WIFI_RF_I2C_DEVNAME,
.id_table = wifi_rf_i2c_id,
.address_data = &rda_wifi_rf_addr_data,
};

if (i2c_add_driver(&rda_wifi_core_driver))
{
printk("rda_wifi_core_driver failed!\n");
return -ENODEV;
}

然后驱动里面就直接调用i2c_master_send()和i2c_master_recv()开始通信了,却不知道设备是哪个i2c通道上的,看了半天代码也没看明白。

Linux 驱动

提妲·拉赛尔 12 years, 6 months ago

在你的板子的linux内核有如下文件:/arch/arm/mach-xxxx/board_xxxx.c,该文件中,有struct i2c_board_info __initdata i2c_info,该结构体列表中,有你的这个 wifi driver的i2c信息,这两份信息,通过 wifi_rf_i2c_id 里面的 RDA_WIFI_RF_I2C_DEVNAME 名称来匹配,名称一致,则成功添加到对应的i2c总线列表中,在这个注册过程中,会构造一个 i2c_client 对象,其实i2c_master_send需要一个 i2c_client对象,这个i2c_client对象中,就包含着 i2c总线的编号。

jarod answered 12 years, 6 months ago

Your Answer