nuttx/arch/avr/src/common/avr_initialize.c

176 lines
5.5 KiB
C
Raw Normal View History

/****************************************************************************
* arch/avr/src/common/avr_initialize.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/arch.h>
#include <nuttx/board.h>
#include <arch/board/board.h>
#include "avr_internal.h"
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* Determine which (if any) console driver to use. This will probably cause
* avr_serialinit to be incorrectly called if there is no USART configured to
2020-07-10 03:08:49 +02:00
* be an RS-232 device (see as an example
* arch/avr/src/at32uc23/at32uc3_config.h)
* This will probably have to be revisited someday.
*
* If a console is enabled and no other console device is specified, then a
* serial console is
* assumed.
*/
#ifndef CONFIG_DEV_CONSOLE
# undef USE_SERIALDRIVER
# undef USE_EARLYSERIALINIT
#else
# define USE_SERIALDRIVER 1
# define USE_EARLYSERIALINIT 1
#endif
/* If some other device is used as the console, then the serial driver may
* still be needed. Let's assume that if the upper half serial driver is
* built, then the lower half will also be needed. There is no need for
* the early serial initialization in this case.
*/
#if !defined(USE_SERIALDRIVER) && defined(CONFIG_STANDARD_SERIAL)
# define USE_SERIALDRIVER 1
#endif
/****************************************************************************
* Public Data
****************************************************************************/
#ifdef CONFIG_ARCH_FAMILY_AVR32
volatile uint32_t *g_current_regs;
#else
volatile uint8_t *g_current_regs;
#endif
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Name: up_color_intstack
*
* Description:
* Set the interrupt stack to a value so that later we can determine how
* much stack space was used by interrupt handling logic
*
****************************************************************************/
#if defined(CONFIG_STACK_COLORATION) && CONFIG_ARCH_INTERRUPTSTACK > 3
static inline void up_color_intstack(void)
{
uint8_t *ptr = g_intstackalloc;
ssize_t size;
for (size = (CONFIG_ARCH_INTERRUPTSTACK & ~3);
size > 0;
size -= sizeof(uint8_t))
{
*ptr++ = INTSTACK_COLOR;
}
}
#else
# define up_color_intstack()
#endif
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: up_initialize
*
* Description:
* up_initialize will be called once during OS initialization after the
* basic OS services have been initialized. The architecture specific
* details of initializing the OS will be handled here. Such things as
* setting up interrupt service routines, starting the clock, and
* registering device drivers are some of the things that are different
* for each processor and hardware platform.
*
* up_initialize is called after the OS initialized but before the user
* initialization logic has been started and before the libraries have
* been initialized. OS services and driver services are available.
*
****************************************************************************/
void up_initialize(void)
{
/* Colorize the interrupt stack */
up_color_intstack();
/* Add any extra memory fragments to the memory manager */
avr_addregion();
#ifdef CONFIG_PM
/* Initialize the power management subsystem. This MCU-specific function
* must be called *very* early in the initialization sequence *before* any
* other device drivers are initialized (since they may attempt to register
* with the power management subsystem).
*/
up_pminitialize();
#endif
#ifdef CONFIG_ARCH_DMA
/* Initialize the DMA subsystem if the weak function avr_dma_initialize has
2020-07-10 03:08:49 +02:00
* been brought into the build
*/
#ifdef CONFIG_HAVE_WEAKFUNCTIONS
if (avr_dma_initialize)
#endif
{
avr_dma_initialize();
}
#endif
/* Initialize the serial device driver */
#ifdef USE_SERIALDRIVER
avr_serialinit();
#endif
/* Initialize the network */
avr_netinitialize();
/* Initialize USB */
avr_usbinitialize();
#if defined(ARCH_HAVE_LEDS)
board_autoled_on(LED_IRQSENABLED);
#endif
}