parent
3e379f0ead
commit
3352844efd
@ -1,89 +1,6 @@
|
|||||||
# Marlin 3D Printer Firmware
|
# Marlin 3D Printer Firmware
|
||||||
|
![Marlin logo](https://git.trov.ar/trovar/marlin-anet-a8/raw/branch/main/buildroot/share/pixmaps/logo/marlin-250.png)
|
||||||
|
|
||||||
![GitHub](https://img.shields.io/github/license/marlinfirmware/marlin.svg)
|
## Usage instructions
|
||||||
![GitHub contributors](https://img.shields.io/github/contributors/marlinfirmware/marlin.svg)
|
|
||||||
![GitHub Release Date](https://img.shields.io/github/release-date/marlinfirmware/marlin.svg)
|
|
||||||
[![Build Status](https://github.com/MarlinFirmware/Marlin/workflows/CI/badge.svg?branch=bugfix-2.0.x)](https://github.com/MarlinFirmware/Marlin/actions)
|
|
||||||
|
|
||||||
<img align="right" width=175 src="buildroot/share/pixmaps/logo/marlin-250.png" />
|
1. Install Anet board definition for Arduino IDE from `./anet-board` ([Source](https://github.com/SkyNet3D/anet-board))
|
||||||
|
|
||||||
Additional documentation can be found at the [Marlin Home Page](https://marlinfw.org/).
|
|
||||||
Please test this firmware and let us know if it misbehaves in any way. Volunteers are standing by!
|
|
||||||
|
|
||||||
## Marlin 2.0
|
|
||||||
|
|
||||||
Marlin 2.0 takes this popular RepRap firmware to the next level by adding support for much faster 32-bit and ARM-based boards while improving support for 8-bit AVR boards. Read about Marlin's decision to use a "Hardware Abstraction Layer" below.
|
|
||||||
|
|
||||||
Download earlier versions of Marlin on the [Releases page](https://github.com/MarlinFirmware/Marlin/releases).
|
|
||||||
|
|
||||||
## Example Configurations
|
|
||||||
|
|
||||||
Before building Marlin you'll need to configure it for your specific hardware. Your vendor should have already provided source code with configurations for the installed firmware, but if you ever decide to upgrade you'll need updated configuration files. Marlin users have contributed dozens of tested example configurations to get you started. Visit the [MarlinFirmware/Configurations](https://github.com/MarlinFirmware/Configurations) repository to find the right configuration for your hardware.
|
|
||||||
|
|
||||||
## Building Marlin 2.0
|
|
||||||
|
|
||||||
To build Marlin 2.0 you'll need [Arduino IDE 1.8.8 or newer](https://www.arduino.cc/en/main/software) or [PlatformIO](http://docs.platformio.org/en/latest/ide.html#platformio-ide). Detailed build and install instructions are posted at:
|
|
||||||
|
|
||||||
- [Installing Marlin (Arduino)](http://marlinfw.org/docs/basics/install_arduino.html)
|
|
||||||
- [Installing Marlin (VSCode)](http://marlinfw.org/docs/basics/install_platformio_vscode.html).
|
|
||||||
|
|
||||||
### Supported Platforms
|
|
||||||
|
|
||||||
Platform|MCU|Example Boards
|
|
||||||
--------|---|-------
|
|
||||||
[Arduino AVR](https://www.arduino.cc/)|ATmega|RAMPS, Melzi, RAMBo
|
|
||||||
[Teensy++ 2.0](http://www.microchip.com/wwwproducts/en/AT90USB1286)|AT90USB1286|Printrboard
|
|
||||||
[Arduino Due](https://www.arduino.cc/en/Guide/ArduinoDue)|SAM3X8E|RAMPS-FD, RADDS, RAMPS4DUE
|
|
||||||
[ESP32](https://github.com/espressif/arduino-esp32)|ESP32|FYSETC E4, E4d@BOX, MRR
|
|
||||||
[LPC1768](http://www.nxp.com/products/microcontrollers-and-processors/arm-based-processors-and-mcus/lpc-cortex-m-mcus/lpc1700-cortex-m3/512kb-flash-64kb-sram-ethernet-usb-lqfp100-package:LPC1768FBD100)|ARM® Cortex-M3|MKS SBASE, Re-ARM, Selena Compact
|
|
||||||
[LPC1769](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/lpc1700-cortex-m3/512kb-flash-64kb-sram-ethernet-usb-lqfp100-package:LPC1769FBD100)|ARM® Cortex-M3|Smoothieboard, Azteeg X5 mini, TH3D EZBoard
|
|
||||||
[STM32F103](https://www.st.com/en/microcontrollers-microprocessors/stm32f103.html)|ARM® Cortex-M3|Malyan M200, GTM32 Pro, MKS Robin, BTT SKR Mini
|
|
||||||
[STM32F401](https://www.st.com/en/microcontrollers-microprocessors/stm32f401.html)|ARM® Cortex-M4|ARMED, Rumba32, SKR Pro, Lerdge, FYSETC S6
|
|
||||||
[STM32F7x6](https://www.st.com/en/microcontrollers-microprocessors/stm32f7x6.html)|ARM® Cortex-M7|The Borg, RemRam V1
|
|
||||||
[SAMD51P20A](https://www.adafruit.com/product/4064)|ARM® Cortex-M4|Adafruit Grand Central M4
|
|
||||||
[Teensy 3.5](https://www.pjrc.com/store/teensy35.html)|ARM® Cortex-M4|
|
|
||||||
[Teensy 3.6](https://www.pjrc.com/store/teensy36.html)|ARM® Cortex-M4|
|
|
||||||
[Teensy 4.0](https://www.pjrc.com/store/teensy40.html)|ARM® Cortex-M7|
|
|
||||||
[Teensy 4.1](https://www.pjrc.com/store/teensy41.html)|ARM® Cortex-M7|
|
|
||||||
Linux Native|x86/ARM/etc.|Raspberry Pi
|
|
||||||
|
|
||||||
## Submitting Changes
|
|
||||||
|
|
||||||
- Submit **Bug Fixes** as Pull Requests to the ([bugfix-2.0.x](https://github.com/MarlinFirmware/Marlin/tree/bugfix-2.0.x)) branch.
|
|
||||||
- Follow the [Coding Standards](http://marlinfw.org/docs/development/coding_standards.html) to gain points with the maintainers.
|
|
||||||
- Please submit your questions and concerns to the [Issue Queue](https://github.com/MarlinFirmware/Marlin/issues).
|
|
||||||
|
|
||||||
## Marlin Support
|
|
||||||
|
|
||||||
The Issue Queue is reserved for Bug Reports and Feature Requests. To get help with configuration and troubleshooting, please use the following resources:
|
|
||||||
|
|
||||||
- [Marlin Documentation](http://marlinfw.org) - Official Marlin documentation
|
|
||||||
- [Marlin Discord](https://discord.gg/n5NJ59y) - Discuss issues with Marlin users and developers
|
|
||||||
- Facebook Group ["Marlin Firmware"](https://www.facebook.com/groups/1049718498464482/)
|
|
||||||
- RepRap.org [Marlin Forum](http://forums.reprap.org/list.php?415)
|
|
||||||
- Facebook Group ["Marlin Firmware for 3D Printers"](https://www.facebook.com/groups/3Dtechtalk/)
|
|
||||||
- [Marlin Configuration](https://www.youtube.com/results?search_query=marlin+configuration) on YouTube
|
|
||||||
|
|
||||||
## Contributors
|
|
||||||
|
|
||||||
Marlin is constantly improving thanks to a huge number of contributors from all over the world bringing their specialties and talents. Huge thanks are due to [all the contributors](https://github.com/MarlinFirmware/Marlin/graphs/contributors) who regularly patch up bugs, help direct traffic, and basically keep Marlin from falling apart. Marlin's continued existence would not be possible without them.
|
|
||||||
|
|
||||||
## Administration
|
|
||||||
|
|
||||||
Regular users can open and close their own issues, but only the administrators can do project-related things like add labels, merge changes, set milestones, and kick trolls. The current Marlin admin team consists of:
|
|
||||||
|
|
||||||
- Scott Lahteine [[@thinkyhead](https://github.com/thinkyhead)] - USA - Project Maintainer [![Donate](https://api.flattr.com/button/flattr-badge-large.png)](http://www.thinkyhead.com/donate-to-marlin)
|
|
||||||
- Roxanne Neufeld [[@Roxy-3D](https://github.com/Roxy-3D)] - USA
|
|
||||||
- Keith Bennett [[@thisiskeithb](https://github.com/thisiskeithb)] - USA
|
|
||||||
- Victor Oliveira [[@rhapsodyv](https://github.com/rhapsodyv)] - Brazil
|
|
||||||
- Chris Pepper [[@p3p](https://github.com/p3p)] - UK
|
|
||||||
- Jason Smith [[@sjasonsmith](https://github.com/sjasonsmith)] - USA
|
|
||||||
- Luu Lac [[@shitcreek](https://github.com/shitcreek)] - USA
|
|
||||||
- Bob Kuhn [[@Bob-the-Kuhn](https://github.com/Bob-the-Kuhn)] - USA
|
|
||||||
- Erik van der Zalm [[@ErikZalm](https://github.com/ErikZalm)] - Netherlands [![Flattr Erik](https://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=ErikZalm&url=https://github.com/MarlinFirmware/Marlin&title=Marlin&language=&tags=github&category=software)
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
Marlin is published under the [GPL license](/LICENSE) because we believe in open development. The GPL comes with both rights and obligations. Whether you use Marlin firmware as the driver for your open or closed-source product, you must keep Marlin open, and you must provide your compatible Marlin source code to end users upon request. The most straightforward way to comply with the Marlin license is to make a fork of Marlin on Github, perform your modifications, and direct users to your modified fork.
|
|
||||||
|
|
||||||
While we can't prevent the use of this code in products (3D printers, CNC, etc.) that are closed source or crippled by a patent, we would prefer that you choose another firmware or, better yet, make your own.
|
|
||||||
|
@ -0,0 +1,89 @@
|
|||||||
|
# Marlin 3D Printer Firmware
|
||||||
|
|
||||||
|
![GitHub](https://img.shields.io/github/license/marlinfirmware/marlin.svg)
|
||||||
|
![GitHub contributors](https://img.shields.io/github/contributors/marlinfirmware/marlin.svg)
|
||||||
|
![GitHub Release Date](https://img.shields.io/github/release-date/marlinfirmware/marlin.svg)
|
||||||
|
[![Build Status](https://github.com/MarlinFirmware/Marlin/workflows/CI/badge.svg?branch=bugfix-2.0.x)](https://github.com/MarlinFirmware/Marlin/actions)
|
||||||
|
|
||||||
|
<img align="right" width=175 src="buildroot/share/pixmaps/logo/marlin-250.png" />
|
||||||
|
|
||||||
|
Additional documentation can be found at the [Marlin Home Page](https://marlinfw.org/).
|
||||||
|
Please test this firmware and let us know if it misbehaves in any way. Volunteers are standing by!
|
||||||
|
|
||||||
|
## Marlin 2.0
|
||||||
|
|
||||||
|
Marlin 2.0 takes this popular RepRap firmware to the next level by adding support for much faster 32-bit and ARM-based boards while improving support for 8-bit AVR boards. Read about Marlin's decision to use a "Hardware Abstraction Layer" below.
|
||||||
|
|
||||||
|
Download earlier versions of Marlin on the [Releases page](https://github.com/MarlinFirmware/Marlin/releases).
|
||||||
|
|
||||||
|
## Example Configurations
|
||||||
|
|
||||||
|
Before building Marlin you'll need to configure it for your specific hardware. Your vendor should have already provided source code with configurations for the installed firmware, but if you ever decide to upgrade you'll need updated configuration files. Marlin users have contributed dozens of tested example configurations to get you started. Visit the [MarlinFirmware/Configurations](https://github.com/MarlinFirmware/Configurations) repository to find the right configuration for your hardware.
|
||||||
|
|
||||||
|
## Building Marlin 2.0
|
||||||
|
|
||||||
|
To build Marlin 2.0 you'll need [Arduino IDE 1.8.8 or newer](https://www.arduino.cc/en/main/software) or [PlatformIO](http://docs.platformio.org/en/latest/ide.html#platformio-ide). Detailed build and install instructions are posted at:
|
||||||
|
|
||||||
|
- [Installing Marlin (Arduino)](http://marlinfw.org/docs/basics/install_arduino.html)
|
||||||
|
- [Installing Marlin (VSCode)](http://marlinfw.org/docs/basics/install_platformio_vscode.html).
|
||||||
|
|
||||||
|
### Supported Platforms
|
||||||
|
|
||||||
|
Platform|MCU|Example Boards
|
||||||
|
--------|---|-------
|
||||||
|
[Arduino AVR](https://www.arduino.cc/)|ATmega|RAMPS, Melzi, RAMBo
|
||||||
|
[Teensy++ 2.0](http://www.microchip.com/wwwproducts/en/AT90USB1286)|AT90USB1286|Printrboard
|
||||||
|
[Arduino Due](https://www.arduino.cc/en/Guide/ArduinoDue)|SAM3X8E|RAMPS-FD, RADDS, RAMPS4DUE
|
||||||
|
[ESP32](https://github.com/espressif/arduino-esp32)|ESP32|FYSETC E4, E4d@BOX, MRR
|
||||||
|
[LPC1768](http://www.nxp.com/products/microcontrollers-and-processors/arm-based-processors-and-mcus/lpc-cortex-m-mcus/lpc1700-cortex-m3/512kb-flash-64kb-sram-ethernet-usb-lqfp100-package:LPC1768FBD100)|ARM® Cortex-M3|MKS SBASE, Re-ARM, Selena Compact
|
||||||
|
[LPC1769](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/lpc1700-cortex-m3/512kb-flash-64kb-sram-ethernet-usb-lqfp100-package:LPC1769FBD100)|ARM® Cortex-M3|Smoothieboard, Azteeg X5 mini, TH3D EZBoard
|
||||||
|
[STM32F103](https://www.st.com/en/microcontrollers-microprocessors/stm32f103.html)|ARM® Cortex-M3|Malyan M200, GTM32 Pro, MKS Robin, BTT SKR Mini
|
||||||
|
[STM32F401](https://www.st.com/en/microcontrollers-microprocessors/stm32f401.html)|ARM® Cortex-M4|ARMED, Rumba32, SKR Pro, Lerdge, FYSETC S6
|
||||||
|
[STM32F7x6](https://www.st.com/en/microcontrollers-microprocessors/stm32f7x6.html)|ARM® Cortex-M7|The Borg, RemRam V1
|
||||||
|
[SAMD51P20A](https://www.adafruit.com/product/4064)|ARM® Cortex-M4|Adafruit Grand Central M4
|
||||||
|
[Teensy 3.5](https://www.pjrc.com/store/teensy35.html)|ARM® Cortex-M4|
|
||||||
|
[Teensy 3.6](https://www.pjrc.com/store/teensy36.html)|ARM® Cortex-M4|
|
||||||
|
[Teensy 4.0](https://www.pjrc.com/store/teensy40.html)|ARM® Cortex-M7|
|
||||||
|
[Teensy 4.1](https://www.pjrc.com/store/teensy41.html)|ARM® Cortex-M7|
|
||||||
|
Linux Native|x86/ARM/etc.|Raspberry Pi
|
||||||
|
|
||||||
|
## Submitting Changes
|
||||||
|
|
||||||
|
- Submit **Bug Fixes** as Pull Requests to the ([bugfix-2.0.x](https://github.com/MarlinFirmware/Marlin/tree/bugfix-2.0.x)) branch.
|
||||||
|
- Follow the [Coding Standards](http://marlinfw.org/docs/development/coding_standards.html) to gain points with the maintainers.
|
||||||
|
- Please submit your questions and concerns to the [Issue Queue](https://github.com/MarlinFirmware/Marlin/issues).
|
||||||
|
|
||||||
|
## Marlin Support
|
||||||
|
|
||||||
|
The Issue Queue is reserved for Bug Reports and Feature Requests. To get help with configuration and troubleshooting, please use the following resources:
|
||||||
|
|
||||||
|
- [Marlin Documentation](http://marlinfw.org) - Official Marlin documentation
|
||||||
|
- [Marlin Discord](https://discord.gg/n5NJ59y) - Discuss issues with Marlin users and developers
|
||||||
|
- Facebook Group ["Marlin Firmware"](https://www.facebook.com/groups/1049718498464482/)
|
||||||
|
- RepRap.org [Marlin Forum](http://forums.reprap.org/list.php?415)
|
||||||
|
- Facebook Group ["Marlin Firmware for 3D Printers"](https://www.facebook.com/groups/3Dtechtalk/)
|
||||||
|
- [Marlin Configuration](https://www.youtube.com/results?search_query=marlin+configuration) on YouTube
|
||||||
|
|
||||||
|
## Contributors
|
||||||
|
|
||||||
|
Marlin is constantly improving thanks to a huge number of contributors from all over the world bringing their specialties and talents. Huge thanks are due to [all the contributors](https://github.com/MarlinFirmware/Marlin/graphs/contributors) who regularly patch up bugs, help direct traffic, and basically keep Marlin from falling apart. Marlin's continued existence would not be possible without them.
|
||||||
|
|
||||||
|
## Administration
|
||||||
|
|
||||||
|
Regular users can open and close their own issues, but only the administrators can do project-related things like add labels, merge changes, set milestones, and kick trolls. The current Marlin admin team consists of:
|
||||||
|
|
||||||
|
- Scott Lahteine [[@thinkyhead](https://github.com/thinkyhead)] - USA - Project Maintainer [![Donate](https://api.flattr.com/button/flattr-badge-large.png)](http://www.thinkyhead.com/donate-to-marlin)
|
||||||
|
- Roxanne Neufeld [[@Roxy-3D](https://github.com/Roxy-3D)] - USA
|
||||||
|
- Keith Bennett [[@thisiskeithb](https://github.com/thisiskeithb)] - USA
|
||||||
|
- Victor Oliveira [[@rhapsodyv](https://github.com/rhapsodyv)] - Brazil
|
||||||
|
- Chris Pepper [[@p3p](https://github.com/p3p)] - UK
|
||||||
|
- Jason Smith [[@sjasonsmith](https://github.com/sjasonsmith)] - USA
|
||||||
|
- Luu Lac [[@shitcreek](https://github.com/shitcreek)] - USA
|
||||||
|
- Bob Kuhn [[@Bob-the-Kuhn](https://github.com/Bob-the-Kuhn)] - USA
|
||||||
|
- Erik van der Zalm [[@ErikZalm](https://github.com/ErikZalm)] - Netherlands [![Flattr Erik](https://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=ErikZalm&url=https://github.com/MarlinFirmware/Marlin&title=Marlin&language=&tags=github&category=software)
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Marlin is published under the [GPL license](/LICENSE) because we believe in open development. The GPL comes with both rights and obligations. Whether you use Marlin firmware as the driver for your open or closed-source product, you must keep Marlin open, and you must provide your compatible Marlin source code to end users upon request. The most straightforward way to comply with the Marlin license is to make a fork of Marlin on Github, perform your modifications, and direct users to your modified fork.
|
||||||
|
|
||||||
|
While we can't prevent the use of this code in products (3D printers, CNC, etc.) that are closed source or crippled by a patent, we would prefer that you choose another firmware or, better yet, make your own.
|
@ -0,0 +1,43 @@
|
|||||||
|
# Introduction
|
||||||
|
This project provides a board definition which enables the Arduino IDE to compile firmware (such as Marlin) for Anet 3D printers. It is used in the SkyNet3D Marlin distribution for Anet printers, but can be used independently to, for example, build Marlin from source.
|
||||||
|
|
||||||
|
## Installation Instructions
|
||||||
|
Copy the included 'anet' folder into the 'hardware' folder of your Arduino installation.
|
||||||
|
|
||||||
|
1. Download the most recent version from the 1.8.x branch of the Arduino IDE from
|
||||||
|
https://www.arduino.cc/en/main/software
|
||||||
|
2. Download a zip file of the master branch of this project using the 'Clone or Download' button
|
||||||
|
3. Install the Arduino IDE using the default options
|
||||||
|
|
||||||
|
Then:
|
||||||
|
|
||||||
|
#### Windows
|
||||||
|
4. Open your `Documents` folder in Windows Explorer
|
||||||
|
5. Open the `Arduino` folder, then the `hardware` sub-folder. If neither of these folders exist, create them.
|
||||||
|
6. Open the anet-board zip file you downloaded in step 2 and copy the 'anet' folder into `Documents\Arduino\hardware`
|
||||||
|
|
||||||
|
#### OS X
|
||||||
|
4. Click on "Documents" in Finder and look for the `Arduino` directory inside it. The full path is `~/Documents/Arduino/hardware`
|
||||||
|
5. Open the anet-board zip file you downloaded in step 2 and copy the 'anet' folder into `~/Documents/Arduino/hardware`
|
||||||
|
|
||||||
|
## Using the Board Definition
|
||||||
|
1. Open the Arduino IDE
|
||||||
|
2. Open the Tools->Board menu and select either of the Anet V1.0 boards
|
||||||
|
3. Open the Tools->Port menu and select the appropiate COM port (the one which appeared when you plugged your printer into a USB port)
|
||||||
|
|
||||||
|
**Note:** The Optiboot board option is highly recommended as the Optiboot bootloader uses much less space than the standard Atmega 1284p bootloader, allowing more flash space for the firmware. If you choose to use the Optiboot option you **MUST** burn the Optiboot bootloader before uploading firmware, otherwise you risk overwriting the bootloader.
|
||||||
|
|
||||||
|
When uploading firmware, use Sketch->Upload (Ctrl+U), which uploads over the USB connection, **not** Sketch->Upload Using Programmer (unless you're actually using an Arduino programmer and know what you're doing).
|
||||||
|
|
||||||
|
## Burning the Bootloader
|
||||||
|
Burning the bootloader to the board requires either an Arduino programmed as an ISP, or a USBasp. The programmer is connected to the middle six pins of the J3 connector on the Anet v1.0 board.
|
||||||
|
|
||||||
|
Burning the bootloader to an Arduino always erases the flash memory. Once the bootloader has been burned using a programmer the programmer should be disconnected and firmware uploaded using the serial-over-USB connection.
|
||||||
|
|
||||||
|
With the programmer connected:
|
||||||
|
1. Launch the Arduino IDE
|
||||||
|
2. Select the appropriate board from the Tools->Boards menu - either `Anet V1.0` or `Anet V1.0 (Optiboot)`
|
||||||
|
3. Click Tools -> Burn Bootloader
|
||||||
|
4. The board will reset when complete, and the LCD display will be blank
|
||||||
|
|
||||||
|
Assuming there were no errors, at this point the firmware has been erased and will need to be re-uploaded. The programmer should be disconnected.
|
@ -0,0 +1,57 @@
|
|||||||
|
# See: https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5---3rd-party-Hardware-specification
|
||||||
|
# See: http://code.google.com/p/arduino/wiki/Platforms
|
||||||
|
|
||||||
|
##############################################################
|
||||||
|
|
||||||
|
menu.cpu=Processor
|
||||||
|
|
||||||
|
########################################
|
||||||
|
## Anet V1 (sanguino clone) -
|
||||||
|
########################################
|
||||||
|
anet.name=Anet V1.0
|
||||||
|
|
||||||
|
anet.upload.tool=arduino:avrdude
|
||||||
|
anet.upload.protocol=arduino
|
||||||
|
anet.upload.maximum_size=126976
|
||||||
|
anet.upload.speed=57600
|
||||||
|
|
||||||
|
anet.bootloader.low_fuses=0xD6
|
||||||
|
anet.bootloader.high_fuses=0xDA
|
||||||
|
anet.bootloader.extended_fuses=0xFD
|
||||||
|
anet.bootloader.unlock_bits=0x3F
|
||||||
|
anet.bootloader.lock_bits=0x0F
|
||||||
|
|
||||||
|
anet.build.mcu=atmega1284p
|
||||||
|
anet.build.f_cpu=16000000L
|
||||||
|
anet.build.board=AVR_SANGUINO
|
||||||
|
anet.build.core=arduino:arduino
|
||||||
|
anet.build.variant=sanguino
|
||||||
|
|
||||||
|
anet.bootloader.file=atmega/ATmegaBOOT_168_atmega1284p.hex
|
||||||
|
anet.bootloader.tool=avrdude
|
||||||
|
|
||||||
|
###########################################
|
||||||
|
## Anet V1 with Optiboot bootloader
|
||||||
|
###########################################
|
||||||
|
aneto.name=Anet V1.0 (Optiboot)
|
||||||
|
|
||||||
|
aneto.upload.tool=arduino:avrdude
|
||||||
|
aneto.upload.protocol=arduino
|
||||||
|
aneto.upload.maximum_size=130048
|
||||||
|
aneto.upload.speed=115200
|
||||||
|
|
||||||
|
aneto.bootloader.low_fuses=0xD6
|
||||||
|
aneto.bootloader.high_fuses=0xDE
|
||||||
|
aneto.bootloader.extended_fuses=0xFD
|
||||||
|
aneto.bootloader.unlock_bits=0x3F
|
||||||
|
aneto.bootloader.lock_bits=0x0F
|
||||||
|
|
||||||
|
aneto.build.mcu=atmega1284p
|
||||||
|
aneto.build.f_cpu=16000000L
|
||||||
|
aneto.build.board=AVR_SANGUINO
|
||||||
|
aneto.build.core=arduino:arduino
|
||||||
|
aneto.build.variant=sanguino
|
||||||
|
|
||||||
|
aneto.bootloader.file=atmega/optiboot_atmega1284p.hex
|
||||||
|
aneto.bootloader.tool=avrdude
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,489 @@
|
|||||||
|
# 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...
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# enter the parameters for the avrdude isp tool
|
||||||
|
ISPTOOL = avrisp
|
||||||
|
ISPPORT = /dev/ttyUSB0
|
||||||
|
ISPSPEED = -b 19200
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
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.
|
||||||
|
TOOLROOT = ../../../tools
|
||||||
|
GCCROOT = $(TOOLROOT)/avr/bin/
|
||||||
|
AVRDUDE_CONF = -C$(TOOLROOT)/avr/etc/avrdude.conf
|
||||||
|
|
||||||
|
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
|
||||||
|
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 = /usr/local/avr/bin/
|
||||||
|
AVRDUDE_CONF =
|
||||||
|
AVRDUDE_ROOT = /usr/local/bin/
|
||||||
|
endif
|
||||||
|
#
|
||||||
|
# End of build environment code.
|
||||||
|
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
ISPFUSES = $(AVRDUDE_ROOT)avrdude $(AVRDUDE_CONF) -c $(ISPTOOL) \
|
||||||
|
-p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) \
|
||||||
|
-e -u -U lock:w:0x3f:m -U efuse:w:0x$(EFUSE):m \
|
||||||
|
-U hfuse:w:0x$(HFUSE):m -U lfuse:w:0x$(LFUSE):m
|
||||||
|
ISPFLASH = $(AVRDUDE_ROOT)avrdude $(AVRDUDE_CONF) -c $(ISPTOOL) \
|
||||||
|
-p $(MCU_TARGET) -P $(ISPPORT) $(ISPSPEED) -V \
|
||||||
|
-U flash:w:$(PROGRAM)_$(TARGET).hex -U lock:w:0x2f:m
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
OBJ = $(PROGRAM).o
|
||||||
|
OPTIMIZE = -Os -fno-inline-small-functions -fno-split-wide-types -mshort-calls
|
||||||
|
|
||||||
|
DEFS =
|
||||||
|
LIBS =
|
||||||
|
|
||||||
|
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 -Wl,--gc-sections -nostartfiles -nostdlib
|
||||||
|
|
||||||
|
OBJCOPY = $(GCCROOT)avr-objcopy
|
||||||
|
OBJDUMP = $(call fixpath,$(GCCROOT)avr-objdump)
|
||||||
|
|
||||||
|
SIZE = $(GCCROOT)avr-size
|
||||||
|
|
||||||
|
# Test platforms
|
||||||
|
# Virtual boot block test
|
||||||
|
virboot328: TARGET = atmega328
|
||||||
|
virboot328: MCU_TARGET = atmega328p
|
||||||
|
virboot328: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' '-DVIRTUAL_BOOT'
|
||||||
|
virboot328: AVR_FREQ = 16000000L
|
||||||
|
virboot328: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe
|
||||||
|
virboot328: $(PROGRAM)_atmega328.hex
|
||||||
|
virboot328: $(PROGRAM)_atmega328.lst
|
||||||
|
|
||||||
|
# 20MHz clocked platforms
|
||||||
|
#
|
||||||
|
# These are capable of 230400 baud, or 115200 baud on PC (Arduino Avrdude issue)
|
||||||
|
#
|
||||||
|
|
||||||
|
pro20: TARGET = pro_20mhz
|
||||||
|
pro20: MCU_TARGET = atmega168
|
||||||
|
pro20: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
|
||||||
|
pro20: AVR_FREQ = 20000000L
|
||||||
|
pro20: $(PROGRAM)_pro_20mhz.hex
|
||||||
|
pro20: $(PROGRAM)_pro_20mhz.lst
|
||||||
|
|
||||||
|
pro20_isp: pro20
|
||||||
|
pro20_isp: TARGET = pro_20mhz
|
||||||
|
# 2.7V brownout
|
||||||
|
pro20_isp: HFUSE = DD
|
||||||
|
# Full swing xtal (20MHz) 258CK/14CK+4.1ms
|
||||||
|
pro20_isp: LFUSE = C6
|
||||||
|
# 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: MCU_TARGET = atmega168
|
||||||
|
pro16: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
|
||||||
|
pro16: AVR_FREQ = 16000000L
|
||||||
|
pro16: $(PROGRAM)_pro_16MHz.hex
|
||||||
|
pro16: $(PROGRAM)_pro_16MHz.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 = C6
|
||||||
|
# 512 byte boot
|
||||||
|
pro16_isp: EFUSE = 04
|
||||||
|
pro16_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
|
||||||
|
#
|
||||||
|
atmega168: TARGET = atmega168
|
||||||
|
atmega168: MCU_TARGET = atmega168
|
||||||
|
atmega168: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
|
||||||
|
atmega168: AVR_FREQ = 16000000L
|
||||||
|
atmega168: $(PROGRAM)_atmega168.hex
|
||||||
|
atmega168: $(PROGRAM)_atmega168.lst
|
||||||
|
|
||||||
|
atmega168_isp: atmega168
|
||||||
|
atmega168_isp: TARGET = atmega168
|
||||||
|
# 2.7V brownout
|
||||||
|
atmega168_isp: HFUSE = DD
|
||||||
|
# Low power xtal (16MHz) 16KCK/14CK+65ms
|
||||||
|
atmega168_isp: LFUSE = FF
|
||||||
|
# 512 byte boot
|
||||||
|
atmega168_isp: EFUSE = 04
|
||||||
|
atmega168_isp: isp
|
||||||
|
|
||||||
|
diecimila: TARGET = diecimila
|
||||||
|
diecimila: MCU_TARGET = atmega168
|
||||||
|
diecimila: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
|
||||||
|
diecimila: AVR_FREQ = 16000000L
|
||||||
|
diecimila: $(PROGRAM)_diecimila.hex
|
||||||
|
diecimila: $(PROGRAM)_diecimila.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 = FF
|
||||||
|
# 512 byte boot
|
||||||
|
diecimila_isp: EFUSE = 04
|
||||||
|
diecimila_isp: isp
|
||||||
|
|
||||||
|
atmega328: TARGET = atmega328
|
||||||
|
atmega328: MCU_TARGET = atmega328p
|
||||||
|
atmega328: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
|
||||||
|
atmega328: AVR_FREQ = 16000000L
|
||||||
|
atmega328: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe
|
||||||
|
atmega328: $(PROGRAM)_atmega328.hex
|
||||||
|
atmega328: $(PROGRAM)_atmega328.lst
|
||||||
|
|
||||||
|
atmega328_isp: atmega328
|
||||||
|
atmega328_isp: TARGET = atmega328
|
||||||
|
atmega328_isp: MCU_TARGET = atmega328p
|
||||||
|
# 512 byte boot, SPIEN
|
||||||
|
atmega328_isp: HFUSE = DE
|
||||||
|
# Low power xtal (16MHz) 16KCK/14CK+65ms
|
||||||
|
atmega328_isp: LFUSE = FF
|
||||||
|
# 2.7V brownout
|
||||||
|
atmega328_isp: EFUSE = 05
|
||||||
|
atmega328_isp: isp
|
||||||
|
|
||||||
|
atmega1284: TARGET = atmega1284p
|
||||||
|
atmega1284: MCU_TARGET = atmega1284p
|
||||||
|
atmega1284: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' '-DBIGBOOT'
|
||||||
|
atmega1284: AVR_FREQ = 16000000L
|
||||||
|
atmega1284: LDSECTIONS = -Wl,--section-start=.text=0x1fc00
|
||||||
|
atmega1284: $(PROGRAM)_atmega1284p.hex
|
||||||
|
atmega1284: $(PROGRAM)_atmega1284p.lst
|
||||||
|
|
||||||
|
atmega1284_isp: atmega1284
|
||||||
|
atmega1284_isp: TARGET = atmega1284p
|
||||||
|
atmega1284_isp: MCU_TARGET = atmega1284p
|
||||||
|
# 1024 byte boot
|
||||||
|
atmega1284_isp: HFUSE = DE
|
||||||
|
# Low power xtal (16MHz) 16KCK/14CK+65ms
|
||||||
|
atmega1284_isp: LFUSE = FF
|
||||||
|
# 2.7V brownout
|
||||||
|
atmega1284_isp: EFUSE = FD
|
||||||
|
atmega1284_isp: isp
|
||||||
|
|
||||||
|
atmega1284_slow: TARGET = atmega1284p_slow
|
||||||
|
atmega1284_slow: MCU_TARGET = atmega1284p
|
||||||
|
atmega1284_slow: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=19200' '-DBIGBOOT'
|
||||||
|
atmega1284_slow: AVR_FREQ = 16000000L
|
||||||
|
atmega1284_slow: LDSECTIONS = -Wl,--section-start=.text=0x1fc00
|
||||||
|
atmega1284_slow: $(PROGRAM)_atmega1284p_slow.hex
|
||||||
|
atmega1284_slow: $(PROGRAM)_atmega1284p_slow.lst
|
||||||
|
|
||||||
|
atmega1284_slow_isp: atmega1284_slow
|
||||||
|
atmega1284_slow_isp: TARGET = atmega1284p_slow
|
||||||
|
atmega1284_slow_isp: MCU_TARGET = atmega1284p
|
||||||
|
# 1024 byte boot
|
||||||
|
atmega1284_slow_isp: HFUSE = DE
|
||||||
|
# Low power xtal (16MHz) 16KCK/14CK+65ms
|
||||||
|
atmega1284_slow_isp: LFUSE = FF
|
||||||
|
# 2.7V brownout
|
||||||
|
atmega1284_slow_isp: EFUSE = FD
|
||||||
|
atmega1284_slow_isp: isp
|
||||||
|
|
||||||
|
# Sanguino has a minimum boot size of 1024 bytes, so enable extra functions
|
||||||
|
#
|
||||||
|
sanguino: TARGET = atmega644p
|
||||||
|
sanguino: MCU_TARGET = atmega644p
|
||||||
|
sanguino: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' '-DBIGBOOT'
|
||||||
|
sanguino: AVR_FREQ = 16000000L
|
||||||
|
sanguino: LDSECTIONS = -Wl,--section-start=.text=0xfc00
|
||||||
|
sanguino: $(PROGRAM)_atmega644p.hex
|
||||||
|
sanguino: $(PROGRAM)_atmega644p.lst
|
||||||
|
|
||||||
|
sanguino_isp: sanguino
|
||||||
|
sanguino_isp: TARGET = atmega644p
|
||||||
|
sanguino_isp: MCU_TARGET = atmega644p
|
||||||
|
# 1024 byte boot
|
||||||
|
sanguino_isp: HFUSE = DE
|
||||||
|
# Low power xtal (16MHz) 16KCK/14CK+65ms
|
||||||
|
sanguino_isp: LFUSE = FF
|
||||||
|
# 2.7V brownout
|
||||||
|
sanguino_isp: EFUSE = 05
|
||||||
|
sanguino_isp: isp
|
||||||
|
|
||||||
|
# Mega has a minimum boot size of 1024 bytes, so enable extra functions
|
||||||
|
#mega: TARGET = atmega1280
|
||||||
|
mega: MCU_TARGET = atmega1280
|
||||||
|
mega: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200' '-DBIGBOOT'
|
||||||
|
mega: AVR_FREQ = 16000000L
|
||||||
|
mega: LDSECTIONS = -Wl,--section-start=.text=0x1fc00
|
||||||
|
mega: $(PROGRAM)_atmega1280.hex
|
||||||
|
mega: $(PROGRAM)_atmega1280.lst
|
||||||
|
|
||||||
|
mega_isp: mega
|
||||||
|
mega_isp: TARGET = atmega1280
|
||||||
|
mega_isp: MCU_TARGET = atmega1280
|
||||||
|
# 1024 byte boot
|
||||||
|
mega_isp: HFUSE = DE
|
||||||
|
# Low power xtal (16MHz) 16KCK/14CK+65ms
|
||||||
|
mega_isp: LFUSE = FF
|
||||||
|
# 2.7V brownout
|
||||||
|
mega_isp: EFUSE = 05
|
||||||
|
mega_isp: isp
|
||||||
|
|
||||||
|
# ATmega8
|
||||||
|
#
|
||||||
|
atmega8: TARGET = atmega8
|
||||||
|
atmega8: MCU_TARGET = atmega8
|
||||||
|
atmega8: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
|
||||||
|
atmega8: AVR_FREQ = 16000000L
|
||||||
|
atmega8: LDSECTIONS = -Wl,--section-start=.text=0x1e00 -Wl,--section-start=.version=0x1ffe
|
||||||
|
atmega8: $(PROGRAM)_atmega8.hex
|
||||||
|
atmega8: $(PROGRAM)_atmega8.lst
|
||||||
|
|
||||||
|
atmega8_isp: atmega8
|
||||||
|
atmega8_isp: TARGET = atmega8
|
||||||
|
atmega8_isp: MCU_TARGET = atmega8
|
||||||
|
# SPIEN, CKOPT, Bootsize=512B
|
||||||
|
atmega8_isp: HFUSE = CC
|
||||||
|
# 2.7V brownout, Low power xtal (16MHz) 16KCK/14CK+65ms
|
||||||
|
atmega8_isp: LFUSE = BF
|
||||||
|
atmega8_isp: isp
|
||||||
|
|
||||||
|
# ATmega88
|
||||||
|
#
|
||||||
|
atmega88: TARGET = atmega88
|
||||||
|
atmega88: MCU_TARGET = atmega88
|
||||||
|
atmega88: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
|
||||||
|
atmega88: AVR_FREQ = 16000000L
|
||||||
|
atmega88: LDSECTIONS = -Wl,--section-start=.text=0x1e00 -Wl,--section-start=.version=0x1ffe
|
||||||
|
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
|
||||||
|
atemga88_isp: LFUSE = FF
|
||||||
|
# 512 byte boot
|
||||||
|
atmega88_isp: EFUSE = 04
|
||||||
|
atmega88_isp: isp
|
||||||
|
|
||||||
|
|
||||||
|
# 8MHz clocked platforms
|
||||||
|
#
|
||||||
|
# These are capable of 115200 baud
|
||||||
|
#
|
||||||
|
|
||||||
|
lilypad: TARGET = lilypad
|
||||||
|
lilypad: MCU_TARGET = atmega168
|
||||||
|
lilypad: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
|
||||||
|
lilypad: AVR_FREQ = 8000000L
|
||||||
|
lilypad: $(PROGRAM)_lilypad.hex
|
||||||
|
lilypad: $(PROGRAM)_lilypad.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: TARGET = lilypad_resonator
|
||||||
|
lilypad_resonator: MCU_TARGET = atmega168
|
||||||
|
lilypad_resonator: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
|
||||||
|
lilypad_resonator: AVR_FREQ = 8000000L
|
||||||
|
lilypad_resonator: $(PROGRAM)_lilypad_resonator.hex
|
||||||
|
lilypad_resonator: $(PROGRAM)_lilypad_resonator.lst
|
||||||
|
|
||||||
|
lilypad_resonator_isp: lilypad_resonator
|
||||||
|
lilypad_resonator_isp: TARGET = lilypad_resonator
|
||||||
|
# 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: MCU_TARGET = atmega168
|
||||||
|
pro8: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
|
||||||
|
pro8: AVR_FREQ = 8000000L
|
||||||
|
pro8: $(PROGRAM)_pro_8MHz.hex
|
||||||
|
pro8: $(PROGRAM)_pro_8MHz.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: MCU_TARGET = atmega328p
|
||||||
|
atmega328_pro8: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
|
||||||
|
atmega328_pro8: AVR_FREQ = 8000000L
|
||||||
|
atmega328_pro8: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe
|
||||||
|
atmega328_pro8: $(PROGRAM)_atmega328_pro_8MHz.hex
|
||||||
|
atmega328_pro8: $(PROGRAM)_atmega328_pro_8MHz.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
|
||||||
|
|
||||||
|
# 1MHz clocked platforms
|
||||||
|
#
|
||||||
|
# These are capable of 9600 baud
|
||||||
|
#
|
||||||
|
|
||||||
|
luminet: TARGET = luminet
|
||||||
|
luminet: MCU_TARGET = attiny84
|
||||||
|
luminet: CFLAGS += '-DLED_START_FLASHES=3' '-DSOFT_UART' '-DBAUD_RATE=9600'
|
||||||
|
luminet: CFLAGS += '-DVIRTUAL_BOOT_PARTITION'
|
||||||
|
luminet: AVR_FREQ = 1000000L
|
||||||
|
luminet: LDSECTIONS = -Wl,--section-start=.text=0x1d00 -Wl,--section-start=.version=0x1efe
|
||||||
|
luminet: $(PROGRAM)_luminet.hex
|
||||||
|
luminet: $(PROGRAM)_luminet.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
|
||||||
|
|
||||||
|
#
|
||||||
|
# Generic build instructions
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
isp: $(TARGET)
|
||||||
|
$(ISPFUSES)
|
||||||
|
$(ISPFLASH)
|
||||||
|
|
||||||
|
isp-stk500: $(PROGRAM)_$(TARGET).hex
|
||||||
|
$(STK500-1)
|
||||||
|
$(STK500-2)
|
||||||
|
|
||||||
|
%.elf: $(OBJ)
|
||||||
|
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)
|
||||||
|
$(SIZE) $@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf *.o *.elf *.lst *.map *.sym *.lss *.eep *.srec *.bin *.hex
|
||||||
|
|
||||||
|
%.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 $< $@
|
@ -0,0 +1,848 @@
|
|||||||
|
/* Modified to use out for SPM access
|
||||||
|
** Peter Knight, Optiboot project http://optiboot.googlecode.com
|
||||||
|
**
|
||||||
|
** Todo: Tidy up
|
||||||
|
**
|
||||||
|
** "_short" routines execute 1 cycle faster and use 1 less word of flash
|
||||||
|
** by using "out" instruction instead of "sts".
|
||||||
|
**
|
||||||
|
** Additional elpm variants that trust the value of RAMPZ
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007 Eric B. Weddington
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in
|
||||||
|
the documentation and/or other materials provided with the
|
||||||
|
distribution.
|
||||||
|
* Neither the name of the copyright holders nor the names of
|
||||||
|
contributors may be used to endorse or promote products derived
|
||||||
|
from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE. */
|
||||||
|
|
||||||
|
/* $Id: boot.h,v 1.27.2.3 2008/09/30 13:58:48 arcanum Exp $ */
|
||||||
|
|
||||||
|
#ifndef _AVR_BOOT_H_
|
||||||
|
#define _AVR_BOOT_H_ 1
|
||||||
|
|
||||||
|
/** \file */
|
||||||
|
/** \defgroup avr_boot <avr/boot.h>: Bootloader Support Utilities
|
||||||
|
\code
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/boot.h>
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
The macros in this module provide a C language interface to the
|
||||||
|
bootloader support functionality of certain AVR processors. These
|
||||||
|
macros are designed to work with all sizes of flash memory.
|
||||||
|
|
||||||
|
Global interrupts are not automatically disabled for these macros. It
|
||||||
|
is left up to the programmer to do this. See the code example below.
|
||||||
|
Also see the processor datasheet for caveats on having global interrupts
|
||||||
|
enabled during writing of the Flash.
|
||||||
|
|
||||||
|
\note Not all AVR processors provide bootloader support. See your
|
||||||
|
processor datasheet to see if it provides bootloader support.
|
||||||
|
|
||||||
|
\todo From email with Marek: On smaller devices (all except ATmega64/128),
|
||||||
|
__SPM_REG is in the I/O space, accessible with the shorter "in" and "out"
|
||||||
|
instructions - since the boot loader has a limited size, this could be an
|
||||||
|
important optimization.
|
||||||
|
|
||||||
|
\par API Usage Example
|
||||||
|
The following code shows typical usage of the boot API.
|
||||||
|
|
||||||
|
\code
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
|
void boot_program_page (uint32_t page, uint8_t *buf)
|
||||||
|
{
|
||||||
|
uint16_t i;
|
||||||
|
uint8_t sreg;
|
||||||
|
|
||||||
|
// Disable interrupts.
|
||||||
|
|
||||||
|
sreg = SREG;
|
||||||
|
cli();
|
||||||
|
|
||||||
|
eeprom_busy_wait ();
|
||||||
|
|
||||||
|
boot_page_erase (page);
|
||||||
|
boot_spm_busy_wait (); // Wait until the memory is erased.
|
||||||
|
|
||||||
|
for (i=0; i<SPM_PAGESIZE; i+=2)
|
||||||
|
{
|
||||||
|
// Set up little-endian word.
|
||||||
|
|
||||||
|
uint16_t w = *buf++;
|
||||||
|
w += (*buf++) << 8;
|
||||||
|
|
||||||
|
boot_page_fill (page + i, w);
|
||||||
|
}
|
||||||
|
|
||||||
|
boot_page_write (page); // Store buffer in flash page.
|
||||||
|
boot_spm_busy_wait(); // Wait until the memory is written.
|
||||||
|
|
||||||
|
// Reenable RWW-section again. We need this if we want to jump back
|
||||||
|
// to the application after bootloading.
|
||||||
|
|
||||||
|
boot_rww_enable ();
|
||||||
|
|
||||||
|
// Re-enable interrupts (if they were ever enabled).
|
||||||
|
|
||||||
|
SREG = sreg;
|
||||||
|
}\endcode */
|
||||||
|
|
||||||
|
#include <avr/eeprom.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
/* Check for SPM Control Register in processor. */
|
||||||
|
#if defined (SPMCSR)
|
||||||
|
# define __SPM_REG SPMCSR
|
||||||
|
#elif defined (SPMCR)
|
||||||
|
# define __SPM_REG SPMCR
|
||||||
|
#else
|
||||||
|
# error AVR processor does not provide bootloader support!
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Check for SPM Enable bit. */
|
||||||
|
#if defined(SPMEN)
|
||||||
|
# define __SPM_ENABLE SPMEN
|
||||||
|
#elif defined(SELFPRGEN)
|
||||||
|
# define __SPM_ENABLE SELFPRGEN
|
||||||
|
#else
|
||||||
|
# error Cannot find SPM Enable bit definition!
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def BOOTLOADER_SECTION
|
||||||
|
|
||||||
|
Used to declare a function or variable to be placed into a
|
||||||
|
new section called .bootloader. This section and its contents
|
||||||
|
can then be relocated to any address (such as the bootloader
|
||||||
|
NRWW area) at link-time. */
|
||||||
|
|
||||||
|
#define BOOTLOADER_SECTION __attribute__ ((section (".bootloader")))
|
||||||
|
|
||||||
|
/* Create common bit definitions. */
|
||||||
|
#ifdef ASB
|
||||||
|
#define __COMMON_ASB ASB
|
||||||
|
#else
|
||||||
|
#define __COMMON_ASB RWWSB
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ASRE
|
||||||
|
#define __COMMON_ASRE ASRE
|
||||||
|
#else
|
||||||
|
#define __COMMON_ASRE RWWSRE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define the bit positions of the Boot Lock Bits. */
|
||||||
|
|
||||||
|
#define BLB12 5
|
||||||
|
#define BLB11 4
|
||||||
|
#define BLB02 3
|
||||||
|
#define BLB01 2
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_spm_interrupt_enable()
|
||||||
|
Enable the SPM interrupt. */
|
||||||
|
|
||||||
|
#define boot_spm_interrupt_enable() (__SPM_REG |= (uint8_t)_BV(SPMIE))
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_spm_interrupt_disable()
|
||||||
|
Disable the SPM interrupt. */
|
||||||
|
|
||||||
|
#define boot_spm_interrupt_disable() (__SPM_REG &= (uint8_t)~_BV(SPMIE))
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_is_spm_interrupt()
|
||||||
|
Check if the SPM interrupt is enabled. */
|
||||||
|
|
||||||
|
#define boot_is_spm_interrupt() (__SPM_REG & (uint8_t)_BV(SPMIE))
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_rww_busy()
|
||||||
|
Check if the RWW section is busy. */
|
||||||
|
|
||||||
|
#define boot_rww_busy() (__SPM_REG & (uint8_t)_BV(__COMMON_ASB))
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_spm_busy()
|
||||||
|
Check if the SPM instruction is busy. */
|
||||||
|
|
||||||
|
#define boot_spm_busy() (__SPM_REG & (uint8_t)_BV(__SPM_ENABLE))
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_spm_busy_wait()
|
||||||
|
Wait while the SPM instruction is busy. */
|
||||||
|
|
||||||
|
#define boot_spm_busy_wait() do{}while(boot_spm_busy())
|
||||||
|
|
||||||
|
#define __BOOT_PAGE_ERASE (_BV(__SPM_ENABLE) | _BV(PGERS))
|
||||||
|
#define __BOOT_PAGE_WRITE (_BV(__SPM_ENABLE) | _BV(PGWRT))
|
||||||
|
#define __BOOT_PAGE_FILL _BV(__SPM_ENABLE)
|
||||||
|
#define __BOOT_RWW_ENABLE (_BV(__SPM_ENABLE) | _BV(__COMMON_ASRE))
|
||||||
|
#define __BOOT_LOCK_BITS_SET (_BV(__SPM_ENABLE) | _BV(BLBSET))
|
||||||
|
|
||||||
|
#define __boot_page_fill_short(address, data) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"movw r0, %3\n\t" \
|
||||||
|
"out %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_fill_normal(address, data) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"movw r0, %3\n\t" \
|
||||||
|
"sts %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
"clr r1\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_FILL), \
|
||||||
|
"z" ((uint16_t)address), \
|
||||||
|
"r" ((uint16_t)data) \
|
||||||
|
: "r0" \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_page_fill_alternate(address, data)\
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"movw r0, %3\n\t" \
|
||||||
|
"sts %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
".word 0xffff\n\t" \
|
||||||
|
"nop\n\t" \
|
||||||
|
"clr r1\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_FILL), \
|
||||||
|
"z" ((uint16_t)address), \
|
||||||
|
"r" ((uint16_t)data) \
|
||||||
|
: "r0" \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_page_fill_extended(address, data) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"movw r0, %4\n\t" \
|
||||||
|
"movw r30, %A3\n\t" \
|
||||||
|
"sts %1, %C3\n\t" \
|
||||||
|
"sts %0, %2\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
"clr r1\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"i" (_SFR_MEM_ADDR(RAMPZ)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_FILL), \
|
||||||
|
"r" ((uint32_t)address), \
|
||||||
|
"r" ((uint16_t)data) \
|
||||||
|
: "r0", "r30", "r31" \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_page_fill_extended_short(address, data) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"movw r0, %4\n\t" \
|
||||||
|
"movw r30, %A3\n\t" \
|
||||||
|
"out %1, %C3\n\t" \
|
||||||
|
"out %0, %2\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
"clr r1\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_IO_ADDR(__SPM_REG)), \
|
||||||
|
"i" (_SFR_IO_ADDR(RAMPZ)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_FILL), \
|
||||||
|
"r" ((uint32_t)address), \
|
||||||
|
"r" ((uint16_t)data) \
|
||||||
|
: "r0", "r30", "r31" \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_page_erase_short(address) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"out %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_erase_normal(address) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"sts %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_ERASE), \
|
||||||
|
"z" ((uint16_t)address) \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_page_erase_alternate(address) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"sts %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
".word 0xffff\n\t" \
|
||||||
|
"nop\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_ERASE), \
|
||||||
|
"z" ((uint16_t)address) \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_page_erase_extended(address) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"movw r30, %A3\n\t" \
|
||||||
|
"sts %1, %C3\n\t" \
|
||||||
|
"sts %0, %2\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"i" (_SFR_MEM_ADDR(RAMPZ)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_ERASE), \
|
||||||
|
"r" ((uint32_t)address) \
|
||||||
|
: "r30", "r31" \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
#define __boot_page_erase_extended_short(address) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"movw r30, %A3\n\t" \
|
||||||
|
"out %1, %C3\n\t" \
|
||||||
|
"out %0, %2\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_IO_ADDR(__SPM_REG)), \
|
||||||
|
"i" (_SFR_IO_ADDR(RAMPZ)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_ERASE), \
|
||||||
|
"r" ((uint32_t)address) \
|
||||||
|
: "r30", "r31" \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_page_write_short(address) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"out %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_page_write_normal(address) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"sts %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_WRITE), \
|
||||||
|
"z" ((uint16_t)address) \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_page_write_alternate(address) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"sts %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
".word 0xffff\n\t" \
|
||||||
|
"nop\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_WRITE), \
|
||||||
|
"z" ((uint16_t)address) \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_page_write_extended(address) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"movw r30, %A3\n\t" \
|
||||||
|
"sts %1, %C3\n\t" \
|
||||||
|
"sts %0, %2\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"i" (_SFR_MEM_ADDR(RAMPZ)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_WRITE), \
|
||||||
|
"r" ((uint32_t)address) \
|
||||||
|
: "r30", "r31" \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
#define __boot_page_write_extended_short(address) \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"movw r30, %A3\n\t" \
|
||||||
|
"out %1, %C3\n\t" \
|
||||||
|
"out %0, %2\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_IO_ADDR(__SPM_REG)), \
|
||||||
|
"i" (_SFR_IO_ADDR(RAMPZ)), \
|
||||||
|
"r" ((uint8_t)__BOOT_PAGE_WRITE), \
|
||||||
|
"r" ((uint32_t)address) \
|
||||||
|
: "r30", "r31" \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_rww_enable_short() \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"out %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_IO_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_RWW_ENABLE) \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_rww_enable() \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"sts %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_RWW_ENABLE) \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_rww_enable_alternate() \
|
||||||
|
(__extension__({ \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"sts %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
".word 0xffff\n\t" \
|
||||||
|
"nop\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_RWW_ENABLE) \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
/* From the mega16/mega128 data sheets (maybe others):
|
||||||
|
|
||||||
|
Bits by SPM To set the Boot Loader Lock bits, write the desired data to
|
||||||
|
R0, write "X0001001" to SPMCR and execute SPM within four clock cycles
|
||||||
|
after writing SPMCR. The only accessible Lock bits are the Boot Lock bits
|
||||||
|
that may prevent the Application and Boot Loader section from any
|
||||||
|
software update by the MCU.
|
||||||
|
|
||||||
|
If bits 5..2 in R0 are cleared (zero), the corresponding Boot Lock bit
|
||||||
|
will be programmed if an SPM instruction is executed within four cycles
|
||||||
|
after BLBSET and SPMEN (or SELFPRGEN) are set in SPMCR. The Z-pointer is
|
||||||
|
don't care during this operation, but for future compatibility it is
|
||||||
|
recommended to load the Z-pointer with $0001 (same as used for reading the
|
||||||
|
Lock bits). For future compatibility It is also recommended to set bits 7,
|
||||||
|
6, 1, and 0 in R0 to 1 when writing the Lock bits. When programming the
|
||||||
|
Lock bits the entire Flash can be read during the operation. */
|
||||||
|
|
||||||
|
#define __boot_lock_bits_set_short(lock_bits) \
|
||||||
|
(__extension__({ \
|
||||||
|
uint8_t value = (uint8_t)(~(lock_bits)); \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"ldi r30, 1\n\t" \
|
||||||
|
"ldi r31, 0\n\t" \
|
||||||
|
"mov r0, %2\n\t" \
|
||||||
|
"out %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_IO_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_LOCK_BITS_SET), \
|
||||||
|
"r" (value) \
|
||||||
|
: "r0", "r30", "r31" \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_lock_bits_set(lock_bits) \
|
||||||
|
(__extension__({ \
|
||||||
|
uint8_t value = (uint8_t)(~(lock_bits)); \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"ldi r30, 1\n\t" \
|
||||||
|
"ldi r31, 0\n\t" \
|
||||||
|
"mov r0, %2\n\t" \
|
||||||
|
"sts %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_LOCK_BITS_SET), \
|
||||||
|
"r" (value) \
|
||||||
|
: "r0", "r30", "r31" \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define __boot_lock_bits_set_alternate(lock_bits) \
|
||||||
|
(__extension__({ \
|
||||||
|
uint8_t value = (uint8_t)(~(lock_bits)); \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"ldi r30, 1\n\t" \
|
||||||
|
"ldi r31, 0\n\t" \
|
||||||
|
"mov r0, %2\n\t" \
|
||||||
|
"sts %0, %1\n\t" \
|
||||||
|
"spm\n\t" \
|
||||||
|
".word 0xffff\n\t" \
|
||||||
|
"nop\n\t" \
|
||||||
|
: \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_LOCK_BITS_SET), \
|
||||||
|
"r" (value) \
|
||||||
|
: "r0", "r30", "r31" \
|
||||||
|
); \
|
||||||
|
}))
|
||||||
|
|
||||||
|
/*
|
||||||
|
Reading lock and fuse bits:
|
||||||
|
|
||||||
|
Similarly to writing the lock bits above, set BLBSET and SPMEN (or
|
||||||
|
SELFPRGEN) bits in __SPMREG, and then (within four clock cycles) issue an
|
||||||
|
LPM instruction.
|
||||||
|
|
||||||
|
Z address: contents:
|
||||||
|
0x0000 low fuse bits
|
||||||
|
0x0001 lock bits
|
||||||
|
0x0002 extended fuse bits
|
||||||
|
0x0003 high fuse bits
|
||||||
|
|
||||||
|
Sounds confusing, doesn't it?
|
||||||
|
|
||||||
|
Unlike the macros in pgmspace.h, no need to care for non-enhanced
|
||||||
|
cores here as these old cores do not provide SPM support anyway.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def GET_LOW_FUSE_BITS
|
||||||
|
address to read the low fuse bits, using boot_lock_fuse_bits_get
|
||||||
|
*/
|
||||||
|
#define GET_LOW_FUSE_BITS (0x0000)
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def GET_LOCK_BITS
|
||||||
|
address to read the lock bits, using boot_lock_fuse_bits_get
|
||||||
|
*/
|
||||||
|
#define GET_LOCK_BITS (0x0001)
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def GET_EXTENDED_FUSE_BITS
|
||||||
|
address to read the extended fuse bits, using boot_lock_fuse_bits_get
|
||||||
|
*/
|
||||||
|
#define GET_EXTENDED_FUSE_BITS (0x0002)
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def GET_HIGH_FUSE_BITS
|
||||||
|
address to read the high fuse bits, using boot_lock_fuse_bits_get
|
||||||
|
*/
|
||||||
|
#define GET_HIGH_FUSE_BITS (0x0003)
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_lock_fuse_bits_get(address)
|
||||||
|
|
||||||
|
Read the lock or fuse bits at \c address.
|
||||||
|
|
||||||
|
Parameter \c address can be any of GET_LOW_FUSE_BITS,
|
||||||
|
GET_LOCK_BITS, GET_EXTENDED_FUSE_BITS, or GET_HIGH_FUSE_BITS.
|
||||||
|
|
||||||
|
\note The lock and fuse bits returned are the physical values,
|
||||||
|
i.e. a bit returned as 0 means the corresponding fuse or lock bit
|
||||||
|
is programmed.
|
||||||
|
*/
|
||||||
|
#define boot_lock_fuse_bits_get_short(address) \
|
||||||
|
(__extension__({ \
|
||||||
|
uint8_t __result; \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"ldi r30, %3\n\t" \
|
||||||
|
"ldi r31, 0\n\t" \
|
||||||
|
"out %1, %2\n\t" \
|
||||||
|
"lpm %0, Z\n\t" \
|
||||||
|
: "=r" (__result) \
|
||||||
|
: "i" (_SFR_IO_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_LOCK_BITS_SET), \
|
||||||
|
"M" (address) \
|
||||||
|
: "r0", "r30", "r31" \
|
||||||
|
); \
|
||||||
|
__result; \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define boot_lock_fuse_bits_get(address) \
|
||||||
|
(__extension__({ \
|
||||||
|
uint8_t __result; \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"ldi r30, %3\n\t" \
|
||||||
|
"ldi r31, 0\n\t" \
|
||||||
|
"sts %1, %2\n\t" \
|
||||||
|
"lpm %0, Z\n\t" \
|
||||||
|
: "=r" (__result) \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t)__BOOT_LOCK_BITS_SET), \
|
||||||
|
"M" (address) \
|
||||||
|
: "r0", "r30", "r31" \
|
||||||
|
); \
|
||||||
|
__result; \
|
||||||
|
}))
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_signature_byte_get(address)
|
||||||
|
|
||||||
|
Read the Signature Row byte at \c address. For some MCU types,
|
||||||
|
this function can also retrieve the factory-stored oscillator
|
||||||
|
calibration bytes.
|
||||||
|
|
||||||
|
Parameter \c address can be 0-0x1f as documented by the datasheet.
|
||||||
|
\note The values are MCU type dependent.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define __BOOT_SIGROW_READ (_BV(__SPM_ENABLE) | _BV(SIGRD))
|
||||||
|
|
||||||
|
#define boot_signature_byte_get_short(addr) \
|
||||||
|
(__extension__({ \
|
||||||
|
uint16_t __addr16 = (uint16_t)(addr); \
|
||||||
|
uint8_t __result; \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"out %1, %2\n\t" \
|
||||||
|
"lpm %0, Z" "\n\t" \
|
||||||
|
: "=r" (__result) \
|
||||||
|
: "i" (_SFR_IO_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t) __BOOT_SIGROW_READ), \
|
||||||
|
"z" (__addr16) \
|
||||||
|
); \
|
||||||
|
__result; \
|
||||||
|
}))
|
||||||
|
|
||||||
|
#define boot_signature_byte_get(addr) \
|
||||||
|
(__extension__({ \
|
||||||
|
uint16_t __addr16 = (uint16_t)(addr); \
|
||||||
|
uint8_t __result; \
|
||||||
|
__asm__ __volatile__ \
|
||||||
|
( \
|
||||||
|
"sts %1, %2\n\t" \
|
||||||
|
"lpm %0, Z" "\n\t" \
|
||||||
|
: "=r" (__result) \
|
||||||
|
: "i" (_SFR_MEM_ADDR(__SPM_REG)), \
|
||||||
|
"r" ((uint8_t) __BOOT_SIGROW_READ), \
|
||||||
|
"z" (__addr16) \
|
||||||
|
); \
|
||||||
|
__result; \
|
||||||
|
}))
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_page_fill(address, data)
|
||||||
|
|
||||||
|
Fill the bootloader temporary page buffer for flash
|
||||||
|
address with data word.
|
||||||
|
|
||||||
|
\note The address is a byte address. The data is a word. The AVR
|
||||||
|
writes data to the buffer a word at a time, but addresses the buffer
|
||||||
|
per byte! So, increment your address by 2 between calls, and send 2
|
||||||
|
data bytes in a word format! The LSB of the data is written to the lower
|
||||||
|
address; the MSB of the data is written to the higher address.*/
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_page_erase(address)
|
||||||
|
|
||||||
|
Erase the flash page that contains address.
|
||||||
|
|
||||||
|
\note address is a byte address in flash, not a word address. */
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_page_write(address)
|
||||||
|
|
||||||
|
Write the bootloader temporary page buffer
|
||||||
|
to flash page that contains address.
|
||||||
|
|
||||||
|
\note address is a byte address in flash, not a word address. */
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_rww_enable()
|
||||||
|
|
||||||
|
Enable the Read-While-Write memory section. */
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
\def boot_lock_bits_set(lock_bits)
|
||||||
|
|
||||||
|
Set the bootloader lock bits.
|
||||||
|
|
||||||
|
\param lock_bits A mask of which Boot Loader Lock Bits to set.
|
||||||
|
|
||||||
|
\note In this context, a 'set bit' will be written to a zero value.
|
||||||
|
Note also that only BLBxx bits can be programmed by this command.
|
||||||
|
|
||||||
|
For example, to disallow the SPM instruction from writing to the Boot
|
||||||
|
Loader memory section of flash, you would use this macro as such:
|
||||||
|
|
||||||
|
\code
|
||||||
|
boot_lock_bits_set (_BV (BLB11));
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
\note Like any lock bits, the Boot Loader Lock Bits, once set,
|
||||||
|
cannot be cleared again except by a chip erase which will in turn
|
||||||
|
also erase the boot loader itself. */
|
||||||
|
|
||||||
|
/* Normal versions of the macros use 16-bit addresses.
|
||||||
|
Extended versions of the macros use 32-bit addresses.
|
||||||
|
Alternate versions of the macros use 16-bit addresses and require special
|
||||||
|
instruction sequences after LPM.
|
||||||
|
|
||||||
|
FLASHEND is defined in the ioXXXX.h file.
|
||||||
|
USHRT_MAX is defined in <limits.h>. */
|
||||||
|
|
||||||
|
#if defined(__AVR_ATmega161__) || defined(__AVR_ATmega163__) \
|
||||||
|
|| defined(__AVR_ATmega323__)
|
||||||
|
|
||||||
|
/* Alternate: ATmega161/163/323 and 16 bit address */
|
||||||
|
#define boot_page_fill(address, data) __boot_page_fill_alternate(address, data)
|
||||||
|
#define boot_page_erase(address) __boot_page_erase_alternate(address)
|
||||||
|
#define boot_page_write(address) __boot_page_write_alternate(address)
|
||||||
|
#define boot_rww_enable() __boot_rww_enable_alternate()
|
||||||
|
#define boot_lock_bits_set(lock_bits) __boot_lock_bits_set_alternate(lock_bits)
|
||||||
|
|
||||||
|
#elif (FLASHEND > USHRT_MAX)
|
||||||
|
|
||||||
|
/* Extended: >16 bit address */
|
||||||
|
#define boot_page_fill(address, data) __boot_page_fill_extended_short(address, data)
|
||||||
|
#define boot_page_erase(address) __boot_page_erase_extended_short(address)
|
||||||
|
#define boot_page_write(address) __boot_page_write_extended_short(address)
|
||||||
|
#define boot_rww_enable() __boot_rww_enable_short()
|
||||||
|
#define boot_lock_bits_set(lock_bits) __boot_lock_bits_set_short(lock_bits)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* Normal: 16 bit address */
|
||||||
|
#define boot_page_fill(address, data) __boot_page_fill_short(address, data)
|
||||||
|
#define boot_page_erase(address) __boot_page_erase_short(address)
|
||||||
|
#define boot_page_write(address) __boot_page_write_short(address)
|
||||||
|
#define boot_rww_enable() __boot_rww_enable_short()
|
||||||
|
#define boot_lock_bits_set(lock_bits) __boot_lock_bits_set_short(lock_bits)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
|
||||||
|
Same as boot_page_fill() except it waits for eeprom and spm operations to
|
||||||
|
complete before filling the page. */
|
||||||
|
|
||||||
|
#define boot_page_fill_safe(address, data) \
|
||||||
|
do { \
|
||||||
|
boot_spm_busy_wait(); \
|
||||||
|
eeprom_busy_wait(); \
|
||||||
|
boot_page_fill(address, data); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
|
||||||
|
Same as boot_page_erase() except it waits for eeprom and spm operations to
|
||||||
|
complete before erasing the page. */
|
||||||
|
|
||||||
|
#define boot_page_erase_safe(address) \
|
||||||
|
do { \
|
||||||
|
boot_spm_busy_wait(); \
|
||||||
|
eeprom_busy_wait(); \
|
||||||
|
boot_page_erase (address); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
|
||||||
|
Same as boot_page_write() except it waits for eeprom and spm operations to
|
||||||
|
complete before writing the page. */
|
||||||
|
|
||||||
|
#define boot_page_write_safe(address) \
|
||||||
|
do { \
|
||||||
|
boot_spm_busy_wait(); \
|
||||||
|
eeprom_busy_wait(); \
|
||||||
|
boot_page_write (address); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
|
||||||
|
Same as boot_rww_enable() except waits for eeprom and spm operations to
|
||||||
|
complete before enabling the RWW mameory. */
|
||||||
|
|
||||||
|
#define boot_rww_enable_safe() \
|
||||||
|
do { \
|
||||||
|
boot_spm_busy_wait(); \
|
||||||
|
eeprom_busy_wait(); \
|
||||||
|
boot_rww_enable(); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/** \ingroup avr_boot
|
||||||
|
|
||||||
|
Same as boot_lock_bits_set() except waits for eeprom and spm operations to
|
||||||
|
complete before setting the lock bits. */
|
||||||
|
|
||||||
|
#define boot_lock_bits_set_safe(lock_bits) \
|
||||||
|
do { \
|
||||||
|
boot_spm_busy_wait(); \
|
||||||
|
eeprom_busy_wait(); \
|
||||||
|
boot_lock_bits_set (lock_bits); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif /* _AVR_BOOT_H_ */
|
@ -0,0 +1,80 @@
|
|||||||
|
#if defined(__AVR_ATmega168__) || 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 */
|
||||||
|
#define LED_DDR DDRB
|
||||||
|
#define LED_PORT PORTB
|
||||||
|
#define LED_PIN PINB
|
||||||
|
#define LED PINB5
|
||||||
|
|
||||||
|
/* 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
|
||||||
|
|
||||||
|
#if defined(__AVR_ATmega8__)
|
||||||
|
//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
|
||||||
|
|
||||||
|
/* Luminet support */
|
||||||
|
#if defined(__AVR_ATtiny84__)
|
||||||
|
/* Red LED is connected to pin PA4 */
|
||||||
|
#define LED_DDR DDRA
|
||||||
|
#define LED_PORT PORTA
|
||||||
|
#define LED_PIN PINA
|
||||||
|
#define LED PINA4
|
||||||
|
/* 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 */
|
||||||
|
#if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__)
|
||||||
|
/* Onboard LED is connected to pin PB0 on Sanguino */
|
||||||
|
#define LED_DDR DDRB
|
||||||
|
#define LED_PORT PORTB
|
||||||
|
#define LED_PIN PINB
|
||||||
|
#define LED PINB1
|
||||||
|
|
||||||
|
/* 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__)
|
||||||
|
/* Onboard LED is connected to pin PB7 on Arduino Mega */
|
||||||
|
#define LED_DDR DDRB
|
||||||
|
#define LED_PORT PORTB
|
||||||
|
#define LED_PIN PINB
|
||||||
|
#define LED PINB7
|
||||||
|
|
||||||
|
/* 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
|
@ -0,0 +1,39 @@
|
|||||||
|
/* STK500 constants list, from AVRDUDE */
|
||||||
|
#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'
|
@ -0,0 +1 @@
|
|||||||
|
# Empty
|
@ -0,0 +1,122 @@
|
|||||||
|
|
||||||
|
# Arduino AVR Core and platform.
|
||||||
|
# ------------------------------
|
||||||
|
|
||||||
|
# For more info:
|
||||||
|
# https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5---3rd-party-Hardware-specification
|
||||||
|
|
||||||
|
name=Marlin AVR Boards
|
||||||
|
version=1.5.6
|
||||||
|
|
||||||
|
# AVR compile variables
|
||||||
|
# ---------------------
|
||||||
|
|
||||||
|
compiler.warning_flags=-w
|
||||||
|
compiler.warning_flags.none=-w
|
||||||
|
compiler.warning_flags.default=
|
||||||
|
compiler.warning_flags.more=-Wall
|
||||||
|
compiler.warning_flags.all=-Wall -Wextra
|
||||||
|
|
||||||
|
# Default "compiler.path" is correct, change only if you want to override the initial value
|
||||||
|
compiler.path={runtime.tools.avr-gcc.path}/bin/
|
||||||
|
compiler.c.cmd=avr-gcc
|
||||||
|
compiler.c.flags=-c -g -Os {compiler.warning_flags} -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects
|
||||||
|
compiler.c.elf.flags={compiler.warning_flags} -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections
|
||||||
|
compiler.c.elf.cmd=avr-gcc
|
||||||
|
compiler.S.flags=-c -g -x assembler-with-cpp -flto -MMD
|
||||||
|
compiler.cpp.cmd=avr-g++
|
||||||
|
compiler.cpp.flags=-c -g -Os {compiler.warning_flags} -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto
|
||||||
|
compiler.ar.cmd=avr-gcc-ar
|
||||||
|
compiler.ar.flags=rcs
|
||||||
|
compiler.objcopy.cmd=avr-objcopy
|
||||||
|
compiler.objcopy.eep.flags=-O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0
|
||||||
|
compiler.elf2hex.flags=-O ihex -R .eeprom
|
||||||
|
compiler.elf2hex.cmd=avr-objcopy
|
||||||
|
compiler.ldflags=
|
||||||
|
compiler.size.cmd=avr-size
|
||||||
|
|
||||||
|
# This can be overridden in boards.txt
|
||||||
|
build.extra_flags=
|
||||||
|
|
||||||
|
# These can be overridden in platform.local.txt
|
||||||
|
compiler.c.extra_flags=
|
||||||
|
compiler.c.elf.extra_flags=
|
||||||
|
compiler.S.extra_flags=
|
||||||
|
compiler.cpp.extra_flags=
|
||||||
|
compiler.ar.extra_flags=
|
||||||
|
compiler.objcopy.eep.extra_flags=
|
||||||
|
compiler.elf2hex.extra_flags=
|
||||||
|
|
||||||
|
# AVR compile patterns
|
||||||
|
# --------------------
|
||||||
|
|
||||||
|
## Compile c files
|
||||||
|
recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.c.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"
|
||||||
|
|
||||||
|
## Compile c++ files
|
||||||
|
recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}"
|
||||||
|
|
||||||
|
## Create eeprom
|
||||||
|
recipe.objcopy.eep.pattern="{compiler.path}{compiler.objcopy.cmd}" {compiler.objcopy.eep.flags} {compiler.objcopy.eep.extra_flags} "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}.eep"
|
||||||
|
|
||||||
|
## Create hex
|
||||||
|
recipe.objcopy.hex.pattern="{compiler.path}{compiler.elf2hex.cmd}" {compiler.elf2hex.flags} {compiler.elf2hex.extra_flags} "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}.hex"
|
||||||
|
|
||||||
|
## Compute size
|
||||||
|
recipe.size.pattern="{compiler.path}{compiler.size.cmd}" -A "{build.path}/{build.project_name}.elf"
|
||||||
|
recipe.size.regex=^(?:\.text|\.data|\.bootloader)\s+([0-9]+).*
|
||||||
|
recipe.size.regex.data=^(?:\.data|\.bss|\.noinit)\s+([0-9]+).*
|
||||||
|
recipe.size.regex.eeprom=^(?:\.eeprom)\s+([0-9]+).*
|
||||||
|
|
||||||
|
## Preprocessor
|
||||||
|
preproc.includes.flags=-w -x c++ -M -MG -MP
|
||||||
|
recipe.preproc.includes="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} {preproc.includes.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {includes} "{source_file}"
|
||||||
|
|
||||||
|
preproc.macros.flags=-w -x c++ -E -CC
|
||||||
|
recipe.preproc.macros="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} {preproc.macros.flags} -mmcu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{preprocessed_file_path}"
|
||||||
|
|
||||||
|
|
||||||
|
# AVR Uploader/Programmers tools
|
||||||
|
# ------------------------------
|
||||||
|
|
||||||
|
tools.avrdude.path={runtime.tools.avrdude.path}
|
||||||
|
tools.avrdude.cmd.path={path}/bin/avrdude
|
||||||
|
tools.avrdude.config.path={path}/etc/avrdude.conf
|
||||||
|
|
||||||
|
tools.avrdude.upload.params.verbose=-v
|
||||||
|
tools.avrdude.upload.params.quiet=-q -q
|
||||||
|
tools.avrdude.upload.pattern="{cmd.path}" "-C{config.path}" {upload.verbose} -p{build.mcu} -c{upload.protocol} -P{serial.port} -b{upload.speed} -D "-Uflash:w:{build.path}/{build.project_name}.hex:i"
|
||||||
|
|
||||||
|
tools.avrdude.program.params.verbose=-v
|
||||||
|
tools.avrdude.program.params.quiet=-q -q
|
||||||
|
tools.avrdude.program.pattern="{cmd.path}" "-C{config.path}" {program.verbose} -p{build.mcu} -c{protocol} {program.extra_params} "-Uflash:w:{build.path}/{build.project_name}.hex:i"
|
||||||
|
|
||||||
|
tools.avrdude.erase.params.verbose=-v
|
||||||
|
tools.avrdude.erase.params.quiet=-q -q
|
||||||
|
tools.avrdude.erase.pattern="{cmd.path}" "-C{config.path}" {erase.verbose} -p{build.mcu} -c{protocol} {program.extra_params} -e -Ulock:w:{bootloader.unlock_bits}:m -Uefuse:w:{bootloader.extended_fuses}:m -Uhfuse:w:{bootloader.high_fuses}:m -Ulfuse:w:{bootloader.low_fuses}:m
|
||||||
|
|
||||||
|
tools.avrdude.bootloader.params.verbose=-v
|
||||||
|
tools.avrdude.bootloader.params.quiet=-q -q
|
||||||
|
tools.avrdude.bootloader.pattern="{cmd.path}" "-C{config.path}" {bootloader.verbose} -p{build.mcu} -c{protocol} {program.extra_params} "-Uflash:w:{runtime.platform.path}/bootloaders/{bootloader.file}:i" -Ulock:w:{bootloader.lock_bits}:m
|
||||||
|
|
||||||
|
tools.hidloader.cmd.path=/usr/local/bin/HIDUploader
|
||||||
|
|
||||||
|
tools.hidloader.upload.params.verbose=-v
|
||||||
|
tools.hidloader.upload.params.quiet=
|
||||||
|
tools.hidloader.upload.pattern="{cmd.path}" --upload -mmcu={build.mcu} {upload.verbose} -w "{build.path}/{build.project_name}.hex"
|
||||||
|
tools.nativehid.program.params.verbose=-v
|
||||||
|
tools.nativehid.program.params.quiet=-q -q
|
||||||
|
|
||||||
|
tools.hidloader.program.params.verbose=-v
|
||||||
|
tools.hidloader.program.params.quiet=-q -q
|
||||||
|
tools.hidloader.program.pattern="{cmd.path}" -mmcu={build.mcu} {upload.verbose} -w "{build.path}/{build.project_name}.hex"
|
||||||
|
|
||||||
|
tools.hidloader.erase.params.verbose=-v
|
||||||
|
tools.hidloader.erase.params.quiet=-q -q
|
||||||
|
tools.hidloader.erase.pattern="{cmd.path}" --erase "-C{config.path}" {erase.verbose} -p{build.mcu} -c{protocol} {program.extra_params} -e -Ulock:w:{bootloader.unlock_bits}:m -Uefuse:w:{bootloader.extended_fuses}:m -Uhfuse:w:{bootloader.high_fuses}:m -Ulfuse:w:{bootloader.low_fuses}:m
|
||||||
|
|
||||||
|
# USB Default Flags
|
||||||
|
# Default blank usb manufacturer will be filled it at compile time
|
||||||
|
# - from numeric vendor ID, set to Unknown otherwise
|
||||||
|
build.usb_manufacturer=
|
||||||
|
build.usb_flags=-DUSB_VID={build.vid} -DUSB_PID={build.pid} '-DUSB_MANUFACTURER={build.usb_manufacturer}' '-DUSB_PRODUCT={build.usb_product}'
|
@ -0,0 +1,288 @@
|
|||||||
|
/*
|
||||||
|
pins_arduino.h - Pin definition functions for Arduino
|
||||||
|
Part of Arduino - http://www.arduino.cc/
|
||||||
|
|
||||||
|
Copyright (c) 2007 David A. Mellis
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General
|
||||||
|
Public License along with this library; if not, write to the
|
||||||
|
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||||
|
Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
$Id: wiring.h 249 2007-02-03 16:52:51Z mellis $
|
||||||
|
|
||||||
|
Changelog
|
||||||
|
-----------
|
||||||
|
11/25/11 - ryan@ryanmsutton.com - Add pins for Sanguino 644P and 1284P
|
||||||
|
07/15/12 - ryan@ryanmsutton.com - Updated for arduino0101
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef Pins_Arduino_h
|
||||||
|
#define Pins_Arduino_h
|
||||||
|
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
|
#define NOT_A_PIN 0
|
||||||
|
#define NOT_A_PORT 0
|
||||||
|
|
||||||
|
#define NOT_ON_TIMER 0
|
||||||
|
#define TIMER0A 1
|
||||||
|
#define TIMER0B 2
|
||||||
|
#define TIMER1A 3
|
||||||
|
#define TIMER1B 4
|
||||||
|
#define TIMER2 5
|
||||||
|
#define TIMER2A 6
|
||||||
|
#define TIMER2B 7
|
||||||
|
|
||||||
|
#define TIMER3A 8
|
||||||
|
#define TIMER3B 9
|
||||||
|
#define TIMER3C 10
|
||||||
|
#define TIMER4A 11
|
||||||
|
#define TIMER4B 12
|
||||||
|
#define TIMER4C 13
|
||||||
|
#define TIMER5A 14
|
||||||
|
#define TIMER5B 15
|
||||||
|
#define TIMER5C 16
|
||||||
|
|
||||||
|
const static uint8_t SS = 4;
|
||||||
|
const static uint8_t MOSI = 5;
|
||||||
|
const static uint8_t MISO = 6;
|
||||||
|
const static uint8_t SCK = 7;
|
||||||
|
|
||||||
|
static const uint8_t SDA = 17;
|
||||||
|
static const uint8_t SCL = 16;
|
||||||
|
static const uint8_t LED_BUILTIN = 13;
|
||||||
|
|
||||||
|
static const uint8_t A0 = 31;
|
||||||
|
static const uint8_t A1 = 30;
|
||||||
|
static const uint8_t A2 = 29;
|
||||||
|
static const uint8_t A3 = 28;
|
||||||
|
static const uint8_t A4 = 27;
|
||||||
|
static const uint8_t A5 = 26;
|
||||||
|
static const uint8_t A6 = 25;
|
||||||
|
static const uint8_t A7 = 24;
|
||||||
|
|
||||||
|
// On the ATmega1280, the addresses of some of the port registers are
|
||||||
|
// greater than 255, so we can't store them in uint8_t's.
|
||||||
|
// extern const uint16_t PROGMEM port_to_mode_PGM[];
|
||||||
|
// extern const uint16_t PROGMEM port_to_input_PGM[];
|
||||||
|
// extern const uint16_t PROGMEM port_to_output_PGM[];
|
||||||
|
|
||||||
|
// extern const uint8_t PROGMEM digital_pin_to_port_PGM[];
|
||||||
|
// extern const uint8_t PROGMEM digital_pin_to_bit_PGM[];
|
||||||
|
// extern const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[];
|
||||||
|
// extern const uint8_t PROGMEM digital_pin_to_timer_PGM[];
|
||||||
|
|
||||||
|
// ATMEL ATMEGA644P / SANGUINO
|
||||||
|
//
|
||||||
|
// +---\/---+
|
||||||
|
// INT0 (D 0) PB0 1| |40 PA0 (AI 0 / D31)
|
||||||
|
// INT1 (D 1) PB1 2| |39 PA1 (AI 1 / D30)
|
||||||
|
// INT2 (D 2) PB2 3| |38 PA2 (AI 2 / D29)
|
||||||
|
// PWM (D 3) PB3 4| |37 PA3 (AI 3 / D28)
|
||||||
|
// PWM (D 4) PB4 5| |36 PA4 (AI 4 / D27)
|
||||||
|
// MOSI (D 5) PB5 6| |35 PA5 (AI 5 / D26)
|
||||||
|
// MISO (D 6) PB6 7| |34 PA6 (AI 6 / D25)
|
||||||
|
// SCK (D 7) PB7 8| |33 PA7 (AI 7 / D24)
|
||||||
|
// RST 9| |32 AREF
|
||||||
|
// VCC 10| |31 GND
|
||||||
|
// GND 11| |30 AVCC
|
||||||
|
// XTAL2 12| |29 PC7 (D 23)
|
||||||
|
// XTAL1 13| |28 PC6 (D 22)
|
||||||
|
// RX0 (D 8) PD0 14| |27 PC5 (D 21) TDI
|
||||||
|
// TX0 (D 9) PD1 15| |26 PC4 (D 20) TDO
|
||||||
|
// RX1 (D 10) PD2 16| |25 PC3 (D 19) TMS
|
||||||
|
// TX1 (D 11) PD3 17| |24 PC2 (D 18) TCK
|
||||||
|
// PWM (D 12) PD4 18| |23 PC1 (D 17) SDA
|
||||||
|
// PWM (D 13) PD5 19| |22 PC0 (D 16) SCL
|
||||||
|
// PWM (D 14) PD6 20| |21 PD7 (D 15) PWM
|
||||||
|
// +--------+
|
||||||
|
//
|
||||||
|
#define NUM_DIGITAL_PINS 32
|
||||||
|
#define NUM_ANALOG_INPUTS 8
|
||||||
|
#define analogInputToDigitalPin(p) ((p < 8) ? 31 - (p): -1)
|
||||||
|
|
||||||
|
#define digitalPinHasPWM(p) ((p) == 3 || (p) == 4 || (p) == 12 || (p) == 13 || (p) == 14 || (p) == 15 )
|
||||||
|
|
||||||
|
#define digitalPinToPCICR(p) ( (((p) >= 0) && ((p) <= 31)) ? (&PCICR) : ((uint8_t *)0) )
|
||||||
|
|
||||||
|
#define digitalPinToPCICRbit(p) ( (((p) >= 24) && ((p) <= 31)) ? 0 : \
|
||||||
|
( (((p) >= 0) && ((p) <= 7)) ? 1 : \
|
||||||
|
( (((p) >= 16) && ((p) <= 23)) ? 2 : \
|
||||||
|
( (((p) >= 8) && ((p) <= 15)) ? 3 : \
|
||||||
|
0 ) ) ) )
|
||||||
|
|
||||||
|
#define digitalPinToPCMSK(p) ( (((p) >= 24) && ((p) <= 31)) ? (&PCMSK0) : \
|
||||||
|
( (((p) >= 0) && ((p) <= 7)) ? (&PCMSK1) : \
|
||||||
|
( (((p) >= 16) && ((p) <= 23)) ? (&PCMSK2) : \
|
||||||
|
( (((p) >= 8) && ((p) <= 15)) ? (&PCMSK3) : \
|
||||||
|
((uint8_t *)0) ) ) ) )
|
||||||
|
|
||||||
|
|
||||||
|
#define digitalPinToPCMSKbit(p) ( (((p) >= 24) && ((p) <= 31)) ? (31 - (p)) : \
|
||||||
|
( (((p) >= 0) && ((p) <= 7)) ? (p) : \
|
||||||
|
( (((p) >= 16) && ((p) <= 23)) ? ((p) - 16) : \
|
||||||
|
( (((p) >= 8) && ((p) <= 15)) ? ((p) - 8) : \
|
||||||
|
0 ) ) ) )
|
||||||
|
|
||||||
|
#define digitalPinToInterrupt(p) ((p) == 10 ? 0 : ((p) == 11 ? 1 : ((p) == 2 ? 2 \
|
||||||
|
: NOT_AN_INTERRUPT))) // mega1284p dip
|
||||||
|
|
||||||
|
#define PA 1
|
||||||
|
#define PB 2
|
||||||
|
#define PC 3
|
||||||
|
#define PD 4
|
||||||
|
#define PE 5
|
||||||
|
#define PF 6
|
||||||
|
#define PG 7
|
||||||
|
#define PH 8
|
||||||
|
#define PJ 10
|
||||||
|
#define PK 11
|
||||||
|
#define PL 12
|
||||||
|
|
||||||
|
#ifdef ARDUINO_MAIN
|
||||||
|
// these arrays map port names (e.g. port B) to the
|
||||||
|
// appropriate addresses for various functions (e.g. reading
|
||||||
|
// and writing)
|
||||||
|
const uint16_t PROGMEM port_to_mode_PGM[] =
|
||||||
|
{
|
||||||
|
NOT_A_PORT,
|
||||||
|
(uint16_t) &DDRA,
|
||||||
|
(uint16_t) &DDRB,
|
||||||
|
(uint16_t) &DDRC,
|
||||||
|
(uint16_t) &DDRD,
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM port_to_output_PGM[] =
|
||||||
|
{
|
||||||
|
NOT_A_PORT,
|
||||||
|
(uint16_t) &PORTA,
|
||||||
|
(uint16_t) &PORTB,
|
||||||
|
(uint16_t) &PORTC,
|
||||||
|
(uint16_t) &PORTD,
|
||||||
|
};
|
||||||
|
const uint16_t PROGMEM port_to_input_PGM[] =
|
||||||
|
{
|
||||||
|
NOT_A_PORT,
|
||||||
|
(uint16_t) &PINA,
|
||||||
|
(uint16_t) &PINB,
|
||||||
|
(uint16_t) &PINC,
|
||||||
|
(uint16_t) &PIND,
|
||||||
|
};
|
||||||
|
const uint8_t PROGMEM digital_pin_to_port_PGM[] =
|
||||||
|
{
|
||||||
|
PB, /* 0 */
|
||||||
|
PB,
|
||||||
|
PB,
|
||||||
|
PB,
|
||||||
|
PB,
|
||||||
|
PB,
|
||||||
|
PB,
|
||||||
|
PB,
|
||||||
|
PD, /* 8 */
|
||||||
|
PD,
|
||||||
|
PD,
|
||||||
|
PD,
|
||||||
|
PD,
|
||||||
|
PD,
|
||||||
|
PD,
|
||||||
|
PD,
|
||||||
|
PC, /* 16 */
|
||||||
|
PC,
|
||||||
|
PC,
|
||||||
|
PC,
|
||||||
|
PC,
|
||||||
|
PC,
|
||||||
|
PC,
|
||||||
|
PC,
|
||||||
|
PA, /* 24 */
|
||||||
|
PA,
|
||||||
|
PA,
|
||||||
|
PA,
|
||||||
|
PA,
|
||||||
|
PA,
|
||||||
|
PA,
|
||||||
|
PA /* 31 */
|
||||||
|
};
|
||||||
|
const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] =
|
||||||
|
{
|
||||||
|
_BV(0), /* 0, port B */
|
||||||
|
_BV(1),
|
||||||
|
_BV(2),
|
||||||
|
_BV(3),
|
||||||
|
_BV(4),
|
||||||
|
_BV(5),
|
||||||
|
_BV(6),
|
||||||
|
_BV(7),
|
||||||
|
_BV(0), /* 8, port D */
|
||||||
|
_BV(1),
|
||||||
|
_BV(2),
|
||||||
|
_BV(3),
|
||||||
|
_BV(4),
|
||||||
|
_BV(5),
|
||||||
|
_BV(6),
|
||||||
|
_BV(7),
|
||||||
|
_BV(0), /* 16, port C */
|
||||||
|
_BV(1),
|
||||||
|
_BV(2),
|
||||||
|
_BV(3),
|
||||||
|
_BV(4),
|
||||||
|
_BV(5),
|
||||||
|
_BV(6),
|
||||||
|
_BV(7),
|
||||||
|
_BV(7), /* 24, port A */
|
||||||
|
_BV(6),
|
||||||
|
_BV(5),
|
||||||
|
_BV(4),
|
||||||
|
_BV(3),
|
||||||
|
_BV(2),
|
||||||
|
_BV(1),
|
||||||
|
_BV(0)
|
||||||
|
};
|
||||||
|
const uint8_t PROGMEM digital_pin_to_timer_PGM[] =
|
||||||
|
{
|
||||||
|
NOT_ON_TIMER, /* 0 - PB0 */
|
||||||
|
NOT_ON_TIMER, /* 1 - PB1 */
|
||||||
|
NOT_ON_TIMER, /* 2 - PB2 */
|
||||||
|
TIMER0A, /* 3 - PB3 */
|
||||||
|
TIMER0B, /* 4 - PB4 */
|
||||||
|
NOT_ON_TIMER, /* 5 - PB5 */
|
||||||
|
NOT_ON_TIMER, /* 6 - PB6 */
|
||||||
|
NOT_ON_TIMER, /* 7 - PB7 */
|
||||||
|
NOT_ON_TIMER, /* 8 - PD0 */
|
||||||
|
NOT_ON_TIMER, /* 9 - PD1 */
|
||||||
|
NOT_ON_TIMER, /* 10 - PD2 */
|
||||||
|
NOT_ON_TIMER, /* 11 - PD3 */
|
||||||
|
TIMER1B, /* 12 - PD4 */
|
||||||
|
TIMER1A, /* 13 - PD5 */
|
||||||
|
TIMER2B, /* 14 - PD6 */
|
||||||
|
TIMER2A, /* 15 - PD7 */
|
||||||
|
NOT_ON_TIMER, /* 16 - PC0 */
|
||||||
|
NOT_ON_TIMER, /* 17 - PC1 */
|
||||||
|
NOT_ON_TIMER, /* 18 - PC2 */
|
||||||
|
NOT_ON_TIMER, /* 19 - PC3 */
|
||||||
|
NOT_ON_TIMER, /* 20 - PC4 */
|
||||||
|
NOT_ON_TIMER, /* 21 - PC5 */
|
||||||
|
NOT_ON_TIMER, /* 22 - PC6 */
|
||||||
|
NOT_ON_TIMER, /* 23 - PC7 */
|
||||||
|
NOT_ON_TIMER, /* 24 - PA0 */
|
||||||
|
NOT_ON_TIMER, /* 25 - PA1 */
|
||||||
|
NOT_ON_TIMER, /* 26 - PA2 */
|
||||||
|
NOT_ON_TIMER, /* 27 - PA3 */
|
||||||
|
NOT_ON_TIMER, /* 28 - PA4 */
|
||||||
|
NOT_ON_TIMER, /* 29 - PA5 */
|
||||||
|
NOT_ON_TIMER, /* 30 - PA6 */
|
||||||
|
NOT_ON_TIMER /* 31 - PA7 */
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
#endif
|
@ -0,0 +1,238 @@
|
|||||||
|
/*
|
||||||
|
pins_arduino.h - Pin definition functions for Arduino
|
||||||
|
Part of Arduino - http://www.arduino.cc/
|
||||||
|
|
||||||
|
Copyright (c) 2007 David A. Mellis
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General
|
||||||
|
Public License along with this library; if not, write to the
|
||||||
|
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||||
|
Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
$Id: wiring.h 249 2007-02-03 16:52:51Z mellis $
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef Pins_Arduino_h
|
||||||
|
#define Pins_Arduino_h
|
||||||
|
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
|
#define NUM_DIGITAL_PINS 20
|
||||||
|
#define NUM_ANALOG_INPUTS 6
|
||||||
|
#define analogInputToDigitalPin(p) ((p < 6) ? (p) + 14 : -1)
|
||||||
|
|
||||||
|
#if defined(__AVR_ATmega8__)
|
||||||
|
#define digitalPinHasPWM(p) ((p) == 9 || (p) == 10 || (p) == 11)
|
||||||
|
#else
|
||||||
|
#define digitalPinHasPWM(p) ((p) == 3 || (p) == 5 || (p) == 6 || (p) == 9 || (p) == 10 || (p) == 11)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static const uint8_t SS = 10;
|
||||||
|
static const uint8_t MOSI = 11;
|
||||||
|
static const uint8_t MISO = 12;
|
||||||
|
static const uint8_t SCK = 13;
|
||||||
|
|
||||||
|
static const uint8_t SDA = 18;
|
||||||
|
static const uint8_t SCL = 19;
|
||||||
|
#define LED_BUILTIN 13
|
||||||
|
|
||||||
|
static const uint8_t A0 = 14;
|
||||||
|
static const uint8_t A1 = 15;
|
||||||
|
static const uint8_t A2 = 16;
|
||||||
|
static const uint8_t A3 = 17;
|
||||||
|
static const uint8_t A4 = 18;
|
||||||
|
static const uint8_t A5 = 19;
|
||||||
|
static const uint8_t A6 = 20;
|
||||||
|
static const uint8_t A7 = 21;
|
||||||
|
|
||||||
|
#define digitalPinToPCICR(p) (((p) >= 0 && (p) <= 21) ? (&PCICR) : ((uint8_t *)0))
|
||||||
|
#define digitalPinToPCICRbit(p) (((p) <= 7) ? 2 : (((p) <= 13) ? 0 : 1))
|
||||||
|
#define digitalPinToPCMSK(p) (((p) <= 7) ? (&PCMSK2) : (((p) <= 13) ? (&PCMSK0) : (((p) <= 21) ? (&PCMSK1) : ((uint8_t *)0))))
|
||||||
|
#define digitalPinToPCMSKbit(p) (((p) <= 7) ? (p) : (((p) <= 13) ? ((p) - 8) : ((p) - 14)))
|
||||||
|
|
||||||
|
#define digitalPinToInterrupt(p) ((p) == 2 ? 0 : ((p) == 3 ? 1 : NOT_AN_INTERRUPT))
|
||||||
|
|
||||||
|
#ifdef ARDUINO_MAIN
|
||||||
|
|
||||||
|
// On the Arduino board, digital pins are also used
|
||||||
|
// for the analog output (software PWM). Analog input
|
||||||
|
// pins are a separate set.
|
||||||
|
|
||||||
|
// ATMEL ATMEGA8 & 168 / ARDUINO
|
||||||
|
//
|
||||||
|
// +-\/-+
|
||||||
|
// PC6 1| |28 PC5 (AI 5)
|
||||||
|
// (D 0) PD0 2| |27 PC4 (AI 4)
|
||||||
|
// (D 1) PD1 3| |26 PC3 (AI 3)
|
||||||
|
// (D 2) PD2 4| |25 PC2 (AI 2)
|
||||||
|
// PWM+ (D 3) PD3 5| |24 PC1 (AI 1)
|
||||||
|
// (D 4) PD4 6| |23 PC0 (AI 0)
|
||||||
|
// VCC 7| |22 GND
|
||||||
|
// GND 8| |21 AREF
|
||||||
|
// PB6 9| |20 AVCC
|
||||||
|
// PB7 10| |19 PB5 (D 13)
|
||||||
|
// PWM+ (D 5) PD5 11| |18 PB4 (D 12)
|
||||||
|
// PWM+ (D 6) PD6 12| |17 PB3 (D 11) PWM
|
||||||
|
// (D 7) PD7 13| |16 PB2 (D 10) PWM
|
||||||
|
// (D 8) PB0 14| |15 PB1 (D 9) PWM
|
||||||
|
// +----+
|
||||||
|
//
|
||||||
|
// (PWM+ indicates the additional PWM pins on the ATmega168.)
|
||||||
|
|
||||||
|
// ATMEL ATMEGA1280 / ARDUINO
|
||||||
|
//
|
||||||
|
// 0-7 PE0-PE7 works
|
||||||
|
// 8-13 PB0-PB5 works
|
||||||
|
// 14-21 PA0-PA7 works
|
||||||
|
// 22-29 PH0-PH7 works
|
||||||
|
// 30-35 PG5-PG0 works
|
||||||
|
// 36-43 PC7-PC0 works
|
||||||
|
// 44-51 PJ7-PJ0 works
|
||||||
|
// 52-59 PL7-PL0 works
|
||||||
|
// 60-67 PD7-PD0 works
|
||||||
|
// A0-A7 PF0-PF7
|
||||||
|
// A8-A15 PK0-PK7
|
||||||
|
|
||||||
|
|
||||||
|
// these arrays map port names (e.g. port B) to the
|
||||||
|
// appropriate addresses for various functions (e.g. reading
|
||||||
|
// and writing)
|
||||||
|
const uint16_t PROGMEM port_to_mode_PGM[] = {
|
||||||
|
NOT_A_PORT,
|
||||||
|
NOT_A_PORT,
|
||||||
|
(uint16_t) &DDRB,
|
||||||
|
(uint16_t) &DDRC,
|
||||||
|
(uint16_t) &DDRD,
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM port_to_output_PGM[] = {
|
||||||
|
NOT_A_PORT,
|
||||||
|
NOT_A_PORT,
|
||||||
|
(uint16_t) &PORTB,
|
||||||
|
(uint16_t) &PORTC,
|
||||||
|
(uint16_t) &PORTD,
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t PROGMEM port_to_input_PGM[] = {
|
||||||
|
NOT_A_PORT,
|
||||||
|
NOT_A_PORT,
|
||||||
|
(uint16_t) &PINB,
|
||||||
|
(uint16_t) &PINC,
|
||||||
|
(uint16_t) &PIND,
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
|
||||||
|
PD, /* 0 */
|
||||||
|
PD,
|
||||||
|
PD,
|
||||||
|
PD,
|
||||||
|
PD,
|
||||||
|
PD,
|
||||||
|
PD,
|
||||||
|
PD,
|
||||||
|
PB, /* 8 */
|
||||||
|
PB,
|
||||||
|
PB,
|
||||||
|
PB,
|
||||||
|
PB,
|
||||||
|
PB,
|
||||||
|
PC, /* 14 */
|
||||||
|
PC,
|
||||||
|
PC,
|
||||||
|
PC,
|
||||||
|
PC,
|
||||||
|
PC,
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = {
|
||||||
|
_BV(0), /* 0, port D */
|
||||||
|
_BV(1),
|
||||||
|
_BV(2),
|
||||||
|
_BV(3),
|
||||||
|
_BV(4),
|
||||||
|
_BV(5),
|
||||||
|
_BV(6),
|
||||||
|
_BV(7),
|
||||||
|
_BV(0), /* 8, port B */
|
||||||
|
_BV(1),
|
||||||
|
_BV(2),
|
||||||
|
_BV(3),
|
||||||
|
_BV(4),
|
||||||
|
_BV(5),
|
||||||
|
_BV(0), /* 14, port C */
|
||||||
|
_BV(1),
|
||||||
|
_BV(2),
|
||||||
|
_BV(3),
|
||||||
|
_BV(4),
|
||||||
|
_BV(5),
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint8_t PROGMEM digital_pin_to_timer_PGM[] = {
|
||||||
|
NOT_ON_TIMER, /* 0 - port D */
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
// on the ATmega168, digital pin 3 has hardware pwm
|
||||||
|
#if defined(__AVR_ATmega8__)
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
#else
|
||||||
|
TIMER2B,
|
||||||
|
#endif
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
// on the ATmega168, digital pins 5 and 6 have hardware pwm
|
||||||
|
#if defined(__AVR_ATmega8__)
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
#else
|
||||||
|
TIMER0B,
|
||||||
|
TIMER0A,
|
||||||
|
#endif
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
NOT_ON_TIMER, /* 8 - port B */
|
||||||
|
TIMER1A,
|
||||||
|
TIMER1B,
|
||||||
|
#if defined(__AVR_ATmega8__)
|
||||||
|
TIMER2,
|
||||||
|
#else
|
||||||
|
TIMER2A,
|
||||||
|
#endif
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
NOT_ON_TIMER, /* 14 - port C */
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
NOT_ON_TIMER,
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// These serial port names are intended to allow libraries and architecture-neutral
|
||||||
|
// sketches to automatically default to the correct port name for a particular type
|
||||||
|
// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN,
|
||||||
|
// the first hardware serial port whose RX/TX pins are not dedicated to another use.
|
||||||
|
//
|
||||||
|
// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor
|
||||||
|
//
|
||||||
|
// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial
|
||||||
|
//
|
||||||
|
// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library
|
||||||
|
//
|
||||||
|
// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins.
|
||||||
|
//
|
||||||
|
// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX
|
||||||
|
// pins are NOT connected to anything by default.
|
||||||
|
#define SERIAL_PORT_MONITOR Serial
|
||||||
|
#define SERIAL_PORT_HARDWARE Serial
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in new issue