Nejnovejsi zdrojaky. Nutno zkusit ve WinAVR

This commit is contained in:
Pavel Brychta 2018-08-01 16:51:35 +02:00
parent e52091d23d
commit cc931b1d43
55 changed files with 18296 additions and 0 deletions

54
ActualOptiboot/README.md Normal file
View File

@ -0,0 +1,54 @@
## Optiboot Bootloader for Arduino and Atmel AVR ##
![docs/optiboot.png](docs/optiboot.png)
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.
* 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)
Optiboot is now installed by default on the Arduino Uno. 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.
## 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.)
The following instructions are based on using the Arduino "Board Manager", present in IDE versions 1.6.5 and later.
1. Find the desired Optiboot release on the [Optiboot Release page] (https://github.com/Optiboot/optiboot/releases).
2. Use the "Copy link address" feature of your browser to copy the URL of the associated **.json** file.
3. Paste this url into the "Additional Boards Manager URLs" field in the Arduino IDE "Preferences" pane. (Separate it from other URLs that might be present with a comma or click the icon to the right of the field to insert it on a new line.)
4. After closing the Preferences window, the **Tools/Boards/Boards Manager** menu should include an entry for that version of Optiboot. Select that entry and click the **Install** button.
For additional installation information, see the [Optiboot AddingOptibootChipsToIde Wiki page] (https://github.com/Optiboot/optiboot/wiki/AddingOptibootChipsToIde)
<!---
1. Download the latest using Git or the Zip download feature of GitHub. If you download as a zip, also extract it.
1. You will need to be using a recent version of the [Arduino environment](http://arduino.cc), version 18 or later.
1. Create a 'hardware' directory inside your sketches folder.
1. Copy the optiboot directory into the hardware directory.
1. Restart the Arduino software. New boards will appear in the Tools>Board menu.
--->
## To burn Optiboot onto an Arduino board ##
1. Select the appropriate Optiboot board type (or non-Optiboot if you want to change back)
1. Connect your Arduino to an ISP programmer [[Installing]]
1. Use the 'Burn Bootloader' item in Arduino.
1. You can then upload sketches as normal, using the Optiboot board type.
----
> Although it has evolved considerably, Optiboot builds on the original work of Jason P. Kyle (stk500boot.c), [Arduino group (bootloader)](http://arduino.cc), [Spiff (1K bootloader)](http://spiffie.org/know/arduino_1k_bootloader/bootloader.shtml), [AVR-Libc group](http://nongnu.org/avr-libc) and [Ladyada (Adaboot)](http://www.ladyada.net/library/arduino/bootloader.html).
> _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.

View File

@ -0,0 +1,42 @@
Arduino ships also avr-gcc. This is matrix of versions and changes
based on Linux versions.
| Arduino | avr-gcc | differences | test? |
|---------|---------|-------------|-------|
|<=1.0 |none? | | |
|1.0.1 |4.3.2 |new| |
|1.0.2 |4.3.2 |same as 1.0.1| |
|1.0.3 |4.3.2 |same as 1.0.1| |
|1.0.4 |4.3.2 |same as 1.0.1| |
|1.0.5 |4.3.2 |same as 1.0.1| |
|1.0.6 |4.3.2 |same as 1.0.1| yes |
|1.5 |4.3.2 |same as 1.0.1| |
|1.5.1 |4.3.2 |same as 1.0.1| |
|1.5.2 |4.3.2 |same as 1.0.1| |
|1.5.3 |4.3.2 |same as 1.0.1| |
|1.5.4 |4.3.2 |same as 1.0.1| |
|1.5.5 |4.3.2 |same as 1.0.1| |
|1.5.6-r2 |4.3.2 |same as 1.0.1| |
|1.5.7 |4.8.1 |toolchains upgrade, avrdude 6.0.1avrdude| |
|1.5.8 |4.8.1 |same as 1.5.7| |
|1.6.0 |4.8.1 |same as 1.5.7| |
|1.6.1 |4.8.1 |toolchains upgrade, added ATmega48/88/168PB, ATA5702M322, ATA5782; added RAMSTART to io*.h| |
|1.6.2 |packed | | |
|1.6.3 |4.8.1 |toolchains upgrade, cleaned| |
|1.6.4 |4.8.1 |almost the same as 1.6.1| |
|1.6.5-r5 |4.8.1 |same as 1.6.4| |
|1.6.6 |4.8.1 |same as 1.6.4| |
|1.6.7 |4.8.1 |same as 1.6.4| |
|1.6.8 |4.8.1 |same as 1.6.4| |
|1.6.9 |4.8.1 |same as 1.6.4| yes |
|1.6.10 |4.9.2 |toolchains upgrade, , avrdude 6.3 | |
|1.6.11 |4.9.2 |same as 1.6.10, back to avrdude 6.0.1| |
|1.6.12 |4.9.2 |same as 1.6.10, patched avrdude 6.3| |
|1.6.13 |4.9.2 |same as 1.6.12| yes |
|1.8.0 |4.9.2 |same as 1.6.12, another patch for avrdude 6.3 | |
|1.8.1 |4.9.2 |same as 1.8.0| |
|1.8.2 |4.9.2 |recompiled, new toolchains, lot of changes| |
|1.8.3 |4.9.2 |same as 1.8.2| |
|1.8.4 |4.9.2 |same as 1.8.2| |
|1.8.5 |4.9.2 |same as 1.8.2| yes |

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

View File

@ -0,0 +1,20 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Atmel Studio Solution File, Format Version 11.00
Project("{54F91283-7BC4-4236-8FF9-10F437C3AD48}") = "xplained168pb", "xplained168pb.cproj", "{02F0BC88-77BD-42CC-A94C-4CC452F0F909}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|AVR = Debug|AVR
Release|AVR = Release|AVR
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{02F0BC88-77BD-42CC-A94C-4CC452F0F909}.Debug|AVR.ActiveCfg = Debug|AVR
{02F0BC88-77BD-42CC-A94C-4CC452F0F909}.Debug|AVR.Build.0 = Debug|AVR
{02F0BC88-77BD-42CC-A94C-4CC452F0F909}.Release|AVR.ActiveCfg = Release|AVR
{02F0BC88-77BD-42CC-A94C-4CC452F0F909}.Release|AVR.Build.0 = Release|AVR
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,168 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<SchemaVersion>2.0</SchemaVersion>
<ProjectVersion>6.2</ProjectVersion>
<ToolchainName>com.Atmel.AVRGCC8.C</ToolchainName>
<ProjectGuid>{02f0bc88-77bd-42cc-a94c-4cc452f0f909}</ProjectGuid>
<avrdevice>ATmega168PB</avrdevice>
<avrdeviceseries>none</avrdeviceseries>
<OutputType>Executable</OutputType>
<Language>C</Language>
<OutputFileName>$(MSBuildProjectName)</OutputFileName>
<OutputFileExtension>.elf</OutputFileExtension>
<OutputDirectory>$(MSBuildProjectDirectory)\$(Configuration)</OutputDirectory>
<AssemblyName>optitest</AssemblyName>
<Name>xplained168pb</Name>
<RootNamespace>optitest</RootNamespace>
<ToolchainFlavour>Native</ToolchainFlavour>
<KeepTimersRunning>true</KeepTimersRunning>
<OverrideVtor>false</OverrideVtor>
<CacheFlash>true</CacheFlash>
<ProgFlashFromRam>true</ProgFlashFromRam>
<RamSnippetAddress>0x20000000</RamSnippetAddress>
<UncachedRange />
<preserveEEPROM>true</preserveEEPROM>
<OverrideVtorValue>exception_table</OverrideVtorValue>
<BootSegment>2</BootSegment>
<eraseonlaunchrule>0</eraseonlaunchrule>
<AsfFrameworkConfig>
<framework-data xmlns="">
<options />
<configurations />
<files />
<documentation help="https://github.com/Optiboot/optiboot/wiki" />
<offline-documentation help="" />
<dependencies>
<content-extension eid="atmel.asf" uuidref="Atmel.ASF" version="3.21.0" />
</dependencies>
</framework-data>
</AsfFrameworkConfig>
<avrtool>com.atmel.avrdbg.tool.medbg</avrtool>
<com_atmel_avrdbg_tool_medbg>
<ToolOptions>
<InterfaceProperties>
</InterfaceProperties>
<InterfaceName>ISP</InterfaceName>
</ToolOptions>
<ToolType>com.atmel.avrdbg.tool.medbg</ToolType>
<ToolNumber>ATML2222050200008424</ToolNumber>
<ToolName>mEDBG</ToolName>
</com_atmel_avrdbg_tool_medbg>
<avrtoolinterface>
</avrtoolinterface>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<ToolchainSettings>
<AvrGcc>
<avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
<avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
<avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
<avrgcc.compiler.symbols.DefSymbols>
<ListValues>
<Value>NDEBUG</Value>
</ListValues>
</avrgcc.compiler.symbols.DefSymbols>
<avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level>
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
</AvrGcc>
</ToolchainSettings>
<UsesExternalMakeFile>True</UsesExternalMakeFile>
<BuildTarget>xplained168pb</BuildTarget>
<CleanTarget>clean</CleanTarget>
<ExternalMakeFilePath>..\bootloaders\optiboot\makefile</ExternalMakeFilePath>
<PostBuildEvent>copy optiboot_xplained168pb.* ..\..\AtmelStudio
</PostBuildEvent>
<OutputDirectory>..\bootloaders\optiboot</OutputDirectory>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<ToolchainSettings>
<AvrGcc>
<avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
<avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
<avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
<avrgcc.compiler.symbols.DefSymbols>
<ListValues>
<Value>DEBUG</Value>
</ListValues>
</avrgcc.compiler.symbols.DefSymbols>
<avrgcc.compiler.optimization.level>Optimize (-O1)</avrgcc.compiler.optimization.level>
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
<avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel>
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
<avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel>
</AvrGcc>
</ToolchainSettings>
<UsesExternalMakeFile>True</UsesExternalMakeFile>
<BuildTarget>xplained168pb</BuildTarget>
<CleanTarget>clean</CleanTarget>
<ExternalMakeFilePath>..\bootloaders\optiboot\makefile</ExternalMakeFilePath>
<OutputFileName>optiboot_xplained168pb</OutputFileName>
<OutputFileExtension>.hex</OutputFileExtension>
<PostBuildEvent>copy optiboot_xplained168pb.* ..\..\AtmelStudio
</PostBuildEvent>
<OutputDirectory>..\bootloaders\optiboot</OutputDirectory>
</PropertyGroup>
<ItemGroup>
<None Include="..\bootloaders\optiboot\Makefile">
<SubType>compile</SubType>
<Link>Makefile</Link>
</None>
<None Include="..\bootloaders\optiboot\Makefile.1284">
<SubType>compile</SubType>
<Link>Makefile.1284</Link>
</None>
<None Include="..\bootloaders\optiboot\Makefile.atmel">
<SubType>compile</SubType>
<Link>Makefile.atmel</Link>
</None>
<None Include="..\bootloaders\optiboot\Makefile.custom">
<SubType>compile</SubType>
<Link>Makefile.custom</Link>
</None>
<None Include="..\bootloaders\optiboot\Makefile.extras">
<SubType>compile</SubType>
<Link>Makefile.extras</Link>
</None>
<None Include="..\bootloaders\optiboot\Makefile.isp">
<SubType>compile</SubType>
<Link>Makefile.isp</Link>
</None>
<None Include="optiboot_xplained168pb.hex">
<SubType>compile</SubType>
</None>
<None Include="optiboot_xplained168pb.lst">
<SubType>compile</SubType>
</None>
</ItemGroup>
<ItemGroup>
<Compile Include="..\bootloaders\optiboot\baudcheck.c">
<SubType>compile</SubType>
<Link>baudcheck.c</Link>
</Compile>
<Compile Include="..\bootloaders\optiboot\optiboot.c">
<SubType>compile</SubType>
<Link>optiboot.c</Link>
</Compile>
<Compile Include="..\bootloaders\optiboot\pin_defs.h">
<SubType>compile</SubType>
<Link>pin_defs.h</Link>
</Compile>
<Compile Include="..\bootloaders\optiboot\stk500.h">
<SubType>compile</SubType>
<Link>stk500.h</Link>
</Compile>
</ItemGroup>
<Import Project="$(AVRSTUDIO_EXE_PATH)\\Vs\\Compiler.targets" />
</Project>

View File

@ -0,0 +1,20 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Atmel Studio Solution File, Format Version 11.00
Project("{54F91283-7BC4-4236-8FF9-10F437C3AD48}") = "xplained328p", "xplained328p.cproj", "{02F0BC88-77BD-42CC-A94C-4CC452F0F909}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|AVR = Debug|AVR
Release|AVR = Release|AVR
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{02F0BC88-77BD-42CC-A94C-4CC452F0F909}.Debug|AVR.ActiveCfg = Debug|AVR
{02F0BC88-77BD-42CC-A94C-4CC452F0F909}.Debug|AVR.Build.0 = Debug|AVR
{02F0BC88-77BD-42CC-A94C-4CC452F0F909}.Release|AVR.ActiveCfg = Release|AVR
{02F0BC88-77BD-42CC-A94C-4CC452F0F909}.Release|AVR.Build.0 = Release|AVR
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

Binary file not shown.

View File

@ -0,0 +1,179 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<SchemaVersion>2.0</SchemaVersion>
<ProjectVersion>6.2</ProjectVersion>
<ToolchainName>com.Atmel.AVRGCC8.C</ToolchainName>
<ProjectGuid>{02f0bc88-77bd-42cc-a94c-4cc452f0f909}</ProjectGuid>
<avrdevice>ATmega328P</avrdevice>
<avrdeviceseries>none</avrdeviceseries>
<OutputType>Executable</OutputType>
<Language>C</Language>
<OutputFileName>$(MSBuildProjectName)</OutputFileName>
<OutputFileExtension>.elf</OutputFileExtension>
<OutputDirectory>$(MSBuildProjectDirectory)\$(Configuration)</OutputDirectory>
<AssemblyName>optitest</AssemblyName>
<Name>optitest</Name>
<RootNamespace>optitest</RootNamespace>
<ToolchainFlavour>Native</ToolchainFlavour>
<KeepTimersRunning>true</KeepTimersRunning>
<OverrideVtor>false</OverrideVtor>
<CacheFlash>true</CacheFlash>
<ProgFlashFromRam>true</ProgFlashFromRam>
<RamSnippetAddress>0x20000000</RamSnippetAddress>
<UncachedRange />
<preserveEEPROM>true</preserveEEPROM>
<OverrideVtorValue>exception_table</OverrideVtorValue>
<BootSegment>2</BootSegment>
<eraseonlaunchrule>0</eraseonlaunchrule>
<AsfFrameworkConfig>
<framework-data xmlns="">
<options />
<configurations />
<files />
<documentation help="https://github.com/Optiboot/optiboot/wiki" />
<offline-documentation help="" />
<dependencies>
<content-extension eid="atmel.asf" uuidref="Atmel.ASF" version="3.21.0" />
</dependencies>
</framework-data>
</AsfFrameworkConfig>
<avrtool>
</avrtool>
<com_atmel_avrdbg_tool_medbg>
<ToolOptions>
<InterfaceProperties>
</InterfaceProperties>
<InterfaceName>ISP</InterfaceName>
</ToolOptions>
<ToolType>com.atmel.avrdbg.tool.medbg</ToolType>
<ToolNumber>ATML2222050200008424</ToolNumber>
<ToolName>mEDBG</ToolName>
</com_atmel_avrdbg_tool_medbg>
<avrtoolinterface>ISP</avrtoolinterface>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<ToolchainSettings>
<AvrGcc>
<avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
<avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
<avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
<avrgcc.compiler.symbols.DefSymbols>
<ListValues>
<Value>NDEBUG</Value>
</ListValues>
</avrgcc.compiler.symbols.DefSymbols>
<avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level>
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
<avrgcc.linker.libraries.Libraries>
<ListValues>
<Value>libm</Value>
</ListValues>
</avrgcc.linker.libraries.Libraries>
</AvrGcc>
</ToolchainSettings>
<UsesExternalMakeFile>True</UsesExternalMakeFile>
<OutputDirectory>..\bootloaders\optiboot</OutputDirectory>
<BuildTarget>xplained328p</BuildTarget>
<CleanTarget>clean</CleanTarget>
<ExternalMakeFilePath>..\bootloaders\optiboot\Makefile</ExternalMakeFilePath>
<PostBuildEvent>copy optiboot_xplained328p.* ..\..\AtmelStudio
</PostBuildEvent>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<ToolchainSettings>
<AvrGcc>
<avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
<avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
<avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
<avrgcc.compiler.symbols.DefSymbols>
<ListValues>
<Value>DEBUG</Value>
</ListValues>
</avrgcc.compiler.symbols.DefSymbols>
<avrgcc.compiler.optimization.level>Optimize (-O1)</avrgcc.compiler.optimization.level>
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
<avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel>
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
<avrgcc.linker.libraries.Libraries>
<ListValues>
<Value>libm</Value>
</ListValues>
</avrgcc.linker.libraries.Libraries>
<avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel>
</AvrGcc>
</ToolchainSettings>
<UsesExternalMakeFile>True</UsesExternalMakeFile>
<BuildTarget>xplained328p</BuildTarget>
<CleanTarget>clean</CleanTarget>
<ExternalMakeFilePath>..\bootloaders\optiboot\Makefile</ExternalMakeFilePath>
<OutputFileName>optiboot_xplained328p</OutputFileName>
<OutputFileExtension>.hex</OutputFileExtension>
<OutputDirectory>..\bootloaders\optiboot</OutputDirectory>
<PostBuildEvent>copy optiboot_xplained328p.* ..\..\AtmelStudio
</PostBuildEvent>
<PreBuildEvent>
</PreBuildEvent>
</PropertyGroup>
<ItemGroup>
<None Include="..\bootloaders\optiboot\Makefile">
<SubType>compile</SubType>
<Link>Makefile</Link>
</None>
<None Include="..\bootloaders\optiboot\Makefile.1284">
<SubType>compile</SubType>
<Link>Makefile.1284</Link>
</None>
<None Include="..\bootloaders\optiboot\Makefile.atmel">
<SubType>compile</SubType>
<Link>Makefile.atmel</Link>
</None>
<None Include="..\bootloaders\optiboot\Makefile.custom">
<SubType>compile</SubType>
<Link>Makefile.custom</Link>
</None>
<None Include="..\bootloaders\optiboot\Makefile.extras">
<SubType>compile</SubType>
<Link>Makefile.extras</Link>
</None>
<None Include="..\bootloaders\optiboot\Makefile.isp">
<SubType>compile</SubType>
<Link>Makefile.isp</Link>
</None>
</ItemGroup>
<ItemGroup>
<Compile Include="..\bootloaders\optiboot\baudcheck.c">
<SubType>compile</SubType>
<Link>baudcheck.c</Link>
</Compile>
<Compile Include="..\bootloaders\optiboot\boot.h">
<SubType>compile</SubType>
<Link>boot.h</Link>
</Compile>
<Compile Include="..\bootloaders\optiboot\optiboot.c">
<SubType>compile</SubType>
<Link>optiboot.c</Link>
</Compile>
<Compile Include="..\bootloaders\optiboot\pin_defs.h">
<SubType>compile</SubType>
<Link>pin_defs.h</Link>
</Compile>
<Compile Include="..\bootloaders\optiboot\stk500.h">
<SubType>compile</SubType>
<Link>stk500.h</Link>
</Compile>
</ItemGroup>
<Import Project="$(AVRSTUDIO_EXE_PATH)\\Vs\\Compiler.targets" />
</Project>

View File

@ -0,0 +1,20 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Atmel Studio Solution File, Format Version 11.00
Project("{54F91283-7BC4-4236-8FF9-10F437C3AD48}") = "xplained328pb", "xplained328pb.cproj", "{02F0BC88-77BD-42CC-A94C-4CC452F0F909}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|AVR = Debug|AVR
Release|AVR = Release|AVR
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{02F0BC88-77BD-42CC-A94C-4CC452F0F909}.Debug|AVR.ActiveCfg = Release|AVR
{02F0BC88-77BD-42CC-A94C-4CC452F0F909}.Debug|AVR.Build.0 = Release|AVR
{02F0BC88-77BD-42CC-A94C-4CC452F0F909}.Release|AVR.ActiveCfg = Release|AVR
{02F0BC88-77BD-42CC-A94C-4CC452F0F909}.Release|AVR.Build.0 = Release|AVR
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,179 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<SchemaVersion>2.0</SchemaVersion>
<ProjectVersion>6.2</ProjectVersion>
<ToolchainName>com.Atmel.AVRGCC8.C</ToolchainName>
<ProjectGuid>{02f0bc88-77bd-42cc-a94c-4cc452f0f909}</ProjectGuid>
<avrdevice>ATmega328PB</avrdevice>
<avrdeviceseries>none</avrdeviceseries>
<OutputType>Executable</OutputType>
<Language>C</Language>
<OutputFileName>$(MSBuildProjectName)</OutputFileName>
<OutputFileExtension>.elf</OutputFileExtension>
<OutputDirectory>$(MSBuildProjectDirectory)\$(Configuration)</OutputDirectory>
<AssemblyName>optitest</AssemblyName>
<Name>optitest</Name>
<RootNamespace>optitest</RootNamespace>
<ToolchainFlavour>Native</ToolchainFlavour>
<KeepTimersRunning>true</KeepTimersRunning>
<OverrideVtor>false</OverrideVtor>
<CacheFlash>true</CacheFlash>
<ProgFlashFromRam>true</ProgFlashFromRam>
<RamSnippetAddress>0x20000000</RamSnippetAddress>
<UncachedRange />
<preserveEEPROM>true</preserveEEPROM>
<OverrideVtorValue>exception_table</OverrideVtorValue>
<BootSegment>2</BootSegment>
<eraseonlaunchrule>0</eraseonlaunchrule>
<AsfFrameworkConfig>
<framework-data xmlns="">
<options />
<configurations />
<files />
<documentation help="https://github.com/Optiboot/optiboot/wiki" />
<offline-documentation help="" />
<dependencies>
<content-extension eid="atmel.asf" uuidref="Atmel.ASF" version="3.21.0" />
</dependencies>
</framework-data>
</AsfFrameworkConfig>
<avrtool>com.atmel.avrdbg.tool.medbg</avrtool>
<com_atmel_avrdbg_tool_medbg>
<ToolOptions>
<InterfaceProperties>
</InterfaceProperties>
<InterfaceName>ISP</InterfaceName>
</ToolOptions>
<ToolType>com.atmel.avrdbg.tool.medbg</ToolType>
<ToolNumber>ATML2222050200008424</ToolNumber>
<ToolName>mEDBG</ToolName>
</com_atmel_avrdbg_tool_medbg>
<avrtoolinterface>ISP</avrtoolinterface>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<ToolchainSettings>
<AvrGcc>
<avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
<avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
<avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
<avrgcc.compiler.symbols.DefSymbols>
<ListValues>
<Value>NDEBUG</Value>
</ListValues>
</avrgcc.compiler.symbols.DefSymbols>
<avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level>
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
<avrgcc.linker.libraries.Libraries>
<ListValues>
<Value>libm</Value>
</ListValues>
</avrgcc.linker.libraries.Libraries>
</AvrGcc>
</ToolchainSettings>
<UsesExternalMakeFile>True</UsesExternalMakeFile>
<OutputDirectory>..\bootloaders\optiboot</OutputDirectory>
<BuildTarget>xplained328pb</BuildTarget>
<CleanTarget>clean</CleanTarget>
<ExternalMakeFilePath>..\bootloaders\optiboot\Makefile</ExternalMakeFilePath>
<PostBuildEvent>copy optiboot_xplained328pb.* ..\..\AtmelStudio</PostBuildEvent>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<ToolchainSettings>
<AvrGcc>
<avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
<avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
<avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
<avrgcc.compiler.symbols.DefSymbols>
<ListValues>
<Value>DEBUG</Value>
</ListValues>
</avrgcc.compiler.symbols.DefSymbols>
<avrgcc.compiler.optimization.level>Optimize (-O1)</avrgcc.compiler.optimization.level>
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
<avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel>
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
<avrgcc.linker.libraries.Libraries>
<ListValues>
<Value>libm</Value>
</ListValues>
</avrgcc.linker.libraries.Libraries>
<avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel>
</AvrGcc>
</ToolchainSettings>
<UsesExternalMakeFile>True</UsesExternalMakeFile>
<BuildTarget>xplained328pb</BuildTarget>
<CleanTarget>clean</CleanTarget>
<ExternalMakeFilePath>..\bootloaders\optiboot\Makefile</ExternalMakeFilePath>
<OutputFileName>optiboot_xplained328pb</OutputFileName>
<OutputFileExtension>.hex</OutputFileExtension>
<OutputDirectory>..\bootloaders\optiboot</OutputDirectory>
<PostBuildEvent>copy optiboot_xplained328pb.* ..\..\AtmelStudio</PostBuildEvent>
</PropertyGroup>
<ItemGroup>
<None Include="..\bootloaders\optiboot\Makefile">
<SubType>compile</SubType>
<Link>Makefile</Link>
</None>
<None Include="..\bootloaders\optiboot\Makefile.1284">
<SubType>compile</SubType>
<Link>Makefile.1284</Link>
</None>
<None Include="..\bootloaders\optiboot\Makefile.atmel">
<SubType>compile</SubType>
<Link>Makefile.atmel</Link>
</None>
<None Include="..\bootloaders\optiboot\Makefile.custom">
<SubType>compile</SubType>
<Link>Makefile.custom</Link>
</None>
<None Include="..\bootloaders\optiboot\Makefile.extras">
<SubType>compile</SubType>
<Link>Makefile.extras</Link>
</None>
<None Include="..\bootloaders\optiboot\Makefile.isp">
<SubType>compile</SubType>
<Link>Makefile.isp</Link>
</None>
<None Include="optiboot_xplained328pb.hex">
<SubType>compile</SubType>
</None>
<None Include="optiboot_xplained328pb.lst">
<SubType>compile</SubType>
</None>
</ItemGroup>
<ItemGroup>
<Compile Include="..\bootloaders\optiboot\baudcheck.c">
<SubType>compile</SubType>
<Link>baudcheck.c</Link>
</Compile>
<Compile Include="..\bootloaders\optiboot\boot.h">
<SubType>compile</SubType>
<Link>boot.h</Link>
</Compile>
<Compile Include="..\bootloaders\optiboot\optiboot.c">
<SubType>compile</SubType>
<Link>optiboot.c</Link>
</Compile>
<Compile Include="..\bootloaders\optiboot\pin_defs.h">
<SubType>compile</SubType>
<Link>pin_defs.h</Link>
</Compile>
<Compile Include="..\bootloaders\optiboot\stk500.h">
<SubType>compile</SubType>
<Link>stk500.h</Link>
</Compile>
</ItemGroup>
<Import Project="$(AVRSTUDIO_EXE_PATH)\\Vs\\Compiler.targets" />
</Project>

View File

@ -0,0 +1,461 @@
#
# Boards.txt file for Optiboot platforms, in format for Arduino 1.5.x and later.
#
# See: http://github.com/Arduino/arduino/
name=[Optiboot]
version=6.2
##############################################################
## Optiboot on 28-pin processors (atmega8/88/168/328/etc)
menu.cpu=Processor
menu.mhz=CPU Speed
optiboot28.name=Optiboot on 28-pin cpus
optiboot28.upload.tool=arduino:avrdude
optiboot28.upload.protocol=arduino
optiboot28.upload.speed=115200
optiboot28.bootloader.tool=arduino:avrdude
optiboot28.bootloader.low_fuses=0xF7
optiboot28.bootloader.unlock_bits=0x3F
optiboot28.bootloader.lock_bits=0x2F
optiboot28.build.f_cpu=16000000L
#
# Other Clock speeds.
# For 8MHz using the internal RC Oscillator, we adjust fuses, use the same
# bootloader binary, and halve the upload rate.
#
optiboot28.menu.mhz.16MHz=16MHz
optiboot28.menu.mhz.16MHz.upload.speed=115200
optiboot28.menu.mhz.8MHz=8MHz (int)
optiboot28.menu.mhz.8MHz.build.f_cpu=8000000L
optiboot28.menu.mhz.8MHz.bootloader.low_fuses=0xE2
optiboot28.menu.mhz.8MHz.upload.speed=57600
optiboot28.menu.mhz.1MHz=1MHz (int)
optiboot28.menu.mhz.1MHz.build.f_cpu=1000000L
optiboot28.menu.mhz.1MHz.bootloader.low_fuses=0x62
optiboot28.menu.mhz.1MHz.upload.speed=9600
# optiboot platforms should be UNO-like more than anything else.
optiboot28.build.board=AVR_UNO
optiboot28.build.core=arduino:arduino
optiboot28.build.variant=arduino:standard
## Optiboot for ATmega328p
## ---------------------------------------------
optiboot28.menu.cpu.atmega328p=ATmega328p
optiboot28.menu.cpu.atmega328p.upload.maximum_size=32256
optiboot28.menu.cpu.atmega328p.upload.maximum_data_size=2048
optiboot28.menu.cpu.atmega328p.bootloader.high_fuses=0xDE
optiboot28.menu.cpu.atmega328p.bootloader.extended_fuses=0x05
optiboot28.menu.cpu.atmega328p.bootloader.file=optiboot/optiboot_atmega328.hex
optiboot28.menu.cpu.atmega328p.build.mcu=atmega328p
## Optiboot for ATmega328
## ---------------------------------------------
optiboot28.menu.cpu.atmega328=ATmega328
optiboot28.menu.cpu.atmega328.upload.maximum_size=32256
optiboot28.menu.cpu.atmega328.upload.maximum_data_size=2048
optiboot28.menu.cpu.atmega328.bootloader.high_fuses=0xDE
optiboot28.menu.cpu.atmega328.bootloader.extended_fuses=0x05
optiboot28.menu.cpu.atmega328.bootloader.file=optiboot/optiboot_atmega328.hex
# lie! Arduino wise, these are compatible
optiboot28.menu.cpu.atmega328.build.mcu=atmega328p
## Optiboot ATmega168
## ---------------------------------------------
optiboot28.menu.cpu.atmega168=ATmega168
optiboot28.menu.cpu.atmega168.upload.maximum_size=15872
optiboot28.menu.cpu.atmega168.upload.maximum_data_size=1024
optiboot28.menu.cpu.atmega168.bootloader.high_fuses=0xDD
optiboot28.menu.cpu.atmega168.bootloader.extended_fuses=0xFC
optiboot28.menu.cpu.atmega168.bootloader.file=optiboot/optiboot_atmega168.hex
optiboot28.menu.cpu.atmega168.build.mcu=atmega168
## ---------------------------------------------
optiboot28.menu.cpu.atmega168p=ATmega168p
optiboot28.menu.cpu.atmega168p.upload.maximum_size=15872
optiboot28.menu.cpu.atmega168p.upload.maximum_data_size=1024
optiboot28.menu.cpu.atmega168p.bootloader.high_fuses=0xDD
optiboot28.menu.cpu.atmega168p.bootloader.extended_fuses=0xFC
optiboot28.menu.cpu.atmega168p.bootloader.file=optiboot/optiboot_atmega168.hex
optiboot28.menu.cpu.atmega168p.build.mcu=atmega168p
## optiboot for ATmega8
## ---------------------------------------------
optiboot28.menu.cpu.atmega8=ATmega8
optiboot28.menu.cpu.atmega8.upload.maximum_size=7680
optiboot28.menu.cpu.atmega8.upload.maximum_data_size=1024
optiboot28.menu.cpu.atmega8.bootloader.high_fuses=0xCC
optiboot28.menu.cpu.atmega8.bootloader.low_fuses=0xBF
# optiboot28.menu.cpu.atmega8.bootloader.extended_fuses=0x00
optiboot28.menu.cpu.atmega8.bootloader.file=optiboot/optiboot_atmega8.hex
optiboot28.menu.cpu.atmega8.build.mcu=atmega8
## Atmega88
## ---------------------------------------------
optiboot28.menu.cpu.atmega88=ATmega88
optiboot28.menu.cpu.atmega88.upload.maximum_size=7680
optiboot28.menu.cpu.atmega88.upload.maximum_data_size=1024
optiboot28.menu.cpu.atmega88.bootloader.high_fuses=0xDD
optiboot28.menu.cpu.atmega88.bootloader.extended_fuses=0xFC
optiboot28.menu.cpu.atmega88.bootloader.file=optiboot/optiboot_atmega88.hex
optiboot28.menu.cpu.atmega88.build.mcu=atmega88p
##############################################################
## Optiboot on 32pin (SMT) CPUs (Nano, Pro Micro, etc.)
##############################################################
optiboot32.name=Optiboot on 32-pin cpus
optiboot32.upload.tool=arduino:avrdude
optiboot32.upload.protocol=arduino
optiboot32.upload.speed=115200
optiboot32.bootloader.tool=arduino:avrdude
optiboot32.bootloader.low_fuses=0xF7
optiboot32.bootloader.unlock_bits=0x3F
optiboot32.bootloader.lock_bits=0x2F
optiboot32.build.f_cpu=16000000L
#
# Other Clock speeds.
# For 8MHz using the internal RC Oscillator, we adjust fuses, use the same
# bootloader binary, and halve the upload rate.
#
optiboot32.menu.mhz.16MHz=16MHz
optiboot32.menu.mhz.16MHz.upload.speed=115200
optiboot32.menu.mhz.8MHz=8MHz (int)
optiboot32.menu.mhz.8MHz.build.f_cpu=8000000L
optiboot32.menu.mhz.8MHz.bootloader.low_fuses=0xE2
optiboot32.menu.mhz.8MHz.upload.speed=57600
optiboot32.menu.mhz.1MHz=1MHz (int)
optiboot32.menu.mhz.1MHz.build.f_cpu=1000000L
optiboot32.menu.mhz.1MHz.bootloader.low_fuses=0x62
optiboot32.menu.mhz.1MHz.upload.speed=9600
# optiboot platforms should be UNO-like more than anything else.
optiboot32.build.board=AVR_UNO
optiboot32.build.core=arduino:arduino
optiboot32.build.variant=arduino:eightanaloginputs
## Optiboot for ATmega328p
## ---------------------------------------------
optiboot32.menu.cpu.atmega328p=ATmega328p
optiboot32.menu.cpu.atmega328p.upload.maximum_size=32256
optiboot32.menu.cpu.atmega328p.upload.maximum_data_size=2048
optiboot32.menu.cpu.atmega328p.bootloader.high_fuses=0xDE
optiboot32.menu.cpu.atmega328p.bootloader.extended_fuses=0x05
optiboot32.menu.cpu.atmega328p.bootloader.file=optiboot/optiboot_atmega328.hex
optiboot32.menu.cpu.atmega328p.build.mcu=atmega328p
## Optiboot for ATmega328
## ---------------------------------------------
optiboot32.menu.cpu.atmega328=ATmega328
optiboot32.menu.cpu.atmega328.upload.maximum_size=32256
optiboot32.menu.cpu.atmega328.upload.maximum_data_size=2048
optiboot32.menu.cpu.atmega328.bootloader.high_fuses=0xDE
optiboot32.menu.cpu.atmega328.bootloader.extended_fuses=0x05
optiboot32.menu.cpu.atmega328.bootloader.file=optiboot/optiboot_atmega328.hex
# lie! Arduino wise, these are compatible
optiboot32.menu.cpu.atmega328.build.mcu=atmega328p
## Optiboot ATmega168
## ---------------------------------------------
optiboot32.menu.cpu.atmega168=ATmega168
optiboot32.menu.cpu.atmega168.upload.maximum_size=15872
optiboot32.menu.cpu.atmega168.upload.maximum_data_size=1024
optiboot32.menu.cpu.atmega168.bootloader.high_fuses=0xDD
optiboot32.menu.cpu.atmega168.bootloader.extended_fuses=0xFC
optiboot32.menu.cpu.atmega168.bootloader.file=optiboot/optiboot_atmega168.hex
optiboot32.menu.cpu.atmega168.build.mcu=atmega168
## ---------------------------------------------
optiboot32.menu.cpu.atmega168p=ATmega168p
optiboot32.menu.cpu.atmega168p.upload.maximum_size=15872
optiboot32.menu.cpu.atmega168p.upload.maximum_data_size=1024
optiboot32.menu.cpu.atmega168p.bootloader.high_fuses=0xDD
optiboot32.menu.cpu.atmega168p.bootloader.extended_fuses=0xFC
optiboot32.menu.cpu.atmega168p.bootloader.file=optiboot/optiboot_atmega168.hex
optiboot32.menu.cpu.atmega168p.build.mcu=atmega168p
##############################################################
## Other optiboot platforms
##############################################################
optiboot1280.name=Optiboot on Mega1280
optiboot1280.upload.tool=arduino:avrdude
optiboot1280.upload.protocol=arduino
optiboot1280.upload.speed=115200
optiboot1280.bootloader.tool=arduino:avrdude
optiboot1280.bootloader.unlock_bits=0x3F
optiboot1280.bootloader.lock_bits=0x2F
optiboot1280.build.f_cpu=16000000L
optiboot1280.build.board=AVR_MEGA
optiboot1280.build.core=arduino:arduino
optiboot1280.build.variant=arduino:mega
optiboot1280.upload.maximum_size=130048
optiboot1280.upload.maximum_data_size=8192
optiboot1280.bootloader.low_fuses=0xFF
optiboot1280.bootloader.high_fuses=0xDE
optiboot1280.bootloader.extended_fuses=0x05
optiboot1280.bootloader.file=optiboot/optiboot_atmega1280.hex
optiboot1280.build.mcu=atmega1280
##############################################################
optiboot1284.name=Optiboot on (generic) Mega1284
optiboot1284.upload.tool=arduino:avrdude
optiboot1284.upload.protocol=arduino
optiboot1284.upload.speed=115200
optiboot1284.bootloader.tool=arduino:avrdude
optiboot1284.bootloader.unlock_bits=0x3F
optiboot1284.bootloader.lock_bits=0x2F
optiboot1284.build.f_cpu=16000000L
optiboot1284.build.board=AVR_M1284
optiboot1284.build.core=arduino:arduino
optiboot1284.build.variant=arduino:standard
optiboot1284.upload.maximum_size=130048
optiboot1284.upload.maximum_data_size=16384
# Select full swing crystal oscillator (F7 rather than FF)
optiboot1284.bootloader.low_fuses=0xF7
optiboot1284.bootloader.high_fuses=0xDE
optiboot1284.bootloader.extended_fuses=0x05
optiboot1284.bootloader.file=optiboot/optiboot_atmega1284p.hex
optiboot1284.build.mcu=atmega1284p
##############################################################
optibootm32.name=Optiboot on Mega32
optibootm32.upload.tool=arduino:avrdude
optibootm32.upload.protocol=arduino
optibootm32.upload.speed=115200
optibootm32.bootloader.tool=arduino:avrdude
optibootm32.bootloader.unlock_bits=0x3F
optibootm32.bootloader.lock_bits=0x2F
optibootm32.build.f_cpu=16000000L
optibootm32.build.board=AVR_M32
optibootm32.build.core=arduino:arduino
optibootm32.build.variant=arduino:standard
optibootm32.upload.maximum_size=130048
optibootm32.upload.maximum_data_size=8192
optibootm32.bootloader.low_fuses=0xBF
optibootm32.bootloader.high_fuses=0xCE
optibootm32.bootloader.extended_fuses=0xFF
optibootm32.bootloader.file=optiboot/optiboot_atmega32.hex
optibootm32.build.mcu=atmega32
##############################################################
optiboott84.name=Optiboot on Tiny84
optiboott84.menu.mhz.8MHz=8MHz (int)
optiboott84.menu.mhz.8MHz.build.f_cpu=8000000L
optiboott84.menu.mhz.8MHz.upload.speed=57600
optiboott84.menu.mhz.8MHz.bootloader.file=optiboot/optiboot_attiny84_8mhz.hex
optiboott84.menu.mhz.8MHz.bootloader.low_fuses=0xE2
optiboott84.menu.mhz.8MHz.bootloader.high_fuses=0xDE
optiboott84.menu.mhz.8MHz.bootloader.extended_fuses=0xFE
optiboott84.menu.mhz.1MHz=1MHz (int)
optiboott84.menu.mhz.1MHz.build.f_cpu=1000000L
optiboott84.menu.mhz.1MHz.upload.speed=9600
optiboott84.menu.mhz.1MHz.bootloader.file=optiboot/optiboot_attiny84.hex
optiboott84.menu.mhz.1MHz.bootloader.low_fuses=0x62
optiboott84.menu.mhz.1MHz.bootloader.high_fuses=0xDE
optiboott84.menu.mhz.1MHz.bootloader.extended_fuses=0xFE
optiboott84.upload.tool=arduino:avrdude
optiboott84.upload.protocol=arduino
optiboott84.upload.speed=9600
optiboott84.bootloader.tool=arduino:avrdude
optiboott84.bootloader.unlock_bits=0x3F
optiboott84.bootloader.lock_bits=0x2F
optiboott84.build.f_cpu=1000000L
optiboott84.build.board=AVR_TINY
optiboott84.build.core=tiny:tiny
optiboott84.build.variant=tiny:tiny
optiboott84.upload.maximum_size=7600
optiboott84.upload.maximum_data_size=512
optiboott84.build.mcu=attiny84
##############################################################
optiboot2560.name=Optiboot on Mega2560
optiboot2560.upload.tool=arduino:avrdude
optiboot2560.upload.protocol=arduino
optiboot2560.upload.speed=115200
optiboot2560.bootloader.tool=arduino:avrdude
optiboot2560.bootloader.unlock_bits=0x3F
optiboot2560.bootloader.lock_bits=0x2F
optiboot2560.build.f_cpu=16000000L
optiboot2560.build.board=AVR_MEGA
optiboot2560.build.core=arduino:arduino
optiboot2560.build.variant=arduino:mega
optiboot2560.upload.maximum_size=261120
optiboot2560.upload.maximum_data_size=8192
optiboot2560.bootloader.low_fuses=0xF7
optiboot2560.bootloader.high_fuses=0xDE
optiboot2560.bootloader.extended_fuses=0xFD
optiboot2560.bootloader.file=optiboot/optiboot_atmega2560.hex
optiboot2560.build.mcu=atmega2560
##############################################################
optibootxmini168b.name=Optiboot Xplained Mini 168pb
optibootxmini168b.upload.tool=arduino:avrdude
optibootxmini168b.upload.protocol=arduino
optibootxmini168b.upload.speed=57600
optibootxmini168b.bootloader.tool=arduino:avrdude
optibootxmini168b.bootloader.unlock_bits=0x3F
optibootxmini168b.bootloader.lock_bits=0x2F
optibootxmini168b.build.f_cpu=16000000L
optibootxmini168b.build.board=AVR_UNO
optibootxmini168b.build.core=arduino:arduino
optibootxmini168b.build.variant=arduino:standard
optibootxmini168b.upload.maximum_size=15872
optibootxmini168b.upload.maximum_data_size=1024
optibootxmini168b.bootloader.low_fuses=0xBF
optibootxmini168b.bootloader.high_fuses=0xCE
optibootxmini168b.bootloader.extended_fuses=0xFF
optibootxmini168b.bootloader.file=optiboot/optiboot_xplained168b.hex
optibootxmini168b.build.mcu=atmega168
#############################
optibootxmini328pb.name=Optiboot Xplained Mini 328pb
optibootxmini328pb.upload.tool=arduino:avrdude
optibootxmini328pb.upload.protocol=arduino
optibootxmini328pb.upload.speed=57600
optibootxmini328pb.bootloader.tool=arduino:avrdude
optibootxmini328pb.bootloader.unlock_bits=0x3F
optibootxmini328pb.bootloader.lock_bits=0x2F
optibootxmini328pb.build.f_cpu=16000000L
optibootxmini328pb.build.board=AVR_UNO
optibootxmini328pb.build.core=arduino:arduino
optibootxmini328pb.build.variant=arduino:standard
optibootxmini328pb.upload.maximum_size=32128
optibootxmini328pb.upload.maximum_data_size=1024
optibootxmini328pb.bootloader.low_fuses=0xBF
optibootxmini328pb.bootloader.high_fuses=0xCE
optibootxmini328pb.bootloader.extended_fuses=0xFF
optibootxmini328pb.bootloader.file=optiboot/optiboot_xplained328pb.hex
optibootxmini328pb.build.mcu=atmega328p
#############################
optibootxmini328p.name=Optiboot Xplained Mini 328p
optibootxmini328p.upload.tool=arduino:avrdude
optibootxmini328p.upload.protocol=arduino
optibootxmini328p.upload.speed=57600
optibootxmini328p.bootloader.tool=arduino:avrdude
optibootxmini328p.bootloader.unlock_bits=0x3F
optibootxmini328p.bootloader.lock_bits=0x2F
optibootxmini328p.build.f_cpu=16000000L
optibootxmini328p.build.board=AVR_UNO
optibootxmini328p.build.core=arduino:arduino
optibootxmini328p.build.variant=arduino:standard
optibootxmini328p.upload.maximum_size=32128
optibootxmini328p.upload.maximum_data_size=1024
optibootxmini328p.bootloader.low_fuses=0xBF
optibootxmini328p.bootloader.high_fuses=0xCE
optibootxmini328p.bootloader.extended_fuses=0xFF
optibootxmini328p.bootloader.file=optiboot/optiboot_xplained328p.hex
optibootxmini328p.build.mcu=atmega328p

View File

@ -0,0 +1,351 @@
# Optiboot Arduino support
# http://optiboot.googlecode.com
# Peter Knight, 2010
# Bill Westfield, 2013 - now includes build.variant for 1.0.2 and later
##############################################################
atmega328o.name=[Optiboot] Arduino Duemilanove or Nano w/ ATmega328
atmega328o.upload.protocol=arduino
atmega328o.upload.maximum_size=32256
atmega328o.upload.speed=115200
atmega328o.bootloader.low_fuses=0xff
atmega328o.bootloader.high_fuses=0xde
atmega328o.bootloader.extended_fuses=0x05
atmega328o.bootloader.path=optiboot
atmega328o.bootloader.file=optiboot_atmega328.hex
atmega328o.bootloader.unlock_bits=0x3F
atmega328o.bootloader.lock_bits=0x0F
atmega328o.build.mcu=atmega328p
atmega328o.build.f_cpu=16000000L
atmega328o.build.core=arduino:arduino
atmega328o.build.variant=arduino:standard
##############################################################
diecimilao.name=[Optiboot] Arduino Diecimila, Duemilanove, Nano, NG w/ ATmega168
diecimilao.upload.protocol=arduino
diecimilao.upload.maximum_size=15872
diecimilao.upload.speed=115200
diecimilao.bootloader.low_fuses=0xff
diecimilao.bootloader.high_fuses=0xdd
diecimilao.bootloader.extended_fuses=0x04
diecimilao.bootloader.path=optiboot
diecimilao.bootloader.file=optiboot_diecimila.hex
diecimilao.bootloader.unlock_bits=0x3F
diecimilao.bootloader.lock_bits=0x0F
diecimilao.build.mcu=atmega168
diecimilao.build.f_cpu=16000000L
diecimilao.build.core=arduino:arduino
diecimilao.build.variant=arduino:standard
##############################################################
minio.name=[Optiboot] Arduino Mini
minio.upload.protocol=arduino
minio.upload.maximum_size=15872
minio.upload.speed=115200
minio.bootloader.low_fuses=0xff
minio.bootloader.high_fuses=0xdd
minio.bootloader.extended_fuses=0x02
minio.bootloader.path=optiboot
minio.bootloader.file=optiboot_ng.hex
minio.bootloader.unlock_bits=0x3F
minio.bootloader.lock_bits=0x0F
minio.build.mcu=atmega168
minio.build.f_cpu=16000000L
minio.build.core=arduino:arduino
minio.build.variant=arduino:eightanaloginputs
##############################################################
lilypad328o.name=[Optiboot] LilyPad Arduino w/ ATmega328
lilypad328o.upload.protocol=arduino
lilypad328o.upload.maximum_size=32256
lilypad328o.upload.speed=115200
lilypad328o.bootloader.low_fuses=0xff
lilypad328o.bootloader.high_fuses=0xdc
lilypad328o.bootloader.extended_fuses=0x05
lilypad328o.bootloader.path=optiboot
lilypad328o.bootloader.file=optiboot_atmega328_pro_8MHz.hex
lilypad328o.bootloader.unlock_bits=0x3F
lilypad328o.bootloader.lock_bits=0x0F
lilypad328o.build.mcu=atmega328p
lilypad328o.build.f_cpu=8000000L
lilypad328o.build.core=arduino:arduino
lilypad328o.build.variant=arduino:standard
##############################################################
lilypado.name=[Optiboot] LilyPad Arduino w/ ATmega168
lilypado.upload.protocol=arduino
lilypado.upload.maximum_size=15872
lilypado.upload.speed=115200
lilypado.bootloader.low_fuses=0xe2
lilypado.bootloader.high_fuses=0xdd
lilypado.bootloader.extended_fuses=0x02
lilypado.bootloader.path=lilypad
lilypado.bootloader.file=optiboot_lilypad.hex
lilypado.bootloader.unlock_bits=0x3F
lilypado.bootloader.lock_bits=0x0F
lilypado.build.mcu=atmega168
lilypado.build.f_cpu=8000000L
lilypado.build.core=arduino:arduino
lilypado.build.variant=arduino:standard
##############################################################
pro328o.name=[Optiboot] Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328
pro328o.upload.protocol=arduino
pro328o.upload.maximum_size=32256
pro328o.upload.speed=115200
pro328o.bootloader.low_fuses=0xff
pro328o.bootloader.high_fuses=0xdc
pro328o.bootloader.extended_fuses=0x05
pro328o.bootloader.path=optiboot
pro328o.bootloader.file=optiboot_atmega328_pro_8MHz.hex
pro328o.bootloader.unlock_bits=0x3F
pro328o.bootloader.lock_bits=0x0F
pro328o.build.mcu=atmega328p
pro328o.build.f_cpu=8000000L
pro328o.build.core=arduino:arduino
pro328o.build.variant=arduino:standard
##############################################################
proo.name=[Optiboot] Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168
proo.upload.protocol=arduino
proo.upload.maximum_size=15872
proo.upload.speed=115200
proo.bootloader.low_fuses=0xc6
proo.bootloader.high_fuses=0xdd
proo.bootloader.extended_fuses=0x02
proo.bootloader.path=optiboot
proo.bootloader.file=optiboot_pro_8MHz.hex
proo.bootloader.unlock_bits=0x3F
proo.bootloader.lock_bits=0x0F
proo.build.mcu=atmega168
proo.build.f_cpu=8000000L
proo.build.core=arduino:arduino
proo.build.variant=arduino:standard
##############################################################
megao.name=[Optiboot] Arduino Mega1280
megao.upload.protocol=arduino
megao.upload.maximum_size=130048
megao.upload.speed=115200
megao.bootloader.low_fuses=0xff
megao.bootloader.high_fuses=0xde
megao.bootloader.extended_fuses=0xf5
megao.bootloader.path=optiboot
megao.bootloader.file=optiboot_atmega1280.hex
megao.bootloader.unlock_bits=0x3F
megao.bootloader.lock_bits=0x0F
megao.build.mcu=atmega1280
megao.build.f_cpu=16000000L
megao.build.core=arduino:arduino
megao.build.variant=arduino:mega
atmega8o.name=[Optiboot] Arduino NG or older w/ ATmega8
atmega8o.upload.protocol=arduino
atmega8o.upload.maximum_size=7680
atmega8o.upload.speed=115200
atmega8o.bootloader.low_fuses=0xbf
atmega8o.bootloader.high_fuses=0xdc
atmega8o.bootloader.path=optiboot
atmega8o.bootloader.file=optiboot_atmega8.hex
atmega8o.bootloader.unlock_bits=0x3F
atmega8o.bootloader.lock_bits=0x0F
atmega8o.build.mcu=atmega8
atmega8o.build.f_cpu=16000000L
atmega8o.build.core=arduino:arduino
atmega8o.build.variant=arduino:standard
atmega88o.name=[Optiboot] Arduino NG or older w/ ATmega88
atmega88o.upload.protocol=arduino
atmega88o.upload.maximum_size=7680
atmega88o.upload.speed=115200
atmega88o.bootloader.low_fuses=0xff
atmega88o.bootloader.high_fuses=0xdd
atmega88o.bootloader.extended_fuses=0x04
atmega88o.bootloader.path=optiboot
atmega88o.bootloader.file=optiboot_atmega88.hex
atmega88o.bootloader.unlock_bits=0x3F
atmega88o.bootloader.lock_bits=0x0F
atmega88o.build.mcu=atmega88
atmega88o.build.f_cpu=16000000L
atmega88o.build.core=arduino:arduino
atmega88o.build.variant=arduino:standard
##############################################################
#
# sanguinoo.name=[Optiboot] Sanguino (work in progress)
# sanguinoo.upload.protocol=arduino
# sanguinoo.upload.maximum_size=63488
# sanguinoo.upload.speed=115200
# sanguinoo.bootloader.low_fuses=0xff
# sanguinoo.bootloader.high_fuses=0xdc
# sanguinoo.bootloader.extended_fuses=0xfd
# sanguinoo.bootloader.path=optiboot
# sanguinoo.bootloader.file=optiboot_atmega644p.hex
# sanguinoo.bootloader.unlock_bits=0x3F
# sanguinoo.bootloader.lock_bits=0x0F
# sanguinoo.build.mcu=atmega644p
# sanguinoo.build.f_cpu=16000000L
# sanguinoo.build.core=sanguino:sanguino
# sanguinoo.build.variant=sanguino:sanguino
##############################################################
#
# lumineto.name=[Optiboot] Luminet (work in progress)
# lumineto.upload.protocol=arduino
# lumineto.upload.maximum_size=7424
# lumineto.upload.speed=9600
# lumineto.bootloader.low_fuses=0x62
# lumineto.bootloader.high_fuses=0xdf
# lumineto.bootloader.extended_fuses=0xfe
# lumineto.bootloader.path=optiboot
# lumineto.bootloader.file=optiboot_luminet.hex
# lumineto.build.mcu=attiny84
# lumineto.build.f_cpu=1000000L
# lumineto.build.core=luminet:luminet
##############################################################
atmega32o.name=[Optiboot] ATmega32 based board
atmega32o.upload.protocol=arduino
atmega32o.upload.maximum_size=32256
atmega32o.upload.speed=115200
atmega32o.bootloader.low_fuses=0xff
atmega32o.bootloader.high_fuses=0xde
atmega32o.bootloader.path=optiboot
atmega32o.bootloader.file=optiboot_atmega32.hex
atmega32o.bootloader.unlock_bits=0x3F
atmega32o.bootloader.lock_bits=0x0F
atmega32o.build.mcu=atmega32
atmega32o.build.f_cpu=16000000L
atmega32o.build.core=arduino:arduino
atmega32o.build.variant=arduino:standard
##############################################################
atmega1284o.name=[Optiboot] ATmega1284p
atmega1284o.upload.protocol=arduino
atmega1284o.upload.maximum_size=130048
atmega1284o.upload.speed=115200
atmega1284o.bootloader.low_fuses=0xf7
atmega1284o.bootloader.high_fuses=0xde
atmega1284o.bootloader.extended_fuses=0x05
atmega1284o.bootloader.path=optiboot
atmega1284o.bootloader.file=optiboot_atmega1284p.hex
atmega1284o.bootloader.unlock_bits=0x3F
atmega1284o.bootloader.lock_bits=0x0F
atmega1284o.build.mcu=atmega1284p
atmega1284o.build.f_cpu=16000000L
atmega1284o.build.core=arduino:arduino
atmega1284o.build.variant=arduino:standard
##############################################################
mega2560o.name=[Optiboot] Arduino Mega2560
mega2560o.upload.protocol=arduino
mega2560o.upload.maximum_size=261120
mega2560o.upload.speed=115200
mega2560o.bootloader.low_fuses=0xf7
mega2560o.bootloader.high_fuses=0xde
mega2560o.bootloader.extended_fuses=0xfd
mega2560o.bootloader.path=optiboot
mega2560o.bootloader.file=optiboot_atmega2560.hex
mega2560o.bootloader.unlock_bits=0x3F
mega2560o.bootloader.lock_bits=0x0F
mega2560o.build.mcu=atmega2560
mega2560o.build.f_cpu=16000000L
mega2560o.build.core=arduino:arduino
mega2560o.build.variant=arduino:mega
##############################################################
optibootxmini168b.name=Optiboot Xplained Mini 168pb
optibootxmini168b.upload.tool=arduino:avrdude
optibootxmini168b.upload.protocol=arduino
optibootxmini168b.upload.speed=57600
optibootxmini168b.bootloader.tool=arduino:avrdude
optibootxmini168b.bootloader.unlock_bits=0x3F
optibootxmini168b.bootloader.lock_bits=0x2F
optibootxmini168b.build.f_cpu=16000000L
optibootxmini168b.build.board=AVR_UNO
optibootxmini168b.build.core=arduino:arduino
optibootxmini168b.build.variant=arduino:standard
optibootxmini168b.upload.maximum_size=15872
optibootxmini168b.upload.maximum_data_size=1024
optibootxmini168b.bootloader.low_fuses=0xBF
optibootxmini168b.bootloader.high_fuses=0xCE
optibootxmini168b.bootloader.extended_fuses=0xFF
optibootxmini168b.bootloader.file=optiboot/optiboot_xplained168b.hex
optibootxmini168b.build.mcu=atmega168
#############################
optibootxmini328pb.name=Optiboot Xplained Mini 328pb
optibootxmini328pb.upload.tool=arduino:avrdude
optibootxmini328pb.upload.protocol=arduino
optibootxmini328pb.upload.speed=57600
optibootxmini328pb.bootloader.tool=arduino:avrdude
optibootxmini328pb.bootloader.unlock_bits=0x3F
optibootxmini328pb.bootloader.lock_bits=0x2F
optibootxmini328pb.build.f_cpu=16000000L
optibootxmini328pb.build.board=AVR_UNO
optibootxmini328pb.build.core=arduino:arduino
optibootxmini328pb.build.variant=arduino:standard
optibootxmini328pb.upload.maximum_size=32128
optibootxmini328pb.upload.maximum_data_size=1024
optibootxmini328pb.bootloader.low_fuses=0xBF
optibootxmini328pb.bootloader.high_fuses=0xCE
optibootxmini328pb.bootloader.extended_fuses=0xFF
optibootxmini328pb.bootloader.file=optiboot/optiboot_xplained328pb.hex
optibootxmini328pb.build.mcu=atmega328p
#############################
optibootxmini328p.name=Optiboot Xplained Mini 328p
optibootxmini328p.upload.tool=arduino:avrdude
optibootxmini328p.upload.protocol=arduino
optibootxmini328p.upload.speed=57600
optibootxmini328p.bootloader.tool=arduino:avrdude
optibootxmini328p.bootloader.unlock_bits=0x3F
optibootxmini328p.bootloader.lock_bits=0x2F
optibootxmini328p.build.f_cpu=16000000L
optibootxmini328p.build.board=AVR_UNO
optibootxmini328p.build.core=arduino:arduino
optibootxmini328p.build.variant=arduino:standard
optibootxmini328p.upload.maximum_size=32128
optibootxmini328p.upload.maximum_data_size=1024
optibootxmini328p.bootloader.low_fuses=0xBF
optibootxmini328p.bootloader.high_fuses=0xCE
optibootxmini328p.bootloader.extended_fuses=0xFF
optibootxmini328p.bootloader.file=optiboot/optiboot_xplained328p.hex
optibootxmini328p.build.mcu=atmega328p

View File

@ -0,0 +1,616 @@
# Makefile for ATmegaBOOT
# E.Lins, 18.7.2005
# $Id$
#
# Instructions
#
# To make bootloader .hex file:
# make diecimila
# make lilypad
# make ng
# etc...
#
# To burn bootloader .hex file:
# make diecimila_isp
# make lilypad_isp
# make ng_isp
# etc...
#
# Edit History
# 201406xx: WestfW: More Makefile restructuring.
# Split off Makefile.1284, Makefile.extras, Makefile.custom
# So that in theory, the main Makefile contains only the
# official platforms, and does not need to be modified to
# add "less supported" chips and boards.
# 201303xx: WestfW: Major Makefile restructuring.
# Allows options on Make command line "make xx LED=B3"
# (see also pin_defs.h)
# Divide into "chip" targets and "board" targets.
# Most boards are (recursive) board targets with options.
# Move isp target to separate makefile (fixes m8 EFUSE)
# Some (many) targets will now be rebuilt when not
# strictly necessary, so that options will be included.
# (any "make" with options will always compile.)
# Set many variables with ?= so they can be overridden
# Use arduinoISP settings as default for ISP targets
#
#
# * Copyright 2013-2015 by Bill Westfield. Part of Optiboot.
# * This software is licensed under version 2 of the Gnu Public Licence.
# * See optiboot.c for details.
HELPTEXT = ""
#----------------------------------------------------------------------
#
# 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
# export symbols to recursive makes (for ISP)
export
# defaults
MCU_TARGET = atmega168
LDSECTIONS = -Wl,--section-start=.text=0x3e00 -Wl,--section-start=.version=0x3ffe
# 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)
SH := bash
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.
# (except that in 1.5.x, there's an additional level of "up")
TESTDIR := $(firstword $(wildcard ../../../tools/*))
ifeq (,$(TESTDIR))
# Arduino 1.5.x tool location compared to optiboot dir
TOOLROOT = ../../../../tools
else
# Arduino 1.0 (and earlier) tool location
TOOLROOT = ../../../tools
endif
GCCROOT = $(TOOLROOT)/avr/bin/
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?) We also have to ensure that a consistent shell
# is used even if a unix shell is installed (ie as part of WINAVR)
fixpath = $(subst /,\,$1)
SHELL = cmd.exe
SH = sh
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
STK500 = "C:\Program Files\Atmel\AVR Tools\STK500\Stk500.exe"
STK500-1 = $(STK500) -e -d$(MCU_TARGET) -pf -vf -if$(PROGRAM)_$(TARGET).hex \
-lFF -LFF -f$(HFUSE)$(LFUSE) -EF8 -ms -q -cUSB -I200kHz -s -wt
STK500-2 = $(STK500) -d$(MCU_TARGET) -ms -q -lCF -LCF -cUSB -I200kHz -s -wt
#
# End of build environment code.
OBJ = $(PROGRAM).o
OPTIMIZE = -Os -fno-split-wide-types -mrelax
DEFS =
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 = $(LDSECTIONS) -Wl,--relax -nostartfiles
OBJCOPY = $(GCCROOT)avr-objcopy
OBJDUMP = $(call fixpath,$(GCCROOT)avr-objdump)
SIZE = $(GCCROOT)avr-size
#
# Make command-line Options.
# Permit commands like "make atmega328 LED_START_FLASHES=10" to pass the
# appropriate parameters ("-DLED_START_FLASHES=10") to gcc
#
HELPTEXT += "Option BAUD_RATE=nnnn - set the bit rate for communications\n"
ifdef BAUD_RATE
BAUD_RATE_CMD = -DBAUD_RATE=$(BAUD_RATE)
dummy = FORCE
else
BAUD_RATE_CMD = -DBAUD_RATE=115200
endif
HELPTEXT += "Option LED=B3 - set LED pin to particular port/bit\n"
ifdef LED
LED_CMD = -DLED=$(LED)
dummy = FORCE
endif
HELPTEXT += "Option LED_START_FLASHES=n - set number of LED flashes when bootloader starts\n"
ifdef LED_START_FLASHES
LED_START_FLASHES_CMD = -DLED_START_FLASHES=$(LED_START_FLASHES)
dummy = FORCE
else
LED_START_FLASHES_CMD = -DLED_START_FLASHES=3
endif
HELPTEXT += "Option LED_DATA_FLASH=1 - flash the LED each time data is received.\n"
ifdef LED_DATA_FLASH
ifneq ($(LED_DATA_FLASH), 0)
LED_DATA_FLASH_CMD = -DLED_DATA_FLASH=1
dummy = FORCE
endif
endif
HELPTEXT += "Option LED_START_ON=1 - Turn the LED on at bootload start\n"
ifdef LED_START_ON
ifneq ($(LED_START_ON), 0)
LED_START_ON_CMD = -DLED_START_ON=1
endif
dummy = FORCE
endif
HELPTEXT += "Option BIGBOOT=1 - enable extra features up to 1kbytes\n"
# BIGBOOT: Include extra features, up to 1K.
ifdef BIGBOOT
ifneq ($(BIGBOOT), 0)
BIGBOOT_CMD = -DBIGBOOT=1
dummy = FORCE
endif
endif
HELPTEXT += "Option SUPPORT_EEPROM=1 - Include code to read/write EEPROM\n"
ifdef SUPPORT_EEPROM
ifneq ($(SUPPORT_EEPROM), 0)
SUPPORT_EEPROM_CMD = -DSUPPORT_EEPROM
dummy = FORCE
endif
endif
HELPTEXT += "Option SOFT_UART=1 - use a software (bit-banged) UART\n"
ifdef SOFT_UART
ifneq ($(SOFT_UART), 0)
SOFT_UART_CMD = -DSOFT_UART=1
dummy = FORCE
endif
endif
ifdef SINGLESPEED
ifneq ($(SINGLESPEED), 0)
SS_CMD = -DSINGLESPEED=1
endif
endif
COMMON_OPTIONS = $(BAUD_RATE_CMD) $(LED_START_FLASHES_CMD) $(BIGBOOT_CMD)
COMMON_OPTIONS += $(SOFT_UART_CMD) $(LED_DATA_FLASH_CMD) $(LED_CMD) $(SS_CMD)
COMMON_OPTIONS += $(SUPPORT_EEPROM_CMD) $(LED_START_ON_CMD)
#UART is handled separately and only passed for devices with more than one.
HELPTEXT += "Option UART=n - use UARTn for communications\n"
ifdef UART
UART_CMD = -DUART=$(UART)
endif
# Not supported yet
# ifdef TIMEOUT_MS
# TIMEOUT_MS_CMD = -DTIMEOUT_MS=$(TIMEOUT_MS)
# dummy = FORCE
# endif
#
#.PRECIOUS: %.elf
#---------------------------------------------------------------------------
# "Chip-level Platform" targets.
# A "Chip-level Platform" compiles for a particular chip, but probably does
# not have "standard" values for things like clock speed, LED pin, etc.
# Makes for chip-level platforms should usually explicitly define their
# options like: "make atmega1285 AVR_FREQ=16000000L LED=D0"
#---------------------------------------------------------------------------
#
# Note about fuses:
# 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:
# http://tinker.it/now/2007/02/24/the-tale-of-avrdude-atmega168-and-extended-bits-fuses/
#
# similarly, the lock bits should be 0xff instead of 0x3f (to
# unlock the bootloader section) and 0xcf instead of 0x2f (to
# lock it), but since the high two bits of the lock byte are
# unused, avrdude would get confused.
#---------------------------------------------------------------------------
#
HELPTEXT += "\n-------------\n\n"
# Test platforms
# Virtual boot block test
HELPTEXT += "target virboot8 - ATmega8 with virtual boot partition\n"
virboot8: TARGET = atmega8
virboot8: MCU_TARGET = atmega8
virboot8: CFLAGS += $(COMMON_OPTIONS) '-DVIRTUAL_BOOT_PARTITION' '-Dsave_vect_num=EE_RDY_vect_num'
virboot8: AVR_FREQ ?= 16000000L
# Start address of 1D80 allows for size up to 640 bytes, app up to 7552
virboot8: LDSECTIONS = -Wl,--section-start=.text=0x1d80 -Wl,--section-start=.version=0x1ffe
virboot8: $(PROGRAM)_virboot8.hex
virboot8: $(PROGRAM)_virboot8.lst
HELPTEXT += "target virboot328p - ATmega328 with virtual boot partition\n"
virboot328: TARGET = atmega328
virboot328: MCU_TARGET = atmega328p
virboot328: CFLAGS += $(COMMON_OPTIONS) '-DVIRTUAL_BOOT_PARTITION'
virboot328: AVR_FREQ ?= 16000000L
virboot328: LDSECTIONS = -Wl,--section-start=.text=0x7d80 -Wl,--section-start=.version=0x7ffe
virboot328: $(PROGRAM)_virboot328.hex
virboot328: $(PROGRAM)_virboot328.lst
virboot328_isp: virboot328
virboot328_isp: TARGET = virboot328
virboot328_isp: MCU_TARGET = atmega328p
# no boot section, SPIEN
virboot328_isp: HFUSE ?= DF
# Low power xtal (16MHz) 16KCK/14CK+65ms
virboot328_isp: LFUSE ?= FF
# 2.7V brownout
virboot328_isp: EFUSE ?= FD
virboot328_isp: isp
virboot8_isp: virboot8
virboot8_isp: TARGET = virboot8
virboot8_isp: MCU_TARGET = atmega8
# SPIEN, CKOPT (for full swing xtal), boot section 1k
# Note that we need boot section to include our SPM instructions,
# even though we do not enable BOOTRST
virboot8_isp: HFUSE ?= CB
# 2.7V brownout, 16MHz Xtal, 16KCK/14CK+65ms
virboot8_isp: LFUSE ?= BF
virboot8_isp: isp
# Diecimila, Duemilanove with m168, and NG use identical bootloaders
# Call it "atmega168" for generality and clarity, keep "diecimila" for
# backward compatibility of makefile
# ATmega8
#
HELPTEXT += "target atmega8 - ATmega8, ATmega8A, ATmega8L\n"
atmega8: TARGET = atmega8
atmega8: MCU_TARGET = atmega8
atmega8: CFLAGS += $(COMMON_OPTIONS)
atmega8: AVR_FREQ ?= 16000000L
ifndef BIGBOOT
atmega8: LDSECTIONS = -Wl,--section-start=.text=0x1e00 -Wl,--section-start=.version=0x1ffe -Wl,--gc-sections -Wl,--undefined=optiboot_version
else
atmega8: LDSECTIONS = -Wl,--section-start=.text=0x1c00 -Wl,--section-start=.version=0x1ffe -Wl,--gc-sections -Wl,--undefined=optiboot_version
endif
atmega8: $(PROGRAM)_atmega8.hex
atmega8: $(PROGRAM)_atmega8.lst
atmega8_isp: atmega8
atmega8_isp: TARGET = atmega8
atmega8_isp: MCU_TARGET = atmega8
ifndef BIGBOOT
# SPIEN, CKOPT (for full swing xtal), Bootsize=512B
atmega8_isp: HFUSE ?= CC
else
# SPIEN, CKOPT (for full swing xtal), Bootsize=1024B
atmega8_isp: HFUSE ?= CA
endif
# 2.7V brownout, 16MHz Xtal, 16KCK/14CK+65ms
atmega8_isp: LFUSE ?= BF
atmega8_isp: isp
HELPTEXT += "target atmega168 - ATmega168, ATmega168A\n"
atmega168: TARGET = atmega168
atmega168: MCU_TARGET = atmega168
atmega168: CFLAGS += $(COMMON_OPTIONS)
atmega168: AVR_FREQ ?= 16000000L
ifndef BIGBOOT
atmega168: LDSECTIONS = -Wl,--section-start=.text=0x3e00 -Wl,--section-start=.version=0x3ffe
else
atmeg168: LDSECTIONS = -Wl,--section-start=.text=0x3c00 -Wl,--section-start=.version=0x3ffe
endif
atmega168: $(PROGRAM)_atmega168.hex
atmega168: $(PROGRAM)_atmega168.lst
atmega168_isp: atmega168
atmega168_isp: TARGET = atmega168
# 2.7V brownout
atmega168_isp: HFUSE ?= DD
# Full swing (16MHz) 16KCK/14CK+65ms
atmega168_isp: LFUSE ?= F7
ifndef BIGBOOT
# 512 byte boot
atmega168_isp: EFUSE ?= 04
else
# 1024byte boot
atmega168_isp: EFUSE ?= FA
endif
atmega168_isp: isp
HELPTEXT += "target atmega328 - ATmega328p\n"
atmega328: TARGET = atmega328
atmega328: MCU_TARGET = atmega328p
atmega328: CFLAGS += $(COMMON_OPTIONS)
atmega328: AVR_FREQ ?= 16000000L
ifndef BIGBOOT
atmega328: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe
else
# bigboot version is 1k long; starts earlier
atmega328: LDSECTIONS = -Wl,--section-start=.text=0x7c00 -Wl,--section-start=.version=0x7ffe
endif
atmega328: $(PROGRAM)_atmega328.hex
atmega328: $(PROGRAM)_atmega328.lst
atmega328_isp: atmega328
atmega328_isp: TARGET = atmega328
atmega328_isp: MCU_TARGET = atmega328p
ifndef BIGBOOT
# 512 byte boot, SPIEN
atmega328_isp: HFUSE ?= DE
else
# 1k byte boot, SPIEN
atmega328_isp: HFUSE ?= DC
endif
# Low power xtal (16MHz) 16KCK/14CK+65ms
atmega328_isp: LFUSE ?= FF
# 2.7V brownout
atmega328_isp: EFUSE ?= FD
atmega328_isp: isp
#Atmega1280
HELPTEXT += "target atmega1280 - ATmega1280 (100pin, 128k)\n"
atmega1280: MCU_TARGET = atmega1280
atmega1280: CFLAGS += $(COMMON_OPTIONS) -DBIGBOOT $(UART_CMD)
atmega1280: AVR_FREQ ?= 16000000L
atmega1280: LDSECTIONS = -Wl,--section-start=.text=0x1fc00 -Wl,--section-start=.version=0x1fffe
atmega1280: $(PROGRAM)_atmega1280.hex
atmega1280: $(PROGRAM)_atmega1280.lst
#---------------------------------------------------------------------------
# "Board-level Platform" targets.
# A "Board-level Platform" implies a manufactured platform with a particular
# AVR_FREQ, LED, and so on. Parameters are not particularly changable from
# the "make" command line.
# Most of the board-level platform builds should envoke make recursively
# appropriate specific options
#---------------------------------------------------------------------------
# 20MHz clocked platforms
#
# These are capable of 230400 baud, or 115200 baud on PC (Arduino Avrdude issue)
#
pro20: TARGET = pro_20mhz
pro20: CHIP = atmega168
pro20:
"$(MAKE)" atmega168 AVR_FREQ=20000000L LED_START_FLASHES=3
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
pro20_isp: pro20
pro20_isp: TARGET = pro_20mhz
# 4.3V brownout (for max speed!)
pro20_isp: HFUSE ?= DC
# Full swing xtal (20MHz) 258CK/14CK+4.1ms
pro20_isp: LFUSE ?= F7
# 512 byte boot
pro20_isp: EFUSE ?= 04
pro20_isp: isp
# 16MHz clocked platforms
#
# These are capable of 230400 baud, or 115200 baud on PC (Arduino Avrdude issue)
#
pro16: TARGET = pro_16MHz
pro16: CHIP = atmega168
pro16:
"$(MAKE)" $(CHIP) AVR_FREQ=16000000L LED_START_FLASHES=3
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
pro16_isp: pro16
pro16_isp: TARGET = pro_16MHz
# 2.7V brownout
pro16_isp: HFUSE ?= DD
# Full swing xtal (20MHz) 258CK/14CK+4.1ms
pro16_isp: LFUSE ?= F7
# 512 byte boot
pro16_isp: EFUSE ?= 04
pro16_isp: isp
diecimila: TARGET = diecimila
diecimila: CHIP = atmega168
diecimila:
"$(MAKE)" $(CHIP) AVR_FREQ=16000000L LED_START_FLASHES=3
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
diecimila_isp: diecimila
diecimila_isp: TARGET = diecimila
# 2.7V brownout
diecimila_isp: HFUSE ?= DD
# Low power xtal (16MHz) 16KCK/14CK+65ms
diecimila_isp: LFUSE ?= F7
# 512 byte boot
diecimila_isp: EFUSE ?= 04
diecimila_isp: isp
# MEGA1280 Board (this is different from the atmega1280 chip platform)
# Mega has a minimum boot size of 1024 bytes, so enable extra functions
# Note that optiboot does not (can not) work on the MEGA2560
#mega: TARGET = atmega1280
mega1280: atmega1280
mega1280_isp: mega1280
mega1280_isp: TARGET = atmega1280
mega1280_isp: MCU_TARGET = atmega1280
# 1024 byte boot
mega1280_isp: HFUSE ?= DE
# Low power xtal (16MHz) 16KCK/14CK+65ms
mega1280_isp: LFUSE ?= FF
# 2.7V brownout; wants F5 for some reason...
mega1280_isp: EFUSE ?= F5
mega1280_isp: isp
# 8MHz clocked platforms
#
# These are capable of 115200 baud
# Note that "new" Arduinos with an AVR as USB/Serial converter will NOT work
# with an 8MHz target Arduino. The bitrate errors are in opposite directions,
# and total too large a number.
#
lilypad: TARGET = $@
lilypad: CHIP = atmega168
lilypad:
"$(MAKE)" $(CHIP) AVR_FREQ=8000000L LED_START_FLASHES=3
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
lilypad_isp: lilypad
lilypad_isp: TARGET = lilypad
# 2.7V brownout
lilypad_isp: HFUSE ?= DD
# Internal 8MHz osc (8MHz) Slow rising power
lilypad_isp: LFUSE ?= E2
# 512 byte boot
lilypad_isp: EFUSE ?= 04
lilypad_isp: isp
# lilypad_resonator is the same as a 8MHz lilypad, except for fuses.
lilypad_resonator: lilypad
lilypad_resonator_isp: lilypad
lilypad_resonator_isp: TARGET = lilypad
# 2.7V brownout
lilypad_resonator_isp: HFUSE ?= DD
# Full swing xtal (20MHz) 258CK/14CK+4.1ms
lilypad_resonator_isp: LFUSE ?= C6
# 512 byte boot
lilypad_resonator_isp: EFUSE ?= 04
lilypad_resonator_isp: isp
pro8: TARGET = pro_8MHz
pro8: CHIP = atmega168
pro8:
"$(MAKE)" $(CHIP) AVR_FREQ=8000000L LED_START_FLASHES=3
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
pro8_isp: pro8
pro8_isp: TARGET = pro_8MHz
# 2.7V brownout
pro8_isp: HFUSE ?= DD
# Full swing xtal (20MHz) 258CK/14CK+4.1ms
pro8_isp: LFUSE ?= C6
# 512 byte boot
pro8_isp: EFUSE ?= 04
pro8_isp: isp
atmega328_pro8: TARGET = atmega328_pro_8MHz
atmega328_pro8: CHIP = atmega328
atmega328_pro8:
"$(MAKE)" $(CHIP) AVR_FREQ=8000000L LED_START_FLASHES=3
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
atmega328_pro8_isp: atmega328_pro8
atmega328_pro8_isp: TARGET = atmega328_pro_8MHz
atmega328_pro8_isp: MCU_TARGET = atmega328p
# 512 byte boot, SPIEN
atmega328_pro8_isp: HFUSE ?= DE
# Low power xtal (16MHz) 16KCK/14CK+65ms
atmega328_pro8_isp: LFUSE ?= FF
# 2.7V brownout
atmega328_pro8_isp: EFUSE ?= 05
atmega328_pro8_isp: isp
#
# Include additional platforms
include Makefile.atmel
include Makefile.extras
include Makefile.1284
include Makefile.custom
include Makefile.2560
#---------------------------------------------------------------------------
#
# Generic build instructions
#
FORCE:
baudcheck: FORCE
- @$(CC) --version
- @$(CC) $(CFLAGS) -E baudcheck.c -o baudcheck.tmp.sh
- @$(SH) baudcheck.tmp.sh
isp: $(TARGET)
"$(MAKE)" -f Makefile.isp isp TARGET=$(TARGET)
isp-stk500: $(PROGRAM)_$(TARGET).hex
$(STK500-1)
$(STK500-2)
%.elf: $(OBJ) baudcheck $(dummy)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS)
$(SIZE) $@
clean:
rm -rf *.o *.elf *.lst *.map *.sym *.lss *.eep *.srec *.bin *.hex *.tmp.sh
%.lst: %.elf
$(OBJDUMP) -h -S $< > $@
%.hex: %.elf
$(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O ihex $< $@
%.srec: %.elf
$(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O srec $< $@
%.bin: %.elf
$(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O binary $< $@
help:
@echo $(HELPTEXT)

View File

@ -0,0 +1,146 @@
#
# Makefile for 40-pin AVR chips, including ATmega644 and ATmega1284
#
# * Copyright 2013-2015 by Bill Westfield. Part of Optiboot.
# * This software is licensed under version 2 of the Gnu Public Licence.
# * See optiboot.c for details.
# Chip level targets
#
HELPTEXT += "target atmega644p - ATmega644p\n"
atmega644p: TARGET = atmega644p
atmega644p: MCU_TARGET = atmega644p
atmega644p: CFLAGS += $(COMMON_OPTIONS) -DBIGBOOT
atmega644p: AVR_FREQ ?= 16000000L
atmega644p: LDSECTIONS = -Wl,--section-start=.text=0xfc00 -Wl,--section-start=.version=0xfffe
atmega644p: CFLAGS += $(UART_CMD)
atmega644p: $(PROGRAM)_atmega644p.hex
atmega644p: $(PROGRAM)_atmega644p.lst
HELPTEXT += "target atmega1284 - ATmega1284p (40 pin, 128k)\n"
atmega1284: TARGET = atmega1284p
atmega1284: MCU_TARGET = atmega1284p
atmega1284: CFLAGS += $(COMMON_OPTIONS) -DBIGBOOT
atmega1284: AVR_FREQ ?= 16000000L
atmega1284: LDSECTIONS = -Wl,--section-start=.text=0x1fc00 -Wl,--section-start=.version=0x1fffe
atmega1284: CFLAGS += $(UART_CMD)
atmega1284: $(PROGRAM)_atmega1284p.hex
atmega1284: $(PROGRAM)_atmega1284p.lst
atmega1284p: atmega1284
atmega1284_isp: atmega1284
atmega1284_isp: TARGET = atmega1284p
atmega1284_isp: MCU_TARGET = atmega1284p
# 1024 byte boot
atmega1284_isp: HFUSE ?= DE
# Full Swing xtal (16MHz) 16KCK/14CK+65ms
atmega1284_isp: LFUSE ?= F7
# 2.7V brownout
atmega1284_isp: EFUSE ?= FD
atmega1284_isp: isp
#
# Board-level targets
#
# Sanguino has a minimum boot size of 1024 bytes, so enable extra functions
#
HELPTEXT += "target sanguino - ATmega644p board\n"
sanguino: TARGET = $@
sanguino: CHIP = atmega644p
sanguino:
"$(MAKE)" $(CHIP) AVR_FREQ=16000000L LED=B0
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
sanguino_isp: sanguino
sanguino_isp: TARGET = sanguino
sanguino_isp: MCU_TARGET = atmega644p
# 1024 byte boot
sanguino_isp: HFUSE ?= DE
# Full swing xtal (16MHz) 16KCK/14CK+65ms
sanguino_isp: LFUSE ?= F7
# 2.7V brownout
sanguino_isp: EFUSE ?= FD
sanguino_isp: isp
HELPTEXT += "target mighty1284 - ManiacBug Mighty1284 board\n"
mighty1284: TARGET = $@
mighty1284: CHIP = atmega1284p
mighty1284:
"$(MAKE)" $(CHIP) AVR_FREQ=16000000L LED=B7
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
mighty1284_isp: mighty1284
mighty1284_isp: TARGET = mighty1284
mighty1284_isp: MCU_TARGET = atmega1284p
# 1024 byte boot
mighty1284_isp: HFUSE ?= DE
# Full swing xtal (16MHz) 16KCK/14CK+65ms
mighty1284_isp: LFUSE ?= F7
# 2.7V brownout
mighty1284_isp: EFUSE ?= FD
mighty1284_isp: isp
HELPTEXT += "target bobuino - Crossroads 1284 board\n"
bobuino: TARGET = $@
bobuino: CHIP = atmega1284p
bobuino:
"$(MAKE)" $(CHIP) AVR_FREQ=16000000L LED=B7
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
bobuino_isp: bobuino
bobuino_isp: TARGET = bobuino
bobuino_isp: MCU_TARGET = atmega1284p
# 1024 byte boot
bobuino_isp: HFUSE ?= DE
# Full swing xtal (16MHz) 16KCK/14CK+65ms
bobuino_isp: LFUSE ?= F7
# 2.7V brownout
bobuino_isp: EFUSE ?= FD
bobuino_isp: isp
#
# Wicked Devices "Wildfire" boards (1284 with wireless!)
#
HELPTEXT += "target wildfirev2 - Wicked Devices board\n"
wildfirev2: TARGET = $@
wildfirev2: CHIP = atmega1284p
wildfirev2:
"$(MAKE)" $(CHIP) AVR_FREQ=16000000L LED=B7 BAUD_RATE=1000000
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
wildfirev2_isp: wildfirev2
wildfirev2_isp: TARGET = wildfirev2
wildfirev2_isp: MCU_TARGET = atmega1284p
# 1024 byte boot
wildfirev2_isp: HFUSE ?= DE
# Full swing xtal (16MHz) 16KCK/14CK+65ms
wildfirev2_isp: LFUSE ?= F7
# 2.7V brownout
wildfirev2_isp: EFUSE ?= FD
wildfirev2_isp: isp
HELPTEXT += "target wildfirev3 - Wicked Devices board\n"
wildfirev3: TARGET = $@
wildfirev3: CHIP = atmega1284p
wildfirev3:
"$(MAKE)" $(CHIP) AVR_FREQ=16000000L LED=B5
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
wildfirev3_isp: wildfirev3
wildfirev3_isp: TARGET = wildfirev3
wildfirev3_isp: MCU_TARGET = atmega1284p
# 1024 byte boot
wildfirev3_isp: HFUSE ?= DE
# Full swing xtal (16MHz) 16KCK/14CK+65ms
wildfirev3_isp: LFUSE ?= F7
# 2.7V brownout
wildfirev3_isp: EFUSE ?= FD
wildfirev3_isp: isp

View File

@ -0,0 +1,56 @@
#
# Makefile for 2560 AVR chips
#
# * Copyright 2013-2015 by Bill Westfield, Marek Wodzinski. Part of Optiboot.
# * This software is licensed under version 2 of the Gnu Public Licence.
# * See optiboot.c for details.
# Chip level targets
#
HELPTEXT += "target atmega2560 - ATmega2560p (100pin, 256k)\n"
atmega2560: TARGET = atmega2560
atmega2560: MCU_TARGET = atmega2560
atmega2560: CFLAGS += $(COMMON_OPTIONS) -DBIGBOOT
atmega2560: AVR_FREQ ?= 16000000L
atmega2560: LDSECTIONS = -Wl,--section-start=.text=0x3fc00 -Wl,--section-start=.version=0x3fffe
atmega2560: CFLAGS += $(UART_CMD)
atmega2560: $(PROGRAM)_atmega2560.hex
atmega2560: $(PROGRAM)_atmega2560.lst
atmega2560_isp: atmega2560
atmega2560_isp: TARGET = atmega2560
atmega2560_isp: MCU_TARGET = atmega2560
# 1024 byte boot, JTAG disabled
atmega2560_isp: HFUSE ?= DE
# Full Swing xtal (16MHz) 16KCK/14CK+65ms
atmega2560_isp: LFUSE ?= F7
# 2.7V brownout
atmega2560_isp: EFUSE ?= FD
atmega2560_isp: isp
#
# Board-level targets
#
# Arduino/Geniuno MEGA 256 has a minimum boot size of 1024 bytes, so enable extra functions
#
HELPTEXT += "target mega2560 - Arduino MEGA2560 board, 2560ADK\n"
mega2560: TARGET = $@
mega2560: CHIP = atmega2560
mega2560:
"$(MAKE)" $(CHIP) AVR_FREQ=16000000L
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
mega2560_isp: mega256
mega2560_isp: TARGET = mega2560
mega2560_isp: MCU_TARGET = atmega2560
# 1024 byte boot, JTAG disabled
mega2560_isp: HFUSE ?= DE
# Full swing xtal (16MHz) 16KCK/14CK+65ms
mega2560_isp: LFUSE ?= F7
# 2.7V brownout
mega2560_isp: EFUSE ?= FD
mega2560_isp: isp

View File

@ -0,0 +1,37 @@
#
# Support for the Atmel Xplained mini eval boards that are mostly
# compatible with Arduino. (168pb, 328p, and 328pb chips.)
#
# Currently these all masquerade as 168 or 328p, because the IDE
# does not yet have compiler support for the -pb variants.
#
# These boards have an mEDBG debug chip that:
# 1) means that optiboot can only be programmed via Atmel Studio
# 2) prevents optiboot from working at 115200bps.
# 3) provides 16MHz (at 5V) via Xin on the chip.
#
#
#
HELPTEXT += "target xplained168pb - Atmel Xplained Mini 168pb Eval board\n"
xplained168pb: TARGET = $@
xplained168pb: CHIP = atmega168
xplained168pb:
"$(MAKE)" $(CHIP) AVR_FREQ=16000000L BAUD_RATE=57600
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
HELPTEXT += "target xplained328pb - Atmel Xplained Mini 328pb Eval board\n"
xplained328pb: TARGET = $@
xplained328pb: CHIP = atmega328
xplained328pb:
"$(MAKE)" $(CHIP) AVR_FREQ=16000000L BAUD_RATE=57600
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
HELPTEXT += "target xplained328p - Atmel Xplained Mini 328p Eval board\n"
xplained328p: TARGET = $@
xplained328p: CHIP = atmega328
xplained328p:
"$(MAKE)" $(CHIP) AVR_FREQ=16000000L BAUD_RATE=57600
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst

View File

@ -0,0 +1,16 @@
#
# Makefile for "custom" platforms. Add your board here.
#
# * Copyright 2013-2015 by Bill Westfield. Part of Optiboot.
# * This software is licensed under version 2 of the Gnu Public Licence.
# * See optiboot.c for details.
HELPTEXT += "target wildfire - Wicked Devices Wildfire v1 board\n"
wildfire: TARGET = $@
wildfire: CHIP = atmega1284p
wildfire:
"$(MAKE)" $(CHIP) AVR_FREQ=16000000L LED=B5
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst

View File

@ -0,0 +1,135 @@
#
# Makefile for "other" implemented platforms.
#
# * Copyright 2013-2015 by Bill Westfield. Part of Optiboot.
# * This software is licensed under version 2 of the Gnu Public Licence.
# * See optiboot.c for details.
#
#
# Extra chips (maybe) supported by optiboot
# Note that these are usually only minimally tested.
#
#
# ATmega88
#
HELPTEXT += "target atmega88 - ATmega88 or ATmega88p (28pin, 8k)\n"
atmega88: TARGET = atmega88
atmega88: MCU_TARGET = atmega88
atmega88: CFLAGS += $(COMMON_OPTIONS)
atmega88: AVR_FREQ ?= 16000000L
atmega88: LDSECTIONS = -Wl,--section-start=.text=0x1e00 -Wl,--section-start=.version=0x1ffe -Wl,--gc-sections -Wl,--undefined=optiboot_version
atmega88: $(PROGRAM)_atmega88.hex
atmega88: $(PROGRAM)_atmega88.lst
atmega88_isp: atmega88
atmega88_isp: TARGET = atmega88
atmega88_isp: MCU_TARGET = atmega88
# 2.7V brownout
atmega88_isp: HFUSE ?= DD
# Low power xtal (16MHz) 16KCK/14CK+65ms
atmega88_isp: LFUSE ?= FF
# 512 byte boot
atmega88_isp: EFUSE ?= 04
atmega88_isp: isp
atmega88p_isp: atmega88
atmega88p_isp: TARGET = atmega88
atmega88p_isp: MCU_TARGET = atmega88p
# 2.7V brownout
atmega88p_isp: HFUSE ?= DD
# Low power xtal (16MHz) 16KCK/14CK+65ms
atmega88p_isp: LFUSE ?= FF
# 512 byte boot
atmega88p_isp: EFUSE ?= 04
atmega88p_isp: isp
#
# ATmega168p [QFN32]
#
HELPTEXT += "target atmega168p - ATmega168p\n"
atmega168p: TARGET = atmega168p
atmega168p: MCU_TARGET = atmega168p
atmega168p: CFLAGS += $(COMMON_OPTIONS)
atmega168p: AVR_FREQ ?= 16000000L
atmega168p: $(PROGRAM)_atmega168p_16MHz.hex
atmega168p: $(PROGRAM)_atmega168p_16MHz.lst
atmega168p_isp: atmega168p
atmega168p_isp: TARGET = atmega168p
# 2.7V brownout
atmega168p_isp: HFUSE ?= DD
# Low power xtal (16MHz) 16KCK/14CK+65ms
atmega168p_isp: LFUSE ?= FF
# 512 byte boot
atmega168p_isp: EFUSE ?= 04
atmega168p_isp: isp
HELPTEXT += "target atmega16 - ATmega16 (40pin, 16k)\n"
atmega16: TARGET = atmega16
atmega16: MCU_TARGET = atmega16
atmega16: CFLAGS += $(COMMON_OPTIONS)
atmega16: AVR_FREQ ?= 16000000L
atmega16: $(PROGRAM)_atmega16.hex
atmega16: $(PROGRAM)_atmega16.lst
#
# ATmega32
#
HELPTEXT += "target atmega32 - ATmega32 (40pin, 32k)\n"
atmega32: TARGET = atmega32
atmega32: MCU_TARGET = atmega32
atmega32: CFLAGS += $(COMMON_OPTIONS)
atmega32: AVR_FREQ ?= 11059200L
atmega32: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe
atmega32: $(PROGRAM)_atmega32.hex
atmega32: $(PROGRAM)_atmega32.lst
atmega32_isp: atmega32
atmega32_isp: TARGET = atmega32
atmega32_isp: MCU_TARGET = atmega32
# No OCD or JTAG, SPIEN, CKOPT (for full swing xtal), Bootsize=512B
atmega32_isp: HFUSE ?= CE
# 2.7V brownout, 16MHz Xtal, 16KCK/14CK+65ms
atmega32_isp: LFUSE ?= BF
atmega32_isp: isp
#
# ATtiny84
#
attiny84: TARGET = attiny84
attiny84: MCU_TARGET = attiny84
attiny84: CFLAGS += $(COMMON_OPTIONS) -DSOFT_UART -DVIRTUAL_BOOT_PARTITION -Dsave_vect_num=4
attiny84: LDSECTIONS = -Wl,--section-start=.text=0x1d00 -Wl,--section-start=.version=0x1ffe -Wl,--gc-sections -Wl,--undefined=optiboot_version
attiny84: $(PROGRAM)_attiny84.hex
attiny84: $(PROGRAM)_attiny84.lst
# 1MHz clocked platforms/boards
#
# These are capable of 9600 baud
#
luminet: TARGET = $@
luminet: CHIP = attiny84
luminet:
"$(MAKE)" $(CHIP) AVR_FREQ=1000000L LED_START_FLASHES=0 BAUD_RATE=9600
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
luminet_isp: luminet
luminet_isp: TARGET = luminet
luminet_isp: MCU_TARGET = attiny84
# Brownout disabled
luminet_isp: HFUSE ?= DF
# 1MHz internal oscillator, slowly rising power
luminet_isp: LFUSE ?= 62
# Self-programming enable
luminet_isp: EFUSE ?= FE
luminet_isp: isp

View File

@ -0,0 +1,90 @@
# Makefile.isp for Optiboot
# Bill Westfield (WestfW@yahoo.com) March, 2013
# $Id$
#
# Instructions:
#
# This is a "daughter" Makefile that burns the bootloader using a ISP
# device programmer. It is designed to inherit assorted variables from
# the parent optiboot "Makefile"... Using a daughter makefile makes
# certain variable manipulations more obvious.
#
# To burn bootloader .hex file, invoke the main Makefile using:
# make diecimila_isp
# make lilypad_isp
# make ng_isp
# etc...
#
#
# Note: inherit paths/etc from parent Makefile.
#
#---------------------------------------------------------------------------
#
# * Copyright 2013-2015 by Bill Westfield. Part of Optiboot.
# * This software is licensed under version 2 of the Gnu Public Licence.
# * See optiboot.c for details.
#
#---------------------------------------------------------------------------
# enter the parameters for the avrdude isp tool -b19200
#
# Inherit avrdude paths from top-level makefile
AVRDUDE_ROOT ?= $(GCCROOT)
AVRDUDE_CONF ?= -C$(TOOLROOT)/avr/etc/avrdude.conf
# These are the parameters for a usb-based STK500v2 programmer.
# Exact type unknown. (historical Makefile values.)
#ISPTOOL = stk500v2
#ISPPORT = usb
#ISPSPEED = -b 115200
#
#
# These are parameters for using an Arduino with the ArduinoISP sketch
# as the programmer. On a mac, for a particular Uno as programmer.
ISPTOOL ?= stk500v1
ISPPORT ?= /dev/tty.usbserial-FTD61T6Q
ISPSPEED ?= -b19200
# Not all chips have EFUSE.
ifdef EFUSE
EFUSE_CMD= -U efuse:w:0x$(EFUSE):m
endif
#
# avrdude commands to erase chip, unlock memory, and program fuses.
#
ISPFUSES = -e -u -U lock:w:0x3f:m $(EFUSE_CMD) \
-U hfuse:w:0x$(HFUSE):m -U lfuse:w:0x$(LFUSE):m
#
# avrdude commands to program the new bootloader, and protect the bootloader
# space from accidental SPM writes. Note: "2f" allows boot section to be read
# by the application, which is different than the arduino default.
#
ISPFLASH = -U flash:w:$(PROGRAM)_$(TARGET).hex -U lock:w:0x2f:m
# There are certain complicated caused by the fact that the default state
# of a fuse is a "1" rather than a "0", especially with respect to fuse bits
# that have not been implemented. Those would normally not be included, but
# unimplemented fuses still default to being "1"
#
# 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:
# http://tinker.it/now/2007/02/24/the-tale-of-avrdude-atmega168-and-extended-bits-fuses/
#
# similarly, the lock bits should be 0xff instead of 0x3f (to
# unlock the bootloader section) and 0xcf instead of 0x2f (to
# lock it), but since the high two bits of the lock byte are
# unused, avrdude would get confused.
isp: $(PROGRAM)_$(TARGET).hex
$(AVRDUDE_ROOT)avrdude $(AVRDUDE_CONF) -c $(ISPTOOL) \
-p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) \
$(ISPFUSES) \
$(ISPFLASH)

View File

@ -0,0 +1,99 @@
This directory contains the Optiboot small bootloader for AVR
microcontrollers, somewhat modified specifically for the Arduino
environment.
Optiboot is more fully described here: http://github.com/Optiboot/optiboot
and is the work of Peter Knight (aka Cathedrow), building on work of Jason P
Kyle, Spiff, and Ladyada. More recent maintenance and modifications are by
Bill Westfield (aka WestfW)
Arduino-specific issues are tracked as part of the Arduino project
at http://github.com/arduino/Arduino
Most of the information in this file is superceeded by the wiki content at
https://github.com/Optiboot/optiboot/wiki
It's till here "just in case."
------------------------------------------------------------
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>
Programming Chips Using the _isp Targets
The CPU targets have corresponding ISP targets that will actuall
program the bootloader into a chip. "atmega328_isp" for the atmega328,
for example. These will set the fuses and lock bits as appropriate as
well as uploading the bootloader code.
ISP Targets in Version 5.0 and later:
The isp targets are now built using a separate "Makefile.isp" makefile,
which should make modification easier and more obvious. This also fixes
the atmega8_isp target problem mentioned below. The default
configuration assumes an ArduinoISP setup, but you will probably need to
update at least the serial port, since those are different for each
Arduino board and/or system/
ISP Targets in Version 4.6 and earlier:
The older makefiles default to using a USB programmer, but you can use a
serial programmer like ArduinoISP by changing the appropriate variables
when you invoke make:
make ISPTOOL=stk500v1 ISPPORT=/dev/tty.usbserial-A20e1eAN \
ISPSPEED=-b19200 atmega328_isp
The "atmega8_isp" target does not currently work, because the mega8
doesn't have the "extended" fuse that the generic ISP target wants to
pass on to avrdude. You'll need to run avrdude manually.
Standard Targets
I've reduced the pre-built and source-version-controlled targets
(.hex and .lst files included in the git repository) to just the
three basic 16MHz targets: atmega8, atmega16, atmega328.

View File

@ -0,0 +1,56 @@
/*
* baudcheck.c
* Mar, 2013 by Bill Westfield (WestfW@yahoo.com)
* Exercises in executing arithmetic code on a system that we can't count
* on having the usual languages or tools installed.
*
* This little "C program" is run through the C preprocessor using the same
* arguments as our "real" target (which should assure that it gets the
* same values for clock speed and desired baud rate), and produces as
* output a shell script that can be run through bash, and THAT in turn
* writes the desired output...
*
* Note that the C-style comments are stripped by the C preprocessor.
*
* Copyright 2013-2015 by Bill Westfield.
* This software is licensed under version 2 of the Gnu Public Licence.
* See optiboot.c for details.
*/
/*
* First strip any trailing "L" from the defined constants. To do this
* we need to make the constants into shell variables first.
*/
bpsx=BAUD_RATE
bps=${bpsx/L/}
bps=${bps/U/}
fcpux=F_CPU
fcpu=${fcpux/L/}
fcpu=${fcpu/U/}
// echo f_cpu = $fcpu, baud = $bps
/*
* Compute the divisor
*/
BAUD_SETTING=$(( ( ($fcpu + $bps * 4) / (($bps * 8))) - 1 ))
// echo baud setting = $BAUD_SETTING
/*
* Based on the computer divisor, calculate the actual bitrate,
* And the error. Since we're all integers, we have to calculate
* the tenths part of the error separately.
*/
BAUD_ACTUAL=$(( ($fcpu/(8 * (($BAUD_SETTING)+1))) ))
BAUD_ERROR=$(( (( 100*($BAUD_ACTUAL - $bps) ) / $bps) ))
ERR_TS=$(( ((( 1000*($BAUD_ACTUAL - $bps) ) / $bps) - $BAUD_ERROR * 10) ))
ERR_TENTHS=$(( ERR_TS > 0 ? ERR_TS: -ERR_TS ))
/*
* Print a nice message containing the info we've calculated
*/
echo BAUD RATE CHECK: Desired: $bps, Real: $BAUD_ACTUAL, UBRRL = $BAUD_SETTING, Difference=$BAUD_ERROR.$ERR_TENTHS\%

View File

@ -0,0 +1,99 @@
// Get all the "standard" definitions from the official boot.h
#include <avr/boot.h>
/*
* Implement some optimized versions that will use OUT instead
* of STS to write SPMCSR.
* (However, omit the *_extended_short, since by the time you
* need _extended_, the extra byte shouldn't be relevant any more)
*
* The C preprocessor can not determin at compile time whether SPMCSR is
* "out of range" of the OUT instruction, but we CAN do that in the
* assembler. We can even make it pretty with a macro.
* With this modification, the _short functions should work on cpus
* (like ATmega128) where STS is required.
*/
asm(".macro __wr_spmcsr p, v \n\t"
".if \\p > 0x37 \n\t"
"sts \\p, \\v \n\t"
".else \n\t"
"out \\p, \\v \n\t"
".endif \n\t"
".endm \n");
#if defined(SPMCSR) || defined(SPMCR)
#define __boot_page_fill_short(address, data) \
(__extension__({ \
__asm__ __volatile__ \
( \
"movw r0, %3\n\t" \
"__wr_spmcsr %0, %1\n\t" \
"spm\n\t" \
"clr r1\n\t" \
: \
: "i" (_SFR_IO_ADDR(__SPM_REG)), \
"r" ((uint8_t)__BOOT_PAGE_FILL), \
"z" ((uint16_t)address), \
"r" ((uint16_t)data) \
: "r0" \
); \
}))
#define __boot_page_erase_short(address) \
(__extension__({ \
__asm__ __volatile__ \
( \
"__wr_spmcsr %0, %1\n\t" \
"spm\n\t" \
: \
: "i" (_SFR_IO_ADDR(__SPM_REG)), \
"r" ((uint8_t)__BOOT_PAGE_ERASE), \
"z" ((uint16_t)address) \
); \
}))
#define __boot_page_write_short(address) \
(__extension__({ \
__asm__ __volatile__ \
( \
"__wr_spmcsr %0, %1\n\t" \
"spm\n\t" \
: \
: "i" (_SFR_IO_ADDR(__SPM_REG)), \
"r" ((uint8_t)__BOOT_PAGE_WRITE), \
"z" ((uint16_t)address) \
); \
}))
#define __boot_rww_enable_short() \
(__extension__({ \
__asm__ __volatile__ \
( \
"__wr_spmcsr %0, %1\n\t" \
"spm\n\t" \
: \
: "i" (_SFR_IO_ADDR(__SPM_REG)), \
"r" ((uint8_t)__BOOT_RWW_ENABLE) \
); \
}))
#else
/*
* if SPMCSR or SPMCR isn't defined, it means we have some sort of
* new-fangled chip that post-dates the version of boot.h that we
* know about. In this case, it's possible that the standard boot.h
* still has workable functions, so we'll alias those.
*/
#define __boot_page_fill_short(address, data) boot_page_fill(address, data)
#define __boot_page_erase_short(address) boot_page_erase(address)
#define __boot_page_write_short(address) boot_page_write(address)
#define __boot_rww_enable_short() boot_rww_enable()
#endif

View File

@ -0,0 +1,34 @@
#
# Compile a couple of Optiboot variations using several different compilers
#
# A list of compilers that are available.
# This is, um, 4.3.3, 4.6.2, 4.8.1, 4.9.2, and 5.4.0
#
COMPS='
/usr/local/CrossPack-AVR-20100115/bin/
/usr/local/CrossPack-AVR-20121207/bin/
/usr/local/CrossPack-AVR-48/bin/
/usr/local/avr8-atmel-20160624/bin/
/usr/local/avr8-Atmel-3.6.0.487/bin/
'
for c in $COMPS; do
# Pretty print for readability
echo
echo
echo ===========================================================
echo Using compiler in $c
$c/avr-gcc --version | head -1
echo ===========================================================
echo --------------- make GCCROOT=$c atmega328
make GCCROOT=$c atmega328
echo --------------- make GCCROOT=$c atmega1284
make GCCROOT=$c atmega1284
echo --------------- make GCCROOT=$c luminet
make GCCROOT=$c luminet
echo --------------- make GCCROOT=$c mega1280
make GCCROOT=$c mega1280
done

View File

@ -0,0 +1,32 @@
#!/bin/bash
make clean
#
# buildable platforms of somewhat questionable support level
make lilypad
make pro8
make pro16
make pro20
make atmega328_pro8
make sanguino
make mega1280
make luminet
make diecimila
make bobuino
make wildfirev2
make atmega1284
make atmega32
make atmega88
make atmega168p
#
# Atmel development board targets
make xplained168pb
make xplained328p
make xplained328pb
#
# The "big three" standard bootloaders.
# These need to be built AFTER the platforms, or they'll get renamed
make atmega8
make atmega168
make atmega328

View File

@ -0,0 +1,37 @@
#!/bin/bash
make clean
#
# don't build most of the targets already in makeall
# The "big three" standard bootloaders.
# These need to be built AFTER the platforms, or they'll get renamed
make atmega8
make virboot8
make atmega168
make atmega328
make virboot328
make atmega328 BIGBOOT=1
make atmega328 SUPPORT_EEPROM=1 LED_START_FLASHES=0 LED_START_ON=1
make atmega328 BAUD_RATE=19200
make atmega328 SOFT_UART=1
make atmega328 LED_START_FLASHES=20
make atmega1284 UART=1 LED=A1
echo --------------------------------------------------
echo Expected to fail !!!!
echo --------------------------------------------------
# too big
make atmega328 SUPPORT_EEPROM=1
# no such port
make atmega328 LED=J1
# no such led
make atmega328 LED=fred
make atmega328 UART=1
#
#invalid bit rates
make atmega328 BAUD_RATE=300
make atmega328 BAUD_RATE=3000000

View File

@ -0,0 +1,9 @@
#%/bin/bash
if [ -d ../../../tools ]; then
mypath=../../../tools/avr/bin
else
mypath=../../../../tools/avr/bin
fi
echo $mypath/make OS=macosx ENV=arduino $*
$mypath/make OS=macosx ENV=arduino $*

View File

@ -0,0 +1,221 @@
@echo off
SET DEBUG=REM
REM Batch file to build Optiboot by searching around for the right tools, and then
REM setting the path and invoking them with the specified arguments.
REM Based on https://github.com/WestfW/Arduino-avr-tools-install
REM Batch file must run in Delayed Evaluation mode.
%DEBUG% checking cmd mode
call :clearerrors
if "!x!" EQU "%x%" (
REM Things are good; try to set the paths and run the compile
REM --------------------------------------------------------
call :findArduino
%DEBUG% Using make %*
make %*
exit /b 0
REM --------------------------------------------------------
)
REM We have to run in /V mode to get late evaluation of variables inside loops
%DEBUG% re-running in delayed eval mode
cmd.exe /V /C "%0" %*
exit /b 0
REM ======================================================================
:findArduino
REM Here is most of the work of the script.
REM Look through the various places where an Arduino install is likely to exist,
REM make sure that we can find the avr-gcc binaries that should be part of that
REM install, print out the version, and ask the user if that's what they want.
REM Look for existing avr-gcc in path.
%DEBUG% Looking for avr-gcc in current path
call :clearerrors
call :which avr-gcc.exe
IF "%gotwhich%" NEQ "" (
@ECHO avr-gcc already installed at %gotwhich%
exit /b 123
) ELSE (
@ECHO No avr-gcc in current path
)
REM look for Arduino install.
set picked=n
set printed=n
call :scandir "%ProgramFiles%"
if ERRORLEVEL 1 exit /b 1
if "%picked%" NEQ "y" call :scandir "%ProgramFiles(x86)%"
if ERRORLEVEL 1 exit /b 1
if "%picked%" NEQ "y" call :scandir "C:\bin"
if ERRORLEVEL 1 exit /b 1
if "%picked%" EQU "y" goto gotdir
@echo.
REM try some of the more unlikely places that Arduino might live.
:noarduino
@echo Can't find Arduino
exit /b 1
REM Given the name of a program-containing directory (like "\bin"),
REM See if it looks like there are any "Arduino*" directories there,
REM and prompt the user to ask whether that's the one we want to use
REM for avr-gcc. If so, set variables saying we picked one.
:scandir
%DEBUG% ScanDir %1
SET root=%~1
if NOT EXIST "%root%" exit /b 0
if NOT EXIST "%root%\Arduino*" exit /b 0
FOR /F "tokens=*" %%f IN ('dir /b /x "%root%\Arduino*"') DO (
SET prg=!root!\%%f
if exist "!prg!\Hardware\tools\avr\bin\avr-gcc.exe" (
if "%printed%" NEQ "Y" (
echo At least one Arduino install found.
echo.
set printed=Y
)
@echo Looks like !prg! has version
call :gccversion "!prg!\Hardware\tools\avr\bin\avr-gcc.exe"
SET aroot=!prg!
set picked=y
exit /b 0
) else %DEBUG% No Arduino exe in expected spot !prg!
)
exit /b 0
REM prompt for arduino install location.
@echo ****WHY DID WE GET HERE****
@echo asking if this is OK
SET /P confirm="Use %prg% [y/n]>"
if "%confirm%" NEQ "y" exit /b 0
:gotdir
REM figure out arduino install version.
%DEBUG% gotdir has aroot = !aroot!
IF EXIST "!aroot!\hardware\tools\avr\bin\avr-gcc.exe" (
set bin=!aroot!\hardware\tools\avr\bin
set etc=!aroot!\hardware\tools\avr\etc
) else (
@echo Cant find a bin directory in !aroot!
exit /b 963
)
%DEBUG% Checking for utils at %prg%\hardware\tools\avr\utils\bin\
IF EXIST "!aroot!\hardware\tools\avr\utils\bin\make.exe" (
REM See if we have make and etc as well (from Arduino 1.0.x/WinAVR)
%DEBUG% Found make.exe
set utils=!aroot!\hardware\tools\avr\utils\bin
) else (
IF EXIST "C:\Program Files (X86)\GnuWin32" (
set utils="C:\Program Files (X86)\GnuWin32\bin"
)
IF EXIST "C:\Program Files\GnuWin32" (
set utils="C:\Program Files\GnuWin32\bin"
)
)
REM find bin directory.
REM create tentative path for binaries and put it in our tmp batch file
%DEBUG% Setting paths to include bin and etc
REM
REM setx will set a permanent path in the registry, but it won't take effect
REM until the next invocation of cmd.exe
REM setx PATH %bin%;%etc%
REM
%DEBUG% adding arduin bin and etc to PATH %bin%;%etc%
call :shorten "%bin%"
PATH %PATH%;!shortout!
call :shorten "%etc%"
PATH %PATH%;!shortout!
%DEBUG% Have utils = %utils%
IF %utils% NEQ "" (
REM Check for make already installed
%DEBUG% Have utils; checking whether make is already installed.
call :which make.exe
if "%gotwhich%" EQU "" (
echo Found Make at %utils%
call :shorten %utils%
PATH %PATH%;!shortout!
)
)
call :clearerrors
exit /b 0
goto eof
REM ----------------------------------------------------------------------
REM Subroutines
REM ----------------------------------------------------------------------
:which
%DEBUG% which %1
SET gotwhich=
for %%i in (%1) do set fullspec=%%~$PATH:i
if not "x!fullspec!"=="x" (
%DEBUG% !fullspec!
set gotwhich=!fullspec!
)
%DEBUG% End which %gotwhich%
goto eof
REM ----------------------------------------------------------------------
:gccversion
REM This implements "gcc --version | head -1" - show the first line
if EXIST %1 (
FOR /F "delims=*" %%l in ('%1 --version') DO (
@echo %%l
REM return after we've output one line
exit /b 0
)
)
exit /b 0
REM ----------------------------------------------------------------------
:avrdudeversion
SETLOCAL ENABLEDELAYEDEXPANSION
REM This implements "gcc --version | head -4" - show the first line
set /a count=4
FOR /F "delims=*" %%l in ('"avrdude -v 2>&1"') DO (
@echo %%l
set /a count=!count!-1
if !count! equ 0 (
ENDLOCAL
exit /b 0
)
)
exit /b 0
goto :eof
REM ----------------------------------------------------------------------
REM Clear the ERRORLEVEL to 0, if it happened to be set
:clearerrors
exit /b 0
REM ----------------------------------------------------------------------
REM Shorten a pathname to 8.3 format filenames.
:shorten
set shortout=%~s1
exit /b 0
:eof

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,44 @@
:020000021000EC
:10FC0000112484B7882349F0982F9A70923029F0F4
:10FC100081FF02C097EF94BF10D185E080938100EF
:10FC200082E08093C00088E18093C10086E08093E9
:10FC3000C20080E18093C4008EE0EAD0279A86E07B
:10FC400020E33CEF91E0309385002093840096BB45
:10FC5000B09BFECF1F9AA8954091C00047FD02C0FF
:10FC6000815089F7FF24F39455E0E52E61E1D62E0B
:10FC7000C3D08134C1F4C0D0C82FD0D0C23809F469
:10FC80003AC0C13869F487E00CC0843709F482C0F7
:10FC9000853709F0A2C0C2D08EE1A7D087E9A5D0F0
:10FCA00083E0A3D09FC0823411F484E103C0853483
:10FCB00019F485E0BBD096C0853579F49DD0082F26
:10FCC0009BD0182F87FF03C08BB7816002C08BB712
:10FCD0008E7F8BBF000F111F84C0863581F48CD0BE
:10FCE0008D3459F489D0CBB787D0C170880FC82B19
:10FCF000CBBF81E09BD080E0D4CF83E0FBCF8436C4
:10FD000009F0C3CF79D0C82FD0E0DC2FCC2774D036
:10FD1000C82B72D0C82E5E01812C32E0932E6CD09D
:10FD2000F40181934F01F1E0AF1AB108C1F776D029
:10FD300085E4C81212C0DE5F4801A12C92E0B92E02
:10FD4000AC16BD0609F44EC0F50161915F01C40116
:10FD500082D0FFEF8F1A9F0AF3CF83E0F80187BFAD
:10FD6000E89507B600FCFDCFA0E0B2E0F8018D9168
:10FD70009D910C01F7BEE8951124229732962097A9
:10FD8000B1F7F801E7BEE89507B600FCFDCFD7BE96
:10FD9000E89528C031D0C82FD0E0DC2FCC272CD05C
:10FDA0005E01A82A29D0982E39D0E801F5E49F12E7
:10FDB0000BC0CE0148D019D081E0A81AB108219615
:10FDC000A114B104B1F70EC0FE018791EF010DD06F
:10FDD000E1E0AE1AB108C1F705C0813511F488E041
:10FDE00017D01CD080E101D043CF9091C00095FF87
:10FDF000FCCF8093C60008958091C00087FFFCCFA0
:10FE00008091C00084FD01C0A8958091C60008952E
:10FE1000E0E6F0E098E1908380830895EDDF8032A2
:10FE200019F088E0F5DFFFCF84E1DFCFCF93C82F53
:10FE3000E3DFC150E9F7CF91F1CF282E80E0E8DF72
:10FE4000E0E0FF270994F999FECF92BD81BDF89AB1
:10FE5000992780B50895262FF999FECF1FBA92BD34
:10FE600081BD20BD0FB6F894FA9AF99A0FBE01969B
:02FE70000895F3
:02FFFE000007FA
:040000031000FC00ED
:00000001FF

View File

@ -0,0 +1,726 @@
optiboot_atmega1280.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .data 00000000 00800200 0001fe72 00000306 2**0
CONTENTS, ALLOC, LOAD, DATA
1 .text 00000272 0001fc00 0001fc00 00000094 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .version 00000002 0001fffe 0001fffe 00000306 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .comment 0000002f 00000000 00000000 00000308 2**0
CONTENTS, READONLY
4 .debug_aranges 00000028 00000000 00000000 00000337 2**0
CONTENTS, READONLY, DEBUGGING
5 .debug_info 00000632 00000000 00000000 0000035f 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_abbrev 00000286 00000000 00000000 00000991 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_line 00000385 00000000 00000000 00000c17 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_frame 0000008c 00000000 00000000 00000f9c 2**2
CONTENTS, READONLY, DEBUGGING
9 .debug_str 0000021e 00000000 00000000 00001028 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_loc 00000421 00000000 00000000 00001246 2**0
CONTENTS, READONLY, DEBUGGING
11 .debug_ranges 00000078 00000000 00000000 00001667 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
0001fc00 <main>:
// SP points to RAMEND
// r1 contains zero
//
// If not, uncomment the following instructions:
// cli();
asm volatile ("clr __zero_reg__");
1fc00: 11 24 eor r1, r1
*
* Code by MarkG55
* see discusion in https://github.com/Optiboot/optiboot/issues/97
*/
#if !defined(__AVR_ATmega16__)
ch = MCUSR;
1fc02: 84 b7 in r24, 0x34 ; 52
#else
ch = MCUCSR;
#endif
// Skip all logic and run bootloader if MCUSR is cleared (application request)
if (ch != 0) {
1fc04: 88 23 and r24, r24
1fc06: 49 f0 breq .+18 ; 0x1fc1a <main+0x1a>
* 2. we clear WDRF if it's set with EXTRF to avoid loops
* One problematic scenario: broken application code sets watchdog timer
* without clearing MCUSR before and triggers it quickly. But it's
* recoverable by power-on with pushed reset button.
*/
if ((ch & (_BV(WDRF) | _BV(EXTRF))) != _BV(EXTRF)) {
1fc08: 98 2f mov r25, r24
1fc0a: 9a 70 andi r25, 0x0A ; 10
1fc0c: 92 30 cpi r25, 0x02 ; 2
1fc0e: 29 f0 breq .+10 ; 0x1fc1a <main+0x1a>
if (ch & _BV(EXTRF)) {
1fc10: 81 ff sbrs r24, 1
1fc12: 02 c0 rjmp .+4 ; 0x1fc18 <main+0x18>
* prevent entering bootloader.
* '&' operation is skipped to spare few bytes as bits in MCUSR
* can only be cleared.
*/
#if !defined(__AVR_ATmega16__)
MCUSR = ~(_BV(WDRF));
1fc14: 97 ef ldi r25, 0xF7 ; 247
1fc16: 94 bf out 0x34, r25 ; 52
#else
MCUCSR = ~(_BV(WDRF));
#endif
}
appStart(ch);
1fc18: 10 d1 rcall .+544 ; 0x1fe3a <appStart>
}
}
#if LED_START_FLASHES > 0
// Set up Timer 1 for timeout counter
TCCR1B = _BV(CS12) | _BV(CS10); // div 1024
1fc1a: 85 e0 ldi r24, 0x05 ; 5
1fc1c: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7e0081>
UCSRA = _BV(U2X); //Double speed mode USART
UCSRB = _BV(RXEN) | _BV(TXEN); // enable Rx & Tx
UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); // config USART; 8N1
UBRRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 );
#else
UART_SRA = _BV(U2X0); //Double speed mode USART0
1fc20: 82 e0 ldi r24, 0x02 ; 2
1fc22: 80 93 c0 00 sts 0x00C0, r24 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0>
UART_SRB = _BV(RXEN0) | _BV(TXEN0);
1fc26: 88 e1 ldi r24, 0x18 ; 24
1fc28: 80 93 c1 00 sts 0x00C1, r24 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7e00c1>
UART_SRC = _BV(UCSZ00) | _BV(UCSZ01);
1fc2c: 86 e0 ldi r24, 0x06 ; 6
1fc2e: 80 93 c2 00 sts 0x00C2, r24 ; 0x8000c2 <__TEXT_REGION_LENGTH__+0x7e00c2>
UART_SRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 );
1fc32: 80 e1 ldi r24, 0x10 ; 16
1fc34: 80 93 c4 00 sts 0x00C4, r24 ; 0x8000c4 <__TEXT_REGION_LENGTH__+0x7e00c4>
#endif
#endif
// Set up watchdog to trigger after 1s
watchdogConfig(WATCHDOG_1S);
1fc38: 8e e0 ldi r24, 0x0E ; 14
1fc3a: ea d0 rcall .+468 ; 0x1fe10 <watchdogConfig>
#if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH) || defined(LED_START_ON)
/* Set LED pin as output */
LED_DDR |= _BV(LED);
1fc3c: 27 9a sbi 0x04, 7 ; 4
1fc3e: 86 e0 ldi r24, 0x06 ; 6
}
#if LED_START_FLASHES > 0
void flash_led(uint8_t count) {
do {
TCNT1 = -(F_CPU/(1024*16));
1fc40: 20 e3 ldi r18, 0x30 ; 48
1fc42: 3c ef ldi r19, 0xFC ; 252
TIFR1 = _BV(TOV1);
1fc44: 91 e0 ldi r25, 0x01 ; 1
}
#if LED_START_FLASHES > 0
void flash_led(uint8_t count) {
do {
TCNT1 = -(F_CPU/(1024*16));
1fc46: 30 93 85 00 sts 0x0085, r19 ; 0x800085 <__TEXT_REGION_LENGTH__+0x7e0085>
1fc4a: 20 93 84 00 sts 0x0084, r18 ; 0x800084 <__TEXT_REGION_LENGTH__+0x7e0084>
TIFR1 = _BV(TOV1);
1fc4e: 96 bb out 0x16, r25 ; 22
while(!(TIFR1 & _BV(TOV1)));
1fc50: b0 9b sbis 0x16, 0 ; 22
1fc52: fe cf rjmp .-4 ; 0x1fc50 <main+0x50>
#if defined(__AVR_ATmega8__) || defined (__AVR_ATmega32__) || defined (__AVR_ATmega16__)
LED_PORT ^= _BV(LED);
#else
LED_PIN |= _BV(LED);
1fc54: 1f 9a sbi 0x03, 7 ; 3
}
#endif
// Watchdog functions. These are only safe with interrupts turned off.
void watchdogReset() {
__asm__ __volatile__ (
1fc56: a8 95 wdr
* While in theory, the STK500 initial commands would be buffered
* by the UART hardware, avrdude sends several attempts in rather
* quick succession, some of which will be lost and cause us to
* get out of sync. So if we see any data; stop blinking.
*/
if (UART_SRA & _BV(RXC0))
1fc58: 40 91 c0 00 lds r20, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0>
1fc5c: 47 fd sbrc r20, 7
1fc5e: 02 c0 rjmp .+4 ; 0x1fc64 <main+0x64>
1fc60: 81 50 subi r24, 0x01 ; 1
#else
// This doesn't seem to work?
// if ((UART_PIN & (1<<UART_RX_BIT)) == 0)
// break; // detect start bit on soft uart too.
#endif
} while (--count);
1fc62: 89 f7 brne .-30 ; 0x1fc46 <main+0x46>
/*
* Copy data from the buffer into the flash write buffer.
*/
do {
__boot_page_fill_short((uint16_t)(void*)addrPtr, *(mybuff.wptr++));
1fc64: ff 24 eor r15, r15
1fc66: f3 94 inc r15
} while (len -= 2);
/*
* Actually Write the buffer to flash (and wait for it to finish.)
*/
__boot_page_write_short(address.word);
1fc68: 55 e0 ldi r21, 0x05 ; 5
1fc6a: e5 2e mov r14, r21
boot_spm_busy_wait();
#if defined(RWWSRE)
// Reenable read access to flash
__boot_rww_enable_short();
1fc6c: 61 e1 ldi r22, 0x11 ; 17
#endif
/* Forever loop: exits by causing WDT reset */
for (;;) {
/* get character from UART */
ch = getch();
1fc6e: d6 2e mov r13, r22
if(ch == STK_GET_PARAMETER) {
1fc70: c3 d0 rcall .+390 ; 0x1fdf8 <getch>
unsigned char which = getch();
1fc72: 81 34 cpi r24, 0x41 ; 65
1fc74: c1 f4 brne .+48 ; 0x1fca6 <main+0xa6>
1fc76: c0 d0 rcall .+384 ; 0x1fdf8 <getch>
verifySpace();
1fc78: c8 2f mov r28, r24
1fc7a: d0 d0 rcall .+416 ; 0x1fe1c <verifySpace>
/*
* Send optiboot version as "SW version"
* Note that the references to memory are optimized away.
*/
if (which == STK_SW_MINOR) {
1fc7c: c2 38 cpi r28, 0x82 ; 130
1fc7e: 09 f4 brne .+2 ; 0x1fc82 <main+0x82>
1fc80: 3a c0 rjmp .+116 ; 0x1fcf6 <main+0xf6>
putch(optiboot_version & 0xFF);
} else if (which == STK_SW_MAJOR) {
1fc82: c1 38 cpi r28, 0x81 ; 129
1fc84: 69 f4 brne .+26 ; 0x1fca0 <main+0xa0>
putch(optiboot_version >> 8);
1fc86: 87 e0 ldi r24, 0x07 ; 7
1fc88: 0c c0 rjmp .+24 ; 0x1fca2 <main+0xa2>
writebuffer(desttype, buff, address, savelength);
}
/* Read memory block mode, length is big endian. */
else if(ch == STK_READ_PAGE) {
1fc8a: 84 37 cpi r24, 0x74 ; 116
1fc8c: 09 f4 brne .+2 ; 0x1fc90 <main+0x90>
read_mem(desttype, address, length);
}
/* Get device signature bytes */
else if(ch == STK_READ_SIGN) {
1fc8e: 82 c0 rjmp .+260 ; 0x1fd94 <main+0x194>
1fc90: 85 37 cpi r24, 0x75 ; 117
// READ SIGN - return what Avrdude wants to hear
verifySpace();
1fc92: 09 f0 breq .+2 ; 0x1fc96 <main+0x96>
putch(SIGNATURE_0);
1fc94: a2 c0 rjmp .+324 ; 0x1fdda <main+0x1da>
1fc96: c2 d0 rcall .+388 ; 0x1fe1c <verifySpace>
1fc98: 8e e1 ldi r24, 0x1E ; 30
putch(SIGNATURE_1);
1fc9a: a7 d0 rcall .+334 ; 0x1fdea <putch>
1fc9c: 87 e9 ldi r24, 0x97 ; 151
1fc9e: a5 d0 rcall .+330 ; 0x1fdea <putch>
} else {
/*
* GET PARAMETER returns a generic 0x03 reply for
* other parameters - enough to keep Avrdude happy
*/
putch(0x03);
1fca0: 83 e0 ldi r24, 0x03 ; 3
1fca2: a3 d0 rcall .+326 ; 0x1fdea <putch>
1fca4: 9f c0 rjmp .+318 ; 0x1fde4 <main+0x1e4>
}
}
else if(ch == STK_SET_DEVICE) {
1fca6: 82 34 cpi r24, 0x42 ; 66
1fca8: 11 f4 brne .+4 ; 0x1fcae <main+0xae>
// SET DEVICE is ignored
getNch(20);
1fcaa: 84 e1 ldi r24, 0x14 ; 20
}
else if(ch == STK_SET_DEVICE_EXT) {
1fcac: 03 c0 rjmp .+6 ; 0x1fcb4 <main+0xb4>
// SET DEVICE EXT is ignored
getNch(5);
1fcae: 85 34 cpi r24, 0x45 ; 69
1fcb0: 19 f4 brne .+6 ; 0x1fcb8 <main+0xb8>
1fcb2: 85 e0 ldi r24, 0x05 ; 5
1fcb4: bb d0 rcall .+374 ; 0x1fe2c <getNch>
}
else if(ch == STK_LOAD_ADDRESS) {
1fcb6: 96 c0 rjmp .+300 ; 0x1fde4 <main+0x1e4>
1fcb8: 85 35 cpi r24, 0x55 ; 85
// LOAD ADDRESS
address.bytes[0] = getch();
1fcba: 79 f4 brne .+30 ; 0x1fcda <main+0xda>
1fcbc: 9d d0 rcall .+314 ; 0x1fdf8 <getch>
1fcbe: 08 2f mov r16, r24
address.bytes[1] = getch();
1fcc0: 9b d0 rcall .+310 ; 0x1fdf8 <getch>
1fcc2: 18 2f mov r17, r24
1fcc4: 87 ff sbrs r24, 7
#ifdef RAMPZ
// Transfer top bit to LSB in RAMPZ
if (address.bytes[1] & 0x80) {
1fcc6: 03 c0 rjmp .+6 ; 0x1fcce <main+0xce>
RAMPZ |= 0x01;
1fcc8: 8b b7 in r24, 0x3b ; 59
1fcca: 81 60 ori r24, 0x01 ; 1
}
else {
RAMPZ &= 0xFE;
1fccc: 02 c0 rjmp .+4 ; 0x1fcd2 <main+0xd2>
1fcce: 8b b7 in r24, 0x3b ; 59
}
#endif
address.word *= 2; // Convert from word address to byte address
1fcd0: 8e 7f andi r24, 0xFE ; 254
1fcd2: 8b bf out 0x3b, r24 ; 59
1fcd4: 00 0f add r16, r16
verifySpace();
}
else if(ch == STK_UNIVERSAL) {
1fcd6: 11 1f adc r17, r17
#ifdef RAMPZ
// LOAD_EXTENDED_ADDRESS is needed in STK_UNIVERSAL for addressing more than 128kB
if ( AVR_OP_LOAD_EXT_ADDR == getch() ) {
1fcd8: 84 c0 rjmp .+264 ; 0x1fde2 <main+0x1e2>
1fcda: 86 35 cpi r24, 0x56 ; 86
1fcdc: 81 f4 brne .+32 ; 0x1fcfe <main+0xfe>
1fcde: 8c d0 rcall .+280 ; 0x1fdf8 <getch>
// get address
getch(); // get '0'
1fce0: 8d 34 cpi r24, 0x4D ; 77
1fce2: 59 f4 brne .+22 ; 0x1fcfa <main+0xfa>
RAMPZ = (RAMPZ & 0x01) | ((getch() << 1) & 0xff); // get address and put it in RAMPZ
1fce4: 89 d0 rcall .+274 ; 0x1fdf8 <getch>
1fce6: cb b7 in r28, 0x3b ; 59
1fce8: 87 d0 rcall .+270 ; 0x1fdf8 <getch>
1fcea: c1 70 andi r28, 0x01 ; 1
1fcec: 88 0f add r24, r24
1fcee: c8 2b or r28, r24
getNch(1); // get last '0'
1fcf0: cb bf out 0x3b, r28 ; 59
1fcf2: 81 e0 ldi r24, 0x01 ; 1
// response
putch(0x00);
1fcf4: 9b d0 rcall .+310 ; 0x1fe2c <getNch>
1fcf6: 80 e0 ldi r24, 0x00 ; 0
}
else {
// everything else is ignored
getNch(3);
1fcf8: d4 cf rjmp .-88 ; 0x1fca2 <main+0xa2>
1fcfa: 83 e0 ldi r24, 0x03 ; 3
getNch(4);
putch(0x00);
#endif
}
/* Write memory, length is big endian and is in bytes */
else if(ch == STK_PROG_PAGE) {
1fcfc: fb cf rjmp .-10 ; 0x1fcf4 <main+0xf4>
1fcfe: 84 36 cpi r24, 0x64 ; 100
// PROGRAM PAGE - we support flash programming only, not EEPROM
uint8_t desttype;
uint8_t *bufPtr;
pagelen_t savelength;
GETLENGTH(length);
1fd00: 09 f0 breq .+2 ; 0x1fd04 <main+0x104>
1fd02: c3 cf rjmp .-122 ; 0x1fc8a <main+0x8a>
1fd04: 79 d0 rcall .+242 ; 0x1fdf8 <getch>
1fd06: c8 2f mov r28, r24
1fd08: d0 e0 ldi r29, 0x00 ; 0
1fd0a: dc 2f mov r29, r28
1fd0c: cc 27 eor r28, r28
1fd0e: 74 d0 rcall .+232 ; 0x1fdf8 <getch>
savelength = length;
desttype = getch();
1fd10: c8 2b or r28, r24
1fd12: 72 d0 rcall .+228 ; 0x1fdf8 <getch>
1fd14: c8 2e mov r12, r24
// PROGRAM PAGE - we support flash programming only, not EEPROM
uint8_t desttype;
uint8_t *bufPtr;
pagelen_t savelength;
GETLENGTH(length);
1fd16: 5e 01 movw r10, r28
savelength = length;
desttype = getch();
1fd18: 81 2c mov r8, r1
1fd1a: 32 e0 ldi r19, 0x02 ; 2
1fd1c: 93 2e mov r9, r19
// read a page worth of contents
bufPtr = buff.bptr;
do *bufPtr++ = getch();
1fd1e: 6c d0 rcall .+216 ; 0x1fdf8 <getch>
1fd20: f4 01 movw r30, r8
1fd22: 81 93 st Z+, r24
1fd24: 4f 01 movw r8, r30
1fd26: f1 e0 ldi r31, 0x01 ; 1
while (--length);
1fd28: af 1a sub r10, r31
1fd2a: b1 08 sbc r11, r1
1fd2c: c1 f7 brne .-16 ; 0x1fd1e <main+0x11e>
// Read command terminator, start reply
verifySpace();
1fd2e: 76 d0 rcall .+236 ; 0x1fe1c <verifySpace>
1fd30: 85 e4 ldi r24, 0x45 ; 69
* void writebuffer(memtype, buffer, address, length)
*/
static inline void writebuffer(int8_t memtype, addr16_t mybuff,
addr16_t address, pagelen_t len)
{
switch (memtype) {
1fd32: c8 12 cpse r12, r24
1fd34: 12 c0 rjmp .+36 ; 0x1fd5a <main+0x15a>
1fd36: de 5f subi r29, 0xFE ; 254
1fd38: 48 01 movw r8, r16
1fd3a: a1 2c mov r10, r1
1fd3c: 92 e0 ldi r25, 0x02 ; 2
1fd3e: b9 2e mov r11, r25
1fd40: ac 16 cp r10, r28
case 'E': // EEPROM
#if defined(SUPPORT_EEPROM) || defined(BIGBOOT)
while(len--) {
1fd42: bd 06 cpc r11, r29
1fd44: 09 f4 brne .+2 ; 0x1fd48 <main+0x148>
1fd46: 4e c0 rjmp .+156 ; 0x1fde4 <main+0x1e4>
1fd48: f5 01 movw r30, r10
eeprom_write_byte((address.bptr++), *(mybuff.bptr++));
1fd4a: 61 91 ld r22, Z+
1fd4c: 5f 01 movw r10, r30
1fd4e: c4 01 movw r24, r8
1fd50: 82 d0 rcall .+260 ; 0x1fe56 <eeprom_write_byte>
1fd52: ff ef ldi r31, 0xFF ; 255
1fd54: 8f 1a sub r8, r31
1fd56: 9f 0a sbc r9, r31
1fd58: f3 cf rjmp .-26 ; 0x1fd40 <main+0x140>
1fd5a: 83 e0 ldi r24, 0x03 ; 3
1fd5c: f8 01 movw r30, r16
* Start the page erase and wait for it to finish. There
* used to be code to do this while receiving the data over
* the serial link, but the performance improvement was slight,
* and we needed the space back.
*/
__boot_page_erase_short(address.word);
1fd5e: 87 bf out 0x37, r24 ; 55
1fd60: e8 95 spm
1fd62: 07 b6 in r0, 0x37 ; 55
1fd64: 00 fc sbrc r0, 0
boot_spm_busy_wait();
1fd66: fd cf rjmp .-6 ; 0x1fd62 <main+0x162>
1fd68: a0 e0 ldi r26, 0x00 ; 0
1fd6a: b2 e0 ldi r27, 0x02 ; 2
1fd6c: f8 01 movw r30, r16
1fd6e: 8d 91 ld r24, X+
/*
* Copy data from the buffer into the flash write buffer.
*/
do {
__boot_page_fill_short((uint16_t)(void*)addrPtr, *(mybuff.wptr++));
1fd70: 9d 91 ld r25, X+
1fd72: 0c 01 movw r0, r24
1fd74: f7 be out 0x37, r15 ; 55
1fd76: e8 95 spm
1fd78: 11 24 eor r1, r1
addrPtr += 2;
} while (len -= 2);
1fd7a: 22 97 sbiw r28, 0x02 ; 2
1fd7c: 32 96 adiw r30, 0x02 ; 2
1fd7e: 20 97 sbiw r28, 0x00 ; 0
/*
* Actually Write the buffer to flash (and wait for it to finish.)
*/
__boot_page_write_short(address.word);
1fd80: b1 f7 brne .-20 ; 0x1fd6e <main+0x16e>
1fd82: f8 01 movw r30, r16
1fd84: e7 be out 0x37, r14 ; 55
boot_spm_busy_wait();
1fd86: e8 95 spm
#if defined(RWWSRE)
// Reenable read access to flash
__boot_rww_enable_short();
1fd88: 07 b6 in r0, 0x37 ; 55
1fd8a: 00 fc sbrc r0, 0
1fd8c: fd cf rjmp .-6 ; 0x1fd88 <main+0x188>
}
/* Read memory block mode, length is big endian. */
else if(ch == STK_READ_PAGE) {
uint8_t desttype;
GETLENGTH(length);
1fd8e: d7 be out 0x37, r13 ; 55
1fd90: e8 95 spm
1fd92: 28 c0 rjmp .+80 ; 0x1fde4 <main+0x1e4>
1fd94: 31 d0 rcall .+98 ; 0x1fdf8 <getch>
1fd96: c8 2f mov r28, r24
1fd98: d0 e0 ldi r29, 0x00 ; 0
1fd9a: dc 2f mov r29, r28
1fd9c: cc 27 eor r28, r28
1fd9e: 2c d0 rcall .+88 ; 0x1fdf8 <getch>
desttype = getch();
1fda0: 5e 01 movw r10, r28
1fda2: a8 2a or r10, r24
1fda4: 29 d0 rcall .+82 ; 0x1fdf8 <getch>
verifySpace();
1fda6: 98 2e mov r9, r24
1fda8: 39 d0 rcall .+114 ; 0x1fe1c <verifySpace>
1fdaa: e8 01 movw r28, r16
static inline void read_mem(uint8_t memtype, addr16_t address, pagelen_t length)
{
uint8_t ch;
switch (memtype) {
1fdac: f5 e4 ldi r31, 0x45 ; 69
#if defined(SUPPORT_EEPROM) || defined(BIGBOOT)
case 'E': // EEPROM
do {
putch(eeprom_read_byte((address.bptr++)));
1fdae: 9f 12 cpse r9, r31
1fdb0: 0b c0 rjmp .+22 ; 0x1fdc8 <main+0x1c8>
1fdb2: ce 01 movw r24, r28
1fdb4: 48 d0 rcall .+144 ; 0x1fe46 <eeprom_read_byte>
} while (--length);
1fdb6: 19 d0 rcall .+50 ; 0x1fdea <putch>
1fdb8: 81 e0 ldi r24, 0x01 ; 1
1fdba: a8 1a sub r10, r24
1fdbc: b1 08 sbc r11, r1
1fdbe: 21 96 adiw r28, 0x01 ; 1
1fdc0: a1 14 cp r10, r1
1fdc2: b1 04 cpc r11, r1
1fdc4: b1 f7 brne .-20 ; 0x1fdb2 <main+0x1b2>
// Since RAMPZ should already be set, we need to use EPLM directly.
// Also, we can use the autoincrement version of lpm to update "address"
// do putch(pgm_read_byte_near(address++));
// while (--length);
// read a Flash and increment the address (may increment RAMPZ)
__asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address.bptr): "1" (address));
1fdc6: 0e c0 rjmp .+28 ; 0x1fde4 <main+0x1e4>
1fdc8: fe 01 movw r30, r28
1fdca: 87 91 elpm r24, Z+
#else
// read a Flash byte and increment the address
__asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address.bptr): "1" (address));
#endif
putch(ch);
1fdcc: ef 01 movw r28, r30
1fdce: 0d d0 rcall .+26 ; 0x1fdea <putch>
} while (--length);
1fdd0: e1 e0 ldi r30, 0x01 ; 1
1fdd2: ae 1a sub r10, r30
1fdd4: b1 08 sbc r11, r1
1fdd6: c1 f7 brne .-16 ; 0x1fdc8 <main+0x1c8>
1fdd8: 05 c0 rjmp .+10 ; 0x1fde4 <main+0x1e4>
verifySpace();
putch(SIGNATURE_0);
putch(SIGNATURE_1);
putch(SIGNATURE_2);
}
else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */
1fdda: 81 35 cpi r24, 0x51 ; 81
1fddc: 11 f4 brne .+4 ; 0x1fde2 <main+0x1e2>
// Adaboot no-wait mod
watchdogConfig(WATCHDOG_16MS);
1fdde: 88 e0 ldi r24, 0x08 ; 8
1fde0: 17 d0 rcall .+46 ; 0x1fe10 <watchdogConfig>
1fde2: 1c d0 rcall .+56 ; 0x1fe1c <verifySpace>
verifySpace();
}
else {
// This covers the response to commands like STK_ENTER_PROGMODE
verifySpace();
1fde4: 80 e1 ldi r24, 0x10 ; 16
1fde6: 01 d0 rcall .+2 ; 0x1fdea <putch>
}
putch(STK_OK);
1fde8: 43 cf rjmp .-378 ; 0x1fc70 <main+0x70>
0001fdea <putch>:
1fdea: 90 91 c0 00 lds r25, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0>
}
1fdee: 95 ff sbrs r25, 5
}
void putch(char ch) {
#ifndef SOFT_UART
while (!(UART_SRA & _BV(UDRE0)));
1fdf0: fc cf rjmp .-8 ; 0x1fdea <putch>
UART_UDR = ch;
1fdf2: 80 93 c6 00 sts 0x00C6, r24 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7e00c6>
1fdf6: 08 95 ret
0001fdf8 <getch>:
[uartBit] "I" (UART_RX_BIT)
:
"r25"
);
#else
while(!(UART_SRA & _BV(RXC0)))
1fdf8: 80 91 c0 00 lds r24, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0>
1fdfc: 87 ff sbrs r24, 7
1fdfe: fc cf rjmp .-8 ; 0x1fdf8 <getch>
;
if (!(UART_SRA & _BV(FE0))) {
1fe00: 80 91 c0 00 lds r24, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0>
1fe04: 84 fd sbrc r24, 4
1fe06: 01 c0 rjmp .+2 ; 0x1fe0a <getch+0x12>
}
#endif
// Watchdog functions. These are only safe with interrupts turned off.
void watchdogReset() {
__asm__ __volatile__ (
1fe08: a8 95 wdr
* don't care that an invalid char is returned...)
*/
watchdogReset();
}
ch = UART_UDR;
1fe0a: 80 91 c6 00 lds r24, 0x00C6 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7e00c6>
LED_PIN |= _BV(LED);
#endif
#endif
return ch;
}
1fe0e: 08 95 ret
0001fe10 <watchdogConfig>:
"wdr\n"
);
}
void watchdogConfig(uint8_t x) {
WDTCSR = _BV(WDCE) | _BV(WDE);
1fe10: e0 e6 ldi r30, 0x60 ; 96
1fe12: f0 e0 ldi r31, 0x00 ; 0
1fe14: 98 e1 ldi r25, 0x18 ; 24
1fe16: 90 83 st Z, r25
WDTCSR = x;
1fe18: 80 83 st Z, r24
1fe1a: 08 95 ret
0001fe1c <verifySpace>:
do getch(); while (--count);
verifySpace();
}
void verifySpace() {
if (getch() != CRC_EOP) {
1fe1c: ed df rcall .-38 ; 0x1fdf8 <getch>
1fe1e: 80 32 cpi r24, 0x20 ; 32
1fe20: 19 f0 breq .+6 ; 0x1fe28 <verifySpace+0xc>
watchdogConfig(WATCHDOG_16MS); // shorten WD timeout
1fe22: 88 e0 ldi r24, 0x08 ; 8
1fe24: f5 df rcall .-22 ; 0x1fe10 <watchdogConfig>
1fe26: ff cf rjmp .-2 ; 0x1fe26 <verifySpace+0xa>
while (1) // and busy-loop so that WD causes
; // a reset and app start.
}
putch(STK_INSYNC);
1fe28: 84 e1 ldi r24, 0x14 ; 20
1fe2a: df cf rjmp .-66 ; 0x1fdea <putch>
0001fe2c <getNch>:
::[count] "M" (UART_B_VALUE)
);
}
#endif
void getNch(uint8_t count) {
1fe2c: cf 93 push r28
1fe2e: c8 2f mov r28, r24
do getch(); while (--count);
1fe30: e3 df rcall .-58 ; 0x1fdf8 <getch>
1fe32: c1 50 subi r28, 0x01 ; 1
1fe34: e9 f7 brne .-6 ; 0x1fe30 <getNch+0x4>
verifySpace();
1fe36: cf 91 pop r28
1fe38: f1 cf rjmp .-30 ; 0x1fe1c <verifySpace>
0001fe3a <appStart>:
void appStart(uint8_t rstFlags) {
// save the reset flags in the designated register
// This can be saved in a main program by putting code in .init0 (which
// executes before normal c init code) to save R2 to a global variable.
__asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags));
1fe3a: 28 2e mov r2, r24
watchdogConfig(WATCHDOG_OFF);
1fe3c: 80 e0 ldi r24, 0x00 ; 0
1fe3e: e8 df rcall .-48 ; 0x1fe10 <watchdogConfig>
1fe40: e0 e0 ldi r30, 0x00 ; 0
// Note that appstart_vec is defined so that this works with either
// real or virtual boot partitions.
__asm__ __volatile__ (
1fe42: ff 27 eor r31, r31
1fe44: 09 94 ijmp
0001fe46 <eeprom_read_byte>:
1fe46: f9 99 sbic 0x1f, 1 ; 31
1fe48: fe cf rjmp .-4 ; 0x1fe46 <eeprom_read_byte>
1fe4a: 92 bd out 0x22, r25 ; 34
1fe4c: 81 bd out 0x21, r24 ; 33
1fe4e: f8 9a sbi 0x1f, 0 ; 31
1fe50: 99 27 eor r25, r25
1fe52: 80 b5 in r24, 0x20 ; 32
1fe54: 08 95 ret
0001fe56 <eeprom_write_byte>:
1fe56: 26 2f mov r18, r22
0001fe58 <eeprom_write_r18>:
1fe58: f9 99 sbic 0x1f, 1 ; 31
1fe5a: fe cf rjmp .-4 ; 0x1fe58 <eeprom_write_r18>
1fe5c: 1f ba out 0x1f, r1 ; 31
1fe5e: 92 bd out 0x22, r25 ; 34
1fe60: 81 bd out 0x21, r24 ; 33
1fe62: 20 bd out 0x20, r18 ; 32
1fe64: 0f b6 in r0, 0x3f ; 63
1fe66: f8 94 cli
1fe68: fa 9a sbi 0x1f, 2 ; 31
1fe6a: f9 9a sbi 0x1f, 1 ; 31
1fe6c: 0f be out 0x3f, r0 ; 63
1fe6e: 01 96 adiw r24, 0x01 ; 1
1fe70: 08 95 ret

View File

@ -0,0 +1,31 @@
:107E0000112484B7882349F0982F9A70923029F072
:107E100081FF02C097EF94BFCCD085E080938100B2
:107E200082E08093C00088E18093C10086E0809367
:107E3000C20080E18093C4008EE0A6D0259A86E03F
:107E400020E33CEF91E0309385002093840096BBC3
:107E5000B09BFECF1D9AA8954091C00047FD02C07F
:107E6000815089F7EE24E39495E0D92E21E1C22ECA
:107E70007FD0813461F47CD0182F8CD01238E9F097
:107E8000113811F487E001C083E06BD067C0823401
:107E900011F484E103C0853419F485E083D05EC019
:107EA000853539F465D0C82F63D0D82FCC0FDD1FAE
:107EB00054C0863521F484E075D080E0E6CF843666
:107EC00009F02EC055D054D0F82E52D0B82E00E074
:107ED00011E04ED0F80181938F01FE12FACF5AD0F3
:107EE000F5E4BF1201C0FFCF83E0FE0187BFE89534
:107EF00007B600FCFDCFA0E0B1E0FE018D919D91A1
:107F00000C01E7BEE89511243296FA12F7CFFE0174
:107F1000D7BEE89507B600FCFDCFC7BEE8951EC0EA
:107F2000843771F425D024D0F82E22D033D08E019E
:107F3000F80185918F0115D0FA94F110F9CF0EC098
:107F4000853739F427D08EE10CD085E90AD08FE04F
:107F50009CCF813511F488E017D01CD080E101D08E
:107F600087CF9091C00095FFFCCF8093C600089505
:107F70008091C00087FFFCCF8091C00084FD01C0CC
:107F8000A8958091C6000895E0E6F0E098E190831E
:107F900080830895EDDF803219F088E0F5DFFFCFB0
:107FA00084E1DFCFCF93C82FE3DFC150E9F7CF9152
:0E7FB000F1CF282E80E0E8DFE0E0FF27099403
:027FFE0000077A
:0400000300007E007B
:00000001FF

View File

@ -0,0 +1,584 @@
optiboot_atmega328.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .data 00000000 00800100 00007fbe 00000252 2**0
CONTENTS, ALLOC, LOAD, DATA
1 .text 000001be 00007e00 00007e00 00000094 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .version 00000002 00007ffe 00007ffe 00000252 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .comment 0000002f 00000000 00000000 00000254 2**0
CONTENTS, READONLY
4 .debug_aranges 00000028 00000000 00000000 00000283 2**0
CONTENTS, READONLY, DEBUGGING
5 .debug_info 000005c8 00000000 00000000 000002ab 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_abbrev 00000282 00000000 00000000 00000873 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_line 000002f9 00000000 00000000 00000af5 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_frame 0000008c 00000000 00000000 00000df0 2**2
CONTENTS, READONLY, DEBUGGING
9 .debug_str 000001fa 00000000 00000000 00000e7c 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_loc 00000331 00000000 00000000 00001076 2**0
CONTENTS, READONLY, DEBUGGING
11 .debug_ranges 00000060 00000000 00000000 000013a7 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00007e00 <main>:
// SP points to RAMEND
// r1 contains zero
//
// If not, uncomment the following instructions:
// cli();
asm volatile ("clr __zero_reg__");
7e00: 11 24 eor r1, r1
*
* Code by MarkG55
* see discusion in https://github.com/Optiboot/optiboot/issues/97
*/
#if !defined(__AVR_ATmega16__)
ch = MCUSR;
7e02: 84 b7 in r24, 0x34 ; 52
#else
ch = MCUCSR;
#endif
// Skip all logic and run bootloader if MCUSR is cleared (application request)
if (ch != 0) {
7e04: 88 23 and r24, r24
7e06: 49 f0 breq .+18 ; 0x7e1a <main+0x1a>
* 2. we clear WDRF if it's set with EXTRF to avoid loops
* One problematic scenario: broken application code sets watchdog timer
* without clearing MCUSR before and triggers it quickly. But it's
* recoverable by power-on with pushed reset button.
*/
if ((ch & (_BV(WDRF) | _BV(EXTRF))) != _BV(EXTRF)) {
7e08: 98 2f mov r25, r24
7e0a: 9a 70 andi r25, 0x0A ; 10
7e0c: 92 30 cpi r25, 0x02 ; 2
7e0e: 29 f0 breq .+10 ; 0x7e1a <main+0x1a>
if (ch & _BV(EXTRF)) {
7e10: 81 ff sbrs r24, 1
7e12: 02 c0 rjmp .+4 ; 0x7e18 <main+0x18>
* prevent entering bootloader.
* '&' operation is skipped to spare few bytes as bits in MCUSR
* can only be cleared.
*/
#if !defined(__AVR_ATmega16__)
MCUSR = ~(_BV(WDRF));
7e14: 97 ef ldi r25, 0xF7 ; 247
7e16: 94 bf out 0x34, r25 ; 52
#else
MCUCSR = ~(_BV(WDRF));
#endif
}
appStart(ch);
7e18: cc d0 rcall .+408 ; 0x7fb2 <appStart>
}
}
#if LED_START_FLASHES > 0
// Set up Timer 1 for timeout counter
TCCR1B = _BV(CS12) | _BV(CS10); // div 1024
7e1a: 85 e0 ldi r24, 0x05 ; 5
7e1c: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7e0081>
UCSRA = _BV(U2X); //Double speed mode USART
UCSRB = _BV(RXEN) | _BV(TXEN); // enable Rx & Tx
UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); // config USART; 8N1
UBRRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 );
#else
UART_SRA = _BV(U2X0); //Double speed mode USART0
7e20: 82 e0 ldi r24, 0x02 ; 2
7e22: 80 93 c0 00 sts 0x00C0, r24 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0>
UART_SRB = _BV(RXEN0) | _BV(TXEN0);
7e26: 88 e1 ldi r24, 0x18 ; 24
7e28: 80 93 c1 00 sts 0x00C1, r24 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7e00c1>
UART_SRC = _BV(UCSZ00) | _BV(UCSZ01);
7e2c: 86 e0 ldi r24, 0x06 ; 6
7e2e: 80 93 c2 00 sts 0x00C2, r24 ; 0x8000c2 <__TEXT_REGION_LENGTH__+0x7e00c2>
UART_SRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 );
7e32: 80 e1 ldi r24, 0x10 ; 16
7e34: 80 93 c4 00 sts 0x00C4, r24 ; 0x8000c4 <__TEXT_REGION_LENGTH__+0x7e00c4>
#endif
#endif
// Set up watchdog to trigger after 1s
watchdogConfig(WATCHDOG_1S);
7e38: 8e e0 ldi r24, 0x0E ; 14
7e3a: a6 d0 rcall .+332 ; 0x7f88 <watchdogConfig>
#if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH) || defined(LED_START_ON)
/* Set LED pin as output */
LED_DDR |= _BV(LED);
7e3c: 25 9a sbi 0x04, 5 ; 4
7e3e: 86 e0 ldi r24, 0x06 ; 6
}
#if LED_START_FLASHES > 0
void flash_led(uint8_t count) {
do {
TCNT1 = -(F_CPU/(1024*16));
7e40: 20 e3 ldi r18, 0x30 ; 48
7e42: 3c ef ldi r19, 0xFC ; 252
TIFR1 = _BV(TOV1);
7e44: 91 e0 ldi r25, 0x01 ; 1
}
#if LED_START_FLASHES > 0
void flash_led(uint8_t count) {
do {
TCNT1 = -(F_CPU/(1024*16));
7e46: 30 93 85 00 sts 0x0085, r19 ; 0x800085 <__TEXT_REGION_LENGTH__+0x7e0085>
7e4a: 20 93 84 00 sts 0x0084, r18 ; 0x800084 <__TEXT_REGION_LENGTH__+0x7e0084>
TIFR1 = _BV(TOV1);
7e4e: 96 bb out 0x16, r25 ; 22
while(!(TIFR1 & _BV(TOV1)));
7e50: b0 9b sbis 0x16, 0 ; 22
7e52: fe cf rjmp .-4 ; 0x7e50 <main+0x50>
#if defined(__AVR_ATmega8__) || defined (__AVR_ATmega32__) || defined (__AVR_ATmega16__)
LED_PORT ^= _BV(LED);
#else
LED_PIN |= _BV(LED);
7e54: 1d 9a sbi 0x03, 5 ; 3
}
#endif
// Watchdog functions. These are only safe with interrupts turned off.
void watchdogReset() {
__asm__ __volatile__ (
7e56: a8 95 wdr
* While in theory, the STK500 initial commands would be buffered
* by the UART hardware, avrdude sends several attempts in rather
* quick succession, some of which will be lost and cause us to
* get out of sync. So if we see any data; stop blinking.
*/
if (UART_SRA & _BV(RXC0))
7e58: 40 91 c0 00 lds r20, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0>
7e5c: 47 fd sbrc r20, 7
7e5e: 02 c0 rjmp .+4 ; 0x7e64 <main+0x64>
7e60: 81 50 subi r24, 0x01 ; 1
#else
// This doesn't seem to work?
// if ((UART_PIN & (1<<UART_RX_BIT)) == 0)
// break; // detect start bit on soft uart too.
#endif
} while (--count);
7e62: 89 f7 brne .-30 ; 0x7e46 <main+0x46>
/*
* Copy data from the buffer into the flash write buffer.
*/
do {
__boot_page_fill_short((uint16_t)(void*)addrPtr, *(mybuff.wptr++));
7e64: ee 24 eor r14, r14
7e66: e3 94 inc r14
} while (len -= 2);
/*
* Actually Write the buffer to flash (and wait for it to finish.)
*/
__boot_page_write_short(address.word);
7e68: 95 e0 ldi r25, 0x05 ; 5
7e6a: d9 2e mov r13, r25
boot_spm_busy_wait();
#if defined(RWWSRE)
// Reenable read access to flash
__boot_rww_enable_short();
7e6c: 21 e1 ldi r18, 0x11 ; 17
#endif
/* Forever loop: exits by causing WDT reset */
for (;;) {
/* get character from UART */
ch = getch();
7e6e: c2 2e mov r12, r18
if(ch == STK_GET_PARAMETER) {
7e70: 7f d0 rcall .+254 ; 0x7f70 <getch>
unsigned char which = getch();
7e72: 81 34 cpi r24, 0x41 ; 65
7e74: 61 f4 brne .+24 ; 0x7e8e <main+0x8e>
7e76: 7c d0 rcall .+248 ; 0x7f70 <getch>
verifySpace();
7e78: 18 2f mov r17, r24
7e7a: 8c d0 rcall .+280 ; 0x7f94 <verifySpace>
/*
* Send optiboot version as "SW version"
* Note that the references to memory are optimized away.
*/
if (which == STK_SW_MINOR) {
7e7c: 12 38 cpi r17, 0x82 ; 130
7e7e: e9 f0 breq .+58 ; 0x7eba <main+0xba>
putch(optiboot_version & 0xFF);
} else if (which == STK_SW_MAJOR) {
7e80: 11 38 cpi r17, 0x81 ; 129
putch(optiboot_version >> 8);
7e82: 11 f4 brne .+4 ; 0x7e88 <main+0x88>
7e84: 87 e0 ldi r24, 0x07 ; 7
} else {
/*
* GET PARAMETER returns a generic 0x03 reply for
* other parameters - enough to keep Avrdude happy
*/
putch(0x03);
7e86: 01 c0 rjmp .+2 ; 0x7e8a <main+0x8a>
7e88: 83 e0 ldi r24, 0x03 ; 3
7e8a: 6b d0 rcall .+214 ; 0x7f62 <putch>
7e8c: 67 c0 rjmp .+206 ; 0x7f5c <main+0x15c>
}
}
else if(ch == STK_SET_DEVICE) {
7e8e: 82 34 cpi r24, 0x42 ; 66
// SET DEVICE is ignored
getNch(20);
7e90: 11 f4 brne .+4 ; 0x7e96 <main+0x96>
7e92: 84 e1 ldi r24, 0x14 ; 20
}
else if(ch == STK_SET_DEVICE_EXT) {
7e94: 03 c0 rjmp .+6 ; 0x7e9c <main+0x9c>
// SET DEVICE EXT is ignored
getNch(5);
7e96: 85 34 cpi r24, 0x45 ; 69
7e98: 19 f4 brne .+6 ; 0x7ea0 <main+0xa0>
7e9a: 85 e0 ldi r24, 0x05 ; 5
}
else if(ch == STK_LOAD_ADDRESS) {
7e9c: 83 d0 rcall .+262 ; 0x7fa4 <getNch>
7e9e: 5e c0 rjmp .+188 ; 0x7f5c <main+0x15c>
// LOAD ADDRESS
address.bytes[0] = getch();
7ea0: 85 35 cpi r24, 0x55 ; 85
7ea2: 39 f4 brne .+14 ; 0x7eb2 <main+0xb2>
7ea4: 65 d0 rcall .+202 ; 0x7f70 <getch>
address.bytes[1] = getch();
7ea6: c8 2f mov r28, r24
7ea8: 63 d0 rcall .+198 ; 0x7f70 <getch>
}
else {
RAMPZ &= 0xFE;
}
#endif
address.word *= 2; // Convert from word address to byte address
7eaa: d8 2f mov r29, r24
7eac: cc 0f add r28, r28
7eae: dd 1f adc r29, r29
verifySpace();
}
else if(ch == STK_UNIVERSAL) {
7eb0: 54 c0 rjmp .+168 ; 0x7f5a <main+0x15a>
getNch(3);
putch(0x00);
}
#else
// UNIVERSAL command is ignored
getNch(4);
7eb2: 86 35 cpi r24, 0x56 ; 86
7eb4: 21 f4 brne .+8 ; 0x7ebe <main+0xbe>
putch(0x00);
7eb6: 84 e0 ldi r24, 0x04 ; 4
7eb8: 75 d0 rcall .+234 ; 0x7fa4 <getNch>
#endif
}
/* Write memory, length is big endian and is in bytes */
else if(ch == STK_PROG_PAGE) {
7eba: 80 e0 ldi r24, 0x00 ; 0
7ebc: e6 cf rjmp .-52 ; 0x7e8a <main+0x8a>
// PROGRAM PAGE - we support flash programming only, not EEPROM
uint8_t desttype;
uint8_t *bufPtr;
pagelen_t savelength;
GETLENGTH(length);
7ebe: 84 36 cpi r24, 0x64 ; 100
7ec0: 09 f0 breq .+2 ; 0x7ec4 <main+0xc4>
7ec2: 2e c0 rjmp .+92 ; 0x7f20 <main+0x120>
7ec4: 55 d0 rcall .+170 ; 0x7f70 <getch>
savelength = length;
desttype = getch();
7ec6: 54 d0 rcall .+168 ; 0x7f70 <getch>
7ec8: f8 2e mov r15, r24
7eca: 52 d0 rcall .+164 ; 0x7f70 <getch>
7ecc: b8 2e mov r11, r24
7ece: 00 e0 ldi r16, 0x00 ; 0
// read a page worth of contents
bufPtr = buff.bptr;
do *bufPtr++ = getch();
7ed0: 11 e0 ldi r17, 0x01 ; 1
7ed2: 4e d0 rcall .+156 ; 0x7f70 <getch>
7ed4: f8 01 movw r30, r16
7ed6: 81 93 st Z+, r24
7ed8: 8f 01 movw r16, r30
while (--length);
7eda: fe 12 cpse r15, r30
7edc: fa cf rjmp .-12 ; 0x7ed2 <main+0xd2>
// Read command terminator, start reply
verifySpace();
7ede: 5a d0 rcall .+180 ; 0x7f94 <verifySpace>
7ee0: f5 e4 ldi r31, 0x45 ; 69
* void writebuffer(memtype, buffer, address, length)
*/
static inline void writebuffer(int8_t memtype, addr16_t mybuff,
addr16_t address, pagelen_t len)
{
switch (memtype) {
7ee2: bf 12 cpse r11, r31
7ee4: 01 c0 rjmp .+2 ; 0x7ee8 <main+0xe8>
7ee6: ff cf rjmp .-2 ; 0x7ee6 <main+0xe6>
7ee8: 83 e0 ldi r24, 0x03 ; 3
* Start the page erase and wait for it to finish. There
* used to be code to do this while receiving the data over
* the serial link, but the performance improvement was slight,
* and we needed the space back.
*/
__boot_page_erase_short(address.word);
7eea: fe 01 movw r30, r28
7eec: 87 bf out 0x37, r24 ; 55
7eee: e8 95 spm
7ef0: 07 b6 in r0, 0x37 ; 55
boot_spm_busy_wait();
7ef2: 00 fc sbrc r0, 0
7ef4: fd cf rjmp .-6 ; 0x7ef0 <main+0xf0>
7ef6: a0 e0 ldi r26, 0x00 ; 0
7ef8: b1 e0 ldi r27, 0x01 ; 1
7efa: fe 01 movw r30, r28
7efc: 8d 91 ld r24, X+
/*
* Copy data from the buffer into the flash write buffer.
*/
do {
__boot_page_fill_short((uint16_t)(void*)addrPtr, *(mybuff.wptr++));
7efe: 9d 91 ld r25, X+
7f00: 0c 01 movw r0, r24
7f02: e7 be out 0x37, r14 ; 55
7f04: e8 95 spm
7f06: 11 24 eor r1, r1
7f08: 32 96 adiw r30, 0x02 ; 2
addrPtr += 2;
} while (len -= 2);
7f0a: fa 12 cpse r15, r26
/*
* Actually Write the buffer to flash (and wait for it to finish.)
*/
__boot_page_write_short(address.word);
7f0c: f7 cf rjmp .-18 ; 0x7efc <main+0xfc>
7f0e: fe 01 movw r30, r28
boot_spm_busy_wait();
7f10: d7 be out 0x37, r13 ; 55
7f12: e8 95 spm
#if defined(RWWSRE)
// Reenable read access to flash
__boot_rww_enable_short();
7f14: 07 b6 in r0, 0x37 ; 55
7f16: 00 fc sbrc r0, 0
7f18: fd cf rjmp .-6 ; 0x7f14 <main+0x114>
writebuffer(desttype, buff, address, savelength);
}
/* Read memory block mode, length is big endian. */
else if(ch == STK_READ_PAGE) {
7f1a: c7 be out 0x37, r12 ; 55
7f1c: e8 95 spm
uint8_t desttype;
GETLENGTH(length);
7f1e: 1e c0 rjmp .+60 ; 0x7f5c <main+0x15c>
7f20: 84 37 cpi r24, 0x74 ; 116
7f22: 71 f4 brne .+28 ; 0x7f40 <main+0x140>
desttype = getch();
7f24: 25 d0 rcall .+74 ; 0x7f70 <getch>
verifySpace();
7f26: 24 d0 rcall .+72 ; 0x7f70 <getch>
7f28: f8 2e mov r15, r24
7f2a: 22 d0 rcall .+68 ; 0x7f70 <getch>
// while (--length);
// read a Flash and increment the address (may increment RAMPZ)
__asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address.bptr): "1" (address));
#else
// read a Flash byte and increment the address
__asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address.bptr): "1" (address));
7f2c: 33 d0 rcall .+102 ; 0x7f94 <verifySpace>
7f2e: 8e 01 movw r16, r28
#endif
putch(ch);
7f30: f8 01 movw r30, r16
} while (--length);
7f32: 85 91 lpm r24, Z+
7f34: 8f 01 movw r16, r30
7f36: 15 d0 rcall .+42 ; 0x7f62 <putch>
7f38: fa 94 dec r15
read_mem(desttype, address, length);
}
/* Get device signature bytes */
else if(ch == STK_READ_SIGN) {
7f3a: f1 10 cpse r15, r1
7f3c: f9 cf rjmp .-14 ; 0x7f30 <main+0x130>
// READ SIGN - return what Avrdude wants to hear
verifySpace();
7f3e: 0e c0 rjmp .+28 ; 0x7f5c <main+0x15c>
7f40: 85 37 cpi r24, 0x75 ; 117
putch(SIGNATURE_0);
7f42: 39 f4 brne .+14 ; 0x7f52 <main+0x152>
7f44: 27 d0 rcall .+78 ; 0x7f94 <verifySpace>
7f46: 8e e1 ldi r24, 0x1E ; 30
putch(SIGNATURE_1);
7f48: 0c d0 rcall .+24 ; 0x7f62 <putch>
7f4a: 85 e9 ldi r24, 0x95 ; 149
7f4c: 0a d0 rcall .+20 ; 0x7f62 <putch>
putch(SIGNATURE_2);
7f4e: 8f e0 ldi r24, 0x0F ; 15
7f50: 9c cf rjmp .-200 ; 0x7e8a <main+0x8a>
}
else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */
7f52: 81 35 cpi r24, 0x51 ; 81
7f54: 11 f4 brne .+4 ; 0x7f5a <main+0x15a>
// Adaboot no-wait mod
watchdogConfig(WATCHDOG_16MS);
7f56: 88 e0 ldi r24, 0x08 ; 8
7f58: 17 d0 rcall .+46 ; 0x7f88 <watchdogConfig>
7f5a: 1c d0 rcall .+56 ; 0x7f94 <verifySpace>
verifySpace();
}
else {
// This covers the response to commands like STK_ENTER_PROGMODE
verifySpace();
7f5c: 80 e1 ldi r24, 0x10 ; 16
7f5e: 01 d0 rcall .+2 ; 0x7f62 <putch>
}
putch(STK_OK);
7f60: 87 cf rjmp .-242 ; 0x7e70 <main+0x70>
00007f62 <putch>:
7f62: 90 91 c0 00 lds r25, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0>
}
7f66: 95 ff sbrs r25, 5
}
void putch(char ch) {
#ifndef SOFT_UART
while (!(UART_SRA & _BV(UDRE0)));
7f68: fc cf rjmp .-8 ; 0x7f62 <putch>
UART_UDR = ch;
7f6a: 80 93 c6 00 sts 0x00C6, r24 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7e00c6>
7f6e: 08 95 ret
00007f70 <getch>:
[uartBit] "I" (UART_RX_BIT)
:
"r25"
);
#else
while(!(UART_SRA & _BV(RXC0)))
7f70: 80 91 c0 00 lds r24, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0>
7f74: 87 ff sbrs r24, 7
7f76: fc cf rjmp .-8 ; 0x7f70 <getch>
;
if (!(UART_SRA & _BV(FE0))) {
7f78: 80 91 c0 00 lds r24, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0>
7f7c: 84 fd sbrc r24, 4
7f7e: 01 c0 rjmp .+2 ; 0x7f82 <getch+0x12>
}
#endif
// Watchdog functions. These are only safe with interrupts turned off.
void watchdogReset() {
__asm__ __volatile__ (
7f80: a8 95 wdr
* don't care that an invalid char is returned...)
*/
watchdogReset();
}
ch = UART_UDR;
7f82: 80 91 c6 00 lds r24, 0x00C6 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7e00c6>
LED_PIN |= _BV(LED);
#endif
#endif
return ch;
}
7f86: 08 95 ret
00007f88 <watchdogConfig>:
"wdr\n"
);
}
void watchdogConfig(uint8_t x) {
WDTCSR = _BV(WDCE) | _BV(WDE);
7f88: e0 e6 ldi r30, 0x60 ; 96
7f8a: f0 e0 ldi r31, 0x00 ; 0
7f8c: 98 e1 ldi r25, 0x18 ; 24
7f8e: 90 83 st Z, r25
WDTCSR = x;
7f90: 80 83 st Z, r24
7f92: 08 95 ret
00007f94 <verifySpace>:
do getch(); while (--count);
verifySpace();
}
void verifySpace() {
if (getch() != CRC_EOP) {
7f94: ed df rcall .-38 ; 0x7f70 <getch>
7f96: 80 32 cpi r24, 0x20 ; 32
7f98: 19 f0 breq .+6 ; 0x7fa0 <verifySpace+0xc>
watchdogConfig(WATCHDOG_16MS); // shorten WD timeout
7f9a: 88 e0 ldi r24, 0x08 ; 8
7f9c: f5 df rcall .-22 ; 0x7f88 <watchdogConfig>
7f9e: ff cf rjmp .-2 ; 0x7f9e <verifySpace+0xa>
while (1) // and busy-loop so that WD causes
; // a reset and app start.
}
putch(STK_INSYNC);
7fa0: 84 e1 ldi r24, 0x14 ; 20
7fa2: df cf rjmp .-66 ; 0x7f62 <putch>
00007fa4 <getNch>:
::[count] "M" (UART_B_VALUE)
);
}
#endif
void getNch(uint8_t count) {
7fa4: cf 93 push r28
7fa6: c8 2f mov r28, r24
do getch(); while (--count);
7fa8: e3 df rcall .-58 ; 0x7f70 <getch>
7faa: c1 50 subi r28, 0x01 ; 1
7fac: e9 f7 brne .-6 ; 0x7fa8 <getNch+0x4>
verifySpace();
7fae: cf 91 pop r28
7fb0: f1 cf rjmp .-30 ; 0x7f94 <verifySpace>
00007fb2 <appStart>:
void appStart(uint8_t rstFlags) {
// save the reset flags in the designated register
// This can be saved in a main program by putting code in .init0 (which
// executes before normal c init code) to save R2 to a global variable.
__asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags));
7fb2: 28 2e mov r2, r24
watchdogConfig(WATCHDOG_OFF);
7fb4: 80 e0 ldi r24, 0x00 ; 0
7fb6: e8 df rcall .-48 ; 0x7f88 <watchdogConfig>
7fb8: e0 e0 ldi r30, 0x00 ; 0
// Note that appstart_vec is defined so that this works with either
// real or virtual boot partitions.
__asm__ __volatile__ (
7fba: ff 27 eor r31, r31
7fbc: 09 94 ijmp

View File

@ -0,0 +1,40 @@
:10FC0000112484B7882349F0982F9A70923029F0F4
:10FC100081FF02C097EF94BFFBD085E08093810005
:10FC200082E08093C00088E18093C10086E08093E9
:10FC3000C20080E18093C4008EE0D5D0209A86E097
:10FC400020E33CEF91E0309385002093840096BB45
:10FC5000B09BFECF189AA8954091C00047FD02C006
:10FC6000815089F7FF24F39455E0E52E61E1D62E0B
:10FC7000AED0813461F4ABD0C82FBBD0C238E9F02C
:10FC8000C13811F487E001C083E09AD096C0823475
:10FC900011F484E103C0853419F485E0B2D08DC03D
:10FCA000853539F494D0082F92D0182F000F111FEA
:10FCB00083C0863521F484E0A4D080E0E6CF84368A
:10FCC00009F048C084D0C82FD0E0DC2FCC277FD0EB
:10FCD000C82B7DD0C82E5E01812C9924939477D0B7
:10FCE000F40181934F01F1E0AF1AB108C1F781D05F
:10FCF00085E4C81212C0D3954801A12CBB24B3944B
:10FD0000AC16BD0609F459C0F50161915F01C4014B
:10FD10008DD0FFEF8F1A9F0AF3CF83E0F80187BFE2
:10FD2000E89507B600FCFDCFA0E0B1E0F8018D91A9
:10FD30009D910C01F7BEE8951124229732962097E9
:10FD4000B1F7F801E7BEE89507B600FCFDCFD7BED6
:10FD5000E89533C0843719F53AD0C82FD0E0DC2FAE
:10FD6000CC2735D05E01A82A32D0982E42D0E801A7
:10FD7000F5E49F120BC0CE0151D022D081E0A81A29
:10FD8000B1082196A114B104B1F717C0FE01859105
:10FD9000EF0116D0E1E0AE1AB108C1F70EC0853709
:10FDA00039F427D08EE10CD086E90AD08AE06DCFF5
:10FDB000813511F488E017D01CD080E101D058CFF4
:10FDC0009091C00095FFFCCF8093C600089580916C
:10FDD000C00087FFFCCF8091C00084FD01C0A895C2
:10FDE0008091C6000895E0E6F0E098E1908380837A
:10FDF0000895EDDF803219F088E0F5DFFFCF84E170
:10FE0000DFCFCF93C82FE3DFC150E9F7CF91F1CF18
:10FE1000282E80E0E8DFE0E0FF270994F999FECF83
:10FE200092BD81BDF89A992780B50895262FF9993A
:10FE3000FECF1FBA92BD81BD20BD0FB6F894FA9ACD
:08FE4000F99A0FBE0196089526
:02FFFE000007FA
:040000030000FC00FD
:00000001FF

View File

@ -0,0 +1,683 @@
optiboot_atmega644p.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .data 00000000 00800100 0000fe48 000002dc 2**0
CONTENTS, ALLOC, LOAD, DATA
1 .text 00000248 0000fc00 0000fc00 00000094 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .version 00000002 0000fffe 0000fffe 000002dc 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .comment 0000002f 00000000 00000000 000002de 2**0
CONTENTS, READONLY
4 .debug_aranges 00000028 00000000 00000000 0000030d 2**0
CONTENTS, READONLY, DEBUGGING
5 .debug_info 00000625 00000000 00000000 00000335 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_abbrev 00000286 00000000 00000000 0000095a 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_line 0000035f 00000000 00000000 00000be0 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_frame 0000008c 00000000 00000000 00000f40 2**2
CONTENTS, READONLY, DEBUGGING
9 .debug_str 0000021d 00000000 00000000 00000fcc 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_loc 00000421 00000000 00000000 000011e9 2**0
CONTENTS, READONLY, DEBUGGING
11 .debug_ranges 00000060 00000000 00000000 0000160a 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
0000fc00 <main>:
// SP points to RAMEND
// r1 contains zero
//
// If not, uncomment the following instructions:
// cli();
asm volatile ("clr __zero_reg__");
fc00: 11 24 eor r1, r1
*
* Code by MarkG55
* see discusion in https://github.com/Optiboot/optiboot/issues/97
*/
#if !defined(__AVR_ATmega16__)
ch = MCUSR;
fc02: 84 b7 in r24, 0x34 ; 52
#else
ch = MCUCSR;
#endif
// Skip all logic and run bootloader if MCUSR is cleared (application request)
if (ch != 0) {
fc04: 88 23 and r24, r24
fc06: 49 f0 breq .+18 ; 0xfc1a <main+0x1a>
* 2. we clear WDRF if it's set with EXTRF to avoid loops
* One problematic scenario: broken application code sets watchdog timer
* without clearing MCUSR before and triggers it quickly. But it's
* recoverable by power-on with pushed reset button.
*/
if ((ch & (_BV(WDRF) | _BV(EXTRF))) != _BV(EXTRF)) {
fc08: 98 2f mov r25, r24
fc0a: 9a 70 andi r25, 0x0A ; 10
fc0c: 92 30 cpi r25, 0x02 ; 2
fc0e: 29 f0 breq .+10 ; 0xfc1a <main+0x1a>
if (ch & _BV(EXTRF)) {
fc10: 81 ff sbrs r24, 1
fc12: 02 c0 rjmp .+4 ; 0xfc18 <main+0x18>
* prevent entering bootloader.
* '&' operation is skipped to spare few bytes as bits in MCUSR
* can only be cleared.
*/
#if !defined(__AVR_ATmega16__)
MCUSR = ~(_BV(WDRF));
fc14: 97 ef ldi r25, 0xF7 ; 247
fc16: 94 bf out 0x34, r25 ; 52
#else
MCUCSR = ~(_BV(WDRF));
#endif
}
appStart(ch);
fc18: fb d0 rcall .+502 ; 0xfe10 <appStart>
}
}
#if LED_START_FLASHES > 0
// Set up Timer 1 for timeout counter
TCCR1B = _BV(CS12) | _BV(CS10); // div 1024
fc1a: 85 e0 ldi r24, 0x05 ; 5
fc1c: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7e0081>
UCSRA = _BV(U2X); //Double speed mode USART
UCSRB = _BV(RXEN) | _BV(TXEN); // enable Rx & Tx
UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); // config USART; 8N1
UBRRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 );
#else
UART_SRA = _BV(U2X0); //Double speed mode USART0
fc20: 82 e0 ldi r24, 0x02 ; 2
fc22: 80 93 c0 00 sts 0x00C0, r24 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0>
UART_SRB = _BV(RXEN0) | _BV(TXEN0);
fc26: 88 e1 ldi r24, 0x18 ; 24
fc28: 80 93 c1 00 sts 0x00C1, r24 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7e00c1>
UART_SRC = _BV(UCSZ00) | _BV(UCSZ01);
fc2c: 86 e0 ldi r24, 0x06 ; 6
fc2e: 80 93 c2 00 sts 0x00C2, r24 ; 0x8000c2 <__TEXT_REGION_LENGTH__+0x7e00c2>
UART_SRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 );
fc32: 80 e1 ldi r24, 0x10 ; 16
fc34: 80 93 c4 00 sts 0x00C4, r24 ; 0x8000c4 <__TEXT_REGION_LENGTH__+0x7e00c4>
#endif
#endif
// Set up watchdog to trigger after 1s
watchdogConfig(WATCHDOG_1S);
fc38: 8e e0 ldi r24, 0x0E ; 14
fc3a: d5 d0 rcall .+426 ; 0xfde6 <watchdogConfig>
#if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH) || defined(LED_START_ON)
/* Set LED pin as output */
LED_DDR |= _BV(LED);
fc3c: 20 9a sbi 0x04, 0 ; 4
fc3e: 86 e0 ldi r24, 0x06 ; 6
}
#if LED_START_FLASHES > 0
void flash_led(uint8_t count) {
do {
TCNT1 = -(F_CPU/(1024*16));
fc40: 20 e3 ldi r18, 0x30 ; 48
fc42: 3c ef ldi r19, 0xFC ; 252
TIFR1 = _BV(TOV1);
fc44: 91 e0 ldi r25, 0x01 ; 1
}
#if LED_START_FLASHES > 0
void flash_led(uint8_t count) {
do {
TCNT1 = -(F_CPU/(1024*16));
fc46: 30 93 85 00 sts 0x0085, r19 ; 0x800085 <__TEXT_REGION_LENGTH__+0x7e0085>
fc4a: 20 93 84 00 sts 0x0084, r18 ; 0x800084 <__TEXT_REGION_LENGTH__+0x7e0084>
TIFR1 = _BV(TOV1);
fc4e: 96 bb out 0x16, r25 ; 22
while(!(TIFR1 & _BV(TOV1)));
fc50: b0 9b sbis 0x16, 0 ; 22
fc52: fe cf rjmp .-4 ; 0xfc50 <main+0x50>
#if defined(__AVR_ATmega8__) || defined (__AVR_ATmega32__) || defined (__AVR_ATmega16__)
LED_PORT ^= _BV(LED);
#else
LED_PIN |= _BV(LED);
fc54: 18 9a sbi 0x03, 0 ; 3
}
#endif
// Watchdog functions. These are only safe with interrupts turned off.
void watchdogReset() {
__asm__ __volatile__ (
fc56: a8 95 wdr
* While in theory, the STK500 initial commands would be buffered
* by the UART hardware, avrdude sends several attempts in rather
* quick succession, some of which will be lost and cause us to
* get out of sync. So if we see any data; stop blinking.
*/
if (UART_SRA & _BV(RXC0))
fc58: 40 91 c0 00 lds r20, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0>
fc5c: 47 fd sbrc r20, 7
fc5e: 02 c0 rjmp .+4 ; 0xfc64 <main+0x64>
fc60: 81 50 subi r24, 0x01 ; 1
#else
// This doesn't seem to work?
// if ((UART_PIN & (1<<UART_RX_BIT)) == 0)
// break; // detect start bit on soft uart too.
#endif
} while (--count);
fc62: 89 f7 brne .-30 ; 0xfc46 <main+0x46>
/*
* Copy data from the buffer into the flash write buffer.
*/
do {
__boot_page_fill_short((uint16_t)(void*)addrPtr, *(mybuff.wptr++));
fc64: ff 24 eor r15, r15
fc66: f3 94 inc r15
} while (len -= 2);
/*
* Actually Write the buffer to flash (and wait for it to finish.)
*/
__boot_page_write_short(address.word);
fc68: 55 e0 ldi r21, 0x05 ; 5
fc6a: e5 2e mov r14, r21
boot_spm_busy_wait();
#if defined(RWWSRE)
// Reenable read access to flash
__boot_rww_enable_short();
fc6c: 61 e1 ldi r22, 0x11 ; 17
#endif
/* Forever loop: exits by causing WDT reset */
for (;;) {
/* get character from UART */
ch = getch();
fc6e: d6 2e mov r13, r22
if(ch == STK_GET_PARAMETER) {
fc70: ae d0 rcall .+348 ; 0xfdce <getch>
unsigned char which = getch();
fc72: 81 34 cpi r24, 0x41 ; 65
fc74: 61 f4 brne .+24 ; 0xfc8e <main+0x8e>
fc76: ab d0 rcall .+342 ; 0xfdce <getch>
verifySpace();
fc78: c8 2f mov r28, r24
fc7a: bb d0 rcall .+374 ; 0xfdf2 <verifySpace>
/*
* Send optiboot version as "SW version"
* Note that the references to memory are optimized away.
*/
if (which == STK_SW_MINOR) {
fc7c: c2 38 cpi r28, 0x82 ; 130
fc7e: e9 f0 breq .+58 ; 0xfcba <main+0xba>
putch(optiboot_version & 0xFF);
} else if (which == STK_SW_MAJOR) {
fc80: c1 38 cpi r28, 0x81 ; 129
putch(optiboot_version >> 8);
fc82: 11 f4 brne .+4 ; 0xfc88 <main+0x88>
fc84: 87 e0 ldi r24, 0x07 ; 7
} else {
/*
* GET PARAMETER returns a generic 0x03 reply for
* other parameters - enough to keep Avrdude happy
*/
putch(0x03);
fc86: 01 c0 rjmp .+2 ; 0xfc8a <main+0x8a>
fc88: 83 e0 ldi r24, 0x03 ; 3
fc8a: 9a d0 rcall .+308 ; 0xfdc0 <putch>
fc8c: 96 c0 rjmp .+300 ; 0xfdba <main+0x1ba>
}
}
else if(ch == STK_SET_DEVICE) {
fc8e: 82 34 cpi r24, 0x42 ; 66
// SET DEVICE is ignored
getNch(20);
fc90: 11 f4 brne .+4 ; 0xfc96 <main+0x96>
fc92: 84 e1 ldi r24, 0x14 ; 20
}
else if(ch == STK_SET_DEVICE_EXT) {
fc94: 03 c0 rjmp .+6 ; 0xfc9c <main+0x9c>
// SET DEVICE EXT is ignored
getNch(5);
fc96: 85 34 cpi r24, 0x45 ; 69
fc98: 19 f4 brne .+6 ; 0xfca0 <main+0xa0>
fc9a: 85 e0 ldi r24, 0x05 ; 5
}
else if(ch == STK_LOAD_ADDRESS) {
fc9c: b2 d0 rcall .+356 ; 0xfe02 <getNch>
fc9e: 8d c0 rjmp .+282 ; 0xfdba <main+0x1ba>
// LOAD ADDRESS
address.bytes[0] = getch();
fca0: 85 35 cpi r24, 0x55 ; 85
fca2: 39 f4 brne .+14 ; 0xfcb2 <main+0xb2>
fca4: 94 d0 rcall .+296 ; 0xfdce <getch>
address.bytes[1] = getch();
fca6: 08 2f mov r16, r24
fca8: 92 d0 rcall .+292 ; 0xfdce <getch>
}
else {
RAMPZ &= 0xFE;
}
#endif
address.word *= 2; // Convert from word address to byte address
fcaa: 18 2f mov r17, r24
fcac: 00 0f add r16, r16
fcae: 11 1f adc r17, r17
verifySpace();
}
else if(ch == STK_UNIVERSAL) {
fcb0: 83 c0 rjmp .+262 ; 0xfdb8 <main+0x1b8>
getNch(3);
putch(0x00);
}
#else
// UNIVERSAL command is ignored
getNch(4);
fcb2: 86 35 cpi r24, 0x56 ; 86
fcb4: 21 f4 brne .+8 ; 0xfcbe <main+0xbe>
fcb6: 84 e0 ldi r24, 0x04 ; 4
putch(0x00);
fcb8: a4 d0 rcall .+328 ; 0xfe02 <getNch>
#endif
}
/* Write memory, length is big endian and is in bytes */
else if(ch == STK_PROG_PAGE) {
fcba: 80 e0 ldi r24, 0x00 ; 0
fcbc: e6 cf rjmp .-52 ; 0xfc8a <main+0x8a>
// PROGRAM PAGE - we support flash programming only, not EEPROM
uint8_t desttype;
uint8_t *bufPtr;
pagelen_t savelength;
GETLENGTH(length);
fcbe: 84 36 cpi r24, 0x64 ; 100
fcc0: 09 f0 breq .+2 ; 0xfcc4 <main+0xc4>
fcc2: 48 c0 rjmp .+144 ; 0xfd54 <main+0x154>
fcc4: 84 d0 rcall .+264 ; 0xfdce <getch>
fcc6: c8 2f mov r28, r24
fcc8: d0 e0 ldi r29, 0x00 ; 0
fcca: dc 2f mov r29, r28
fccc: cc 27 eor r28, r28
savelength = length;
desttype = getch();
fcce: 7f d0 rcall .+254 ; 0xfdce <getch>
fcd0: c8 2b or r28, r24
// PROGRAM PAGE - we support flash programming only, not EEPROM
uint8_t desttype;
uint8_t *bufPtr;
pagelen_t savelength;
GETLENGTH(length);
fcd2: 7d d0 rcall .+250 ; 0xfdce <getch>
savelength = length;
desttype = getch();
fcd4: c8 2e mov r12, r24
fcd6: 5e 01 movw r10, r28
fcd8: 81 2c mov r8, r1
// read a page worth of contents
bufPtr = buff.bptr;
do *bufPtr++ = getch();
fcda: 99 24 eor r9, r9
fcdc: 93 94 inc r9
fcde: 77 d0 rcall .+238 ; 0xfdce <getch>
fce0: f4 01 movw r30, r8
fce2: 81 93 st Z+, r24
while (--length);
fce4: 4f 01 movw r8, r30
fce6: f1 e0 ldi r31, 0x01 ; 1
fce8: af 1a sub r10, r31
fcea: b1 08 sbc r11, r1
// Read command terminator, start reply
verifySpace();
fcec: c1 f7 brne .-16 ; 0xfcde <main+0xde>
fcee: 81 d0 rcall .+258 ; 0xfdf2 <verifySpace>
* void writebuffer(memtype, buffer, address, length)
*/
static inline void writebuffer(int8_t memtype, addr16_t mybuff,
addr16_t address, pagelen_t len)
{
switch (memtype) {
fcf0: 85 e4 ldi r24, 0x45 ; 69
fcf2: c8 12 cpse r12, r24
fcf4: 12 c0 rjmp .+36 ; 0xfd1a <main+0x11a>
fcf6: d3 95 inc r29
fcf8: 48 01 movw r8, r16
fcfa: a1 2c mov r10, r1
fcfc: bb 24 eor r11, r11
case 'E': // EEPROM
#if defined(SUPPORT_EEPROM) || defined(BIGBOOT)
while(len--) {
fcfe: b3 94 inc r11
fd00: ac 16 cp r10, r28
fd02: bd 06 cpc r11, r29
fd04: 09 f4 brne .+2 ; 0xfd08 <main+0x108>
eeprom_write_byte((address.bptr++), *(mybuff.bptr++));
fd06: 59 c0 rjmp .+178 ; 0xfdba <main+0x1ba>
fd08: f5 01 movw r30, r10
fd0a: 61 91 ld r22, Z+
fd0c: 5f 01 movw r10, r30
fd0e: c4 01 movw r24, r8
fd10: 8d d0 rcall .+282 ; 0xfe2c <eeprom_write_byte>
fd12: ff ef ldi r31, 0xFF ; 255
fd14: 8f 1a sub r8, r31
fd16: 9f 0a sbc r9, r31
fd18: f3 cf rjmp .-26 ; 0xfd00 <main+0x100>
* Start the page erase and wait for it to finish. There
* used to be code to do this while receiving the data over
* the serial link, but the performance improvement was slight,
* and we needed the space back.
*/
__boot_page_erase_short(address.word);
fd1a: 83 e0 ldi r24, 0x03 ; 3
fd1c: f8 01 movw r30, r16
fd1e: 87 bf out 0x37, r24 ; 55
fd20: e8 95 spm
boot_spm_busy_wait();
fd22: 07 b6 in r0, 0x37 ; 55
fd24: 00 fc sbrc r0, 0
fd26: fd cf rjmp .-6 ; 0xfd22 <main+0x122>
fd28: a0 e0 ldi r26, 0x00 ; 0
fd2a: b1 e0 ldi r27, 0x01 ; 1
fd2c: f8 01 movw r30, r16
/*
* Copy data from the buffer into the flash write buffer.
*/
do {
__boot_page_fill_short((uint16_t)(void*)addrPtr, *(mybuff.wptr++));
fd2e: 8d 91 ld r24, X+
fd30: 9d 91 ld r25, X+
fd32: 0c 01 movw r0, r24
fd34: f7 be out 0x37, r15 ; 55
fd36: e8 95 spm
addrPtr += 2;
} while (len -= 2);
fd38: 11 24 eor r1, r1
fd3a: 22 97 sbiw r28, 0x02 ; 2
fd3c: 32 96 adiw r30, 0x02 ; 2
fd3e: 20 97 sbiw r28, 0x00 ; 0
/*
* Actually Write the buffer to flash (and wait for it to finish.)
*/
__boot_page_write_short(address.word);
fd40: b1 f7 brne .-20 ; 0xfd2e <main+0x12e>
fd42: f8 01 movw r30, r16
boot_spm_busy_wait();
fd44: e7 be out 0x37, r14 ; 55
fd46: e8 95 spm
#if defined(RWWSRE)
// Reenable read access to flash
__boot_rww_enable_short();
fd48: 07 b6 in r0, 0x37 ; 55
fd4a: 00 fc sbrc r0, 0
fd4c: fd cf rjmp .-6 ; 0xfd48 <main+0x148>
writebuffer(desttype, buff, address, savelength);
}
/* Read memory block mode, length is big endian. */
else if(ch == STK_READ_PAGE) {
fd4e: d7 be out 0x37, r13 ; 55
fd50: e8 95 spm
uint8_t desttype;
GETLENGTH(length);
fd52: 33 c0 rjmp .+102 ; 0xfdba <main+0x1ba>
fd54: 84 37 cpi r24, 0x74 ; 116
fd56: 19 f5 brne .+70 ; 0xfd9e <main+0x19e>
fd58: 3a d0 rcall .+116 ; 0xfdce <getch>
fd5a: c8 2f mov r28, r24
fd5c: d0 e0 ldi r29, 0x00 ; 0
fd5e: dc 2f mov r29, r28
fd60: cc 27 eor r28, r28
desttype = getch();
fd62: 35 d0 rcall .+106 ; 0xfdce <getch>
fd64: 5e 01 movw r10, r28
fd66: a8 2a or r10, r24
verifySpace();
fd68: 32 d0 rcall .+100 ; 0xfdce <getch>
fd6a: 98 2e mov r9, r24
static inline void read_mem(uint8_t memtype, addr16_t address, pagelen_t length)
{
uint8_t ch;
switch (memtype) {
fd6c: 42 d0 rcall .+132 ; 0xfdf2 <verifySpace>
fd6e: e8 01 movw r28, r16
fd70: f5 e4 ldi r31, 0x45 ; 69
#if defined(SUPPORT_EEPROM) || defined(BIGBOOT)
case 'E': // EEPROM
do {
putch(eeprom_read_byte((address.bptr++)));
fd72: 9f 12 cpse r9, r31
fd74: 0b c0 rjmp .+22 ; 0xfd8c <main+0x18c>
fd76: ce 01 movw r24, r28
fd78: 51 d0 rcall .+162 ; 0xfe1c <eeprom_read_byte>
} while (--length);
fd7a: 22 d0 rcall .+68 ; 0xfdc0 <putch>
fd7c: 81 e0 ldi r24, 0x01 ; 1
fd7e: a8 1a sub r10, r24
fd80: b1 08 sbc r11, r1
fd82: 21 96 adiw r28, 0x01 ; 1
fd84: a1 14 cp r10, r1
fd86: b1 04 cpc r11, r1
// while (--length);
// read a Flash and increment the address (may increment RAMPZ)
__asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address.bptr): "1" (address));
#else
// read a Flash byte and increment the address
__asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address.bptr): "1" (address));
fd88: b1 f7 brne .-20 ; 0xfd76 <main+0x176>
fd8a: 17 c0 rjmp .+46 ; 0xfdba <main+0x1ba>
#endif
putch(ch);
fd8c: fe 01 movw r30, r28
fd8e: 85 91 lpm r24, Z+
} while (--length);
fd90: ef 01 movw r28, r30
fd92: 16 d0 rcall .+44 ; 0xfdc0 <putch>
fd94: e1 e0 ldi r30, 0x01 ; 1
fd96: ae 1a sub r10, r30
fd98: b1 08 sbc r11, r1
read_mem(desttype, address, length);
}
/* Get device signature bytes */
else if(ch == STK_READ_SIGN) {
fd9a: c1 f7 brne .-16 ; 0xfd8c <main+0x18c>
fd9c: 0e c0 rjmp .+28 ; 0xfdba <main+0x1ba>
// READ SIGN - return what Avrdude wants to hear
verifySpace();
fd9e: 85 37 cpi r24, 0x75 ; 117
fda0: 39 f4 brne .+14 ; 0xfdb0 <main+0x1b0>
putch(SIGNATURE_0);
fda2: 27 d0 rcall .+78 ; 0xfdf2 <verifySpace>
fda4: 8e e1 ldi r24, 0x1E ; 30
fda6: 0c d0 rcall .+24 ; 0xfdc0 <putch>
putch(SIGNATURE_1);
fda8: 86 e9 ldi r24, 0x96 ; 150
fdaa: 0a d0 rcall .+20 ; 0xfdc0 <putch>
fdac: 8a e0 ldi r24, 0x0A ; 10
putch(SIGNATURE_2);
fdae: 6d cf rjmp .-294 ; 0xfc8a <main+0x8a>
fdb0: 81 35 cpi r24, 0x51 ; 81
}
else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */
fdb2: 11 f4 brne .+4 ; 0xfdb8 <main+0x1b8>
fdb4: 88 e0 ldi r24, 0x08 ; 8
// Adaboot no-wait mod
watchdogConfig(WATCHDOG_16MS);
fdb6: 17 d0 rcall .+46 ; 0xfde6 <watchdogConfig>
fdb8: 1c d0 rcall .+56 ; 0xfdf2 <verifySpace>
fdba: 80 e1 ldi r24, 0x10 ; 16
verifySpace();
}
else {
// This covers the response to commands like STK_ENTER_PROGMODE
verifySpace();
fdbc: 01 d0 rcall .+2 ; 0xfdc0 <putch>
fdbe: 58 cf rjmp .-336 ; 0xfc70 <main+0x70>
0000fdc0 <putch>:
}
putch(STK_OK);
fdc0: 90 91 c0 00 lds r25, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0>
fdc4: 95 ff sbrs r25, 5
}
fdc6: fc cf rjmp .-8 ; 0xfdc0 <putch>
}
void putch(char ch) {
#ifndef SOFT_UART
while (!(UART_SRA & _BV(UDRE0)));
UART_UDR = ch;
fdc8: 80 93 c6 00 sts 0x00C6, r24 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7e00c6>
fdcc: 08 95 ret
0000fdce <getch>:
[uartBit] "I" (UART_RX_BIT)
:
"r25"
);
#else
while(!(UART_SRA & _BV(RXC0)))
fdce: 80 91 c0 00 lds r24, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0>
fdd2: 87 ff sbrs r24, 7
fdd4: fc cf rjmp .-8 ; 0xfdce <getch>
;
if (!(UART_SRA & _BV(FE0))) {
fdd6: 80 91 c0 00 lds r24, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0>
fdda: 84 fd sbrc r24, 4
fddc: 01 c0 rjmp .+2 ; 0xfde0 <getch+0x12>
}
#endif
// Watchdog functions. These are only safe with interrupts turned off.
void watchdogReset() {
__asm__ __volatile__ (
fdde: a8 95 wdr
* don't care that an invalid char is returned...)
*/
watchdogReset();
}
ch = UART_UDR;
fde0: 80 91 c6 00 lds r24, 0x00C6 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7e00c6>
LED_PIN |= _BV(LED);
#endif
#endif
return ch;
}
fde4: 08 95 ret
0000fde6 <watchdogConfig>:
"wdr\n"
);
}
void watchdogConfig(uint8_t x) {
WDTCSR = _BV(WDCE) | _BV(WDE);
fde6: e0 e6 ldi r30, 0x60 ; 96
fde8: f0 e0 ldi r31, 0x00 ; 0
fdea: 98 e1 ldi r25, 0x18 ; 24
fdec: 90 83 st Z, r25
WDTCSR = x;
fdee: 80 83 st Z, r24
fdf0: 08 95 ret
0000fdf2 <verifySpace>:
do getch(); while (--count);
verifySpace();
}
void verifySpace() {
if (getch() != CRC_EOP) {
fdf2: ed df rcall .-38 ; 0xfdce <getch>
fdf4: 80 32 cpi r24, 0x20 ; 32
fdf6: 19 f0 breq .+6 ; 0xfdfe <verifySpace+0xc>
watchdogConfig(WATCHDOG_16MS); // shorten WD timeout
fdf8: 88 e0 ldi r24, 0x08 ; 8
fdfa: f5 df rcall .-22 ; 0xfde6 <watchdogConfig>
fdfc: ff cf rjmp .-2 ; 0xfdfc <verifySpace+0xa>
while (1) // and busy-loop so that WD causes
; // a reset and app start.
}
putch(STK_INSYNC);
fdfe: 84 e1 ldi r24, 0x14 ; 20
fe00: df cf rjmp .-66 ; 0xfdc0 <putch>
0000fe02 <getNch>:
::[count] "M" (UART_B_VALUE)
);
}
#endif
void getNch(uint8_t count) {
fe02: cf 93 push r28
fe04: c8 2f mov r28, r24
do getch(); while (--count);
fe06: e3 df rcall .-58 ; 0xfdce <getch>
fe08: c1 50 subi r28, 0x01 ; 1
fe0a: e9 f7 brne .-6 ; 0xfe06 <getNch+0x4>
verifySpace();
fe0c: cf 91 pop r28
fe0e: f1 cf rjmp .-30 ; 0xfdf2 <verifySpace>
0000fe10 <appStart>:
void appStart(uint8_t rstFlags) {
// save the reset flags in the designated register
// This can be saved in a main program by putting code in .init0 (which
// executes before normal c init code) to save R2 to a global variable.
__asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags));
fe10: 28 2e mov r2, r24
watchdogConfig(WATCHDOG_OFF);
fe12: 80 e0 ldi r24, 0x00 ; 0
fe14: e8 df rcall .-48 ; 0xfde6 <watchdogConfig>
fe16: e0 e0 ldi r30, 0x00 ; 0
// Note that appstart_vec is defined so that this works with either
// real or virtual boot partitions.
__asm__ __volatile__ (
fe18: ff 27 eor r31, r31
fe1a: 09 94 ijmp
0000fe1c <eeprom_read_byte>:
fe1c: f9 99 sbic 0x1f, 1 ; 31
fe1e: fe cf rjmp .-4 ; 0xfe1c <eeprom_read_byte>
fe20: 92 bd out 0x22, r25 ; 34
fe22: 81 bd out 0x21, r24 ; 33
fe24: f8 9a sbi 0x1f, 0 ; 31
fe26: 99 27 eor r25, r25
fe28: 80 b5 in r24, 0x20 ; 32
fe2a: 08 95 ret
0000fe2c <eeprom_write_byte>:
fe2c: 26 2f mov r18, r22
0000fe2e <eeprom_write_r18>:
fe2e: f9 99 sbic 0x1f, 1 ; 31
fe30: fe cf rjmp .-4 ; 0xfe2e <eeprom_write_r18>
fe32: 1f ba out 0x1f, r1 ; 31
fe34: 92 bd out 0x22, r25 ; 34
fe36: 81 bd out 0x21, r24 ; 33
fe38: 20 bd out 0x20, r18 ; 32
fe3a: 0f b6 in r0, 0x3f ; 63
fe3c: f8 94 cli
fe3e: fa 9a sbi 0x1f, 2 ; 31
fe40: f9 9a sbi 0x1f, 1 ; 31
fe42: 0f be out 0x3f, r0 ; 63
fe44: 01 96 adiw r24, 0x01 ; 1
fe46: 08 95 ret

View File

@ -0,0 +1,584 @@
optiboot_atmega168.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .data 00000000 00800100 00003fbe 00000252 2**0
CONTENTS, ALLOC, LOAD, DATA
1 .text 000001be 00003e00 00003e00 00000094 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .version 00000002 00003ffe 00003ffe 00000252 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .comment 0000002f 00000000 00000000 00000254 2**0
CONTENTS, READONLY
4 .debug_aranges 00000028 00000000 00000000 00000283 2**0
CONTENTS, READONLY, DEBUGGING
5 .debug_info 000005c8 00000000 00000000 000002ab 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_abbrev 00000282 00000000 00000000 00000873 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_line 000002f9 00000000 00000000 00000af5 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_frame 0000008c 00000000 00000000 00000df0 2**2
CONTENTS, READONLY, DEBUGGING
9 .debug_str 000001fa 00000000 00000000 00000e7c 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_loc 00000331 00000000 00000000 00001076 2**0
CONTENTS, READONLY, DEBUGGING
11 .debug_ranges 00000060 00000000 00000000 000013a7 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00003e00 <main>:
// SP points to RAMEND
// r1 contains zero
//
// If not, uncomment the following instructions:
// cli();
asm volatile ("clr __zero_reg__");
3e00: 11 24 eor r1, r1
*
* Code by MarkG55
* see discusion in https://github.com/Optiboot/optiboot/issues/97
*/
#if !defined(__AVR_ATmega16__)
ch = MCUSR;
3e02: 84 b7 in r24, 0x34 ; 52
#else
ch = MCUCSR;
#endif
// Skip all logic and run bootloader if MCUSR is cleared (application request)
if (ch != 0) {
3e04: 88 23 and r24, r24
3e06: 49 f0 breq .+18 ; 0x3e1a <main+0x1a>
* 2. we clear WDRF if it's set with EXTRF to avoid loops
* One problematic scenario: broken application code sets watchdog timer
* without clearing MCUSR before and triggers it quickly. But it's
* recoverable by power-on with pushed reset button.
*/
if ((ch & (_BV(WDRF) | _BV(EXTRF))) != _BV(EXTRF)) {
3e08: 98 2f mov r25, r24
3e0a: 9a 70 andi r25, 0x0A ; 10
3e0c: 92 30 cpi r25, 0x02 ; 2
3e0e: 29 f0 breq .+10 ; 0x3e1a <main+0x1a>
if (ch & _BV(EXTRF)) {
3e10: 81 ff sbrs r24, 1
3e12: 02 c0 rjmp .+4 ; 0x3e18 <main+0x18>
* prevent entering bootloader.
* '&' operation is skipped to spare few bytes as bits in MCUSR
* can only be cleared.
*/
#if !defined(__AVR_ATmega16__)
MCUSR = ~(_BV(WDRF));
3e14: 97 ef ldi r25, 0xF7 ; 247
3e16: 94 bf out 0x34, r25 ; 52
#else
MCUCSR = ~(_BV(WDRF));
#endif
}
appStart(ch);
3e18: cc d0 rcall .+408 ; 0x3fb2 <appStart>
}
}
#if LED_START_FLASHES > 0
// Set up Timer 1 for timeout counter
TCCR1B = _BV(CS12) | _BV(CS10); // div 1024
3e1a: 85 e0 ldi r24, 0x05 ; 5
3e1c: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7e0081>
UCSRA = _BV(U2X); //Double speed mode USART
UCSRB = _BV(RXEN) | _BV(TXEN); // enable Rx & Tx
UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); // config USART; 8N1
UBRRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 );
#else
UART_SRA = _BV(U2X0); //Double speed mode USART0
3e20: 82 e0 ldi r24, 0x02 ; 2
3e22: 80 93 c0 00 sts 0x00C0, r24 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0>
UART_SRB = _BV(RXEN0) | _BV(TXEN0);
3e26: 88 e1 ldi r24, 0x18 ; 24
3e28: 80 93 c1 00 sts 0x00C1, r24 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7e00c1>
UART_SRC = _BV(UCSZ00) | _BV(UCSZ01);
3e2c: 86 e0 ldi r24, 0x06 ; 6
3e2e: 80 93 c2 00 sts 0x00C2, r24 ; 0x8000c2 <__TEXT_REGION_LENGTH__+0x7e00c2>
UART_SRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 );
3e32: 80 e1 ldi r24, 0x10 ; 16
3e34: 80 93 c4 00 sts 0x00C4, r24 ; 0x8000c4 <__TEXT_REGION_LENGTH__+0x7e00c4>
#endif
#endif
// Set up watchdog to trigger after 1s
watchdogConfig(WATCHDOG_1S);
3e38: 8e e0 ldi r24, 0x0E ; 14
3e3a: a6 d0 rcall .+332 ; 0x3f88 <watchdogConfig>
#if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH) || defined(LED_START_ON)
/* Set LED pin as output */
LED_DDR |= _BV(LED);
3e3c: 25 9a sbi 0x04, 5 ; 4
3e3e: 86 e0 ldi r24, 0x06 ; 6
}
#if LED_START_FLASHES > 0
void flash_led(uint8_t count) {
do {
TCNT1 = -(F_CPU/(1024*16));
3e40: 20 e3 ldi r18, 0x30 ; 48
3e42: 3c ef ldi r19, 0xFC ; 252
TIFR1 = _BV(TOV1);
3e44: 91 e0 ldi r25, 0x01 ; 1
}
#if LED_START_FLASHES > 0
void flash_led(uint8_t count) {
do {
TCNT1 = -(F_CPU/(1024*16));
3e46: 30 93 85 00 sts 0x0085, r19 ; 0x800085 <__TEXT_REGION_LENGTH__+0x7e0085>
3e4a: 20 93 84 00 sts 0x0084, r18 ; 0x800084 <__TEXT_REGION_LENGTH__+0x7e0084>
TIFR1 = _BV(TOV1);
3e4e: 96 bb out 0x16, r25 ; 22
while(!(TIFR1 & _BV(TOV1)));
3e50: b0 9b sbis 0x16, 0 ; 22
3e52: fe cf rjmp .-4 ; 0x3e50 <main+0x50>
#if defined(__AVR_ATmega8__) || defined (__AVR_ATmega32__) || defined (__AVR_ATmega16__)
LED_PORT ^= _BV(LED);
#else
LED_PIN |= _BV(LED);
3e54: 1d 9a sbi 0x03, 5 ; 3
}
#endif
// Watchdog functions. These are only safe with interrupts turned off.
void watchdogReset() {
__asm__ __volatile__ (
3e56: a8 95 wdr
* While in theory, the STK500 initial commands would be buffered
* by the UART hardware, avrdude sends several attempts in rather
* quick succession, some of which will be lost and cause us to
* get out of sync. So if we see any data; stop blinking.
*/
if (UART_SRA & _BV(RXC0))
3e58: 40 91 c0 00 lds r20, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0>
3e5c: 47 fd sbrc r20, 7
3e5e: 02 c0 rjmp .+4 ; 0x3e64 <main+0x64>
3e60: 81 50 subi r24, 0x01 ; 1
#else
// This doesn't seem to work?
// if ((UART_PIN & (1<<UART_RX_BIT)) == 0)
// break; // detect start bit on soft uart too.
#endif
} while (--count);
3e62: 89 f7 brne .-30 ; 0x3e46 <main+0x46>
/*
* Copy data from the buffer into the flash write buffer.
*/
do {
__boot_page_fill_short((uint16_t)(void*)addrPtr, *(mybuff.wptr++));
3e64: ee 24 eor r14, r14
3e66: e3 94 inc r14
} while (len -= 2);
/*
* Actually Write the buffer to flash (and wait for it to finish.)
*/
__boot_page_write_short(address.word);
3e68: 95 e0 ldi r25, 0x05 ; 5
3e6a: d9 2e mov r13, r25
boot_spm_busy_wait();
#if defined(RWWSRE)
// Reenable read access to flash
__boot_rww_enable_short();
3e6c: 21 e1 ldi r18, 0x11 ; 17
#endif
/* Forever loop: exits by causing WDT reset */
for (;;) {
/* get character from UART */
ch = getch();
3e6e: c2 2e mov r12, r18
if(ch == STK_GET_PARAMETER) {
3e70: 7f d0 rcall .+254 ; 0x3f70 <getch>
unsigned char which = getch();
3e72: 81 34 cpi r24, 0x41 ; 65
3e74: 61 f4 brne .+24 ; 0x3e8e <main+0x8e>
3e76: 7c d0 rcall .+248 ; 0x3f70 <getch>
verifySpace();
3e78: 18 2f mov r17, r24
3e7a: 8c d0 rcall .+280 ; 0x3f94 <verifySpace>
/*
* Send optiboot version as "SW version"
* Note that the references to memory are optimized away.
*/
if (which == STK_SW_MINOR) {
3e7c: 12 38 cpi r17, 0x82 ; 130
3e7e: e9 f0 breq .+58 ; 0x3eba <main+0xba>
putch(optiboot_version & 0xFF);
} else if (which == STK_SW_MAJOR) {
3e80: 11 38 cpi r17, 0x81 ; 129
putch(optiboot_version >> 8);
3e82: 11 f4 brne .+4 ; 0x3e88 <main+0x88>
3e84: 87 e0 ldi r24, 0x07 ; 7
} else {
/*
* GET PARAMETER returns a generic 0x03 reply for
* other parameters - enough to keep Avrdude happy
*/
putch(0x03);
3e86: 01 c0 rjmp .+2 ; 0x3e8a <main+0x8a>
3e88: 83 e0 ldi r24, 0x03 ; 3
3e8a: 6b d0 rcall .+214 ; 0x3f62 <putch>
3e8c: 67 c0 rjmp .+206 ; 0x3f5c <main+0x15c>
}
}
else if(ch == STK_SET_DEVICE) {
3e8e: 82 34 cpi r24, 0x42 ; 66
// SET DEVICE is ignored
getNch(20);
3e90: 11 f4 brne .+4 ; 0x3e96 <main+0x96>
3e92: 84 e1 ldi r24, 0x14 ; 20
}
else if(ch == STK_SET_DEVICE_EXT) {
3e94: 03 c0 rjmp .+6 ; 0x3e9c <main+0x9c>
// SET DEVICE EXT is ignored
getNch(5);
3e96: 85 34 cpi r24, 0x45 ; 69
3e98: 19 f4 brne .+6 ; 0x3ea0 <main+0xa0>
3e9a: 85 e0 ldi r24, 0x05 ; 5
}
else if(ch == STK_LOAD_ADDRESS) {
3e9c: 83 d0 rcall .+262 ; 0x3fa4 <getNch>
3e9e: 5e c0 rjmp .+188 ; 0x3f5c <main+0x15c>
// LOAD ADDRESS
address.bytes[0] = getch();
3ea0: 85 35 cpi r24, 0x55 ; 85
3ea2: 39 f4 brne .+14 ; 0x3eb2 <main+0xb2>
3ea4: 65 d0 rcall .+202 ; 0x3f70 <getch>
address.bytes[1] = getch();
3ea6: c8 2f mov r28, r24
3ea8: 63 d0 rcall .+198 ; 0x3f70 <getch>
}
else {
RAMPZ &= 0xFE;
}
#endif
address.word *= 2; // Convert from word address to byte address
3eaa: d8 2f mov r29, r24
3eac: cc 0f add r28, r28
3eae: dd 1f adc r29, r29
verifySpace();
}
else if(ch == STK_UNIVERSAL) {
3eb0: 54 c0 rjmp .+168 ; 0x3f5a <main+0x15a>
getNch(3);
putch(0x00);
}
#else
// UNIVERSAL command is ignored
getNch(4);
3eb2: 86 35 cpi r24, 0x56 ; 86
3eb4: 21 f4 brne .+8 ; 0x3ebe <main+0xbe>
putch(0x00);
3eb6: 84 e0 ldi r24, 0x04 ; 4
3eb8: 75 d0 rcall .+234 ; 0x3fa4 <getNch>
#endif
}
/* Write memory, length is big endian and is in bytes */
else if(ch == STK_PROG_PAGE) {
3eba: 80 e0 ldi r24, 0x00 ; 0
3ebc: e6 cf rjmp .-52 ; 0x3e8a <main+0x8a>
// PROGRAM PAGE - we support flash programming only, not EEPROM
uint8_t desttype;
uint8_t *bufPtr;
pagelen_t savelength;
GETLENGTH(length);
3ebe: 84 36 cpi r24, 0x64 ; 100
3ec0: 09 f0 breq .+2 ; 0x3ec4 <main+0xc4>
3ec2: 2e c0 rjmp .+92 ; 0x3f20 <main+0x120>
3ec4: 55 d0 rcall .+170 ; 0x3f70 <getch>
savelength = length;
desttype = getch();
3ec6: 54 d0 rcall .+168 ; 0x3f70 <getch>
3ec8: f8 2e mov r15, r24
3eca: 52 d0 rcall .+164 ; 0x3f70 <getch>
3ecc: b8 2e mov r11, r24
3ece: 00 e0 ldi r16, 0x00 ; 0
// read a page worth of contents
bufPtr = buff.bptr;
do *bufPtr++ = getch();
3ed0: 11 e0 ldi r17, 0x01 ; 1
3ed2: 4e d0 rcall .+156 ; 0x3f70 <getch>
3ed4: f8 01 movw r30, r16
3ed6: 81 93 st Z+, r24
3ed8: 8f 01 movw r16, r30
while (--length);
3eda: fe 12 cpse r15, r30
3edc: fa cf rjmp .-12 ; 0x3ed2 <main+0xd2>
// Read command terminator, start reply
verifySpace();
3ede: 5a d0 rcall .+180 ; 0x3f94 <verifySpace>
3ee0: f5 e4 ldi r31, 0x45 ; 69
* void writebuffer(memtype, buffer, address, length)
*/
static inline void writebuffer(int8_t memtype, addr16_t mybuff,
addr16_t address, pagelen_t len)
{
switch (memtype) {
3ee2: bf 12 cpse r11, r31
3ee4: 01 c0 rjmp .+2 ; 0x3ee8 <main+0xe8>
3ee6: ff cf rjmp .-2 ; 0x3ee6 <main+0xe6>
3ee8: 83 e0 ldi r24, 0x03 ; 3
* Start the page erase and wait for it to finish. There
* used to be code to do this while receiving the data over
* the serial link, but the performance improvement was slight,
* and we needed the space back.
*/
__boot_page_erase_short(address.word);
3eea: fe 01 movw r30, r28
3eec: 87 bf out 0x37, r24 ; 55
3eee: e8 95 spm
3ef0: 07 b6 in r0, 0x37 ; 55
boot_spm_busy_wait();
3ef2: 00 fc sbrc r0, 0
3ef4: fd cf rjmp .-6 ; 0x3ef0 <main+0xf0>
3ef6: a0 e0 ldi r26, 0x00 ; 0
3ef8: b1 e0 ldi r27, 0x01 ; 1
3efa: fe 01 movw r30, r28
3efc: 8d 91 ld r24, X+
/*
* Copy data from the buffer into the flash write buffer.
*/
do {
__boot_page_fill_short((uint16_t)(void*)addrPtr, *(mybuff.wptr++));
3efe: 9d 91 ld r25, X+
3f00: 0c 01 movw r0, r24
3f02: e7 be out 0x37, r14 ; 55
3f04: e8 95 spm
3f06: 11 24 eor r1, r1
3f08: 32 96 adiw r30, 0x02 ; 2
addrPtr += 2;
} while (len -= 2);
3f0a: fa 12 cpse r15, r26
/*
* Actually Write the buffer to flash (and wait for it to finish.)
*/
__boot_page_write_short(address.word);
3f0c: f7 cf rjmp .-18 ; 0x3efc <main+0xfc>
3f0e: fe 01 movw r30, r28
boot_spm_busy_wait();
3f10: d7 be out 0x37, r13 ; 55
3f12: e8 95 spm
#if defined(RWWSRE)
// Reenable read access to flash
__boot_rww_enable_short();
3f14: 07 b6 in r0, 0x37 ; 55
3f16: 00 fc sbrc r0, 0
3f18: fd cf rjmp .-6 ; 0x3f14 <main+0x114>
writebuffer(desttype, buff, address, savelength);
}
/* Read memory block mode, length is big endian. */
else if(ch == STK_READ_PAGE) {
3f1a: c7 be out 0x37, r12 ; 55
3f1c: e8 95 spm
uint8_t desttype;
GETLENGTH(length);
3f1e: 1e c0 rjmp .+60 ; 0x3f5c <main+0x15c>
3f20: 84 37 cpi r24, 0x74 ; 116
3f22: 71 f4 brne .+28 ; 0x3f40 <main+0x140>
desttype = getch();
3f24: 25 d0 rcall .+74 ; 0x3f70 <getch>
verifySpace();
3f26: 24 d0 rcall .+72 ; 0x3f70 <getch>
3f28: f8 2e mov r15, r24
3f2a: 22 d0 rcall .+68 ; 0x3f70 <getch>
// while (--length);
// read a Flash and increment the address (may increment RAMPZ)
__asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address.bptr): "1" (address));
#else
// read a Flash byte and increment the address
__asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address.bptr): "1" (address));
3f2c: 33 d0 rcall .+102 ; 0x3f94 <verifySpace>
3f2e: 8e 01 movw r16, r28
#endif
putch(ch);
3f30: f8 01 movw r30, r16
} while (--length);
3f32: 85 91 lpm r24, Z+
3f34: 8f 01 movw r16, r30
3f36: 15 d0 rcall .+42 ; 0x3f62 <putch>
3f38: fa 94 dec r15
read_mem(desttype, address, length);
}
/* Get device signature bytes */
else if(ch == STK_READ_SIGN) {
3f3a: f1 10 cpse r15, r1
3f3c: f9 cf rjmp .-14 ; 0x3f30 <main+0x130>
// READ SIGN - return what Avrdude wants to hear
verifySpace();
3f3e: 0e c0 rjmp .+28 ; 0x3f5c <main+0x15c>
3f40: 85 37 cpi r24, 0x75 ; 117
putch(SIGNATURE_0);
3f42: 39 f4 brne .+14 ; 0x3f52 <main+0x152>
3f44: 27 d0 rcall .+78 ; 0x3f94 <verifySpace>
3f46: 8e e1 ldi r24, 0x1E ; 30
putch(SIGNATURE_1);
3f48: 0c d0 rcall .+24 ; 0x3f62 <putch>
3f4a: 84 e9 ldi r24, 0x94 ; 148
3f4c: 0a d0 rcall .+20 ; 0x3f62 <putch>
putch(SIGNATURE_2);
3f4e: 86 e0 ldi r24, 0x06 ; 6
3f50: 9c cf rjmp .-200 ; 0x3e8a <main+0x8a>
}
else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */
3f52: 81 35 cpi r24, 0x51 ; 81
3f54: 11 f4 brne .+4 ; 0x3f5a <main+0x15a>
// Adaboot no-wait mod
watchdogConfig(WATCHDOG_16MS);
3f56: 88 e0 ldi r24, 0x08 ; 8
3f58: 17 d0 rcall .+46 ; 0x3f88 <watchdogConfig>
3f5a: 1c d0 rcall .+56 ; 0x3f94 <verifySpace>
verifySpace();
}
else {
// This covers the response to commands like STK_ENTER_PROGMODE
verifySpace();
3f5c: 80 e1 ldi r24, 0x10 ; 16
3f5e: 01 d0 rcall .+2 ; 0x3f62 <putch>
}
putch(STK_OK);
3f60: 87 cf rjmp .-242 ; 0x3e70 <main+0x70>
00003f62 <putch>:
3f62: 90 91 c0 00 lds r25, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0>
}
3f66: 95 ff sbrs r25, 5
}
void putch(char ch) {
#ifndef SOFT_UART
while (!(UART_SRA & _BV(UDRE0)));
3f68: fc cf rjmp .-8 ; 0x3f62 <putch>
UART_UDR = ch;
3f6a: 80 93 c6 00 sts 0x00C6, r24 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7e00c6>
3f6e: 08 95 ret
00003f70 <getch>:
[uartBit] "I" (UART_RX_BIT)
:
"r25"
);
#else
while(!(UART_SRA & _BV(RXC0)))
3f70: 80 91 c0 00 lds r24, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0>
3f74: 87 ff sbrs r24, 7
3f76: fc cf rjmp .-8 ; 0x3f70 <getch>
;
if (!(UART_SRA & _BV(FE0))) {
3f78: 80 91 c0 00 lds r24, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0>
3f7c: 84 fd sbrc r24, 4
3f7e: 01 c0 rjmp .+2 ; 0x3f82 <getch+0x12>
}
#endif
// Watchdog functions. These are only safe with interrupts turned off.
void watchdogReset() {
__asm__ __volatile__ (
3f80: a8 95 wdr
* don't care that an invalid char is returned...)
*/
watchdogReset();
}
ch = UART_UDR;
3f82: 80 91 c6 00 lds r24, 0x00C6 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7e00c6>
LED_PIN |= _BV(LED);
#endif
#endif
return ch;
}
3f86: 08 95 ret
00003f88 <watchdogConfig>:
"wdr\n"
);
}
void watchdogConfig(uint8_t x) {
WDTCSR = _BV(WDCE) | _BV(WDE);
3f88: e0 e6 ldi r30, 0x60 ; 96
3f8a: f0 e0 ldi r31, 0x00 ; 0
3f8c: 98 e1 ldi r25, 0x18 ; 24
3f8e: 90 83 st Z, r25
WDTCSR = x;
3f90: 80 83 st Z, r24
3f92: 08 95 ret
00003f94 <verifySpace>:
do getch(); while (--count);
verifySpace();
}
void verifySpace() {
if (getch() != CRC_EOP) {
3f94: ed df rcall .-38 ; 0x3f70 <getch>
3f96: 80 32 cpi r24, 0x20 ; 32
3f98: 19 f0 breq .+6 ; 0x3fa0 <verifySpace+0xc>
watchdogConfig(WATCHDOG_16MS); // shorten WD timeout
3f9a: 88 e0 ldi r24, 0x08 ; 8
3f9c: f5 df rcall .-22 ; 0x3f88 <watchdogConfig>
3f9e: ff cf rjmp .-2 ; 0x3f9e <verifySpace+0xa>
while (1) // and busy-loop so that WD causes
; // a reset and app start.
}
putch(STK_INSYNC);
3fa0: 84 e1 ldi r24, 0x14 ; 20
3fa2: df cf rjmp .-66 ; 0x3f62 <putch>
00003fa4 <getNch>:
::[count] "M" (UART_B_VALUE)
);
}
#endif
void getNch(uint8_t count) {
3fa4: cf 93 push r28
3fa6: c8 2f mov r28, r24
do getch(); while (--count);
3fa8: e3 df rcall .-58 ; 0x3f70 <getch>
3faa: c1 50 subi r28, 0x01 ; 1
3fac: e9 f7 brne .-6 ; 0x3fa8 <getNch+0x4>
verifySpace();
3fae: cf 91 pop r28
3fb0: f1 cf rjmp .-30 ; 0x3f94 <verifySpace>
00003fb2 <appStart>:
void appStart(uint8_t rstFlags) {
// save the reset flags in the designated register
// This can be saved in a main program by putting code in .init0 (which
// executes before normal c init code) to save R2 to a global variable.
__asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags));
3fb2: 28 2e mov r2, r24
watchdogConfig(WATCHDOG_OFF);
3fb4: 80 e0 ldi r24, 0x00 ; 0
3fb6: e8 df rcall .-48 ; 0x3f88 <watchdogConfig>
3fb8: e0 e0 ldi r30, 0x00 ; 0
// Note that appstart_vec is defined so that this works with either
// real or virtual boot partitions.
__asm__ __volatile__ (
3fba: ff 27 eor r31, r31
3fbc: 09 94 ijmp

View File

@ -0,0 +1,31 @@
:103E0000112484B7882349F0982F9A70923029F0B2
:103E100081FF02C097EF94BFCCD085E080938100F2
:103E200082E08093C00088E18093C10086E08093A7
:103E3000C20088E08093C4008EE0A6D0259A86E078
:103E400028E13EEF91E0309385002093840096BBFB
:103E5000B09BFECF1D9AA8954091C00047FD02C0BF
:103E6000815089F7EE24E39495E0D92E21E1C22E0A
:103E70007FD0813461F47CD0182F8CD01238E9F0D7
:103E8000113811F487E001C083E06BD067C0823441
:103E900011F484E103C0853419F485E083D05EC059
:103EA000853539F465D0C82F63D0D82FCC0FDD1FEE
:103EB00054C0863521F484E075D080E0E6CF8436A6
:103EC00009F02EC055D054D0F82E52D0B82E00E0B4
:103ED00011E04ED0F80181938F01FE12FACF5AD033
:103EE000F5E4BF1201C0FFCF83E0FE0187BFE89574
:103EF00007B600FCFDCFA0E0B1E0FE018D919D91E1
:103F00000C01E7BEE89511243296FA12F7CFFE01B4
:103F1000D7BEE89507B600FCFDCFC7BEE8951EC02A
:103F2000843771F425D024D0F82E22D033D08E01DE
:103F3000F80185918F0115D0FA94F110F9CF0EC0D8
:103F4000853739F427D08EE10CD084E90AD086E099
:103F50009CCF813511F488E017D01CD080E101D0CE
:103F600087CF9091C00095FFFCCF8093C600089545
:103F70008091C00087FFFCCF8091C00084FD01C00C
:103F8000A8958091C6000895E0E6F0E098E190835E
:103F900080830895EDDF803219F088E0F5DFFFCFF0
:103FA00084E1DFCFCF93C82FE3DFC150E9F7CF9192
:0E3FB000F1CF282E80E0E8DFE0E0FF27099443
:023FFE000007BA
:0400000300003E00BB
:00000001FF

View File

@ -0,0 +1,584 @@
optiboot_atmega168.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .data 00000000 00800100 00003fbe 00000252 2**0
CONTENTS, ALLOC, LOAD, DATA
1 .text 000001be 00003e00 00003e00 00000094 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .version 00000002 00003ffe 00003ffe 00000252 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .comment 0000002f 00000000 00000000 00000254 2**0
CONTENTS, READONLY
4 .debug_aranges 00000028 00000000 00000000 00000283 2**0
CONTENTS, READONLY, DEBUGGING
5 .debug_info 000005c8 00000000 00000000 000002ab 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_abbrev 00000282 00000000 00000000 00000873 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_line 000002f9 00000000 00000000 00000af5 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_frame 0000008c 00000000 00000000 00000df0 2**2
CONTENTS, READONLY, DEBUGGING
9 .debug_str 000001fa 00000000 00000000 00000e7c 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_loc 00000331 00000000 00000000 00001076 2**0
CONTENTS, READONLY, DEBUGGING
11 .debug_ranges 00000060 00000000 00000000 000013a7 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00003e00 <main>:
// SP points to RAMEND
// r1 contains zero
//
// If not, uncomment the following instructions:
// cli();
asm volatile ("clr __zero_reg__");
3e00: 11 24 eor r1, r1
*
* Code by MarkG55
* see discusion in https://github.com/Optiboot/optiboot/issues/97
*/
#if !defined(__AVR_ATmega16__)
ch = MCUSR;
3e02: 84 b7 in r24, 0x34 ; 52
#else
ch = MCUCSR;
#endif
// Skip all logic and run bootloader if MCUSR is cleared (application request)
if (ch != 0) {
3e04: 88 23 and r24, r24
3e06: 49 f0 breq .+18 ; 0x3e1a <main+0x1a>
* 2. we clear WDRF if it's set with EXTRF to avoid loops
* One problematic scenario: broken application code sets watchdog timer
* without clearing MCUSR before and triggers it quickly. But it's
* recoverable by power-on with pushed reset button.
*/
if ((ch & (_BV(WDRF) | _BV(EXTRF))) != _BV(EXTRF)) {
3e08: 98 2f mov r25, r24
3e0a: 9a 70 andi r25, 0x0A ; 10
3e0c: 92 30 cpi r25, 0x02 ; 2
3e0e: 29 f0 breq .+10 ; 0x3e1a <main+0x1a>
if (ch & _BV(EXTRF)) {
3e10: 81 ff sbrs r24, 1
3e12: 02 c0 rjmp .+4 ; 0x3e18 <main+0x18>
* prevent entering bootloader.
* '&' operation is skipped to spare few bytes as bits in MCUSR
* can only be cleared.
*/
#if !defined(__AVR_ATmega16__)
MCUSR = ~(_BV(WDRF));
3e14: 97 ef ldi r25, 0xF7 ; 247
3e16: 94 bf out 0x34, r25 ; 52
#else
MCUCSR = ~(_BV(WDRF));
#endif
}
appStart(ch);
3e18: cc d0 rcall .+408 ; 0x3fb2 <appStart>
}
}
#if LED_START_FLASHES > 0
// Set up Timer 1 for timeout counter
TCCR1B = _BV(CS12) | _BV(CS10); // div 1024
3e1a: 85 e0 ldi r24, 0x05 ; 5
3e1c: 80 93 81 00 sts 0x0081, r24 ; 0x800081 <__TEXT_REGION_LENGTH__+0x7e0081>
UCSRA = _BV(U2X); //Double speed mode USART
UCSRB = _BV(RXEN) | _BV(TXEN); // enable Rx & Tx
UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); // config USART; 8N1
UBRRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 );
#else
UART_SRA = _BV(U2X0); //Double speed mode USART0
3e20: 82 e0 ldi r24, 0x02 ; 2
3e22: 80 93 c0 00 sts 0x00C0, r24 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0>
UART_SRB = _BV(RXEN0) | _BV(TXEN0);
3e26: 88 e1 ldi r24, 0x18 ; 24
3e28: 80 93 c1 00 sts 0x00C1, r24 ; 0x8000c1 <__TEXT_REGION_LENGTH__+0x7e00c1>
UART_SRC = _BV(UCSZ00) | _BV(UCSZ01);
3e2c: 86 e0 ldi r24, 0x06 ; 6
3e2e: 80 93 c2 00 sts 0x00C2, r24 ; 0x8000c2 <__TEXT_REGION_LENGTH__+0x7e00c2>
UART_SRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 );
3e32: 88 e0 ldi r24, 0x08 ; 8
3e34: 80 93 c4 00 sts 0x00C4, r24 ; 0x8000c4 <__TEXT_REGION_LENGTH__+0x7e00c4>
#endif
#endif
// Set up watchdog to trigger after 1s
watchdogConfig(WATCHDOG_1S);
3e38: 8e e0 ldi r24, 0x0E ; 14
3e3a: a6 d0 rcall .+332 ; 0x3f88 <watchdogConfig>
#if (LED_START_FLASHES > 0) || defined(LED_DATA_FLASH) || defined(LED_START_ON)
/* Set LED pin as output */
LED_DDR |= _BV(LED);
3e3c: 25 9a sbi 0x04, 5 ; 4
3e3e: 86 e0 ldi r24, 0x06 ; 6
}
#if LED_START_FLASHES > 0
void flash_led(uint8_t count) {
do {
TCNT1 = -(F_CPU/(1024*16));
3e40: 28 e1 ldi r18, 0x18 ; 24
3e42: 3e ef ldi r19, 0xFE ; 254
TIFR1 = _BV(TOV1);
3e44: 91 e0 ldi r25, 0x01 ; 1
}
#if LED_START_FLASHES > 0
void flash_led(uint8_t count) {
do {
TCNT1 = -(F_CPU/(1024*16));
3e46: 30 93 85 00 sts 0x0085, r19 ; 0x800085 <__TEXT_REGION_LENGTH__+0x7e0085>
3e4a: 20 93 84 00 sts 0x0084, r18 ; 0x800084 <__TEXT_REGION_LENGTH__+0x7e0084>
TIFR1 = _BV(TOV1);
3e4e: 96 bb out 0x16, r25 ; 22
while(!(TIFR1 & _BV(TOV1)));
3e50: b0 9b sbis 0x16, 0 ; 22
3e52: fe cf rjmp .-4 ; 0x3e50 <main+0x50>
#if defined(__AVR_ATmega8__) || defined (__AVR_ATmega32__) || defined (__AVR_ATmega16__)
LED_PORT ^= _BV(LED);
#else
LED_PIN |= _BV(LED);
3e54: 1d 9a sbi 0x03, 5 ; 3
}
#endif
// Watchdog functions. These are only safe with interrupts turned off.
void watchdogReset() {
__asm__ __volatile__ (
3e56: a8 95 wdr
* While in theory, the STK500 initial commands would be buffered
* by the UART hardware, avrdude sends several attempts in rather
* quick succession, some of which will be lost and cause us to
* get out of sync. So if we see any data; stop blinking.
*/
if (UART_SRA & _BV(RXC0))
3e58: 40 91 c0 00 lds r20, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0>
3e5c: 47 fd sbrc r20, 7
3e5e: 02 c0 rjmp .+4 ; 0x3e64 <main+0x64>
3e60: 81 50 subi r24, 0x01 ; 1
#else
// This doesn't seem to work?
// if ((UART_PIN & (1<<UART_RX_BIT)) == 0)
// break; // detect start bit on soft uart too.
#endif
} while (--count);
3e62: 89 f7 brne .-30 ; 0x3e46 <main+0x46>
/*
* Copy data from the buffer into the flash write buffer.
*/
do {
__boot_page_fill_short((uint16_t)(void*)addrPtr, *(mybuff.wptr++));
3e64: ee 24 eor r14, r14
3e66: e3 94 inc r14
} while (len -= 2);
/*
* Actually Write the buffer to flash (and wait for it to finish.)
*/
__boot_page_write_short(address.word);
3e68: 95 e0 ldi r25, 0x05 ; 5
3e6a: d9 2e mov r13, r25
boot_spm_busy_wait();
#if defined(RWWSRE)
// Reenable read access to flash
__boot_rww_enable_short();
3e6c: 21 e1 ldi r18, 0x11 ; 17
#endif
/* Forever loop: exits by causing WDT reset */
for (;;) {
/* get character from UART */
ch = getch();
3e6e: c2 2e mov r12, r18
if(ch == STK_GET_PARAMETER) {
3e70: 7f d0 rcall .+254 ; 0x3f70 <getch>
unsigned char which = getch();
3e72: 81 34 cpi r24, 0x41 ; 65
3e74: 61 f4 brne .+24 ; 0x3e8e <main+0x8e>
3e76: 7c d0 rcall .+248 ; 0x3f70 <getch>
verifySpace();
3e78: 18 2f mov r17, r24
3e7a: 8c d0 rcall .+280 ; 0x3f94 <verifySpace>
/*
* Send optiboot version as "SW version"
* Note that the references to memory are optimized away.
*/
if (which == STK_SW_MINOR) {
3e7c: 12 38 cpi r17, 0x82 ; 130
3e7e: e9 f0 breq .+58 ; 0x3eba <main+0xba>
putch(optiboot_version & 0xFF);
} else if (which == STK_SW_MAJOR) {
3e80: 11 38 cpi r17, 0x81 ; 129
putch(optiboot_version >> 8);
3e82: 11 f4 brne .+4 ; 0x3e88 <main+0x88>
3e84: 87 e0 ldi r24, 0x07 ; 7
} else {
/*
* GET PARAMETER returns a generic 0x03 reply for
* other parameters - enough to keep Avrdude happy
*/
putch(0x03);
3e86: 01 c0 rjmp .+2 ; 0x3e8a <main+0x8a>
3e88: 83 e0 ldi r24, 0x03 ; 3
3e8a: 6b d0 rcall .+214 ; 0x3f62 <putch>
3e8c: 67 c0 rjmp .+206 ; 0x3f5c <main+0x15c>
}
}
else if(ch == STK_SET_DEVICE) {
3e8e: 82 34 cpi r24, 0x42 ; 66
// SET DEVICE is ignored
getNch(20);
3e90: 11 f4 brne .+4 ; 0x3e96 <main+0x96>
3e92: 84 e1 ldi r24, 0x14 ; 20
}
else if(ch == STK_SET_DEVICE_EXT) {
3e94: 03 c0 rjmp .+6 ; 0x3e9c <main+0x9c>
// SET DEVICE EXT is ignored
getNch(5);
3e96: 85 34 cpi r24, 0x45 ; 69
3e98: 19 f4 brne .+6 ; 0x3ea0 <main+0xa0>
3e9a: 85 e0 ldi r24, 0x05 ; 5
}
else if(ch == STK_LOAD_ADDRESS) {
3e9c: 83 d0 rcall .+262 ; 0x3fa4 <getNch>
3e9e: 5e c0 rjmp .+188 ; 0x3f5c <main+0x15c>
// LOAD ADDRESS
address.bytes[0] = getch();
3ea0: 85 35 cpi r24, 0x55 ; 85
3ea2: 39 f4 brne .+14 ; 0x3eb2 <main+0xb2>
3ea4: 65 d0 rcall .+202 ; 0x3f70 <getch>
address.bytes[1] = getch();
3ea6: c8 2f mov r28, r24
3ea8: 63 d0 rcall .+198 ; 0x3f70 <getch>
}
else {
RAMPZ &= 0xFE;
}
#endif
address.word *= 2; // Convert from word address to byte address
3eaa: d8 2f mov r29, r24
3eac: cc 0f add r28, r28
3eae: dd 1f adc r29, r29
verifySpace();
}
else if(ch == STK_UNIVERSAL) {
3eb0: 54 c0 rjmp .+168 ; 0x3f5a <main+0x15a>
getNch(3);
putch(0x00);
}
#else
// UNIVERSAL command is ignored
getNch(4);
3eb2: 86 35 cpi r24, 0x56 ; 86
3eb4: 21 f4 brne .+8 ; 0x3ebe <main+0xbe>
putch(0x00);
3eb6: 84 e0 ldi r24, 0x04 ; 4
3eb8: 75 d0 rcall .+234 ; 0x3fa4 <getNch>
#endif
}
/* Write memory, length is big endian and is in bytes */
else if(ch == STK_PROG_PAGE) {
3eba: 80 e0 ldi r24, 0x00 ; 0
3ebc: e6 cf rjmp .-52 ; 0x3e8a <main+0x8a>
// PROGRAM PAGE - we support flash programming only, not EEPROM
uint8_t desttype;
uint8_t *bufPtr;
pagelen_t savelength;
GETLENGTH(length);
3ebe: 84 36 cpi r24, 0x64 ; 100
3ec0: 09 f0 breq .+2 ; 0x3ec4 <main+0xc4>
3ec2: 2e c0 rjmp .+92 ; 0x3f20 <main+0x120>
3ec4: 55 d0 rcall .+170 ; 0x3f70 <getch>
savelength = length;
desttype = getch();
3ec6: 54 d0 rcall .+168 ; 0x3f70 <getch>
3ec8: f8 2e mov r15, r24
3eca: 52 d0 rcall .+164 ; 0x3f70 <getch>
3ecc: b8 2e mov r11, r24
3ece: 00 e0 ldi r16, 0x00 ; 0
// read a page worth of contents
bufPtr = buff.bptr;
do *bufPtr++ = getch();
3ed0: 11 e0 ldi r17, 0x01 ; 1
3ed2: 4e d0 rcall .+156 ; 0x3f70 <getch>
3ed4: f8 01 movw r30, r16
3ed6: 81 93 st Z+, r24
3ed8: 8f 01 movw r16, r30
while (--length);
3eda: fe 12 cpse r15, r30
3edc: fa cf rjmp .-12 ; 0x3ed2 <main+0xd2>
// Read command terminator, start reply
verifySpace();
3ede: 5a d0 rcall .+180 ; 0x3f94 <verifySpace>
3ee0: f5 e4 ldi r31, 0x45 ; 69
* void writebuffer(memtype, buffer, address, length)
*/
static inline void writebuffer(int8_t memtype, addr16_t mybuff,
addr16_t address, pagelen_t len)
{
switch (memtype) {
3ee2: bf 12 cpse r11, r31
3ee4: 01 c0 rjmp .+2 ; 0x3ee8 <main+0xe8>
3ee6: ff cf rjmp .-2 ; 0x3ee6 <main+0xe6>
3ee8: 83 e0 ldi r24, 0x03 ; 3
* Start the page erase and wait for it to finish. There
* used to be code to do this while receiving the data over
* the serial link, but the performance improvement was slight,
* and we needed the space back.
*/
__boot_page_erase_short(address.word);
3eea: fe 01 movw r30, r28
3eec: 87 bf out 0x37, r24 ; 55
3eee: e8 95 spm
3ef0: 07 b6 in r0, 0x37 ; 55
boot_spm_busy_wait();
3ef2: 00 fc sbrc r0, 0
3ef4: fd cf rjmp .-6 ; 0x3ef0 <main+0xf0>
3ef6: a0 e0 ldi r26, 0x00 ; 0
3ef8: b1 e0 ldi r27, 0x01 ; 1
3efa: fe 01 movw r30, r28
3efc: 8d 91 ld r24, X+
/*
* Copy data from the buffer into the flash write buffer.
*/
do {
__boot_page_fill_short((uint16_t)(void*)addrPtr, *(mybuff.wptr++));
3efe: 9d 91 ld r25, X+
3f00: 0c 01 movw r0, r24
3f02: e7 be out 0x37, r14 ; 55
3f04: e8 95 spm
3f06: 11 24 eor r1, r1
3f08: 32 96 adiw r30, 0x02 ; 2
addrPtr += 2;
} while (len -= 2);
3f0a: fa 12 cpse r15, r26
/*
* Actually Write the buffer to flash (and wait for it to finish.)
*/
__boot_page_write_short(address.word);
3f0c: f7 cf rjmp .-18 ; 0x3efc <main+0xfc>
3f0e: fe 01 movw r30, r28
boot_spm_busy_wait();
3f10: d7 be out 0x37, r13 ; 55
3f12: e8 95 spm
#if defined(RWWSRE)
// Reenable read access to flash
__boot_rww_enable_short();
3f14: 07 b6 in r0, 0x37 ; 55
3f16: 00 fc sbrc r0, 0
3f18: fd cf rjmp .-6 ; 0x3f14 <main+0x114>
writebuffer(desttype, buff, address, savelength);
}
/* Read memory block mode, length is big endian. */
else if(ch == STK_READ_PAGE) {
3f1a: c7 be out 0x37, r12 ; 55
3f1c: e8 95 spm
uint8_t desttype;
GETLENGTH(length);
3f1e: 1e c0 rjmp .+60 ; 0x3f5c <main+0x15c>
3f20: 84 37 cpi r24, 0x74 ; 116
3f22: 71 f4 brne .+28 ; 0x3f40 <main+0x140>
desttype = getch();
3f24: 25 d0 rcall .+74 ; 0x3f70 <getch>
verifySpace();
3f26: 24 d0 rcall .+72 ; 0x3f70 <getch>
3f28: f8 2e mov r15, r24
3f2a: 22 d0 rcall .+68 ; 0x3f70 <getch>
// while (--length);
// read a Flash and increment the address (may increment RAMPZ)
__asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address.bptr): "1" (address));
#else
// read a Flash byte and increment the address
__asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address.bptr): "1" (address));
3f2c: 33 d0 rcall .+102 ; 0x3f94 <verifySpace>
3f2e: 8e 01 movw r16, r28
#endif
putch(ch);
3f30: f8 01 movw r30, r16
} while (--length);
3f32: 85 91 lpm r24, Z+
3f34: 8f 01 movw r16, r30
3f36: 15 d0 rcall .+42 ; 0x3f62 <putch>
3f38: fa 94 dec r15
read_mem(desttype, address, length);
}
/* Get device signature bytes */
else if(ch == STK_READ_SIGN) {
3f3a: f1 10 cpse r15, r1
3f3c: f9 cf rjmp .-14 ; 0x3f30 <main+0x130>
// READ SIGN - return what Avrdude wants to hear
verifySpace();
3f3e: 0e c0 rjmp .+28 ; 0x3f5c <main+0x15c>
3f40: 85 37 cpi r24, 0x75 ; 117
putch(SIGNATURE_0);
3f42: 39 f4 brne .+14 ; 0x3f52 <main+0x152>
3f44: 27 d0 rcall .+78 ; 0x3f94 <verifySpace>
3f46: 8e e1 ldi r24, 0x1E ; 30
putch(SIGNATURE_1);
3f48: 0c d0 rcall .+24 ; 0x3f62 <putch>
3f4a: 84 e9 ldi r24, 0x94 ; 148
3f4c: 0a d0 rcall .+20 ; 0x3f62 <putch>
putch(SIGNATURE_2);
3f4e: 86 e0 ldi r24, 0x06 ; 6
3f50: 9c cf rjmp .-200 ; 0x3e8a <main+0x8a>
}
else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */
3f52: 81 35 cpi r24, 0x51 ; 81
3f54: 11 f4 brne .+4 ; 0x3f5a <main+0x15a>
// Adaboot no-wait mod
watchdogConfig(WATCHDOG_16MS);
3f56: 88 e0 ldi r24, 0x08 ; 8
3f58: 17 d0 rcall .+46 ; 0x3f88 <watchdogConfig>
3f5a: 1c d0 rcall .+56 ; 0x3f94 <verifySpace>
verifySpace();
}
else {
// This covers the response to commands like STK_ENTER_PROGMODE
verifySpace();
3f5c: 80 e1 ldi r24, 0x10 ; 16
3f5e: 01 d0 rcall .+2 ; 0x3f62 <putch>
}
putch(STK_OK);
3f60: 87 cf rjmp .-242 ; 0x3e70 <main+0x70>
00003f62 <putch>:
3f62: 90 91 c0 00 lds r25, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0>
}
3f66: 95 ff sbrs r25, 5
}
void putch(char ch) {
#ifndef SOFT_UART
while (!(UART_SRA & _BV(UDRE0)));
3f68: fc cf rjmp .-8 ; 0x3f62 <putch>
UART_UDR = ch;
3f6a: 80 93 c6 00 sts 0x00C6, r24 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7e00c6>
3f6e: 08 95 ret
00003f70 <getch>:
[uartBit] "I" (UART_RX_BIT)
:
"r25"
);
#else
while(!(UART_SRA & _BV(RXC0)))
3f70: 80 91 c0 00 lds r24, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0>
3f74: 87 ff sbrs r24, 7
3f76: fc cf rjmp .-8 ; 0x3f70 <getch>
;
if (!(UART_SRA & _BV(FE0))) {
3f78: 80 91 c0 00 lds r24, 0x00C0 ; 0x8000c0 <__TEXT_REGION_LENGTH__+0x7e00c0>
3f7c: 84 fd sbrc r24, 4
3f7e: 01 c0 rjmp .+2 ; 0x3f82 <getch+0x12>
}
#endif
// Watchdog functions. These are only safe with interrupts turned off.
void watchdogReset() {
__asm__ __volatile__ (
3f80: a8 95 wdr
* don't care that an invalid char is returned...)
*/
watchdogReset();
}
ch = UART_UDR;
3f82: 80 91 c6 00 lds r24, 0x00C6 ; 0x8000c6 <__TEXT_REGION_LENGTH__+0x7e00c6>
LED_PIN |= _BV(LED);
#endif
#endif
return ch;
}
3f86: 08 95 ret
00003f88 <watchdogConfig>:
"wdr\n"
);
}
void watchdogConfig(uint8_t x) {
WDTCSR = _BV(WDCE) | _BV(WDE);
3f88: e0 e6 ldi r30, 0x60 ; 96
3f8a: f0 e0 ldi r31, 0x00 ; 0
3f8c: 98 e1 ldi r25, 0x18 ; 24
3f8e: 90 83 st Z, r25
WDTCSR = x;
3f90: 80 83 st Z, r24
3f92: 08 95 ret
00003f94 <verifySpace>:
do getch(); while (--count);
verifySpace();
}
void verifySpace() {
if (getch() != CRC_EOP) {
3f94: ed df rcall .-38 ; 0x3f70 <getch>
3f96: 80 32 cpi r24, 0x20 ; 32
3f98: 19 f0 breq .+6 ; 0x3fa0 <verifySpace+0xc>
watchdogConfig(WATCHDOG_16MS); // shorten WD timeout
3f9a: 88 e0 ldi r24, 0x08 ; 8
3f9c: f5 df rcall .-22 ; 0x3f88 <watchdogConfig>
3f9e: ff cf rjmp .-2 ; 0x3f9e <verifySpace+0xa>
while (1) // and busy-loop so that WD causes
; // a reset and app start.
}
putch(STK_INSYNC);
3fa0: 84 e1 ldi r24, 0x14 ; 20
3fa2: df cf rjmp .-66 ; 0x3f62 <putch>
00003fa4 <getNch>:
::[count] "M" (UART_B_VALUE)
);
}
#endif
void getNch(uint8_t count) {
3fa4: cf 93 push r28
3fa6: c8 2f mov r28, r24
do getch(); while (--count);
3fa8: e3 df rcall .-58 ; 0x3f70 <getch>
3faa: c1 50 subi r28, 0x01 ; 1
3fac: e9 f7 brne .-6 ; 0x3fa8 <getNch+0x4>
verifySpace();
3fae: cf 91 pop r28
3fb0: f1 cf rjmp .-30 ; 0x3f94 <verifySpace>
00003fb2 <appStart>:
void appStart(uint8_t rstFlags) {
// save the reset flags in the designated register
// This can be saved in a main program by putting code in .init0 (which
// executes before normal c init code) to save R2 to a global variable.
__asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags));
3fb2: 28 2e mov r2, r24
watchdogConfig(WATCHDOG_OFF);
3fb4: 80 e0 ldi r24, 0x00 ; 0
3fb6: e8 df rcall .-48 ; 0x3f88 <watchdogConfig>
3fb8: e0 e0 ldi r30, 0x00 ; 0
// Note that appstart_vec is defined so that this works with either
// real or virtual boot partitions.
__asm__ __volatile__ (
3fba: ff 27 eor r31, r31
3fbc: 09 94 ijmp

View File

@ -0,0 +1,38 @@
:101D0000112484B7882349F0982F9A70923029F0D3
:101D100081FF02C097EF94BFFED08EE0E9D0D29A47
:101D200023E0C22EBB24B39435E0A32ECDD0813462
:101D300071F4CAD0F82EE0D082E8F816F1F0E1E8AC
:101D4000FE1202C087E001C083E0AFD0ABC0823496
:101D500011F484E103C0853419F485E0D5D0A2C024
:101D6000853539F4B1D0C82FAFD0D82FCC0FDD1FB7
:101D700098C0863521F484E0C7D080E0E6CF843671
:101D800009F055C0A1D0A0D0F82E9ED0D82EEF2CAF
:101D900080E6882E912C98D0F40181934F01EA942B
:101DA000E110F9CFA9D0209719F590916000909398
:101DB000E400809161008093E50020916800209309
:101DC000E600209169002093E700092F182F0450A6
:101DD000110900936800812F8F70806C80936900D7
:101DE00000E81EE000936000812F806C809361000A
:101DF000F5E4DF1201C0FFCFFE01C7BEE89507B6CC
:101E000000FCFDCFA0E6B0E0FE018D919D910C019C
:101E1000B7BEE8951124FA94FA943296F110F5CFF2
:101E2000FE01A7BEE89507B600FCFDCF3BC0843796
:101E300059F54AD049D0D82E47D05ED07E01E11462
:101E4000F10419F48091E40017C0F1E0EF16F104F9
:101E500019F48091E50010C088E0E816F10419F447
:101E60008091E60009C0E9E0EE16F10419F48091D2
:101E7000E70002C0F701849118D0DA94FFEFEF1A5F
:101E8000FF0AD110DCCF0EC0853739F435D08EE192
:101E90000CD083E90AD08CE058CF813511F488E06A
:101EA00027D02AD080E101D041CF2AE030E08095D0
:101EB000089410F4DA9802C0DA9A000015D014D011
:101EC00086952A95B1F70895A89529E030E0CB9939
:101ED000FECF0AD009D008D08894CB9908942A95CF
:101EE00011F08795F7CF08959EE09A95F1F7089540
:101EF00098E191BD81BD0895E7DF803219F088E057
:101F0000F7DFFFCF84E1D1CFCF93C82FDDDFC15002
:101F1000E9F7CF91F1CF282E80E0EADFE4E0FF2758
:021F2000099422
:021FFE000007DA
:0400000300001D00DC
:00000001FF

View File

@ -0,0 +1,634 @@
optiboot_attiny84.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000222 00001d00 00001d00 00000074 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .version 00000002 00001ffe 00001ffe 00000296 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .data 00000000 00800060 00800060 00000298 2**0
CONTENTS, ALLOC, LOAD, DATA
3 .comment 0000002f 00000000 00000000 00000298 2**0
CONTENTS, READONLY
4 .debug_aranges 00000028 00000000 00000000 000002c7 2**0
CONTENTS, READONLY, DEBUGGING
5 .debug_info 000005e9 00000000 00000000 000002ef 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_abbrev 0000029f 00000000 00000000 000008d8 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_line 00000307 00000000 00000000 00000b77 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_frame 0000009c 00000000 00000000 00000e80 2**2
CONTENTS, READONLY, DEBUGGING
9 .debug_str 00000212 00000000 00000000 00000f1c 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_loc 00000367 00000000 00000000 0000112e 2**0
CONTENTS, READONLY, DEBUGGING
11 .debug_ranges 00000060 00000000 00000000 00001495 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00001d00 <main>:
// SP points to RAMEND
// r1 contains zero
//
// If not, uncomment the following instructions:
// cli();
asm volatile ("clr __zero_reg__");
1d00: 11 24 eor r1, r1
*
* Code by MarkG55
* see discusion in https://github.com/Optiboot/optiboot/issues/97
*/
#if !defined(__AVR_ATmega16__)
ch = MCUSR;
1d02: 84 b7 in r24, 0x34 ; 52
#else
ch = MCUCSR;
#endif
// Skip all logic and run bootloader if MCUSR is cleared (application request)
if (ch != 0) {
1d04: 88 23 and r24, r24
1d06: 49 f0 breq .+18 ; 0x1d1a <main+0x1a>
* 2. we clear WDRF if it's set with EXTRF to avoid loops
* One problematic scenario: broken application code sets watchdog timer
* without clearing MCUSR before and triggers it quickly. But it's
* recoverable by power-on with pushed reset button.
*/
if ((ch & (_BV(WDRF) | _BV(EXTRF))) != _BV(EXTRF)) {
1d08: 98 2f mov r25, r24
1d0a: 9a 70 andi r25, 0x0A ; 10
1d0c: 92 30 cpi r25, 0x02 ; 2
1d0e: 29 f0 breq .+10 ; 0x1d1a <main+0x1a>
if (ch & _BV(EXTRF)) {
1d10: 81 ff sbrs r24, 1
1d12: 02 c0 rjmp .+4 ; 0x1d18 <main+0x18>
* prevent entering bootloader.
* '&' operation is skipped to spare few bytes as bits in MCUSR
* can only be cleared.
*/
#if !defined(__AVR_ATmega16__)
MCUSR = ~(_BV(WDRF));
1d14: 97 ef ldi r25, 0xF7 ; 247
1d16: 94 bf out 0x34, r25 ; 52
#else
MCUCSR = ~(_BV(WDRF));
#endif
}
appStart(ch);
1d18: fe d0 rcall .+508 ; 0x1f16 <appStart>
UART_SRL = (uint8_t)( (F_CPU + BAUD_RATE * 4L) / (BAUD_RATE * 8L) - 1 );
#endif
#endif
// Set up watchdog to trigger after 1s
watchdogConfig(WATCHDOG_1S);
1d1a: 8e e0 ldi r24, 0x0E ; 14
1d1c: e9 d0 rcall .+466 ; 0x1ef0 <watchdogConfig>
LED_DDR |= _BV(LED);
#endif
#ifdef SOFT_UART
/* Set TX pin as output */
UART_DDR |= _BV(UART_TX_BIT);
1d1e: d2 9a sbi 0x1a, 2 ; 26
* Start the page erase and wait for it to finish. There
* used to be code to do this while receiving the data over
* the serial link, but the performance improvement was slight,
* and we needed the space back.
*/
__boot_page_erase_short(address.word);
1d20: 23 e0 ldi r18, 0x03 ; 3
1d22: c2 2e mov r12, r18
/*
* Copy data from the buffer into the flash write buffer.
*/
do {
__boot_page_fill_short((uint16_t)(void*)addrPtr, *(mybuff.wptr++));
1d24: bb 24 eor r11, r11
1d26: b3 94 inc r11
} while (len -= 2);
/*
* Actually Write the buffer to flash (and wait for it to finish.)
*/
__boot_page_write_short(address.word);
1d28: 35 e0 ldi r19, 0x05 ; 5
1d2a: a3 2e mov r10, r19
#endif
/* Forever loop: exits by causing WDT reset */
for (;;) {
/* get character from UART */
ch = getch();
1d2c: cd d0 rcall .+410 ; 0x1ec8 <getch>
if(ch == STK_GET_PARAMETER) {
1d2e: 81 34 cpi r24, 0x41 ; 65
1d30: 71 f4 brne .+28 ; 0x1d4e <main+0x4e>
unsigned char which = getch();
1d32: ca d0 rcall .+404 ; 0x1ec8 <getch>
1d34: f8 2e mov r15, r24
verifySpace();
1d36: e0 d0 rcall .+448 ; 0x1ef8 <verifySpace>
/*
* Send optiboot version as "SW version"
* Note that the references to memory are optimized away.
*/
if (which == STK_SW_MINOR) {
1d38: 82 e8 ldi r24, 0x82 ; 130
1d3a: f8 16 cp r15, r24
1d3c: f1 f0 breq .+60 ; 0x1d7a <main+0x7a>
putch(optiboot_version & 0xFF);
} else if (which == STK_SW_MAJOR) {
1d3e: e1 e8 ldi r30, 0x81 ; 129
1d40: fe 12 cpse r15, r30
1d42: 02 c0 rjmp .+4 ; 0x1d48 <main+0x48>
putch(optiboot_version >> 8);
1d44: 87 e0 ldi r24, 0x07 ; 7
1d46: 01 c0 rjmp .+2 ; 0x1d4a <main+0x4a>
} else {
/*
* GET PARAMETER returns a generic 0x03 reply for
* other parameters - enough to keep Avrdude happy
*/
putch(0x03);
1d48: 83 e0 ldi r24, 0x03 ; 3
1d4a: af d0 rcall .+350 ; 0x1eaa <putch>
1d4c: ab c0 rjmp .+342 ; 0x1ea4 <main+0x1a4>
}
}
else if(ch == STK_SET_DEVICE) {
1d4e: 82 34 cpi r24, 0x42 ; 66
1d50: 11 f4 brne .+4 ; 0x1d56 <main+0x56>
// SET DEVICE is ignored
getNch(20);
1d52: 84 e1 ldi r24, 0x14 ; 20
1d54: 03 c0 rjmp .+6 ; 0x1d5c <main+0x5c>
}
else if(ch == STK_SET_DEVICE_EXT) {
1d56: 85 34 cpi r24, 0x45 ; 69
1d58: 19 f4 brne .+6 ; 0x1d60 <main+0x60>
// SET DEVICE EXT is ignored
getNch(5);
1d5a: 85 e0 ldi r24, 0x05 ; 5
1d5c: d5 d0 rcall .+426 ; 0x1f08 <getNch>
1d5e: a2 c0 rjmp .+324 ; 0x1ea4 <main+0x1a4>
}
else if(ch == STK_LOAD_ADDRESS) {
1d60: 85 35 cpi r24, 0x55 ; 85
1d62: 39 f4 brne .+14 ; 0x1d72 <main+0x72>
// LOAD ADDRESS
address.bytes[0] = getch();
1d64: b1 d0 rcall .+354 ; 0x1ec8 <getch>
1d66: c8 2f mov r28, r24
address.bytes[1] = getch();
1d68: af d0 rcall .+350 ; 0x1ec8 <getch>
1d6a: d8 2f mov r29, r24
}
else {
RAMPZ &= 0xFE;
}
#endif
address.word *= 2; // Convert from word address to byte address
1d6c: cc 0f add r28, r28
1d6e: dd 1f adc r29, r29
1d70: 98 c0 rjmp .+304 ; 0x1ea2 <main+0x1a2>
verifySpace();
}
else if(ch == STK_UNIVERSAL) {
1d72: 86 35 cpi r24, 0x56 ; 86
1d74: 21 f4 brne .+8 ; 0x1d7e <main+0x7e>
getNch(3);
putch(0x00);
}
#else
// UNIVERSAL command is ignored
getNch(4);
1d76: 84 e0 ldi r24, 0x04 ; 4
1d78: c7 d0 rcall .+398 ; 0x1f08 <getNch>
putch(0x00);
1d7a: 80 e0 ldi r24, 0x00 ; 0
1d7c: e6 cf rjmp .-52 ; 0x1d4a <main+0x4a>
#endif
}
/* Write memory, length is big endian and is in bytes */
else if(ch == STK_PROG_PAGE) {
1d7e: 84 36 cpi r24, 0x64 ; 100
1d80: 09 f0 breq .+2 ; 0x1d84 <main+0x84>
1d82: 55 c0 rjmp .+170 ; 0x1e2e <main+0x12e>
// PROGRAM PAGE - we support flash programming only, not EEPROM
uint8_t desttype;
uint8_t *bufPtr;
pagelen_t savelength;
GETLENGTH(length);
1d84: a1 d0 rcall .+322 ; 0x1ec8 <getch>
1d86: a0 d0 rcall .+320 ; 0x1ec8 <getch>
1d88: f8 2e mov r15, r24
savelength = length;
desttype = getch();
1d8a: 9e d0 rcall .+316 ; 0x1ec8 <getch>
1d8c: d8 2e mov r13, r24
// PROGRAM PAGE - we support flash programming only, not EEPROM
uint8_t desttype;
uint8_t *bufPtr;
pagelen_t savelength;
GETLENGTH(length);
1d8e: ef 2c mov r14, r15
savelength = length;
desttype = getch();
1d90: 80 e6 ldi r24, 0x60 ; 96
1d92: 88 2e mov r8, r24
1d94: 91 2c mov r9, r1
// read a page worth of contents
bufPtr = buff.bptr;
do *bufPtr++ = getch();
1d96: 98 d0 rcall .+304 ; 0x1ec8 <getch>
1d98: f4 01 movw r30, r8
1d9a: 81 93 st Z+, r24
1d9c: 4f 01 movw r8, r30
while (--length);
1d9e: ea 94 dec r14
1da0: e1 10 cpse r14, r1
1da2: f9 cf rjmp .-14 ; 0x1d96 <main+0x96>
// Read command terminator, start reply
verifySpace();
1da4: a9 d0 rcall .+338 ; 0x1ef8 <verifySpace>
#else
/*
* AVR with 2-byte ISR Vectors and rjmp
*/
if (address.word == rstVect0) {
1da6: 20 97 sbiw r28, 0x00 ; 0
1da8: 19 f5 brne .+70 ; 0x1df0 <main+0xf0>
// This is the reset vector page. We need to live-patch
// the code so the bootloader runs first.
//
// Move RESET vector to 'save' vector
// Save jmp targets (for "Verify")
rstVect0_sav = buff.bptr[rstVect0];
1daa: 90 91 60 00 lds r25, 0x0060 ; 0x800060 <_edata>
1dae: 90 93 e4 00 sts 0x00E4, r25 ; 0x8000e4 <_edata+0x84>
rstVect1_sav = buff.bptr[rstVect1];
1db2: 80 91 61 00 lds r24, 0x0061 ; 0x800061 <_edata+0x1>
1db6: 80 93 e5 00 sts 0x00E5, r24 ; 0x8000e5 <_edata+0x85>
saveVect0_sav = buff.bptr[saveVect0];
1dba: 20 91 68 00 lds r18, 0x0068 ; 0x800068 <_edata+0x8>
1dbe: 20 93 e6 00 sts 0x00E6, r18 ; 0x8000e6 <_edata+0x86>
saveVect1_sav = buff.bptr[saveVect1];
1dc2: 20 91 69 00 lds r18, 0x0069 ; 0x800069 <_edata+0x9>
1dc6: 20 93 e7 00 sts 0x00E7, r18 ; 0x8000e7 <_edata+0x87>
// Instruction is a relative jump (rjmp), so recalculate.
// an RJMP instruction is 0b1100xxxx xxxxxxxx, so we should be able to
// do math on the offsets without masking it off first.
addr16_t vect;
vect.bytes[0] = rstVect0_sav;
1dca: 09 2f mov r16, r25
vect.bytes[1] = rstVect1_sav;
1dcc: 18 2f mov r17, r24
vect.word = (vect.word-save_vect_num); //substract 'save' interrupt position
1dce: 04 50 subi r16, 0x04 ; 4
1dd0: 11 09 sbc r17, r1
// Move RESET jmp target to 'save' vector
buff.bptr[saveVect0] = vect.bytes[0];
1dd2: 00 93 68 00 sts 0x0068, r16 ; 0x800068 <_edata+0x8>
buff.bptr[saveVect1] = (vect.bytes[1] & 0x0F)| 0xC0; // make an "rjmp"
1dd6: 81 2f mov r24, r17
1dd8: 8f 70 andi r24, 0x0F ; 15
1dda: 80 6c ori r24, 0xC0 ; 192
1ddc: 80 93 69 00 sts 0x0069, r24 ; 0x800069 <_edata+0x9>
// Add rjump to bootloader at RESET vector
vect.word = ((uint16_t)main); // (main) is always <= 0x0FFF; no masking needed.
1de0: 00 e8 ldi r16, 0x80 ; 128
1de2: 1e e0 ldi r17, 0x0E ; 14
buff.bptr[0] = vect.bytes[0]; // rjmp 0x1c00 instruction
1de4: 00 93 60 00 sts 0x0060, r16 ; 0x800060 <_edata>
buff.bptr[1] = vect.bytes[1] | 0xC0; // make an "rjmp"
1de8: 81 2f mov r24, r17
1dea: 80 6c ori r24, 0xC0 ; 192
1dec: 80 93 61 00 sts 0x0061, r24 ; 0x800061 <_edata+0x1>
* void writebuffer(memtype, buffer, address, length)
*/
static inline void writebuffer(int8_t memtype, addr16_t mybuff,
addr16_t address, pagelen_t len)
{
switch (memtype) {
1df0: f5 e4 ldi r31, 0x45 ; 69
1df2: df 12 cpse r13, r31
1df4: 01 c0 rjmp .+2 ; 0x1df8 <main+0xf8>
1df6: ff cf rjmp .-2 ; 0x1df6 <main+0xf6>
* Start the page erase and wait for it to finish. There
* used to be code to do this while receiving the data over
* the serial link, but the performance improvement was slight,
* and we needed the space back.
*/
__boot_page_erase_short(address.word);
1df8: fe 01 movw r30, r28
1dfa: c7 be out 0x37, r12 ; 55
1dfc: e8 95 spm
boot_spm_busy_wait();
1dfe: 07 b6 in r0, 0x37 ; 55
1e00: 00 fc sbrc r0, 0
1e02: fd cf rjmp .-6 ; 0x1dfe <main+0xfe>
1e04: a0 e6 ldi r26, 0x60 ; 96
1e06: b0 e0 ldi r27, 0x00 ; 0
1e08: fe 01 movw r30, r28
/*
* Copy data from the buffer into the flash write buffer.
*/
do {
__boot_page_fill_short((uint16_t)(void*)addrPtr, *(mybuff.wptr++));
1e0a: 8d 91 ld r24, X+
1e0c: 9d 91 ld r25, X+
1e0e: 0c 01 movw r0, r24
1e10: b7 be out 0x37, r11 ; 55
1e12: e8 95 spm
1e14: 11 24 eor r1, r1
addrPtr += 2;
} while (len -= 2);
1e16: fa 94 dec r15
1e18: fa 94 dec r15
1e1a: 32 96 adiw r30, 0x02 ; 2
1e1c: f1 10 cpse r15, r1
1e1e: f5 cf rjmp .-22 ; 0x1e0a <main+0x10a>
/*
* Actually Write the buffer to flash (and wait for it to finish.)
*/
__boot_page_write_short(address.word);
1e20: fe 01 movw r30, r28
1e22: a7 be out 0x37, r10 ; 55
1e24: e8 95 spm
boot_spm_busy_wait();
1e26: 07 b6 in r0, 0x37 ; 55
1e28: 00 fc sbrc r0, 0
1e2a: fd cf rjmp .-6 ; 0x1e26 <main+0x126>
1e2c: 3b c0 rjmp .+118 ; 0x1ea4 <main+0x1a4>
writebuffer(desttype, buff, address, savelength);
}
/* Read memory block mode, length is big endian. */
else if(ch == STK_READ_PAGE) {
1e2e: 84 37 cpi r24, 0x74 ; 116
1e30: 59 f5 brne .+86 ; 0x1e88 <main+0x188>
uint8_t desttype;
GETLENGTH(length);
1e32: 4a d0 rcall .+148 ; 0x1ec8 <getch>
1e34: 49 d0 rcall .+146 ; 0x1ec8 <getch>
1e36: d8 2e mov r13, r24
desttype = getch();
1e38: 47 d0 rcall .+142 ; 0x1ec8 <getch>
verifySpace();
1e3a: 5e d0 rcall .+188 ; 0x1ef8 <verifySpace>
1e3c: 7e 01 movw r14, r28
#endif
default:
do {
#ifdef VIRTUAL_BOOT_PARTITION
// Undo vector patch in bottom page so verify passes
if (address.word == rstVect0) ch = rstVect0_sav;
1e3e: e1 14 cp r14, r1
1e40: f1 04 cpc r15, r1
1e42: 19 f4 brne .+6 ; 0x1e4a <main+0x14a>
1e44: 80 91 e4 00 lds r24, 0x00E4 ; 0x8000e4 <_edata+0x84>
1e48: 17 c0 rjmp .+46 ; 0x1e78 <main+0x178>
else if (address.word == rstVect1) ch = rstVect1_sav;
1e4a: f1 e0 ldi r31, 0x01 ; 1
1e4c: ef 16 cp r14, r31
1e4e: f1 04 cpc r15, r1
1e50: 19 f4 brne .+6 ; 0x1e58 <main+0x158>
1e52: 80 91 e5 00 lds r24, 0x00E5 ; 0x8000e5 <_edata+0x85>
1e56: 10 c0 rjmp .+32 ; 0x1e78 <main+0x178>
else if (address.word == saveVect0) ch = saveVect0_sav;
1e58: 88 e0 ldi r24, 0x08 ; 8
1e5a: e8 16 cp r14, r24
1e5c: f1 04 cpc r15, r1
1e5e: 19 f4 brne .+6 ; 0x1e66 <main+0x166>
1e60: 80 91 e6 00 lds r24, 0x00E6 ; 0x8000e6 <_edata+0x86>
1e64: 09 c0 rjmp .+18 ; 0x1e78 <main+0x178>
else if (address.word == saveVect1) ch = saveVect1_sav;
1e66: e9 e0 ldi r30, 0x09 ; 9
1e68: ee 16 cp r14, r30
1e6a: f1 04 cpc r15, r1
1e6c: 19 f4 brne .+6 ; 0x1e74 <main+0x174>
1e6e: 80 91 e7 00 lds r24, 0x00E7 ; 0x8000e7 <_edata+0x87>
1e72: 02 c0 rjmp .+4 ; 0x1e78 <main+0x178>
else ch = pgm_read_byte_near(address.bptr);
1e74: f7 01 movw r30, r14
1e76: 84 91 lpm r24, Z
__asm__ ("elpm %0,Z+\n" : "=r" (ch), "=z" (address.bptr): "1" (address));
#else
// read a Flash byte and increment the address
__asm__ ("lpm %0,Z+\n" : "=r" (ch), "=z" (address.bptr): "1" (address));
#endif
putch(ch);
1e78: 18 d0 rcall .+48 ; 0x1eaa <putch>
} while (--length);
1e7a: da 94 dec r13
1e7c: ff ef ldi r31, 0xFF ; 255
1e7e: ef 1a sub r14, r31
1e80: ff 0a sbc r15, r31
1e82: d1 10 cpse r13, r1
1e84: dc cf rjmp .-72 ; 0x1e3e <main+0x13e>
1e86: 0e c0 rjmp .+28 ; 0x1ea4 <main+0x1a4>
read_mem(desttype, address, length);
}
/* Get device signature bytes */
else if(ch == STK_READ_SIGN) {
1e88: 85 37 cpi r24, 0x75 ; 117
1e8a: 39 f4 brne .+14 ; 0x1e9a <main+0x19a>
// READ SIGN - return what Avrdude wants to hear
verifySpace();
1e8c: 35 d0 rcall .+106 ; 0x1ef8 <verifySpace>
putch(SIGNATURE_0);
1e8e: 8e e1 ldi r24, 0x1E ; 30
1e90: 0c d0 rcall .+24 ; 0x1eaa <putch>
putch(SIGNATURE_1);
1e92: 83 e9 ldi r24, 0x93 ; 147
1e94: 0a d0 rcall .+20 ; 0x1eaa <putch>
putch(SIGNATURE_2);
1e96: 8c e0 ldi r24, 0x0C ; 12
1e98: 58 cf rjmp .-336 ; 0x1d4a <main+0x4a>
}
else if (ch == STK_LEAVE_PROGMODE) { /* 'Q' */
1e9a: 81 35 cpi r24, 0x51 ; 81
1e9c: 11 f4 brne .+4 ; 0x1ea2 <main+0x1a2>
// Adaboot no-wait mod
watchdogConfig(WATCHDOG_16MS);
1e9e: 88 e0 ldi r24, 0x08 ; 8
1ea0: 27 d0 rcall .+78 ; 0x1ef0 <watchdogConfig>
verifySpace();
}
else {
// This covers the response to commands like STK_ENTER_PROGMODE
verifySpace();
1ea2: 2a d0 rcall .+84 ; 0x1ef8 <verifySpace>
}
putch(STK_OK);
1ea4: 80 e1 ldi r24, 0x10 ; 16
1ea6: 01 d0 rcall .+2 ; 0x1eaa <putch>
}
1ea8: 41 cf rjmp .-382 ; 0x1d2c <main+0x2c>
00001eaa <putch>:
void putch(char ch) {
#ifndef SOFT_UART
while (!(UART_SRA & _BV(UDRE0)));
UART_UDR = ch;
#else
__asm__ __volatile__ (
1eaa: 2a e0 ldi r18, 0x0A ; 10
1eac: 30 e0 ldi r19, 0x00 ; 0
1eae: 80 95 com r24
1eb0: 08 94 sec
1eb2: 10 f4 brcc .+4 ; 0x1eb8 <putch+0xe>
1eb4: da 98 cbi 0x1b, 2 ; 27
1eb6: 02 c0 rjmp .+4 ; 0x1ebc <putch+0x12>
1eb8: da 9a sbi 0x1b, 2 ; 27
1eba: 00 00 nop
1ebc: 15 d0 rcall .+42 ; 0x1ee8 <uartDelay>
1ebe: 14 d0 rcall .+40 ; 0x1ee8 <uartDelay>
1ec0: 86 95 lsr r24
1ec2: 2a 95 dec r18
1ec4: b1 f7 brne .-20 ; 0x1eb2 <putch+0x8>
1ec6: 08 95 ret
00001ec8 <getch>:
}
#endif
// Watchdog functions. These are only safe with interrupts turned off.
void watchdogReset() {
__asm__ __volatile__ (
1ec8: a8 95 wdr
#endif
#endif
#ifdef SOFT_UART
watchdogReset();
__asm__ __volatile__ (
1eca: 29 e0 ldi r18, 0x09 ; 9
1ecc: 30 e0 ldi r19, 0x00 ; 0
1ece: cb 99 sbic 0x19, 3 ; 25
1ed0: fe cf rjmp .-4 ; 0x1ece <getch+0x6>
1ed2: 0a d0 rcall .+20 ; 0x1ee8 <uartDelay>
1ed4: 09 d0 rcall .+18 ; 0x1ee8 <uartDelay>
1ed6: 08 d0 rcall .+16 ; 0x1ee8 <uartDelay>
1ed8: 88 94 clc
1eda: cb 99 sbic 0x19, 3 ; 25
1edc: 08 94 sec
1ede: 2a 95 dec r18
1ee0: 11 f0 breq .+4 ; 0x1ee6 <getch+0x1e>
1ee2: 87 95 ror r24
1ee4: f7 cf rjmp .-18 ; 0x1ed4 <getch+0xc>
LED_PIN |= _BV(LED);
#endif
#endif
return ch;
}
1ee6: 08 95 ret
00001ee8 <uartDelay>:
#if UART_B_VALUE > 255
#error Baud rate too slow for soft UART
#endif
void uartDelay() {
__asm__ __volatile__ (
1ee8: 9e e0 ldi r25, 0x0E ; 14
1eea: 9a 95 dec r25
1eec: f1 f7 brne .-4 ; 0x1eea <uartDelay+0x2>
1eee: 08 95 ret
00001ef0 <watchdogConfig>:
"wdr\n"
);
}
void watchdogConfig(uint8_t x) {
WDTCSR = _BV(WDCE) | _BV(WDE);
1ef0: 98 e1 ldi r25, 0x18 ; 24
1ef2: 91 bd out 0x21, r25 ; 33
WDTCSR = x;
1ef4: 81 bd out 0x21, r24 ; 33
1ef6: 08 95 ret
00001ef8 <verifySpace>:
do getch(); while (--count);
verifySpace();
}
void verifySpace() {
if (getch() != CRC_EOP) {
1ef8: e7 df rcall .-50 ; 0x1ec8 <getch>
1efa: 80 32 cpi r24, 0x20 ; 32
1efc: 19 f0 breq .+6 ; 0x1f04 <verifySpace+0xc>
watchdogConfig(WATCHDOG_16MS); // shorten WD timeout
1efe: 88 e0 ldi r24, 0x08 ; 8
1f00: f7 df rcall .-18 ; 0x1ef0 <watchdogConfig>
1f02: ff cf rjmp .-2 ; 0x1f02 <verifySpace+0xa>
while (1) // and busy-loop so that WD causes
; // a reset and app start.
}
putch(STK_INSYNC);
1f04: 84 e1 ldi r24, 0x14 ; 20
1f06: d1 cf rjmp .-94 ; 0x1eaa <putch>
00001f08 <getNch>:
::[count] "M" (UART_B_VALUE)
);
}
#endif
void getNch(uint8_t count) {
1f08: cf 93 push r28
1f0a: c8 2f mov r28, r24
do getch(); while (--count);
1f0c: dd df rcall .-70 ; 0x1ec8 <getch>
1f0e: c1 50 subi r28, 0x01 ; 1
1f10: e9 f7 brne .-6 ; 0x1f0c <getNch+0x4>
verifySpace();
}
1f12: cf 91 pop r28
}
#endif
void getNch(uint8_t count) {
do getch(); while (--count);
verifySpace();
1f14: f1 cf rjmp .-30 ; 0x1ef8 <verifySpace>
00001f16 <appStart>:
void appStart(uint8_t rstFlags) {
// save the reset flags in the designated register
// This can be saved in a main program by putting code in .init0 (which
// executes before normal c init code) to save R2 to a global variable.
__asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags));
1f16: 28 2e mov r2, r24
watchdogConfig(WATCHDOG_OFF);
1f18: 80 e0 ldi r24, 0x00 ; 0
1f1a: ea df rcall .-44 ; 0x1ef0 <watchdogConfig>
// Note that appstart_vec is defined so that this works with either
// real or virtual boot partitions.
__asm__ __volatile__ (
1f1c: e4 e0 ldi r30, 0x04 ; 4
1f1e: ff 27 eor r31, r31
1f20: 09 94 ijmp

View File

@ -0,0 +1,891 @@
/*
* pin_defs.h
* optiboot helper defining the default pin assignments (LED, SOFT_UART)
* for the various chips that are supported. This also has some ugly macros
* for selecting among various UARTs and LED possibilities using command-line
* defines like "UART=2 LED=B5"
*
* Copyright 2013-2015 by Bill Westfield.
* Copyright 2010 by Peter Knight.
* This software is licensed under version 2 of the Gnu Public Licence.
* See optiboot.c for details.
*/
/*------------------------------------------------------------------------ */
#if defined(__AVR_ATmega168__) \
|| defined(__AVR_ATmega168P__) \
|| defined(__AVR_ATmega328__) \
|| defined(__AVR_ATmega328P__) \
|| defined(__AVR_ATmega88) \
|| defined(__AVR_ATmega8__) \
|| defined(__AVR_ATmega88__)
/*------------------------------------------------------------------------ */
/* Onboard LED is connected to pin PB5 in Arduino NG, Diecimila, and Duemilanove
*/
#if !defined(LED)
#define LED B5
#endif
/* Ports for soft UART */
#ifdef SOFT_UART
#define UART_PORT PORTD
#define UART_PIN PIND
#define UART_DDR DDRD
#define UART_TX_BIT 1
#define UART_RX_BIT 0
#endif
#endif
/*
* Handle devices with up to 4 uarts (eg m1280.) Rather inelegantly.
* Note that mega8/m32 still needs special handling, because ubrr is handled
* differently.
*/
#if UART == 0
# define UART_SRA UCSR0A
# define UART_SRB UCSR0B
# define UART_SRC UCSR0C
# define UART_SRL UBRR0L
# define UART_UDR UDR0
#elif UART == 1
#if !defined(UDR1)
#error UART == 1, but no UART1 on device
#endif
# define UART_SRA UCSR1A
# define UART_SRB UCSR1B
# define UART_SRC UCSR1C
# define UART_SRL UBRR1L
# define UART_UDR UDR1
#elif UART == 2
#if !defined(UDR2)
#error UART == 2, but no UART2 on device
#endif
# define UART_SRA UCSR2A
# define UART_SRB UCSR2B
# define UART_SRC UCSR2C
# define UART_SRL UBRR2L
# define UART_UDR UDR2
#elif UART == 3
#if !defined(UDR3)
#error UART == 3, but no UART3 on device
#endif
# define UART_SRA UCSR3A
# define UART_SRB UCSR3B
# define UART_SRC UCSR3C
# define UART_SRL UBRR3L
# define UART_UDR UDR3
#endif
#if defined(__AVR_ATmega8__) \
|| defined (__AVR_ATmega32__) \
|| defined (__AVR_ATmega16__)
//Name conversion R.Wiersma
#define UCSR0A UCSRA
#define UDR0 UDR
#define UDRE0 UDRE
#define RXC0 RXC
#define FE0 FE
#define TIFR1 TIFR
#define WDTCSR WDTCR
#endif
#if defined (__AVR_ATmega32__) \
|| defined (__AVR_ATmega16__)
#define WDCE WDTOE
#endif
/* Luminet support */
/*------------------------------------------------------------------------ */
#if defined(__AVR_ATtiny84__)
/*------------------------------------------------------------------------ */
/* Red LED is connected to pin PA4 */
#if !defined(LED)
#define LED A4
#endif
/* Ports for soft UART - left port only for now. TX/RX on PA2/PA3 */
#ifdef SOFT_UART
#define UART_PORT PORTA
#define UART_PIN PINA
#define UART_DDR DDRA
#define UART_TX_BIT 2
#define UART_RX_BIT 3
#endif
#endif
/*------------------------------------------------------------------------ */
/* Sanguino support (and other 40pin DIP cpus) */
#if defined(__AVR_ATmega644P__) \
|| defined(__AVR_ATmega1284P__) \
|| defined(__AVR_ATmega32__) \
|| defined (__AVR_ATmega16__)
/*------------------------------------------------------------------------ */
/* Onboard LED is connected to pin PB0 on Sanguino */
#if !defined(LED)
#define LED B0
#endif
/* Ports for soft UART */
#ifdef SOFT_UART
#define UART_PORT PORTD
#define UART_PIN PIND
#define UART_DDR DDRD
#define UART_TX_BIT 1
#define UART_RX_BIT 0
#endif
#endif
/*------------------------------------------------------------------------ */
/* Mega support */
#if defined(__AVR_ATmega1280__) \
|| defined(__AVR_ATmega2560__)
/*------------------------------------------------------------------------ */
/* Onboard LED is connected to pin PB7 on Arduino Mega */
#if !defined(LED)
#define LED B7
#endif
/* Ports for soft UART */
#ifdef SOFT_UART
#define UART_PORT PORTE
#define UART_PIN PINE
#define UART_DDR DDRE
#define UART_TX_BIT 1
#define UART_RX_BIT 0
#endif
#endif
/*
* ------------------------------------------------------------------------
* A bunch of macros to enable the LED to be specifed as "B5" for bit 5
* of port B, and similar.
* We define symbols for all the legal combination of port/bit on a chip,
* and do pre-processor tests to see if there's a match. This ends up
* being very verbose, but it is pretty easy to generate semi-automatically.
* (We wouldn't need this if the preprocessor could do string compares.)
*/
// Symbols for each PortA bit.
#define A0 0x100
#define A1 0x101
#define A2 0x102
#define A3 0x103
#define A4 0x104
#define A5 0x105
#define A6 0x106
#define A7 0x107
// If there is no PORTA on this chip, don't allow these to be used
// (and indicate the error by redefining LED)
#if !defined(PORTA)
#if LED >= A0 && LED <= A7
#undef LED
#define LED -1
#endif
#endif
#define B0 0x200
#define B1 0x201
#define B2 0x202
#define B3 0x203
#define B4 0x204
#define B5 0x205
#define B6 0x206
#define B7 0x207
#if !defined(PORTB)
#if LED >= B0 && LED <= B7
#undef LED
#define LED -1
#endif
#endif
#define C0 0x300
#define C1 0x301
#define C2 0x302
#define C3 0x303
#define C4 0x304
#define C5 0x305
#define C6 0x306
#define C7 0x307
#if !(defined(PORTC))
#if LED >= C0 && LED <= C7
#undef LED
#define LED -1
#endif
#endif
#define D0 0x400
#define D1 0x401
#define D2 0x402
#define D3 0x403
#define D4 0x404
#define D5 0x405
#define D6 0x406
#define D7 0x407
#if !(defined(PORTD))
#if LED >= D0 && LED <= D7
#undef LED
#define LED -1
#endif
#endif
#define E0 0x500
#define E1 0x501
#define E2 0x502
#define E3 0x503
#define E4 0x504
#define E5 0x505
#define E6 0x506
#define E7 0x507
#if !(defined(PORTE))
#if LED >= E0 && LED <= E7
#undef LED
#define LED -1
#endif
#endif
#define F0 0x600
#define F1 0x601
#define F2 0x602
#define F3 0x603
#define F4 0x604
#define F5 0x605
#define F6 0x606
#define F7 0x607
#if !(defined(PORTF))
#if LED >= F0 && LED <= F7
#undef LED
#define LED -1
#endif
#endif
#define G0 0x700
#define G1 0x701
#define G2 0x702
#define G3 0x703
#define G4 0x704
#define G5 0x705
#define G6 0x706
#define G7 0x707
#if !defined(PORTG)
#if LED >= G0 && LED <= G7
#undef LED
#define LED -1
#endif
#endif
#define H0 0x800
#define H1 0x801
#define H2 0x802
#define H3 0x803
#define H4 0x804
#define H5 0x805
#define H6 0x806
#define H7 0x807
#if !(defined(PORTH))
#if LED >= H0 && LED <= H7
#undef LED
#define LED -1
#endif
#endif
#define J0 0xA00
#define J1 0xA01
#define J2 0xA02
#define J3 0xA03
#define J4 0xA04
#define J5 0xA05
#define J6 0xA06
#define J7 0xA07
#if !(defined(PORTJ))
#if LED >= J0 && LED <= J7
#undef LED
#define LED -1
#endif
#endif
#define K0 0xB00
#define K1 0xB01
#define K2 0xB02
#define K3 0xB03
#define K4 0xB04
#define K5 0xB05
#define K6 0xB06
#define K7 0xB07
#if !(defined(PORTK))
#if LED >= K0 && LED <= K7
#undef LED
#define LED -1
#endif
#endif
#define L0 0xC00
#define L1 0xC01
#define L2 0xC02
#define L3 0xC03
#define L4 0xC04
#define L5 0xC05
#define L6 0xC06
#define L7 0xC07
#if !(defined(PORTL))
#if LED >= L0 && LED <= L7
#undef LED
#define LED -1
#endif
#endif
/*
* A statement like "#if LED == B0" will evaluation (in the preprocessor)
* to #if C0 == B0, and then to #if 0x301 == 0x201
*/
#if LED == B0
#undef LED
#define LED_DDR DDRB
#define LED_PORT PORTB
#define LED_PIN PINB
#define LED PINB0
#elif LED == B1
#undef LED
#define LED_DDR DDRB
#define LED_PORT PORTB
#define LED_PIN PINB
#define LED PINB1
#elif LED == B2
#undef LED
#define LED_DDR DDRB
#define LED_PORT PORTB
#define LED_PIN PINB
#define LED PINB2
#elif LED == B3
#undef LED
#define LED_DDR DDRB
#define LED_PORT PORTB
#define LED_PIN PINB
#define LED PINB3
#elif LED == B4
#undef LED
#define LED_DDR DDRB
#define LED_PORT PORTB
#define LED_PIN PINB
#define LED PINB4
#elif LED == B5
#undef LED
#define LED_DDR DDRB
#define LED_PORT PORTB
#define LED_PIN PINB
#define LED PINB5
#elif LED == B6
#undef LED
#define LED_DDR DDRB
#define LED_PORT PORTB
#define LED_PIN PINB
#define LED PINB6
#elif LED == B7
#undef LED
#define LED_DDR DDRB
#define LED_PORT PORTB
#define LED_PIN PINB
#define LED PINB7
#elif LED == C0
#undef LED
#define LED_DDR DDRC
#define LED_PORT PORTC
#define LED_PIN PINC
#define LED PINC0
#elif LED == C1
#undef LED
#define LED_DDR DDRC
#define LED_PORT PORTC
#define LED_PIN PINC
#define LED PINC1
#elif LED == C2
#undef LED
#define LED_DDR DDRC
#define LED_PORT PORTC
#define LED_PIN PINC
#define LED PINC2
#elif LED == C3
#undef LED
#define LED_DDR DDRC
#define LED_PORT PORTC
#define LED_PIN PINC
#define LED PINC3
#elif LED == C4
#undef LED
#define LED_DDR DDRC
#define LED_PORT PORTC
#define LED_PIN PINC
#define LED PINC4
#elif LED == C5
#undef LED
#define LED_DDR DDRC
#define LED_PORT PORTC
#define LED_PIN PINC
#define LED PINC5
#elif LED == C6
#undef LED
#define LED_DDR DDRC
#define LED_PORT PORTC
#define LED_PIN PINC
#define LED PINC6
#elif LED == C7
#undef LED
#define LED_DDR DDRC
#define LED_PORT PORTC
#define LED_PIN PINC
#define LED PINC7
#elif LED == D0
#undef LED
#define LED_DDR DDRD
#define LED_PORT PORTD
#define LED_PIN PIND
#define LED PIND0
#elif LED == D1
#undef LED
#define LED_DDR DDRD
#define LED_PORT PORTD
#define LED_PIN PIND
#define LED PIND1
#elif LED == D2
#undef LED
#define LED_DDR DDRD
#define LED_PORT PORTD
#define LED_PIN PIND
#define LED PIND2
#elif LED == D3
#undef LED
#define LED_DDR DDRD
#define LED_PORT PORTD
#define LED_PIN PIND
#define LED PIND3
#elif LED == D4
#undef LED
#define LED_DDR DDRD
#define LED_PORT PORTD
#define LED_PIN PIND
#define LED PIND4
#elif LED == D5
#undef LED
#define LED_DDR DDRD
#define LED_PORT PORTD
#define LED_PIN PIND
#define LED PIND5
#elif LED == D6
#undef LED
#define LED_DDR DDRD
#define LED_PORT PORTD
#define LED_PIN PIND
#define LED PIND6
#elif LED == D7
#undef LED
#define LED_DDR DDRD
#define LED_PORT PORTD
#define LED_PIN PIND
#define LED PIND7
#elif LED == E0
#undef LED
#define LED_DDR DDRE
#define LED_PORT PORTE
#define LED_PIN PINE
#define LED PINE0
#elif LED == E1
#undef LED
#define LED_DDR DDRE
#define LED_PORT PORTE
#define LED_PIN PINE
#define LED PINE1
#elif LED == E2
#undef LED
#define LED_DDR DDRE
#define LED_PORT PORTE
#define LED_PIN PINE
#define LED PINE2
#elif LED == E3
#undef LED
#define LED_DDR DDRE
#define LED_PORT PORTE
#define LED_PIN PINE
#define LED PINE3
#elif LED == E4
#undef LED
#define LED_DDR DDRE
#define LED_PORT PORTE
#define LED_PIN PINE
#define LED PINE4
#elif LED == E5
#undef LED
#define LED_DDR DDRE
#define LED_PORT PORTE
#define LED_PIN PINE
#define LED PINE5
#elif LED == E6
#undef LED
#define LED_DDR DDRE
#define LED_PORT PORTE
#define LED_PIN PINE
#define LED PINE6
#elif LED == E7
#undef LED
#define LED_DDR DDRE
#define LED_PORT PORTE
#define LED_PIN PINE
#define LED PINE7
#elif LED == F0
#undef LED
#define LED_DDR DDRF
#define LED_PORT PORTF
#define LED_PIN PINF
#define LED PINF0
#elif LED == F1
#undef LED
#define LED_DDR DDRF
#define LED_PORT PORTF
#define LED_PIN PINF
#define LED PINF1
#elif LED == F2
#undef LED
#define LED_DDR DDRF
#define LED_PORT PORTF
#define LED_PIN PINF
#define LED PINF2
#elif LED == F3
#undef LED
#define LED_DDR DDRF
#define LED_PORT PORTF
#define LED_PIN PINF
#define LED PINF3
#elif LED == F4
#undef LED
#define LED_DDR DDRF
#define LED_PORT PORTF
#define LED_PIN PINF
#define LED PINF4
#elif LED == F5
#undef LED
#define LED_DDR DDRF
#define LED_PORT PORTF
#define LED_PIN PINF
#define LED PINF5
#elif LED == F6
#undef LED
#define LED_DDR DDRF
#define LED_PORT PORTF
#define LED_PIN PINF
#define LED PINF6
#elif LED == F7
#undef LED
#define LED_DDR DDRF
#define LED_PORT PORTF
#define LED_PIN PINF
#define LED PINF7
#elif LED == G0
#undef LED
#define LED_DDR DDRG
#define LED_PORT PORTG
#define LED_PIN PING
#define LED PING0
#elif LED == G1
#undef LED
#define LED_DDR DDRG
#define LED_PORT PORTG
#define LED_PIN PING
#define LED PING1
#elif LED == G2
#undef LED
#define LED_DDR DDRG
#define LED_PORT PORTG
#define LED_PIN PING
#define LED PING2
#elif LED == G3
#undef LED
#define LED_DDR DDRG
#define LED_PORT PORTG
#define LED_PIN PING
#define LED PING3
#elif LED == G4
#undef LED
#define LED_DDR DDRG
#define LED_PORT PORTG
#define LED_PIN PING
#define LED PING4
#elif LED == G5
#undef LED
#define LED_DDR DDRG
#define LED_PORT PORTG
#define LED_PIN PING
#define LED PING5
#elif LED == G6
#undef LED
#define LED_DDR DDRG
#define LED_PORT PORTG
#define LED_PIN PING
#define LED PING6
#elif LED == G7
#undef LED
#define LED_DDR DDRG
#define LED_PORT PORTG
#define LED_PIN PING
#define LED PING7
#elif LED == H0
#undef LED
#define LED_DDR DDRH
#define LED_PORT PORTH
#define LED_PIN PINH
#define LED PINH0
#elif LED == H1
#undef LED
#define LED_DDR DDRH
#define LED_PORT PORTH
#define LED_PIN PINH
#define LED PINH1
#elif LED == H2
#undef LED
#define LED_DDR DDRH
#define LED_PORT PORTH
#define LED_PIN PINH
#define LED PINH2
#elif LED == H3
#undef LED
#define LED_DDR DDRH
#define LED_PORT PORTH
#define LED_PIN PINH
#define LED PINH3
#elif LED == H4
#undef LED
#define LED_DDR DDRH
#define LED_PORT PORTH
#define LED_PIN PINH
#define LED PINH4
#elif LED == H5
#undef LED
#define LED_DDR DDRH
#define LED_PORT PORTH
#define LED_PIN PINH
#define LED PINH5
#elif LED == H6
#undef LED
#define LED_DDR DDRH
#define LED_PORT PORTH
#define LED_PIN PINH
#define LED PINH6
#elif LED == H7
#undef LED
#define LED_DDR DDRH
#define LED_PORT PORTH
#define LED_PIN PINH
#define LED PINH7
#elif LED == J0
#undef LED
#define LED_DDR DDRJ
#define LED_PORT PORTJ
#define LED_PIN PINJ
#define LED PINJ0
#elif LED == J1
#undef LED
#define LED_DDR DDRJ
#define LED_PORT PORTJ
#define LED_PIN PINJ
#define LED PINJ1
#elif LED == J2
#undef LED
#define LED_DDR DDRJ
#define LED_PORT PORTJ
#define LED_PIN PINJ
#define LED PINJ2
#elif LED == J3
#undef LED
#define LED_DDR DDRJ
#define LED_PORT PORTJ
#define LED_PIN PINJ
#define LED PINJ3
#elif LED == J4
#undef LED
#define LED_DDR DDRJ
#define LED_PORT PORTJ
#define LED_PIN PINJ
#define LED PINJ4
#elif LED == J5
#undef LED
#define LED_DDR DDRJ
#define LED_PORT PORTJ
#define LED_PIN PINJ
#define LED PINJ5
#elif LED == J6
#undef LED
#define LED_DDR DDRJ
#define LED_PORT PORTJ
#define LED_PIN PINJ
#define LED PINJ6
#elif LED == J7
#undef LED
#define LED_DDR DDRJ
#define LED_PORT PORTJ
#define LED_PIN PINJ
#define LED PINJ7
#elif LED == K0
#undef LED
#define LED_DDR DDRK
#define LED_PORT PORTK
#define LED_PIN PINK
#define LED PINK0
#elif LED == K1
#undef LED
#define LED_DDR DDRK
#define LED_PORT PORTK
#define LED_PIN PINK
#define LED PINK1
#elif LED == K2
#undef LED
#define LED_DDR DDRK
#define LED_PORT PORTK
#define LED_PIN PINK
#define LED PINK2
#elif LED == K3
#undef LED
#define LED_DDR DDRK
#define LED_PORT PORTK
#define LED_PIN PINK
#define LED PINK3
#elif LED == K4
#undef LED
#define LED_DDR DDRK
#define LED_PORT PORTK
#define LED_PIN PINK
#define LED PINK4
#elif LED == K5
#undef LED
#define LED_DDR DDRK
#define LED_PORT PORTK
#define LED_PIN PINK
#define LED PINK5
#elif LED == K6
#undef LED
#define LED_DDR DDRK
#define LED_PORT PORTK
#define LED_PIN PINK
#define LED PINK6
#elif LED == K7
#undef LED
#define LED_DDR DDRK
#define LED_PORT PORTK
#define LED_PIN PINK
#define LED PINK7
#elif LED == L0
#undef LED
#define LED_DDR DDRL
#define LED_PORT PORTL
#define LED_PIN PINL
#define LED PINL0
#elif LED == L1
#undef LED
#define LED_DDR DDRL
#define LED_PORT PORTL
#define LED_PIN PINL
#define LED PINL1
#elif LED == L2
#undef LED
#define LED_DDR DDRL
#define LED_PORT PORTL
#define LED_PIN PINL
#define LED PINL2
#elif LED == L3
#undef LED
#define LED_DDR DDRL
#define LED_PORT PORTL
#define LED_PIN PINL
#define LED PINL3
#elif LED == L4
#undef LED
#define LED_DDR DDRL
#define LED_PORT PORTL
#define LED_PIN PINL
#define LED PINL4
#elif LED == L5
#undef LED
#define LED_DDR DDRL
#define LED_PORT PORTL
#define LED_PIN PINL
#define LED PINL5
#elif LED == L6
#undef LED
#define LED_DDR DDRL
#define LED_PORT PORTL
#define LED_PIN PINL
#define LED PINL6
#elif LED == L7
#undef LED
#define LED_DDR DDRL
#define LED_PORT PORTL
#define LED_PIN PINL
#define LED PINL7
#elif LED == A0
#undef LED
#define LED_DDR DDRA
#define LED_PORT PORTA
#define LED_PIN PINA
#define LED PINA0
#elif LED == A1
#undef LED
#define LED_DDR DDRA
#define LED_PORT PORTA
#define LED_PIN PINA
#define LED PINA1
#elif LED == A2
#undef LED
#define LED_DDR DDRA
#define LED_PORT PORTA
#define LED_PIN PINA
#define LED PINA2
#elif LED == A3
#undef LED
#define LED_DDR DDRA
#define LED_PORT PORTA
#define LED_PIN PINA
#define LED PINA3
#elif LED == A4
#undef LED
#define LED_DDR DDRA
#define LED_PORT PORTA
#define LED_PIN PINA
#define LED PINA4
#elif LED == A5
#undef LED
#define LED_DDR DDRA
#define LED_PORT PORTA
#define LED_PIN PINA
#define LED PINA5
#elif LED == A6
#undef LED
#define LED_DDR DDRA
#define LED_PORT PORTA
#define LED_PIN PINA
#define LED PINA6
#elif LED == A7
#undef LED
#define LED_DDR DDRA
#define LED_PORT PORTA
#define LED_PIN PINA
#define LED PINA7
#else
// Stop compilation right away, so we don't get more errors.
#if LED == -1
#error Unrecognized LED name. Should be like "B5"
// Stop compilation right away, so we don't get more errors.
#pragma GCC diagnostic warning "-Wfatal-errors"
#error Nonexistent LED PORT. Check datasheet.
#endif
#pragma GCC diagnostic warning "-Wfatal-errors"
#error Unrecognized LED name. Should be like "B5"
#endif

View File

@ -0,0 +1,49 @@
/* STK500 constants list, from AVRDUDE
*
* Trivial set of constants derived from Atmel App Note AVR061
* Not copyrighted. Released to the public domain.
*/
#define STK_OK 0x10
#define STK_FAILED 0x11 // Not used
#define STK_UNKNOWN 0x12 // Not used
#define STK_NODEVICE 0x13 // Not used
#define STK_INSYNC 0x14 // ' '
#define STK_NOSYNC 0x15 // Not used
#define ADC_CHANNEL_ERROR 0x16 // Not used
#define ADC_MEASURE_OK 0x17 // Not used
#define PWM_CHANNEL_ERROR 0x18 // Not used
#define PWM_ADJUST_OK 0x19 // Not used
#define CRC_EOP 0x20 // 'SPACE'
#define STK_GET_SYNC 0x30 // '0'
#define STK_GET_SIGN_ON 0x31 // '1'
#define STK_SET_PARAMETER 0x40 // '@'
#define STK_GET_PARAMETER 0x41 // 'A'
#define STK_SET_DEVICE 0x42 // 'B'
#define STK_SET_DEVICE_EXT 0x45 // 'E'
#define STK_ENTER_PROGMODE 0x50 // 'P'
#define STK_LEAVE_PROGMODE 0x51 // 'Q'
#define STK_CHIP_ERASE 0x52 // 'R'
#define STK_CHECK_AUTOINC 0x53 // 'S'
#define STK_LOAD_ADDRESS 0x55 // 'U'
#define STK_UNIVERSAL 0x56 // 'V'
#define STK_PROG_FLASH 0x60 // '`'
#define STK_PROG_DATA 0x61 // 'a'
#define STK_PROG_FUSE 0x62 // 'b'
#define STK_PROG_LOCK 0x63 // 'c'
#define STK_PROG_PAGE 0x64 // 'd'
#define STK_PROG_FUSE_EXT 0x65 // 'e'
#define STK_READ_FLASH 0x70 // 'p'
#define STK_READ_DATA 0x71 // 'q'
#define STK_READ_FUSE 0x72 // 'r'
#define STK_READ_LOCK 0x73 // 's'
#define STK_READ_PAGE 0x74 // 't'
#define STK_READ_SIGN 0x75 // 'u'
#define STK_READ_OSCCAL 0x76 // 'v'
#define STK_READ_FUSE_EXT 0x77 // 'w'
#define STK_READ_OSCCAL_EXT 0x78 // 'x'
#define STK_SW_MAJOR 0x81 // ' '
#define STK_SW_MINOR 0x82 // ' '
/* AVR raw commands sent via STK_UNIVERSAL */
#define AVR_OP_LOAD_EXT_ADDR 0x4d

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,306 @@
// Text is an extract from The Canterbury Tales
// Full text at http://www.gutenberg.org/dirs/etext00/cbtls12.txt
#include <avr/pgmspace.h>
const char knightsTale[] PROGMEM= {
" THE KNIGHT'S TALE <1>\n"
"\n"
"\n"
"WHILOM*, as olde stories tellen us, *formerly\n"
"There was a duke that highte* Theseus. *was called <2>\n"
"Of Athens he was lord and governor,\n"
"And in his time such a conqueror\n"
"That greater was there none under the sun.\n"
"Full many a riche country had he won.\n"
"What with his wisdom and his chivalry,\n"
"He conquer'd all the regne of Feminie,<3>\n"
"That whilom was y-cleped Scythia;\n"
"And weddede the Queen Hippolyta\n"
"And brought her home with him to his country\n"
"With muchel* glory and great solemnity, *great\n"
"And eke her younge sister Emily,\n"
"And thus with vict'ry and with melody\n"
"Let I this worthy Duke to Athens ride,\n"
"And all his host, in armes him beside.\n"
"\n"
"And certes, if it n'ere* too long to hear, *were not\n"
"I would have told you fully the mannere,\n"
"How wonnen* was the regne of Feminie, <4> *won\n"
"By Theseus, and by his chivalry;\n"
"And of the greate battle for the nonce\n"
"Betwixt Athenes and the Amazons;\n"
"And how assieged was Hippolyta,\n"
"The faire hardy queen of Scythia;\n"
"And of the feast that was at her wedding\n"
"And of the tempest at her homecoming.\n"
"But all these things I must as now forbear.\n"
"I have, God wot, a large field to ear* *plough<5>;\n"
"And weake be the oxen in my plough;\n"
"The remnant of my tale is long enow.\n"
"I will not *letten eke none of this rout*. *hinder any of\n"
"Let every fellow tell his tale about, this company*\n"
"And let see now who shall the supper win.\n"
"There *as I left*, I will again begin. *where I left off*\n"
"\n"
"This Duke, of whom I make mentioun,\n"
"When he was come almost unto the town,\n"
"In all his weal, and in his moste pride,\n"
"He was ware, as he cast his eye aside,\n"
"Where that there kneeled in the highe way\n"
"A company of ladies, tway and tway,\n"
"Each after other, clad in clothes black:\n"
"But such a cry and such a woe they make,\n"
"That in this world n'is creature living,\n"
"That hearde such another waimenting* *lamenting <6>\n"
"And of this crying would they never stenten*, *desist\n"
"Till they the reines of his bridle henten*. *seize\n"
"\"What folk be ye that at mine homecoming\n"
"Perturben so my feaste with crying?\"\n"
"Quoth Theseus; \"Have ye so great envy\n"
"Of mine honour, that thus complain and cry?\n"
"Or who hath you misboden*, or offended? *wronged\n"
"Do telle me, if it may be amended;\n"
"And why that ye be clad thus all in black?\"\n"
"\n"
"The oldest lady of them all then spake,\n"
"When she had swooned, with a deadly cheer*, *countenance\n"
"That it was ruthe* for to see or hear. *pity\n"
"She saide; \"Lord, to whom fortune hath given\n"
"Vict'ry, and as a conqueror to liven,\n"
"Nought grieveth us your glory and your honour;\n"
"But we beseechen mercy and succour.\n"
"Have mercy on our woe and our distress;\n"
"Some drop of pity, through thy gentleness,\n"
"Upon us wretched women let now fall.\n"
"For certes, lord, there is none of us all\n"
"That hath not been a duchess or a queen;\n"
"Now be we caitives*, as it is well seen: *captives\n"
"Thanked be Fortune, and her false wheel,\n"
"That *none estate ensureth to be wele*. *assures no continuance of\n"
"And certes, lord, t'abiden your presence prosperous estate*\n"
"Here in this temple of the goddess Clemence\n"
"We have been waiting all this fortenight:\n"
"Now help us, lord, since it lies in thy might.\n"
"\n"
"\"I, wretched wight, that weep and waile thus,\n"
"Was whilom wife to king Capaneus,\n"
"That starf* at Thebes, cursed be that day: *died <7>\n"
"And alle we that be in this array,\n"
"And maken all this lamentatioun,\n"
"We losten all our husbands at that town,\n"
"While that the siege thereabouten lay.\n"
"And yet the olde Creon, wellaway!\n"
"That lord is now of Thebes the city,\n"
"Fulfilled of ire and of iniquity,\n"
"He for despite, and for his tyranny,\n"
"To do the deade bodies villainy*, *insult\n"
"Of all our lorde's, which that been y-slaw, *slain\n"
"Hath all the bodies on an heap y-draw,\n"
"And will not suffer them by none assent\n"
"Neither to be y-buried, nor y-brent*, *burnt\n"
"But maketh houndes eat them in despite.\"\n"
"And with that word, withoute more respite\n"
"They fallen groff,* and cryden piteously; *grovelling\n"
"\"Have on us wretched women some mercy,\n"
"And let our sorrow sinken in thine heart.\"\n"
"\n"
"This gentle Duke down from his courser start\n"
"With hearte piteous, when he heard them speak.\n"
"Him thoughte that his heart would all to-break,\n"
"When he saw them so piteous and so mate* *abased\n"
"That whilom weren of so great estate.\n"
"And in his armes he them all up hent*, *raised, took\n"
"And them comforted in full good intent,\n"
"And swore his oath, as he was true knight,\n"
"He woulde do *so farforthly his might* *as far as his power went*\n"
"Upon the tyrant Creon them to wreak*, *avenge\n"
"That all the people of Greece shoulde speak,\n"
"How Creon was of Theseus y-served,\n"
"As he that had his death full well deserved.\n"
"And right anon withoute more abode* *delay\n"
"His banner he display'd, and forth he rode\n"
"To Thebes-ward, and all his, host beside:\n"
"No ner* Athenes would he go nor ride, *nearer\n"
"Nor take his ease fully half a day,\n"
"But onward on his way that night he lay:\n"
"And sent anon Hippolyta the queen,\n"
"And Emily her younge sister sheen* *bright, lovely\n"
"Unto the town of Athens for to dwell:\n"
"And forth he rit*; there is no more to tell. *rode\n"
"\n"
"The red statue of Mars with spear and targe* *shield\n"
"So shineth in his white banner large\n"
"That all the fieldes glitter up and down:\n"
"And by his banner borne is his pennon\n"
"Of gold full rich, in which there was y-beat* *stamped\n"
"The Minotaur<8> which that he slew in Crete\n"
"Thus rit this Duke, thus rit this conqueror\n"
"And in his host of chivalry the flower,\n"
"Till that he came to Thebes, and alight\n"
"Fair in a field, there as he thought to fight.\n"
"But shortly for to speaken of this thing,\n"
"With Creon, which that was of Thebes king,\n"
"He fought, and slew him manly as a knight\n"
"In plain bataille, and put his folk to flight:\n"
"And by assault he won the city after,\n"
"And rent adown both wall, and spar, and rafter;\n"
"And to the ladies he restored again\n"
"The bodies of their husbands that were slain,\n"
"To do obsequies, as was then the guise*. *custom\n"
"\n"
"But it were all too long for to devise* *describe\n"
"The greate clamour, and the waimenting*, *lamenting\n"
"Which that the ladies made at the brenning* *burning\n"
"Of the bodies, and the great honour\n"
"That Theseus the noble conqueror\n"
"Did to the ladies, when they from him went:\n"
"But shortly for to tell is mine intent.\n"
"When that this worthy Duke, this Theseus,\n"
"Had Creon slain, and wonnen Thebes thus,\n"
"Still in the field he took all night his rest,\n"
"And did with all the country as him lest*. *pleased\n"
"To ransack in the tas* of bodies dead, *heap\n"
"Them for to strip of *harness and of **weed, *armour **clothes\n"
"The pillers* did their business and cure, *pillagers <9>\n"
"After the battle and discomfiture.\n"
"And so befell, that in the tas they found,\n"
"Through girt with many a grievous bloody wound,\n"
"Two younge knightes *ligging by and by* *lying side by side*\n"
"Both in *one armes*, wrought full richely: *the same armour*\n"
"Of whiche two, Arcita hight that one,\n"
"And he that other highte Palamon.\n"
"Not fully quick*, nor fully dead they were, *alive\n"
"But by their coat-armour, and by their gear,\n"
"The heralds knew them well in special,\n"
"As those that weren of the blood royal\n"
"Of Thebes, and *of sistren two y-born*. *born of two sisters*\n"
"Out of the tas the pillers have them torn,\n"
"And have them carried soft unto the tent\n"
"Of Theseus, and he full soon them sent\n"
"To Athens, for to dwellen in prison\n"
"Perpetually, he *n'olde no ranson*. *would take no ransom*\n"
"And when this worthy Duke had thus y-done,\n"
"He took his host, and home he rit anon\n"
"With laurel crowned as a conquerour;\n"
"And there he lived in joy and in honour\n"
"Term of his life; what needeth wordes mo'?\n"
"And in a tower, in anguish and in woe,\n"
"Dwellen this Palamon, and eke Arcite,\n"
"For evermore, there may no gold them quite* *set free\n"
"\n"
"Thus passed year by year, and day by day,\n"
"Till it fell ones in a morn of May\n"
"That Emily, that fairer was to seen\n"
"Than is the lily upon his stalke green,\n"
"And fresher than the May with flowers new\n"
"(For with the rose colour strove her hue;\n"
"I n'ot* which was the finer of them two), *know not\n"
"Ere it was day, as she was wont to do,\n"
"She was arisen, and all ready dight*, *dressed\n"
"For May will have no sluggardy a-night;\n"
"The season pricketh every gentle heart,\n"
"And maketh him out of his sleep to start,\n"
"And saith, \"Arise, and do thine observance.\"\n"
"\n"
"This maketh Emily have remembrance\n"
"To do honour to May, and for to rise.\n"
"Y-clothed was she fresh for to devise;\n"
"Her yellow hair was braided in a tress,\n"
"Behind her back, a yarde long I guess.\n"
"And in the garden at *the sun uprist* *sunrise\n"
"She walketh up and down where as her list.\n"
"She gathereth flowers, party* white and red, *mingled\n"
"To make a sotel* garland for her head, *subtle, well-arranged\n"
"And as an angel heavenly she sung.\n"
"The greate tower, that was so thick and strong,\n"
"Which of the castle was the chief dungeon<10>\n"
"(Where as these knightes weren in prison,\n"
"Of which I tolde you, and telle shall),\n"
"Was even joinant* to the garden wall, *adjoining\n"
"There as this Emily had her playing.\n"
"\n"
"Bright was the sun, and clear that morrowning,\n"
"And Palamon, this woful prisoner,\n"
"As was his wont, by leave of his gaoler,\n"
"Was ris'n, and roamed in a chamber on high,\n"
"In which he all the noble city sigh*, *saw\n"
"And eke the garden, full of branches green,\n"
"There as this fresh Emelia the sheen\n"
"Was in her walk, and roamed up and down.\n"
"This sorrowful prisoner, this Palamon\n"
"Went in his chamber roaming to and fro,\n"
"And to himself complaining of his woe:\n"
"That he was born, full oft he said, Alas!\n"
"And so befell, by aventure or cas*, *chance\n"
"That through a window thick of many a bar\n"
"Of iron great, and square as any spar,\n"
"He cast his eyes upon Emelia,\n"
"And therewithal he blent* and cried, Ah! *started aside\n"
"As though he stungen were unto the heart.\n"
"And with that cry Arcite anon up start,\n"
"And saide, \"Cousin mine, what aileth thee,\n"
"That art so pale and deadly for to see?\n"
"Why cried'st thou? who hath thee done offence?\n"
"For Godde's love, take all in patience\n"
"Our prison*, for it may none other be. *imprisonment\n"
"Fortune hath giv'n us this adversity'.\n"
"Some wick'* aspect or disposition *wicked\n"
"Of Saturn<11>, by some constellation,\n"
"Hath giv'n us this, although we had it sworn,\n"
"So stood the heaven when that we were born,\n"
"We must endure; this is the short and plain.\n"
"\n"
"This Palamon answer'd, and said again:\n"
"\"Cousin, forsooth of this opinion\n"
"Thou hast a vain imagination.\n"
"This prison caused me not for to cry;\n"
"But I was hurt right now thorough mine eye\n"
"Into mine heart; that will my bane* be. *destruction\n"
"The fairness of the lady that I see\n"
"Yond in the garden roaming to and fro,\n"
"Is cause of all my crying and my woe.\n"
"I *n'ot wher* she be woman or goddess, *know not whether*\n"
"But Venus is it, soothly* as I guess, *truly\n"
"And therewithal on knees adown he fill,\n"
"And saide: \"Venus, if it be your will\n"
"You in this garden thus to transfigure\n"
"Before me sorrowful wretched creature,\n"
"Out of this prison help that we may scape.\n"
"And if so be our destiny be shape\n"
"By etern word to dien in prison,\n"
"Of our lineage have some compassion,\n"
"That is so low y-brought by tyranny.\"\n"
"\n"
"And with that word Arcita *gan espy* *began to look forth*\n"
"Where as this lady roamed to and fro\n"
"And with that sight her beauty hurt him so,\n"
"That if that Palamon was wounded sore,\n"
"Arcite is hurt as much as he, or more.\n"
"And with a sigh he saide piteously:\n"
"\"The freshe beauty slay'th me suddenly\n"
"Of her that roameth yonder in the place.\n"
"And but* I have her mercy and her grace, *unless\n"
"That I may see her at the leaste way,\n"
"I am but dead; there is no more to say.\"\n"
"This Palamon, when he these wordes heard,\n"
"Dispiteously* he looked, and answer'd: *angrily\n"
"\"Whether say'st thou this in earnest or in play?\"\n"
"\"Nay,\" quoth Arcite, \"in earnest, by my fay*. *faith\n"
"God help me so, *me lust full ill to play*.\" *I am in no humour\n"
"This Palamon gan knit his browes tway. for jesting*\n"
"\"It were,\" quoth he, \"to thee no great honour\n"
"For to be false, nor for to be traitour\n"
};
void setup() {
int i=0;
uint8_t c;
Serial.begin(115200);
do {
c = pgm_read_byte(knightsTale+i);
if (c) Serial.write(c);
i++;
} while (c);
}
void loop() {
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,679 @@
// Text is an extract from The Canterbury Tales
// Full text at http://www.gutenberg.org/dirs/etext00/cbtls12.txt
#include <avr/pgmspace.h>
const char knightsTale[] PROGMEM= {
" THE KNIGHT'S TALE <1>\n"
"\n"
"\n"
"WHILOM*, as olde stories tellen us, *formerly\n"
"There was a duke that highte* Theseus. *was called <2>\n"
"Of Athens he was lord and governor,\n"
"And in his time such a conqueror\n"
"That greater was there none under the sun.\n"
"Full many a riche country had he won.\n"
"What with his wisdom and his chivalry,\n"
"He conquer'd all the regne of Feminie,<3>\n"
"That whilom was y-cleped Scythia;\n"
"And weddede the Queen Hippolyta\n"
"And brought her home with him to his country\n"
"With muchel* glory and great solemnity, *great\n"
"And eke her younge sister Emily,\n"
"And thus with vict'ry and with melody\n"
"Let I this worthy Duke to Athens ride,\n"
"And all his host, in armes him beside.\n"
"\n"
"And certes, if it n'ere* too long to hear, *were not\n"
"I would have told you fully the mannere,\n"
"How wonnen* was the regne of Feminie, <4> *won\n"
"By Theseus, and by his chivalry;\n"
"And of the greate battle for the nonce\n"
"Betwixt Athenes and the Amazons;\n"
"And how assieged was Hippolyta,\n"
"The faire hardy queen of Scythia;\n"
"And of the feast that was at her wedding\n"
"And of the tempest at her homecoming.\n"
"But all these things I must as now forbear.\n"
"I have, God wot, a large field to ear* *plough<5>;\n"
"And weake be the oxen in my plough;\n"
"The remnant of my tale is long enow.\n"
"I will not *letten eke none of this rout*. *hinder any of\n"
"Let every fellow tell his tale about, this company*\n"
"And let see now who shall the supper win.\n"
"There *as I left*, I will again begin. *where I left off*\n"
"\n"
"This Duke, of whom I make mentioun,\n"
"When he was come almost unto the town,\n"
"In all his weal, and in his moste pride,\n"
"He was ware, as he cast his eye aside,\n"
"Where that there kneeled in the highe way\n"
"A company of ladies, tway and tway,\n"
"Each after other, clad in clothes black:\n"
"But such a cry and such a woe they make,\n"
"That in this world n'is creature living,\n"
"That hearde such another waimenting* *lamenting <6>\n"
"And of this crying would they never stenten*, *desist\n"
"Till they the reines of his bridle henten*. *seize\n"
"\"What folk be ye that at mine homecoming\n"
"Perturben so my feaste with crying?\"\n"
"Quoth Theseus; \"Have ye so great envy\n"
"Of mine honour, that thus complain and cry?\n"
"Or who hath you misboden*, or offended? *wronged\n"
"Do telle me, if it may be amended;\n"
"And why that ye be clad thus all in black?\"\n"
"\n"
"The oldest lady of them all then spake,\n"
"When she had swooned, with a deadly cheer*, *countenance\n"
"That it was ruthe* for to see or hear. *pity\n"
"She saide; \"Lord, to whom fortune hath given\n"
"Vict'ry, and as a conqueror to liven,\n"
"Nought grieveth us your glory and your honour;\n"
"But we beseechen mercy and succour.\n"
"Have mercy on our woe and our distress;\n"
"Some drop of pity, through thy gentleness,\n"
"Upon us wretched women let now fall.\n"
"For certes, lord, there is none of us all\n"
"That hath not been a duchess or a queen;\n"
"Now be we caitives*, as it is well seen: *captives\n"
"Thanked be Fortune, and her false wheel,\n"
"That *none estate ensureth to be wele*. *assures no continuance of\n"
"And certes, lord, t'abiden your presence prosperous estate*\n"
"Here in this temple of the goddess Clemence\n"
"We have been waiting all this fortenight:\n"
"Now help us, lord, since it lies in thy might.\n"
"\n"
"\"I, wretched wight, that weep and waile thus,\n"
"Was whilom wife to king Capaneus,\n"
"That starf* at Thebes, cursed be that day: *died <7>\n"
"And alle we that be in this array,\n"
"And maken all this lamentatioun,\n"
"We losten all our husbands at that town,\n"
"While that the siege thereabouten lay.\n"
"And yet the olde Creon, wellaway!\n"
"That lord is now of Thebes the city,\n"
"Fulfilled of ire and of iniquity,\n"
"He for despite, and for his tyranny,\n"
"To do the deade bodies villainy*, *insult\n"
"Of all our lorde's, which that been y-slaw, *slain\n"
"Hath all the bodies on an heap y-draw,\n"
"And will not suffer them by none assent\n"
"Neither to be y-buried, nor y-brent*, *burnt\n"
"But maketh houndes eat them in despite.\"\n"
"And with that word, withoute more respite\n"
"They fallen groff,* and cryden piteously; *grovelling\n"
"\"Have on us wretched women some mercy,\n"
"And let our sorrow sinken in thine heart.\"\n"
"\n"
"This gentle Duke down from his courser start\n"
"With hearte piteous, when he heard them speak.\n"
"Him thoughte that his heart would all to-break,\n"
"When he saw them so piteous and so mate* *abased\n"
"That whilom weren of so great estate.\n"
"And in his armes he them all up hent*, *raised, took\n"
"And them comforted in full good intent,\n"
"And swore his oath, as he was true knight,\n"
"He woulde do *so farforthly his might* *as far as his power went*\n"
"Upon the tyrant Creon them to wreak*, *avenge\n"
"That all the people of Greece shoulde speak,\n"
"How Creon was of Theseus y-served,\n"
"As he that had his death full well deserved.\n"
"And right anon withoute more abode* *delay\n"
"His banner he display'd, and forth he rode\n"
"To Thebes-ward, and all his, host beside:\n"
"No ner* Athenes would he go nor ride, *nearer\n"
"Nor take his ease fully half a day,\n"
"But onward on his way that night he lay:\n"
"And sent anon Hippolyta the queen,\n"
"And Emily her younge sister sheen* *bright, lovely\n"
"Unto the town of Athens for to dwell:\n"
"And forth he rit*; there is no more to tell. *rode\n"
"\n"
"The red statue of Mars with spear and targe* *shield\n"
"So shineth in his white banner large\n"
"That all the fieldes glitter up and down:\n"
"And by his banner borne is his pennon\n"
"Of gold full rich, in which there was y-beat* *stamped\n"
"The Minotaur<8> which that he slew in Crete\n"
"Thus rit this Duke, thus rit this conqueror\n"
"And in his host of chivalry the flower,\n"
"Till that he came to Thebes, and alight\n"
"Fair in a field, there as he thought to fight.\n"
"But shortly for to speaken of this thing,\n"
"With Creon, which that was of Thebes king,\n"
"He fought, and slew him manly as a knight\n"
"In plain bataille, and put his folk to flight:\n"
"And by assault he won the city after,\n"
"And rent adown both wall, and spar, and rafter;\n"
"And to the ladies he restored again\n"
"The bodies of their husbands that were slain,\n"
"To do obsequies, as was then the guise*. *custom\n"
"\n"
"But it were all too long for to devise* *describe\n"
"The greate clamour, and the waimenting*, *lamenting\n"
"Which that the ladies made at the brenning* *burning\n"
"Of the bodies, and the great honour\n"
"That Theseus the noble conqueror\n"
"Did to the ladies, when they from him went:\n"
"But shortly for to tell is mine intent.\n"
"When that this worthy Duke, this Theseus,\n"
"Had Creon slain, and wonnen Thebes thus,\n"
"Still in the field he took all night his rest,\n"
"And did with all the country as him lest*. *pleased\n"
"To ransack in the tas* of bodies dead, *heap\n"
"Them for to strip of *harness and of **weed, *armour **clothes\n"
"The pillers* did their business and cure, *pillagers <9>\n"
"After the battle and discomfiture.\n"
"And so befell, that in the tas they found,\n"
"Through girt with many a grievous bloody wound,\n"
"Two younge knightes *ligging by and by* *lying side by side*\n"
"Both in *one armes*, wrought full richely: *the same armour*\n"
"Of whiche two, Arcita hight that one,\n"
"And he that other highte Palamon.\n"
"Not fully quick*, nor fully dead they were, *alive\n"
"But by their coat-armour, and by their gear,\n"
"The heralds knew them well in special,\n"
"As those that weren of the blood royal\n"
"Of Thebes, and *of sistren two y-born*. *born of two sisters*\n"
"Out of the tas the pillers have them torn,\n"
"And have them carried soft unto the tent\n"
"Of Theseus, and he full soon them sent\n"
"To Athens, for to dwellen in prison\n"
"Perpetually, he *n'olde no ranson*. *would take no ransom*\n"
"And when this worthy Duke had thus y-done,\n"
"He took his host, and home he rit anon\n"
"With laurel crowned as a conquerour;\n"
"And there he lived in joy and in honour\n"
"Term of his life; what needeth wordes mo'?\n"
"And in a tower, in anguish and in woe,\n"
"Dwellen this Palamon, and eke Arcite,\n"
"For evermore, there may no gold them quite* *set free\n"
"\n"
"Thus passed year by year, and day by day,\n"
"Till it fell ones in a morn of May\n"
"That Emily, that fairer was to seen\n"
"Than is the lily upon his stalke green,\n"
"And fresher than the May with flowers new\n"
"(For with the rose colour strove her hue;\n"
"I n'ot* which was the finer of them two), *know not\n"
"Ere it was day, as she was wont to do,\n"
"She was arisen, and all ready dight*, *dressed\n"
"For May will have no sluggardy a-night;\n"
"The season pricketh every gentle heart,\n"
"And maketh him out of his sleep to start,\n"
"And saith, \"Arise, and do thine observance.\"\n"
"\n"
"This maketh Emily have remembrance\n"
"To do honour to May, and for to rise.\n"
"Y-clothed was she fresh for to devise;\n"
"Her yellow hair was braided in a tress,\n"
"Behind her back, a yarde long I guess.\n"
"And in the garden at *the sun uprist* *sunrise\n"
"She walketh up and down where as her list.\n"
"She gathereth flowers, party* white and red, *mingled\n"
"To make a sotel* garland for her head, *subtle, well-arranged\n"
"And as an angel heavenly she sung.\n"
"The greate tower, that was so thick and strong,\n"
"Which of the castle was the chief dungeon<10>\n"
"(Where as these knightes weren in prison,\n"
"Of which I tolde you, and telle shall),\n"
"Was even joinant* to the garden wall, *adjoining\n"
"There as this Emily had her playing.\n"
"\n"
"Bright was the sun, and clear that morrowning,\n"
"And Palamon, this woful prisoner,\n"
"As was his wont, by leave of his gaoler,\n"
"Was ris'n, and roamed in a chamber on high,\n"
"In which he all the noble city sigh*, *saw\n"
"And eke the garden, full of branches green,\n"
"There as this fresh Emelia the sheen\n"
"Was in her walk, and roamed up and down.\n"
"This sorrowful prisoner, this Palamon\n"
"Went in his chamber roaming to and fro,\n"
"And to himself complaining of his woe:\n"
"That he was born, full oft he said, Alas!\n"
"And so befell, by aventure or cas*, *chance\n"
"That through a window thick of many a bar\n"
"Of iron great, and square as any spar,\n"
"He cast his eyes upon Emelia,\n"
"And therewithal he blent* and cried, Ah! *started aside\n"
"As though he stungen were unto the heart.\n"
"And with that cry Arcite anon up start,\n"
"And saide, \"Cousin mine, what aileth thee,\n"
"That art so pale and deadly for to see?\n"
"Why cried'st thou? who hath thee done offence?\n"
"For Godde's love, take all in patience\n"
"Our prison*, for it may none other be. *imprisonment\n"
"Fortune hath giv'n us this adversity'.\n"
"Some wick'* aspect or disposition *wicked\n"
"Of Saturn<11>, by some constellation,\n"
"Hath giv'n us this, although we had it sworn,\n"
"So stood the heaven when that we were born,\n"
"We must endure; this is the short and plain.\n"
"\n"
"This Palamon answer'd, and said again:\n"
"\"Cousin, forsooth of this opinion\n"
"Thou hast a vain imagination.\n"
"This prison caused me not for to cry;\n"
"But I was hurt right now thorough mine eye\n"
"Into mine heart; that will my bane* be. *destruction\n"
"The fairness of the lady that I see\n"
"Yond in the garden roaming to and fro,\n"
"Is cause of all my crying and my woe.\n"
"I *n'ot wher* she be woman or goddess, *know not whether*\n"
"But Venus is it, soothly* as I guess, *truly\n"
"And therewithal on knees adown he fill,\n"
"And saide: \"Venus, if it be your will\n"
"You in this garden thus to transfigure\n"
"Before me sorrowful wretched creature,\n"
"Out of this prison help that we may scape.\n"
"And if so be our destiny be shape\n"
"By etern word to dien in prison,\n"
"Of our lineage have some compassion,\n"
"That is so low y-brought by tyranny.\"\n"
"\n"
"And with that word Arcita *gan espy* *began to look forth*\n"
"Where as this lady roamed to and fro\n"
"And with that sight her beauty hurt him so,\n"
"That if that Palamon was wounded sore,\n"
"Arcite is hurt as much as he, or more.\n"
"And with a sigh he saide piteously:\n"
"\"The freshe beauty slay'th me suddenly\n"
"Of her that roameth yonder in the place.\n"
"And but* I have her mercy and her grace, *unless\n"
"That I may see her at the leaste way,\n"
"I am but dead; there is no more to say.\"\n"
"This Palamon, when he these wordes heard,\n"
"Dispiteously* he looked, and answer'd: *angrily\n"
"\"Whether say'st thou this in earnest or in play?\"\n"
"\"Nay,\" quoth Arcite, \"in earnest, by my fay*. *faith\n"
"God help me so, *me lust full ill to play*.\" *I am in no humour\n"
"This Palamon gan knit his browes tway. for jesting*\n"
"\"It were,\" quoth he, \"to thee no great honour\n"
"For to be false, nor for to be traitour\n"
"To me, that am thy cousin and thy brother\n"
"Y-sworn full deep, and each of us to other,\n"
"That never for to dien in the pain <12>,\n"
"Till that the death departen shall us twain,\n"
"Neither of us in love to hinder other,\n"
"Nor in none other case, my leve* brother; *dear\n"
"But that thou shouldest truly farther me\n"
"In every case, as I should farther thee.\n"
"This was thine oath, and mine also certain;\n"
"I wot it well, thou dar'st it not withsayn*, *deny\n"
"Thus art thou of my counsel out of doubt,\n"
"And now thou wouldest falsely be about\n"
"To love my lady, whom I love and serve,\n"
"And ever shall, until mine hearte sterve* *die\n"
"Now certes, false Arcite, thou shalt not so\n"
"I lov'd her first, and tolde thee my woe\n"
"As to my counsel, and my brother sworn\n"
"To farther me, as I have told beforn.\n"
"For which thou art y-bounden as a knight\n"
"To helpe me, if it lie in thy might,\n"
"Or elles art thou false, I dare well sayn,\"\n"
"\n"
"This Arcita full proudly spake again:\n"
"\"Thou shalt,\" quoth he, \"be rather* false than I, *sooner\n"
"And thou art false, I tell thee utterly;\n"
"For par amour I lov'd her first ere thou.\n"
"What wilt thou say? *thou wist it not right now* *even now thou\n"
"Whether she be a woman or goddess. knowest not*\n"
"Thine is affection of holiness,\n"
"And mine is love, as to a creature:\n"
"For which I tolde thee mine aventure\n"
"As to my cousin, and my brother sworn\n"
"I pose*, that thou loved'st her beforn: *suppose\n"
"Wost* thou not well the olde clerke's saw<13>, *know'st\n"
"That who shall give a lover any law?\n"
"Love is a greater lawe, by my pan,\n"
"Than may be giv'n to any earthly man:\n"
"Therefore positive law, and such decree,\n"
"Is broke alway for love in each degree\n"
"A man must needes love, maugre his head.\n"
"He may not flee it, though he should be dead,\n"
"*All be she* maid, or widow, or else wife. *whether she be*\n"
"And eke it is not likely all thy life\n"
"To standen in her grace, no more than I\n"
"For well thou wost thyselfe verily,\n"
"That thou and I be damned to prison\n"
"Perpetual, us gaineth no ranson.\n"
"We strive, as did the houndes for the bone;\n"
"They fought all day, and yet their part was none.\n"
"There came a kite, while that they were so wroth,\n"
"And bare away the bone betwixt them both.\n"
"And therefore at the kinge's court, my brother,\n"
"Each man for himselfe, there is no other.\n"
"Love if thee list; for I love and aye shall\n"
"And soothly, leve brother, this is all.\n"
"Here in this prison musten we endure,\n"
"And each of us take his Aventure.\"\n"
"\n"
"Great was the strife and long between these tway,\n"
"If that I hadde leisure for to say;\n"
"But to the effect: it happen'd on a day\n"
"(To tell it you as shortly as I may),\n"
"A worthy duke that hight Perithous<14>\n"
"That fellow was to the Duke Theseus\n"
"Since thilke* day that they were children lite** *that **little\n"
"Was come to Athens, his fellow to visite,\n"
"And for to play, as he was wont to do;\n"
"For in this world he loved no man so;\n"
"And he lov'd him as tenderly again.\n"
"So well they lov'd, as olde bookes sayn,\n"
"That when that one was dead, soothly to sayn,\n"
"His fellow went and sought him down in hell:\n"
"But of that story list me not to write.\n"
"Duke Perithous loved well Arcite,\n"
"And had him known at Thebes year by year:\n"
"And finally at request and prayere\n"
"Of Perithous, withoute ranson\n"
"Duke Theseus him let out of prison,\n"
"Freely to go, where him list over all,\n"
"In such a guise, as I you tellen shall\n"
"This was the forword*, plainly to indite, *promise\n"
"Betwixte Theseus and him Arcite:\n"
"That if so were, that Arcite were y-found\n"
"Ever in his life, by day or night, one stound* *moment<15>\n"
"In any country of this Theseus,\n"
"And he were caught, it was accorded thus,\n"
"That with a sword he shoulde lose his head;\n"
"There was none other remedy nor rede*. *counsel\n"
"But took his leave, and homeward he him sped;\n"
"Let him beware, his necke lieth *to wed*. *in pledge*\n"
"\n"
"How great a sorrow suff'reth now Arcite!\n"
"The death he feeleth through his hearte smite;\n"
"He weepeth, waileth, crieth piteously;\n"
"To slay himself he waiteth privily.\n"
"He said; \"Alas the day that I was born!\n"
"Now is my prison worse than beforn:\n"
"*Now is me shape* eternally to dwell *it is fixed for me*\n"
"Not in purgatory, but right in hell.\n"
"Alas! that ever I knew Perithous.\n"
"For elles had I dwelt with Theseus\n"
"Y-fettered in his prison evermo'.\n"
"Then had I been in bliss, and not in woe.\n"
"Only the sight of her, whom that I serve,\n"
"Though that I never may her grace deserve,\n"
"Would have sufficed right enough for me.\n"
"O deare cousin Palamon,\" quoth he,\n"
"\"Thine is the vict'ry of this aventure,\n"
"Full blissfully in prison to endure:\n"
"In prison? nay certes, in paradise.\n"
"Well hath fortune y-turned thee the dice,\n"
"That hast the sight of her, and I th' absence.\n"
"For possible is, since thou hast her presence,\n"
"And art a knight, a worthy and an able,\n"
"That by some cas*, since fortune is changeable, *chance\n"
"Thou may'st to thy desire sometime attain.\n"
"But I that am exiled, and barren\n"
"Of alle grace, and in so great despair,\n"
"That there n'is earthe, water, fire, nor air,\n"
"Nor creature, that of them maked is,\n"
"That may me helpe nor comfort in this,\n"
"Well ought I *sterve in wanhope* and distress. *die in despair*\n"
"Farewell my life, my lust*, and my gladness. *pleasure\n"
"Alas, *why plainen men so in commune *why do men so often complain\n"
"Of purveyance of God*, or of Fortune, of God's providence?*\n"
"That giveth them full oft in many a guise\n"
"Well better than they can themselves devise?\n"
"Some man desireth for to have richess,\n"
"That cause is of his murder or great sickness.\n"
"And some man would out of his prison fain,\n"
"That in his house is of his meinie* slain. *servants <16>\n"
"Infinite harmes be in this mattere.\n"
"We wot never what thing we pray for here.\n"
"We fare as he that drunk is as a mouse.\n"
"A drunken man wot well he hath an house,\n"
"But he wot not which is the right way thither,\n"
"And to a drunken man the way is slither*. *slippery\n"
"And certes in this world so fare we.\n"
"We seeke fast after felicity,\n"
"But we go wrong full often truely.\n"
"Thus we may sayen all, and namely* I, *especially\n"
"That ween'd*, and had a great opinion, *thought\n"
"That if I might escape from prison\n"
"Then had I been in joy and perfect heal,\n"
"Where now I am exiled from my weal.\n"
"Since that I may not see you, Emily,\n"
"I am but dead; there is no remedy.\"\n"
"\n"
"Upon that other side, Palamon,\n"
"When that he wist Arcita was agone,\n"
"Much sorrow maketh, that the greate tower\n"
"Resounded of his yelling and clamour\n"
"The pure* fetters on his shinnes great *very <17>\n"
"Were of his bitter salte teares wet.\n"
"\n"
"\"Alas!\" quoth he, \"Arcita, cousin mine,\n"
"Of all our strife, God wot, the fruit is thine.\n"
"Thou walkest now in Thebes at thy large,\n"
"And of my woe thou *givest little charge*. *takest little heed*\n"
"Thou mayst, since thou hast wisdom and manhead*, *manhood, courage\n"
"Assemble all the folk of our kindred,\n"
"And make a war so sharp on this country\n"
"That by some aventure, or some treaty,\n"
"Thou mayst have her to lady and to wife,\n"
"For whom that I must needes lose my life.\n"
"For as by way of possibility,\n"
"Since thou art at thy large, of prison free,\n"
"And art a lord, great is thine avantage,\n"
"More than is mine, that sterve here in a cage.\n"
"For I must weep and wail, while that I live,\n"
"With all the woe that prison may me give,\n"
"And eke with pain that love me gives also,\n"
"That doubles all my torment and my woe.\"\n"
"\n"
"Therewith the fire of jealousy upstart\n"
"Within his breast, and hent* him by the heart *seized\n"
"So woodly*, that he like was to behold *madly\n"
"The box-tree, or the ashes dead and cold.\n"
"Then said; \"O cruel goddess, that govern\n"
"This world with binding of your word etern* *eternal\n"
"And writen in the table of adamant\n"
"Your parlement* and your eternal grant, *consultation\n"
"What is mankind more *unto you y-hold* *by you esteemed\n"
"Than is the sheep, that rouketh* in the fold! *lie huddled together\n"
"For slain is man, right as another beast;\n"
"And dwelleth eke in prison and arrest,\n"
"And hath sickness, and great adversity,\n"
"And oftentimes guilteless, pardie* *by God\n"
"What governance is in your prescience,\n"
"That guilteless tormenteth innocence?\n"
"And yet increaseth this all my penance,\n"
"That man is bounden to his observance\n"
"For Godde's sake to *letten of his will*, *restrain his desire*\n"
"Whereas a beast may all his lust fulfil.\n"
"And when a beast is dead, he hath no pain;\n"
"But man after his death must weep and plain,\n"
"Though in this worlde he have care and woe:\n"
"Withoute doubt it maye standen so.\n"
"\"The answer of this leave I to divines,\n"
"But well I wot, that in this world great pine* is; *pain, trouble\n"
"Alas! I see a serpent or a thief\n"
"That many a true man hath done mischief,\n"
"Go at his large, and where him list may turn.\n"
"But I must be in prison through Saturn,\n"
"And eke through Juno, jealous and eke wood*, *mad\n"
"That hath well nigh destroyed all the blood\n"
"Of Thebes, with his waste walles wide.\n"
"And Venus slay'th me on that other side\n"
"For jealousy, and fear of him, Arcite.\"\n"
"\n"
"Now will I stent* of Palamon a lite**, *pause **little\n"
"And let him in his prison stille dwell,\n"
"And of Arcita forth I will you tell.\n"
"The summer passeth, and the nightes long\n"
"Increase double-wise the paines strong\n"
"Both of the lover and the prisonere.\n"
"I n'ot* which hath the wofuller mistere**. *know not **condition\n"
"For, shortly for to say, this Palamon\n"
"Perpetually is damned to prison,\n"
"In chaines and in fetters to be dead;\n"
"And Arcite is exiled *on his head* *on peril of his head*\n"
"For evermore as out of that country,\n"
"Nor never more he shall his lady see.\n"
"You lovers ask I now this question,<18>\n"
"Who lieth the worse, Arcite or Palamon?\n"
"The one may see his lady day by day,\n"
"But in prison he dwelle must alway.\n"
"The other where him list may ride or go,\n"
"But see his lady shall he never mo'.\n"
"Now deem all as you liste, ye that can,\n"
"For I will tell you forth as I began.\n"
"\n"
"When that Arcite to Thebes comen was,\n"
"Full oft a day he swelt*, and said, \"Alas!\" *fainted\n"
"For see this lady he shall never mo'.\n"
"And shortly to concluden all his woe,\n"
"So much sorrow had never creature\n"
"That is or shall be while the world may dure.\n"
"His sleep, his meat, his drink is *him byraft*, *taken away from him*\n"
"That lean he wex*, and dry as any shaft. *became\n"
"His eyen hollow, grisly to behold,\n"
"His hue sallow, and pale as ashes cold,\n"
"And solitary he was, ever alone,\n"
"And wailing all the night, making his moan.\n"
"And if he hearde song or instrument,\n"
"Then would he weepen, he might not be stent*. *stopped\n"
"So feeble were his spirits, and so low,\n"
"And changed so, that no man coulde know\n"
"His speech, neither his voice, though men it heard.\n"
"And in his gear* for all the world he far'd *behaviour <19>\n"
"Not only like the lovers' malady\n"
"Of Eros, but rather y-like manie* *madness\n"
"Engender'd of humours melancholic,\n"
"Before his head in his cell fantastic.<20>\n"
"And shortly turned was all upside down,\n"
"Both habit and eke dispositioun,\n"
"Of him, this woful lover Dan* Arcite. *Lord <21>\n"
"Why should I all day of his woe indite?\n"
"When he endured had a year or two\n"
"This cruel torment, and this pain and woe,\n"
"At Thebes, in his country, as I said,\n"
"Upon a night in sleep as he him laid,\n"
"Him thought how that the winged god Mercury\n"
"Before him stood, and bade him to be merry.\n"
"His sleepy yard* in hand he bare upright; *rod <22>\n"
"A hat he wore upon his haires bright.\n"
"Arrayed was this god (as he took keep*) *notice\n"
"As he was when that Argus<23> took his sleep;\n"
"And said him thus: \"To Athens shalt thou wend*; *go\n"
"There is thee shapen* of thy woe an end.\" *fixed, prepared\n"
"And with that word Arcite woke and start.\n"
"\"Now truely how sore that e'er me smart,\"\n"
"Quoth he, \"to Athens right now will I fare.\n"
"Nor for no dread of death shall I not spare\n"
"To see my lady that I love and serve;\n"
"In her presence *I recke not to sterve.*\" *do not care if I die*\n"
"And with that word he caught a great mirror,\n"
"And saw that changed was all his colour,\n"
"And saw his visage all in other kind.\n"
"And right anon it ran him ill his mind,\n"
"That since his face was so disfigur'd\n"
"Of malady the which he had endur'd,\n"
"He mighte well, if that he *bare him low,* *lived in lowly fashion*\n"
"Live in Athenes evermore unknow,\n"
"And see his lady wellnigh day by day.\n"
"And right anon he changed his array,\n"
"And clad him as a poore labourer.\n"
"And all alone, save only a squier,\n"
"That knew his privity* and all his cas**, *secrets **fortune\n"
"Which was disguised poorly as he was,\n"
"To Athens is he gone the nexte* way. *nearest <24>\n"
"And to the court he went upon a day,\n"
"And at the gate he proffer'd his service,\n"
"To drudge and draw, what so men would devise*. *order\n"
"And, shortly of this matter for to sayn,\n"
"He fell in office with a chamberlain,\n"
"The which that dwelling was with Emily.\n"
"For he was wise, and coulde soon espy\n"
"Of every servant which that served her.\n"
"Well could he hewe wood, and water bear,\n"
"For he was young and mighty for the nones*, *occasion\n"
"And thereto he was strong and big of bones\n"
"To do that any wight can him devise.\n"
"\n"
"A year or two he was in this service,\n"
"Page of the chamber of Emily the bright;\n"
"And Philostrate he saide that he hight.\n"
"But half so well belov'd a man as he\n"
"Ne was there never in court of his degree.\n"
"He was so gentle of conditioun,\n"
"That throughout all the court was his renown.\n"
"They saide that it were a charity\n"
"That Theseus would *enhance his degree*, *elevate him in rank*\n"
"And put him in some worshipful service,\n"
"There as he might his virtue exercise.\n"
"And thus within a while his name sprung\n"
"Both of his deedes, and of his good tongue,\n"
"That Theseus hath taken him so near,\n"
"That of his chamber he hath made him squire,\n"
"And gave him gold to maintain his degree;\n"
"And eke men brought him out of his country\n"
"From year to year full privily his rent.\n"
"But honestly and slyly* he it spent, *discreetly, prudently\n"
"That no man wonder'd how that he it had.\n"
"And three year in this wise his life be lad*, *led\n"
"And bare him so in peace and eke in werre*, *war\n"
"There was no man that Theseus had so derre*. *dear\n"
"And in this blisse leave I now Arcite,\n"
"And speak I will of Palamon a lite*. *little\n"
"\n"
"In darkness horrible, and strong prison,\n"
"This seven year hath sitten Palamon,\n"
"Forpined*, what for love, and for distress. *pined, wasted away\n"
"Who feeleth double sorrow and heaviness\n"
"But Palamon? that love distraineth* so, *afflicts\n"
"That wood* out of his wits he went for woe, *mad\n"
"And eke thereto he is a prisonere\n"
"Perpetual, not only for a year.\n"
"Who coulde rhyme in English properly\n"
"His martyrdom? forsooth*, it is not I; *truly\n"
"Therefore I pass as lightly as I may.\n"
"It fell that in the seventh year, in May\n"
"The thirde night (as olde bookes sayn,\n"
"That all this story tellen more plain),\n"
"Were it by a venture or destiny\n"
"(As when a thing is shapen* it shall be), *settled, decreed\n"
"That soon after the midnight, Palamon\n"
"By helping of a friend brake his prison,\n"
"And fled the city fast as he might go,\n"
"For he had given drink his gaoler so\n"
"Of a clary <25>, made of a certain wine,\n"
"With *narcotise and opie* of Thebes fine, *narcotics and opium*\n"
"That all the night, though that men would him shake,\n"
"The gaoler slept, he mighte not awake:\n"
"And thus he fled as fast as ever he may.\n"
"The night was short, and *faste by the day *close at hand was\n"
"That needes cast he must himself to hide*. the day during which\n"
"And to a grove faste there beside he must cast about, or contrive,\n"
"With dreadful foot then stalked Palamon. to conceal himself.*\n"
"For shortly this was his opinion,\n"
"That in the grove he would him hide all day,\n"
"And in the night then would he take his way\n"
"To Thebes-ward, his friendes for to pray\n"
"On Theseus to help him to warray*. *make war <26>\n"
"And shortly either he would lose his life,\n"
"Or winnen Emily unto his wife.\n"
"This is th' effect, and his intention plain.\n"
"\n"
"Now will I turn to Arcita again,\n"
"That little wist how nighe was his care,\n"
"Till that Fortune had brought him in the snare.\n"
"The busy lark, the messenger of day,\n"
"Saluteth in her song the morning gray;\n"
};
void setup() {
int i=0;
uint8_t c;
Serial.begin(115200);
do {
c = pgm_read_byte(knightsTale+i);
if (c) Serial.write(c);
i++;
} while (c);
}
void loop() {
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,26 @@
/*
* This short C progam creates a .elf file with EEPROM contents that
* can be extracted to form a .hex file for testing EEPROM upload/downloads
* via the bootloader.
*
* Compile with:
* avr-gcc -mmcu=atmega328p eeprom_data.c -o eeprom_data.elf
* avr-objcopy -j .eeprom --change-section-lma .eeprom=0 -O ihex eeprom_data.elf eeprom_data.hex
* Upload with:
* avrdude ... -U eeprom:w:eeprom_data.hex
*/
#include <avr/io.h>
#include <avr/eeprom.h>
#define zero16 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
#define zero32 zero16, zero16
const EEMEM unsigned long longs[32] = {0x12345678, 0x9abcdef0, 0x11223344, 0, 0xdeadbeef, zero16, 0xdecade, 0x78563412};
const EEMEM unsigned int integers[64] = {0x1234, 0x5678, 0x9ABC, 0, 0, 0, 1, 2 , zero32, 0xAB90, 0x3412};
const EEMEM char characters[128] = "test 1 2 3 4 5 6 7 8 9 0" " "
"more testing abcdefghijklmnop";
int main() {}

View File

@ -0,0 +1,173 @@
:100000000C9474000C949C000C949C000C949C0028
:100010000C949C000C949C000C949C000C949C00F0
:100020000C949C000C949C000C949C000C949C00E0
:100030000C949C000C949C000C949C000C949C00D0
:100040000C94E7020C949C000C9457030C9431031D
:100050000C949C000C949C000C949C000C949C00B0
:100060000C949C000C949C000000000024002700CD
:100070002A0000000000250028002B0004040404CE
:100080000404040402020202020203030303030342
:10009000010204081020408001020408102001021F
:1000A00004081020746869732069732061207465E6
:1000B0007374206F66206D616B696E672073757253
:1000C000652064617461206D616B657320697420C3
:1000D000696E746F20746865207465787420736528
:1000E000676D656E7400F60311241FBECFEFD8E074
:1000F000DEBFCDBF11E0A0E0B1E0E8EBFAE002C066
:1001000005900D92A231B107D9F721E0A2E1B1E04B
:1001100001C01D92A83BB207E1F710E0C4E7D0E0B0
:1001200004C02197FE010E942304C337D107C9F7F9
:100130000E9489030C942E040C940000FFFFFFFF23
:10014000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF
:10015000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF
:10016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F
:10017000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F
:10018000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F
:10019000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F
:1001A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F
:1001B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F
:1001C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F
:1001D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F
:1001E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F
:1001F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F
:10020000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
:10021000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE
:10022000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE
:10023000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE
:10024000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE
:10025000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE
:10026000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E
:10027000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E
:10028000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E
:10029000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E
:1002A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E
:1002B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E
:1002C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E
:1002D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E
:1002E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E
:1002F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E
:10030000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD
:10031000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED
:10032000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD
:10033000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD
:10034000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD
:10035000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD
:10036000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D
:10037000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D
:10038000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D
:10039000FFFFFFFFFC01538D448D252F30E0842F9C
:1003A00090E0821B930B541710F0CF96089501979D
:1003B0000895FC01918D828D981761F0828DDF0187
:1003C000A80FB11D5D968C91928D9F5F9F73928F48
:1003D00090E008958FEF9FEF0895FC01918D828D3D
:1003E000981731F0828DE80FF11D858D90E008950A
:1003F0008FEF9FEF0895FC01918D228D892F90E062
:10040000805C9F4F821B91098F7399270895FC018F
:10041000848DDF01A80FB11DA35ABF4F2C91848D8D
:1004200090E001968F739927848FA689B7892C93C2
:10043000A089B1898C9180648C93938D848D98135D
:1004400006C00288F389E02D80818F7D8083089526
:10045000EF92FF920F931F93CF93DF93EC0181E014
:10046000888F9B8D8C8D981305C0E889F9898081D0
:1004700085FD24C0F62E0B8D10E00F5F1F4F0F730C
:100480001127E02E8C8DE8120CC00FB607FCFACFB6
:10049000E889F989808185FFF5CFCE010E940702A6
:1004A000F1CF8B8DFE01E80FF11DE35AFF4FF08273
:1004B0000B8FEA89FB898081806207C0EE89FF8902
:1004C0006083E889F98980818064808381E090E09D
:1004D000DF91CF911F910F91FF90EF900895CF93EF
:1004E000DF93EC01888D8823C9F0EA89FB8980813C
:1004F00085FD05C0A889B9898C9186FD0FC00FB60E
:1005000007FCF5CF808185FFF2CFA889B9898C914E
:1005100085FFEDCFCE010E940702E7CFDF91CF919B
:1005200008958BE191E00E94FB0121E0892B09F401
:1005300020E0822F089580E090E0892B29F00E942E
:10054000910281110C9400000895CF92DF92EF92F6
:10055000FF920F931F93CF93DF936C017A018B016E
:10056000C0E0D0E0CE15DF0581F0D8016D918D019E
:10057000D601ED91FC910190F081E02DC601099525
:10058000892B11F02196EECF7E01C701DF91CF912B
:100590001F910F91FF90EF90DF90CF9008950895F5
:1005A00080E090E00895009769F0FC010190002040
:1005B000E9F73197AF01481B590BBC018BE191E082
:1005C0000C94A50280E090E008950E9429041F92F7
:1005D0000F920FB60F9211242F933F938F939F93F7
:1005E000AF93BF938091170190911801A0911901C9
:1005F000B0911A013091160123E0230F2D3720F41A
:100600000196A11DB11D05C026E8230F0296A11D6C
:10061000B11D209316018093170190931801A093A8
:100620001901B0931A018091120190911301A091C8
:100630001401B09115010196A11DB11D8093120105
:1006400090931301A0931401B0931501BF91AF9142
:100650009F918F913F912F910F900FBE0F901F9000
:1006600018951F920F920FB60F9211242F933F935C
:100670004F935F936F937F938F939F93AF93BF93AA
:10068000EF93FF938BE191E00E940702FF91EF91BE
:10069000BF91AF919F918F917F916F915F914F919A
:1006A0003F912F910F900FBE0F901F9018951F92A2
:1006B0000F920FB60F9211242F938F939F93EF9366
:1006C000FF93E0912B01F0912C018081E0913101A9
:1006D000F091320182FD12C09081809134018F5FD0
:1006E0008F7320913501821751F0E0913401F0E0D1
:1006F000E55EFE4F958F8093340101C08081FF91AC
:10070000EF919F918F912F910F900FBE0F901F909F
:100710001895789484B5826084BD84B5816084BD69
:1007200085B5826085BD85B5816085BD80916E008F
:10073000816080936E0010928100809181008260C0
:1007400080938100809181008160809381008091FD
:1007500080008160809380008091B10084608093EC
:10076000B1008091B00081608093B00080917A00E8
:10077000846080937A0080917A00826080937A000E
:1007800080917A00816080937A0080917A008068FD
:1007900080937A001092C100EDE9F0E02491E9E83D
:1007A000F0E08491882399F090E0880F991FFC0174
:1007B000E859FF4FA591B491FC01EE58FF4F859188
:1007C00094918FB7F894EC91E22BEC938FBF84EA6D
:1007D00090E00E94D3028CE391E00E94D3028CE56A
:1007E00098E00E94D3020E949B02FDCFEBE1F1E072
:1007F0001382128288EE93E0A0E0B0E084839583B8
:10080000A683B78384E091E09183808385EC90E0B8
:100810009587848784EC90E09787868780EC90E0CA
:10082000918B808B81EC90E0938B828B82EC90E0BB
:10083000958B848B86EC90E0978B868B118E128E35
:10084000138E148E0895EE0FFF1F0590F491E02D86
:10085000099481E090E0F8940C942E04FFFFFFFFD0
:10086000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98
:10087000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88
:10088000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78
:10089000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68
:1008A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58
:1008B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48
:1008C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38
:1008D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28
:1008E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18
:1008F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08
:10090000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7
:10091000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7
:10092000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7
:10093000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7
:10094000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7
:10095000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7
:10096000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97
:10097000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87
:10098000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77
:10099000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67
:1009A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57
:1009B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47
:1009C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37
:1009D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27
:1009E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17
:1009F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07
:100A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6
:100A1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6
:100A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6
:100A3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6
:100A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6
:100A5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6
:100A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96
:100A7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86
:100A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76
:100A9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66
:100AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56
:020AC800ED013E
:00000001FF

View File

@ -0,0 +1,107 @@
/*
EEPROM test program with more features.
*/
#include <EEPROM.h>
void setup() {
// initialize the LED pin as an output.
pinMode(13, OUTPUT);
Serial.begin(115200);
Serial.println("EEPROM test program.\n"
"Enter one of (C)lear, (E)rase, (I)incrementing, (U)p&Down, (0)check,\n"
"(D)ump, (F)check, (T)inccheck");
}
void hex2(uint8_t n) {
if (n <= 15)
Serial.write('0');
Serial.print(n, HEX);
Serial.write(' ');
}
void print16(uint8_t *buf) {
for (int i = 0; i < 16; i++) {
hex2(buf[i]);
}
Serial.print(" ");
for (int i = 0; i < 16; i++) {
uint8_t c = buf[i];
if (c < 32 || c > 126)
Serial.write('.');
else
Serial.write(c);
}
Serial.println();
}
void dump16(uint16_t addr) {
struct {
uint8_t buf[16];
} s;
EEPROM.get(addr, s);
print16(s.buf);
}
int cmd = -1;
void loop() {
uint16_t i;
do {
cmd = Serial.read();
} while (cmd < 0);
switch (cmd & ~('a' - 'A')) {
case 'C':
for (i = 0 ; i < EEPROM.length() ; i++) {
EEPROM.write(i, 0);
}
break;
case 'D':
Serial.println("EEPROM Dump\n");
for (i = 0; i < EEPROM.length(); i += 16) {
Serial.print(i, HEX);
Serial.print(": ");
dump16(i);
}
Serial.println();
break;
case 'E':
for (i = 0 ; i < EEPROM.length() ; i++) {
EEPROM.write(i, 0xFF);
}
break;
case 'I':
for (i = 0 ; i < EEPROM.length() ; i++) {
EEPROM.write(i, i & 0xFF);
}
break;
case 'U':
for (i = 0 ; i < EEPROM.length() ; i++) {
if ((i & 0x100) == 0) {
EEPROM.write(i, i & 0xFF);
} else {
EEPROM.write(i, 255 - (i & 0xFF));
}
}
break;
case '?':
Serial.println("EEPROM test program.\n"
"Enter one of (C)lear, (E)rase, (I)incrementing, (0)check,\n"
"(D)ump, (F)check, (T)inccheck");
// Fall through
case '\n':
case '\r':
break;
default:
Serial.print("unrecognized command ");
Serial.println(cmd);
break;
// turn the LED on when we're done
digitalWrite(13, HIGH);
}
}

View File

@ -0,0 +1,137 @@
/*
test_reset
May 2015 by Bill Westfield (WestfW)
Released to the public domain.
This sketch demonstrates retrival of the Reset Cause register (MCUSR) of the AVR.
Normally, MCUSR itself is destroyed by the use of a bootloader, but Optiboot v4.6
and later save the contents in register r2, where it can be accessed by an
application.
*/
#include <avr/wdt.h>
#if defined (__AVR_ATmega328P__) || defined (__AVR_ATmega168__)
#include <LowPower.h>
#endif
/*
First, we need a variable to hold the reset cause that can be written before
early sketch initialization (that might change r2), and won't be reset by the
various initialization code.
avr-gcc provides for this via the ".noinit" section.
*/
uint8_t resetFlag __attribute__ ((section(".noinit")));
/*
Next, we need to put some code to save reset cause from the bootload (in r2)
to the variable. Again, avr-gcc provides special code sections for this.
If compiled with link time optimization (-flto), as done by the Arduno
IDE version 1.6 and higher, we need the "used" attribute to prevent this
from being omitted.
*/
void resetFlagsInit(void) __attribute__ ((naked))
__attribute__ ((used))
__attribute__ ((section (".init0")));
void resetFlagsInit(void)
{
/*
save the reset flags passed from the bootloader
This is a "simple" matter of storing (STS) r2 in the special variable
that we have created. We use assembler to access the right variable.
*/
__asm__ __volatile__ ("sts %0, r2\n" : "=m" (resetFlag) :);
}
void printReset(const char *label, uint8_t resetFlags)
{
Serial.print(label);
Serial.print(resetFlags, HEX);
/*
check for the usual bits. Note that the symnbols defined in wdt.h are
bit numbers, so they have to be shifted before comparison.
*/
if (resetFlags & (1 << WDRF))
{
Serial.print(F(" Watchdog"));
resetFlags &= ~(1 << WDRF);
}
if (resetFlags & (1 << BORF))
{
Serial.print(F(" Brownout"));
resetFlags &= ~(1 << BORF);
}
if (resetFlags & (1 << EXTRF))
{
Serial.print(F(" External"));
resetFlags &= ~(1 << EXTRF);
}
if (resetFlags & (1 << PORF))
{
Serial.print(F(" PowerOn"));
resetFlags &= ~(1 << PORF);
}
if (resetFlags != 0x00)
{
// It should never enter here
Serial.print(" Unknown");
}
Serial.println("");
}
void setup() {
Serial.begin(9600); // Initialize serial port
Serial.println(F("Reset flag test\n"));
printReset("Actual MCUSR content: 0x", MCUSR);
printReset("Passed in R2: 0x", resetFlag);
#ifdef GPIOR0
printReset("Passed in GPIOR0: 0x", GPIOR0);
#endif
}
void loop() {
int ch;
Serial.println(F("\nSend 0-9 to set MCUSR, (W)atchdog enable, (J)mp to bootload, (S)leep"));
while ((ch = Serial.read()) < 0) ;
if (ch >= '0' && ch <= '9') {
MCUSR = ch & 0xF;
printReset("\nNew MCUSR content: 0x", MCUSR);
} else
switch (ch & ~('a' - 'A')) {
case 'W':
wdt_enable(WDTO_15MS);
while (1); // To prevent the loop to start again before WDT resets the board
break;
case 'S':
#if defined (__AVR_ATmega328P__) || defined (__AVR_ATmega168__)
// Enter power down state for 8 s with ADC and BOD module disabled
Serial.println(F("Low Power Sleep Mode"));
Serial.flush();
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
Serial.println(F("Sleep Wakeup"));
Serial.flush();
#else
Serial.print(F("\nPower down not supported on this CPU\n"));
#endif
break;
case 'J':
/* Figure out where the bootloader starts. */
#if FLASHEND > 140000
Serial.println(F("Jump to bootloader not supported on chips with >128k memory"));
#else
typedef void (*do_reboot_t)(void);
const do_reboot_t do_reboot = (do_reboot_t)((FLASHEND - 511) >> 1);
Serial.print("bootstart = ");
Serial.println((unsigned int)do_reboot, HEX);
Serial.flush();
cli(); TCCR0A = TCCR1A = TCCR2A = 0; // make sure interrupts are off and timers are reset.
do_reboot();
#endif
break;
}
}

View File

@ -0,0 +1,56 @@
# Template file for generating the .json file that the Arduino IDE
# "Boards Manager" wants to see. This file must be pre-processed
# before it will be valid:
# Strip comments.
# Replace variables:
# %VERSION% gets the Optiboot Version
# %HASH% gets the SHA-256 has for the .zip file.
# (generate with: openssl dgst -sha256 optiboot.zip | sed -e 's/.* //'
# %SIZE% gets the size of the .zip file
#
{
"packages": [
{
"name": "Optiboot",
"maintainer": "westfw",
"websiteURL": "https://github.com/Optiboot/optiboot",
"email": "",
"help": {
"online": ""
},
"platforms": [
{
"name": "Optiboot %VERSION%",
"architecture": "avr",
"version": "0.%VERSION%",
#
# 3r party packages must use "Contributed"
#
"category": "Contributed",
"help": {
"online": "https://github.com/Optiboot/optiboot/wiki"
},
"url": "https://github.com/Optiboot/optiboot/releases/download/v%VERSION%/Optiboot%VERSION%.zip",
"archiveFileName": "optiboot%VERSION%.zip",
#
# Package file verification data
#
"checksum": "SHA-256:%HASH%",
"size": "%SIZE%",
#
"boards": [
{"name": "New Optiboot"}
],
"toolsDependencies": [
{
"packager": "arduino",
"name": "avrdude",
"version": "6.0.1-arduino5"
}
]
}
],
"tools": []
}
]
}

View File

@ -0,0 +1,75 @@
#%/bin/bash
#
# Use like: "sh release.sh <versionno>"
#
# Build a "release" .zip file for Optiboot bootloader
# Run from the build directory
# Uncomment if you want a clean builds of specific files
# make clean
# make atmega328
# make atmega168
# make atmega8
rm -Rf /tmp/optiboot-release
#
# Create the 3rd-party hardware extension directory structure
# Note that the structure under "packages" (handed by boards manager)
# is different than the structure under "sketchbook/hardware" would be.
TOP=/tmp/optiboot-release/Optiboot$1/
#
# Bootloaders directory
mkdir -p $TOP/bootloaders/optiboot
# cores, variants, libraries
# mkdir -p $TOP/variants/
mkdir -p $TOP/libraries/
# Less common: firmware, system.
# mkdir -p $TOP/firmwares/
# mkdir -p $TOP/system/
#
# Copy files from whereever into the release directory
cp ../../boards-1.6.txt $TOP/boards.txt
#cp -R ../../examples $TOP/libraries/
#cp -R ../../variants $TOP/
#cp -R ../../system $TOP/
#
# Create platform.txt, because it contains the "group" name for the boards menu
echo name=Optiboot $1 > $TOP/platform.txt
echo version=$1 >> $TOP/platform.txt
#
# Create a README file.
echo This is an Optiboot version $1 \"Binary\" Release. > $TOP/README.TXT
echo >> $TOP/README.TXT
echo For Source code see http://github.com/Optiboot/optiboot>> $TOP/README.TXT
#
# Copy over our "binaries."
cp *.hex $TOP/bootloaders/optiboot
#
# Copy examples ? (examples for a boards.txt don't seem possible?)
# files we'd specifical exclude, if we weren't doing only .hex files.
#rm /tmp/optiboot-release/Optiboot/avr/bootloaders/optiboot/*.lst
#rm /tmp/optiboot-release/Optiboot/avr/bootloaders/optiboot/*~
#rm /tmp/optiboot-release/Optiboot/avr/bootloaders/optiboot/#*
#
# zip everything up.
pushd /tmp/optiboot-release
zip -r Optiboot$1.zip Optiboot$1
HASH=`openssl dgst -sha256 Optiboot$1.zip | sed -e 's/.* //'`
SIZE=`stat -f %z Optiboot$1.zip`
popd
sed -e "s/#.*//" -e "s/%HASH%/$HASH/g" -e "s/%VERSION%/$1/g" -e "s/%SIZE%/$SIZE/g" ../../package_optiboot_optiboot-additional_index.json.TEMPLATE > /tmp/optiboot-release/package_optiboot_optiboot-additional_index.json
#
# This leaves the .zip and the .json file in /tmp/optiboot-release
# where it can be copied to a suitable network location.

View File

@ -0,0 +1,113 @@
#!/usr/bin/env bash
LOCAL_TOOLS_DIR=$HOME/avr-tools
MAKE_PACKAGE=make_4.1-6_amd64.deb
WGET_FLAGS="--retry-connrefused --tries=3 --timeout=60 --continue"
if [ -z "$TRAVIS_BUILD_DIR" ]; then
echo "This script should be run by Travis-CI environment"
echo "If you want to simulate Travis build, please set TRAVIS_BUILD_DIR"
echo "envirinment variable to directory where your code lives"
exit 1
fi
if [ -z "$1" ]; then
echo "Arduino version required"
exit 1
fi
if [ -z "$2" ]; then
echo "Target required"
exit 1
fi
# oownload and unpack package
function download_and_unpack()
{
cd $LOCAL_TOOLS_DIR
# check if tools are already in place
if [ -d arduino-$1/hardware/tools/avr ]; then
echo "Arduino version $1 already downloaded and extracted, skipping"
return
fi
echo "Downloading Arduino version $1"
# default package extension
local arduExt="tar.xz"
# for packages in version <1.6 extension is .tgz
local regex="1\.[05]"
if [[ "$1" =~ $regex ]]; then arduExt="tgz"; fi
# download package
wget $WGET_FLAGS "http://downloads.arduino.cc/arduino-$1-linux64.$arduExt"
if [ $? -ne 0 ]; then
echo "ERROR: Can't download Arduino"
rm arduino-$1-linux64.$arduExt*
exit 1
fi
# try to check md5sum, but Arduino provide only checksums for version 1.6 and greater
wget $WGET_FLAGS https://downloads.arduino.cc/arduino-$1.md5sum.txt
if [ $? -eq -0 ]; then
cat arduino-$1.md5sum.txt|grep "linux64"|md5sum -c
if [ $? -ne 0 ]; then
echo "ERROR: md5sum for downloaded Arduino doesn't match"
rm arduino-$1.md5sum.txt*
exit 1
fi
rm arduino-$1.md5sum.txt*
fi
# extract only avr-gcc
tar xf arduino-$1-linux64.$arduExt --wildcards '*/hardware/tools/avr/'
# clean up
rm arduino-$1-linux64.$arduExt*
}
function get_make4()
{
cd $LOCAL_TOOLS_DIR
# check for existence
if [ -x usr/bin/make ]; then
echo "Make already in place, skipping"
return
fi
# download
wget http://archive.ubuntu.com/ubuntu/pool/main/m/make-dfsg/$MAKE_PACKAGE
if [ $? -ne 0 ]; then
echo "ERROR: Can't download make4"
exit 1
fi
# unpack
dpkg-deb -x $MAKE_PACKAGE $LOCAL_TOOLS_DIR
# clean up
rm ${MAKE_PACKAGE}*
}
# make directory for tools
mkdir -p $LOCAL_TOOLS_DIR
# get new make as Optiboot requires version >4.0
get_make4
# download specific Arduino version
download_and_unpack $1
# set search path
PATH=$LOCAL_TOOLS_DIR/usr/bin:$PATH:$LOCAL_TOOLS_DIR/arduino-$1/hardware/tools/avr/bin
cd $TRAVIS_BUILD_DIR/optiboot/bootloaders/optiboot
make --version
make clean
make $2