Skip to content

Commit 381c7c7

Browse files
mmahadevan108nashif
authored andcommitted
boards: lpcxpresso55s69: Add I2S support
Add I2S support for LPCXpresso55S69 board Signed-off-by: Mahesh Mahadevan <[email protected]>
1 parent 35fca50 commit 381c7c7

File tree

8 files changed

+149
-0
lines changed

8 files changed

+149
-0
lines changed

boards/arm/lpcxpresso55s69/doc/index.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ features:
8484
+-----------+------------+-------------------------------------+
8585
| COUNTER | on-chip | counter |
8686
+-----------+------------+-------------------------------------+
87+
| I2S | on-chip | i2s |
88+
+-----------+------------+-------------------------------------+
8789

8890
Targets available
8991
==================
@@ -143,6 +145,14 @@ functionality of a pin.
143145
+---------+-----------------+----------------------------+
144146
| PIO1_24 | USART | USART RX |
145147
+---------+-----------------+----------------------------+
148+
| PIO0_20 | I2S | I2S DATAOUT |
149+
+---------+-----------------+----------------------------+
150+
| PIO0_19 | I2S | I2S TX WS |
151+
+---------+-----------------+----------------------------+
152+
| PIO0_21 | I2S | I2S TX SCK |
153+
+---------+-----------------+----------------------------+
154+
| PIO1_13 | I2S | I2S DATAIN |
155+
+---------+-----------------+----------------------------+
146156

147157
Memory mappings
148158
===============

boards/arm/lpcxpresso55s69/lpcxpresso55s69_cpu0.dts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,3 +129,25 @@ zephyr_udc0: &usbhs {
129129
&ctimer4 {
130130
status = "okay";
131131
};
132+
133+
/* I2S receive channel */
134+
i2s0: &flexcomm6 {
135+
status = "okay";
136+
compatible = "nxp,lpc-i2s";
137+
label = "I2S_0";
138+
#address-cells = <1>;
139+
#size-cells = <0>;
140+
dmas = <&dma0 16>;
141+
dma-names = "rx";
142+
};
143+
144+
/* I2S transmit channel */
145+
i2s1: &flexcomm7 {
146+
status = "okay";
147+
compatible = "nxp,lpc-i2s";
148+
label = "I2S_1";
149+
#address-cells = <1>;
150+
#size-cells = <0>;
151+
dmas = <&dma0 19>;
152+
dma-names = "tx";
153+
};

boards/arm/lpcxpresso55s69/lpcxpresso55s69_cpu0.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ supported:
2222
- counter
2323
- gpio
2424
- i2c
25+
- i2s
2526
- spi
2627
- usb_device
2728
- watchdog

boards/arm/lpcxpresso55s69/pinmux.c

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,70 @@ static int lpcxpresso_55s69_pinmux_init(const struct device *dev)
183183
IOCON_PIO_OPENDRAIN_DI);
184184
#endif
185185

