From d8874e37bdd21f45cb03cf33596fafe00d45288f Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Tue, 24 Feb 2015 09:30:30 -0600 Subject: PIC32MZ: Add beginnings of CPU initialization logic. Still some bad logic for setting up peripheral clocking --- nuttx/arch/mips/src/pic32mx/pic32mx-internal.h | 2 +- nuttx/arch/mips/src/pic32mz/Make.defs | 1 + .../arch/mips/src/pic32mz/chip/pic32mz-memorymap.h | 6 +- .../arch/mips/src/pic32mz/chip/pic32mz-prefetch.h | 82 ++++++++ nuttx/arch/mips/src/pic32mz/pic32mz-lowconsole.h | 123 ++++++++++++ nuttx/arch/mips/src/pic32mz/pic32mz-lowinit.c | 209 +++++++++++++++++++++ nuttx/arch/mips/src/pic32mz/pic32mz-lowinit.h | 102 ++++++++++ 7 files changed, 521 insertions(+), 4 deletions(-) create mode 100644 nuttx/arch/mips/src/pic32mz/chip/pic32mz-prefetch.h create mode 100644 nuttx/arch/mips/src/pic32mz/pic32mz-lowconsole.h create mode 100644 nuttx/arch/mips/src/pic32mz/pic32mz-lowinit.c create mode 100644 nuttx/arch/mips/src/pic32mz/pic32mz-lowinit.h diff --git a/nuttx/arch/mips/src/pic32mx/pic32mx-internal.h b/nuttx/arch/mips/src/pic32mx/pic32mx-internal.h index 09289287d..91a3de396 100644 --- a/nuttx/arch/mips/src/pic32mx/pic32mx-internal.h +++ b/nuttx/arch/mips/src/pic32mx/pic32mx-internal.h @@ -189,7 +189,7 @@ extern "C" void pic32mx_lowinit(void); /************************************************************************************ - * Name: pic32mx_lowsetup + * Name: pic32mx_consoleinit * * Description: * Performs low level initialization of the console UART. This UART done early so diff --git a/nuttx/arch/mips/src/pic32mz/Make.defs b/nuttx/arch/mips/src/pic32mz/Make.defs index 53e5a961f..6187bf357 100644 --- a/nuttx/arch/mips/src/pic32mz/Make.defs +++ b/nuttx/arch/mips/src/pic32mz/Make.defs @@ -64,5 +64,6 @@ endif # Required PIC32MZ files CHIP_ASRCS = +CHIP_CSRCS = pic32mz-lowinit.c # Configuration-dependent PIC32MZ files diff --git a/nuttx/arch/mips/src/pic32mz/chip/pic32mz-memorymap.h b/nuttx/arch/mips/src/pic32mz/chip/pic32mz-memorymap.h index cc01d6126..a03adba1a 100644 --- a/nuttx/arch/mips/src/pic32mz/chip/pic32mz-memorymap.h +++ b/nuttx/arch/mips/src/pic32mz/chip/pic32mz-memorymap.h @@ -42,10 +42,10 @@ #include -#if defined(CHIP_PIC32MZEC) -# include +#if defined(CONFIG_ARCH_CHIP_PIC32MZEC) +# include "chip/pic32mzec-memorymap.h" #else -# error "Unknown PIC32MZ family +# error Unknown PIC32MZ family #endif #endif /* __ARCH_MIPS_SRC_PIC32MZ_CHIP_PIC32MZ_MEMORYMAP_H */ diff --git a/nuttx/arch/mips/src/pic32mz/chip/pic32mz-prefetch.h b/nuttx/arch/mips/src/pic32mz/chip/pic32mz-prefetch.h new file mode 100644 index 000000000..636b788c9 --- /dev/null +++ b/nuttx/arch/mips/src/pic32mz/chip/pic32mz-prefetch.h @@ -0,0 +1,82 @@ +/******************************************************************************************** + * arch/mips/src/pic32mz/chip/pic32mz-prefetch.h + * + * Copyright (C) 2015 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ********************************************************************************************/ + +#ifndef __ARCH_MIPS_SRC_PIC32MZ_CHIP_PIC32MZ_PREFETCH_H +#define __ARCH_MIPS_SRC_PIC32MZ_CHIP_PIC32MZ_PREFETCH_H + +/******************************************************************************************** + * Included Files + ********************************************************************************************/ + +#include + +#include "pic32mz-memorymap.h" + +/******************************************************************************************** + * Pre-processor Definitions + ********************************************************************************************/ +/* Prefetch register offsets ****************************************************************/ + +#define PIC32MZ_PREFETCH_PRECON_OFFSET 0x0000 /* Prefetch module control register */ +#define PIC32MZ_PREFETCH_PRESTAT_OFFSET 0x0000 /* Prefetch module status register */ + +/* Prefetch register addresses **************************************************************/ + +#define PIC32MZ_PREFETCH_PRECON (PIC32MZ_PREFETCH_K1BASE+PIC32MZ_PREFETCH_PRECON_OFFSET) +#define PIC32MZ_PREFETCH_PRESTAT (PIC32MZ_PREFETCH_K1BASE+PIC32MZ_PREFETCH_PRESTAT_OFFSET) + +/* Prefetch register bit field definitions **************************************************/ + +/* Prefetch module control register */ + +#define PREFETCH_PRECON_PFMWS_SHIFT (0) /* Bits 0-2: PFM Access Time */ +#define PREFETCH_PRECON_PFMWS_MASK (7 << PREFETCH_PRECON_PFMWS_SHIFT) +# define PREFETCH_PRECON_PFMWS(n) ((uint32_t)(n) << PREFETCH_PRECON_PFMWS_SHIFT) /* n wait states, n=0..7 */ +#define PREFETCH_PRECON_PREFEN_SHIFT (4) /* Bit 4-5: Predictive Prefetch Enable */ +#define PREFETCH_PRECON_PREFEN_MASK (3 << PREFETCH_PRECON_PREFEN_SHIFT) +# define PREFETCH_PRECON_PREFEN_DISABLE (0 << PREFETCH_PRECON_PREFEN_SHIFT) /* Disable predictive prefetch */ +# define PREFETCH_PRECON_PREFEN_CPUI (1 << PREFETCH_PRECON_PREFEN_SHIFT) /* Predictive prefetch CPU instructions */ +# define PREFETCH_PRECON_PREFEN_CPUID (2 << PREFETCH_PRECON_PREFEN_SHIFT) /* Predictive prefetch CPU instructions and data */ +# define PREFETCH_PRECON_PREFEN_ANY (3 << PREFETCH_PRECON_PREFEN_SHIFT) /* Predictive prefetch any address */ +#define PREFETCH_PRECON_PFMSECEN (1 << 26) /* Bit 26: Flash SEC Interrupt Enable */ + +/* Prefetch module status register */ + +#define PREFETCH_PRESTAT_PFMSECCNT_SHIFT (0) /* Bits 0-7: Flash SEC Count bits */ +#define PREFETCH_PRESTAT_PFMSECCNT_MASK (0xff << PREFETCH_PRESTAT_PFMSECCNT_SHIFT) +#define PREFETCH_PRESTAT_PFMSEC (1 << 26) /* Bit 26: Flash Single-bit Error Corrected Status */ +#define PREFETCH_PRESTAT_PFMDED (1 << 27) /* Bit 27: Flash Double-bit Error Detected Status */ + +#endif /* __ARCH_MIPS_SRC_PIC32MZ_CHIP_PIC32MZ_PREFETCH_H */ diff --git a/nuttx/arch/mips/src/pic32mz/pic32mz-lowconsole.h b/nuttx/arch/mips/src/pic32mz/pic32mz-lowconsole.h new file mode 100644 index 000000000..9382bac81 --- /dev/null +++ b/nuttx/arch/mips/src/pic32mz/pic32mz-lowconsole.h @@ -0,0 +1,123 @@ +/************************************************************************************ + * arch/mips/src/pic32mz/pic32mz-lowconsole.h + * + * Copyright (C) 2015 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ************************************************************************************/ + +#ifndef __ARCH_MIPS_SRC_PIC32MZ_PIC32MZ_LOWCONSOLE_H +#define __ARCH_MIPS_SRC_PIC32MZ_PIC32MZ_LOWCONSOLE_H + +/************************************************************************************ + * Included Files + ************************************************************************************/ + +#include +#include + +#include +#include + +/************************************************************************************ + * Pre-processor Definitions + ************************************************************************************/ + +/************************************************************************************ + * Public Types + ************************************************************************************/ + +#ifndef __ASSEMBLY__ + +/************************************************************************************ + * Public Data + ************************************************************************************/ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/************************************************************************************ + * Public Function Prototypes + ************************************************************************************/ + +/************************************************************************************ + * Name: pic32mz_consoleinit + * + * Description: + * Performs low level initialization of the console UART. This UART done early so + * that the serial console is available for debugging very early in the boot + * sequence. + * + ************************************************************************************/ + +#ifdef HAVE_SERIAL_CONSOLE +void pic32mz_consoleinit(void); +#else +# define pic32mz_consoleinit() +#endif + +/****************************************************************************** + * Name: pic32mz_uartreset + * + * Description: + * Reset a UART. + * + ******************************************************************************/ + +#ifdef HAVE_UART_DEVICE +void pic32mz_uartreset(uintptr_t uart_base); +#endif + +/****************************************************************************** + * Name: pic32mz_uartconfigure + * + * Description: + * Configure a UART as a RS-232 UART. + * + ******************************************************************************/ + +#ifdef HAVE_UART_DEVICE +void pic32mz_uartconfigure(uintptr_t uart_base, uint32_t baudrate, + unsigned int parity, unsigned int nbits, bool stop2); +#endif + +#undef EXTERN +#if defined(__cplusplus) +} +#endif + +#endif /* __ASSEMBLY__ */ +#endif /* __ARCH_MIPS_SRC_PIC32MZ_PIC32MZ_LOWCONSOLE_H */ diff --git a/nuttx/arch/mips/src/pic32mz/pic32mz-lowinit.c b/nuttx/arch/mips/src/pic32mz/pic32mz-lowinit.c new file mode 100644 index 000000000..455cac21c --- /dev/null +++ b/nuttx/arch/mips/src/pic32mz/pic32mz-lowinit.c @@ -0,0 +1,209 @@ +/**************************************************************************** + * arch/mips/src/pic32/pic32mz-lowinit.c + * + * Copyright (C) 2015 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include +#include + +#include "up_internal.h" +#include "up_arch.h" + +#include "chip/pic32mz-prefetch.h" + +#include "pic32mz-lowconsole.h" +#include "pic32mz-lowinit.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ +/* Maximum Frequencies ******************************************************/ + +#define MAX_FLASH_ECC_HZ 66000000 /* Maximum FLASH speed (Hz) with ECC */ +#define MAX_FLASH_NOECC_HZ 83000000 /* Maximum FLASH speed (Hz) without ECC */ +#define MAX_PBCLOCK 80000000 /* Max peripheral bus speed (Hz) */ + +/* Sanity checks ************************************************************/ + +/* Make sure that the selected clock parameters are sane */ + +#define CALC_SYSCLOCK (((BOARD_PLL_INPUT / BOARD_PLL_IDIV) * BOARD_PLL_MULT) / BOARD_PLL_ODIV) +#if CALC_SYSCLOCK != BOARD_CPU_CLOCK +# error "Bad BOARD_CPU_CLOCK calculcation in board.h" +#endif + +#define CALC_PBCLOCK (CALC_SYSCLOCK / BOARD_PBDIV) +#if CALC_PBCLOCK != BOARD_PBCLOCK +# error "Bad BOARD_PBCLOCK calculcation in board.h" +#endif + +#if CALC_PBCLOCK > MAX_PBCLOCK +# error "PBCLOCK exceeds maximum value" +#endif + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Global Variables + ****************************************************************************/ + +/**************************************************************************** + * Private Variables + ****************************************************************************/ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: pic32mz_prefetch + * + * Description: + * Configure the prefetch module setting: + * + * 1. The optimal number of FLASH wait states. + * 2. Enable prefetch on CPU instructions and data + * + * Assumptions: + * Interrupts are disabled. + * + ****************************************************************************/ + +static inline void pic32mz_prefetch(void) +{ + unsigned int nwaits; + unsigned int residual; + uint32_t regval; + + + /* Configure pre-fetch cache FLASH wait states (assuming ECC is enabled) */ + + residual = BOARD_CPU_CLOCK; + nwaits = 0; + + while (residual > MAX_FLASH_ECC_HZ) + { + nwaits++; + residual -= MAX_FLASH_ECC_HZ; + } + + DEBUGASSERT(nwaits < 8); + + /* Set the FLASH wait states and enabled prefetch on CPU instructions and + * data. + */ + + regval = (PREFETCH_PRECON_PREFEN_CPUID | PREFETCH_PRECON_PFMWS(nwaits)); + putreg32(regval, PIC32MZ_PREFETCH_PRECON); +} + +/**************************************************************************** + * Name: pic32mz_k0cache + * + * Description: + * Enable caching in KSEG0. + * + * Assumptions: + * Interrupts are disabled. + * + ****************************************************************************/ + +static inline void pic32mz_k0cache(void) +{ + register uint32_t regval; + + /* Enable cache on KSEG 0 in the CP0 CONFIG register*/ + + asm("\tmfc0 %0,$16,0\n" : "=r"(regval)); + regval &= ~CP0_CONFIG_K23_MASK; + regval |= CP0_CONFIG_K23_CACHEABLE; + asm("\tmtc0 %0,$16,0\n" : : "r" (regval)); + + UNUSED(regval); +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: pic32mz_lowinit + * + * Description: + * This performs basic low-level initialization of the system. + * + * Assumptions: + * Interrupts have not yet been enabled. + * + ****************************************************************************/ + +void pic32mz_lowinit(void) +{ + /* Initialize FLASH wait states */ + + pic32mz_prefetch(); + + /* Enable caching in KSEG0 */ + + pic32mz_k0cache();; + + /* Initialize a console (probably a serial console) */ + + pic32mz_consoleinit(); + + /* Perform early serial initialization (so that we will have debug output + * available as soon as possible). + */ + +#ifdef USE_EARLYSERIALINIT + up_earlyserialinit(); +#endif + + /* Perform board-level initialization */ + + pic32mz_boardinitialize(); +} diff --git a/nuttx/arch/mips/src/pic32mz/pic32mz-lowinit.h b/nuttx/arch/mips/src/pic32mz/pic32mz-lowinit.h new file mode 100644 index 000000000..369ef9ebb --- /dev/null +++ b/nuttx/arch/mips/src/pic32mz/pic32mz-lowinit.h @@ -0,0 +1,102 @@ +/************************************************************************************ + * arch/mips/src/pic32mz/pic32mz-lowinit.h + * + * Copyright (C) 2015 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ************************************************************************************/ + +#ifndef __ARCH_MIPS_SRC_PIC32MZ_PIC32MZ_LOWINIT_H +#define __ARCH_MIPS_SRC_PIC32MZ_PIC32MZ_LOWINIT_H + +/************************************************************************************ + * Included Files + ************************************************************************************/ + +#include +#include + +#include + +/************************************************************************************ + * Pre-processor Definitions + ************************************************************************************/ + +/************************************************************************************ + * Public Types + ************************************************************************************/ + +#ifndef __ASSEMBLY__ + +/************************************************************************************ + * Public Data + ************************************************************************************/ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/************************************************************************************ + * Public Function Prototypes + ************************************************************************************/ + +/************************************************************************************ + * Name: pic32mz_lowinit + * + * Description: + * This performs basic low-level initialization of the system. + * + ************************************************************************************/ + +void pic32mz_lowinit(void); + +/************************************************************************************ + * Name: pic32mz_boardinitialize + * + * Description: + * This function must be provided by the board-specific logic in the directory + * /configs//pic32mz_boot.c. + * + ************************************************************************************/ + +void pic32mz_boardinitialize(void); + +#undef EXTERN +#if defined(__cplusplus) +} +#endif + +#endif /* __ASSEMBLY__ */ +#endif /* __ARCH_MIPS_SRC_PIC32MZ_PIC32MZ_LOWINIT_H */ -- cgit v1.2.3