Skip to content

Commit 7aa2340

Browse files
hakehuangdanieldegrasse
authored andcommitted
drivers: pinctrl: add mcux_rt pinctrl driver
add pinctrl driver for rt1xxx Signed-off-by: Hake Huang <[email protected]>
1 parent 2267254 commit 7aa2340

File tree

4 files changed

+92
-0
lines changed

4 files changed

+92
-0
lines changed

drivers/pinctrl/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ zephyr_library_sources_ifdef(CONFIG_PINCTRL_GD32_AFIO pinctrl_gd32_afio.c)
88
zephyr_library_sources_ifdef(CONFIG_PINCTRL_NRF pinctrl_nrf.c)
99
zephyr_library_sources_ifdef(CONFIG_PINCTRL_RCAR_PFC pfc_rcar.c)
1010
zephyr_library_sources_ifdef(CONFIG_PINCTRL_STM32 pinctrl_stm32.c)
11+
zephyr_library_sources_ifdef(CONFIG_PINCTRL_MCUX_RT pinctrl_mcux_rt.c)

drivers/pinctrl/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,6 @@ source "drivers/pinctrl/Kconfig.gd32"
3333
source "drivers/pinctrl/Kconfig.nrf"
3434
source "drivers/pinctrl/Kconfig.rcar"
3535
source "drivers/pinctrl/Kconfig.stm32"
36+
source "drivers/pinctrl/Kconfig.mcux"
3637

3738
endif # PINCTRL

drivers/pinctrl/Kconfig.mcux

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Copyright (c) 2021 NXP
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
config PINCTRL_MCUX_RT
5+
bool "Pin controller driver for MCUX RT1xxx MCUs"
6+
depends on SOC_SERIES_IMX_RT
7+
default y
8+
help
9+
Enable pin controller driver for NXP RT series MCUs

drivers/pinctrl/pinctrl_mcux_rt.c

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/*
2+
* Copyright (c) 2021 NXP
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <drivers/pinctrl.h>
8+
#include <soc.h>
9+
#include <fsl_iomuxc.h>
10+
#include <fsl_gpio.h>
11+
12+
int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt,
13+
uintptr_t reg)
14+
{
15+
/* configure all pins */
16+
for (uint8_t i = 0U; i < pin_cnt; i++) {
17+
uint32_t mux_register = pins[i].pinmux.mux_register;
18+
uint32_t mux_mode = pins[i].pinmux.mux_mode;
19+
uint32_t input_register = pins[i].pinmux.input_register;
20+
uint32_t input_daisy = pins[i].pinmux.input_daisy;
21+
uint32_t pin_ctrl_flags = pins[i].pin_ctrl_flags;
22+
volatile uint32_t *config_register = (uint32_t *)pins[i].pinmux.config_register;
23+
uint32_t config_val = *config_register;
24+
25+
26+
27+
IOMUXC_SetPinMux(mux_register, mux_mode, input_register,
28+
input_daisy, (uint32_t)config_register,
29+
MCUX_RT_INPUT_ENABLE(pin_ctrl_flags));
30+
31+
if (MCUX_RT_INPUT_SCHMITT_ENABLE(pin_ctrl_flags)) {
32+
config_val |= IOMUXC_SW_PAD_CTL_PAD_HYS(1);
33+
}
34+
if (MCUX_RT_DRIVE_OPEN_DRAIN(pin_ctrl_flags)) {
35+
config_val |= IOMUXC_SW_PAD_CTL_PAD_ODE(1);
36+
}
37+
if (MCUX_RT_BIAS_BUS_HOLD(pin_ctrl_flags)) {
38+
/* Set pull keeper select to keeper, and pull keeper enable to 1 */
39+
config_val |= IOMUXC_SW_PAD_CTL_PAD_PKE(1);
40+
config_val &= ~IOMUXC_SW_PAD_CTL_PAD_PUE_MASK;
41+
}
42+
if (MCUX_RT_BIAS_PULL_DOWN(pin_ctrl_flags)) {
43+
/* Set pull keeper select to pull, and pull keeper enable to 1 */
44+
config_val |= IOMUXC_SW_PAD_CTL_PAD_PKE(1) | IOMUXC_SW_PAD_CTL_PAD_PUE(1);
45+
/* Set PUS to 0b00 to select pulldown resistor */
46+
config_val &= ~IOMUXC_SW_PAD_CTL_PAD_PUS_MASK;
47+
}
48+
if (MCUX_RT_BIAS_PULL_UP(pin_ctrl_flags)) {
49+
/* Set pull keeper select to pull, and pull keeper enable to 1 */
50+
config_val |= IOMUXC_SW_PAD_CTL_PAD_PKE(1) | IOMUXC_SW_PAD_CTL_PAD_PUE(1);
51+
/* Set PUS field to selected value */
52+
config_val = ((config_val & ~IOMUXC_SW_PAD_CTL_PAD_PUS_MASK) |
53+
IOMUXC_SW_PAD_CTL_PAD_PUS(MCUX_RT_BIAS_PULL_UP(pin_ctrl_flags)));
54+
}
55+
/* Set drive strength field */
56+
config_val = ((config_val & ~IOMUXC_SW_PAD_CTL_PAD_DSE_MASK) |
57+
IOMUXC_SW_PAD_CTL_PAD_DSE(MCUX_RT_DRIVE_STRENGTH(pin_ctrl_flags)));
58+
/* Set speed field */
59+
config_val = ((config_val & ~IOMUXC_SW_PAD_CTL_PAD_SPEED_MASK) |
60+
IOMUXC_SW_PAD_CTL_PAD_SPEED(MCUX_RT_SPEED(pin_ctrl_flags)));
61+
/* Set slew rate field */
62+
config_val = ((config_val & ~IOMUXC_SW_PAD_CTL_PAD_SRE_MASK) |
63+
IOMUXC_SW_PAD_CTL_PAD_SRE(MCUX_RT_SLEW_RATE(pin_ctrl_flags)));
64+
/* Write out config value */
65+
*config_register = config_val;
66+
}
67+
68+
return 0;
69+
}
70+
71+
static int mcux_pinctrl_init(const struct device *dev)
72+
{
73+
ARG_UNUSED(dev);
74+
75+
CLOCK_EnableClock(kCLOCK_Iomuxc);
76+
CLOCK_EnableClock(kCLOCK_IomuxcSnvs);
77+
78+
return 0;
79+
}
80+
81+
SYS_INIT(mcux_pinctrl_init, PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT);

0 commit comments

Comments
 (0)