arm/rp2040: Add RP2040 I2S driver
This commit is contained in:
parent
41b193e07f
commit
048802bcd2
@ -141,6 +141,49 @@ config RP2040_I2C_DRIVER
|
|||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
config RP2040_I2S
|
||||||
|
bool "I2S"
|
||||||
|
select I2S
|
||||||
|
|
||||||
|
if RP2040_I2S
|
||||||
|
|
||||||
|
config RP2040_I2S_MAXINFLIGHT
|
||||||
|
int "I2S queue size"
|
||||||
|
default 16
|
||||||
|
---help---
|
||||||
|
This is the total number of transfers that can be enqueue before
|
||||||
|
the caller is required to wait. This setting determines the number
|
||||||
|
certain queue data structures that will be pre-allocated.
|
||||||
|
|
||||||
|
config RP2040_I2S_DATALEN
|
||||||
|
int "Data width (bits)"
|
||||||
|
default 16
|
||||||
|
---help---
|
||||||
|
Data width in bits. This is a default value and may be change
|
||||||
|
via the I2S interface
|
||||||
|
|
||||||
|
config RP2040_I2S_DATA
|
||||||
|
int "I2S DATA GPIO pin assign (0-29)"
|
||||||
|
default 9
|
||||||
|
range 0 29
|
||||||
|
|
||||||
|
config RP2040_I2S_CLOCK
|
||||||
|
int "I2S CLOCk GPIO pin assign (0-29)"
|
||||||
|
default 10
|
||||||
|
range 0 29
|
||||||
|
|
||||||
|
config RP2040_I2S_PIO
|
||||||
|
int "RP2040 PIO number used for I2S (0-1)"
|
||||||
|
default 0
|
||||||
|
range 0 1
|
||||||
|
|
||||||
|
config RP2040_I2S_PIO_SM
|
||||||
|
int "RP2040 PIO state machine number used for I2S (0-3)"
|
||||||
|
default 0
|
||||||
|
range 0 3
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
menuconfig RP2040_SPISD
|
menuconfig RP2040_SPISD
|
||||||
bool "SPI SD Card"
|
bool "SPI SD Card"
|
||||||
default n
|
default n
|
||||||
|
@ -80,6 +80,11 @@ ifeq ($(CONFIG_RP2040_I2C),y)
|
|||||||
CHIP_CSRCS += rp2040_i2c.c
|
CHIP_CSRCS += rp2040_i2c.c
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_RP2040_I2S),y)
|
||||||
|
CHIP_CSRCS += rp2040_i2s.c
|
||||||
|
CHIP_CSRCS += rp2040_i2s_pio.c
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(CONFIG_RP2040_FLASH_BOOT),y)
|
ifeq ($(CONFIG_RP2040_FLASH_BOOT),y)
|
||||||
ifneq ($(PICO_SDK_PATH),)
|
ifneq ($(PICO_SDK_PATH),)
|
||||||
include chip/boot2/Make.defs
|
include chip/boot2/Make.defs
|
||||||
|
1389
arch/arm/src/rp2040/rp2040_i2s.c
Normal file
1389
arch/arm/src/rp2040/rp2040_i2s.c
Normal file
File diff suppressed because it is too large
Load Diff
74
arch/arm/src/rp2040/rp2040_i2s.h
Normal file
74
arch/arm/src/rp2040/rp2040_i2s.h
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/arm/src/rp2040/rp2040_i2s.h
|
||||||
|
*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership. The
|
||||||
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the
|
||||||
|
* License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __ARCH_ARM_SRC_RP2040_RP2040_I2S_H
|
||||||
|
#define __ARCH_ARM_SRC_RP2040_RP2040_I2S_H
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
#include <nuttx/audio/i2s.h>
|
||||||
|
|
||||||
|
#include "chip.h"
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#undef EXTERN
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
#define EXTERN extern "C"
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#else
|
||||||
|
#define EXTERN extern
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Function Prototypes
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: rp2040_i2sbus_initialize
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Initialize the selected I2S port
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* Port number (for hardware that has multiple I2S interfaces)
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* Valid I2S device structure reference on success; a NULL on failure
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
FAR struct i2s_dev_s *rp2040_i2sbus_initialize(int port);
|
||||||
|
|
||||||
|
#undef EXTERN
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __ASSEMBLY__ */
|
||||||
|
#endif /* __ARCH_ARM_SRC_RP2040_RP2040_I2S_H */
|
382
arch/arm/src/rp2040/rp2040_i2s_pio.c
Normal file
382
arch/arm/src/rp2040/rp2040_i2s_pio.c
Normal file
@ -0,0 +1,382 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/arm/src/rp2040/rp2040_i2s_pio.c
|
||||||
|
*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership. The
|
||||||
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the
|
||||||
|
* License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#include <arch/board/board.h>
|
||||||
|
|
||||||
|
#include "rp2040_i2s_pio.h"
|
||||||
|
#include "rp2040_pio.h"
|
||||||
|
#include "rp2040_pio_instructions.h"
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* Configuration ************************************************************/
|
||||||
|
|
||||||
|
#ifndef CONFIG_RP2040_I2S_PIO
|
||||||
|
#define CONFIG_RP2040_I2S_PIO 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONFIG_RP2040_I2S_PIO_SM
|
||||||
|
#define CONFIG_RP2040_I2S_PIO_SM 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Types
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
struct rp2040_i2s_pio_config
|
||||||
|
{
|
||||||
|
const rp2040_pio_program_t program;
|
||||||
|
uint32_t entry;
|
||||||
|
uint32_t wrap_target;
|
||||||
|
uint32_t wrap;
|
||||||
|
bool autopull;
|
||||||
|
uint32_t clocks;
|
||||||
|
};
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Data
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* PIO program for 16bit stereo I2S transfer */
|
||||||
|
|
||||||
|
static const uint16_t pio_program_i2s_16s[] =
|
||||||
|
{
|
||||||
|
/* .wrap_target */
|
||||||
|
|
||||||
|
0x6870, /* 0: out null, 16 side 1 */
|
||||||
|
0x6001, /* 1: out pins, 1 side 0 */
|
||||||
|
0xe82d, /* 2: set x, 13 side 1 */
|
||||||
|
0x6001, /* 3: out pins, 1 side 0 */
|
||||||
|
0x0843, /* 4: jmp x--, 3 side 1 */
|
||||||
|
0x7001, /* 5: out pins, 1 side 2 */
|
||||||
|
0x7870, /* 6: out null, 16 side 3 */
|
||||||
|
0x7001, /* 7: out pins, 1 side 2 */
|
||||||
|
0xf82d, /* 8: set x, 13 side 3 */
|
||||||
|
0x7001, /* 9: out pins, 1 side 2 */
|
||||||
|
0x1849, /* 10: jmp x--, 9 side 3 */
|
||||||
|
0x6001, /* 11: out pins, 1 side 0 */
|
||||||
|
|
||||||
|
/* .wrap */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* PIO program for 16bit mono I2S transfer */
|
||||||
|
|
||||||
|
static const uint16_t pio_program_i2s_16m[] =
|
||||||
|
{
|
||||||
|
/* .wrap_target */
|
||||||
|
|
||||||
|
0x80a0, /* 0: pull block side 0 */
|
||||||
|
0x6870, /* 1: out null, 16 side 1 */
|
||||||
|
0xa847, /* 2: mov y, osr side 1 */
|
||||||
|
0x6101, /* 3: out pins, 1 side 0 [1] */
|
||||||
|
0xe92d, /* 4: set x, 13 side 1 [1] */
|
||||||
|
0x6101, /* 5: out pins, 1 side 0 [1] */
|
||||||
|
0x0945, /* 6: jmp x--, 5 side 1 [1] */
|
||||||
|
0x7101, /* 7: out pins, 1 side 2 [1] */
|
||||||
|
0xb9e2, /* 8: mov osr, y side 3 [1] */
|
||||||
|
0x7101, /* 9: out pins, 1 side 2 [1] */
|
||||||
|
0xf92d, /* 10: set x, 13 side 3 [1] */
|
||||||
|
0x7101, /* 11: out pins, 1 side 2 [1] */
|
||||||
|
0x194b, /* 12: jmp x--, 11 side 3 [1] */
|
||||||
|
0x6001, /* 13: out pins, 1 side 0 */
|
||||||
|
|
||||||
|
/* .wrap */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* PIO program for 8bit stereo I2S transfer */
|
||||||
|
|
||||||
|
static const uint16_t pio_program_i2s_8s[] =
|
||||||
|
{
|
||||||
|
/* .wrap_target */
|
||||||
|
|
||||||
|
0x80a0, /* 0: pull block side 0 */
|
||||||
|
0x6078, /* 1: out null, 24 side 0 */
|
||||||
|
0xa9ef, /* 2: mov osr, !osr side 1 [1] */
|
||||||
|
0x6101, /* 3: out pins, 1 side 0 [1] */
|
||||||
|
0xa8ef, /* 4: mov osr, !osr side 1 */
|
||||||
|
0xe826, /* 5: set x, 6 side 1 */
|
||||||
|
0x6101, /* 6: out pins, 1 side 0 [1] */
|
||||||
|
0x0946, /* 7: jmp x--, 6 side 1 [1] */
|
||||||
|
0xe100, /* 8: set pins, 0 side 0 [1] */
|
||||||
|
0xe925, /* 9: set x, 5 side 1 [1] */
|
||||||
|
0xa142, /* 10: nop side 0 [1] */
|
||||||
|
0x094a, /* 11: jmp x--, 10 side 1 [1] */
|
||||||
|
0x90a0, /* 12: pull block side 2 */
|
||||||
|
0x7078, /* 13: out null, 24 side 2 */
|
||||||
|
0xb9ef, /* 14: mov osr, !osr side 3 [1] */
|
||||||
|
0x7101, /* 15: out pins, 1 side 2 [1] */
|
||||||
|
0xb8ef, /* 16: mov osr, !osr side 3 */
|
||||||
|
0xf826, /* 17: set x, 6 side 3 */
|
||||||
|
0x7101, /* 18: out pins, 1 side 2 [1] */
|
||||||
|
0x1952, /* 19: jmp x--, 18 side 3 [1] */
|
||||||
|
0xf100, /* 20: set pins, 0 side 2 [1] */
|
||||||
|
0xf925, /* 21: set x, 5 side 3 [1] */
|
||||||
|
0xb142, /* 22: nop side 2 [1] */
|
||||||
|
0x1956, /* 23: jmp x--, 22 side 3 [1] */
|
||||||
|
|
||||||
|
/* .wrap */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* PIO program for 8bit mono I2S transfer */
|
||||||
|
|
||||||
|
static const uint16_t pio_program_i2s_8m[] =
|
||||||
|
{
|
||||||
|
/* .wrap_target */
|
||||||
|
|
||||||
|
0x80a0, /* 0: pull block side 0 */
|
||||||
|
0x6078, /* 1: out null, 24 side 0 */
|
||||||
|
0xa8ef, /* 2: mov osr, !osr side 1 */
|
||||||
|
0xa847, /* 3: mov y, osr side 1 */
|
||||||
|
0x6101, /* 4: out pins, 1 side 0 [1] */
|
||||||
|
0xa8ef, /* 5: mov osr, !osr side 1 */
|
||||||
|
0xe826, /* 6: set x, 6 side 1 */
|
||||||
|
0x6101, /* 7: out pins, 1 side 0 [1] */
|
||||||
|
0x0947, /* 8: jmp x--, 7 side 1 [1] */
|
||||||
|
0xe100, /* 9: set pins, 0 side 0 [1] */
|
||||||
|
0xe925, /* 10: set x, 5 side 1 [1] */
|
||||||
|
0xa142, /* 11: nop side 0 [1] */
|
||||||
|
0x094b, /* 12: jmp x--, 11 side 1 [1] */
|
||||||
|
0xb142, /* 13: nop side 2 [1] */
|
||||||
|
0xb9e2, /* 14: mov osr, y side 3 [1] */
|
||||||
|
0x7101, /* 15: out pins, 1 side 2 [1] */
|
||||||
|
0xb8ef, /* 16: mov osr, !osr side 3 */
|
||||||
|
0xf826, /* 17: set x, 6 side 3 */
|
||||||
|
0x7101, /* 18: out pins, 1 side 2 [1] */
|
||||||
|
0x1952, /* 19: jmp x--, 18 side 3 [1] */
|
||||||
|
0xf100, /* 20: set pins, 0 side 2 [1] */
|
||||||
|
0xf925, /* 21: set x, 5 side 3 [1] */
|
||||||
|
0xb142, /* 22: nop side 2 [1] */
|
||||||
|
0x1956, /* 23: jmp x--, 22 side 3 [1] */
|
||||||
|
|
||||||
|
/* .wrap */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* PIO configuration table */
|
||||||
|
|
||||||
|
static const struct rp2040_i2s_pio_config g_pio_i2s_configs[] =
|
||||||
|
{
|
||||||
|
[RP2040_I2S_PIO_16BIT_STEREO] =
|
||||||
|
{
|
||||||
|
{
|
||||||
|
pio_program_i2s_16s,
|
||||||
|
sizeof(pio_program_i2s_16s) / sizeof(uint16_t),
|
||||||
|
-1
|
||||||
|
},
|
||||||
|
0, 0, 11,
|
||||||
|
true, 16 * 2 * 2
|
||||||
|
},
|
||||||
|
|
||||||
|
[RP2040_I2S_PIO_16BIT_MONO] =
|
||||||
|
{
|
||||||
|
{
|
||||||
|
pio_program_i2s_16m,
|
||||||
|
sizeof(pio_program_i2s_16m) / sizeof(uint16_t),
|
||||||
|
-1
|
||||||
|
},
|
||||||
|
0, 0, 13,
|
||||||
|
false, 16 * 2 * 4
|
||||||
|
},
|
||||||
|
|
||||||
|
[RP2040_I2S_PIO_8BIT_STEREO] =
|
||||||
|
{
|
||||||
|
{
|
||||||
|
pio_program_i2s_8s,
|
||||||
|
sizeof(pio_program_i2s_8s) / sizeof(uint16_t),
|
||||||
|
-1
|
||||||
|
},
|
||||||
|
0, 0, 23,
|
||||||
|
false, 16 * 2 * 4
|
||||||
|
},
|
||||||
|
|
||||||
|
[RP2040_I2S_PIO_8BIT_MONO] =
|
||||||
|
{
|
||||||
|
{
|
||||||
|
pio_program_i2s_8m,
|
||||||
|
sizeof(pio_program_i2s_8m) / sizeof(uint16_t),
|
||||||
|
-1
|
||||||
|
},
|
||||||
|
0, 0, 23,
|
||||||
|
false, 16 * 2 * 4
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static const uint32_t g_i2s_pio = CONFIG_RP2040_I2S_PIO;
|
||||||
|
static const uint32_t g_i2s_pio_sm = CONFIG_RP2040_I2S_PIO_SM;
|
||||||
|
|
||||||
|
/* PIO I2S status */
|
||||||
|
|
||||||
|
static int g_pio_current_mode = -1;
|
||||||
|
static uint32_t g_pio_current_samplerate;
|
||||||
|
static uint32_t g_pio_current_offset;
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Private Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static float get_clkdiv(int mode, uint32_t samplerate)
|
||||||
|
{
|
||||||
|
float div = (float)BOARD_SYS_FREQ /
|
||||||
|
(samplerate * g_pio_i2s_configs[mode].clocks);
|
||||||
|
|
||||||
|
return div;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Functions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: rp2040_i2s_pio_configure
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Configure RP2040 PIO for I2S
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
int rp2040_i2s_pio_configure(int mode, uint32_t samplerate)
|
||||||
|
{
|
||||||
|
const struct rp2040_i2s_pio_config *conf;
|
||||||
|
rp2040_pio_sm_config sm_config;
|
||||||
|
|
||||||
|
uint32_t data_pin = CONFIG_RP2040_I2S_DATA;
|
||||||
|
uint32_t clock_pin_base = CONFIG_RP2040_I2S_CLOCK;
|
||||||
|
uint32_t pin_mask = (1u << data_pin) | (3u << clock_pin_base);
|
||||||
|
|
||||||
|
/* Check parameters */
|
||||||
|
|
||||||
|
if (mode < 0 || mode >= RP2040_I2S_PIO_MAX_MODE ||
|
||||||
|
samplerate == 0)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mode == g_pio_current_mode)
|
||||||
|
{
|
||||||
|
if (samplerate == g_pio_current_samplerate)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Only changing the sampling rate */
|
||||||
|
|
||||||
|
rp2040_pio_sm_set_clkdiv(g_i2s_pio, g_i2s_pio_sm,
|
||||||
|
get_clkdiv(mode, samplerate));
|
||||||
|
rp2040_pio_sm_clkdiv_restart(g_i2s_pio, g_i2s_pio_sm);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_pio_current_mode < 0)
|
||||||
|
{
|
||||||
|
/* Claim to use PIO state machine for I2S */
|
||||||
|
|
||||||
|
rp2040_pio_sm_claim(g_i2s_pio, g_i2s_pio_sm);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Remove existing PIO program to change the I2S mode */
|
||||||
|
|
||||||
|
rp2040_pio_remove_program(CONFIG_RP2040_I2S_PIO,
|
||||||
|
&g_pio_i2s_configs[g_pio_current_mode].program,
|
||||||
|
g_pio_current_offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Program the PIO */
|
||||||
|
|
||||||
|
conf = &g_pio_i2s_configs[mode];
|
||||||
|
g_pio_current_offset = rp2040_pio_add_program(CONFIG_RP2040_I2S_PIO,
|
||||||
|
&conf->program);
|
||||||
|
g_pio_current_mode = mode;
|
||||||
|
|
||||||
|
/* Configure the state machine */
|
||||||
|
|
||||||
|
sm_config = rp2040_pio_get_default_sm_config();
|
||||||
|
rp2040_sm_config_set_wrap(&sm_config,
|
||||||
|
g_pio_current_offset + conf->wrap_target,
|
||||||
|
g_pio_current_offset + conf->wrap);
|
||||||
|
rp2040_sm_config_set_sideset(&sm_config, 2, false, false);
|
||||||
|
|
||||||
|
rp2040_sm_config_set_out_pins(&sm_config, data_pin, 1);
|
||||||
|
rp2040_sm_config_set_sideset_pins(&sm_config, clock_pin_base);
|
||||||
|
rp2040_sm_config_set_out_shift(&sm_config, false, conf->autopull, 32);
|
||||||
|
rp2040_sm_config_set_set_pins(&sm_config, data_pin, 1);
|
||||||
|
rp2040_sm_config_set_clkdiv(&sm_config, get_clkdiv(mode, samplerate));
|
||||||
|
rp2040_pio_sm_init(g_i2s_pio, g_i2s_pio_sm,
|
||||||
|
g_pio_current_offset, &sm_config);
|
||||||
|
|
||||||
|
rp2040_pio_sm_set_pindirs_with_mask(g_i2s_pio, g_i2s_pio_sm,
|
||||||
|
pin_mask, pin_mask);
|
||||||
|
rp2040_pio_sm_set_pins(g_i2s_pio, g_i2s_pio_sm, 1); /* clear pins */
|
||||||
|
rp2040_pio_sm_exec(g_i2s_pio, g_i2s_pio_sm,
|
||||||
|
pio_encode_jmp(g_pio_current_offset + conf->entry));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: rp2040_i2s_pio_enable
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Set enable I2S transfer
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void rp2040_i2s_pio_enable(bool enable)
|
||||||
|
{
|
||||||
|
rp2040_pio_sm_set_enabled(g_i2s_pio, g_i2s_pio_sm, enable);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: rp2040_i2s_pio_getdmaaddr
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Get DMA peripheral address for I2S transfer
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
uintptr_t rp2040_i2s_pio_getdmaaddr(void)
|
||||||
|
{
|
||||||
|
return RP2040_PIO_TXF(g_i2s_pio, g_i2s_pio_sm);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: rp2040_i2s_pio_getdmaaddr
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Get DMA peripheral address for I2S transfer
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
uint8_t rp2040_i2s_pio_getdreq(void)
|
||||||
|
{
|
||||||
|
return RP2040_DMA_DREQ_PIO0_TX0 + g_i2s_pio_sm + g_i2s_pio * 8;
|
||||||
|
}
|
105
arch/arm/src/rp2040/rp2040_i2s_pio.h
Normal file
105
arch/arm/src/rp2040/rp2040_i2s_pio.h
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* arch/arm/src/rp2040/rp2040_i2s_pio.h
|
||||||
|
*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership. The
|
||||||
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the
|
||||||
|
* License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __ARCH_ARM_SRC_RP2040_RP2040_I2S_PIO_H
|
||||||
|
#define __ARCH_ARM_SRC_RP2040_RP2040_I2S_PIO_H
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Included Files
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Pre-processor Definitions
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#define RP2040_I2S_PIO_16BIT_STEREO 0
|
||||||
|
#define RP2040_I2S_PIO_16BIT_MONO 1
|
||||||
|
#define RP2040_I2S_PIO_8BIT_STEREO 2
|
||||||
|
#define RP2040_I2S_PIO_8BIT_MONO 3
|
||||||
|
#define RP2040_I2S_PIO_MAX_MODE 4
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
#undef EXTERN
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
#define EXTERN extern "C"
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#else
|
||||||
|
#define EXTERN extern
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Types
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Public Function Prototypes
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: rp2040_i2s_pio_configure
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Configure RP2040 PIO for I2S
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
int rp2040_i2s_pio_configure(int mode, uint32_t samplerate);
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: rp2040_i2s_pio_enable
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Set enable I2S transfer
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void rp2040_i2s_pio_enable(bool enable);
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: rp2040_i2s_pio_getdmaaddr
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Get DMA peripheral address for I2S transfer
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
uintptr_t rp2040_i2s_pio_getdmaaddr(void);
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: rp2040_i2s_pio_getdmaaddr
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Get DREQ number for I2S transfer
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
uint8_t rp2040_i2s_pio_getdreq(void);
|
||||||
|
|
||||||
|
#undef EXTERN
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __ASSEMBLY__ */
|
||||||
|
#endif /* __ARCH_ARM_SRC_RP2040_RP2040_I2S_PIO_H */
|
Loading…
Reference in New Issue
Block a user