Android/Linux 驱动开发中,I2C在软件代码中的位置以及配置方法
板级文件中的i2c_board_info (即表示一个i2c从设备,其中包含了设备的一些信息和资源,如设备名、设备地址)注册到系统后会在两个地方使用。
第一处是在i2c_add_adapter或者i2c_add_numbered_adapter()中与i2c_adapter共同生成i2c_client;
第二处是在i2c_add_driver()中用来匹配i2c_driver中的idtable。因此在写i2c_driver时应该包括一个i2c_device_id,这个id中的内容必须与i2c_board_info中的内容相同才能匹配。
因此在一个系统中有几个i2c设备就会有多少个i2c_client和i2c_driver(也有一个i2c_driver支持多个i2c设备的情况,只需将要支持的设备名加入idtable中和相应的i2c_board_info)。
————————————————————分割线————————————————————————————————————————————
高通I2C(控制器-adapter)驱动使用的是platform方式注册,然后在probe中使用i2c_add_numbered_adapter (&dev->adap_pri) 注册到I2C_BUS上。
1、在kernelarcharmMach-msm Board-msm7x27a.c中有adapter的板级信息:
static struct msm_i2c_platform_data msm_gsbi0_qup_i2c_pdata = {
.clk_freq = 100000,
.msm_i2c_config_gpio = gsbi_qup_i2c_gpio_config,
};
I2C硬件接口配置static struct msm_gpio qup_i2c_gpios_hw[] = {
{ GPIO_CFG(60, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
"qup_scl" },
{ GPIO_CFG(61, 1, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
"qup_sda" },
{ GPIO_CFG(131, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
"qup_scl" },
{ GPIO_CFG(132, 2, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
"qup_sda" },
};
2、在kerneldriversi2cBussesI2c-msm.c 中有adapter的驱动实现。