/**************************************************************************** * 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 #include #include #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 * 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 * 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 }