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總線硬件上的通信協議決定。