I2C Data Transfer
I2C 數據傳輸主要有三個 API
int i2c_master_send(const struct i2c_client *client,const char *buf,int count)
client:I2C 設備對應的 i2c_client。
buf:要發送的數據。
count:要發送的數據字節數,要小于 64KB,以為 i2c_msg 的 len 成員變量是一個 u16(無符號 16 位)類型的數據。
返回值:負值,失敗,其他非負值,發送的字節數。
int i2c_master_recv(const struct i2c_client *client,char *buf,int count)
client:I2C 設備對應的 i2c_client。
buf:要接收的數據。
count:要接收的數據字節數,要小于 64KB,以為 i2c_msg 的 len 成員變量是一個 u16(無符號 16 位)類型的數據。
返回值:負值,失敗,其他非負值,發送的字節數。
int i2c_transfer(struct i2c_adapter *adap,struct i2c_msg *msgs,int num)
adap:所使用的 I2C 適配器,i2c_client 會保存其對應的 i2c_adapter。
msgs:I2C 要發送的一個或多個消息。
num:消息數量,也就是 msgs 的數量。
返回值:負值,失敗,其他非負值,發送的 msgs 數量。
i2c_master_send 和 i2c_master_recv 都是對 i2c_transfer 的封裝。因此我們重點研究 i2c_transfer。
其中,adap->algo->master_xfer 由芯片原廠提供。在 MTK 平臺,是 mtk_i2c_transfer 函數,不同平臺命名不同。
static int mtk_i2c_transfer(struct i2c_adapter *adap,struct i2c_msg msgs[], int num)
{
int ret;
int left_num = num;
struct mtk_i2c *i2c = i2c_get_adapdata(adap);
//打開時鐘
ret = mtk_i2c_clock_enable(i2c);
if (ret)
return ret;
//初始化硬件
mtk_i2c_init_hw(i2c);
i2c- >auto_restart = i2c- >dev_comp- >auto_restart;
if (i2c- >auto_restart && num == 2) {
if (!(msgs[0].flags & I2C_M_RD) && (msgs[1].flags & I2C_M_RD) &&
msgs[0].addr == msgs[1].addr) {
i2c- >auto_restart = 0;
}
}
if (i2c- >auto_restart && num >= 2 && i2c- >speed_hz > MAX_FS_MODE_SPEED)
i2c- >ignore_restart_irq = true;
else
i2c- >ignore_restart_irq = false;
while (left_num--) {
if (!msgs- >buf) {
dev_dbg(i2c- >dev, "data buffer is NULL.n");
ret = -EINVAL;
goto err_exit;
}
if (msgs- >flags & I2C_M_RD)
i2c- >op = I2C_MASTER_RD;
else
i2c- >op = I2C_MASTER_WR;
if (!i2c- >auto_restart) {
if (num > 1) {
/* combined two messages into one transaction */
i2c- >op = I2C_MASTER_WRRD;
left_num--;
}
}
/* always use DMA mode. */
ret = mtk_i2c_do_transfer(i2c, msgs, num, left_num);
if (ret < 0)
goto err_exit;
msgs++;
}
/* the return value is number of executed messages */
ret = num;
err_exit:
mtk_i2c_clock_disable(i2c);
return ret;
}
-
數據傳輸
+關注
關注
9文章
1838瀏覽量
64475 -
API
+關注
關注
2文章
1485瀏覽量
61814 -
I2C
+關注
關注
28文章
1481瀏覽量
123283
發布評論請先 登錄
相關推薦
評論