00001 /*This file is prepared for Doxygen automatic documentation generation.*/ 00013 00014 /* Copyright (c) 2009 Atmel Corporation. All rights reserved. 00015 * 00016 * Redistribution and use in source and binary forms, with or without 00017 * modification, are permitted provided that the following conditions are met: 00018 * 00019 * 1. Redistributions of source code must retain the above copyright notice, 00020 * this list of conditions and the following disclaimer. 00021 * 00022 * 2. Redistributions in binary form must reproduce the above copyright notice, 00023 * this list of conditions and the following disclaimer in the documentation 00024 * and/or other materials provided with the distribution. 00025 * 00026 * 3. The name of Atmel may not be used to endorse or promote products derived 00027 * from this software without specific prior written permission. 00028 * 00029 * 4. This software may only be redistributed and used in connection with an Atmel 00030 * AVR product. 00031 * 00032 * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED 00033 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 00034 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE EXPRESSLY AND 00035 * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, 00036 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 00037 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 00038 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 00039 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 00040 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 00041 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00042 */ 00043 00044 #include "config.h" 00045 #include "start_boot.h" 00046 #include "lib_mcu/wdt/wdt_drv.h" 00047 00048 #ifdef __ICCAVR__ 00049 #if (defined(__ATmega32U4__) || defined(__ATmega32U6__)) 00050 void (*start_bootloader) (void)=(void (*)(void))0x3800; 00051 #elif defined(__ATmega16U4__) 00052 void (*start_bootloader) (void)=(void (*)(void))0x1800; 00053 #else 00054 #error MCU part not define in project options 00055 #endif 00056 #elif defined __GNUC__ 00057 #if (defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega32U6__)) 00058 void (*start_bootloader) (void)=(void (*)(void))0x3800; 00059 #elif defined(__AVR_ATmega16U4__) 00060 void (*start_bootloader) (void)=(void (*)(void))0x1800; 00061 #else 00062 #error MCU part not define in project options 00063 #endif 00064 #else // Other compiler 00065 #error Compiler unknow 00066 #endif 00067 00068 00069 #ifdef __GNUC__ 00070 U32 boot_key __attribute__ ((section (".noinit"))); 00071 #else 00072 __no_init U32 boot_key At(0x0100); 00073 #endif 00074 00082 void start_boot(void) 00083 { 00084 boot_key=0x55AAAA55; 00085 00086 // Enable the WDT for reset mode 00087 wdtdrv_enable(WDTO_500MS); 00088 while(1); 00089 } 00090 00091 00097 void start_boot_if_required(void) 00098 { 00099 if(boot_key==GOTOBOOTKEY) 00100 { 00101 boot_key = 0; 00102 (*start_bootloader)(); 00103 } 00104 } 00105 00106 00109 void goto_boot(void) 00110 { 00111 (*start_bootloader)(); 00112 } 00113 00114