I2C Data Transfer
I2C 數(shù)據(jù)傳輸主要有三個 API
int i2c_master_send(const struct i2c_client *client,const char *buf,int count)
client:I2C 設(shè)備對應(yīng)的 i2c_client。
buf:要發(fā)送的數(shù)據(jù)。
count:要發(fā)送的數(shù)據(jù)字節(jié)數(shù),要小于 64KB,以為 i2c_msg 的 len 成員變量是一個 u16(無符號 16 位)類型的數(shù)據(jù)。
返回值:負值,失敗,其他非負值,發(fā)送的字節(jié)數(shù)。
int i2c_master_recv(const struct i2c_client *client,char *buf,int count)
client:I2C 設(shè)備對應(yīng)的 i2c_client。
buf:要接收的數(shù)據(jù)。
count:要接收的數(shù)據(jù)字節(jié)數(shù),要小于 64KB,以為 i2c_msg 的 len 成員變量是一個 u16(無符號 16 位)類型的數(shù)據(jù)。
返回值:負值,失敗,其他非負值,發(fā)送的字節(jié)數(shù)。
int i2c_transfer(struct i2c_adapter *adap,struct i2c_msg *msgs,int num)
adap:所使用的 I2C 適配器,i2c_client 會保存其對應(yīng)的 i2c_adapter。
msgs:I2C 要發(fā)送的一個或多個消息。
num:消息數(shù)量,也就是 msgs 的數(shù)量。
返回值:負值,失敗,其他非負值,發(fā)送的 msgs 數(shù)量。
i2c_master_send 和 i2c_master_recv 都是對 i2c_transfer 的封裝。因此我們重點研究 i2c_transfer。
其中,adap->algo->master_xfer 由芯片原廠提供。在 MTK 平臺,是 mtk_i2c_transfer 函數(shù),不同平臺命名不同。
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;
}
-
數(shù)據(jù)傳輸
+關(guān)注
關(guān)注
9文章
1794瀏覽量
64412 -
API
+關(guān)注
關(guān)注
2文章
1472瀏覽量
61750 -
I2C
+關(guān)注
關(guān)注
28文章
1477瀏覽量
123061
發(fā)布評論請先 登錄
相關(guān)推薦
評論