From df7e4434acfbba17519b42990d7bb18e3592fe98 Mon Sep 17 00:00:00 2001 From: WestfW Date: Wed, 26 Sep 2018 02:46:01 -0700 Subject: [PATCH] Update README.md Make a new top-level "wiki" directory. (because keeping the wiki pages in the source tree should allow other people to edit them and make pull requests, more easily that modifying the "protected" wiki pages (without making them fully publicly editable.) --- README.md | 32 +++++++++++++----- Wiki/AddingOptibootChipsToIde.md | 20 +++++++++++ Wiki/BootloaderIntro.txt | 21 ++++++++++++ Wiki/CompilingOptiboot.md | 54 +++++++++++++++++++++++++++++ Wiki/GoodQuestions.md | 56 +++++++++++++++++++++++++++++++ Wiki/Home.md | 10 ++++++ Wiki/HowOptibootWorks.md | 44 ++++++++++++++++++++++++ Wiki/InstallingOnChips.md | 52 ++++++++++++++++++++++++++++ Wiki/Optiboot Basic Logic-1.png | Bin 0 -> 43921 bytes Wiki/OtherVersions.md | 3 ++ Wiki/Virtual-Boot-Partition.md | 44 ++++++++++++++++++++++++ Wiki/github-issue-labels | 29 ++++++++++++++++ Wiki/optiboot.png | Bin 0 -> 43218 bytes optiboot/boards-1.6.txt | 12 +++---- 14 files changed, 363 insertions(+), 14 deletions(-) create mode 100644 Wiki/AddingOptibootChipsToIde.md create mode 100644 Wiki/BootloaderIntro.txt create mode 100644 Wiki/CompilingOptiboot.md create mode 100644 Wiki/GoodQuestions.md create mode 100644 Wiki/Home.md create mode 100644 Wiki/HowOptibootWorks.md create mode 100644 Wiki/InstallingOnChips.md create mode 100644 Wiki/Optiboot Basic Logic-1.png create mode 100644 Wiki/OtherVersions.md create mode 100644 Wiki/Virtual-Boot-Partition.md create mode 100644 Wiki/github-issue-labels create mode 100644 Wiki/optiboot.png diff --git a/README.md b/README.md index 3ef7aa9..3f1fa31 100644 --- a/README.md +++ b/README.md @@ -4,23 +4,38 @@ Optiboot is an easy to install upgrade to the Arduino bootloader within Arduino boards. It provides the following features: - * Allows larger sketches. Optiboot is a quarter of the size of the default bootloader, freeing 1.5k of extra space. + * Allows larger sketches. Optiboot is only 512 bytes, freeing 1.5k of extra code space compared to older bootloaders. * Makes your sketches upload faster. Optiboot operates at higher baud rates and has streamlined programming. - * Adaboot performance improvements. Optiboot runs your sketches sooner, with no watchdog issues. - * Compatible with 168 and 328 Arduinos including Lilypad, Pro, Nano - * Believed to work with ATmega1280 ("Mega"), ATmega644 ("Sanguino"), and ATmega1284 ("Mighty") - * Supports several additional AVR chips (ATmega88, ATmega32) + * Adaboot performance improvements. Optiboot implements "fastboot" that starts sketches immediate after power-on. + * Compatible with ATmega8, ATmega168, and ATmega328p Arduinos and derivatives including Lilypad, Pro, Nano, and many derivatives. + * Works with *MANY* additional Atmel AVR chips - almost anything that supoorts bootloads or "flash self-programming." This includes chips from ATtiny 8pin chips through the 100pin ATmega2560 used on Arduino Mega. + * Supports alternate serial ports, cpu frequencies and baud rates. -Optiboot is now installed by default on the Arduino Uno. It can be installed on all older mega8, 168 or 328 based Arduinos. +Optiboot (an older version) is installed by default on the Arduino Uno and (as of 2018) official Arduino Nano boars. It can be installed on all older mega8, 168 or 328 based Arduinos. ## Additional Documentation More detailed documentation is being added (slowly) to the [repository wiki](https://github.com/Optiboot/optiboot/wiki). ## Notes on IDE Version compatability -Optiboot is "compatible", in a loose sense, with all versions of the Arduino IDE. It was originally written at about the same time as v1.0, and has some "quirks" that date back to that timeframe. Most significantly, install procedures and locations change between releases, and the ability to compile Optiboot using only the tools installed with the IDE broke in the v1.5 timeframe. +Optiboot is "compatible", in a loose sense, with all versions of the Arduino IDE. It was originally written at about the same time as v1.0, and has some "quirks" that date back to that timeframe. Most significantly, the directory structure of the git repository is "weird." ## To install into the Arduino software ## -You do NOT need to "install" Optiboot if you are trying to update an installed platform that already uses some form of Optiboot. In that case, you should probably just find and replace the existing .hex files from the platform support directories. Using the Optiboot "install" procedure does not install any cores or variants, so it is only useful for CPUs that are already supported by the standard Arduino core (or, if all you want to do is install bootloaders.) +You do NOT need to "install" Optiboot if you are trying to update an installed platform that already uses some form of Optiboot. In fact, you should almost certainly NOT install Optiboot using the board manager. +The Optiboot github repository these days is mostly useful as a sorce-code repository, for anyone who needs to make a highly customized version for some reason. Or an improvement to Optiboot itself. + +Most end users should find a supported "Arduino Core" that includes Optiboot for their desired target, and install that. Many such cores are provided by the hardware vendor, and they'll include Board defintions, Variant files, and Arduino core code neeed to support the target as well as one or more Optiboot .hex files that should work. + +There are also some major repositories of "generic" versions of cores for various targets, including: + + * [MegaCore by MCUdude](https://github.com/MCUdude/MegaCore) Supports large AVRs like ATmega128, ATmega640, ATmega1280, ATmega1281, ATmega2560 and ATmega2561. + * [MightyCore by MCUdude](https://github.com/MCUdude/MightyCore) Supports most 40pin AVRs including ATmega1284, ATmega644, ATmega324, ATmega32, and ATmega8535. + * [MiniCore by MCUdude](https://github.com/MCUdude/MiniCore) Supports most 28pin ATmega AVRs, including the cpus used by Uno/etc as well as the new cpus like the ATmega328PB. + * [MajorCore by MCUdude](https://github.com/MCUdude/MajorCore) Supports a couple of relatively obsolete large AVRs, like ATmega8515 and ATmega162. + * [ATTinyCore by Spence Konde](https://github.com/SpenceKonde/ATTinyCore) Supports many ATtiny AVRs, including ATtiny85, ATtiny1634, ATtiny84, and ATtiny841. + +If you need a new Optiboot feature not included in a pre-packaged core, the recommended procedure is to download or fork the source code, manually compile the version you need, and copy the .hex file to the existing board directory (after renaming the old .hex file, in case you need it back.) + +Nevertheless, there is an automatically installable Board Manager package that includes the .hex files for Optiboot on several popular Arduino boards (a very small subset of the possible targets.). Using the Optiboot "install" procedure does not install any cores or variants, so it is only useful for CPUs that are already supported by the standard Arduino core. The following instructions are based on using the Arduino "Board Manager", present in IDE versions 1.6.5 and later. @@ -52,3 +67,4 @@ For additional installation information, see the [Optiboot AddingOptibootChipsTo > _Optiboot is the work of Peter Knight (aka Cathedrow). Despite some misattributions, it is not sponsored or supported by any organisation or company including Tinker London, Tinker.it! and Arduino._ > Maintenance of optiboot was taken over by Bill Westfield (aka WestfW) in 2011. +> Major contributions have also been made by Hans "MCUdude", Spence "DrAzzy" Konde, and majekw. diff --git a/Wiki/AddingOptibootChipsToIde.md b/Wiki/AddingOptibootChipsToIde.md new file mode 100644 index 0000000..0b9dd5b --- /dev/null +++ b/Wiki/AddingOptibootChipsToIde.md @@ -0,0 +1,20 @@ +# Not Done yet # + +This involves adding or editing a "boards.txt" file somewhere in the Arduino application or user sketch directory hierarchy. + +Both the preferred location and the format of the file change from version to version of the IDE. + + +# IDE Version 1.6.4 (and later) +## Boards Manager +Verions 1.5.x (beta) of the IDE added support for a much broader range of non-AVR and 3rd party hardware. This changed the directory structure in the user's sketchbook folder in ways that were incompatible with 1.0.x (in particular, adding a "platform" sub directory, so that boards.txt was in /hardware///) + +In 1.6.4 (a production release), the IDE added a "boards manager" that permits a 3rd party extension to be automatically downloaded and installed simply by adding a URL in the preferences panel and (in yet another location and clicking an "Install" button in the Boards Manager panel. (The actual files end up in yet a different place in the file system, but this should be transparent to the users.) This is the preferred way to install the Optiboot boards.txt if you are running 1.6.4 or later, but it does not (currently) install source code. + +# IDE version 1.0.x +In version 1.0 of the Arduino IDE, it became possible to put hardware extensions in the sketchbook folder, by putting new subdirectories in /hardware/. You could put a suitably formatted boards.txt there describing the new optiboot cpus, pointing toward .hex files located in that tree, or in other locations. + + +# IDE Version 00xx +Optiboot was written prior to version 1.0 of the IDE. In those days, the only way to add additional boards was to modify the boards.txt file that included within the directory structure of the IDE itself. (/hardware/arduino/boards.txt, with the .hex files in /hardware/arduino/bootloaders/optiboot) The directory structure of the Optiboot repositor reflects this old structure. + diff --git a/Wiki/BootloaderIntro.txt b/Wiki/BootloaderIntro.txt new file mode 100644 index 0000000..8064e9a --- /dev/null +++ b/Wiki/BootloaderIntro.txt @@ -0,0 +1,21 @@ +What is a "Bootloader" ? + +What is "stk500" ? + +What is "avrdude" ? + +What symptoms indicate a bootloading problem? + +What are common causes of bootloading problems? + +What information can I collect to debug a bootloading problem? + +Can my Arduino have the bootloader damaged? + +How can I tell if my bootloader is damaged? + +Why else would I want to upload a new bootloader? + +Can I replace or upload a new bootloader with no additional equipment? + +How can I replace or upload a new bootloader? diff --git a/Wiki/CompilingOptiboot.md b/Wiki/CompilingOptiboot.md new file mode 100644 index 0000000..595decd --- /dev/null +++ b/Wiki/CompilingOptiboot.md @@ -0,0 +1,54 @@ +# 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. (as of Version 1.5 of the Arduino IDE, a much smaller set of tools is included, and this method doesn't work any more.) + * 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. + +WARNING: some targets don't compile with "make" 3.81 or 3.82 due to bug in it. See https://github.com/Optiboot/optiboot/issues/106 + + +# 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 +~~~~ +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: + + * AVR_FREQ=nnnnnn -- Use CPU frequency as specified (default: target dependent, but usually 16000000L) + * BAUD_RATE=nnnnn -- Use an alternate bitrate (default: usually 115200) + * + * LED=\ -- Like "LED=B5" or "LED=L5"; which LED to flash. + * LED\_START\_FLASHES=n -- number of flashes to emit when the bootloader executes (default 3) Setting this to 0 omits the LED-flashing code and saves some space. + * LED\_START\_ON -- Turn on the LED when the bootloader starts. A smaller alternative to LED_START_FLASHES. + * LED\_DATA\_FLASH -- flash the LED in the data receive function as well as at bootloader startup. + * + * SOFT_UART=1 -- use a bit-banged Software Uart. Required for chips without a HW UART. + * SINGLESPEED=1 -- Operate the UART in single-speed mode. + * UART=n -- user UARTn instead of UART0. + * + * BIGBOOT=1 -- include extra features that cause the bootloader to grow to between 512 and 1024 bytes. + * SUPPORT_EEPROM=1 -- try to include EEPROM read/write support, without other BIGBOOT features. + +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 +~~~~ diff --git a/Wiki/GoodQuestions.md b/Wiki/GoodQuestions.md new file mode 100644 index 0000000..c9fe3bc --- /dev/null +++ b/Wiki/GoodQuestions.md @@ -0,0 +1,56 @@ +# Good Question! # + +Optiboot occasionally generates questions on various forums (Arduino, AVRFreaks, etc), and I thought I'd collect some of the answers here, without spending a lot of time trying to re-organize them as actual "documentation." + + 1. Do Arduino "sketches" require the Optiboot (or other) bootloader to be loaded on the chip?

+ No. While it's technically possible for a bootloader to include "support functions" used by the application section, Arduino does NOT do this. Nor do sketches require a bootloader to have done any chip initialization. In fact, Optiboot tries to start the application with the chip in a state as close as possible to its "reset" state.

+ + 1. Can I put Optiboot on my Arduino MEGA2560 ?

+ Yes, as of Optiboot v7.0
+In older versions, Optiboot was limited by the "Version 1" STK500 communications protocol, which only allows up to 64kwords of flash to be programmed. The v7.0 code uses an out-of-band "SPI Command" to set the RAMPX register.

+ + 1. Why does Optiboot have its own copy of boot.h ?

+ The copy of boot.h used by Optiboot has been modified to use "out" instructions instead of "sts." The out instruction is shorter, but only works if the target registers in withing the first 64 IO addresses.
+ As of Version 7.0, the Optiboot copy of boot.h has been renamed to boot_opt.h, defines ONLY the special "short" functions, and includes the standard \ to pick up all the standard definitions.

+ + 1. What is a "Virtual Boot Partition"

+ VIRTUAL\_BOOT\_PARTITION is a hack for implementing a bootloader on parts that don't have "start at the bootloader address after reset" support. So the start vector always has to be at 0, where it will be overwritten by the application's vectors. Except the bootloader "cleverly substitutes" its own start address for the start of the application during "upload", causing the bootloader to always run first.

+ + 1. Why is there an extra `BAUD_RATE * 4L` there? Why is it using 4L and 8L rather than just 4 and 8?

+ It's doing rounding. int(calculated\_divisor + 0.5), except since it's all integers we use algebra and multiply the 0.5 by something big enough to make it an integer. (Hmm. This is probably silly; I should just let it use compile-time floating point. like `__delay_ms()`)

+ + 1. What is the difference between `"__boot_page_fill_short" and "__boot_page_write_short"`? +

+ Flash is written a full page at a time, rather than a byte at a time. To write a page of flash, you fill a RAM buffer in the flash controller peripheral (boot\_page\_fill), and then give a "boot\_page\_write" to actually write that buffer to the flash memory. All together, there are three copies (buff, which is filled from the serial comm, the flash page buffer filled by page\_fill, and the flash itself.)

+ + 1. What's with the "`#define rstVect (*(uint16_t*)(RAMSTART+SPM_PAGESIZE*2+4))`" ? +

+ These are "manually defined" variables. Normally you'd say `"char buff[SPM_PAGESIZE]; int rstvector, wdtvector;"` But C would want to include code to initialize those variables, which would be "too much" extra code for optiboot to fit in 512 bytes. So instead we define buff as being where we know the first byte of RAM is and rstvetcor as the first byte after buff, and so on.

+ + 1. What is RAMPZ? what is being done in the "`newAddress += newAddress`" line? +

+ RAMPZ is the "extra byte" of flash addressing for parts with more than 64k words. +
+ The addition (multiply by 2) converts from (16bit) word addresses that Atmel likes to use in various place, to byte addresses used by the hardware and avr-libc in most places. +

+ + 1. What are "sections" and the ".version" section in particular, and what is optiboot doing with them? +

+ The "section" attribute is equivalent to the .section gnu assembler directive. http://tigcc.ticalc.org/doc/gnuasm.html#SEC119 (one source; generic.) ".version" is an arbitrary name. +
+ These are essentially commands that transfer information from the source code to the linker, which will then put together the various bits of information in various places in memory, based on the "linker map" (file provided by the infrastructure) and commands given to it explicitly ("-Wl,--section-start=.version=0x3ffe" in the Makefile.) The newer code does this in C with attribute instead of using inline assembler, but it does the same thing. +

+ + 1. How does Optiboot put the code and version number at the correct absolute flash addresses? +

+ The output from the compiler is in relocatable "sections" that are then relocated and assigned to appropriate addresses by the linker. The addresses used are normally determined by a "linker map" file that is part of the per-chip definitions included with the compiler, but in the case of Optiboot, they are specified explicitly in the link command using the -Wl,--section-start=.text=0x3e00 type commands.

+ + 1. Where did 0x3e00 come from? I don't see that in the data sheet! +

+ There are various places where the Atmel documentation uses WORD addresses for flash memory, while most of the gnu tools use BYTE addresses. 0x3e00 comes from the "boot size configuration" in the boot loader support chapter of the datasheet (where it says "0x1F00")

+ + 1. Do I need a different version of Optiboot for the non-DIP packages like the ATmega328p-au ? +

+ No, the package should be irrelevant to the bootloader software. Watch your pin connections, connect all the (multiple) power supply pins, and the same bootloader and bootloader loading procedure should work. If it doesn't work, it is due to some factor other than Optiboot.

+ + \ No newline at end of file diff --git a/Wiki/Home.md b/Wiki/Home.md new file mode 100644 index 0000000..1d70cd4 --- /dev/null +++ b/Wiki/Home.md @@ -0,0 +1,10 @@ +Welcome to the optiboot wiki!
+##Wiki pages:## + +* [[InstallingOnChips]] - loading Optiboot onto chips, using various tools. +* [[CompilingOptiboot]] +* [[HowOptibootWorks]] +* [[AddingOptibootChipsToIde]] +* [[GoodQuestions]] - Frequently asked technical questions +* [[OtherVersions]] - 3rd party optiboot derivatives with interesting features. +* [[Virtual-Boot-Partition]] - More about the Virtual Boot Partition. diff --git a/Wiki/HowOptibootWorks.md b/Wiki/HowOptibootWorks.md new file mode 100644 index 0000000..cd7b1fe --- /dev/null +++ b/Wiki/HowOptibootWorks.md @@ -0,0 +1,44 @@ +# Introduction # + +Optiboot implements a small subset of the "STK500 communications protocol" (version 1) defined by Atmel in their [Application Note AVR061](http://www.atmel.com/Images/doc2525.pdf) In order to conserve code space, many of the protocol commands are ignored and receive "lies" rather than correct response codes, leading to the possibility that the bootloader may not operate correctly with all host-side software. It is known to work with versions of "avrdude" supporting the "-c arduino" programmer type. + +Optiboot is designed to reside in the bootloader section, and chip fuses should be set appropriately for the size of optiboot (normally 256 words) (BOOTSZx) and to reset to the bootloader start address (BOOTRST) Note that BOOTSZx values are chip-dependent, and some of the chips suppored by Optiboot have a 512word minimum bootloader size.) + +## Basic Operation ## + 1. On reset, Optiboot starts and reads the reset reason from MCUSR. For any cause other than "external reset", the application is started immediately. Otherwise, optiboot attempts to download new application software: + 1. The "start LED" is flashed to indicate that optiboot is running. (which pin is used, and how many times it flashes, is configurable.) + 1. The (configurable) UART is configured and the WDT is enabled with a 1s timeout. + 1. Optiboot attempts to read commands from the (configurable) serial port. Valid characters will cause the WDT to be reset, and the application flash area to be programmed (hopefully.) + 1. With no valid UART traffic, or after programming, the WDT is allowed to expire, causing the chip to reset. + 1. Since the WDT reset is NOT an 'external reset', the application is started as in (1) - the AVR at the time the application is run has all IO registers except MCUSR and SP in their pristine, reset, state. + +# Details # +## Implemented Commands ## +The following core commands are "supported"; they actually do something useful WRT loading code via the bootloader: + +|Cmd Name | Value | Description | +|:--------|-------|:------------| +|STK\_LOAD\_ADDRESS|0x55,'U'| Note: 16bit word address, 128kb flash max.| +|STK\_PROG\_PAGE|0x64,'d'| Flash only| +|STK\_READ\_PAGE|0x74,'t'| Flash only| +|STK\_READ\_SIGN|0x75,'u'| Reads compiled-in signature.| +|STK\_LEAVE\_PROGMODE|0x51,'Q'| Starts application code via WDT reset.| +|STK\_GET\_PARAMETER|0x41,'A'| Supports "minor SW version" and "major SW version" Returns 3 for all other parameters.| + +The following commands will have their arguments correctly read, and produce in a "success" response, but they don't actually do anything: + +|Cmd Name | Value | +|:------------- |:-------- | +|STK\_UNIVERSAL|0x56, 'V'| | +|STK\_SET\_DEVICE|0x42, 'B'| | +|STK\_SET\_DEVICE\_EXT|0x45, 'E'| | + +All other commands will result in a success response if they are immediate followed by CRC\_EOP (0x20, ' ') (ie they are ignored), or a WDT reset (start applicatin) otherwise. + +## Space Saving Techniques ## +In order to save space, Optiboot utilizes a couple of techniques that may be of general interest: + + * The Vector table and normal startup code are omitted by using linker options "-nostdlib -nostartfiles" + * This requires that main() be declared with attribute OS\_main and manually placed in the .init9 section. + * and thus main() has to initialize the known-zero register (r1) and SP on chips that don't automatically set SP to end-of-ram. + * inlining of functions is carefully controlled. \ No newline at end of file diff --git a/Wiki/InstallingOnChips.md b/Wiki/InstallingOnChips.md new file mode 100644 index 0000000..c78659d --- /dev/null +++ b/Wiki/InstallingOnChips.md @@ -0,0 +1,52 @@ +# Installing optiboot # + +There are two aspects to "installing optiboot." The first problem, which is discussed here, involves getting the optiboot firmware into chips, whether the chips have an older version of a bootloader, or are completely blank. + +The second problem is configuring the Arduino IDE to support the optiboot-loaded chips. This is easy if you're loading up ATmega328x chips, since any 328 chip with optiboot is essentially an Arduino Uno, and you can use the existing Uno configuration. It is more difficult (and not yet documented) if you're adding a new chip, or putting optiboot on a chip that normally uses a different bootloader. This is (will be) described at [[AddingOptibootChipsToIde]]. + +Much information about burning optiboot into ATmega chips for use in Arduino can be found in the Arduino forums, especially in [this thread](http://arduino.cc/forum/index.php/topic,64105.0.html) + +There are about three main methods of installing optiboot on an otherwise blank AVR chip. + +## Installing using the Arduino IDE ## +The Optiboot project here includes ONLY the bootloader, not any support for a chip or chip +options in the "core" Arduino code. It also includes bootloaders for many chips, of which only a few are likely to be of interest to any one person. This means that while it is *possible* to "install" Optiboot in the IDE, this is no longer the preferred way to do thing. + + In recent years, since the introduction of installable +3rd party hardware in Arduino 1.6.4, open-source developers have been busy creating +additional "boards" for the IDE that can be installed very easily. Many of these cores +use Optiboot, or a modified version of Optiboot, as their bootloader, and the preferred +method of installing "XXX processor with Optiboot bootloader" is to ignore this repository +entirely, find a core for that processor, and use the board manager to install it. + +Here are some of the well-known and well-used "cores" that use Optiboot: + +* https://github.com/MCUdude/MiniCore (ATmega328, ATmega168, ATmega88, ATmega48 and ATmega8) +* https://github.com/MCUdude/MightyCore (ATmega8535, ATmega16, ATmega32, ATmega164, ATmega324, ATmega644 and ATmega1284) +* https://github.com/MCUdude/MegaCore (ATmega64, ATmega128, ATmega640, ATmega1280, ATmega1281, ATmega2560 and ATmega2561) +* https://github.com/SpenceKonde/ATTinyCore (ATtiny 841, 828, 1634, 87, 167) + + +If you are using a chip that is "supported" by the Arduino team, or by some other person who has provided files, you can install optiboot (or for that matter, any other bootloader) directly from the Arduino IDE. This usually has the following steps: + + 1. Install the files as directed, usually (for Arduino 1.0+) in a subdirectory of your personal sketch's ../hardware/ directory. Note that the formats of various files (notably boards.txt) have changed with different versions of the IDE, and you'll need to make sure that the files you have been provided match the version of the IDE you are using. + 1. Connect a device programmer to the ISP connector of the target board, or via wires to an avr chip with appropriate support hardware in a protoboard, as per the instructions associated with that programmer. It will need to be a programmer of a type supported by the Arduino IDE in the tools/programmer Menu. You can use a 2nd Arduino with the ArduinoISP sketch as a programmer. The details are beyond the scope of this document, but are often discussed in the Arduino forums. + 1. Running the Arduino IDE, select the tools/board of the target chip, and the tools/programmer of your programmer, and if necessary the tools/serial port of the programmer. + 1. Select tools/Burn Bootloader + +## Installing using a specialized bootloader loader sketch ## +There are a couple of Arduino sketches that have been written to make it easier to reprogram Optiboot (or other SW) into other Arduinos, especially in bulk. One example is WestfW's [OptiLoader](https://github.com/WestfW/OptiLoader). Similar programs are available from [Adafruit](https://github.com/adafruit/Standalone-Arduino-AVR-ISP-programmer) and [Nick Gammon](http://www.gammon.com.au/forum/?id=11635). These typically contain a pre-loaded copy of some version of the bootloader for several different chips (OptiLoader supports ATmega8, ATmega168, ATmega328P, and ATmega328.) It's very fast and easy IF you have one of the supported targets: + + 1. Set up an existing Arduino with an Arduino to ISP connector and load the optiLoader sketch using the standard Arduino IDE. + 1. For each target board, connect the ISP connector and hit the reset button on the optiLoader Arduino, or use the "G" command in the Serial Monitor. Programming the bootloader takes about 5 seconds, and reports status and information to the Arduino serial port. + +## Installing using the optiboot repository Makefile ## +We might assume that you're here at the optiboot code repository because you want to use optiboot on a chip that is NOT supported by another party, but is supposed to be supported by the optiboot in general. (An example might be the ATmega1280, which normally runs a different bootloader.) + + 1. Compile the appropriate binary target (ie "mega1280"), as described on the CompilingOptiboot page. + 1. Connect a device programmer to your target as appropriate. + 1. Edit the Makefile to make the ISPxxx variables correct for your programmer. Make sure that there is a "target\_isp" make target defined, or create it using the existing targets as examples. + 1. Use a command like "make mega1280\_isp" to burn the bootloader. + 1. You can also use avrdude at the command line, manually. Burning the bootloader is usually a two-step process: + * "chip erase" the target and set the fuses and lockbits to allow writing to the bootloader section of the device + * burn the bootloader at its defined address, and reset the lockbits to prevent accidental overwriting of the bootloader section. \ No newline at end of file diff --git a/Wiki/Optiboot Basic Logic-1.png b/Wiki/Optiboot Basic Logic-1.png new file mode 100644 index 0000000000000000000000000000000000000000..67c44f7b63e4d67629f3197872f9b17d2b07e30f GIT binary patch literal 43921 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 XUL#AtRqTR475LH7G}I_myZZ1yt88;M literal 0 HcmV?d00001 diff --git a/Wiki/OtherVersions.md b/Wiki/OtherVersions.md new file mode 100644 index 0000000..1972292 --- /dev/null +++ b/Wiki/OtherVersions.md @@ -0,0 +1,3 @@ +A number of people have modified some version of Optiboot to support additional features or communications channels, where I have decided for one reason or another NOT to merge those changes back into the main Optiboot source. Nevertheless, they're worth referencing here... + + Boot over TCP using Wiznet W5100 chip. As small as 1K. diff --git a/Wiki/Virtual-Boot-Partition.md b/Wiki/Virtual-Boot-Partition.md new file mode 100644 index 0000000..37b8521 --- /dev/null +++ b/Wiki/Virtual-Boot-Partition.md @@ -0,0 +1,44 @@ +# 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. \ No newline at end of file diff --git a/Wiki/github-issue-labels b/Wiki/github-issue-labels new file mode 100644 index 0000000..6c3951c --- /dev/null +++ b/Wiki/github-issue-labels @@ -0,0 +1,29 @@ +Explanations for possibly mysterious lables used on Optiboot github "issues." + +Component-Docs - requires a fix in the documentation only +Component-Makefiles - requires a change to the makefiles only +Component-Scripts - changes to the scripts only +Discussion - an "issue" that has significant "discussion" involved; may not be an actual bug. +Duplicate +help wanted - "official maintainers" don't have the parts or the interest. A request for someone in the community to provide a patch/pull request/etc. +Invalid - the bug is reported in error, or determined not to exist. +Maintainability - affects the ease of maintenance of the program. +Not-our-issue - the actual problem is determined to lie outside of optiboot itself. +OpSys-Linux +OpSys-OSX +OpSys-Windows +Partly Done - come code has been added/merged, but there is more to do. +Priority-Critical +Priority-High +Priority-Low +Priority-Medium +Question - more of a +Regression - something that used to work correctly has broken +Superseded - was a bug at one time, but is no longer present because of other changes. +Type-Defect +Type-Enhancement +Type-newChip - request for a new chip; usually involves Makefile and pin_defs.h, but not actual program logic. +Type-Other +Type-Patch +wontfix - describes a real problem that can't be fixed, or won't be fixed because we think it is outside the scope of Optiboot. + diff --git a/Wiki/optiboot.png b/Wiki/optiboot.png new file mode 100644 index 0000000000000000000000000000000000000000..e91daa0b31598b4cc62a84307b395b4942a04ac0 GIT binary patch literal 43218 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 WqYpbVP&)ho0000