Added dualoptiboot to mysensors hardware definitions
This commit is contained in:
@@ -13,7 +13,7 @@ MysensorsMicro.bootloader.lock_bits=0x0F
|
||||
MysensorsMicro.bootloader.low_fuses=0xE2
|
||||
MysensorsMicro.bootloader.high_fuses=0xD2
|
||||
MysensorsMicro.bootloader.extended_fuses=0xFE
|
||||
MysensorsMicro.bootloader.file=DualOptiboot/optiboot_atmega328p-pro8.hex
|
||||
MysensorsMicro.bootloader.file=DualOptiboot/optiboot_atmega328_pro_8MHz.hex
|
||||
|
||||
MysensorsMicro.build.board=AVR_MICRO8
|
||||
MysensorsMicro.build.core=arduino:arduino
|
||||
|
||||
@@ -0,0 +1,674 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
||||
@@ -0,0 +1,649 @@
|
||||
# Makefile for ATmegaBOOT
|
||||
# E.Lins, 18.7.2005
|
||||
# $Id$
|
||||
#
|
||||
# Instructions
|
||||
#
|
||||
# To make bootloader .hex file:
|
||||
# make diecimila
|
||||
# make lilypad
|
||||
# make ng
|
||||
# etc...
|
||||
#
|
||||
# To burn bootloader .hex file:
|
||||
# make diecimila_isp
|
||||
# make lilypad_isp
|
||||
# make ng_isp
|
||||
# etc...
|
||||
#
|
||||
# Edit History
|
||||
# 201303xx: WestfW: Major Makefile restructuring.
|
||||
# Allows options on Make command line "make xx LED=B3"
|
||||
# (see also pin_defs.h)
|
||||
# Divide into "chip" targets and "board" targets.
|
||||
# Most boards are (recursive) board targets with options.
|
||||
# Move isp target to separate makefile (fixes m8 EFUSE)
|
||||
# Some (many) targets will now be rebuilt when not
|
||||
# strictly necessary, so that options will be included.
|
||||
# (any "make" with options will always compile.)
|
||||
# Set many variables with ?= so they can be overridden
|
||||
# Use arduinoISP settings as default for ISP targets
|
||||
#
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
#
|
||||
# program name should not be changed...
|
||||
PROGRAM = optiboot
|
||||
|
||||
# The default behavior is to build using tools that are in the users
|
||||
# current path variables, but we can also build using an installed
|
||||
# Arduino user IDE setup, or the Arduino source tree.
|
||||
# Uncomment this next lines to build within the arduino environment,
|
||||
# using the arduino-included avrgcc toolset (mac and pc)
|
||||
# ENV ?= arduino
|
||||
# ENV ?= arduinodev
|
||||
# OS ?= macosx
|
||||
# OS ?= windows
|
||||
|
||||
# export symbols to recursive makes (for ISP)
|
||||
export
|
||||
|
||||
# defaults
|
||||
MCU_TARGET = atmega168
|
||||
LDSECTIONS = -Wl,--section-start=.text=0x3e00 -Wl,--section-start=.version=0x3ffe
|
||||
|
||||
# Build environments
|
||||
# Start of some ugly makefile-isms to allow optiboot to be built
|
||||
# in several different environments. See the README.TXT file for
|
||||
# details.
|
||||
|
||||
# default
|
||||
fixpath = $(1)
|
||||
|
||||
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/
|
||||
|
||||
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 =
|
||||
AVRDUDE_CONF =
|
||||
endif
|
||||
|
||||
STK500 = "C:\Program Files\Atmel\AVR Tools\STK500\Stk500.exe"
|
||||
STK500-1 = $(STK500) -e -d$(MCU_TARGET) -pf -vf -if$(PROGRAM)_$(TARGET).hex \
|
||||
-lFF -LFF -f$(HFUSE)$(LFUSE) -EF8 -ms -q -cUSB -I200kHz -s -wt
|
||||
STK500-2 = $(STK500) -d$(MCU_TARGET) -ms -q -lCF -LCF -cUSB -I200kHz -s -wt
|
||||
#
|
||||
# End of build environment code.
|
||||
|
||||
|
||||
OBJ = $(PROGRAM).o
|
||||
OPTIMIZE = -Os -fno-inline-small-functions -fno-split-wide-types -mrelax
|
||||
|
||||
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 -nostartfiles -nostdlib
|
||||
#-Wl,--gc-sections
|
||||
|
||||
OBJCOPY = $(GCCROOT)avr-objcopy
|
||||
OBJDUMP = $(call fixpath,$(GCCROOT)avr-objdump)
|
||||
|
||||
SIZE = $(GCCROOT)avr-size
|
||||
|
||||
#
|
||||
# Make command-line Options.
|
||||
# Permit commands like "make atmega328 LED_START_FLASHES=10" to pass the
|
||||
# appropriate parameters ("-DLED_START_FLASHES=10") to gcc
|
||||
#
|
||||
|
||||
ifdef BAUD_RATE
|
||||
BAUD_RATE_CMD = -DBAUD_RATE=$(BAUD_RATE)
|
||||
dummy = FORCE
|
||||
else
|
||||
BAUD_RATE_CMD = -DBAUD_RATE=115200
|
||||
endif
|
||||
|
||||
ifdef LED_START_FLASHES
|
||||
LED_START_FLASHES_CMD = -DLED_START_FLASHES=$(LED_START_FLASHES)
|
||||
dummy = FORCE
|
||||
else
|
||||
LED_START_FLASHES_CMD = -DLED_START_FLASHES=3
|
||||
endif
|
||||
|
||||
# BIG_BOOT: Include extra features, up to 1K.
|
||||
ifdef BIGBOOT
|
||||
BIGBOOT_CMD = -DBIGBOOT=1
|
||||
dummy = FORCE
|
||||
endif
|
||||
|
||||
ifdef SOFT_UART
|
||||
SOFT_UART_CMD = -DSOFT_UART=1
|
||||
dummy = FORCE
|
||||
endif
|
||||
|
||||
ifdef LED_DATA_FLASH
|
||||
LED_DATA_FLASH_CMD = -DLED_DATA_FLASH=1
|
||||
dummy = FORCE
|
||||
endif
|
||||
|
||||
ifdef LED
|
||||
LED_CMD = -DLED=$(LED)
|
||||
dummy = FORCE
|
||||
endif
|
||||
|
||||
ifdef SINGLESPEED
|
||||
SSCMD = -DSINGLESPEED=1
|
||||
endif
|
||||
|
||||
COMMON_OPTIONS = $(BAUD_RATE_CMD) $(LED_START_FLASHES_CMD) $(BIGBOOT_CMD)
|
||||
COMMON_OPTIONS += $(SOFT_UART_CMD) $(LED_DATA_FLASH_CMD) $(LED_CMD) $(SSCMD)
|
||||
|
||||
#UART is handled separately and only passed for devices with more than one.
|
||||
ifdef UART
|
||||
UARTCMD = -DUART=$(UART)
|
||||
endif
|
||||
|
||||
# Not supported yet
|
||||
# ifdef SUPPORT_EEPROM
|
||||
# SUPPORT_EEPROM_CMD = -DSUPPORT_EEPROM
|
||||
# dummy = FORCE
|
||||
# endif
|
||||
|
||||
# Not supported yet
|
||||
# ifdef TIMEOUT_MS
|
||||
# TIMEOUT_MS_CMD = -DTIMEOUT_MS=$(TIMEOUT_MS)
|
||||
# dummy = FORCE
|
||||
# endif
|
||||
#
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# "Chip-level Platform" targets.
|
||||
# A "Chip-level Platform" compiles for a particular chip, but probably does
|
||||
# not have "standard" values for things like clock speed, LED pin, etc.
|
||||
# Makes for chip-level platforms should usually explicitly define their
|
||||
# options like: "make atmega1285 AVR_FREQ=16000000L LED=D0"
|
||||
#---------------------------------------------------------------------------
|
||||
#
|
||||
# Note about fuses:
|
||||
# the efuse should really be 0xf8; since, however, only the lower
|
||||
# three bits of that byte are used on the atmega168, avrdude gets
|
||||
# confused if you specify 1's for the higher bits, see:
|
||||
# http://tinker.it/now/2007/02/24/the-tale-of-avrdude-atmega168-and-extended-bits-fuses/
|
||||
#
|
||||
# similarly, the lock bits should be 0xff instead of 0x3f (to
|
||||
# unlock the bootloader section) and 0xcf instead of 0x2f (to
|
||||
# lock it), but since the high two bits of the lock byte are
|
||||
# unused, avrdude would get confused.
|
||||
#---------------------------------------------------------------------------
|
||||
#
|
||||
|
||||
# Test platforms
|
||||
# Virtual boot block test
|
||||
virboot328: TARGET = atmega328
|
||||
virboot328: MCU_TARGET = atmega328p
|
||||
virboot328: CFLAGS += $(COMMON_OPTIONS) '-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
|
||||
|
||||
# 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 += $(COMMON_OPTIONS)
|
||||
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
|
||||
|
||||
atmega328: TARGET = atmega328
|
||||
atmega328: MCU_TARGET = atmega328p
|
||||
atmega328: CFLAGS += $(COMMON_OPTIONS)
|
||||
atmega328: AVR_FREQ ?= 16000000L
|
||||
atmega328: LDSECTIONS = -Wl,--section-start=.text=0x7c00 -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 ?= FD
|
||||
atmega328_isp: isp
|
||||
|
||||
atmega644p: TARGET = atmega644p
|
||||
atmega644p: MCU_TARGET = atmega644p
|
||||
atmega644p: CFLAGS += $(COMMON_OPTIONS) -DBIGBOOT $(LED_CMD)
|
||||
atmega644p: AVR_FREQ ?= 16000000L
|
||||
atmega644p: LDSECTIONS = -Wl,--section-start=.text=0xfc00 -Wl,--section-start=.version=0xfffe
|
||||
atmega644p: CFLAGS += $(UARTCMD)
|
||||
atmega644p: $(PROGRAM)_atmega644p.hex
|
||||
atmega644p: $(PROGRAM)_atmega644p.lst
|
||||
|
||||
atmega1284: TARGET = atmega1284p
|
||||
atmega1284: MCU_TARGET = atmega1284p
|
||||
atmega1284: CFLAGS += $(COMMON_OPTIONS) -DBIGBOOT $(LED_CMD)
|
||||
atmega1284: AVR_FREQ ?= 16000000L
|
||||
atmega1284: LDSECTIONS = -Wl,--section-start=.text=0x1fc00 -Wl,--section-start=.version=0x1fffe
|
||||
atmega1284: CFLAGS += $(UARTCMD)
|
||||
atmega1284: $(PROGRAM)_atmega1284p.hex
|
||||
atmega1284: $(PROGRAM)_atmega1284p.lst
|
||||
|
||||
atmega1284p: atmega1284
|
||||
|
||||
atmega1284_isp: atmega1284
|
||||
atmega1284_isp: TARGET = atmega1284p
|
||||
atmega1284_isp: MCU_TARGET = atmega1284p
|
||||
# 1024 byte boot
|
||||
atmega1284_isp: HFUSE ?= DE
|
||||
# Full Swing xtal (16MHz) 16KCK/14CK+65ms
|
||||
atmega1284_isp: LFUSE ?= F7
|
||||
# 2.7V brownout
|
||||
atmega1284_isp: EFUSE ?= FD
|
||||
atmega1284_isp: isp
|
||||
|
||||
#Atmega1280
|
||||
atmega1280: MCU_TARGET = atmega1280
|
||||
atmega1280: CFLAGS += $(COMMON_OPTIONS) -DBIGBOOT $(UART_CMD)
|
||||
atmega1280: AVR_FREQ ?= 16000000L
|
||||
atmega1280: LDSECTIONS = -Wl,--section-start=.text=0x1fc00 -Wl,--section-start=.version=0x1fffe
|
||||
atmega1280: $(PROGRAM)_atmega1280.hex
|
||||
atmega1280: $(PROGRAM)_atmega1280.lst
|
||||
|
||||
|
||||
# ATmega8
|
||||
#
|
||||
atmega8: TARGET = atmega8
|
||||
atmega8: MCU_TARGET = atmega8
|
||||
atmega8: CFLAGS += $(COMMON_OPTIONS)
|
||||
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 (for full swing xtal), Bootsize=512B
|
||||
atmega8_isp: HFUSE ?= CC
|
||||
# 2.7V brownout, 16MHz Xtal, 16KCK/14CK+65ms
|
||||
atmega8_isp: LFUSE ?= BF
|
||||
atmega8_isp: isp
|
||||
|
||||
# ATmega88
|
||||
#
|
||||
atmega88: TARGET = atmega88
|
||||
atmega88: MCU_TARGET = atmega88
|
||||
atmega88: CFLAGS += $(COMMON_OPTIONS)
|
||||
atmega88: AVR_FREQ ?= 16000000L
|
||||
atmega88: LDSECTIONS = -Wl,--section-start=.text=0x1e00 -Wl,--section-start=.version=0x1ffe
|
||||
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
|
||||
|
||||
atmega32: TARGET = atmega32
|
||||
atmega32: MCU_TARGET = atmega32
|
||||
atmega32: CFLAGS += $(COMMON_OPTIONS)
|
||||
atmega32: AVR_FREQ ?= 11059200L
|
||||
atmega32: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe
|
||||
atmega32: $(PROGRAM)_atmega32.hex
|
||||
atmega32: $(PROGRAM)_atmega32.lst
|
||||
|
||||
atmega32_isp: atmega32
|
||||
atmega32_isp: TARGET = atmega32
|
||||
atmega32_isp: MCU_TARGET = atmega32
|
||||
# No OCD or JTAG, SPIEN, CKOPT (for full swing xtal), Bootsize=512B
|
||||
atmega32_isp: HFUSE ?= CE
|
||||
# 2.7V brownout, 16MHz Xtal, 16KCK/14CK+65ms
|
||||
atemga32_isp: LFUSE ?= BF
|
||||
atmega32_isp: isp
|
||||
|
||||
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# "Board-level Platform" targets.
|
||||
# A "Board-level Platform" implies a manufactured platform with a particular
|
||||
# AVR_FREQ, LED, and so on. Parameters are not particularly changable from
|
||||
# the "make" command line.
|
||||
# Most of the board-level platform builds should envoke make recursively
|
||||
# appropriate specific options
|
||||
#---------------------------------------------------------------------------
|
||||
# 20MHz clocked platforms
|
||||
#
|
||||
# These are capable of 230400 baud, or 115200 baud on PC (Arduino Avrdude issue)
|
||||
#
|
||||
|
||||
pro20: TARGET = pro_20mhz
|
||||
pro20: CHIP = atmega168
|
||||
pro20:
|
||||
$(MAKE) atmega168 AVR_FREQ=20000000L LED_START_FLASHES=3
|
||||
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
|
||||
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
|
||||
|
||||
pro20_isp: pro20
|
||||
pro20_isp: TARGET = pro_20mhz
|
||||
# 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: CHIP = atmega168
|
||||
pro16:
|
||||
$(MAKE) $(CHIP) AVR_FREQ=16000000L LED_START_FLASHES=3
|
||||
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
|
||||
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
|
||||
|
||||
pro16_isp: pro16
|
||||
pro16_isp: TARGET = pro_16MHz
|
||||
# 2.7V brownout
|
||||
pro16_isp: HFUSE ?= DD
|
||||
# Full swing xtal (20MHz) 258CK/14CK+4.1ms
|
||||
pro16_isp: LFUSE ?= C6
|
||||
# 512 byte boot
|
||||
pro16_isp: EFUSE ?= 04
|
||||
pro16_isp: isp
|
||||
|
||||
diecimila: TARGET = diecimila
|
||||
diecimila: CHIP = atmega168
|
||||
diecimila:
|
||||
$(MAKE) $(CHIP) AVR_FREQ=16000000L LED_START_FLASHES=3
|
||||
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
|
||||
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
|
||||
|
||||
diecimila_isp: diecimila
|
||||
diecimila_isp: TARGET = diecimila
|
||||
# 2.7V brownout
|
||||
diecimila_isp: HFUSE ?= DD
|
||||
# Low power xtal (16MHz) 16KCK/14CK+65ms
|
||||
diecimila_isp: LFUSE ?= FF
|
||||
# 512 byte boot
|
||||
diecimila_isp: EFUSE ?= 04
|
||||
diecimila_isp: isp
|
||||
|
||||
# Sanguino has a minimum boot size of 1024 bytes, so enable extra functions
|
||||
#
|
||||
sanguino: TARGET = $@
|
||||
sanguino: CHIP = atmega644p
|
||||
sanguino:
|
||||
$(MAKE) $(CHIP) AVR_FREQ=16000000L LED=B0
|
||||
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
|
||||
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
|
||||
|
||||
sanguino_isp: sanguino
|
||||
sanguino_isp: TARGET = sanguino
|
||||
sanguino_isp: MCU_TARGET = atmega644p
|
||||
# 1024 byte boot
|
||||
sanguino_isp: HFUSE ?= DE
|
||||
# Full swing xtal (16MHz) 16KCK/14CK+65ms
|
||||
sanguino_isp: LFUSE ?= F7
|
||||
# 2.7V brownout
|
||||
sanguino_isp: EFUSE ?= FD
|
||||
sanguino_isp: isp
|
||||
|
||||
mighty1284: TARGET = $@
|
||||
mighty1284: CHIP = atmega1284p
|
||||
mighty1284:
|
||||
$(MAKE) $(CHIP) AVR_FREQ=16000000L LED=D7
|
||||
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
|
||||
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
|
||||
|
||||
mighty1284_isp: mighty1284
|
||||
mighty1284_isp: TARGET = mighty1284
|
||||
mighty1284_isp: MCU_TARGET = atmega1284p
|
||||
# 1024 byte boot
|
||||
mighty1284_isp: HFUSE ?= DE
|
||||
# Full swing xtal (16MHz) 16KCK/14CK+65ms
|
||||
mighty1284_isp: LFUSE ?= F7
|
||||
# 2.7V brownout
|
||||
mighty1284_isp: EFUSE ?= FD
|
||||
mighty1284_isp: isp
|
||||
|
||||
bobuino: TARGET = $@
|
||||
bobuino: CHIP = atmega1284p
|
||||
bobuino:
|
||||
$(MAKE) $(CHIP) AVR_FREQ=16000000L LED=B5
|
||||
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
|
||||
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
|
||||
|
||||
bobuino_isp: bobuino
|
||||
bobuino_isp: TARGET = bobuino
|
||||
bobuino_isp: MCU_TARGET = atmega1284p
|
||||
# 1024 byte boot
|
||||
bobuino_isp: HFUSE ?= DE
|
||||
# Full swing xtal (16MHz) 16KCK/14CK+65ms
|
||||
bobuino_isp: LFUSE ?= F7
|
||||
# 2.7V brownout
|
||||
bobuino_isp: EFUSE ?= FD
|
||||
bobuino_isp: isp
|
||||
|
||||
# MEGA1280 Board (this is different from the atmega1280 chip platform)
|
||||
# Mega has a minimum boot size of 1024 bytes, so enable extra functions
|
||||
# Note that optiboot does not (can not) work on the MEGA2560
|
||||
#mega: TARGET = atmega1280
|
||||
mega1280: atmega1280
|
||||
|
||||
|
||||
mega1280_isp: mega1280
|
||||
mega1280_isp: TARGET = atmega1280
|
||||
mega1280_isp: MCU_TARGET = atmega1280
|
||||
# 1024 byte boot
|
||||
mega1280_isp: HFUSE ?= DE
|
||||
# Low power xtal (16MHz) 16KCK/14CK+65ms
|
||||
mega1280_isp: LFUSE ?= FF
|
||||
# 2.7V brownout; wants F5 for some reason...
|
||||
mega1280_isp: EFUSE ?= F5
|
||||
mega1280_isp: isp
|
||||
|
||||
# 8MHz clocked platforms
|
||||
#
|
||||
# These are capable of 115200 baud
|
||||
# Note that "new" Arduinos with an AVR as USB/Serial converter will NOT work
|
||||
# with an 8MHz target Arduino. The bitrate errors are in opposite directions,
|
||||
# and total too large a number.
|
||||
#
|
||||
|
||||
lilypad: TARGET = $@
|
||||
lilypad: CHIP = atmega168
|
||||
lilypad:
|
||||
$(MAKE) $(CHIP) AVR_FREQ=8000000L LED_START_FLASHES=3
|
||||
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
|
||||
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
|
||||
|
||||
lilypad_isp: lilypad
|
||||
lilypad_isp: TARGET = lilypad
|
||||
# 2.7V brownout
|
||||
lilypad_isp: HFUSE ?= DD
|
||||
# Internal 8MHz osc (8MHz) Slow rising power
|
||||
lilypad_isp: LFUSE ?= E2
|
||||
# 512 byte boot
|
||||
lilypad_isp: EFUSE ?= 04
|
||||
lilypad_isp: isp
|
||||
|
||||
# lilypad_resonator is the same as a 8MHz lilypad, except for fuses.
|
||||
lilypad_resonator: lilypad
|
||||
|
||||
lilypad_resonator_isp: lilypad
|
||||
lilypad_resonator_isp: TARGET = lilypad
|
||||
# 2.7V brownout
|
||||
lilypad_resonator_isp: HFUSE ?= DD
|
||||
# Full swing xtal (20MHz) 258CK/14CK+4.1ms
|
||||
lilypad_resonator_isp: LFUSE ?= C6
|
||||
# 512 byte boot
|
||||
lilypad_resonator_isp: EFUSE ?= 04
|
||||
lilypad_resonator_isp: isp
|
||||
|
||||
pro8: TARGET = pro_8MHz
|
||||
pro8: CHIP = atmega328
|
||||
pro8:
|
||||
$(MAKE) $(CHIP) AVR_FREQ=8000000L LED_START_FLASHES=3
|
||||
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
|
||||
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
|
||||
|
||||
pro8_isp: pro8
|
||||
pro8_isp: TARGET = pro_8MHz
|
||||
# 2.7V brownout
|
||||
pro8_isp: HFUSE ?= DD
|
||||
# Full swing xtal (20MHz) 258CK/14CK+4.1ms
|
||||
pro8_isp: LFUSE ?= C6
|
||||
# 512 byte boot
|
||||
pro8_isp: EFUSE ?= 04
|
||||
pro8_isp: isp
|
||||
|
||||
atmega328_pro8: TARGET = atmega328_pro_8MHz
|
||||
atmega328_pro8: CHIP = atmega328
|
||||
atmega328_pro8:
|
||||
$(MAKE) $(CHIP) AVR_FREQ=8000000L LED_START_FLASHES=3
|
||||
mv $(PROGRAM)_$(CHIP).hex $(PROGRAM)_$(TARGET).hex
|
||||
mv $(PROGRAM)_$(CHIP).lst $(PROGRAM)_$(TARGET).lst
|
||||
|
||||
atmega328_pro8_isp: atmega328_pro8
|
||||
atmega328_pro8_isp: TARGET = atmega328_pro_8MHz
|
||||
atmega328_pro8_isp: MCU_TARGET = atmega328p
|
||||
# 512 byte boot, SPIEN
|
||||
atmega328_pro8_isp: HFUSE ?= DE
|
||||
# Low power xtal (16MHz) 16KCK/14CK+65ms
|
||||
atmega328_pro8_isp: LFUSE ?= FF
|
||||
# 2.7V brownout
|
||||
atmega328_pro8_isp: EFUSE ?= DE
|
||||
atmega328_pro8_isp: isp
|
||||
|
||||
mysensor_micro: atmega328_pro8
|
||||
mysensor_micro: target = atmega_pro_8MHz
|
||||
mysensor_micro: MCU_TARGET = atmega328p
|
||||
# 512 byte boot, SPIEN
|
||||
mysensor_micro: HFUSE ?= DE
|
||||
# Low power xtal (16MHz) 16KCK/14CK+65ms
|
||||
mysensor_micro: LFUSE ?= FF
|
||||
# 2.7V brownout
|
||||
mysensor_micro: EFUSE ?= DE
|
||||
mysensor_micro: LED=C3
|
||||
mysensor_micro: BAUD_RATE=57600
|
||||
|
||||
# 1MHz clocked platforms
|
||||
#
|
||||
# These are capable of 9600 baud
|
||||
#
|
||||
|
||||
luminet: TARGET = luminet
|
||||
luminet: MCU_TARGET = attiny84
|
||||
luminet: CFLAGS += $(COMMON_OPTIONS) '-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
|
||||
#
|
||||
|
||||
FORCE:
|
||||
|
||||
baudcheck: FORCE
|
||||
- @$(CC) $(CFLAGS) -E baudcheck.c -o baudcheck.tmp.sh
|
||||
- @sh baudcheck.tmp.sh
|
||||
|
||||
isp: $(TARGET)
|
||||
$(MAKE) -f Makefile.isp isp TARGET=$(TARGET)
|
||||
|
||||
isp-stk500: $(PROGRAM)_$(TARGET).hex
|
||||
$(STK500-1)
|
||||
$(STK500-2)
|
||||
|
||||
%.elf: $(OBJ) $(dummy)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBS)
|
||||
$(SIZE) $@
|
||||
|
||||
clean:
|
||||
rm -rf *.o *.elf *.lst *.map *.sym *.lss *.eep *.srec *.bin *.hex *.tmp.sh
|
||||
|
||||
%.lst: %.elf
|
||||
$(OBJDUMP) -h -S $< > $@
|
||||
|
||||
%.hex: %.elf
|
||||
$(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O ihex $< $@
|
||||
|
||||
%.srec: %.elf
|
||||
$(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O srec $< $@
|
||||
|
||||
%.bin: %.elf
|
||||
$(OBJCOPY) -j .text -j .data -j .version --set-section-flags .version=alloc,load -O binary $< $@
|
||||
@@ -0,0 +1,40 @@
|
||||
DualOptiboot
|
||||
============
|
||||
|
||||
Custom Optiboot to add wireless programming capability to Moteino
|
||||
Copyright Felix Rusu (2013-2014), felix@lowpowerlab.com
|
||||
More at: http://lowpowerlab.com/Moteino
|
||||
|
||||
This Optiboot version is modified to add the capability of reflashing
|
||||
from an external SPI flash memory chip. As configured this will work
|
||||
with Moteino (www.lowpowerlab.com/Moteino) provided a SPI flash chip
|
||||
is present on the dedicated onboard footprint.
|
||||
Summary of how this Optiboot version works:
|
||||
- it looks for an external flash chip
|
||||
- if one is found (SPI returns valid data) it will further look
|
||||
for a new sketch flash image signature and size
|
||||
starting at address 0: FLXIMG:9999:XXXXXXXXXXX
|
||||
where: - 'FLXIMG' is fixed signature indicating FLASH chip
|
||||
contains a valid new flash image to be burned
|
||||
- '9999' are 4 size bytes indicating how long the
|
||||
new flash image is (how many bytes to read)
|
||||
- 'XXXXXX' are the de-hexified bytes of the flash
|
||||
pages to be burned
|
||||
- ':' colons have fixed positions (delimiters)
|
||||
- if no valid signature/size are found, it will skip and
|
||||
function as it normally would (listen to STK500 protocol on serial port)
|
||||
|
||||
The added code will result in a compiled size of just under 1kb
|
||||
(Originally Optiboot takes just under 0.5kb)
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------
|
||||
|
||||
To compile copy the Optiboot.c and Makefile files where Optiboot is originally located, mine is at:
|
||||
arduino-install-dir\hardware\arduino\bootloaders\optiboot\
|
||||
Backup the original files andbefore overwrite both files.
|
||||
Then compile by running:
|
||||
make atmega328
|
||||
make atmega1284p
|
||||
|
||||
##License
|
||||
GPL 3.0. See License.txt file.
|
||||
@@ -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_ */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,67 @@
|
||||
:107C00001F92CDB7DEB7112484B714BE81FD06C024
|
||||
:107C100083FF03C08983F4D08981E3D185E0809319
|
||||
:107C2000810082E08093C00088E18093C10096E0EB
|
||||
:107C30009093C20090E19093C400809360008EE026
|
||||
:107C4000809360003B9A86E028E13EEF91E030931C
|
||||
:107C500085002093840096BBB09BFECF339AA895F5
|
||||
:107C60008150A9F7612C712C08E128E0F22EEE2456
|
||||
:107C7000E39435E0D32E41E1C42E13E08BD181345F
|
||||
:107C800069F488D1898394D189818238F9F0813867
|
||||
:107C900011F485E001C083E076D17BC0823411F419
|
||||
:107CA00084E103C0853419F485E08ED172C0853536
|
||||
:107CB00049F470D1B82E6ED16B2C712C782A660CD9
|
||||
:107CC000771C66C0863521F484E07ED180E0E4CF65
|
||||
:107CD000843609F03FC05ED15DD1982E5BD161142E
|
||||
:107CE00080E7780618F4F30117BFE895A12CBB24B0
|
||||
:107CF000B39450D1F50181935F019E12FACF6114C4
|
||||
:107D0000F0E77F0618F0F30117BFE89551D107B6E9
|
||||
:107D100000FCFDCFA301A0E0B1E08C9112969D0183
|
||||
:107D200021503109F901208190E0922BFA010C01D8
|
||||
:107D3000E7BEE89511244E5F5F4FA038F1E0BF0722
|
||||
:107D400061F7F301D7BEE89507B600FCFDCFC7BECB
|
||||
:107D5000E8951FC0843769F41DD11CD1B82E1AD103
|
||||
:107D600027D1F30185913F010ED1BA94B110F9CF1B
|
||||
:107D700010C0853739F41CD18EE105D185E903D1D6
|
||||
:107D80008FE08ACF813521F400936000F09260008B
|
||||
:107D90000FD180E1F8D072CF8EBD0DB407FEFDCFBC
|
||||
:107DA0008EB50895289885E0F7DF80E0F5DF289A02
|
||||
:107DB00081700895CF93C82F662321F060E086E09C
|
||||
:107DC000F9DF289AEFDF8111FDCF28988C2FCF9112
|
||||
:107DD000E3CFCF92DF92EF92FF926B017C0160E0E4
|
||||
:107DE00083E0E8DF8E2DD8DF8D2DD6DF8C2DD4DF1C
|
||||
:107DF00080E0D2DF289AFF90EF90DF90CF90089537
|
||||
:107E00009F92AF92BF92CF92DF92EF92FF920F9329
|
||||
:107E10001F93CF93DF9388E18093600010926000FE
|
||||
:107E200084B18D6284B9289A2A9A8CB580658CBDFC
|
||||
:107E300028988FE9B1DF80E0AFDF289A81508E3F2C
|
||||
:107E400008F095C061E081E0B5DF80E0A5DF289A09
|
||||
:107E500060E070E0CB01BDDF863409F088C061E0EE
|
||||
:107E600070E080E090E0B5DF8C3409F080C062E023
|
||||
:107E700070E080E090E0ADDF883509F078C066E022
|
||||
:107E800070E080E090E0A5DF8A3309F070C069E01F
|
||||
:107E900070E080E090E09DDF8A3309F068C067E021
|
||||
:107EA00070E080E090E095DFC82F68E070E080E04F
|
||||
:107EB00090E08FDFD0E0DC2FCC27C82BC0FD57C06F
|
||||
:107EC000339AC12CD12C00E010E0BB24B39483E0A2
|
||||
:107ED000A82E95E0992E0C171D0770F5B801665F66
|
||||
:107EE0007F4F80E090E075DFE82EF12CB801655FF0
|
||||
:107EF0007F4F80E090E06DDFF82AF8010701B7BE00
|
||||
:107F0000E89511240E5F1F4FC8018F779927892BA1
|
||||
:107F100019F00C171D07F9F6F601A7BEE89507B68C
|
||||
:107F200000FCFDCFF60197BEE89507B600FCFDCF3B
|
||||
:107F3000F0E8CF0ED11CCFCF339881E187BFE89511
|
||||
:107F40002A9661E0C130D04810F482E501C088ED86
|
||||
:107F500031DF80E021DF80E01FDF80E01DDF289A35
|
||||
:107F600088E18093600088E080936000FFCFDF911C
|
||||
:107F7000CF911F910F91FF90EF90DF90CF90BF9026
|
||||
:107F8000AF909F9008959091C00095FFFCCF809393
|
||||
:107F9000C6000895339A8091C00087FFFCCF80917E
|
||||
:107FA000C00084FD01C0A8958091C600339A089551
|
||||
:107FB000F1DF803239F088E18093600088E08093BF
|
||||
:107FC0006000FFCF84E1DFCFCF93C82FE3DFC15044
|
||||
:107FD000E9F7CF91EDCFE0E6F0E098E19083808380
|
||||
:107FE0000895282EE0E6F0E088E180831082EE27F5
|
||||
:047FF000FF270994CA
|
||||
:027FFE0000057C
|
||||
:0400000300007C007D
|
||||
:00000001FF
|
||||
@@ -0,0 +1,787 @@
|
||||
|
||||
optiboot_atmega328.elf: filformat elf32-avr
|
||||
|
||||
Sektioner:
|
||||
Idx Navn Størrelse VMA LMA Filoffs Just
|
||||
0 .data 00000000 00800100 00007ff4 00000468 2**0
|
||||
CONTENTS, ALLOC, LOAD, DATA
|
||||
1 .text 000003f4 00007c00 00007c00 00000074 2**1
|
||||
CONTENTS, ALLOC, LOAD, READONLY, CODE
|
||||
2 .version 00000002 00007ffe 00007ffe 00000468 2**0
|
||||
CONTENTS, READONLY
|
||||
3 .stab 000011c4 00000000 00000000 0000046c 2**2
|
||||
CONTENTS, READONLY, DEBUGGING
|
||||
4 .stabstr 00000ddc 00000000 00000000 00001630 2**0
|
||||
CONTENTS, READONLY, DEBUGGING
|
||||
5 .comment 00000027 00000000 00000000 0000240c 2**0
|
||||
CONTENTS, READONLY
|
||||
|
||||
Disassemblering af sektion .text:
|
||||
|
||||
00007c00 <main>:
|
||||
7c00: 1f 92 push r1
|
||||
7c02: cd b7 in r28, 0x3d ; 61
|
||||
7c04: de b7 in r29, 0x3e ; 62
|
||||
7c06: 11 24 eor r1, r1
|
||||
7c08: 84 b7 in r24, 0x34 ; 52
|
||||
7c0a: 14 be out 0x34, r1 ; 52
|
||||
7c0c: 81 fd sbrc r24, 1
|
||||
7c0e: 06 c0 rjmp .+12 ; 0x7c1c <main+0x1c>
|
||||
7c10: 83 ff sbrs r24, 3
|
||||
7c12: 03 c0 rjmp .+6 ; 0x7c1a <main+0x1a>
|
||||
7c14: 89 83 std Y+1, r24 ; 0x01
|
||||
7c16: f4 d0 rcall .+488 ; 0x7e00 <CheckFlashImage>
|
||||
7c18: 89 81 ldd r24, Y+1 ; 0x01
|
||||
7c1a: e3 d1 rcall .+966 ; 0x7fe2 <appStart>
|
||||
7c1c: 85 e0 ldi r24, 0x05 ; 5
|
||||
7c1e: 80 93 81 00 sts 0x0081, r24
|
||||
7c22: 82 e0 ldi r24, 0x02 ; 2
|
||||
7c24: 80 93 c0 00 sts 0x00C0, r24
|
||||
7c28: 88 e1 ldi r24, 0x18 ; 24
|
||||
7c2a: 80 93 c1 00 sts 0x00C1, r24
|
||||
7c2e: 96 e0 ldi r25, 0x06 ; 6
|
||||
7c30: 90 93 c2 00 sts 0x00C2, r25
|
||||
7c34: 90 e1 ldi r25, 0x10 ; 16
|
||||
7c36: 90 93 c4 00 sts 0x00C4, r25
|
||||
7c3a: 80 93 60 00 sts 0x0060, r24
|
||||
7c3e: 8e e0 ldi r24, 0x0E ; 14
|
||||
7c40: 80 93 60 00 sts 0x0060, r24
|
||||
7c44: 3b 9a sbi 0x07, 3 ; 7
|
||||
7c46: 86 e0 ldi r24, 0x06 ; 6
|
||||
7c48: 28 e1 ldi r18, 0x18 ; 24
|
||||
7c4a: 3e ef ldi r19, 0xFE ; 254
|
||||
7c4c: 91 e0 ldi r25, 0x01 ; 1
|
||||
7c4e: 30 93 85 00 sts 0x0085, r19
|
||||
7c52: 20 93 84 00 sts 0x0084, r18
|
||||
7c56: 96 bb out 0x16, r25 ; 22
|
||||
7c58: b0 9b sbis 0x16, 0 ; 22
|
||||
7c5a: fe cf rjmp .-4 ; 0x7c58 <main+0x58>
|
||||
7c5c: 33 9a sbi 0x06, 3 ; 6
|
||||
7c5e: a8 95 wdr
|
||||
7c60: 81 50 subi r24, 0x01 ; 1
|
||||
7c62: a9 f7 brne .-22 ; 0x7c4e <main+0x4e>
|
||||
7c64: 61 2c mov r6, r1
|
||||
7c66: 71 2c mov r7, r1
|
||||
7c68: 08 e1 ldi r16, 0x18 ; 24
|
||||
7c6a: 28 e0 ldi r18, 0x08 ; 8
|
||||
7c6c: f2 2e mov r15, r18
|
||||
7c6e: ee 24 eor r14, r14
|
||||
7c70: e3 94 inc r14
|
||||
7c72: 35 e0 ldi r19, 0x05 ; 5
|
||||
7c74: d3 2e mov r13, r19
|
||||
7c76: 41 e1 ldi r20, 0x11 ; 17
|
||||
7c78: c4 2e mov r12, r20
|
||||
7c7a: 13 e0 ldi r17, 0x03 ; 3
|
||||
7c7c: 8b d1 rcall .+790 ; 0x7f94 <getch>
|
||||
7c7e: 81 34 cpi r24, 0x41 ; 65
|
||||
7c80: 69 f4 brne .+26 ; 0x7c9c <main+0x9c>
|
||||
7c82: 88 d1 rcall .+784 ; 0x7f94 <getch>
|
||||
7c84: 89 83 std Y+1, r24 ; 0x01
|
||||
7c86: 94 d1 rcall .+808 ; 0x7fb0 <verifySpace>
|
||||
7c88: 89 81 ldd r24, Y+1 ; 0x01
|
||||
7c8a: 82 38 cpi r24, 0x82 ; 130
|
||||
7c8c: f9 f0 breq .+62 ; 0x7ccc <main+0xcc>
|
||||
7c8e: 81 38 cpi r24, 0x81 ; 129
|
||||
7c90: 11 f4 brne .+4 ; 0x7c96 <main+0x96>
|
||||
7c92: 85 e0 ldi r24, 0x05 ; 5
|
||||
7c94: 01 c0 rjmp .+2 ; 0x7c98 <main+0x98>
|
||||
7c96: 83 e0 ldi r24, 0x03 ; 3
|
||||
7c98: 76 d1 rcall .+748 ; 0x7f86 <putch>
|
||||
7c9a: 7b c0 rjmp .+246 ; 0x7d92 <main+0x192>
|
||||
7c9c: 82 34 cpi r24, 0x42 ; 66
|
||||
7c9e: 11 f4 brne .+4 ; 0x7ca4 <main+0xa4>
|
||||
7ca0: 84 e1 ldi r24, 0x14 ; 20
|
||||
7ca2: 03 c0 rjmp .+6 ; 0x7caa <main+0xaa>
|
||||
7ca4: 85 34 cpi r24, 0x45 ; 69
|
||||
7ca6: 19 f4 brne .+6 ; 0x7cae <main+0xae>
|
||||
7ca8: 85 e0 ldi r24, 0x05 ; 5
|
||||
7caa: 8e d1 rcall .+796 ; 0x7fc8 <getNch>
|
||||
7cac: 72 c0 rjmp .+228 ; 0x7d92 <main+0x192>
|
||||
7cae: 85 35 cpi r24, 0x55 ; 85
|
||||
7cb0: 49 f4 brne .+18 ; 0x7cc4 <main+0xc4>
|
||||
7cb2: 70 d1 rcall .+736 ; 0x7f94 <getch>
|
||||
7cb4: b8 2e mov r11, r24
|
||||
7cb6: 6e d1 rcall .+732 ; 0x7f94 <getch>
|
||||
7cb8: 6b 2c mov r6, r11
|
||||
7cba: 71 2c mov r7, r1
|
||||
7cbc: 78 2a or r7, r24
|
||||
7cbe: 66 0c add r6, r6
|
||||
7cc0: 77 1c adc r7, r7
|
||||
7cc2: 66 c0 rjmp .+204 ; 0x7d90 <main+0x190>
|
||||
7cc4: 86 35 cpi r24, 0x56 ; 86
|
||||
7cc6: 21 f4 brne .+8 ; 0x7cd0 <main+0xd0>
|
||||
7cc8: 84 e0 ldi r24, 0x04 ; 4
|
||||
7cca: 7e d1 rcall .+764 ; 0x7fc8 <getNch>
|
||||
7ccc: 80 e0 ldi r24, 0x00 ; 0
|
||||
7cce: e4 cf rjmp .-56 ; 0x7c98 <main+0x98>
|
||||
7cd0: 84 36 cpi r24, 0x64 ; 100
|
||||
7cd2: 09 f0 breq .+2 ; 0x7cd6 <main+0xd6>
|
||||
7cd4: 3f c0 rjmp .+126 ; 0x7d54 <main+0x154>
|
||||
7cd6: 5e d1 rcall .+700 ; 0x7f94 <getch>
|
||||
7cd8: 5d d1 rcall .+698 ; 0x7f94 <getch>
|
||||
7cda: 98 2e mov r9, r24
|
||||
7cdc: 5b d1 rcall .+694 ; 0x7f94 <getch>
|
||||
7cde: 61 14 cp r6, r1
|
||||
7ce0: 80 e7 ldi r24, 0x70 ; 112
|
||||
7ce2: 78 06 cpc r7, r24
|
||||
7ce4: 18 f4 brcc .+6 ; 0x7cec <main+0xec>
|
||||
7ce6: f3 01 movw r30, r6
|
||||
7ce8: 17 bf out 0x37, r17 ; 55
|
||||
7cea: e8 95 spm
|
||||
7cec: a1 2c mov r10, r1
|
||||
7cee: bb 24 eor r11, r11
|
||||
7cf0: b3 94 inc r11
|
||||
7cf2: 50 d1 rcall .+672 ; 0x7f94 <getch>
|
||||
7cf4: f5 01 movw r30, r10
|
||||
7cf6: 81 93 st Z+, r24
|
||||
7cf8: 5f 01 movw r10, r30
|
||||
7cfa: 9e 12 cpse r9, r30
|
||||
7cfc: fa cf rjmp .-12 ; 0x7cf2 <main+0xf2>
|
||||
7cfe: 61 14 cp r6, r1
|
||||
7d00: f0 e7 ldi r31, 0x70 ; 112
|
||||
7d02: 7f 06 cpc r7, r31
|
||||
7d04: 18 f0 brcs .+6 ; 0x7d0c <main+0x10c>
|
||||
7d06: f3 01 movw r30, r6
|
||||
7d08: 17 bf out 0x37, r17 ; 55
|
||||
7d0a: e8 95 spm
|
||||
7d0c: 51 d1 rcall .+674 ; 0x7fb0 <verifySpace>
|
||||
7d0e: 07 b6 in r0, 0x37 ; 55
|
||||
7d10: 00 fc sbrc r0, 0
|
||||
7d12: fd cf rjmp .-6 ; 0x7d0e <main+0x10e>
|
||||
7d14: a3 01 movw r20, r6
|
||||
7d16: a0 e0 ldi r26, 0x00 ; 0
|
||||
7d18: b1 e0 ldi r27, 0x01 ; 1
|
||||
7d1a: 8c 91 ld r24, X
|
||||
7d1c: 12 96 adiw r26, 0x02 ; 2
|
||||
7d1e: 9d 01 movw r18, r26
|
||||
7d20: 21 50 subi r18, 0x01 ; 1
|
||||
7d22: 31 09 sbc r19, r1
|
||||
7d24: f9 01 movw r30, r18
|
||||
7d26: 20 81 ld r18, Z
|
||||
7d28: 90 e0 ldi r25, 0x00 ; 0
|
||||
7d2a: 92 2b or r25, r18
|
||||
7d2c: fa 01 movw r30, r20
|
||||
7d2e: 0c 01 movw r0, r24
|
||||
7d30: e7 be out 0x37, r14 ; 55
|
||||
7d32: e8 95 spm
|
||||
7d34: 11 24 eor r1, r1
|
||||
7d36: 4e 5f subi r20, 0xFE ; 254
|
||||
7d38: 5f 4f sbci r21, 0xFF ; 255
|
||||
7d3a: a0 38 cpi r26, 0x80 ; 128
|
||||
7d3c: f1 e0 ldi r31, 0x01 ; 1
|
||||
7d3e: bf 07 cpc r27, r31
|
||||
7d40: 61 f7 brne .-40 ; 0x7d1a <main+0x11a>
|
||||
7d42: f3 01 movw r30, r6
|
||||
7d44: d7 be out 0x37, r13 ; 55
|
||||
7d46: e8 95 spm
|
||||
7d48: 07 b6 in r0, 0x37 ; 55
|
||||
7d4a: 00 fc sbrc r0, 0
|
||||
7d4c: fd cf rjmp .-6 ; 0x7d48 <main+0x148>
|
||||
7d4e: c7 be out 0x37, r12 ; 55
|
||||
7d50: e8 95 spm
|
||||
7d52: 1f c0 rjmp .+62 ; 0x7d92 <main+0x192>
|
||||
7d54: 84 37 cpi r24, 0x74 ; 116
|
||||
7d56: 69 f4 brne .+26 ; 0x7d72 <main+0x172>
|
||||
7d58: 1d d1 rcall .+570 ; 0x7f94 <getch>
|
||||
7d5a: 1c d1 rcall .+568 ; 0x7f94 <getch>
|
||||
7d5c: b8 2e mov r11, r24
|
||||
7d5e: 1a d1 rcall .+564 ; 0x7f94 <getch>
|
||||
7d60: 27 d1 rcall .+590 ; 0x7fb0 <verifySpace>
|
||||
7d62: f3 01 movw r30, r6
|
||||
7d64: 85 91 lpm r24, Z+
|
||||
7d66: 3f 01 movw r6, r30
|
||||
7d68: 0e d1 rcall .+540 ; 0x7f86 <putch>
|
||||
7d6a: ba 94 dec r11
|
||||
7d6c: b1 10 cpse r11, r1
|
||||
7d6e: f9 cf rjmp .-14 ; 0x7d62 <main+0x162>
|
||||
7d70: 10 c0 rjmp .+32 ; 0x7d92 <main+0x192>
|
||||
7d72: 85 37 cpi r24, 0x75 ; 117
|
||||
7d74: 39 f4 brne .+14 ; 0x7d84 <main+0x184>
|
||||
7d76: 1c d1 rcall .+568 ; 0x7fb0 <verifySpace>
|
||||
7d78: 8e e1 ldi r24, 0x1E ; 30
|
||||
7d7a: 05 d1 rcall .+522 ; 0x7f86 <putch>
|
||||
7d7c: 85 e9 ldi r24, 0x95 ; 149
|
||||
7d7e: 03 d1 rcall .+518 ; 0x7f86 <putch>
|
||||
7d80: 8f e0 ldi r24, 0x0F ; 15
|
||||
7d82: 8a cf rjmp .-236 ; 0x7c98 <main+0x98>
|
||||
7d84: 81 35 cpi r24, 0x51 ; 81
|
||||
7d86: 21 f4 brne .+8 ; 0x7d90 <main+0x190>
|
||||
7d88: 00 93 60 00 sts 0x0060, r16
|
||||
7d8c: f0 92 60 00 sts 0x0060, r15
|
||||
7d90: 0f d1 rcall .+542 ; 0x7fb0 <verifySpace>
|
||||
7d92: 80 e1 ldi r24, 0x10 ; 16
|
||||
7d94: f8 d0 rcall .+496 ; 0x7f86 <putch>
|
||||
7d96: 72 cf rjmp .-284 ; 0x7c7c <main+0x7c>
|
||||
|
||||
00007d98 <SPI_transfer>:
|
||||
#define SPIFLASH_JEDECID 0x9F // read JEDEC ID
|
||||
//#define DEBUG_ON // uncomment to enable Serial debugging
|
||||
// (will output different characters depending on which path the bootloader takes)
|
||||
|
||||
uint8_t SPI_transfer(uint8_t _data) {
|
||||
SPDR = _data;
|
||||
7d98: 8e bd out 0x2e, r24 ; 46
|
||||
while (!(SPSR & _BV(SPIF)));
|
||||
7d9a: 0d b4 in r0, 0x2d ; 45
|
||||
7d9c: 07 fe sbrs r0, 7
|
||||
7d9e: fd cf rjmp .-6 ; 0x7d9a <SPI_transfer+0x2>
|
||||
return SPDR;
|
||||
7da0: 8e b5 in r24, 0x2e ; 46
|
||||
}
|
||||
7da2: 08 95 ret
|
||||
|
||||
00007da4 <FLASH_busy>:
|
||||
|
||||
uint8_t FLASH_busy()
|
||||
{
|
||||
FLASH_SELECT;
|
||||
7da4: 28 98 cbi 0x05, 0 ; 5
|
||||
SPI_transfer(SPIFLASH_STATUSREAD);
|
||||
7da6: 85 e0 ldi r24, 0x05 ; 5
|
||||
7da8: f7 df rcall .-18 ; 0x7d98 <SPI_transfer>
|
||||
7daa: 80 e0 ldi r24, 0x00 ; 0
|
||||
uint8_t status = SPI_transfer(0);
|
||||
7dac: f5 df rcall .-22 ; 0x7d98 <SPI_transfer>
|
||||
7dae: 28 9a sbi 0x05, 0 ; 5
|
||||
7db0: 81 70 andi r24, 0x01 ; 1
|
||||
FLASH_UNSELECT;
|
||||
7db2: 08 95 ret
|
||||
|
||||
00007db4 <FLASH_command>:
|
||||
return status & 1;
|
||||
}
|
||||
|
||||
void FLASH_command(uint8_t cmd, uint8_t isWrite){
|
||||
7db4: cf 93 push r28
|
||||
7db6: c8 2f mov r28, r24
|
||||
if (isWrite)
|
||||
7db8: 66 23 and r22, r22
|
||||
7dba: 21 f0 breq .+8 ; 0x7dc4 <FLASH_command+0x10>
|
||||
{
|
||||
FLASH_command(SPIFLASH_WRITEENABLE, 0); // Write Enable
|
||||
7dbc: 60 e0 ldi r22, 0x00 ; 0
|
||||
7dbe: 86 e0 ldi r24, 0x06 ; 6
|
||||
7dc0: f9 df rcall .-14 ; 0x7db4 <FLASH_command>
|
||||
7dc2: 28 9a sbi 0x05, 0 ; 5
|
||||
FLASH_UNSELECT;
|
||||
7dc4: ef df rcall .-34 ; 0x7da4 <FLASH_busy>
|
||||
}
|
||||
while(FLASH_busy()); //wait for chip to become available
|
||||
7dc6: 81 11 cpse r24, r1
|
||||
7dc8: fd cf rjmp .-6 ; 0x7dc4 <FLASH_command+0x10>
|
||||
7dca: 28 98 cbi 0x05, 0 ; 5
|
||||
7dcc: 8c 2f mov r24, r28
|
||||
FLASH_SELECT;
|
||||
7dce: cf 91 pop r28
|
||||
SPI_transfer(cmd);
|
||||
7dd0: e3 cf rjmp .-58 ; 0x7d98 <SPI_transfer>
|
||||
|
||||
00007dd2 <FLASH_readByte>:
|
||||
}
|
||||
|
||||
uint8_t FLASH_readByte(uint32_t addr) {
|
||||
7dd2: cf 92 push r12
|
||||
7dd4: df 92 push r13
|
||||
7dd6: ef 92 push r14
|
||||
7dd8: ff 92 push r15
|
||||
7dda: 6b 01 movw r12, r22
|
||||
7ddc: 7c 01 movw r14, r24
|
||||
FLASH_command(SPIFLASH_ARRAYREADLOWFREQ, 0);
|
||||
7dde: 60 e0 ldi r22, 0x00 ; 0
|
||||
7de0: 83 e0 ldi r24, 0x03 ; 3
|
||||
7de2: e8 df rcall .-48 ; 0x7db4 <FLASH_command>
|
||||
7de4: 8e 2d mov r24, r14
|
||||
SPI_transfer(addr >> 16);
|
||||
7de6: d8 df rcall .-80 ; 0x7d98 <SPI_transfer>
|
||||
7de8: 8d 2d mov r24, r13
|
||||
7dea: d6 df rcall .-84 ; 0x7d98 <SPI_transfer>
|
||||
SPI_transfer(addr >> 8);
|
||||
7dec: 8c 2d mov r24, r12
|
||||
7dee: d4 df rcall .-88 ; 0x7d98 <SPI_transfer>
|
||||
7df0: 80 e0 ldi r24, 0x00 ; 0
|
||||
SPI_transfer(addr);
|
||||
7df2: d2 df rcall .-92 ; 0x7d98 <SPI_transfer>
|
||||
7df4: 28 9a sbi 0x05, 0 ; 5
|
||||
7df6: ff 90 pop r15
|
||||
//SPI.transfer(0); //"dont care", needed with SPIFLASH_ARRAYREAD command only
|
||||
uint8_t result = SPI_transfer(0);
|
||||
7df8: ef 90 pop r14
|
||||
7dfa: df 90 pop r13
|
||||
7dfc: cf 90 pop r12
|
||||
FLASH_UNSELECT;
|
||||
7dfe: 08 95 ret
|
||||
|
||||
00007e00 <CheckFlashImage>:
|
||||
return result;
|
||||
}
|
||||
|
||||
void CheckFlashImage() {
|
||||
7e00: 9f 92 push r9
|
||||
7e02: af 92 push r10
|
||||
7e04: bf 92 push r11
|
||||
7e06: cf 92 push r12
|
||||
7e08: df 92 push r13
|
||||
7e0a: ef 92 push r14
|
||||
7e0c: ff 92 push r15
|
||||
7e0e: 0f 93 push r16
|
||||
7e10: 1f 93 push r17
|
||||
7e12: cf 93 push r28
|
||||
7e14: df 93 push r29
|
||||
"wdr\n"
|
||||
);
|
||||
}
|
||||
|
||||
void watchdogConfig(uint8_t x) {
|
||||
WDTCSR = _BV(WDCE) | _BV(WDE);
|
||||
7e16: 88 e1 ldi r24, 0x18 ; 24
|
||||
7e18: 80 93 60 00 sts 0x0060, r24
|
||||
WDTCSR = x;
|
||||
7e1c: 10 92 60 00 sts 0x0060, r1
|
||||
#endif
|
||||
watchdogConfig(WATCHDOG_OFF);
|
||||
|
||||
//SPI INIT
|
||||
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega88) || defined(__AVR_ATmega8__) || defined(__AVR_ATmega88__)
|
||||
DDRB |= _BV(FLASHSS) | _BV(SS) | _BV(PB3) | _BV(PB5); //OUTPUTS for FLASH_SS and SS, MOSI, SCK
|
||||
7e20: 84 b1 in r24, 0x04 ; 4
|
||||
7e22: 8d 62 ori r24, 0x2D ; 45
|
||||
7e24: 84 b9 out 0x04, r24 ; 4
|
||||
FLASH_UNSELECT; //unselect FLASH chip
|
||||
7e26: 28 9a sbi 0x05, 0 ; 5
|
||||
PORTB |= _BV(SS); //set SS HIGH
|
||||
7e28: 2a 9a sbi 0x05, 2 ; 5
|
||||
//SPCR = (SPCR & ~SPI_MODE_MASK) | SPI_MODE0 ; //SPI MODE 0
|
||||
//SPCR = (SPCR & ~SPI_CLOCK_MASK) | (SPI_CLOCK_DIV2 & SPI_CLOCK_MASK); //clock divider = 2
|
||||
//SPSR = (SPSR & ~SPI_2XCLOCK_MASK) | ((SPI_CLOCK_DIV2 >> 2) & SPI_2XCLOCK_MASK);
|
||||
|
||||
// Warning: if the SS pin ever becomes a LOW INPUT then SPI automatically switches to Slave, so the data direction of the SS pin MUST be kept as OUTPUT.
|
||||
SPCR |= _BV(MSTR) | _BV(SPE); //enable SPI and set SPI to MASTER mode
|
||||
7e2a: 8c b5 in r24, 0x2c ; 44
|
||||
7e2c: 80 65 ori r24, 0x50 ; 80
|
||||
7e2e: 8c bd out 0x2c, r24 ; 44
|
||||
|
||||
//read first byte of JEDECID, if chip is present it should return a non-0 and non-FF value
|
||||
FLASH_SELECT;
|
||||
7e30: 28 98 cbi 0x05, 0 ; 5
|
||||
SPI_transfer(SPIFLASH_JEDECID);
|
||||
7e32: 8f e9 ldi r24, 0x9F ; 159
|
||||
7e34: b1 df rcall .-158 ; 0x7d98 <SPI_transfer>
|
||||
7e36: 80 e0 ldi r24, 0x00 ; 0
|
||||
uint8_t deviceId = SPI_transfer(0);
|
||||
7e38: af df rcall .-162 ; 0x7d98 <SPI_transfer>
|
||||
7e3a: 28 9a sbi 0x05, 0 ; 5
|
||||
7e3c: 81 50 subi r24, 0x01 ; 1
|
||||
FLASH_UNSELECT;
|
||||
7e3e: 8e 3f cpi r24, 0xFE ; 254
|
||||
if (deviceId==0 || deviceId==0xFF) return;
|
||||
7e40: 08 f0 brcs .+2 ; 0x7e44 <CheckFlashImage+0x44>
|
||||
7e42: 95 c0 rjmp .+298 ; 0x7f6e <CheckFlashImage+0x16e>
|
||||
7e44: 61 e0 ldi r22, 0x01 ; 1
|
||||
7e46: 81 e0 ldi r24, 0x01 ; 1
|
||||
|
||||
//global unprotect
|
||||
FLASH_command(SPIFLASH_STATUSWRITE, 1);
|
||||
7e48: b5 df rcall .-150 ; 0x7db4 <FLASH_command>
|
||||
7e4a: 80 e0 ldi r24, 0x00 ; 0
|
||||
7e4c: a5 df rcall .-182 ; 0x7d98 <SPI_transfer>
|
||||
7e4e: 28 9a sbi 0x05, 0 ; 5
|
||||
SPI_transfer(0);
|
||||
7e50: 60 e0 ldi r22, 0x00 ; 0
|
||||
7e52: 70 e0 ldi r23, 0x00 ; 0
|
||||
7e54: cb 01 movw r24, r22
|
||||
FLASH_UNSELECT;
|
||||
7e56: bd df rcall .-134 ; 0x7dd2 <FLASH_readByte>
|
||||
|
||||
//check if any flash image exists on external FLASH chip
|
||||
if (FLASH_readByte(0)=='F' && FLASH_readByte(1)=='L' && FLASH_readByte(2)=='X' && FLASH_readByte(6)==':' && FLASH_readByte(9)==':')
|
||||
7e58: 86 34 cpi r24, 0x46 ; 70
|
||||
7e5a: 09 f0 breq .+2 ; 0x7e5e <CheckFlashImage+0x5e>
|
||||
7e5c: 88 c0 rjmp .+272 ; 0x7f6e <CheckFlashImage+0x16e>
|
||||
7e5e: 61 e0 ldi r22, 0x01 ; 1
|
||||
7e60: 70 e0 ldi r23, 0x00 ; 0
|
||||
7e62: 80 e0 ldi r24, 0x00 ; 0
|
||||
7e64: 90 e0 ldi r25, 0x00 ; 0
|
||||
7e66: b5 df rcall .-150 ; 0x7dd2 <FLASH_readByte>
|
||||
7e68: 8c 34 cpi r24, 0x4C ; 76
|
||||
7e6a: 09 f0 breq .+2 ; 0x7e6e <CheckFlashImage+0x6e>
|
||||
7e6c: 80 c0 rjmp .+256 ; 0x7f6e <CheckFlashImage+0x16e>
|
||||
7e6e: 62 e0 ldi r22, 0x02 ; 2
|
||||
7e70: 70 e0 ldi r23, 0x00 ; 0
|
||||
7e72: 80 e0 ldi r24, 0x00 ; 0
|
||||
7e74: 90 e0 ldi r25, 0x00 ; 0
|
||||
7e76: ad df rcall .-166 ; 0x7dd2 <FLASH_readByte>
|
||||
7e78: 88 35 cpi r24, 0x58 ; 88
|
||||
7e7a: 09 f0 breq .+2 ; 0x7e7e <CheckFlashImage+0x7e>
|
||||
7e7c: 78 c0 rjmp .+240 ; 0x7f6e <CheckFlashImage+0x16e>
|
||||
7e7e: 66 e0 ldi r22, 0x06 ; 6
|
||||
7e80: 70 e0 ldi r23, 0x00 ; 0
|
||||
7e82: 80 e0 ldi r24, 0x00 ; 0
|
||||
7e84: 90 e0 ldi r25, 0x00 ; 0
|
||||
7e86: a5 df rcall .-182 ; 0x7dd2 <FLASH_readByte>
|
||||
7e88: 8a 33 cpi r24, 0x3A ; 58
|
||||
7e8a: 09 f0 breq .+2 ; 0x7e8e <CheckFlashImage+0x8e>
|
||||
7e8c: 70 c0 rjmp .+224 ; 0x7f6e <CheckFlashImage+0x16e>
|
||||
7e8e: 69 e0 ldi r22, 0x09 ; 9
|
||||
7e90: 70 e0 ldi r23, 0x00 ; 0
|
||||
7e92: 80 e0 ldi r24, 0x00 ; 0
|
||||
7e94: 90 e0 ldi r25, 0x00 ; 0
|
||||
7e96: 9d df rcall .-198 ; 0x7dd2 <FLASH_readByte>
|
||||
7e98: 8a 33 cpi r24, 0x3A ; 58
|
||||
7e9a: 09 f0 breq .+2 ; 0x7e9e <CheckFlashImage+0x9e>
|
||||
7e9c: 68 c0 rjmp .+208 ; 0x7f6e <CheckFlashImage+0x16e>
|
||||
7e9e: 67 e0 ldi r22, 0x07 ; 7
|
||||
7ea0: 70 e0 ldi r23, 0x00 ; 0
|
||||
7ea2: 80 e0 ldi r24, 0x00 ; 0
|
||||
7ea4: 90 e0 ldi r25, 0x00 ; 0
|
||||
7ea6: 95 df rcall .-214 ; 0x7dd2 <FLASH_readByte>
|
||||
7ea8: c8 2f mov r28, r24
|
||||
7eaa: 68 e0 ldi r22, 0x08 ; 8
|
||||
7eac: 70 e0 ldi r23, 0x00 ; 0
|
||||
7eae: 80 e0 ldi r24, 0x00 ; 0
|
||||
{
|
||||
#ifdef DEBUG_ON
|
||||
putch('L');
|
||||
#endif
|
||||
|
||||
uint16_t imagesize = (FLASH_readByte(7)<<8) | FLASH_readByte(8);
|
||||
7eb0: 90 e0 ldi r25, 0x00 ; 0
|
||||
7eb2: 8f df rcall .-226 ; 0x7dd2 <FLASH_readByte>
|
||||
7eb4: d0 e0 ldi r29, 0x00 ; 0
|
||||
7eb6: dc 2f mov r29, r28
|
||||
7eb8: cc 27 eor r28, r28
|
||||
7eba: c8 2b or r28, r24
|
||||
7ebc: c0 fd sbrc r28, 0
|
||||
7ebe: 57 c0 rjmp .+174 ; 0x7f6e <CheckFlashImage+0x16e>
|
||||
7ec0: 33 9a sbi 0x06, 3 ; 6
|
||||
7ec2: c1 2c mov r12, r1
|
||||
7ec4: d1 2c mov r13, r1
|
||||
7ec6: 00 e0 ldi r16, 0x00 ; 0
|
||||
7ec8: 10 e0 ldi r17, 0x00 ; 0
|
||||
7eca: bb 24 eor r11, r11
|
||||
7ecc: b3 94 inc r11
|
||||
7ece: 83 e0 ldi r24, 0x03 ; 3
|
||||
7ed0: a8 2e mov r10, r24
|
||||
if (imagesize%2!=0) return; //basic check that we got even # of bytes
|
||||
7ed2: 95 e0 ldi r25, 0x05 ; 5
|
||||
7ed4: 99 2e mov r9, r25
|
||||
|
||||
uint16_t b, i, nextAddress=0;
|
||||
|
||||
LED_PIN |= _BV(LED);
|
||||
7ed6: 0c 17 cp r16, r28
|
||||
#endif
|
||||
|
||||
uint16_t imagesize = (FLASH_readByte(7)<<8) | FLASH_readByte(8);
|
||||
if (imagesize%2!=0) return; //basic check that we got even # of bytes
|
||||
|
||||
uint16_t b, i, nextAddress=0;
|
||||
7ed8: 1d 07 cpc r17, r29
|
||||
7eda: 70 f5 brcc .+92 ; 0x7f38 <CheckFlashImage+0x138>
|
||||
|
||||
LED_PIN |= _BV(LED);
|
||||
for (i=0; i<imagesize; i+=2)
|
||||
7edc: b8 01 movw r22, r16
|
||||
7ede: 66 5f subi r22, 0xF6 ; 246
|
||||
#endif
|
||||
|
||||
//read 2 bytes (16 bits) from flash image, transfer them to page buffer
|
||||
b = FLASH_readByte(i+10); // flash image starts at position 10 on the external flash memory: FLX:XX:FLASH_IMAGE_BYTES_HERE...... (XX = two size bytes)
|
||||
b |= FLASH_readByte(i+11) << 8; //bytes are stored big endian on external flash, need to flip the bytes to little endian for transfer to internal flash
|
||||
__boot_page_fill_short((uint16_t)(void*)i,b);
|
||||
7ee0: 7f 4f sbci r23, 0xFF ; 255
|
||||
7ee2: 80 e0 ldi r24, 0x00 ; 0
|
||||
|
||||
//when 1 page is full (or we're on the last page), write it to the internal flash memory
|
||||
if ((i+2)%SPM_PAGESIZE==0 || (i+2==imagesize))
|
||||
{
|
||||
__boot_page_erase_short((uint16_t)(void*)nextAddress); //(i+2-SPM_PAGESIZE)
|
||||
7ee4: 90 e0 ldi r25, 0x00 ; 0
|
||||
7ee6: 75 df rcall .-278 ; 0x7dd2 <FLASH_readByte>
|
||||
boot_spm_busy_wait();
|
||||
// Write from programming buffer
|
||||
__boot_page_write_short((uint16_t)(void*)nextAddress ); //(i+2-SPM_PAGESIZE)
|
||||
7ee8: e8 2e mov r14, r24
|
||||
7eea: f1 2c mov r15, r1
|
||||
if (imagesize%2!=0) return; //basic check that we got even # of bytes
|
||||
|
||||
uint16_t b, i, nextAddress=0;
|
||||
|
||||
LED_PIN |= _BV(LED);
|
||||
for (i=0; i<imagesize; i+=2)
|
||||
7eec: b8 01 movw r22, r16
|
||||
7eee: 65 5f subi r22, 0xF5 ; 245
|
||||
7ef0: 7f 4f sbci r23, 0xFF ; 255
|
||||
7ef2: 80 e0 ldi r24, 0x00 ; 0
|
||||
7ef4: 90 e0 ldi r25, 0x00 ; 0
|
||||
7ef6: 6d df rcall .-294 ; 0x7dd2 <FLASH_readByte>
|
||||
#ifdef DEBUG_ON
|
||||
putch('*');
|
||||
#endif
|
||||
|
||||
//read 2 bytes (16 bits) from flash image, transfer them to page buffer
|
||||
b = FLASH_readByte(i+10); // flash image starts at position 10 on the external flash memory: FLX:XX:FLASH_IMAGE_BYTES_HERE...... (XX = two size bytes)
|
||||
7ef8: f8 2a or r15, r24
|
||||
7efa: f8 01 movw r30, r16
|
||||
7efc: 07 01 movw r0, r14
|
||||
7efe: b7 be out 0x37, r11 ; 55
|
||||
7f00: e8 95 spm
|
||||
7f02: 11 24 eor r1, r1
|
||||
7f04: 0e 5f subi r16, 0xFE ; 254
|
||||
7f06: 1f 4f sbci r17, 0xFF ; 255
|
||||
7f08: c8 01 movw r24, r16
|
||||
b |= FLASH_readByte(i+11) << 8; //bytes are stored big endian on external flash, need to flip the bytes to little endian for transfer to internal flash
|
||||
7f0a: 8f 77 andi r24, 0x7F ; 127
|
||||
7f0c: 99 27 eor r25, r25
|
||||
7f0e: 89 2b or r24, r25
|
||||
7f10: 19 f0 breq .+6 ; 0x7f18 <CheckFlashImage+0x118>
|
||||
7f12: 0c 17 cp r16, r28
|
||||
__boot_page_fill_short((uint16_t)(void*)i,b);
|
||||
7f14: 1d 07 cpc r17, r29
|
||||
7f16: f9 f6 brne .-66 ; 0x7ed6 <CheckFlashImage+0xd6>
|
||||
7f18: f6 01 movw r30, r12
|
||||
7f1a: a7 be out 0x37, r10 ; 55
|
||||
7f1c: e8 95 spm
|
||||
|
||||
//when 1 page is full (or we're on the last page), write it to the internal flash memory
|
||||
if ((i+2)%SPM_PAGESIZE==0 || (i+2==imagesize))
|
||||
7f1e: 07 b6 in r0, 0x37 ; 55
|
||||
7f20: 00 fc sbrc r0, 0
|
||||
7f22: fd cf rjmp .-6 ; 0x7f1e <CheckFlashImage+0x11e>
|
||||
7f24: f6 01 movw r30, r12
|
||||
7f26: 97 be out 0x37, r9 ; 55
|
||||
7f28: e8 95 spm
|
||||
7f2a: 07 b6 in r0, 0x37 ; 55
|
||||
7f2c: 00 fc sbrc r0, 0
|
||||
7f2e: fd cf rjmp .-6 ; 0x7f2a <CheckFlashImage+0x12a>
|
||||
7f30: f0 e8 ldi r31, 0x80 ; 128
|
||||
{
|
||||
__boot_page_erase_short((uint16_t)(void*)nextAddress); //(i+2-SPM_PAGESIZE)
|
||||
7f32: cf 0e add r12, r31
|
||||
7f34: d1 1c adc r13, r1
|
||||
7f36: cf cf rjmp .-98 ; 0x7ed6 <CheckFlashImage+0xd6>
|
||||
boot_spm_busy_wait();
|
||||
7f38: 33 98 cbi 0x06, 3 ; 6
|
||||
7f3a: 81 e1 ldi r24, 0x11 ; 17
|
||||
7f3c: 87 bf out 0x37, r24 ; 55
|
||||
// Write from programming buffer
|
||||
__boot_page_write_short((uint16_t)(void*)nextAddress ); //(i+2-SPM_PAGESIZE)
|
||||
7f3e: e8 95 spm
|
||||
7f40: 2a 96 adiw r28, 0x0a ; 10
|
||||
7f42: 61 e0 ldi r22, 0x01 ; 1
|
||||
boot_spm_busy_wait();
|
||||
7f44: c1 30 cpi r28, 0x01 ; 1
|
||||
7f46: d0 48 sbci r29, 0x80 ; 128
|
||||
7f48: 10 f4 brcc .+4 ; 0x7f4e <CheckFlashImage+0x14e>
|
||||
nextAddress += SPM_PAGESIZE;
|
||||
7f4a: 82 e5 ldi r24, 0x52 ; 82
|
||||
7f4c: 01 c0 rjmp .+2 ; 0x7f50 <CheckFlashImage+0x150>
|
||||
7f4e: 88 ed ldi r24, 0xD8 ; 216
|
||||
7f50: 31 df rcall .-414 ; 0x7db4 <FLASH_command>
|
||||
}
|
||||
}
|
||||
LED_PIN &= ~_BV(LED);
|
||||
7f52: 80 e0 ldi r24, 0x00 ; 0
|
||||
|
||||
#if defined(RWWSRE)
|
||||
// Reenable read access to flash
|
||||
boot_rww_enable();
|
||||
7f54: 21 df rcall .-446 ; 0x7d98 <SPI_transfer>
|
||||
7f56: 80 e0 ldi r24, 0x00 ; 0
|
||||
7f58: 1f df rcall .-450 ; 0x7d98 <SPI_transfer>
|
||||
#ifdef DEBUG_ON
|
||||
putch('E');
|
||||
#endif
|
||||
|
||||
//erase the first 32/64K block where flash image resided (atmega328 should be less than 31K, and atmega1284 can be up to 64K)
|
||||
if (imagesize+10<=32768) FLASH_command(SPIFLASH_BLOCKERASE_32K, 1);
|
||||
7f5a: 80 e0 ldi r24, 0x00 ; 0
|
||||
7f5c: 1d df rcall .-454 ; 0x7d98 <SPI_transfer>
|
||||
7f5e: 28 9a sbi 0x05, 0 ; 5
|
||||
7f60: 88 e1 ldi r24, 0x18 ; 24
|
||||
7f62: 80 93 60 00 sts 0x0060, r24
|
||||
7f66: 88 e0 ldi r24, 0x08 ; 8
|
||||
else FLASH_command(SPIFLASH_BLOCKERASE_64K, 1);
|
||||
7f68: 80 93 60 00 sts 0x0060, r24
|
||||
7f6c: ff cf rjmp .-2 ; 0x7f6c <CheckFlashImage+0x16c>
|
||||
SPI_transfer(0);
|
||||
7f6e: df 91 pop r29
|
||||
7f70: cf 91 pop r28
|
||||
7f72: 1f 91 pop r17
|
||||
SPI_transfer(0);
|
||||
7f74: 0f 91 pop r16
|
||||
7f76: ff 90 pop r15
|
||||
7f78: ef 90 pop r14
|
||||
SPI_transfer(0);
|
||||
7f7a: df 90 pop r13
|
||||
7f7c: cf 90 pop r12
|
||||
7f7e: bf 90 pop r11
|
||||
FLASH_UNSELECT;
|
||||
7f80: af 90 pop r10
|
||||
"wdr\n"
|
||||
);
|
||||
}
|
||||
|
||||
void watchdogConfig(uint8_t x) {
|
||||
WDTCSR = _BV(WDCE) | _BV(WDE);
|
||||
7f82: 9f 90 pop r9
|
||||
7f84: 08 95 ret
|
||||
|
||||
00007f86 <putch>:
|
||||
}
|
||||
}
|
||||
|
||||
void putch(char ch) {
|
||||
#ifndef SOFT_UART
|
||||
while (!(UART_SRA & _BV(UDRE0)));
|
||||
7f86: 90 91 c0 00 lds r25, 0x00C0
|
||||
7f8a: 95 ff sbrs r25, 5
|
||||
7f8c: fc cf rjmp .-8 ; 0x7f86 <putch>
|
||||
UART_UDR = ch;
|
||||
7f8e: 80 93 c6 00 sts 0x00C6, r24
|
||||
7f92: 08 95 ret
|
||||
|
||||
00007f94 <getch>:
|
||||
|
||||
#ifdef LED_DATA_FLASH
|
||||
#if defined(__AVR_ATmega8__) || defined (__AVR_ATmega32__)
|
||||
LED_PORT ^= _BV(LED);
|
||||
#else
|
||||
LED_PIN |= _BV(LED);
|
||||
7f94: 33 9a sbi 0x06, 3 ; 6
|
||||
[uartBit] "I" (UART_RX_BIT)
|
||||
:
|
||||
"r25"
|
||||
);
|
||||
#else
|
||||
while(!(UART_SRA & _BV(RXC0)))
|
||||
7f96: 80 91 c0 00 lds r24, 0x00C0
|
||||
7f9a: 87 ff sbrs r24, 7
|
||||
7f9c: fc cf rjmp .-8 ; 0x7f96 <getch+0x2>
|
||||
;
|
||||
if (!(UART_SRA & _BV(FE0))) {
|
||||
7f9e: 80 91 c0 00 lds r24, 0x00C0
|
||||
7fa2: 84 fd sbrc r24, 4
|
||||
7fa4: 01 c0 rjmp .+2 ; 0x7fa8 <getch+0x14>
|
||||
}
|
||||
#endif
|
||||
|
||||
// Watchdog functions. These are only safe with interrupts turned off.
|
||||
void watchdogReset() {
|
||||
__asm__ __volatile__ (
|
||||
7fa6: a8 95 wdr
|
||||
* don't care that an invalid char is returned...)
|
||||
*/
|
||||
watchdogReset();
|
||||
}
|
||||
|
||||
ch = UART_UDR;
|
||||
7fa8: 80 91 c6 00 lds r24, 0x00C6
|
||||
|
||||
#ifdef LED_DATA_FLASH
|
||||
#if defined(__AVR_ATmega8__) || defined (__AVR_ATmega32__)
|
||||
LED_PORT ^= _BV(LED);
|
||||
#else
|
||||
LED_PIN |= _BV(LED);
|
||||
7fac: 33 9a sbi 0x06, 3 ; 6
|
||||
#endif
|
||||
#endif
|
||||
|
||||
return ch;
|
||||
}
|
||||
7fae: 08 95 ret
|
||||
|
||||
00007fb0 <verifySpace>:
|
||||
do getch(); while (--count);
|
||||
verifySpace();
|
||||
}
|
||||
|
||||
void verifySpace() {
|
||||
if (getch() != CRC_EOP) {
|
||||
7fb0: f1 df rcall .-30 ; 0x7f94 <getch>
|
||||
7fb2: 80 32 cpi r24, 0x20 ; 32
|
||||
7fb4: 39 f0 breq .+14 ; 0x7fc4 <verifySpace+0x14>
|
||||
7fb6: 88 e1 ldi r24, 0x18 ; 24
|
||||
"wdr\n"
|
||||
);
|
||||
}
|
||||
|
||||
void watchdogConfig(uint8_t x) {
|
||||
WDTCSR = _BV(WDCE) | _BV(WDE);
|
||||
7fb8: 80 93 60 00 sts 0x0060, r24
|
||||
7fbc: 88 e0 ldi r24, 0x08 ; 8
|
||||
WDTCSR = x;
|
||||
7fbe: 80 93 60 00 sts 0x0060, r24
|
||||
7fc2: ff cf rjmp .-2 ; 0x7fc2 <verifySpace+0x12>
|
||||
|
||||
void verifySpace() {
|
||||
if (getch() != CRC_EOP) {
|
||||
watchdogConfig(WATCHDOG_16MS); // shorten WD timeout
|
||||
while (1) // and busy-loop so that WD causes
|
||||
; // a reset and app start.
|
||||
7fc4: 84 e1 ldi r24, 0x14 ; 20
|
||||
}
|
||||
putch(STK_INSYNC);
|
||||
7fc6: df cf rjmp .-66 ; 0x7f86 <putch>
|
||||
|
||||
00007fc8 <getNch>:
|
||||
::[count] "M" (UART_B_VALUE)
|
||||
);
|
||||
}
|
||||
#endif
|
||||
|
||||
void getNch(uint8_t count) {
|
||||
7fc8: cf 93 push r28
|
||||
7fca: c8 2f mov r28, r24
|
||||
do getch(); while (--count);
|
||||
7fcc: e3 df rcall .-58 ; 0x7f94 <getch>
|
||||
7fce: c1 50 subi r28, 0x01 ; 1
|
||||
7fd0: e9 f7 brne .-6 ; 0x7fcc <getNch+0x4>
|
||||
7fd2: cf 91 pop r28
|
||||
verifySpace();
|
||||
}
|
||||
7fd4: ed cf rjmp .-38 ; 0x7fb0 <verifySpace>
|
||||
|
||||
00007fd6 <watchdogConfig>:
|
||||
"wdr\n"
|
||||
);
|
||||
}
|
||||
|
||||
void watchdogConfig(uint8_t x) {
|
||||
WDTCSR = _BV(WDCE) | _BV(WDE);
|
||||
7fd6: e0 e6 ldi r30, 0x60 ; 96
|
||||
7fd8: f0 e0 ldi r31, 0x00 ; 0
|
||||
7fda: 98 e1 ldi r25, 0x18 ; 24
|
||||
7fdc: 90 83 st Z, r25
|
||||
WDTCSR = x;
|
||||
7fde: 80 83 st Z, r24
|
||||
7fe0: 08 95 ret
|
||||
|
||||
00007fe2 <appStart>:
|
||||
|
||||
void appStart(uint8_t rstFlags) {
|
||||
// save the reset flags in the designated register
|
||||
// This can be saved in a main program by putting code in .init0 (which
|
||||
// executes before normal c init code) to save R2 to a global variable.
|
||||
__asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags));
|
||||
7fe2: 28 2e mov r2, r24
|
||||
"wdr\n"
|
||||
);
|
||||
}
|
||||
|
||||
void watchdogConfig(uint8_t x) {
|
||||
WDTCSR = _BV(WDCE) | _BV(WDE);
|
||||
7fe4: e0 e6 ldi r30, 0x60 ; 96
|
||||
7fe6: f0 e0 ldi r31, 0x00 ; 0
|
||||
7fe8: 88 e1 ldi r24, 0x18 ; 24
|
||||
7fea: 80 83 st Z, r24
|
||||
WDTCSR = x;
|
||||
7fec: 10 82 st Z, r1
|
||||
// This can be saved in a main program by putting code in .init0 (which
|
||||
// executes before normal c init code) to save R2 to a global variable.
|
||||
__asm__ __volatile__ ("mov r2, %0\n" :: "r" (rstFlags));
|
||||
|
||||
watchdogConfig(WATCHDOG_OFF);
|
||||
__asm__ __volatile__ (
|
||||
7fee: ee 27 eor r30, r30
|
||||
7ff0: ff 27 eor r31, r31
|
||||
7ff2: 09 94 ijmp
|
||||
@@ -0,0 +1,742 @@
|
||||
/*------------------------------------------------------------------------ */
|
||||
#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
|
||||
*/
|
||||
#if !defined(LED)
|
||||
#define LED B1 //D9
|
||||
#endif
|
||||
|
||||
/* Ports for soft UART */
|
||||
#ifdef SOFT_UART
|
||||
#define UART_PORT PORTD
|
||||
#define UART_PIN PIND
|
||||
#define UART_DDR DDRD
|
||||
#define UART_TX_BIT 1
|
||||
#define UART_RX_BIT 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(__AVR_ATmega8__) || defined(__AVR_ATmega32__)
|
||||
//Name conversion R.Wiersma
|
||||
#define UCSR0A UCSRA
|
||||
#define UDR0 UDR
|
||||
#define UDRE0 UDRE
|
||||
#define RXC0 RXC
|
||||
#define FE0 FE
|
||||
#define TIFR1 TIFR
|
||||
#define WDTCSR WDTCR
|
||||
#endif
|
||||
#if defined(__AVR_ATmega32__)
|
||||
#define WDCE WDTOE
|
||||
#endif
|
||||
|
||||
/* Luminet support */
|
||||
/*------------------------------------------------------------------------ */
|
||||
#if defined(__AVR_ATtiny84__)
|
||||
/*------------------------------------------------------------------------ */
|
||||
/* Red LED is connected to pin PA4 */
|
||||
#if !defined(LED)
|
||||
#define LED A4
|
||||
#endif
|
||||
|
||||
/* Ports for soft UART - left port only for now. TX/RX on PA2/PA3 */
|
||||
#ifdef SOFT_UART
|
||||
#define UART_PORT PORTA
|
||||
#define UART_PIN PINA
|
||||
#define UART_DDR DDRA
|
||||
#define UART_TX_BIT 2
|
||||
#define UART_RX_BIT 3
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*------------------------------------------------------------------------ */
|
||||
/* Sanguino support (and other 40pin DIP cpus) */
|
||||
#if defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega32__)
|
||||
/*------------------------------------------------------------------------ */
|
||||
/* Onboard LED is connected to pin PB0 on Sanguino */
|
||||
#if !defined(LED)
|
||||
#define LED D7 //Moteino MEGA D15
|
||||
#endif
|
||||
|
||||
/* Ports for soft UART */
|
||||
#ifdef SOFT_UART
|
||||
#define UART_PORT PORTD
|
||||
#define UART_PIN PIND
|
||||
#define UART_DDR DDRD
|
||||
#define UART_TX_BIT 1
|
||||
#define UART_RX_BIT 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*------------------------------------------------------------------------ */
|
||||
/* Mega support */
|
||||
#if defined(__AVR_ATmega1280__)
|
||||
/*------------------------------------------------------------------------ */
|
||||
/* Onboard LED is connected to pin PB7 on Arduino Mega */
|
||||
#if !defined(LED)
|
||||
#define LED B7
|
||||
#endif
|
||||
|
||||
/* Ports for soft UART */
|
||||
#ifdef SOFT_UART
|
||||
#define UART_PORT PORTE
|
||||
#define UART_PIN PINE
|
||||
#define UART_DDR DDRE
|
||||
#define UART_TX_BIT 1
|
||||
#define UART_RX_BIT 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* ------------------------------------------------------------------------
|
||||
* A bunch of macros to enable the LED to be specifed as "B5" for bit 5
|
||||
* of port B, and similar.
|
||||
*/
|
||||
|
||||
#define A0 0x100
|
||||
#define A1 0x101
|
||||
#define A2 0x102
|
||||
#define A3 0x103
|
||||
#define A4 0x104
|
||||
#define A5 0x105
|
||||
#define A6 0x106
|
||||
#define A7 0x107
|
||||
|
||||
#define B0 0x200
|
||||
#define B1 0x201
|
||||
#define B2 0x202
|
||||
#define B3 0x203
|
||||
#define B4 0x204
|
||||
#define B5 0x205
|
||||
#define B6 0x206
|
||||
#define B7 0x207
|
||||
|
||||
#define C0 0x300
|
||||
#define C1 0x301
|
||||
#define C2 0x302
|
||||
#define C3 0x303
|
||||
#define C4 0x304
|
||||
#define C5 0x305
|
||||
#define C6 0x306
|
||||
#define C7 0x307
|
||||
|
||||
#define D0 0x400
|
||||
#define D1 0x401
|
||||
#define D2 0x402
|
||||
#define D3 0x403
|
||||
#define D4 0x404
|
||||
#define D5 0x405
|
||||
#define D6 0x406
|
||||
#define D7 0x407
|
||||
|
||||
#define E0 0x500
|
||||
#define E1 0x501
|
||||
#define E2 0x502
|
||||
#define E3 0x503
|
||||
#define E4 0x504
|
||||
#define E5 0x505
|
||||
#define E6 0x506
|
||||
#define E7 0x507
|
||||
|
||||
#define F0 0x600
|
||||
#define F1 0x601
|
||||
#define F2 0x602
|
||||
#define F3 0x603
|
||||
#define F4 0x604
|
||||
#define F5 0x605
|
||||
#define F6 0x606
|
||||
#define F7 0x607
|
||||
|
||||
#define G0 0x700
|
||||
#define G1 0x701
|
||||
#define G2 0x702
|
||||
#define G3 0x703
|
||||
#define G4 0x704
|
||||
#define G5 0x705
|
||||
#define G6 0x706
|
||||
#define G7 0x707
|
||||
|
||||
#define H0 0x800
|
||||
#define H1 0x801
|
||||
#define H2 0x802
|
||||
#define H3 0x803
|
||||
#define H4 0x804
|
||||
#define H5 0x805
|
||||
#define H6 0x806
|
||||
#define H7 0x807
|
||||
|
||||
#define J0 0xA00
|
||||
#define J1 0xA01
|
||||
#define J2 0xA02
|
||||
#define J3 0xA03
|
||||
#define J4 0xA04
|
||||
#define J5 0xA05
|
||||
#define J6 0xA06
|
||||
#define J7 0xA07
|
||||
|
||||
#define K0 0xB00
|
||||
#define K1 0xB01
|
||||
#define K2 0xB02
|
||||
#define K3 0xB03
|
||||
#define K4 0xB04
|
||||
#define K5 0xB05
|
||||
#define K6 0xB06
|
||||
#define K7 0xB07
|
||||
|
||||
#define L0 0xC00
|
||||
#define L1 0xC01
|
||||
#define L2 0xC02
|
||||
#define L3 0xC03
|
||||
#define L4 0xC04
|
||||
#define L5 0xC05
|
||||
#define L6 0xC06
|
||||
#define L7 0xC07
|
||||
|
||||
|
||||
|
||||
#if LED == B0
|
||||
#undef LED
|
||||
#define LED_DDR DDRB
|
||||
#define LED_PORT PORTB
|
||||
#define LED_PIN PINB
|
||||
#define LED PINB0
|
||||
#elif LED == B1
|
||||
#undef LED
|
||||
#define LED_DDR DDRB
|
||||
#define LED_PORT PORTB
|
||||
#define LED_PIN PINB
|
||||
#define LED PINB1
|
||||
#elif LED == B2
|
||||
#undef LED
|
||||
#define LED_DDR DDRB
|
||||
#define LED_PORT PORTB
|
||||
#define LED_PIN PINB
|
||||
#define LED PINB2
|
||||
#elif LED == B3
|
||||
#undef LED
|
||||
#define LED_DDR DDRB
|
||||
#define LED_PORT PORTB
|
||||
#define LED_PIN PINB
|
||||
#define LED PINB3
|
||||
#elif LED == B4
|
||||
#undef LED
|
||||
#define LED_DDR DDRB
|
||||
#define LED_PORT PORTB
|
||||
#define LED_PIN PINB
|
||||
#define LED PINB4
|
||||
#elif LED == B5
|
||||
#undef LED
|
||||
#define LED_DDR DDRB
|
||||
#define LED_PORT PORTB
|
||||
#define LED_PIN PINB
|
||||
#define LED PINB5
|
||||
#elif LED == B6
|
||||
#undef LED
|
||||
#define LED_DDR DDRB
|
||||
#define LED_PORT PORTB
|
||||
#define LED_PIN PINB
|
||||
#define LED PINB6
|
||||
#elif LED == B7
|
||||
#undef LED
|
||||
#define LED_DDR DDRB
|
||||
#define LED_PORT PORTB
|
||||
#define LED_PIN PINB
|
||||
#define LED PINB7
|
||||
|
||||
#elif LED == C0
|
||||
#undef LED
|
||||
#define LED_DDR DDRC
|
||||
#define LED_PORT PORTC
|
||||
#define LED_PIN PINC
|
||||
#define LED PINC0
|
||||
#elif LED == C1
|
||||
#undef LED
|
||||
#define LED_DDR DDRC
|
||||
#define LED_PORT PORTC
|
||||
#define LED_PIN PINC
|
||||
#define LED PINC1
|
||||
#elif LED == C2
|
||||
#undef LED
|
||||
#define LED_DDR DDRC
|
||||
#define LED_PORT PORTC
|
||||
#define LED_PIN PINC
|
||||
#define LED PINC2
|
||||
#elif LED == C3
|
||||
#undef LED
|
||||
#define LED_DDR DDRC
|
||||
#define LED_PORT PORTC
|
||||
#define LED_PIN PINC
|
||||
#define LED PINC3
|
||||
#elif LED == C4
|
||||
#undef LED
|
||||
#define LED_DDR DDRC
|
||||
#define LED_PORT PORTC
|
||||
#define LED_PIN PINC
|
||||
#define LED PINC4
|
||||
#elif LED == C5
|
||||
#undef LED
|
||||
#define LED_DDR DDRC
|
||||
#define LED_PORT PORTC
|
||||
#define LED_PIN PINC
|
||||
#define LED PINC5
|
||||
#elif LED == C6
|
||||
#undef LED
|
||||
#define LED_DDR DDRC
|
||||
#define LED_PORT PORTC
|
||||
#define LED_PIN PINC
|
||||
#define LED PINC6
|
||||
#elif LED == C7
|
||||
#undef LED
|
||||
#define LED_DDR DDRC
|
||||
#define LED_PORT PORTC
|
||||
#define LED_PIN PINC
|
||||
#define LED PINC7
|
||||
|
||||
#elif LED == D0
|
||||
#undef LED
|
||||
#define LED_DDR DDRD
|
||||
#define LED_PORT PORTD
|
||||
#define LED_PIN PIND
|
||||
#define LED PIND0
|
||||
#elif LED == D1
|
||||
#undef LED
|
||||
#define LED_DDR DDRD
|
||||
#define LED_PORT PORTD
|
||||
#define LED_PIN PIND
|
||||
#define LED PIND1
|
||||
#elif LED == D2
|
||||
#undef LED
|
||||
#define LED_DDR DDRD
|
||||
#define LED_PORT PORTD
|
||||
#define LED_PIN PIND
|
||||
#define LED PIND2
|
||||
#elif LED == D3
|
||||
#undef LED
|
||||
#define LED_DDR DDRD
|
||||
#define LED_PORT PORTD
|
||||
#define LED_PIN PIND
|
||||
#define LED PIND3
|
||||
#elif LED == D4
|
||||
#undef LED
|
||||
#define LED_DDR DDRD
|
||||
#define LED_PORT PORTD
|
||||
#define LED_PIN PIND
|
||||
#define LED PIND4
|
||||
#elif LED == D5
|
||||
#undef LED
|
||||
#define LED_DDR DDRD
|
||||
#define LED_PORT PORTD
|
||||
#define LED_PIN PIND
|
||||
#define LED PIND5
|
||||
#elif LED == D6
|
||||
#undef LED
|
||||
#define LED_DDR DDRD
|
||||
#define LED_PORT PORTD
|
||||
#define LED_PIN PIND
|
||||
#define LED PIND6
|
||||
#elif LED == D7
|
||||
#undef LED
|
||||
#define LED_DDR DDRD
|
||||
#define LED_PORT PORTD
|
||||
#define LED_PIN PIND
|
||||
#define LED PIND7
|
||||
|
||||
#elif LED == E0
|
||||
#undef LED
|
||||
#define LED_DDR DDRE
|
||||
#define LED_PORT PORTE
|
||||
#define LED_PIN PINE
|
||||
#define LED PINE0
|
||||
#elif LED == E1
|
||||
#undef LED
|
||||
#define LED_DDR DDRE
|
||||
#define LED_PORT PORTE
|
||||
#define LED_PIN PINE
|
||||
#define LED PINE1
|
||||
#elif LED == E2
|
||||
#undef LED
|
||||
#define LED_DDR DDRE
|
||||
#define LED_PORT PORTE
|
||||
#define LED_PIN PINE
|
||||
#define LED PINE2
|
||||
#elif LED == E3
|
||||
#undef LED
|
||||
#define LED_DDR DDRE
|
||||
#define LED_PORT PORTE
|
||||
#define LED_PIN PINE
|
||||
#define LED PINE3
|
||||
#elif LED == E4
|
||||
#undef LED
|
||||
#define LED_DDR DDRE
|
||||
#define LED_PORT PORTE
|
||||
#define LED_PIN PINE
|
||||
#define LED PINE4
|
||||
#elif LED == E5
|
||||
#undef LED
|
||||
#define LED_DDR DDRE
|
||||
#define LED_PORT PORTE
|
||||
#define LED_PIN PINE
|
||||
#define LED PINE5
|
||||
#elif LED == E6
|
||||
#undef LED
|
||||
#define LED_DDR DDRE
|
||||
#define LED_PORT PORTE
|
||||
#define LED_PIN PINE
|
||||
#define LED PINE6
|
||||
#elif LED == E7
|
||||
#undef LED
|
||||
#define LED_DDR DDRE
|
||||
#define LED_PORT PORTE
|
||||
#define LED_PIN PINE
|
||||
#define LED PINE7
|
||||
|
||||
#elif LED == F0
|
||||
#undef LED
|
||||
#define LED_DDR DDRF
|
||||
#define LED_PORT PORTF
|
||||
#define LED_PIN PINF
|
||||
#define LED PINF0
|
||||
#elif LED == F1
|
||||
#undef LED
|
||||
#define LED_DDR DDRF
|
||||
#define LED_PORT PORTF
|
||||
#define LED_PIN PINF
|
||||
#define LED PINF1
|
||||
#elif LED == F2
|
||||
#undef LED
|
||||
#define LED_DDR DDRF
|
||||
#define LED_PORT PORTF
|
||||
#define LED_PIN PINF
|
||||
#define LED PINF2
|
||||
#elif LED == F3
|
||||
#undef LED
|
||||
#define LED_DDR DDRF
|
||||
#define LED_PORT PORTF
|
||||
#define LED_PIN PINF
|
||||
#define LED PINF3
|
||||
#elif LED == F4
|
||||
#undef LED
|
||||
#define LED_DDR DDRF
|
||||
#define LED_PORT PORTF
|
||||
#define LED_PIN PINF
|
||||
#define LED PINF4
|
||||
#elif LED == F5
|
||||
#undef LED
|
||||
#define LED_DDR DDRF
|
||||
#define LED_PORT PORTF
|
||||
#define LED_PIN PINF
|
||||
#define LED PINF5
|
||||
#elif LED == F6
|
||||
#undef LED
|
||||
#define LED_DDR DDRF
|
||||
#define LED_PORT PORTF
|
||||
#define LED_PIN PINF
|
||||
#define LED PINF6
|
||||
#elif LED == F7
|
||||
#undef LED
|
||||
#define LED_DDR DDRF
|
||||
#define LED_PORT PORTF
|
||||
#define LED_PIN PINF
|
||||
#define LED PINF7
|
||||
|
||||
#elif LED == G0
|
||||
#undef LED
|
||||
#define LED_DDR DDRG
|
||||
#define LED_PORT PORTG
|
||||
#define LED_PIN PING
|
||||
#define LED PING0
|
||||
#elif LED == G1
|
||||
#undef LED
|
||||
#define LED_DDR DDRG
|
||||
#define LED_PORT PORTG
|
||||
#define LED_PIN PING
|
||||
#define LED PING1
|
||||
#elif LED == G2
|
||||
#undef LED
|
||||
#define LED_DDR DDRG
|
||||
#define LED_PORT PORTG
|
||||
#define LED_PIN PING
|
||||
#define LED PING2
|
||||
#elif LED == G3
|
||||
#undef LED
|
||||
#define LED_DDR DDRG
|
||||
#define LED_PORT PORTG
|
||||
#define LED_PIN PING
|
||||
#define LED PING3
|
||||
#elif LED == G4
|
||||
#undef LED
|
||||
#define LED_DDR DDRG
|
||||
#define LED_PORT PORTG
|
||||
#define LED_PIN PING
|
||||
#define LED PING4
|
||||
#elif LED == G5
|
||||
#undef LED
|
||||
#define LED_DDR DDRG
|
||||
#define LED_PORT PORTG
|
||||
#define LED_PIN PING
|
||||
#define LED PING5
|
||||
#elif LED == G6
|
||||
#undef LED
|
||||
#define LED_DDR DDRG
|
||||
#define LED_PORT PORTG
|
||||
#define LED_PIN PING
|
||||
#define LED PING6
|
||||
#elif LED == G7
|
||||
#undef LED
|
||||
#define LED_DDR DDRG
|
||||
#define LED_PORT PORTG
|
||||
#define LED_PIN PING
|
||||
#define LED PING7
|
||||
|
||||
#elif LED == H0
|
||||
#undef LED
|
||||
#define LED_DDR DDRH
|
||||
#define LED_PORT PORTH
|
||||
#define LED_PIN PINH
|
||||
#define LED PINH0
|
||||
#elif LED == H1
|
||||
#undef LED
|
||||
#define LED_DDR DDRH
|
||||
#define LED_PORT PORTH
|
||||
#define LED_PIN PINH
|
||||
#define LED PINH1
|
||||
#elif LED == H2
|
||||
#undef LED
|
||||
#define LED_DDR DDRH
|
||||
#define LED_PORT PORTH
|
||||
#define LED_PIN PINH
|
||||
#define LED PINH2
|
||||
#elif LED == H3
|
||||
#undef LED
|
||||
#define LED_DDR DDRH
|
||||
#define LED_PORT PORTH
|
||||
#define LED_PIN PINH
|
||||
#define LED PINH3
|
||||
#elif LED == H4
|
||||
#undef LED
|
||||
#define LED_DDR DDRH
|
||||
#define LED_PORT PORTH
|
||||
#define LED_PIN PINH
|
||||
#define LED PINH4
|
||||
#elif LED == H5
|
||||
#undef LED
|
||||
#define LED_DDR DDRH
|
||||
#define LED_PORT PORTH
|
||||
#define LED_PIN PINH
|
||||
#define LED PINH5
|
||||
#elif LED == H6
|
||||
#undef LED
|
||||
#define LED_DDR DDRH
|
||||
#define LED_PORT PORTH
|
||||
#define LED_PIN PINH
|
||||
#define LED PINH6
|
||||
#elif LED == H7
|
||||
#undef LED
|
||||
#define LED_DDR DDRH
|
||||
#define LED_PORT PORTH
|
||||
#define LED_PIN PINH
|
||||
#define LED PINH7
|
||||
|
||||
#elif LED == J0
|
||||
#undef LED
|
||||
#define LED_DDR DDRJ
|
||||
#define LED_PORT PORTJ
|
||||
#define LED_PIN PINJ
|
||||
#define LED PINJ0
|
||||
#elif LED == J1
|
||||
#undef LED
|
||||
#define LED_DDR DDRJ
|
||||
#define LED_PORT PORTJ
|
||||
#define LED_PIN PINJ
|
||||
#define LED PINJ1
|
||||
#elif LED == J2
|
||||
#undef LED
|
||||
#define LED_DDR DDRJ
|
||||
#define LED_PORT PORTJ
|
||||
#define LED_PIN PINJ
|
||||
#define LED PINJ2
|
||||
#elif LED == J3
|
||||
#undef LED
|
||||
#define LED_DDR DDRJ
|
||||
#define LED_PORT PORTJ
|
||||
#define LED_PIN PINJ
|
||||
#define LED PINJ3
|
||||
#elif LED == J4
|
||||
#undef LED
|
||||
#define LED_DDR DDRJ
|
||||
#define LED_PORT PORTJ
|
||||
#define LED_PIN PINJ
|
||||
#define LED PINJ4
|
||||
#elif LED == J5
|
||||
#undef LED
|
||||
#define LED_DDR DDRJ
|
||||
#define LED_PORT PORTJ
|
||||
#define LED_PIN PINJ
|
||||
#define LED PINJ5
|
||||
#elif LED == J6
|
||||
#undef LED
|
||||
#define LED_DDR DDRJ
|
||||
#define LED_PORT PORTJ
|
||||
#define LED_PIN PINJ
|
||||
#define LED PINJ6
|
||||
#elif LED == J7
|
||||
#undef LED
|
||||
#define LED_DDR DDRJ
|
||||
#define LED_PORT PORTJ
|
||||
#define LED_PIN PINJ
|
||||
#define LED PINJ7
|
||||
|
||||
#elif LED == K0
|
||||
#undef LED
|
||||
#define LED_DDR DDRK
|
||||
#define LED_PORT PORTK
|
||||
#define LED_PIN PINK
|
||||
#define LED PINK0
|
||||
#elif LED == K1
|
||||
#undef LED
|
||||
#define LED_DDR DDRK
|
||||
#define LED_PORT PORTK
|
||||
#define LED_PIN PINK
|
||||
#define LED PINK1
|
||||
#elif LED == K2
|
||||
#undef LED
|
||||
#define LED_DDR DDRK
|
||||
#define LED_PORT PORTK
|
||||
#define LED_PIN PINK
|
||||
#define LED PINK2
|
||||
#elif LED == K3
|
||||
#undef LED
|
||||
#define LED_DDR DDRK
|
||||
#define LED_PORT PORTK
|
||||
#define LED_PIN PINK
|
||||
#define LED PINK3
|
||||
#elif LED == K4
|
||||
#undef LED
|
||||
#define LED_DDR DDRK
|
||||
#define LED_PORT PORTK
|
||||
#define LED_PIN PINK
|
||||
#define LED PINK4
|
||||
#elif LED == K5
|
||||
#undef LED
|
||||
#define LED_DDR DDRK
|
||||
#define LED_PORT PORTK
|
||||
#define LED_PIN PINK
|
||||
#define LED PINK5
|
||||
#elif LED == K6
|
||||
#undef LED
|
||||
#define LED_DDR DDRK
|
||||
#define LED_PORT PORTK
|
||||
#define LED_PIN PINK
|
||||
#define LED PINK6
|
||||
#elif LED == K7
|
||||
#undef LED
|
||||
#define LED_DDR DDRK
|
||||
#define LED_PORT PORTK
|
||||
#define LED_PIN PINK
|
||||
#define LED PINK7
|
||||
|
||||
#elif LED == L0
|
||||
#undef LED
|
||||
#define LED_DDR DDRL
|
||||
#define LED_PORT PORTL
|
||||
#define LED_PIN PINL
|
||||
#define LED PINL0
|
||||
#elif LED == L1
|
||||
#undef LED
|
||||
#define LED_DDR DDRL
|
||||
#define LED_PORT PORTL
|
||||
#define LED_PIN PINL
|
||||
#define LED PINL1
|
||||
#elif LED == L2
|
||||
#undef LED
|
||||
#define LED_DDR DDRL
|
||||
#define LED_PORT PORTL
|
||||
#define LED_PIN PINL
|
||||
#define LED PINL2
|
||||
#elif LED == L3
|
||||
#undef LED
|
||||
#define LED_DDR DDRL
|
||||
#define LED_PORT PORTL
|
||||
#define LED_PIN PINL
|
||||
#define LED PINL3
|
||||
#elif LED == L4
|
||||
#undef LED
|
||||
#define LED_DDR DDRL
|
||||
#define LED_PORT PORTL
|
||||
#define LED_PIN PINL
|
||||
#define LED PINL4
|
||||
#elif LED == L5
|
||||
#undef LED
|
||||
#define LED_DDR DDRL
|
||||
#define LED_PORT PORTL
|
||||
#define LED_PIN PINL
|
||||
#define LED PINL5
|
||||
#elif LED == L6
|
||||
#undef LED
|
||||
#define LED_DDR DDRL
|
||||
#define LED_PORT PORTL
|
||||
#define LED_PIN PINL
|
||||
#define LED PINL6
|
||||
#elif LED == L7
|
||||
#undef LED
|
||||
#define LED_DDR DDRL
|
||||
#define LED_PORT PORTL
|
||||
#define LED_PIN PINL
|
||||
#define LED PINL7
|
||||
|
||||
#elif LED == A0
|
||||
#undef LED
|
||||
#define LED_DDR DDRA
|
||||
#define LED_PORT PORTA
|
||||
#define LED_PIN PINA
|
||||
#define LED PINA0
|
||||
#elif LED == A1
|
||||
#undef LED
|
||||
#define LED_DDR DDRA
|
||||
#define LED_PORT PORTA
|
||||
#define LED_PIN PINA
|
||||
#define LED PINA1
|
||||
#elif LED == A2
|
||||
#undef LED
|
||||
#define LED_DDR DDRA
|
||||
#define LED_PORT PORTA
|
||||
#define LED_PIN PINA
|
||||
#define LED PINA2
|
||||
#elif LED == A3
|
||||
#undef LED
|
||||
#define LED_DDR DDRA
|
||||
#define LED_PORT PORTA
|
||||
#define LED_PIN PINA
|
||||
#define LED PINA3
|
||||
#elif LED == A4
|
||||
#undef LED
|
||||
#define LED_DDR DDRA
|
||||
#define LED_PORT PORTA
|
||||
#define LED_PIN PINA
|
||||
#define LED PINA4
|
||||
#elif LED == A5
|
||||
#undef LED
|
||||
#define LED_DDR DDRA
|
||||
#define LED_PORT PORTA
|
||||
#define LED_PIN PINA
|
||||
#define LED PINA5
|
||||
#elif LED == A6
|
||||
#undef LED
|
||||
#define LED_DDR DDRA
|
||||
#define LED_PORT PORTA
|
||||
#define LED_PIN PINA
|
||||
#define LED PINA6
|
||||
#elif LED == A7
|
||||
#undef LED
|
||||
#define LED_DDR DDRA
|
||||
#define LED_PORT PORTA
|
||||
#define LED_PIN PINA
|
||||
#define LED PINA7
|
||||
|
||||
#else
|
||||
#error -------------------------------------------
|
||||
#error Unrecognized LED name. Should be like "B5"
|
||||
#error -------------------------------------------
|
||||
#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'
|
||||
Reference in New Issue
Block a user