From: Martin P. <pi...@us...> - 2012-04-16 15:04:14
|
Update of /cvsroot/embeddedloconet/apps/Fredi/BL In directory vz-cvs-4.sog:/tmp/cvs-serv27965/apps/Fredi/BL Added Files: BootLoader.asm makefile Log Message: added bootloader to fredi --- NEW FILE: BootLoader.asm --- ;**************************************************************************** ; Copyright (C) 2006..2012 Stefan Bormann / Martin Pischky ; ; This library is free software; you can redistribute it and/or ; modify it under the terms of the GNU Lesser General Public ; License as published by the Free Software Foundation; either ; version 2.1 of the License, or (at your option) any later version. ; ; This library is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ; Lesser General Public License for more details. ; ; You should have received a copy of the GNU Lesser General Public ; License along with this library; if not, write to the Free Software ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; ;***************************************************************************** ; ; IMPORTANT: ; ; Note: The sale any LocoNet device hardware (including bare PCB's) that ; uses this or any other LocoNet software, requires testing and certification ; by Digitrax Inc. and will be subject to a licensing agreement. ; ; Please contact Digitrax Inc. for details. ; ;***************************************************************************** ; ; Title : LocoNet Bootloader root assembler file for FREDI ; Author: Stefan Bormann <ste...@gm...> ; Martin Pischky <ma...@pi...> ; Date: 5-May-2006, 5-Feb-2012, 16-Apr-2012 ; Software: Atmel Assembler 2 ; Target: AtMega ; ; DESCRIPTION ; Main module of bootstraploader. ; Using PORT C as debug output (FREDI Hardware) ; ; $Id: BootLoader.asm,v 1.1 2012/04/16 15:04:12 pischky Exp $ ; ;***************************************************************************** ; "#if MCU == atmega8" does not work so we use this little cheat #if defined(MCU_IS_atmega8) #include <m8def.inc> #elif defined(MCU_IS_atmega88) #include <m88def.inc> #elif defined(MCU_IS_atmega168) #include <m168def.inc> #elif defined(MCU_IS_atmega328p) #include <m328Pdef.inc> #else #error "unknown MCU (expected something like '-D MCU_IS_atmega8' as command line parameter)" #endif #define DEBUG ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Board definitions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; #define LN_RX_PORT PINB //FIXME: FREDI uses analog Comparator #define LN_RX_BIT PB0 //FIXME #ifndef F_CPU #define F_CPU 7372800 ; system clock frequency, needed for ; LocoNet bit timing #endif ; BOOTSTRAP_START_BYTE 0x1E00 ; reset vector = entry point of bootloader ; HARDWARE_VERSION ; the bootloader must know the version of ; the hardware it resides. On FREDI this ; is the mcu used. #if defined(__ATmega8__) #define HARDWARE_VERSION 1 #ifndef BOOTSTRAP_START_BYTE #define BOOTSTRAP_START_BYTE 0x1E00 #endif #elif defined(__ATmega88__) #define HARDWARE_VERSION 2 #ifndef BOOTSTRAP_START_BYTE ; boot section size 256 words / start address: 0x0F00 ;#define BOOTSTRAP_START_BYTE 0x1E00 ; boot section size 512 words / start address: 0x0E00 #define BOOTSTRAP_START_BYTE 0x1C00 #endif #define RESET_WATCHDOG_ON_STARTUP #elif defined(__ATmega168__) #define HARDWARE_VERSION 3 #ifndef BOOTSTRAP_START_BYTE ; boot section size 256 words / start address: 0x1F00 ;#define BOOTSTRAP_START_BYTE 0x3E00 ; boot section size 512 words / start address: 0x1E00 #define BOOTSTRAP_START_BYTE 0x3C00 #endif #define RESET_WATCHDOG_ON_STARTUP #elif defined(__ATmega328P__) #define HARDWARE_VERSION 4 #ifndef BOOTSTRAP_START_BYTE ; boot section size 256 words / start address: 0x3F00 ;#define BOOTSTRAP_START_BYTE 0x7E00 ; boot section size 512 words / start address: 0x3E00 #define BOOTSTRAP_START_BYTE 0x7C00 #endif #define RESET_WATCHDOG_ON_STARTUP #else #error "MCU unknown" #endif .include "BootloaderDef.inc" ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Debug Code ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; The debug code outputs the boot information and the page when burning ; to a digital port. This is the code for FREDI Hardware .equ DEBUG_PULL_UP = (1<<PORTC1) ; DIRSWITCH .equ LED_GREEN_R = PORTC2 .equ LED_GREEN_L = PORTC3 .equ LED_RED = PORTC4 // macro called once on init .macro DebugInit ; pins with LEDs as output: DDRC = 0x1c ; LED_GREEN_R, LED_GREEN_L, LED_RED ldi r24, (1<<DDC2) | (1<<DDC3) | (1<<DDC4) out DDRC, r24 ; enable pullup on direction switch to avoid floating, LEDs off ldi r24, (0<<LED_GREEN_R) | (0<<LED_GREEN_L) | (0<<LED_RED) | DEBUG_PULL_UP out PORTC, r24 //TODO enable more pullups //TODO configure Loconet Port AIN0, AIN1 .endmacro // output("booting to app") ; starting application .macro DebugOutputToApp ldi r24, (0<<LED_GREEN_R) | (0<<LED_GREEN_L) | (0<<LED_RED) | DEBUG_PULL_UP out PORTC, r24 .endmacro // output("app called bootloader") ; entering bootloader from application .macro DebugOutputFromApp ldi r24, (1<<LED_GREEN_R) | (1<<LED_GREEN_L) | (0<<LED_RED) | DEBUG_PULL_UP out PORTC, r24 .endmacro // output("invalid app") ; invalid application checksum found after reset .macro DebugOutputInvalid ; all LEDs on ldi r24, (1<<LED_GREEN_R) | (1<<LED_GREEN_L) | (1<<LED_RED) | DEBUG_PULL_UP out PORTC, r24 .endmacro // output(address>>6 & 0xff) ; show that we burn the flash memory .macro DebugOutputBurn ;ADDRESS_LOW:ADDRESS_HIGH just passed a page boundary //FIXME movw r24, ADDRESS_LOW ;if("pagesize 32 words") lsl r24 ; DEBUG_PORT = usPage>>6; rol r25 ;else if("pagesize 64 words") ; DEBUG_PORT = usPage>>7; .if PAGESIZE < 64 ; can't use #if here because PAGESIZE is defined with .EQU lsl r24 rol r25 .endif lsl r25 ; leds are on pin 2..4 lsl r25 com r25 ; start with all leds on andi r25, (1<<LED_GREEN_R) | (1<<LED_GREEN_L) | (1<<LED_RED) ori r25, DEBUG_PULL_UP out PORTC, r25 .endmacro ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Bootloader Code ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .include "BootloaderMessageAsm.inc" .include "BurnAsm.inc" .include "LnRxOnlySwAsm.inc" ; using bit banged LocoNet ;.include "LnRxOnlyHwUartAsm.inc" ; option: hardware UART for LocoNet .include "BootLoaderAsm.inc" ; device independant code of bootloader --- NEW FILE: makefile --- # Build Bootloader using gnu make (WINAVR) # The assembler used is Atmels AVRASM2.EXE # # The target created is for use with ../Fredi # # $Id: makefile,v 1.1 2012/04/16 15:04:12 pischky Exp $ # this parameters can be overwritten on make commandline # ------------------------------------------------------ # MANUFACTURER_ID: "NMRA DIY DCC" # overwritten on command line MANUFACTURER_ID = 13 # DEVELOPER_ID: "FREMO" # overwritten on command line DEVELOPER_ID = 1 # PRODUCT_ID: "FREDI Throttle" (Martin Pischky) # see: http://embeddedloconet.sourceforge.net/device_ids/fremo.en.html # overwritten on command line PRODUCT_ID = 11 # defined also in BootLoader.asm # overwritten on command line MCU = atmega328p # defined also in BootLoader.asm # overwritten on command line F_CPU = 7372800 # defined also in BootLoader.asm # overwritten on command line BOOTSTRAP_START_BYTE = 0x7C00 # overwritten on command line HARDWARE_VERS_TEST = 1 # ------------------------------------------------------ # name of target (set here or overwrite on command line) TARGET = BootLoader # name of source ASRC = $(TARGET).asm # output file AHEX = $(TARGET).hex # search *.inc from $(BOOTLOADER_DIR) BOOTLOADER_DIR = ../../BootLoader/Assembler vpath %.inc $(BOOTLOADER_DIR) # includes files $(ASRC) depends on INCLUDES += BootLoaderAsm.inc INCLUDES += BootLoaderDef.inc INCLUDES += BootloaderMessageAsm.inc INCLUDES += BurnAsm.inc INCLUDES += LnRxOnlyHwUartAsm.inc INCLUDES += LnRxOnlySwAsm.inc ASMFLAGS += -D MANUFACTURER_ID=$(MANUFACTURER_ID) ASMFLAGS += -D DEVELOPER_ID=$(DEVELOPER_ID) ASMFLAGS += -D PRODUCT_ID=$(PRODUCT_ID) ASMFLAGS += -D BOOTSTRAP_START_BYTE=$(BOOTSTRAP_START_BYTE) ASMFLAGS += -D HARDWARE_VERS_TEST=$(HARDWARE_VERS_TEST) ASMFLAGS += -D MCU_IS_$(MCU) ASMFLAGS += -D F_CPU=$(F_CPU) # assembler to use (AVR Studio 4 installation required) # standard installtion path is: # %ProgramFiles%\Atmel\AVR Tools\AvrAssembler2\avrasm2.exe AVRASM2 = $(shell echo $${PROGRAMFILES})\Atmel\AVR Tools\AvrAssembler2\avrasm2.exe #AVRASM2 = C:\Program Files\Atmel\AVR Tools\AvrAssembler2\avrasm2.exe #AVRASM2 = C:\Programme\Atmel\AVR Tools\AvrAssembler2\avrasm2.exe # Define programs and commands SHELL = sh REMOVE = rm -f # generate listing file (uncomment if req.) #GEN_LISTING = -l $(TARGET).lst MSG_ASSEMBLE = --------------- assembling: # rules ---------------------------------------------------------------------- all : avrasm2_exist $(AHEX) # validate that assembler has been configured properly avrasm2_exist : @if test ! -f "$(AVRASM2)" ; then\ echo "************************ ERROR ******************************" ;\ echo "\"$(AVRASM2)\" not found." ;\ echo "Customize makefile to your installation of Atmel AVR Studio." ;\ fi @test -f "$(AVRASM2)" $(AHEX) : $(INCLUDES) $(ASRC) makefile @echo @echo $(MSG_ASSEMBLE) $(ASRC) @echo MANUFACTURER_ID = $(MANUFACTURER_ID) @echo DEVELOPER_ID = $(DEVELOPER_ID) @echo PRODUCT_ID = $(PRODUCT_ID) @echo BOOTSTRAP_START_BYTE = $(BOOTSTRAP_START_BYTE) @echo MCU = $(MCU) @echo F_CPU = $(F_CPU) $(AVRASM2) -S labels.tmp -fI -W+ie -I $(BOOTLOADER_DIR) -C V2E \ -o $(AHEX) -d $(TARGET).obj -m $(TARGET).map $(GEN_LISTING) \ $(ASMFLAGS) $(ASRC) clean : -$(REMOVE) labels.tmp *.obj *.map *.lst distclean : clean -$(REMOVE) *.hex .PHONY : all clean distclean |