esp32: port support for I2C_M_NOSTART and I2C_M_NOSTOP

Signed-off-by: Robert-Ionut Alexa <robertalexa2000@gmail.com>
This commit is contained in:
Robert-Ionut Alexa 2023-04-23 18:58:23 +03:00 committed by Xiang Xiao
parent d48114a4b7
commit f2530c53a5

View File

@ -895,16 +895,39 @@ static int esp32_i2c_transfer(struct i2c_master_s *dev,
esp32_i2c_init_clock(priv, msgs[i].frequency);
/* Reset I2C trace logic */
if ((msgs[i].flags & I2C_M_NOSTART) != 0)
{
esp32_i2c_traceevent(priv, I2CEVENT_SENDBYTE, priv->bytes,
esp32_i2c_get_reg(priv, I2C_SR_OFFSET));
esp32_i2c_senddata(priv);
esp32_i2c_tracereset(priv);
if (priv->bytes == msgs[i].length)
{
if ((msgs[i].flags & I2C_M_NOSTOP) == 0)
{
priv->i2cstate = I2CSTATE_STOP;
}
#ifndef CONFIG_I2C_POLLED
else
{
priv->i2cstate = I2CSTATE_FINISH;
}
#endif
}
}
else
{
/* Reset I2C trace logic */
esp32_i2c_traceevent(priv, I2CEVENT_SENDADDR, msgs[i].addr,
esp32_i2c_get_reg(priv, I2C_SR_OFFSET));
esp32_i2c_tracereset(priv);
/* Send the start cmd */
esp32_i2c_traceevent(priv, I2CEVENT_SENDADDR, msgs[i].addr,
esp32_i2c_get_reg(priv, I2C_SR_OFFSET));
esp32_i2c_sendstart(priv);
/* Send the start cmd */
esp32_i2c_sendstart(priv);
}
#ifndef CONFIG_I2C_POLLED
if (esp32_i2c_sem_waitdone(priv) < 0)
@ -1391,7 +1414,16 @@ static inline void esp32_i2c_process(struct esp32_i2c_priv_s *priv,
if (priv->bytes == msg->length)
{
priv->i2cstate = I2CSTATE_STOP;
if ((msg->flags & I2C_M_NOSTOP) == 0)
{
priv->i2cstate = I2CSTATE_STOP;
}
#ifndef CONFIG_I2C_POLLED
else
{
priv->i2cstate = I2CSTATE_FINISH;
}
#endif
}
}
}