You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2022/09/20 20:54:03 UTC
[incubator-nuttx] branch master updated: imxrt: disable PWM synchronization when XBAR connection fails
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 11cf3de776 imxrt: disable PWM synchronization when XBAR connection fails
11cf3de776 is described below
commit 11cf3de776b76a40bb25b37642581fde57b265e7
Author: Michal Lenc <mi...@seznam.cz>
AuthorDate: Tue Sep 20 19:22:23 2022 +0200
imxrt: disable PWM synchronization when XBAR connection fails
This commit supplements commit 7d877fbb. External sync mode is now
disabled if XBAR connection fails and config options are used directly
in sync_src variable and passed to XBAR macro only when needed. The first
option could caused an undefined behaviour when sync_src was equal to -1
(external sync not used)
Signed-off-by: Michal Lenc <mi...@seznam.cz>
---
arch/arm/src/imxrt/imxrt_flexpwm.c | 63 ++++++++++++++++++--------------------
1 file changed, 29 insertions(+), 34 deletions(-)
diff --git a/arch/arm/src/imxrt/imxrt_flexpwm.c b/arch/arm/src/imxrt/imxrt_flexpwm.c
index b06cd5751a..1abbf7448f 100644
--- a/arch/arm/src/imxrt/imxrt_flexpwm.c
+++ b/arch/arm/src/imxrt/imxrt_flexpwm.c
@@ -158,8 +158,7 @@ static struct imxrt_flexpwm_module_s g_pwm1_modules[] =
#else
.complementary = false,
#endif
- .sync_src = IMXRT_XBARA1(XBAR_INPUT,
- CONFIG_IMXRT_FLEXPWM1_MOD1_SYNC_SRC),
+ .sync_src = CONFIG_IMXRT_FLEXPWM1_MOD1_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM1_EXT_SYNC0_SEL_OFFSET,
},
#endif
@@ -187,8 +186,7 @@ static struct imxrt_flexpwm_module_s g_pwm1_modules[] =
#else
.complementary = false,
#endif
- .sync_src = IMXRT_XBARA1(XBAR_INPUT,
- CONFIG_IMXRT_FLEXPWM1_MOD2_SYNC_SRC),
+ .sync_src = CONFIG_IMXRT_FLEXPWM1_MOD2_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM1_EXT_SYNC1_SEL_OFFSET,
},
#endif
@@ -216,8 +214,7 @@ static struct imxrt_flexpwm_module_s g_pwm1_modules[] =
#else
.complementary = false,
#endif
- .sync_src = IMXRT_XBARA1(XBAR_INPUT,
- CONFIG_IMXRT_FLEXPWM1_MOD3_SYNC_SRC),
+ .sync_src = CONFIG_IMXRT_FLEXPWM1_MOD3_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM1_EXT_SYNC2_SEL_OFFSET,
},
#endif
@@ -245,8 +242,7 @@ static struct imxrt_flexpwm_module_s g_pwm1_modules[] =
#else
.complementary = false,
#endif
- .sync_src = IMXRT_XBARA1(XBAR_INPUT,
- CONFIG_IMXRT_FLEXPWM1_MOD4_SYNC_SRC),
+ .sync_src = CONFIG_IMXRT_FLEXPWM1_MOD4_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM1_EXT_SYNC3_SEL_OFFSET,
},
#endif
@@ -292,8 +288,7 @@ static struct imxrt_flexpwm_module_s g_pwm2_modules[] =
#else
.complementary = false,
#endif
- .sync_src = IMXRT_XBARA1(XBAR_INPUT,
- CONFIG_IMXRT_FLEXPWM2_MOD1_SYNC_SRC),
+ .sync_src = CONFIG_IMXRT_FLEXPWM2_MOD1_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM2_EXT_SYNC0_SEL_OFFSET,
},
#endif
@@ -321,8 +316,7 @@ static struct imxrt_flexpwm_module_s g_pwm2_modules[] =
#else
.complementary = false,
#endif
- .sync_src = IMXRT_XBARA1(XBAR_INPUT,
- CONFIG_IMXRT_FLEXPWM2_MOD2_SYNC_SRC),
+ .sync_src = CONFIG_IMXRT_FLEXPWM2_MOD2_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM2_EXT_SYNC1_SEL_OFFSET,
},
#endif
@@ -350,8 +344,7 @@ static struct imxrt_flexpwm_module_s g_pwm2_modules[] =
#else
.complementary = false,
#endif
- .sync_src = IMXRT_XBARA1(XBAR_INPUT,
- CONFIG_IMXRT_FLEXPWM2_MOD3_SYNC_SRC),
+ .sync_src = CONFIG_IMXRT_FLEXPWM2_MOD3_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM2_EXT_SYNC2_SEL_OFFSET,
},
#endif
@@ -379,8 +372,7 @@ static struct imxrt_flexpwm_module_s g_pwm2_modules[] =
#else
.complementary = false,
#endif
- .sync_src = IMXRT_XBARA1(XBAR_INPUT,
- CONFIG_IMXRT_FLEXPWM2_MOD4_SYNC_SRC),
+ .sync_src = CONFIG_IMXRT_FLEXPWM2_MOD4_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM2_EXT_SYNC3_SEL_OFFSET,
}
#endif
@@ -426,8 +418,7 @@ static struct imxrt_flexpwm_module_s g_pwm3_modules[] =
#else
.complementary = false,
#endif
- .sync_src = IMXRT_XBARA1(XBAR_INPUT,
- CONFIG_IMXRT_FLEXPWM3_MOD1_SYNC_SRC),
+ .sync_src = CONFIG_IMXRT_FLEXPWM3_MOD1_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM3_EXT_SYNC0_SEL_OFFSET,
},
#endif
@@ -455,8 +446,7 @@ static struct imxrt_flexpwm_module_s g_pwm3_modules[] =
#else
.complementary = false,
#endif
- .sync_src = IMXRT_XBARA1(XBAR_INPUT,
- CONFIG_IMXRT_FLEXPWM3_MOD2_SYNC_SRC),
+ .sync_src = CONFIG_IMXRT_FLEXPWM3_MOD2_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM3_EXT_SYNC1_SEL_OFFSET,
},
#endif
@@ -484,8 +474,7 @@ static struct imxrt_flexpwm_module_s g_pwm3_modules[] =
#else
.complementary = false,
#endif
- .sync_src = IMXRT_XBARA1(XBAR_INPUT,
- CONFIG_IMXRT_FLEXPWM3_MOD3_SYNC_SRC),
+ .sync_src = CONFIG_IMXRT_FLEXPWM3_MOD3_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM3_EXT_SYNC2_SEL_OFFSET,
},
#endif
@@ -513,8 +502,7 @@ static struct imxrt_flexpwm_module_s g_pwm3_modules[] =
#else
.complementary = false,
#endif
- .sync_src = IMXRT_XBARA1(XBAR_INPUT,
- CONFIG_IMXRT_FLEXPWM3_MOD4_SYNC_SRC),
+ .sync_src = CONFIG_IMXRT_FLEXPWM3_MOD4_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM3_EXT_SYNC3_SEL_OFFSET,
},
#endif
@@ -560,8 +548,7 @@ static struct imxrt_flexpwm_module_s g_pwm4_modules[] =
#else
.complementary = false,
#endif
- .sync_src = IMXRT_XBARA1(XBAR_INPUT,
- CONFIG_IMXRT_FLEXPWM4_MOD1_SYNC_SRC),
+ .sync_src = CONFIG_IMXRT_FLEXPWM4_MOD1_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM4_EXT_SYNC0_SEL_OFFSET,
},
#endif
@@ -589,8 +576,7 @@ static struct imxrt_flexpwm_module_s g_pwm4_modules[] =
#else
.complementary = false,
#endif
- .sync_src = IMXRT_XBARA1(XBAR_INPUT,
- CONFIG_IMXRT_FLEXPWM4_MOD2_SYNC_SRC),
+ .sync_src = CONFIG_IMXRT_FLEXPWM4_MOD2_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM4_EXT_SYNC1_SEL_OFFSET,
},
#endif
@@ -618,8 +604,7 @@ static struct imxrt_flexpwm_module_s g_pwm4_modules[] =
#else
.complementary = false,
#endif
- .sync_src = IMXRT_XBARA1(XBAR_INPUT,
- CONFIG_IMXRT_FLEXPWM4_MOD3_SYNC_SRC),
+ .sync_src = CONFIG_IMXRT_FLEXPWM4_MOD3_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM4_EXT_SYNC3_SEL_OFFSET,
},
#endif
@@ -647,8 +632,7 @@ static struct imxrt_flexpwm_module_s g_pwm4_modules[] =
#else
.complementary = false,
#endif
- .sync_src = IMXRT_XBARA1(XBAR_INPUT,
- CONFIG_IMXRT_FLEXPWM4_MOD4_SYNC_SRC),
+ .sync_src = CONFIG_IMXRT_FLEXPWM4_MOD4_SYNC_SRC,
.ext_sync = IMXRT_XBARA1_OUT_FLEXPWM4_EXT_SYNC4_SEL_OFFSET,
},
#endif
@@ -955,16 +939,27 @@ static int pwm_setup(struct pwm_lowerhalf_s *dev)
/* Connect corresponding XBARs */
ret = imxrt_xbar_connect(priv->modules[i].ext_sync,
- priv->modules[i].sync_src);
+ IMXRT_XBARA1(XBAR_INPUT,
+ priv->modules[i].sync_src));
if (ret < 0)
{
+ /* Disable external triggering if XBAR connection failed */
+
+ regval = getreg16(priv->base + IMXRT_FLEXPWM_SM0CTRL2_OFFSET
+ + MODULE_OFFSET * shift);
+ regval &= ~(SMCTRL2_INIT_SEL_EXT_SYNC |
+ SMCTRL2_FORCE_SEL_EXT_SYNC |
+ SMCTRL2_FRCEN);
+ putreg16(regval, priv->base + IMXRT_FLEXPWM_SM0CTRL2_OFFSET
+ + MODULE_OFFSET * shift);
+
pwmerr("ERROR: imxrt_xbar_connect failed: %d\n", ret);
}
}
if (priv->modules[i].trig_en)
{
- /* Use duty cycle register for trigger generation */
+ /* Use period register for trigger generation */
regval = getreg16(priv->base + IMXRT_FLEXPWM_SM0TCTRL_OFFSET
+ MODULE_OFFSET * shift);