Makefile modification to allow building optiboot in more environments.
Allows building within the Arduino Source tree, and within the Arduino IDE tree, as well as using CrossPack on Mac. Adds README.TXT to track arduino-specific changes (and documents the new build options.) This addresses Arduino issue: http://code.google.com/p/arduino/issues/detail?id=487 And optiboot issue http://code.google.com/p/optiboot/issues/detail?id=1 (which can be thought of as a subset of the Arduno issue.) Note that the binaries produced after these Makefile changes (using any of the compile environments) are identical to those produced by the crosspack-20100115 environment on a Mac. (cherry picked from commit 2d2ed324b48e709f59a002cb274ed60bb0ebc911)
This commit is contained in:
parent
b84c2c7634
commit
6f7731bb6d
|
@ -19,6 +19,17 @@
|
|||
# program name should not be changed...
|
||||
PROGRAM = optiboot
|
||||
|
||||
# The default behavior is to build using tools that are in the users
|
||||
# current path variables, but we can also build using an installed
|
||||
# Arduino user IDE setup, or the Arduino source tree.
|
||||
# Uncomment this next lines to build within the arduino environment,
|
||||
# using the arduino-included avrgcc toolset (mac and pc)
|
||||
# ENV ?= arduino
|
||||
# ENV ?= arduinodev
|
||||
# OS ?= macosx
|
||||
# OS ?= windows
|
||||
|
||||
|
||||
# enter the parameters for the avrdude isp tool
|
||||
ISPTOOL = stk500v2
|
||||
ISPPORT = usb
|
||||
|
@ -27,6 +38,50 @@ ISPSPEED = -b 115200
|
|||
MCU_TARGET = atmega168
|
||||
LDSECTION = --section-start=.text=0x3e00
|
||||
|
||||
# Build environments
|
||||
# Start of some ugly makefile-isms to allow optiboot to be built
|
||||
# in several different environments. See the README.TXT file for
|
||||
# details.
|
||||
|
||||
# default
|
||||
fixpath = $(1)
|
||||
|
||||
ifeq ($(ENV), arduino)
|
||||
# For Arduino, we assume that we're connected to the optiboot directory
|
||||
# included with the arduino distribution, which means that the full set
|
||||
# of avr-tools are "right up there" in standard places.
|
||||
TOOLROOT = ../../../tools
|
||||
GCCROOT = $(TOOLROOT)/avr/bin/
|
||||
AVRDUDE_CONF = -C$(TOOLROOT)/avr/etc/avrdude.conf
|
||||
|
||||
ifeq ($(OS), windows)
|
||||
# On windows, SOME of the tool paths will need to have backslashes instead
|
||||
# of forward slashes (because they use windows cmd.exe for execution instead
|
||||
# of a unix/mingw shell?)
|
||||
fixpath = $(subst /,\,$1)
|
||||
endif
|
||||
|
||||
else ifeq ($(ENV), arduinodev)
|
||||
# Arduino IDE source code environment. Use the unpacked compilers created
|
||||
# by the build (you'll need to do "ant build" first.)
|
||||
ifeq ($(OS), macosx)
|
||||
TOOLROOT = ../../../../build/macosx/work/Arduino.app/Contents/Resources/Java/hardware/tools
|
||||
endif
|
||||
ifeq ($(OS), windows)
|
||||
TOOLROOT = ../../../../build/windows/work/hardware/tools
|
||||
endif
|
||||
|
||||
GCCROOT = $(TOOLROOT)/avr/bin/
|
||||
AVRDUDE_CONF = -C$(TOOLROOT)/avr/etc/avrdude.conf
|
||||
|
||||
else
|
||||
GCCROOT =
|
||||
AVRDUDE_CONF =
|
||||
endif
|
||||
#
|
||||
# End of build environment code.
|
||||
|
||||
|
||||
# the efuse should really be 0xf8; since, however, only the lower
|
||||
# three bits of that byte are used on the atmega168, avrdude gets
|
||||
# confused if you specify 1's for the higher bits, see:
|
||||
|
@ -37,10 +92,13 @@ LDSECTION = --section-start=.text=0x3e00
|
|||
# lock it), but since the high two bits of the lock byte are
|
||||
# unused, avrdude would get confused.
|
||||
|
||||
ISPFUSES = avrdude -c $(ISPTOOL) -p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) \
|
||||
-e -u -U lock:w:0x3f:m -U efuse:w:0x$(EFUSE):m -U hfuse:w:0x$(HFUSE):m -U lfuse:w:0x$(LFUSE):m
|
||||
ISPFLASH = avrdude -c $(ISPTOOL) -p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) \
|
||||
-U flash:w:$(PROGRAM)_$(TARGET).hex -U lock:w:0x0f:m
|
||||
ISPFUSES = $(GCCROOT)avrdude $(AVRDUDE_CONF) -c $(ISPTOOL) \
|
||||
-p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) \
|
||||
-e -u -U lock:w:0x3f:m -U efuse:w:0x$(EFUSE):m \
|
||||
-U hfuse:w:0x$(HFUSE):m -U lfuse:w:0x$(LFUSE):m
|
||||
ISPFLASH = $(GCCROOT)avrdude $(AVRDUDE_CONF) -c $(ISPTOOL) \
|
||||
-p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) \
|
||||
-U flash:w:$(PROGRAM)_$(TARGET).hex -U lock:w:0x0f:m
|
||||
|
||||
STK500 = "C:\Program Files\Atmel\AVR Tools\STK500\Stk500.exe"
|
||||
STK500-1 = $(STK500) -e -d$(MCU_TARGET) -pf -vf -if$(PROGRAM)_$(TARGET).hex \
|
||||
|
@ -53,15 +111,17 @@ OPTIMIZE = -Os -fno-inline-small-functions -fno-split-wide-types -mshort-calls
|
|||
DEFS =
|
||||
LIBS =
|
||||
|
||||
CC = avr-gcc
|
||||
CC = $(GCCROOT)avr-gcc
|
||||
|
||||
# Override is only needed by avr-lib build system.
|
||||
|
||||
override CFLAGS = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) -DF_CPU=$(AVR_FREQ) $(DEFS)
|
||||
override LDFLAGS = -Wl,$(LDSECTION) -Wl,--relax -nostartfiles
|
||||
override LDFLAGS = -Wl,$(LDSECTION) -Wl,--relax -Wl,--gc-sections -nostartfiles -nostdlib
|
||||
|
||||
OBJCOPY = avr-objcopy
|
||||
OBJDUMP = avr-objdump
|
||||
OBJCOPY = $(GCCROOT)avr-objcopy
|
||||
OBJDUMP = $(call fixpath,$(GCCROOT)avr-objdump)
|
||||
|
||||
SIZE = $(GCCROOT)avr-size
|
||||
|
||||
# 20MHz clocked platforms
|
||||
#
|
||||
|
@ -222,6 +282,7 @@ isp-stk500: $(PROGRAM)_$(TARGET).hex
|
|||
|
||||
%.elf: $(OBJ)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)
|
||||
$(SIZE) $@
|
||||
|
||||
clean:
|
||||
rm -rf *.o *.elf *.lst *.map *.sym *.lss *.eep *.srec *.bin *.hex
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
This directory contains the Optiboot small bootloader for AVR
|
||||
microcontrollers, somewhat modified specifically for the Arduino
|
||||
environment.
|
||||
|
||||
Optiboot is more fully described here: http://code.google.com/p/optiboot/
|
||||
and is the work of Peter Knight (aka Cathedrow), building on work of Jason P
|
||||
Kyle, Spiff, and Ladyada. Arduino-specific modification are by Bill
|
||||
Westfield (aka WestfW)
|
||||
|
||||
Arduino-specific issues are tracked as part of the Arduino project
|
||||
at http://code.google.com/p/arduino
|
||||
|
||||
|
||||
------------------------------------------------------------
|
||||
Building optiboot for Arduino.
|
||||
|
||||
Production builds of optiboot for Arduino are done on a Mac in "unix mode"
|
||||
using CrossPack-AVR-20100115. CrossPack tracks WINAVR (for windows), which
|
||||
is just a package of avr-gcc and related utilities, so similar builds should
|
||||
work on Windows or Linux systems.
|
||||
|
||||
One of the Arduino-specific changes is modifications to the makefile to
|
||||
allow building optiboot using only the tools installed as part of the
|
||||
Arduino environment, or the Arduino source development tree. All three
|
||||
build procedures should yield identical binaries (.hex files) (although
|
||||
this may change if compiler versions drift apart between CrossPack and
|
||||
the Arduino IDE.)
|
||||
|
||||
|
||||
Building optiboot in the arduino IDE install.
|
||||
|
||||
Work in the .../hardware/arduino/bootloaders/optiboot/ and use the
|
||||
"omake <targets>" command, which just generates a command that uses
|
||||
the arduino-included "make" utility with a command like:
|
||||
make OS=windows ENV=arduino <targets>
|
||||
or make OS=macosx ENV=arduino <targets>
|
||||
On windows, this assumes you're using the windows command shell. If
|
||||
you're using a cygwin or mingw shell, or have one of those in your
|
||||
path, the build will probably break due to slash vs backslash issues.
|
||||
On a Mac, if you have the developer tools installed, you can use the
|
||||
Apple-supplied version of make.
|
||||
The makefile uses relative paths ("../../../tools/" and such) to find
|
||||
the programs it needs, so you need to work in the existing optiboot
|
||||
directory (or something created at the same "level") for it to work.
|
||||
|
||||
|
||||
Building optiboot in the arduino source development install.
|
||||
|
||||
In this case, there is no special shell script, and you're assumed to
|
||||
have "make" installed somewhere in your path.
|
||||
Build the Arduino source ("ant build") to unpack the tools into the
|
||||
expected directory.
|
||||
Work in Arduino/hardware/arduino/bootloaders/optiboot and use
|
||||
make OS=windows ENV=arduinodev <targets>
|
||||
or make OS=macosx ENV=arduinodev <targets>
|
|
@ -0,0 +1,2 @@
|
|||
echo ../../../tools/avr/bin/make OS=macosx ENV=arduino $*
|
||||
../../../tools/avr/bin/make OS=macosx ENV=arduino $*
|
|
@ -0,0 +1 @@
|
|||
..\..\..\tools\avr\utils\bin\make OS=windows ENV=arduino %*
|
|
@ -13,15 +13,15 @@ Idx Name Size VMA LMA File off Algn
|
|||
CONTENTS, READONLY, DEBUGGING
|
||||
4 .debug_abbrev 00000196 00000000 00000000 0000053d 2**0
|
||||
CONTENTS, READONLY, DEBUGGING
|
||||
5 .debug_line 000003db 00000000 00000000 000006d3 2**0
|
||||
5 .debug_line 0000043f 00000000 00000000 000006d3 2**0
|
||||
CONTENTS, READONLY, DEBUGGING
|
||||
6 .debug_frame 00000090 00000000 00000000 00000ab0 2**2
|
||||
6 .debug_frame 00000090 00000000 00000000 00000b14 2**2
|
||||
CONTENTS, READONLY, DEBUGGING
|
||||
7 .debug_str 00000124 00000000 00000000 00000b40 2**0
|
||||
7 .debug_str 00000136 00000000 00000000 00000ba4 2**0
|
||||
CONTENTS, READONLY, DEBUGGING
|
||||
8 .debug_loc 000001d1 00000000 00000000 00000c64 2**0
|
||||
8 .debug_loc 000001d1 00000000 00000000 00000cda 2**0
|
||||
CONTENTS, READONLY, DEBUGGING
|
||||
9 .debug_ranges 00000068 00000000 00000000 00000e35 2**0
|
||||
9 .debug_ranges 00000068 00000000 00000000 00000eab 2**0
|
||||
CONTENTS, READONLY, DEBUGGING
|
||||
|
||||
Disassembly of section .text:
|
||||
|
@ -153,7 +153,7 @@ void watchdogReset() {
|
|||
// GET PARAMETER returns a generic 0x03 reply - enough to keep Avrdude happy
|
||||
getNch(1);
|
||||
7e5e: 81 e0 ldi r24, 0x01 ; 1
|
||||
7e60: be d0 rcall .+380 ; 0x7fde <verifySpace+0xc>
|
||||
7e60: be d0 rcall .+380 ; 0x7fde <getNch>
|
||||
putch(0x03);
|
||||
7e62: 83 e0 ldi r24, 0x03 ; 3
|
||||
7e64: 24 c0 rjmp .+72 ; 0x7eae <main+0xae>
|
||||
|
@ -172,7 +172,7 @@ void watchdogReset() {
|
|||
// SET DEVICE EXT is ignored
|
||||
getNch(5);
|
||||
7e72: 85 e0 ldi r24, 0x05 ; 5
|
||||
7e74: b4 d0 rcall .+360 ; 0x7fde <verifySpace+0xc>
|
||||
7e74: b4 d0 rcall .+360 ; 0x7fde <getNch>
|
||||
7e76: 8a c0 rjmp .+276 ; 0x7f8c <main+0x18c>
|
||||
}
|
||||
else if(ch == STK_LOAD_ADDRESS) {
|
||||
|
@ -206,7 +206,7 @@ void watchdogReset() {
|
|||
// UNIVERSAL command is ignored
|
||||
getNch(4);
|
||||
7ea8: 84 e0 ldi r24, 0x04 ; 4
|
||||
7eaa: 99 d0 rcall .+306 ; 0x7fde <verifySpace+0xc>
|
||||
7eaa: 99 d0 rcall .+306 ; 0x7fde <getNch>
|
||||
putch(0x00);
|
||||
7eac: 80 e0 ldi r24, 0x00 ; 0
|
||||
7eae: 71 d0 rcall .+226 ; 0x7f92 <putch>
|
||||
|
@ -503,6 +503,8 @@ void verifySpace() {
|
|||
7fda: 84 e1 ldi r24, 0x14 ; 20
|
||||
}
|
||||
7fdc: da cf rjmp .-76 ; 0x7f92 <putch>
|
||||
|
||||
00007fde <getNch>:
|
||||
::[count] "M" (UART_B_VALUE)
|
||||
);
|
||||
}
|
||||
|
@ -511,12 +513,10 @@ void verifySpace() {
|
|||
void getNch(uint8_t count) {
|
||||
7fde: 1f 93 push r17
|
||||
7fe0: 18 2f mov r17, r24
|
||||
|
||||
00007fe2 <getNch>:
|
||||
do getch(); while (--count);
|
||||
7fe2: df df rcall .-66 ; 0x7fa2 <getch>
|
||||
7fe4: 11 50 subi r17, 0x01 ; 1
|
||||
7fe6: e9 f7 brne .-6 ; 0x7fe2 <getNch>
|
||||
7fe6: e9 f7 brne .-6 ; 0x7fe2 <getNch+0x4>
|
||||
verifySpace();
|
||||
7fe8: f4 df rcall .-24 ; 0x7fd2 <verifySpace>
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue