Linux I2C bus driver

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章