1 .file "bootloader.c" 2 __SREG__ = 0x3f 3 __SP_H__ = 0x3e 4 __SP_L__ = 0x3d 5 __tmp_reg__ = 0 6 __zero_reg__ = 1 7 .global __do_copy_data 8 .global __do_clear_bss 11 .text 12 .Ltext0: 101 .section .text.check_firmware_checksum,"ax",@progbits 103 .global check_firmware_checksum 105 check_firmware_checksum: 106 .stabd 46,0,0 1:bootloader.c **** #include "app.h" 2:bootloader.c **** #include "common.h" 3:bootloader.c **** 4:bootloader.c **** #include 5:bootloader.c **** #include 6:bootloader.c **** #include 7:bootloader.c **** #include 8:bootloader.c **** #include 9:bootloader.c **** #include 10:bootloader.c **** #include 11:bootloader.c **** #include 12:bootloader.c **** 13:bootloader.c **** #include "uart.h" 14:bootloader.c **** #include "midi.h" 15:bootloader.c **** 16:bootloader.c **** int main(void); 17:bootloader.c **** 18:bootloader.c **** #define _B1024 19:bootloader.c **** 20:bootloader.c **** #ifdef _B128 21:bootloader.c **** #define APP_PAGES ((2*4096 / SPM_PAGESIZE)- (2*128 / SPM_PAGESIZE )) 22:bootloader.c **** #define APP_END APP_PAGES * SPM_PAGESIZE 23:bootloader.c **** #endif 24:bootloader.c **** #ifdef _B256 25:bootloader.c **** #define APP_PAGES ((2*4096 / SPM_PAGESIZE)- (2*256 / SPM_PAGESIZE )) 26:bootloader.c **** #define APP_END APP_PAGES * SPM_PAGESIZE 27:bootloader.c **** #endif 28:bootloader.c **** #ifdef _B512 29:bootloader.c **** #define APP_PAGES ((2*4096 / SPM_PAGESIZE)- (2*512 / SPM_PAGESIZE )) 30:bootloader.c **** #define APP_END APP_PAGES * SPM_PAGESIZE 31:bootloader.c **** #endif 32:bootloader.c **** #ifdef _B1024 33:bootloader.c **** #define APP_PAGES ((2*4096 / SPM_PAGESIZE)- (2*1024 / SPM_PAGESIZE )) 34:bootloader.c **** #define APP_END APP_PAGES * SPM_PAGESIZE 35:bootloader.c **** #endif 36:bootloader.c **** #ifdef _B2048 37:bootloader.c **** #error "_B2048 not suppoted on this device" 38:bootloader.c **** #endif 39:bootloader.c **** 40:bootloader.c **** void (*jump_to_app)(void) = 0x0000; 41:bootloader.c **** 42:bootloader.c **** uint8_t check_firmware_checksum(void) { 108 .LM0: 109 .LFBB1: 110 /* prologue: frame size=0 */ 111 /* prologue end (size=0) */ 112 .LBB25: 113 .LBB26: 115 .Ltext1: 1:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** /* Copyright (c) 2002, 2003, 2004, 2007 Marek Michalkiewicz 2:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** Copyright (c) 2005, 2006 Bjoern Haase 3:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** All rights reserved. 4:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 5:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** Redistribution and use in source and binary forms, with or without 6:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** modification, are permitted provided that the following conditions are met: 7:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 8:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** * Redistributions of source code must retain the above copyright 9:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** notice, this list of conditions and the following disclaimer. 10:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 11:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** * Redistributions in binary form must reproduce the above copyright 12:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** notice, this list of conditions and the following disclaimer in 13:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** the documentation and/or other materials provided with the 14:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** distribution. 15:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 16:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** * Neither the name of the copyright holders nor the names of 17:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** contributors may be used to endorse or promote products derived 18:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** from this software without specific prior written permission. 19:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 20:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 24:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** POSSIBILITY OF SUCH DAMAGE. */ 31:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 32:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** /* $Id: eeprom.h,v 1.17.2.4 2007/01/23 15:34:58 joerg_wunsch Exp $ */ 33:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 34:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** /* 35:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** eeprom.h 36:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 37:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** Contributors: 38:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** Created by Marek Michalkiewicz 39:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** eeprom_write_word and eeprom_write_block added by Artur Lipowski 40:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 41:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** Complete rewrite using the original interface by Bjoern Haase 42:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** . 43:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** */ 44:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 45:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #ifndef _EEPROM_H_ 46:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #define _EEPROM_H_ 1 47:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 48:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #define __need_size_t 49:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #include 50:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #include 51:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 52:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** /** \file */ 53:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 54:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #ifdef __AVR_MEGA__ 55:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #define XCALL "call" 56:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #else 57:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #define XCALL "rcall" 58:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #endif 59:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 60:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #include 61:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #ifndef __EEPROM_REG_LOCATIONS__ 62:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** /** \def __EEPROM_REG_LOCATIONS__ 63:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** \ingroup avr_eeprom 64:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** In order to be able to work without a requiring a multilib 65:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** approach for dealing with controllers having the EEPROM registers 66:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** at different positions in memory space, the eeprom functions evaluate 67:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** __EEPROM_REG_LOCATIONS__: It is assumed to be defined by 68:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** the device io header and contains 6 uppercase hex digits encoding the 69:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** addresses of EECR,EEDR and EEAR. 70:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** First two letters: EECR address. 71:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** Second two letters: EEDR address. 72:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** Last two letters: EEAR address. 73:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** The default 1C1D1E corresponds to the 74:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** register location that is valid for most controllers. The value 75:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** of this define symbol is used for appending it to the base name of the 76:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** assembler functions. */ 77:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #define __EEPROM_REG_LOCATIONS__ 1C1D1E 78:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #endif 79:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #define _STR2(EXP) _STR1(EXP) 80:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #define _STR1(EXP) #EXP 81:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #define _REG_LOCATION_SUFFIX _STR2(__EEPROM_REG_LOCATIONS__) 82:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 83:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #ifndef CR_TAB 84:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #define CR_TAB "\n\t" 85:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #endif 86:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 87:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 88:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** /** \defgroup avr_eeprom : EEPROM handling 89:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** \code #include \endcode 90:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 91:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** This header file declares the interface to some simple library 92:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** routines suitable for handling the data EEPROM contained in the 93:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** AVR microcontrollers. The implementation uses a simple polled 94:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** mode interface. Applications that require interrupt-controlled 95:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** EEPROM access to ensure that no time will be wasted in spinloops 96:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** will have to deploy their own implementation. 97:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 98:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** \note All of the read/write functions first make sure the EEPROM 99:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** is ready to be accessed. Since this may cause long delays if a 100:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** write operation is still pending, time-critical applications 101:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** should first poll the EEPROM e. g. using eeprom_is_ready() before 102:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** attempting any actual I/O. 103:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 104:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** \note This header file declares inline functions that call the 105:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** assembler subroutines directly. This prevents that the compiler 106:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** generates push/pops for the call-clobbered registers. This way 107:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** also a specific calling convention could be used for the eeprom 108:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** routines e.g. by passing values in __tmp_reg__, eeprom addresses in 109:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** X and memory addresses in Z registers. Method is optimized for code 110:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** size. 111:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 112:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** \note Presently supported are two locations of the EEPROM register 113:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** set: 0x1F,0x20,0x21 and 0x1C,0x1D,0x1E 114:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** (see ::__EEPROM_REG_LOCATIONS__). 115:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 116:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** \note As these functions modify IO registers, they are known to be 117:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** non-reentrant. If any of these functions are used from both, 118:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** standard and interrupt context, the applications must ensure 119:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** proper protection (e.g. by disabling interrupts before accessing 120:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** them). 121:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 122:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** */ 123:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 124:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 125:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** /* forward declarations of the inline functions so that doxygen does 126:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** not get confused by the attribute expression. */ 127:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 128:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** static inline uint8_t __attribute__ ((always_inline)) 129:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** eeprom_read_byte (const uint8_t *addr); 130:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 131:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** static inline uint16_t __attribute__ ((always_inline)) 132:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** eeprom_read_word (const uint16_t *addr); 133:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 134:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** static inline void __attribute__ ((always_inline)) 135:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** eeprom_read_block (void *pointer_ram, 136:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** const void *pointer_eeprom, 137:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** size_t size); 138:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 139:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** static inline void __attribute__ ((always_inline)) 140:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** eeprom_write_byte (uint8_t *addr,uint8_t value); 141:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 142:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** static inline void __attribute__ ((always_inline)) 143:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** eeprom_write_word (uint16_t *addr,uint16_t value); 144:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 145:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** static inline void __attribute__ ((always_inline)) 146:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** eeprom_write_block (const void *pointer_ram, 147:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** void *pointer_eeprom, 148:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** size_t size); 149:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 150:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** /** \name avr-libc declarations */ 151:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 152:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** /*@{*/ 153:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 154:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** /** \def EEMEM 155:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** \ingroup avr_eeprom 156:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** Attribute expression causing a variable to be allocated within the .eeprom 157:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** section. */ 158:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #define EEMEM __attribute__((section(".eeprom"))) 159:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 160:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** /** \def eeprom_is_ready 161:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** \ingroup avr_eeprom 162:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** \returns 1 if EEPROM is ready for a new read/write operation, 0 if not. */ 163:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 164:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #if defined(__DOXYGEN__) 165:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** # define eeprom_is_ready() 166:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #elif defined(EEWE) 167:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** # define eeprom_is_ready() bit_is_clear(EECR, EEWE) 168:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #elif defined(EEPE) 169:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** # define eeprom_is_ready() bit_is_clear(EECR, EEPE) 170:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #elif defined(DEECR) && defined(EEL) 171:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** # define eeprom_is_ready() bit_is_clear(DEECR, EEL) 172:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #else 173:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** # error "No write enable bit known for this device's EEPROM." 174:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #endif 175:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 176:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** /** \def eeprom_busy_wait 177:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** \ingroup avr_eeprom 178:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 179:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** Loops until the eeprom is no longer busy. 180:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 181:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** \returns Nothing. */ 182:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 183:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** #define eeprom_busy_wait() do {} while (!eeprom_is_ready()) 184:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 185:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 186:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** /** \ingroup avr_eeprom 187:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** Read one byte from EEPROM address \c addr. */ 188:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 189:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** uint8_t 190:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** eeprom_read_byte (const uint8_t *addr) 191:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** { 192:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** uint8_t result; 193:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** __asm__ __volatile__ 194:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** ( XCALL " __eeprom_read_byte_" _REG_LOCATION_SUFFIX CR_TAB 195:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** "mov %1,__tmp_reg__" 196:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** : "+x" (addr), 197:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** "=r" (result) 198:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** : ); 199:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** return result; 200:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** } 201:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 202:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** /** \ingroup avr_eeprom 203:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** Read one 16-bit word (little endian) from EEPROM address \c addr. */ 204:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** uint16_t 205:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** eeprom_read_word (const uint16_t *addr) 206:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** { 207:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** uint16_t result; 208:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 209:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** __asm__ __volatile__ ( 117 .LM1: 118 0000 A0E0 ldi r26,lo8(0) 119 0002 B0E0 ldi r27,hi8(0) 120 /* #APP */ 121 0004 00D0 rcall __eeprom_read_word_1C1D1E 122 123 /* #NOAPP */ 124 0006 AF01 movw r20,r30 125 .LBE26: 126 .LBE25: 127 .LBB27: 128 .LBB28: 129 0008 A2E0 ldi r26,lo8(2) 130 000a B0E0 ldi r27,hi8(2) 131 /* #APP */ 132 000c 00D0 rcall __eeprom_read_word_1C1D1E 133 134 /* #NOAPP */ 135 000e BF01 movw r22,r30 136 0010 20E0 ldi r18,lo8(0) 137 0012 30E0 ldi r19,hi8(0) 138 0014 E0E0 ldi r30,lo8(0) 139 0016 F0E0 ldi r31,hi8(0) 140 0018 00C0 rjmp .L2 141 .L3: 142 .LBE28: 143 .LBE27: 144 .LBB29: 146 .Ltext2: 43:bootloader.c **** uint16_t len = eeprom_read_word(FIRMWARE_LENGTH_ADDR); 44:bootloader.c **** uint16_t firm_checksum = eeprom_read_word(FIRMWARE_CHECKSUM_ADDR); 45:bootloader.c **** uint16_t i; 46:bootloader.c **** uint16_t checksum = 0; 47:bootloader.c **** 48:bootloader.c **** for (i = 0; i < len; i++) { 49:bootloader.c **** checksum += pgm_read_byte(i); 148 .LM2: 149 /* #APP */ 150 001a 8491 lpm r24, Z 151 152 /* #NOAPP */ 153 .LBE29: 154 001c 280F add r18,r24 155 001e 311D adc r19,__zero_reg__ 157 .LM3: 158 0020 3196 adiw r30,1 159 .L2: 160 0022 E417 cp r30,r20 161 0024 F507 cpc r31,r21 162 0026 01F4 brne .L3 163 0028 80E0 ldi r24,lo8(0) 164 002a 90E0 ldi r25,hi8(0) 165 002c 3F73 andi r19,hi8(16383) 166 002e 2617 cp r18,r22 167 0030 3707 cpc r19,r23 168 0032 01F4 brne .L5 169 0034 81E0 ldi r24,lo8(1) 170 0036 90E0 ldi r25,hi8(1) 171 .L5: 50:bootloader.c **** } 51:bootloader.c **** 52:bootloader.c **** if ((checksum & 0x3FFF) == firm_checksum) 53:bootloader.c **** return 1; 54:bootloader.c **** else 55:bootloader.c **** return 0; 56:bootloader.c **** } 173 .LM4: 174 0038 0895 ret 175 /* epilogue: frame size=0 */ 176 /* epilogue: noreturn */ 177 /* epilogue end (size=0) */ 178 /* function check_firmware_checksum size 39 (39) */ 195 .Lscope1: 197 .stabd 78,0,0 198 .section .text.write_firmware_checksum,"ax",@progbits 202 .global write_firmware_checksum 204 write_firmware_checksum: 205 .stabd 46,0,0 57:bootloader.c **** 58:bootloader.c **** void write_firmware_checksum(uint16_t len, uint16_t checksum) { 207 .LM5: 208 .LFBB2: 209 /* prologue: frame size=0 */ 210 /* prologue end (size=0) */ 211 .LBB30: 212 .LBB31: 214 .Ltext3: 210:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** XCALL " __eeprom_read_word_" _REG_LOCATION_SUFFIX CR_TAB 211:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** : "+x" (addr), 212:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** "=z" (result) 213:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** : ); 214:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** return result; 215:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** } 216:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 217:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** /** \ingroup avr_eeprom 218:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** Read a block of \c n bytes from EEPROM address \c pointer_eeprom to 219:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** \c pointer_ram. For constant n <= 256 bytes a library function is used. 220:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** For block sizes unknown at compile time or block sizes > 256 an inline 221:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** loop is expanded. */ 222:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 223:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** void 224:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** eeprom_read_block (void *pointer_ram, 225:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** const void *pointer_eeprom, 226:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** size_t n) 227:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** { 228:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** if (!__builtin_constant_p (n) 229:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** || n > 256) 230:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** { 231:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** /* make sure size is a 16 bit variable. */ 232:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** uint16_t size = n; 233:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 234:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** __asm__ __volatile__ ( 235:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** ".%=_start:" CR_TAB 236:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** "sbiw %2,1" CR_TAB 237:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** "brlt .%=_finished" CR_TAB 238:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** XCALL " __eeprom_read_byte_" _REG_LOCATION_SUFFIX CR_TAB 239:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** "st z+,__tmp_reg__" CR_TAB 240:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** "rjmp .%=_start" CR_TAB 241:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** ".%=_finished:" 242:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** : "=x" (pointer_eeprom), 243:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** "=z" (pointer_ram), 244:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** "+w" (size) 245:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** : "x" (pointer_eeprom), 246:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** "z" (pointer_ram) 247:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** : "memory"); 248:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** } 249:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** else 250:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** { 251:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** if (n != 0) 252:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** { 253:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** if (n == 256) 254:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** { 255:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** __asm__ __volatile__ ( 256:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** XCALL " __eeprom_read_block_" _REG_LOCATION_SUFFIX 257:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** : "+x" (pointer_eeprom), 258:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** "=z" (pointer_ram) 259:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** : "z" (pointer_ram) 260:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** : "memory"); 261:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** } 262:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** else 263:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** { 264:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** /* Needed in order to truncate to 8 bit. */ 265:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** uint8_t len; 266:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** len = (uint8_t) n; 267:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 268:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** __asm__ __volatile__ ( 269:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** "mov __zero_reg__,%2" CR_TAB 270:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** XCALL " __eeprom_read_block_" _REG_LOCATION_SUFFIX 271:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** : "+x" (pointer_eeprom), 272:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** "=z" (pointer_ram) 273:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** : "r" (len), 274:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** "z" (pointer_ram) 275:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** : "memory"); 276:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** } 277:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** } 278:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** } 279:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** } 280:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 281:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** /** \ingroup avr_eeprom 282:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** Write a byte \c value to EEPROM address \c addr. */ 283:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 284:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** void 285:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** eeprom_write_byte (uint8_t *addr,uint8_t value) 286:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** { 287:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** __asm__ __volatile__ ( 288:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** "mov __tmp_reg__,%1" CR_TAB 289:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** XCALL " __eeprom_write_byte_" _REG_LOCATION_SUFFIX 290:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** : "+x" (addr) 291:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** : "r" (value) 292:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** : "memory" 293:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** ); 294:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** } 295:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 296:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** /** \ingroup avr_eeprom 297:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** Write a word \c value to EEPROM address \c addr. */ 298:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** 299:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** void 300:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** eeprom_write_word (uint16_t *addr,uint16_t value) 301:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** { 302:/sw/share/avr/lib/gcc/avr/4.2.0/../../../../avr/include/avr/eeprom.h **** __asm__ __volatile__ ( 216 .LM6: 217 0000 A0E0 ldi r26,lo8(0) 218 0002 B0E0 ldi r27,hi8(0) 219 /* #APP */ 220 0004 0C01 movw __tmp_reg__,r24 221 0006 00D0 rcall __eeprom_write_word_1C1D1E 222 223 /* #NOAPP */ 224 .LBE31: 225 .LBE30: 226 .LBB32: 227 .LBB33: 228 0008 A2E0 ldi r26,lo8(2) 229 000a B0E0 ldi r27,hi8(2) 230 /* #APP */ 231 000c 0B01 movw __tmp_reg__,r22 232 000e 00D0 rcall __eeprom_write_word_1C1D1E 233 234 /* #NOAPP */ 235 .LBE33: 236 .LBE32: 237 .LBB34: 238 .LBB35: 239 0010 81E0 ldi r24,lo8(1) 240 0012 90E0 ldi r25,hi8(1) 241 0014 A4E0 ldi r26,lo8(4) 242 0016 B0E0 ldi r27,hi8(4) 243 /* #APP */ 244 0018 0C01 movw __tmp_reg__,r24 245 001a 00D0 rcall __eeprom_write_word_1C1D1E 246 247 /* #NOAPP */ 248 .LBE35: 249 .LBE34: 250 /* epilogue: frame size=0 */ 251 001c 0895 ret 252 /* epilogue end (size=1) */ 253 /* function write_firmware_checksum size 27 (26) */ 264 .Lscope2: 266 .stabd 78,0,0 267 .section .text.bl_uart_getc,"ax",@progbits 269 .global bl_uart_getc 271 bl_uart_getc: 272 .stabd 46,0,0 274 .Ltext4: 59:bootloader.c **** eeprom_write_word(FIRMWARE_LENGTH_ADDR, len); 60:bootloader.c **** eeprom_write_word(FIRMWARE_CHECKSUM_ADDR, checksum); 61:bootloader.c **** eeprom_write_word(START_MAIN_APP_ADDR, 1); 62:bootloader.c **** } 63:bootloader.c **** 64:bootloader.c **** uint8_t bl_uart_getc(void) { 276 .LM7: 277 .LFBB3: 278 /* prologue: frame size=0 */ 279 /* prologue end (size=0) */ 280 .L11: 65:bootloader.c **** while (!UART_CHECK_RX()) 282 .LM8: 283 0000 5F9B sbis 43-0x20,7 284 0002 00C0 rjmp .L11 66:bootloader.c **** ; 67:bootloader.c **** return UART_READ_CHAR(); 286 .LM9: 287 0004 8CB1 in r24,44-0x20 68:bootloader.c **** } 289 .LM10: 290 0006 9927 clr r25 291 /* epilogue: frame size=0 */ 292 0008 0895 ret 293 /* epilogue end (size=1) */ 294 /* function bl_uart_getc size 5 (4) */ 296 .Lscope3: 298 .stabd 78,0,0 299 .section .text.bl_uart_putc,"ax",@progbits 302 .global bl_uart_putc 304 bl_uart_putc: 305 .stabd 46,0,0 69:bootloader.c **** 70:bootloader.c **** void bl_uart_putc(uint8_t c) { 307 .LM11: 308 .LFBB4: 309 /* prologue: frame size=0 */ 310 /* prologue end (size=0) */ 311 .L18: 71:bootloader.c **** while (!UART_CHECK_EMPTY_BUFFER()) 313 .LM12: 314 0000 5D9B sbis 43-0x20,5 315 0002 00C0 rjmp .L18 72:bootloader.c **** ; 73:bootloader.c **** UART_WRITE_CHAR(c); 317 .LM13: 318 0004 8CB9 out 44-0x20,r24 319 /* epilogue: frame size=0 */ 320 0006 0895 ret 321 /* epilogue end (size=1) */ 322 /* function bl_uart_putc size 4 (3) */ 324 .Lscope4: 326 .stabd 78,0,0 327 .section .text.midi_sysex_send_ack,"ax",@progbits 329 .global midi_sysex_send_ack 331 midi_sysex_send_ack: 332 .stabd 46,0,0 74:bootloader.c **** } 75:bootloader.c **** 76:bootloader.c **** uint8_t ack_msg[6] = { 77:bootloader.c **** 0xf0, 0x00, 0x13, 0x37, CMD_DATA_BLOCK_ACK, 0xf7 78:bootloader.c **** }; 79:bootloader.c **** 80:bootloader.c **** uint8_t nak_msg[6] = { 81:bootloader.c **** 0xf0, 0x00, 0x13, 0x37, CMD_DATA_BLOCK_NAK, 0xf7 82:bootloader.c **** }; 83:bootloader.c **** 84:bootloader.c **** void midi_sysex_send_ack(void) { 334 .LM14: 335 .LFBB5: 336 /* prologue: frame size=0 */ 337 /* prologue end (size=0) */ 338 0000 E0E0 ldi r30,lo8(ack_msg) 339 0002 F0E0 ldi r31,hi8(ack_msg) 340 .L24: 85:bootloader.c **** uint8_t i; 86:bootloader.c **** for (i = 0; i < sizeof(ack_msg); i++) 87:bootloader.c **** bl_uart_putc(ack_msg[i]); 342 .LM15: 343 0004 8081 ld r24,Z 344 .L25: 345 .LBB36: 346 .LBB37: 348 .LM16: 349 0006 5D9B sbis 43-0x20,5 350 0008 00C0 rjmp .L25 352 .LM17: 353 000a 8CB9 out 44-0x20,r24 354 000c 3196 adiw r30,1 355 .LBE37: 356 .LBE36: 358 .LM18: 359 000e 80E0 ldi r24,hi8(ack_msg+6) 360 0010 E030 cpi r30,lo8(ack_msg+6) 361 0012 F807 cpc r31,r24 362 0014 01F4 brne .L24 363 /* epilogue: frame size=0 */ 364 0016 0895 ret 365 /* epilogue end (size=1) */ 366 /* function midi_sysex_send_ack size 12 (11) */ 371 .Lscope5: 373 .stabd 78,0,0 374 .section .text.midi_sysex_send_nak,"ax",@progbits 376 .global midi_sysex_send_nak 378 midi_sysex_send_nak: 379 .stabd 46,0,0 88:bootloader.c **** } 89:bootloader.c **** 90:bootloader.c **** void midi_sysex_send_nak(void) { 381 .LM19: 382 .LFBB6: 383 /* prologue: frame size=0 */ 384 /* prologue end (size=0) */ 385 0000 E0E0 ldi r30,lo8(nak_msg) 386 0002 F0E0 ldi r31,hi8(nak_msg) 387 .L34: 91:bootloader.c **** uint8_t i; 92:bootloader.c **** for (i = 0; i < sizeof(nak_msg); i++) 93:bootloader.c **** bl_uart_putc(nak_msg[i]); 389 .LM20: 390 0004 8081 ld r24,Z 391 .L35: 392 .LBB38: 393 .LBB39: 395 .LM21: 396 0006 5D9B sbis 43-0x20,5 397 0008 00C0 rjmp .L35 399 .LM22: 400 000a 8CB9 out 44-0x20,r24 401 000c 3196 adiw r30,1 402 .LBE39: 403 .LBE38: 405 .LM23: 406 000e 80E0 ldi r24,hi8(nak_msg+6) 407 0010 E030 cpi r30,lo8(nak_msg+6) 408 0012 F807 cpc r31,r24 409 0014 01F4 brne .L34 410 /* epilogue: frame size=0 */ 411 0016 0895 ret 412 /* epilogue end (size=1) */ 413 /* function midi_sysex_send_nak size 12 (11) */ 418 .Lscope6: 420 .stabd 78,0,0 421 .section .text.jump_to_main_program,"ax",@progbits 423 .global jump_to_main_program 425 jump_to_main_program: 426 .stabd 46,0,0 94:bootloader.c **** } 95:bootloader.c **** 96:bootloader.c **** uint8_t jump_to_main_program(void) { 428 .LM24: 429 .LFBB7: 430 /* prologue: frame size=0 */ 431 /* prologue end (size=0) */ 97:bootloader.c **** if (check_firmware_checksum()) { 433 .LM25: 434 0000 00D0 rcall check_firmware_checksum 435 0002 8823 tst r24 436 0004 01F4 brne .L44 438 .LM26: 439 0006 80E0 ldi r24,lo8(0) 440 0008 90E0 ldi r25,hi8(0) 441 000a 0895 ret 442 .L44: 98:bootloader.c **** jump_to_app(); 444 .LM27: 445 000c E091 0000 lds r30,jump_to_app 446 0010 F091 0000 lds r31,(jump_to_app)+1 447 0014 0995 icall 448 0016 81E0 ldi r24,lo8(1) 449 0018 90E0 ldi r25,hi8(1) 99:bootloader.c **** return 1; 100:bootloader.c **** } else { 101:bootloader.c **** return 0; 102:bootloader.c **** } 103:bootloader.c **** } 451 .LM28: 452 001a 0895 ret 453 /* epilogue: frame size=0 */ 454 /* epilogue: noreturn */ 455 /* epilogue end (size=0) */ 456 /* function jump_to_main_program size 14 (14) */ 458 .Lscope7: 460 .stabd 78,0,0 461 .section .text.make_word,"ax",@progbits 465 .global make_word 467 make_word: 468 .stabd 46,0,0 104:bootloader.c **** 105:bootloader.c **** uint8_t block_cnt = 0; 106:bootloader.c **** uint8_t sysex_data[64]; 107:bootloader.c **** 108:bootloader.c **** uint8_t data[100]; 109:bootloader.c **** uint8_t sysex_cnt; 110:bootloader.c **** uint8_t in_sysex= 0; 111:bootloader.c **** 112:bootloader.c **** uint16_t make_word(uint8_t idx, uint8_t cnt) { 470 .LM29: 471 .LFBB8: 472 /* prologue: frame size=0 */ 473 /* prologue end (size=0) */ 474 0000 782F mov r23,r24 113:bootloader.c **** uint8_t ptr = idx + cnt - 1; 476 .LM30: 477 0002 7150 subi r23,lo8(-(-1)) 478 0004 670F add r22,r23 479 0006 7F5F subi r23,lo8(-(1)) 480 0008 20E0 ldi r18,lo8(0) 481 000a 30E0 ldi r19,hi8(0) 482 000c 40E0 ldi r20,hlo8(0) 483 000e 50E0 ldi r21,hhi8(0) 484 0010 00C0 rjmp .L49 485 .L50: 114:bootloader.c **** uint32_t ret = 0; 115:bootloader.c **** for (; ptr >= idx; ptr--) { 116:bootloader.c **** ret <<= 7; 487 .LM31: 488 0012 DA01 movw r26,r20 489 0014 C901 movw r24,r18 490 0016 27E0 ldi r18,7 491 0018 880F 1: lsl r24 492 001a 991F rol r25 493 001c AA1F rol r26 494 001e BB1F rol r27 495 0020 2A95 dec r18 496 0022 01F4 brne 1b 117:bootloader.c **** ret |= data[ptr]; 498 .LM32: 499 0024 E62F mov r30,r22 500 0026 FF27 clr r31 501 0028 E050 subi r30,lo8(-(data)) 502 002a F040 sbci r31,hi8(-(data)) 503 002c 2081 ld r18,Z 504 002e 3327 clr r19 505 0030 4427 clr r20 506 0032 5527 clr r21 507 0034 282B or r18,r24 508 0036 392B or r19,r25 509 0038 4A2B or r20,r26 510 003a 5B2B or r21,r27 512 .LM33: 513 003c 6150 subi r22,lo8(-(-1)) 514 .L49: 515 003e 6717 cp r22,r23 516 0040 00F4 brsh .L50 118:bootloader.c **** } 119:bootloader.c **** return ret; 120:bootloader.c **** } 518 .LM34: 519 0042 C901 movw r24,r18 520 /* epilogue: frame size=0 */ 521 0044 0895 ret 522 /* epilogue end (size=1) */ 523 /* function make_word size 35 (34) */ 529 .Lscope8: 531 .stabd 78,0,0 532 .section .text.write_checksum,"ax",@progbits 534 .global write_checksum 536 write_checksum: 537 .stabd 46,0,0 121:bootloader.c **** 122:bootloader.c **** uint8_t write_checksum(void) { 539 .LM35: 540 .LFBB9: 541 /* prologue: frame size=0 */ 542 /* prologue end (size=0) */ 123:bootloader.c **** uint16_t len = make_word(4, 3); 544 .LM36: 545 0000 63E0 ldi r22,lo8(3) 546 0002 84E0 ldi r24,lo8(4) 547 0004 00D0 rcall make_word 124:bootloader.c **** uint16_t checksum = data[7] | (data[8] << 7); 549 .LM37: 550 0006 4091 0000 lds r20,data+8 551 000a 5527 clr r21 552 000c 5695 lsr r21 553 000e 542F mov r21,r20 554 0010 4427 clr r20 555 0012 5795 ror r21 556 0014 4795 ror r20 557 0016 2091 0000 lds r18,data+7 558 001a 3327 clr r19 559 001c 422B or r20,r18 560 001e 532B or r21,r19 561 .LBB40: 562 .LBB41: 563 .LBB42: 564 .LBB43: 566 .Ltext5: 568 .LM38: 569 0020 A0E0 ldi r26,lo8(0) 570 0022 B0E0 ldi r27,hi8(0) 571 /* #APP */ 572 0024 0C01 movw __tmp_reg__,r24 573 0026 00D0 rcall __eeprom_write_word_1C1D1E 574 575 /* #NOAPP */ 576 .LBE43: 577 .LBE42: 578 .LBB44: 579 .LBB45: 580 0028 A2E0 ldi r26,lo8(2) 581 002a B0E0 ldi r27,hi8(2) 582 /* #APP */ 583 002c 0A01 movw __tmp_reg__,r20 584 002e 00D0 rcall __eeprom_write_word_1C1D1E 585 586 /* #NOAPP */ 587 .LBE45: 588 .LBE44: 589 .LBB46: 590 .LBB47: 591 0030 81E0 ldi r24,lo8(1) 592 0032 90E0 ldi r25,hi8(1) 593 0034 A4E0 ldi r26,lo8(4) 594 0036 B0E0 ldi r27,hi8(4) 595 /* #APP */ 596 0038 0C01 movw __tmp_reg__,r24 597 003a 00D0 rcall __eeprom_write_word_1C1D1E 598 599 /* #NOAPP */ 600 .LBE47: 601 .LBE46: 602 .LBE41: 603 .LBE40: 604 /* epilogue: frame size=0 */ 605 003c 0895 ret 606 /* epilogue end (size=1) */ 607 /* function write_checksum size 43 (42) */ 618 .Lscope9: 620 .stabd 78,0,0 621 .section .text.write_block,"ax",@progbits 623 .global write_block 625 write_block: 626 .stabd 46,0,0 628 .Ltext6: 125:bootloader.c **** write_firmware_checksum(len, checksum); 126:bootloader.c **** return 1; 127:bootloader.c **** } 128:bootloader.c **** 129:bootloader.c **** uint8_t write_block(void) { 630 .LM39: 631 .LFBB10: 632 /* prologue: frame size=0 */ 633 0000 EF92 push r14 634 0002 FF92 push r15 635 0004 0F93 push r16 636 0006 1F93 push r17 637 0008 CF93 push r28 638 000a DF93 push r29 639 /* prologue end (size=6) */ 130:bootloader.c **** 131:bootloader.c **** uint8_t checksum = 0; 132:bootloader.c **** uint8_t i; 133:bootloader.c **** for (i = 3; i < sysex_cnt - 1; i++) { 641 .LM40: 642 000c 8091 0000 lds r24,sysex_cnt 643 0010 282F mov r18,r24 644 0012 3327 clr r19 645 0014 2150 subi r18,lo8(-(-1)) 646 0016 3040 sbci r19,hi8(-(-1)) 647 0018 FF24 clr r15 648 001a 93E0 ldi r25,lo8(3) 649 001c 00C0 rjmp .L56 650 .L57: 134:bootloader.c **** checksum ^= data[i]; 652 .LM41: 653 001e E050 subi r30,lo8(-(data)) 654 0020 F040 sbci r31,hi8(-(data)) 655 0022 8081 ld r24,Z 656 0024 F826 eor r15,r24 658 .LM42: 659 0026 9F5F subi r25,lo8(-(1)) 660 .L56: 661 0028 E92F mov r30,r25 662 002a FF27 clr r31 663 002c E217 cp r30,r18 664 002e F307 cpc r31,r19 665 0030 04F0 brlt .L57 135:bootloader.c **** } 136:bootloader.c **** 137:bootloader.c **** uint8_t length = data[4]; 667 .LM43: 668 0032 E090 0000 lds r14,data+4 138:bootloader.c **** uint16_t sysex_address = make_word(5, 4); 670 .LM44: 671 0036 64E0 ldi r22,lo8(4) 672 0038 85E0 ldi r24,lo8(5) 673 003a 00D0 rcall make_word 674 003c 8C01 movw r16,r24 139:bootloader.c **** 140:bootloader.c **** if (sysex_address >= APP_END) { 676 .LM45: 677 003e 88E1 ldi r24,hi8(6144) 678 0040 0030 cpi r16,lo8(6144) 679 0042 1807 cpc r17,r24 680 0044 00F0 brlo .+2 681 0046 00C0 rjmp .L59 141:bootloader.c **** return 0; 142:bootloader.c **** } 143:bootloader.c **** 144:bootloader.c **** uint8_t cnt = 0, recvd = 0; 145:bootloader.c **** uint8_t bits = 0; 146:bootloader.c **** for (cnt = 0; cnt < (sysex_cnt - 9); cnt++) { 683 .LM46: 684 0048 8091 0000 lds r24,sysex_cnt 685 004c A82F mov r26,r24 686 004e BB27 clr r27 687 0050 BD01 movw r22,r26 688 0052 6950 subi r22,lo8(-(-9)) 689 0054 7040 sbci r23,hi8(-(-9)) 690 0056 50E0 ldi r21,lo8(0) 691 0058 40E0 ldi r20,lo8(0) 692 005a 20E0 ldi r18,lo8(0) 693 005c 30E0 ldi r19,hi8(0) 694 005e 00C0 rjmp .L61 695 .L62: 696 0060 EC01 movw r28,r24 697 0062 C050 subi r28,lo8(-(data)) 698 0064 D040 sbci r29,hi8(-(data)) 699 0066 8770 andi r24,lo8(7) 700 0068 9070 andi r25,hi8(7) 147:bootloader.c **** if ((cnt % 8) == 0) { 702 .LM47: 703 006a 892B or r24,r25 704 006c 01F4 brne .L63 148:bootloader.c **** bits = data[9 + cnt]; 706 .LM48: 707 006e 4985 ldd r20,Y+9 708 0070 00C0 rjmp .L65 709 .L63: 149:bootloader.c **** } else { 150:bootloader.c **** sysex_data[recvd++] = data[9 + cnt] | ((bits & 1) << 7); 711 .LM49: 712 0072 E52F mov r30,r21 713 0074 FF27 clr r31 714 0076 E050 subi r30,lo8(-(sysex_data)) 715 0078 F040 sbci r31,hi8(-(sysex_data)) 716 007a 842F mov r24,r20 717 007c 8795 ror r24 718 007e 8827 clr r24 719 0080 8795 ror r24 720 0082 9985 ldd r25,Y+9 721 0084 892B or r24,r25 722 0086 8083 st Z,r24 723 0088 5F5F subi r21,lo8(-(1)) 151:bootloader.c **** bits >>= 1; 725 .LM50: 726 008a 4695 lsr r20 727 .L65: 728 008c 2F5F subi r18,lo8(-(1)) 729 008e 3F4F sbci r19,hi8(-(1)) 152:bootloader.c **** } 153:bootloader.c **** if (recvd >= length) 731 .LM51: 732 0090 5E15 cp r21,r14 733 0092 00F4 brsh .L66 734 .L61: 736 .LM52: 737 0094 822F mov r24,r18 738 0096 9927 clr r25 739 0098 8617 cp r24,r22 740 009a 9707 cpc r25,r23 741 009c 04F0 brlt .L62 742 .L66: 154:bootloader.c **** break; 155:bootloader.c **** } 156:bootloader.c **** 157:bootloader.c **** uint8_t check = data[sysex_cnt - 1]; 158:bootloader.c **** checksum &= 0x7f; 159:bootloader.c **** 160:bootloader.c **** if ((checksum != check) || (recvd != 64)) { 744 .LM53: 745 009e EFE7 ldi r30,lo8(127) 746 00a0 FE22 and r15,r30 747 00a2 A050 subi r26,lo8(-(data-1)) 748 00a4 B040 sbci r27,hi8(-(data-1)) 749 00a6 8C91 ld r24,X 750 00a8 F816 cp r15,r24 751 00aa 01F0 breq .+2 752 00ac 00C0 rjmp .L59 753 00ae 5034 cpi r21,lo8(64) 754 00b0 01F0 breq .+2 755 00b2 00C0 rjmp .L59 161:bootloader.c **** return 0; 162:bootloader.c **** } 163:bootloader.c **** 164:bootloader.c **** uint8_t sreg = SREG; 757 .LM54: 758 00b4 9FB7 in r25,95-0x20 165:bootloader.c **** cli(); 760 .LM55: 761 /* #APP */ 762 00b6 F894 cli 166:bootloader.c **** boot_page_erase(sysex_address); 764 .LM56: 765 /* #NOAPP */ 766 00b8 83E0 ldi r24,lo8(3) 767 /* #APP */ 768 00ba F801 movw r30, r16 769 00bc 8093 5700 sts 87, r24 770 00c0 E895 spm 771 772 /* #NOAPP */ 773 .L69: 167:bootloader.c **** boot_spm_busy_wait(); 775 .LM57: 776 00c2 07B6 in __tmp_reg__,87-0x20 777 00c4 00FC sbrc __tmp_reg__,0 778 00c6 00C0 rjmp .L69 779 00c8 A0E0 ldi r26,lo8(sysex_data) 780 00ca B0E0 ldi r27,hi8(sysex_data) 781 00cc B801 movw r22,r16 782 .L71: 783 .LBB48: 168:bootloader.c **** uint16_t address = sysex_address; 169:bootloader.c **** for (i = 0; i < 64; i+=2) { 170:bootloader.c **** uint16_t tmp = sysex_data[i] | (sysex_data[i + 1] << 8); 171:bootloader.c **** boot_page_fill(address, tmp); 785 .LM58: 786 00ce 81E0 ldi r24,lo8(1) 787 00d0 FD01 movw r30,r26 788 00d2 2181 ldd r18,Z+1 789 00d4 3327 clr r19 790 00d6 322F mov r19,r18 791 00d8 2227 clr r18 792 00da 4C91 ld r20,X 793 00dc 5527 clr r21 794 00de 242B or r18,r20 795 00e0 352B or r19,r21 796 /* #APP */ 797 00e2 0901 movw r0, r18 798 00e4 FB01 movw r30, r22 799 00e6 8093 5700 sts 87, r24 800 00ea E895 spm 801 00ec 1124 clr r1 802 172:bootloader.c **** address += 2; 804 .LM59: 805 /* #NOAPP */ 806 00ee 6E5F subi r22,lo8(-(2)) 807 00f0 7F4F sbci r23,hi8(-(2)) 808 00f2 1296 adiw r26,2 809 .LBE48: 811 .LM60: 812 00f4 F0E0 ldi r31,hi8(sysex_data+64) 813 00f6 A030 cpi r26,lo8(sysex_data+64) 814 00f8 BF07 cpc r27,r31 815 00fa 01F4 brne .L71 173:bootloader.c **** } 174:bootloader.c **** boot_page_write(sysex_address); 817 .LM61: 818 00fc 85E0 ldi r24,lo8(5) 819 /* #APP */ 820 00fe F801 movw r30, r16 821 0100 8093 5700 sts 87, r24 822 0104 E895 spm 823 824 /* #NOAPP */ 825 .L73: 175:bootloader.c **** boot_spm_busy_wait(); 827 .LM62: 828 0106 07B6 in __tmp_reg__,87-0x20 829 0108 00FC sbrc __tmp_reg__,0 830 010a 00C0 rjmp .L73 176:bootloader.c **** boot_rww_enable(); 832 .LM63: 833 010c 81E1 ldi r24,lo8(17) 834 /* #APP */ 835 010e 8093 5700 sts 87, r24 836 0112 E895 spm 837 177:bootloader.c **** SREG = sreg; 839 .LM64: 840 /* #NOAPP */ 841 0114 9FBF out 95-0x20,r25 842 0116 81E0 ldi r24,lo8(1) 843 0118 90E0 ldi r25,hi8(1) 844 011a 00C0 rjmp .L75 845 .L59: 178:bootloader.c **** 179:bootloader.c **** return 1; 847 .LM65: 848 011c 80E0 ldi r24,lo8(0) 849 011e 90E0 ldi r25,hi8(0) 850 .L75: 851 /* epilogue: frame size=0 */ 852 0120 E6E0 ldi r30,6 853 0122 CDB7 in r28,__SP_L__ 854 0124 DEB7 in r29,__SP_H__ 855 0126 00C0 rjmp __epilogue_restores__+24 856 /* epilogue end (size=4) */ 857 /* function write_block size 166 (156) */ 869 .Lscope10: 871 .stabd 78,0,0 872 .section .text.handle_sysex,"ax",@progbits 874 .global handle_sysex 876 handle_sysex: 877 .stabd 46,0,0 180:bootloader.c **** } 181:bootloader.c **** 182:bootloader.c **** void handle_sysex(void) { 879 .LM66: 880 .LFBB11: 881 /* prologue: frame size=0 */ 882 /* prologue end (size=0) */ 183:bootloader.c **** uint8_t res = 0; 184:bootloader.c **** if (sysex_cnt < 4) { 884 .LM67: 885 0000 9091 0000 lds r25,sysex_cnt 886 0004 9430 cpi r25,lo8(4) 887 0006 00F0 brlo .L96 185:bootloader.c **** return; 186:bootloader.c **** } else { 187:bootloader.c **** if (data[3] == CMD_START_BOOTLOADER) { 889 .LM68: 890 0008 8091 0000 lds r24,data+3 891 000c 8530 cpi r24,lo8(5) 892 000e 01F0 breq .L86 188:bootloader.c **** res = 1; 189:bootloader.c **** } else if (data[3] == CMD_MAIN_PROGRAM) { 894 .LM69: 895 0010 8430 cpi r24,lo8(4) 896 0012 01F4 brne .L88 190:bootloader.c **** res = jump_to_main_program(); 898 .LM70: 899 0014 00D0 rcall jump_to_main_program 900 0016 00C0 rjmp .L90 901 .L88: 191:bootloader.c **** } else if (data[3] == CMD_BOOT_DATA_BLOCK) { 903 .LM71: 904 0018 8130 cpi r24,lo8(1) 905 001a 01F4 brne .L91 192:bootloader.c **** res = write_block(); 907 .LM72: 908 001c 00D0 rcall write_block 909 001e 00C0 rjmp .L90 910 .L91: 193:bootloader.c **** } else if (data[3] == CMD_FIRMWARE_CHECKSUM && sysex_cnt == 9) { 912 .LM73: 913 0020 8330 cpi r24,lo8(3) 914 0022 01F4 brne .L93 915 0024 9930 cpi r25,lo8(9) 916 0026 01F4 brne .L93 194:bootloader.c **** res = write_checksum(); 918 .LM74: 919 0028 00D0 rcall write_checksum 920 .L90: 195:bootloader.c **** } 196:bootloader.c **** 197:bootloader.c **** if (res) 922 .LM75: 923 002a 8823 tst r24 924 002c 01F0 breq .L93 925 .L86: 198:bootloader.c **** midi_sysex_send_ack(); 927 .LM76: 928 002e 00D0 rcall midi_sysex_send_ack 929 0030 0895 ret 930 .L93: 199:bootloader.c **** else 200:bootloader.c **** midi_sysex_send_nak(); 932 .LM77: 933 0032 00D0 rcall midi_sysex_send_nak 934 .L96: 935 0034 0895 ret 936 /* epilogue: frame size=0 */ 937 /* epilogue: noreturn */ 938 /* epilogue end (size=0) */ 939 /* function handle_sysex size 27 (27) */ 944 .Lscope11: 946 .stabd 78,0,0 947 .section .text.handle_midi,"ax",@progbits 950 .global handle_midi 952 handle_midi: 953 .stabd 46,0,0 201:bootloader.c **** } 202:bootloader.c **** } 203:bootloader.c **** 204:bootloader.c **** void handle_midi(uint8_t c) { 955 .LM78: 956 .LFBB12: 957 /* prologue: frame size=0 */ 958 /* prologue end (size=0) */ 959 0000 982F mov r25,r24 205:bootloader.c **** if (c == 0xF0) { 961 .LM79: 962 0002 803F cpi r24,lo8(-16) 963 0004 01F4 brne .L98 206:bootloader.c **** if (in_sysex == 1) { 965 .LM80: 966 0006 8091 0000 lds r24,in_sysex 967 000a 8130 cpi r24,lo8(1) 968 000c 01F4 brne .L100 207:bootloader.c **** handle_sysex(); 970 .LM81: 971 000e 00D0 rcall handle_sysex 972 .L100: 208:bootloader.c **** } 209:bootloader.c **** sysex_cnt = 0; 974 .LM82: 975 0010 1092 0000 sts sysex_cnt,__zero_reg__ 210:bootloader.c **** in_sysex = 1; 977 .LM83: 978 0014 81E0 ldi r24,lo8(1) 979 0016 8093 0000 sts in_sysex,r24 980 001a 0895 ret 981 .L98: 211:bootloader.c **** return; 212:bootloader.c **** } else if (c == 0xF7) { 983 .LM84: 984 001c 873F cpi r24,lo8(-9) 985 001e 01F4 brne .L103 213:bootloader.c **** if (in_sysex == 1) { 987 .LM85: 988 0020 8091 0000 lds r24,in_sysex 989 0024 8130 cpi r24,lo8(1) 990 0026 01F4 brne .L117 214:bootloader.c **** handle_sysex(); 992 .LM86: 993 0028 00D0 rcall handle_sysex 994 002a 00C0 rjmp .L117 995 .L103: 215:bootloader.c **** } 216:bootloader.c **** in_sysex = 0; 217:bootloader.c **** return; 218:bootloader.c **** } else if (MIDI_IS_STATUS_BYTE(c)) { 997 .LM87: 998 002c 87FF sbrs r24,7 999 002e 00C0 rjmp .L107 1000 .L117: 219:bootloader.c **** in_sysex = 0; 1002 .LM88: 1003 0030 1092 0000 sts in_sysex,__zero_reg__ 1004 0034 0895 ret 1005 .L107: 220:bootloader.c **** return; 221:bootloader.c **** } 222:bootloader.c **** 223:bootloader.c **** if (in_sysex) { 1007 .LM89: 1008 0036 8091 0000 lds r24,in_sysex 1009 003a 8823 tst r24 1010 003c 01F0 breq .L116 224:bootloader.c **** data[sysex_cnt++] = c; 1012 .LM90: 1013 003e 8091 0000 lds r24,sysex_cnt 1014 0042 E82F mov r30,r24 1015 0044 FF27 clr r31 1016 0046 E050 subi r30,lo8(-(data)) 1017 0048 F040 sbci r31,hi8(-(data)) 1018 004a 9083 st Z,r25 1019 004c 982F mov r25,r24 1020 004e 9F5F subi r25,lo8(-(1)) 1021 0050 9093 0000 sts sysex_cnt,r25 225:bootloader.c **** if (sysex_cnt >= 3) { 1023 .LM91: 1024 0054 9330 cpi r25,lo8(3) 1025 0056 00F0 brlo .L110 226:bootloader.c **** if (data[0] != SYSEX_VENDOR_1 || 1027 .LM92: 1028 0058 8091 0000 lds r24,data 1029 005c 8823 tst r24 1030 005e 01F4 brne .L112 1031 0060 8091 0000 lds r24,data+1 1032 0064 8331 cpi r24,lo8(19) 1033 0066 01F4 brne .L112 1034 0068 8091 0000 lds r24,data+2 1035 006c 8733 cpi r24,lo8(55) 1036 006e 01F0 breq .L110 1037 .L112: 227:bootloader.c **** data[1] != SYSEX_VENDOR_2 || 228:bootloader.c **** data[2] != SYSEX_VENDOR_3) { 229:bootloader.c **** in_sysex = 0; 1039 .LM93: 1040 0070 1092 0000 sts in_sysex,__zero_reg__ 1041 .L110: 230:bootloader.c **** } 231:bootloader.c **** } 232:bootloader.c **** if (sysex_cnt > 100) { 1043 .LM94: 1044 0074 9536 cpi r25,lo8(101) 1045 0076 00F0 brlo .L116 233:bootloader.c **** /* discard too long message */ 234:bootloader.c **** in_sysex = 0; 1047 .LM95: 1048 0078 1092 0000 sts in_sysex,__zero_reg__ 1049 .L116: 1050 007c 0895 ret 1051 /* epilogue: frame size=0 */ 1052 /* epilogue: noreturn */ 1053 /* epilogue end (size=0) */ 1054 /* function handle_midi size 63 (63) */ 1056 .Lscope12: 1058 .stabd 78,0,0 1059 .section .text.main,"ax",@progbits 1061 .global main 1063 main: 1064 .stabd 46,0,0 235:bootloader.c **** } 236:bootloader.c **** } 237:bootloader.c **** } 238:bootloader.c **** 239:bootloader.c **** int main() { 1066 .LM96: 1067 .LFBB13: 1068 /* prologue: frame size=0 */ 1069 0000 C0E0 ldi r28,lo8(__stack - 0) 1070 0002 D0E0 ldi r29,hi8(__stack - 0) 1071 0004 DEBF out __SP_H__,r29 1072 0006 CDBF out __SP_L__,r28 1073 /* prologue end (size=4) */ 240:bootloader.c **** wdt_disable(); 1075 .LM97: 1076 0008 98E1 ldi r25,lo8(24) 1077 /* #APP */ 1078 000a 0FB6 in __tmp_reg__, __SREG__ 1079 000c F894 cli 1080 000e 91BD out 33, r25 1081 0010 11BC out 33, __zero_reg__ 1082 0012 0FBE out __SREG__,__tmp_reg__ 1083 241:bootloader.c **** 242:bootloader.c **** /* move interrupts to bootloader section */ 243:bootloader.c **** GICR = _BV(IVCE) | _BV(IVSEL); 1085 .LM98: 1086 /* #NOAPP */ 1087 0014 83E0 ldi r24,lo8(3) 1088 0016 8BBF out 91-0x20,r24 244:bootloader.c **** 245:bootloader.c **** SET_BIT8(PORTB, PB4); 1090 .LM99: 1091 0018 C49A sbi 56-0x20,4 246:bootloader.c **** SET_BIT8(DDRB, PB0); 1093 .LM100: 1094 001a B89A sbi 55-0x20,0 247:bootloader.c **** 248:bootloader.c **** /* init uart */ 249:bootloader.c **** UBRRH = (UART_BAUDRATE_REG >> 8); 1096 .LM101: 1097 001c 10BC out 64-0x20,__zero_reg__ 250:bootloader.c **** UBRRL = (UART_BAUDRATE_REG & 0xFF); 1099 .LM102: 1100 001e 8FE1 ldi r24,lo8(31) 1101 0020 89B9 out 41-0x20,r24 251:bootloader.c **** 252:bootloader.c **** /** 8 bit, no parity **/ 253:bootloader.c **** UCSRC = _BV(UCSZ0) | _BV(UCSZ1) | _BV(URSEL); 1103 .LM103: 1104 0022 86E8 ldi r24,lo8(-122) 1105 0024 80BD out 64-0x20,r24 254:bootloader.c **** UCSRB = _BV(RXEN) | _BV(TXEN); 1107 .LM104: 1108 0026 9AB9 out 42-0x20,r25 255:bootloader.c **** 256:bootloader.c **** midi_sysex_send_ack(); 1110 .LM105: 1111 0028 00D0 rcall midi_sysex_send_ack 1112 .LBB60: 1113 .LBB61: 1115 .Ltext7: 1117 .LM106: 1118 002a A4E0 ldi r26,lo8(4) 1119 002c B0E0 ldi r27,hi8(4) 1120 /* #APP */ 1121 002e 00D0 rcall __eeprom_read_word_1C1D1E 1122 1123 /* #NOAPP */ 1124 .LBE61: 1125 .LBE60: 1127 .Ltext8: 257:bootloader.c **** 258:bootloader.c **** if (eeprom_read_word(START_MAIN_APP_ADDR) == 1 && IS_BIT_SET8(PINB, PB4)) { 1129 .LM107: 1130 0030 3197 sbiw r30,1 1131 0032 01F4 brne .L119 1133 .LM108: 1134 0034 B49B sbis 54-0x20,4 1135 0036 00C0 rjmp .L119 1136 .L136: 1137 .LBB62: 1138 .LBB63: 1140 .LM109: 1141 0038 5D9B sbis 43-0x20,5 1142 003a 00C0 rjmp .L136 1144 .LM110: 1145 003c 80E9 ldi r24,lo8(-112) 1146 003e 8CB9 out 44-0x20,r24 1147 .L123: 1148 .LBE63: 1149 .LBE62: 1150 .LBB64: 1151 .LBB65: 1153 .LM111: 1154 0040 5D9B sbis 43-0x20,5 1155 0042 00C0 rjmp .L123 1157 .LM112: 1158 0044 81E0 ldi r24,lo8(1) 1159 0046 8CB9 out 44-0x20,r24 1160 .L125: 1161 .LBE65: 1162 .LBE64: 1163 .LBB66: 1164 .LBB67: 1166 .LM113: 1167 0048 5D9B sbis 43-0x20,5 1168 004a 00C0 rjmp .L125 1170 .LM114: 1171 004c 81E0 ldi r24,lo8(1) 1172 004e 8CB9 out 44-0x20,r24 1173 .LBE67: 1174 .LBE66: 259:bootloader.c **** bl_uart_putc(0x90); 260:bootloader.c **** bl_uart_putc(0x1); 261:bootloader.c **** bl_uart_putc(0x1); 262:bootloader.c **** jump_to_main_program(); 1176 .LM115: 1177 0050 00D0 rcall jump_to_main_program 1178 .L119: 263:bootloader.c **** } 264:bootloader.c **** 265:bootloader.c **** midi_sysex_send_ack(); 1180 .LM116: 1181 0052 00D0 rcall midi_sysex_send_ack 1182 0054 10E0 ldi r17,lo8(0) 1183 .L148: 266:bootloader.c **** 267:bootloader.c **** uint8_t button = 0; 268:bootloader.c **** for (;;) { 269:bootloader.c **** if (!IS_BIT_SET8(PINB, PB4)) { 1185 .LM117: 1186 0056 B499 sbic 54-0x20,4 1187 0058 00C0 rjmp .L128 1188 005a 11E0 ldi r17,lo8(1) 1189 005c 00C0 rjmp .L130 1190 .L128: 270:bootloader.c **** button = 1; 271:bootloader.c **** } else { 272:bootloader.c **** if (button) { 1192 .LM118: 1193 005e 1111 cpse r17,__zero_reg__ 273:bootloader.c **** jump_to_main_program(); 1195 .LM119: 1196 0060 00D0 rcall jump_to_main_program 1197 .L130: 274:bootloader.c **** } 275:bootloader.c **** } 276:bootloader.c **** 277:bootloader.c **** if (UART_CHECK_RX()) { 1199 .LM120: 1200 0062 5F9B sbis 43-0x20,7 1201 0064 00C0 rjmp .L148 1202 .L137: 1203 .LBB68: 1204 .LBB69: 1205 .LBB70: 1207 .LM121: 1208 0066 5F9B sbis 43-0x20,7 1209 0068 00C0 rjmp .L137 1211 .LM122: 1212 006a 8CB1 in r24,44-0x20 1213 .LBE70: 1214 .LBE69: 278:bootloader.c **** uint8_t c = bl_uart_getc(); 279:bootloader.c **** handle_midi(c); 1216 .LM123: 1217 006c 00D0 rcall handle_midi 1218 006e 00C0 rjmp .L148 1219 .LBE68: 1220 /* epilogue: frame size=0 */ 1221 /* epilogue: noreturn */ 1222 /* epilogue end (size=0) */ 1223 /* function main size 68 (64) */ 1234 .Lscope13: 1236 .stabd 78,0,0 1237 .global jump_to_app 1238 .global jump_to_app 1239 .section .bss 1242 jump_to_app: 1243 0000 0000 .skip 2,0 1244 .global ack_msg 1245 .data 1248 ack_msg: 1249 0000 F0 .byte -16 1250 0001 00 .byte 0 1251 0002 13 .byte 19 1252 0003 37 .byte 55 1253 0004 02 .byte 2 1254 0005 F7 .byte -9 1255 .global nak_msg 1258 nak_msg: 1259 0006 F0 .byte -16 1260 0007 00 .byte 0 1261 0008 13 .byte 19 1262 0009 37 .byte 55 1263 000a 10 .byte 16 1264 000b F7 .byte -9 1265 .global block_cnt 1266 .global block_cnt 1267 .section .bss 1270 block_cnt: 1271 0002 00 .skip 1,0 1272 .global in_sysex 1273 .global in_sysex 1276 in_sysex: 1277 0003 00 .skip 1,0 1278 .comm sysex_data,64,1 1279 .comm data,100,1 1280 .comm sysex_cnt,1,1 1289 .text 1291 .Letext0: 1292 /* File "bootloader.c": code 515 = 0x0203 ( 494), prologues 10, epilogues 11 */ DEFINED SYMBOLS *ABS*:00000000 bootloader.c /var/folders/eo/eop-onwFGDSiJMlyO76MH++++TI/-Tmp-//ccV9OBJI.s:2 *ABS*:0000003f __SREG__ /var/folders/eo/eop-onwFGDSiJMlyO76MH++++TI/-Tmp-//ccV9OBJI.s:3 *ABS*:0000003e __SP_H__ /var/folders/eo/eop-onwFGDSiJMlyO76MH++++TI/-Tmp-//ccV9OBJI.s:4 *ABS*:0000003d __SP_L__ /var/folders/eo/eop-onwFGDSiJMlyO76MH++++TI/-Tmp-//ccV9OBJI.s:5 *ABS*:00000000 __tmp_reg__ /var/folders/eo/eop-onwFGDSiJMlyO76MH++++TI/-Tmp-//ccV9OBJI.s:6 *ABS*:00000001 __zero_reg__ /var/folders/eo/eop-onwFGDSiJMlyO76MH++++TI/-Tmp-//ccV9OBJI.s:105 .text.check_firmware_checksum:00000000 check_firmware_checksum /var/folders/eo/eop-onwFGDSiJMlyO76MH++++TI/-Tmp-//ccV9OBJI.s:204 .text.write_firmware_checksum:00000000 write_firmware_checksum /var/folders/eo/eop-onwFGDSiJMlyO76MH++++TI/-Tmp-//ccV9OBJI.s:271 .text.bl_uart_getc:00000000 bl_uart_getc /var/folders/eo/eop-onwFGDSiJMlyO76MH++++TI/-Tmp-//ccV9OBJI.s:304 .text.bl_uart_putc:00000000 bl_uart_putc /var/folders/eo/eop-onwFGDSiJMlyO76MH++++TI/-Tmp-//ccV9OBJI.s:331 .text.midi_sysex_send_ack:00000000 midi_sysex_send_ack /var/folders/eo/eop-onwFGDSiJMlyO76MH++++TI/-Tmp-//ccV9OBJI.s:1248 .data:00000000 ack_msg /var/folders/eo/eop-onwFGDSiJMlyO76MH++++TI/-Tmp-//ccV9OBJI.s:378 .text.midi_sysex_send_nak:00000000 midi_sysex_send_nak /var/folders/eo/eop-onwFGDSiJMlyO76MH++++TI/-Tmp-//ccV9OBJI.s:1258 .data:00000006 nak_msg /var/folders/eo/eop-onwFGDSiJMlyO76MH++++TI/-Tmp-//ccV9OBJI.s:425 .text.jump_to_main_program:00000000 jump_to_main_program /var/folders/eo/eop-onwFGDSiJMlyO76MH++++TI/-Tmp-//ccV9OBJI.s:1242 .bss:00000000 jump_to_app /var/folders/eo/eop-onwFGDSiJMlyO76MH++++TI/-Tmp-//ccV9OBJI.s:467 .text.make_word:00000000 make_word *COM*:00000064 data /var/folders/eo/eop-onwFGDSiJMlyO76MH++++TI/-Tmp-//ccV9OBJI.s:536 .text.write_checksum:00000000 write_checksum /var/folders/eo/eop-onwFGDSiJMlyO76MH++++TI/-Tmp-//ccV9OBJI.s:625 .text.write_block:00000000 write_block *COM*:00000001 sysex_cnt *COM*:00000040 sysex_data /var/folders/eo/eop-onwFGDSiJMlyO76MH++++TI/-Tmp-//ccV9OBJI.s:876 .text.handle_sysex:00000000 handle_sysex /var/folders/eo/eop-onwFGDSiJMlyO76MH++++TI/-Tmp-//ccV9OBJI.s:952 .text.handle_midi:00000000 handle_midi /var/folders/eo/eop-onwFGDSiJMlyO76MH++++TI/-Tmp-//ccV9OBJI.s:1276 .bss:00000003 in_sysex /var/folders/eo/eop-onwFGDSiJMlyO76MH++++TI/-Tmp-//ccV9OBJI.s:1063 .text.main:00000000 main /var/folders/eo/eop-onwFGDSiJMlyO76MH++++TI/-Tmp-//ccV9OBJI.s:1270 .bss:00000002 block_cnt UNDEFINED SYMBOLS __do_copy_data __do_clear_bss __eeprom_read_word_1C1D1E __eeprom_write_word_1C1D1E __epilogue_restores__ __stack