Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions boards/arm/mimxrt1060_evk/mimxrt1060_evk-pinctrl.dtsi
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/*
* Copyright (c) 2022, NXP
* SPDX-License-Identifier: Apache-2.0
*
* Generated by rt_cfg_utils.py on 2022-01-19
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you need this line? If it's going into the boards directory like this, I guess it will be maintained by hand from now on; it's not clear why the comment that it was generated is relevant.

*/

#include <nxp/nxp_imx/rt/mimxrt1062-pinctrl.dtsi>

&IOMUXC_GPIO_AD_B0_12_LPUART1_TX {
bias-bus-hold;
input-enable;
};

&IOMUXC_GPIO_AD_B0_13_LPUART1_RX {
bias-bus-hold;
};

&IOMUXC_GPIO_AD_B1_09_SAI1_MCLK {
bias-bus-hold;
input-enable;
};

&IOMUXC_GPIO_AD_B1_12_SAI1_RX_DATA00 {
bias-bus-hold;
input-enable;
};

&IOMUXC_GPIO_AD_B1_13_SAI1_TX_DATA00 {
bias-bus-hold;
input-enable;
};

&IOMUXC_GPIO_AD_B1_14_SAI1_TX_BCLK {
bias-bus-hold;
input-enable;
};

&IOMUXC_GPIO_AD_B1_15_SAI1_TX_SYNC {
bias-bus-hold;
input-enable;
};

17 changes: 17 additions & 0 deletions boards/arm/mimxrt1060_evk/mimxrt1060_evk.dts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
/dts-v1/;

#include <nxp/nxp_rt1060.dtsi>
#include "mimxrt1060_evk-pinctrl.dtsi"

/ {
model = "NXP MIMXRT1060-EVK board";
Expand Down Expand Up @@ -164,6 +165,8 @@ arduino_serial: &lpuart3 {};
&lpuart1 {
status = "okay";
current-speed = <115200>;
pinctrl-0 = <&IOMUXC_GPIO_AD_B0_12_LPUART1_TX &IOMUXC_GPIO_AD_B0_13_LPUART1_RX>;
pinctrl-names = "default";
};

&enet {
Expand Down Expand Up @@ -218,6 +221,12 @@ zephyr_udc0: &usb1 {

&sai1 {
status = "okay";
pinctrl-0 = <&IOMUXC_GPIO_B0_13_SAI1_MCLK
&IOMUXC_GPIO_AD_B1_12_SAI1_RX_DATA00
&IOMUXC_GPIO_AD_B1_13_SAI1_TX_DATA00
&IOMUXC_GPIO_AD_B1_14_SAI1_TX_BCLK
&IOMUXC_GPIO_AD_B1_15_SAI1_TX_SYNC>;
pinctrl-names = "default";
};

/* Enable GPT for use as a hardware timer. This disables Cortex Systick.
Expand All @@ -226,3 +235,11 @@ zephyr_udc0: &usb1 {
&gpt_hw_timer {
status = "okay";
};

&iomuxcgpr {
status = "okay";
};
Comment on lines +239 to +241
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

note: if you make CONFIG_PINCTRL=y default, I think DT node should also be defaulted to okay


&pinctrl {
status = "okay";
};
30 changes: 0 additions & 30 deletions boards/arm/mimxrt1060_evk/pinmux.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,22 +114,6 @@ static int mimxrt1060_evk_init(const struct device *dev)
IOMUXC_SetPinMux(IOMUXC_SNVS_WAKEUP_GPIO5_IO00, 0);
#endif

#if DT_NODE_HAS_STATUS(DT_NODELABEL(lpuart1), okay) && CONFIG_SERIAL
/* LPUART1 TX/RX */
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_12_LPUART1_TX, 0);
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_13_LPUART1_RX, 0);

IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_12_LPUART1_TX,
IOMUXC_SW_PAD_CTL_PAD_PKE_MASK |
IOMUXC_SW_PAD_CTL_PAD_SPEED(2) |
IOMUXC_SW_PAD_CTL_PAD_DSE(6));

IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_13_LPUART1_RX,
IOMUXC_SW_PAD_CTL_PAD_PKE_MASK |
IOMUXC_SW_PAD_CTL_PAD_SPEED(2) |
IOMUXC_SW_PAD_CTL_PAD_DSE(6));
#endif

#if DT_NODE_HAS_STATUS(DT_NODELABEL(lpuart3), okay) && CONFIG_SERIAL
/* LPUART3 TX/RX */
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_06_LPUART3_TX, 0);
Expand Down Expand Up @@ -388,20 +372,6 @@ static int mimxrt1060_evk_init(const struct device *dev)
IOMUXC_SW_PAD_CTL_PAD_DSE(6));
#endif

