diff --git a/nuttx-patches/00034-BACKPORT-stm32f4-I2C-fix.patch b/nuttx-patches/00034-BACKPORT-stm32f4-I2C-fix.patch new file mode 100644 index 0000000000000000000000000000000000000000..d91fe719a6b1ce788337bbce8c48c3e4b9c82b7a --- /dev/null +++ b/nuttx-patches/00034-BACKPORT-stm32f4-I2C-fix.patch @@ -0,0 +1,41 @@ +diff --git NuttX/nuttx/arch/arm/src/stm32/stm32f40xxx_i2c.c NuttX/nuttx/arch/arm/src/stm32/stm32f40xxx_i2c.c +index 2bb715c..481b851 100644 +--- NuttX/nuttx/arch/arm/src/stm32/stm32f40xxx_i2c.c ++++ NuttX/nuttx/arch/arm/src/stm32/stm32f40xxx_i2c.c +@@ -1828,6 +1828,20 @@ static int stm32_i2c_isr(struct stm32_i2c_priv_s *priv) + * the ISR cycle to handle the sending/receiving of the messages. + */ + ++ /* First check for errors */ ++ ++ if ((status & I2C_SR1_ERRORMASK) != 0) ++ { ++ stm32_i2c_traceevent(priv, I2CEVENT_ERROR, status & I2C_SR1_ERRORMASK); ++ ++ /* Clear interrupt flags */ ++ ++ stm32_i2c_putreg(priv, STM32_I2C_SR1_OFFSET, 0); ++ ++ priv->dcnt = -1; ++ priv->msgc = 0; ++ } ++ + if (priv->dcnt == -1 && priv->msgc == 0) + { + i2cinfo("Shutting down I2C ISR\n"); +@@ -2027,7 +2041,6 @@ static int stm32_i2c_transfer(FAR struct i2c_master_s *dev, FAR struct i2c_msg_s + int count) + { + FAR struct stm32_i2c_priv_s *priv = (struct stm32_i2c_priv_s *)dev; +- stm32_i2c_sem_wait(priv); /* Ensure that address or flags don't change meanwhile */ + uint32_t status = 0; + #ifdef I2C1_FSMC_CONFLICT + uint32_t ahbenr; +@@ -2035,6 +2048,7 @@ static int stm32_i2c_transfer(FAR struct i2c_master_s *dev, FAR struct i2c_msg_s + int ret = 0; + + ASSERT(count); ++ stm32_i2c_sem_wait(priv); /* Ensure that address or flags don't change meanwhile */ + + #ifdef I2C1_FSMC_CONFLICT + /* Disable FSMC that shares a pin with I2C1 (LBAR) */ diff --git a/nuttx-patches/CMakeLists.txt b/nuttx-patches/CMakeLists.txt index e82acfb0367295e2bc5e5383ed034f3dfc7238f6..5079eb76ad51c03cf01207ad69e611afc13307c2 100644 --- a/nuttx-patches/CMakeLists.txt +++ b/nuttx-patches/CMakeLists.txt @@ -62,6 +62,7 @@ set(nuttx_patches 00031-BACKPORT-fix-arm-none-eabi-gcc-7-warnings-apps.patch 00032-BACKPORT-stm32f7-pinmap-FMC-I2C4-fixes.patch 00033-BACKPORT-stm32f7-sdmmc-dcache-fix.patch + 00034-BACKPORT-stm32f4-I2C-fix.patch 90000-PENDING-wip-inflight-to-upstream.patch )