Linux I2C bus driver
在模块加载函数中需要完成:
1) adapter硬件的初始化
2) i2c_add_adapter(&adapter);
在模块卸载函数中需要完成:
1) 对应加载函数时硬件资源的释放
2) i2c_del_adapter(&adapter);
代码如下:
static int _ _init i2c_adapter_xxx_init(void)
{
xxx_adpater_hw_init();
i2c_add_adapter(&xxx_adapter);
}
static void _ _exit i2c_adapter_xxx_exit(void)
{
xxx_adpater_hw_free();
i2c_del_adapter(&xxx_adapter);
}
其中硬件初始化与硬件资源的释放,与具体的CPU和I2C设备硬件相关。
I2C bus通信方法,如下为master_xfer 函数模板:
static int i2c_adapter_xxx_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,int num)
{
...
for (i = 0; i < num; i++) {
i2c_adapter_xxx_start(); /*产生开始位*/
if (msgs[i]->flags &I2C_M_RD) {/*是读消息*/
i2c_adapter_xxx_setaddr((msg->addr << 1) | 1); /*发送从设备读地址*/
i2c_adapter_xxx_wait_ack(); /*获得从设备的 ack*/
i2c_adapter_xxx_readbytes(msgs[i]->buf, msgs[i]->len); /*读取msgs[i] ->len长的数据到 msgs[i]->buf*/
} else {/*是写消息*/
i2c_adapter_xxx_setaddr(msg->addr << 1); /*发送从设备写地址*/
i2c_adapter_xxx_wait_ack(); /*获得从设备的 ack*/
i2c_adapter_xxx_writebytes(msgs[i]->buf, msgs[i]->len); /*读取 msgs[i] ->len长的数据到 msgs[i]->buf*/
}
}
i2c_adapter_xxx_stop(); /*产生停止位*/
}
上面master_xfer()函数模板给出的消息处理是顺序进行的,而有的驱动以中断方式来完成这个流程,但流程的本质是不变的,由I2C总线硬件上的通信协议决定。