blob: b86fec4acd2dc8851ccb8c37bd9843d31b79de53 [file] [log] [blame]
/*
* Copyright (c) 2016, Freescale Semiconductor, Inc.
* Copyright 2016-2020 NXP
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "board.h"
#include "fsl_debug_console.h"
#include "fsl_sai.h"
#include "music.h"
#include "fsl_codec_common.h"
#include "fsl_wm8524.h"
#include "pin_mux.h"
#include "clock_config.h"
#include "fsl_common.h"
#include "fsl_gpio.h"
#include "fsl_codec_adapter.h"
/*******************************************************************************
* Definitions
******************************************************************************/
#define DEMO_SAI (I2S2)
#define DEMO_SAI_CHANNEL (0)
#define DEMO_SAI_CLK_FREQ \
CLOCK_GetPllFreq(kCLOCK_SystemPll1Ctrl) / (CLOCK_GetRootPreDivider(kCLOCK_RootSai2)) / \
(CLOCK_GetRootPostDivider(kCLOCK_RootSai2)) / 6
#define DEMO_CODEC_WM8524 (1)
#define CODEC_USEGPIO (1)
#define DEMO_CODEC_BUS_PIN (NULL)
#define DEMO_CODEC_BUS_PIN_NUM (0)
#define DEMO_CODEC_MUTE_PIN (GPIO1)
#define DEMO_CODEC_MUTE_PIN_NUM (8)
#define DEMO_SAI_TX_SYNC_MODE kSAI_ModeAsync
#define DEMO_SAI_RX_SYNC_MODE kSAI_ModeSync
#define DEMO_SAI_MCLK_OUTPUT true
#define DEMO_SAI_MASTER_SLAVE kSAI_Master
#define DEMO_AUDIO_DATA_CHANNEL (2U)
#define DEMO_AUDIO_BIT_WIDTH kSAI_WordWidth16bits
#define DEMO_AUDIO_SAMPLE_RATE (kSAI_SampleRate16KHz)
#define DEMO_AUDIO_MASTER_CLOCK DEMO_SAI_CLK_FREQ
#define BOARD_MASTER_CLOCK_CONFIG()
#define BOARD_SAI_RXCONFIG(config, mode)
/*******************************************************************************
* Prototypes
******************************************************************************/
void BOARD_WM8524_Mute_GPIO(uint32_t output);
extern void BOARD_SAI_RXConfig(sai_transceiver_t *config, sai_sync_mode_t sync);
/*******************************************************************************
* Variables
******************************************************************************/
static wm8524_config_t wm8524Config = {
.setMute = BOARD_WM8524_Mute_GPIO,
.setProtocol = NULL,
.protocol = kWM8524_ProtocolI2S,
};
codec_config_t boardCodecConfig = {.codecDevType = kCODEC_WM8524, .codecDevConfig = &wm8524Config};
sai_handle_t txHandle = {0};
static volatile bool isFinished = false;
extern codec_config_t boardCodecConfig;
codec_handle_t codecHandle;
/*******************************************************************************
* Code
******************************************************************************/
void BOARD_WM8524_Mute_GPIO(uint32_t output)
{
GPIO_PinWrite(DEMO_CODEC_MUTE_PIN, DEMO_CODEC_MUTE_PIN_NUM, output);
}
static void callback(I2S_Type *base, sai_handle_t *handle, status_t status, void *userData)
{
isFinished = true;
}
/*!
* @brief Main function
*/
int main(void)
{
sai_transfer_t xfer;
uint32_t temp = 0;
sai_transceiver_t config;
/* Board specific RDC settings */
BOARD_RdcInit();
BOARD_InitPins();
BOARD_BootClockRUN();
BOARD_InitDebugConsole();
BOARD_InitMemory();
CLOCK_SetRootMux(kCLOCK_RootSai2, kCLOCK_SaiRootmuxSysPll1Div6); /* Set SAI source to SYS PLL1 Div6 133MHZ */
CLOCK_SetRootDivider(kCLOCK_RootSai2, 1U, 3U); /* Set root clock to 133MHZ / 3 = 44MHZ */
/* gpio initialization */
gpio_pin_config_t gpioConfig = {kGPIO_DigitalOutput, 1};
GPIO_PinInit(DEMO_CODEC_MUTE_PIN, DEMO_CODEC_MUTE_PIN_NUM, &gpioConfig);
PRINTF("SAI example started!\n\r");
/* SAI init */
SAI_Init(DEMO_SAI);
SAI_TransferTxCreateHandle(DEMO_SAI, &txHandle, callback, NULL);
/* I2S mode configurations */
SAI_GetClassicI2SConfig(&config, DEMO_AUDIO_BIT_WIDTH, kSAI_Stereo, 1U << DEMO_SAI_CHANNEL);
config.syncMode = DEMO_SAI_TX_SYNC_MODE;
config.masterSlave = DEMO_SAI_MASTER_SLAVE;
SAI_TransferTxSetConfig(DEMO_SAI, &txHandle, &config);
/* set bit clock divider */
SAI_TxSetBitClockRate(DEMO_SAI, DEMO_AUDIO_MASTER_CLOCK, DEMO_AUDIO_SAMPLE_RATE, DEMO_AUDIO_BIT_WIDTH,
DEMO_AUDIO_DATA_CHANNEL);
/* sai rx configurations */
BOARD_SAI_RXCONFIG(&config, DEMO_SAI_RX_SYNC_MODE);
/* master clock configurations */
BOARD_MASTER_CLOCK_CONFIG();
/* Use default setting to init codec */
CODEC_Init(&codecHandle, &boardCodecConfig);
/* xfer structure */
temp = (uint32_t)music;
xfer.data = (uint8_t *)temp;
xfer.dataSize = MUSIC_LEN;
SAI_TransferSendNonBlocking(DEMO_SAI, &txHandle, &xfer);
/* Wait until finished */
while (isFinished != true)
{
}
PRINTF("\n\r SAI example finished!\n\r ");
while (1)
{
}
}