Skip to content

CompilingOptiboot

Bill Westfield edited this page Feb 26, 2022 · 3 revisions

Introduction

You can compile Optiboot for platforms that do not have pre-existing .hex files, or you can make modifications to the source code and/or Makefile in order to implement "custom" versions of Optiboot.

This will require some relatively deep knowledge of avr-gcc, Atmel AVR hardware and processor details, Makefiles, and the command line environment. We HAVE tried to take steps to allow Optiboot to be compiled without installing a full AVR development suite.

Details

Optiboot is designed to be compiled with the same version of avr-gcc that is distributed with the Arduino environment: 4.3.2. This is actually quite an old version of gcc; some effort has been made to allow the compile to procede with new versions of the compiler. However, since Optiboot MUST compile to a total size of less than 512 bytes, it is very sensitive to changes in the way the compiler does optimizations, or the way it processes optimization options on the compile command.

In all cases, Optiboot compiles directly from the command line using "make", rather than from within any IDE. It is currently designed to used compilers installed in one of three different places:

  • Local Development Environment - you have WinAVR (on Windows), CrossPack (on Mac), or an avr-gcc package (linux) installed on your system, with appropriate development tools somewhere in your path.
  • You have Arduino installed, and are trying to compile Optiboot from its home directory within the Arduino directory structure (hardware/arduino/bootloaders/optiboot/) The Arduino app includes a pretty complete set of compiler tools, and these can be used to compile optiboot without installing a separate toolchain.
  • You have downloaded the Arduino Source code, which also includes (binary) copies of avr-gcc toolchains, and a source directory containing the Optiboot source code.

Compile Options

The Optiboot build procedure has been set up to allow a large set of customization options. The general format of a build command is:

make <options> <platform>

Where is one of the named chips or boards implemented as normal targets in the makefile (ie "atmega328".) (the order may be reversed.) The implemented include:

Build and CPU-related options:

  • AVR_FREQ=nnnnnn -- Use CPU frequency as specified (default: target dependent, but usually 16000000L)
  • BIGBOOT=1 -- include extra features that cause the bootloader to grow to between 512 and 1024 bytes.
  • CUSTOM_VERSION=nn -- set a customer version number
  • SUPPORT_EEPROM=1 -- Include code to read/write EEPROM
  • NO_APP_SPM=1 -- disallow application call of do_spm
  • OSCCAL_VALUE=nnn -- set set OSCCAL_VALUE in bootloader
  • BOOT_ON_POR=1 -- Run bootloader on power-on. Useful on chips with RESET disabled.
  • APP_ON_EXTR=1 -- Run App on External Reset
  • TIMEOUT=n -- set WDT (boot timeout) to 1, 2, 4, or 8 seconds

UART/Serial/Comm options:

  • UART=n -- use UARTn for communications
  • BAUD_RATE=nnnnn -- Use an alternate bitrate (default: usually 115200)
  • SOFT_UART -- use a bit-banged Software Uart. Required for chips without a HW UART.
  • SOFTTX=B5 -- pin for software UART xmit
  • SOFTRX=B6 -- pin for software UART receive
  • SINGLESPEED=1 -- do not use U2X mode on UART
  • RS485=<portpin> -- Pin for optional rs485 tx enable (questionable.)

LED options:

  • LED_START_FLASHES=n -- number of flashes to emit when the bootloader executes (default 3)
  • LED_DATA_FLASH -- flash the LED in the data receive function as well as at bootloader startup.
  • LED=<portpin> -- Like "LED=B5" or "LED=L5"
  • LED_START_ON=1 -- Turn the LED on at bootload start (instead of flashing)

For example:

make UART=1 LED=A7 AVR_FREQ=20000000L atmega1284

Note that many of the board-level targets are implemented using a recursive invocation of make using this options. For exmaple, the "pro20" target ends up being:

 make atmega168 AVR_FREQ=20000000L LED_START_FLASHES=3