From 67679e56d0d2f7aaf5dd802e812640755f68b418 Mon Sep 17 00:00:00 2001 From: David Sidrane <david_s5@nscdg.com> Date: Tue, 12 Sep 2017 13:00:03 -1000 Subject: [PATCH] [BACKPORT] stm32:stm32f40xxx I2C ensure proper error handling. Injecting data errors would cause the driver to continually reenter the isr with BERR an RxNE. This fix allows the error to be cleared and propagated to the waiting task. --- .../00034-BACKPORT-stm32f4-I2C-fix.patch | 41 +++++++++++++++++++ nuttx-patches/CMakeLists.txt | 1 + 2 files changed, 42 insertions(+) create mode 100644 nuttx-patches/00034-BACKPORT-stm32f4-I2C-fix.patch 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 0000000000..d91fe719a6 --- /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 e82acfb036..5079eb76ad 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 ) -- GitLab