# kaleidoscope::driver::bootloader We rarely have to work with or care about the bootloader from the user firmware, but there's one scenario when we do: if we want to reset the device, and put it into bootloader (programmable) mode, we need to do that in a bootloader-specific manner. This driver provides a number of helpers that implement the reset functionality for various bootloaders. ## Using the driver To use the driver, we need to include the appropriate header, from the hardware plugin of our keyboard: ```c++ #include <kaleidoscope/driver/bootloader/avr/Caterina.h> ``` Next, we set up the device `Properties` so that it includes the override for our bootloader: ```c++ struct OurBoardProps : kaleidoscope::device::BaseProps { typedef kaleidoscope::driver::bootloader::avr::Caterina Bootloader; }; ``` The base classes will do all the rest. ## Methods provided by all bootloader drivers ### `.rebootBootloader()` > Resets the device, and forces it into bootloader (programmable) mode. ## List of bootloaders All of the drivers below live below the `kaleidoscope::driver::bootloader` namespace. ## `avr::Caterina`: Used by many (most?) arduino MCUs. Provided by `kaleidoscope/driver/bootloader/avr/Caterina.h`. ### `avr::HalfKay` Used by the Teensy2. Provided by `kaleidoscope/driver/bootloader/avr/HalfKay.h`. ### `avr::FLIP` Used by the ATMega32U4 MCUs by default, unless another bootloader has been flashed on them. Provided by `kaleidoscope/driver/bootloader/avr/FLIP.h`. For this driver to work, one also needs to define the `KALEIDOSCOPE_BOOTLOADER_FLIP_WORKAROUND` macro before including the driver header, for technical reasons.