186+
#if (DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(flexcomm6), nxp_lpc_i2s, okay)) && \
187+
(DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(flexcomm7), nxp_lpc_i2s, okay)) && \
188+
CONFIG_I2S
189+
CLOCK_EnableClock(kCLOCK_Sysctl);
190+
/* Set shared signal set 0 SCK, WS from Transmit I2S - Flexcomm 7 */
191+
SYSCTL->SHAREDCTRLSET[0] = SYSCTL_SHAREDCTRLSET_SHAREDSCKSEL(7) |
192+
SYSCTL_SHAREDCTRLSET_SHAREDWSSEL(7);
193+
194+
#ifdef CONFIG_I2S_TEST_SEPARATE_DEVICES
195+
/* Select Data in from Transmit I2S - Flexcomm 7 */
196+
SYSCTL->SHAREDCTRLSET[0] |= SYSCTL_SHAREDCTRLSET_SHAREDDATASEL(7);
197+
/* Enable Transmit I2S - Flexcomm 7 for Shared Data Out */
198+
SYSCTL->SHAREDCTRLSET[0] |= SYSCTL_SHAREDCTRLSET_FC7DATAOUTEN(1);
199+
#endif
200+
201+
/* Set Receive I2S - Flexcomm 6 SCK, WS from shared signal set 0 */
202+
SYSCTL->FCCTRLSEL[6] = SYSCTL_FCCTRLSEL_SCKINSEL(1) |
203+
SYSCTL_FCCTRLSEL_WSINSEL(1);
204+
205+
/* Set Transmit I2S - Flexcomm 7 SCK, WS from shared signal set 0 */
206+
SYSCTL->FCCTRLSEL[7] = SYSCTL_FCCTRLSEL_SCKINSEL(1) |
207+
SYSCTL_FCCTRLSEL_WSINSEL(1);
208+
209+
#ifdef CONFIG_I2S_TEST_SEPARATE_DEVICES
210+
/* Select Receive I2S - Flexcomm 6 Data in from shared signal set 0 */
211+
SYSCTL->FCCTRLSEL[6] |= SYSCTL_FCCTRLSEL_DATAINSEL(1);
212+
/* Select Transmit I2S - Flexcomm 7 Data out to shared signal set 0 */
213+
SYSCTL->FCCTRLSEL[7] |= SYSCTL_FCCTRLSEL_DATAOUTSEL(1);
214+
#endif
215+
216+
/* Pin is configured as FC7_TXD_SCL_MISO_WS */
217+
pinmux_pin_set(port0, 19, IOCON_PIO_FUNC7 |
218+
IOCON_PIO_MODE_PULLUP |
219+
IOCON_PIO_SLEW_FAST |
220+
IOCON_PIO_INV_DI |
221+
IOCON_PIO_DIGITAL_EN |
222+
IOCON_PIO_OPENDRAIN_DI);
223+
224+
/* Pin is configured as FC7_RXD_SDA_MOSI_DATA */
225+
pinmux_pin_set(port0, 20, IOCON_PIO_FUNC7 |
226+
IOCON_PIO_MODE_PULLUP |
227+
IOCON_PIO_SLEW_FAST |
228+
IOCON_PIO_INV_DI |
229+
IOCON_PIO_DIGITAL_EN |
230+
IOCON_PIO_OPENDRAIN_DI);
231+
232+
/* Pin is configured as FC7_SCK */
233+
pinmux_pin_set(port0, 21, IOCON_PIO_FUNC7 |
234+
IOCON_PIO_MODE_PULLUP |
235+
IOCON_PIO_SLEW_FAST |
236+
IOCON_PIO_INV_DI |
237+
IOCON_PIO_DIGITAL_EN |
238+
IOCON_PIO_OPENDRAIN_DI);
239+
240+
/* Pin is configured as FC6_RXD_SDA_MOSI_DATA */
241+
pinmux_pin_set(port1, 13, IOCON_PIO_FUNC2 |
242+
IOCON_PIO_MODE_PULLUP |
243+
IOCON_PIO_SLEW_FAST |
244+
IOCON_PIO_INV_DI |
245+
IOCON_PIO_DIGITAL_EN |
246+
IOCON_PIO_OPENDRAIN_DI);
247+
248+
#endif
249+
186250
return 0;
187251
}
188252

soc/arm/nxp_lpc/lpc55xxx/Kconfig.defconfig.lpc55S69_cpu0

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,9 @@ config COUNTER_MCUX_CTIMER
4949
default y
5050
depends on COUNTER
5151

52+
config I2S_MCUX_FLEXCOMM
53+
default y if HAS_MCUX_FLEXCOMM
54+
depends on I2S
55+
select INIT_PLL0
56+
5257
endif # SOC_LPC55S69_CPU0

soc/arm/nxp_lpc/lpc55xxx/Kconfig.soc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ config SOC_PART_NUMBER_LPC55XXX
7777
option that you should not set directly. The part number selection
7878
choice defines the default value for this string.
7979

80+
config INIT_PLL0
81+
bool "Initialize PLL0"
82+
8083
config SECOND_CORE_MCUX
8184
bool "Enable LPC55xxx's second core"
8285
depends on HAS_MCUX

soc/arm/nxp_lpc/lpc55xxx/soc.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,18 @@
3636
#define TO_CLOCK_ATTACH_ID(inst, val) MUX_A(CM_CTIMERCLKSEL##inst, val)
3737
#define CTIMER_CLOCK_SETUP(node_id) CLOCK_AttachClk(CTIMER_CLOCK_SOURCE(node_id));
3838

39+
#ifdef CONFIG_INIT_PLL0
40+
const pll_setup_t pll0Setup = {
41+
.pllctrl = SYSCON_PLL0CTRL_CLKEN_MASK | SYSCON_PLL0CTRL_SELI(2U) |
42+
SYSCON_PLL0CTRL_SELP(31U),
43+
.pllndec = SYSCON_PLL0NDEC_NDIV(125U),
44+
.pllpdec = SYSCON_PLL0PDEC_PDIV(8U),
45+
.pllsscg = {0x0U, (SYSCON_PLL0SSCG1_MDIV_EXT(3072U) | SYSCON_PLL0SSCG1_SEL_EXT_MASK)},
46+
.pllRate = 24576000U,
47+
.flags = PLL_SETUPFLAG_WAITLOCK}
48+
;
49+
#endif
50+
3951
/**
4052
*
4153
* @brief Initialize the system clock
@@ -60,6 +72,25 @@ static ALWAYS_INLINE void clock_init(void)
6072
/* Enable FRO HF(96MHz) output */
6173
CLOCK_SetupFROClocking(96000000U);
6274