#if DT_NODE_HAS_STATUS(DT_NODELABEL(sai1), okay) && CONFIG_I2S
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_09_SAI1_MCLK, 1U);
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_12_SAI1_RX_DATA00, 1U);
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_13_SAI1_TX_DATA00, 1U);
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_14_SAI1_TX_BCLK, 1U);
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_15_SAI1_TX_SYNC, 1U);

IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B1_09_SAI1_MCLK, 0x10B0u);
IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B1_12_SAI1_RX_DATA00, 0x10B0u);
IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B1_13_SAI1_TX_DATA00, 0x10B0u);
IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B1_14_SAI1_TX_BCLK, 0x10B0u);
IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B1_15_SAI1_TX_SYNC, 0x10B0u);
#endif

return 0;
}

Expand Down
20 changes: 18 additions & 2 deletions drivers/i2s/i2s_mcux_sai.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@
#include <device.h>
#include <init.h>
#include <drivers/dma.h>

#include <drivers/i2s.h>
#include <drivers/pinctrl.h>
#include <drivers/clock_control.h>
#include <dt-bindings/clock/imx_ccm.h>
#include <soc.h>
Expand Down Expand Up @@ -78,6 +78,7 @@ struct i2s_mcux_config {
uint32_t tx_channel;
clock_control_subsys_t clk_sub_sys;
const struct device *ccm_dev;
const struct pinctrl_dev_config *pinctrl;
void (*irq_connect)(const struct device *dev);
bool rx_sync_mode;
bool tx_sync_mode;
Expand Down Expand Up @@ -328,15 +329,24 @@ static void enable_mclk_direction(const struct device *dev, bool dir)
const struct i2s_mcux_config *dev_cfg = dev->config;
uint32_t offset = dev_cfg->mclk_pin_offset;
uint32_t mask = dev_cfg->mclk_pin_mask;
uint32_t value = 0;
uint32_t *gpr = (uint32_t *)DT_REG_ADDR(DT_NODELABEL(iomuxcgpr)) + offset;

if (dir) {
*gpr |= mask;
} else {
*gpr &= ~mask;
}
}

static void mcux_rt_sai_pin_init(void)
{
int err;

err = pinctrl_apply_state(dev_cfg->pinctrl, PINCTRL_STATE_DEFAULT);
if (err < 0) {
LOG_ERR("mclk pinctrl setup failed (%d)", err);
return err;
}
}

static void get_mclk_rate(const struct device *dev, uint32_t *mclk)
Expand Down Expand Up @@ -989,6 +999,9 @@ static int i2s_mcux_initialize(const struct device *dev)
/* register ISR */
dev_cfg->irq_connect(dev);

/* pinctrl */
mcux_rt_sai_pin_init();

/*clock configuration*/
audio_clock_settings(dev);

