-
Notifications
You must be signed in to change notification settings - Fork 35
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
board: arm64: add pinctrl support for imx93 evk board
1. Added imx93-pinctrl dts binding yaml 2. Added imx93 pinctrl_soc.h header file 3. Updated imx93 dts to enable pinctrl for lpuart. Signed-off-by: Jiafei Pan <[email protected]>
- Loading branch information
1 parent
dc2d6b8
commit 921b326
Showing
6 changed files
with
215 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
/* | ||
* Copyright (c) 2022, NXP | ||
* SPDX-License-Identifier: Apache-2.0 | ||
* | ||
*/ | ||
|
||
#include <nxp/nxp_imx/mimx9352cvuxk-pinctrl.dtsi> | ||
|
||
&pinctrl { | ||
uart2_default: uart2_default { | ||
group0 { | ||
pinmux = <&iomuxc_uart2_rxd_uart_rx_uart2_rx>, | ||
<&iomuxc_uart2_txd_uart_tx_uart2_tx>; | ||
bias-pull-up; | ||
slew-rate = "slightly_fast"; | ||
drive-strength = "x5"; | ||
}; | ||
}; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -29,3 +29,4 @@ CONFIG_CONSOLE=y | |
CONFIG_UART_CONSOLE=y | ||
|
||
CONFIG_CLOCK_CONTROL=y | ||
CONFIG_PINCTRL=y |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
# Copyright (c) 2022 NXP | ||
# SPDX-License-Identifier: Apache-2.0 | ||
|
||
description: | | ||
The node has the 'pinctrl' node label set in MCUX SoC's devicetree. These | ||
nodes can be autogenerated using the MCUXpresso config tools combined with | ||
the imx_dts_gen.py script in NXP's HAL. The mux, mode, input, daisy, and cfg | ||
fields in a group select the pins to be configured, and the remaining | ||
devicetree properties set configuration values for those pins | ||
for example, here is an group configuring LPUART1 pins: | ||
group0 { | ||
pinmux = <&iomuxc_uart2_rxd_uart_rx_uart2_rx, | ||
&iomuxc_uart2_txd_uart_tx_uart2_tx>; | ||
bias-pull-up; | ||
slew-rate = "slow"; | ||
drive-strength = "x1"; | ||
}; | ||
This will select UART2_RXD as UART2 rx, and UART2_TXD as UART2 tx. | ||
Both pins will be configured with a slow slew rate, and x1 drive | ||
strength. | ||
Note that the soc level iomuxc dts file can be examined to find the possible | ||
pinmux options. Here are the affects of each property on the | ||
IOMUXC SW_PAD_CTL register: | ||
input-schmitt-enable: HYS=1 | ||
drive-open-drain: OD=1 | ||
bias-pull-down: PD=0 | ||
bias-pull-up: PU | ||
slew-rate: FSEL1=<enum_idx> | ||
drive-strength: DSE=<enum_idx> | ||
input-enable: SION=1 (in SW_MUX_CTL_PAD register) | ||
If only required properties are supplied, the pin will have the following | ||
configuration: | ||
HYS=0, | ||
PD=0 | ||
PU=0 | ||
OD=0, | ||
FSEL1=<slew-rate>, | ||
DSE=<drive-strength>, | ||
SION=0, | ||
compatible: "nxp,imx93-pinctrl" | ||
|
||
include: base.yaml | ||
|
||
child-binding: | ||
description: iMX pin controller pin group | ||
child-binding: | ||
description: | | ||
iMX pin controller pin configuration node. | ||
include: | ||
- name: pincfg-node.yaml | ||
property-allowlist: | ||
- input-schmitt-enable | ||
- drive-open-drain | ||
- input-enable | ||
- bias-pull-up | ||
- bias-pull-down | ||
|
||
properties: | ||
pinmux: | ||
required: true | ||
type: phandles | ||
description: | | ||
Pin mux selections for this group. See the soc level iomuxc DTSI file | ||
for a defined list of these options. | ||
drive-strength: | ||
required: true | ||
type: string | ||
enum: | ||
- "x0" | ||
- "x1" | ||
- "x2" | ||
- "x3" | ||
- "x4" | ||
- "x5" | ||
- "x6" | ||
description: | | ||
Pin output drive strength. Sets the DSE field in the IOMUXC peripheral. | ||
00_0000 X0, No driver | ||
00_0001 X1 | ||
00_0011 X2 | ||
00_0111 X3 | ||
00_1111 X4 | ||
01_1111 X5 | ||
11_1111 X6 | ||
slew-rate: | ||
required: true | ||
type: string | ||
enum: | ||
- "slow" | ||
- "slightly_slow" | ||
- "slightly_fast" | ||
- "fast" | ||
description: | | ||
Select slew rate for pin. Corresponds to SRE field in IOMUXC peripheral | ||
0 SLOW — Slow Frequency Slew Rate | ||
1 Slightly SLOW — Slightly Slow Frequency Slew Rate | ||
2 Slightly FAST — Slightly Fast Frequency Slew Rate | ||
3 FAST — Fast Frequency Slew Rate |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
/* | ||
* Copyright (c) 2022, NXP | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
#ifndef ZEPHYR_SOC_ARM64_NXP_IMX9_PINCTRL_SOC_H_ | ||
#define ZEPHYR_SOC_ARM64_NXP_IMX9_PINCTRL_SOC_H_ | ||
|
||
#include <zephyr/devicetree.h> | ||
#include <zephyr/types.h> | ||
#include "fsl_common.h" | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
#define MCUX_IMX_INPUT_SCHMITT_ENABLE_SHIFT IOMUXC1_SW_PAD_CTL_PAD_HYS_SHIFT | ||
#define MCUX_IMX_DRIVE_OPEN_DRAIN_SHIFT IOMUXC1_SW_PAD_CTL_PAD_OD_SHIFT | ||
#define MCUX_IMX_BIAS_PULL_DOWN_SHIFT IOMUXC1_SW_PAD_CTL_PAD_PD_SHIFT | ||
#define MCUX_IMX_BIAS_PULL_UP_SHIFT IOMUXC1_SW_PAD_CTL_PAD_PU_SHIFT | ||
#define MCUX_IMX_BIAS_PULL_ENABLE_SHIFT IOMUXC1_SW_PAD_CTL_PAD_PE_SHIFT | ||
#define MCUX_IMX_SLEW_RATE_SHIFT IOMUXC1_SW_PAD_CTL_PAD_FSEL1_SHIFT | ||
#define MCUX_IMX_DRIVE_STRENGTH_SHIFT IOMUXC1_SW_PAD_CTL_PAD_DSE_SHIFT | ||
#define MCUX_IMX_INPUT_ENABLE_SHIFT 23 /* Shift to a bit not used by IOMUXC_SW_PAD_CTL */ | ||
#define MCUX_IMX_INPUT_ENABLE(x) ((x >> MCUX_IMX_INPUT_ENABLE_SHIFT) & 0x1) | ||
|
||
#define Z_PINCTRL_MCUX_IMX_PINCFG_INIT(node_id) \ | ||
((DT_PROP(node_id, input_schmitt_enable) << MCUX_IMX_INPUT_SCHMITT_ENABLE_SHIFT) | \ | ||
(DT_PROP(node_id, drive_open_drain) << MCUX_IMX_DRIVE_OPEN_DRAIN_SHIFT) | \ | ||
(DT_PROP(node_id, bias_pull_down) << MCUX_IMX_BIAS_PULL_DOWN_SHIFT) | \ | ||
(DT_PROP(node_id, bias_pull_up) << MCUX_IMX_BIAS_PULL_UP_SHIFT) | \ | ||
(DT_ENUM_IDX(node_id, slew_rate) << MCUX_IMX_SLEW_RATE_SHIFT) | \ | ||
((~(0xff << DT_ENUM_IDX(node_id, drive_strength))) << MCUX_IMX_DRIVE_STRENGTH_SHIFT) | \ | ||
(DT_PROP(node_id, input_enable) << MCUX_IMX_INPUT_ENABLE_SHIFT)) | ||
|
||
|
||
/* This struct must be present. It is used by the mcux gpio driver */ | ||
struct pinctrl_soc_pinmux { | ||
uint32_t mux_register; /*!< IOMUXC SW_PAD_MUX register */ | ||
uint32_t config_register; /*!< IOMUXC SW_PAD_CTL register */ | ||
uint32_t input_register; /*!< IOMUXC SELECT_INPUT DAISY register */ | ||
uint8_t mux_mode: 4; /*!< Mux value for SW_PAD_MUX register */ | ||
uint32_t input_daisy:4; /*!< Mux value for SELECT_INPUT_DAISY register */ | ||
}; | ||
|
||
struct pinctrl_soc_pin { | ||
struct pinctrl_soc_pinmux pinmux; | ||
uint32_t pin_ctrl_flags; /*!< value to write to IOMUXC_SW_PAD_CTL register */ | ||
}; | ||
|
||
typedef struct pinctrl_soc_pin pinctrl_soc_pin_t; | ||
|
||
/* This definition must be present. It is used by the mcux gpio driver */ | ||
#define MCUX_IMX_PINMUX(node_id) \ | ||
{ \ | ||
.mux_register = DT_PROP_BY_IDX(node_id, pinmux, 0), \ | ||
.config_register = DT_PROP_BY_IDX(node_id, pinmux, 4), \ | ||
.input_register = DT_PROP_BY_IDX(node_id, pinmux, 2), \ | ||
.mux_mode = DT_PROP_BY_IDX(node_id, pinmux, 1), \ | ||
.input_daisy = DT_PROP_BY_IDX(node_id, pinmux, 3), \ | ||
} | ||
|
||
#define Z_PINCTRL_PINMUX(group_id, pin_prop, idx) \ | ||
MCUX_IMX_PINMUX(DT_PHANDLE_BY_IDX(group_id, pin_prop, idx)) | ||
|
||
#define Z_PINCTRL_STATE_PIN_INIT(group_id, pin_prop, idx) \ | ||
{ \ | ||
.pinmux = Z_PINCTRL_PINMUX(group_id, pin_prop, idx), \ | ||
.pin_ctrl_flags = Z_PINCTRL_MCUX_IMX_PINCFG_INIT(group_id), \ | ||
}, | ||
|
||
|
||
#define Z_PINCTRL_STATE_PINS_INIT(node_id, prop) \ | ||
{DT_FOREACH_CHILD_VARGS(DT_PHANDLE(node_id, prop), \ | ||
DT_FOREACH_PROP_ELEM, pinmux, Z_PINCTRL_STATE_PIN_INIT)}; \ | ||
|
||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif /* ZEPHYR_SOC_ARM64_NXP_IMX9_PINCTRL_SOC_H_ */ |