75+
#ifdef CONFIG_INIT_PLL0
76+
/*!< Ensure XTAL16M is on */
77+
PMC->PDRUNCFGCLR0 |= PMC_PDRUNCFG0_PDEN_XTAL32M_MASK;
78+
PMC->PDRUNCFGCLR0 |= PMC_PDRUNCFG0_PDEN_LDOXO32M_MASK;
79+
80+
/*!< Ensure CLK_IN is on */
81+
SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_CLKIN_ENA_MASK;
82+
ANACTRL->XO32M_CTRL |= ANACTRL_XO32M_CTRL_ENABLE_SYSTEM_CLK_OUT_MASK;
83+
84+
/*!< Switch PLL0 clock source selector to XTAL16M */
85+
CLOCK_AttachClk(kEXT_CLK_to_PLL0);
86+
87+
/*!< Configure PLL to the desired values */
88+
CLOCK_SetPLL0Freq(&pll0Setup);
89+
90+
CLOCK_SetClkDiv(kCLOCK_DivPll0Clk, 0U, true);
91+
CLOCK_SetClkDiv(kCLOCK_DivPll0Clk, 1U, false);
92+
#endif
93+
6394
#if !defined(CONFIG_TRUSTED_EXECUTION_NONSECURE)
6495
/*!< Set FLASH wait states for core */
6596
CLOCK_SetFLASHAccessCyclesForFreq(96000000U);
@@ -132,6 +163,16 @@ static ALWAYS_INLINE void clock_init(void)
132163

133164
DT_FOREACH_STATUS_OKAY(nxp_lpc_ctimer, CTIMER_CLOCK_SETUP)
134165

166+
#if (DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(flexcomm6), nxp_lpc_i2s, okay))
167+
/* attach PLL0 clock to FLEXCOMM6 */
168+
CLOCK_AttachClk(kPLL0_DIV_to_FLEXCOMM6);
169+
#endif
170+
171+
#if (DT_NODE_HAS_COMPAT_STATUS(DT_NODELABEL(flexcomm7), nxp_lpc_i2s, okay))
172+
/* attach PLL0 clock to FLEXCOMM6 */
173+
CLOCK_AttachClk(kPLL0_DIV_to_FLEXCOMM7);
174+
#endif
175+
135176
#endif /* CONFIG_SOC_LPC55S69_CPU0 */
136177
}
137178

soc/arm/nxp_lpc/lpc55xxx/soc.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,17 @@
2727
#define IOCON_PIO_DIGITAL_EN 0x0100u /*!<@brief Enables digital function */
2828
#define IOCON_PIO_FUNC0 0x00u /*!<@brief Selects pin function 0 */
2929
#define IOCON_PIO_FUNC1 0x01u /*!<@brief Selects pin function 1 */
30+
#define IOCON_PIO_FUNC2 0x02u /*!<@brief Selects pin function 1 */
3031
#define IOCON_PIO_FUNC5 0x05u /*!<@brief Selects pin function 5 */
32+
#define IOCON_PIO_FUNC7 0x07u /*!<@brief Selects pin function 5 */
3133
#define IOCON_PIO_FUNC6 0x06u /*!<@brief Selects pin function 6 */
3234
#define IOCON_PIO_FUNC9 0x09u /*!<@brief Selects pin function 9 */
3335
#define IOCON_PIO_FUNC10 0x0Au /*!<@brief Selects pin function 10 */
3436
#define IOCON_PIO_INV_DI 0x00u /*!<@brief Input function not inverted */
3537
#define IOCON_PIO_MODE_INACT 0x00u /*!<@brief No addition pin function */
3638
#define IOCON_PIO_OPENDRAIN_DI 0x00u /*!<@brief Open drain is disabled */
3739
#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard slew rate mode */
40+
#define IOCON_PIO_SLEW_FAST 0x40u /*!<@brief Fast slew rate mode */
3841
#define IOCON_PIO_MODE_PULLDOWN 0x10u /*!<@brief Selects pull-down function */
3942
#define IOCON_PIO_MODE_PULLUP 0x20u /*!<@brief Selects pull-up function */
4043
#define IOCON_PIO_INPFILT_OFF 0x1000u /*!<@brief Input filter disabled */

0 commit comments

Comments
 (0)