301 lines
11 KiB
C
301 lines
11 KiB
C
/*
|
|
* Copyright 2020 - 2021 NXP
|
|
* All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#include "fsl_common.h"
|
|
#include "fsl_debug_console.h"
|
|
#include "pin_mux.h"
|
|
#include "clock_config.h"
|
|
#include "board.h"
|
|
#include "demo_config.h"
|
|
#include "FreeRTOS.h"
|
|
#include "task.h"
|
|
#include "event_groups.h"
|
|
|
|
#include "fsl_power.h"
|
|
#include "fsl_wm8904.h"
|
|
#include "fsl_codec_common.h"
|
|
#include "fsl_codec_adapter.h"
|
|
#include "usb_device_config.h"
|
|
#include "usb.h"
|
|
#include "usb_device.h"
|
|
#include "usb_device_class.h"
|
|
#include "usb_device_ch9.h"
|
|
#include "usb_device_descriptor.h"
|
|
#include "fsl_sysctl.h"
|
|
#include "usb_phy.h"
|
|
#include "mouse.h"
|
|
/*******************************************************************************
|
|
* Definitions
|
|
******************************************************************************/
|
|
|
|
|
|
/*******************************************************************************
|
|
* Variables
|
|
******************************************************************************/
|
|
extern usb_hid_mouse_struct_t g_UsbDeviceHidMouse;
|
|
codec_handle_t codecHandle;
|
|
wm8904_config_t wm8904Config = {
|
|
.i2cConfig = {.codecI2CInstance = BOARD_CODEC_I2C_INSTANCE, .codecI2CSourceClock = BOARD_CODEC_I2C_CLOCK_FREQ},
|
|
.recordSource = kWM8904_RecordSourceLineInput,
|
|
.recordChannelLeft = kWM8904_RecordChannelLeft2,
|
|
.recordChannelRight = kWM8904_RecordChannelRight2,
|
|
.playSource = kWM8904_PlaySourceDAC,
|
|
.slaveAddress = WM8904_I2C_ADDRESS,
|
|
.protocol = kWM8904_ProtocolI2S,
|
|
.format = {.sampleRate = kWM8904_SampleRate48kHz, .bitWidth = kWM8904_BitWidth16},
|
|
.mclk_HZ = DEMO_I2S_MASTER_CLOCK_FREQUENCY,
|
|
.master = false,
|
|
};
|
|
codec_config_t boardCodecConfig = {.codecDevType = kCODEC_WM8904, .codecDevConfig = &wm8904Config};
|
|
EventGroupHandle_t g_errorEvent = NULL;
|
|
|
|
/*******************************************************************************
|
|
* Prototypes
|
|
******************************************************************************/
|
|
void BOARD_InitCodec(void);
|
|
|
|
void USB_DeviceClockInit(void);
|
|
void USB_DeviceIsrEnable(void);
|
|
#if USB_DEVICE_CONFIG_USE_TASK
|
|
void USB_DeviceTaskFn(void *deviceHandle);
|
|
#endif /* USB_DEVICE_CONFIG_USE_TASK */
|
|
|
|
extern void led_blinky_init(void);
|
|
extern void rtc_init(void);
|
|
#ifdef ACCELEROMETER_EXISTS
|
|
extern void acc_init(void);
|
|
#endif
|
|
extern void sdcard_init(void);
|
|
extern void audio_init(void);
|
|
extern void mouse_init(void);
|
|
|
|
/*******************************************************************************
|
|
* Code
|
|
******************************************************************************/
|
|
|
|
void BOARD_InitCodec(void)
|
|
{
|
|
bool error = false;
|
|
if (CODEC_Init(&codecHandle, &boardCodecConfig) != kStatus_Success)
|
|
{
|
|
PRINTF("Codec Initialize Failed!\r\n");
|
|
error = true;
|
|
xEventGroupSetBits(g_errorEvent, 1U);
|
|
}
|
|
|
|
if (!error)
|
|
{
|
|
if (CODEC_SetVolume(&codecHandle, kCODEC_PlayChannelHeadphoneLeft | kCODEC_PlayChannelHeadphoneRight, 30U) !=
|
|
kStatus_Success)
|
|
{
|
|
PRINTF("Code Set Volume Failed!\r\n");
|
|
xEventGroupSetBits(g_errorEvent, 1U);
|
|
}
|
|
}
|
|
}
|
|
|
|
void USB_DeviceClockInit(void)
|
|
{
|
|
#if defined(USB_DEVICE_CONFIG_LPCIP3511FS) && (USB_DEVICE_CONFIG_LPCIP3511FS > 0U)
|
|
/* enable USB IP clock */
|
|
CLOCK_EnableUsbfs0DeviceClock(kCLOCK_UsbfsSrcFro, CLOCK_GetFroHfFreq());
|
|
#if defined(FSL_FEATURE_USB_USB_RAM) && (FSL_FEATURE_USB_USB_RAM)
|
|
for (int i = 0; i < FSL_FEATURE_USB_USB_RAM; i++)
|
|
{
|
|
((uint8_t *)FSL_FEATURE_USB_USB_RAM_BASE_ADDRESS)[i] = 0x00U;
|
|
}
|
|
#endif
|
|
|
|
#endif
|
|
#if defined(USB_DEVICE_CONFIG_LPCIP3511HS) && (USB_DEVICE_CONFIG_LPCIP3511HS > 0U)
|
|
/* enable USB IP clock */
|
|
CLOCK_EnableUsbhs0PhyPllClock(kCLOCK_UsbPhySrcExt, BOARD_XTAL0_CLK_HZ);
|
|
CLOCK_EnableUsbhs0DeviceClock(kCLOCK_UsbSrcUnused, 0U);
|
|
USB_EhciPhyInit(CONTROLLER_ID, BOARD_XTAL0_CLK_HZ, NULL);
|
|
#if defined(FSL_FEATURE_USBHSD_USB_RAM) && (FSL_FEATURE_USBHSD_USB_RAM)
|
|
for (int i = 0; i < FSL_FEATURE_USBHSD_USB_RAM; i++)
|
|
{
|
|
((uint8_t *)FSL_FEATURE_USBHSD_USB_RAM_BASE_ADDRESS)[i] = 0x00U;
|
|
}
|
|
#endif
|
|
#endif
|
|
}
|
|
|
|
#if (defined(USB_DEVICE_CONFIG_LPCIP3511FS) && (USB_DEVICE_CONFIG_LPCIP3511FS > 0U))
|
|
void USB0_IRQHandler(void)
|
|
{
|
|
USB_DeviceLpcIp3511IsrFunction(g_UsbDeviceHidMouse.deviceHandle);
|
|
}
|
|
#endif
|
|
#if (defined(USB_DEVICE_CONFIG_LPCIP3511HS) && (USB_DEVICE_CONFIG_LPCIP3511HS > 0U))
|
|
void USB1_IRQHandler(void)
|
|
{
|
|
USB_DeviceLpcIp3511IsrFunction(g_UsbDeviceHidMouse.deviceHandle);
|
|
}
|
|
#endif
|
|
|
|
void USB_DeviceIsrEnable(void)
|
|
{
|
|
uint8_t irqNumber = 0U;
|
|
#if defined(USB_DEVICE_CONFIG_LPCIP3511FS) && (USB_DEVICE_CONFIG_LPCIP3511FS > 0U)
|
|
uint8_t usbDeviceIP3511Irq[] = USB_IRQS;
|
|
irqNumber = usbDeviceIP3511Irq[CONTROLLER_ID - kUSB_ControllerLpcIp3511Fs0];
|
|
#endif
|
|
#if defined(USB_DEVICE_CONFIG_LPCIP3511HS) && (USB_DEVICE_CONFIG_LPCIP3511HS > 0U)
|
|
uint8_t usbDeviceIP3511Irq[] = USBHSD_IRQS;
|
|
irqNumber = usbDeviceIP3511Irq[CONTROLLER_ID - kUSB_ControllerLpcIp3511Hs0];
|
|
#endif
|
|
/* Install isr, set priority, and enable IRQ. */
|
|
NVIC_SetPriority((IRQn_Type)irqNumber, USB_DEVICE_INTERRUPT_PRIORITY);
|
|
EnableIRQ((IRQn_Type)irqNumber);
|
|
}
|
|
|
|
#if USB_DEVICE_CONFIG_USE_TASK
|
|
void USB_DeviceTaskFn(void *deviceHandle)
|
|
{
|
|
#if defined(USB_DEVICE_CONFIG_LPCIP3511FS) && (USB_DEVICE_CONFIG_LPCIP3511FS > 0U)
|
|
USB_DeviceLpcIp3511TaskFunction(deviceHandle);
|
|
#endif
|
|
#if defined(USB_DEVICE_CONFIG_LPCIP3511HS) && (USB_DEVICE_CONFIG_LPCIP3511HS > 0U)
|
|
USB_DeviceLpcIp3511TaskFunction(deviceHandle);
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
|
|
void main(void)
|
|
{
|
|
/* Init board hardware. */
|
|
/* set BOD VBAT level to 1.65V */
|
|
POWER_SetBodVbatLevel(kPOWER_BodVbatLevel1650mv, kPOWER_BodHystLevel50mv, false);
|
|
/* attach main clock divide to FLEXCOMM0 (debug console) */
|
|
CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
|
|
|
|
CLOCK_AttachClk(kFRO12M_to_FLEXCOMM4);
|
|
|
|
PMC->PDRUNCFGCLR0 |= PMC_PDRUNCFG0_PDEN_XTAL32M_MASK; /*!< Ensure XTAL16M is on */
|
|
PMC->PDRUNCFGCLR0 |= PMC_PDRUNCFG0_PDEN_LDOXO32M_MASK; /*!< Ensure XTAL16M is on */
|
|
SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_CLKIN_ENA_MASK; /*!< Ensure CLK_IN is on */
|
|
ANACTRL->XO32M_CTRL |= ANACTRL_XO32M_CTRL_ENABLE_SYSTEM_CLK_OUT_MASK;
|
|
|
|
/*!< Switch PLL0 clock source selector to XTAL16M */
|
|
CLOCK_AttachClk(kEXT_CLK_to_PLL0);
|
|
const pll_setup_t pll0Setup = {
|
|
.pllctrl = SYSCON_PLL0CTRL_CLKEN_MASK | SYSCON_PLL0CTRL_SELI(2U) | SYSCON_PLL0CTRL_SELP(31U),
|
|
.pllndec = SYSCON_PLL0NDEC_NDIV(125U),
|
|
.pllpdec = SYSCON_PLL0PDEC_PDIV(8U),
|
|
.pllsscg = {0x0U, (SYSCON_PLL0SSCG1_MDIV_EXT(3072U) | SYSCON_PLL0SSCG1_SEL_EXT_MASK)},
|
|
.pllRate = 24576000U,
|
|
.flags = PLL_SETUPFLAG_WAITLOCK};
|
|
/*!< Configure PLL to the desired values */
|
|
CLOCK_SetPLL0Freq(&pll0Setup);
|
|
|
|
/* SYSCTL clocks */
|
|
CLOCK_EnableClock(kCLOCK_Sysctl);
|
|
|
|
/* I2S clocks */
|
|
CLOCK_AttachClk(kPLL0_DIV_to_FLEXCOMM6);
|
|
CLOCK_AttachClk(kPLL0_DIV_to_FLEXCOMM7);
|
|
|
|
/* Attach PLL clock to MCLK for I2S, no divider */
|
|
CLOCK_AttachClk(kPLL0_to_MCLK);
|
|
SYSCON->MCLKDIV = SYSCON_MCLKDIV_DIV(0U);
|
|
SYSCON->MCLKIO = 1U;
|
|
|
|
CLOCK_SetClkDiv(kCLOCK_DivPll0Clk, 0U, true);
|
|
CLOCK_SetClkDiv(kCLOCK_DivPll0Clk, 1U, false);
|
|
|
|
/* reset FLEXCOMM for I2C */
|
|
RESET_PeripheralReset(kFC4_RST_SHIFT_RSTn);
|
|
|
|
/* reset FLEXCOMM for DMA0 */
|
|
RESET_PeripheralReset(kDMA0_RST_SHIFT_RSTn);
|
|
|
|
/* reset FLEXCOMM for I2S */
|
|
RESET_PeripheralReset(kFC6_RST_SHIFT_RSTn);
|
|
RESET_PeripheralReset(kFC7_RST_SHIFT_RSTn);
|
|
|
|
/* reset NVIC for FLEXCOMM6 and FLEXCOMM7 */
|
|
NVIC_ClearPendingIRQ(FLEXCOMM6_IRQn);
|
|
NVIC_ClearPendingIRQ(FLEXCOMM7_IRQn);
|
|
|
|
/* Enable interrupts for I2S */
|
|
EnableIRQ(FLEXCOMM6_IRQn);
|
|
EnableIRQ(FLEXCOMM7_IRQn);
|
|
|
|
BOARD_InitBootPins();
|
|
BOARD_BootClockPLL1_150M();
|
|
BOARD_InitDebugConsole();
|
|
|
|
SYSCTL_Init(SYSCTL);
|
|
/* select signal source for share set */
|
|
SYSCTL_SetShareSignalSrc(SYSCTL, kSYSCTL_ShareSet0, kSYSCTL_SharedCtrlSignalSCK, kSYSCTL_Flexcomm7);
|
|
SYSCTL_SetShareSignalSrc(SYSCTL, kSYSCTL_ShareSet0, kSYSCTL_SharedCtrlSignalWS, kSYSCTL_Flexcomm7);
|
|
/* select share set for special flexcomm signal */
|
|
SYSCTL_SetShareSet(SYSCTL, kSYSCTL_Flexcomm7, kSYSCTL_FlexcommSignalSCK, kSYSCTL_ShareSet0);
|
|
SYSCTL_SetShareSet(SYSCTL, kSYSCTL_Flexcomm7, kSYSCTL_FlexcommSignalWS, kSYSCTL_ShareSet0);
|
|
SYSCTL_SetShareSet(SYSCTL, kSYSCTL_Flexcomm6, kSYSCTL_FlexcommSignalSCK, kSYSCTL_ShareSet0);
|
|
SYSCTL_SetShareSet(SYSCTL, kSYSCTL_Flexcomm6, kSYSCTL_FlexcommSignalWS, kSYSCTL_ShareSet0);
|
|
|
|
NVIC_ClearPendingIRQ(USB0_IRQn);
|
|
NVIC_ClearPendingIRQ(USB0_NEEDCLK_IRQn);
|
|
NVIC_ClearPendingIRQ(USB1_IRQn);
|
|
NVIC_ClearPendingIRQ(USB1_NEEDCLK_IRQn);
|
|
|
|
POWER_DisablePD(kPDRUNCFG_PD_USB0_PHY); /*< Turn on USB0 Phy */
|
|
POWER_DisablePD(kPDRUNCFG_PD_USB1_PHY); /*< Turn on USB1 Phy */
|
|
|
|
/* reset the IP to make sure it's in reset state. */
|
|
RESET_PeripheralReset(kUSB0D_RST_SHIFT_RSTn);
|
|
RESET_PeripheralReset(kUSB0HSL_RST_SHIFT_RSTn);
|
|
RESET_PeripheralReset(kUSB0HMR_RST_SHIFT_RSTn);
|
|
RESET_PeripheralReset(kUSB1H_RST_SHIFT_RSTn);
|
|
RESET_PeripheralReset(kUSB1D_RST_SHIFT_RSTn);
|
|
RESET_PeripheralReset(kUSB1_RST_SHIFT_RSTn);
|
|
RESET_PeripheralReset(kUSB1RAM_RST_SHIFT_RSTn);
|
|
|
|
#if (defined USB_DEVICE_CONFIG_LPCIP3511HS) && (USB_DEVICE_CONFIG_LPCIP3511HS)
|
|
CLOCK_EnableClock(kCLOCK_Usbh1);
|
|
/* Put PHY powerdown under software control */
|
|
*((uint32_t *)(USBHSH_BASE + 0x50)) = USBHSH_PORTMODE_SW_PDCOM_MASK;
|
|
/* According to reference mannual, device mode setting has to be set by access usb host register */
|
|
*((uint32_t *)(USBHSH_BASE + 0x50)) |= USBHSH_PORTMODE_DEV_ENABLE_MASK;
|
|
/* enable usb1 host clock */
|
|
CLOCK_DisableClock(kCLOCK_Usbh1);
|
|
#endif
|
|
#if (defined USB_DEVICE_CONFIG_LPCIP3511FS) && (USB_DEVICE_CONFIG_LPCIP3511FS)
|
|
POWER_DisablePD(kPDRUNCFG_PD_USB0_PHY); /*< Turn on USB Phy */
|
|
CLOCK_SetClkDiv(kCLOCK_DivUsb0Clk, 1, false);
|
|
CLOCK_AttachClk(kFRO_HF_to_USB0_CLK);
|
|
/* enable usb0 host clock */
|
|
CLOCK_EnableClock(kCLOCK_Usbhsl0);
|
|
/*According to reference mannual, device mode setting has to be set by access usb host register */
|
|
*((uint32_t *)(USBFSH_BASE + 0x5C)) |= USBFSH_PORTMODE_DEV_ENABLE_MASK;
|
|
/* disable usb0 host clock */
|
|
CLOCK_DisableClock(kCLOCK_Usbhsl0);
|
|
#endif
|
|
|
|
CLOCK_AttachClk(kMAIN_CLK_to_SDIO_CLK);
|
|
|
|
PRINTF("Multi-peripheral Test!\r\n\n");
|
|
g_errorEvent = xEventGroupCreate();
|
|
|
|
rtc_init();
|
|
audio_init();
|
|
mouse_init();
|
|
led_blinky_init();
|
|
#ifdef ACCELEROMETER_EXISTS
|
|
acc_init();
|
|
#endif
|
|
#ifndef DEMO_SDCARD_NOSPORT
|
|
sdcard_init();
|
|
#endif
|
|
|
|
/* Start scheduler. */
|
|
vTaskStartScheduler();
|
|
}
|