debuggers: import openocd-0.7.0
Initial check-in of openocd-0.7.0 as it can be downloaded from http://sourceforge.net/projects/openocd/files/openocd/0.7.0/ Any modifications will follow. Change-Id: I6949beaefd589e046395ea0cb80f4e1ab1654d55
This commit is contained in:
12
debuggers/openocd/AUTHORS
Normal file
12
debuggers/openocd/AUTHORS
Normal file
@ -0,0 +1,12 @@
|
||||
Dominic Rath <Dominic.Rath@gmx.de>
|
||||
Magnus Lundin <lundin@mlu.mine.nu>
|
||||
Michael Fischer <fischermi@t-online.de>
|
||||
Spencer Oliver <spen@spen-soft.co.uk>
|
||||
Carsten Schlote <schlote@vahanus.net>
|
||||
Øyvind Harboe <oyvind.harboe@zylin.com>
|
||||
Duane Ellis <openocd@duaneellis.com>
|
||||
Michael Schwingen <michael@schwingen.org>
|
||||
Rick Altherr <kc8apf@users.berlios.de>
|
||||
David Brownell <dbrownell@users.sourceforge.net>
|
||||
Vincint Palatin <vpalatin@users.berlios.de>
|
||||
Zachary T Welch <zw@superlucidity.net>
|
||||
74
debuggers/openocd/BUGS
Normal file
74
debuggers/openocd/BUGS
Normal file
@ -0,0 +1,74 @@
|
||||
// This file is part of the Doxygen Developer Manual
|
||||
/** @page bugs Bug Reporting
|
||||
|
||||
Please report bugs by subscribing to the OpenOCD mailing list and
|
||||
posting a message with your report:
|
||||
|
||||
openocd-devel@lists.sourceforge.net
|
||||
|
||||
Also, please check the Trac bug database to see if a ticket for
|
||||
the bug has already been opened. You might be asked to open
|
||||
such a ticket, or to update an existing ticket with more data.
|
||||
|
||||
https://sourceforge.net/apps/trac/openocd/
|
||||
|
||||
To minimize work for OpenOCD developers, you should try to include
|
||||
all of the information listed below. If you feel that some of the
|
||||
items below are unnecessary for a clear bug report, you may leave
|
||||
them out; likewise, feel free to include additional information
|
||||
that may be important.
|
||||
|
||||
- Target PCB/board description
|
||||
- Configuration scripts
|
||||
- OpenOCD command line
|
||||
- List of commands issued or GDB operations performed
|
||||
- Expected result
|
||||
- Actual result
|
||||
- Logs using <code>debug_level 3</code> (or with '-d 3' on the command line)
|
||||
- If the report is for a regression:
|
||||
- Include logs for both working and broken versions.
|
||||
- Find the precise version that caused the regression by binary search.
|
||||
You can use "git bisect" to expedite this binary search:
|
||||
http://www.kernel.org/pub/software/scm/git/docs/git-bisect.html
|
||||
|
||||
If possible, please develop and attach a patch that helps to expose or
|
||||
solve the reported problem. See the HACKING file for information
|
||||
about that process.
|
||||
|
||||
Attach all files directly to your posting. The mailing list knows to
|
||||
transform attachments to links, but attachments must be less than 300KB
|
||||
in total.
|
||||
|
||||
@section bugscrashdump Obtaining Crash Backtraces
|
||||
|
||||
If OpenOCD is crashing, there are two very effective things you can do to
|
||||
improve your chances of getting help on the development mailing list.
|
||||
|
||||
Try to reproduce the problem using the dummy JTAG interface to allow other developers to replicate
|
||||
your problem robustly and use GDB to get a trace:@par
|
||||
@code
|
||||
% OPENOCDSRC/configure --enable-dummy ...
|
||||
% openocd -f interface/dummy.cfg -f target/xxx.cfg
|
||||
=> SEGFAULT
|
||||
% gdb --args openocd ....
|
||||
(gdb) run
|
||||
(gdb) bt
|
||||
=> here a stack trace is dumped.
|
||||
@endcode
|
||||
|
||||
@section bugsintreedebug Running and Debugging In-Tree
|
||||
|
||||
To run or debug the in-tree executable (not recommended), you must
|
||||
use libtool to set up the correct shared library paths:
|
||||
@code
|
||||
libtool gdb --args openocd ....
|
||||
@endcode
|
||||
or the more pedantic (and forward-compatible):
|
||||
@code
|
||||
libtool --mode=execute gdb --args openocd ....
|
||||
@endcode
|
||||
|
||||
*/
|
||||
/** @file
|
||||
This file contains the @ref bugs page.
|
||||
*/
|
||||
340
debuggers/openocd/COPYING
Normal file
340
debuggers/openocd/COPYING
Normal file
@ -0,0 +1,340 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) 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
|
||||
this service 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 make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. 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.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
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
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the 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 a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE 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.
|
||||
|
||||
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
|
||||
convey 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 2 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, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision 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, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This 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 Library General
|
||||
Public License instead of this License.
|
||||
18242
debuggers/openocd/ChangeLog
Normal file
18242
debuggers/openocd/ChangeLog
Normal file
File diff suppressed because it is too large
Load Diff
1517
debuggers/openocd/Doxyfile.in
Normal file
1517
debuggers/openocd/Doxyfile.in
Normal file
File diff suppressed because it is too large
Load Diff
178
debuggers/openocd/HACKING
Normal file
178
debuggers/openocd/HACKING
Normal file
@ -0,0 +1,178 @@
|
||||
// This file is part of the Doxygen Developer Manual
|
||||
/** @page patchguide Patch Guidelines
|
||||
|
||||
\attention If you're behind a corporate wall with http only access to the
|
||||
world, you can still use these instructions!
|
||||
|
||||
\attention You can't send patches to the mailing list anymore at all. Nowadays
|
||||
you are expected to send patches to the OpenOCD Gerrit GIT server for a
|
||||
review.
|
||||
|
||||
@section gerrit Submitting patches to the OpenOCD Gerrit server
|
||||
|
||||
OpenOCD is to some extent a "self service" open source project, so to
|
||||
contribute, you must follow the standard procedures to have the best
|
||||
possible chance to get your changes accepted.
|
||||
|
||||
The procedure to create a patch is essentially:
|
||||
|
||||
- make the changes
|
||||
- create a commit
|
||||
- send the changes to the Gerrit server for review
|
||||
- correct the patch and re-send it according to review feedback
|
||||
|
||||
Your patch (or commit) should be a "good patch": focus it on a single
|
||||
issue, and make it be easily reviewable. Don't make
|
||||
it so large that it's hard to review; split large
|
||||
patches into smaller ones. (That can also help
|
||||
track down bugs later on.) All patches should
|
||||
be "clean", which includes preserving the existing
|
||||
coding style and updating documentation as needed.
|
||||
|
||||
Say in the commit message if it's a bugfix (describe the bug) or a new
|
||||
feature. Don't expect patches to merge immediately
|
||||
for the next release. Be ready to rework patches
|
||||
in response to feedback.
|
||||
|
||||
Add yourself to the GPL copyright for non-trivial changes.
|
||||
|
||||
@section stepbystep Step by step procedure
|
||||
|
||||
-# Create a Gerrit account at: http://openocd.zylin.com
|
||||
- On subsequent sign ins, use the full URL prefaced with 'http://'
|
||||
For example: http://user_identifier.open_id_provider.com
|
||||
-# Add a username to your profile.
|
||||
After creating the Gerrit account and signing in, you will need to
|
||||
add a username to your profile. To do this, go to 'Settings', and
|
||||
add a username of your choice.
|
||||
Your username will be required in step 3 and substituted wherever
|
||||
the string 'USERNAME' is found.
|
||||
-# Create an SSH public key following the directions on github:
|
||||
https://help.github.com/articles/generating-ssh-keys . You can skip step 3
|
||||
(adding key to Github account) and 4 (testing) - these are useful only if
|
||||
you actually use Github or want to test whether the new key works fine.
|
||||
-# Add this new SSH key to your Gerrit account:
|
||||
go to 'Settings' > 'SSH Public Keys', paste the contents of
|
||||
~/.ssh/id_rsa.pub into the text field (if it's not visible click on
|
||||
'Add Key ...' button) and confirm by clicking 'Add' button.
|
||||
-# Clone the git repository, rather than just download the source:
|
||||
@code
|
||||
git clone git://git.code.sf.net/p/openocd/code openocd
|
||||
@endcode
|
||||
or if you have problems with the "git:" protocol, use
|
||||
the slower http protocol:
|
||||
@code
|
||||
git clone http://git.code.sf.net/p/openocd/code openocd
|
||||
@endcode
|
||||
-# Set up Gerrit with your local repository. All this does it
|
||||
to instruct git locally how to send off the changes.
|
||||
-# Add a new remote to git using Gerrit username:
|
||||
@code
|
||||
git remote add review ssh://USERNAME@openocd.zylin.com:29418/openocd.git
|
||||
git config remote.review.push HEAD:refs/publish/master
|
||||
@endcode
|
||||
Or with http only:
|
||||
@code
|
||||
git remote add review http://USERNAME@openocd.zylin.com/p/openocd.git
|
||||
git config remote.review.push HEAD:refs/publish/master
|
||||
@endcode
|
||||
The http password is configured from your gerrit settings - http://openocd.zylin.com/#/settings/http-password.
|
||||
\note If you want to simplify http access you can also add your http password to the url as follows:
|
||||
@code
|
||||
git remote add review http://USERNAME:PASSWORD@openocd.zylin.com/p/openocd.git
|
||||
@endcode
|
||||
-# You will need to install this hook, we will look into a better solution:
|
||||
@code
|
||||
scp -p -P 29418 USERNAME@openocd.zylin.com:hooks/commit-msg .git/hooks/
|
||||
@endcode
|
||||
Or with http only:
|
||||
@code
|
||||
wget http://openocd.zylin.com/tools/hooks/commit-msg
|
||||
mv commit-msg .git/hooks
|
||||
chmod +x .git/hooks/commit-msg
|
||||
@endcode
|
||||
\note A script exists to simplify the two items above. execute:
|
||||
@code
|
||||
tools/initial.sh <username>
|
||||
@endcode
|
||||
With @<username@> being your Gerrit username.
|
||||
-# Set up git with your name and email:
|
||||
@code
|
||||
git config --global user.name "John Smith"
|
||||
git config --global user.email "john@smith.org"
|
||||
@endcode
|
||||
-# Work on your patches. Split the work into
|
||||
multiple small patches that can be reviewed and
|
||||
applied seperately and safely to the OpenOCD
|
||||
repository.
|
||||
@code
|
||||
while(!done) {
|
||||
work - edit files using your favorite editor.
|
||||
run "git commit -s -a" to commit all changes.
|
||||
run tools/checkpatch.sh to verify your patch style is ok.
|
||||
}
|
||||
@endcode
|
||||
\note use "git add ." before commit to add new files.
|
||||
|
||||
Comment template, notice the short first line w/topic. The topic field
|
||||
should identify the main part or subsystem the patch touches. Check
|
||||
git log for examples.
|
||||
@code
|
||||
topic: Short comment
|
||||
<blank line>
|
||||
Longer comments over several lines, explaining (where applicable) the
|
||||
reason for the patch and the general idea the solution is based on,
|
||||
any major design decisions, etc...
|
||||
<blank line>
|
||||
Signed-off-by: ...
|
||||
@endcode
|
||||
-# Next you need to make sure that your patches
|
||||
are on top of the latest stuff on the server and
|
||||
that there are no conflicts:
|
||||
@code
|
||||
git pull --rebase origin master
|
||||
@endcode
|
||||
-# Send the patches to the Gerrit server for review:
|
||||
@code
|
||||
git push review
|
||||
@endcode
|
||||
-# Forgot something, want to add more? Just make the changes and do:
|
||||
@code
|
||||
git commit --amend
|
||||
git push review
|
||||
@endcode
|
||||
|
||||
Further reading: http://www.coreboot.org/Git
|
||||
|
||||
@section timeline When can I expect my contribution to be committed?
|
||||
|
||||
The code review is intended to take as long as a week or two to allow
|
||||
maintainers and contributors who work on OpenOCD only in their spare
|
||||
time oportunity to perform a review and raise objections.
|
||||
|
||||
With Gerrit much of the urgency of getting things committed has been
|
||||
removed as the work in progress is safely stored in Gerrit and
|
||||
available if someone needs to build on your work before it is
|
||||
submitted to the official repository.
|
||||
|
||||
Another factor that contributes to the desire for longer cool-off
|
||||
times (the time a patch lies around without any further changes or
|
||||
comments), it means that the chances of quality regression on the
|
||||
master branch will be much reduced.
|
||||
|
||||
If a contributor pushes a patch, it is considered good form if another
|
||||
contributor actually approves and submits that patch.
|
||||
|
||||
It should be noted that a negative review in Gerrit ("-1" or "-2") may (but does
|
||||
not have to) be disregarded if all conditions listed below are met:
|
||||
|
||||
- the concerns raised in the review have been addressed (or explained),
|
||||
- reviewer does not re-examine the change in a month,
|
||||
- reviewer does not answer e-mails for another month.
|
||||
|
||||
@section browsing Browsing Patches
|
||||
All OpenOCD patches can be reviewed <a href="http://openocd.zylin.com/">here</a>.
|
||||
*/
|
||||
/** @file
|
||||
This file contains the @ref patchguide page.
|
||||
*/
|
||||
370
debuggers/openocd/INSTALL
Normal file
370
debuggers/openocd/INSTALL
Normal file
@ -0,0 +1,370 @@
|
||||
Installation Instructions
|
||||
*************************
|
||||
|
||||
Copyright (C) 1994-1996, 1999-2002, 2004-2012 Free Software Foundation,
|
||||
Inc.
|
||||
|
||||
Copying and distribution of this file, with or without modification,
|
||||
are permitted in any medium without royalty provided the copyright
|
||||
notice and this notice are preserved. This file is offered as-is,
|
||||
without warranty of any kind.
|
||||
|
||||
Basic Installation
|
||||
==================
|
||||
|
||||
Briefly, the shell commands `./configure; make; make install' should
|
||||
configure, build, and install this package. The following
|
||||
more-detailed instructions are generic; see the `README' file for
|
||||
instructions specific to this package. Some packages provide this
|
||||
`INSTALL' file but do not implement all of the features documented
|
||||
below. The lack of an optional feature in a given package is not
|
||||
necessarily a bug. More recommendations for GNU packages can be found
|
||||
in *note Makefile Conventions: (standards)Makefile Conventions.
|
||||
|
||||
The `configure' shell script attempts to guess correct values for
|
||||
various system-dependent variables used during compilation. It uses
|
||||
those values to create a `Makefile' in each directory of the package.
|
||||
It may also create one or more `.h' files containing system-dependent
|
||||
definitions. Finally, it creates a shell script `config.status' that
|
||||
you can run in the future to recreate the current configuration, and a
|
||||
file `config.log' containing compiler output (useful mainly for
|
||||
debugging `configure').
|
||||
|
||||
It can also use an optional file (typically called `config.cache'
|
||||
and enabled with `--cache-file=config.cache' or simply `-C') that saves
|
||||
the results of its tests to speed up reconfiguring. Caching is
|
||||
disabled by default to prevent problems with accidental use of stale
|
||||
cache files.
|
||||
|
||||
If you need to do unusual things to compile the package, please try
|
||||
to figure out how `configure' could check whether to do them, and mail
|
||||
diffs or instructions to the address given in the `README' so they can
|
||||
be considered for the next release. If you are using the cache, and at
|
||||
some point `config.cache' contains results you don't want to keep, you
|
||||
may remove or edit it.
|
||||
|
||||
The file `configure.ac' (or `configure.in') is used to create
|
||||
`configure' by a program called `autoconf'. You need `configure.ac' if
|
||||
you want to change it or regenerate `configure' using a newer version
|
||||
of `autoconf'.
|
||||
|
||||
The simplest way to compile this package is:
|
||||
|
||||
1. `cd' to the directory containing the package's source code and type
|
||||
`./configure' to configure the package for your system.
|
||||
|
||||
Running `configure' might take a while. While running, it prints
|
||||
some messages telling which features it is checking for.
|
||||
|
||||
2. Type `make' to compile the package.
|
||||
|
||||
3. Optionally, type `make check' to run any self-tests that come with
|
||||
the package, generally using the just-built uninstalled binaries.
|
||||
|
||||
4. Type `make install' to install the programs and any data files and
|
||||
documentation. When installing into a prefix owned by root, it is
|
||||
recommended that the package be configured and built as a regular
|
||||
user, and only the `make install' phase executed with root
|
||||
privileges.
|
||||
|
||||
5. Optionally, type `make installcheck' to repeat any self-tests, but
|
||||
this time using the binaries in their final installed location.
|
||||
This target does not install anything. Running this target as a
|
||||
regular user, particularly if the prior `make install' required
|
||||
root privileges, verifies that the installation completed
|
||||
correctly.
|
||||
|
||||
6. You can remove the program binaries and object files from the
|
||||
source code directory by typing `make clean'. To also remove the
|
||||
files that `configure' created (so you can compile the package for
|
||||
a different kind of computer), type `make distclean'. There is
|
||||
also a `make maintainer-clean' target, but that is intended mainly
|
||||
for the package's developers. If you use it, you may have to get
|
||||
all sorts of other programs in order to regenerate files that came
|
||||
with the distribution.
|
||||
|
||||
7. Often, you can also type `make uninstall' to remove the installed
|
||||
files again. In practice, not all packages have tested that
|
||||
uninstallation works correctly, even though it is required by the
|
||||
GNU Coding Standards.
|
||||
|
||||
8. Some packages, particularly those that use Automake, provide `make
|
||||
distcheck', which can by used by developers to test that all other
|
||||
targets like `make install' and `make uninstall' work correctly.
|
||||
This target is generally not run by end users.
|
||||
|
||||
Compilers and Options
|
||||
=====================
|
||||
|
||||
Some systems require unusual options for compilation or linking that
|
||||
the `configure' script does not know about. Run `./configure --help'
|
||||
for details on some of the pertinent environment variables.
|
||||
|
||||
You can give `configure' initial values for configuration parameters
|
||||
by setting variables in the command line or in the environment. Here
|
||||
is an example:
|
||||
|
||||
./configure CC=c99 CFLAGS=-g LIBS=-lposix
|
||||
|
||||
*Note Defining Variables::, for more details.
|
||||
|
||||
Compiling For Multiple Architectures
|
||||
====================================
|
||||
|
||||
You can compile the package for more than one kind of computer at the
|
||||
same time, by placing the object files for each architecture in their
|
||||
own directory. To do this, you can use GNU `make'. `cd' to the
|
||||
directory where you want the object files and executables to go and run
|
||||
the `configure' script. `configure' automatically checks for the
|
||||
source code in the directory that `configure' is in and in `..'. This
|
||||
is known as a "VPATH" build.
|
||||
|
||||
With a non-GNU `make', it is safer to compile the package for one
|
||||
architecture at a time in the source code directory. After you have
|
||||
installed the package for one architecture, use `make distclean' before
|
||||
reconfiguring for another architecture.
|
||||
|
||||
On MacOS X 10.5 and later systems, you can create libraries and
|
||||
executables that work on multiple system types--known as "fat" or
|
||||
"universal" binaries--by specifying multiple `-arch' options to the
|
||||
compiler but only a single `-arch' option to the preprocessor. Like
|
||||
this:
|
||||
|
||||
./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||
CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||
CPP="gcc -E" CXXCPP="g++ -E"
|
||||
|
||||
This is not guaranteed to produce working output in all cases, you
|
||||
may have to build one architecture at a time and combine the results
|
||||
using the `lipo' tool if you have problems.
|
||||
|
||||
Installation Names
|
||||
==================
|
||||
|
||||
By default, `make install' installs the package's commands under
|
||||
`/usr/local/bin', include files under `/usr/local/include', etc. You
|
||||
can specify an installation prefix other than `/usr/local' by giving
|
||||
`configure' the option `--prefix=PREFIX', where PREFIX must be an
|
||||
absolute file name.
|
||||
|
||||
You can specify separate installation prefixes for
|
||||
architecture-specific files and architecture-independent files. If you
|
||||
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
|
||||
PREFIX as the prefix for installing programs and libraries.
|
||||
Documentation and other data files still use the regular prefix.
|
||||
|
||||
In addition, if you use an unusual directory layout you can give
|
||||
options like `--bindir=DIR' to specify different values for particular
|
||||
kinds of files. Run `configure --help' for a list of the directories
|
||||
you can set and what kinds of files go in them. In general, the
|
||||
default for these options is expressed in terms of `${prefix}', so that
|
||||
specifying just `--prefix' will affect all of the other directory
|
||||
specifications that were not explicitly provided.
|
||||
|
||||
The most portable way to affect installation locations is to pass the
|
||||
correct locations to `configure'; however, many packages provide one or
|
||||
both of the following shortcuts of passing variable assignments to the
|
||||
`make install' command line to change installation locations without
|
||||
having to reconfigure or recompile.
|
||||
|
||||
The first method involves providing an override variable for each
|
||||
affected directory. For example, `make install
|
||||
prefix=/alternate/directory' will choose an alternate location for all
|
||||
directory configuration variables that were expressed in terms of
|
||||
`${prefix}'. Any directories that were specified during `configure',
|
||||
but not in terms of `${prefix}', must each be overridden at install
|
||||
time for the entire installation to be relocated. The approach of
|
||||
makefile variable overrides for each directory variable is required by
|
||||
the GNU Coding Standards, and ideally causes no recompilation.
|
||||
However, some platforms have known limitations with the semantics of
|
||||
shared libraries that end up requiring recompilation when using this
|
||||
method, particularly noticeable in packages that use GNU Libtool.
|
||||
|
||||
The second method involves providing the `DESTDIR' variable. For
|
||||
example, `make install DESTDIR=/alternate/directory' will prepend
|
||||
`/alternate/directory' before all installation names. The approach of
|
||||
`DESTDIR' overrides is not required by the GNU Coding Standards, and
|
||||
does not work on platforms that have drive letters. On the other hand,
|
||||
it does better at avoiding recompilation issues, and works well even
|
||||
when some directory options were not specified in terms of `${prefix}'
|
||||
at `configure' time.
|
||||
|
||||
Optional Features
|
||||
=================
|
||||
|
||||
If the package supports it, you can cause programs to be installed
|
||||
with an extra prefix or suffix on their names by giving `configure' the
|
||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
||||
|
||||
Some packages pay attention to `--enable-FEATURE' options to
|
||||
`configure', where FEATURE indicates an optional part of the package.
|
||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||
is something like `gnu-as' or `x' (for the X Window System). The
|
||||
`README' should mention any `--enable-' and `--with-' options that the
|
||||
package recognizes.
|
||||
|
||||
For packages that use the X Window System, `configure' can usually
|
||||
find the X include and library files automatically, but if it doesn't,
|
||||
you can use the `configure' options `--x-includes=DIR' and
|
||||
`--x-libraries=DIR' to specify their locations.
|
||||
|
||||
Some packages offer the ability to configure how verbose the
|
||||
execution of `make' will be. For these packages, running `./configure
|
||||
--enable-silent-rules' sets the default to minimal output, which can be
|
||||
overridden with `make V=1'; while running `./configure
|
||||
--disable-silent-rules' sets the default to verbose, which can be
|
||||
overridden with `make V=0'.
|
||||
|
||||
Particular systems
|
||||
==================
|
||||
|
||||
On HP-UX, the default C compiler is not ANSI C compatible. If GNU
|
||||
CC is not installed, it is recommended to use the following options in
|
||||
order to use an ANSI C compiler:
|
||||
|
||||
./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
|
||||
|
||||
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
|
||||
|
||||
HP-UX `make' updates targets which have the same time stamps as
|
||||
their prerequisites, which makes it generally unusable when shipped
|
||||
generated files such as `configure' are involved. Use GNU `make'
|
||||
instead.
|
||||
|
||||
On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
|
||||
parse its `<wchar.h>' header file. The option `-nodtk' can be used as
|
||||
a workaround. If GNU CC is not installed, it is therefore recommended
|
||||
to try
|
||||
|
||||
./configure CC="cc"
|
||||
|
||||
and if that doesn't work, try
|
||||
|
||||
./configure CC="cc -nodtk"
|
||||
|
||||
On Solaris, don't put `/usr/ucb' early in your `PATH'. This
|
||||
directory contains several dysfunctional programs; working variants of
|
||||
these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
|
||||
in your `PATH', put it _after_ `/usr/bin'.
|
||||
|
||||
On Haiku, software installed for all users goes in `/boot/common',
|
||||
not `/usr/local'. It is recommended to use the following options:
|
||||
|
||||
./configure --prefix=/boot/common
|
||||
|
||||
Specifying the System Type
|
||||
==========================
|
||||
|
||||
There may be some features `configure' cannot figure out
|
||||
automatically, but needs to determine by the type of machine the package
|
||||
will run on. Usually, assuming the package is built to be run on the
|
||||
_same_ architectures, `configure' can figure that out, but if it prints
|
||||
a message saying it cannot guess the machine type, give it the
|
||||
`--build=TYPE' option. TYPE can either be a short name for the system
|
||||
type, such as `sun4', or a canonical name which has the form:
|
||||
|
||||
CPU-COMPANY-SYSTEM
|
||||
|
||||
where SYSTEM can have one of these forms:
|
||||
|
||||
OS
|
||||
KERNEL-OS
|
||||
|
||||
See the file `config.sub' for the possible values of each field. If
|
||||
`config.sub' isn't included in this package, then this package doesn't
|
||||
need to know the machine type.
|
||||
|
||||
If you are _building_ compiler tools for cross-compiling, you should
|
||||
use the option `--target=TYPE' to select the type of system they will
|
||||
produce code for.
|
||||
|
||||
If you want to _use_ a cross compiler, that generates code for a
|
||||
platform different from the build platform, you should specify the
|
||||
"host" platform (i.e., that on which the generated programs will
|
||||
eventually be run) with `--host=TYPE'.
|
||||
|
||||
Sharing Defaults
|
||||
================
|
||||
|
||||
If you want to set default values for `configure' scripts to share,
|
||||
you can create a site shell script called `config.site' that gives
|
||||
default values for variables like `CC', `cache_file', and `prefix'.
|
||||
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
||||
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||
`CONFIG_SITE' environment variable to the location of the site script.
|
||||
A warning: not all `configure' scripts look for a site script.
|
||||
|
||||
Defining Variables
|
||||
==================
|
||||
|
||||
Variables not defined in a site shell script can be set in the
|
||||
environment passed to `configure'. However, some packages may run
|
||||
configure again during the build, and the customized values of these
|
||||
variables may be lost. In order to avoid this problem, you should set
|
||||
them in the `configure' command line, using `VAR=value'. For example:
|
||||
|
||||
./configure CC=/usr/local2/bin/gcc
|
||||
|
||||
causes the specified `gcc' to be used as the C compiler (unless it is
|
||||
overridden in the site shell script).
|
||||
|
||||
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
|
||||
an Autoconf limitation. Until the limitation is lifted, you can use
|
||||
this workaround:
|
||||
|
||||
CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
|
||||
|
||||
`configure' Invocation
|
||||
======================
|
||||
|
||||
`configure' recognizes the following options to control how it
|
||||
operates.
|
||||
|
||||
`--help'
|
||||
`-h'
|
||||
Print a summary of all of the options to `configure', and exit.
|
||||
|
||||
`--help=short'
|
||||
`--help=recursive'
|
||||
Print a summary of the options unique to this package's
|
||||
`configure', and exit. The `short' variant lists options used
|
||||
only in the top level, while the `recursive' variant lists options
|
||||
also present in any nested packages.
|
||||
|
||||
`--version'
|
||||
`-V'
|
||||
Print the version of Autoconf used to generate the `configure'
|
||||
script, and exit.
|
||||
|
||||
`--cache-file=FILE'
|
||||
Enable the cache: use and save the results of the tests in FILE,
|
||||
traditionally `config.cache'. FILE defaults to `/dev/null' to
|
||||
disable caching.
|
||||
|
||||
`--config-cache'
|
||||
`-C'
|
||||
Alias for `--cache-file=config.cache'.
|
||||
|
||||
`--quiet'
|
||||
`--silent'
|
||||
`-q'
|
||||
Do not print messages saying which checks are being made. To
|
||||
suppress all normal output, redirect it to `/dev/null' (any error
|
||||
messages will still be shown).
|
||||
|
||||
`--srcdir=DIR'
|
||||
Look for the package's source code in directory DIR. Usually
|
||||
`configure' can determine that directory automatically.
|
||||
|
||||
`--prefix=DIR'
|
||||
Use DIR as the installation prefix. *note Installation Names::
|
||||
for more details, including other options available for fine-tuning
|
||||
the installation locations.
|
||||
|
||||
`--no-create'
|
||||
`-n'
|
||||
Run the configure checks, but stop before creating any output
|
||||
files.
|
||||
|
||||
`configure' also accepts some other, not widely useful, options. Run
|
||||
`configure --help' for more details.
|
||||
108
debuggers/openocd/Makefile.am
Normal file
108
debuggers/openocd/Makefile.am
Normal file
@ -0,0 +1,108 @@
|
||||
# not a GNU package. You can remove this line, if
|
||||
# have all needed files, that a GNU package needs
|
||||
AUTOMAKE_OPTIONS = gnu 1.6
|
||||
|
||||
# make sure we pass the correct jimtcl flags to distcheck
|
||||
DISTCHECK_CONFIGURE_FLAGS = --disable-install-jim
|
||||
|
||||
nobase_dist_pkgdata_DATA = \
|
||||
contrib/libdcc/dcc_stdio.c \
|
||||
contrib/libdcc/dcc_stdio.h \
|
||||
contrib/libdcc/example.c \
|
||||
contrib/libdcc/README \
|
||||
contrib/openocd.udev
|
||||
|
||||
if INTERNAL_JIMTCL
|
||||
SUBDIRS = jimtcl
|
||||
else
|
||||
SUBDIRS =
|
||||
endif
|
||||
|
||||
SUBDIRS += src doc
|
||||
|
||||
EXTRA_DIST = \
|
||||
BUGS \
|
||||
HACKING \
|
||||
NEWTAPS \
|
||||
README.Win32 \
|
||||
Doxyfile.in \
|
||||
tools/logger.pl \
|
||||
contrib/loaders
|
||||
|
||||
libtool: $(LIBTOOL_DEPS)
|
||||
$(SHELL) ./config.status --recheck
|
||||
|
||||
docs: pdf html doxygen
|
||||
|
||||
Doxyfile: $(srcdir)/Doxyfile.in
|
||||
@echo "Creating $@ from $<..."
|
||||
@( \
|
||||
echo "### @@@ -= DO NOT EDIT THIS FILE =- @@@ ###" && \
|
||||
echo "### @@@ Make changes to Doxyfile.in @@@ ###" && \
|
||||
sed -e 's,@srcdir\@,$(srcdir),' \
|
||||
-e 's,@builddir\@,$(builddir),' \
|
||||
-e 's,@doxygen_as_html\@,$(doxygen_as_html),' \
|
||||
-e 's,@doxygen_as_pdf\@,$(doxygen_as_pdf),' $< \
|
||||
) > $@
|
||||
|
||||
THE_MANUAL = doxygen/latex/refman.pdf
|
||||
|
||||
doxygen::
|
||||
$(MAKE) Doxyfile
|
||||
doxygen Doxyfile 2>&1 | perl $(srcdir)/tools/logger.pl > doxygen.log
|
||||
@if [ -f doxygen/latex/refman.tex ]; then \
|
||||
echo "Creating $(THE_MANUAL)..."; \
|
||||
$(MAKE) $(THE_MANUAL); \
|
||||
else \
|
||||
echo "Skipping Doxygen PDF..."; \
|
||||
fi
|
||||
|
||||
$(THE_MANUAL): %.pdf: %.tex
|
||||
-cd $$(dirname $*) && pdflatex $$(basename $*)
|
||||
-cd $$(dirname $*) && pdflatex $$(basename $*)
|
||||
|
||||
TCL_PATH = tcl
|
||||
# command to find paths of script files, relative to TCL_PATH
|
||||
TCL_FILES = find $(srcdir)/$(TCL_PATH) -name '*.cfg' -o -name '*.tcl' -o -name '*.txt' | \
|
||||
sed -e 's,^$(srcdir)/$(TCL_PATH),,'
|
||||
|
||||
dist-hook:
|
||||
if test -d $(srcdir)/.git -a \( ! -e $(distdir)/ChangeLog -o -w $(distdir)/ChangeLog \) ; then \
|
||||
git --git-dir $(srcdir)/.git log | $(srcdir)/tools/git2cl/git2cl > $(distdir)/ChangeLog ; \
|
||||
fi
|
||||
for i in $$($(TCL_FILES)); do \
|
||||
j="$(distdir)/$(TCL_PATH)/$$i" && \
|
||||
mkdir -p "$$(dirname $$j)" && \
|
||||
$(INSTALL_DATA) $(srcdir)/$(TCL_PATH)/$$i $$j; \
|
||||
done
|
||||
|
||||
install-data-hook:
|
||||
for i in $$($(TCL_FILES)); do \
|
||||
j="$(DESTDIR)$(pkgdatadir)/scripts/$$i" && \
|
||||
mkdir -p "$$(dirname $$j)" && \
|
||||
$(INSTALL_DATA) $(srcdir)/$(TCL_PATH)/$$i $$j; \
|
||||
done
|
||||
|
||||
uninstall-hook:
|
||||
rm -rf $(DESTDIR)$(pkgdatadir)/scripts
|
||||
|
||||
distclean-local:
|
||||
rm -rf Doxyfile doxygen
|
||||
rm -f $(srcdir)/jimtcl/configure.gnu
|
||||
|
||||
DISTCLEANFILES = doxygen.log
|
||||
|
||||
MAINTAINERCLEANFILES = \
|
||||
$(srcdir)/INSTALL \
|
||||
$(srcdir)/configure \
|
||||
$(srcdir)/Makefile.in \
|
||||
$(srcdir)/depcomp \
|
||||
$(srcdir)/config.guess \
|
||||
$(srcdir)/config.sub \
|
||||
$(srcdir)/config.h.in \
|
||||
$(srcdir)/config.h.in~ \
|
||||
$(srcdir)/compile \
|
||||
$(srcdir)/ltmain.sh \
|
||||
$(srcdir)/missing \
|
||||
$(srcdir)/aclocal.m4 \
|
||||
$(srcdir)/install-sh
|
||||
934
debuggers/openocd/Makefile.in
Normal file
934
debuggers/openocd/Makefile.in
Normal file
@ -0,0 +1,934 @@
|
||||
# Makefile.in generated by automake 1.13.1 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994-2012 Free Software Foundation, Inc.
|
||||
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE.
|
||||
|
||||
@SET_MAKE@
|
||||
|
||||
VPATH = @srcdir@
|
||||
am__make_dryrun = \
|
||||
{ \
|
||||
am__dry=no; \
|
||||
case $$MAKEFLAGS in \
|
||||
*\\[\ \ ]*) \
|
||||
echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
|
||||
| grep '^AM OK$$' >/dev/null || am__dry=yes;; \
|
||||
*) \
|
||||
for am__flg in $$MAKEFLAGS; do \
|
||||
case $$am__flg in \
|
||||
*=*|--*) ;; \
|
||||
*n*) am__dry=yes; break;; \
|
||||
esac; \
|
||||
done;; \
|
||||
esac; \
|
||||
test $$am__dry = yes; \
|
||||
}
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||
install_sh_DATA = $(install_sh) -c -m 644
|
||||
install_sh_PROGRAM = $(install_sh) -c
|
||||
install_sh_SCRIPT = $(install_sh) -c
|
||||
INSTALL_HEADER = $(INSTALL_DATA)
|
||||
transform = $(program_transform_name)
|
||||
NORMAL_INSTALL = :
|
||||
PRE_INSTALL = :
|
||||
POST_INSTALL = :
|
||||
NORMAL_UNINSTALL = :
|
||||
PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
subdir = .
|
||||
DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \
|
||||
$(srcdir)/Makefile.in $(srcdir)/Makefile.am \
|
||||
$(top_srcdir)/configure $(am__configure_deps) \
|
||||
$(srcdir)/config.h.in $(nobase_dist_pkgdata_DATA) COPYING TODO \
|
||||
compile config.guess config.sub install-sh missing ltmain.sh
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/config_subdir.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
|
||||
configure.lineno config.status.lineno
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_HEADER = config.h
|
||||
CONFIG_CLEAN_FILES =
|
||||
CONFIG_CLEAN_VPATH_FILES =
|
||||
AM_V_P = $(am__v_P_@AM_V@)
|
||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||
am__v_P_0 = false
|
||||
am__v_P_1 = :
|
||||
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
||||
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
||||
am__v_GEN_0 = @echo " GEN " $@;
|
||||
am__v_GEN_1 =
|
||||
AM_V_at = $(am__v_at_@AM_V@)
|
||||
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
||||
am__v_at_0 = @
|
||||
am__v_at_1 =
|
||||
SOURCES =
|
||||
DIST_SOURCES =
|
||||
RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
|
||||
ctags-recursive dvi-recursive html-recursive info-recursive \
|
||||
install-data-recursive install-dvi-recursive \
|
||||
install-exec-recursive install-html-recursive \
|
||||
install-info-recursive install-pdf-recursive \
|
||||
install-ps-recursive install-recursive installcheck-recursive \
|
||||
installdirs-recursive pdf-recursive ps-recursive \
|
||||
tags-recursive uninstall-recursive
|
||||
am__can_run_installinfo = \
|
||||
case $$AM_UPDATE_INFO_DIR in \
|
||||
n|no|NO) false;; \
|
||||
*) (install-info --version) >/dev/null 2>&1;; \
|
||||
esac
|
||||
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
||||
am__vpath_adj = case $$p in \
|
||||
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
||||
*) f=$$p;; \
|
||||
esac;
|
||||
am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
|
||||
am__install_max = 40
|
||||
am__nobase_strip_setup = \
|
||||
srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
|
||||
am__nobase_strip = \
|
||||
for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
|
||||
am__nobase_list = $(am__nobase_strip_setup); \
|
||||
for p in $$list; do echo "$$p $$p"; done | \
|
||||
sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
|
||||
$(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
|
||||
if (++n[$$2] == $(am__install_max)) \
|
||||
{ print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
|
||||
END { for (dir in files) print dir, files[dir] }'
|
||||
am__base_list = \
|
||||
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
|
||||
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
|
||||
am__uninstall_files_from_dir = { \
|
||||
test -z "$$files" \
|
||||
|| { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
|
||||
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
|
||||
$(am__cd) "$$dir" && rm -f $$files; }; \
|
||||
}
|
||||
am__installdirs = "$(DESTDIR)$(pkgdatadir)"
|
||||
DATA = $(nobase_dist_pkgdata_DATA)
|
||||
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
|
||||
distclean-recursive maintainer-clean-recursive
|
||||
am__recursive_targets = \
|
||||
$(RECURSIVE_TARGETS) \
|
||||
$(RECURSIVE_CLEAN_TARGETS) \
|
||||
$(am__extra_recursive_targets)
|
||||
AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
|
||||
cscope distdir dist dist-all distcheck
|
||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
|
||||
$(LISP)config.h.in
|
||||
# Read a list of newline-separated strings from the standard input,
|
||||
# and print each of them once, without duplicates. Input order is
|
||||
# *not* preserved.
|
||||
am__uniquify_input = $(AWK) '\
|
||||
BEGIN { nonempty = 0; } \
|
||||
{ items[$$0] = 1; nonempty = 1; } \
|
||||
END { if (nonempty) { for (i in items) print i; }; } \
|
||||
'
|
||||
# Make sure the list of sources is unique. This is necessary because,
|
||||
# e.g., the same source file might be shared among _SOURCES variables
|
||||
# for different programs/libraries.
|
||||
am__define_uniq_tagged_files = \
|
||||
list='$(am__tagged_files)'; \
|
||||
unique=`for i in $$list; do \
|
||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
||||
done | $(am__uniquify_input)`
|
||||
ETAGS = etags
|
||||
CTAGS = ctags
|
||||
CSCOPE = cscope
|
||||
DIST_SUBDIRS = src doc jimtcl
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
distdir = $(PACKAGE)-$(VERSION)
|
||||
top_distdir = $(distdir)
|
||||
am__remove_distdir = \
|
||||
if test -d "$(distdir)"; then \
|
||||
find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
|
||||
&& rm -rf "$(distdir)" \
|
||||
|| { sleep 5 && rm -rf "$(distdir)"; }; \
|
||||
else :; fi
|
||||
am__post_remove_distdir = $(am__remove_distdir)
|
||||
am__relativize = \
|
||||
dir0=`pwd`; \
|
||||
sed_first='s,^\([^/]*\)/.*$$,\1,'; \
|
||||
sed_rest='s,^[^/]*/*,,'; \
|
||||
sed_last='s,^.*/\([^/]*\)$$,\1,'; \
|
||||
sed_butlast='s,/*[^/]*$$,,'; \
|
||||
while test -n "$$dir1"; do \
|
||||
first=`echo "$$dir1" | sed -e "$$sed_first"`; \
|
||||
if test "$$first" != "."; then \
|
||||
if test "$$first" = ".."; then \
|
||||
dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
|
||||
dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
|
||||
else \
|
||||
first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
|
||||
if test "$$first2" = "$$first"; then \
|
||||
dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
|
||||
else \
|
||||
dir2="../$$dir2"; \
|
||||
fi; \
|
||||
dir0="$$dir0"/"$$first"; \
|
||||
fi; \
|
||||
fi; \
|
||||
dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
|
||||
done; \
|
||||
reldir="$$dir2"
|
||||
DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).zip
|
||||
GZIP_ENV = --best
|
||||
DIST_TARGETS = dist-bzip2 dist-gzip dist-zip
|
||||
distuninstallcheck_listfiles = find . -type f -print
|
||||
am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
|
||||
| sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
|
||||
distcleancheck_listfiles = find . -type f -print
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AR = @AR@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
AWK = @AWK@
|
||||
CC = @CC@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CC_FOR_BUILD = @CC_FOR_BUILD@
|
||||
CFLAGS = @CFLAGS@
|
||||
CFLAGS_FOR_BUILD = @CFLAGS_FOR_BUILD@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CYGPATH_W = @CYGPATH_W@
|
||||
DEFS = @DEFS@
|
||||
DEPDIR = @DEPDIR@
|
||||
DLLTOOL = @DLLTOOL@
|
||||
DSYMUTIL = @DSYMUTIL@
|
||||
DUMPBIN = @DUMPBIN@
|
||||
ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
EXEEXT = @EXEEXT@
|
||||
EXEEXT_FOR_BUILD = @EXEEXT_FOR_BUILD@
|
||||
FGREP = @FGREP@
|
||||
GREP = @GREP@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
LD = @LD@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBS = @LIBS@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LIBTOOL_DEPS = @LIBTOOL_DEPS@
|
||||
LIPO = @LIPO@
|
||||
LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAINT = @MAINT@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
NM = @NM@
|
||||
NMEDIT = @NMEDIT@
|
||||
OBJDUMP = @OBJDUMP@
|
||||
OBJEXT = @OBJEXT@
|
||||
OTOOL = @OTOOL@
|
||||
OTOOL64 = @OTOOL64@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
PACKAGE_NAME = @PACKAGE_NAME@
|
||||
PACKAGE_STRING = @PACKAGE_STRING@
|
||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||
PACKAGE_URL = @PACKAGE_URL@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
RANLIB = @RANLIB@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
STRIP = @STRIP@
|
||||
VERSION = @VERSION@
|
||||
abs_builddir = @abs_builddir@
|
||||
abs_srcdir = @abs_srcdir@
|
||||
abs_top_builddir = @abs_top_builddir@
|
||||
abs_top_srcdir = @abs_top_srcdir@
|
||||
ac_ct_AR = @ac_ct_AR@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
||||
am__include = @am__include@
|
||||
am__leading_dot = @am__leading_dot@
|
||||
am__quote = @am__quote@
|
||||
am__tar = @am__tar@
|
||||
am__untar = @am__untar@
|
||||
bindir = @bindir@
|
||||
build = @build@
|
||||
build_alias = @build_alias@
|
||||
build_cpu = @build_cpu@
|
||||
build_os = @build_os@
|
||||
build_vendor = @build_vendor@
|
||||
builddir = @builddir@
|
||||
datadir = @datadir@
|
||||
datarootdir = @datarootdir@
|
||||
docdir = @docdir@
|
||||
doxygen_as_html = @doxygen_as_html@
|
||||
doxygen_as_pdf = @doxygen_as_pdf@
|
||||
dvidir = @dvidir@
|
||||
exec_prefix = @exec_prefix@
|
||||
host = @host@
|
||||
host_alias = @host_alias@
|
||||
host_cpu = @host_cpu@
|
||||
host_os = @host_os@
|
||||
host_vendor = @host_vendor@
|
||||
htmldir = @htmldir@
|
||||
includedir = @includedir@
|
||||
infodir = @infodir@
|
||||
install_sh = @install_sh@
|
||||
libdir = @libdir@
|
||||
libexecdir = @libexecdir@
|
||||
localedir = @localedir@
|
||||
localstatedir = @localstatedir@
|
||||
mandir = @mandir@
|
||||
mkdir_p = @mkdir_p@
|
||||
oldincludedir = @oldincludedir@
|
||||
pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
subdirs = @subdirs@
|
||||
sysconfdir = @sysconfdir@
|
||||
target_alias = @target_alias@
|
||||
top_build_prefix = @top_build_prefix@
|
||||
top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
|
||||
# not a GNU package. You can remove this line, if
|
||||
# have all needed files, that a GNU package needs
|
||||
AUTOMAKE_OPTIONS = gnu 1.6
|
||||
|
||||
# make sure we pass the correct jimtcl flags to distcheck
|
||||
DISTCHECK_CONFIGURE_FLAGS = --disable-install-jim
|
||||
nobase_dist_pkgdata_DATA = \
|
||||
contrib/libdcc/dcc_stdio.c \
|
||||
contrib/libdcc/dcc_stdio.h \
|
||||
contrib/libdcc/example.c \
|
||||
contrib/libdcc/README \
|
||||
contrib/openocd.udev
|
||||
|
||||
@INTERNAL_JIMTCL_FALSE@SUBDIRS = src doc
|
||||
@INTERNAL_JIMTCL_TRUE@SUBDIRS = jimtcl src doc
|
||||
EXTRA_DIST = \
|
||||
BUGS \
|
||||
HACKING \
|
||||
NEWTAPS \
|
||||
README.Win32 \
|
||||
Doxyfile.in \
|
||||
tools/logger.pl \
|
||||
contrib/loaders
|
||||
|
||||
THE_MANUAL = doxygen/latex/refman.pdf
|
||||
TCL_PATH = tcl
|
||||
# command to find paths of script files, relative to TCL_PATH
|
||||
TCL_FILES = find $(srcdir)/$(TCL_PATH) -name '*.cfg' -o -name '*.tcl' -o -name '*.txt' | \
|
||||
sed -e 's,^$(srcdir)/$(TCL_PATH),,'
|
||||
|
||||
DISTCLEANFILES = doxygen.log
|
||||
MAINTAINERCLEANFILES = \
|
||||
$(srcdir)/INSTALL \
|
||||
$(srcdir)/configure \
|
||||
$(srcdir)/Makefile.in \
|
||||
$(srcdir)/depcomp \
|
||||
$(srcdir)/config.guess \
|
||||
$(srcdir)/config.sub \
|
||||
$(srcdir)/config.h.in \
|
||||
$(srcdir)/config.h.in~ \
|
||||
$(srcdir)/compile \
|
||||
$(srcdir)/ltmain.sh \
|
||||
$(srcdir)/missing \
|
||||
$(srcdir)/aclocal.m4 \
|
||||
$(srcdir)/install-sh
|
||||
|
||||
all: config.h
|
||||
$(MAKE) $(AM_MAKEFLAGS) all-recursive
|
||||
|
||||
.SUFFIXES:
|
||||
am--refresh: Makefile
|
||||
@:
|
||||
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \
|
||||
$(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \
|
||||
&& exit 0; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
done; \
|
||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu Makefile
|
||||
.PRECIOUS: Makefile
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
@case '$?' in \
|
||||
*config.status*) \
|
||||
echo ' $(SHELL) ./config.status'; \
|
||||
$(SHELL) ./config.status;; \
|
||||
*) \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
|
||||
esac;
|
||||
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
$(SHELL) ./config.status --recheck
|
||||
|
||||
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||
$(am__cd) $(srcdir) && $(AUTOCONF)
|
||||
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||
$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
|
||||
$(am__aclocal_m4_deps):
|
||||
|
||||
config.h: stamp-h1
|
||||
@if test ! -f $@; then rm -f stamp-h1; else :; fi
|
||||
@if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi
|
||||
|
||||
stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
|
||||
@rm -f stamp-h1
|
||||
cd $(top_builddir) && $(SHELL) ./config.status config.h
|
||||
$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||
($(am__cd) $(top_srcdir) && $(AUTOHEADER))
|
||||
rm -f stamp-h1
|
||||
touch $@
|
||||
|
||||
distclean-hdr:
|
||||
-rm -f config.h stamp-h1
|
||||
|
||||
mostlyclean-libtool:
|
||||
-rm -f *.lo
|
||||
|
||||
clean-libtool:
|
||||
-rm -rf .libs _libs
|
||||
|
||||
distclean-libtool:
|
||||
-rm -f libtool config.lt
|
||||
install-nobase_dist_pkgdataDATA: $(nobase_dist_pkgdata_DATA)
|
||||
@$(NORMAL_INSTALL)
|
||||
@list='$(nobase_dist_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
|
||||
if test -n "$$list"; then \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \
|
||||
fi; \
|
||||
$(am__nobase_list) | while read dir files; do \
|
||||
xfiles=; for file in $$files; do \
|
||||
if test -f "$$file"; then xfiles="$$xfiles $$file"; \
|
||||
else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \
|
||||
test -z "$$xfiles" || { \
|
||||
test "x$$dir" = x. || { \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)/$$dir'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(pkgdatadir)/$$dir"; }; \
|
||||
echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(pkgdatadir)/$$dir'"; \
|
||||
$(INSTALL_DATA) $$xfiles "$(DESTDIR)$(pkgdatadir)/$$dir" || exit $$?; }; \
|
||||
done
|
||||
|
||||
uninstall-nobase_dist_pkgdataDATA:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list='$(nobase_dist_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
|
||||
$(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \
|
||||
dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir)
|
||||
|
||||
# This directory's subdirectories are mostly independent; you can cd
|
||||
# into them and run 'make' without going through this Makefile.
|
||||
# To change the values of 'make' variables: instead of editing Makefiles,
|
||||
# (1) if the variable is set in 'config.status', edit 'config.status'
|
||||
# (which will cause the Makefiles to be regenerated when you run 'make');
|
||||
# (2) otherwise, pass the desired values on the 'make' command line.
|
||||
$(am__recursive_targets):
|
||||
@fail= failcom='exit 1'; \
|
||||
for f in x $$MAKEFLAGS; do \
|
||||
case $$f in \
|
||||
*=* | --[!k]*);; \
|
||||
*k*) failcom='fail=yes';; \
|
||||
esac; \
|
||||
done; \
|
||||
dot_seen=no; \
|
||||
target=`echo $@ | sed s/-recursive//`; \
|
||||
case "$@" in \
|
||||
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
|
||||
*) list='$(SUBDIRS)' ;; \
|
||||
esac; \
|
||||
for subdir in $$list; do \
|
||||
echo "Making $$target in $$subdir"; \
|
||||
if test "$$subdir" = "."; then \
|
||||
dot_seen=yes; \
|
||||
local_target="$$target-am"; \
|
||||
else \
|
||||
local_target="$$target"; \
|
||||
fi; \
|
||||
($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|
||||
|| eval $$failcom; \
|
||||
done; \
|
||||
if test "$$dot_seen" = "no"; then \
|
||||
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
|
||||
fi; test -z "$$fail"
|
||||
|
||||
ID: $(am__tagged_files)
|
||||
$(am__define_uniq_tagged_files); mkid -fID $$unique
|
||||
tags: tags-recursive
|
||||
TAGS: tags
|
||||
|
||||
tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||
set x; \
|
||||
here=`pwd`; \
|
||||
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
|
||||
include_option=--etags-include; \
|
||||
empty_fix=.; \
|
||||
else \
|
||||
include_option=--include; \
|
||||
empty_fix=; \
|
||||
fi; \
|
||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||
if test "$$subdir" = .; then :; else \
|
||||
test ! -f $$subdir/TAGS || \
|
||||
set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
|
||||
fi; \
|
||||
done; \
|
||||
$(am__define_uniq_tagged_files); \
|
||||
shift; \
|
||||
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
||||
test -n "$$unique" || unique=$$empty_fix; \
|
||||
if test $$# -gt 0; then \
|
||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||
"$$@" $$unique; \
|
||||
else \
|
||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
||||
$$unique; \
|
||||
fi; \
|
||||
fi
|
||||
ctags: ctags-recursive
|
||||
|
||||
CTAGS: ctags
|
||||
ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
|
||||
$(am__define_uniq_tagged_files); \
|
||||
test -z "$(CTAGS_ARGS)$$unique" \
|
||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
||||
$$unique
|
||||
|
||||
GTAGS:
|
||||
here=`$(am__cd) $(top_builddir) && pwd` \
|
||||
&& $(am__cd) $(top_srcdir) \
|
||||
&& gtags -i $(GTAGS_ARGS) "$$here"
|
||||
cscope: cscope.files
|
||||
test ! -s cscope.files \
|
||||
|| $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
|
||||
clean-cscope:
|
||||
-rm -f cscope.files
|
||||
cscope.files: clean-cscope cscopelist
|
||||
cscopelist: cscopelist-recursive
|
||||
|
||||
cscopelist-am: $(am__tagged_files)
|
||||
list='$(am__tagged_files)'; \
|
||||
case "$(srcdir)" in \
|
||||
[\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
|
||||
*) sdir=$(subdir)/$(srcdir) ;; \
|
||||
esac; \
|
||||
for i in $$list; do \
|
||||
if test -f "$$i"; then \
|
||||
echo "$(subdir)/$$i"; \
|
||||
else \
|
||||
echo "$$sdir/$$i"; \
|
||||
fi; \
|
||||
done >> $(top_builddir)/cscope.files
|
||||
|
||||
distclean-tags:
|
||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
||||
-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
$(am__remove_distdir)
|
||||
test -d "$(distdir)" || mkdir "$(distdir)"
|
||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
list='$(DISTFILES)'; \
|
||||
dist_files=`for file in $$list; do echo $$file; done | \
|
||||
sed -e "s|^$$srcdirstrip/||;t" \
|
||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
||||
case $$dist_files in \
|
||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
||||
sort -u` ;; \
|
||||
esac; \
|
||||
for file in $$dist_files; do \
|
||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||
if test -d $$d/$$file; then \
|
||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||
if test -d "$(distdir)/$$file"; then \
|
||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||
fi; \
|
||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||
fi; \
|
||||
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
||||
else \
|
||||
test -f "$(distdir)/$$file" \
|
||||
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
||||
|| exit 1; \
|
||||
fi; \
|
||||
done
|
||||
@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
|
||||
if test "$$subdir" = .; then :; else \
|
||||
$(am__make_dryrun) \
|
||||
|| test -d "$(distdir)/$$subdir" \
|
||||
|| $(MKDIR_P) "$(distdir)/$$subdir" \
|
||||
|| exit 1; \
|
||||
dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
|
||||
$(am__relativize); \
|
||||
new_distdir=$$reldir; \
|
||||
dir1=$$subdir; dir2="$(top_distdir)"; \
|
||||
$(am__relativize); \
|
||||
new_top_distdir=$$reldir; \
|
||||
echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
|
||||
echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
|
||||
($(am__cd) $$subdir && \
|
||||
$(MAKE) $(AM_MAKEFLAGS) \
|
||||
top_distdir="$$new_top_distdir" \
|
||||
distdir="$$new_distdir" \
|
||||
am__remove_distdir=: \
|
||||
am__skip_length_check=: \
|
||||
am__skip_mode_fix=: \
|
||||
distdir) \
|
||||
|| exit 1; \
|
||||
fi; \
|
||||
done
|
||||
$(MAKE) $(AM_MAKEFLAGS) \
|
||||
top_distdir="$(top_distdir)" distdir="$(distdir)" \
|
||||
dist-hook
|
||||
-test -n "$(am__skip_mode_fix)" \
|
||||
|| find "$(distdir)" -type d ! -perm -755 \
|
||||
-exec chmod u+rwx,go+rx {} \; -o \
|
||||
! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
|
||||
! -type d ! -perm -400 -exec chmod a+r {} \; -o \
|
||||
! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
|
||||
|| chmod -R a+r "$(distdir)"
|
||||
dist-gzip: distdir
|
||||
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
|
||||
$(am__post_remove_distdir)
|
||||
dist-bzip2: distdir
|
||||
tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-lzip: distdir
|
||||
tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-xz: distdir
|
||||
tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-tarZ: distdir
|
||||
tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist-shar: distdir
|
||||
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
|
||||
$(am__post_remove_distdir)
|
||||
dist-zip: distdir
|
||||
-rm -f $(distdir).zip
|
||||
zip -rq $(distdir).zip $(distdir)
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
dist dist-all:
|
||||
$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
|
||||
$(am__post_remove_distdir)
|
||||
|
||||
# This target untars the dist file and tries a VPATH configuration. Then
|
||||
# it guarantees that the distribution is self-contained by making another
|
||||
# tarfile.
|
||||
distcheck: dist
|
||||
case '$(DIST_ARCHIVES)' in \
|
||||
*.tar.gz*) \
|
||||
GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
|
||||
*.tar.bz2*) \
|
||||
bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
|
||||
*.tar.lz*) \
|
||||
lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
|
||||
*.tar.xz*) \
|
||||
xz -dc $(distdir).tar.xz | $(am__untar) ;;\
|
||||
*.tar.Z*) \
|
||||
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
|
||||
*.shar.gz*) \
|
||||
GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
|
||||
*.zip*) \
|
||||
unzip $(distdir).zip ;;\
|
||||
esac
|
||||
chmod -R a-w $(distdir)
|
||||
chmod u+w $(distdir)
|
||||
mkdir $(distdir)/_build $(distdir)/_inst
|
||||
chmod a-w $(distdir)
|
||||
test -d $(distdir)/_build || exit 0; \
|
||||
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
|
||||
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
|
||||
&& am__cwd=`pwd` \
|
||||
&& $(am__cd) $(distdir)/_build \
|
||||
&& ../configure --srcdir=.. --prefix="$$dc_install_base" \
|
||||
$(AM_DISTCHECK_CONFIGURE_FLAGS) \
|
||||
$(DISTCHECK_CONFIGURE_FLAGS) \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) check \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) install \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) uninstall \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
|
||||
distuninstallcheck \
|
||||
&& chmod -R a-w "$$dc_install_base" \
|
||||
&& ({ \
|
||||
(cd ../.. && umask 077 && mkdir "$$dc_destdir") \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
|
||||
distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
|
||||
} || { rm -rf "$$dc_destdir"; exit 1; }) \
|
||||
&& rm -rf "$$dc_destdir" \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) dist \
|
||||
&& rm -rf $(DIST_ARCHIVES) \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
|
||||
&& cd "$$am__cwd" \
|
||||
|| exit 1
|
||||
$(am__post_remove_distdir)
|
||||
@(echo "$(distdir) archives ready for distribution: "; \
|
||||
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
|
||||
sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
|
||||
distuninstallcheck:
|
||||
@test -n '$(distuninstallcheck_dir)' || { \
|
||||
echo 'ERROR: trying to run $@ with an empty' \
|
||||
'$$(distuninstallcheck_dir)' >&2; \
|
||||
exit 1; \
|
||||
}; \
|
||||
$(am__cd) '$(distuninstallcheck_dir)' || { \
|
||||
echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
|
||||
exit 1; \
|
||||
}; \
|
||||
test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
|
||||
|| { echo "ERROR: files left after uninstall:" ; \
|
||||
if test -n "$(DESTDIR)"; then \
|
||||
echo " (check DESTDIR support)"; \
|
||||
fi ; \
|
||||
$(distuninstallcheck_listfiles) ; \
|
||||
exit 1; } >&2
|
||||
distcleancheck: distclean
|
||||
@if test '$(srcdir)' = . ; then \
|
||||
echo "ERROR: distcleancheck can only run from a VPATH build" ; \
|
||||
exit 1 ; \
|
||||
fi
|
||||
@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
|
||||
|| { echo "ERROR: files left in build directory after distclean:" ; \
|
||||
$(distcleancheck_listfiles) ; \
|
||||
exit 1; } >&2
|
||||
check-am: all-am
|
||||
check: check-recursive
|
||||
all-am: Makefile $(DATA) config.h
|
||||
installdirs: installdirs-recursive
|
||||
installdirs-am:
|
||||
for dir in "$(DESTDIR)$(pkgdatadir)"; do \
|
||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||
done
|
||||
install: install-recursive
|
||||
install-exec: install-exec-recursive
|
||||
install-data: install-data-recursive
|
||||
uninstall: uninstall-recursive
|
||||
|
||||
install-am: all-am
|
||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||
|
||||
installcheck: installcheck-recursive
|
||||
install-strip:
|
||||
if test -z '$(STRIP)'; then \
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
install; \
|
||||
else \
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
||||
fi
|
||||
mostlyclean-generic:
|
||||
|
||||
clean-generic:
|
||||
|
||||
distclean-generic:
|
||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
||||
-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
|
||||
|
||||
maintainer-clean-generic:
|
||||
@echo "This command is intended for maintainers to use"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||
clean: clean-recursive
|
||||
|
||||
clean-am: clean-generic clean-libtool mostlyclean-am
|
||||
|
||||
distclean: distclean-recursive
|
||||
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
||||
-rm -f Makefile
|
||||
distclean-am: clean-am distclean-generic distclean-hdr \
|
||||
distclean-libtool distclean-local distclean-tags
|
||||
|
||||
dvi: dvi-recursive
|
||||
|
||||
dvi-am:
|
||||
|
||||
html: html-recursive
|
||||
|
||||
html-am:
|
||||
|
||||
info: info-recursive
|
||||
|
||||
info-am:
|
||||
|
||||
install-data-am: install-nobase_dist_pkgdataDATA
|
||||
@$(NORMAL_INSTALL)
|
||||
$(MAKE) $(AM_MAKEFLAGS) install-data-hook
|
||||
install-dvi: install-dvi-recursive
|
||||
|
||||
install-dvi-am:
|
||||
|
||||
install-exec-am:
|
||||
|
||||
install-html: install-html-recursive
|
||||
|
||||
install-html-am:
|
||||
|
||||
install-info: install-info-recursive
|
||||
|
||||
install-info-am:
|
||||
|
||||
install-man:
|
||||
|
||||
install-pdf: install-pdf-recursive
|
||||
|
||||
install-pdf-am:
|
||||
|
||||
install-ps: install-ps-recursive
|
||||
|
||||
install-ps-am:
|
||||
|
||||
installcheck-am:
|
||||
|
||||
maintainer-clean: maintainer-clean-recursive
|
||||
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
|
||||
-rm -rf $(top_srcdir)/autom4te.cache
|
||||
-rm -f Makefile
|
||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
||||
|
||||
mostlyclean: mostlyclean-recursive
|
||||
|
||||
mostlyclean-am: mostlyclean-generic mostlyclean-libtool
|
||||
|
||||
pdf: pdf-recursive
|
||||
|
||||
pdf-am:
|
||||
|
||||
ps: ps-recursive
|
||||
|
||||
ps-am:
|
||||
|
||||
uninstall-am: uninstall-nobase_dist_pkgdataDATA
|
||||
@$(NORMAL_INSTALL)
|
||||
$(MAKE) $(AM_MAKEFLAGS) uninstall-hook
|
||||
.MAKE: $(am__recursive_targets) all install-am install-data-am \
|
||||
install-strip uninstall-am
|
||||
|
||||
.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
|
||||
am--refresh check check-am clean clean-cscope clean-generic \
|
||||
clean-libtool cscope cscopelist-am ctags ctags-am dist \
|
||||
dist-all dist-bzip2 dist-gzip dist-hook dist-lzip dist-shar \
|
||||
dist-tarZ dist-xz dist-zip distcheck distclean \
|
||||
distclean-generic distclean-hdr distclean-libtool \
|
||||
distclean-local distclean-tags distcleancheck distdir \
|
||||
distuninstallcheck dvi dvi-am html html-am info info-am \
|
||||
install install-am install-data install-data-am \
|
||||
install-data-hook install-dvi install-dvi-am install-exec \
|
||||
install-exec-am install-html install-html-am install-info \
|
||||
install-info-am install-man install-nobase_dist_pkgdataDATA \
|
||||
install-pdf install-pdf-am install-ps install-ps-am \
|
||||
install-strip installcheck installcheck-am installdirs \
|
||||
installdirs-am maintainer-clean maintainer-clean-generic \
|
||||
mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
|
||||
ps ps-am tags tags-am uninstall uninstall-am uninstall-hook \
|
||||
uninstall-nobase_dist_pkgdataDATA
|
||||
|
||||
|
||||
libtool: $(LIBTOOL_DEPS)
|
||||
$(SHELL) ./config.status --recheck
|
||||
|
||||
docs: pdf html doxygen
|
||||
|
||||
Doxyfile: $(srcdir)/Doxyfile.in
|
||||
@echo "Creating $@ from $<..."
|
||||
@( \
|
||||
echo "### @@@ -= DO NOT EDIT THIS FILE =- @@@ ###" && \
|
||||
echo "### @@@ Make changes to Doxyfile.in @@@ ###" && \
|
||||
sed -e 's,@srcdir\@,$(srcdir),' \
|
||||
-e 's,@builddir\@,$(builddir),' \
|
||||
-e 's,@doxygen_as_html\@,$(doxygen_as_html),' \
|
||||
-e 's,@doxygen_as_pdf\@,$(doxygen_as_pdf),' $< \
|
||||
) > $@
|
||||
|
||||
doxygen::
|
||||
$(MAKE) Doxyfile
|
||||
doxygen Doxyfile 2>&1 | perl $(srcdir)/tools/logger.pl > doxygen.log
|
||||
@if [ -f doxygen/latex/refman.tex ]; then \
|
||||
echo "Creating $(THE_MANUAL)..."; \
|
||||
$(MAKE) $(THE_MANUAL); \
|
||||
else \
|
||||
echo "Skipping Doxygen PDF..."; \
|
||||
fi
|
||||
|
||||
$(THE_MANUAL): %.pdf: %.tex
|
||||
-cd $$(dirname $*) && pdflatex $$(basename $*)
|
||||
-cd $$(dirname $*) && pdflatex $$(basename $*)
|
||||
|
||||
dist-hook:
|
||||
if test -d $(srcdir)/.git -a \( ! -e $(distdir)/ChangeLog -o -w $(distdir)/ChangeLog \) ; then \
|
||||
git --git-dir $(srcdir)/.git log | $(srcdir)/tools/git2cl/git2cl > $(distdir)/ChangeLog ; \
|
||||
fi
|
||||
for i in $$($(TCL_FILES)); do \
|
||||
j="$(distdir)/$(TCL_PATH)/$$i" && \
|
||||
mkdir -p "$$(dirname $$j)" && \
|
||||
$(INSTALL_DATA) $(srcdir)/$(TCL_PATH)/$$i $$j; \
|
||||
done
|
||||
|
||||
install-data-hook:
|
||||
for i in $$($(TCL_FILES)); do \
|
||||
j="$(DESTDIR)$(pkgdatadir)/scripts/$$i" && \
|
||||
mkdir -p "$$(dirname $$j)" && \
|
||||
$(INSTALL_DATA) $(srcdir)/$(TCL_PATH)/$$i $$j; \
|
||||
done
|
||||
|
||||
uninstall-hook:
|
||||
rm -rf $(DESTDIR)$(pkgdatadir)/scripts
|
||||
|
||||
distclean-local:
|
||||
rm -rf Doxyfile doxygen
|
||||
rm -f $(srcdir)/jimtcl/configure.gnu
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
.NOEXPORT:
|
||||
43
debuggers/openocd/NEWS
Normal file
43
debuggers/openocd/NEWS
Normal file
@ -0,0 +1,43 @@
|
||||
This file includes highlights of the changes made in the
|
||||
OpenOCD source archive release. See the
|
||||
repository history for details about what changed, including
|
||||
bugfixes and other issues not mentioned here.
|
||||
|
||||
JTAG Layer:
|
||||
New TI ICDI adapter support.
|
||||
Support Latest OSBDM firmware.
|
||||
Improved MIPS EJTAG Support.
|
||||
|
||||
Boundary Scan:
|
||||
|
||||
Target Layer:
|
||||
New ARMv7R and Cortex-R4 support.
|
||||
Added ChibiOS/RT support.
|
||||
|
||||
Flash Layer:
|
||||
New NXP LPC1850 support.
|
||||
New NXP LPC4300 support.
|
||||
New NXP SPIFI support.
|
||||
New Energy Micro EFM32 support.
|
||||
New ST STM32W support.
|
||||
New ST STM32f2 write protection and lock/unlock support.
|
||||
Ability to override STM32 flash bank size.
|
||||
|
||||
Board, Target, and Interface Configuration Scripts:
|
||||
Support Freescale i.MX6 series targets.
|
||||
|
||||
Documentation:
|
||||
New MIPS debugging info.
|
||||
|
||||
Build and Release:
|
||||
|
||||
For more details about what has changed since the last release,
|
||||
see the git repository history. With gitweb, you can browse that
|
||||
in various levels of detail.
|
||||
|
||||
For older NEWS, see the NEWS files associated with each release
|
||||
(i.e. NEWS-<version>).
|
||||
|
||||
For more information about contributing test reports, bug fixes, or new
|
||||
features and device support, please read the new Developer Manual (or
|
||||
the BUGS and PATCHES.txt files in the source archive).
|
||||
145
debuggers/openocd/NEWTAPS
Normal file
145
debuggers/openocd/NEWTAPS
Normal file
@ -0,0 +1,145 @@
|
||||
Reporting Unknown JTAG TAP IDS
|
||||
------------------------------
|
||||
|
||||
If OpenOCD reports an UNKNOWN or Unexpected Tap ID please report it to
|
||||
the development mailing list - However - keep reading.
|
||||
|
||||
openocd-devel@lists.sourceforge.net.
|
||||
|
||||
========================================
|
||||
|
||||
About "UNEXPECTED" tap ids.
|
||||
|
||||
Before reporting an "UNEXPECTED TAP ID" - take a closer look.
|
||||
Perhaps you have your OpenOCD configured the wrong way, maybe you
|
||||
have the tap configured the wrong way? Or something else is wrong.
|
||||
(Remember: OpenOCD does not stop if the tap is not present)
|
||||
|
||||
This "tap id check" is there for a purpose.
|
||||
The goal is to help get the *right* configuration.
|
||||
|
||||
The idea is this:
|
||||
|
||||
Every JTAG tap is suppose to have "a unique 32bit tap id" number.
|
||||
They are suppose to be "sort of unique" but they are not. There are
|
||||
no guarantees.
|
||||
|
||||
Version Number Changes:
|
||||
|
||||
Sometimes, the tap ID only differs by VERSION number. If so - it's
|
||||
not a big deal. Please do report this information. We'd like to
|
||||
know about it.
|
||||
|
||||
For example
|
||||
|
||||
Error: ERROR: Tap: s3c4510.cpu - Expected id: 0x3f0f0f0f, Got: 0x1f0f0f0f
|
||||
Error: ERROR: expected: mfg: 0x787, part: 0xf0f0, ver: 0x3
|
||||
Error: ERROR: got: mfg: 0x787, part: 0xf0f0, ver: 0x1
|
||||
|
||||
========================================
|
||||
|
||||
Updating the Tap ID number your self
|
||||
|
||||
Why do this? You just want the warning to go away. And don't want
|
||||
to update your version/instance of OpenOCD.
|
||||
|
||||
On simple systems, to fix this problem, in your "openocd.cfg" file,
|
||||
override the tap id. Depending on the tap, add one of these 3
|
||||
commands:
|
||||
|
||||
set CPUTAPID newvalue
|
||||
or set BSTAPID newvalue
|
||||
or set FLASHTAPID newvalue
|
||||
or set ETMTAPID newvalue
|
||||
|
||||
Where "newvalue" is the new value you are seeing.
|
||||
|
||||
On complex systems, (with many taps and chips) you probably have a
|
||||
custom configuration file. Its is more complicated, you're going to
|
||||
have to read through the configuration files
|
||||
|
||||
========================================
|
||||
|
||||
What to send:
|
||||
|
||||
Cut & paste the output of OpenOCD that pointed you at this file.
|
||||
|
||||
Please include the VERSION number of OpenOCD you are using.
|
||||
|
||||
And please include the information below.
|
||||
|
||||
========================================
|
||||
|
||||
A) The JTAG TAP ID code.
|
||||
|
||||
This is always a 32bit hex number.
|
||||
|
||||
Examples:
|
||||
0x1f0f0f0f - is an old ARM7TDMI
|
||||
0x3f0f0f0f - is a newer ARM7TDMI
|
||||
0x3ba00477 - is an ARM cortex M3
|
||||
|
||||
Some chips have multiple JTAG taps - be sure to list
|
||||
each one individually - ORDER is important!
|
||||
|
||||
========================================
|
||||
B) The maker of the part
|
||||
|
||||
Examples:
|
||||
Xilinx, Atmel, ST Micro Systems, Freescale
|
||||
|
||||
========================================
|
||||
C) The family of parts it belongs to
|
||||
|
||||
Examples:
|
||||
"NXP LPC Series"
|
||||
"Atmel SAM7 Series"
|
||||
|
||||
========================================
|
||||
|
||||
D) The actual part number on the package
|
||||
|
||||
For example: "S3C45101x01"
|
||||
|
||||
========================================
|
||||
|
||||
E) What type of board it is.
|
||||
|
||||
ie: a "commercial off the self eval board" that one can purchase (as
|
||||
opposed to your private internal custom board)
|
||||
|
||||
For example: ST Micro systems has Eval boards, so does Analog Devices
|
||||
|
||||
Or - if it is inside something "hackers like to hack" that information
|
||||
is helpful too.
|
||||
|
||||
For example: A consumer GPS unit or a cellphone
|
||||
|
||||
========================================
|
||||
|
||||
(F) The maker of the board
|
||||
ie: Olimex, LogicPD, Freescale(eval board)
|
||||
|
||||
========================================
|
||||
|
||||
(G) Identifying information on the board.
|
||||
|
||||
Not good: "iar red ST eval board"
|
||||
|
||||
Really good: "IAR STR912-SK evaluation board"
|
||||
|
||||
========================================
|
||||
|
||||
(H) Are there other interesting (JTAG) chips on the board?
|
||||
|
||||
ie: An FPGA or CPLD ...
|
||||
|
||||
========================================
|
||||
|
||||
(I) What target config files need updating?
|
||||
|
||||
In fact it's best if you submit a patch with those
|
||||
updates. Most of the other information listed here
|
||||
is just to help create a good patch.
|
||||
|
||||
========================================
|
||||
461
debuggers/openocd/README
Normal file
461
debuggers/openocd/README
Normal file
@ -0,0 +1,461 @@
|
||||
Welcome to OpenOCD!
|
||||
===================
|
||||
|
||||
OpenOCD provides on-chip programming and debugging support with a
|
||||
layered architecture of JTAG interface and TAP support, debug target
|
||||
support (e.g. ARM, MIPS), and flash chip drivers (e.g. CFI, NAND, etc.).
|
||||
Several network interfaces are available for interactiving with OpenOCD:
|
||||
HTTP, telnet, TCL, and GDB. The GDB server enables OpenOCD to function
|
||||
as a "remote target" for source-level debugging of embedded systems
|
||||
using the GNU GDB program.
|
||||
|
||||
This README file contains an overview of the following topics:
|
||||
- how to find and build more OpenOCD documentation,
|
||||
- the build process
|
||||
- packaging tips.
|
||||
- configuration options
|
||||
|
||||
=====================
|
||||
OpenOCD Documentation
|
||||
=====================
|
||||
|
||||
In addition to in-tree documentation, the latest documentation may be
|
||||
viewed on-line at the following URLs:
|
||||
|
||||
OpenOCD User's Guide:
|
||||
http://openocd.sourceforge.net/doc/html/index.html
|
||||
|
||||
OpenOCD Developer's Manual:
|
||||
http://openocd.sourceforge.net/doc/doxygen/html/index.html
|
||||
|
||||
These reflect the latest development versions, so the following section
|
||||
introduces how to build the complete documentation from the package.
|
||||
|
||||
|
||||
For more information, refer to these documents or contact the developers
|
||||
by subscribing to the OpenOCD developer mailing list:
|
||||
|
||||
openocd-devel@lists.sourceforge.net
|
||||
|
||||
Building the OpenOCD Documentation
|
||||
----------------------------------
|
||||
|
||||
The OpenOCD User's Guide can be produced in two different format:
|
||||
|
||||
# If PDFVIEWER is set, this creates and views the PDF User Guide.
|
||||
make pdf && ${PDFVIEWER} doc/openocd.pdf
|
||||
|
||||
# If HTMLVIEWER is set, this creates and views the HTML User Guide.
|
||||
make html && ${HTMLVIEWER} doc/openocd.html/index.html
|
||||
|
||||
The OpenOCD Developer Manual contains information about the internal
|
||||
architecture and other details about the code:
|
||||
|
||||
# NB! make sure doxygen is installed, type doxygen --version
|
||||
make doxygen
|
||||
|
||||
# If HTMLVIEWER is set, this views the HTML Doxygen output.
|
||||
${HTMLVIEWER} doxygen/index.html
|
||||
|
||||
The remaining sections describe how to configure the system such that
|
||||
you can build the in-tree documentation.
|
||||
|
||||
==================
|
||||
Installing OpenOCD
|
||||
==================
|
||||
|
||||
On Linux, you may have permissions problems to address. The best way
|
||||
to do this is to use the contrib/openocd.udev rules file. It probably
|
||||
belongs somewhere in /etc/udev/rules.d, but consult your operating
|
||||
system documentation to be sure. In particular, make sure that it
|
||||
matches the syntax used by your operating system's version of udev.
|
||||
|
||||
A Note to OpenOCD Users
|
||||
-----------------------
|
||||
|
||||
If you would rather be working "with" OpenOCD rather than "on" it, your
|
||||
operating system or JTAG interface supplier may provide binaries for
|
||||
you in a convenient-enough package.
|
||||
|
||||
Such packages may be more stable than git mainline, where bleeding-edge
|
||||
development takes place. These "Packagers" produce binary releases of
|
||||
OpenOCD after the developers produces new "release" versions of the
|
||||
source code. Previous versions of OpenOCD cannot be used to diagnose
|
||||
problems with the current release, so users are encouraged to keep in
|
||||
contact with their distribution package maintainers or interface vendors
|
||||
to ensure suitable upgrades appear regularly.
|
||||
|
||||
Users of these binary versions of OpenOCD must contact their Packager to
|
||||
ask for support or newer versions of the binaries; the OpenOCD
|
||||
developers do not support packages directly.
|
||||
|
||||
A Note to OpenOCD Packagers
|
||||
---------------------------
|
||||
|
||||
You are a PACKAGER of OpenOCD if you:
|
||||
|
||||
- Sell dongles: and include pre-built binaries
|
||||
- Supply tools: A complete development solution
|
||||
- Supply IDEs: like Eclipse, or RHIDE, etc.
|
||||
- Build packages: RPM files, or DEB files for a Linux Distro
|
||||
|
||||
As a PACKAGER, you will experience first reports of most issues.
|
||||
When you fix those problems for your users, your solution may help
|
||||
prevent hundreds (if not thousands) of other questions from other users.
|
||||
|
||||
If something does not work for you, please work to inform the OpenOCD
|
||||
developers know how to improve the system or documentation to avoid
|
||||
future problems, and follow-up to help us ensure the issue will be fully
|
||||
resolved in our future releases.
|
||||
|
||||
That said, the OpenOCD developers would also like you to follow a few
|
||||
suggestions:
|
||||
|
||||
- Send patches, including config files, upstream.
|
||||
- Always build with printer ports enabled.
|
||||
- Use libftdi + libusb for FT2232 support.
|
||||
|
||||
Remember, the FTD2XX library cannot be used in binary distributions, due
|
||||
to restrictions of the GPL v2.
|
||||
|
||||
================
|
||||
Building OpenOCD
|
||||
================
|
||||
|
||||
The INSTALL file contains generic instructions for running 'configure'
|
||||
and compiling the OpenOCD source code. That file is provided by default
|
||||
for all GNU automake packages. If you are not familiar with the GNU
|
||||
autotools, then you should read those instructions first.
|
||||
|
||||
The remainder of this document tries to provide some instructions for
|
||||
those looking for a quick-install.
|
||||
|
||||
OpenOCD Dependencies
|
||||
--------------------
|
||||
|
||||
Presently, GCC is required to build OpenOCD. The developers have begun
|
||||
to enforce strict code warnings (-Wall, -Werror, -Wextra, and more) and
|
||||
use C99-specific features: inline functions, named initializers, mixing
|
||||
declarations with code, and other tricks. While it may be possible to
|
||||
use other compilers, they must be somewhat modern and could require
|
||||
extending support to conditionally remove GCC-specific extensions.
|
||||
|
||||
Also, you need to install the appropriate driver files, if you want to
|
||||
build support for a USB or FTDI-based interface:
|
||||
|
||||
- ft2232, jlink, rlink, vsllink, usbprog, arm-jtag-ew:
|
||||
- libusb: required for portable communication with USB dongles
|
||||
- ft2232 also requires:
|
||||
- libftdi: http://www.intra2net.com/opensource/ftdi/ *OR*
|
||||
- ftd2xx: http://www.ftdichip.com/Drivers/D2XX.htm,
|
||||
or the Amontec version (from http://www.amontec.com), for
|
||||
easier support of JTAGkey's vendor and product IDs.
|
||||
|
||||
Many Linux distributions provide these packages through their automated
|
||||
installation and update mechanisms; however, some Linux versions include
|
||||
older versions of libftdi. In particular, using Ubuntu 8.04 has been
|
||||
problematic, but newer versions of Ubuntu do not have this problem.
|
||||
|
||||
Compiling OpenOCD
|
||||
-----------------
|
||||
|
||||
To build OpenOCD (on both Linux and Cygwin), use the following sequence
|
||||
of commands:
|
||||
|
||||
./configure [with some options listed in the next section]
|
||||
make
|
||||
make install
|
||||
|
||||
The 'configure' step generates the Makefiles required to build OpenOCD,
|
||||
usually with one or more options provided to it. The first 'make' step
|
||||
will build OpenOCD and place the final executable in ./src/. The
|
||||
final (optional) step, ``make install'', places all of the files in the
|
||||
required location.
|
||||
|
||||
Cross-Compiling Options
|
||||
-----------------------
|
||||
|
||||
To cross-compile, you must specify both --build and --host options to
|
||||
the 'configure' script. For example, you can configure OpenOCD to
|
||||
cross-compile on a x86 Linux host to run on Windows (MinGW32), you could
|
||||
use the following configuration options:
|
||||
|
||||
./configure --build=i686-pc-linux-gnu --host=i586-mingw32msvc ...
|
||||
|
||||
Likewise, the following options allow OpenOCD to be cross-compiled for
|
||||
an ARM target on the same x86 host:
|
||||
|
||||
./configure --build=i686-pc-linux-gnu --host=arm-elf ...
|
||||
|
||||
Both must be specified to work around bugs in autoconf.
|
||||
|
||||
Scripts for producing ARM cross-compilers can be found on the web with a
|
||||
little searching. A script to produce an x86 Linux-hosted MinGW32
|
||||
cross-compiler can be downloaded from the following URL:
|
||||
|
||||
http://www.mingw.org/wiki/LinuxCrossMinGW
|
||||
|
||||
Configuration Options
|
||||
---------------------
|
||||
|
||||
The configure script takes numerous options, specifying which JTAG
|
||||
interfaces should be included (among other things). The following list
|
||||
of options was extracted from the output of './configure --help'. Other
|
||||
options may be available there:
|
||||
|
||||
--enable-maintainer-mode enable make rules and dependencies not useful
|
||||
(and sometimes confusing) to the casual installer
|
||||
NOTE: This option is *required* for GIT builds!
|
||||
It should *not* be used to build a release.
|
||||
|
||||
--enable-dummy Enable building the dummy JTAG port driver
|
||||
|
||||
--enable-parport Enable building the pc parallel port driver
|
||||
--disable-parport-ppdev Disable use of ppdev (/dev/parportN) for parport
|
||||
(for x86 only)
|
||||
--enable-parport-giveio Enable use of giveio for parport (for CygWin only)
|
||||
|
||||
--enable-ftdi Enable building support for the MPSSE mode of FTDI
|
||||
based devices, using libusb-1.0 in asynchronous mode
|
||||
|
||||
--enable-ft2232_libftdi Enable building support for FT2232 based devices
|
||||
using the libftdi driver, opensource alternate of
|
||||
FTD2XX
|
||||
--enable-ft2232_ftd2xx Enable building support for FT2232 based devices
|
||||
using the FTD2XX driver from ftdichip.com
|
||||
|
||||
--enable-usb_blaster_libftdi
|
||||
Enable building support for the Altera USB-Blaster
|
||||
using the libftdi driver, opensource alternate of
|
||||
FTD2XX
|
||||
--enable-usb_blaster_ftd2xx
|
||||
Enable building support for the Altera USB-Blaster
|
||||
using the FTD2XX driver from ftdichip.com
|
||||
|
||||
--enable-amtjtagaccel Enable building the Amontec JTAG-Accelerator driver
|
||||
|
||||
--enable-zy1000-master Use ZY1000 JTAG master registers
|
||||
--enable-zy1000 Enable ZY1000 interface
|
||||
|
||||
--enable-ioutil Enable ioutil functions - useful for standalone
|
||||
OpenOCD implementations
|
||||
|
||||
--enable-ep93xx Enable building support for EP93xx based SBCs
|
||||
|
||||
--enable-at91rm9200 Enable building support for AT91RM9200 based SBCs
|
||||
|
||||
--enable-gw16012 Enable building support for the Gateworks GW16012
|
||||
JTAG Programmer
|
||||
|
||||
--enable-presto_libftdi Enable building support for ASIX Presto Programmer
|
||||
using the libftdi driver
|
||||
--enable-presto_ftd2xx Enable building support for ASIX Presto Programmer
|
||||
using the FTD2XX driver
|
||||
|
||||
--enable-usbprog Enable building support for the usbprog JTAG
|
||||
Programmer
|
||||
|
||||
--enable-oocd_trace Enable building support for some prototype
|
||||
OpenOCD+trace ETM capture hardware
|
||||
|
||||
--enable-jlink Enable building support for the Segger J-Link JTAG
|
||||
Programmer
|
||||
|
||||
--enable-vsllink Enable building support for the Versaloon-Link JTAG
|
||||
Programmer
|
||||
|
||||
--enable-rlink Enable building support for the Raisonance RLink
|
||||
JTAG Programmer
|
||||
--enable-ulink Enable building support for the Keil ULINK JTAG
|
||||
Programmer
|
||||
--enable-arm-jtag-ew Enable building support for the Olimex ARM-JTAG-EW
|
||||
Programmer
|
||||
|
||||
--enable-buspirate Enable building support for the Buspirate
|
||||
|
||||
--enable-stlink Enable building support for the ST-Link JTAG
|
||||
Programmer
|
||||
--enable-ti-icdi Enable building support for the TI/Stellaris ICDI
|
||||
JTAG Programmer
|
||||
|
||||
--enable-osbdm Enable building support for the OSBDM (JTAG only)
|
||||
Programmer
|
||||
|
||||
--enable-opendous Enable building support for the estick/opendous JTAG
|
||||
Programmer
|
||||
--enable-sysfsgpio Enable building support for programming driven via
|
||||
sysfs gpios.
|
||||
|
||||
--enable-minidriver-dummy
|
||||
Enable the dummy minidriver.
|
||||
|
||||
--disable-internal-jimtcl
|
||||
Disable building internal jimtcl
|
||||
--enable-libusb0 Use libusb-0.1 library for USB JTAG devices
|
||||
--enable-remote-bitbang Enable building support for the Remote Bitbang jtag
|
||||
driver
|
||||
|
||||
--disable-doxygen-html Disable building Doxygen manual as HTML.
|
||||
--enable-doxygen-pdf Enable building Doxygen manual as PDF.
|
||||
|
||||
Miscellaneous Configure Options
|
||||
-------------------------------
|
||||
|
||||
The following additional options may also be useful:
|
||||
|
||||
--disable-assert turn off assertions
|
||||
|
||||
--enable-verbose Enable verbose JTAG I/O messages (for debugging).
|
||||
--enable-verbose-jtag-io
|
||||
Enable verbose JTAG I/O messages (for debugging).
|
||||
--enable-verbose-usb-io Enable verbose USB I/O messages (for debugging)
|
||||
--enable-verbose-usb-comms
|
||||
Enable verbose USB communication messages (for
|
||||
debugging)
|
||||
--enable-malloc-logging Include free space in logging messages (requires
|
||||
malloc.h).
|
||||
|
||||
--disable-gccwarnings Disable extra gcc warnings during build.
|
||||
--disable-wextra Disable extra compiler warnings
|
||||
--disable-werror Do not treat warnings as errors
|
||||
|
||||
--disable-option-checking
|
||||
Ignore unrecognized --enable and --with options.
|
||||
--disable-dependency-tracking speeds up one-time build
|
||||
--enable-shared[=PKGS] build shared libraries [default=no]
|
||||
--enable-static[=PKGS] build static libraries [default=yes]
|
||||
|
||||
Parallel Port Dongles
|
||||
---------------------
|
||||
|
||||
If you want to access the parallel port using the PPDEV interface you
|
||||
have to specify both --enable-parport AND --enable-parport-ppdev, since the
|
||||
the later option is an option to the parport driver (see
|
||||
http://forum.sparkfun.com/viewtopic.php?t=3795 for more info).
|
||||
|
||||
The same is true for the --enable-parport-giveio option, you
|
||||
have to use both the --enable-parport AND the --enable-parport-giveio
|
||||
option if you want to use giveio instead of ioperm parallel port access
|
||||
method.
|
||||
|
||||
FT2232C Based USB Dongles
|
||||
-------------------------
|
||||
|
||||
There are 2 methods of using the FTD2232, either (1) using the
|
||||
FTDICHIP.COM closed source driver, or (2) the open (and free) driver
|
||||
libftdi.
|
||||
|
||||
Using LIBFTDI
|
||||
-------------
|
||||
|
||||
The libftdi source code can be download from the following website:
|
||||
|
||||
http://www.intra2net.com/en/developer/libftdi/download.php
|
||||
|
||||
For both Linux and Windows, both libusb and libftdi must be built and
|
||||
installed. To use the newer FT2232H chips, supporting RTCK and USB high
|
||||
speed (480 Mbps), use libftdi version 0.17 or newer. Many Linux
|
||||
distributions provide suitable packages for these libraries.
|
||||
|
||||
For Windows, libftdi is supported with versions 0.14 and later.
|
||||
|
||||
With these prerequisites met, configure the libftdi solution like this:
|
||||
|
||||
./configure --prefix=/path/for/your/install --enable-ft2232_libftdi
|
||||
|
||||
Then type ``make'', and perhaps ``make install''.
|
||||
|
||||
Using FTDI's FTD2XX
|
||||
-------------------
|
||||
|
||||
The (closed source) FTDICHIP.COM solution is faster on MS-Windows. That
|
||||
is the motivation for supporting it even though its licensing restricts
|
||||
it to non-redistributable OpenOCD binaries, and it is not available for
|
||||
all operating systems used with OpenOCD. You may, however, build such
|
||||
copies for personal use.
|
||||
|
||||
The FTDICHIP drivers come as either a (win32) ZIP file, or a (Linux)
|
||||
TAR.GZ file. You must unpack them ``some where'' convenient. As of this
|
||||
writing FTDICHIP does not supply means to install these files "in an
|
||||
appropriate place."
|
||||
|
||||
If your distribution does not package these, there are several
|
||||
'./configure' options to solve this problem:
|
||||
|
||||
--with-ftd2xx-win32-zipdir
|
||||
Where (CYGWIN/MINGW) the zip file from ftdichip.com
|
||||
was unpacked <default=search>
|
||||
--with-ftd2xx-linux-tardir
|
||||
Where (Linux/Unix) the tar file from ftdichip.com
|
||||
was unpacked <default=search>
|
||||
--with-ftd2xx-lib Use static or shared ftd2xx libs on default static
|
||||
|
||||
If you are using the FTDICHIP.COM driver, download and unpack the
|
||||
Windows or Linux FTD2xx drivers from the following location:
|
||||
|
||||
http://www.ftdichip.com/Drivers/D2XX.htm
|
||||
|
||||
Remember, this library is binary-only, while OpenOCD is licenced
|
||||
according to GNU GPLv2 without any exceptions. That means that
|
||||
_distributing_ copies of OpenOCD built with the FTDI code would violate
|
||||
the OpenOCD licensing terms.
|
||||
|
||||
Linux Notes
|
||||
***********
|
||||
|
||||
The Linux tar.gz archive contains a directory named libftd2xx0.4.16
|
||||
(or similar). Assuming that you have extracted this archive in the same
|
||||
directory as the OpenOCD package, you could configure with options like
|
||||
the following:
|
||||
|
||||
./configure \
|
||||
--enable-ft2232_ftd2xx \
|
||||
--with-ft2xx-linux-tardir=../libftd2xx0.4.16 \
|
||||
... other options ...
|
||||
|
||||
Note that on Linux there is no good reason to use these FTDI binaries;
|
||||
they are no faster (on Linux) than libftdi, and cause licensing issues.
|
||||
|
||||
==========================
|
||||
Obtaining OpenOCD From GIT
|
||||
==========================
|
||||
|
||||
You can download the current GIT version with a GIT client of your
|
||||
choice from the main repository:
|
||||
|
||||
git://git.code.sf.net/p/openocd/code
|
||||
|
||||
You may prefer to use a mirror:
|
||||
|
||||
http://repo.or.cz/r/openocd.git
|
||||
git://repo.or.cz/openocd.git
|
||||
|
||||
Using the GIT command line client, you might use the following command
|
||||
to set up a local copy of the current repository (make sure there is no
|
||||
directory called "openocd" in the current directory):
|
||||
|
||||
git clone git://git.code.sf.net/p/openocd/code openocd
|
||||
|
||||
Then you can update that at your convenience using
|
||||
|
||||
git pull
|
||||
|
||||
There is also a gitweb interface, which you can use either to browse
|
||||
the repository or to download arbitrary snapshots using HTTP:
|
||||
|
||||
http://repo.or.cz/w/openocd.git
|
||||
|
||||
Snapshots are compressed tarballs of the source tree, about 1.3 MBytes
|
||||
each at this writing.
|
||||
|
||||
|
||||
Tips For Building From a GIT Repository
|
||||
---------------------------------------
|
||||
|
||||
Building OpenOCD from a repository requires a recent version of the GNU
|
||||
autotools (autoconf >= 2.59 and automake >= 1.9).
|
||||
|
||||
1) Run './bootstrap' to create the 'configure' script and prepare
|
||||
the build process for your host system.
|
||||
|
||||
2) Run './configure --enable-maintainer-mode' with other options.
|
||||
98
debuggers/openocd/README.Win32
Normal file
98
debuggers/openocd/README.Win32
Normal file
@ -0,0 +1,98 @@
|
||||
Building OpenOCD for Windows
|
||||
----------------------------
|
||||
|
||||
For building on Windows, you have to use CygWin. Make sure that your
|
||||
PATH environment variable contains no other locations with Unix utilities
|
||||
(like UnxUtils). Those tools can't handle the CygWin paths, resulting
|
||||
in obscure dependency errors. This was an observation gathered from the
|
||||
logs of one user; please correct us if this is wrong.
|
||||
|
||||
The following URL is a good reference if you want to build OpenOCD
|
||||
under CygWin:
|
||||
|
||||
http://forum.sparkfun.com/viewtopic.php?t=11221
|
||||
|
||||
Alternatively you can build the Windows binary under Linux using
|
||||
MinGW cross compiler. The following documents some tips of
|
||||
using this cross build option.
|
||||
|
||||
libusb-win32
|
||||
------------
|
||||
|
||||
You can choose to use the libusb-win32 binary distribution from
|
||||
its SourceForge page. As of this writing, the latest version
|
||||
is 0.1.12.2. This is the recommend version to use since it fixed
|
||||
an issue with USB composite device and this is important for FTDI
|
||||
based JTAG debuggers.
|
||||
|
||||
http://sourceforge.net/projects/libusb-win32/
|
||||
|
||||
You need to download the libusb-win32-device-bin-0.1.12.2.tar.gz
|
||||
package. Extract this file into a temp directory.
|
||||
|
||||
Copy the file libusb-win32-device-bin-0.1.12.2\include\usb.h
|
||||
to your MinGW include directory.
|
||||
|
||||
Copy the library libusb-win32-device-bin-0.1.12.2\lib\gcc\libusb.a
|
||||
to your MinGW library directory.
|
||||
|
||||
Take note that different Linux distributions often have different MinGW
|
||||
installation directory. Some of them also put the library and include
|
||||
into a separate sys-root directory.
|
||||
|
||||
When the libusb-win32 repository is more current than its release code,
|
||||
you could build that instead.
|
||||
|
||||
These are the instruction from the libusb-win32 Makefile:
|
||||
|
||||
# If you're cross-compiling and your mingw32 tools are called
|
||||
# i586-mingw32msvc-gcc and so on, then you can compile libusb-win32
|
||||
# by running
|
||||
# make host_prefix=i586-mingw32msvc all
|
||||
|
||||
libftdi
|
||||
-------
|
||||
|
||||
The author does not provide Windows binary. You can build it from a
|
||||
released source tarball or the git tree.
|
||||
|
||||
If you are using the git tree, the following are the instructions from
|
||||
README.mingw. You will need to have the cmake utility installed.
|
||||
|
||||
- Edit Toolchain-mingw32.cmake to point to the correct MinGW
|
||||
installation.
|
||||
- Create a build directory like "mkdir build-win32", e.g in ../libftdi/
|
||||
- cd into that directory and run
|
||||
"cmake -DCMAKE_TOOLCHAIN_FILE=../Toolchain-mingw32.cmake .."
|
||||
- Copy src/ftdi.h to your MinGW include directory.
|
||||
- Copy build-win32/src/*.a to your MinGW lib directory.
|
||||
|
||||
libftd2xx
|
||||
---------
|
||||
|
||||
The Cygwin/Win32 ZIP file contains a directory named ftd2xx.win32.
|
||||
After being extracted, the directory does not need further preparation.
|
||||
Instead, its path must be provided to the --with-ftd2xx-win32-zipdir
|
||||
configure option, as shown in the next section.
|
||||
|
||||
OpenOCD
|
||||
-------
|
||||
|
||||
Now you can build OpenOCD under Linux using MinGW. You need to use
|
||||
--build and --host configure options.
|
||||
|
||||
To use libftdi:
|
||||
|
||||
./configure --build=i686-pc-linux-gnu --host=i586-mingw32msvc \
|
||||
--enable-ft2232_libftdi \
|
||||
... other options ...
|
||||
|
||||
To use ftd2xx:
|
||||
|
||||
./configure --build=i686-pc-linux-gnu --host=i586-mingw32msvc \
|
||||
--enable-ft2232_ftd2xx \
|
||||
--with-ftd2xx-win32-zipdir=/path/to/libftd2xx-win32 \
|
||||
... other options ...
|
||||
|
||||
If you are using the GIT repository, see the README file for additional
|
||||
instructions about configuring and building OpenOCD.
|
||||
380
debuggers/openocd/TODO
Normal file
380
debuggers/openocd/TODO
Normal file
@ -0,0 +1,380 @@
|
||||
// This file is part of the Doxygen Developer Manual
|
||||
/** @page tasks Pending and Open Tasks
|
||||
|
||||
This page lists pending and open tasks being considered or worked upon
|
||||
by the OpenOCD community.
|
||||
|
||||
@section thelist The List
|
||||
|
||||
Most items are open for the taking, but please post to the mailing list
|
||||
before spending much time working on anything lists here. The community
|
||||
may have evolved an idea since it was added here.
|
||||
|
||||
Feel free to send patches to add or clarify items on this list, too.
|
||||
|
||||
@section thelisttcl TCL
|
||||
|
||||
This section provides possible things to improve with OpenOCD's TCL support.
|
||||
|
||||
- Fix problem with incorrect line numbers reported for a syntax
|
||||
error in a reset init event.
|
||||
|
||||
- organize the TCL configurations:
|
||||
- provide more directory structure for boards/targets?
|
||||
- factor configurations into layers (encapsulation and re-use)
|
||||
|
||||
- Fix handling of variables between multiple command line "-c" and "-f"
|
||||
parameters. Currently variables assigned through one such parameter
|
||||
command/script are unset before the next one is invoked.
|
||||
|
||||
- Isolate all TCL command support:
|
||||
- Pure C CLI implementations using --disable-builtin-tcl.
|
||||
- Allow developers to build new dongles using OpenOCD's JTAG core.
|
||||
- At first, provide only low-level JTAG support; target layer and
|
||||
above rely heavily on scripting event mechanisms.
|
||||
- Allow full TCL support? add --with-tcl=/path/to/installed/tcl
|
||||
- Move TCL support out of foo.[ch] and into foo_tcl.[ch] (other ideas?)
|
||||
- See src/jtag/core.c and src/jtag/tcl.c for an example.
|
||||
- allow some of these TCL command modules to be dynamically loadable?
|
||||
|
||||
@section thelistjtag JTAG
|
||||
|
||||
This section list issues that need to be resolved in the JTAG layer.
|
||||
|
||||
@subsection thelistjtagcore JTAG Core
|
||||
|
||||
The following tasks have been suggested for cleaning up the JTAG layer:
|
||||
|
||||
- use tap_set_state everywhere to allow logging TAP state transitions
|
||||
- Encapsulate cmd_queue_cur_state and related variable handling.
|
||||
- add slick 32 bit versions of jtag_add_xxx_scan() that avoids
|
||||
buf_set_u32() calls and other evidence of poor impedance match between
|
||||
API and calling code. New API should cut down # of lines in calling
|
||||
code by 100's and make things clearer. Also potentially be supported
|
||||
directly in minidriver API for better embedded host performance.
|
||||
|
||||
The following tasks have been suggested for adding new core JTAG support:
|
||||
|
||||
- Improve autodetection of TAPs by supporting tcl escape procedures that
|
||||
can configure discovered TAPs based on IDCODE value ... they could:
|
||||
- Remove guessing for irlen
|
||||
- Allow non-default irmask/ircapture values
|
||||
- SPI/UART emulation:
|
||||
- (ab)use bit-banging JTAG interfaces to emulate SPI/UART
|
||||
- allow SPI to program flash, MCUs, etc.
|
||||
|
||||
@subsection thelistjtaginterfaces JTAG Interfaces
|
||||
|
||||
There are some known bugs to fix in JTAG adapter drivers:
|
||||
|
||||
- For JTAG_STATEMOVE to TAP_RESET, all drivers must ignore the current
|
||||
recorded state. The tap_get_state() call won't necessarily return
|
||||
the correct value, especially at server startup. Fix is easy: in
|
||||
that case, always issue five clocks with TMS high.
|
||||
- amt_jtagaccel.c
|
||||
- arm-jtag-ew.c
|
||||
- bitbang.c
|
||||
- bitq.c
|
||||
- gw16012.c
|
||||
- jlink.c
|
||||
- usbprog.c
|
||||
- vsllink.c
|
||||
- rlink/rlink.c
|
||||
- bug: USBprog is broken with new tms sequence; it needs 7-clock cycles.
|
||||
Fix promised from Peter Denison openwrt at marshadder.org
|
||||
Workaround: use "tms_sequence long" @par
|
||||
https://lists.berlios.de/pipermail/openocd-development/2009-July/009426.html
|
||||
|
||||
The following tasks have been suggested for improving OpenOCD's JTAG
|
||||
interface support:
|
||||
|
||||
- rework USB communication to be more robust. Two possible options are:
|
||||
-# use libusb-1.0.1 with libusb-compat-0.1.1 (non-blocking I/O wrapper)
|
||||
-# rewrite implementation to use non-blocking I/O
|
||||
- J-Link driver:
|
||||
- fix to work with long scan chains, such as R.Doss's svf test.
|
||||
- FT2232 (libftdi):
|
||||
- make performance comparable to alternatives (on Win32, D2XX is faster)
|
||||
- make usability comparable to alternatives
|
||||
- Autodetect USB based adapters; this should be easy on Linux. If there's
|
||||
more than one, list the options; otherwise, just select that one.
|
||||
|
||||
The following tasks have been suggested for adding new JTAG interfaces:
|
||||
|
||||
- TCP driver: allow client/server for remote JTAG interface control.
|
||||
This requires a client and a server. The server is built into the
|
||||
normal OpenOCD and takes commands from the client and executes
|
||||
them on the interface returning the result of TCP/IP. The client
|
||||
is an OpenOCD which is built with a TCP/IP minidriver. The use
|
||||
of a minidriver is required to capture all the jtag_add_xxx()
|
||||
fn's at a high enough level and repackage these cmd's as
|
||||
TCP/IP packets handled by the server.
|
||||
|
||||
@section thelistswd Serial Wire Debug
|
||||
|
||||
- implement Serial Wire Debug interface
|
||||
|
||||
@section thelistbs Boundary Scan Support
|
||||
|
||||
- add STAPL support?
|
||||
- add BSDL support?
|
||||
|
||||
A few possible options for the above:
|
||||
-# Fake a TCL equivalent?
|
||||
-# Integrate an existing library?
|
||||
-# Write a new C implementation a la Jim?
|
||||
|
||||
Once the above are completed:
|
||||
- add support for programming flash using boundary scan techniques
|
||||
- add integration with a modified gerber view program:
|
||||
- provide means to view the PCB and select pins and traces
|
||||
- allow use-cases such as the following:
|
||||
- @b Stimulus
|
||||
-# Double-click on a pin (or trace) with the mouse.
|
||||
- @b Effects
|
||||
-# The trace starts blinking, and
|
||||
-# OpenOCD toggles the pin(s) 0/1.
|
||||
|
||||
@section thelisttargets Target Support
|
||||
|
||||
- Many common ARM cores could be autodetected using IDCODE
|
||||
- general layer cleanup: @par
|
||||
https://lists.berlios.de/pipermail/openocd-development/2009-May/006590.html
|
||||
- regression: "reset halt" between 729(works) and 788(fails): @par
|
||||
https://lists.berlios.de/pipermail/openocd-development/2009-July/009206.html
|
||||
- registers
|
||||
- add flush-value operation, call them all on resume/reset
|
||||
- mcr/mrc target->type support
|
||||
- missing from ARM920t, ARM966e, XScale.
|
||||
It's possible that the current syntax is unable to support read-modify-write
|
||||
operations(see arm966e).
|
||||
- mcr/mrc - retire cp15 commands when there the mrc/mrc commands have been
|
||||
tested from: arm926ejs, arm720t, cortex_a8
|
||||
- ARM7/9:
|
||||
- clean up "arm9tdmi vector_catch". Available for some arm7 cores? @par
|
||||
https://lists.berlios.de/pipermail/openocd-development/2009-October/011488.html
|
||||
https://lists.berlios.de/pipermail/openocd-development/2009-October/011506.html
|
||||
- add reset option to allow programming embedded ice while srst is asserted.
|
||||
Some CPUs will gate the JTAG clock when srst is asserted and in this case,
|
||||
it is necessary to program embedded ice and then assert srst afterwards.
|
||||
- ARM926EJS:
|
||||
- reset run/halt/step is not robust; needs testing to map out problems.
|
||||
- ARM11 improvements (MB?)
|
||||
- add support for asserting srst to reset the core.
|
||||
- Single stepping works, but should automatically
|
||||
use hardware stepping if available.
|
||||
- mdb can return garbage data if read byte operation fails for
|
||||
a memory region(16 & 32 byte access modes may be supported). Is this
|
||||
a bug in the .MX31 PDK init script? Try on i.MX31 PDK:
|
||||
mdw 0xb80005f0 0x8, mdh 0xb80005f0 0x10, mdb 0xb80005f0 0x20. mdb returns
|
||||
garabage.
|
||||
- implement missing functionality (grep FNC_INFO_NOTIMPLEMENTED ...)
|
||||
- Thumb2 single stepping: ARM1156T2 needs simulator support
|
||||
- Cortex A8 support (ML)
|
||||
- add target implementation (ML)
|
||||
- Cortex M3 support
|
||||
- when stepping, only write dirtied registers (be faster)
|
||||
- when connecting to halted core, fetch registers (startup is quirky)
|
||||
- Generic ARM run_algorithm() interface
|
||||
- tagged struct wrapping ARM instructions and metadata
|
||||
- not revision-specific (current: ARMv4+ARMv5 -or- ARMv6 -or- ARMv7)
|
||||
- usable with at least arm_nandwrite() and generic CFI drivers
|
||||
- ETM
|
||||
- don't show FIFOFULL registers if they're not supported
|
||||
- use comparators to get more breakpoints and watchpoints
|
||||
- add "etm drivers" command
|
||||
- trace driver init() via examine() paths only, not setup()/reset
|
||||
- MC1322x support (JW/DE?)
|
||||
- integrate and test support from JW (and DE?)
|
||||
- get working with a known good interface (i.e. not today's jlink)
|
||||
- AT91SAM92xx:
|
||||
- improvements for unknown-board-atmel-at91sam9260.cfg (RD)
|
||||
- STR9x: (ZW)
|
||||
- improvements to str912.cfg to be more general purpose
|
||||
- AVR: (SQ)
|
||||
- independently verify implementation
|
||||
- incrementally improve working prototype in trunk. (SQ)
|
||||
- work out how to debug this target
|
||||
- AVR debugging protocol.
|
||||
- FPGA:
|
||||
- Altera Nios Soft-CPU support
|
||||
- Coldfire (suggested by NC)
|
||||
- can we draw from the BDM project? @par
|
||||
http://bdm.sourceforge.net/
|
||||
|
||||
or the OSBDM package @par
|
||||
http://forums.freescale.com/freescale/board/message?board.id=OSBDM08&thread.id=422
|
||||
|
||||
@section thelistsvf SVF/XSVF
|
||||
|
||||
- develop SVF unit tests
|
||||
- develop XSVF unit tests
|
||||
|
||||
@section thelistflash Flash Support
|
||||
|
||||
- finish documentation for the following flash drivers:
|
||||
- avr
|
||||
- pic32mx
|
||||
- ocl
|
||||
- str9xpec
|
||||
|
||||
- Don't expect writing all-ones to be a safe way to write without
|
||||
changing bit values. Minimally it loses on flash modules with
|
||||
internal ECC, where it may change the ECC.
|
||||
- NOR flash_write_unlock() does that between sectors
|
||||
- there may be other cases too
|
||||
|
||||
- Make sure all commands accept either a bank name or a bank number,
|
||||
and be sure both identifiers show up in "flash banks" and "nand list".
|
||||
Right now the user-friendly names are pretty much hidden...
|
||||
|
||||
@subsection thelistflashcfi CFI
|
||||
|
||||
- finish implementing bus width/chip width handling (suggested by NC)
|
||||
- factor vendor-specific code into separate source files
|
||||
- add new callback interface for vendor-specific code
|
||||
- investigate/implement "thin wrapper" to use eCos CFI drivers (ØH)
|
||||
|
||||
@section thelistdebug Debugger Support
|
||||
|
||||
- add support for masks in watchpoints? @par
|
||||
https://lists.berlios.de/pipermail/openocd-development/2009-October/011507.html
|
||||
- breakpoints can get lost in some circumstances: @par
|
||||
https://lists.berlios.de/pipermail/openocd-development/2009-June/008853.html
|
||||
- add support for masks in watchpoints. The trick is that GDB does not
|
||||
support a breakpoint mask in the remote protocol. One way to work around
|
||||
this is to add a separate command "watchpoint_mask add/rem <addr> <mask>", that
|
||||
is run to register a list of masks that the gdb_server knows to use with
|
||||
a particular watchpoint address.
|
||||
- integrate Keil AGDI interface to OpenOCD? (submitted by Dario Vecchio)
|
||||
|
||||
@section thelisttesting Testing Suite
|
||||
|
||||
This section includes several related groups of ideas:
|
||||
- @ref thelistunittests
|
||||
- @ref thelistsmoketests
|
||||
- @ref thelisttestreports
|
||||
- @ref thelisttestgenerichw
|
||||
|
||||
@subsection thelistunittests Unit Tests
|
||||
|
||||
- add testing skeleton to provide frameworks for adding tests
|
||||
- implement server unit tests
|
||||
- implement JTAG core unit tests
|
||||
- implement JTAG interface unit tests
|
||||
- implement flash unit tests
|
||||
- implement target unit tests
|
||||
|
||||
@subsection thelistsmoketests Smoke Test Tools
|
||||
|
||||
-# extend 'make check' with a smoketest app
|
||||
- checks for OOCD_TEST_CONFIG, etc. in environment (or config file)
|
||||
- if properly set, runs the smoke test with specified parameters
|
||||
- openocd -f ${OOCD_TEST_CONFIG}
|
||||
- implies a modular test suite (see below)
|
||||
- should be able to run some minimal tests with dummy interface:
|
||||
- compare results of baseline sanity checks with expected results
|
||||
|
||||
-# builds a more complete test suite:
|
||||
- existing testing/examples/ look like a great start
|
||||
- all targets should be tested fully and for all capabilities
|
||||
- we do NOT want a "lowest common denominator" test suite
|
||||
- ... but can we start with one to get going?
|
||||
- probably requires one test configuration file per board/target
|
||||
- modularization can occur here, just like with targets/boards/chips
|
||||
- coverage can increase over time, building up bundles of tests
|
||||
|
||||
-# add new 'smoketest' Makefile target:
|
||||
- calls 'make check' (and the smoketest app)
|
||||
- gather inputs and output into a report file
|
||||
|
||||
@subsection thelisttestreports Test Feedback Tools
|
||||
|
||||
These ideas were first introduced here: @par
|
||||
https://lists.berlios.de/pipermail/openocd-development/2009-May/006358.html
|
||||
|
||||
- provide report submission scripts for e-mail and web forms
|
||||
- add new Makefile targets to post the report:
|
||||
- 'checkreportsend' -- send to list via e-mail (via sendmail)
|
||||
- 'checkreportpost' -- send web form (via curl or other script)
|
||||
|
||||
@subsection thelisttestgenerichw Generic Hardware Tester
|
||||
|
||||
- implement VHDL to use for FPGA-based JTAG TAP testing device
|
||||
- develop test suite that utilizes this testing device
|
||||
|
||||
@section thelistautotools Autotools Build System
|
||||
|
||||
- make entire configure process require less user consideration:
|
||||
- automatically detect the features that are available, unless
|
||||
options were specifically provided to configure
|
||||
- provide a report of the drivers that will be build at the end of
|
||||
running configure, so the users can verify which drivers will be
|
||||
built during 'make' (and their options) .
|
||||
- eliminate sources of confusion in @c bootstrap script:
|
||||
-# Make @c bootstrap call 'configure --enable-maintainer-mode \<opts\>'?
|
||||
-# Add @c buildstrap script to assist with bootstrap and configure steps.
|
||||
- automatically build tool-chains required for cross-compiling
|
||||
- produce mingw32, arm-elf, others using in-tree scripts
|
||||
- build all required target code from sources
|
||||
- make JTAG and USB debug output a run-time configuration option
|
||||
|
||||
@section thelistarchitecture Architectural Tasks
|
||||
|
||||
The following architectural tasks need to be accomplished and should be
|
||||
fairly easy to complete:
|
||||
|
||||
|
||||
- use dynamic allocations for working memory. Scan & fix code
|
||||
for excessive stack allocations. take linux/scripts/checkstack.pl and
|
||||
see what the worst offenders are. Dynamic stack allocations are found
|
||||
at the bottom of the list below. Example, on amd64:
|
||||
|
||||
$ objdump -d | checkstack.pl | head -10
|
||||
0x004311e3 image_open [openocd]: 13464
|
||||
0x00431301 image_open [openocd]: 13464
|
||||
0x004237a4 target_array2mem [openocd]: 4376
|
||||
0x0042382b target_array2mem [openocd]: 4376
|
||||
0x00423e74 target_mem2array [openocd]: 4360
|
||||
0x00423ef9 target_mem2array [openocd]: 4360
|
||||
0x00404aed handle_svf_command [openocd]: 2248
|
||||
0x00404b7e handle_svf_command [openocd]: 2248
|
||||
0x00413581 handle_flash_fill_command [openocd]: 2200
|
||||
0x004135fa handle_flash_fill_command [openocd]: 2200
|
||||
- clean-up code to match style guides
|
||||
- factor code to eliminate duplicated functionality
|
||||
- rewrite code that uses casts to access 16-bit and larger types
|
||||
from unaligned memory addresses
|
||||
- libopenocd support: @par
|
||||
https://lists.berlios.de/pipermail/openocd-development/2009-May/006405.html
|
||||
- review and clean up interface/target/flash APIs
|
||||
|
||||
The following strategic tasks will require ambition, knowledge, and time
|
||||
to complete:
|
||||
|
||||
- overhaul use of types to improve 32/64-bit portability
|
||||
- types for both host and target word sizes?
|
||||
- can we use GDB's CORE_TYPE support?
|
||||
- Allow N:M:P mapping of servers, targets, and interfaces
|
||||
- loadable module support for interface/target/flash drivers and commands
|
||||
- support both static and dynamic modules.
|
||||
- should probably use libltdl for dynamic library handing.
|
||||
|
||||
@section thelistadmin Documentation Tasks
|
||||
|
||||
- Develop milestone and release guidelines, processes, and scripts.
|
||||
- Develop "style" guidelines (and scripts) for maintainers:
|
||||
- reviewing patches
|
||||
- committing to git
|
||||
- Review Users' Guide for documentation errors or omissions
|
||||
- "capture" and "ocd_find" commands
|
||||
- "ocd_" prefix on various stuff
|
||||
- Update Developer's Manual (doxygen output)
|
||||
- Add documentation describing the architecture of each module
|
||||
- Provide more Technical Primers to bootstrap contributor knowledge
|
||||
|
||||
*/
|
||||
/** @file
|
||||
This file contains the @ref thelist page.
|
||||
*/
|
||||
|
||||
9770
debuggers/openocd/aclocal.m4
vendored
Normal file
9770
debuggers/openocd/aclocal.m4
vendored
Normal file
File diff suppressed because it is too large
Load Diff
12
debuggers/openocd/common.mk
Normal file
12
debuggers/openocd/common.mk
Normal file
@ -0,0 +1,12 @@
|
||||
|
||||
# common flags used in openocd build
|
||||
AM_CPPFLAGS = -I$(top_srcdir)/src \
|
||||
-I$(top_builddir)/src \
|
||||
-I$(top_srcdir)/src/helper \
|
||||
-DPKGDATADIR=\"$(pkgdatadir)\" \
|
||||
-DPKGLIBDIR=\"$(pkglibdir)\"
|
||||
|
||||
if INTERNAL_JIMTCL
|
||||
AM_CPPFLAGS += -I$(top_srcdir)/jimtcl \
|
||||
-I$(top_builddir)/jimtcl
|
||||
endif
|
||||
347
debuggers/openocd/compile
Executable file
347
debuggers/openocd/compile
Executable file
@ -0,0 +1,347 @@
|
||||
#! /bin/sh
|
||||
# Wrapper for compilers which do not understand '-c -o'.
|
||||
|
||||
scriptversion=2012-10-14.11; # UTC
|
||||
|
||||
# Copyright (C) 1999-2013 Free Software Foundation, Inc.
|
||||
# Written by Tom Tromey <tromey@cygnus.com>.
|
||||
#
|
||||
# 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 2, 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/>.
|
||||
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
# This file is maintained in Automake, please report
|
||||
# bugs to <bug-automake@gnu.org> or send patches to
|
||||
# <automake-patches@gnu.org>.
|
||||
|
||||
nl='
|
||||
'
|
||||
|
||||
# We need space, tab and new line, in precisely that order. Quoting is
|
||||
# there to prevent tools from complaining about whitespace usage.
|
||||
IFS=" "" $nl"
|
||||
|
||||
file_conv=
|
||||
|
||||
# func_file_conv build_file lazy
|
||||
# Convert a $build file to $host form and store it in $file
|
||||
# Currently only supports Windows hosts. If the determined conversion
|
||||
# type is listed in (the comma separated) LAZY, no conversion will
|
||||
# take place.
|
||||
func_file_conv ()
|
||||
{
|
||||
file=$1
|
||||
case $file in
|
||||
/ | /[!/]*) # absolute file, and not a UNC file
|
||||
if test -z "$file_conv"; then
|
||||
# lazily determine how to convert abs files
|
||||
case `uname -s` in
|
||||
MINGW*)
|
||||
file_conv=mingw
|
||||
;;
|
||||
CYGWIN*)
|
||||
file_conv=cygwin
|
||||
;;
|
||||
*)
|
||||
file_conv=wine
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
case $file_conv/,$2, in
|
||||
*,$file_conv,*)
|
||||
;;
|
||||
mingw/*)
|
||||
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
|
||||
;;
|
||||
cygwin/*)
|
||||
file=`cygpath -m "$file" || echo "$file"`
|
||||
;;
|
||||
wine/*)
|
||||
file=`winepath -w "$file" || echo "$file"`
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# func_cl_dashL linkdir
|
||||
# Make cl look for libraries in LINKDIR
|
||||
func_cl_dashL ()
|
||||
{
|
||||
func_file_conv "$1"
|
||||
if test -z "$lib_path"; then
|
||||
lib_path=$file
|
||||
else
|
||||
lib_path="$lib_path;$file"
|
||||
fi
|
||||
linker_opts="$linker_opts -LIBPATH:$file"
|
||||
}
|
||||
|
||||
# func_cl_dashl library
|
||||
# Do a library search-path lookup for cl
|
||||
func_cl_dashl ()
|
||||
{
|
||||
lib=$1
|
||||
found=no
|
||||
save_IFS=$IFS
|
||||
IFS=';'
|
||||
for dir in $lib_path $LIB
|
||||
do
|
||||
IFS=$save_IFS
|
||||
if $shared && test -f "$dir/$lib.dll.lib"; then
|
||||
found=yes
|
||||
lib=$dir/$lib.dll.lib
|
||||
break
|
||||
fi
|
||||
if test -f "$dir/$lib.lib"; then
|
||||
found=yes
|
||||
lib=$dir/$lib.lib
|
||||
break
|
||||
fi
|
||||
if test -f "$dir/lib$lib.a"; then
|
||||
found=yes
|
||||
lib=$dir/lib$lib.a
|
||||
break
|
||||
fi
|
||||
done
|
||||
IFS=$save_IFS
|
||||
|
||||
if test "$found" != yes; then
|
||||
lib=$lib.lib
|
||||
fi
|
||||
}
|
||||
|
||||
# func_cl_wrapper cl arg...
|
||||
# Adjust compile command to suit cl
|
||||
func_cl_wrapper ()
|
||||
{
|
||||
# Assume a capable shell
|
||||
lib_path=
|
||||
shared=:
|
||||
linker_opts=
|
||||
for arg
|
||||
do
|
||||
if test -n "$eat"; then
|
||||
eat=
|
||||
else
|
||||
case $1 in
|
||||
-o)
|
||||
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
||||
eat=1
|
||||
case $2 in
|
||||
*.o | *.[oO][bB][jJ])
|
||||
func_file_conv "$2"
|
||||
set x "$@" -Fo"$file"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
func_file_conv "$2"
|
||||
set x "$@" -Fe"$file"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
-I)
|
||||
eat=1
|
||||
func_file_conv "$2" mingw
|
||||
set x "$@" -I"$file"
|
||||
shift
|
||||
;;
|
||||
-I*)
|
||||
func_file_conv "${1#-I}" mingw
|
||||
set x "$@" -I"$file"
|
||||
shift
|
||||
;;
|
||||
-l)
|
||||
eat=1
|
||||
func_cl_dashl "$2"
|
||||
set x "$@" "$lib"
|
||||
shift
|
||||
;;
|
||||
-l*)
|
||||
func_cl_dashl "${1#-l}"
|
||||
set x "$@" "$lib"
|
||||
shift
|
||||
;;
|
||||
-L)
|
||||
eat=1
|
||||
func_cl_dashL "$2"
|
||||
;;
|
||||
-L*)
|
||||
func_cl_dashL "${1#-L}"
|
||||
;;
|
||||
-static)
|
||||
shared=false
|
||||
;;
|
||||
-Wl,*)
|
||||
arg=${1#-Wl,}
|
||||
save_ifs="$IFS"; IFS=','
|
||||
for flag in $arg; do
|
||||
IFS="$save_ifs"
|
||||
linker_opts="$linker_opts $flag"
|
||||
done
|
||||
IFS="$save_ifs"
|
||||
;;
|
||||
-Xlinker)
|
||||
eat=1
|
||||
linker_opts="$linker_opts $2"
|
||||
;;
|
||||
-*)
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
|
||||
func_file_conv "$1"
|
||||
set x "$@" -Tp"$file"
|
||||
shift
|
||||
;;
|
||||
*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
|
||||
func_file_conv "$1" mingw
|
||||
set x "$@" "$file"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
shift
|
||||
done
|
||||
if test -n "$linker_opts"; then
|
||||
linker_opts="-link$linker_opts"
|
||||
fi
|
||||
exec "$@" $linker_opts
|
||||
exit 1
|
||||
}
|
||||
|
||||
eat=
|
||||
|
||||
case $1 in
|
||||
'')
|
||||
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
||||
exit 1;
|
||||
;;
|
||||
-h | --h*)
|
||||
cat <<\EOF
|
||||
Usage: compile [--help] [--version] PROGRAM [ARGS]
|
||||
|
||||
Wrapper for compilers which do not understand '-c -o'.
|
||||
Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
|
||||
arguments, and rename the output as expected.
|
||||
|
||||
If you are trying to build a whole package this is not the
|
||||
right script to run: please start by reading the file 'INSTALL'.
|
||||
|
||||
Report bugs to <bug-automake@gnu.org>.
|
||||
EOF
|
||||
exit $?
|
||||
;;
|
||||
-v | --v*)
|
||||
echo "compile $scriptversion"
|
||||
exit $?
|
||||
;;
|
||||
cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
|
||||
func_cl_wrapper "$@" # Doesn't return...
|
||||
;;
|
||||
esac
|
||||
|
||||
ofile=
|
||||
cfile=
|
||||
|
||||
for arg
|
||||
do
|
||||
if test -n "$eat"; then
|
||||
eat=
|
||||
else
|
||||
case $1 in
|
||||
-o)
|
||||
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
||||
# So we strip '-o arg' only if arg is an object.
|
||||
eat=1
|
||||
case $2 in
|
||||
*.o | *.obj)
|
||||
ofile=$2
|
||||
;;
|
||||
*)
|
||||
set x "$@" -o "$2"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
*.c)
|
||||
cfile=$1
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set x "$@" "$1"
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
shift
|
||||
done
|
||||
|
||||
if test -z "$ofile" || test -z "$cfile"; then
|
||||
# If no '-o' option was seen then we might have been invoked from a
|
||||
# pattern rule where we don't need one. That is ok -- this is a
|
||||
# normal compilation that the losing compiler can handle. If no
|
||||
# '.c' file was seen then we are probably linking. That is also
|
||||
# ok.
|
||||
exec "$@"
|
||||
fi
|
||||
|
||||
# Name of file we expect compiler to create.
|
||||
cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
|
||||
|
||||
# Create the lock directory.
|
||||
# Note: use '[/\\:.-]' here to ensure that we don't use the same name
|
||||
# that we are using for the .o file. Also, base the name on the expected
|
||||
# object file name, since that is what matters with a parallel build.
|
||||
lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
|
||||
while true; do
|
||||
if mkdir "$lockdir" >/dev/null 2>&1; then
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
# FIXME: race condition here if user kills between mkdir and trap.
|
||||
trap "rmdir '$lockdir'; exit 1" 1 2 15
|
||||
|
||||
# Run the compile.
|
||||
"$@"
|
||||
ret=$?
|
||||
|
||||
if test -f "$cofile"; then
|
||||
test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
|
||||
elif test -f "${cofile}bj"; then
|
||||
test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
|
||||
fi
|
||||
|
||||
rmdir "$lockdir"
|
||||
exit $ret
|
||||
|
||||
# Local Variables:
|
||||
# mode: shell-script
|
||||
# sh-indentation: 2
|
||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
||||
1535
debuggers/openocd/config.guess
vendored
Executable file
1535
debuggers/openocd/config.guess
vendored
Executable file
File diff suppressed because it is too large
Load Diff
320
debuggers/openocd/config.h.in
Normal file
320
debuggers/openocd/config.h.in
Normal file
@ -0,0 +1,320 @@
|
||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||
|
||||
/* Define if building universal (internal helper macro) */
|
||||
#undef AC_APPLE_UNIVERSAL_BUILD
|
||||
|
||||
/* 0 if you don't want the Amontec JTAG-Accelerator driver. */
|
||||
#undef BUILD_AMTJTAGACCEL
|
||||
|
||||
/* 0 if you don't want the ARM-JTAG-EW JTAG driver. */
|
||||
#undef BUILD_ARMJTAGEW
|
||||
|
||||
/* 0 if you don't want at91rm9200. */
|
||||
#undef BUILD_AT91RM9200
|
||||
|
||||
/* 0 if you don't want a bitbang interface. */
|
||||
#undef BUILD_BITBANG
|
||||
|
||||
/* 0 if you don't want a bitq interface. */
|
||||
#undef BUILD_BITQ
|
||||
|
||||
/* 0 if you don't want the Buspirate JTAG driver. */
|
||||
#undef BUILD_BUSPIRATE
|
||||
|
||||
/* 0 if you don't want dummy driver. */
|
||||
#undef BUILD_DUMMY
|
||||
|
||||
/* 0 if you don't want ep93xx. */
|
||||
#undef BUILD_EP93XX
|
||||
|
||||
/* 0 if you don't want ftd2xx ft2232. */
|
||||
#undef BUILD_FT2232_FTD2XX
|
||||
|
||||
/* Support FT2232H/FT4232HS with FTD2XX or libftdi. */
|
||||
#undef BUILD_FT2232_HIGHSPEED
|
||||
|
||||
/* 0 if you don't want libftdi ft2232. */
|
||||
#undef BUILD_FT2232_LIBFTDI
|
||||
|
||||
/* 0 if you don't want ftdi. */
|
||||
#undef BUILD_FTDI
|
||||
|
||||
/* 0 if you don't want the Gateworks GW16012 driver. */
|
||||
#undef BUILD_GW16012
|
||||
|
||||
/* 0 if you don't want the High Level JTAG driver. */
|
||||
#undef BUILD_HLADAPTER
|
||||
|
||||
/* 0 if you don't want the J-Link JTAG driver. */
|
||||
#undef BUILD_JLINK
|
||||
|
||||
/* Use the dummy minidriver. */
|
||||
#undef BUILD_MINIDRIVER_DUMMY
|
||||
|
||||
/* 0 if you don't want the OpenOCD+trace ETM capture driver. */
|
||||
#undef BUILD_OOCD_TRACE
|
||||
|
||||
/* 0 if you don't want the estick/opendous JTAG driver. */
|
||||
#undef BUILD_OPENDOUS
|
||||
|
||||
/* 0 if you don't want the OSBDM driver. */
|
||||
#undef BUILD_OSBDM
|
||||
|
||||
/* 0 if you don't want parport. */
|
||||
#undef BUILD_PARPORT
|
||||
|
||||
/* 0 if you don't want the ASIX PRESTO driver using FTD2XX. */
|
||||
#undef BUILD_PRESTO_FTD2XX
|
||||
|
||||
/* 0 if you don't want the ASIX PRESTO driver using libftdi. */
|
||||
#undef BUILD_PRESTO_LIBFTDI
|
||||
|
||||
/* 0 if you don't want the Remote Bitbang JTAG driver. */
|
||||
#undef BUILD_REMOTE_BITBANG
|
||||
|
||||
/* 0 if you don't want the RLink JTAG driver. */
|
||||
#undef BUILD_RLINK
|
||||
|
||||
/* 0 if you don't want SysfsGPIO driver. */
|
||||
#undef BUILD_SYSFSGPIO
|
||||
|
||||
/* 0 if you don't want the ULINK JTAG driver. */
|
||||
#undef BUILD_ULINK
|
||||
|
||||
/* 0 if you don't want the usbprog JTAG driver. */
|
||||
#undef BUILD_USBPROG
|
||||
|
||||
/* 0 if you don't want ftd2xx usb_blaster. */
|
||||
#undef BUILD_USB_BLASTER_FTD2XX
|
||||
|
||||
/* 0 if you don't want libftdi usb_blaster. */
|
||||
#undef BUILD_USB_BLASTER_LIBFTDI
|
||||
|
||||
/* 0 if you don't want the Versaloon-Link JTAG driver. */
|
||||
#undef BUILD_VSLLINK
|
||||
|
||||
/* 0 if you don't want ZY1000. */
|
||||
#undef BUILD_ZY1000
|
||||
|
||||
/* 0 if you don't want ZY1000 JTAG master registers. */
|
||||
#undef BUILD_ZY1000_MASTER
|
||||
|
||||
/* Support FT232H with FTD2XX or libftdi. */
|
||||
#undef HAS_ENUM_FT232H
|
||||
|
||||
/* Define to 1 if you have the <arpa/inet.h> header file. */
|
||||
#undef HAVE_ARPA_INET_H
|
||||
|
||||
/* Define to 1 if you have the <dirent.h> header file. */
|
||||
#undef HAVE_DIRENT_H
|
||||
|
||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
||||
#undef HAVE_DLFCN_H
|
||||
|
||||
/* Define to 1 if you have the <elf.h> header file. */
|
||||
#undef HAVE_ELF_H
|
||||
|
||||
/* Define to 1 if you have the <fcntl.h> header file. */
|
||||
#undef HAVE_FCNTL_H
|
||||
|
||||
/* Define to 1 if you have the `gettimeofday' function. */
|
||||
#undef HAVE_GETTIMEOFDAY
|
||||
|
||||
/* Define to 1 if you have the <ifaddrs.h> header file. */
|
||||
#undef HAVE_IFADDRS_H
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#undef HAVE_INTTYPES_H
|
||||
|
||||
/* Define to 1 if you have the <jtag_minidriver.h> header file. */
|
||||
#undef HAVE_JTAG_MINIDRIVER_H
|
||||
|
||||
/* Define if you have libusb-1.0 */
|
||||
#undef HAVE_LIBUSB1
|
||||
|
||||
/* Define to 1 if the system has the type 'long long int'. */
|
||||
#undef HAVE_LONG_LONG_INT
|
||||
|
||||
/* Define to 1 if you have the <malloc.h> header file. */
|
||||
#undef HAVE_MALLOC_H
|
||||
|
||||
/* Define to 1 if you have the <memory.h> header file. */
|
||||
#undef HAVE_MEMORY_H
|
||||
|
||||
/* Define to 1 if you have the <netdb.h> header file. */
|
||||
#undef HAVE_NETDB_H
|
||||
|
||||
/* Define to 1 if you have the <netinet/in.h> header file. */
|
||||
#undef HAVE_NETINET_IN_H
|
||||
|
||||
/* Define to 1 if you have the <netinet/tcp.h> header file. */
|
||||
#undef HAVE_NETINET_TCP_H
|
||||
|
||||
/* Define to 1 if you have the <net/if.h> header file. */
|
||||
#undef HAVE_NET_IF_H
|
||||
|
||||
/* Define to 1 if you have the <pthread.h> header file. */
|
||||
#undef HAVE_PTHREAD_H
|
||||
|
||||
/* Define to 1 if stdbool.h conforms to C99. */
|
||||
#undef HAVE_STDBOOL_H
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#undef HAVE_STDINT_H
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#undef HAVE_STDLIB_H
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#undef HAVE_STRINGS_H
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#undef HAVE_STRING_H
|
||||
|
||||
/* Define to 1 if you have the `strndup' function. */
|
||||
#undef HAVE_STRNDUP
|
||||
|
||||
/* Define to 1 if you have the `strnlen' function. */
|
||||
#undef HAVE_STRNLEN
|
||||
|
||||
/* Define to 1 if you have the <sys/ioctl.h> header file. */
|
||||
#undef HAVE_SYS_IOCTL_H
|
||||
|
||||
/* Define to 1 if you have the <sys/io.h> header file. */
|
||||
#undef HAVE_SYS_IO_H
|
||||
|
||||
/* Define to 1 if you have the <sys/param.h> header file. */
|
||||
#undef HAVE_SYS_PARAM_H
|
||||
|
||||
/* Define to 1 if you have the <sys/poll.h> header file. */
|
||||
#undef HAVE_SYS_POLL_H
|
||||
|
||||
/* Define to 1 if you have the <sys/select.h> header file. */
|
||||
#undef HAVE_SYS_SELECT_H
|
||||
|
||||
/* Define to 1 if you have the <sys/socket.h> header file. */
|
||||
#undef HAVE_SYS_SOCKET_H
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#undef HAVE_SYS_STAT_H
|
||||
|
||||
/* Define to 1 if you have the <sys/time.h> header file. */
|
||||
#undef HAVE_SYS_TIME_H
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#undef HAVE_SYS_TYPES_H
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#undef HAVE_UNISTD_H
|
||||
|
||||
/* Define to 1 if the system has the type 'unsigned long long int'. */
|
||||
#undef HAVE_UNSIGNED_LONG_LONG_INT
|
||||
|
||||
/* Define to 1 if you have the <usb.h> header file. */
|
||||
#undef HAVE_USB_H
|
||||
|
||||
/* Define to 1 if you have the `usleep' function. */
|
||||
#undef HAVE_USLEEP
|
||||
|
||||
/* Define to 1 if you have the `vasprintf' function. */
|
||||
#undef HAVE_VASPRINTF
|
||||
|
||||
/* Define to 1 if the system has the type `_Bool'. */
|
||||
#undef HAVE__BOOL
|
||||
|
||||
/* 0 if not building for Cygwin. */
|
||||
#undef IS_CYGWIN
|
||||
|
||||
/* 0 if not building for Darwin. */
|
||||
#undef IS_DARWIN
|
||||
|
||||
/* 1 if building for MinGW. */
|
||||
#undef IS_MINGW
|
||||
|
||||
/* 0 if not building for Win32. */
|
||||
#undef IS_WIN32
|
||||
|
||||
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
||||
*/
|
||||
#undef LT_OBJDIR
|
||||
|
||||
/* Define to 1 if assertions should be disabled. */
|
||||
#undef NDEBUG
|
||||
|
||||
/* Must declare 'environ' to use it. */
|
||||
#undef NEED_ENVIRON_EXTERN
|
||||
|
||||
/* Define to 1 if your C compiler doesn't accept -c and -o together. */
|
||||
#undef NO_MINUS_C_MINUS_O
|
||||
|
||||
/* Name of package */
|
||||
#undef PACKAGE
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#undef PACKAGE_BUGREPORT
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#undef PACKAGE_NAME
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#undef PACKAGE_STRING
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#undef PACKAGE_TARNAME
|
||||
|
||||
/* Define to the home page for this package. */
|
||||
#undef PACKAGE_URL
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#undef PACKAGE_VERSION
|
||||
|
||||
/* 0 if you don't want parport to use giveio. */
|
||||
#undef PARPORT_USE_GIVEIO
|
||||
|
||||
/* 0 if you don't want parport to use ppdev. */
|
||||
#undef PARPORT_USE_PPDEV
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#undef STDC_HEADERS
|
||||
|
||||
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
|
||||
#undef TIME_WITH_SYS_TIME
|
||||
|
||||
/* Version number of package */
|
||||
#undef VERSION
|
||||
|
||||
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
|
||||
significant byte first (like Motorola and SPARC, unlike Intel). */
|
||||
#if defined AC_APPLE_UNIVERSAL_BUILD
|
||||
# if defined __BIG_ENDIAN__
|
||||
# define WORDS_BIGENDIAN 1
|
||||
# endif
|
||||
#else
|
||||
# ifndef WORDS_BIGENDIAN
|
||||
# undef WORDS_BIGENDIAN
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Include malloc free space in logging */
|
||||
#undef _DEBUG_FREE_SPACE_
|
||||
|
||||
/* Print verbose JTAG I/O messages */
|
||||
#undef _DEBUG_JTAG_IO_
|
||||
|
||||
/* Print verbose USB communication messages */
|
||||
#undef _DEBUG_USB_COMMS_
|
||||
|
||||
/* Print verbose USB I/O messages */
|
||||
#undef _DEBUG_USB_IO_
|
||||
|
||||
/* Use GNU C library extensions (e.g. stdndup). */
|
||||
#undef _GNU_SOURCE
|
||||
|
||||
/* Define to empty if `const' does not conform to ANSI C. */
|
||||
#undef const
|
||||
|
||||
|
||||
#include <helper/system.h>
|
||||
#include <helper/types.h>
|
||||
#include <helper/replacements.h>
|
||||
|
||||
1790
debuggers/openocd/config.sub
vendored
Executable file
1790
debuggers/openocd/config.sub
vendored
Executable file
File diff suppressed because it is too large
Load Diff
27
debuggers/openocd/config_subdir.m4
Normal file
27
debuggers/openocd/config_subdir.m4
Normal file
@ -0,0 +1,27 @@
|
||||
dnl
|
||||
dnl If needed, define the m4_ifblank and m4_ifnblank macros from autoconf 2.64
|
||||
dnl This allows us to run with earlier Autoconfs as well.
|
||||
ifdef([m4_ifblank],[],[
|
||||
m4_define([m4_ifblank],
|
||||
[m4_if(m4_translit([[$1]], [ ][ ][
|
||||
]), [], [$2], [$3])])])
|
||||
dnl
|
||||
ifdef([m4_ifnblank],[],[
|
||||
m4_define([m4_ifnblank],
|
||||
[m4_if(m4_translit([[$1]], [ ][ ][
|
||||
]), [], [$3], [$2])])])
|
||||
dnl
|
||||
|
||||
dnl AC_CONFIG_SUBDIRS does not allow configure options to be passed
|
||||
dnl to subdirs, this function allows that by creating a configure.gnu
|
||||
dnl script that prepends configure options and then calls the real
|
||||
dnl configure script
|
||||
AC_DEFUN([AX_CONFIG_SUBDIR_OPTION],
|
||||
[
|
||||
AC_CONFIG_SUBDIRS([$1])
|
||||
|
||||
m4_ifblank([$2], [rm -f $srcdir/$1/configure.gnu],
|
||||
[printf "#!/bin/sh
|
||||
"\$"SHELL "../$srcdir/$1/configure" $2 \""\$"@"\" > "$srcdir/$1/configure.gnu"
|
||||
])
|
||||
])
|
||||
18031
debuggers/openocd/configure
vendored
Executable file
18031
debuggers/openocd/configure
vendored
Executable file
File diff suppressed because it is too large
Load Diff
1328
debuggers/openocd/configure.ac
Normal file
1328
debuggers/openocd/configure.ac
Normal file
File diff suppressed because it is too large
Load Diff
19
debuggers/openocd/contrib/libdcc/README
Normal file
19
debuggers/openocd/contrib/libdcc/README
Normal file
@ -0,0 +1,19 @@
|
||||
This code is an example of using the openocd debug message system.
|
||||
|
||||
Before the message output is seen in the debug window, the functionality
|
||||
will need enabling:
|
||||
|
||||
From the gdb prompt:
|
||||
monitor target_request debugmsgs enable
|
||||
monitor trace point 1
|
||||
|
||||
From the Telnet prompt:
|
||||
target_request debugmsgs enable
|
||||
trace point 1
|
||||
|
||||
To see how many times the trace point was hit:
|
||||
(monitor) trace point 1
|
||||
|
||||
Spen
|
||||
spen@spen-soft.co.uk
|
||||
|
||||
157
debuggers/openocd/contrib/libdcc/dcc_stdio.c
Normal file
157
debuggers/openocd/contrib/libdcc/dcc_stdio.c
Normal file
@ -0,0 +1,157 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2008 by Dominic Rath *
|
||||
* Dominic.Rath@gmx.de *
|
||||
* Copyright (C) 2008 by Spencer Oliver *
|
||||
* spen@spen-soft.co.uk *
|
||||
* Copyright (C) 2008 by Frederik Kriewtz *
|
||||
* frederik@kriewitz.eu *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
#include "dcc_stdio.h"
|
||||
|
||||
#define TARGET_REQ_TRACEMSG 0x00
|
||||
#define TARGET_REQ_DEBUGMSG_ASCII 0x01
|
||||
#define TARGET_REQ_DEBUGMSG_HEXMSG(size) (0x01 | ((size & 0xff) << 8))
|
||||
#define TARGET_REQ_DEBUGCHAR 0x02
|
||||
|
||||
#if defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_6SM__)
|
||||
|
||||
/* we use the System Control Block DCRDR reg to simulate a arm7_9 dcc channel
|
||||
* DCRDR[7:0] is used by target for status
|
||||
* DCRDR[15:8] is used by target for write buffer
|
||||
* DCRDR[23:16] is used for by host for status
|
||||
* DCRDR[31:24] is used for by host for write buffer */
|
||||
|
||||
#define NVIC_DBG_DATA_R (*((volatile unsigned short *)0xE000EDF8))
|
||||
|
||||
#define BUSY 1
|
||||
|
||||
void dbg_write(unsigned long dcc_data)
|
||||
{
|
||||
int len = 4;
|
||||
|
||||
while (len--)
|
||||
{
|
||||
/* wait for data ready */
|
||||
while (NVIC_DBG_DATA_R & BUSY);
|
||||
|
||||
/* write our data and set write flag - tell host there is data*/
|
||||
NVIC_DBG_DATA_R = (unsigned short)(((dcc_data & 0xff) << 8) | BUSY);
|
||||
dcc_data >>= 8;
|
||||
}
|
||||
}
|
||||
|
||||
#elif defined(__ARM_ARCH_4T__) || defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5T__)
|
||||
|
||||
void dbg_write(unsigned long dcc_data)
|
||||
{
|
||||
unsigned long dcc_status;
|
||||
|
||||
do {
|
||||
asm volatile("mrc p14, 0, %0, c0, c0" : "=r" (dcc_status));
|
||||
} while (dcc_status & 0x2);
|
||||
|
||||
asm volatile("mcr p14, 0, %0, c1, c0" : : "r" (dcc_data));
|
||||
}
|
||||
|
||||
#else
|
||||
#error unsupported target
|
||||
#endif
|
||||
|
||||
void dbg_trace_point(unsigned long number)
|
||||
{
|
||||
dbg_write(TARGET_REQ_TRACEMSG | (number << 8));
|
||||
}
|
||||
|
||||
void dbg_write_u32(const unsigned long *val, long len)
|
||||
{
|
||||
dbg_write(TARGET_REQ_DEBUGMSG_HEXMSG(4) | ((len & 0xffff) << 16));
|
||||
|
||||
while (len > 0)
|
||||
{
|
||||
dbg_write(*val);
|
||||
|
||||
val++;
|
||||
len--;
|
||||
}
|
||||
}
|
||||
|
||||
void dbg_write_u16(const unsigned short *val, long len)
|
||||
{
|
||||
unsigned long dcc_data;
|
||||
|
||||
dbg_write(TARGET_REQ_DEBUGMSG_HEXMSG(2) | ((len & 0xffff) << 16));
|
||||
|
||||
while (len > 0)
|
||||
{
|
||||
dcc_data = val[0]
|
||||
| ((len > 1) ? val[1] << 16: 0x0000);
|
||||
|
||||
dbg_write(dcc_data);
|
||||
|
||||
val += 2;
|
||||
len -= 2;
|
||||
}
|
||||
}
|
||||
|
||||
void dbg_write_u8(const unsigned char *val, long len)
|
||||
{
|
||||
unsigned long dcc_data;
|
||||
|
||||
dbg_write(TARGET_REQ_DEBUGMSG_HEXMSG(1) | ((len & 0xffff) << 16));
|
||||
|
||||
while (len > 0)
|
||||
{
|
||||
dcc_data = val[0]
|
||||
| ((len > 1) ? val[1] << 8 : 0x00)
|
||||
| ((len > 2) ? val[2] << 16 : 0x00)
|
||||
| ((len > 3) ? val[3] << 24 : 0x00);
|
||||
|
||||
dbg_write(dcc_data);
|
||||
|
||||
val += 4;
|
||||
len -= 4;
|
||||
}
|
||||
}
|
||||
|
||||
void dbg_write_str(const char *msg)
|
||||
{
|
||||
long len;
|
||||
unsigned long dcc_data;
|
||||
|
||||
for (len = 0; msg[len] && (len < 65536); len++);
|
||||
|
||||
dbg_write(TARGET_REQ_DEBUGMSG_ASCII | ((len & 0xffff) << 16));
|
||||
|
||||
while (len > 0)
|
||||
{
|
||||
dcc_data = msg[0]
|
||||
| ((len > 1) ? msg[1] << 8 : 0x00)
|
||||
| ((len > 2) ? msg[2] << 16 : 0x00)
|
||||
| ((len > 3) ? msg[3] << 24 : 0x00);
|
||||
dbg_write(dcc_data);
|
||||
|
||||
msg += 4;
|
||||
len -= 4;
|
||||
}
|
||||
}
|
||||
|
||||
void dbg_write_char(char msg)
|
||||
{
|
||||
dbg_write(TARGET_REQ_DEBUGCHAR | ((msg & 0xff) << 16));
|
||||
}
|
||||
35
debuggers/openocd/contrib/libdcc/dcc_stdio.h
Normal file
35
debuggers/openocd/contrib/libdcc/dcc_stdio.h
Normal file
@ -0,0 +1,35 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2008 by Dominic Rath *
|
||||
* Dominic.Rath@gmx.de *
|
||||
* Copyright (C) 2008 by Spencer Oliver *
|
||||
* spen@spen-soft.co.uk *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef DCC_STDIO_H
|
||||
#define DCC_STDIO_H
|
||||
|
||||
void dbg_trace_point(unsigned long number);
|
||||
|
||||
void dbg_write_u32(const unsigned long *val, long len);
|
||||
void dbg_write_u16(const unsigned short *val, long len);
|
||||
void dbg_write_u8(const unsigned char *val, long len);
|
||||
|
||||
void dbg_write_str(const char *msg);
|
||||
void dbg_write_char(char msg);
|
||||
|
||||
#endif /* DCC_STDIO_H */
|
||||
58
debuggers/openocd/contrib/libdcc/example.c
Normal file
58
debuggers/openocd/contrib/libdcc/example.c
Normal file
@ -0,0 +1,58 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2008 by Spencer Oliver *
|
||||
* spen@spen-soft.co.uk *
|
||||
* Copyright (C) 2008 by Frederik Kriewtz *
|
||||
* frederik@kriewitz.eu *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
#include "dcc_stdio.h"
|
||||
|
||||
/* enable openocd debugmsg at the gdb prompt:
|
||||
* monitor target_request debugmsgs enable
|
||||
*
|
||||
* create a trace point:
|
||||
* monitor trace point 1
|
||||
*
|
||||
* to show how often the trace point was hit:
|
||||
* monitor trace point
|
||||
*/
|
||||
|
||||
int main(void)
|
||||
{
|
||||
dbg_write_str("hello world");
|
||||
|
||||
dbg_write_char('t');
|
||||
dbg_write_char('e');
|
||||
dbg_write_char('s');
|
||||
dbg_write_char('t');
|
||||
dbg_write_char('\n');
|
||||
|
||||
unsigned long test_u32 = 0x01234567;
|
||||
dbg_write_u32(&test_u32, 1);
|
||||
|
||||
static const unsigned short test_u16[] = {0x0123, 0x4567, 0x89AB, 0xCDEF, 0x0123, 0x4567, 0x89AB, 0xCDEF};
|
||||
dbg_write_u16(test_u16, 8);
|
||||
|
||||
static const unsigned char test_u8[] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0XDD, 0xEE, 0xFF};
|
||||
dbg_write_u8(test_u8, 16);
|
||||
|
||||
while(1)
|
||||
{
|
||||
dbg_trace_point(0);
|
||||
}
|
||||
}
|
||||
33
debuggers/openocd/contrib/loaders/README
Normal file
33
debuggers/openocd/contrib/loaders/README
Normal file
@ -0,0 +1,33 @@
|
||||
Included in these directories are the src to the various ram loaders used
|
||||
within openocd.
|
||||
|
||||
** target checksum loaders **
|
||||
|
||||
checksum/armv4_5_crc.s :
|
||||
- ARMv4 and ARMv5 checksum loader : see target/arm_crc_code.c:arm_crc_code
|
||||
|
||||
checksum/armv7m_crc.s :
|
||||
- ARMv7m checksum loader : see target/armv7m.c:cortex_m3_crc_code
|
||||
|
||||
checksum/mips32.s :
|
||||
- MIPS32 checksum loader : see target/mips32.c:mips_crc_code
|
||||
|
||||
** target flash loaders **
|
||||
|
||||
flash/pic32mx.s :
|
||||
- Microchip PIC32 flash loader : see flash/nor/pic32mx.c:pic32mx_flash_write_code
|
||||
|
||||
flash/stellaris.s :
|
||||
- TI Stellaris flash loader : see flash/nor/stellaris.c:stellaris_write_code
|
||||
|
||||
flash/stm32x.s :
|
||||
- ST STM32 flash loader : see flash/nor/stm32x.c:stm32x_flash_write_code
|
||||
|
||||
flash/str7x.s :
|
||||
- ST STR7 flash loader : see flash/nor/str7x.c:str7x_flash_write_code
|
||||
|
||||
flash/str9x.s :
|
||||
- ST STR9 flash loader : see flash/nor/str9x.c:str9x_flash_write_code
|
||||
|
||||
Spencer Oliver
|
||||
spen@spen-soft.co.uk
|
||||
58
debuggers/openocd/contrib/loaders/checksum/armv4_5_crc.s
Normal file
58
debuggers/openocd/contrib/loaders/checksum/armv4_5_crc.s
Normal file
@ -0,0 +1,58 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2010 by Spencer Oliver *
|
||||
* spen@spen-soft.co.uk *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
/*
|
||||
r0 - address in - crc out
|
||||
r1 - char count
|
||||
*/
|
||||
|
||||
.text
|
||||
.arm
|
||||
|
||||
_start:
|
||||
main:
|
||||
mov r2, r0
|
||||
mov r0, #0xffffffff /* crc */
|
||||
mov r3, r1
|
||||
mov r4, #0
|
||||
b ncomp
|
||||
nbyte:
|
||||
ldrb r1, [r2, r4]
|
||||
ldr r7, CRC32XOR
|
||||
eor r0, r0, r1, asl #24
|
||||
mov r5, #0
|
||||
loop:
|
||||
cmp r0, #0
|
||||
mov r6, r0, asl #1
|
||||
add r5, r5, #1
|
||||
mov r0, r6
|
||||
eorlt r0, r6, r7
|
||||
cmp r5, #8
|
||||
bne loop
|
||||
add r4, r4, #1
|
||||
ncomp:
|
||||
cmp r4, r3
|
||||
bne nbyte
|
||||
end:
|
||||
bkpt #0
|
||||
|
||||
CRC32XOR: .word 0x04c11db7
|
||||
|
||||
.end
|
||||
71
debuggers/openocd/contrib/loaders/checksum/armv7m_crc.s
Normal file
71
debuggers/openocd/contrib/loaders/checksum/armv7m_crc.s
Normal file
@ -0,0 +1,71 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2010 by Spencer Oliver *
|
||||
* spen@spen-soft.co.uk *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
/*
|
||||
parameters:
|
||||
r0 - address in - crc out
|
||||
r1 - char count
|
||||
*/
|
||||
|
||||
.text
|
||||
.syntax unified
|
||||
.cpu cortex-m0
|
||||
.thumb
|
||||
.thumb_func
|
||||
|
||||
.align 2
|
||||
|
||||
_start:
|
||||
main:
|
||||
mov r2, r0
|
||||
movs r0, #0
|
||||
mvns r0, r0
|
||||
ldr r6, CRC32XOR
|
||||
mov r3, r1
|
||||
movs r4, #0
|
||||
b ncomp
|
||||
nbyte:
|
||||
ldrb r1, [r2, r4]
|
||||
lsls r1, r1, #24
|
||||
eors r0, r0, r1
|
||||
movs r5, #0
|
||||
loop:
|
||||
cmp r0, #0
|
||||
bge notset
|
||||
lsls r0, r0, #1
|
||||
eors r0, r0, r6
|
||||
b cont
|
||||
notset:
|
||||
lsls r0, r0, #1
|
||||
cont:
|
||||
adds r5, r5, #1
|
||||
cmp r5, #8
|
||||
bne loop
|
||||
adds r4, r4, #1
|
||||
ncomp:
|
||||
cmp r4, r3
|
||||
bne nbyte
|
||||
bkpt #0
|
||||
|
||||
.align 2
|
||||
|
||||
CRC32XOR: .word 0x04c11db7
|
||||
|
||||
.end
|
||||
72
debuggers/openocd/contrib/loaders/checksum/mips32.s
Normal file
72
debuggers/openocd/contrib/loaders/checksum/mips32.s
Normal file
@ -0,0 +1,72 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2010 by Spencer Oliver *
|
||||
* spen@spen-soft.co.uk *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
.global main
|
||||
.text
|
||||
.set noreorder
|
||||
|
||||
/* params:
|
||||
* $a0 address in
|
||||
* $a1 byte count
|
||||
* vars
|
||||
* $a0 crc
|
||||
* $a1 crc data byte
|
||||
* temps:
|
||||
* t3 v0 a3 a2 t0 v1
|
||||
*/
|
||||
|
||||
.ent main
|
||||
main:
|
||||
addiu $t4, $a0, 0 /* address in */
|
||||
addiu $t2, $a1, 0 /* count */
|
||||
|
||||
addiu $a0, $zero, 0xffffffff /* a0 crc - result */
|
||||
|
||||
beq $zero, $zero, ncomp
|
||||
addiu $t3, $zero, 0 /* clear bytes read */
|
||||
|
||||
nbyte:
|
||||
lb $a1, ($t4) /* load byte from source address */
|
||||
addi $t4, $t4, 1 /* inc byte count */
|
||||
|
||||
crc:
|
||||
sll $a1, $a1, 24
|
||||
lui $v0, 0x04c1
|
||||
xor $a0, $a0, $a1
|
||||
ori $a3, $v0, 0x1db7
|
||||
addu $a2, $zero, $zero /* clear bit count */
|
||||
loop:
|
||||
sll $t0, $a0, 1
|
||||
addiu $a2, $a2, 1 /* inc bit count */
|
||||
slti $a0, $a0, 0
|
||||
xor $t1, $t0, $a3
|
||||
movn $t0, $t1, $a0
|
||||
slti $v1, $a2, 8 /* 8bits processed */
|
||||
bne $v1, $zero, loop
|
||||
addu $a0, $t0, $zero
|
||||
|
||||
ncomp:
|
||||
bne $t2, $t3, nbyte /* all bytes processed */
|
||||
addiu $t3, $t3, 1
|
||||
|
||||
wait:
|
||||
sdbbp
|
||||
|
||||
.end main
|
||||
@ -0,0 +1,41 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2010 by Spencer Oliver *
|
||||
* spen@spen-soft.co.uk *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
/*
|
||||
parameters:
|
||||
r0 - address in
|
||||
r1 - byte count
|
||||
r2 - mask - result out
|
||||
*/
|
||||
|
||||
.text
|
||||
.arm
|
||||
|
||||
loop:
|
||||
ldrb r3, [r0], #1
|
||||
and r2, r2, r3
|
||||
subs r1, r1, #1
|
||||
bne loop
|
||||
end:
|
||||
bkpt #0
|
||||
|
||||
CRC32XOR: .word 0x04c11db7
|
||||
|
||||
.end
|
||||
@ -0,0 +1,45 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2010 by Spencer Oliver *
|
||||
* spen@spen-soft.co.uk *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
/*
|
||||
parameters:
|
||||
r0 - address in
|
||||
r1 - byte count
|
||||
r2 - mask - result out
|
||||
*/
|
||||
|
||||
.text
|
||||
.syntax unified
|
||||
.cpu cortex-m0
|
||||
.thumb
|
||||
.thumb_func
|
||||
|
||||
.align 2
|
||||
|
||||
loop:
|
||||
ldrb r3, [r0]
|
||||
adds r0, #1
|
||||
ands r2, r2, r3
|
||||
subs r1, r1, #1
|
||||
bne loop
|
||||
end:
|
||||
bkpt #0
|
||||
|
||||
.end
|
||||
@ -0,0 +1,57 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2005, 2007 by Dominic Rath *
|
||||
* Dominic.Rath@gmx.de *
|
||||
* Copyright (C) 2010 Spencer Oliver *
|
||||
* spen@spen-soft.co.uk *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
.text
|
||||
.arm
|
||||
.arch armv4
|
||||
|
||||
.section .init
|
||||
|
||||
/* algorithm register usage:
|
||||
* r0: source address (in RAM)
|
||||
* r1: target address (in Flash)
|
||||
* r2: count
|
||||
* r3: flash write command
|
||||
* r4: status byte (returned to host)
|
||||
* r5: busy test pattern
|
||||
* r6: error test pattern
|
||||
*/
|
||||
|
||||
loop:
|
||||
ldrh r4, [r0], #2
|
||||
strh r3, [r1]
|
||||
strh r4, [r1]
|
||||
busy:
|
||||
ldrh r4, [r1]
|
||||
and r7, r4, r5
|
||||
cmp r7, r5
|
||||
bne busy
|
||||
tst r4, r6
|
||||
bne done
|
||||
subs r2, r2, #1
|
||||
beq done
|
||||
add r1, r1, #2
|
||||
b loop
|
||||
done:
|
||||
b done
|
||||
|
||||
.end
|
||||
@ -0,0 +1,57 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2005, 2007 by Dominic Rath *
|
||||
* Dominic.Rath@gmx.de *
|
||||
* Copyright (C) 2010 Spencer Oliver *
|
||||
* spen@spen-soft.co.uk *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
.text
|
||||
.arm
|
||||
.arch armv4
|
||||
|
||||
.section .init
|
||||
|
||||
/* algorithm register usage:
|
||||
* r0: source address (in RAM)
|
||||
* r1: target address (in Flash)
|
||||
* r2: count
|
||||
* r3: flash write command
|
||||
* r4: status byte (returned to host)
|
||||
* r5: busy test pattern
|
||||
* r6: error test pattern
|
||||
*/
|
||||
|
||||
loop:
|
||||
ldr r4, [r0], #4
|
||||
str r3, [r1]
|
||||
str r4, [r1]
|
||||
busy:
|
||||
ldr r4, [r1]
|
||||
and r7, r4, r5
|
||||
cmp r7, r5
|
||||
bne busy
|
||||
tst r4, r6
|
||||
bne done
|
||||
subs r2, r2, #1
|
||||
beq done
|
||||
add r1, r1, #4
|
||||
b loop
|
||||
done:
|
||||
b done
|
||||
|
||||
.end
|
||||
@ -0,0 +1,57 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2005, 2007 by Dominic Rath *
|
||||
* Dominic.Rath@gmx.de *
|
||||
* Copyright (C) 2010 Spencer Oliver *
|
||||
* spen@spen-soft.co.uk *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
.text
|
||||
.arm
|
||||
.arch armv4
|
||||
|
||||
.section .init
|
||||
|
||||
/* algorithm register usage:
|
||||
* r0: source address (in RAM)
|
||||
* r1: target address (in Flash)
|
||||
* r2: count
|
||||
* r3: flash write command
|
||||
* r4: status byte (returned to host)
|
||||
* r5: busy test pattern
|
||||
* r6: error test pattern
|
||||
*/
|
||||
|
||||
loop:
|
||||
ldrb r4, [r0], #1
|
||||
strb r3, [r1]
|
||||
strb r4, [r1]
|
||||
busy:
|
||||
ldrb r4, [r1]
|
||||
and r7, r4, r5
|
||||
cmp r7, r5
|
||||
bne busy
|
||||
tst r4, r6
|
||||
bne done
|
||||
subs r2, r2, #1
|
||||
beq done
|
||||
add r1, r1, #1
|
||||
b loop
|
||||
done:
|
||||
b done
|
||||
|
||||
.end
|
||||
@ -0,0 +1,75 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2005, 2007 by Dominic Rath *
|
||||
* Dominic.Rath@gmx.de *
|
||||
* Copyright (C) 2010 Spencer Oliver *
|
||||
* spen@spen-soft.co.uk *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
.text
|
||||
.arm
|
||||
.arch armv4
|
||||
|
||||
.section .init
|
||||
|
||||
/* input parameters - */
|
||||
/* R0 = source address */
|
||||
/* R1 = destination address */
|
||||
/* R2 = number of writes */
|
||||
/* R3 = flash write command */
|
||||
/* R4 = constant to mask DQ7 bits (also used for Dq5 with shift) */
|
||||
/* output parameters - */
|
||||
/* R5 = 0x80 ok 0x00 bad */
|
||||
/* temp registers - */
|
||||
/* R6 = value read from flash to test status */
|
||||
/* R7 = holding register */
|
||||
/* unlock registers - */
|
||||
/* R8 = unlock1_addr */
|
||||
/* R9 = unlock1_cmd */
|
||||
/* R10 = unlock2_addr */
|
||||
/* R11 = unlock2_cmd */
|
||||
|
||||
code:
|
||||
ldrh r5, [r0], #2
|
||||
strh r9, [r8]
|
||||
strh r11, [r10]
|
||||
strh r3, [r8]
|
||||
strh r5, [r1]
|
||||
nop
|
||||
busy:
|
||||
ldrh r6, [r1]
|
||||
eor r7, r5, r6
|
||||
ands r7, r4, r7
|
||||
beq cont /* b if DQ7 == Data7 */
|
||||
ands r6, r6, r4, lsr #2
|
||||
beq busy /* b if DQ5 low */
|
||||
ldrh r6, [r1]
|
||||
eor r7, r5, r6
|
||||
ands r7, r4, r7
|
||||
beq cont /* b if DQ7 == Data7 */
|
||||
mov r5, #0 /* 0x0 - return 0x00, error */
|
||||
bne done
|
||||
cont:
|
||||
subs r2, r2, #1 /* 0x1 */
|
||||
moveq r5, #128 /* 0x80 */
|
||||
beq done
|
||||
add r1, r1, #2 /* 0x2 */
|
||||
b code
|
||||
done:
|
||||
b done
|
||||
|
||||
.end
|
||||
@ -0,0 +1,66 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2005, 2007 by Dominic Rath *
|
||||
* Dominic.Rath@gmx.de *
|
||||
* Copyright (C) 2010 Spencer Oliver *
|
||||
* spen@spen-soft.co.uk *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
.text
|
||||
.arm
|
||||
.arch armv4
|
||||
|
||||
.section .init
|
||||
|
||||
/* input parameters - */
|
||||
/* R0 = source address */
|
||||
/* R1 = destination address */
|
||||
/* R2 = number of writes */
|
||||
/* R3 = flash write command */
|
||||
/* R4 = constant to mask DQ7 bits (also used for Dq5 with shift) */
|
||||
/* output parameters - */
|
||||
/* R5 = 0x80 ok 0x00 bad */
|
||||
/* temp registers - */
|
||||
/* R6 = value read from flash to test status */
|
||||
/* R7 = holding register */
|
||||
/* unlock registers - */
|
||||
/* R8 = unlock1_addr */
|
||||
/* R9 = unlock1_cmd */
|
||||
/* R10 = unlock2_addr */
|
||||
/* R11 = unlock2_cmd */
|
||||
|
||||
code:
|
||||
ldrh r5, [r0], #2
|
||||
strh r9, [r8]
|
||||
strh r11, [r10]
|
||||
strh r3, [r8]
|
||||
strh r5, [r1]
|
||||
nop
|
||||
busy:
|
||||
ldrh r6, [r1]
|
||||
eor r7, r5, r6
|
||||
ands r7, #0x80
|
||||
bne busy
|
||||
subs r2, r2, #1 /* 0x1 */
|
||||
moveq r5, #128 /* 0x80 */
|
||||
beq done
|
||||
add r1, r1, #2 /* 0x2 */
|
||||
b code
|
||||
done:
|
||||
b done
|
||||
|
||||
.end
|
||||
@ -0,0 +1,75 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2005, 2007 by Dominic Rath *
|
||||
* Dominic.Rath@gmx.de *
|
||||
* Copyright (C) 2010 Spencer Oliver *
|
||||
* spen@spen-soft.co.uk *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
.text
|
||||
.arm
|
||||
.arch armv4
|
||||
|
||||
.section .init
|
||||
|
||||
/* input parameters - */
|
||||
/* R0 = source address */
|
||||
/* R1 = destination address */
|
||||
/* R2 = number of writes */
|
||||
/* R3 = flash write command */
|
||||
/* R4 = constant to mask DQ7 bits (also used for Dq5 with shift) */
|
||||
/* output parameters - */
|
||||
/* R5 = 0x80 ok 0x00 bad */
|
||||
/* temp registers - */
|
||||
/* R6 = value read from flash to test status */
|
||||
/* R7 = holding register */
|
||||
/* unlock registers - */
|
||||
/* R8 = unlock1_addr */
|
||||
/* R9 = unlock1_cmd */
|
||||
/* R10 = unlock2_addr */
|
||||
/* R11 = unlock2_cmd */
|
||||
|
||||
code:
|
||||
ldr r5, [r0], #4
|
||||
str r9, [r8]
|
||||
str r11, [r10]
|
||||
str r3, [r8]
|
||||
str r5, [r1]
|
||||
nop
|
||||
busy:
|
||||
ldr r6, [r1]
|
||||
eor r7, r5, r6
|
||||
ands r7, r4, r7
|
||||
beq cont /* b if DQ7 == Data7 */
|
||||
ands r6, r6, r4, lsr #2
|
||||
beq busy /* b if DQ5 low */
|
||||
ldr r6, [r1]
|
||||
eor r7, r5, r6
|
||||
ands r7, r4, r7
|
||||
beq cont /* b if DQ7 == Data7 */
|
||||
mov r5, #0 /* 0x0 - return 0x00, error */
|
||||
bne done
|
||||
cont:
|
||||
subs r2, r2, #1 /* 0x1 */
|
||||
moveq r5, #128 /* 0x80 */
|
||||
beq done
|
||||
add r1, r1, #4 /* 0x4 */
|
||||
b code
|
||||
done:
|
||||
b done
|
||||
|
||||
.end
|
||||
75
debuggers/openocd/contrib/loaders/flash/armv4_5_cfi_span_8.s
Normal file
75
debuggers/openocd/contrib/loaders/flash/armv4_5_cfi_span_8.s
Normal file
@ -0,0 +1,75 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2005, 2007 by Dominic Rath *
|
||||
* Dominic.Rath@gmx.de *
|
||||
* Copyright (C) 2010 Spencer Oliver *
|
||||
* spen@spen-soft.co.uk *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
.text
|
||||
.arm
|
||||
.arch armv4
|
||||
|
||||
.section .init
|
||||
|
||||
/* input parameters - */
|
||||
/* R0 = source address */
|
||||
/* R1 = destination address */
|
||||
/* R2 = number of writes */
|
||||
/* R3 = flash write command */
|
||||
/* R4 = constant to mask DQ7 bits (also used for Dq5 with shift) */
|
||||
/* output parameters - */
|
||||
/* R5 = 0x80 ok 0x00 bad */
|
||||
/* temp registers - */
|
||||
/* R6 = value read from flash to test status */
|
||||
/* R7 = holding register */
|
||||
/* unlock registers - */
|
||||
/* R8 = unlock1_addr */
|
||||
/* R9 = unlock1_cmd */
|
||||
/* R10 = unlock2_addr */
|
||||
/* R11 = unlock2_cmd */
|
||||
|
||||
code:
|
||||
ldrb r5, [r0], #1
|
||||
strb r9, [r8]
|
||||
strb r11, [r10]
|
||||
strb r3, [r8]
|
||||
strb r5, [r1]
|
||||
nop
|
||||
busy:
|
||||
ldrb r6, [r1]
|
||||
eor r7, r5, r6
|
||||
ands r7, r4, r7
|
||||
beq cont /* b if DQ7 == Data7 */
|
||||
ands r6, r6, r4, lsr #2
|
||||
beq busy /* b if DQ5 low */
|
||||
ldrb r6, [r1]
|
||||
eor r7, r5, r6
|
||||
ands r7, r4, r7
|
||||
beq cont /* b if DQ7 == Data7 */
|
||||
mov r5, #0 /* 0x0 - return 0x00, error */
|
||||
bne done
|
||||
cont:
|
||||
subs r2, r2, #1 /* 0x1 */
|
||||
moveq r5, #128 /* 0x80 */
|
||||
beq done
|
||||
add r1, r1, #1 /* 0x1 */
|
||||
b code
|
||||
done:
|
||||
b done
|
||||
|
||||
.end
|
||||
81
debuggers/openocd/contrib/loaders/flash/armv7m_cfi_span_16.s
Normal file
81
debuggers/openocd/contrib/loaders/flash/armv7m_cfi_span_16.s
Normal file
@ -0,0 +1,81 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2005, 2007 by Dominic Rath *
|
||||
* Dominic.Rath@gmx.de *
|
||||
* Copyright (C) 2010 Spencer Oliver *
|
||||
* spen@spen-soft.co.uk *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
.text
|
||||
.syntax unified
|
||||
.arch armv7-m
|
||||
.thumb
|
||||
.thumb_func
|
||||
|
||||
.align 2
|
||||
|
||||
/* input parameters - */
|
||||
/* R0 = source address */
|
||||
/* R1 = destination address */
|
||||
/* R2 = number of writes */
|
||||
/* R3 = flash write command */
|
||||
/* R4 = constant to mask DQ7 bits (also used for Dq5 with shift) */
|
||||
/* output parameters - */
|
||||
/* R5 = 0x80 ok 0x00 bad */
|
||||
/* temp registers - */
|
||||
/* R6 = value read from flash to test status */
|
||||
/* R7 = holding register */
|
||||
/* unlock registers - */
|
||||
/* R8 = unlock1_addr */
|
||||
/* R9 = unlock1_cmd */
|
||||
/* R10 = unlock2_addr */
|
||||
/* R11 = unlock2_cmd */
|
||||
|
||||
code:
|
||||
ldrh r5, [r0], #2
|
||||
strh r9, [r8]
|
||||
strh r11, [r10]
|
||||
strh r3, [r8]
|
||||
strh r5, [r1]
|
||||
nop
|
||||
busy:
|
||||
ldrh r6, [r1]
|
||||
eor r7, r5, r6
|
||||
ands r7, r4, r7
|
||||
beq cont /* b if DQ7 == Data7 */
|
||||
ands r6, r6, r4, lsr #2
|
||||
beq busy /* b if DQ5 low */
|
||||
ldrh r6, [r1]
|
||||
eor r7, r5, r6
|
||||
ands r7, r4, r7
|
||||
beq cont /* b if DQ7 == Data7 */
|
||||
mov r5, #0 /* 0x0 - return 0x00, error */
|
||||
bne done
|
||||
cont:
|
||||
subs r2, r2, #1 /* 0x1 */
|
||||
beq success
|
||||
add r1, r1, #2 /* 0x2 */
|
||||
b code
|
||||
|
||||
success:
|
||||
mov r5, #128 /* 0x80 */
|
||||
b done
|
||||
|
||||
done:
|
||||
bkpt #0
|
||||
|
||||
.end
|
||||
60
debuggers/openocd/contrib/loaders/flash/armv7m_io.s
Normal file
60
debuggers/openocd/contrib/loaders/flash/armv7m_io.s
Normal file
@ -0,0 +1,60 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2013 by Henrik Nilsson *
|
||||
* henrik.nilsson@bytequest.se *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
.text
|
||||
.syntax unified
|
||||
.arch armv7-m
|
||||
.thumb
|
||||
.thumb_func
|
||||
|
||||
.align 4
|
||||
|
||||
/* Inputs:
|
||||
* r0 buffer address
|
||||
* r1 NAND data address (byte wide)
|
||||
* r2 buffer length
|
||||
*/
|
||||
read:
|
||||
ldrb r3, [r1]
|
||||
strb r3, [r0], #1
|
||||
subs r2, r2, #1
|
||||
bne read
|
||||
|
||||
done_read:
|
||||
bkpt #0
|
||||
|
||||
.align 4
|
||||
|
||||
/* Inputs:
|
||||
* r0 NAND data address (byte wide)
|
||||
* r1 buffer address
|
||||
* r2 buffer length
|
||||
*/
|
||||
write:
|
||||
ldrb r3, [r1], #1
|
||||
strb r3, [r0]
|
||||
subs r2, r2, #1
|
||||
bne write
|
||||
|
||||
done_write:
|
||||
bkpt #0
|
||||
|
||||
.end
|
||||
|
||||
114
debuggers/openocd/contrib/loaders/flash/efm32.S
Normal file
114
debuggers/openocd/contrib/loaders/flash/efm32.S
Normal file
@ -0,0 +1,114 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2011 by Andreas Fritiofson *
|
||||
* andreas.fritiofson@gmail.com *
|
||||
* Copyright (C) 2013 by Roman Dmitrienko *
|
||||
* me@iamroman.org *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
.text
|
||||
.syntax unified
|
||||
.cpu cortex-m0
|
||||
.thumb
|
||||
.thumb_func
|
||||
|
||||
/* Params:
|
||||
* r0 - flash base (in), status (out)
|
||||
* r1 - count (word-32bit)
|
||||
* r2 - workarea start
|
||||
* r3 - workarea end
|
||||
* r4 - target address
|
||||
* Clobbered:
|
||||
* r5 - rp
|
||||
* r6 - wp, tmp
|
||||
* r7 - tmp
|
||||
*/
|
||||
|
||||
/* offsets of registers from flash reg base */
|
||||
#define EFM32_MSC_WRITECTRL_OFFSET 0x008
|
||||
#define EFM32_MSC_WRITECMD_OFFSET 0x00c
|
||||
#define EFM32_MSC_ADDRB_OFFSET 0x010
|
||||
#define EFM32_MSC_WDATA_OFFSET 0x018
|
||||
#define EFM32_MSC_STATUS_OFFSET 0x01c
|
||||
#define EFM32_MSC_LOCK_OFFSET 0x03c
|
||||
|
||||
/* unlock MSC */
|
||||
ldr r6, =#0x1b71
|
||||
str r6, [r0, #EFM32_MSC_LOCK_OFFSET]
|
||||
/* set WREN to 1 */
|
||||
movs r6, #1
|
||||
str r6, [r0, #EFM32_MSC_WRITECTRL_OFFSET]
|
||||
|
||||
wait_fifo:
|
||||
ldr r6, [r2, #0] /* read wp */
|
||||
cmp r6, #0 /* abort if wp == 0 */
|
||||
beq exit
|
||||
ldr r5, [r2, #4] /* read rp */
|
||||
cmp r5, r6 /* wait until rp != wp */
|
||||
beq wait_fifo
|
||||
|
||||
/* store address in MSC_ADDRB */
|
||||
str r4, [r0, #EFM32_MSC_ADDRB_OFFSET]
|
||||
/* set LADDRIM bit */
|
||||
movs r6, #1
|
||||
str r6, [r0, #EFM32_MSC_WRITECMD_OFFSET]
|
||||
/* check status for INVADDR and/or LOCKED */
|
||||
ldr r6, [r0, #EFM32_MSC_STATUS_OFFSET]
|
||||
movs r7, #6
|
||||
tst r6, r7
|
||||
bne error
|
||||
|
||||
/* wait for WDATAREADY */
|
||||
wait_wdataready:
|
||||
ldr r6, [r0, #EFM32_MSC_STATUS_OFFSET]
|
||||
movs r7, #8
|
||||
tst r6, r7
|
||||
beq wait_wdataready
|
||||
|
||||
/* load data to WDATA */
|
||||
ldr r6, [r5]
|
||||
str r6, [r0, #EFM32_MSC_WDATA_OFFSET]
|
||||
/* set WRITEONCE bit */
|
||||
movs r6, #8
|
||||
str r6, [r0, #EFM32_MSC_WRITECMD_OFFSET]
|
||||
|
||||
adds r5, #4 /* rp++ */
|
||||
adds r4, #4 /* target_address++ */
|
||||
|
||||
/* wait until BUSY flag is reset */
|
||||
busy:
|
||||
ldr r6, [r0, #EFM32_MSC_STATUS_OFFSET]
|
||||
movs r7, #1
|
||||
tst r6, r7
|
||||
bne busy
|
||||
|
||||
cmp r5, r3 /* wrap rp at end of buffer */
|
||||
bcc no_wrap
|
||||
mov r5, r2
|
||||
adds r5, #8
|
||||
no_wrap:
|
||||
str r5, [r2, #4] /* store rp */
|
||||
subs r1, r1, #1 /* decrement word count */
|
||||
cmp r1, #0
|
||||
beq exit /* loop if not done */
|
||||
b wait_fifo
|
||||
error:
|
||||
movs r0, #0
|
||||
str r0, [r2, #4] /* set rp = 0 on error */
|
||||
exit:
|
||||
mov r0, r6 /* return status in r0 */
|
||||
bkpt #0
|
||||
176
debuggers/openocd/contrib/loaders/flash/lpcspifi_erase.S
Normal file
176
debuggers/openocd/contrib/loaders/flash/lpcspifi_erase.S
Normal file
@ -0,0 +1,176 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2012 by George Harris *
|
||||
* george@luminairecoffee.com *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
.text
|
||||
.syntax unified
|
||||
.cpu cortex-m3
|
||||
.thumb
|
||||
.thumb_func
|
||||
|
||||
/*
|
||||
* Params :
|
||||
* r0 = start address, status (out)
|
||||
* r1 = count
|
||||
* r2 = erase command
|
||||
* r3 = block size
|
||||
*/
|
||||
|
||||
#define SSP_BASE_HIGH 0x4008
|
||||
#define SSP_BASE_LOW 0x3000
|
||||
#define SSP_CR0_OFFSET 0x00
|
||||
#define SSP_CR1_OFFSET 0x04
|
||||
#define SSP_DATA_OFFSET 0x08
|
||||
#define SSP_CPSR_OFFSET 0x10
|
||||
#define SSP_SR_OFFSET 0x0c
|
||||
|
||||
#define SSP_CLOCK_BASE_HIGH 0x4005
|
||||
#define SSP_CLOCK_BASE_LOW 0x0000
|
||||
#define SSP_BRANCH_CLOCK_BASE_HIGH 0x4005
|
||||
#define SSP_BRANCH_CLOCK_BASE_LOW 0x2000
|
||||
#define SSP_BASE_CLOCK_OFFSET 0x94
|
||||
#define SSP_BRANCH_CLOCK_OFFSET 0x700
|
||||
|
||||
#define IOCONFIG_BASE_HIGH 0x4008
|
||||
#define IOCONFIG_BASE_LOW 0x6000
|
||||
#define IOCONFIG_SCK_OFFSET 0x18c
|
||||
#define IOCONFIG_HOLD_OFFSET 0x190
|
||||
#define IOCONFIG_WP_OFFSET 0x194
|
||||
#define IOCONFIG_MISO_OFFSET 0x198
|
||||
#define IOCONFIG_MOSI_OFFSET 0x19c
|
||||
#define IOCONFIG_CS_OFFSET 0x1a0
|
||||
|
||||
#define IO_BASE_HIGH 0x400f
|
||||
#define IO_BASE_LOW 0x4000
|
||||
#define IO_CS_OFFSET 0xab
|
||||
#define IODIR_BASE_HIGH 0x400f
|
||||
#define IODIR_BASE_LOW 0x6000
|
||||
#define IO_CS_DIR_OFFSET 0x14
|
||||
|
||||
|
||||
setup: /* Initialize SSP pins and module */
|
||||
mov.w r10, #IOCONFIG_BASE_LOW
|
||||
movt r10, #IOCONFIG_BASE_HIGH
|
||||
mov.w r8, #0xea
|
||||
str.w r8, [r10, #IOCONFIG_SCK_OFFSET] /* Configure SCK pin function */
|
||||
mov.w r8, #0x40
|
||||
str.w r8, [r10, #IOCONFIG_HOLD_OFFSET] /* Configure /HOLD pin function */
|
||||
mov.w r8, #0x40
|
||||
str.w r8, [r10, #IOCONFIG_WP_OFFSET] /* Configure /WP pin function */
|
||||
mov.w r8, #0xed
|
||||
str.w r8, [r10, #IOCONFIG_MISO_OFFSET] /* Configure MISO pin function */
|
||||
mov.w r8, #0xed
|
||||
str.w r8, [r10, #IOCONFIG_MOSI_OFFSET] /* Configure MOSI pin function */
|
||||
mov.w r8, #0x44
|
||||
str.w r8, [r10, #IOCONFIG_CS_OFFSET] /* Configure CS pin function */
|
||||
|
||||
mov.w r10, #IODIR_BASE_LOW
|
||||
movt r10, #IODIR_BASE_HIGH
|
||||
mov.w r8, #0x800
|
||||
str r8, [r10, #IO_CS_DIR_OFFSET] /* Set CS as output */
|
||||
mov.w r10, #IO_BASE_LOW
|
||||
movt r10, #IO_BASE_HIGH
|
||||
mov.w r8, #0xff
|
||||
str.w r8, [r10, #IO_CS_OFFSET] /* Set CS high */
|
||||
|
||||
mov.w r10, #SSP_CLOCK_BASE_LOW
|
||||
movt r10, #SSP_CLOCK_BASE_HIGH
|
||||
mov.w r8, #0x0000
|
||||
movt r8, #0x0100
|
||||
str.w r8, [r10, #SSP_BASE_CLOCK_OFFSET] /* Configure SSP0 base clock (use 12 MHz IRC) */
|
||||
|
||||
mov.w r10, #SSP_BRANCH_CLOCK_BASE_LOW
|
||||
movt r10, #SSP_BRANCH_CLOCK_BASE_HIGH
|
||||
mov.w r8, #0x01
|
||||
str.w r8, [r10, #SSP_BRANCH_CLOCK_OFFSET] /* Configure (enable) SSP0 branch clock */
|
||||
|
||||
mov.w r10, #SSP_BASE_LOW
|
||||
movt r10, #SSP_BASE_HIGH
|
||||
mov.w r8, #0x07
|
||||
str.w r8, [r10, #SSP_CR0_OFFSET] /* Set clock postscale */
|
||||
mov.w r8, #0x02
|
||||
str.w r8, [r10, #SSP_CPSR_OFFSET] /* Set clock prescale */
|
||||
str.w r8, [r10, #SSP_CR1_OFFSET] /* Enable SSP in SPI mode */
|
||||
write_enable:
|
||||
bl cs_down
|
||||
mov.w r9, #0x06 /* Send the write enable command */
|
||||
bl write_data
|
||||
bl cs_up
|
||||
|
||||
bl cs_down
|
||||
mov.w r9, #0x05 /* Get status register */
|
||||
bl write_data
|
||||
mov.w r9, #0x00 /* Dummy data to clock in status */
|
||||
bl write_data
|
||||
bl cs_up
|
||||
|
||||
tst r9, #0x02 /* If the WE bit isn't set, we have a problem. */
|
||||
beq error
|
||||
erase:
|
||||
bl cs_down
|
||||
mov.w r9, r2 /* Send the erase command */
|
||||
bl write_data
|
||||
write_address:
|
||||
lsr r9, r0, #16 /* Send the current 24-bit write address, MSB first */
|
||||
bl write_data
|
||||
lsr r9, r0, #8
|
||||
bl write_data
|
||||
mov.w r9, r0
|
||||
bl write_data
|
||||
bl cs_up
|
||||
wait_flash_busy: /* Wait for the flash to finish the previous erase */
|
||||
bl cs_down
|
||||
mov.w r9, #0x05 /* Get status register */
|
||||
bl write_data
|
||||
mov.w r9, #0x00 /* Dummy data to clock in status */
|
||||
bl write_data
|
||||
bl cs_up
|
||||
tst r9, #0x01 /* If it isn't done, keep waiting */
|
||||
bne wait_flash_busy
|
||||
|
||||
subs r1, r1, #1 /* decrement count */
|
||||
cbz r1, exit /* Exit if we have written everything */
|
||||
add r0, r3 /* Move the address up by the block size */
|
||||
b write_enable /* Start a new block erase */
|
||||
write_data: /* Send/receive 1 byte of data over SSP */
|
||||
mov.w r10, #SSP_BASE_LOW
|
||||
movt r10, #SSP_BASE_HIGH
|
||||
str.w r9, [r10, #SSP_DATA_OFFSET] /* Write supplied data to the SSP data reg */
|
||||
wait_transmit:
|
||||
ldr r9, [r10, #SSP_SR_OFFSET] /* Check SSP status */
|
||||
tst r9, #0x0010 /* Check if BSY bit is set */
|
||||
bne wait_transmit /* If still transmitting, keep waiting */
|
||||
ldr r9, [r10, #SSP_DATA_OFFSET] /* Load received data */
|
||||
bx lr /* Exit subroutine */
|
||||
cs_up:
|
||||
mov.w r8, #0xff
|
||||
b cs_write
|
||||
cs_down:
|
||||
mov.w r8, #0x0000
|
||||
cs_write:
|
||||
mov.w r10, #IO_BASE_LOW
|
||||
movt r10, #IO_BASE_HIGH
|
||||
str.w r8, [r10, #IO_CS_OFFSET]
|
||||
bx lr
|
||||
error:
|
||||
movs r0, #0
|
||||
exit:
|
||||
bkpt #0x00
|
||||
|
||||
.end
|
||||
102
debuggers/openocd/contrib/loaders/flash/lpcspifi_init.S
Normal file
102
debuggers/openocd/contrib/loaders/flash/lpcspifi_init.S
Normal file
@ -0,0 +1,102 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2012 by George Harris *
|
||||
* george@luminairecoffee.com *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* This is an algorithm for the LPC43xx family (and probably the LPC18xx *
|
||||
* family as well, though they have not been tested) that will initialize *
|
||||
* memory-mapped SPI flash accesses. Unfortunately NXP has published *
|
||||
* neither the ROM source code that performs this initialization nor the *
|
||||
* register descriptions necessary to do so, so this code is necessary to *
|
||||
* call into the ROM SPIFI API. *
|
||||
***************************************************************************/
|
||||
|
||||
.text
|
||||
.syntax unified
|
||||
.arch armv7-m
|
||||
.thumb
|
||||
.thumb_func
|
||||
|
||||
.align 2
|
||||
|
||||
/*
|
||||
* Params :
|
||||
* r0 = spifi clock speed
|
||||
*/
|
||||
|
||||
#define IOCONFIG_BASE_HIGH 0x4008
|
||||
#define IOCONFIG_BASE_LOW 0x6000
|
||||
#define IOCONFIG_SCK_OFFSET 0x18c
|
||||
#define IOCONFIG_HOLD_OFFSET 0x190
|
||||
#define IOCONFIG_WP_OFFSET 0x194
|
||||
#define IOCONFIG_MISO_OFFSET 0x198
|
||||
#define IOCONFIG_MOSI_OFFSET 0x19c
|
||||
#define IOCONFIG_CS_OFFSET 0x1a0
|
||||
|
||||
#define SPIFI_ROM_TABLE_BASE_HIGH 0x1040
|
||||
#define SPIFI_ROM_TABLE_BASE_LOW 0x0118
|
||||
|
||||
code:
|
||||
mov.w r8, r0
|
||||
sub sp, #0x84
|
||||
add r7, sp, #0x0
|
||||
/* Initialize SPIFI pins */
|
||||
mov.w r3, #IOCONFIG_BASE_LOW
|
||||
movt r3, #IOCONFIG_BASE_HIGH
|
||||
mov.w r2, #0xf3
|
||||
str.w r2, [r3, #IOCONFIG_SCK_OFFSET]
|
||||
mov.w r3, #IOCONFIG_BASE_LOW
|
||||
movt r3, #IOCONFIG_BASE_HIGH
|
||||
mov.w r2, #IOCONFIG_BASE_LOW
|
||||
movt r2, #IOCONFIG_BASE_HIGH
|
||||
mov.w r1, #IOCONFIG_BASE_LOW
|
||||
movt r1, #IOCONFIG_BASE_HIGH
|
||||
mov.w r0, #IOCONFIG_BASE_LOW
|
||||
movt r0, #IOCONFIG_BASE_HIGH
|
||||
mov.w r4, #0xd3
|
||||
str.w r4, [r0, #IOCONFIG_MOSI_OFFSET]
|
||||
mov r0, r4
|
||||
str.w r0, [r1, #IOCONFIG_MISO_OFFSET]
|
||||
mov r1, r0
|
||||
str.w r1, [r2, #IOCONFIG_WP_OFFSET]
|
||||
str.w r1, [r3, #IOCONFIG_HOLD_OFFSET]
|
||||
mov.w r3, #IOCONFIG_BASE_LOW
|
||||
movt r3, #IOCONFIG_BASE_HIGH
|
||||
mov.w r2, #0x13
|
||||
str.w r2, [r3, #IOCONFIG_CS_OFFSET]
|
||||
|
||||
/* Perform SPIFI init. See spifi_rom_api.h (in NXP lpc43xx driver package) for details */
|
||||
/* on initialization arguments. */
|
||||
movw r3, #SPIFI_ROM_TABLE_BASE_LOW /* The ROM API table is located @ 0x10400118, and */
|
||||
movt r3, #SPIFI_ROM_TABLE_BASE_HIGH /* the first pointer in the struct is to the init function. */
|
||||
ldr r3, [r3, #0x0]
|
||||
ldr r4, [r3, #0x0] /* Grab the init function pointer from the table */
|
||||
/* Set up function arguments */
|
||||
movw r0, #0x3b4
|
||||
movt r0, #0x1000 /* Pointer to a SPIFI data struct that we don't care about */
|
||||
mov.w r1, #0x3 /* "csHigh". Not 100% sure what this does. */
|
||||
mov.w r2, #0xc0 /* The configuration word: S_RCVCLOCK | S_FULLCLK */
|
||||
mov.w r3, r8 /* SPIFI clock speed (12MHz) */
|
||||
blx r4 /* Call the init function */
|
||||
b done
|
||||
|
||||
done:
|
||||
bkpt #0
|
||||
|
||||
.end
|
||||
210
debuggers/openocd/contrib/loaders/flash/lpcspifi_write.S
Normal file
210
debuggers/openocd/contrib/loaders/flash/lpcspifi_write.S
Normal file
@ -0,0 +1,210 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2012 by George Harris *
|
||||
* george@luminairecoffee.com *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
.text
|
||||
.syntax unified
|
||||
.cpu cortex-m3
|
||||
.thumb
|
||||
.thumb_func
|
||||
|
||||
/*
|
||||
* Params :
|
||||
* r0 = workarea start, status (out)
|
||||
* r1 = workarea end
|
||||
* r2 = target address (offset from flash base)
|
||||
* r3 = count (bytes)
|
||||
* r4 = page size
|
||||
* Clobbered:
|
||||
* r7 - rp
|
||||
* r8 - wp, tmp
|
||||
* r9 - send/receive data
|
||||
* r10 - temp
|
||||
* r11 - current page end address
|
||||
*/
|
||||
|
||||
#define SSP_BASE_HIGH 0x4008
|
||||
#define SSP_BASE_LOW 0x3000
|
||||
#define SSP_CR0_OFFSET 0x00
|
||||
#define SSP_CR1_OFFSET 0x04
|
||||
#define SSP_DATA_OFFSET 0x08
|
||||
#define SSP_CPSR_OFFSET 0x10
|
||||
#define SSP_SR_OFFSET 0x0c
|
||||
|
||||
#define SSP_CLOCK_BASE_HIGH 0x4005
|
||||
#define SSP_CLOCK_BASE_LOW 0x0000
|
||||
#define SSP_BRANCH_CLOCK_BASE_HIGH 0x4005
|
||||
#define SSP_BRANCH_CLOCK_BASE_LOW 0x2000
|
||||
#define SSP_BASE_CLOCK_OFFSET 0x94
|
||||
#define SSP_BRANCH_CLOCK_OFFSET 0x700
|
||||
|
||||
#define IOCONFIG_BASE_HIGH 0x4008
|
||||
#define IOCONFIG_BASE_LOW 0x6000
|
||||
#define IOCONFIG_SCK_OFFSET 0x18c
|
||||
#define IOCONFIG_HOLD_OFFSET 0x190
|
||||
#define IOCONFIG_WP_OFFSET 0x194
|
||||
#define IOCONFIG_MISO_OFFSET 0x198
|
||||
#define IOCONFIG_MOSI_OFFSET 0x19c
|
||||
#define IOCONFIG_CS_OFFSET 0x1a0
|
||||
|
||||
#define IO_BASE_HIGH 0x400f
|
||||
#define IO_BASE_LOW 0x4000
|
||||
#define IO_CS_OFFSET 0xab
|
||||
#define IODIR_BASE_HIGH 0x400f
|
||||
#define IODIR_BASE_LOW 0x6000
|
||||
#define IO_CS_DIR_OFFSET 0x14
|
||||
|
||||
|
||||
setup: /* Initialize SSP pins and module */
|
||||
mov.w r10, #IOCONFIG_BASE_LOW
|
||||
movt r10, #IOCONFIG_BASE_HIGH
|
||||
mov.w r8, #0xea
|
||||
str.w r8, [r10, #IOCONFIG_SCK_OFFSET] /* Configure SCK pin function */
|
||||
mov.w r8, #0x40
|
||||
str.w r8, [r10, #IOCONFIG_HOLD_OFFSET] /* Configure /HOLD pin function */
|
||||
mov.w r8, #0x40
|
||||
str.w r8, [r10, #IOCONFIG_WP_OFFSET] /* Configure /WP pin function */
|
||||
mov.w r8, #0xed
|
||||
str.w r8, [r10, #IOCONFIG_MISO_OFFSET] /* Configure MISO pin function */
|
||||
mov.w r8, #0xed
|
||||
str.w r8, [r10, #IOCONFIG_MOSI_OFFSET] /* Configure MOSI pin function */
|
||||
mov.w r8, #0x44
|
||||
str.w r8, [r10, #IOCONFIG_CS_OFFSET] /* Configure CS pin function */
|
||||
|
||||
mov.w r10, #IODIR_BASE_LOW
|
||||
movt r10, #IODIR_BASE_HIGH
|
||||
mov.w r8, #0x800
|
||||
str r8, [r10, #IO_CS_DIR_OFFSET] /* Set CS as output */
|
||||
mov.w r10, #IO_BASE_LOW
|
||||
movt r10, #IO_BASE_HIGH
|
||||
mov.w r8, #0xff
|
||||
str.w r8, [r10, #IO_CS_OFFSET] /* Set CS high */
|
||||
|
||||
mov.w r10, #SSP_CLOCK_BASE_LOW
|
||||
movt r10, #SSP_CLOCK_BASE_HIGH
|
||||
mov.w r8, #0x0000
|
||||
movt r8, #0x0100
|
||||
str.w r8, [r10, #SSP_BASE_CLOCK_OFFSET] /* Configure SSP0 base clock (use 12 MHz IRC) */
|
||||
|
||||
mov.w r10, #SSP_BRANCH_CLOCK_BASE_LOW
|
||||
movt r10, #SSP_BRANCH_CLOCK_BASE_HIGH
|
||||
mov.w r8, #0x01
|
||||
str.w r8, [r10, #SSP_BRANCH_CLOCK_OFFSET] /* Configure (enable) SSP0 branch clock */
|
||||
|
||||
mov.w r10, #SSP_BASE_LOW
|
||||
movt r10, #SSP_BASE_HIGH
|
||||
mov.w r8, #0x07
|
||||
str.w r8, [r10, #SSP_CR0_OFFSET] /* Set clock postscale */
|
||||
mov.w r8, #0x02
|
||||
str.w r8, [r10, #SSP_CPSR_OFFSET] /* Set clock prescale */
|
||||
str.w r8, [r10, #SSP_CR1_OFFSET] /* Enable SSP in SPI mode */
|
||||
|
||||
mov.w r11, #0x00
|
||||
find_next_page_boundary:
|
||||
add r11, r4 /* Increment to the next page */
|
||||
cmp r11, r2
|
||||
/* If we have not reached the next page boundary after the target address, keep going */
|
||||
bls find_next_page_boundary
|
||||
write_enable:
|
||||
bl cs_down
|
||||
mov.w r9, #0x06 /* Send the write enable command */
|
||||
bl write_data
|
||||
bl cs_up
|
||||
|
||||
bl cs_down
|
||||
mov.w r9, #0x05 /* Get status register */
|
||||
bl write_data
|
||||
mov.w r9, #0x00 /* Dummy data to clock in status */
|
||||
bl write_data
|
||||
bl cs_up
|
||||
|
||||
tst r9, #0x02 /* If the WE bit isn't set, we have a problem. */
|
||||
beq error
|
||||
page_program:
|
||||
bl cs_down
|
||||
mov.w r9, #0x02 /* Send the page program command */
|
||||
bl write_data
|
||||
write_address:
|
||||
lsr r9, r2, #16 /* Send the current 24-bit write address, MSB first */
|
||||
bl write_data
|
||||
lsr r9, r2, #8
|
||||
bl write_data
|
||||
mov.w r9, r2
|
||||
bl write_data
|
||||
wait_fifo:
|
||||
ldr r8, [r0] /* read the write pointer */
|
||||
cmp r8, #0 /* if it's zero, we're gonzo */
|
||||
beq exit
|
||||
ldr r7, [r0, #4] /* read the read pointer */
|
||||
cmp r7, r8 /* wait until they are not equal */
|
||||
beq wait_fifo
|
||||
write:
|
||||
ldrb r9, [r7], #0x01 /* Load one byte from the FIFO, increment the read pointer by 1 */
|
||||
bl write_data /* send the byte to the flash chip */
|
||||
|
||||
cmp r7, r1 /* wrap the read pointer if it is at the end */
|
||||
it cs
|
||||
addcs r7, r0, #8 /* skip loader args */
|
||||
str r7, [r0, #4] /* store the new read pointer */
|
||||
subs r3, r3, #1 /* decrement count */
|
||||
cbz r3, exit /* Exit if we have written everything */
|
||||
|
||||
add r2, #1 /* Increment flash address by 1 */
|
||||
cmp r11, r2 /* See if we have reached the end of a page */
|
||||
bne wait_fifo /* If not, keep writing bytes */
|
||||
bl cs_up /* Otherwise, end the command and keep going w/ the next page */
|
||||
add r11, r4 /* Move up the end-of-page address by the page size*/
|
||||
wait_flash_busy: /* Wait for the flash to finish the previous page write */
|
||||
bl cs_down
|
||||
mov.w r9, #0x05 /* Get status register */
|
||||
bl write_data
|
||||
mov.w r9, #0x00 /* Dummy data to clock in status */
|
||||
bl write_data
|
||||
bl cs_up
|
||||
tst r9, #0x01 /* If it isn't done, keep waiting */
|
||||
bne wait_flash_busy
|
||||
b write_enable /* If it is done, start a new page write */
|
||||
write_data: /* Send/receive 1 byte of data over SSP */
|
||||
mov.w r10, #SSP_BASE_LOW
|
||||
movt r10, #SSP_BASE_HIGH
|
||||
str.w r9, [r10, #SSP_DATA_OFFSET] /* Write supplied data to the SSP data reg */
|
||||
wait_transmit:
|
||||
ldr r9, [r10, #SSP_SR_OFFSET] /* Check SSP status */
|
||||
tst r9, #0x0010 /* Check if BSY bit is set */
|
||||
bne wait_transmit /* If still transmitting, keep waiting */
|
||||
ldr r9, [r10, #SSP_DATA_OFFSET] /* Load received data */
|
||||
bx lr /* Exit subroutine */
|
||||
cs_up:
|
||||
mov.w r8, #0xff
|
||||
b cs_write
|
||||
cs_down:
|
||||
mov.w r8, #0x0000
|
||||
cs_write:
|
||||
mov.w r10, #IO_BASE_LOW
|
||||
movt r10, #IO_BASE_HIGH
|
||||
str.w r8, [r10, #IO_CS_OFFSET]
|
||||
bx lr
|
||||
error:
|
||||
movs r0, #0
|
||||
str r0, [r2, #4] /* set rp = 0 on error */
|
||||
exit:
|
||||
mov r0, r6
|
||||
bkpt #0x00
|
||||
|
||||
.end
|
||||
132
debuggers/openocd/contrib/loaders/flash/pic32mx.s
Normal file
132
debuggers/openocd/contrib/loaders/flash/pic32mx.s
Normal file
@ -0,0 +1,132 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2010 by Spencer Oliver *
|
||||
* spen@spen-soft.co.uk *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
.text
|
||||
.arch m4k
|
||||
.set noreorder
|
||||
.set noat
|
||||
|
||||
/* params:
|
||||
* $a0 src adr - ram + result
|
||||
* $a1 dest adr - flash
|
||||
* $a2 count (32bit words)
|
||||
* vars
|
||||
*
|
||||
* temps:
|
||||
* $t0, $t1, $t2, $t3, $t4, $t5
|
||||
* $s0, $s1, $s3, $s4, $s5
|
||||
*/
|
||||
|
||||
.type main, @function
|
||||
.global main
|
||||
|
||||
.ent main
|
||||
main:
|
||||
/* setup constants */
|
||||
lui $t0, 0xaa99
|
||||
ori $t0, 0x6655 /* NVMKEY1 */
|
||||
lui $t1, 0x5566
|
||||
ori $t1, 0x99AA /* NVMKEY2 */
|
||||
lui $t2, 0xBF80
|
||||
ori $t2, 0xF400 /* NVMCON */
|
||||
ori $t3, $zero, 0x4003 /* NVMCON row write cmd */
|
||||
ori $t4, $zero, 0x8000 /* NVMCON start cmd */
|
||||
|
||||
write_row:
|
||||
/* can we perform a row write: 128 32bit words */
|
||||
sltiu $s3, $a2, 128
|
||||
bne $s3, $zero, write_word
|
||||
ori $t5, $zero, 0x4000 /* NVMCON clear cmd */
|
||||
|
||||
/* perform row write 512 bytes */
|
||||
sw $a1, 32($t2) /* set NVMADDR with dest addr - real addr */
|
||||
sw $a0, 64($t2) /* set NVMSRCADDR with src addr - real addr */
|
||||
|
||||
bal progflash
|
||||
addiu $a0, $a0, 512
|
||||
addiu $a1, $a1, 512
|
||||
beq $zero, $zero, write_row
|
||||
addiu $a2, $a2, -128
|
||||
|
||||
write_word:
|
||||
/* write 32bit words */
|
||||
lui $s5, 0xa000
|
||||
ori $s5, 0x0000
|
||||
or $a0, $a0, $s5 /* convert to virtual addr */
|
||||
|
||||
beq $zero, $zero, next_word
|
||||
ori $t3, $zero, 0x4001 /* NVMCON word write cmd */
|
||||
|
||||
prog_word:
|
||||
lw $s4, 0($a0) /* load data - from virtual addr */
|
||||
sw $s4, 48($t2) /* set NVMDATA with data */
|
||||
sw $a1, 32($t2) /* set NVMADDR with dest addr - real addr */
|
||||
|
||||
bal progflash
|
||||
addiu $a0, $a0, 4
|
||||
addiu $a1, $a1, 4
|
||||
addiu $a2, $a2, -1
|
||||
next_word:
|
||||
bne $a2, $zero, prog_word
|
||||
nop
|
||||
|
||||
done:
|
||||
beq $zero, $zero, exit
|
||||
addiu $a0, $zero, 0
|
||||
|
||||
error:
|
||||
/* save result to $a0 */
|
||||
addiu $a0, $s1, 0
|
||||
|
||||
exit:
|
||||
sdbbp
|
||||
.end main
|
||||
|
||||
.type progflash, @function
|
||||
.global progflash
|
||||
|
||||
.ent progflash
|
||||
progflash:
|
||||
sw $t3, 0($t2) /* set NVMWREN */
|
||||
sw $t0, 16($t2) /* write NVMKEY1 */
|
||||
sw $t1, 16($t2) /* write NVMKEY2 */
|
||||
sw $t4, 8($t2) /* start operation */
|
||||
|
||||
waitflash:
|
||||
lw $s0, 0($t2)
|
||||
and $s0, $s0, $t4
|
||||
bne $s0, $zero, waitflash
|
||||
nop
|
||||
|
||||
/* following is to comply with errata #34
|
||||
* 500ns delay required */
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
/* check for errors */
|
||||
lw $s1, 0($t2)
|
||||
andi $s1, $zero, 0x3000
|
||||
bne $s1, $zero, error
|
||||
sw $t5, 4($t2) /* clear NVMWREN */
|
||||
jr $ra
|
||||
nop
|
||||
|
||||
.end progflash
|
||||
78
debuggers/openocd/contrib/loaders/flash/stellaris.s
Normal file
78
debuggers/openocd/contrib/loaders/flash/stellaris.s
Normal file
@ -0,0 +1,78 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2006 by Magnus Lundin *
|
||||
* lundin@mlu.mine.nu *
|
||||
* *
|
||||
* Copyright (C) 2008 by Spencer Oliver *
|
||||
* spen@spen-soft.co.uk *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
.text
|
||||
.syntax unified
|
||||
.cpu cortex-m3
|
||||
.thumb
|
||||
.thumb_func
|
||||
|
||||
/*
|
||||
* Params :
|
||||
* r0 = workarea start
|
||||
* r1 = workarea end
|
||||
* r2 = target address
|
||||
* r3 = count (32bit words)
|
||||
*
|
||||
* Clobbered:
|
||||
* r4 = pFLASH_CTRL_BASE
|
||||
* r5 = FLASHWRITECMD
|
||||
* r7 - rp
|
||||
* r8 - wp, tmp
|
||||
*/
|
||||
|
||||
write:
|
||||
ldr r4, pFLASH_CTRL_BASE
|
||||
ldr r5, FLASHWRITECMD
|
||||
|
||||
wait_fifo:
|
||||
ldr r8, [r0, #0] /* read wp */
|
||||
cmp r8, #0 /* abort if wp == 0 */
|
||||
beq exit
|
||||
ldr r7, [r0, #4] /* read rp */
|
||||
cmp r7, r8 /* wait until rp != wp */
|
||||
beq wait_fifo
|
||||
|
||||
mainloop:
|
||||
str r2, [r4, #0] /* FMA - write address */
|
||||
add r2, r2, #4 /* increment target address */
|
||||
ldr r8, [r7], #4
|
||||
str r8, [r4, #4] /* FMD - write data */
|
||||
str r5, [r4, #8] /* FMC - enable write */
|
||||
busy:
|
||||
ldr r8, [r4, #8]
|
||||
tst r8, #1
|
||||
bne busy
|
||||
|
||||
cmp r7, r1 /* wrap rp at end of buffer */
|
||||
it cs
|
||||
addcs r7, r0, #8 /* skip loader args */
|
||||
str r7, [r0, #4] /* store rp */
|
||||
subs r3, r3, #1 /* decrement word count */
|
||||
cbz r3, exit /* loop if not done */
|
||||
b wait_fifo
|
||||
exit:
|
||||
bkpt #0
|
||||
|
||||
pFLASH_CTRL_BASE: .word 0x400FD000
|
||||
FLASHWRITECMD: .word 0xA4420001
|
||||
76
debuggers/openocd/contrib/loaders/flash/stm32f1x.S
Normal file
76
debuggers/openocd/contrib/loaders/flash/stm32f1x.S
Normal file
@ -0,0 +1,76 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2011 by Andreas Fritiofson *
|
||||
* andreas.fritiofson@gmail.com *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
.text
|
||||
.syntax unified
|
||||
.cpu cortex-m0
|
||||
.thumb
|
||||
.thumb_func
|
||||
.global write
|
||||
|
||||
/* Params:
|
||||
* r0 - flash base (in), status (out)
|
||||
* r1 - count (halfword-16bit)
|
||||
* r2 - workarea start
|
||||
* r3 - workarea end
|
||||
* r4 - target address
|
||||
* Clobbered:
|
||||
* r5 - rp
|
||||
* r6 - wp, tmp
|
||||
* r7 - tmp
|
||||
*/
|
||||
|
||||
#define STM32_FLASH_SR_OFFSET 0x0c /* offset of SR register from flash reg base */
|
||||
|
||||
wait_fifo:
|
||||
ldr r6, [r2, #0] /* read wp */
|
||||
cmp r6, #0 /* abort if wp == 0 */
|
||||
beq exit
|
||||
ldr r5, [r2, #4] /* read rp */
|
||||
cmp r5, r6 /* wait until rp != wp */
|
||||
beq wait_fifo
|
||||
ldrh r6, [r5] /* "*target_address++ = *rp++" */
|
||||
strh r6, [r4]
|
||||
adds r5, #2
|
||||
adds r4, #2
|
||||
busy:
|
||||
ldr r6, [r0, #STM32_FLASH_SR_OFFSET] /* wait until BSY flag is reset */
|
||||
movs r7, #1
|
||||
tst r6, r7
|
||||
bne busy
|
||||
movs r7, #0x14 /* check the error bits */
|
||||
tst r6, r7
|
||||
bne error
|
||||
cmp r5, r3 /* wrap rp at end of buffer */
|
||||
bcc no_wrap
|
||||
mov r5, r2
|
||||
adds r5, #8
|
||||
no_wrap:
|
||||
str r5, [r2, #4] /* store rp */
|
||||
subs r1, r1, #1 /* decrement halfword count */
|
||||
cmp r1, #0
|
||||
beq exit /* loop if not done */
|
||||
b wait_fifo
|
||||
error:
|
||||
movs r0, #0
|
||||
str r0, [r2, #4] /* set rp = 0 on error */
|
||||
exit:
|
||||
mov r0, r6 /* return status in r0 */
|
||||
bkpt #0
|
||||
80
debuggers/openocd/contrib/loaders/flash/stm32f2x.S
Normal file
80
debuggers/openocd/contrib/loaders/flash/stm32f2x.S
Normal file
@ -0,0 +1,80 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2010 by Spencer Oliver *
|
||||
* spen@spen-soft.co.uk *
|
||||
* *
|
||||
* Copyright (C) 2011 Øyvind Harboe *
|
||||
* oyvind.harboe@zylin.com *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
.text
|
||||
.syntax unified
|
||||
.cpu cortex-m3
|
||||
.thumb
|
||||
.thumb_func
|
||||
|
||||
/*
|
||||
* Params :
|
||||
* r0 = workarea start, status (out)
|
||||
* r1 = workarea end
|
||||
* r2 = target address
|
||||
* r3 = count (16bit words)
|
||||
* r4 = flash base
|
||||
*
|
||||
* Clobbered:
|
||||
* r6 - temp
|
||||
* r7 - rp
|
||||
* r8 - wp, tmp
|
||||
*/
|
||||
|
||||
#define STM32_FLASH_CR_OFFSET 0x10 /* offset of CR register in FLASH struct */
|
||||
#define STM32_FLASH_SR_OFFSET 0x0c /* offset of SR register in FLASH struct */
|
||||
|
||||
wait_fifo:
|
||||
ldr r8, [r0, #0] /* read wp */
|
||||
cmp r8, #0 /* abort if wp == 0 */
|
||||
beq exit
|
||||
ldr r7, [r0, #4] /* read rp */
|
||||
cmp r7, r8 /* wait until rp != wp */
|
||||
beq wait_fifo
|
||||
|
||||
ldr r6, STM32_PROG16
|
||||
str r6, [r4, #STM32_FLASH_CR_OFFSET]
|
||||
ldrh r6, [r7], #0x02 /* read one half-word from src, increment ptr */
|
||||
strh r6, [r2], #0x02 /* write one half-word from src, increment ptr */
|
||||
busy:
|
||||
ldr r6, [r4, #STM32_FLASH_SR_OFFSET]
|
||||
tst r6, #0x10000 /* BSY (bit16) == 1 => operation in progress */
|
||||
bne busy /* wait more... */
|
||||
tst r6, #0xf0 /* PGSERR | PGPERR | PGAERR | WRPERR */
|
||||
bne error /* fail... */
|
||||
|
||||
cmp r7, r1 /* wrap rp at end of buffer */
|
||||
it cs
|
||||
addcs r7, r0, #8 /* skip loader args */
|
||||
str r7, [r0, #4] /* store rp */
|
||||
subs r3, r3, #1 /* decrement halfword count */
|
||||
cbz r3, exit /* loop if not done */
|
||||
b wait_fifo
|
||||
error:
|
||||
movs r1, #0
|
||||
str r1, [r0, #4] /* set rp = 0 on error */
|
||||
exit:
|
||||
mov r0, r6 /* return status in r0 */
|
||||
bkpt #0x00
|
||||
|
||||
STM32_PROG16: .word 0x101 /* PG | PSIZE_16*/
|
||||
63
debuggers/openocd/contrib/loaders/flash/stm32lx.S
Normal file
63
debuggers/openocd/contrib/loaders/flash/stm32lx.S
Normal file
@ -0,0 +1,63 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2010 by Spencer Oliver *
|
||||
* spen@spen-soft.co.uk *
|
||||
* *
|
||||
* Copyright (C) 2011 Øyvind Harboe *
|
||||
* oyvind.harboe@zylin.com *
|
||||
* *
|
||||
* Copyright (C) 2011 Clement Burin des Roziers *
|
||||
* clement.burin-des-roziers@hikob.com *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
// Build : arm-eabi-gcc -c stm32lx.S
|
||||
.text
|
||||
.syntax unified
|
||||
.cpu cortex-m3
|
||||
.thumb
|
||||
.thumb_func
|
||||
.global write
|
||||
|
||||
/*
|
||||
r0 - destination address
|
||||
r1 - source address
|
||||
r2 - count
|
||||
*/
|
||||
|
||||
// Set 0 to r3
|
||||
movs r3, #0
|
||||
// Go to compare
|
||||
b.n test_done
|
||||
|
||||
write_word:
|
||||
// Load one word from address in r0, increment by 4
|
||||
ldr.w ip, [r1], #4
|
||||
// Store the word to address in r1, increment by 4
|
||||
str.w ip, [r0], #4
|
||||
// Increment r3
|
||||
adds r3, #1
|
||||
|
||||
test_done:
|
||||
// Compare r3 and r2
|
||||
cmp r3, r2
|
||||
// Loop if not zero
|
||||
bcc.n write_word
|
||||
|
||||
// Set breakpoint to exit
|
||||
bkpt #0x00
|
||||
|
||||
59
debuggers/openocd/contrib/loaders/flash/str7x.s
Normal file
59
debuggers/openocd/contrib/loaders/flash/str7x.s
Normal file
@ -0,0 +1,59 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2010 by Spencer Oliver *
|
||||
* spen@spen-soft.co.uk *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
.text
|
||||
.arm
|
||||
.arch armv4t
|
||||
|
||||
.section .init
|
||||
/*
|
||||
r0 source address
|
||||
r1 address
|
||||
r2 FLASH_CR0
|
||||
r3 dword count
|
||||
r4 result
|
||||
r5 busy mask
|
||||
*/
|
||||
|
||||
write:
|
||||
mov r4, #0x10000000 /* set DWPG bit */
|
||||
str r4, [r2, #0x0] /* FLASH_CR0 */
|
||||
str r1, [r2, #0x10] /* FLASH_AR */
|
||||
ldr r4, [r0], #4 /* load data */
|
||||
str r4, [r2, #0x8] /* FLASH_DR0 */
|
||||
ldr r4, [r0], #4 /* load data */
|
||||
str r4, [r2, #0xc] /* FLASH_DR1 */
|
||||
mov r4, #0x90000000 /* set DWPG and WMS bits */
|
||||
str r4, [r2, #0x0] /* FLASH_CR0 */
|
||||
busy:
|
||||
ldr r4, [r2, #0x0] /* FLASH_CR0 */
|
||||
tst r4, r5
|
||||
bne busy
|
||||
ldr r4, [r2, #0x14] /* FLASH_ER */
|
||||
tst r4, #0xff /* do we have errors */
|
||||
tsteq r4, #0x100 /* write protection set */
|
||||
bne exit
|
||||
add r1, r1, #0x8 /* next 8 bytes */
|
||||
subs r3, r3, #1 /* decremment dword count */
|
||||
bne write
|
||||
exit:
|
||||
b exit
|
||||
|
||||
.end
|
||||
56
debuggers/openocd/contrib/loaders/flash/str9x.s
Normal file
56
debuggers/openocd/contrib/loaders/flash/str9x.s
Normal file
@ -0,0 +1,56 @@
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2010 by Spencer Oliver *
|
||||
* spen@spen-soft.co.uk *
|
||||
* *
|
||||
* 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 2 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, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
.text
|
||||
.arm
|
||||
.arch armv5t
|
||||
|
||||
.section .init
|
||||
/*
|
||||
r0 source address (in)
|
||||
r1 target address (in)
|
||||
r2 word count (in)
|
||||
r3 result (out)
|
||||
*/
|
||||
|
||||
write:
|
||||
bic r4, r1, #3 /* word address */
|
||||
mov r3, #0x40 /* write command */
|
||||
strh r3, [r4, #0]
|
||||
ldrh r3, [r0], #2 /* read data */
|
||||
strh r3, [r1], #2 /* write data */
|
||||
mov r3, #0x70 /* status command */
|
||||
strh r3, [r4, #0]
|
||||
busy:
|
||||
ldrb r3, [r4, #0] /* status */
|
||||
tst r3, #0x80
|
||||
beq busy
|
||||
mov r5, #0x50 /* clear status command */
|
||||
strh r5, [r4, #0]
|
||||
mov r5, #0xFF /* read array */
|
||||
strh r5, [r4, #0]
|
||||
tst r3, #0x12
|
||||
bne exit
|
||||
subs r2, r2, #1 /* decremment word count */
|
||||
bne write
|
||||
exit:
|
||||
bkpt #0
|
||||
|
||||
.end
|
||||
92
debuggers/openocd/contrib/openocd.udev
Normal file
92
debuggers/openocd/contrib/openocd.udev
Normal file
@ -0,0 +1,92 @@
|
||||
ACTION!="add|change", GOTO="openocd_rules_end"
|
||||
SUBSYSTEM!="usb|tty", GOTO="openocd_rules_end"
|
||||
|
||||
# Olimex ARM-USB-OCD
|
||||
ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="0003", MODE="664", GROUP="plugdev"
|
||||
|
||||
# Olimex ARM-USB-OCD-H
|
||||
ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="002b", MODE="664", GROUP="plugdev"
|
||||
|
||||
# Olimex ARM-USB-OCD-TINY
|
||||
ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="0004", MODE="664", GROUP="plugdev"
|
||||
|
||||
# Olimex ARM-JTAG-EW
|
||||
ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="001e", MODE="664", GROUP="plugdev"
|
||||
|
||||
# Olimex ARM-USB-OCD-TINY-H
|
||||
ATTRS{idVendor}=="15ba", ATTRS{idProduct}=="002a", MODE="664", GROUP="plugdev"
|
||||
|
||||
# USBprog with OpenOCD firmware
|
||||
ATTRS{idVendor}=="1781", ATTRS{idProduct}=="0c63", MODE="664", GROUP="plugdev"
|
||||
|
||||
# Amontec JTAGkey and JTAGkey-tiny
|
||||
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="cff8", MODE="664", GROUP="plugdev"
|
||||
|
||||
# Amontec JTAGkey-HiSpeed
|
||||
ATTRS{idVendor}=="0fbb", ATTRS{idProduct}=="1000", MODE="664", GROUP="plugdev"
|
||||
|
||||
# Axiom AXM-0432 Link (Symphony SoundBite?)
|
||||
# Calao Systems USB-A9260-C01
|
||||
# TinCanTools Flyswatter
|
||||
# OOCD-Link
|
||||
# Marvell Sheevaplug (early development versions)
|
||||
# DLP Design DLP-USB1232H USB-to-UART/FIFO interface module
|
||||
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE="664", GROUP="plugdev"
|
||||
|
||||
# Calao Systems USB-A9260-C02
|
||||
# Bus Pirate
|
||||
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE="664", GROUP="plugdev"
|
||||
|
||||
# IAR J-Link USB
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0101", MODE="664", GROUP="plugdev"
|
||||
|
||||
# Raisonance RLink
|
||||
ATTRS{idVendor}=="138e", ATTRS{idProduct}=="9000", MODE="664", GROUP="plugdev"
|
||||
|
||||
# Hitex STR9-comStick
|
||||
ATTRS{idVendor}=="0640", ATTRS{idProduct}=="002c", MODE="664", GROUP="plugdev"
|
||||
|
||||
# Hitex STM32-PerformanceStick
|
||||
ATTRS{idVendor}=="0640", ATTRS{idProduct}=="002d", MODE="664", GROUP="plugdev"
|
||||
|
||||
# TI/Luminary Stellaris Evaluation Board FTDI (several)
|
||||
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bcd9", MODE="664", GROUP="plugdev"
|
||||
|
||||
# TI/Luminary Stellaris In-Circuit Debug Interface FTDI (ICDI) Board
|
||||
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bcda", MODE="664", GROUP="plugdev"
|
||||
|
||||
# TI/Luminary Stellaris In-Circuit Debug Interface (ICDI) Board
|
||||
ATTRS{idVendor}=="1cbe", ATTRS{idProduct}=="00fd", MODE="664", GROUP="plugdev"
|
||||
|
||||
# Xverve Signalyzer Tool (DT-USB-ST)
|
||||
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bca0", MODE="664", GROUP="plugdev"
|
||||
|
||||
# egnite Turtelizer 2
|
||||
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="bdc8", MODE="664", GROUP="plugdev"
|
||||
|
||||
# Marvell Sheevaplug
|
||||
ATTRS{idVendor}=="9e88", ATTRS{idProduct}=="9e8f", MODE="664", GROUP="plugdev"
|
||||
|
||||
# Section5 ICEbear
|
||||
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="c140", MODE="664", GROUP="plugdev"
|
||||
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="c141", MODE="664", GROUP="plugdev"
|
||||
|
||||
# Hilscher NXHX Boards
|
||||
ATTRS{idVendor}=="0640", ATTRS{idProduct}=="0028", MODE="664", GROUP="plugdev"
|
||||
|
||||
# Debug Board for Neo1973
|
||||
ATTRS{idVendor}=="1457", ATTRS{idProduct}=="5118", MODE="664", GROUP="plugdev"
|
||||
|
||||
# XDS100v2
|
||||
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="a6d0", MODE="664", GROUP="plugdev"
|
||||
|
||||
# stlink v1
|
||||
ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3744", MODE="664", GROUP="plugdev"
|
||||
|
||||
# stlink v2
|
||||
ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", MODE="664", GROUP="plugdev"
|
||||
|
||||
# opendous and estick
|
||||
ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="204f", MODE="664", GROUP="plugdev"
|
||||
|
||||
LABEL="openocd_rules_end"
|
||||
790
debuggers/openocd/depcomp
Executable file
790
debuggers/openocd/depcomp
Executable file
@ -0,0 +1,790 @@
|
||||
#! /bin/sh
|
||||
# depcomp - compile a program generating dependencies as side-effects
|
||||
|
||||
scriptversion=2012-10-18.11; # UTC
|
||||
|
||||
# Copyright (C) 1999-2013 Free Software Foundation, Inc.
|
||||
|
||||
# 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 2, 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/>.
|
||||
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
|
||||
|
||||
case $1 in
|
||||
'')
|
||||
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
||||
exit 1;
|
||||
;;
|
||||
-h | --h*)
|
||||
cat <<\EOF
|
||||
Usage: depcomp [--help] [--version] PROGRAM [ARGS]
|
||||
|
||||
Run PROGRAMS ARGS to compile a file, generating dependencies
|
||||
as side-effects.
|
||||
|
||||
Environment variables:
|
||||
depmode Dependency tracking mode.
|
||||
source Source file read by 'PROGRAMS ARGS'.
|
||||
object Object file output by 'PROGRAMS ARGS'.
|
||||
DEPDIR directory where to store dependencies.
|
||||
depfile Dependency file to output.
|
||||
tmpdepfile Temporary file to use when outputting dependencies.
|
||||
libtool Whether libtool is used (yes/no).
|
||||
|
||||
Report bugs to <bug-automake@gnu.org>.
|
||||
EOF
|
||||
exit $?
|
||||
;;
|
||||
-v | --v*)
|
||||
echo "depcomp $scriptversion"
|
||||
exit $?
|
||||
;;
|
||||
esac
|
||||
|
||||
# Get the directory component of the given path, and save it in the
|
||||
# global variables '$dir'. Note that this directory component will
|
||||
# be either empty or ending with a '/' character. This is deliberate.
|
||||
set_dir_from ()
|
||||
{
|
||||
case $1 in
|
||||
*/*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
|
||||
*) dir=;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Get the suffix-stripped basename of the given path, and save it the
|
||||
# global variable '$base'.
|
||||
set_base_from ()
|
||||
{
|
||||
base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
|
||||
}
|
||||
|
||||
# If no dependency file was actually created by the compiler invocation,
|
||||
# we still have to create a dummy depfile, to avoid errors with the
|
||||
# Makefile "include basename.Plo" scheme.
|
||||
make_dummy_depfile ()
|
||||
{
|
||||
echo "#dummy" > "$depfile"
|
||||
}
|
||||
|
||||
# Factor out some common post-processing of the generated depfile.
|
||||
# Requires the auxiliary global variable '$tmpdepfile' to be set.
|
||||
aix_post_process_depfile ()
|
||||
{
|
||||
# If the compiler actually managed to produce a dependency file,
|
||||
# post-process it.
|
||||
if test -f "$tmpdepfile"; then
|
||||
# Each line is of the form 'foo.o: dependency.h'.
|
||||
# Do two passes, one to just change these to
|
||||
# $object: dependency.h
|
||||
# and one to simply output
|
||||
# dependency.h:
|
||||
# which is needed to avoid the deleted-header problem.
|
||||
{ sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
|
||||
sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
|
||||
} > "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
else
|
||||
make_dummy_depfile
|
||||
fi
|
||||
}
|
||||
|
||||
# A tabulation character.
|
||||
tab=' '
|
||||
# A newline character.
|
||||
nl='
|
||||
'
|
||||
# Character ranges might be problematic outside the C locale.
|
||||
# These definitions help.
|
||||
upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
lower=abcdefghijklmnopqrstuvwxyz
|
||||
digits=0123456789
|
||||
alpha=${upper}${lower}
|
||||
|
||||
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
|
||||
echo "depcomp: Variables source, object and depmode must be set" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
|
||||
depfile=${depfile-`echo "$object" |
|
||||
sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
|
||||
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
|
||||
|
||||
rm -f "$tmpdepfile"
|
||||
|
||||
# Avoid interferences from the environment.
|
||||
gccflag= dashmflag=
|
||||
|
||||
# Some modes work just like other modes, but use different flags. We
|
||||
# parameterize here, but still list the modes in the big case below,
|
||||
# to make depend.m4 easier to write. Note that we *cannot* use a case
|
||||
# here, because this file can only contain one case statement.
|
||||
if test "$depmode" = hp; then
|
||||
# HP compiler uses -M and no extra arg.
|
||||
gccflag=-M
|
||||
depmode=gcc
|
||||
fi
|
||||
|
||||
if test "$depmode" = dashXmstdout; then
|
||||
# This is just like dashmstdout with a different argument.
|
||||
dashmflag=-xM
|
||||
depmode=dashmstdout
|
||||
fi
|
||||
|
||||
cygpath_u="cygpath -u -f -"
|
||||
if test "$depmode" = msvcmsys; then
|
||||
# This is just like msvisualcpp but w/o cygpath translation.
|
||||
# Just convert the backslash-escaped backslashes to single forward
|
||||
# slashes to satisfy depend.m4
|
||||
cygpath_u='sed s,\\\\,/,g'
|
||||
depmode=msvisualcpp
|
||||
fi
|
||||
|
||||
if test "$depmode" = msvc7msys; then
|
||||
# This is just like msvc7 but w/o cygpath translation.
|
||||
# Just convert the backslash-escaped backslashes to single forward
|
||||
# slashes to satisfy depend.m4
|
||||
cygpath_u='sed s,\\\\,/,g'
|
||||
depmode=msvc7
|
||||
fi
|
||||
|
||||
if test "$depmode" = xlc; then
|
||||
# IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
|
||||
gccflag=-qmakedep=gcc,-MF
|
||||
depmode=gcc
|
||||
fi
|
||||
|
||||
case "$depmode" in
|
||||
gcc3)
|
||||
## gcc 3 implements dependency tracking that does exactly what
|
||||
## we want. Yay! Note: for some reason libtool 1.4 doesn't like
|
||||
## it if -MD -MP comes after the -MF stuff. Hmm.
|
||||
## Unfortunately, FreeBSD c89 acceptance of flags depends upon
|
||||
## the command line argument order; so add the flags where they
|
||||
## appear in depend2.am. Note that the slowdown incurred here
|
||||
## affects only configure: in makefiles, %FASTDEP% shortcuts this.
|
||||
for arg
|
||||
do
|
||||
case $arg in
|
||||
-c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
|
||||
*) set fnord "$@" "$arg" ;;
|
||||
esac
|
||||
shift # fnord
|
||||
shift # $arg
|
||||
done
|
||||
"$@"
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
mv "$tmpdepfile" "$depfile"
|
||||
;;
|
||||
|
||||
gcc)
|
||||
## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
|
||||
## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
|
||||
## (see the conditional assignment to $gccflag above).
|
||||
## There are various ways to get dependency output from gcc. Here's
|
||||
## why we pick this rather obscure method:
|
||||
## - Don't want to use -MD because we'd like the dependencies to end
|
||||
## up in a subdir. Having to rename by hand is ugly.
|
||||
## (We might end up doing this anyway to support other compilers.)
|
||||
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
|
||||
## -MM, not -M (despite what the docs say). Also, it might not be
|
||||
## supported by the other compilers which use the 'gcc' depmode.
|
||||
## - Using -M directly means running the compiler twice (even worse
|
||||
## than renaming).
|
||||
if test -z "$gccflag"; then
|
||||
gccflag=-MD,
|
||||
fi
|
||||
"$@" -Wp,"$gccflag$tmpdepfile"
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
rm -f "$depfile"
|
||||
echo "$object : \\" > "$depfile"
|
||||
# The second -e expression handles DOS-style file names with drive
|
||||
# letters.
|
||||
sed -e 's/^[^:]*: / /' \
|
||||
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
|
||||
## This next piece of magic avoids the "deleted header file" problem.
|
||||
## The problem is that when a header file which appears in a .P file
|
||||
## is deleted, the dependency causes make to die (because there is
|
||||
## typically no way to rebuild the header). We avoid this by adding
|
||||
## dummy dependencies for each header file. Too bad gcc doesn't do
|
||||
## this for us directly.
|
||||
## Some versions of gcc put a space before the ':'. On the theory
|
||||
## that the space means something, we add a space to the output as
|
||||
## well. hp depmode also adds that space, but also prefixes the VPATH
|
||||
## to the object. Take care to not repeat it in the output.
|
||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||
## correctly. Breaking it into two sed invocations is a workaround.
|
||||
tr ' ' "$nl" < "$tmpdepfile" \
|
||||
| sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
|
||||
| sed -e 's/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
hp)
|
||||
# This case exists only to let depend.m4 do its work. It works by
|
||||
# looking at the text of this script. This case will never be run,
|
||||
# since it is checked for above.
|
||||
exit 1
|
||||
;;
|
||||
|
||||
sgi)
|
||||
if test "$libtool" = yes; then
|
||||
"$@" "-Wp,-MDupdate,$tmpdepfile"
|
||||
else
|
||||
"$@" -MDupdate "$tmpdepfile"
|
||||
fi
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
rm -f "$depfile"
|
||||
|
||||
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
|
||||
echo "$object : \\" > "$depfile"
|
||||
# Clip off the initial element (the dependent). Don't try to be
|
||||
# clever and replace this with sed code, as IRIX sed won't handle
|
||||
# lines with more than a fixed number of characters (4096 in
|
||||
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
|
||||
# the IRIX cc adds comments like '#:fec' to the end of the
|
||||
# dependency line.
|
||||
tr ' ' "$nl" < "$tmpdepfile" \
|
||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
|
||||
| tr "$nl" ' ' >> "$depfile"
|
||||
echo >> "$depfile"
|
||||
# The second pass generates a dummy entry for each header file.
|
||||
tr ' ' "$nl" < "$tmpdepfile" \
|
||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
|
||||
>> "$depfile"
|
||||
else
|
||||
make_dummy_depfile
|
||||
fi
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
xlc)
|
||||
# This case exists only to let depend.m4 do its work. It works by
|
||||
# looking at the text of this script. This case will never be run,
|
||||
# since it is checked for above.
|
||||
exit 1
|
||||
;;
|
||||
|
||||
aix)
|
||||
# The C for AIX Compiler uses -M and outputs the dependencies
|
||||
# in a .u file. In older versions, this file always lives in the
|
||||
# current directory. Also, the AIX compiler puts '$object:' at the
|
||||
# start of each line; $object doesn't have directory information.
|
||||
# Version 6 uses the directory in both cases.
|
||||
set_dir_from "$object"
|
||||
set_base_from "$object"
|
||||
if test "$libtool" = yes; then
|
||||
tmpdepfile1=$dir$base.u
|
||||
tmpdepfile2=$base.u
|
||||
tmpdepfile3=$dir.libs/$base.u
|
||||
"$@" -Wc,-M
|
||||
else
|
||||
tmpdepfile1=$dir$base.u
|
||||
tmpdepfile2=$dir$base.u
|
||||
tmpdepfile3=$dir$base.u
|
||||
"$@" -M
|
||||
fi
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||
exit $stat
|
||||
fi
|
||||
|
||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||
do
|
||||
test -f "$tmpdepfile" && break
|
||||
done
|
||||
aix_post_process_depfile
|
||||
;;
|
||||
|
||||
tcc)
|
||||
# tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
|
||||
# FIXME: That version still under development at the moment of writing.
|
||||
# Make that this statement remains true also for stable, released
|
||||
# versions.
|
||||
# It will wrap lines (doesn't matter whether long or short) with a
|
||||
# trailing '\', as in:
|
||||
#
|
||||
# foo.o : \
|
||||
# foo.c \
|
||||
# foo.h \
|
||||
#
|
||||
# It will put a trailing '\' even on the last line, and will use leading
|
||||
# spaces rather than leading tabs (at least since its commit 0394caf7
|
||||
# "Emit spaces for -MD").
|
||||
"$@" -MD -MF "$tmpdepfile"
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
rm -f "$depfile"
|
||||
# Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
|
||||
# We have to change lines of the first kind to '$object: \'.
|
||||
sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
|
||||
# And for each line of the second kind, we have to emit a 'dep.h:'
|
||||
# dummy dependency, to avoid the deleted-header problem.
|
||||
sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
## The order of this option in the case statement is important, since the
|
||||
## shell code in configure will try each of these formats in the order
|
||||
## listed in this file. A plain '-MD' option would be understood by many
|
||||
## compilers, so we must ensure this comes after the gcc and icc options.
|
||||
pgcc)
|
||||
# Portland's C compiler understands '-MD'.
|
||||
# Will always output deps to 'file.d' where file is the root name of the
|
||||
# source file under compilation, even if file resides in a subdirectory.
|
||||
# The object file name does not affect the name of the '.d' file.
|
||||
# pgcc 10.2 will output
|
||||
# foo.o: sub/foo.c sub/foo.h
|
||||
# and will wrap long lines using '\' :
|
||||
# foo.o: sub/foo.c ... \
|
||||
# sub/foo.h ... \
|
||||
# ...
|
||||
set_dir_from "$object"
|
||||
# Use the source, not the object, to determine the base name, since
|
||||
# that's sadly what pgcc will do too.
|
||||
set_base_from "$source"
|
||||
tmpdepfile=$base.d
|
||||
|
||||
# For projects that build the same source file twice into different object
|
||||
# files, the pgcc approach of using the *source* file root name can cause
|
||||
# problems in parallel builds. Use a locking strategy to avoid stomping on
|
||||
# the same $tmpdepfile.
|
||||
lockdir=$base.d-lock
|
||||
trap "
|
||||
echo '$0: caught signal, cleaning up...' >&2
|
||||
rmdir '$lockdir'
|
||||
exit 1
|
||||
" 1 2 13 15
|
||||
numtries=100
|
||||
i=$numtries
|
||||
while test $i -gt 0; do
|
||||
# mkdir is a portable test-and-set.
|
||||
if mkdir "$lockdir" 2>/dev/null; then
|
||||
# This process acquired the lock.
|
||||
"$@" -MD
|
||||
stat=$?
|
||||
# Release the lock.
|
||||
rmdir "$lockdir"
|
||||
break
|
||||
else
|
||||
# If the lock is being held by a different process, wait
|
||||
# until the winning process is done or we timeout.
|
||||
while test -d "$lockdir" && test $i -gt 0; do
|
||||
sleep 1
|
||||
i=`expr $i - 1`
|
||||
done
|
||||
fi
|
||||
i=`expr $i - 1`
|
||||
done
|
||||
trap - 1 2 13 15
|
||||
if test $i -le 0; then
|
||||
echo "$0: failed to acquire lock after $numtries attempts" >&2
|
||||
echo "$0: check lockdir '$lockdir'" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
rm -f "$depfile"
|
||||
# Each line is of the form `foo.o: dependent.h',
|
||||
# or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
|
||||
# Do two passes, one to just change these to
|
||||
# `$object: dependent.h' and one to simply `dependent.h:'.
|
||||
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
|
||||
# Some versions of the HPUX 10.20 sed can't process this invocation
|
||||
# correctly. Breaking it into two sed invocations is a workaround.
|
||||
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
|
||||
| sed -e 's/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
hp2)
|
||||
# The "hp" stanza above does not work with aCC (C++) and HP's ia64
|
||||
# compilers, which have integrated preprocessors. The correct option
|
||||
# to use with these is +Maked; it writes dependencies to a file named
|
||||
# 'foo.d', which lands next to the object file, wherever that
|
||||
# happens to be.
|
||||
# Much of this is similar to the tru64 case; see comments there.
|
||||
set_dir_from "$object"
|
||||
set_base_from "$object"
|
||||
if test "$libtool" = yes; then
|
||||
tmpdepfile1=$dir$base.d
|
||||
tmpdepfile2=$dir.libs/$base.d
|
||||
"$@" -Wc,+Maked
|
||||
else
|
||||
tmpdepfile1=$dir$base.d
|
||||
tmpdepfile2=$dir$base.d
|
||||
"$@" +Maked
|
||||
fi
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile1" "$tmpdepfile2"
|
||||
exit $stat
|
||||
fi
|
||||
|
||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
|
||||
do
|
||||
test -f "$tmpdepfile" && break
|
||||
done
|
||||
if test -f "$tmpdepfile"; then
|
||||
sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
|
||||
# Add 'dependent.h:' lines.
|
||||
sed -ne '2,${
|
||||
s/^ *//
|
||||
s/ \\*$//
|
||||
s/$/:/
|
||||
p
|
||||
}' "$tmpdepfile" >> "$depfile"
|
||||
else
|
||||
make_dummy_depfile
|
||||
fi
|
||||
rm -f "$tmpdepfile" "$tmpdepfile2"
|
||||
;;
|
||||
|
||||
tru64)
|
||||
# The Tru64 compiler uses -MD to generate dependencies as a side
|
||||
# effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
|
||||
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
|
||||
# dependencies in 'foo.d' instead, so we check for that too.
|
||||
# Subdirectories are respected.
|
||||
set_dir_from "$object"
|
||||
set_base_from "$object"
|
||||
|
||||
if test "$libtool" = yes; then
|
||||
# Libtool generates 2 separate objects for the 2 libraries. These
|
||||
# two compilations output dependencies in $dir.libs/$base.o.d and
|
||||
# in $dir$base.o.d. We have to check for both files, because
|
||||
# one of the two compilations can be disabled. We should prefer
|
||||
# $dir$base.o.d over $dir.libs/$base.o.d because the latter is
|
||||
# automatically cleaned when .libs/ is deleted, while ignoring
|
||||
# the former would cause a distcleancheck panic.
|
||||
tmpdepfile1=$dir$base.o.d # libtool 1.5
|
||||
tmpdepfile2=$dir.libs/$base.o.d # Likewise.
|
||||
tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504
|
||||
"$@" -Wc,-MD
|
||||
else
|
||||
tmpdepfile1=$dir$base.d
|
||||
tmpdepfile2=$dir$base.d
|
||||
tmpdepfile3=$dir$base.d
|
||||
"$@" -MD
|
||||
fi
|
||||
|
||||
stat=$?
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||
exit $stat
|
||||
fi
|
||||
|
||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||
do
|
||||
test -f "$tmpdepfile" && break
|
||||
done
|
||||
# Same post-processing that is required for AIX mode.
|
||||
aix_post_process_depfile
|
||||
;;
|
||||
|
||||
msvc7)
|
||||
if test "$libtool" = yes; then
|
||||
showIncludes=-Wc,-showIncludes
|
||||
else
|
||||
showIncludes=-showIncludes
|
||||
fi
|
||||
"$@" $showIncludes > "$tmpdepfile"
|
||||
stat=$?
|
||||
grep -v '^Note: including file: ' "$tmpdepfile"
|
||||
if test $stat -ne 0; then
|
||||
rm -f "$tmpdepfile"
|
||||
exit $stat
|
||||
fi
|
||||
rm -f "$depfile"
|
||||
echo "$object : \\" > "$depfile"
|
||||
# The first sed program below extracts the file names and escapes
|
||||
# backslashes for cygpath. The second sed program outputs the file
|
||||
# name when reading, but also accumulates all include files in the
|
||||
# hold buffer in order to output them again at the end. This only
|
||||
# works with sed implementations that can handle large buffers.
|
||||
sed < "$tmpdepfile" -n '
|
||||
/^Note: including file: *\(.*\)/ {
|
||||
s//\1/
|
||||
s/\\/\\\\/g
|
||||
p
|
||||
}' | $cygpath_u | sort -u | sed -n '
|
||||
s/ /\\ /g
|
||||
s/\(.*\)/'"$tab"'\1 \\/p
|
||||
s/.\(.*\) \\/\1:/
|
||||
H
|
||||
$ {
|
||||
s/.*/'"$tab"'/
|
||||
G
|
||||
p
|
||||
}' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
msvc7msys)
|
||||
# This case exists only to let depend.m4 do its work. It works by
|
||||
# looking at the text of this script. This case will never be run,
|
||||
# since it is checked for above.
|
||||
exit 1
|
||||
;;
|
||||
|
||||
#nosideeffect)
|
||||
# This comment above is used by automake to tell side-effect
|
||||
# dependency tracking mechanisms from slower ones.
|
||||
|
||||
dashmstdout)
|
||||
# Important note: in order to support this mode, a compiler *must*
|
||||
# always write the preprocessed file to stdout, regardless of -o.
|
||||
"$@" || exit $?
|
||||
|
||||
# Remove the call to Libtool.
|
||||
if test "$libtool" = yes; then
|
||||
while test "X$1" != 'X--mode=compile'; do
|
||||
shift
|
||||
done
|
||||
shift
|
||||
fi
|
||||
|
||||
# Remove '-o $object'.
|
||||
IFS=" "
|
||||
for arg
|
||||
do
|
||||
case $arg in
|
||||
-o)
|
||||
shift
|
||||
;;
|
||||
$object)
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set fnord "$@" "$arg"
|
||||
shift # fnord
|
||||
shift # $arg
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
test -z "$dashmflag" && dashmflag=-M
|
||||
# Require at least two characters before searching for ':'
|
||||
# in the target name. This is to cope with DOS-style filenames:
|
||||
# a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
|
||||
"$@" $dashmflag |
|
||||
sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
|
||||
rm -f "$depfile"
|
||||
cat < "$tmpdepfile" > "$depfile"
|
||||
# Some versions of the HPUX 10.20 sed can't process this sed invocation
|
||||
# correctly. Breaking it into two sed invocations is a workaround.
|
||||
tr ' ' "$nl" < "$tmpdepfile" \
|
||||
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
|
||||
| sed -e 's/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
dashXmstdout)
|
||||
# This case only exists to satisfy depend.m4. It is never actually
|
||||
# run, as this mode is specially recognized in the preamble.
|
||||
exit 1
|
||||
;;
|
||||
|
||||
makedepend)
|
||||
"$@" || exit $?
|
||||
# Remove any Libtool call
|
||||
if test "$libtool" = yes; then
|
||||
while test "X$1" != 'X--mode=compile'; do
|
||||
shift
|
||||
done
|
||||
shift
|
||||
fi
|
||||
# X makedepend
|
||||
shift
|
||||
cleared=no eat=no
|
||||
for arg
|
||||
do
|
||||
case $cleared in
|
||||
no)
|
||||
set ""; shift
|
||||
cleared=yes ;;
|
||||
esac
|
||||
if test $eat = yes; then
|
||||
eat=no
|
||||
continue
|
||||
fi
|
||||
case "$arg" in
|
||||
-D*|-I*)
|
||||
set fnord "$@" "$arg"; shift ;;
|
||||
# Strip any option that makedepend may not understand. Remove
|
||||
# the object too, otherwise makedepend will parse it as a source file.
|
||||
-arch)
|
||||
eat=yes ;;
|
||||
-*|$object)
|
||||
;;
|
||||
*)
|
||||
set fnord "$@" "$arg"; shift ;;
|
||||
esac
|
||||
done
|
||||
obj_suffix=`echo "$object" | sed 's/^.*\././'`
|
||||
touch "$tmpdepfile"
|
||||
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
|
||||
rm -f "$depfile"
|
||||
# makedepend may prepend the VPATH from the source file name to the object.
|
||||
# No need to regex-escape $object, excess matching of '.' is harmless.
|
||||
sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
|
||||
# Some versions of the HPUX 10.20 sed can't process the last invocation
|
||||
# correctly. Breaking it into two sed invocations is a workaround.
|
||||
sed '1,2d' "$tmpdepfile" \
|
||||
| tr ' ' "$nl" \
|
||||
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
|
||||
| sed -e 's/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile" "$tmpdepfile".bak
|
||||
;;
|
||||
|
||||
cpp)
|
||||
# Important note: in order to support this mode, a compiler *must*
|
||||
# always write the preprocessed file to stdout.
|
||||
"$@" || exit $?
|
||||
|
||||
# Remove the call to Libtool.
|
||||
if test "$libtool" = yes; then
|
||||
while test "X$1" != 'X--mode=compile'; do
|
||||
shift
|
||||
done
|
||||
shift
|
||||
fi
|
||||
|
||||
# Remove '-o $object'.
|
||||
IFS=" "
|
||||
for arg
|
||||
do
|
||||
case $arg in
|
||||
-o)
|
||||
shift
|
||||
;;
|
||||
$object)
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set fnord "$@" "$arg"
|
||||
shift # fnord
|
||||
shift # $arg
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
"$@" -E \
|
||||
| sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
||||
-e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
||||
| sed '$ s: \\$::' > "$tmpdepfile"
|
||||
rm -f "$depfile"
|
||||
echo "$object : \\" > "$depfile"
|
||||
cat < "$tmpdepfile" >> "$depfile"
|
||||
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
msvisualcpp)
|
||||
# Important note: in order to support this mode, a compiler *must*
|
||||
# always write the preprocessed file to stdout.
|
||||
"$@" || exit $?
|
||||
|
||||
# Remove the call to Libtool.
|
||||
if test "$libtool" = yes; then
|
||||
while test "X$1" != 'X--mode=compile'; do
|
||||
shift
|
||||
done
|
||||
shift
|
||||
fi
|
||||
|
||||
IFS=" "
|
||||
for arg
|
||||
do
|
||||
case "$arg" in
|
||||
-o)
|
||||
shift
|
||||
;;
|
||||
$object)
|
||||
shift
|
||||
;;
|
||||
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
|
||||
set fnord "$@"
|
||||
shift
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
set fnord "$@" "$arg"
|
||||
shift
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
"$@" -E 2>/dev/null |
|
||||
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
|
||||
rm -f "$depfile"
|
||||
echo "$object : \\" > "$depfile"
|
||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
|
||||
echo "$tab" >> "$depfile"
|
||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
|
||||
rm -f "$tmpdepfile"
|
||||
;;
|
||||
|
||||
msvcmsys)
|
||||
# This case exists only to let depend.m4 do its work. It works by
|
||||
# looking at the text of this script. This case will never be run,
|
||||
# since it is checked for above.
|
||||
exit 1
|
||||
;;
|
||||
|
||||
none)
|
||||
exec "$@"
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Unknown depmode $depmode" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
exit 0
|
||||
|
||||
# Local Variables:
|
||||
# mode: shell-script
|
||||
# sh-indentation: 2
|
||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
||||
204
debuggers/openocd/doc/INSTALL.txt
Normal file
204
debuggers/openocd/doc/INSTALL.txt
Normal file
@ -0,0 +1,204 @@
|
||||
TODO!!! this should be merged into openocd.texi!!!
|
||||
|
||||
|
||||
Prerequisites
|
||||
=============
|
||||
|
||||
When building with support for FTDI FT2232 based devices, you need at least
|
||||
one of the following libraries:
|
||||
|
||||
- libftdi (http://www.intra2net.com/opensource/ftdi/)
|
||||
- libftd2xx (http://www.ftdichip.com/Drivers/D2XX.htm)
|
||||
|
||||
On Windows, you need either Cygwin or MinGW, but compilation for MinGW is also
|
||||
possible using a Cygwin host.
|
||||
|
||||
Basic Installation
|
||||
==================
|
||||
|
||||
OpenOCD is distributed without autotools generated files, i.e. without a
|
||||
configure script. Run ./bootstrap in the openocd directory to have all
|
||||
necessary files generated.
|
||||
|
||||
You have to explicitly enable desired JTAG interfaces during configure:
|
||||
|
||||
./configure --enable-parport --enable-ft2232-libftdi (OR --enable-ft2232-ftd2xx) \
|
||||
--enable-amtjtagaccel
|
||||
|
||||
Under Windows/Cygwin, only the ftd2xx driver is supported for FT2232 based
|
||||
devices. You have to specify the location of the FTDI driver package with the
|
||||
--with-ftd2xx=/full/path/name option.
|
||||
|
||||
Under Linux you can choose to build the parport driver with support for
|
||||
/dev/parportN instead of the default access with direct port I/O using
|
||||
--enable-parport_ppdev. This has the advantage of running OpenOCD without root
|
||||
privileges at the expense of a slight performance decrease. This is also
|
||||
available on FreeBSD using PPI, but the naming of the devices is different.
|
||||
|
||||
Generic installation instructions
|
||||
=================================
|
||||
|
||||
These are generic installation instructions.
|
||||
|
||||
The `configure' shell script attempts to guess correct values for
|
||||
various system-dependent variables used during compilation. It uses
|
||||
those values to create a `Makefile' in each directory of the package.
|
||||
It may also create one or more `.h' files containing system-dependent
|
||||
definitions. Finally, it creates a shell script `config.status' that
|
||||
you can run in the future to recreate the current configuration, a file
|
||||
`config.cache' that saves the results of its tests to speed up
|
||||
reconfiguring, and a file `config.log' containing compiler output
|
||||
(useful mainly for debugging `configure').
|
||||
|
||||
If you need to do unusual things to compile the package, please try
|
||||
to figure out how `configure' could check whether to do them, and mail
|
||||
diffs or instructions to the address given in the `README' so they can
|
||||
be considered for the next release. If at some point `config.cache'
|
||||
contains results you don't want to keep, you may remove or edit it.
|
||||
|
||||
The file `configure.in' is used to create `configure' by a program
|
||||
called `autoconf'. You only need `configure.in' if you want to change
|
||||
it or regenerate `configure' using a newer version of `autoconf'.
|
||||
|
||||
The simplest way to compile this package is:
|
||||
|
||||
1. `cd' to the directory containing the package's source code and type
|
||||
`./configure' to configure the package for your system. If you're
|
||||
using `csh' on an old version of System V, you might need to type
|
||||
`sh ./configure' instead to prevent `csh' from trying to execute
|
||||
`configure' itself.
|
||||
|
||||
Running `configure' takes a while. While running, it prints some
|
||||
messages telling which features it is checking for.
|
||||
|
||||
2. Type `make' to compile the package.
|
||||
|
||||
3. Type `make install' to install the programs and any data files and
|
||||
documentation.
|
||||
|
||||
4. You can remove the program binaries and object files from the
|
||||
source code directory by typing `make clean'.
|
||||
|
||||
Compilers and Options
|
||||
=====================
|
||||
|
||||
Some systems require unusual options for compilation or linking that
|
||||
the `configure' script does not know about. You can give `configure'
|
||||
initial values for variables by setting them in the environment. Using
|
||||
a Bourne-compatible shell, you can do that on the command line like
|
||||
this:
|
||||
CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
|
||||
|
||||
Or on systems that have the `env' program, you can do it like this:
|
||||
env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
|
||||
|
||||
Compiling For Multiple Architectures
|
||||
====================================
|
||||
|
||||
You can compile the package for more than one kind of computer at the
|
||||
same time, by placing the object files for each architecture in their
|
||||
own directory. To do this, you must use a version of `make' that
|
||||
supports the `VPATH' variable, such as GNU `make'. `cd' to the
|
||||
directory where you want the object files and executables to go and run
|
||||
the `configure' script. `configure' automatically checks for the
|
||||
source code in the directory that `configure' is in and in `..'.
|
||||
|
||||
If you have to use a `make' that does not supports the `VPATH'
|
||||
variable, you have to compile the package for one architecture at a time
|
||||
in the source code directory. After you have installed the package for
|
||||
one architecture, use `make distclean' before reconfiguring for another
|
||||
architecture.
|
||||
|
||||
Installation Names
|
||||
==================
|
||||
|
||||
By default, `make install' will install the package's files in
|
||||
`/usr/local/bin', `/usr/local/man', etc. You can specify an
|
||||
installation prefix other than `/usr/local' by giving `configure' the
|
||||
option `--prefix=PATH'.
|
||||
|
||||
You can specify separate installation prefixes for
|
||||
architecture-specific files and architecture-independent files. If you
|
||||
give `configure' the option `--exec-prefix=PATH', the package will use
|
||||
PATH as the prefix for installing programs and libraries.
|
||||
Documentation and other data files will still use the regular prefix.
|
||||
|
||||
If the package supports it, you can cause programs to be installed
|
||||
with an extra prefix or suffix on their names by giving `configure' the
|
||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
||||
|
||||
Optional Features
|
||||
=================
|
||||
|
||||
Some packages pay attention to `--enable-FEATURE' options to
|
||||
`configure', where FEATURE indicates an optional part of the package.
|
||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||
is something like `gnu-as' or `x' (for the X Window System). The
|
||||
`README' should mention any `--enable-' and `--with-' options that the
|
||||
package recognizes.
|
||||
|
||||
For packages that use the X Window System, `configure' can usually
|
||||
find the X include and library files automatically, but if it doesn't,
|
||||
you can use the `configure' options `--x-includes=DIR' and
|
||||
`--x-libraries=DIR' to specify their locations.
|
||||
|
||||
Specifying the System Type
|
||||
==========================
|
||||
|
||||
There may be some features `configure' can not figure out
|
||||
automatically, but needs to determine by the type of host the package
|
||||
will run on. Usually `configure' can figure that out, but if it prints
|
||||
a message saying it can not guess the host type, give it the
|
||||
`--host=TYPE' option. TYPE can either be a short name for the system
|
||||
type, such as `sun4', or a canonical name with three fields:
|
||||
CPU-COMPANY-SYSTEM
|
||||
|
||||
See the file `config.sub' for the possible values of each field. If
|
||||
`config.sub' isn't included in this package, then this package doesn't
|
||||
need to know the host type.
|
||||
|
||||
If you are building compiler tools for cross-compiling, you can also
|
||||
use the `--target=TYPE' option to select the type of system they will
|
||||
produce code for and the `--build=TYPE' option to select the type of
|
||||
system on which you are compiling the package.
|
||||
|
||||
Sharing Defaults
|
||||
================
|
||||
|
||||
If you want to set default values for `configure' scripts to share,
|
||||
you can create a site shell script called `config.site' that gives
|
||||
default values for variables like `CC', `cache_file', and `prefix'.
|
||||
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
||||
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||
`CONFIG_SITE' environment variable to the location of the site script.
|
||||
A warning: not all `configure' scripts look for a site script.
|
||||
|
||||
Operation Controls
|
||||
==================
|
||||
|
||||
`configure' recognizes the following options to control how it
|
||||
operates.
|
||||
|
||||
`--cache-file=FILE'
|
||||
Use and save the results of the tests in FILE instead of
|
||||
`./config.cache'. Set FILE to `/dev/null' to disable caching, for
|
||||
debugging `configure'.
|
||||
|
||||
`--help'
|
||||
Print a summary of the options to `configure', and exit.
|
||||
|
||||
`--quiet'
|
||||
`--silent'
|
||||
`-q'
|
||||
Do not print messages saying which checks are being made.
|
||||
|
||||
`--srcdir=DIR'
|
||||
Look for the package's source code in directory DIR. Usually
|
||||
`configure' can determine that directory automatically.
|
||||
|
||||
`--version'
|
||||
Print the version of Autoconf used to generate the `configure'
|
||||
script, and exit.
|
||||
|
||||
`configure' also accepts some other, not widely useful, options.
|
||||
|
||||
20
debuggers/openocd/doc/Makefile.am
Normal file
20
debuggers/openocd/doc/Makefile.am
Normal file
@ -0,0 +1,20 @@
|
||||
info_TEXINFOS = openocd.texi
|
||||
openocd_TEXINFOS = fdl.texi
|
||||
man_MANS = openocd.1
|
||||
EXTRA_DIST = openocd.1 \
|
||||
INSTALL.txt
|
||||
|
||||
dist-hook:
|
||||
mkdir $(distdir)/manual
|
||||
cp -p $(srcdir)/manual/*.txt $(distdir)/manual
|
||||
for i in $$(cd $(srcdir)/manual/ && ls -d */); do \
|
||||
mkdir $(distdir)/manual/$$i; \
|
||||
cp -p $(srcdir)/manual/$$i/* $(distdir)/manual/$$i/; \
|
||||
done
|
||||
|
||||
MAINTAINERCLEANFILES = \
|
||||
$(srcdir)/Makefile.in \
|
||||
$(srcdir)/mdate-sh \
|
||||
$(srcdir)/stamp-vti \
|
||||
$(srcdir)/version.texi \
|
||||
$(srcdir)/texinfo.tex
|
||||
809
debuggers/openocd/doc/Makefile.in
Normal file
809
debuggers/openocd/doc/Makefile.in
Normal file
@ -0,0 +1,809 @@
|
||||
# Makefile.in generated by automake 1.13.1 from Makefile.am.
|
||||
# @configure_input@
|
||||
|
||||
# Copyright (C) 1994-2012 Free Software Foundation, Inc.
|
||||
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE.
|
||||
|
||||
@SET_MAKE@
|
||||
VPATH = @srcdir@
|
||||
am__make_dryrun = \
|
||||
{ \
|
||||
am__dry=no; \
|
||||
case $$MAKEFLAGS in \
|
||||
*\\[\ \ ]*) \
|
||||
echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
|
||||
| grep '^AM OK$$' >/dev/null || am__dry=yes;; \
|
||||
*) \
|
||||
for am__flg in $$MAKEFLAGS; do \
|
||||
case $$am__flg in \
|
||||
*=*|--*) ;; \
|
||||
*n*) am__dry=yes; break;; \
|
||||
esac; \
|
||||
done;; \
|
||||
esac; \
|
||||
test $$am__dry = yes; \
|
||||
}
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||
install_sh_DATA = $(install_sh) -c -m 644
|
||||
install_sh_PROGRAM = $(install_sh) -c
|
||||
install_sh_SCRIPT = $(install_sh) -c
|
||||
INSTALL_HEADER = $(INSTALL_DATA)
|
||||
transform = $(program_transform_name)
|
||||
NORMAL_INSTALL = :
|
||||
PRE_INSTALL = :
|
||||
POST_INSTALL = :
|
||||
NORMAL_UNINSTALL = :
|
||||
PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
subdir = doc
|
||||
DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
|
||||
$(openocd_TEXINFOS) mdate-sh $(srcdir)/version.texi \
|
||||
$(srcdir)/stamp-vti texinfo.tex
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
am__aclocal_m4_deps = $(top_srcdir)/config_subdir.m4 \
|
||||
$(top_srcdir)/configure.ac
|
||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||
$(ACLOCAL_M4)
|
||||
mkinstalldirs = $(install_sh) -d
|
||||
CONFIG_HEADER = $(top_builddir)/config.h
|
||||
CONFIG_CLEAN_FILES =
|
||||
CONFIG_CLEAN_VPATH_FILES =
|
||||
AM_V_P = $(am__v_P_@AM_V@)
|
||||
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
|
||||
am__v_P_0 = false
|
||||
am__v_P_1 = :
|
||||
AM_V_GEN = $(am__v_GEN_@AM_V@)
|
||||
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
|
||||
am__v_GEN_0 = @echo " GEN " $@;
|
||||
am__v_GEN_1 =
|
||||
AM_V_at = $(am__v_at_@AM_V@)
|
||||
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
|
||||
am__v_at_0 = @
|
||||
am__v_at_1 =
|
||||
SOURCES =
|
||||
DIST_SOURCES =
|
||||
AM_V_DVIPS = $(am__v_DVIPS_@AM_V@)
|
||||
am__v_DVIPS_ = $(am__v_DVIPS_@AM_DEFAULT_V@)
|
||||
am__v_DVIPS_0 = @echo " DVIPS " $@;
|
||||
am__v_DVIPS_1 =
|
||||
AM_V_MAKEINFO = $(am__v_MAKEINFO_@AM_V@)
|
||||
am__v_MAKEINFO_ = $(am__v_MAKEINFO_@AM_DEFAULT_V@)
|
||||
am__v_MAKEINFO_0 = @echo " MAKEINFO" $@;
|
||||
am__v_MAKEINFO_1 =
|
||||
AM_V_INFOHTML = $(am__v_INFOHTML_@AM_V@)
|
||||
am__v_INFOHTML_ = $(am__v_INFOHTML_@AM_DEFAULT_V@)
|
||||
am__v_INFOHTML_0 = @echo " INFOHTML" $@;
|
||||
am__v_INFOHTML_1 =
|
||||
AM_V_TEXI2DVI = $(am__v_TEXI2DVI_@AM_V@)
|
||||
am__v_TEXI2DVI_ = $(am__v_TEXI2DVI_@AM_DEFAULT_V@)
|
||||
am__v_TEXI2DVI_0 = @echo " TEXI2DVI" $@;
|
||||
am__v_TEXI2DVI_1 =
|
||||
AM_V_TEXI2PDF = $(am__v_TEXI2PDF_@AM_V@)
|
||||
am__v_TEXI2PDF_ = $(am__v_TEXI2PDF_@AM_DEFAULT_V@)
|
||||
am__v_TEXI2PDF_0 = @echo " TEXI2PDF" $@;
|
||||
am__v_TEXI2PDF_1 =
|
||||
AM_V_texinfo = $(am__v_texinfo_@AM_V@)
|
||||
am__v_texinfo_ = $(am__v_texinfo_@AM_DEFAULT_V@)
|
||||
am__v_texinfo_0 = -q
|
||||
am__v_texinfo_1 =
|
||||
AM_V_texidevnull = $(am__v_texidevnull_@AM_V@)
|
||||
am__v_texidevnull_ = $(am__v_texidevnull_@AM_DEFAULT_V@)
|
||||
am__v_texidevnull_0 = > /dev/null
|
||||
am__v_texidevnull_1 =
|
||||
INFO_DEPS = $(srcdir)/openocd.info
|
||||
am__TEXINFO_TEX_DIR = $(srcdir)
|
||||
DVIS = openocd.dvi
|
||||
PDFS = openocd.pdf
|
||||
PSS = openocd.ps
|
||||
HTMLS = openocd.html
|
||||
TEXINFOS = openocd.texi
|
||||
TEXI2DVI = texi2dvi
|
||||
TEXI2PDF = $(TEXI2DVI) --pdf --batch
|
||||
MAKEINFOHTML = $(MAKEINFO) --html
|
||||
AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS)
|
||||
DVIPS = dvips
|
||||
am__can_run_installinfo = \
|
||||
case $$AM_UPDATE_INFO_DIR in \
|
||||
n|no|NO) false;; \
|
||||
*) (install-info --version) >/dev/null 2>&1;; \
|
||||
esac
|
||||
am__installdirs = "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)"
|
||||
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
||||
am__vpath_adj = case $$p in \
|
||||
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
||||
*) f=$$p;; \
|
||||
esac;
|
||||
am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
|
||||
am__install_max = 40
|
||||
am__nobase_strip_setup = \
|
||||
srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
|
||||
am__nobase_strip = \
|
||||
for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
|
||||
am__nobase_list = $(am__nobase_strip_setup); \
|
||||
for p in $$list; do echo "$$p $$p"; done | \
|
||||
sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
|
||||
$(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
|
||||
if (++n[$$2] == $(am__install_max)) \
|
||||
{ print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
|
||||
END { for (dir in files) print dir, files[dir] }'
|
||||
am__base_list = \
|
||||
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
|
||||
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
|
||||
am__uninstall_files_from_dir = { \
|
||||
test -z "$$files" \
|
||||
|| { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
|
||||
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
|
||||
$(am__cd) "$$dir" && rm -f $$files; }; \
|
||||
}
|
||||
man1dir = $(mandir)/man1
|
||||
NROFF = nroff
|
||||
MANS = $(man_MANS)
|
||||
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
|
||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AMTAR = @AMTAR@
|
||||
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
|
||||
AR = @AR@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
AWK = @AWK@
|
||||
CC = @CC@
|
||||
CCDEPMODE = @CCDEPMODE@
|
||||
CC_FOR_BUILD = @CC_FOR_BUILD@
|
||||
CFLAGS = @CFLAGS@
|
||||
CFLAGS_FOR_BUILD = @CFLAGS_FOR_BUILD@
|
||||
CPP = @CPP@
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
CYGPATH_W = @CYGPATH_W@
|
||||
DEFS = @DEFS@
|
||||
DEPDIR = @DEPDIR@
|
||||
DLLTOOL = @DLLTOOL@
|
||||
DSYMUTIL = @DSYMUTIL@
|
||||
DUMPBIN = @DUMPBIN@
|
||||
ECHO_C = @ECHO_C@
|
||||
ECHO_N = @ECHO_N@
|
||||
ECHO_T = @ECHO_T@
|
||||
EGREP = @EGREP@
|
||||
EXEEXT = @EXEEXT@
|
||||
EXEEXT_FOR_BUILD = @EXEEXT_FOR_BUILD@
|
||||
FGREP = @FGREP@
|
||||
GREP = @GREP@
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
LD = @LD@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBS = @LIBS@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LIBTOOL_DEPS = @LIBTOOL_DEPS@
|
||||
LIPO = @LIPO@
|
||||
LN_S = @LN_S@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAINT = @MAINT@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||
MKDIR_P = @MKDIR_P@
|
||||
NM = @NM@
|
||||
NMEDIT = @NMEDIT@
|
||||
OBJDUMP = @OBJDUMP@
|
||||
OBJEXT = @OBJEXT@
|
||||
OTOOL = @OTOOL@
|
||||
OTOOL64 = @OTOOL64@
|
||||
PACKAGE = @PACKAGE@
|
||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
||||
PACKAGE_NAME = @PACKAGE_NAME@
|
||||
PACKAGE_STRING = @PACKAGE_STRING@
|
||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
||||
PACKAGE_URL = @PACKAGE_URL@
|
||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
||||
RANLIB = @RANLIB@
|
||||
SED = @SED@
|
||||
SET_MAKE = @SET_MAKE@
|
||||
SHELL = @SHELL@
|
||||
STRIP = @STRIP@
|
||||
VERSION = @VERSION@
|
||||
abs_builddir = @abs_builddir@
|
||||
abs_srcdir = @abs_srcdir@
|
||||
abs_top_builddir = @abs_top_builddir@
|
||||
abs_top_srcdir = @abs_top_srcdir@
|
||||
ac_ct_AR = @ac_ct_AR@
|
||||
ac_ct_CC = @ac_ct_CC@
|
||||
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
||||
am__include = @am__include@
|
||||
am__leading_dot = @am__leading_dot@
|
||||
am__quote = @am__quote@
|
||||
am__tar = @am__tar@
|
||||
am__untar = @am__untar@
|
||||
bindir = @bindir@
|
||||
build = @build@
|
||||
build_alias = @build_alias@
|
||||
build_cpu = @build_cpu@
|
||||
build_os = @build_os@
|
||||
build_vendor = @build_vendor@
|
||||
builddir = @builddir@
|
||||
datadir = @datadir@
|
||||
datarootdir = @datarootdir@
|
||||
docdir = @docdir@
|
||||
doxygen_as_html = @doxygen_as_html@
|
||||
doxygen_as_pdf = @doxygen_as_pdf@
|
||||
dvidir = @dvidir@
|
||||
exec_prefix = @exec_prefix@
|
||||
host = @host@
|
||||
host_alias = @host_alias@
|
||||
host_cpu = @host_cpu@
|
||||
host_os = @host_os@
|
||||
host_vendor = @host_vendor@
|
||||
htmldir = @htmldir@
|
||||
includedir = @includedir@
|
||||
infodir = @infodir@
|
||||
install_sh = @install_sh@
|
||||
libdir = @libdir@
|
||||
libexecdir = @libexecdir@
|
||||
localedir = @localedir@
|
||||
localstatedir = @localstatedir@
|
||||
mandir = @mandir@
|
||||
mkdir_p = @mkdir_p@
|
||||
oldincludedir = @oldincludedir@
|
||||
pdfdir = @pdfdir@
|
||||
prefix = @prefix@
|
||||
program_transform_name = @program_transform_name@
|
||||
psdir = @psdir@
|
||||
sbindir = @sbindir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
srcdir = @srcdir@
|
||||
subdirs = @subdirs@
|
||||
sysconfdir = @sysconfdir@
|
||||
target_alias = @target_alias@
|
||||
top_build_prefix = @top_build_prefix@
|
||||
top_builddir = @top_builddir@
|
||||
top_srcdir = @top_srcdir@
|
||||
info_TEXINFOS = openocd.texi
|
||||
openocd_TEXINFOS = fdl.texi
|
||||
man_MANS = openocd.1
|
||||
EXTRA_DIST = openocd.1 \
|
||||
INSTALL.txt
|
||||
|
||||
MAINTAINERCLEANFILES = \
|
||||
$(srcdir)/Makefile.in \
|
||||
$(srcdir)/mdate-sh \
|
||||
$(srcdir)/stamp-vti \
|
||||
$(srcdir)/version.texi \
|
||||
$(srcdir)/texinfo.tex
|
||||
|
||||
all: all-am
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .dvi .html .info .pdf .ps .texi
|
||||
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
|
||||
@for dep in $?; do \
|
||||
case '$(am__configure_deps)' in \
|
||||
*$$dep*) \
|
||||
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
||||
&& { if test -f $@; then exit 0; else break; fi; }; \
|
||||
exit 1;; \
|
||||
esac; \
|
||||
done; \
|
||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \
|
||||
$(am__cd) $(top_srcdir) && \
|
||||
$(AUTOMAKE) --gnu doc/Makefile
|
||||
.PRECIOUS: Makefile
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
@case '$?' in \
|
||||
*config.status*) \
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
||||
*) \
|
||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
||||
esac;
|
||||
|
||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
|
||||
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
|
||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
||||
$(am__aclocal_m4_deps):
|
||||
|
||||
mostlyclean-libtool:
|
||||
-rm -f *.lo
|
||||
|
||||
clean-libtool:
|
||||
-rm -rf .libs _libs
|
||||
|
||||
.texi.info:
|
||||
$(AM_V_MAKEINFO)restore=: && backupdir="$(am__leading_dot)am$$$$" && \
|
||||
am__cwd=`pwd` && $(am__cd) $(srcdir) && \
|
||||
rm -rf $$backupdir && mkdir $$backupdir && \
|
||||
if ($(MAKEINFO) --version) >/dev/null 2>&1; then \
|
||||
for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \
|
||||
if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \
|
||||
done; \
|
||||
else :; fi && \
|
||||
cd "$$am__cwd"; \
|
||||
if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
|
||||
-o $@ $<; \
|
||||
then \
|
||||
rc=0; \
|
||||
$(am__cd) $(srcdir); \
|
||||
else \
|
||||
rc=$$?; \
|
||||
$(am__cd) $(srcdir) && \
|
||||
$$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \
|
||||
fi; \
|
||||
rm -rf $$backupdir; exit $$rc
|
||||
|
||||
.texi.dvi:
|
||||
$(AM_V_TEXI2DVI)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
|
||||
MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
|
||||
$(TEXI2DVI) $(AM_V_texinfo) --build-dir=$(@:.dvi=.t2d) -o $@ $(AM_V_texidevnull) \
|
||||
$<
|
||||
|
||||
.texi.pdf:
|
||||
$(AM_V_TEXI2PDF)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
|
||||
MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
|
||||
$(TEXI2PDF) $(AM_V_texinfo) --build-dir=$(@:.pdf=.t2p) -o $@ $(AM_V_texidevnull) \
|
||||
$<
|
||||
|
||||
.texi.html:
|
||||
$(AM_V_MAKEINFO)rm -rf $(@:.html=.htp)
|
||||
$(AM_V_at)if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
|
||||
-o $(@:.html=.htp) $<; \
|
||||
then \
|
||||
rm -rf $@; \
|
||||
if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
|
||||
mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \
|
||||
else \
|
||||
if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
|
||||
rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \
|
||||
exit 1; \
|
||||
fi
|
||||
$(srcdir)/openocd.info: openocd.texi $(srcdir)/version.texi $(openocd_TEXINFOS)
|
||||
openocd.dvi: openocd.texi $(srcdir)/version.texi $(openocd_TEXINFOS)
|
||||
openocd.pdf: openocd.texi $(srcdir)/version.texi $(openocd_TEXINFOS)
|
||||
openocd.html: openocd.texi $(srcdir)/version.texi $(openocd_TEXINFOS)
|
||||
$(srcdir)/version.texi: @MAINTAINER_MODE_TRUE@ $(srcdir)/stamp-vti
|
||||
$(srcdir)/stamp-vti: openocd.texi $(top_srcdir)/configure
|
||||
@(dir=.; test -f ./openocd.texi || dir=$(srcdir); \
|
||||
set `$(SHELL) $(srcdir)/mdate-sh $$dir/openocd.texi`; \
|
||||
echo "@set UPDATED $$1 $$2 $$3"; \
|
||||
echo "@set UPDATED-MONTH $$2 $$3"; \
|
||||
echo "@set EDITION $(VERSION)"; \
|
||||
echo "@set VERSION $(VERSION)") > vti.tmp
|
||||
@cmp -s vti.tmp $(srcdir)/version.texi \
|
||||
|| (echo "Updating $(srcdir)/version.texi"; \
|
||||
cp vti.tmp $(srcdir)/version.texi)
|
||||
-@rm -f vti.tmp
|
||||
@cp $(srcdir)/version.texi $@
|
||||
|
||||
mostlyclean-vti:
|
||||
-rm -f vti.tmp
|
||||
|
||||
maintainer-clean-vti:
|
||||
@MAINTAINER_MODE_TRUE@ -rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi
|
||||
.dvi.ps:
|
||||
$(AM_V_DVIPS)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
|
||||
$(DVIPS) $(AM_V_texinfo) -o $@ $<
|
||||
|
||||
uninstall-dvi-am:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list='$(DVIS)'; test -n "$(dvidir)" || list=; \
|
||||
for p in $$list; do \
|
||||
$(am__strip_dir) \
|
||||
echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \
|
||||
rm -f "$(DESTDIR)$(dvidir)/$$f"; \
|
||||
done
|
||||
|
||||
uninstall-html-am:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list='$(HTMLS)'; test -n "$(htmldir)" || list=; \
|
||||
for p in $$list; do \
|
||||
$(am__strip_dir) \
|
||||
echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \
|
||||
rm -rf "$(DESTDIR)$(htmldir)/$$f"; \
|
||||
done
|
||||
|
||||
uninstall-info-am:
|
||||
@$(PRE_UNINSTALL)
|
||||
@if test -d '$(DESTDIR)$(infodir)' && $(am__can_run_installinfo); then \
|
||||
list='$(INFO_DEPS)'; \
|
||||
for file in $$list; do \
|
||||
relfile=`echo "$$file" | sed 's|^.*/||'`; \
|
||||
echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \
|
||||
if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \
|
||||
then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \
|
||||
done; \
|
||||
else :; fi
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list='$(INFO_DEPS)'; \
|
||||
for file in $$list; do \
|
||||
relfile=`echo "$$file" | sed 's|^.*/||'`; \
|
||||
relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \
|
||||
(if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \
|
||||
echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \
|
||||
rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \
|
||||
else :; fi); \
|
||||
done
|
||||
|
||||
uninstall-pdf-am:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list='$(PDFS)'; test -n "$(pdfdir)" || list=; \
|
||||
for p in $$list; do \
|
||||
$(am__strip_dir) \
|
||||
echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \
|
||||
rm -f "$(DESTDIR)$(pdfdir)/$$f"; \
|
||||
done
|
||||
|
||||
uninstall-ps-am:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list='$(PSS)'; test -n "$(psdir)" || list=; \
|
||||
for p in $$list; do \
|
||||
$(am__strip_dir) \
|
||||
echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \
|
||||
rm -f "$(DESTDIR)$(psdir)/$$f"; \
|
||||
done
|
||||
|
||||
dist-info: $(INFO_DEPS)
|
||||
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
|
||||
list='$(INFO_DEPS)'; \
|
||||
for base in $$list; do \
|
||||
case $$base in \
|
||||
$(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \
|
||||
esac; \
|
||||
if test -f $$base; then d=.; else d=$(srcdir); fi; \
|
||||
base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \
|
||||
for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \
|
||||
if test -f $$file; then \
|
||||
relfile=`expr "$$file" : "$$d/\(.*\)"`; \
|
||||
test -f "$(distdir)/$$relfile" || \
|
||||
cp -p $$file "$(distdir)/$$relfile"; \
|
||||
else :; fi; \
|
||||
done; \
|
||||
done
|
||||
|
||||
mostlyclean-aminfo:
|
||||
-rm -rf openocd.t2d openocd.t2p
|
||||
|
||||
clean-aminfo:
|
||||
-test -z "openocd.dvi openocd.pdf openocd.ps openocd.html" \
|
||||
|| rm -rf openocd.dvi openocd.pdf openocd.ps openocd.html
|
||||
|
||||
maintainer-clean-aminfo:
|
||||
@list='$(INFO_DEPS)'; for i in $$list; do \
|
||||
i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \
|
||||
echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \
|
||||
rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \
|
||||
done
|
||||
install-man1: $(man_MANS)
|
||||
@$(NORMAL_INSTALL)
|
||||
@list1=''; \
|
||||
list2='$(man_MANS)'; \
|
||||
test -n "$(man1dir)" \
|
||||
&& test -n "`echo $$list1$$list2`" \
|
||||
|| exit 0; \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
|
||||
{ for i in $$list1; do echo "$$i"; done; \
|
||||
if test -n "$$list2"; then \
|
||||
for i in $$list2; do echo "$$i"; done \
|
||||
| sed -n '/\.1[a-z]*$$/p'; \
|
||||
fi; \
|
||||
} | while read p; do \
|
||||
if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
|
||||
echo "$$d$$p"; echo "$$p"; \
|
||||
done | \
|
||||
sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
|
||||
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
|
||||
sed 'N;N;s,\n, ,g' | { \
|
||||
list=; while read file base inst; do \
|
||||
if test "$$base" = "$$inst"; then list="$$list $$file"; else \
|
||||
echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
|
||||
$(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
|
||||
fi; \
|
||||
done; \
|
||||
for i in $$list; do echo "$$i"; done | $(am__base_list) | \
|
||||
while read files; do \
|
||||
test -z "$$files" || { \
|
||||
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
|
||||
$(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
|
||||
done; }
|
||||
|
||||
uninstall-man1:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
@list=''; test -n "$(man1dir)" || exit 0; \
|
||||
files=`{ for i in $$list; do echo "$$i"; done; \
|
||||
l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
|
||||
sed -n '/\.1[a-z]*$$/p'; \
|
||||
} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
|
||||
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
|
||||
dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
|
||||
tags TAGS:
|
||||
|
||||
ctags CTAGS:
|
||||
|
||||
cscope cscopelist:
|
||||
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
||||
list='$(DISTFILES)'; \
|
||||
dist_files=`for file in $$list; do echo $$file; done | \
|
||||
sed -e "s|^$$srcdirstrip/||;t" \
|
||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
||||
case $$dist_files in \
|
||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
||||
sort -u` ;; \
|
||||
esac; \
|
||||
for file in $$dist_files; do \
|
||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
||||
if test -d $$d/$$file; then \
|
||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
||||
if test -d "$(distdir)/$$file"; then \
|
||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||
fi; \
|
||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
||||
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
||||
fi; \
|
||||
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
||||
else \
|
||||
test -f "$(distdir)/$$file" \
|
||||
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
||||
|| exit 1; \
|
||||
fi; \
|
||||
done
|
||||
$(MAKE) $(AM_MAKEFLAGS) \
|
||||
top_distdir="$(top_distdir)" distdir="$(distdir)" \
|
||||
dist-info dist-hook
|
||||
check-am: all-am
|
||||
check: check-am
|
||||
all-am: Makefile $(INFO_DEPS) $(MANS)
|
||||
installdirs:
|
||||
for dir in "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)"; do \
|
||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||
done
|
||||
install: install-am
|
||||
install-exec: install-exec-am
|
||||
install-data: install-data-am
|
||||
uninstall: uninstall-am
|
||||
|
||||
install-am: all-am
|
||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||
|
||||
installcheck: installcheck-am
|
||||
install-strip:
|
||||
if test -z '$(STRIP)'; then \
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
install; \
|
||||
else \
|
||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
||||
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
|
||||
fi
|
||||
mostlyclean-generic:
|
||||
|
||||
clean-generic:
|
||||
|
||||
distclean-generic:
|
||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
||||
|
||||
maintainer-clean-generic:
|
||||
@echo "This command is intended for maintainers to use"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||
clean: clean-am
|
||||
|
||||
clean-am: clean-aminfo clean-generic clean-libtool mostlyclean-am
|
||||
|
||||
distclean: distclean-am
|
||||
-rm -f Makefile
|
||||
distclean-am: clean-am distclean-generic
|
||||
|
||||
dvi: dvi-am
|
||||
|
||||
dvi-am: $(DVIS)
|
||||
|
||||
html: html-am
|
||||
|
||||
html-am: $(HTMLS)
|
||||
|
||||
info: info-am
|
||||
|
||||
info-am: $(INFO_DEPS)
|
||||
|
||||
install-data-am: install-info-am install-man
|
||||
|
||||
install-dvi: install-dvi-am
|
||||
|
||||
install-dvi-am: $(DVIS)
|
||||
@$(NORMAL_INSTALL)
|
||||
@list='$(DVIS)'; test -n "$(dvidir)" || list=; \
|
||||
if test -n "$$list"; then \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(dvidir)'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(dvidir)" || exit 1; \
|
||||
fi; \
|
||||
for p in $$list; do \
|
||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||
echo "$$d$$p"; \
|
||||
done | $(am__base_list) | \
|
||||
while read files; do \
|
||||
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \
|
||||
$(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \
|
||||
done
|
||||
install-exec-am:
|
||||
|
||||
install-html: install-html-am
|
||||
|
||||
install-html-am: $(HTMLS)
|
||||
@$(NORMAL_INSTALL)
|
||||
@list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \
|
||||
if test -n "$$list"; then \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \
|
||||
fi; \
|
||||
for p in $$list; do \
|
||||
if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||
$(am__strip_dir) \
|
||||
d2=$$d$$p; \
|
||||
if test -d "$$d2"; then \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \
|
||||
echo " $(INSTALL_DATA) '$$d2'/* '$(DESTDIR)$(htmldir)/$$f'"; \
|
||||
$(INSTALL_DATA) "$$d2"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \
|
||||
else \
|
||||
list2="$$list2 $$d2"; \
|
||||
fi; \
|
||||
done; \
|
||||
test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \
|
||||
while read files; do \
|
||||
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \
|
||||
$(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \
|
||||
done; }
|
||||
install-info: install-info-am
|
||||
|
||||
install-info-am: $(INFO_DEPS)
|
||||
@$(NORMAL_INSTALL)
|
||||
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
|
||||
list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \
|
||||
if test -n "$$list"; then \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(infodir)'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(infodir)" || exit 1; \
|
||||
fi; \
|
||||
for file in $$list; do \
|
||||
case $$file in \
|
||||
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
|
||||
esac; \
|
||||
if test -f $$file; then d=.; else d=$(srcdir); fi; \
|
||||
file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \
|
||||
for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \
|
||||
$$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \
|
||||
if test -f $$ifile; then \
|
||||
echo "$$ifile"; \
|
||||
else : ; fi; \
|
||||
done; \
|
||||
done | $(am__base_list) | \
|
||||
while read files; do \
|
||||
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \
|
||||
$(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done
|
||||
@$(POST_INSTALL)
|
||||
@if $(am__can_run_installinfo); then \
|
||||
list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \
|
||||
for file in $$list; do \
|
||||
relfile=`echo "$$file" | sed 's|^.*/||'`; \
|
||||
echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\
|
||||
install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\
|
||||
done; \
|
||||
else : ; fi
|
||||
install-man: install-man1
|
||||
|
||||
install-pdf: install-pdf-am
|
||||
|
||||
install-pdf-am: $(PDFS)
|
||||
@$(NORMAL_INSTALL)
|
||||
@list='$(PDFS)'; test -n "$(pdfdir)" || list=; \
|
||||
if test -n "$$list"; then \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(pdfdir)" || exit 1; \
|
||||
fi; \
|
||||
for p in $$list; do \
|
||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||
echo "$$d$$p"; \
|
||||
done | $(am__base_list) | \
|
||||
while read files; do \
|
||||
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \
|
||||
$(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done
|
||||
install-ps: install-ps-am
|
||||
|
||||
install-ps-am: $(PSS)
|
||||
@$(NORMAL_INSTALL)
|
||||
@list='$(PSS)'; test -n "$(psdir)" || list=; \
|
||||
if test -n "$$list"; then \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$(psdir)'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$(psdir)" || exit 1; \
|
||||
fi; \
|
||||
for p in $$list; do \
|
||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||
echo "$$d$$p"; \
|
||||
done | $(am__base_list) | \
|
||||
while read files; do \
|
||||
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \
|
||||
$(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done
|
||||
installcheck-am:
|
||||
|
||||
maintainer-clean: maintainer-clean-am
|
||||
-rm -f Makefile
|
||||
maintainer-clean-am: distclean-am maintainer-clean-aminfo \
|
||||
maintainer-clean-generic maintainer-clean-vti
|
||||
|
||||
mostlyclean: mostlyclean-am
|
||||
|
||||
mostlyclean-am: mostlyclean-aminfo mostlyclean-generic \
|
||||
mostlyclean-libtool mostlyclean-vti
|
||||
|
||||
pdf: pdf-am
|
||||
|
||||
pdf-am: $(PDFS)
|
||||
|
||||
ps: ps-am
|
||||
|
||||
ps-am: $(PSS)
|
||||
|
||||
uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \
|
||||
uninstall-man uninstall-pdf-am uninstall-ps-am
|
||||
|
||||
uninstall-man: uninstall-man1
|
||||
|
||||
.MAKE: install-am install-strip
|
||||
|
||||
.PHONY: all all-am check check-am clean clean-aminfo clean-generic \
|
||||
clean-libtool cscopelist-am ctags-am dist-hook dist-info \
|
||||
distclean distclean-generic distclean-libtool distdir dvi \
|
||||
dvi-am html html-am info info-am install install-am \
|
||||
install-data install-data-am install-dvi install-dvi-am \
|
||||
install-exec install-exec-am install-html install-html-am \
|
||||
install-info install-info-am install-man install-man1 \
|
||||
install-pdf install-pdf-am install-ps install-ps-am \
|
||||
install-strip installcheck installcheck-am installdirs \
|
||||
maintainer-clean maintainer-clean-aminfo \
|
||||
maintainer-clean-generic maintainer-clean-vti mostlyclean \
|
||||
mostlyclean-aminfo mostlyclean-generic mostlyclean-libtool \
|
||||
mostlyclean-vti pdf pdf-am ps ps-am tags-am uninstall \
|
||||
uninstall-am uninstall-dvi-am uninstall-html-am \
|
||||
uninstall-info-am uninstall-man uninstall-man1 \
|
||||
uninstall-pdf-am uninstall-ps-am
|
||||
|
||||
|
||||
dist-hook:
|
||||
mkdir $(distdir)/manual
|
||||
cp -p $(srcdir)/manual/*.txt $(distdir)/manual
|
||||
for i in $$(cd $(srcdir)/manual/ && ls -d */); do \
|
||||
mkdir $(distdir)/manual/$$i; \
|
||||
cp -p $(srcdir)/manual/$$i/* $(distdir)/manual/$$i/; \
|
||||
done
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
.NOEXPORT:
|
||||
452
debuggers/openocd/doc/fdl.texi
Normal file
452
debuggers/openocd/doc/fdl.texi
Normal file
@ -0,0 +1,452 @@
|
||||
@c -*-texinfo-*-
|
||||
@node License
|
||||
@appendix The GNU Free Documentation License.
|
||||
@center Version 1.2, November 2002
|
||||
|
||||
@c This file is intended to be included within another document,
|
||||
@c hence no sectioning command or @node.
|
||||
|
||||
@display
|
||||
Copyright @copyright{} 2000,2001,2002 Free Software Foundation, Inc.
|
||||
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
@end display
|
||||
|
||||
@enumerate 0
|
||||
@item
|
||||
PREAMBLE
|
||||
|
||||
The purpose of this License is to make a manual, textbook, or other
|
||||
functional and useful document @dfn{free} in the sense of freedom: to
|
||||
assure everyone the effective freedom to copy and redistribute it,
|
||||
with or without modifying it, either commercially or noncommercially.
|
||||
Secondarily, this License preserves for the author and publisher a way
|
||||
to get credit for their work, while not being considered responsible
|
||||
for modifications made by others.
|
||||
|
||||
This License is a kind of ``copyleft'', which means that derivative
|
||||
works of the document must themselves be free in the same sense. It
|
||||
complements the GNU General Public License, which is a copyleft
|
||||
license designed for free software.
|
||||
|
||||
We have designed this License in order to use it for manuals for free
|
||||
software, because free software needs free documentation: a free
|
||||
program should come with manuals providing the same freedoms that the
|
||||
software does. But this License is not limited to software manuals;
|
||||
it can be used for any textual work, regardless of subject matter or
|
||||
whether it is published as a printed book. We recommend this License
|
||||
principally for works whose purpose is instruction or reference.
|
||||
|
||||
@item
|
||||
APPLICABILITY AND DEFINITIONS
|
||||
|
||||
This License applies to any manual or other work, in any medium, that
|
||||
contains a notice placed by the copyright holder saying it can be
|
||||
distributed under the terms of this License. Such a notice grants a
|
||||
world-wide, royalty-free license, unlimited in duration, to use that
|
||||
work under the conditions stated herein. The ``Document'', below,
|
||||
refers to any such manual or work. Any member of the public is a
|
||||
licensee, and is addressed as ``you''. You accept the license if you
|
||||
copy, modify or distribute the work in a way requiring permission
|
||||
under copyright law.
|
||||
|
||||
A ``Modified Version'' of the Document means any work containing the
|
||||
Document or a portion of it, either copied verbatim, or with
|
||||
modifications and/or translated into another language.
|
||||
|
||||
A ``Secondary Section'' is a named appendix or a front-matter section
|
||||
of the Document that deals exclusively with the relationship of the
|
||||
publishers or authors of the Document to the Document's overall
|
||||
subject (or to related matters) and contains nothing that could fall
|
||||
directly within that overall subject. (Thus, if the Document is in
|
||||
part a textbook of mathematics, a Secondary Section may not explain
|
||||
any mathematics.) The relationship could be a matter of historical
|
||||
connection with the subject or with related matters, or of legal,
|
||||
commercial, philosophical, ethical or political position regarding
|
||||
them.
|
||||
|
||||
The ``Invariant Sections'' are certain Secondary Sections whose titles
|
||||
are designated, as being those of Invariant Sections, in the notice
|
||||
that says that the Document is released under this License. If a
|
||||
section does not fit the above definition of Secondary then it is not
|
||||
allowed to be designated as Invariant. The Document may contain zero
|
||||
Invariant Sections. If the Document does not identify any Invariant
|
||||
Sections then there are none.
|
||||
|
||||
The ``Cover Texts'' are certain short passages of text that are listed,
|
||||
as Front-Cover Texts or Back-Cover Texts, in the notice that says that
|
||||
the Document is released under this License. A Front-Cover Text may
|
||||
be at most 5 words, and a Back-Cover Text may be at most 25 words.
|
||||
|
||||
A ``Transparent'' copy of the Document means a machine-readable copy,
|
||||
represented in a format whose specification is available to the
|
||||
general public, that is suitable for revising the document
|
||||
straightforwardly with generic text editors or (for images composed of
|
||||
pixels) generic paint programs or (for drawings) some widely available
|
||||
drawing editor, and that is suitable for input to text formatters or
|
||||
for automatic translation to a variety of formats suitable for input
|
||||
to text formatters. A copy made in an otherwise Transparent file
|
||||
format whose markup, or absence of markup, has been arranged to thwart
|
||||
or discourage subsequent modification by readers is not Transparent.
|
||||
An image format is not Transparent if used for any substantial amount
|
||||
of text. A copy that is not ``Transparent'' is called ``Opaque''.
|
||||
|
||||
Examples of suitable formats for Transparent copies include plain
|
||||
@sc{ascii} without markup, Texinfo input format, La@TeX{} input
|
||||
format, @acronym{SGML} or @acronym{XML} using a publicly available
|
||||
@acronym{DTD}, and standard-conforming simple @acronym{HTML},
|
||||
PostScript or @acronym{PDF} designed for human modification. Examples
|
||||
of transparent image formats include @acronym{PNG}, @acronym{XCF} and
|
||||
@acronym{JPG}. Opaque formats include proprietary formats that can be
|
||||
read and edited only by proprietary word processors, @acronym{SGML} or
|
||||
@acronym{XML} for which the @acronym{DTD} and/or processing tools are
|
||||
not generally available, and the machine-generated @acronym{HTML},
|
||||
PostScript or @acronym{PDF} produced by some word processors for
|
||||
output purposes only.
|
||||
|
||||
The ``Title Page'' means, for a printed book, the title page itself,
|
||||
plus such following pages as are needed to hold, legibly, the material
|
||||
this License requires to appear in the title page. For works in
|
||||
formats which do not have any title page as such, ``Title Page'' means
|
||||
the text near the most prominent appearance of the work's title,
|
||||
preceding the beginning of the body of the text.
|
||||
|
||||
A section ``Entitled XYZ'' means a named subunit of the Document whose
|
||||
title either is precisely XYZ or contains XYZ in parentheses following
|
||||
text that translates XYZ in another language. (Here XYZ stands for a
|
||||
specific section name mentioned below, such as ``Acknowledgements'',
|
||||
``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title''
|
||||
of such a section when you modify the Document means that it remains a
|
||||
section ``Entitled XYZ'' according to this definition.
|
||||
|
||||
The Document may include Warranty Disclaimers next to the notice which
|
||||
states that this License applies to the Document. These Warranty
|
||||
Disclaimers are considered to be included by reference in this
|
||||
License, but only as regards disclaiming warranties: any other
|
||||
implication that these Warranty Disclaimers may have is void and has
|
||||
no effect on the meaning of this License.
|
||||
|
||||
@item
|
||||
VERBATIM COPYING
|
||||
|
||||
You may copy and distribute the Document in any medium, either
|
||||
commercially or noncommercially, provided that this License, the
|
||||
copyright notices, and the license notice saying this License applies
|
||||
to the Document are reproduced in all copies, and that you add no other
|
||||
conditions whatsoever to those of this License. You may not use
|
||||
technical measures to obstruct or control the reading or further
|
||||
copying of the copies you make or distribute. However, you may accept
|
||||
compensation in exchange for copies. If you distribute a large enough
|
||||
number of copies you must also follow the conditions in section 3.
|
||||
|
||||
You may also lend copies, under the same conditions stated above, and
|
||||
you may publicly display copies.
|
||||
|
||||
@item
|
||||
COPYING IN QUANTITY
|
||||
|
||||
If you publish printed copies (or copies in media that commonly have
|
||||
printed covers) of the Document, numbering more than 100, and the
|
||||
Document's license notice requires Cover Texts, you must enclose the
|
||||
copies in covers that carry, clearly and legibly, all these Cover
|
||||
Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
|
||||
the back cover. Both covers must also clearly and legibly identify
|
||||
you as the publisher of these copies. The front cover must present
|
||||
the full title with all words of the title equally prominent and
|
||||
visible. You may add other material on the covers in addition.
|
||||
Copying with changes limited to the covers, as long as they preserve
|
||||
the title of the Document and satisfy these conditions, can be treated
|
||||
as verbatim copying in other respects.
|
||||
|
||||
If the required texts for either cover are too voluminous to fit
|
||||
legibly, you should put the first ones listed (as many as fit
|
||||
reasonably) on the actual cover, and continue the rest onto adjacent
|
||||
pages.
|
||||
|
||||
If you publish or distribute Opaque copies of the Document numbering
|
||||
more than 100, you must either include a machine-readable Transparent
|
||||
copy along with each Opaque copy, or state in or with each Opaque copy
|
||||
a computer-network location from which the general network-using
|
||||
public has access to download using public-standard network protocols
|
||||
a complete Transparent copy of the Document, free of added material.
|
||||
If you use the latter option, you must take reasonably prudent steps,
|
||||
when you begin distribution of Opaque copies in quantity, to ensure
|
||||
that this Transparent copy will remain thus accessible at the stated
|
||||
location until at least one year after the last time you distribute an
|
||||
Opaque copy (directly or through your agents or retailers) of that
|
||||
edition to the public.
|
||||
|
||||
It is requested, but not required, that you contact the authors of the
|
||||
Document well before redistributing any large number of copies, to give
|
||||
them a chance to provide you with an updated version of the Document.
|
||||
|
||||
@item
|
||||
MODIFICATIONS
|
||||
|
||||
You may copy and distribute a Modified Version of the Document under
|
||||
the conditions of sections 2 and 3 above, provided that you release
|
||||
the Modified Version under precisely this License, with the Modified
|
||||
Version filling the role of the Document, thus licensing distribution
|
||||
and modification of the Modified Version to whoever possesses a copy
|
||||
of it. In addition, you must do these things in the Modified Version:
|
||||
|
||||
@enumerate A
|
||||
@item
|
||||
Use in the Title Page (and on the covers, if any) a title distinct
|
||||
from that of the Document, and from those of previous versions
|
||||
(which should, if there were any, be listed in the History section
|
||||
of the Document). You may use the same title as a previous version
|
||||
if the original publisher of that version gives permission.
|
||||
|
||||
@item
|
||||
List on the Title Page, as authors, one or more persons or entities
|
||||
responsible for authorship of the modifications in the Modified
|
||||
Version, together with at least five of the principal authors of the
|
||||
Document (all of its principal authors, if it has fewer than five),
|
||||
unless they release you from this requirement.
|
||||
|
||||
@item
|
||||
State on the Title page the name of the publisher of the
|
||||
Modified Version, as the publisher.
|
||||
|
||||
@item
|
||||
Preserve all the copyright notices of the Document.
|
||||
|
||||
@item
|
||||
Add an appropriate copyright notice for your modifications
|
||||
adjacent to the other copyright notices.
|
||||
|
||||
@item
|
||||
Include, immediately after the copyright notices, a license notice
|
||||
giving the public permission to use the Modified Version under the
|
||||
terms of this License, in the form shown in the Addendum below.
|
||||
|
||||
@item
|
||||
Preserve in that license notice the full lists of Invariant Sections
|
||||
and required Cover Texts given in the Document's license notice.
|
||||
|
||||
@item
|
||||
Include an unaltered copy of this License.
|
||||
|
||||
@item
|
||||
Preserve the section Entitled ``History'', Preserve its Title, and add
|
||||
to it an item stating at least the title, year, new authors, and
|
||||
publisher of the Modified Version as given on the Title Page. If
|
||||
there is no section Entitled ``History'' in the Document, create one
|
||||
stating the title, year, authors, and publisher of the Document as
|
||||
given on its Title Page, then add an item describing the Modified
|
||||
Version as stated in the previous sentence.
|
||||
|
||||
@item
|
||||
Preserve the network location, if any, given in the Document for
|
||||
public access to a Transparent copy of the Document, and likewise
|
||||
the network locations given in the Document for previous versions
|
||||
it was based on. These may be placed in the ``History'' section.
|
||||
You may omit a network location for a work that was published at
|
||||
least four years before the Document itself, or if the original
|
||||
publisher of the version it refers to gives permission.
|
||||
|
||||
@item
|
||||
For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
|
||||
the Title of the section, and preserve in the section all the
|
||||
substance and tone of each of the contributor acknowledgements and/or
|
||||
dedications given therein.
|
||||
|
||||
@item
|
||||
Preserve all the Invariant Sections of the Document,
|
||||
unaltered in their text and in their titles. Section numbers
|
||||
or the equivalent are not considered part of the section titles.
|
||||
|
||||
@item
|
||||
Delete any section Entitled ``Endorsements''. Such a section
|
||||
may not be included in the Modified Version.
|
||||
|
||||
@item
|
||||
Do not retitle any existing section to be Entitled ``Endorsements'' or
|
||||
to conflict in title with any Invariant Section.
|
||||
|
||||
@item
|
||||
Preserve any Warranty Disclaimers.
|
||||
@end enumerate
|
||||
|
||||
If the Modified Version includes new front-matter sections or
|
||||
appendices that qualify as Secondary Sections and contain no material
|
||||
copied from the Document, you may at your option designate some or all
|
||||
of these sections as invariant. To do this, add their titles to the
|
||||
list of Invariant Sections in the Modified Version's license notice.
|
||||
These titles must be distinct from any other section titles.
|
||||
|
||||
You may add a section Entitled ``Endorsements'', provided it contains
|
||||
nothing but endorsements of your Modified Version by various
|
||||
parties---for example, statements of peer review or that the text has
|
||||
been approved by an organization as the authoritative definition of a
|
||||
standard.
|
||||
|
||||
You may add a passage of up to five words as a Front-Cover Text, and a
|
||||
passage of up to 25 words as a Back-Cover Text, to the end of the list
|
||||
of Cover Texts in the Modified Version. Only one passage of
|
||||
Front-Cover Text and one of Back-Cover Text may be added by (or
|
||||
through arrangements made by) any one entity. If the Document already
|
||||
includes a cover text for the same cover, previously added by you or
|
||||
by arrangement made by the same entity you are acting on behalf of,
|
||||
you may not add another; but you may replace the old one, on explicit
|
||||
permission from the previous publisher that added the old one.
|
||||
|
||||
The author(s) and publisher(s) of the Document do not by this License
|
||||
give permission to use their names for publicity for or to assert or
|
||||
imply endorsement of any Modified Version.
|
||||
|
||||
@item
|
||||
COMBINING DOCUMENTS
|
||||
|
||||
You may combine the Document with other documents released under this
|
||||
License, under the terms defined in section 4 above for modified
|
||||
versions, provided that you include in the combination all of the
|
||||
Invariant Sections of all of the original documents, unmodified, and
|
||||
list them all as Invariant Sections of your combined work in its
|
||||
license notice, and that you preserve all their Warranty Disclaimers.
|
||||
|
||||
The combined work need only contain one copy of this License, and
|
||||
multiple identical Invariant Sections may be replaced with a single
|
||||
copy. If there are multiple Invariant Sections with the same name but
|
||||
different contents, make the title of each such section unique by
|
||||
adding at the end of it, in parentheses, the name of the original
|
||||
author or publisher of that section if known, or else a unique number.
|
||||
Make the same adjustment to the section titles in the list of
|
||||
Invariant Sections in the license notice of the combined work.
|
||||
|
||||
In the combination, you must combine any sections Entitled ``History''
|
||||
in the various original documents, forming one section Entitled
|
||||
``History''; likewise combine any sections Entitled ``Acknowledgements'',
|
||||
and any sections Entitled ``Dedications''. You must delete all
|
||||
sections Entitled ``Endorsements.''
|
||||
|
||||
@item
|
||||
COLLECTIONS OF DOCUMENTS
|
||||
|
||||
You may make a collection consisting of the Document and other documents
|
||||
released under this License, and replace the individual copies of this
|
||||
License in the various documents with a single copy that is included in
|
||||
the collection, provided that you follow the rules of this License for
|
||||
verbatim copying of each of the documents in all other respects.
|
||||
|
||||
You may extract a single document from such a collection, and distribute
|
||||
it individually under this License, provided you insert a copy of this
|
||||
License into the extracted document, and follow this License in all
|
||||
other respects regarding verbatim copying of that document.
|
||||
|
||||
@item
|
||||
AGGREGATION WITH INDEPENDENT WORKS
|
||||
|
||||
A compilation of the Document or its derivatives with other separate
|
||||
and independent documents or works, in or on a volume of a storage or
|
||||
distribution medium, is called an ``aggregate'' if the copyright
|
||||
resulting from the compilation is not used to limit the legal rights
|
||||
of the compilation's users beyond what the individual works permit.
|
||||
When the Document is included in an aggregate, this License does not
|
||||
apply to the other works in the aggregate which are not themselves
|
||||
derivative works of the Document.
|
||||
|
||||
If the Cover Text requirement of section 3 is applicable to these
|
||||
copies of the Document, then if the Document is less than one half of
|
||||
the entire aggregate, the Document's Cover Texts may be placed on
|
||||
covers that bracket the Document within the aggregate, or the
|
||||
electronic equivalent of covers if the Document is in electronic form.
|
||||
Otherwise they must appear on printed covers that bracket the whole
|
||||
aggregate.
|
||||
|
||||
@item
|
||||
TRANSLATION
|
||||
|
||||
Translation is considered a kind of modification, so you may
|
||||
distribute translations of the Document under the terms of section 4.
|
||||
Replacing Invariant Sections with translations requires special
|
||||
permission from their copyright holders, but you may include
|
||||
translations of some or all Invariant Sections in addition to the
|
||||
original versions of these Invariant Sections. You may include a
|
||||
translation of this License, and all the license notices in the
|
||||
Document, and any Warranty Disclaimers, provided that you also include
|
||||
the original English version of this License and the original versions
|
||||
of those notices and disclaimers. In case of a disagreement between
|
||||
the translation and the original version of this License or a notice
|
||||
or disclaimer, the original version will prevail.
|
||||
|
||||
If a section in the Document is Entitled ``Acknowledgements'',
|
||||
``Dedications'', or ``History'', the requirement (section 4) to Preserve
|
||||
its Title (section 1) will typically require changing the actual
|
||||
title.
|
||||
|
||||
@item
|
||||
TERMINATION
|
||||
|
||||
You may not copy, modify, sublicense, or distribute the Document except
|
||||
as expressly provided for under this License. Any other attempt to
|
||||
copy, modify, sublicense or distribute the Document is void, and will
|
||||
automatically terminate your rights under this License. However,
|
||||
parties who have received copies, or rights, from you under this
|
||||
License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
@item
|
||||
FUTURE REVISIONS OF THIS LICENSE
|
||||
|
||||
The Free Software Foundation may publish new, revised versions
|
||||
of the GNU Free Documentation 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. See
|
||||
@uref{http://www.gnu.org/copyleft/}.
|
||||
|
||||
Each version of the License is given a distinguishing version number.
|
||||
If the Document specifies that a particular numbered version of this
|
||||
License ``or any later version'' applies to it, you have the option of
|
||||
following the terms and conditions either of that specified version or
|
||||
of any later version that has been published (not as a draft) by the
|
||||
Free Software Foundation. If the Document does not specify a version
|
||||
number of this License, you may choose any version ever published (not
|
||||
as a draft) by the Free Software Foundation.
|
||||
@end enumerate
|
||||
|
||||
@unnumberedsec ADDENDUM: How to use this License for your documents
|
||||
|
||||
To use this License in a document you have written, include a copy of
|
||||
the License in the document and put the following copyright and
|
||||
license notices just after the title page:
|
||||
|
||||
@smallexample
|
||||
@group
|
||||
Copyright (C) @var{year} @var{your name}.
|
||||
Permission is granted to copy, distribute and/or modify this document
|
||||
under the terms of the GNU Free Documentation License, Version 1.2
|
||||
or any later version published by the Free Software Foundation;
|
||||
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
|
||||
Texts. A copy of the license is included in the section entitled ``GNU
|
||||
Free Documentation License''.
|
||||
@end group
|
||||
@end smallexample
|
||||
|
||||
If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
|
||||
replace the ``with@dots{}Texts.'' line with this:
|
||||
|
||||
@smallexample
|
||||
@group
|
||||
with the Invariant Sections being @var{list their titles}, with
|
||||
the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
|
||||
being @var{list}.
|
||||
@end group
|
||||
@end smallexample
|
||||
|
||||
If you have Invariant Sections without Cover Texts, or some other
|
||||
combination of the three, merge those two alternatives to suit the
|
||||
situation.
|
||||
|
||||
If your document contains nontrivial examples of program code, we
|
||||
recommend releasing these examples in parallel under your choice of
|
||||
free software license, such as the GNU General Public License,
|
||||
to permit their use in free software.
|
||||
|
||||
@c Local Variables:
|
||||
@c ispell-local-pdict: "ispell-dict"
|
||||
@c End:
|
||||
|
||||
9
debuggers/openocd/doc/manual/app.txt
Normal file
9
debuggers/openocd/doc/manual/app.txt
Normal file
@ -0,0 +1,9 @@
|
||||
/** @page appdocs OpenOCD Application APIs
|
||||
|
||||
The top-level APIs in the OpenOCD library allow applications to integrate
|
||||
all of the low-level functionality using a set of simple function calls.
|
||||
|
||||
These function calls do not exist in a re-usable form, but
|
||||
contributions to create and document them will be welcome.
|
||||
|
||||
*/
|
||||
35
debuggers/openocd/doc/manual/flash.txt
Normal file
35
debuggers/openocd/doc/manual/flash.txt
Normal file
@ -0,0 +1,35 @@
|
||||
/** @page flashdocs OpenOCD Flash APIs
|
||||
|
||||
OpenOCD provides its Flash APIs for developers to support different
|
||||
types of flash devices, some of which are built-in to target devices
|
||||
while others may be connected via standard memory interface (e.g. CFI,
|
||||
FMI, etc.).
|
||||
|
||||
The Flash module provides the following APIs:
|
||||
|
||||
- @subpage flashcfi
|
||||
- @subpage flashnand
|
||||
- @subpage flashtarget
|
||||
|
||||
This section needs to be expanded.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/** @page flashcfi OpenOCD CFI Flash API
|
||||
|
||||
This section needs to be expanded to describe OpenOCD's CFI Flash API.
|
||||
|
||||
*/
|
||||
|
||||
/** @page flashnand OpenOCD NAND Flash API
|
||||
|
||||
This section needs to be expanded to describe OpenOCD's NAND Flash API.
|
||||
|
||||
*/
|
||||
|
||||
/** @page flashtarget OpenOCD Target Flash API
|
||||
|
||||
This section needs to be expanded to describe OpenOCD's Target Flash API.
|
||||
|
||||
*/
|
||||
136
debuggers/openocd/doc/manual/helper.txt
Normal file
136
debuggers/openocd/doc/manual/helper.txt
Normal file
@ -0,0 +1,136 @@
|
||||
/** @page helperdocs OpenOCD Helper APIs
|
||||
|
||||
OpenOCD uses several low-level APIs as the foundation for high-level APIs:
|
||||
|
||||
- @subpage helperporting
|
||||
- @subpage helperjim
|
||||
- @subpage helpercommand
|
||||
- @subpage helperlogging
|
||||
- @subpage helperbuffers
|
||||
|
||||
This section needs to be expanded.
|
||||
|
||||
*/
|
||||
|
||||
/** @page helperporting OpenOCD Types/Portability APIs
|
||||
|
||||
This section needs to be expanded to describe OpenOCD's type and
|
||||
portability API.
|
||||
|
||||
*/
|
||||
|
||||
/** @page helperjim OpenOCD Jim API
|
||||
|
||||
The Jim API provides access to a small-footprint TCL implementation.
|
||||
|
||||
Visit http://jim.berlios.de/ for more information on Jim.
|
||||
|
||||
This section needs to be expanded to describe OpenOCD's Jim API.
|
||||
|
||||
*/
|
||||
|
||||
/** @page helpercommand OpenOCD Command API
|
||||
|
||||
OpenOCD's command API allows modules to register callbacks that are then
|
||||
available to the scripting services. It provides the mechanism for
|
||||
these commands to be dispatched to the modlue using a standard
|
||||
interfaces. It provides macros for defining functions that use and
|
||||
extend this interface.
|
||||
|
||||
@section helpercmdhandler Command Handlers
|
||||
|
||||
Command handlers are functions with a particular signature, which can
|
||||
be extended by modules for passing additional parameters to helpers or
|
||||
another layer of handlers.
|
||||
|
||||
@subsection helpercmdhandlerdef Defining and Calling Command Handlers
|
||||
|
||||
These functions should be defined using the @c COMMAND_HANDLER macro.
|
||||
These methods must be defined as static, as their principle entry point
|
||||
should be the run_command dispatch mechanism.
|
||||
|
||||
Command helper functions that require access to the full set of
|
||||
parameters should be defined using the @c COMMAND_HELPER. These must be
|
||||
declared static by you, as sometimes you might want to share a helper
|
||||
among several files (e.g. @c s3c24xx_nand.h).
|
||||
|
||||
Both types of routines must be called using the @c CALL_COMMAND_HANDLER macro.
|
||||
Calls using this macro to normal handlers require the name of the command
|
||||
handler (which can a name or function pointer). Calls to helpers and
|
||||
derived handlers must pass those extra parameters specified by their
|
||||
definitions; however, lexical capture is used for the core parameters.
|
||||
This dirty trick is being used as a stop-gap measure while the API is
|
||||
migrated to one that passes a pointer to a structure containing the
|
||||
same ingredients. At that point, this macro will be removed and callers
|
||||
will be able to use direct invocations.
|
||||
|
||||
Thus, the following macros can be used to define and call command
|
||||
handlers or helpers:
|
||||
|
||||
- @c COMMAND_HANDLER - declare or define a command handler.
|
||||
- @c COMMAND_HELPER - declare or define a derived command handler or helper.
|
||||
- @c CALL_COMMAND_COMMAND - call a command handler/helper.
|
||||
|
||||
@subsection helpercmdhandlermacros Command Handler Macros
|
||||
|
||||
In addition, the following macros may be used in the context of
|
||||
command handlers and helpers:
|
||||
- @c CMD_CTX - the current @c command_context
|
||||
- @c CMD_NAME - invoked command name
|
||||
- @c CMD_ARGC - the number of command arguments
|
||||
- @c CMD_ARGV - array of command argument strings
|
||||
|
||||
@section helpercmdregister Command Registration
|
||||
|
||||
In order to use a command handler, it must be registered with the
|
||||
command subsystem. All commands are registered with command_registration
|
||||
structures, specifying the name of the command, its handler, its allowed
|
||||
mode(s) of execution, and strings that provide usage and help text.
|
||||
A single handler may be registered using multiple names, but any name
|
||||
may have only one handler associated with it.
|
||||
|
||||
The @c register_commands() and @c register_commands() functions provide
|
||||
registration, while the @c unregister_command() and
|
||||
@c unregister_all_commands() functions will remove existing commands.
|
||||
These may be called at any time, allowing the command set to change in
|
||||
response to system actions.
|
||||
|
||||
@subsection helpercmdjim Jim Command Registration
|
||||
|
||||
The command_registration structure provides support for registering
|
||||
native Jim command handlers (@c jim_handler) too. For these handlers,
|
||||
the module can provide help and usage support; however, this mechanism
|
||||
allows Jim handlers to be called as sub-commands of other commands.
|
||||
These commands may be registered with a private data value (@c
|
||||
jim_handler_data) that will be available when called, as with low-level
|
||||
Jim command registration.
|
||||
|
||||
A command may have a normal @c handler or a @c jim_handler, but not both.
|
||||
|
||||
@subsection helpercmdregisterchains Command Chaining
|
||||
|
||||
When using register_commands(), the array of commands may reference
|
||||
other arrays. When the @c chain field is filled in a
|
||||
command_registration record, the commands on in the chained list will
|
||||
added in one of two places. If the record defines a new command, then
|
||||
the chained commands are added under it; otherwise, the commands are
|
||||
added in the same context as the other commands in the array.
|
||||
|
||||
@section helpercmdprimer Command Development Primer
|
||||
|
||||
This @ref primercommand provides details about the @c hello module,
|
||||
showing how the pieces desrcribed on this page fit together.
|
||||
|
||||
*/
|
||||
|
||||
/** @page helperlogging OpenOCD Logging API
|
||||
|
||||
This section needs to be expanded to describe OpenOCD's Logging API.
|
||||
|
||||
*/
|
||||
|
||||
/** @page helperbuffers OpenOCD Byte Buffer API
|
||||
|
||||
This section needs to be expanded to describe OpenOCD's Byte Buffer API.
|
||||
|
||||
*/
|
||||
73
debuggers/openocd/doc/manual/jtag.txt
Normal file
73
debuggers/openocd/doc/manual/jtag.txt
Normal file
@ -0,0 +1,73 @@
|
||||
/** @page jtagdocs JTAG APIs
|
||||
|
||||
For new developers unfamiliar with the technology, @ref primerjtag provides
|
||||
a brief introduction to the IEEE JTAG interface.
|
||||
|
||||
The OpenOCD JTAG library API covers several functional areas. The jtag
|
||||
@b core communicates through the @b minidriver API with either its full
|
||||
@a driver implementation (src/jtag/jtag_driver.c) or a @a minidriver .
|
||||
Internally, the @b command API is used by the JTAG driver for managing
|
||||
asynchronous transactions.
|
||||
|
||||
- @subpage jtagcore
|
||||
- @b public API routines
|
||||
- declared in @c src/jtag/jtag.h
|
||||
- used by other modules
|
||||
|
||||
- @subpage jtagtcl
|
||||
- @b private TCL handling routines
|
||||
- defined in @c src/jtag/tcl.c
|
||||
- registers and handles Jim commands that configure and use the JTAG core
|
||||
|
||||
- @subpage jtagcmd
|
||||
- @b private command queue API
|
||||
- declared in @c src/jtag/commands.h
|
||||
- provides routines used internally by the full JTAG drivers.
|
||||
|
||||
- @subpage jtagiface
|
||||
- @b private interface driver API
|
||||
- declared in @c src/jtag/interface.h
|
||||
- used by the core, minidrivers, and the full interface device drivers.
|
||||
- allows implementing new interface device drivers.
|
||||
- includes the Cable/TAP API (commands starting with @c tap_)
|
||||
|
||||
- @subpage jtagdriver
|
||||
- @b private minidriver API
|
||||
- declared in @c src/jtag/minidriver.h
|
||||
- used @a only by the core and minidriver implementations:
|
||||
- @c jtag_driver.c (in-tree OpenOCD drivers)
|
||||
- @c zy1000/build/include/jtag_minidriver.h (ZY1000 minidriver)
|
||||
- future implementations (on other embedded hosts)
|
||||
- interface device drivers do @b not need this API.
|
||||
|
||||
*/
|
||||
|
||||
/** @page jtagcore JTAG Core API
|
||||
|
||||
This section needs to be expanded.
|
||||
|
||||
*/
|
||||
|
||||
/** @page jtagtcl JTAG TCL API
|
||||
|
||||
This section needs to be expanded.
|
||||
|
||||
*/
|
||||
|
||||
/** @page jtagcmd JTAG Command API
|
||||
|
||||
This section needs to be expanded.
|
||||
|
||||
*/
|
||||
|
||||
/** @page jtagiface JTAG Interface API
|
||||
|
||||
This section needs to be expanded.
|
||||
|
||||
*/
|
||||
|
||||
/** @page jtagdriver JTAG Minidriver API
|
||||
|
||||
This section needs to be expanded.
|
||||
|
||||
*/
|
||||
105
debuggers/openocd/doc/manual/main.txt
Normal file
105
debuggers/openocd/doc/manual/main.txt
Normal file
@ -0,0 +1,105 @@
|
||||
/** @mainpage OpenOCD Developer's Guide
|
||||
|
||||
Welcome to the OpenOCD Developer's Guide -- the developer's resource for
|
||||
learning about the internal architecture of the OpenOCD project. @par
|
||||
|
||||
In addition, this document contains the tactical and strategic plans
|
||||
and processes that have been developed by and for the OpenOCD community.
|
||||
|
||||
Developers that want to contribute to OpenOCD should read the following
|
||||
sections before starting work:
|
||||
|
||||
- The List of @subpage thelist enumerates opportunities for improving or
|
||||
extending the OpenOCD platform. If your ideas are on The List, you might
|
||||
check the mailing list archives to find the status of your feature (or bug).
|
||||
- The @subpage styleguide provides rules that developers should
|
||||
follow when writing new code for OpenOCD.
|
||||
- The @subpage patchguide provides policies that developers should
|
||||
follow when submitting patches to the project.
|
||||
- The @subpage bugs page contains the content of the BUGS file, which
|
||||
provides instructions for submitting bug reports to the maintainers.
|
||||
- The @subpage releases page describes the project's release process.
|
||||
|
||||
@ref primer provide introductory materials for new developers on various
|
||||
specific topics.
|
||||
|
||||
Finally, the @ref oocd pages explain how the code has been organized
|
||||
into layers of APIs, providing an overview of how they fit together.
|
||||
These pages attempt to give developers a high-level perspective of the
|
||||
various code modules provided by OpenOCD.
|
||||
|
||||
*/
|
||||
|
||||
/** @page primer OpenOCD Technical Primers
|
||||
|
||||
This pages lists Technical Primers available for OpenOCD Developers.
|
||||
They seek to provide information to pull novices up the learning curves
|
||||
associated with the fundamental technologies used by OpenOCD.
|
||||
|
||||
- @subpage primerdocs
|
||||
- @subpage primerautotools
|
||||
- @subpage primertcl
|
||||
- @subpage primerjtag
|
||||
|
||||
The above documents should bridge any "ancillary" gaps in contributor
|
||||
knowledge, without having to learn the complete languages or technology.
|
||||
They should provide enough information for experienced developers to
|
||||
learn how to make "correct" changes when creating patches.
|
||||
|
||||
Beyond the fundamentals, the following primers provide introductory
|
||||
tutorials for OpenOCD's sub-systems. These complement the @ref oocd
|
||||
pages that provide more high-level perspective on related topics.
|
||||
|
||||
- @subpage primercommand
|
||||
|
||||
In all cases, these Primers should use idiomatic conventions that the
|
||||
community has agreed are the "right way of doing things". In this
|
||||
respect, these documents typically assume some familiarity with the
|
||||
information contained in one or more @ref styleguide, or they will
|
||||
directly refer to specific style guides as supplemental reading.
|
||||
|
||||
Contributions or suggestions for new Technical Primers are welcome.
|
||||
|
||||
*/
|
||||
|
||||
/** @page oocd OpenOCD Architecture
|
||||
|
||||
The OpenOCD library consists of several APIs that build together to
|
||||
provide the support functionality. The following list shows how these
|
||||
modules are stacked in the current implementation (from bottom to top):
|
||||
|
||||
- @subpage helperdocs
|
||||
- @ref helperporting
|
||||
- @ref helperjim
|
||||
- @ref helpercommand
|
||||
- @ref helperlogging
|
||||
- @subpage jtagdocs
|
||||
- @ref jtagcore
|
||||
- @ref jtagtcl
|
||||
- @ref jtagcmd
|
||||
- @ref jtagiface
|
||||
- @ref jtagdriver
|
||||
- @subpage targetdocs
|
||||
- @ref targetarm
|
||||
- @ref targetnotarm
|
||||
- @ref targetmips
|
||||
- @ref targetregister
|
||||
- @ref targetimage
|
||||
- @ref targettrace
|
||||
- @subpage flashdocs
|
||||
- @ref flashcfi
|
||||
- @ref flashnand
|
||||
- @ref flashtarget
|
||||
- @subpage serverdocs
|
||||
- @ref servergdb
|
||||
- @ref servertelnet
|
||||
- @ref serverhttp
|
||||
- @subpage appdocs
|
||||
|
||||
Obviously, there are some nuances to the stack that are not shown by
|
||||
this linear list of layers.
|
||||
|
||||
The List of @ref thelist enumerates opportunities for improving or
|
||||
extending the OpenOCD platform.
|
||||
|
||||
*/
|
||||
167
debuggers/openocd/doc/manual/primer/autotools.txt
Normal file
167
debuggers/openocd/doc/manual/primer/autotools.txt
Normal file
@ -0,0 +1,167 @@
|
||||
/** @page primerautotools OpenOCD Autotools Primer
|
||||
|
||||
This page provides an overview to OpenOCD's use of the GNU autotool suite:
|
||||
- @ref primerautoconf
|
||||
- @ref primerautomake
|
||||
- @ref primerlibtool
|
||||
|
||||
Most developers do not need to concern themselves with these tools, as
|
||||
the @ref primerbootstrap script runs these tools in the required sequence.
|
||||
|
||||
@section primerbootstrap Autotools Bootstrap
|
||||
|
||||
The @c bootstrap script should be used by developers to run the
|
||||
autotools in the correct sequence.
|
||||
|
||||
When run after a fresh checkout, this script generates the build files
|
||||
required to compile the project, producing the project configure script.
|
||||
After running @c configure, the @ref primermaintainermode settings will
|
||||
handle most situations that require running these tools again. In some
|
||||
cases, a fresh bootstrap may be still required.
|
||||
|
||||
@subsection primerbootstrapcures Problems Solved By Bootstrap
|
||||
|
||||
For example, the build system can fail in unexpected ways after running
|
||||
<code>git pull</code>. Here, the <code>make maintainer-clean</code>
|
||||
should be used to remove all of the files generated by the @c bootstrap
|
||||
script and subsequent build processes.
|
||||
|
||||
In this particular case, one may also need to remove stray files by hand
|
||||
after running this command to ensure everything is rebuilt properly.
|
||||
This step should be necessary only if the @c maintainer-clean was run
|
||||
@b after altering the build system files with git. If it is run
|
||||
@b before any updates, the build system should never leave artifacts
|
||||
in the tree.
|
||||
|
||||
Without such precautions, changes can be introduced that leave the tree
|
||||
timestamps in an inconsistent state, producing strange compile errors
|
||||
that are resolve after such diligence.
|
||||
|
||||
@subsection primermaintainerclean Autotools Cleaning
|
||||
|
||||
Normally, all files generated by the bootstrap script, configure
|
||||
process, and build system should be removed after running <code>make
|
||||
maintainer-clean</code>. Automatically generated files that remain
|
||||
after this should be listed in @c MAINTAINERCLEANFILES,
|
||||
@c DISTCLEANFILES, or @c CLEANFILES, depending on which stage of the
|
||||
build process they are produced.
|
||||
|
||||
@section primerautoconf Autoconf Configuration Script
|
||||
|
||||
The @c autoconf program generates the @c configure script from
|
||||
@c configure.in, using serious Perl voodoo. The resulting script is
|
||||
included in the project distribution packages and run by users to
|
||||
configure the build process for their system.
|
||||
|
||||
@subsection primermaintainermode Maintainer Mode
|
||||
|
||||
After a fresh checkout, @c bootstrap, and a simple @c configure, you may
|
||||
experience errors when running @c make that some files cannot be found
|
||||
(e.g. @c version.texi), and a second @c make will "mysteriously" solve
|
||||
the problems. The isssue is well-known and expected, if unfortunate.
|
||||
|
||||
The OpenOCD project requires that all developers building from the
|
||||
git repository use the @c --enable-maintainer-mode option when
|
||||
running the @c configure script. This option ensures that certain files
|
||||
are created during the build process that would normally be packaged in
|
||||
the distribution tarball. The @c bootstrap script will remind you of
|
||||
this requirement when it runs.
|
||||
|
||||
In addition to solving these problems, this option enables Makefile
|
||||
rules (provided by automake) that allow the normal @c make process to
|
||||
rebuild the autotools outputs, included the automake-generated Makefiles
|
||||
themselves. This avoids the heavy-handed approach of running the
|
||||
@c bootstrap script after changing one of these files.
|
||||
|
||||
@section primerautomake Automake Makefiles
|
||||
|
||||
The @c automake program generates @c Makefile.in files (from @c
|
||||
Makefile.am files). These files are later processed by the configure
|
||||
script produced by @c autoconf.
|
||||
|
||||
@subsection primerautomakenewfiles Creating Makefile.am Files
|
||||
|
||||
This section shows how to add a @c Makefile.am in a new directory (or
|
||||
one that lacks one).
|
||||
-# The new directory must be listed in the @c SUBDIRS variable in the
|
||||
parent directory's Makefile.am:
|
||||
@code
|
||||
$ echo 'SUBDIRS += directory' >>../Makefile.am
|
||||
@endcode
|
||||
-# Create an bare-bones Makefile.am file in directory that needs it:
|
||||
@code
|
||||
$ echo "MAINTAINERCLEANFILES = Makefile.in" >Makefile.am
|
||||
@endcode
|
||||
-# The @c configure.in script must be updated, so it generates the required
|
||||
Makefile when the @a configure script is run by the user:
|
||||
@verbatim
|
||||
AC_OUTPUT([
|
||||
...
|
||||
path/to/new/Makefile
|
||||
])
|
||||
@endverbatim
|
||||
|
||||
Note: these instructions are @b not meant to be used literally, rather
|
||||
they are shown for demonstration purposes.
|
||||
|
||||
The default MAINTAINERCLEANFILES rule ensures that the
|
||||
automake-generated @c Makefile.in file will be removed when developers
|
||||
run <code>make maintainer-clean</code>. Additional rules may be added
|
||||
after this; however, the project should bootstrap and tear down cleanly
|
||||
after taking these minimal steps, with the new directory being visited
|
||||
during the @c make sequence.
|
||||
|
||||
@subsection primerautomaketweaks Updating Makefile.am Files
|
||||
|
||||
Adding, removing, and renaming files from the project tree usually
|
||||
requires updating the autotools inputs. This section will help describe
|
||||
how to do this as questions arise.
|
||||
|
||||
@section primerlibtool Libtool and Libraries
|
||||
|
||||
The @c libtool program provides the means of generating libraries in a
|
||||
portable and painless manner (relatively speaking).
|
||||
|
||||
This section will contain an answer to "what does libtool give OpenOCD?"
|
||||
and "what do developers need to consider in new code?"
|
||||
|
||||
@section primerautotoolsmation Autotools Automation
|
||||
|
||||
This section outlines three ways the autotools provides automation to
|
||||
assist with testing and distribution:
|
||||
- @ref primerautocheck -- automatic unit and smoke tests
|
||||
- @ref primerautodistcheck -- automatic distribution and packaging tests
|
||||
|
||||
@subsection primerautocheck make check
|
||||
|
||||
The <code>make check</code> command will run the OpenOCD test suite,
|
||||
once it has been integrated as such. This section will contain
|
||||
information about how to extend the testing build system components to
|
||||
implement new checks.
|
||||
|
||||
@subsection primerautodistcheck make distcheck
|
||||
|
||||
The <code>make distcheck</code> command produces an archive of the
|
||||
project deliverables (using <code>make dist</code>) and verifies its
|
||||
integrity for distribution by attemptng to use the package in the same
|
||||
manner as a user.
|
||||
|
||||
These checks includes the following steps:
|
||||
-# Unpack the project archive into its expected directory.
|
||||
-# Configure and build the project in a temporary out-of-tree directory.
|
||||
-# Run <code>make check</code> to ensure the distributed code passes all tests.
|
||||
-# Run <code>make install</code> into a temporary installation directory.
|
||||
-# Check that <code>make uninstall</code> removes all files that were installed.
|
||||
-# Check that <code>make distclean</code> removes all files created
|
||||
during all other steps (except the first).
|
||||
|
||||
If all of these steps complete successfully, the @c make process will
|
||||
output a friendly message indicating the archive is ready to be
|
||||
distributed.
|
||||
|
||||
*/
|
||||
/** @file
|
||||
|
||||
This file contains the @ref primerautotools page.
|
||||
|
||||
*/
|
||||
138
debuggers/openocd/doc/manual/primer/commands.txt
Normal file
138
debuggers/openocd/doc/manual/primer/commands.txt
Normal file
@ -0,0 +1,138 @@
|
||||
/** @page primercommand Command Development Primer
|
||||
|
||||
This page provides a primer for writing commands by introducing @c hello
|
||||
module. The full source code used in this example can be found in
|
||||
hello.c, and the @ref primercmdcode section shows how to use it.
|
||||
|
||||
A summary of this information can be found in @ref helpercommand .
|
||||
|
||||
@section primercmdhandler Command Handlers
|
||||
|
||||
Defining new commands and their helpers is easy. The following code
|
||||
defines a simple command handler that delegates its argument parsing:
|
||||
@code
|
||||
COMMAND_HANDLER(handle_hello_command)
|
||||
{
|
||||
const char *sep, *name;
|
||||
int retval = CALL_COMMAND_HANDLER(handle_hello_args);
|
||||
if (ERROR_OK == retval)
|
||||
command_print(CMD_CTX, "Greetings%s%s!", sep, name);
|
||||
return retval;
|
||||
}
|
||||
@endcode
|
||||
|
||||
Here, the @c COMMAND_HANDLER macro establishes the function signature,
|
||||
see in command.h by the @c __COMMAND_HANDLER macro.
|
||||
|
||||
The COMMAND_HELPER macro function allows defining functions with an
|
||||
extended version of the base signature. These helper functions can be
|
||||
called (with the appropriate parameters), the @c CALL_COMMAND_HANDLER
|
||||
macro to pass any e as parameters to the following helper function:
|
||||
|
||||
The subsequent blocks of code are a normal C function that can do
|
||||
anything, so only complex commands deserve should use comamnd helper
|
||||
functions. In this respect, this example uses one to demonstrate how --
|
||||
not when -- they should be used.
|
||||
|
||||
@code
|
||||
static COMMAND_HELPER(handle_hello_args, const char **sep, const char **name)
|
||||
{
|
||||
if (argc > 1)
|
||||
{
|
||||
LOG_ERROR("%s: too many arguments", CMD_NAME);
|
||||
return ERROR_COMMAND_SYNTAX_ERROR;
|
||||
}
|
||||
if (1 == CMD_ARGC)
|
||||
{
|
||||
*sep = ", ";
|
||||
*name = CMD_ARGV[0];
|
||||
}
|
||||
else
|
||||
*sep = *name = "";
|
||||
|
||||
return ERROR_OK;
|
||||
}
|
||||
@endcode
|
||||
|
||||
Of course, you may also call other macros or functions, but that extends
|
||||
beyond the scope of this tutorial on writing commands.
|
||||
|
||||
@section primercmdreg Command Registration
|
||||
|
||||
Before this new function can be used, it must be registered somehow.
|
||||
For a new module, registering should be done in a new function for
|
||||
the purpose, which must be called from @c openocd.c:
|
||||
@code
|
||||
|
||||
static const struct command_registration hello_command_handlers[] = {
|
||||
{
|
||||
.name = "hello",
|
||||
.mode = COMMAND_ANY,
|
||||
.handler = handle_hello_command,
|
||||
.help = "print a warm greeting",
|
||||
.usage = "[name]",
|
||||
},
|
||||
{
|
||||
.chain = foo_command_handlers,
|
||||
}
|
||||
COMMAND_REGISTRATION_DONE
|
||||
};
|
||||
|
||||
int hello_register_commands(struct command_context_s *cmd_ctx)
|
||||
{
|
||||
return register_commands(cmd_ctx, NULL, handle_command_handlers);
|
||||
}
|
||||
@endcode
|
||||
|
||||
Note that the "usage" text should use the same EBNF that's found
|
||||
in the User's Guide: literals in 'single quotes', sequences of
|
||||
optional parameters in [square brackets], and alternatives in
|
||||
(parentheses|with|vertical bars), and so forth. No angle brackets.
|
||||
|
||||
That's it! The command should now be registered and available to scripts.
|
||||
|
||||
@section primercmdchain Command Chaining
|
||||
|
||||
This example also shows how to chain command handler registration, so
|
||||
your modules can "inherit" commands provided by other (sub)modules.
|
||||
Here, the hello module includes the foo commands in the same context
|
||||
that the 'hello' command will be registered.
|
||||
|
||||
If the @c chain field had been put in the 'hello' command, then the
|
||||
@c foo module commands would be registered under it. Indeed, that
|
||||
technique is used to define the 'foo bar' and 'foo baz' commands,
|
||||
as well as for the example drivers that use these modules.
|
||||
|
||||
The code for the 'foo' command handlers can be found in @c hello.c.
|
||||
|
||||
@section primercmdcode Trying These Example Commands
|
||||
|
||||
These commands have been inherited by the dummy interface, faux flash,
|
||||
and testee target drivers. The easiest way to test these is by using the
|
||||
dummy interface.
|
||||
|
||||
Once OpenOCD has been built with this example code, the following command
|
||||
demonstrates the abilities that the @c hello module provides:
|
||||
@code
|
||||
openocd -c 'interface dummy' \
|
||||
-c 'dummy hello' \
|
||||
-c 'dummy hello World' \
|
||||
-c 'dummy hello {John Doe}' \
|
||||
-c 'dummy hello John Doe' # error: too many arguments
|
||||
@endcode
|
||||
|
||||
If saved in @c hello.cfg, then running <code>openocd -f hello.cfg</code>
|
||||
should produce the following output before displaying the help text and
|
||||
exiting:
|
||||
@code
|
||||
Greetings!
|
||||
Greetings, World!
|
||||
Greetings, John Doe!
|
||||
Error: hello: too many arguments
|
||||
Runtime error, file "openocd.cfg", line 14:
|
||||
hello: too many arguments
|
||||
dummy hello [<name>]
|
||||
prints a warm welcome
|
||||
@endcode
|
||||
|
||||
*/
|
||||
124
debuggers/openocd/doc/manual/primer/docs.txt
Normal file
124
debuggers/openocd/doc/manual/primer/docs.txt
Normal file
@ -0,0 +1,124 @@
|
||||
/** @page primerdocs OpenOCD Documentation Primers
|
||||
|
||||
This page provides an introduction to OpenOCD's documentation processes.
|
||||
|
||||
OpenOCD presently produces several kinds of documentation:
|
||||
- The User's Guide:
|
||||
- Focuses on using the OpenOCD software.
|
||||
- Details the installation, usage, and customization.
|
||||
- Provides descriptions of public Jim/TCL script commands.
|
||||
- Written using GNU texinfo.
|
||||
- Created with 'make pdf' or 'make html'.
|
||||
- See @subpage primertexinfo and @ref styletexinfo.
|
||||
- The References: (as proposed)
|
||||
- Focuses on using specific hardware with OpenOCD.
|
||||
- Details the supported interfaces, chips, boards, and targets.
|
||||
- Provides overview, usage, reference, and FAQ for each device.
|
||||
- Written using LaTeX language with custom macros.
|
||||
- Created with 'make references'.
|
||||
- See @subpage primerlatex and @ref stylelatex.
|
||||
- The Manual:
|
||||
- Focuses on developing the OpenOCD software.
|
||||
- Details the architecutre, driver interfaces, and processes.
|
||||
- Provides "full" coverage of C source code (work-in-progress).
|
||||
- Written using Doxygen C language conventions (i.e. in comments).
|
||||
- Created with 'make doxygen'.
|
||||
- See @subpage primerdoxygen and @ref styledoxygen.
|
||||
|
||||
The following sections provide more information for anyone that wants to
|
||||
contribute new or updated documentation to the OpenOCD project.
|
||||
|
||||
*/
|
||||
/** @page primertexinfo Texinfo Primer
|
||||
|
||||
The OpenOCD User's Guide presently exists entirely within the
|
||||
doc/openocd.texi document. That file contains documentation with
|
||||
mark-up suitable for being parsed by the GNU Texinfo utilities
|
||||
(http://www.gnu.org/software/texinfo/).
|
||||
|
||||
When you add a new command, driver, or driver option, it needs to be
|
||||
documented in the User's Guide. Use the existing documentation for
|
||||
models, but feel free to make better use of Texinfo mechanisms. See
|
||||
the Texinfo web site for the Texinfo manual and more information.
|
||||
|
||||
OpenOCD style guidelines for Texinfo documentation can be found on the
|
||||
@ref styletexinfo page.
|
||||
|
||||
*/
|
||||
/** @page primerlatex LaTeX Primer
|
||||
|
||||
The OpenOCD project provides a number of reference guides using the
|
||||
LaTeX typesetting language.
|
||||
|
||||
- OpenOCD Quick Reference Sheets
|
||||
- OpenOCD Hardware Reference Guides
|
||||
|
||||
These documents have not yet been produced, so this Primer serves as
|
||||
a placeholder to describe how they are created and can be extended.
|
||||
The same holds true for the @ref stylelatex page.
|
||||
|
||||
*/
|
||||
/** @page primerdoxygen Doxygen Primer
|
||||
|
||||
Doxygen-style comments are used to provide documentation in-line with
|
||||
the OpenOCD source code. These comments are used to document functions,
|
||||
variables, structs, enums, fields, and everything else that might need
|
||||
to be documented for developers. Additional files containing comments
|
||||
that supplement the code comments in order to provide complete developer
|
||||
documentation.
|
||||
|
||||
Even if you already know Doxygen, please read this Primer to learn
|
||||
how OpenOCD developers already use Doxygen features in the project tree.
|
||||
For more information about OpenOCD's required style for using Doxygen,
|
||||
see the @ref styledoxygen page and look at existing documentation in the
|
||||
@c doc/manual tree.
|
||||
|
||||
@section primerdoxytext Doxygen Input Files
|
||||
|
||||
Doxygen has been configured parse all of the C source code files (*.c
|
||||
and *.h) in @c src/ in order to produce a complete reference of all
|
||||
OpenOCD project symbols. In addition to the source code files, other
|
||||
files will also be scanned for comment blocks; some are referenced
|
||||
explicitly by the @c INPUT variable in the Doxygen configuration file.
|
||||
|
||||
By default, the Doxygen configuration enables a "full" set of features,
|
||||
including generation of dependency graphs (using the GraphViz package).
|
||||
These features may be disabled by editing the @c Doxyfile.in file at the
|
||||
top of the project tree; the configuration file includes comments that
|
||||
provide detailed documentation for each option.
|
||||
|
||||
To support out-of-tree building of the documentation, the @c Doxyfile.in
|
||||
@c INPUT values will have all instances of the string @c "@srcdir@"
|
||||
replaced with the current value of the make variable
|
||||
<code>$(srcdir)</code>. The Makefile uses a rule to convert
|
||||
@c Doxyfile.in into the @c Doxyfile used by <code>make doxygen</code>.
|
||||
|
||||
@section primerdoxyoocd OpenOCD Input Files
|
||||
|
||||
OpenOCD uses the @c INPUT mechanism to include additional documentation to
|
||||
provide The Manual for OpenOCD Developers. These extra files contain
|
||||
high-level information intended to supplement the relatively low-level
|
||||
documentation that gets extracted from the source code comments.
|
||||
|
||||
OpenOCD's Doxygen configuration file will search for all @c .txt files
|
||||
that can be found under the @c doc/manual directory in the project tree.
|
||||
New files containing valid Doxygen markup that are placed in or under
|
||||
that directory will be detected and included in The Manual automatically.
|
||||
|
||||
@section primerdoxyman Doxygen Reference Manual
|
||||
|
||||
The full documentation for Doxygen can be referenced on-line at the project
|
||||
home page: http://www.doxygen.org/index.html. In HTML versions of this
|
||||
document, an image with a link to this site appears in the page footer.
|
||||
|
||||
*/
|
||||
/** @file
|
||||
|
||||
This file contains the Doxygen source code for the @ref primerdocs.
|
||||
The @ref primerdocs page also contains the following sections:
|
||||
|
||||
- @ref primertexinfo
|
||||
- @ref primerlatex
|
||||
- @ref primerdoxygen
|
||||
|
||||
*/
|
||||
170
debuggers/openocd/doc/manual/primer/jtag.txt
Normal file
170
debuggers/openocd/doc/manual/primer/jtag.txt
Normal file
@ -0,0 +1,170 @@
|
||||
/** @page primerjtag OpenOCD JTAG Primer
|
||||
|
||||
JTAG is unnecessarily confusing, because JTAG is often confused with
|
||||
boundary scan, which is just one of its possible functions.
|
||||
|
||||
JTAG is simply a communication interface designed to allow communication
|
||||
to functions contained on devices, for the designed purposes of
|
||||
initialisation, programming, testing, debugging, and anything else you
|
||||
want to use it for (as a chip designer).
|
||||
|
||||
Think of JTAG as I2C for testing. It doesn't define what it can do,
|
||||
just a logical interface that allows a uniform channel for communication.
|
||||
|
||||
See @par
|
||||
http://en.wikipedia.org/wiki/Joint_Test_Action_Group
|
||||
|
||||
and @par
|
||||
http://www.inaccessnetworks.com/projects/ianjtag/jtag-intro/jtag-state-machine-large.png
|
||||
|
||||
The first page (among other things) shows a logical representation
|
||||
describing how multiple devices are wired up using JTAG. JTAG does not
|
||||
specify, data rates or interface levels (3.3V/1.8V, etc) each device can
|
||||
support different data rates/interface logic levels. How to wire them
|
||||
in a compatible way is an exercise for an engineer.
|
||||
|
||||
Basically TMS controls which shift register is placed on the device,
|
||||
between TDI and TDO. The second diagram shows the state transitions on
|
||||
TMS which will select different shift registers.
|
||||
|
||||
The first thing you need to do is reset the state machine, because when
|
||||
you connect to a chip you do not know what state the controller is in,you need
|
||||
to clock TMS as 1, at least 5 times. This will put you into "Test Logic
|
||||
Reset" State. Knowing this, you can, once reset, then track what each
|
||||
transition on TMS will do, and hence know what state the JTAG state
|
||||
machine is in.
|
||||
|
||||
There are 2 "types" of shift registers. The Instruction shift register
|
||||
and the data shift register. The sizes of these are undefined, and can
|
||||
change from chip to chip. The Instruction register is used to select
|
||||
which Data register/data register function is used, and the data
|
||||
register is used to read data from that function or write data to it.
|
||||
|
||||
Each of the states control what happens to either the data register or
|
||||
instruction register.
|
||||
|
||||
For example, one of the data registers will be known as "bypass" this is
|
||||
(usually) a single bit which has no function and is used to bypass the
|
||||
chip. Assume we have 3 identical chips, wired up like the picture(wikipedia)
|
||||
and each has a 3 bits instruction register, and there are 2 known
|
||||
instructions (110 = bypass, 010 = "some other function") if we want to use
|
||||
"some other function", on the second chip in the line, and not change
|
||||
the other chips we would do the following transitions.
|
||||
|
||||
From Test Logic Reset, TMS goes:
|
||||
|
||||
0 1 1 0 0
|
||||
|
||||
which puts every chip in the chain into the "Shift IR state"
|
||||
Then (while holding TMS as 0) TDI goes:
|
||||
|
||||
0 1 1 0 1 0 0 1 1
|
||||
|
||||
which puts the following values in the instruction shift register for
|
||||
each chip [110] [010] [110]
|
||||
|
||||
The order is reversed, because we shift out the least significant bit
|
||||
first. Then we transition TMS:
|
||||
|
||||
1 1 1 0 0
|
||||
|
||||
which puts us in the "Shift DR state".
|
||||
|
||||
Now when we clock data onto TDI (again while holding TMS to 0) , the
|
||||
data shifts through the data registers, and because of the instruction
|
||||
registers we selected ("some other function" has 8 bits in its data
|
||||
register), our total data register in the chain looks like this:
|
||||
|
||||
0 00000000 0
|
||||
|
||||
The first and last bit are in the "bypassed" chips, so values read from
|
||||
them are irrelevant and data written to them is ignored. But we need to
|
||||
write bits for those registers, because they are in the chain.
|
||||
|
||||
If we wanted to write 0xF5 to the data register we would clock out of
|
||||
TDI (holding TMS to 0):
|
||||
|
||||
0 1 0 1 0 1 1 1 1 0
|
||||
|
||||
Again, we are clocking the least-significant bit first. Then we would
|
||||
clock TMS:
|
||||
|
||||
1 1 0
|
||||
|
||||
which updates the selected data register with the value 0xF5 and returns
|
||||
us to run test idle.
|
||||
|
||||
If we needed to read the data register before over-writing it with F5,
|
||||
no sweat, that's already done, because the TDI/TDO are set up as a
|
||||
circular shift register, so if you write enough bits to fill the shift
|
||||
register, you will receive the "captured" contents of the data registers
|
||||
simultaneously on TDO.
|
||||
|
||||
That's JTAG in a nutshell. On top of this, you need to get specs for
|
||||
target chips and work out what the various instruction registers/data
|
||||
registers do, so you can actually do something useful. That's where it
|
||||
gets interesting. But in and of itself, JTAG is actually very simple.
|
||||
|
||||
@section primerjtag More Reading
|
||||
|
||||
A separate primer contains information about @subpage primerjtagbs for
|
||||
developers that want to extend OpenOCD for such purposes.
|
||||
|
||||
*/
|
||||
/** @page primerjtagbs JTAG Boundary Scan Primer
|
||||
|
||||
The following page provides an introduction on JTAG that focuses on its
|
||||
boundary scan capabilities: @par
|
||||
http://www.engr.udayton.edu/faculty/jloomis/ece446/notes/jtag/jtag1.html
|
||||
|
||||
OpenOCD does not presently have clear means of using JTAG for boundary
|
||||
scan testing purposes; however, some developers have explored the
|
||||
possibilities. The page contains information that may be useful to
|
||||
those wishing to implement boundary scan capabilities in OpenOCD.
|
||||
|
||||
@section primerbsdl The BSDL Language
|
||||
|
||||
For more information on the Boundary Scan Description Language (BSDL),
|
||||
the following page provides a good introduction: @par
|
||||
http://www.radio-electronics.com/info/t_and_m/boundaryscan/bsdl.php
|
||||
|
||||
@section primerbsdlvendors Vendor BSDL Files
|
||||
|
||||
NXP LPC: @par
|
||||
http://www.standardics.nxp.com/support/models/lpc2000/
|
||||
|
||||
Freescale PowerPC: @par
|
||||
http://www.freescale.com/webapp/sps/site/overview.jsp?code=DRPPCBSDLFLS
|
||||
|
||||
Freescale i.MX1 (too old): @par
|
||||
http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=i.MX1&nodeId=0162468rH311432973ZrDR&fpsp=1&tab=Design_Tools_Tab
|
||||
|
||||
Renesas R32C/117: @par
|
||||
http://sg.renesas.com/fmwk.jsp?cnt=r32c116_7_8_root.jsp&fp=/products/mpumcu/m16c_family/r32c100_series/r32c116_7_8_group/
|
||||
- The device page does not come with BSDL file; you have to register to
|
||||
download them. @par
|
||||
http://www.corelis.com/support/BSDL.htm
|
||||
|
||||
TI links theirs right off the generic page for each chip;
|
||||
this may be the case for other vendors as well. For example:
|
||||
|
||||
- DaVinci DM355 -- http://www.ti.com/litv/zip/sprm262b
|
||||
- DaVinci DM6446
|
||||
- 2.1 silicon -- http://www.ti.com/litv/zip/sprm325a
|
||||
- older silicon -- http://www.ti.com/litv/zip/sprm203
|
||||
- OMAP 3530
|
||||
- CBB package -- http://www.ti.com/litv/zip/sprm315b
|
||||
- 515 ball s-PGBA, POP, 0.4mm pitch
|
||||
- CUS package -- http://www.ti.com/litv/zip/sprm314a
|
||||
- 515 ball s-PGBA, POP, 0.5mm pitch
|
||||
- CBC package -- http://www.ti.com/litv/zip/sprm346
|
||||
- 423 ball s-PGBA, 0.65mm pitch
|
||||
|
||||
Many other files are available in the "Semiconductor Manufacturer's BSDL
|
||||
files" section of the following site: @par
|
||||
http://www.freelabs.com/~whitis/electronics/jtag/
|
||||
|
||||
*/
|
||||
/** @file
|
||||
This file contains the @ref primerjtag and @ref primerjtagbs page.
|
||||
*/
|
||||
440
debuggers/openocd/doc/manual/primer/tcl.txt
Normal file
440
debuggers/openocd/doc/manual/primer/tcl.txt
Normal file
@ -0,0 +1,440 @@
|
||||
/** @page primertcl OpenOCD TCL Primer
|
||||
|
||||
The @subpage scripting page provides additional TCL Primer material.
|
||||
|
||||
@verbatim
|
||||
|
||||
****************************************
|
||||
****************************************
|
||||
|
||||
This is a short introduction to 'un-scare' you about the language
|
||||
known as TCL. It is structured as a guided tour through the files
|
||||
written by me [Duane Ellis] - in early July 2008 for OpenOCD.
|
||||
|
||||
Which uses the "JIM" embedded Tcl clone-ish language.
|
||||
|
||||
Thing described here are *totally* TCL generic... not Jim specific.
|
||||
|
||||
The goal of this document is to encourage you to add your own set of
|
||||
chips to the TCL package - and most importantly you should know where
|
||||
you should put them - so they end up in an organized way.
|
||||
|
||||
--Duane Ellis.
|
||||
duane@duaneellis.com
|
||||
|
||||
****************************************
|
||||
****************************************
|
||||
|
||||
Adding "chip" support - Duane Ellis July 5 - 2008.
|
||||
|
||||
The concept is this:
|
||||
In your "openocd.cfg" file add something like this:
|
||||
|
||||
source [find tcl/chip/VENDOR/FAMILY/NAME.tcl]
|
||||
|
||||
For example...
|
||||
source [find tcl/chip/atmel/at91/at91sam7x256.tcl]
|
||||
|
||||
You'll notice that it makes use of:
|
||||
|
||||
tcl/cpu/arm/<NAME>.tcl.
|
||||
|
||||
Yes, that is where you should put "core" specific things.
|
||||
Be careful and learn the difference:
|
||||
|
||||
THE "CORE" - is not the entire chip!
|
||||
|
||||
Definition:
|
||||
That "file" listed above is called a "CHIP FILE".
|
||||
|
||||
It may be standalone, or may need to "source" other "helper" files.
|
||||
|
||||
The reference [7/5/2008] is the at91sam7x256.tcl file.
|
||||
|
||||
****************************************
|
||||
****************************************
|
||||
=== TCL TOUR ===
|
||||
Open: at91sam7x256.tcl
|
||||
=== TCL TOUR ===
|
||||
|
||||
A walk through --- For those who are new to TCL.
|
||||
|
||||
Examine the file: at91sam7x256.tcl
|
||||
|
||||
It starts with:
|
||||
source [find path/filename.tcl]
|
||||
|
||||
In TCL - this is very important.
|
||||
|
||||
Rule #1 Everything is a string.
|
||||
Rule #2 If you think other wise See #1.
|
||||
Reminds you of:
|
||||
Rule #1: The wife is correct.
|
||||
Rule #2: If you think otherwise, See #1
|
||||
|
||||
Any text contained inside of [square-brackets]
|
||||
is just like `back-ticks` in BASH.
|
||||
|
||||
Hence, the [find FILENAME] executes the command find with a single
|
||||
parameter the filename.
|
||||
|
||||
========================================
|
||||
|
||||
Next you see a series of:
|
||||
|
||||
set NAME VALUE
|
||||
|
||||
It is mostly "obvious" what is going on.
|
||||
|
||||
Exception: The arrays.
|
||||
|
||||
You would *THINK* Tcl supports arrays.
|
||||
In fact, multi-dim arrays. That is false.
|
||||
|
||||
For the index for"FLASH(0,CHIPSELECT)" is actually the string
|
||||
"0,CHIPSELECT". This is problematic. In the normal world, you think
|
||||
of array indexes as integers.
|
||||
|
||||
For example these are different:
|
||||
|
||||
set foo(0x0c) 123
|
||||
set foo(12) 444
|
||||
|
||||
Why? Because 0x0c {lowercase} is a string.
|
||||
Don't forget UPPER CASE.
|
||||
|
||||
You must be careful - always... always... use simple decimal
|
||||
numbers. When in doubt use 'expr' the evaluator. These are all the
|
||||
same.
|
||||
|
||||
set x 0x0c
|
||||
set foo([expr $x]) "twelve"
|
||||
|
||||
set x 12
|
||||
set foo([expr $x]) "twelve"
|
||||
|
||||
set x "2 * 6"
|
||||
set foo([expr $x]) "twelve"
|
||||
|
||||
**************************************************
|
||||
***************************************************
|
||||
=== TCL TOUR ===
|
||||
Open the file: "bitsbytes.tcl"
|
||||
|
||||
There is some tricky things going on.
|
||||
===============
|
||||
|
||||
First, there is a "for" loop - at level 0
|
||||
{level 0 means: out side of a proc/function}
|
||||
|
||||
This means it is evaluated when the file is parsed.
|
||||
|
||||
== SIDEBAR: About The FOR command ==
|
||||
In TCL, "FOR" is a funny thing, it is not what you think it is.
|
||||
|
||||
Syntactically - FOR is a just a command, it is not language
|
||||
construct like for(;;) in C...
|
||||
|
||||
The "for" command takes 4 parameters.
|
||||
(1) The "initial command" to execute.
|
||||
(2) the test "expression"
|
||||
(3) the "next command"
|
||||
(4) the "body command" of the FOR loop.
|
||||
|
||||
Notice I used the words "command" and "expression" above.
|
||||
|
||||
The FOR command:
|
||||
1) executes the "initial command"
|
||||
2) evaluates the expression if 0 it stops.
|
||||
3) executes the "body command"
|
||||
4) executes the "next command"
|
||||
5) Goto Step 2.
|
||||
|
||||
As show, each of these items are in {curly-braces}. This means they
|
||||
are passed as they are - KEY-POINT: un evaluated to the FOR
|
||||
command. Think of it like escaping the backticks in Bash so that the
|
||||
"under-lying" command can evaluate the contents. In this case, the FOR
|
||||
COMMAND.
|
||||
|
||||
== END: SIDEBAR: About The FOR command ==
|
||||
|
||||
You'll see two lines:
|
||||
|
||||
LINE1:
|
||||
set vn [format "BIT%d" $x]
|
||||
|
||||
Format is like "sprintf". Because of the [brackets], it becomes what
|
||||
you think. But here's how:
|
||||
|
||||
First - the line is parsed - for {braces}. In this case, there are
|
||||
none. The, the parser looks for [brackets] and finds them. The,
|
||||
parser then evaluates the contents of the [brackets], and replaces
|
||||
them. It is alot this bash statement.
|
||||
|
||||
EXPORT vn=`date`
|
||||
|
||||
LINE 2 & 3
|
||||
set $vn [expr (1024 * $x)]
|
||||
global $vn
|
||||
|
||||
In line 1, we dynamically created a variable name. Here, we are
|
||||
assigning it a value. Lastly Line 3 we force the variable to be
|
||||
global, not "local" the the "for command body"
|
||||
|
||||
===============
|
||||
The PROCS
|
||||
|
||||
proc create_mask { MSB LSB } {
|
||||
... body ....
|
||||
}
|
||||
|
||||
Like "for" - PROC is really just a command that takes 3 parameters.
|
||||
The (1) NAME of the function, a (2) LIST of parameters, and a (3) BODY
|
||||
|
||||
Again, this is at "level 0" so it is a global function. (Yes, TCL
|
||||
supports local functions, you put them inside of a function}
|
||||
|
||||
You'll see in some cases, I nest [brackets] alot and in others I'm
|
||||
lazy or wanted it to be more clear... it is a matter of choice.
|
||||
===============
|
||||
|
||||
|
||||
**************************************************
|
||||
***************************************************
|
||||
=== TCL TOUR ===
|
||||
Open the file: "memory.tcl"
|
||||
===============
|
||||
|
||||
Here is where I setup some 'memory definitions' that various targets can use.
|
||||
|
||||
For example - there is an "unknown" memory region.
|
||||
|
||||
All memory regions must have 2 things:
|
||||
|
||||
(1) N_<name>
|
||||
(2) NAME( array )
|
||||
And the array must have some specific names:
|
||||
( <idx>, THING )
|
||||
Where: THING is one of:
|
||||
CHIPSELECT
|
||||
BASE
|
||||
LEN
|
||||
HUMAN
|
||||
TYPE
|
||||
RWX - the access ability.
|
||||
WIDTH - the accessible width.
|
||||
|
||||
ie: Some regions of memory are not 'word'
|
||||
accessible.
|
||||
|
||||
The function "address_info" - given an address should
|
||||
tell you about the address.
|
||||
|
||||
[as of this writing: 7/5/2008 I have done
|
||||
only a little bit with this -Duane]
|
||||
|
||||
===
|
||||
MAJOR FUNCTION:
|
||||
==
|
||||
|
||||
proc memread32 { ADDR }
|
||||
proc memread16 { ADDR }
|
||||
proc memread8 { ADDR }
|
||||
|
||||
All read memory - and return the contents.
|
||||
|
||||
[ FIXME: 7/5/2008 - I need to create "memwrite" functions]
|
||||
|
||||
**************************************************
|
||||
***************************************************
|
||||
=== TCL TOUR ===
|
||||
Open the file: "mmr_helpers.tcl"
|
||||
===============
|
||||
|
||||
This file is used to display and work with "memory mapped registers"
|
||||
|
||||
For example - 'show_mmr32_reg' is given the NAME of the register to
|
||||
display. The assumption is - the NAME is a global variable holding the
|
||||
address of that MMR.
|
||||
|
||||
The code does some tricks. The [set [set NAME]] is the TCL way
|
||||
of doing double variable interpolation - like makefiles...
|
||||
|
||||
In a makefile or shell script you may have seen this:
|
||||
|
||||
FOO_linux = "Penguins rule"
|
||||
FOO_winXP = "Broken Glass"
|
||||
FOO_mac = "I like cat names"
|
||||
|
||||
# Pick one
|
||||
BUILD = linux
|
||||
#BUILD = winXP
|
||||
#BUILD = mac
|
||||
FOO = ${FOO_${BUILD}}
|
||||
|
||||
The "double [set] square bracket" thing is the TCL way, nothing more.
|
||||
|
||||
----
|
||||
|
||||
The IF statement - and "CATCH" .
|
||||
|
||||
Notice this IF COMMAND - (not statement) is like this:
|
||||
[7/5/2008 it is this way]
|
||||
|
||||
if ![catch { command } msg ] {
|
||||
...something...
|
||||
} else {
|
||||
error [format string...]
|
||||
}
|
||||
|
||||
The "IF" command expects either 2 params, or 4 params.
|
||||
|
||||
=== Sidebar: About "commands" ===
|
||||
|
||||
Take a look at the internals of "jim.c"
|
||||
Look for the function: Jim_IfCoreCommand()
|
||||
And all those other "CoreCommands"
|
||||
|
||||
You'll notice - they all have "argc" and "argv"
|
||||
|
||||
Yea, the entire thing is done that way.
|
||||
|
||||
IF is a command. SO is "FOR" and "WHILE" and "DO" and the
|
||||
others. That is why I keep using the phase it is a "command"
|
||||
|
||||
=== END: Sidebar: About "commands" ===
|
||||
|
||||
Parameter 1 to the IF command is expected to be an expression.
|
||||
|
||||
As such, I do not need to wrap it in {braces}.
|
||||
|
||||
In this case, the "expression" is the result of the "CATCH" command.
|
||||
|
||||
CATCH - is an error catcher.
|
||||
|
||||
You give CATCH 1 or 2 parameters.
|
||||
The first 1st parameter is the "code to execute"
|
||||
The 2nd (optional) is where to put the error message.
|
||||
|
||||
CATCH returns 0 on success, 1 for failure.
|
||||
The "![catch command]" is self explaintory.
|
||||
|
||||
|
||||
The 3rd parameter to IF must be exactly "else" or "elseif" [I lied
|
||||
above, the IF command can take many parameters they just have to
|
||||
be joined by exactly the words "else" or "elseif".
|
||||
|
||||
The 4th parameter contains:
|
||||
|
||||
"error [format STRING....]"
|
||||
|
||||
This lets me modify the previous lower level error by tacking more
|
||||
text onto the end of it. In this case, i want to add the MMR register
|
||||
name to make my error message look better.
|
||||
|
||||
---------
|
||||
Back to something inside show_mmr32_reg{}.
|
||||
|
||||
You'll see something 'set fn show_${NAME}_helper' Here I am
|
||||
constructing a 'function name' Then - I look it up to see if it
|
||||
exists. {the function: "proc_exists" does this}
|
||||
|
||||
And - if it does - I call the function.
|
||||
|
||||
In "C" it is alot like using: 'sprintf()' to construct a function name
|
||||
string, then using "dlopen()" and "dlsym()" to look it up - and get a
|
||||
function pointer - and calling the function pointer.
|
||||
|
||||
In this case - I execute a dynamic command. You can do some cool
|
||||
tricks with interpretors.
|
||||
|
||||
----------
|
||||
|
||||
Function: show_mmr32_bits()
|
||||
|
||||
In this case, we use the special TCL command "upvar" which tcl's way
|
||||
of passing things by reference. In this case, we want to reach up into
|
||||
the callers lexical scope and find the array named "NAMES"
|
||||
|
||||
The rest of the function is pretty straight forward.
|
||||
|
||||
First - we figure out the longest name.
|
||||
Then print 4 rows of 8bits - with names.
|
||||
|
||||
|
||||
**************************************************
|
||||
***************************************************
|
||||
=== TCL TOUR ===
|
||||
Open the file: "chips/atmel/at91/usarts.tcl"
|
||||
===============
|
||||
|
||||
First - about the AT91SAM series - all of the usarts
|
||||
are basically identical...
|
||||
|
||||
Second - there can be many of them.
|
||||
|
||||
In this case - I do some more TCL tricks to dynamically
|
||||
create functions out of thin air.
|
||||
|
||||
Some assumptions:
|
||||
|
||||
The "CHIP" file has defined some variables in a proper form.
|
||||
|
||||
ie: AT91C_BASE_US0 - for usart0,
|
||||
AT91C_BASE_US1 - for usart1
|
||||
... And so on ...
|
||||
|
||||
Near the end of the file - look for a large "foreach" loop that
|
||||
looks like this:
|
||||
|
||||
foreach WHO { US0 US1 US2 US3 US4 .... } {
|
||||
|
||||
}
|
||||
|
||||
In this case, I'm trying to figure out what USARTs exist.
|
||||
|
||||
Step 1 - is to determine if the NAME has been defined.
|
||||
ie: Does AT91C_BASE_USx - where X is some number exist?
|
||||
|
||||
The "info exists VARNAME" tells you if the variable exists. Then -
|
||||
inside the IF statement... There is another loop. This loop is the
|
||||
name of various "sub-registers" within the USART.
|
||||
|
||||
Some more trick are played with the [set VAR] backtick evaluation stuff.
|
||||
And we create two variables
|
||||
|
||||
We calculate and create the global variable name for every subregister in the USART.
|
||||
And - declare that variable as GLOBAL so the world can find it.
|
||||
|
||||
Then - we dynamically create a function - based on the register name.
|
||||
|
||||
Look carefully at how that is done. You'll notice the FUNCTION BODY is
|
||||
a string - not something in {braces}. Why? This is because we need TCL
|
||||
to evaluate the contents of that string "*NOW*" - when $vn exists not
|
||||
later, when the function "show_FOO" is invoked.
|
||||
|
||||
Lastly - we build a "str" of commands - and create a single function -
|
||||
with the generated list of commands for the entire USART.
|
||||
|
||||
With that little bit of code - I now have a bunch of functions like:
|
||||
|
||||
show_US0, show_US1, show_US2, .... etc ...
|
||||
|
||||
And show_US0_MR, show_US0_IMR ... etc...
|
||||
|
||||
And - I have this for every USART... without having to create tons of
|
||||
boiler plate yucky code.
|
||||
|
||||
****************************************
|
||||
****************************************
|
||||
END of the Tcl Intro and Walk Through
|
||||
****************************************
|
||||
****************************************
|
||||
|
||||
FUTURE PLANS
|
||||
|
||||
Some "GPIO" functions...
|
||||
|
||||
@endverbatim
|
||||
|
||||
*/
|
||||
465
debuggers/openocd/doc/manual/release.txt
Normal file
465
debuggers/openocd/doc/manual/release.txt
Normal file
@ -0,0 +1,465 @@
|
||||
/** @page releases Release Processes
|
||||
|
||||
This page provides an introduction to the OpenOCD Release Processes:
|
||||
|
||||
- @ref releasewhy - Explain the motivations for producing
|
||||
releases on a regular basis.
|
||||
- @ref releasewho - Describes the responsibilities and
|
||||
authority required to produce official OpenOCD releases.
|
||||
- @ref releasewhen - Provides guidelines for scheduling
|
||||
activities for each release cycle.
|
||||
- @ref releasehow - Outlines all of the steps for the
|
||||
processes used to produce and release the package source archives.
|
||||
- @ref releasescriptcmds - Introduces the automated @c release.sh script.
|
||||
|
||||
@section releasewhy Why Produce Releases?
|
||||
|
||||
The OpenOCD maintainers produce <i>releases</i> periodically for many
|
||||
reasons. This section provides the key reasons for making releases on a
|
||||
regular basis and why a set of <i>release processes</i> should be used
|
||||
to produce them.
|
||||
|
||||
At any time, <i>source archives</i> can be produced by running
|
||||
<code>make dist</code> in the OpenOCD project tree. With the 0.2.0
|
||||
release, this command will package the tree into several popular archive
|
||||
formats: <code>openocd-\<version\>.{tar.gz,tar.bz2,zip}</code>. If
|
||||
produced properly, these files are suitable for release to the public.
|
||||
|
||||
When properly versioned and released for users, these archives present
|
||||
several important advantages compared to using the source repository
|
||||
(including snapshots downloaded from that repository using gitweb):
|
||||
|
||||
-# They allow others to package and distribute the code using
|
||||
consistent version labels. Users won't normally need to care
|
||||
whose package they use, just the version of OpenOCD.
|
||||
-# They contain a working configure script and makefiles, which
|
||||
were produced as part of creating the archive.
|
||||
-# Because they have been formally released by the project, users
|
||||
don't need to try a random work-in-process revision. Releasing
|
||||
involves spending some time specifically on quality improvments,
|
||||
including bugfixing source code and documentation.
|
||||
-# They provide developers with the flexibility needed to address
|
||||
larger issues, which sometimes involves temporary breakage.
|
||||
|
||||
Hopefully, this shows several good reasons to produce regular releases,
|
||||
but the release processes were developed with some additional design
|
||||
goals in mind. Specifically, the releases processes should have the
|
||||
following properties:
|
||||
|
||||
-# Produce successive sets of archives cleanly and consistently.
|
||||
-# Implementable as a script that automates the critical steps.
|
||||
-# Prevent human operators from producing broken packages, when possible.
|
||||
-# Allow scheduling and automation of building and publishing milestones.
|
||||
|
||||
The current release processes are documented in the following sections.
|
||||
They attempt to meet these design goals, but improvements may still
|
||||
need to be made.
|
||||
|
||||
@subsection version_labels Version Labels
|
||||
|
||||
Users can display the OpenOCD version string in at least two
|
||||
ways. The command line <code>openocd -v</code> invocation
|
||||
displays it; as does the Tcl <code>version</code> command.
|
||||
|
||||
Labels for released versions look like <em>0.3.0</em>, or
|
||||
<em>0.3.0-rc1</em> for a preliminary release.
|
||||
Non-released (developer) versions look like <em>0.3.0-dev</em>,
|
||||
or <em>0.3.0-rc1-dev</em>.
|
||||
In all cases, additional tags may be appended to those base
|
||||
release version labels.
|
||||
|
||||
The <code>tools/release/version.sh</code> script is used to
|
||||
manipulate version IDs found in the source tree.
|
||||
|
||||
@subsubsection releaseversions Release Versions and Tags
|
||||
|
||||
The OpenOCD version string is composed of three numeric components
|
||||
separated by two decimal points: @c x.y.z, where @c x is the @a major
|
||||
version number, @c y is the @a minor number, and @c z is the @a micro.
|
||||
For any <em>bug-fix</em> release, the micro version number will be non-zero
|
||||
(<code>z > 0</code>). For a <i>minor release</i>, the micro version
|
||||
number will be zero (<code>z = 0</code>). For a <i>major releases</i>,
|
||||
the minor version will @a also be zero (<code>y = 0, z = 0</code>).
|
||||
|
||||
After these required numeric components, release version strings
|
||||
may contain tags such as as <em>-rc1</em> or <em>-rc2</em>.
|
||||
These 'rc' tags indicate "release candidate" versions of the package.
|
||||
Like major/minor/micro numbers, these are updated
|
||||
as part of the release process.
|
||||
|
||||
The release process includes version number manipulations to the tree
|
||||
being released, ensuring that all numbers are incremented (or rolled
|
||||
over) at the right time and in the proper locations of the repository.
|
||||
One of those manipulations creates a repository tag matching that
|
||||
release's version label.
|
||||
|
||||
@subsubsection releaseversionsdist Packager Versions
|
||||
|
||||
Distributors of patched versions of OpenOCD are encouraged to extend the
|
||||
version string with a unique version tag when producing external
|
||||
releases, as this helps to identify your particular distribution series.
|
||||
Knowing that a release has such patches can be essential to tracking
|
||||
down and fixing bugs.
|
||||
|
||||
Packager version tags should always be suffixes to the version
|
||||
code from the OpenOCD project, signifying modifications to the
|
||||
original code base. Each packager release should have a unique
|
||||
version.
|
||||
|
||||
For example, the following command will add a 'foo' tag to the
|
||||
configure.ac script of a local copy of the source tree, giving
|
||||
a version label like <em>0.3.0-foo</em>:
|
||||
|
||||
@code
|
||||
tools/release/version.sh tag add foo
|
||||
@endcode
|
||||
|
||||
This command will modify the configure.ac script in your working copy
|
||||
only. After running the @c bootstrap sequence, the tree can be patched
|
||||
and used to produce your own derived versions. You might check that
|
||||
change into a private branch of your git tree, along with the other
|
||||
patches you are providing.
|
||||
|
||||
You can also "bump" those tags (so "foo1" becomes "foo2" etc)
|
||||
each time a derived package is released, incrementing the tag's
|
||||
version to facilitate tracking the changes you have distributed.
|
||||
|
||||
@code
|
||||
tools/release/version.sh bump tag foo
|
||||
@endcode
|
||||
|
||||
Of course, any patches in your branches must be provided to
|
||||
your customers, and be in conformance with the GPL. In most
|
||||
cases you should also work to merge your improvements to the
|
||||
mainline tree.
|
||||
|
||||
@subsubsection version_tags Development Versions and Tags
|
||||
|
||||
Everything except formal releases should have the tag <em>-dev</em>
|
||||
in their version number. This helps developers identify reports
|
||||
created from non-release versions, and it can be detected and
|
||||
manipulated by the release script. Specifically, this tag will be
|
||||
removed and re-added during the release process; it should never be
|
||||
manipulated by developers in submitted patches.
|
||||
|
||||
Versions built from developer trees may have additional tags.
|
||||
Trees built from git snapshots have <em>snapshot</em> tags.
|
||||
When built from a "live" git tree, tags specify
|
||||
specific git revisions:
|
||||
|
||||
0.3.0-rc1-dev-00015-gf37c9b8-dirty
|
||||
|
||||
indicates a development tree based on git revison f37c9b8
|
||||
(a truncated version of a SHA1 hash) with some non-git
|
||||
patches applied (the <em>dirty</em> tag). This information
|
||||
can be useful when tracking down bugs.
|
||||
(Note that at this writing, the tags do not directly
|
||||
correspond to <code>git describe</code> output. The
|
||||
hash ID can be used with <code>git show</code>, but
|
||||
the relevant repository tag isn't <em>0.3.0-rc1-dev</em>;
|
||||
this might change in the future.)
|
||||
|
||||
@section releasewho Release Manager
|
||||
|
||||
OpenOCD archive releases will be produced by an individual filling the
|
||||
role of <i>Release Manager</i>, hereafter abbreviated as <i>RM</i>. This
|
||||
individual determines the schedule and executes the release processes
|
||||
for the community.
|
||||
|
||||
@subsection releasewhohow RM Authority
|
||||
|
||||
Each release requires one individual to fulfill the RM role; however,
|
||||
graceful transitions of this authority may take place at any time. The
|
||||
current RM may transfer their authority to another contributor in a post
|
||||
to the OpenOCD development mailing list. Such delegation of authority
|
||||
must be approved by the individual that will receive it and the
|
||||
community of maintainers. Initial arrangements with the new RM should
|
||||
be made off-list, as not every contributor wants these responsibilities.
|
||||
|
||||
@subsection releasewhowhat RM Responsibilities
|
||||
|
||||
In addition to the actual process of producing the releases, the RM is
|
||||
responsible for keeping the community informed of all progress through
|
||||
the release cycle(s) being managed. The RM is responsible for managing
|
||||
the changes to the package version, though the release tools should
|
||||
manage the tasks of adding or removing any required development branch
|
||||
tags and incrementing the version.
|
||||
|
||||
These responsibilities matter most towards the end of the release
|
||||
cycle, when the RM creates the first RC and all contributors enter
|
||||
a quality-improvement mode. The RM works with other contributors
|
||||
to make sure everyone knows what kinds of fixes should merge, the
|
||||
status of major issues, and the release timetable.
|
||||
|
||||
In particular, the RM has the final decision on whether a given
|
||||
bug should block the release.
|
||||
|
||||
@section releasewhen Release Schedule
|
||||
|
||||
The OpenOCD release process must be carried out on a periodic basis, so
|
||||
the project can realize the benefits presented in answer to the question,
|
||||
@ref releasewhy.
|
||||
|
||||
Starting with the 0.2.0 release, the OpenOCD project expects to produce
|
||||
new releases every few months.
|
||||
Bug fix releases could be provided more frequently. These release
|
||||
schedule goals may be adjusted in the future, after the project
|
||||
maintainers and distributors receive feedback and experience.
|
||||
|
||||
More importantly, the statements made in this section do not create an
|
||||
obligation by any member of the OpenOCD community to produce new
|
||||
releases on regular schedule, now or in the future.
|
||||
|
||||
@subsection releasewhenexample Sample Schedule
|
||||
|
||||
The RM must pro-actively communicate with the community from the
|
||||
beginning of the development cycle through the delivery of the new
|
||||
release. This section presents guidelines for scheduling key points
|
||||
where the community must be informed of changing conditions.
|
||||
|
||||
If Tn is the time of release n, then the following schedule
|
||||
might describe some key T0-to-T1 release cycle milestones.
|
||||
|
||||
- T0 ... End of T0 release cycle. T1 cycle starts, with merge
|
||||
window opening. Developers begin to merge queued work.
|
||||
- <em>... several weeks of merge window ...</em>
|
||||
- RC1 ... Close mainline to new work. Produce RC1
|
||||
release, begin testing phase; developers are in "bugfix mode",
|
||||
all other work is queued; send out planned endgame schedule.
|
||||
- RC2 ... Produce RC2 and send schedule update to
|
||||
mailing list, listing priorities for remaining fixes
|
||||
- <em>... more RC milestones, until ready ...</em>
|
||||
- T1: End of T1 release cycle. T2 cycle starts, with merge
|
||||
window opening. Developers begin to merge queued work.
|
||||
|
||||
Note that until it happens, any date for T1 is just a goal.
|
||||
Critical bugs prevent releases from happening. We are just
|
||||
beginning to use this window-plus-RCs process, so the lengths
|
||||
of the merge windows versus the RC phase is subject to change.
|
||||
Most projects have RC phases of a month or more.
|
||||
|
||||
Some additional supplemental communication will be desirable. The above
|
||||
list omits the step-by-step instructions to daily release management.
|
||||
Individuals performing release management need to have the ability to
|
||||
interact proactively with the community as a whole, anticipating when
|
||||
such interaction will be required and giving ample notification.
|
||||
|
||||
The next section explains why the OpenOCD project allows significant
|
||||
flexibility in the part of the development that precedes the release
|
||||
process.
|
||||
|
||||
@subsection releasewhenflex Schedule Flexibility
|
||||
|
||||
The Release Manager should attempt to follow the guidelines in this
|
||||
document, but the process of scheduling each release milestone should be
|
||||
community driven at the start. Features that don't complete before
|
||||
the merge window closes can be held (perhaps in some branch) until
|
||||
the next merge window opens, rather than delaying the release cycle.
|
||||
|
||||
The Release
|
||||
Manager cannot schedule the work that will be done on the project,
|
||||
when it will be submitted, reviewed, and deemed suitable to be committed.
|
||||
That is, the RM cannot act as a priest in a cathedral; OpenOCD uses
|
||||
the bazaar development model. The release schedule must adapt
|
||||
continuously in response to changes in the rate of work.
|
||||
Fewer releases may be
|
||||
required if developers contribute less patches, and more releases may be
|
||||
desirable if the project continues to grow and experience high rates of
|
||||
community contribution. During each cycle, the RM should be tracking
|
||||
the situation and gathering feedback from the community.
|
||||
|
||||
@section releasehow Release Process: Step-by-Step
|
||||
|
||||
The release process is not final; it may need more iterations
|
||||
to work out bugs.
|
||||
While there are release scripts, key steps require community
|
||||
support; the Release Manager isn't the only participant.
|
||||
|
||||
The following steps should be followed to produce each release:
|
||||
|
||||
-# Produce final patches using a local clone of mainline. Nobody
|
||||
except the RM should be committing anything. <em>Everyone with commit
|
||||
privileges needs to know and agree to this in advance!</em> Even the RM
|
||||
only commits a handful of updates as part of the release process
|
||||
itself ... to files which are part of the version identification scheme
|
||||
or release process; and to create the version tag; and then to open the
|
||||
merge window for the next release cycle.
|
||||
-# Finalize @c the NEWS file to describe the changes in the release
|
||||
- This file is used to automatically post "blurbs" about the project.
|
||||
- This material should have been produced during the development cycle,
|
||||
by adding items for each @c NEWS-worthy contribution, when committed
|
||||
during the merge window. (One part of closing the merge window, by
|
||||
opening the RC phase of the release, is the commitment to hold all
|
||||
further such contributions until the next merge window opens.)
|
||||
- The RM should make sure nothing important was omitted, as part of
|
||||
the RC1 cycle. From then on, no more updates to NEWS content should
|
||||
be needed (except to seed the process for the next release, or maybe
|
||||
if a significant and longstanding bug is fixed late in the RC phase).
|
||||
-# Bump library version if our API changed (not yet required)
|
||||
-# Update and commit the final package version in @c configure.ac:
|
||||
(The <code>tools/release/version.sh</code> script might help ensure
|
||||
the versions are named properly.):
|
||||
-# Remove @c -dev tag.
|
||||
-# Update any @c -rc tag:
|
||||
- If producing the final release from an -rc series, remove it
|
||||
- If producing the first RC in a series, add rc1
|
||||
- If producing the next RC in a series, bump the rc number
|
||||
-# Commit that version change, with a good descriptive comment.
|
||||
-# Create a git tag for the final commit, with a tag name matching
|
||||
the version string in <code>configure.ac</code> (including <em>-rcN</em>
|
||||
where relevant):
|
||||
@verbatim
|
||||
PACKAGE_VERSION="x.y.z"
|
||||
PACKAGE_TAG="v${PACKAGE_VERSION}"
|
||||
git tag -m "The openocd-${PACKAGE_VERSION} release." "${PACKAGE_TAG}"
|
||||
@endverbatim
|
||||
-# Do not push those changes to mainline yet; only builds using the
|
||||
source archives you will be creating should ever be labeled as
|
||||
official releases (with no "-dev" suffix). Since mainline is a
|
||||
development tree, these will be pushed later, as part of opening
|
||||
the merge window for the next release cycle (restoring the "-dev"
|
||||
suffix for that next release.) Those version and tag updates are
|
||||
the last ones to be included in the release being made.
|
||||
-# Produce the release files, using the local clone of the source
|
||||
tree which holds the release's tag and updated version in
|
||||
@c configure.ac ... this is used only to produce the release, and
|
||||
all files should already be properly checked out.
|
||||
-# Run <code>tools/release.sh package</code> to produce the
|
||||
source archives. This automatically bootstraps and
|
||||
configures the process.
|
||||
-# Run <code>tools/release.sh stage</code> to create an @c archives
|
||||
directory with the release data, including MD5 and SHA1
|
||||
checksum files.
|
||||
-# Sanity check at least one of those archives, by extracting and
|
||||
configuring its contents, using them to build a copy of OpenOCD,
|
||||
and verifying that the result prints the correct release version
|
||||
in its startup banner. (For example,
|
||||
"configure --enable-ft2232_libftdi --enable-parport"
|
||||
then "make" and run "src/openocd -v" as a sanity check.)
|
||||
-# Run <code>make docs</code> to create the
|
||||
documentation which will be published.
|
||||
-# Upload packages and post announcements of their availability:
|
||||
-# Release packages into files section of project sites:
|
||||
- SF.net:
|
||||
-# Under "Project Admin", use the "File Manager"
|
||||
-# Create a new folder under "openocd" named "${PACKAGE_VERSION}"
|
||||
-# Upload the @c NEWS file and mark it as the release notes.
|
||||
-# Upload the three source archive files, using the Web interface,
|
||||
into that folder. Verify the upload worked OK by checking the
|
||||
MD5 and SHA1 checksums computed by SourceForge against the
|
||||
versions created as part of staging the release.
|
||||
-# Also upload doc/openocd.pdf (the User's Guide) so the version
|
||||
matching each release will be easily available.
|
||||
-# Select each file in the release, and use the property panel
|
||||
to set its type and select the right release notes.
|
||||
- .tar.bz2: Linux, Mac
|
||||
- .tar.gz: BSD, Solaris, Others
|
||||
- .zip: Windows
|
||||
- For openocd.pdf just associate it with the right release notes.
|
||||
-# Create an SF.net project news update.
|
||||
-# Depending on how paranoid you're feeling today, verify the images by
|
||||
downloading them from the websites and making sure there are no
|
||||
differences between the downloaded copies and your originals.
|
||||
-# Publish User's and Developer's Guides to the project web sites:
|
||||
-# Use SCP to update the SF.net web site with PDF and HTML for the
|
||||
User's Guide, and HTML for the developer's guide ... you can
|
||||
instantiate a shell.sourceforge.net instance and set up symlinks
|
||||
from your home directory, to simplify this process.
|
||||
-# Post announcement e-mail to the openocd-development list.
|
||||
-# optionally:
|
||||
-# Post an update on the OpenOCD blog.
|
||||
-# Announce updates on freshmeat.net and other trackers.
|
||||
-# Submit updates to news feeds (e.g. Digg, Reddit, etc.).
|
||||
-# Resume normal development on mainline, by opening the merge window for
|
||||
the next major or minor release cycle. (You might want to do this
|
||||
before all the release bits are fully published.)
|
||||
- Update the version label in the @c configure.ac file:
|
||||
- Restore @c -dev version tag.
|
||||
- For a new minor release cycle, increment the release's minor number
|
||||
- For a new major release cycle, increment the release's major number
|
||||
and zero its minor number
|
||||
- Archive @c NEWS file as "<code>doc/news/NEWS-${PACKAGE_VERSION}</code>".
|
||||
- Create a new @c NEWS file for the next release
|
||||
- Commit those changes.
|
||||
- Push all the updates to mainline.
|
||||
- Last updates for the release, including the release tag (you
|
||||
will need to "git push --tags").
|
||||
- Updates opening the merge window
|
||||
- At this point, it's OK for commiters to start pushing changes
|
||||
which have been held off until the next release. (Any bugfixes to
|
||||
this release will be against a bug-fix release branch starting from
|
||||
the commit you tagged as this release, not mainline.)
|
||||
- Announce to the openocd-development list. Ideally, you will also
|
||||
be able to say who is managing the next release cycle.
|
||||
|
||||
To start a bug-fix release branch:
|
||||
-# Create a new branch, starting from a major or
|
||||
minor release tag
|
||||
-# Restore @c -dev version tag.
|
||||
-# Bump micro version number in configure.ac
|
||||
-# Backport bugfix patches from mainline into that branch.
|
||||
(Always be sure mainline has the fix first, so it's hard
|
||||
to just lose a bugfix.)
|
||||
-# Commit and push those patches.
|
||||
-# When desired, release as above ... except note that the next
|
||||
release of a bugfix branch is never a new major or minor release
|
||||
|
||||
@subsection releasescriptcmds Release Script Commands
|
||||
|
||||
The @c release.sh script automates some of the steps involved
|
||||
in making releases, simplifying the Release Manager's work.
|
||||
|
||||
The release script can be used for two tasks:
|
||||
- Creating releases and starting a new release cycle:
|
||||
@code
|
||||
git checkout master
|
||||
tools/release.sh --type=minor --final --start-rc release
|
||||
@endcode
|
||||
- Creating a development branch from a tagged release:
|
||||
@code
|
||||
git checkout 'v0.2.0'
|
||||
tools/release.sh --type=micro branch
|
||||
@endcode
|
||||
|
||||
Both of these variations make automatic commits and tags in your
|
||||
repository, so you should be sure to run it on a cloned copy before
|
||||
proceding with a live release.
|
||||
|
||||
@subsection releasescriptopts Release Script Options
|
||||
|
||||
The @c release.sh script recognizes some command-line options that
|
||||
affect its behavior:
|
||||
|
||||
- The @c --start-rc indicates that the new development release cycle
|
||||
should start with @c -rc0. Without this, the @c -rc tag will be omitted,
|
||||
leading to non-monotonic versioning of the in-tree version numbers.
|
||||
- The @c --final indicates that the release should drop the @c -rc tag,
|
||||
to going from @c x.y.z-rcN-dev to x.y.z.
|
||||
|
||||
@subsection releasescriptenv Release Script Environment
|
||||
|
||||
The @c release.sh script recognizes some environment variables which
|
||||
affect its behavior:
|
||||
|
||||
- @c CONFIG_OPTS : Passed as options to the configure script.
|
||||
- @c MAKE_OPTS : Passed as options to the 'make' processes.
|
||||
|
||||
@section releasetutorial Release Tutorials
|
||||
|
||||
This section should contain a brief tutorial for using the Release
|
||||
Script to perform release tasks, but the new script needs to be
|
||||
used for 0.3.0.
|
||||
|
||||
@section releasetodo Release Script Shortcomings
|
||||
|
||||
Improved automated packaging and distribution of OpenOCD requires more
|
||||
patching of the configure script. The final release script should be
|
||||
able to manage most steps of the processes. The steps requiring user
|
||||
input could be guided by an "assistant" that walks the Release Manager
|
||||
through the process from beginning to end, performing basic sanity
|
||||
checks on their various inputs (e.g. the @c NEWS blurb).
|
||||
|
||||
*/
|
||||
/** @file
|
||||
This file contains the @ref releases page.
|
||||
*/
|
||||
80
debuggers/openocd/doc/manual/scripting.txt
Normal file
80
debuggers/openocd/doc/manual/scripting.txt
Normal file
@ -0,0 +1,80 @@
|
||||
/** @page scripting Scripting Overview
|
||||
|
||||
@section scriptingisnt What scripting will not do
|
||||
|
||||
The scripting support is intended for developers of OpenOCD.
|
||||
It is not the intention that normal OpenOCD users will
|
||||
use tcl scripting extensively, write lots of clever scripts,
|
||||
or contribute back to OpenOCD.
|
||||
|
||||
Target scripts can contain new procedures that end users may
|
||||
tinker to their needs without really understanding tcl.
|
||||
|
||||
Since end users are not expected to mess with the scripting
|
||||
language, the choice of language is not terribly important
|
||||
to those same end users.
|
||||
|
||||
Jim Tcl was chosen as it was easy to integrate, works
|
||||
great in an embedded environment and Øyvind Harboe
|
||||
had experience with it.
|
||||
|
||||
@section scriptinguses Uses of scripting
|
||||
|
||||
Default implementation of procedures in tcl/procedures.tcl.
|
||||
|
||||
- Polymorphic commands for target scripts.
|
||||
- there will be added some commands in Tcl that the target
|
||||
scripts can replace.
|
||||
- produce \<productionfile\> \<serialnumber\>. Default implementation
|
||||
is to ignore serial number and write a raw binary file
|
||||
to beginning of first flash. Target script can dictate
|
||||
file format and structure of serialnumber. Tcl allows
|
||||
an argument to consist of e.g. a list so the structure of
|
||||
the serial number is not limited to a single string.
|
||||
- reset handling. Precise control of how srst, trst &
|
||||
tms is handled.
|
||||
- replace some parts of the current command line handler.
|
||||
This is only to simplify the implementation of OpenOCD
|
||||
and will have no externally visible consequences.
|
||||
Tcl has an advantage in that it's syntax is backwards
|
||||
compatible with the current OpenOCD syntax.
|
||||
- external scripting. Low level tcl functions will be defined
|
||||
that return machine readable output. These low level tcl
|
||||
functions constitute the tcl api. flash_banks is such
|
||||
a low level tcl proc. "flash banks" is an example of
|
||||
a command that has human readable output. The human
|
||||
readable output is expected to change inbetween versions
|
||||
of OpenOCD. The output from flash_banks may not be
|
||||
in the preferred form for the client. The client then
|
||||
has two choices a) parse the output from flash_banks
|
||||
or b) write a small piece of tcl to output the
|
||||
flash_banks output to a more suitable form. The latter may
|
||||
be simpler.
|
||||
|
||||
|
||||
@section scriptingexternal External scripting
|
||||
|
||||
The embedded Jim Tcl interpreter in OpenOCD is very limited
|
||||
compared to any full scale PC hosted scripting language.
|
||||
|
||||
The goal is to keep the internal Jim Tcl interpreter as
|
||||
small as possible and allow any advanced scripting,
|
||||
especially scripting that interacts with the host,
|
||||
run on the host and talk to OpenOCD via the TCP/IP
|
||||
scripting connection.
|
||||
|
||||
Another problem with Jim Tcl is that there is no debugger
|
||||
for it.
|
||||
|
||||
With a bit of trickery it should be possible to run Jim
|
||||
Tcl scripts under a Tcl interpreter on a PC. The advantage
|
||||
would be that the Jim Tcl scripts could be debugged using
|
||||
a standard PC Tcl debugger.
|
||||
|
||||
The rough idea is to write an unknown proc that sends
|
||||
unknown commands to OpenOCD.
|
||||
|
||||
Basically a PC version of startup.tcl. Patches most
|
||||
gratefully accepted! :-)
|
||||
|
||||
*/
|
||||
316
debuggers/openocd/doc/manual/server.txt
Normal file
316
debuggers/openocd/doc/manual/server.txt
Normal file
@ -0,0 +1,316 @@
|
||||
/** @page serverdocs OpenOCD Server APIs
|
||||
|
||||
OpenOCD provides support for implementing different types of servers.
|
||||
Presently, the following servers have APIs that can be used.
|
||||
|
||||
- @subpage servergdb
|
||||
- @subpage servertelnet
|
||||
- @subpage serverhttp
|
||||
|
||||
@section serverdocsoverview Overview
|
||||
|
||||
What follows is a development history, and describes some of the intent
|
||||
of why certain features exist within OpenOCD along with the reasoning
|
||||
behind them.
|
||||
|
||||
This roadmap section was written May 2009 - about 9 to 12 months
|
||||
after some of this work had started, it attempts to document some of
|
||||
the reasons why certain features exist within OpenOCD at that time.
|
||||
|
||||
@section serverdocsbg Background
|
||||
|
||||
In early 2008, Oyvind Harboe and Duane Ellis had talked about how to
|
||||
create a reasonable GUI for OpenOCD - something that is non-invasive,
|
||||
simple to use and maintain, and does not tie OpenOCD to many other
|
||||
packages. It would be wrong to "spider web" requirements into other
|
||||
external external packages. That makes it difficult for developers to
|
||||
write new code and creates a support nightmare.
|
||||
|
||||
In many ways, people had talked about the need for some type of
|
||||
high-level interface to OpenOCD, because they only had two choices:
|
||||
- the ability to script: via an external program the actions of OpenOCD.
|
||||
- the ablity to write a complex internal commands: native 'commands'
|
||||
inside of OpenOCD was complicated.
|
||||
|
||||
Fundamentally, the basic problem with both of those would be solved
|
||||
with a script language:
|
||||
|
||||
-# <b>Internal</b>: simple, small, and self-contained.
|
||||
-# <b>Cross Language</b>: script friendly front-end
|
||||
-# <b>Cross Host</b>: GUI Host interface
|
||||
-# <b>Cross Debugger</b>: GUI-like interface
|
||||
|
||||
What follows hopefully shows how the plans to solve these problems
|
||||
materialized and help to explain the grand roadmap plan.
|
||||
|
||||
@subsection serverdocsjim Why JimTCL? The Internal Script Language
|
||||
|
||||
At the time, the existing "command context schema" was proving itself
|
||||
insufficient. However, the problem was also considered from another
|
||||
direction: should OpenOCD be first class and the script second class?
|
||||
Which one rules?
|
||||
|
||||
In the end, OpenOCD won, the conclusion was that simpler will be better.
|
||||
Let the script language be "good enough"; it would not need numerous
|
||||
features. Imagine debugging an embedded Perl module while debugging
|
||||
OpenOCD. Yuck. OpenOCD already has a complex enough build system, why
|
||||
make it worse?
|
||||
|
||||
The goal was to add a simple language that would be moderately easy to
|
||||
work with and be self-contained. JimTCL is a single C and single H
|
||||
file, allowing OpenOCD to avoid the spider web of dependent packages.
|
||||
|
||||
@section serverdocstcl TCL Server Port
|
||||
|
||||
The TCL Server port was added in mid-2008. With embedded TCL, we can
|
||||
write scripts internally to help things, or we can write "C" code that
|
||||
interfaces well with TCL.
|
||||
|
||||
From there, the developers wanted to create an external front-end that
|
||||
would be @a very usable and that that @a any language could utilize,
|
||||
allowing simple front-ends to be (a) cross-platform (b) languag
|
||||
agnostic, and (c) easy to develop and use.
|
||||
|
||||
Simple ASCII protocols are easy. For example, HTTP, FTP (control), and
|
||||
SMTP are all text-based. All of these examples are widely and
|
||||
well-known, and they do not require high-speed or high-volume. They
|
||||
also support a high degree of interoperability with multiple systems.
|
||||
They are not human-centric protocols; more correctly, they are rigid,
|
||||
terse, simple ASCII protocols that are emensely parsable by a script.
|
||||
|
||||
Thus, the TCL server -- a 'machine' type socket interface -- was added
|
||||
with the hope was it would output simple "name-value" pair type
|
||||
data. At the time, simple name/value pairs seemed reasonably easier to
|
||||
do at the time, though Maybe it should output JSON;
|
||||
|
||||
See here:
|
||||
|
||||
http://www.mail-archive.com/openocd-development%40lists.berlios.de/msg00248.html
|
||||
|
||||
The hope was that one could write a script in what ever language you want
|
||||
and do things with it!
|
||||
|
||||
@section serverdocsgui GUI Like Interfaces
|
||||
|
||||
A lot has been said about various "widigit-foo-gui-library is so
|
||||
wonderful". Please refer back to the domino and spider web problem of
|
||||
dependencies. Sure, you may well know the WhatEver-GUI library, but
|
||||
most others will not (including the next contributer to OpenOCD).
|
||||
How do we solve that problem?
|
||||
|
||||
For example, Cygwin can be painful, Cygwin GUI packages want X11
|
||||
to be present, crossing the barrier between MinGW and Cygwin is
|
||||
painful, let alone getting the GUI front end to work on MacOS, and
|
||||
Linux, yuck yuck yuck. Painful. very very painful.
|
||||
|
||||
What works easier and is less work is what is already present in every
|
||||
platform? The answer: A web browser. In other words, OpenOCD could
|
||||
serve out embedded web pages via "localhost" to your browser.
|
||||
|
||||
Long before OpenOCD had a TCL command line, Zylin AS built their ZY1000
|
||||
devince with a built-in HTTP server. Later, they were willing to both
|
||||
contribute and integrate most of that work into the main tree.
|
||||
|
||||
@subsection serverdocsother Other Options Considered
|
||||
|
||||
What if a web browser is not acceptable ie: You want to write your own
|
||||
front gadget in Eclipse, or KDevelop, or PerlTK, Ruby, or what ever
|
||||
the latest and greatest Script De Jour is.
|
||||
|
||||
- Option 1: Can we transport this extra data through the GDB server
|
||||
protocol? In other words, can we extend the GDB server protocol?
|
||||
No, Eclipse wants to talk to GDB directly and control the GDB port.
|
||||
|
||||
- Option 2: SWIG front end (libopenocd): Would that work?
|
||||
|
||||
That's painful - unless you design your api to be very simplistic -
|
||||
every language has it's own set of wack-ness, parameter marshaling is
|
||||
painful.
|
||||
|
||||
What about "callbacks" and structures, and other mess. Imagine
|
||||
debugging that system. When JimTCL was introduced Spencer Oliver had
|
||||
quite a few well-put concerns (Summer 2008) about the idea of "TCL"
|
||||
taking over OpenOCD. His concern is and was: how do you debug
|
||||
something written in 2 different languages? A "SWIG" front-end is
|
||||
unlikely to help that situation.
|
||||
|
||||
@subsection serverdoccombined Combined: Socket & WebServer Benifits
|
||||
|
||||
Seriously think about this question: What script language (or compiled
|
||||
language) today cannot talk directly to a socket? Every thing in the
|
||||
OpenOCD world can work a socket interface. Any host side tool can talk
|
||||
to Localhost or remote host, however one might want to make it work.
|
||||
|
||||
A socket interface is very simple. One could write a Java application
|
||||
and serve it out via the embedded web server, could it - or something
|
||||
like it talk to the built in TCL server? Yes, absolutely! We are on to
|
||||
something here.
|
||||
|
||||
@subsection serverdocplatforms Platform Permuntations
|
||||
|
||||
Look at some permutations where OpenOCD can run; these "just work" if
|
||||
the Socket Approach is used.
|
||||
|
||||
|
||||
- Linux/Cygwin/MinGw/MacOSx/FreeBSD development Host Locally
|
||||
- OpenOCD with some dongle on that host
|
||||
|
||||
|
||||
- Linux/Cygwin/MingW/MacOS/FreeBSD development host
|
||||
- DONGLE: tcpip based ARM-Linux perhaps at91rm9200 or ep93xx.c, running openocd.
|
||||
|
||||
|
||||
- Windows cygwin/X desktop environment.
|
||||
- Linux development host (via remote X11)
|
||||
- Dongle: "eb93xx.c" based linux board
|
||||
|
||||
|
||||
@subsection serverdocfuture Development Scale Out
|
||||
|
||||
During 2008, Duane Ellis created some TCL scripts to display peripheral
|
||||
register contents. For example, look at the sam7 TCL scripts, and the
|
||||
stm32 TCL scripts. The hope was others would create more.
|
||||
|
||||
|
||||
A good example of this is display/view the peripheral registers on
|
||||
your embedded target. Lots of commercial embedded debug tools have
|
||||
this, some can show the TIMER registers, the interrupt controller.
|
||||
|
||||
What if the chip companies behind STM32, or PIC32, AT91SAM chips -
|
||||
wanted to write something that makes working with their chip better,
|
||||
easier, faster, etc.
|
||||
|
||||
@a Question: How can we (the OpenOCD group) make that really fancy
|
||||
stuff across multiple different host platforms?
|
||||
|
||||
Remember: OpenOCD runs on:
|
||||
-# Linux via USB,
|
||||
-# ARM Linux - bit-banging GPIO pins
|
||||
-# MacOSX
|
||||
-# FreeBSD
|
||||
-# Cygwin
|
||||
-# MinGW32
|
||||
-# Ecos
|
||||
|
||||
How can we get that to work?
|
||||
|
||||
@subsection serverdocdebug What about Debugger Plugins?
|
||||
|
||||
Really GDB is nice, it works, but it is not a good embedded debug tool.
|
||||
OpenOCD cannot work in a GUI when one cannot get to its command line.
|
||||
Some GDB front-end developers have pedantic designs that refuse any and
|
||||
all access to the GDB command line (e.g. http://www.kdbg.org/todo.php).
|
||||
|
||||
The TELNET interface to OpenOCD works, but the intent of that interface
|
||||
is <b>human interaction</b>. It must remain available, developers depend
|
||||
upon it, sometimes that is the only scheme available.
|
||||
|
||||
As a small group of developers, supporting all the platforms and
|
||||
targets in the debugger will be difficult, as there are enough problem
|
||||
with the plethora of Adapters, Chips, and different target boards.
|
||||
Yes, the TCL interface might be suitable, but it has not received much
|
||||
love or attention. Perhaps it will after you read and understand this.
|
||||
|
||||
One reason might be, this adds one more host side requirement to make
|
||||
use of the feature. In other words, one could write a Python/TK
|
||||
front-end, but it is only useable if you have Python/TK installed.
|
||||
Maybe this can be done via Ecllipse, but not all developers use Ecplise.
|
||||
Many devlopers use Emacs (possibly with GUD mode) or vim and will not
|
||||
accept such an interface. The next developer reading this might be
|
||||
using Insight (GDB-TK) - and somebody else - DDD..
|
||||
|
||||
There is no common host-side GDB front-end method.
|
||||
|
||||
@section serverdocschallenge Front-End Scaling
|
||||
|
||||
Maybe we are wrong - ie: OpenOCD + some TK tool
|
||||
|
||||
Remember: OpenOCD is often (maybe 99.9%) of the time used with
|
||||
GDB-REMOTE. There is always some front-end package - be it command-line
|
||||
GDB under DDD, Eclipse, KDevelop, Emacs, or some other package
|
||||
(e.g. IAR tools can talk to GDB servers). How can the OpenOCD
|
||||
developers make that fancy target display GUI visible under 5 to 10
|
||||
different host-side GDB..
|
||||
|
||||
Sure - a <em>man on a mission</em> can make that work. The GUI might be
|
||||
libopenocd + Perl/TK, or maybe an Eclipse Plug-in.
|
||||
That is a development support nightmare for reasons described
|
||||
above. We have enough support problems as it is with targets, adapters,
|
||||
etc.
|
||||
|
||||
@section serverdocshttpbg HTTP Server Background
|
||||
|
||||
OpenOCD includes an HTTP server because most development environments
|
||||
are likely contain a web browser. The web browser can talk to OpenOCD's
|
||||
HTTP server and provide a high-level interfaces to the program.
|
||||
Altogether, it provides a universally accessible GUI for OpenOCD.
|
||||
|
||||
@section serverdocshtml Simple HTML Pages
|
||||
|
||||
There is (or could be) a simple "Jim TCL" function to read a memory
|
||||
location. If that can be tied into a TCL script that can modify the
|
||||
HTTP text, then we have a simple script-based web server with a JTAG
|
||||
engine under the hood.
|
||||
|
||||
Imagine a web page - served from a small board with two buttons:
|
||||
"LED_ON" and "LED_OFF", each click - turns the LED on or OFF, a very
|
||||
simplistic idea. Little boards with web servers are great examples of
|
||||
this: Ethernut is a good example and Contiki (not a board, an embedded
|
||||
OS) is another example.
|
||||
|
||||
One could create a simple: <b>Click here to display memory</b> or maybe
|
||||
<b>click here to display the UART REGISTER BLOCK</b>; click again and see
|
||||
each register explained in exquisit detail.
|
||||
|
||||
For an STM32, one could create a simple HTML page, with simple
|
||||
substitution text that the simple web server use to substitute the
|
||||
HTML text JIMTCL_PEEK32( 0x12345678 ) with the value read from
|
||||
memory. We end up with an HTML page that could list the contents of
|
||||
every peripheral register on the target platform.
|
||||
|
||||
That also is transportable, regardless of the OpenOCD host
|
||||
platform: Linux/X86, Linux/ARM, FreeBSD, Cygwin, MingW, or MacOSX.
|
||||
You could even port OpenOCD to an Android system and use it as a
|
||||
bit-banging JTAG Adapter serving web pages.
|
||||
|
||||
@subsection serverdocshtmladv Advanced HTML Pages
|
||||
|
||||
Java or JavaScript could be used to talk back to the TCL port. One
|
||||
could write a Java, AJAX, FLASH, or some other developer friendly
|
||||
toolbox and get a real cross-platform GUI interface. Sure, the interface
|
||||
is not native - but it is 100% cross-platform!
|
||||
|
||||
OpenOCD current uses simple HTML pages; others might be an Adobe FLASH
|
||||
expert, or a Java Expert. These possibilities could allow the pages
|
||||
remain cross-platform but still provide a rich user-interface
|
||||
experience.
|
||||
|
||||
Don't forget it can also be very simple, exactly what one developer
|
||||
can contribute, a set of very simple web pages.
|
||||
|
||||
@subsection serverdocshtmlstatus HTTP/HTML Status
|
||||
|
||||
As of May 2009, much of the HTML pages were contributed by Zylin AS,
|
||||
hence they continue to retain some resemblance to the ZY1000 interface.
|
||||
|
||||
Patches would be welcome to move these parts of the system forward.
|
||||
|
||||
*/
|
||||
|
||||
/** @page servergdb OpenOCD GDB Server API
|
||||
|
||||
This section needs to be expanded.
|
||||
|
||||
*/
|
||||
|
||||
/** @page servertelnet OpenOCD Telnet Server API
|
||||
|
||||
This section needs to be expanded.
|
||||
|
||||
*/
|
||||
|
||||
/** @page serverhttp OpenOCD http Server API
|
||||
|
||||
This section needs to be expanded.
|
||||
|
||||
*/
|
||||
403
debuggers/openocd/doc/manual/style.txt
Normal file
403
debuggers/openocd/doc/manual/style.txt
Normal file
@ -0,0 +1,403 @@
|
||||
/** @page styleguide Style Guides
|
||||
|
||||
The goals for each of these guides are:
|
||||
- to produce correct code that appears clean, consistent, and readable,
|
||||
- to allow developers to create patches that conform to a standard, and
|
||||
- to eliminate these issues as points of future contention.
|
||||
|
||||
Some of these rules may be ignored in the spirit of these stated goals;
|
||||
however, such exceptions should be fairly rare.
|
||||
|
||||
The following style guides describe a formatting, naming, and other
|
||||
conventions that should be followed when writing or changing the OpenOCD
|
||||
code:
|
||||
|
||||
- @subpage styletcl
|
||||
- @subpage stylec
|
||||
- @subpage styleperl
|
||||
- @subpage styleautotools
|
||||
|
||||
In addition, the following style guides provide information for
|
||||
providing documentation, either as part of the C code or stand-alone.
|
||||
|
||||
- @subpage styledoxygen
|
||||
- @subpage styletexinfo
|
||||
- @subpage stylelatex
|
||||
|
||||
Feedback would be welcome to improve the OpenOCD guidelines.
|
||||
|
||||
*/
|
||||
/** @page styletcl TCL Style Guide
|
||||
|
||||
OpenOCD needs to expand its Jim/TCL Style Guide.
|
||||
|
||||
Many of the guidelines listed on the @ref stylec page should apply to
|
||||
OpenOCD's Jim/TCL code as well.
|
||||
|
||||
*/
|
||||
/** @page stylec C Style Guide
|
||||
|
||||
This page contains guidelines for writing new C source code for the
|
||||
OpenOCD project.
|
||||
|
||||
@section styleformat Formatting Guide
|
||||
|
||||
- remove any trailing white space at the end of lines.
|
||||
- use TAB characters for indentation; do NOT use spaces.
|
||||
- displayed TAB width is 4 characters.
|
||||
- use Unix line endings ('\\n'); do NOT use DOS endings ('\\r\\n')
|
||||
- limit adjacent empty lines to at most two (2).
|
||||
- remove any trailing empty lines at the end of source files
|
||||
- do not "comment out" code from the tree; instead, one should either:
|
||||
-# remove it entirely (git can retrieve the old version), or
|
||||
-# use an @c \#if/\#endif block.
|
||||
|
||||
Finally, try to avoid lines of code that are longer than than 72-80 columns:
|
||||
|
||||
- long lines frequently indicate other style problems:
|
||||
- insufficient use of static functions, macros, or temporary variables
|
||||
- poor flow-control structure; "inverted" logical tests
|
||||
- a few lines may be wider than this limit (typically format strings), but:
|
||||
- all C compilers will concatenate series of string constants.
|
||||
- all long string constants should be split across multiple lines.
|
||||
|
||||
@section stylenames Naming Rules
|
||||
|
||||
- most identifiers must use lower-case letters (and digits) only.
|
||||
- macros must use upper-case letters (and digits) only.
|
||||
- OpenOCD identifiers should NEVER use @c MixedCaps.
|
||||
- @c typedef names must end with the '_t' suffix.
|
||||
- This should be reserved for types that should be passed by value.
|
||||
- Do @b not mix the typedef keyword with @c struct.
|
||||
- use underline characters between consecutive words in identifiers
|
||||
(e.g. @c more_than_one_word).
|
||||
|
||||
@section stylec99 C99 Rules
|
||||
|
||||
- inline functions
|
||||
- @c // comments -- in new code, prefer these for single-line comments
|
||||
- trailing comma allowed in enum declarations
|
||||
- designated initializers ( .field = value )
|
||||
- variables declarations should occur at the point of first use
|
||||
- new block scopes for selection and iteration statements
|
||||
- use malloc() to create dynamic arrays. Do @b not use @c alloca
|
||||
or variable length arrays on the stack. non-MMU hosts(uClinux) and
|
||||
pthreads require modest and predictable stack usage.
|
||||
|
||||
@section styletypes Type Guidelines
|
||||
- use native types (@c int or @c unsigned) if the type is not important
|
||||
- if size matters, use the types from \<stdint.h\> or \<inttypes.h\>:
|
||||
- @c int8_t, @c int16_t, @c int32_t, or @c int64_t: signed types of specified size
|
||||
- @c uint8_t, @c uint16_t, @c uint32_t, or @c uint64_t: unsigned types of specified size
|
||||
- do @b NOT redefine @c uN types from "types.h"
|
||||
|
||||
@section stylefunc Functions
|
||||
|
||||
- static inline functions should be prefered over macros:
|
||||
@code
|
||||
/** do NOT define macro-like functions like this... */
|
||||
#define CUBE(x) ((x) * (x) * (x))
|
||||
/** instead, define the same expression using a C99 inline function */
|
||||
static inline int cube(int x) { return x * x * x; }
|
||||
@endcode
|
||||
- Functions should be declared static unless required by other modules
|
||||
- define static functions before first usage to avoid forward declarations.
|
||||
- Functions should have no space between its name and its parameter list:
|
||||
@code
|
||||
int f(int x1, int x2)
|
||||
{
|
||||
...
|
||||
int y = f(x1, x2 - x1);
|
||||
...
|
||||
}
|
||||
@endcode
|
||||
- Separate assignment and logical test statements. In other words, you
|
||||
should write statements like the following:
|
||||
@code
|
||||
// separate statements should be preferred
|
||||
result = foo();
|
||||
if (ERROR_OK != result)
|
||||
...
|
||||
@endcode
|
||||
More directly, do @b not combine these kinds of statements:
|
||||
@code
|
||||
// Combined statements should be avoided
|
||||
if (ERROR_OK != (result = foo()))
|
||||
return result;
|
||||
@endcode
|
||||
|
||||
*/
|
||||
/** @page styledoxygen Doxygen Style Guide
|
||||
|
||||
The following sections provide guidelines for OpenOCD developers
|
||||
who wish to write Doxygen comments in the code or this manual.
|
||||
For an introduction to Doxygen documentation,
|
||||
see the @ref primerdoxygen.
|
||||
|
||||
@section styledoxyblocks Doxygen Block Selection
|
||||
|
||||
Several different types of Doxygen comments can be used; often,
|
||||
one style will be the most appropriate for a specific context.
|
||||
The following guidelines provide developers with heuristics for
|
||||
selecting an appropriate form and writing consistent documentation
|
||||
comments.
|
||||
|
||||
-# use @c /// to for one-line documentation of instances.
|
||||
-# for documentation requiring multiple lines, use a "block" style:
|
||||
@verbatim
|
||||
/**
|
||||
* @brief First sentence is short description. Remaining text becomes
|
||||
* the full description block, where "empty" lines start new paragraphs.
|
||||
*
|
||||
* One can make text appear in @a italics, @b bold, @c monospace, or
|
||||
* in blocks such as the one in which this example appears in the Style
|
||||
* Guide. See the Doxygen Manual for the full list of commands.
|
||||
*
|
||||
* @param foo For a function, describe the parameters (e.g. @a foo).
|
||||
* @returns The value(s) returned, or possible error conditions.
|
||||
*/
|
||||
@endverbatim
|
||||
-# The block should start on the line following the opening @c /**.
|
||||
-# The end of the block, \f$*/\f$, should also be on its own line.
|
||||
-# Every line in the block should have a @c '*' in-line with its start:
|
||||
- A leading space is required to align the @c '*' with the @c /** line.
|
||||
- A single "empty" line should separate the function documentation
|
||||
from the block of parameter and return value descriptions.
|
||||
- Except to separate paragraphs of documentation, other extra
|
||||
"empty" lines should be removed from the block.
|
||||
-# Only single spaces should be used; do @b not add mid-line indentation.
|
||||
-# If the total line length will be less than 72-80 columns, then
|
||||
- The @c /**< form can be used on the same line.
|
||||
- This style should be used sparingly; the best use is for fields:
|
||||
@code int field; /**< field description */ @endcode
|
||||
|
||||
@section styledoxyall Doxygen Style Guide
|
||||
|
||||
The following guidelines apply to all Doxygen comment blocks:
|
||||
|
||||
-# Use the @c '\@cmd' form for all doxygen commands (do @b not use @c '\\cmd').
|
||||
-# Use symbol names such that Doxygen automatically creates links:
|
||||
-# @c function_name() can be used to reference functions
|
||||
(e.g. flash_set_dirty()).
|
||||
-# @c struct_name::member_name should be used to reference structure
|
||||
fields in the documentation (e.g. @c flash_driver::name).
|
||||
-# URLS get converted to markup automatically, without any extra effort.
|
||||
-# new pages can be linked into the heirarchy by using the @c \@subpage
|
||||
command somewhere the page(s) under which they should be linked:
|
||||
-# use @c \@ref in other contexts to create links to pages and sections.
|
||||
-# Use good Doxygen mark-up:
|
||||
-# '\@a' (italics) should be used to reference parameters (e.g. <i>foo</i>).
|
||||
-# '\@b' (bold) should be used to emphasizing <b>single</b> words.
|
||||
-# '\@c' (monospace) should be used with <code>file names</code> and
|
||||
<code>code symbols</code>, so they appear visually distinct from
|
||||
surrounding text.
|
||||
-# To mark-up multiple words, the HTML alternatives must be used.
|
||||
-# Two spaces should be used when nesting lists; do @b not use '\\t' in lists.
|
||||
-# Code examples provided in documentation must conform to the Style Guide.
|
||||
|
||||
@section styledoxytext Doxygen Text Inputs
|
||||
|
||||
In addition to the guidelines in the preceding sections, the following
|
||||
additional style guidelines should be considered when writing
|
||||
documentation as part of standalone text files:
|
||||
|
||||
-# Text files must contain Doxygen at least one comment block:
|
||||
-# Documentation should begin in the first column (except for nested lists).
|
||||
-# Do NOT use the @c '*' convention that must be used in the source code.
|
||||
-# Each file should contain at least one @c \@page block.
|
||||
-# Each new page should be listed as a \@subpage in the \@page block
|
||||
of the page that should serve as its parent.
|
||||
-# Large pages should be structure in parts using meaningful \@section
|
||||
and \@subsection commands.
|
||||
-# Include a @c \@file block at the end of each Doxygen @c .txt file to
|
||||
document its contents:
|
||||
- Doxygen creates such pages for files automatically, but no content
|
||||
will appear on them for those that only contain manual pages.
|
||||
- The \@file block should provide useful meta-documentation to assist
|
||||
techincal writers; typically, a list of the pages that it contains.
|
||||
- For example, the @ref styleguide exists in @c doc/manual/style.txt,
|
||||
which contains a reference back to itself.
|
||||
-# The \@file and \@page commands should begin on the same line as
|
||||
the start of the Doxygen comment:
|
||||
@verbatim
|
||||
/** @page pagename Page Title
|
||||
|
||||
Documentation for the page.
|
||||
|
||||
*/
|
||||
/** @file
|
||||
|
||||
This file contains the @ref pagename page.
|
||||
|
||||
*/
|
||||
@endverbatim
|
||||
|
||||
For an example, the Doxygen source for this Style Guide can be found in
|
||||
@c doc/manual/style.txt, alongside other parts of The Manual.
|
||||
|
||||
*/
|
||||
/** @page styletexinfo Texinfo Style Guide
|
||||
|
||||
The User's Guide is there to provide two basic kinds of information. It
|
||||
is a guide for how and why to use each feature or mechanism of OpenOCD.
|
||||
It is also the reference manual for all commands and options involved
|
||||
in using them, including interface, flash, target, and other drivers.
|
||||
At this time, it is the only user-targetted documentation; everything
|
||||
else is addressing OpenOCD developers.
|
||||
|
||||
There are two key audiences for the User's Guide, both developer based.
|
||||
The primary audience is developers using OpenOCD as a tool in their
|
||||
work, or who may be starting to use it that way. A secondary audience
|
||||
includes developers who are supporting those users by packaging or
|
||||
customizing it for their hardware, installing it as part of some software
|
||||
distribution, or by evolving OpenOCD itself. There is some crossover
|
||||
between those audiences. We encourage contributions from users as the
|
||||
fundamental way to evolve and improve OpenOCD. In particular, creating
|
||||
a board or target specific configuration file is something that many
|
||||
users will end up doing at some point, and we like to see such files
|
||||
become part of the mainline release.
|
||||
|
||||
General documentation rules to remember include:
|
||||
|
||||
- Be concise and clear. It's work to remove those extra words and
|
||||
sentences, but such "noise" doesn't help readers.
|
||||
- Make it easy to skim and browse. "Tell what you're going to say,
|
||||
then say it". Help readers decide whether to dig in now, or
|
||||
leave it for later.
|
||||
- Make sure the chapters flow well. Presentations should not jump
|
||||
around, and should move easily from overview down to details.
|
||||
- Avoid using the passive voice.
|
||||
- Address the reader to clarify roles ("your config file", "the board you
|
||||
are debugging", etc.); "the user" (etc) is artificial.
|
||||
- Use good English grammar and spelling. Remember also that English
|
||||
will not be the first language for many readers. Avoid complex or
|
||||
idiomatic usage that could create needless barriers.
|
||||
- Use examples to highlight fundamental ideas and common idioms.
|
||||
- Don't overuse list constructs. This is not a slide presentation;
|
||||
prefer paragraphs.
|
||||
|
||||
When presenting features and mechanisms of OpenOCD:
|
||||
|
||||
- Explain key concepts before presenting commands using them.
|
||||
- Tie examples to common developer tasks.
|
||||
- When giving instructions, you can \@enumerate each step both
|
||||
to clearly delineate the steps, and to highlight that this is
|
||||
not explanatory text.
|
||||
- When you provide "how to use it" advice or tutorials, keep it
|
||||
in separate sections from the reference material.
|
||||
- Good indexing is something of a black art. Use \@cindex for important
|
||||
concepts, but don't overuse it. In particular, rely on the \@deffn
|
||||
indexing, and use \@cindex primarily with significant blocks of text
|
||||
such as \@subsection. The \@dfn of a key term may merit indexing.
|
||||
- Use \@xref (and \@anchor) with care. Hardcopy versions, from the PDF,
|
||||
must make sense without clickable links (which don't work all that well
|
||||
with Texinfo in any case). If you find you're using many links,
|
||||
read that as a symptom that the presentation may be disjointed and
|
||||
confusing.
|
||||
- Avoid font tricks like \@b, but use \@option, \@file, \@dfn, \@emph
|
||||
and related mechanisms where appropriate.
|
||||
|
||||
For technical reference material:
|
||||
|
||||
- It's OK to start sections with explanations and end them with
|
||||
detailed lists of the relevant commands.
|
||||
- Use the \@deffn style declarations to define all commands and drivers.
|
||||
These will automatically appear in the relevant index, and those
|
||||
declarations help promote consistent presentation and style.
|
||||
- It's a "Command" if it can be used interactively.
|
||||
- Else it's a "Config Command" if it must be used before the
|
||||
configuration stage completes.
|
||||
- For a "Driver", list its name.
|
||||
- Use EBNF style regular expressions to define parameters:
|
||||
brackets around zero-or-one choices, parentheses around
|
||||
exactly-one choices.
|
||||
- Use \@option, \@file, \@var and other mechanisms where appropriate.
|
||||
- Say what output it displays, and what value it returns to callers.
|
||||
- Explain clearly what the command does. Sometimes you will find
|
||||
that it can't be explained clearly. That usually means the command
|
||||
is poorly designed; replace it with something better, if you can.
|
||||
- Be complete: document all commands, except as part of a strategy
|
||||
to phase something in or out.
|
||||
- Be correct: review the documentation against the code, and
|
||||
vice versa.
|
||||
- Alphabetize the \@defn declarations for all commands in each
|
||||
section.
|
||||
- Keep the per-command documentation focussed on exactly what that
|
||||
command does, not motivation, advice, suggestions, or big examples.
|
||||
When commands deserve such expanded text, it belongs elsewhere.
|
||||
Solutions might be using a \@section explaining a cluster of related
|
||||
commands, or acting as a mini-tutorial.
|
||||
- Details for any given driver should be grouped together.
|
||||
|
||||
The User's Guide is the first place most users will start reading,
|
||||
after they begin using OpenOCD. Make that investment of their time
|
||||
be as productive as possible. Needing to look at OpenOCD source code,
|
||||
to figure out how to use it is a bad sign, though it's OK to need to
|
||||
look at the User's guide to figure out what a config script is doing.
|
||||
|
||||
*/
|
||||
/** @page stylelatex LaTeX Style Guide
|
||||
|
||||
This page needs to provide style guidelines for using LaTeX, the
|
||||
typesetting language used by The References for OpenOCD Hardware.
|
||||
Likewise, the @ref primerlatex for using this guide needs to be completed.
|
||||
|
||||
*/
|
||||
/** @page styleperl Perl Style Guide
|
||||
|
||||
This page provides some style guidelines for using Perl, a scripting
|
||||
language used by several small tools in the tree:
|
||||
|
||||
-# Ensure all Perl scripts use the proper suffix (@c .pl for scripts, and
|
||||
@c .pm for modules)
|
||||
-# Pass files as script parameters or piped as input:
|
||||
- Do NOT code paths to files in the tree, as this breaks out-of-tree builds.
|
||||
- If you must, then you must also use an automake rule to create the script.
|
||||
-# use @c '#!/usr/bin/perl' as the first line of Perl scripts.
|
||||
-# always <code>use strict</code> and <code>use warnings</code>
|
||||
-# invoke scripts indirectly in Makefiles or other scripts:
|
||||
@code
|
||||
perl script.pl
|
||||
@endcode
|
||||
|
||||
Maintainers must also be sure to follow additional guidelines:
|
||||
-# Ensure that Perl scripts are committed as executables:
|
||||
Use "<code>chmod +x script.pl</code>"
|
||||
@a before using "<code>git add script.pl</code>"
|
||||
|
||||
*/
|
||||
/** @page styleautotools Autotools Style Guide
|
||||
|
||||
This page contains style guidelines for the OpenOCD autotools scripts.
|
||||
|
||||
The following guidelines apply to the @c configure.ac file:
|
||||
- Better guidelines need to be developed, but until then...
|
||||
- Use good judgement.
|
||||
|
||||
The following guidelines apply to @c Makefile.am files:
|
||||
-# When assigning variables with long lists of items:
|
||||
-# Separate the values on each line to make the files "patch friendly":
|
||||
@code
|
||||
VAR = \
|
||||
value1 \
|
||||
value2 \
|
||||
...
|
||||
value9 \
|
||||
value10
|
||||
@endcode
|
||||
*/
|
||||
/** @file
|
||||
|
||||
This file contains the @ref styleguide pages. The @ref styleguide pages
|
||||
include the following Style Guides for their respective code and
|
||||
documentation languages:
|
||||
|
||||
- @ref styletcl
|
||||
- @ref stylec
|
||||
- @ref styledoxygen
|
||||
- @ref styletexinfo
|
||||
- @ref stylelatex
|
||||
- @ref styleperl
|
||||
- @ref styleautotools
|
||||
|
||||
*/
|
||||
46
debuggers/openocd/doc/manual/target.txt
Normal file
46
debuggers/openocd/doc/manual/target.txt
Normal file
@ -0,0 +1,46 @@
|
||||
/** @page targetdocs OpenOCD Target APIs
|
||||
|
||||
OpenOCD provides its Target APIs to allow developers to provide trace and
|
||||
debugging support for specific device targets. These primarily consist of
|
||||
ARM cores, but other types have been supported. New targets should be
|
||||
developed by following or using these APIs.
|
||||
|
||||
The Target Support module contains APIs that cover several functional areas:
|
||||
|
||||
- @subpage targetarm
|
||||
- @subpage targetnotarm
|
||||
- @subpage targetmips
|
||||
- @subpage targetregister
|
||||
- @subpage targetimage
|
||||
- @subpage targettrace
|
||||
|
||||
This section needs to be expanded.
|
||||
|
||||
*/
|
||||
|
||||
/** @page targetarm OpenOCD ARM Targets
|
||||
|
||||
This section needs to describe OpenOCD's ARM target support.
|
||||
|
||||
*/
|
||||
|
||||
/** @page targetregister OpenOCD Target Register API
|
||||
|
||||
This section needs to describe OpenOCD's Target Register API, as
|
||||
provided by 'src/target/register.h'.
|
||||
|
||||
*/
|
||||
|
||||
/** @page targetimage OpenOCD Target Image API
|
||||
|
||||
This section needs to describe OpenOCD's Target Image API, as provided
|
||||
by 'src/target/image.h'.
|
||||
|
||||
*/
|
||||
|
||||
/** @page targettrace OpenOCD Target Trace API
|
||||
|
||||
This section needs to describe OpenOCD's Target Trace API, as provided
|
||||
by 'src/target/trace.h'.
|
||||
|
||||
*/
|
||||
536
debuggers/openocd/doc/manual/target/mips.txt
Normal file
536
debuggers/openocd/doc/manual/target/mips.txt
Normal file
@ -0,0 +1,536 @@
|
||||
/** @page targetmips OpenOCD MIPS Targets
|
||||
|
||||
@section ejatgmem EJTAG Memory Addresses
|
||||
|
||||
An optional uncached and unmapped debug segment dseg (EJTAG area) appears in the address range
|
||||
0xFFFF FFFF FF20 0000 to 0xFFFF FFFF FF3F FFFF. The dseg segment thereby appears in the kseg part of the
|
||||
compatibility segment, and access to kseg is possible with the dseg segment.
|
||||
|
||||
The dseg segment is subdivided into dmseg (EJTAG memory) segment and the drseg (EJTAG registers) segment. The
|
||||
dmseg segment is used when the probe services the memory segment. The drseg segment is used when the
|
||||
memory-mapped debug registers are accessed. Table 5-2 shows the subdivision and attributes for the segments.
|
||||
|
||||
dseg is divided in :
|
||||
|
||||
- dmseg (0xFFFF FFFF FF20 0000 to 0xFFFF FFFF FF2F FFFF)
|
||||
- drseg (0xFFFF FFFF FF30 0000 to 0xFFFF FFFF FF3F FFFF)
|
||||
|
||||
Because the dseg segment is serviced exclusively by the EJTAG features, there
|
||||
are no physical address per se. Instead the lower 21 bits of the virtual address select
|
||||
the appropriate reference in either EJTAG memory or registers. References are not mapped through the
|
||||
TLB, nor do the accesses appear on the external system memory interface.
|
||||
|
||||
Both of this memory segments are Uncached.
|
||||
|
||||
On debug exception (break) CPU jumps to the beginning of dmseg. This some kind of memory shared
|
||||
between CPU and EJTAG dongle.
|
||||
|
||||
There CPU stops (correct terminology is : stalls, because it stops it's pipeline), and is waiting for some action of dongle.
|
||||
|
||||
If the dongle gives it instruction, CPU executes it, augments it's PC to 0xFFFF FFFF FF20 0001 - but it again points to dmseg area,
|
||||
so it stops waiting for next instruction.
|
||||
|
||||
This will all become clear later, after reading following prerequisite chapters.
|
||||
|
||||
@section impflags Important flags
|
||||
|
||||
@subsection pnnw PNnW
|
||||
|
||||
Indicates read or write of a pending processor access:
|
||||
|
||||
- 0 : Read processor access, for a fetch/load access
|
||||
- 1 : Write processor access, for a store access
|
||||
|
||||
This value is defined only when a processor access is pending.
|
||||
|
||||
Processor will do the action for us : it can for example read internal state (register values),
|
||||
and send us back the information via EJTAG memory (dmseg), or it can take some data from dmseg and write it into the registers or RAM.
|
||||
|
||||
Every time when it sees address (i.e. when this address is the part of the opcode it is executing, wether it is instruction or data fetch)
|
||||
that falls into dmseg, processor stalls. That acutally meand that CPU stops it's pipeline and it is waitning for dongle to take some action.
|
||||
|
||||
CPU is now either waiting for dongle to take some data from dmseg (if we requested for CPU do give us internal state, for example),
|
||||
or it will wait for some data from dongle (if it needs following instruction because it did previous, or if the operand address of the currently executed opcode
|
||||
falls somewhere (anywhere) in dmseg (0xff..ff20000 - 0xff..ff2fffff)).
|
||||
|
||||
Bit PNnW describes character of CPU access to EJTAG memory (the memry where dongle puts/takes data) - CPU can either READ for it (PNnW == 0) or
|
||||
WRITE to it (PNnW == 1).
|
||||
|
||||
By reading PNnW bit OpenOCD will know if it has to send (PNnW == 0) or to take (PNnW == 1) data (from dmseg, via dongle).
|
||||
|
||||
@subsection pracc PrAcc
|
||||
|
||||
Indicates a pending processor access and controls finishing of a pending processor access.
|
||||
|
||||
When read:
|
||||
|
||||
- 0 : No pending processor access
|
||||
- 1 : Pending processor access
|
||||
|
||||
A write of 0 finishes a processor access if pending;
|
||||
otherwise operation of the processor is UNDEFINED
|
||||
if the bit is written to 0 when no processor access is
|
||||
pending. A write of 1 is ignored.
|
||||
|
||||
A successful FASTDATA access will clear this bit.
|
||||
|
||||
As noted above, on any access to dmseg, processor will stall. It waits for dongle to do some action - either to take or put some data.
|
||||
OpenOCD can figure out which action has to be taken by reading PrAcc bit.
|
||||
|
||||
Once action from dongle has been done, i.e. after the data is taken/put, OpenOCD can signal to CPU to proceed with executing the instruction.
|
||||
This can be the next instruction (if previous was finished before pending), or the same instruction - if for example CPU was waiting on dongle
|
||||
to give it an operand, because it saw in the instruction opcode that operand address is somewhere in dmseg. That prowoked the CPU to stall (it tried operand fetch to dmseg and stopped),
|
||||
and PNnW bit is 0 (CPU does read from dmseg), and PrAcc is 1 (CPU is pending on dmseg access).
|
||||
|
||||
@subsection spracc SPrAcc
|
||||
|
||||
Shifting in a zero value requests completion of the Fastdata access.
|
||||
|
||||
The PrAcc bit in the EJTAG Control register is overwritten with zero when the access
|
||||
succeeds. (The access succeeds if PrAcc is one and the operation address is in the legal dmseg segment
|
||||
Fastdata area.)
|
||||
|
||||
When successful, a one is shifted out. Shifting out a zero indicates a Fastdata access failure.
|
||||
Shifting in a one does not complete the Fastdata access and the PrAcc bit is unchanged. Shifting out a
|
||||
one indicates that the access would have been successful if allowed to complete and a zero indicates
|
||||
the access would not have successfully completed.
|
||||
|
||||
@section fdreg Fastdata Register (TAP Instruction FASTDATA)
|
||||
|
||||
The width of the Fastdata register is 1 bit.
|
||||
|
||||
During a Fastdata access, the Fastdata register is written and read, i.e., a bit is
|
||||
shifted in and a bit is shifted out.
|
||||
|
||||
Also during a Fastdata access, the Fastdata register value shifted in specifies whether the Fastdata
|
||||
access should be completed or not. The value shifted out is a flag that indicates whether the Fastdata access was
|
||||
successful or not (if completion was requested).
|
||||
|
||||
@section ejtagacc EJTAG Access Implementation
|
||||
|
||||
OpenOCD reads/writes data to JTAG via mips_m4k_read_memory() and mips_m4k_write_memory() functions defined in src/target/mips_m4k.c.
|
||||
Internally, these functions call mips32_pracc_read_mem() and mips32_pracc_write_mem() defined in src/target/mips32_pracc.c
|
||||
|
||||
Let's take for example function mips32_pracc_read_mem32() which describes CPU reads (fetches) from dmseg (EJTAG memory) :
|
||||
|
||||
@code
|
||||
static const uint32_t code[] = {
|
||||
/* start: */
|
||||
MIPS32_MTC0(15,31,0), /* move $15 to COP0 DeSave */
|
||||
MIPS32_LUI(15,UPPER16(MIPS32_PRACC_STACK)), /* $15 = MIPS32_PRACC_STACK */
|
||||
MIPS32_ORI(15,15,LOWER16(MIPS32_PRACC_STACK)),
|
||||
MIPS32_SW(8,0,15), /* sw $8,($15) */
|
||||
MIPS32_SW(9,0,15), /* sw $9,($15) */
|
||||
MIPS32_SW(10,0,15), /* sw $10,($15) */
|
||||
MIPS32_SW(11,0,15), /* sw $11,($15) */
|
||||
|
||||
MIPS32_LUI(8,UPPER16(MIPS32_PRACC_PARAM_IN)), /* $8 = MIPS32_PRACC_PARAM_IN */
|
||||
MIPS32_ORI(8,8,LOWER16(MIPS32_PRACC_PARAM_IN)),
|
||||
MIPS32_LW(9,0,8), /* $9 = mem[$8]; read addr */
|
||||
MIPS32_LW(10,4,8), /* $10 = mem[$8 + 4]; read count */
|
||||
MIPS32_LUI(11,UPPER16(MIPS32_PRACC_PARAM_OUT)), /* $11 = MIPS32_PRACC_PARAM_OUT */
|
||||
MIPS32_ORI(11,11,LOWER16(MIPS32_PRACC_PARAM_OUT)),
|
||||
/* loop: */
|
||||
MIPS32_BEQ(0,10,8), /* beq 0, $10, end */
|
||||
MIPS32_NOP,
|
||||
|
||||
MIPS32_LW(8,0,9), /* lw $8,0($9), Load $8 with the word @mem[$9] */
|
||||
MIPS32_SW(8,0,11), /* sw $8,0($11) */
|
||||
|
||||
MIPS32_ADDI(10,10,NEG16(1)), /* $10-- */
|
||||
MIPS32_ADDI(9,9,4), /* $1 += 4 */
|
||||
MIPS32_ADDI(11,11,4), /* $11 += 4 */
|
||||
|
||||
MIPS32_B(NEG16(8)), /* b loop */
|
||||
MIPS32_NOP,
|
||||
/* end: */
|
||||
MIPS32_LW(11,0,15), /* lw $11,($15) */
|
||||
MIPS32_LW(10,0,15), /* lw $10,($15) */
|
||||
MIPS32_LW(9,0,15), /* lw $9,($15) */
|
||||
MIPS32_LW(8,0,15), /* lw $8,($15) */
|
||||
MIPS32_B(NEG16(27)), /* b start */
|
||||
MIPS32_MFC0(15,31,0), /* move COP0 DeSave to $15 */
|
||||
};
|
||||
@endcode
|
||||
|
||||
We have to pass this code to CPU via dongle via dmseg.
|
||||
|
||||
After debug exception CPU will find itself stalling at the begining of the dmseg. It waits for the first instruction from dongle.
|
||||
This is MIPS32_MTC0(15,31,0), so CPU saves C0 and continues to addr 0xFF20 0001, which falls also to dmseg, so it stalls.
|
||||
Dongle proceeds giving to CPU one by one instruction in this manner.
|
||||
|
||||
However, things are not so simple. If you take a look at the program, you will see that some instructions take operands. If it has to take
|
||||
operand from the address in dmseg, CPU will stall witing for the dongle to do the action of passing the operand and signal this by putting PrAcc to 0.
|
||||
If this operand is somewhere in RAM, CPU will not stall (it stalls only on dmseg), but it will just take it and proceed to nex instruction. But since PC for next instruction
|
||||
points to dmseg, it will stall, so that dongle can pass next instruction.
|
||||
|
||||
Some instuctions are jumps (if these are jumps in dmseg addr, CPU will jump and then stall. If this is jump to some address in RAM, CPU will jump and just proceed -
|
||||
will not stall on addresses in RAM).
|
||||
|
||||
To have information about CPU is currently (does it stalls wanting on operand or it jumped somewhere waiting for next instruction),
|
||||
OpenOCD has to call TAP ADDRESS instruction, which will ask CPU to give us his address within EJTAG memory :
|
||||
|
||||
@code
|
||||
address = data = 0;
|
||||
mips_ejtag_set_instr(ejtag_info, EJTAG_INST_ADDRESS);
|
||||
mips_ejtag_drscan_32(ejtag_info, &address);
|
||||
@endcode
|
||||
|
||||
And then, upon the results, we can conclude where it is in our code so far, so we can give it what it wants next :
|
||||
|
||||
@code
|
||||
if ((address >= MIPS32_PRACC_PARAM_IN)
|
||||
&& (address <= MIPS32_PRACC_PARAM_IN + ctx->num_iparam * 4))
|
||||
{
|
||||
offset = (address - MIPS32_PRACC_PARAM_IN) / 4;
|
||||
data = ctx->local_iparam[offset];
|
||||
}
|
||||
else if ((address >= MIPS32_PRACC_PARAM_OUT)
|
||||
&& (address <= MIPS32_PRACC_PARAM_OUT + ctx->num_oparam * 4))
|
||||
{
|
||||
offset = (address - MIPS32_PRACC_PARAM_OUT) / 4;
|
||||
data = ctx->local_oparam[offset];
|
||||
}
|
||||
else if ((address >= MIPS32_PRACC_TEXT)
|
||||
&& (address <= MIPS32_PRACC_TEXT + ctx->code_len * 4))
|
||||
{
|
||||
offset = (address - MIPS32_PRACC_TEXT) / 4;
|
||||
data = ctx->code[offset];
|
||||
}
|
||||
else if (address == MIPS32_PRACC_STACK)
|
||||
{
|
||||
/* save to our debug stack */
|
||||
data = ctx->stack[--ctx->stack_offset];
|
||||
}
|
||||
else
|
||||
{
|
||||
/* TODO: send JMP 0xFF200000 instruction.
|
||||
Hopefully processor jump back to start of debug vector */
|
||||
data = 0;
|
||||
LOG_ERROR("Error reading unexpected address 0x%8.8" PRIx32 "", address);
|
||||
return ERROR_JTAG_DEVICE_ERROR;
|
||||
}
|
||||
@endcode
|
||||
|
||||
i.e. if CPU is stalling on addresses in dmseg that are reserved for input parameters, we can conclude that it actually tried to take (read)
|
||||
parametar from there, and saw that address of param falls in dmseg, so it stopped. Obviously, now dongle have to give to it operand.
|
||||
|
||||
Similarly, mips32_pracc_exec_write() describes CPU writes into EJTAG memory (dmseg).
|
||||
Obvioulsy, code is RO, and CPU can change only parameters :
|
||||
|
||||
@code
|
||||
mips_ejtag_set_instr(ctx->ejtag_info, EJTAG_INST_DATA);
|
||||
mips_ejtag_drscan_32(ctx->ejtag_info, &data);
|
||||
|
||||
/* Clear access pending bit */
|
||||
ejtag_ctrl = ejtag_info->ejtag_ctrl & ~EJTAG_CTRL_PRACC;
|
||||
mips_ejtag_set_instr(ctx->ejtag_info, EJTAG_INST_CONTROL);
|
||||
mips_ejtag_drscan_32(ctx->ejtag_info, &ejtag_ctrl);
|
||||
|
||||
//jtag_add_clocks(5);
|
||||
jtag_execute_queue();
|
||||
|
||||
if ((address >= MIPS32_PRACC_PARAM_IN)
|
||||
&& (address <= MIPS32_PRACC_PARAM_IN + ctx->num_iparam * 4))
|
||||
{
|
||||
offset = (address - MIPS32_PRACC_PARAM_IN) / 4;
|
||||
ctx->local_iparam[offset] = data;
|
||||
}
|
||||
else if ((address >= MIPS32_PRACC_PARAM_OUT)
|
||||
&& (address <= MIPS32_PRACC_PARAM_OUT + ctx->num_oparam * 4))
|
||||
{
|
||||
offset = (address - MIPS32_PRACC_PARAM_OUT) / 4;
|
||||
ctx->local_oparam[offset] = data;
|
||||
}
|
||||
else if (address == MIPS32_PRACC_STACK)
|
||||
{
|
||||
/* save data onto our stack */
|
||||
ctx->stack[ctx->stack_offset++] = data;
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_ERROR("Error writing unexpected address 0x%8.8" PRIx32 "", address);
|
||||
return ERROR_JTAG_DEVICE_ERROR;
|
||||
}
|
||||
@endcode
|
||||
|
||||
CPU loops here :
|
||||
|
||||
@code
|
||||
while (1)
|
||||
{
|
||||
if ((retval = wait_for_pracc_rw(ejtag_info, &ejtag_ctrl)) != ERROR_OK)
|
||||
return retval;
|
||||
|
||||
address = data = 0;
|
||||
mips_ejtag_set_instr(ejtag_info, EJTAG_INST_ADDRESS);
|
||||
mips_ejtag_drscan_32(ejtag_info, &address);
|
||||
|
||||
/* Check for read or write */
|
||||
if (ejtag_ctrl & EJTAG_CTRL_PRNW)
|
||||
{
|
||||
if ((retval = mips32_pracc_exec_write(&ctx, address)) != ERROR_OK)
|
||||
return retval;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Check to see if its reading at the debug vector. The first pass through
|
||||
* the module is always read at the vector, so the first one we allow. When
|
||||
* the second read from the vector occurs we are done and just exit. */
|
||||
if ((address == MIPS32_PRACC_TEXT) && (pass++))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if ((retval = mips32_pracc_exec_read(&ctx, address)) != ERROR_OK)
|
||||
return retval;
|
||||
}
|
||||
|
||||
if (cycle == 0)
|
||||
break;
|
||||
}
|
||||
@endcode
|
||||
|
||||
and using presented R (mips32_pracc_exec_read()) and W (mips32_pracc_exec_write()) functions it reads in the code (RO) and reads and writes operands (RW).
|
||||
|
||||
@section fdimpl OpenOCD FASTDATA Implementation
|
||||
|
||||
OpenOCD FASTDATA write function, mips32_pracc_fastdata_xfer() is called from bulk_write_memory callback, which writes a count items of 4 bytes
|
||||
to the memory of a target at the an address given. Because it operates only on whole words, this should be faster than target_write_memory().
|
||||
|
||||
In order to implement FASTDATA write, mips32_pracc_fastdata_xfer() uses the following handler :
|
||||
|
||||
@code
|
||||
uint32_t handler_code[] = {
|
||||
/* caution when editing, table is modified below */
|
||||
/* r15 points to the start of this code */
|
||||
MIPS32_SW(8,MIPS32_FASTDATA_HANDLER_SIZE - 4,15),
|
||||
MIPS32_SW(9,MIPS32_FASTDATA_HANDLER_SIZE - 8,15),
|
||||
MIPS32_SW(10,MIPS32_FASTDATA_HANDLER_SIZE - 12,15),
|
||||
MIPS32_SW(11,MIPS32_FASTDATA_HANDLER_SIZE - 16,15),
|
||||
/* start of fastdata area in t0 */
|
||||
MIPS32_LUI(8,UPPER16(MIPS32_PRACC_FASTDATA_AREA)),
|
||||
MIPS32_ORI(8,8,LOWER16(MIPS32_PRACC_FASTDATA_AREA)),
|
||||
MIPS32_LW(9,0,8), /* start addr in t1 */
|
||||
MIPS32_LW(10,0,8), /* end addr to t2 */
|
||||
/* loop: */
|
||||
/* 8 */ MIPS32_LW(11,0,0), /* lw t3,[t8 | r9] */
|
||||
/* 9 */ MIPS32_SW(11,0,0), /* sw t3,[r9 | r8] */
|
||||
MIPS32_BNE(10,9,NEG16(3)), /* bne $t2,t1,loop */
|
||||
MIPS32_ADDI(9,9,4), /* addi t1,t1,4 */
|
||||
|
||||
MIPS32_LW(8,MIPS32_FASTDATA_HANDLER_SIZE - 4,15),
|
||||
MIPS32_LW(9,MIPS32_FASTDATA_HANDLER_SIZE - 8,15),
|
||||
MIPS32_LW(10,MIPS32_FASTDATA_HANDLER_SIZE - 12,15),
|
||||
MIPS32_LW(11,MIPS32_FASTDATA_HANDLER_SIZE - 16,15),
|
||||
|
||||
MIPS32_LUI(15,UPPER16(MIPS32_PRACC_TEXT)),
|
||||
MIPS32_ORI(15,15,LOWER16(MIPS32_PRACC_TEXT)),
|
||||
MIPS32_JR(15), /* jr start */
|
||||
MIPS32_MFC0(15,31,0), /* move COP0 DeSave to $15 */
|
||||
};
|
||||
@endcode
|
||||
|
||||
In the begining and the end of the handler we have fuction prologue (save the regs that will be clobbered) and epilogue (restore regs),
|
||||
and in the very end, after all the xfer have been done, we do jump to the MIPS32_PRACC_TEXT address, i.e. Debug Exception Vector location.
|
||||
We will use this fact (that we came back to MIPS32_PRACC_TEXT) to verify later if all the handler is executed (because when in RAM,
|
||||
processor do not stall - it executes all instructions untill one of them do not demand access to dmseg (if one of it's opernads is there)).
|
||||
|
||||
This handler is put into the RAM and executed from there, and not instruction by instruction, like in previous simple write
|
||||
(mips_m4k_write_memory()) and read (mips_m4k_read_memory()) functions.
|
||||
|
||||
N.B. When it is executing this code in RAM, CPU will not stall on instructions, but execute all until it comes to the :
|
||||
|
||||
@code
|
||||
MIPS32_LW(9,0,8) /* start addr in t1 */
|
||||
@endcode
|
||||
|
||||
and there it will stall - because it will see that one of the operands have to be fetched from dmseg (EJTAG memory, in this case FASTDATA memory segment).
|
||||
|
||||
This handler is loaded in the RAM, ath the reserved location "work_area". This work_area is configured in OpenOCD configuration script and should be selected
|
||||
in that way that it is not clobbered (overwritten) by data we want to write-in using FASTDATA.
|
||||
|
||||
What is executed instruction by instruction which is passed by dongle (via EJATG memory) is small jump code, which jumps at the handler in RAM.
|
||||
CPU stalls on dmseg when receiving these jmp_code instructions, but once it jumps in RAM, CPU do not stall anymore and executes bunch of handler instructions.
|
||||
Untill it comes to the first instruction which has an operand in FASTDATA area. There it stalls and waits on action from probe.
|
||||
It happens actually when CPU comes to this loop :
|
||||
|
||||
@code
|
||||
MIPS32_LW(9,0,8), /* start addr in t1 */
|
||||
MIPS32_LW(10,0,8), /* end addr to t2 */
|
||||
/* loop: */
|
||||
/* 8 */ MIPS32_LW(11,0,0), /* lw t3,[t8 | r9] */
|
||||
/* 9 */ MIPS32_SW(11,0,0), /* sw t3,[r9 | r8] */
|
||||
MIPS32_BNE(10,9,NEG16(3)), /* bne $t2,t1,loop */
|
||||
@endcode
|
||||
|
||||
and then it stalls because operand in r8 points to FASTDATA area.
|
||||
|
||||
OpenOCD first verifies that CPU came to this place by :
|
||||
|
||||
@code
|
||||
/* next fetch to dmseg should be in FASTDATA_AREA, check */
|
||||
address = 0;
|
||||
mips_ejtag_set_instr(ejtag_info, EJTAG_INST_ADDRESS);
|
||||
mips_ejtag_drscan_32(ejtag_info, &address);
|
||||
|
||||
if (address != MIPS32_PRACC_FASTDATA_AREA)
|
||||
return ERROR_FAIL;
|
||||
@endcode
|
||||
|
||||
and then passes to CPU start and end address of the loop region for handler in RAM.
|
||||
|
||||
In the loop in handler, CPU sees that it has to take and operand from FSTDATA area (to write it to the dst in RAM after), and so it stalls, putting PrAcc to "1".
|
||||
OpenOCD fills the data via this loop :
|
||||
|
||||
@code
|
||||
for (i = 0; i < count; i++)
|
||||
{
|
||||
/* Send the data out using fastdata (clears the access pending bit) */
|
||||
mips_ejtag_set_instr(ejtag_info, EJTAG_INST_FASTDATA);
|
||||
if ((retval = mips_ejtag_fastdata_scan(ejtag_info, write_t, buf++)) != ERROR_OK)
|
||||
return retval;
|
||||
}
|
||||
@endcode
|
||||
|
||||
Each time when OpenOCD fills data to CPU (via dongle, via dmseg), CPU takes it and proceeds in executing the endler. However, since handler is in a assembly loop,
|
||||
CPU comes to next instruction which also fetches data from FASTDATA area. So it stalls.
|
||||
Then OpenOCD fills the data again, from it's (OpenOCD's) loop. And this game continues untill all the data has been filled.
|
||||
|
||||
After the last data has beend given to CPU it sees that it reached the end address, so it proceeds with next instruction. However, rhis instruction do not point into dmseg, so
|
||||
CPU executes bunch of handler instructions (all prologue) and in the end jumps to MIPS32_PRACC_TEXT address.
|
||||
|
||||
On it's side, OpenOCD checks in CPU has jumped back to MIPS32_PRACC_TEXT, which is the confirmation that it correclty executed all the rest of the handler in RAM,
|
||||
and that is not stuck somewhere in the RAM, or stalling on some acces in dmseg - that would be an error :
|
||||
|
||||
@code
|
||||
address = 0;
|
||||
mips_ejtag_set_instr(ejtag_info, EJTAG_INST_ADDRESS);
|
||||
mips_ejtag_drscan_32(ejtag_info, &address);
|
||||
|
||||
if (address != MIPS32_PRACC_TEXT)
|
||||
LOG_ERROR("mini program did not return to start");
|
||||
@endcode
|
||||
|
||||
@section fdejtagspec EJTAG spec on FASTDATA access
|
||||
|
||||
The width of the Fastdata register is 1 bit. During a Fastdata access, the Fastdata register is written and read, i.e., a bit
|
||||
is shifted in and a bit is shifted out. During a Fastdata access, the Fastdata register value shifted in specifies whether
|
||||
the Fastdata access should be completed or not. The value shifted out is a flag that indicates whether the Fastdata
|
||||
access was successful or not (if completion was requested).
|
||||
|
||||
The FASTDATA access is used for efficient block transfers between dmseg (on the probe) and target memory (on the
|
||||
processor). An "upload" is defined as a sequence of processor loads from target memory and stores to dmseg. A
|
||||
"download" is a sequence of processor loads from dmseg and stores to target memory. The "Fastdata area" specifies
|
||||
the legal range of dmseg addresses (0xFF20.0000 - 0xFF20.000F) that can be used for uploads and downloads. The
|
||||
Data + Fastdata registers (selected with the FASTDATA instruction) allow efficient completion of pending Fastdata
|
||||
area accesses.
|
||||
During Fastdata uploads and downloads, the processor will stall on accesses to the Fastdata area. The PrAcc (processor
|
||||
access pending bit) will be 1 indicating the probe is required to complete the access. Both upload and download
|
||||
accesses are attempted by shifting in a zero SPrAcc value (to request access completion) and shifting out SPrAcc to
|
||||
see if the attempt will be successful (i.e., there was an access pending and a legal Fastdata area address was used).
|
||||
Downloads will also shift in the data to be used to satisfy the load from dmseg’s Fastdata area, while uploads will
|
||||
shift out the data being stored to dmseg’s Fastdata area.
|
||||
As noted above, two conditions must be true for the Fastdata access to succeed. These are:
|
||||
|
||||
- PrAcc must be 1, i.e., there must be a pending processor access.
|
||||
- The Fastdata operation must use a valid Fastdata area address in dmseg (0xFF20.0000 to 0xFF20.000F).
|
||||
|
||||
Basically, because FASTDATA area in dmseg is 16 bytes, we transfer (0xFF20.0000 - 0xFF20.000F)
|
||||
FASTDATA scan TAP instruction selects the Data and the Fastdata registers at once.
|
||||
|
||||
They come in order :
|
||||
TDI -> | Data register| -> | Fastdata register | -> TDO
|
||||
|
||||
FASTDATA register is 1-bit width register. It takes in SPrAcc bit which should be shifted first,
|
||||
followed by 32 bit of data.
|
||||
|
||||
Scan width of FASTDTA is 33 bits in total : 33 bits are shifted in and 33 bits are shifted out.
|
||||
|
||||
First bit that is shifted out is SPrAcc that comes out of Fastdata register and should give us status on FATSDATA write we want to do.
|
||||
|
||||
@section fdcheck OpenOCD misses FASTDATA check
|
||||
|
||||
Download flow (probe -> target block transfer) :
|
||||
|
||||
1) Probe transfer target execution to a loop in target memory doing a fixed number of "loads" to fastdata area of dmseg (and stores to the target download destination.)
|
||||
|
||||
2) Probe loops attempting to satisfy the loads "expected" from the target.
|
||||
On FASTDATA access "successful" move on to next "load".
|
||||
On FASTDATA access "failure" repeat until "successful" or timeout.
|
||||
(A "failure" is an attempt to satisfy an access when none are pending.)
|
||||
|
||||
Note: A failure may have a recoverable (and even expected) cause like slow target execution of the load loop. Other failures may be due to unexpected more troublesome causes like an exception while in debug mode or a target hang on a bad target memory access.
|
||||
|
||||
Shifted out SPrAcc bit inform us that there was CPU access pendingand that it can be complete.
|
||||
|
||||
Basically, we should do following procedure :
|
||||
|
||||
- Download (dongle -> CPU) :
|
||||
You shift "download" DATA and FASTDATA[SPrAcc] = 0 (33 bit scan) into the target. If the value of FASTDATA[SPrAcc] shifted out is "1" then an access was pending when you started the scan and it is now complete.
|
||||
|
||||
If SPrAcc is 0 then no access was pending to the fastdata area. (Repeat attempt to complete the access you expect for this data word. Timeout if you think the access is "long overdue" as something unexpected has happened.)
|
||||
|
||||
- Upload (CPU -> dongle) :
|
||||
You shift "dummy" DATA and FASTDATA[SPrAcc] = 0 (33 bit scan) into the target. If the value of FASTDATA[SPrAcc] shifted out is "1" then an access was pending when you started the scan and it is now complete. The "upload" is the DATA shifted out of the target.
|
||||
|
||||
If SPrAcc is 0 then no access was pending to the fastdata area. (Repeat attempt to complete the access you expect for this data word. Timeout if you think the access is "long overdue" as something unexpected has happened.)
|
||||
|
||||
Basically, if checking first (before scan) if CPU is pending on FASTDATA access (PrAcc is "1"), like this
|
||||
|
||||
@code
|
||||
wait(ready);
|
||||
do_scan();
|
||||
@endcode
|
||||
|
||||
which is inefficient, we should do it like this :
|
||||
|
||||
@code
|
||||
BEGIN :
|
||||
do_scan();
|
||||
if (!was_ready)
|
||||
goto BEGIN;
|
||||
@endcode
|
||||
|
||||
by checking SPrAcc that we shifted out.
|
||||
|
||||
If some FASTDATA write fails, OpenOCD will continue with it's loop (on the host side), but CPU will rest pending (on the target side)
|
||||
waiting for correct FASTDATA write.
|
||||
|
||||
Since OpenOCD goes ahead, it will eventually finish it's loop, and proceede to check if CPU took all the data. But since CPU did not took all the data,
|
||||
it is still turns in handler's loop in RAM, stalling on Fastdata area so this check :
|
||||
|
||||
@code
|
||||
address = 0;
|
||||
mips_ejtag_set_instr(ejtag_info, EJTAG_INST_ADDRESS);
|
||||
retval = mips_ejtag_drscan_32(ejtag_info, &address);
|
||||
if (retval != ERROR_OK)
|
||||
return retval;
|
||||
|
||||
if (address != MIPS32_PRACC_TEXT)
|
||||
LOG_ERROR("mini program did not return to start");
|
||||
@endcode
|
||||
|
||||
fails, and that gives us enough information of the failure.
|
||||
|
||||
In this case, we can lower the JTAG frquency and try again, bacuse most probable reason of this failure is that we tried FASTDATA upload before CPU arrived to rise PrAcc (i.e. before it was pending on access).
|
||||
However, the reasons for failure might be numerous : reset, exceptions which can occur in debug mode, bus hangs, etc.
|
||||
|
||||
If lowering the JTAG freq does not work either, we can fall back to more robust solution with patch posted below.
|
||||
|
||||
To summarize, FASTDATA communication goes as following :
|
||||
|
||||
-# CPU jumps to Debug Exception Vector Location 0xFF200200 in dmseg and it stalls, pending and waiting for EJTAG to give it first debug instruction and signall it by putting PrAcc to "0"
|
||||
-# When PrAcc goes to "0" CPU execute one opcode sent by EJTAG via DATA reg. Then it pends on next access, waiting for PrAcc to be put to "0" again
|
||||
-# Following this game, OpenOCD first loads handler code in RAM, and then sends the jmp_code - instruction by instruction via DATA reg, which redirects CPU to handler previously set up in RAM
|
||||
-# Once in RAM CPU does not pend on any instruction, but it executes all handler instructions untill first "fetch" to Fastdata area - then it stops and pends.
|
||||
-# So - when it comes to any instruction (opcode) in this handler in RAM which reads (or writes) to Fastdata area (0xF..F20.0000 to 0xF..F20.000F), CPU stops (i.e. stalls access).
|
||||
I.e. it stops on this lw opcode and waits to FASTDATA TAP command from the probe.
|
||||
-# CPU continues only if OpenOCD shifted in SPrAcc "0" (and if the PrAcc was "1"). It shifts-out "1" to tell us that it was OK (processor was stalled, so it can complete the access),
|
||||
and that it continued execution of the handler in RAM.
|
||||
-# If PrAcc was not "1" CPU will not continue (go to next instruction), but will shift-out "0" and keep stalling on the same instruction of my handler in RAM.
|
||||
-# When Fastdata loop is finished, CPU executes all following hadler instructions in RAM (prologue).
|
||||
-# In the end of my handler in RAM, I jumps back to begining of Debug Exception Vector Location 0xFF200200 in dmseg.
|
||||
-# When it jumps back to 0xFF200200 in dmseg processor stops and pends, waiting for OpenOCD to send it instruction via DATA reg and signal it by putting PrAcc to "0".
|
||||
|
||||
*/
|
||||
71
debuggers/openocd/doc/manual/target/notarm.txt
Normal file
71
debuggers/openocd/doc/manual/target/notarm.txt
Normal file
@ -0,0 +1,71 @@
|
||||
/** @page targetnotarm OpenOCD Non-ARM Targets
|
||||
|
||||
This page describes outstanding issues w.r.t. non-ARM targets.
|
||||
|
||||
@section targetnotarmflash Flash drivers
|
||||
|
||||
The flash drivers contain ARM32 code that is used
|
||||
to execute code on the target.
|
||||
|
||||
This needs to be handled in some CPU independent
|
||||
manner.
|
||||
|
||||
The ocl and ecos flash drivers compile the flash
|
||||
driver code to run on the target on the developer
|
||||
machine.
|
||||
|
||||
The ocl and ecos flash drivers should be unified
|
||||
and instructions should be written on how to
|
||||
compile the target flash drivers. Perhaps
|
||||
using automake?
|
||||
|
||||
|
||||
eCos has CFI driver that could probably be compiled
|
||||
for all targets. The trick is to figure out a
|
||||
way to make the compiled flash drivers work
|
||||
on all target memory maps + sort out all the
|
||||
little details
|
||||
|
||||
@section targetnotarm32v64 32 vs. 64 bit
|
||||
|
||||
Currently OpenOCD only supports 32 bit targets.
|
||||
|
||||
Adding 64 bit support would be nice but there
|
||||
hasn't been any call for it in the openocd development
|
||||
mailing list
|
||||
|
||||
@section targetnotarmsupport Target Support
|
||||
|
||||
target.h is relatively CPU agnostic and
|
||||
the intention is to move in the direction of less
|
||||
instruction set specific.
|
||||
|
||||
Non-CPU targets are also supported, but there isn't
|
||||
a lot of activity on it in the mailing list currently.
|
||||
An example is FPGA programming support via JTAG,
|
||||
but also flash chips can be programmed directly
|
||||
using JTAG.
|
||||
|
||||
@section targetnotarmphy non-JTAG physical layer
|
||||
|
||||
JTAG is not the only physical protocol used to talk to
|
||||
CPUs.
|
||||
|
||||
OpenOCD does not today have targets that use non-JTAG.
|
||||
|
||||
The actual physical layer is a relatively modest part
|
||||
of the total OpenOCD system.
|
||||
|
||||
|
||||
@section targetnotarmppc PowerPC
|
||||
|
||||
there exists open source implementations of powerpc
|
||||
target manipulation, but there hasn't been a lot
|
||||
of activity in the mailing list.
|
||||
|
||||
@section targetnotarmmips MIPS
|
||||
|
||||
Currently OpenOCD has a MIPS target defined. This is the
|
||||
first non-ARM example of a CPU target
|
||||
|
||||
*/
|
||||
224
debuggers/openocd/doc/mdate-sh
Executable file
224
debuggers/openocd/doc/mdate-sh
Executable file
@ -0,0 +1,224 @@
|
||||
#!/bin/sh
|
||||
# Get modification time of a file or directory and pretty-print it.
|
||||
|
||||
scriptversion=2010-08-21.06; # UTC
|
||||
|
||||
# Copyright (C) 1995-2013 Free Software Foundation, Inc.
|
||||
# written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, June 1995
|
||||
#
|
||||
# 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 2, 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/>.
|
||||
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
# This file is maintained in Automake, please report
|
||||
# bugs to <bug-automake@gnu.org> or send patches to
|
||||
# <automake-patches@gnu.org>.
|
||||
|
||||
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
|
||||
emulate sh
|
||||
NULLCMD=:
|
||||
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
|
||||
# is contrary to our usage. Disable this feature.
|
||||
alias -g '${1+"$@"}'='"$@"'
|
||||
setopt NO_GLOB_SUBST
|
||||
fi
|
||||
|
||||
case $1 in
|
||||
'')
|
||||
echo "$0: No file. Try '$0 --help' for more information." 1>&2
|
||||
exit 1;
|
||||
;;
|
||||
-h | --h*)
|
||||
cat <<\EOF
|
||||
Usage: mdate-sh [--help] [--version] FILE
|
||||
|
||||
Pretty-print the modification day of FILE, in the format:
|
||||
1 January 1970
|
||||
|
||||
Report bugs to <bug-automake@gnu.org>.
|
||||
EOF
|
||||
exit $?
|
||||
;;
|
||||
-v | --v*)
|
||||
echo "mdate-sh $scriptversion"
|
||||
exit $?
|
||||
;;
|
||||
esac
|
||||
|
||||
error ()
|
||||
{
|
||||
echo "$0: $1" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
|
||||
# Prevent date giving response in another language.
|
||||
LANG=C
|
||||
export LANG
|
||||
LC_ALL=C
|
||||
export LC_ALL
|
||||
LC_TIME=C
|
||||
export LC_TIME
|
||||
|
||||
# GNU ls changes its time format in response to the TIME_STYLE
|
||||
# variable. Since we cannot assume 'unset' works, revert this
|
||||
# variable to its documented default.
|
||||
if test "${TIME_STYLE+set}" = set; then
|
||||
TIME_STYLE=posix-long-iso
|
||||
export TIME_STYLE
|
||||
fi
|
||||
|
||||
save_arg1=$1
|
||||
|
||||
# Find out how to get the extended ls output of a file or directory.
|
||||
if ls -L /dev/null 1>/dev/null 2>&1; then
|
||||
ls_command='ls -L -l -d'
|
||||
else
|
||||
ls_command='ls -l -d'
|
||||
fi
|
||||
# Avoid user/group names that might have spaces, when possible.
|
||||
if ls -n /dev/null 1>/dev/null 2>&1; then
|
||||
ls_command="$ls_command -n"
|
||||
fi
|
||||
|
||||
# A 'ls -l' line looks as follows on OS/2.
|
||||
# drwxrwx--- 0 Aug 11 2001 foo
|
||||
# This differs from Unix, which adds ownership information.
|
||||
# drwxrwx--- 2 root root 4096 Aug 11 2001 foo
|
||||
#
|
||||
# To find the date, we split the line on spaces and iterate on words
|
||||
# until we find a month. This cannot work with files whose owner is a
|
||||
# user named "Jan", or "Feb", etc. However, it's unlikely that '/'
|
||||
# will be owned by a user whose name is a month. So we first look at
|
||||
# the extended ls output of the root directory to decide how many
|
||||
# words should be skipped to get the date.
|
||||
|
||||
# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below.
|
||||
set x`$ls_command /`
|
||||
|
||||
# Find which argument is the month.
|
||||
month=
|
||||
command=
|
||||
until test $month
|
||||
do
|
||||
test $# -gt 0 || error "failed parsing '$ls_command /' output"
|
||||
shift
|
||||
# Add another shift to the command.
|
||||
command="$command shift;"
|
||||
case $1 in
|
||||
Jan) month=January; nummonth=1;;
|
||||
Feb) month=February; nummonth=2;;
|
||||
Mar) month=March; nummonth=3;;
|
||||
Apr) month=April; nummonth=4;;
|
||||
May) month=May; nummonth=5;;
|
||||
Jun) month=June; nummonth=6;;
|
||||
Jul) month=July; nummonth=7;;
|
||||
Aug) month=August; nummonth=8;;
|
||||
Sep) month=September; nummonth=9;;
|
||||
Oct) month=October; nummonth=10;;
|
||||
Nov) month=November; nummonth=11;;
|
||||
Dec) month=December; nummonth=12;;
|
||||
esac
|
||||
done
|
||||
|
||||
test -n "$month" || error "failed parsing '$ls_command /' output"
|
||||
|
||||
# Get the extended ls output of the file or directory.
|
||||
set dummy x`eval "$ls_command \"\\\$save_arg1\""`
|
||||
|
||||
# Remove all preceding arguments
|
||||
eval $command
|
||||
|
||||
# Because of the dummy argument above, month is in $2.
|
||||
#
|
||||
# On a POSIX system, we should have
|
||||
#
|
||||
# $# = 5
|
||||
# $1 = file size
|
||||
# $2 = month
|
||||
# $3 = day
|
||||
# $4 = year or time
|
||||
# $5 = filename
|
||||
#
|
||||
# On Darwin 7.7.0 and 7.6.0, we have
|
||||
#
|
||||
# $# = 4
|
||||
# $1 = day
|
||||
# $2 = month
|
||||
# $3 = year or time
|
||||
# $4 = filename
|
||||
|
||||
# Get the month.
|
||||
case $2 in
|
||||
Jan) month=January; nummonth=1;;
|
||||
Feb) month=February; nummonth=2;;
|
||||
Mar) month=March; nummonth=3;;
|
||||
Apr) month=April; nummonth=4;;
|
||||
May) month=May; nummonth=5;;
|
||||
Jun) month=June; nummonth=6;;
|
||||
Jul) month=July; nummonth=7;;
|
||||
Aug) month=August; nummonth=8;;
|
||||
Sep) month=September; nummonth=9;;
|
||||
Oct) month=October; nummonth=10;;
|
||||
Nov) month=November; nummonth=11;;
|
||||
Dec) month=December; nummonth=12;;
|
||||
esac
|
||||
|
||||
case $3 in
|
||||
???*) day=$1;;
|
||||
*) day=$3; shift;;
|
||||
esac
|
||||
|
||||
# Here we have to deal with the problem that the ls output gives either
|
||||
# the time of day or the year.
|
||||
case $3 in
|
||||
*:*) set `date`; eval year=\$$#
|
||||
case $2 in
|
||||
Jan) nummonthtod=1;;
|
||||
Feb) nummonthtod=2;;
|
||||
Mar) nummonthtod=3;;
|
||||
Apr) nummonthtod=4;;
|
||||
May) nummonthtod=5;;
|
||||
Jun) nummonthtod=6;;
|
||||
Jul) nummonthtod=7;;
|
||||
Aug) nummonthtod=8;;
|
||||
Sep) nummonthtod=9;;
|
||||
Oct) nummonthtod=10;;
|
||||
Nov) nummonthtod=11;;
|
||||
Dec) nummonthtod=12;;
|
||||
esac
|
||||
# For the first six month of the year the time notation can also
|
||||
# be used for files modified in the last year.
|
||||
if (expr $nummonth \> $nummonthtod) > /dev/null;
|
||||
then
|
||||
year=`expr $year - 1`
|
||||
fi;;
|
||||
*) year=$3;;
|
||||
esac
|
||||
|
||||
# The result.
|
||||
echo $day $month $year
|
||||
|
||||
# Local Variables:
|
||||
# mode: shell-script
|
||||
# sh-indentation: 2
|
||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
||||
103
debuggers/openocd/doc/openocd.1
Normal file
103
debuggers/openocd/doc/openocd.1
Normal file
@ -0,0 +1,103 @@
|
||||
.TH "OPENOCD" "1" "November 24, 2009"
|
||||
.SH "NAME"
|
||||
openocd \- A free and open on\-chip debugging, in\-system programming and
|
||||
boundary\-scan testing tool for ARM and MIPS systems
|
||||
.SH "SYNOPSIS"
|
||||
.B openocd \fR[\fB\-fsdlcphv\fR] [\fB\-\-file\fR <filename>] [\fB\-\-search\fR <dirname>] [\fB\-\-debug\fR <debuglevel>] [\fB\-\-log_output\fR <filename>] [\fB\-\-command\fR <cmd>] [\fB\-\-pipe\fR] [\fB\-\-help\fR] [\fB\-\-version\fR]
|
||||
.SH "DESCRIPTION"
|
||||
.B OpenOCD
|
||||
is an on\-chip debugging, in\-system programming and boundary\-scan
|
||||
testing tool for various ARM and MIPS systems.
|
||||
.PP
|
||||
The debugger uses an IEEE 1149\-1 compliant JTAG TAP bus master to access
|
||||
on\-chip debug functionality available on ARM based microcontrollers or
|
||||
system-on-chip solutions. For MIPS systems the EJTAG interface is supported.
|
||||
.PP
|
||||
User interaction is realized through a telnet command line interface,
|
||||
a gdb (the GNU debugger) remote protocol server, and a simplified RPC
|
||||
connection that can be used to interface with OpenOCD's Jim Tcl engine.
|
||||
.PP
|
||||
OpenOCD supports various different types of JTAG interfaces/programmers,
|
||||
please check the \fIopenocd\fR info page for the complete list.
|
||||
.SH "OPTIONS"
|
||||
.TP
|
||||
.B "\-f, \-\-file <filename>"
|
||||
This is a shortcut for a \fB\-c "[script \fI<filename>\fB]"\fR
|
||||
command, using a search path to load the configuration file
|
||||
.IR <filename> .
|
||||
In order to specify multiple config files, you can use multiple
|
||||
.B \-\-file
|
||||
arguments. If no such \fB\-c\fR
|
||||
options are included, the first config file
|
||||
.B openocd.cfg
|
||||
in the search path will be used.
|
||||
.TP
|
||||
.B "\-s, \-\-search <dirname>"
|
||||
Add
|
||||
.I <dirname>
|
||||
to the search path used for config files and scripts.
|
||||
The search path begins with the current directory,
|
||||
then includes these additional directories before other
|
||||
components such as the standard OpenOCD script libraries.
|
||||
.TP
|
||||
.B "\-d, \-\-debug <debuglevel>"
|
||||
Set debug level. Possible values are:
|
||||
.br
|
||||
.RB " * " 0 " (errors)"
|
||||
.br
|
||||
.RB " * " 1 " (warnings)"
|
||||
.br
|
||||
.RB " * " 2 " (informational messages)"
|
||||
.br
|
||||
.RB " * " 3 " (debug messages)"
|
||||
.br
|
||||
The default level is
|
||||
.BR 2 .
|
||||
.TP
|
||||
.B "\-l, \-\-log_output <filename>"
|
||||
Redirect log output to the file
|
||||
.IR <filename> .
|
||||
Per default the log output is printed on
|
||||
.BR stderr .
|
||||
.TP
|
||||
.B "\-c, \-\-command <cmd>"
|
||||
Add the command
|
||||
.I <cmd>
|
||||
to a list of commands executed on server startup.
|
||||
Note that you will need to explicitly invoke
|
||||
.I init
|
||||
if the command requires access to a target or flash.
|
||||
.TP
|
||||
.B "\-p, \-\-pipe"
|
||||
Use pipes when talking to gdb.
|
||||
.TP
|
||||
.B "\-h, \-\-help"
|
||||
Show a help text and exit.
|
||||
.TP
|
||||
.B "\-v, \-\-version"
|
||||
Show version information and exit.
|
||||
.SH "BUGS"
|
||||
Please report any bugs on the mailing list at
|
||||
.BR openocd\-devel@lists.sourceforge.net .
|
||||
.SH "LICENCE"
|
||||
.B OpenOCD
|
||||
is covered by the GNU General Public License (GPL), version 2 or later.
|
||||
.SH "SEE ALSO"
|
||||
.BR jtag (1)
|
||||
.PP
|
||||
The full documentation for
|
||||
.B openocd
|
||||
is maintained as a Texinfo manual. If the
|
||||
.BR info
|
||||
(or
|
||||
.BR pinfo )
|
||||
and
|
||||
.BR openocd
|
||||
programs are properly installed at your site, the command
|
||||
.B info openocd
|
||||
should give you access to the complete manual.
|
||||
.SH "AUTHORS"
|
||||
Please see the file AUTHORS.
|
||||
.PP
|
||||
This manual page was written by Uwe Hermann <uwe@hermann\-uwe.de>.
|
||||
It is licensed under the terms of the GNU GPL (version 2 or later).
|
||||
109
debuggers/openocd/doc/openocd.info
Normal file
109
debuggers/openocd/doc/openocd.info
Normal file
@ -0,0 +1,109 @@
|
||||
This is openocd.info, produced by makeinfo version 5.1 from
|
||||
openocd.texi.
|
||||
|
||||
This User's Guide documents release 0.7.0, dated 4 May 2013, of the Open
|
||||
On-Chip Debugger (OpenOCD).
|
||||
|
||||
* Copyright (C) 2008 The OpenOCD Project
|
||||
* Copyright (C) 2007-2008 Spencer Oliver <spen@spen-soft.co.uk>
|
||||
* Copyright (C) 2008-2010 Oyvind Harboe <oyvind.harboe@zylin.com>
|
||||
* Copyright (C) 2008 Duane Ellis <openocd@duaneellis.com>
|
||||
* Copyright (C) 2009-2010 David Brownell
|
||||
|
||||
Permission is granted to copy, distribute and/or modify this
|
||||
document under the terms of the GNU Free Documentation License,
|
||||
Version 1.2 or any later version published by the Free Software
|
||||
Foundation; with no Invariant Sections, with no Front-Cover Texts,
|
||||
and with no Back-Cover Texts. A copy of the license is included in
|
||||
the section entitled "GNU Free Documentation License".
|
||||
INFO-DIR-SECTION Development
|
||||
START-INFO-DIR-ENTRY
|
||||
* OpenOCD: (openocd). OpenOCD User's Guide
|
||||
END-INFO-DIR-ENTRY
|
||||
|
||||
|
||||
Indirect:
|
||||
openocd.info-1: 990
|
||||
openocd.info-2: 301821
|
||||
|
||||
Tag Table:
|
||||
(Indirect)
|
||||
Node: Top990
|
||||
Node: About3496
|
||||
Node: Developers7842
|
||||
Node: Debug Adapter Hardware10510
|
||||
Node: About Jim-Tcl21044
|
||||
Node: Running23186
|
||||
Node: OpenOCD Project Setup28081
|
||||
Ref: OpenOCD Project Setup-Footnote-147973
|
||||
Ref: OpenOCD Project Setup-Footnote-248313
|
||||
Ref: OpenOCD Project Setup-Footnote-348581
|
||||
Node: Config File Guidelines48909
|
||||
Ref: theinitboardprocedure72069
|
||||
Ref: definecputargetsworkinginsmp78860
|
||||
Ref: theinittargetsprocedure83294
|
||||
Ref: translatingconfigurationfiles86553
|
||||
Ref: Config File Guidelines-Footnote-187780
|
||||
Node: Daemon Configuration87855
|
||||
Ref: configurationstage88177
|
||||
Ref: enteringtherunstage89029
|
||||
Ref: tcpipports91478
|
||||
Ref: gdbconfiguration93724
|
||||
Ref: gdbbreakpointoverride94039
|
||||
Ref: gdbflashprogram94414
|
||||
Ref: eventpolling95289
|
||||
Node: Debug Adapter Configuration97725
|
||||
Ref: jtagspeed125585
|
||||
Node: Reset Configuration128543
|
||||
Ref: srstandtrstissues131471
|
||||
Node: TAP Declaration143516
|
||||
Ref: enablinganddisablingtaps155076
|
||||
Ref: autoprobing157723
|
||||
Ref: TAP Declaration-Footnote-1160414
|
||||
Node: CPU Configuration160614
|
||||
Ref: targettypes164761
|
||||
Ref: targetconfiguration166765
|
||||
Ref: targetcurstate175679
|
||||
Ref: targetevents176920
|
||||
Node: Flash Commands181766
|
||||
Ref: norconfiguration183298
|
||||
Ref: flashprogrammingcommands185957
|
||||
Ref: flashprotect191530
|
||||
Ref: program191888
|
||||
Ref: flashdriverlist192139
|
||||
Ref: at91sam3196024
|
||||
Ref: Flash Commands-Footnote-1221282
|
||||
Ref: Flash Commands-Footnote-2221448
|
||||
Node: Flash Programming221613
|
||||
Node: NAND Flash Commands223061
|
||||
Ref: nandconfiguration226029
|
||||
Ref: nanddriverlist236404
|
||||
Node: PLD/FPGA Commands241099
|
||||
Node: General Commands243162
|
||||
Ref: debuglevel245109
|
||||
Ref: targetstatehandling246035
|
||||
Ref: resetcommand249687
|
||||
Ref: memoryaccess251957
|
||||
Ref: imageaccess253584
|
||||
Node: Architecture and Core Commands257966
|
||||
Ref: armhardwaretracing258436
|
||||
Ref: traceportdrivers266354
|
||||
Ref: arm9vectorcatch274250
|
||||
Ref: xscalevectorcatch282653
|
||||
Ref: softwaredebugmessagesandtracing288914
|
||||
Node: JTAG Commands292381
|
||||
Node: Boundary Scan Commands301821
|
||||
Node: TFTP304271
|
||||
Node: GDB and OpenOCD305145
|
||||
Ref: programmingusinggdb310040
|
||||
Ref: usingopenocdsmpwithgdb311483
|
||||
Node: Tcl Scripting API312914
|
||||
Node: FAQ315554
|
||||
Ref: faqrtck315664
|
||||
Ref: faqtaporder328202
|
||||
Node: Tcl Crash Course329965
|
||||
Node: License341963
|
||||
Node: OpenOCD Concept Index364373
|
||||
Node: Command and Driver Index382304
|
||||
|
||||
End Tag Table
|
||||
6641
debuggers/openocd/doc/openocd.info-1
Normal file
6641
debuggers/openocd/doc/openocd.info-1
Normal file
File diff suppressed because it is too large
Load Diff
2250
debuggers/openocd/doc/openocd.info-2
Normal file
2250
debuggers/openocd/doc/openocd.info-2
Normal file
File diff suppressed because it is too large
Load Diff
8825
debuggers/openocd/doc/openocd.texi
Normal file
8825
debuggers/openocd/doc/openocd.texi
Normal file
File diff suppressed because it is too large
Load Diff
4
debuggers/openocd/doc/stamp-vti
Normal file
4
debuggers/openocd/doc/stamp-vti
Normal file
@ -0,0 +1,4 @@
|
||||
@set UPDATED 4 May 2013
|
||||
@set UPDATED-MONTH May 2013
|
||||
@set EDITION 0.7.0
|
||||
@set VERSION 0.7.0
|
||||
10074
debuggers/openocd/doc/texinfo.tex
Normal file
10074
debuggers/openocd/doc/texinfo.tex
Normal file
File diff suppressed because it is too large
Load Diff
4
debuggers/openocd/doc/version.texi
Normal file
4
debuggers/openocd/doc/version.texi
Normal file
@ -0,0 +1,4 @@
|
||||
@set UPDATED 4 May 2013
|
||||
@set UPDATED-MONTH May 2013
|
||||
@set EDITION 0.7.0
|
||||
@set VERSION 0.7.0
|
||||
527
debuggers/openocd/install-sh
Executable file
527
debuggers/openocd/install-sh
Executable file
@ -0,0 +1,527 @@
|
||||
#!/bin/sh
|
||||
# install - install a program, script, or datafile
|
||||
|
||||
scriptversion=2011-11-20.07; # UTC
|
||||
|
||||
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
||||
# later released in X11R6 (xc/config/util/install.sh) with the
|
||||
# following copyright and license.
|
||||
#
|
||||
# Copyright (C) 1994 X Consortium
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to
|
||||
# deal in the Software without restriction, including without limitation the
|
||||
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
# sell copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
||||
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
# Except as contained in this notice, the name of the X Consortium shall not
|
||||
# be used in advertising or otherwise to promote the sale, use or other deal-
|
||||
# ings in this Software without prior written authorization from the X Consor-
|
||||
# tium.
|
||||
#
|
||||
#
|
||||
# FSF changes to this file are in the public domain.
|
||||
#
|
||||
# Calling this script install-sh is preferred over install.sh, to prevent
|
||||
# 'make' implicit rules from creating a file called install from it
|
||||
# when there is no Makefile.
|
||||
#
|
||||
# This script is compatible with the BSD install script, but was written
|
||||
# from scratch.
|
||||
|
||||
nl='
|
||||
'
|
||||
IFS=" "" $nl"
|
||||
|
||||
# set DOITPROG to echo to test this script
|
||||
|
||||
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
||||
doit=${DOITPROG-}
|
||||
if test -z "$doit"; then
|
||||
doit_exec=exec
|
||||
else
|
||||
doit_exec=$doit
|
||||
fi
|
||||
|
||||
# Put in absolute file names if you don't have them in your path;
|
||||
# or use environment vars.
|
||||
|
||||
chgrpprog=${CHGRPPROG-chgrp}
|
||||
chmodprog=${CHMODPROG-chmod}
|
||||
chownprog=${CHOWNPROG-chown}
|
||||
cmpprog=${CMPPROG-cmp}
|
||||
cpprog=${CPPROG-cp}
|
||||
mkdirprog=${MKDIRPROG-mkdir}
|
||||
mvprog=${MVPROG-mv}
|
||||
rmprog=${RMPROG-rm}
|
||||
stripprog=${STRIPPROG-strip}
|
||||
|
||||
posix_glob='?'
|
||||
initialize_posix_glob='
|
||||
test "$posix_glob" != "?" || {
|
||||
if (set -f) 2>/dev/null; then
|
||||
posix_glob=
|
||||
else
|
||||
posix_glob=:
|
||||
fi
|
||||
}
|
||||
'
|
||||
|
||||
posix_mkdir=
|
||||
|
||||
# Desired mode of installed file.
|
||||
mode=0755
|
||||
|
||||
chgrpcmd=
|
||||
chmodcmd=$chmodprog
|
||||
chowncmd=
|
||||
mvcmd=$mvprog
|
||||
rmcmd="$rmprog -f"
|
||||
stripcmd=
|
||||
|
||||
src=
|
||||
dst=
|
||||
dir_arg=
|
||||
dst_arg=
|
||||
|
||||
copy_on_change=false
|
||||
no_target_directory=
|
||||
|
||||
usage="\
|
||||
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
||||
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
||||
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
||||
or: $0 [OPTION]... -d DIRECTORIES...
|
||||
|
||||
In the 1st form, copy SRCFILE to DSTFILE.
|
||||
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
||||
In the 4th, create DIRECTORIES.
|
||||
|
||||
Options:
|
||||
--help display this help and exit.
|
||||
--version display version info and exit.
|
||||
|
||||
-c (ignored)
|
||||
-C install only if different (preserve the last data modification time)
|
||||
-d create directories instead of installing files.
|
||||
-g GROUP $chgrpprog installed files to GROUP.
|
||||
-m MODE $chmodprog installed files to MODE.
|
||||
-o USER $chownprog installed files to USER.
|
||||
-s $stripprog installed files.
|
||||
-t DIRECTORY install into DIRECTORY.
|
||||
-T report an error if DSTFILE is a directory.
|
||||
|
||||
Environment variables override the default commands:
|
||||
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
||||
RMPROG STRIPPROG
|
||||
"
|
||||
|
||||
while test $# -ne 0; do
|
||||
case $1 in
|
||||
-c) ;;
|
||||
|
||||
-C) copy_on_change=true;;
|
||||
|
||||
-d) dir_arg=true;;
|
||||
|
||||
-g) chgrpcmd="$chgrpprog $2"
|
||||
shift;;
|
||||
|
||||
--help) echo "$usage"; exit $?;;
|
||||
|
||||
-m) mode=$2
|
||||
case $mode in
|
||||
*' '* | *' '* | *'
|
||||
'* | *'*'* | *'?'* | *'['*)
|
||||
echo "$0: invalid mode: $mode" >&2
|
||||
exit 1;;
|
||||
esac
|
||||
shift;;
|
||||
|
||||
-o) chowncmd="$chownprog $2"
|
||||
shift;;
|
||||
|
||||
-s) stripcmd=$stripprog;;
|
||||
|
||||
-t) dst_arg=$2
|
||||
# Protect names problematic for 'test' and other utilities.
|
||||
case $dst_arg in
|
||||
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||
esac
|
||||
shift;;
|
||||
|
||||
-T) no_target_directory=true;;
|
||||
|
||||
--version) echo "$0 $scriptversion"; exit $?;;
|
||||
|
||||
--) shift
|
||||
break;;
|
||||
|
||||
-*) echo "$0: invalid option: $1" >&2
|
||||
exit 1;;
|
||||
|
||||
*) break;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
||||
# When -d is used, all remaining arguments are directories to create.
|
||||
# When -t is used, the destination is already specified.
|
||||
# Otherwise, the last argument is the destination. Remove it from $@.
|
||||
for arg
|
||||
do
|
||||
if test -n "$dst_arg"; then
|
||||
# $@ is not empty: it contains at least $arg.
|
||||
set fnord "$@" "$dst_arg"
|
||||
shift # fnord
|
||||
fi
|
||||
shift # arg
|
||||
dst_arg=$arg
|
||||
# Protect names problematic for 'test' and other utilities.
|
||||
case $dst_arg in
|
||||
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
|
||||
if test $# -eq 0; then
|
||||
if test -z "$dir_arg"; then
|
||||
echo "$0: no input file specified." >&2
|
||||
exit 1
|
||||
fi
|
||||
# It's OK to call 'install-sh -d' without argument.
|
||||
# This can happen when creating conditional directories.
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if test -z "$dir_arg"; then
|
||||
do_exit='(exit $ret); exit $ret'
|
||||
trap "ret=129; $do_exit" 1
|
||||
trap "ret=130; $do_exit" 2
|
||||
trap "ret=141; $do_exit" 13
|
||||
trap "ret=143; $do_exit" 15
|
||||
|
||||
# Set umask so as not to create temps with too-generous modes.
|
||||
# However, 'strip' requires both read and write access to temps.
|
||||
case $mode in
|
||||
# Optimize common cases.
|
||||
*644) cp_umask=133;;
|
||||
*755) cp_umask=22;;
|
||||
|
||||
*[0-7])
|
||||
if test -z "$stripcmd"; then
|
||||
u_plus_rw=
|
||||
else
|
||||
u_plus_rw='% 200'
|
||||
fi
|
||||
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
|
||||
*)
|
||||
if test -z "$stripcmd"; then
|
||||
u_plus_rw=
|
||||
else
|
||||
u_plus_rw=,u+rw
|
||||
fi
|
||||
cp_umask=$mode$u_plus_rw;;
|
||||
esac
|
||||
fi
|
||||
|
||||
for src
|
||||
do
|
||||
# Protect names problematic for 'test' and other utilities.
|
||||
case $src in
|
||||
-* | [=\(\)!]) src=./$src;;
|
||||
esac
|
||||
|
||||
if test -n "$dir_arg"; then
|
||||
dst=$src
|
||||
dstdir=$dst
|
||||
test -d "$dstdir"
|
||||
dstdir_status=$?
|
||||
else
|
||||
|
||||
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
||||
# might cause directories to be created, which would be especially bad
|
||||
# if $src (and thus $dsttmp) contains '*'.
|
||||
if test ! -f "$src" && test ! -d "$src"; then
|
||||
echo "$0: $src does not exist." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if test -z "$dst_arg"; then
|
||||
echo "$0: no destination specified." >&2
|
||||
exit 1
|
||||
fi
|
||||
dst=$dst_arg
|
||||
|
||||
# If destination is a directory, append the input filename; won't work
|
||||
# if double slashes aren't ignored.
|
||||
if test -d "$dst"; then
|
||||
if test -n "$no_target_directory"; then
|
||||
echo "$0: $dst_arg: Is a directory" >&2
|
||||
exit 1
|
||||
fi
|
||||
dstdir=$dst
|
||||
dst=$dstdir/`basename "$src"`
|
||||
dstdir_status=0
|
||||
else
|
||||
# Prefer dirname, but fall back on a substitute if dirname fails.
|
||||
dstdir=`
|
||||
(dirname "$dst") 2>/dev/null ||
|
||||
expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
||||
X"$dst" : 'X\(//\)[^/]' \| \
|
||||
X"$dst" : 'X\(//\)$' \| \
|
||||
X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
|
||||
echo X"$dst" |
|
||||
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
/^X\(\/\/\)[^/].*/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
/^X\(\/\/\)$/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
/^X\(\/\).*/{
|
||||
s//\1/
|
||||
q
|
||||
}
|
||||
s/.*/./; q'
|
||||
`
|
||||
|
||||
test -d "$dstdir"
|
||||
dstdir_status=$?
|
||||
fi
|
||||
fi
|
||||
|
||||
obsolete_mkdir_used=false
|
||||
|
||||
if test $dstdir_status != 0; then
|
||||
case $posix_mkdir in
|
||||
'')
|
||||
# Create intermediate dirs using mode 755 as modified by the umask.
|
||||
# This is like FreeBSD 'install' as of 1997-10-28.
|
||||
umask=`umask`
|
||||
case $stripcmd.$umask in
|
||||
# Optimize common cases.
|
||||
*[2367][2367]) mkdir_umask=$umask;;
|
||||
.*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
|
||||
|
||||
*[0-7])
|
||||
mkdir_umask=`expr $umask + 22 \
|
||||
- $umask % 100 % 40 + $umask % 20 \
|
||||
- $umask % 10 % 4 + $umask % 2
|
||||
`;;
|
||||
*) mkdir_umask=$umask,go-w;;
|
||||
esac
|
||||
|
||||
# With -d, create the new directory with the user-specified mode.
|
||||
# Otherwise, rely on $mkdir_umask.
|
||||
if test -n "$dir_arg"; then
|
||||
mkdir_mode=-m$mode
|
||||
else
|
||||
mkdir_mode=
|
||||
fi
|
||||
|
||||
posix_mkdir=false
|
||||
case $umask in
|
||||
*[123567][0-7][0-7])
|
||||
# POSIX mkdir -p sets u+wx bits regardless of umask, which
|
||||
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
|
||||
;;
|
||||
*)
|
||||
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
||||
trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
|
||||
|
||||
if (umask $mkdir_umask &&
|
||||
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
|
||||
then
|
||||
if test -z "$dir_arg" || {
|
||||
# Check for POSIX incompatibilities with -m.
|
||||
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
||||
# other-writable bit of parent directory when it shouldn't.
|
||||
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
||||
ls_ld_tmpdir=`ls -ld "$tmpdir"`
|
||||
case $ls_ld_tmpdir in
|
||||
d????-?r-*) different_mode=700;;
|
||||
d????-?--*) different_mode=755;;
|
||||
*) false;;
|
||||
esac &&
|
||||
$mkdirprog -m$different_mode -p -- "$tmpdir" && {
|
||||
ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
|
||||
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
||||
}
|
||||
}
|
||||
then posix_mkdir=:
|
||||
fi
|
||||
rmdir "$tmpdir/d" "$tmpdir"
|
||||
else
|
||||
# Remove any dirs left behind by ancient mkdir implementations.
|
||||
rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
|
||||
fi
|
||||
trap '' 0;;
|
||||
esac;;
|
||||
esac
|
||||
|
||||
if
|
||||
$posix_mkdir && (
|
||||
umask $mkdir_umask &&
|
||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
|
||||
)
|
||||
then :
|
||||
else
|
||||
|
||||
# The umask is ridiculous, or mkdir does not conform to POSIX,
|
||||
# or it failed possibly due to a race condition. Create the
|
||||
# directory the slow way, step by step, checking for races as we go.
|
||||
|
||||
case $dstdir in
|
||||
/*) prefix='/';;
|
||||
[-=\(\)!]*) prefix='./';;
|
||||
*) prefix='';;
|
||||
esac
|
||||
|
||||
eval "$initialize_posix_glob"
|
||||
|
||||
oIFS=$IFS
|
||||
IFS=/
|
||||
$posix_glob set -f
|
||||
set fnord $dstdir
|
||||
shift
|
||||
$posix_glob set +f
|
||||
IFS=$oIFS
|
||||
|
||||
prefixes=
|
||||
|
||||
for d
|
||||
do
|
||||
test X"$d" = X && continue
|
||||
|
||||
prefix=$prefix$d
|
||||
if test -d "$prefix"; then
|
||||
prefixes=
|
||||
else
|
||||
if $posix_mkdir; then
|
||||
(umask=$mkdir_umask &&
|
||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
|
||||
# Don't fail if two instances are running concurrently.
|
||||
test -d "$prefix" || exit 1
|
||||
else
|
||||
case $prefix in
|
||||
*\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
|
||||
*) qprefix=$prefix;;
|
||||
esac
|
||||
prefixes="$prefixes '$qprefix'"
|
||||
fi
|
||||
fi
|
||||
prefix=$prefix/
|
||||
done
|
||||
|
||||
if test -n "$prefixes"; then
|
||||
# Don't fail if two instances are running concurrently.
|
||||
(umask $mkdir_umask &&
|
||||
eval "\$doit_exec \$mkdirprog $prefixes") ||
|
||||
test -d "$dstdir" || exit 1
|
||||
obsolete_mkdir_used=true
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if test -n "$dir_arg"; then
|
||||
{ test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
|
||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
|
||||
{ test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
|
||||
test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
|
||||
else
|
||||
|
||||
# Make a couple of temp file names in the proper directory.
|
||||
dsttmp=$dstdir/_inst.$$_
|
||||
rmtmp=$dstdir/_rm.$$_
|
||||
|
||||
# Trap to clean up those temp files at exit.
|
||||
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
||||
|
||||
# Copy the file name to the temp name.
|
||||
(umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
|
||||
|
||||
# and set any options; do chmod last to preserve setuid bits.
|
||||
#
|
||||
# If any of these fail, we abort the whole thing. If we want to
|
||||
# ignore errors from any of these, just make sure not to ignore
|
||||
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
||||
#
|
||||
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
|
||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
|
||||
{ test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
|
||||
{ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
|
||||
|
||||
# If -C, don't bother to copy if it wouldn't change the file.
|
||||
if $copy_on_change &&
|
||||
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
||||
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
||||
|
||||
eval "$initialize_posix_glob" &&
|
||||
$posix_glob set -f &&
|
||||
set X $old && old=:$2:$4:$5:$6 &&
|
||||
set X $new && new=:$2:$4:$5:$6 &&
|
||||
$posix_glob set +f &&
|
||||
|
||||
test "$old" = "$new" &&
|
||||
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
||||
then
|
||||
rm -f "$dsttmp"
|
||||
else
|
||||
# Rename the file to the real destination.
|
||||
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
||||
|
||||
# The rename failed, perhaps because mv can't rename something else
|
||||
# to itself, or perhaps because mv is so ancient that it does not
|
||||
# support -f.
|
||||
{
|
||||
# Now remove or move aside any old file at destination location.
|
||||
# We try this two ways since rm can't unlink itself on some
|
||||
# systems and the destination file might be busy for other
|
||||
# reasons. In this case, the final cleanup might fail but the new
|
||||
# file should still install successfully.
|
||||
{
|
||||
test ! -f "$dst" ||
|
||||
$doit $rmcmd -f "$dst" 2>/dev/null ||
|
||||
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
||||
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
|
||||
} ||
|
||||
{ echo "$0: cannot unlink or rename $dst" >&2
|
||||
(exit 1); exit 1
|
||||
}
|
||||
} &&
|
||||
|
||||
# Now rename the file to the real destination.
|
||||
$doit $mvcmd "$dsttmp" "$dst"
|
||||
}
|
||||
fi || exit 1
|
||||
|
||||
trap '' 0
|
||||
fi
|
||||
done
|
||||
|
||||
# Local variables:
|
||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
||||
21
debuggers/openocd/jimtcl/.gitignore
vendored
Normal file
21
debuggers/openocd/jimtcl/.gitignore
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
config.log
|
||||
tags
|
||||
/Makefile
|
||||
Tcl.html
|
||||
jimautoconf.h
|
||||
jimautoconfext.h
|
||||
jim-config.h
|
||||
_*.c
|
||||
jim-stdlib.c
|
||||
jim-tclcompat.c
|
||||
jim-tree.c
|
||||
jim-oo.c
|
||||
jimsh
|
||||
*.exe
|
||||
libjim.a
|
||||
*.so
|
||||
*.dll
|
||||
*.o
|
||||
configure.gnu
|
||||
jimsh0
|
||||
build-jim-ext
|
||||
34
debuggers/openocd/jimtcl/.indent.pro
vendored
Normal file
34
debuggers/openocd/jimtcl/.indent.pro
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
-ncs
|
||||
-npcs
|
||||
-nut
|
||||
-bad
|
||||
-bap
|
||||
-bbb
|
||||
-nbc
|
||||
-nlp
|
||||
-ci4
|
||||
-br
|
||||
-ncdb
|
||||
-nce
|
||||
-cli4
|
||||
-d0
|
||||
-di1
|
||||
-nfc1
|
||||
-i4
|
||||
-l100
|
||||
-npsl
|
||||
-TJim_Stack
|
||||
-TJim_HashEntry
|
||||
-TJim_HashTableType
|
||||
-TJim_HashTable
|
||||
-TJim_HashTableIterator
|
||||
-TJim_Obj
|
||||
-TJim_ObjType
|
||||
-TJim_CallFrame
|
||||
-TJim_Var
|
||||
-TJim_Cmd
|
||||
-TJim_PrngState
|
||||
-TJim_Interp
|
||||
-TJim_Reference
|
||||
-TParseToken
|
||||
-TParseTokenList
|
||||
11
debuggers/openocd/jimtcl/.project
Normal file
11
debuggers/openocd/jimtcl/.project
Normal file
@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>jim</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
41
debuggers/openocd/jimtcl/AUTHORS
Normal file
41
debuggers/openocd/jimtcl/AUTHORS
Normal file
@ -0,0 +1,41 @@
|
||||
Salvatore Sanfilippo <antirez@invece.org>
|
||||
|
||||
with the help (patches, bug reports, ideas, extensions) of:
|
||||
|
||||
Pat Thoyts
|
||||
Clemens Hintze
|
||||
|
||||
See also the ChangeLog and README files for other credits.
|
||||
|
||||
DESIGN CREDITS:
|
||||
|
||||
some of the idea inside Jim are the fruit of long discussions
|
||||
inside the Tclers chat room. The feedback of the Tcl
|
||||
comunity in general, and of the members of the Tcl Core Team, was
|
||||
very important to avoid mistakes: I used the great experience of
|
||||
this people as a test for some of the ideas I put into Jim.
|
||||
Bad ideas tend to be demolished in no time by good engineers.
|
||||
|
||||
Also the following ideas are due to the following authors:
|
||||
|
||||
- Jim locals were originally proposed by Miguel Sofer, I (SS) added
|
||||
the feature that make they similar to lexical scoped closures
|
||||
using capturing of the local variables value if no explicit
|
||||
intialization is provided.
|
||||
|
||||
- The [lmap] command is my (SS) design, but I incorporated inside the
|
||||
command an interesting idea of Donal K. Fellows that proposed that
|
||||
the [continue] command may be used to skip the accumulation of the
|
||||
current-iteartion result, providing in one command the power of
|
||||
[map] and [filter] together.
|
||||
|
||||
|
||||
ChangeLog committers to be identified. Tentative list:
|
||||
|
||||
antirez - Salvatore Sanfilippo <antirez@gmail.com>
|
||||
patthoyts - Pat Thoyts <patthoyts@users.sf.net>
|
||||
oharboe - <20>yvind Harboe - soyvind.harboe@zylin.com
|
||||
Andrew Lunn <andrew@lunn.ch>
|
||||
Duane Ellis <openocd@duaneellis.com>
|
||||
Uwe Klein <uklein@klein-messgeraete.de>
|
||||
Clemens Hintze ml-jim@qiao.in-berlin.de aka chi
|
||||
4
debuggers/openocd/jimtcl/BUGS
Normal file
4
debuggers/openocd/jimtcl/BUGS
Normal file
@ -0,0 +1,4 @@
|
||||
Known bugs
|
||||
==========
|
||||
|
||||
None!
|
||||
93
debuggers/openocd/jimtcl/DEVELOPING
Normal file
93
debuggers/openocd/jimtcl/DEVELOPING
Normal file
@ -0,0 +1,93 @@
|
||||
Working on Jim
|
||||
==============
|
||||
|
||||
Jim's sources are kept in Git Version Control System. Global repository of
|
||||
Jim project is placed on this Web site:
|
||||
|
||||
http://repo.or.cz/w/jimtcl.git
|
||||
|
||||
There are two ways of contributing to Jim project. First is suited for
|
||||
one-time fixes and small corrections. The second is more appropriate
|
||||
for long-term contributors interested in Jim internals.
|
||||
|
||||
Small changes
|
||||
=============
|
||||
|
||||
For small modifications, procedure of preparing a traditional 'patch'
|
||||
is enough. In order to prepare a patch, you first have to obtain the
|
||||
most recent copy of Jim Tcl. This can be done with following command:
|
||||
|
||||
git clone http://repo.or.cz/r/jimtcl.git
|
||||
|
||||
After entering newly created directory you can easily correct/fix/modify
|
||||
files. Once finished, patch can be easily generated:
|
||||
|
||||
git diff > my_patch_fixing_x_y.patch
|
||||
|
||||
If working without Git system, you'll have to backup files first, modify
|
||||
the original files and obtain a patch manually:
|
||||
|
||||
cp jim.c jim.c.ORIGINAL
|
||||
|
||||
[...] <- modifications go here
|
||||
|
||||
diff -u jim.c.ORIGINAL jim.c > my_patch_fixing_z.patch
|
||||
|
||||
Bigger changes
|
||||
==============
|
||||
|
||||
In order to help extending and correcting Jim in a long term basis, one
|
||||
needs to create separate fork of Jim project and maintain his changes in a
|
||||
separate copy of a repository.
|
||||
|
||||
By visiting this site, you'll have a chance to fork a project. This can
|
||||
be easily done with "fork" link. Form that will show up next refers to
|
||||
the project that is about to be started. The only thing that has to be
|
||||
taken care of is the project mode -- it should be "push mode".
|
||||
|
||||
Once the project is created one must add a user that will actually
|
||||
start commiting new files to the repo. It can also be done through the
|
||||
WWW interface, so nothing more is necessary.
|
||||
|
||||
Once finished with setting up a project on the WWW panel, one can
|
||||
start playing with actual import of the files. In order to obtain copy
|
||||
of Jim sources, we have to clone the repository:
|
||||
|
||||
git clone http://repo.or.cz/r/jimtcl.git
|
||||
|
||||
Now, we must push fresh copy of Jim to your project URL:
|
||||
|
||||
git push <URL> master
|
||||
|
||||
So for example for me it was:
|
||||
|
||||
git push ssh://repo.or.cz/srv/git/jimtcl/wkoszek.git master
|
||||
|
||||
In order to add file we type "git add <file>". For remove, we do "git rm
|
||||
<file>". To remove all local changes that aren't in a repository you do "git
|
||||
reset --hard HEAD". Once inserted, files have to be commited with "git commit
|
||||
-a". Once done with commits for today, "git push" can be used to propagate
|
||||
changes from your local disk to the remote repository.
|
||||
|
||||
Right now you can verify whether this works by trying to clone your
|
||||
project's repository somewhere else, this time using anonymount HTTP
|
||||
access:
|
||||
|
||||
git clone http://repo.or.cz/r/jimtcl/wkoszek.git
|
||||
|
||||
Review, testing and publishing
|
||||
==============================
|
||||
|
||||
Notification of work that can be considered finished is more than welcome on
|
||||
Jim-devel mailing list:
|
||||
|
||||
https://lists.berlios.de/mailman/listinfo/jim-devel
|
||||
|
||||
Patches prepared with the procedures presented abore are welcome. Before
|
||||
submitting patches, you can verify that your changes didn't bring any
|
||||
regressions to the Jim. In order to do so, sample regression tests have
|
||||
been implemented. You can execute them by typing:
|
||||
|
||||
make test
|
||||
|
||||
All tests should succeed.
|
||||
45
debuggers/openocd/jimtcl/LICENSE
Normal file
45
debuggers/openocd/jimtcl/LICENSE
Normal file
@ -0,0 +1,45 @@
|
||||
Unless explicitly stated, all files within Jim repository are released
|
||||
under following license:
|
||||
|
||||
/* Jim - A small embeddable Tcl interpreter
|
||||
*
|
||||
* Copyright 2005 Salvatore Sanfilippo <antirez@invece.org>
|
||||
* Copyright 2005 Clemens Hintze <c.hintze@gmx.net>
|
||||
* Copyright 2005 patthoyts - Pat Thoyts <patthoyts@users.sf.net>
|
||||
* Copyright 2008 oharboe - <20>yvind Harboe - oyvind.harboe@zylin.com
|
||||
* Copyright 2008 Andrew Lunn <andrew@lunn.ch>
|
||||
* Copyright 2008 Duane Ellis <openocd@duaneellis.com>
|
||||
* Copyright 2008 Uwe Klein <uklein@klein-messgeraete.de>
|
||||
* Copyright 2008 Steve Bennett <steveb@workware.net.au>
|
||||
* Copyright 2009 Nico Coesel <ncoesel@dealogic.nl>
|
||||
* Copyright 2009 Zachary T Welch zw@superlucidity.net
|
||||
* Copyright 2009 David Brownell
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. 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.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE JIM TCL PROJECT ``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
|
||||
* JIM TCL PROJECT 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.
|
||||
*
|
||||
* The views and conclusions contained in the software and documentation
|
||||
* are those of the authors and should not be interpreted as representing
|
||||
* official policies, either expressed or implied, of the Jim Tcl Project.
|
||||
*/
|
||||
204
debuggers/openocd/jimtcl/Makefile.in
Normal file
204
debuggers/openocd/jimtcl/Makefile.in
Normal file
@ -0,0 +1,204 @@
|
||||
# Tools
|
||||
CC = @CCACHE@ @CC@
|
||||
CXX = @CCACHE@ @CXX@
|
||||
RANLIB = @RANLIB@
|
||||
AR = @AR@
|
||||
STRIP = @STRIP@
|
||||
|
||||
# Configuration
|
||||
|
||||
SH_CFLAGS ?= @SH_CFLAGS@
|
||||
SH_LDFLAGS ?= @SH_LDFLAGS@
|
||||
SHOBJ_CFLAGS ?= @SHOBJ_CFLAGS@
|
||||
@if JIM_STATICLIB
|
||||
SHOBJ_LDFLAGS ?= @SHOBJ_LDFLAGS@
|
||||
@else
|
||||
SHOBJ_LDFLAGS ?= @SHOBJ_LDFLAGS_R@
|
||||
@endif
|
||||
CFLAGS = @CFLAGS@
|
||||
CXXFLAGS = @CXXFLAGS@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LDLIBS += @LDLIBS@
|
||||
exec_prefix ?= @exec_prefix@
|
||||
prefix ?= @prefix@
|
||||
|
||||
CC += -D_GNU_SOURCE -Wall $(OPTIM) -I.
|
||||
CXX += -D_GNU_SOURCE -Wall $(OPTIM) -I.
|
||||
@if srcdir != .
|
||||
CFLAGS += -I@srcdir@
|
||||
CXXFLAGS += -I@srcdir@
|
||||
VPATH := @srcdir@
|
||||
@endif
|
||||
|
||||
@if JIM_STATICLIB
|
||||
LIBJIM := libjim.a
|
||||
@else
|
||||
LIBJIM := libjim.@LIBSOEXT@
|
||||
SH_LIBJIM := $(LIBJIM)
|
||||
CC += $(SH_CFLAGS)
|
||||
CXX += $(SH_CFLAGS)
|
||||
DEF_LD_PATH := @LD_LIBRARY_PATH@=@builddir@
|
||||
@endif
|
||||
|
||||
@if HAVE_CXX_EXTENSIONS
|
||||
JIMSH_CC := $(CXX) $(CXXFLAGS)
|
||||
@else
|
||||
JIMSH_CC := $(CC) $(CFLAGS)
|
||||
@endif
|
||||
|
||||
OBJS := _load-static-exts.o jim-subcmd.o jim-interactive.o jim-format.o jim.o utf8.o jimregexp.o \
|
||||
@EXTRA_OBJS@ @C_EXT_OBJS@ @TCL_EXT_OBJS@
|
||||
|
||||
JIMSH := jimsh@EXEEXT@
|
||||
|
||||
all: $(JIMSH) @C_EXT_SHOBJS@
|
||||
|
||||
# Create C extensions from pure Tcl extensions
|
||||
.SUFFIXES: .tcl
|
||||
.tcl.o:
|
||||
@tclsh@ @srcdir@/make-c-ext.tcl $< >_$*.c || ( rm _$*.c; exit 1)
|
||||
$(CC) $(CFLAGS) -c -o $@ _$*.c || ( rm _$*.c; exit 1)
|
||||
@rm -f _$*.c
|
||||
|
||||
docs: Tcl.html
|
||||
|
||||
$(JIMSH): $(LIBJIM) jimsh.o initjimsh.o
|
||||
$(JIMSH_CC) @SH_LINKFLAGS@ $(LDFLAGS) -o $@ jimsh.o initjimsh.o $(LIBJIM) $(LDLIBS)
|
||||
|
||||
@if JIM_INSTALL
|
||||
install: all docs @TCL_EXTS@ install-exec
|
||||
mkdir -p $(DESTDIR)$(prefix)/lib/jim
|
||||
cp $(LIBJIM) $(DESTDIR)$(prefix)/lib
|
||||
cp @srcdir@/README.extensions @C_EXT_SHOBJS@ @TCL_EXTS@ $(DESTDIR)$(prefix)/lib/jim
|
||||
mkdir -p $(DESTDIR)$(prefix)/include
|
||||
cp @srcdir@/jim.h @srcdir@/jim-eventloop.h @srcdir@/jim-signal.h \
|
||||
@srcdir@/jim-subcmd.h @srcdir@/jim-win32compat.h $(DESTDIR)$(prefix)/include
|
||||
cp jim-config.h $(DESTDIR)$(prefix)/include
|
||||
mkdir -p $(DESTDIR)$(prefix)/doc/jim
|
||||
cp Tcl.html $(DESTDIR)$(prefix)/doc/jim
|
||||
mkdir -p $(DESTDIR)$(prefix)/bin
|
||||
cp build-jim-ext $(DESTDIR)$(prefix)/bin
|
||||
|
||||
install-exec: all
|
||||
mkdir -p $(DESTDIR)$(prefix)/bin
|
||||
cp $(JIMSH) $(DESTDIR)$(prefix)/bin
|
||||
|
||||
uninstall:
|
||||
rm -f $(DESTDIR)$(prefix)/bin/$(JIMSH)
|
||||
rm -f $(DESTDIR)$(prefix)/bin/build-jim-ext
|
||||
rm -f $(DESTDIR)$(prefix)/lib/$(LIBJIM)
|
||||
for i in README.extensions @C_EXT_SHOBJS@ @TCL_EXTS@; do rm -f $(DESTDIR)$(prefix)/lib/jim/$$i; done
|
||||
rm -f $(DESTDIR)$(prefix)/include/jim*.h
|
||||
rm -f $(DESTDIR)$(prefix)/doc/jim/Tcl.html
|
||||
@else
|
||||
install install-exec: all
|
||||
uninstall:
|
||||
@endif
|
||||
|
||||
test: $(JIMSH)
|
||||
cd @srcdir@/tests; $(DEF_LD_PATH) $(MAKE) jimsh=@builddir@/jimsh
|
||||
|
||||
$(OBJS): Makefile
|
||||
|
||||
@if JIM_UTF8
|
||||
# Generate the unicode case mapping
|
||||
utf8.o: _unicode_mapping.c
|
||||
|
||||
_unicode_mapping.c: @srcdir@/UnicodeData.txt @srcdir@/parse-unidata.tcl
|
||||
@tclsh@ @srcdir@/parse-unidata.tcl @srcdir@/UnicodeData.txt >$@ || ( rm $@; exit 1)
|
||||
@endif
|
||||
|
||||
_load-static-exts.c: @srcdir@/make-load-static-exts.tcl Makefile
|
||||
@tclsh@ @srcdir@/make-load-static-exts.tcl @STATIC_EXTS@ >$@ || ( rm $@; exit 1)
|
||||
|
||||
@if JIM_STATICLIB
|
||||
$(LIBJIM): $(OBJS)
|
||||
$(AR) cr $@ $(OBJS)
|
||||
$(RANLIB) $@
|
||||
@else
|
||||
$(LIBJIM): $(OBJS)
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) $(SH_LDFLAGS) -o $@ $(OBJS) $(LDLIBS)
|
||||
@endif
|
||||
|
||||
# Note that $> $^ is for compatibility with both GNU make and BSD make
|
||||
readdir.so: jim-readdir.c
|
||||
$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-readdir.o $> $^
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-readdir.o $(SH_LIBJIM)
|
||||
|
||||
array.so: jim-array.c
|
||||
$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-array.o $> $^
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-array.o $(SH_LIBJIM)
|
||||
|
||||
clock.so: jim-clock.c
|
||||
$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-clock.o $> $^
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-clock.o $(SH_LIBJIM)
|
||||
|
||||
file.so: jim-file.c
|
||||
$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-file.o $> $^
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-file.o $(SH_LIBJIM)
|
||||
|
||||
posix.so: jim-posix.c
|
||||
$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-posix.o $> $^
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-posix.o $(SH_LIBJIM)
|
||||
|
||||
regexp.so: jim-regexp.c
|
||||
$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-regexp.o $> $^
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-regexp.o $(SH_LIBJIM)
|
||||
|
||||
syslog.so: jim-syslog.c
|
||||
$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-syslog.o $> $^
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-syslog.o $(SH_LIBJIM)
|
||||
|
||||
readline.so: jim-readline.c
|
||||
$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-readline.o $> $^
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-readline.o $(SH_LIBJIM) @LDLIBS_readline@
|
||||
|
||||
pack.so: jim-pack.c
|
||||
$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-pack.o $> $^
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-pack.o $(SH_LIBJIM) @LDLIBS_pack@
|
||||
|
||||
tclprefix.so: jim-tclprefix.c
|
||||
$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-tclprefix.o $> $^
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-tclprefix.o $(SH_LIBJIM) @LDLIBS_tclprefix@
|
||||
|
||||
sqlite3.so: jim-sqlite3.c
|
||||
$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-sqlite3.o $> $^
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-sqlite3.o $(SH_LIBJIM) @LDLIBS_sqlite3@
|
||||
|
||||
win32.so: jim-win32.c
|
||||
$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-win32.o $> $^
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-win32.o $(SH_LIBJIM) @LDLIBS_win32@
|
||||
|
||||
mk.so: jim-mk.cpp
|
||||
$(CXX) $(CXXFLAGS) $(SHOBJ_CFLAGS) -c -o jim-mk.o $> $^
|
||||
$(CXX) $(CXXFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-mk.o $(SH_LIBJIM) @LDLIBS_mk@
|
||||
|
||||
sdl.so: jim-sdl.c
|
||||
$(CC) $(CFLAGS) $(SHOBJ_CFLAGS) -c -o jim-sdl.o $> $^
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) $(SHOBJ_LDFLAGS) -o $@ jim-sdl.o $(SH_LIBJIM) @LDLIBS_sdl@
|
||||
|
||||
Tcl.html: jim_tcl.txt
|
||||
@tclsh@ @srcdir@/make-index $> $^ | asciidoc -o $@ -d manpage - || cp @srcdir@/Tcl_shipped.html Tcl.html
|
||||
|
||||
clean:
|
||||
rm -f *.o *.so *.dll *.exe lib*.a $(JIMSH) Tcl.html _*.c
|
||||
|
||||
distclean: clean
|
||||
rm -f jimautoconf.h jim-config.h Makefile config.log autosetup/jimsh0@EXEEXT@ build-jim-ext
|
||||
|
||||
ship: Tcl.html
|
||||
cp $< Tcl_shipped.html
|
||||
|
||||
# automake compatibility. do nothing for all these targets
|
||||
EMPTY_AUTOMAKE_TARGETS := dvi pdf ps info html tags ctags mostlyclean maintainer-clean check installcheck installdirs \
|
||||
install-pdf install-ps install-info install-html -install-dvi uninstall install-data
|
||||
.PHONY: $(EMPTY_AUTOMAKE_TARGETS)
|
||||
$(EMPTY_AUTOMAKE_TARGETS):
|
||||
|
||||
# automake compatibility - install sources from the current dir to $(distdir)
|
||||
distdir_full := $(shell cd $(distdir); pwd)
|
||||
distdir:
|
||||
cd "@srcdir@"; git ls-files | cpio -pdmu $(distdir_full)
|
||||
|
||||
reconfig:
|
||||
CC='@CC@' @AUTOREMAKE@
|
||||
235
debuggers/openocd/jimtcl/README
Normal file
235
debuggers/openocd/jimtcl/README
Normal file
@ -0,0 +1,235 @@
|
||||
The Jim Interpreter
|
||||
|
||||
A small-footprint implementation of the Tcl programming language.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
WHAT IS JIM?
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
Jim is a small footprint implementation of the Tcl programming language
|
||||
written from scratch. Currently Jim Tcl is very feature complete with
|
||||
an extensive test suite (see the tests directory).
|
||||
There are some Tcl commands and features which are not implemented
|
||||
(and likely never will be), including namespaces, traces and Tk. However
|
||||
Jim Tcl offers a number of both Tcl8.5 and Tcl8.6 features ({*}, dict, lassign,
|
||||
tailcall and optional UTF-8 support) and some unique features.
|
||||
These unique features include [lambda] with garbage collection, a general GC/references
|
||||
system, arrays as syntax sugar for [dict]tionaries, object-based I/O and more.
|
||||
|
||||
Other common features of the Tcl programming language are present, like
|
||||
the "everything is a string" behaviour, implemented internally as
|
||||
dual ported objects to ensure that the execution time does not reflect
|
||||
the semantic of the language :)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
WHEN JIM CAN BE USEFUL?
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
1) If you are writing an application, and want to make it scriptable, with
|
||||
Jim you have a way to do it that does not require to link your application
|
||||
with a big system. You can include the Jim source directly in your project
|
||||
and use the Jim API to write the glue code that makes your application
|
||||
scriptable in Jim, with the following advantages:
|
||||
|
||||
- Jim is not the next "little language", but it's a Tcl implementation.
|
||||
You can reuse your knowledge if you already Tcl skills, or enjoy
|
||||
the availability of documentation, books, web resources, ...
|
||||
(for example check my online Tcl book at http://www.invece.org/tclwise)
|
||||
|
||||
- Jim is simple, 14k lines of core code. If you want to adapt it you can hack
|
||||
the source code to meet the needs of your application. It makes you
|
||||
able to have scripting for default, and avoid external dependences.
|
||||
|
||||
Having scripting support *inside*, and in a way that a given version
|
||||
of your program always gets shipped a given version of Jim, you can
|
||||
write part of your application in Jim itself. Like it happens for
|
||||
Emacs/Elisp, or Gimp/Scheme, both this applications have the interpreter
|
||||
inside.
|
||||
|
||||
- Jim is Tcl, and Tcl looks like a configuration file if you want. So
|
||||
if you use Jim you have also a flexible syntax for your config file.
|
||||
This is a valid Tcl script:
|
||||
|
||||
set MyFeature on
|
||||
ifssl {
|
||||
set SslPort 45000
|
||||
use compression
|
||||
}
|
||||
|
||||
It looks like a configuration file, but if you implement the [ifssl]
|
||||
and [use] commands, it's a valid Tcl script.
|
||||
|
||||
- Tcl scales with the user. Not all know it, but Tcl is so powerful that
|
||||
you can reprogram the language in itself. Jim support this features
|
||||
of the Tcl programming language. You can write new control structures,
|
||||
use the flexible data types it offers (Lists are a central data structure,
|
||||
with Dictionaries that are also lists). Still Tcl is simpler for the
|
||||
casual programmer, especially if compared to other languages offering
|
||||
small footprint implementations (like Scheme and FORTH).
|
||||
|
||||
- Because of the Tcl semantic (pass by value, everything is a command
|
||||
since there are no reserved words), there is a nice API to glue
|
||||
your application with Jim. See under the Jim Tcl manual for more detail.
|
||||
|
||||
- Jim is supported. If you need commercial software, contact the original author
|
||||
at 'antirez@gmail.com' or the current maintainer at 'steveb@workware.net.au'.
|
||||
|
||||
2) The other "field" where Jim can be useful is obviously embedded systems.
|
||||
|
||||
3) We are working to make Jim as feature-complete as possible, thanks to
|
||||
dynamically loaded extensions it may stay as little as it is today
|
||||
but able to do interesting things for you. So it's not excluded that
|
||||
in the future Jim will be an option as general purpose language.
|
||||
But don't mind, for this there is already the mainstream Tcl
|
||||
implementation ;).
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
HOW BIG IS IT?
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
Jim with the default extensions configured and compiled with -Os is about 130k.
|
||||
Without any extensions, it is about 85k.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
HOW FAST IS IT?
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
Jim is in most code faster than Tcl7.6p2 (latest 7.x version),
|
||||
and slower than Tcl 8.4.x. You can expect pretty decent performance
|
||||
for such a little interpreter.
|
||||
|
||||
If you want a more precise measure, there is 'bench.tcl' inside this
|
||||
distribution that will run both under Jim and Tcl, so just execute
|
||||
it with both the interpreters and see what you get :)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
HOW TO COMPILE
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
Jim was tested under Linux, FreeBSD, MacosX, eCos, QNX, Windows XP (mingw, MVC).
|
||||
|
||||
To compile jim itself try:
|
||||
|
||||
./configure
|
||||
make
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
EXTENSIONS
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
Many optional extensions are included. Some are C extensions and others are pure Tcl.
|
||||
Form more information, try:
|
||||
|
||||
./configure --help
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
HOW TO EMBED JIM INTO APPLICATIONS
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
See the "examples.api" directory
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
HOW TO WRITE EXTENSIONS FOR JIM
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
See the extensions shipped with Jim, jim-readline.c, jim-clock.c, glob.tcl and oo.tcl
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
COPYRIGHT and LICENSE
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
Unless explicitly stated, all files within Jim repository are released
|
||||
under following license:
|
||||
|
||||
/* Jim - A small embeddable Tcl interpreter
|
||||
*
|
||||
* Copyright 2005 Salvatore Sanfilippo <antirez@invece.org>
|
||||
* Copyright 2005 Clemens Hintze <c.hintze@gmx.net>
|
||||
* Copyright 2005 patthoyts - Pat Thoyts <patthoyts@users.sf.net>
|
||||
* Copyright 2008 oharboe - Øyvind Harboe - oyvind.harboe@zylin.com
|
||||
* Copyright 2008 Andrew Lunn <andrew@lunn.ch>
|
||||
* Copyright 2008 Duane Ellis <openocd@duaneellis.com>
|
||||
* Copyright 2008 Uwe Klein <uklein@klein-messgeraete.de>
|
||||
* Copyright 2008 Steve Bennett <steveb@workware.net.au>
|
||||
* Copyright 2009 Nico Coesel <ncoesel@dealogic.nl>
|
||||
* Copyright 2009 Zachary T Welch zw@superlucidity.net
|
||||
* Copyright 2009 David Brownell
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. 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.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE JIM TCL PROJECT ``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
|
||||
* JIM TCL PROJECT 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.
|
||||
*
|
||||
* The views and conclusions contained in the software and documentation
|
||||
* are those of the authors and should not be interpreted as representing
|
||||
* official policies, either expressed or implied, of the Jim Tcl Project.
|
||||
*/
|
||||
--------------------------------------------------------------------------------
|
||||
HISTORY
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
"first Jim goal: to vent my need to hack on Tcl."
|
||||
|
||||
And actually this is exactly why I started Jim, in the first days
|
||||
of Jenuary 2005. After a month of hacking Jim was able to run
|
||||
simple scripts, now, after two months it started to be clear to
|
||||
me that it was not just the next toy to throw away but something
|
||||
that may evolve into a real interpreter. In the same time
|
||||
Pat Thoyts and Clemens Hintze started to contribute code, so that
|
||||
the development of new core commands was faster, and also more
|
||||
people hacking on the same code had as result fixes in the API,
|
||||
C macros, and so on.
|
||||
|
||||
Currently we are at the point that the core interpreter is almost finished
|
||||
and it is entering the Beta stage. There is to add some other core command,
|
||||
to do a code review to ensure quality of all the parts and to write
|
||||
documentation.
|
||||
|
||||
We already started to work on extensions like OOP, event loop,
|
||||
I/O, networking, regexp. Some extensions are already ready for
|
||||
prime time, like the Sqlite extension and the ANSI I/O.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
Thanks to...
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
- First of all, thanks to every guy that are listed in the AUTHORS file,
|
||||
that directly helped with code and ideas. Also check the ChangeLog
|
||||
file for additional credits about patches or bug reports.
|
||||
- Elisa Manara that helped me to select this ill conceived name for
|
||||
an interpreter.
|
||||
- Many people on the Tclers Chat that helped me to explore issues
|
||||
about the use and the implementation of the Tcl programming language.
|
||||
- David Welton for the tech info sharing and our chats about
|
||||
programming languages design and the ability of software to "scale down".
|
||||
- Martin S. Weber for the great help with Solaris issues, debugging of
|
||||
problems with [load] on this arch, 64bit tests.
|
||||
- The authors of "valgrind", for this wonderful tool, that helped me a
|
||||
lot to fix bugs in minutes instead of hours.
|
||||
|
||||
|
||||
----
|
||||
Enjoy!
|
||||
Salvatore Sanfilippo
|
||||
10 Mar 2005
|
||||
|
||||
|
||||
15
debuggers/openocd/jimtcl/README.extensions
Normal file
15
debuggers/openocd/jimtcl/README.extensions
Normal file
@ -0,0 +1,15 @@
|
||||
The /lib/jim directory contains both dynamically loadable extensions
|
||||
and pure-Tcl extensions.
|
||||
|
||||
Dynamically loadable extensions must have a .so file extension
|
||||
Tcl extensions must have a .tcl file extension
|
||||
|
||||
As long as /lib/jim is in $::auto_path (it is by default), extension
|
||||
abc can be loaded with:
|
||||
|
||||
package require abc
|
||||
|
||||
First abc.so will be tried, and then abc.tcl
|
||||
|
||||
Note that this directory may be something like /lib/jim, /usr/lib/jim or
|
||||
/usr/local/lib/jim, depending upon where jim was installed.
|
||||
316
debuggers/openocd/jimtcl/README.metakit
Normal file
316
debuggers/openocd/jimtcl/README.metakit
Normal file
@ -0,0 +1,316 @@
|
||||
---
|
||||
title: Metakit
|
||||
---
|
||||
|
||||
Metakit Extension for Jim Tcl
|
||||
=============================
|
||||
|
||||
OVERVIEW
|
||||
--------
|
||||
The mk extension provides an interface to the Metakit small-footprint
|
||||
embeddable database library (<http://equi4.com/metakit/>). The underlying
|
||||
library is efficient at manipulating not-so-large amounts of data and takes a
|
||||
different approach to composing database operations than common SQL-based
|
||||
relational databases.
|
||||
|
||||
Both the Metakit core library and the mk package can be linked either
|
||||
statically or dynamically and loaded using
|
||||
|
||||
package require mk
|
||||
|
||||
CREATING A DATABASE
|
||||
-------------------
|
||||
A database (called a "storage" in Metakit terms) may either reside totally in
|
||||
memory or be backed by a file. To open or create a database, call the
|
||||
`storage` command with an optional filename parameter:
|
||||
|
||||
set db [storage test.mk]
|
||||
|
||||
The returned handle can be used as a command name to access the database. When
|
||||
you are done, execute the `close` method, that is, run
|
||||
|
||||
$db close
|
||||
|
||||
A lost handle won't be found by GC but will be closed when the interpreter
|
||||
exits. Note that by default Metakit will only record changes to the database
|
||||
when you close the handle. Use the `commit` method to record the current
|
||||
state of the database to disk.
|
||||
|
||||
CREATING VIEWS
|
||||
--------------
|
||||
*Views* in Metakit are what is called "tables" in conventional databases. A view
|
||||
may several typed *properties*, or columns, and contains homogenous *rows*, or
|
||||
records. New properties may be added to a view as needed; however, new properties
|
||||
are not stored in the database file by default. The structure method specifies
|
||||
the stored properties of a view, creating a new view or restructuring an old one
|
||||
as needed:
|
||||
|
||||
$db structure viewName description
|
||||
|
||||
The view description must be a list of form `{propName type propName type ...}`.
|
||||
The supported property types include:
|
||||
|
||||
`string`
|
||||
: A NULL-terminated string, stored as an array of bytes (without any encoding
|
||||
assumptions).
|
||||
|
||||
`binary`
|
||||
: **Not yet supported by the `mk` extension.**
|
||||
Blob of binary data that may contain embedded NULLs (zero bytes). Stored
|
||||
as-is. This is more efficient than `string` when storing large blocks of
|
||||
data (e.g. images) and will adjust the storage strategy as needed.
|
||||
|
||||
`integer`
|
||||
: An signed integer value occupying a maximum of 32 bits. If all values
|
||||
stored in a column can fit in a smaller range (16, 8, or even 4 or 2 bits),
|
||||
they are packed automatically.
|
||||
|
||||
`long`
|
||||
: Like `integer`, but is required to fit into 64 bits.
|
||||
|
||||
`float` and `double`
|
||||
: 32-bit and 64-bit IEEE floating-point values respectively.
|
||||
|
||||
`subview`
|
||||
: This type is not usually specified directly; instead, a structure
|
||||
description of a nested view is given. `subview` properties store complete
|
||||
views as their value, creating hierarchical data structures. When retreived
|
||||
from a view, a value of a subview property is a normal view handle.
|
||||
|
||||
Without a `description` parameter, the `structure` method returns the current
|
||||
structure of the named view; without any parameters, it returns a dictionary
|
||||
containing structure descriptions of all views stored in the database.
|
||||
|
||||
After specifying the properties you expect to see in the view, call
|
||||
|
||||
[$db view $viewName] as viewHandle
|
||||
|
||||
to obtain a view handle. These handles are also commands, but are
|
||||
garbage-collected and also destroy themselves after a single method call; the
|
||||
`as viewHandle` call assigns the view handle to the specified variable and also
|
||||
tells the view not to destroy itself until all the references to it are gone.
|
||||
|
||||
View handles may also be made permanent by giving them a global command name,
|
||||
e.g.
|
||||
|
||||
rename [$db view data] .db.data
|
||||
|
||||
However, such view handles are not managed automatically at all and must be
|
||||
destroyed using the `destroy` method, or by renaming them to `""`.
|
||||
|
||||
MANIPULATING DATA
|
||||
-----------------
|
||||
The value of a particular property is obtained using
|
||||
|
||||
cursor get $cur propName
|
||||
|
||||
where `$cur` is a string of form `viewHandle!index`. Row indices are zero-based
|
||||
and may also be specified relative to the last row of the view using the
|
||||
`end[+-]integer` notation.
|
||||
|
||||
A dictionary containing all property name and value pairs can be retreived by
|
||||
omitting the `propName` argument:
|
||||
|
||||
cursor get $cur
|
||||
|
||||
Setting property values is also performed either individually, using
|
||||
|
||||
cursor set $cur propName value ?propName value ...?
|
||||
|
||||
or via a dictionary with
|
||||
|
||||
cursor set $cur dictValue
|
||||
|
||||
In the first form of the command, property names may also be preceded by a
|
||||
-_typeName_ option. In this case, a new property of the specified type will be
|
||||
created if it doesn't already exist; note that this will cause *all* the rows
|
||||
in the view to have the property (but see **A NOTE ON NULL** below).
|
||||
|
||||
If the row index points after the end of the view, an appropriate number of
|
||||
fresh rows will be inserted first. So, for example, you can use `end+1`
|
||||
to append a new row. (Note that you then have to set it all at once, though.)
|
||||
|
||||
The total number of rows can be obtained using
|
||||
|
||||
$viewHandle size
|
||||
|
||||
and set manually with
|
||||
|
||||
$viewHandle resize newSize
|
||||
|
||||
For example, you can use `$viewHandle resize 0` to clear a view.
|
||||
|
||||
INSERT AND REMOVE
|
||||
-----------------
|
||||
New rows may also be inserted at an arbitrary position in a view with
|
||||
|
||||
cursor insert $cur ?count?
|
||||
|
||||
This will insert _count_ fresh rows into the view so that _$cur_ points to
|
||||
the first one. The inverse of this operation is
|
||||
|
||||
cursor remove $cur ?count?
|
||||
|
||||
COMPOSING VIEWS
|
||||
---------------
|
||||
The real power of Metakit lies in the way existing views are combined to create
|
||||
new ones to obtain a particular perspective on the stored data. A single
|
||||
operation takes one or more views and possibly additional options and produces a
|
||||
new view, usually tracking notifications to the underlying views and sometimes
|
||||
even supporting modification.
|
||||
|
||||
Binary operations are left-biased when there are conflicting property values;
|
||||
that is, they always prefer the values from the left view.
|
||||
|
||||
### Unary operations ###
|
||||
|
||||
*view* `unique`
|
||||
: Derived view with duplicate rows removed.
|
||||
|
||||
*view* `sort` *crit ?crit ...?*
|
||||
: Derived view sorted on the specified criteria, in order. A single _crit_
|
||||
is either a property name or a property name preceded by a dash; the latter
|
||||
specifies that the sorting is to be performed in reverse order.
|
||||
|
||||
### Binary operations ###
|
||||
|
||||
The operations taking _set_ arguments require that the given views have no
|
||||
duplicate rows. The `unique` method can be used to ensure this.
|
||||
|
||||
*view1* `concat` *view2*
|
||||
: Vertical concatenation; that is, all the rows of _view1_ and then all rows
|
||||
of _view2_.
|
||||
|
||||
*view1* `pair` *view2*
|
||||
: Pairing, or horizontal concatenation: every row in _view1_ is matched with
|
||||
a row with the same index in _view2_; the result has all the properties of
|
||||
_view1_ and all the properties of _view2_.
|
||||
|
||||
*view1* `product` *view2*
|
||||
: Cartesian product: each row in _view1_ horizontally concatenated with every
|
||||
row in _view2_.
|
||||
|
||||
*set1* `union` *set2*
|
||||
: Set union. Unlike `concat`, this operation removes duplicates from the
|
||||
result. A row is in the result if it is in _set1_ **or** in _set2_.
|
||||
|
||||
*set1* `intersect` *set2*
|
||||
: Set intersection. A row is in the result if it is in _set1_ **and** in
|
||||
_set2_.
|
||||
|
||||
*set1* `different` *set2*
|
||||
: Symmetric difference. A row is in the result if it is in _set1_ **xor** in
|
||||
_set2_, that is, in _set1_ or in _set2_, but not in both.
|
||||
|
||||
*set1* `minus` *set2*
|
||||
: Set minus. A row is in the result if it is in _set1_ **and not** in _set2_.
|
||||
|
||||
### Relational operations ###
|
||||
|
||||
*view1* `join` *view2* ?`-outer`? *prop ?prop ...?*
|
||||
: Relational join on the specified properties: the rows from _view1_ and
|
||||
_view2_ with all the specified properties equal are concatenated to form a
|
||||
new row. If the `-outer` option is specified, the rows from _view1_ that do
|
||||
not have a corresponding one in _view2_ are also left in the view, with the
|
||||
properties existing only in _view2_ filled with default values.
|
||||
|
||||
*view* `group` *subviewName prop ?prop ...?*
|
||||
: Groups the rows with all the specified properties equal; moves all the
|
||||
remaining properties into a newly created subview property called
|
||||
_subviewName_.
|
||||
|
||||
*view* `flatten` *subviewProp*
|
||||
: The inverse of `group`.
|
||||
|
||||
### Projections and selections ###
|
||||
|
||||
*view* `project` *prop ?prop ...?*
|
||||
: Projection: a derived view with only the specified properties left.
|
||||
|
||||
*view* `without` *prop ?prop ...?*
|
||||
: The opposite of `project`: a derived view with the specified properties
|
||||
removed.
|
||||
|
||||
*view* `range` *start end ?step?*
|
||||
A slice or a segment of _view_: rows at _start_, _start+step_, and so on,
|
||||
until the row number becomes larger than _end_. The usual `end[+-]integer`
|
||||
notation is supported, but the indices don't change if the underlying view
|
||||
is resized.
|
||||
|
||||
**(!) select etc. should go here**
|
||||
|
||||
### Search and storage optimization ###
|
||||
|
||||
*view* `blocked`
|
||||
: Invokes an optimization designed for storing large amounts of data. _view_
|
||||
must have a single subview property called `_B` with the desired structure
|
||||
inside. This additional level of indirection is used by `blocked` to create
|
||||
a view that looks like a usual one, but can store much more data
|
||||
efficiently. As a result, indexing into the view becomes a bit slower. Once
|
||||
this method is invoked, all access to _view_ must go through the returned
|
||||
view.
|
||||
|
||||
*view* `ordered` *prop ?prop ...?*
|
||||
: Does not transform the structure of the view in any way, but signals that
|
||||
the view should be considered ordered on a unique key consisting of the
|
||||
specified properties, enabling some optimizations. Note that duplicate keys
|
||||
are not allowed in an ordered view.
|
||||
|
||||
**(!) TODO: hash, indexed(?) -- these make no sense until searches are implemented**
|
||||
|
||||
### Pipelines ###
|
||||
|
||||
Because constructs like `[[view op1 ...] op2 ...] op3 ...` tend to be common in
|
||||
programs using Metakit, a shorthand syntax is introduced: such expressions may
|
||||
also be written as `view op1 ... | op2 ... | op3 ...`.
|
||||
|
||||
Note though that this syntax is not in any way magically wired into the
|
||||
interpreter: it is understood only by the view handles and the two commands that
|
||||
can possibly return a view: `$db view` and `cursor get`. If you want to support
|
||||
this syntax in Tcl procedures, you'll need to do this yourself, or you may want
|
||||
to create a custom view method and have the view handle work out the syntax for
|
||||
you (see **USER-DEFINED METHODS** below).
|
||||
|
||||
OTHER VIEW METHODS
|
||||
------------------
|
||||
|
||||
*view* `copy`
|
||||
: Creates a copy of view with the same data.
|
||||
|
||||
*view* `clone`
|
||||
: Creates a view with the same structure, but no data.
|
||||
|
||||
*view* `pin`
|
||||
: Specifies that the view should not be destroyed after a single method call.
|
||||
Returns _view_.
|
||||
|
||||
*view* `as` *varName*
|
||||
: In addition to the actions performed by `pin`, assigns the view handle to
|
||||
the variable named varName in the caller's scope.
|
||||
|
||||
*view* `properties`
|
||||
: Returns the names of all properties in the view.
|
||||
|
||||
*view* `type` *prop*
|
||||
: Returns the type of the specified property.
|
||||
|
||||
A NOTE ON NULL
|
||||
--------------
|
||||
Note that Metakit does not have a special `NULL` value like conventional
|
||||
relational databases do. Instead, it defines _default_ property values: `""` for
|
||||
`string` and `binary` types, `0` for all numeric types and a view with no rows
|
||||
for subviews. These defaults are used when a fresh row is inserted and when
|
||||
a new property is added to the view to fill in the missing values.
|
||||
|
||||
USER-DEFINED METHODS
|
||||
--------------------
|
||||
The storage and view handles support custom methods defined in Tcl: to define
|
||||
_methodName_ on every storage or view handle, create a procedure called
|
||||
{`mk.storage` *methodName*} or {`mk.view` *methodName*} respectively. These
|
||||
procedures will receive the handle as the first argument and all the remaining
|
||||
arguments. Remember to `pin` the view handle in view methods if you call more
|
||||
than one method of it!
|
||||
|
||||
Custom `cursor` subcommands may also be defined by creating a procedure called
|
||||
{`cursor` *methodName*}. These receive all the arguments without any
|
||||
modifications.
|
||||
191
debuggers/openocd/jimtcl/README.namespaces
Normal file
191
debuggers/openocd/jimtcl/README.namespaces
Normal file
@ -0,0 +1,191 @@
|
||||
Lightweight Namespaces for Jim Tcl
|
||||
==================================
|
||||
|
||||
There are two broad requirements for namespace support in Jim Tcl.
|
||||
|
||||
1. To allow code from multiple sources while reducing the chance of name clashes
|
||||
2. To simplify porting existing Tcl code which uses namespaces
|
||||
|
||||
This proposal addresses both of these requirements, with the following
|
||||
additional requirements imposed by Jim Tcl.
|
||||
|
||||
3. Support for namespaces should be optional, with the space and time overhead
|
||||
when namespaces are disabled as close to zero as possible.
|
||||
4. The implementation should be small and reasonably efficient.
|
||||
|
||||
To further expand on requirement (2), the goal is not to be able to run
|
||||
any Tcl scripts using namespaces with no changes. Rather, scripts
|
||||
which use namespaces in a straightforward manner, should be easily
|
||||
ported with changes which are compatible with Tcl.
|
||||
|
||||
Implicit namespaces
|
||||
-------------------
|
||||
Rather than supporting explicit namespaces as Tcl does, Jim Tcl
|
||||
supports implicit namespaces. Any procedure or variable which
|
||||
is defined with a name containing ::, is implicitly scoped within
|
||||
a namespace.
|
||||
|
||||
For example, the following procedure and variable are created
|
||||
in the namespace 'test'
|
||||
|
||||
proc ::test::myproc {} {
|
||||
puts "I am in namespace [namespace current]"
|
||||
}
|
||||
set ::test::myvar 3
|
||||
|
||||
This approach allows much of the existing variable and command
|
||||
resolution machinery to be used with little change. It also means
|
||||
that it is possible to simply define a namespace-scoped variable
|
||||
or procedure without first creating the namespace, and similarly,
|
||||
namespaces "disappear" when all variables and procedures defined
|
||||
with the namespace scope are deleted.
|
||||
|
||||
Namespaces, procedures and call frames
|
||||
--------------------------------------
|
||||
When namespace support is enabled (at build time), each procedure has an associated
|
||||
namespace (based on the procedure name). When the procedure is evaluated,
|
||||
the namespace for the created call frame is set to the namespace associated
|
||||
with the procedure.
|
||||
|
||||
Command resolution is based on the namespace of the current call frame.
|
||||
An unscoped command name will first be looked up in the current namespace,
|
||||
and then in the global namespace.
|
||||
|
||||
This also means that commands which do not create a call frame (such as commands
|
||||
implemented in C) do not have an associated namespace.
|
||||
|
||||
Similarly to Tcl, namespace eval introduces a temporary, anonymous
|
||||
call frame with the associated namespace. For example, the following
|
||||
will return "::test,1".
|
||||
|
||||
namespace eval test {
|
||||
puts [namespace current],[info level]
|
||||
}
|
||||
|
||||
Variable resolution
|
||||
-------------------
|
||||
The variable command in Jim Tcl has the same syntax as Tcl, but is closer in behaviour to the global command.
|
||||
The variable command creates a link from a local variable to a namespace variable, possibly initialising it.
|
||||
|
||||
For example, the following procedure uses 'variable' to initialse and access myvar.
|
||||
|
||||
proc ::test::myproc {} {
|
||||
variable myvar 4
|
||||
incr myvar
|
||||
}
|
||||
|
||||
Note that there is no automatic resolution of namespace variables.
|
||||
For example, the following will *not* work.
|
||||
|
||||
namespace eval ::test {
|
||||
variable myvar 4
|
||||
}
|
||||
namespace eval ::test {
|
||||
# This will increment a local variable, not ::test::myvar
|
||||
incr myvar
|
||||
}
|
||||
|
||||
And similarly, the following will only access local variables
|
||||
|
||||
set x 3
|
||||
namespace eval ::test {
|
||||
# This will incremement a local variable, not ::x
|
||||
incr x
|
||||
# This will also increment a local variable
|
||||
incr abc::def
|
||||
}
|
||||
|
||||
In the same way that variable resolution does not "fall back" to
|
||||
global variables, it also does not "fall back" to namespace variables.
|
||||
|
||||
This approach allows name resolution to be simpler and more efficient
|
||||
since it uses the same variable linking mechanism as upvar/global
|
||||
and it allows namespaces to be implicit. It also solves the "creative
|
||||
writing" problem where a variable may be created in an unintentional
|
||||
scope.
|
||||
|
||||
The namespace command
|
||||
---------------------
|
||||
Currently, the following namespace commands are supported.
|
||||
|
||||
* current - returns the current, fully-qualified namespace
|
||||
* eval - evaluates a script in a namespace (introduces a call frame)
|
||||
* qualifiers, tail, parent - note that these do not check for existence
|
||||
* code, inscope - implemented
|
||||
* delete - deletes all variables and commands with the namespace prefix
|
||||
* which - implemented
|
||||
* upvar - implemented
|
||||
|
||||
namespace children, exists, path
|
||||
--------------------------------
|
||||
With implicit namespaces, the namespace exists and namespace children commands
|
||||
are expensive to implement and are of limited use. Checking the existence
|
||||
of a namespace can be better done by checking for the existence of a known procedure
|
||||
or variable in the namespace.
|
||||
|
||||
Command resolution is always done by first looking in the namespace and then
|
||||
at the global scope, so namespace path is not required.
|
||||
|
||||
namespace ensemble
|
||||
------------------
|
||||
The namespace ensemble command is not currently supported. A future version
|
||||
of Jim Tcl will have a general-purpose ensemble creation and manipulation
|
||||
mechanism and namespace ensemble will be implemented in terms of that mechanism.
|
||||
|
||||
namespace import, export, forget, origin
|
||||
----------------------------------------
|
||||
Since Jim Tcl namespaces are implicit, there is no location to store export patterns.
|
||||
Therefore the namespace export command is a dummy command which does nothing.
|
||||
All procedures in a namespace are considered to be exported.
|
||||
|
||||
The namespace import command works by creating aliases to the target namespace
|
||||
procedures.
|
||||
|
||||
namespace forget is not implemented.
|
||||
|
||||
namespace origin understands aliases created by namespace import
|
||||
and can return the original command.
|
||||
|
||||
namespace unknown
|
||||
-----------------
|
||||
If an undefined command is invoked, the "unknown" command is invoked.
|
||||
The same namespace resolution rules apply for the unknown command.
|
||||
This means that in the following example, test::unknown will be invoked
|
||||
for the missing command rather than the global ::unknown.
|
||||
|
||||
proc unknown {args} {
|
||||
puts "global unknown"
|
||||
}
|
||||
|
||||
proc test::unknown {args} {
|
||||
puts "test unknown"
|
||||
}
|
||||
|
||||
namespace eval test {
|
||||
bogus
|
||||
}
|
||||
|
||||
This approach requires no special support and provides enough flexibility that
|
||||
the namespace unknown command is not implemented.
|
||||
|
||||
Porting namespace code from Tcl to Jim Tcl
|
||||
------------------------------------------
|
||||
For most code, the following changes will be sufficient to port code.
|
||||
|
||||
1. Canonicalise namespace names. For example, ::ns:: should be written
|
||||
as ::ns or ns as appropriate, and excess colons should be removed.
|
||||
For example ::ns:::blah should be written as ::ns::blah
|
||||
(Note that the only "excess colon" case supported is ::::abc
|
||||
in order to support [namespace current]::abc in the global namespace)
|
||||
|
||||
2. The variable command should be used within namespace eval to link
|
||||
to namespace variables, and access to variables in other namespaces
|
||||
should be fully qualified
|
||||
|
||||
Changes in the core Jim Tcl
|
||||
---------------------------
|
||||
Previously Jim Tcl performed no scoping of command names. i.e. The
|
||||
::format command was considered different from the format command.
|
||||
|
||||
Even if namespace support is disabled, the command resolution will
|
||||
recognised global scoping of commands and treat these as identical.
|
||||
253
debuggers/openocd/jimtcl/README.oo
Normal file
253
debuggers/openocd/jimtcl/README.oo
Normal file
@ -0,0 +1,253 @@
|
||||
OO Package for Jim Tcl
|
||||
======================
|
||||
|
||||
Author: Steve Bennett <steveb@workware.net.au>
|
||||
Date: 1 Nov 2010 09:18:40
|
||||
|
||||
OVERVIEW
|
||||
--------
|
||||
The pure-Tcl oo package leverages Jim's unique strengths
|
||||
to provide support for Object Oriented programming.
|
||||
|
||||
The oo package can be statically linked with Jim or installed
|
||||
as a separate Tcl package and loaded with:
|
||||
|
||||
package require oo
|
||||
|
||||
DECLARING CLASSES
|
||||
-----------------
|
||||
A class is declared with the 'class' proc as follows.
|
||||
|
||||
class myclass ?baseclasses? classvars
|
||||
|
||||
This declares a class named 'myclass' with the given dictionary,
|
||||
'classvars', providing the initial state of all new objects.
|
||||
It is important to list all class variables in 'classvars', even
|
||||
if initialised only to the empty string, since the class makes
|
||||
these variables available in methods and via [myclass vars].
|
||||
|
||||
A list of zero or more base classes may also be specified from
|
||||
which methods and class variables are imported. See INHERITANCE
|
||||
below for more details.
|
||||
|
||||
Declaring a class creates a procedure with the class name along
|
||||
with some related procedures. For example:
|
||||
|
||||
. class Account {balance 0}
|
||||
Account
|
||||
. info procs Account*
|
||||
{Account get} {Account methods} {Account eval} Account {Account new} {Account destroy}
|
||||
{Account vars} {Account classname} {Account classvars} {Account method}
|
||||
|
||||
Notice that apart from the main 'Account' procedure, all the remaining procedures (methods)
|
||||
are prefixed with 'Account' and a space.
|
||||
|
||||
PREDEFINED CLASS METHODS
|
||||
------------------------
|
||||
Decaring a class pre-defines a number of "class" methods. i.e. those which don't
|
||||
require an object and simply return or manipulate properties of the class. These are:
|
||||
|
||||
new ?instancevars?::
|
||||
Creates and returns new object, optionally overriding the default class variable values.
|
||||
Note that the class name is an alias for 'classname new {}' and can be used as a shorthand
|
||||
for creating new objects with default values.
|
||||
|
||||
method name arglist body::
|
||||
Creates or redefines a method for the class with the given name, argument list and body.
|
||||
|
||||
methods::
|
||||
Returns a list of the methods supported by this class, including both class methods
|
||||
and instance methods. Also includes base class methods.
|
||||
|
||||
vars::
|
||||
Returns a list of the class variables for this class (names
|
||||
only). Also includes base class variables.
|
||||
|
||||
classvars::
|
||||
Returns a dictionary the class variables, including initial values, for this class.
|
||||
Also includes base class variables.
|
||||
|
||||
classname::
|
||||
Returns the classname. This can be useful as [$self classname].
|
||||
|
||||
Class methods may be invoked either via the class name or via an object of the class.
|
||||
For example:
|
||||
|
||||
. class Account {balance 0}
|
||||
Account
|
||||
. Account methods
|
||||
classname classvars destroy eval get method methods new vars
|
||||
. set a [Account]
|
||||
<reference.<Account>.00000000000000000001>
|
||||
. $a methods
|
||||
classname classvars destroy eval get method methods new vars
|
||||
|
||||
PREDEFINED OBJECT METHODS
|
||||
-------------------------
|
||||
Decaring a class pre-defines a number of "object" methods. i.e. those which operate
|
||||
on a specific object.
|
||||
|
||||
destroy::
|
||||
Destroys the object. This method may be overridden, but note that it should
|
||||
delete the object with {rename $self ""}. This method will also be called
|
||||
if the object is reaped during garbage collection.
|
||||
|
||||
get varname::
|
||||
Returns the value of the given instance variable.
|
||||
|
||||
eval ?locals? body::
|
||||
Makes any given local variables available to the body, along with
|
||||
the instance variables, and evaluate the body in that context.
|
||||
This can be used for one-off evaluation to avoid declaring a method.
|
||||
|
||||
CREATING OBJECTS
|
||||
----------------
|
||||
An object is created with the 'new' method, or simply by using the classname shortcut.
|
||||
If the 'new' method is used, the variables for the newly created object (instance variables)
|
||||
may be initialised. Otherwise they are set to the default values specified when the
|
||||
class was declared.
|
||||
|
||||
For example:
|
||||
|
||||
. class Account {balance 0}
|
||||
Account
|
||||
. set a [Account]
|
||||
<reference.<Account>.00000000000000000001>
|
||||
. set b [Account new {balance 1000}]
|
||||
<reference.<Account>.00000000000000000002>
|
||||
. $a get balance
|
||||
0
|
||||
. $b get balance
|
||||
1000
|
||||
|
||||
DECLARING METHODS
|
||||
-----------------
|
||||
In addition to the predefined methods, new methods may be decared, or existing
|
||||
methods redefined with the class method, method.
|
||||
|
||||
Declaring a method is very similar to defining a proc, and the arglist
|
||||
has identical syntax. For example:
|
||||
|
||||
. Account method show {{channel stdout}} { $channel puts "Balance of account is $balance" }
|
||||
. $b show
|
||||
Balance of account is 1000
|
||||
|
||||
All instance variables are available within the method and any
|
||||
changes to these variables are maintained by the object.
|
||||
|
||||
In addition, the $self variables is defined and refers to the current object.
|
||||
This may be used to invoke further methods on the object. For example:
|
||||
|
||||
. Account method show {} { puts "Balance of account is [$self get balance]" }
|
||||
. $b show
|
||||
Balance of account is 1000
|
||||
|
||||
Notes:
|
||||
* It is a bad idea to unset an instance variable.
|
||||
* In general, you should avoid redefining any of the pre-defined methods, except for 'destroy'.
|
||||
* When accessing the caller's scope with upvar or uplevel, note that there
|
||||
are two frame levels between the caller and the method. Thus it is necessary
|
||||
to use 'upvar 2' or 'uplevel 2'
|
||||
|
||||
INHERITANCE
|
||||
-----------
|
||||
For each base class given in a new class declaration, the methods
|
||||
and variables of those classes are imported into the new class being
|
||||
defined. Base classes are imported in left to right order, so that if a
|
||||
method is defined in more than one base class, the later definition
|
||||
is selected. This applies similarly to class variables.
|
||||
|
||||
Within a method, 'super' may be used to explicitly invoke a
|
||||
base class method on the object. This applies only to the *last*
|
||||
base class given. For example:
|
||||
|
||||
# Assumes the existence of classes Account and Client
|
||||
. Account method debit {amount} { incr balance -$amount }
|
||||
. class CreditAccount {Client Account} {type visa}
|
||||
CreditAccount
|
||||
. CreditAccount method debit {amount} {
|
||||
puts "Debit $type card"
|
||||
super debit $amount
|
||||
}
|
||||
. set a [CreditAccount]
|
||||
<reference.<Account>.00000000000000000001>
|
||||
. $a debit 20
|
||||
Debit visa card
|
||||
. $a balance
|
||||
-20
|
||||
|
||||
In the CreditAccount debit method, the call to 'super debit' invokes
|
||||
the method 'Account debit' since Account is the last base class listed.
|
||||
|
||||
OBJECT LIFETIME/GARBAGE COLLECTION
|
||||
----------------------------------
|
||||
Objects are implemented as lambdas. That is, they are procedures with state
|
||||
and are named as references. This means that when an object is no longer
|
||||
reachable by any name and garbage collection runs, the object will be
|
||||
discarded and the destructor will be invoked. Note that the garbage collector
|
||||
can be invoked manually with 'collect' if required.
|
||||
|
||||
. class Account {}
|
||||
Account
|
||||
. Account method destroy {} { puts dying...; rename $self "" }
|
||||
Account destroy
|
||||
. proc a {} { set b [Account]; return "" }
|
||||
a
|
||||
. a
|
||||
. collect
|
||||
dying...
|
||||
1
|
||||
|
||||
CLASS METHODS/CLASS STATIC VARIABLES
|
||||
------------------------------------
|
||||
All methods defined with 'method' operate on objects (instances).
|
||||
If a class method is required, it is possible to simply declare one with 'proc'.
|
||||
The method dispatcher will automatically be able to dispatch to this method.
|
||||
Using this approach, it is also possible to add class static variables by
|
||||
defining static variables to the proc. Although strictly these variables
|
||||
are accessible only to that proc, not the class as a whole.
|
||||
|
||||
For example:
|
||||
|
||||
. class Account {}
|
||||
Account
|
||||
. proc {Account nextid} {} {{id 0}} { incr id }
|
||||
Account nextid
|
||||
. Account nextid
|
||||
1
|
||||
. Account nextid
|
||||
2
|
||||
. set a [Account]
|
||||
<reference.<Account>.00000000000000000001>
|
||||
. $a nextid
|
||||
3
|
||||
. $a eval { $self nextid }
|
||||
4
|
||||
|
||||
HOW METHOD DISPATCH WORKS
|
||||
-------------------------
|
||||
All class and object methods are name "classname methodname".
|
||||
|
||||
The class method dispatcher is named "classname". When invoked with a methodname,
|
||||
it simply invokes the method "classname methodname".
|
||||
|
||||
The method dispatch is via a two step process. Firstly the object procedure is invoked
|
||||
with the method name. This procedure then invokes "classname method" which sets up
|
||||
the appropriate access to the object variables, and then invokes the method body.
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
tree.tcl
|
||||
~~~~~~~~
|
||||
The 'tree' package is implemented using the 'oo' package.
|
||||
See the source code in tree.tcl and a usage example in tests/tree.test
|
||||
|
||||
Of particular note is how callbacks and recursive invocation is used in the 'walk' method.
|
||||
|
||||
examples/ootest.tcl
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
A comprehensive OO example is provided in examples/ootest.tcl.
|
||||
|
||||
It can be run simply as:
|
||||
|
||||
./jimsh examples/ootest.tcl
|
||||
177
debuggers/openocd/jimtcl/README.sqlite
Normal file
177
debuggers/openocd/jimtcl/README.sqlite
Normal file
@ -0,0 +1,177 @@
|
||||
Jim Sqlite extension documentation.
|
||||
Copyright 2005 Salvatore Sanfilippo <antirez@invece.org>
|
||||
|
||||
|
||||
Overview
|
||||
~~~~~~~~
|
||||
|
||||
The Sqlite extension makes possible to work with sqlite (http://www.sqlite.org)
|
||||
databases from Jim. SQLite is a small C library that implements a
|
||||
self-contained, embeddable, zero-configuration SQL database engine. This
|
||||
means it is perfect for embedded systems, and for stand-alone applications
|
||||
that need the power of SQL without to use an external server like Mysql.
|
||||
|
||||
Basic usage
|
||||
~~~~~~~~~~~
|
||||
|
||||
The Sqlite extension exports an Object Based interface for databases. In order
|
||||
to open a database use:
|
||||
|
||||
set f [sqlite3.open dbname]
|
||||
|
||||
The [sqlite3.open] command returns a db handle, that is a command name that
|
||||
can be used to perform operations on the database. A real example:
|
||||
|
||||
. set db [sqlite3.open test.db]
|
||||
sqlite.handle0
|
||||
. $db query "SELECT * from tbl1"
|
||||
{one hello! two 10} {one goodbye two 20}
|
||||
|
||||
In the second line the handle is used as a command name, followed
|
||||
by the 'method' or 'subcommand' ("query" in the example), and the arguments.
|
||||
|
||||
The query method
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
The query method has the following signature:
|
||||
|
||||
$db query SqlQuery ?args?
|
||||
|
||||
The sql query may contain occurrences of "%s" that are substituted
|
||||
in the actual query with the following arguments, quoted in order
|
||||
to make sure that the query is correct even if this arguments contain
|
||||
"'" characters. So for example it is possible to write:
|
||||
|
||||
. $db query "SELECT * from tbl1 WHERE one='%s'" hello!
|
||||
{one hello! two 10}
|
||||
|
||||
Instead of hello! it is possible to use a string with embedded "'":
|
||||
|
||||
. $db query "SELECT * from tbl1 WHERE one='%s'" a'b
|
||||
(no matches - the empty list is returned)
|
||||
|
||||
This does not work instead using the Tcl variable expansion in the string:
|
||||
|
||||
. $db query "SELECT * from tbl1 WHERE one='$foo'"
|
||||
Runtime error, file "?", line 1:
|
||||
near "b": syntax error
|
||||
|
||||
In order to obtain an actual '%' character in the query, there is just
|
||||
to use two, like in "foo %% bar". This is the same as the [format] argument.
|
||||
|
||||
Specification of query results
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
In one of the above examples, the following query was used:
|
||||
|
||||
. $db query "SELECT * from tbl1"
|
||||
{one hello! two 10} {one goodbye two 20}
|
||||
|
||||
As you can see the result of a query is a list of lists. Every
|
||||
element of the list represents a row, as a list of key/value pairs,
|
||||
so actually every row is a Jim dictionary.
|
||||
|
||||
The following example and generated output show how to take advantage
|
||||
of this representation:
|
||||
|
||||
. set res [$db query "SELECT * from tbl1"]
|
||||
{one hello! two 10} {one goodbye two 20}
|
||||
. foreach row $res {puts "One: $row(one), Two: $row(two)"}
|
||||
One: hello!, Two: 10
|
||||
One: goodbye, Two: 20
|
||||
|
||||
To access every row sequentially is very simple, and field of a row
|
||||
can be accessed using the $row(field) syntax.
|
||||
|
||||
The close method
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
In order to close the db, use the 'close' method that will have as side effect
|
||||
to close the db and to remove the command associated with the db.
|
||||
Just use:
|
||||
|
||||
$db close
|
||||
|
||||
Handling NULL values
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
In the SQL language there is a special value NULL that is not the empty
|
||||
string, so how to represent it in a typeless language like Tcl?
|
||||
For default this extension will use the empty string, but it is possible
|
||||
to specify a different string for the NULL value.
|
||||
|
||||
In the above example there were two rows in the 'tbl1' table. Now
|
||||
we can add using the "sqlite" command line client another one with
|
||||
a NULL value:
|
||||
|
||||
sqlite> INSERT INTO tbl1 VALUES(NULL,30);
|
||||
sqlite> .exit
|
||||
|
||||
That's what the sqlite extension will return for default:
|
||||
|
||||
. $db query "SELECT * from tbl1"
|
||||
{one hello! two 10} {one goodbye two 20} {one {} two 30}
|
||||
|
||||
As you can see in the last row, the NULL is represented as {}, that's
|
||||
the empty string. Using the -null option of the 'query' command we
|
||||
can change this default, and tell the sqlite extension to represent
|
||||
the NULL value as a different string:
|
||||
|
||||
. $db query -null <<NULL>> "SELECT * from tbl1"
|
||||
{one hello! two 10} {one goodbye two 20} {one <<NULL>> two 30}
|
||||
|
||||
This way if the emtpy string has some semantical value for your
|
||||
dataset you can change it.
|
||||
|
||||
Finding the ID of the last inserted row
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
This is as simple as:
|
||||
|
||||
. $db lastid
|
||||
10
|
||||
|
||||
Number of rows changed by the most recent query
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
This is also very simple, there is just to use the 'changes' method
|
||||
without arugments.
|
||||
|
||||
. $db changes
|
||||
5
|
||||
|
||||
Note that if you drop an entire table the number of changes will
|
||||
be reported as zero, because of details of the sqlite implementation.
|
||||
|
||||
That's all,
|
||||
Enjoy!
|
||||
Salvatore Sanfilippo
|
||||
|
||||
p.s. this extension is just the work of some hour thanks to the cool
|
||||
clean C API that sqlite exports. Thanks to the author of sqlite for this
|
||||
great work.
|
||||
|
||||
In memory databases
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
SQLite is able to create in-memory databases instead to use files.
|
||||
This is of course faster and does not need the ability to write
|
||||
to the filesystem. Of course this databases are only useful for
|
||||
temp data.
|
||||
|
||||
In-memory DBs are used just like regular databases, just the name used to
|
||||
open the database is :memory:. That's an example that does not use the
|
||||
filesystem at all to create and work with the db.
|
||||
|
||||
package require sqlite3
|
||||
set db [sqlite3.open :memory:]
|
||||
$db query {CREATE TABLE plays (id, author, title)}
|
||||
$db query {INSERT INTO plays (id, author, title) VALUES (1, 'Goethe', 'Faust');}
|
||||
$db query {INSERT INTO plays (id, author, title) VALUES (2, 'Shakespeare', 'Hamlet');}
|
||||
$db query {INSERT INTO plays (id, author, title) VALUES (3, 'Sophocles', 'Oedipus Rex');}
|
||||
set res [$db query "SELECT * FROM plays"]
|
||||
$db close
|
||||
foreach r $res {puts $r(author)}
|
||||
|
||||
Of course once the Jim process is destroyed the database will no longer
|
||||
exists.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user