Skip to content

Virtual Boot Partition

WestfW edited this page Jun 25, 2015 · 1 revision

Virtual Boot Partition

  1. What is a "Virtual Boot Partition"?

VIRTUAL_BOOT_PARTITION (VBP in short) is a hack for implementing a bootloader on parts that don't have "start at the bootloader address after reset" support. Sometimes it could be useful for normal chips when changing or messing with fuses is impossible or not desired.

  1. How it works?

During programming bootloader "cleverly substitutes" start vector of application (located at address 0) by jump to bootloader. This way bootloader is always run after reset.

  1. But how bootloader knows where application starts?

Bootloader assumes that start of application is typical vector table generated by most compilers. When Optiboot change start vector, it saves original jump to another free vector. Typically it uses SPM_RDY vector, or WDT if SPM_RDY is unavailable.

  1. I have chip without SPM_RDY and I need to use WDR vector in my code.

It's possible to assign arbitrary vector using additional option to CFLAGS: -Dsave_vect_num=xxx where xxx could be name of vector like EE_RDY_vect_num (see virboot8 target in Makefile) or even just number (see attiny84 target in Makefile.extras). In fact, any number could be used, even outside vector table. There is only one limitation: it MUST be located in first flash page!

  1. I don't use vector table. Can I use it anyway?

Yes, as long as first instruction is jmp on chips with more than 8KB memory or rjmp on smaller memory devices. You must also provide another jump to store old jump by Optiboot.

It could be done for example by adding -Dsave_vect_num=1 to CFLAGS during compiling bootloader, and making beginning of application like this:

  rjmp app
  rjmp nowhere
app:
  ... ;your code here
  1. I want to add VBP to chip XXX

Check Makefile targets virboot8, virboot328 or attiny84 for examples.

There are 2 things required:

  • add -DVIRTUAL_BOOT_PARTITION to CFLAGS
  • adjust (decrease) address in .text part of LDSECTIONS (for example in --section-start=.text=0x1c00) to fit larger bootloader in memory
  1. Any downsides of this feature?

Sadly, there are 2 of them:

  • Bootloader code is larger and doesn't fit in 512B
  • It requres one unused vector to store original jump to application. And you must be sure that this vector will be unused by applications loaded by Optiboot with VBP enabled.
Clone this wiki locally