Expand Down Expand Up @@ -1040,6 +1053,8 @@ static const struct i2s_driver_api i2s_mcux_driver_api = {
#define I2S_MCUX_INIT(i2s_id) \
static void i2s_irq_connect_##i2s_id(const struct device *dev); \
\
PINCTRL_DT_INST_DEFINE(i2s_id); \
\
static const struct i2s_mcux_config i2s_##i2s_id##_config = { \
.base = (I2S_Type *)DT_INST_REG_ADDR(i2s_id), \
.clk_src = \
Expand Down Expand Up @@ -1071,6 +1086,7 @@ static const struct i2s_driver_api i2s_mcux_driver_api = {
.clk_sub_sys = (clock_control_subsys_t) \
DT_INST_CLOCKS_CELL_BY_IDX(i2s_id, 0, name), \
.ccm_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(i2s_id)), \
.pinctrl = PINCTRL_DT_INST_DEV_CONFIG_GET(i2s_id), \
.irq_connect = i2s_irq_connect_##i2s_id, \
.tx_sync_mode = \
DT_INST_PROP(i2s_id, nxp_tx_sync_mode), \
Expand Down
1 change: 1 addition & 0 deletions drivers/pinctrl/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ zephyr_library_sources_ifdef(CONFIG_PINCTRL_GD32_AFIO pinctrl_gd32_afio.c)
zephyr_library_sources_ifdef(CONFIG_PINCTRL_NRF pinctrl_nrf.c)
zephyr_library_sources_ifdef(CONFIG_PINCTRL_RCAR_PFC pfc_rcar.c)
zephyr_library_sources_ifdef(CONFIG_PINCTRL_STM32 pinctrl_stm32.c)
zephyr_library_sources_ifdef(CONFIG_PINCTRL_MCUX_RT pinctrl_mcux_rt.c)
1 change: 1 addition & 0 deletions drivers/pinctrl/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -33,5 +33,6 @@ source "drivers/pinctrl/Kconfig.gd32"
source "drivers/pinctrl/Kconfig.nrf"
source "drivers/pinctrl/Kconfig.rcar"
source "drivers/pinctrl/Kconfig.stm32"
source "drivers/pinctrl/Kconfig.mcux"

endif # PINCTRL
9 changes: 9 additions & 0 deletions drivers/pinctrl/Kconfig.mcux
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Copyright (c) 2021 NXP
# SPDX-License-Identifier: Apache-2.0

config PINCTRL_MCUX_RT
bool "Pin controller driver for MCUX RT1xxx MCUs"
depends on SOC_SERIES_IMX_RT
default y
help
Enable pin controller driver for NXP RT series MCUs
81 changes: 81 additions & 0 deletions drivers/pinctrl/pinctrl_mcux_rt.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
/*
* Copyright (c) 2021 NXP
*
* SPDX-License-Identifier: Apache-2.0
*/

#include <drivers/pinctrl.h>
#include <soc.h>
#include <fsl_iomuxc.h>
#include <fsl_gpio.h>

int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt,
uintptr_t reg)
{
/* configure all pins */
for (uint8_t i = 0U; i < pin_cnt; i++) {
uint32_t mux_register = pins[i].pinmux.mux_register;
uint32_t mux_mode = pins[i].pinmux.mux_mode;
uint32_t input_register = pins[i].pinmux.input_register;
uint32_t input_daisy = pins[i].pinmux.input_daisy;
uint32_t pin_ctrl_flags = pins[i].pin_ctrl_flags;
volatile uint32_t *config_register = (uint32_t *)pins[i].pinmux.config_register;
uint32_t config_val = *config_register;



IOMUXC_SetPinMux(mux_register, mux_mode, input_register,
input_daisy, (uint32_t)config_register,
MCUX_RT_INPUT_ENABLE(pin_ctrl_flags));

if (MCUX_RT_INPUT_SCHMITT_ENABLE(pin_ctrl_flags)) {
config_val |= IOMUXC_SW_PAD_CTL_PAD_HYS(1);
}
if (MCUX_RT_DRIVE_OPEN_DRAIN(pin_ctrl_flags)) {
config_val |= IOMUXC_SW_PAD_CTL_PAD_ODE(1);
}
if (MCUX_RT_BIAS_BUS_HOLD(pin_ctrl_flags)) {
/* Set pull keeper select to keeper, and pull keeper enable to 1 */
config_val |= IOMUXC_SW_PAD_CTL_PAD_PKE(1);
config_val &= ~IOMUXC_SW_PAD_CTL_PAD_PUE_MASK;
}
if (MCUX_RT_BIAS_PULL_DOWN(pin_ctrl_flags)) {
/* Set pull keeper select to pull, and pull keeper enable to 1 */
config_val |= IOMUXC_SW_PAD_CTL_PAD_PKE(1) | IOMUXC_SW_PAD_CTL_PAD_PUE(1);
/* Set PUS to 0b00 to select pulldown resistor */
config_val &= ~IOMUXC_SW_PAD_CTL_PAD_PUS_MASK;
}
if (MCUX_RT_BIAS_PULL_UP(pin_ctrl_flags)) {
/* Set pull keeper select to pull, and pull keeper enable to 1 */
config_val |= IOMUXC_SW_PAD_CTL_PAD_PKE(1) | IOMUXC_SW_PAD_CTL_PAD_PUE(1);
/* Set PUS field to selected value */
config_val = ((config_val & ~IOMUXC_SW_PAD_CTL_PAD_PUS_MASK) |
IOMUXC_SW_PAD_CTL_PAD_PUS(MCUX_RT_BIAS_PULL_UP(pin_ctrl_flags)));
}
/* Set drive strength field */
config_val = ((config_val & ~IOMUXC_SW_PAD_CTL_PAD_DSE_MASK) |
IOMUXC_SW_PAD_CTL_PAD_DSE(MCUX_RT_DRIVE_STRENGTH(pin_ctrl_flags)));
/* Set speed field */
config_val = ((config_val & ~IOMUXC_SW_PAD_CTL_PAD_SPEED_MASK) |
IOMUXC_SW_PAD_CTL_PAD_SPEED(MCUX_RT_SPEED(pin_ctrl_flags)));
/* Set slew rate field */
config_val = ((config_val & ~IOMUXC_SW_PAD_CTL_PAD_SRE_MASK) |
IOMUXC_SW_PAD_CTL_PAD_SRE(MCUX_RT_SLEW_RATE(pin_ctrl_flags)));
/* Write out config value */
*config_register = config_val;
}

return 0;
}

static int mcux_pinctrl_init(const struct device *dev)
{
ARG_UNUSED(dev);

CLOCK_EnableClock(kCLOCK_Iomuxc);
CLOCK_EnableClock(kCLOCK_IomuxcSnvs);

return 0;
}

SYS_INIT(mcux_pinctrl_init, PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT);
Loading