Autotools.
authorKeith Packard <keithp@keithp.com>
Sat, 20 Dec 2008 05:11:45 +0000 (21:11 -0800)
committerKeith Packard <keithp@keithp.com>
Sat, 20 Dec 2008 05:11:45 +0000 (21:11 -0800)
Signed-off-by: Keith Packard <keithp@keithp.com>
67 files changed:
AUTHORS [new file with mode: 0644]
COPYING [new file with mode: 0644]
ChangeLog [new file with mode: 0644]
INSTALL [new file with mode: 0644]
Makefile [deleted file]
Makefile.am [new file with mode: 0644]
NEWS [new file with mode: 0644]
README [new file with mode: 0644]
autogen.sh [new file with mode: 0755]
blink-tiny [deleted file]
blink-tiny-ram [deleted file]
blink/Makefile [deleted file]
blink/blink.c [deleted file]
cccp.c [deleted file]
cccp.h [deleted file]
ccdbg-command.c [deleted file]
ccdbg-debug.c [deleted file]
ccdbg-flash.c [deleted file]
ccdbg-hex.c [deleted file]
ccdbg-io.c [deleted file]
ccdbg-manual.c [deleted file]
ccdbg-memory.c [deleted file]
ccdbg.c [deleted file]
ccdbg.h [deleted file]
ccload/Makefile.am [new file with mode: 0644]
ccload/ccload.c [new file with mode: 0644]
chip_id [deleted file]
cp-usb.c [deleted file]
debug_mode [deleted file]
get_pc [deleted file]
get_status [deleted file]
half_phase [deleted file]
in [deleted file]
isr.c [deleted file]
lib/Makefile.am [new file with mode: 0644]
lib/cccp.c [new file with mode: 0644]
lib/cccp.h [new file with mode: 0644]
lib/ccdbg-command.c [new file with mode: 0644]
lib/ccdbg-debug.c [new file with mode: 0644]
lib/ccdbg-flash.c [new file with mode: 0644]
lib/ccdbg-hex.c [new file with mode: 0644]
lib/ccdbg-io.c [new file with mode: 0644]
lib/ccdbg-manual.c [new file with mode: 0644]
lib/ccdbg-memory.c [new file with mode: 0644]
lib/ccdbg.h [new file with mode: 0644]
lib/cp-usb.c [new file with mode: 0644]
p1_1 [deleted file]
rd_config [deleted file]
read_status [deleted file]
reset [deleted file]
target/blink/Makefile [new file with mode: 0644]
target/blink/blink.c [new file with mode: 0644]
target/isr.c [new file with mode: 0644]
tests/blink-tiny [new file with mode: 0644]
tests/blink-tiny-ram [new file with mode: 0644]
tests/chip_id [new file with mode: 0644]
tests/debug_mode [new file with mode: 0644]
tests/get_pc [new file with mode: 0644]
tests/get_status [new file with mode: 0644]
tests/half_phase [new file with mode: 0644]
tests/in [new file with mode: 0644]
tests/p1_1 [new file with mode: 0644]
tests/rd_config [new file with mode: 0644]
tests/read_status [new file with mode: 0644]
tests/reset [new file with mode: 0644]
tests/wr_config [new file with mode: 0644]
wr_config [deleted file]

diff --git a/AUTHORS b/AUTHORS
new file mode 100644 (file)
index 0000000..a5b6500
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,2 @@
+Keith Packard  <keithp@keithp.com>
+Bdale Garbee   <bdale@gag.com>
diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..10828e0
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,341 @@
+
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 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.
+
+                           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.
+\f
+                   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.)
+\f
+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.
+\f
+  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.
+\f
+  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
+\f
+           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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  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.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/INSTALL b/INSTALL
new file mode 100644 (file)
index 0000000..23e5f25
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,236 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free
+Software Foundation, Inc.
+
+This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+Basic Installation
+==================
+
+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, 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 only 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.  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 awhile.  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.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. 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.
+
+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=c89 CFLAGS=-O2 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 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 support 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' 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'.
+
+   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.
+
+   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' 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).  Here is a another example:
+
+     /bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent
+configuration-related scripts to be executed by `/bin/bash'.
+
+`configure' Invocation
+======================
+
+`configure' recognizes the following options to control how it operates.
+
+`--help'
+`-h'
+     Print a summary of the options to `configure', and exit.
+
+`--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.
+
+`configure' also accepts some other, not widely useful, options.  Run
+`configure --help' for more details.
+
diff --git a/Makefile b/Makefile
deleted file mode 100644 (file)
index 9603dc2..0000000
--- a/Makefile
+++ /dev/null
@@ -1,37 +0,0 @@
-.NOTPARALLEL: blink-ram blink-flash
-KERNEL=/local/src/linux-2.6-aiko-64
-KINC=$(KERNEL)/drivers/usb/serial
-
-WARN=-Wall -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes\
-       -Wmissing-declarations -Wnested-externs -fno-strict-aliasing 
-CFLAGS=-g -I$(KINC) $(WARN)
-LIBS=-lusb
-
-KERNEL_OBJS=cccp.o
-LIBUSB_OBJS=cp-usb.o
-
-SRCS=ccdbg.c ccdbg-command.c ccdbg-debug.c ccdbg-flash.c \
-       ccdbg-hex.c ccdbg-io.c ccdbg-memory.c \
-       $(LIBUSB_OBJS)
-
-OBJS=$(SRCS:.c=.o)
-
-INCS=ccdbg.h cccp.h
-
-PROG=ccdbg
-
-LOAD=blinks
-
-all: $(PROG) $(LOAD)
-
-$(PROG): $(OBJS)
-       $(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS)
-
-clean:
-       rm -f $(PROG) $(OBJS)
-       +make -C blink clean
-
-$(OBJS): $(INCS)
-
-blinks:
-       +make -C blink
diff --git a/Makefile.am b/Makefile.am
new file mode 100644 (file)
index 0000000..71aee98
--- /dev/null
@@ -0,0 +1 @@
+SUBDIRS=lib ccload target/blink
diff --git a/NEWS b/NEWS
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/autogen.sh b/autogen.sh
new file mode 100755 (executable)
index 0000000..4e8b11b
--- /dev/null
@@ -0,0 +1,12 @@
+#! /bin/sh
+
+srcdir=`dirname $0`
+test -z "$srcdir" && srcdir=.
+
+ORIGDIR=`pwd`
+cd $srcdir
+
+autoreconf --force -v --install || exit 1
+cd $ORIGDIR || exit $?
+
+$srcdir/configure --enable-maintainer-mode "$@"
diff --git a/blink-tiny b/blink-tiny
deleted file mode 100644 (file)
index fd075e5..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-:03 0000 00 75 FE 02 88
-:03 0003 00 75 90 FF F6
-:02 0006 00 80 FE    7A
-:02 0008 00 80 FE    78
-:00 0000 01          FF
diff --git a/blink-tiny-ram b/blink-tiny-ram
deleted file mode 100644 (file)
index 018716d..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-:03 F000 00 75 FE 02 98
-:03 F003 00 75 90 FF 06
-:02 F006 00 80 FE    8A
-:00000001FF
diff --git a/blink/Makefile b/blink/Makefile
deleted file mode 100644 (file)
index 1f18f52..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-CC=sdcc
-NO_OPT=--nogcse --noinvariant --noinduction --nojtbound --noloopreverse \
-       --nolabelopt --nooverlay --peep-asm
-DEBUG=--debug
-
-CFLAGS=--model-large $(DEBUG) --less-pedantic \
-       --no-peep --int-long-reent --float-reent \
-       --data-loc 0x30
-
-LDFLAGS=-L/usr/share/sdcc/lib/large --out-fmt-ihx
-LDFLAGS_RAM=$(LDFLAGS) --code-loc 0xf000 --xram-loc 0xf400 --xram-size 1024
-
-LDFLAGS_FLASH=$(LDFLAGS) --code-loc 0x0000 --xram-loc 0xf000 --xram-size 1024
-
-SRC=blink.c
-ADB=$(SRC:.c=.adb)
-ASM=$(SRC:.c=.asm)
-LNK=$(SRC:.c=.lnk)
-LST=$(SRC:.c=.lst)
-REL=$(SRC:.c=.rel)
-RST=$(SRC:.c=.rst)
-SYM=$(SRC:.c=.sym)
-
-PROGS=blink-flash.ihx blink-ram.ihx
-PCDB=$(PROGS:.ihx=.cdb)
-PLNK=$(PROGS:.ihx=.lnk)
-PMAP=$(PROGS:.ihx=.map)
-PMEM=$(PROGS:.ihx=.mem)
-PAOM=$(PROGS:.ihx=)
-
-%.rel : %.c
-       $(CC) -c $(CFLAGS) -o$*.rel $<
-
-all: $(PROGS)
-
-blink-ram.ihx: $(REL) Makefile
-       $(CC) $(LDFLAGS_RAM) $(CFLAGS) -o blink-ram.ihx $(REL)
-       $(CC) $(LDFLAGS_FLASH) $(CFLAGS) -o blink-flash.ihx $(REL)
-
-blink-flash.ihx: blink-ram.ihx
-
-clean:
-       rm -f $(ADB) $(ASM) $(LNK) $(LST) $(REL) $(RST) $(SYM)
-       rm -f $(PROGS) $(PCDB) $(PLNK) $(PMAP) $(PMEM) $(PAOM)
diff --git a/blink/blink.c b/blink/blink.c
deleted file mode 100644 (file)
index 907c82b..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
- */
-
-sfr at 0x80 P0;
-sfr at 0x90 P1;
-sfr at 0xA0 P2;
-sfr at 0xC6 CLKCON;
-
-sfr at 0xF1 PERCFG;
-sfr at 0xF2 ADCCFG;
-sfr at 0xF3 P0SEL;
-sfr at 0xF4 P1SEL;
-sfr at 0xF5 P2SEL;
-
-sfr at 0xFD P0DIR;
-sfr at 0xFE P1DIR;
-sfr at 0xFF P2DIR;
-sfr at 0x8F P0INP;
-sfr at 0xF6 P1INP;
-sfr at 0xF7 P2INP;
-
-sfr at 0x89 P0IFG;
-sfr at 0x8A P1IFG;
-sfr at 0x8B P2IFG;
-
-#define nop()  _asm nop _endasm;
-
-void
-delay (unsigned char n)
-{
-       unsigned char i = 0, j = 0;
-
-       n <<= 1;
-       while (--n != 0)
-               while (--j != 0)
-                       while (--i != 0)
-                               nop();
-}
-
-void
-dit() {
-       P1 = 0xff;
-       delay(1);
-       P1 = 0xfd;
-       delay(1);
-}
-
-void
-dah () {
-       P1 = 0xff;
-       delay(3);
-       P1 = 0xfd;
-       delay(1);
-}
-
-void
-charspace () {
-       delay(2);
-}
-
-void
-wordspace () {
-       delay(8);
-}
-
-#define _ dit();
-#define ___ dah();
-#define C charspace();
-#define W wordspace();
-
-main ()
-{
-       CLKCON = 0;
-       /* Set p1_1 to output */
-       P1DIR = 0x02;
-       P1INP = 0x00;
-       P2INP = 0x00;
-       for (;;) {
-               ___ _ ___ _ C ___ ___ _ ___ W   /* cq */
-               ___ _ _ C _ W                   /* de */
-               ___ _ ___ C ___ _ _ C           /* kd */
-               ___ ___ _ _ _ C _ _ _ C         /* 7s */
-               ___ ___ _ ___ C ___ ___ _ W     /* qg */
-       }
-}
diff --git a/cccp.c b/cccp.c
deleted file mode 100644 (file)
index 99a0d81..0000000
--- a/cccp.c
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
- */
-
-#include "ccdbg.h"
-
-static void
-say(char *name, uint8_t bits)
-{
-       printf("%s: ", name);
-       if (bits & CC_RESET_N)
-               printf ("R ");
-       else
-               printf (". ");
-       if (bits & CC_CLOCK)
-               printf ("C ");
-       else
-               printf (". ");
-       if (bits & CC_DATA)
-               printf ("D\n");
-       else
-               printf (".\n");
-}
-
-static void
-_cccp_write(struct ccdbg *dbg, uint8_t mask, uint8_t value)
-{
-       uint16_t        set;
-       int             ret;
-
-       set = (mask) | (value << 8);
-       dbg->debug_data = (dbg->debug_data & ~mask) | (value & mask);
-       ret = ioctl(dbg->fd, CP2101_IOCTL_GPIOSET, &set);
-       if (ret < 0)
-               perror("CP2101_IOCTL_GPIOSET");
-}
-
-void
-cccp_write(struct ccdbg *dbg, uint8_t mask, uint8_t value)
-{
-       _cccp_write(dbg, mask, value);
-//     say("w", dbg->debug_data);
-}
-
-uint8_t
-cccp_read_all(struct ccdbg *dbg)
-{
-       int ret;
-       uint8_t get;
-       ret = ioctl(dbg->fd, CP2101_IOCTL_GPIOGET, &get);
-       if (ret < 0) {
-               perror("CP2101_IOCTL_GPIOGET");
-               get = 0;
-       }
-       return get;
-}
-
-uint8_t
-cccp_read(struct ccdbg *dbg, uint8_t mask)
-{
-       uint8_t         pull_up;
-       uint8_t         get;
-
-       /* tri-state the bits of interest */
-       pull_up = (~dbg->debug_data) & mask;
-       if (pull_up)
-               _cccp_write(dbg, pull_up, pull_up);
-       get = cccp_read_all(dbg);
-       say("\t\tr", get);
-       return get & mask;
-}
-
-void
-cccp_init(struct ccdbg *dbg)
-{
-       /* set all of the GPIOs to a known state */
-       cccp_write(dbg, 0xf, 0xf);
-}
-
-void
-cccp_fini(struct ccdbg *dbg)
-{
-       /* set all of the GPIOs to a known state */
-       cccp_write(dbg, 0xf, 0xf);
-       dbg->clock = 1;
-}
diff --git a/cccp.h b/cccp.h
deleted file mode 100644 (file)
index eecdbb4..0000000
--- a/cccp.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
- */
-
-/*
- * Interface for using a CP2103 to talk to a CC1111
- */
-
-#ifndef _CCCP_H_
-#define _CCCP_H_
-
-void
-cccp_write(struct ccdbg *dbg, uint8_t mask, uint8_t value);
-
-uint8_t
-cccp_read_all(struct ccdbg *dbg);
-
-uint8_t
-cccp_read(struct ccdbg *dbg, uint8_t mask);
-
-void
-cccp_init(struct ccdbg *dbg);
-
-void
-cccp_fini(struct ccdbg *dbg);
-
-#endif /* _CCCP_H_ */
diff --git a/ccdbg-command.c b/ccdbg-command.c
deleted file mode 100644 (file)
index 38c006c..0000000
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
- */
-
-#include "ccdbg.h"
-
-void
-ccdbg_debug_mode(struct ccdbg *dbg)
-{
-       /* force two rising clocks while holding RESET_N low */
-       ccdbg_debug(CC_DEBUG_COMMAND, "#\n");
-       ccdbg_debug(CC_DEBUG_COMMAND, "# Debug mode\n");
-       ccdbg_debug(CC_DEBUG_COMMAND, "#\n");
-       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA|CC_RESET_N);
-       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N,          CC_DATA           );
-       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA           );
-       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N,          CC_DATA           );
-       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA           );
-       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N,          CC_DATA|CC_RESET_N);
-}
-
-void
-ccdbg_reset(struct ccdbg *dbg)
-{
-       ccdbg_debug(CC_DEBUG_COMMAND, "#\n");
-       ccdbg_debug(CC_DEBUG_COMMAND, "# Reset\n");
-       ccdbg_debug(CC_DEBUG_COMMAND, "#\n");
-       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA|CC_RESET_N);
-       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA           );
-       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA           );
-       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA           );
-       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA           );
-       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA|CC_RESET_N);
-}
-
-uint8_t
-ccdbg_chip_erase(struct ccdbg *dbg)
-{
-       return ccdbg_cmd_write_read8(dbg, CC_CHIP_ERASE, NULL, 0);
-}
-
-uint8_t
-ccdbg_wr_config(struct ccdbg *dbg, uint8_t config)
-{
-       return ccdbg_cmd_write_read8(dbg, CC_WR_CONFIG, &config, 1);
-}
-
-uint8_t
-ccdbg_rd_config(struct ccdbg *dbg)
-{
-       return ccdbg_cmd_write_read8(dbg, CC_RD_CONFIG, NULL, 0);
-}
-
-uint16_t
-ccdbg_get_pc(struct ccdbg *dbg)
-{
-       return ccdbg_cmd_write_read16(dbg, CC_GET_PC, NULL, 0);
-}
-
-uint8_t
-ccdbg_read_status(struct ccdbg *dbg)
-{
-       return ccdbg_cmd_write_read8(dbg, CC_READ_STATUS, NULL, 0);
-}
-
-uint8_t
-ccdbg_set_hw_brkpnt(struct ccdbg *dbg, uint8_t number, uint8_t enable, uint16_t addr)
-{
-       uint8_t data[3];
-
-       data[0] = (number << 3) | (enable << 2);
-       data[1] = (addr >> 8);
-       data[2] = addr;
-       return ccdbg_cmd_write_read8(dbg, CC_SET_HW_BRKPNT, data, 3);
-}
-
-uint8_t
-ccdbg_halt(struct ccdbg *dbg)
-{
-       return ccdbg_cmd_write_read8(dbg, CC_HALT, NULL, 0);
-}
-
-uint8_t
-ccdbg_resume(struct ccdbg *dbg)
-{
-       return ccdbg_cmd_write_read8(dbg, CC_RESUME, NULL, 0);
-}
-
-uint8_t
-ccdbg_debug_instr(struct ccdbg *dbg, uint8_t *instr, int nbytes)
-{
-       return ccdbg_cmd_write_read8(dbg, CC_DEBUG_INSTR(nbytes), instr, nbytes);
-}
-
-uint8_t
-ccdbg_step_instr(struct ccdbg *dbg)
-{
-       return ccdbg_cmd_write_read8(dbg, CC_STEP_INSTR, NULL, 0);
-}
-
-uint8_t
-ccdbg_step_replace(struct ccdbg *dbg, uint8_t *instr, int nbytes)
-{
-       return ccdbg_cmd_write_read8(dbg, CC_STEP_REPLACE(nbytes), instr, nbytes);
-}
-
-uint16_t
-ccdbg_get_chip_id(struct ccdbg *dbg)
-{
-       return ccdbg_cmd_write_read16(dbg, CC_GET_CHIP_ID, NULL, 0);
-}
-
-/*
- * Execute a sequence of instructions
- */
-uint8_t
-ccdbg_execute(struct ccdbg *dbg, uint8_t *inst)
-{
-       uint8_t status = 0;
-       while(inst[0] != 0) {
-               uint8_t len = inst[0];
-               int i;
-               ccdbg_debug(CC_DEBUG_INSTRUCTIONS, "\t%02x", inst[1]);
-               for (i = 0; i < len - 1; i++)
-                       ccdbg_debug(CC_DEBUG_INSTRUCTIONS, " %02x", inst[i+2]);
-               status = ccdbg_debug_instr(dbg, inst+1, len);
-               for (; i < 3; i++)
-                       ccdbg_debug(CC_DEBUG_INSTRUCTIONS, "   ");
-               ccdbg_debug(CC_DEBUG_INSTRUCTIONS, " -> %02x\n", status);
-               inst += len + 1;
-       }
-       return status;
-}
-
-static uint8_t jump_mem[] = {
-       3, LJMP, 0xf0, 0x00,
-#define PC_HIGH        2
-#define PC_LOW 3
-       0
-};
-
-uint8_t
-ccdbg_set_pc(struct ccdbg *dbg, uint16_t pc)
-{
-       jump_mem[PC_HIGH] = pc >> 8;
-       jump_mem[PC_LOW] = pc & 0xff;
-       return ccdbg_execute(dbg, jump_mem);
-}
-
-uint8_t
-ccdbg_execute_hex_image(struct ccdbg *dbg, struct hex_image *image)
-{
-       uint16_t pc;
-       uint8_t status;
-       
-       if (image->address < 0xf000) {
-               fprintf(stderr, "Cannot execute program starting at 0x%04x\n", image->address);
-               return -1;
-       }
-       ccdbg_write_hex_image(dbg, image, 0);
-       ccdbg_set_pc(dbg, image->address);
-       pc = ccdbg_get_pc(dbg);
-       printf ("pc starts at 0x%04x\n", pc);
-       status = ccdbg_resume(dbg);
-       printf ("resume status: 0x%02x\n", status);
-       return 0;
-}
-
diff --git a/ccdbg-debug.c b/ccdbg-debug.c
deleted file mode 100644 (file)
index 2e67bc8..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
- */
-
-#include "ccdbg.h"
-#include <stdarg.h>
-
-int
-ccdbg_level = 0;
-
-void
-ccdbg_add_debug(int level)
-{
-       ccdbg_level |= level;
-}
-
-void
-ccdbg_clear_debug(int level)
-{
-       ccdbg_level &= ~level;
-}
-
-void
-ccdbg_debug(int level, char *format, ...)
-{
-       va_list ap;
-
-       if (ccdbg_level & level) {
-               va_start(ap, format);
-               vprintf(format, ap);
-               va_end(ap);
-       }
-}
diff --git a/ccdbg-flash.c b/ccdbg-flash.c
deleted file mode 100644 (file)
index aa2c518..0000000
+++ /dev/null
@@ -1,337 +0,0 @@
-/*
- * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
- */
-
-#include "ccdbg.h"
-
-/* From SWRA124 section 3.1.6 */
-
-static uint8_t flash_page[] = {
-
-       MOV_direct_data, P1DIR, 0x02,
-       MOV_direct_data, P1,    0xFF,
-
-       MOV_direct_data, FADDRH, 0,
-#define FLASH_ADDR_HIGH        8
-
-       MOV_direct_data, FADDRL, 0,
-#define FLASH_ADDR_LOW 11
-
-       MOV_DPTR_data16, 0, 0,
-#define RAM_ADDR_HIGH  13
-#define RAM_ADDR_LOW   14
-
-       MOV_Rn_data(7), 0,
-#define FLASH_WORDS_HIGH       16
-       
-       MOV_Rn_data(6), 0,
-#define FLASH_WORDS_LOW                18
-       
-       MOV_direct_data, FWT, 0x20,
-#define FLASH_TIMING           21
-
-       MOV_direct_data, FCTL, FCTL_ERASE,
-/* eraseWaitLoop: */
-               MOV_A_direct,           FCTL,
-       JB, ACC(FCTL_BUSY_BIT), 0xfb,
-
-       MOV_direct_data, P1, 0xfd,
-
-       MOV_direct_data, FCTL, FCTL_WRITE,
-/* writeLoop: */
-               MOV_Rn_data(5), 2,
-/* writeWordLoop: */
-                       MOVX_A_atDPTR,
-                       INC_DPTR,
-                       MOV_direct_A, FWDATA,
-               DJNZ_Rn_rel(5), 0xfa,           /* writeWordLoop */
-/* writeWaitLoop: */
-                       MOV_A_direct, FCTL,
-               JB, ACC(FCTL_SWBSY_BIT), 0xfb,          /* writeWaitLoop */
-       DJNZ_Rn_rel(6), 0xf1,                   /* writeLoop */
-       DJNZ_Rn_rel(7), 0xef,                   /* writeLoop */
-
-       MOV_direct_data, P1DIR, 0x00,
-       MOV_direct_data, P1,    0xFF,
-       TRAP,
-};
-
-#define FLASH_RAM      0xf000
-
-#if 0
-static uint8_t flash_erase_page[] = {
-       3,      MOV_direct_data, FADDRH, 0,
-#define ERASE_PAGE_HIGH        3
-       
-       3,      MOV_direct_data, FADDRL, 0,
-#define ERASE_PAGE_LOW 7
-
-       3,      MOV_direct_data, FWT, 0x2A,
-       3,      MOV_direct_data, FCTL, FCTL_ERASE,
-       0
-};
-
-static uint8_t flash_read_control[] = {
-       2,      MOV_A_direct,   FCTL,
-       0
-};
-#endif
-
-#if 0
-static uint8_t flash_control_clear[] = {
-       3,      MOV_direct_data,        FCTL, 0,
-       2,      MOV_A_direct,           FCTL,
-       0
-};
-#endif
-
-#if 0
-static uint8_t
-ccdbg_flash_erase_page(struct ccdbg *dbg, uint16_t addr)
-{
-       uint16_t        page_addr = addr >> 1;
-       uint8_t         status;
-       uint8_t         old[0x10], new[0x10];
-       int             i;
-       
-       ccdbg_read_memory(dbg, addr, old, 0x10);
-       flash_erase_page[ERASE_PAGE_HIGH] = page_addr >> 8;
-       flash_erase_page[ERASE_PAGE_LOW] = page_addr & 0xff;
-       status = ccdbg_execute(dbg, flash_erase_page);
-       printf("erase status 0x%02x\n", status);
-       do {
-               status = ccdbg_execute(dbg, flash_read_control);
-               printf("fctl 0x%02x\n", status);
-       } while (status & FCTL_BUSY);
-       ccdbg_read_memory(dbg, addr, new, 0x10);
-       for (i = 0; i < 0x10; i++)
-               printf("0x%02x -> 0x%02x\n", old[i], new[i]);
-       status = ccdbg_execute(dbg, flash_control_clear);
-       printf("clear fctl 0x%02x\n", status);
-       return 0;
-}
-#endif
-
-#if 0
-static uint8_t flash_write[] = {
-       MOV_direct_data, P1DIR, 0x02,
-       MOV_direct_data, P1,    0xFD,
-       
-       MOV_A_direct, FCTL,
-       JB,     ACC(FCTL_BUSY_BIT), 0xf1,
-
-       MOV_direct_data, FCTL, 0x20,
-
-       MOV_direct_data, FADDRH, 0,
-#define WRITE_PAGE_HIGH        16
-       
-       MOV_direct_data, FADDRL, 0,
-#define WRITE_PAGE_LOW 19
-       
-       MOV_direct_data, FCTL, FCTL_WRITE,
-       MOV_direct_data, FWDATA, 0,
-#define WRITE_BYTE_0   25
-       MOV_direct_data, FWDATA, 0,
-#define WRITE_BYTE_1   28
-       MOV_A_direct, FCTL,
-       JB,     ACC(FCTL_SWBSY_BIT), 0xf1,
-
-       MOV_direct_data, P1,    0xFF,
-       TRAP,
-};
-#endif
-
-static uint8_t
-ccdbg_clock_init(struct ccdbg *dbg)
-{
-       static uint8_t set_clkcon_fast[] = {
-               3,      MOV_direct_data,        CLKCON, 0x00,
-               0
-       };
-
-       static uint8_t get_sleep[] = {
-               2,      MOV_A_direct, SLEEP,
-               0
-       };
-
-       uint8_t status;
-
-       ccdbg_execute(dbg, set_clkcon_fast);
-       do {
-               status = ccdbg_execute(dbg, get_sleep);
-       } while (!(status & 0x40));
-       return 0;
-}
-
-#if 0
-static uint8_t
-ccdbg_flash_write_word(struct ccdbg *dbg, uint16_t addr, uint8_t data[2])
-{
-       uint16_t page_addr = addr >> 1;
-       uint8_t check[2];
-       uint8_t status;
-       int i;
-
-       flash_write[WRITE_PAGE_HIGH] = page_addr >> 8;
-       flash_write[WRITE_PAGE_LOW] = page_addr & 0xff;
-       flash_write[WRITE_BYTE_0] = data[0];
-       flash_write[WRITE_BYTE_1] = data[1];
-       printf("upload flash write\n");
-       ccdbg_write_memory(dbg, 0xf000, flash_write, sizeof(flash_write));
-       ccdbg_set_pc(dbg, 0xf000);
-       ccdbg_resume(dbg);
-       for (;;) {
-               status = ccdbg_read_status(dbg);
-               printf("waiting for write 0x%02x\n", status);
-               if ((status & CC_STATUS_CPU_HALTED) != 0)
-                       break;
-               sleep (1);
-       }
-       status = ccdbg_execute(dbg, flash_control_clear);
-       printf("clear fctl 0x%02x\n", status);
-       ccdbg_read_memory(dbg, addr, check, 2);
-       for (i = 0; i < 2; i++)
-               printf("0x%02x : 0x%02x\n", data[i], check[i]);
-       return 0;
-}
-#endif
-
-#define TIMERS_OFF             0x08
-#define DMA_PAUSE              0x04
-#define TIMER_SUSPEND          0x02
-#define SEL_FLASH_INFO_PAGE    0x01
-
-#if 0
-static uint8_t
-ccdbg_flash_lock(struct ccdbg *dbg, uint8_t lock)
-{
-       uint8_t config;
-       uint8_t bytes[2];
-       uint8_t old[1], new[1];
-
-       config = ccdbg_rd_config(dbg);
-       ccdbg_wr_config(dbg, config|SEL_FLASH_INFO_PAGE);
-       bytes[0] = lock;
-       bytes[1] = 0;
-       ccdbg_flash_erase_page(dbg, 0);
-       ccdbg_read_memory(dbg, 0, old, 1);
-       ccdbg_flash_write_word(dbg, 0, bytes);
-       ccdbg_read_memory(dbg, 0, new, 1);
-       printf ("flash lock 0x%02x -> 0x%02x\n", old[0], new[0]);
-       ccdbg_wr_config(dbg, config & ~SEL_FLASH_INFO_PAGE);
-       return 0;
-}
-#endif
-
-uint8_t
-ccdbg_flash_hex_image(struct ccdbg *dbg, struct hex_image *image)
-{
-       uint16_t offset;
-       uint16_t flash_prog;
-       uint16_t flash_len;
-       uint8_t fwt;
-       uint16_t flash_word_addr;
-       uint16_t flash_words;
-       uint16_t ram_addr;
-       uint16_t pc;
-       uint8_t status;
-       uint16_t remain, this_time, start;
-       uint8_t verify[0x400];
-
-       ccdbg_clock_init(dbg);
-       if (image->address + image->length > 0x8000) {
-               fprintf(stderr, "cannot flash image from 0x%04x to 0x%04x\n",
-                       image->address, image->address + image->length);
-               return 1;
-       }
-       if (image->address & 0x3ff) {
-               fprintf(stderr, "flash image must start on page boundary\n");
-               return 1;
-       }
-       ram_addr = 0xf000;
-
-       
-       flash_prog = 0xf400;
-
-       fwt = 0x20;
-
-       flash_page[FLASH_TIMING] = fwt;
-       printf("Upload %d flash program bytes to 0x%04x\n",
-              sizeof (flash_page), flash_prog);
-       ccdbg_write_memory(dbg, flash_prog, flash_page, sizeof(flash_page));
-       
-       remain = image->length;
-       start = 0;
-       while (remain) {
-               this_time = remain;
-               if (this_time > 0x400)
-                       this_time = 0x400;
-
-               offset = ram_addr - (image->address + start);
-
-               printf("Upload %d bytes at 0x%04x\n", this_time, ram_addr);
-               ccdbg_write_memory(dbg, ram_addr, image->data + start, this_time);
-
-               printf("Verify %d bytes\n", image->length);
-               ccdbg_read_memory(dbg, ram_addr, verify, this_time);
-               if (memcmp (image->data + start, verify, this_time) != 0) {
-                       fprintf(stderr, "image verify failed\n");
-                       return 1;
-               }
-               
-               flash_word_addr = (image->address + start) >> 1;
-               flash_len = this_time + (this_time & 1);
-               flash_words = flash_len >> 1;
-
-               ccdbg_write_uint8(dbg, flash_prog + FLASH_ADDR_HIGH, flash_word_addr >> 8);
-               ccdbg_write_uint8(dbg, flash_prog + FLASH_ADDR_LOW, flash_word_addr & 0xff);
-
-               ccdbg_write_uint8(dbg, flash_prog + RAM_ADDR_HIGH, ram_addr >> 8);
-               ccdbg_write_uint8(dbg, flash_prog + RAM_ADDR_LOW, ram_addr & 0xff);
-
-               ccdbg_write_uint8(dbg, flash_prog + FLASH_WORDS_HIGH, flash_words >> 8);
-               ccdbg_write_uint8(dbg, flash_prog + FLASH_WORDS_LOW, flash_words & 0xff);
-
-               ccdbg_set_pc(dbg, flash_prog);
-               pc = ccdbg_get_pc(dbg);
-               printf("Starting flash program at 0x%04x\n", pc);
-               status = ccdbg_resume(dbg);
-               printf("resume status is 0x%02x\n", status);
-               do {
-                       status = ccdbg_read_status(dbg);
-                       printf("chip status is 0x%02x\n", status);
-                       sleep(1);
-               } while ((status & CC_STATUS_CPU_HALTED) == 0);
-               
-               remain -= this_time;
-               start += this_time;
-       }
-#if 1
-       printf("Downloading flash to check\n");
-       struct hex_image *test_image;
-       test_image = ccdbg_read_hex_image(dbg, image->address, image->length);
-       if (!ccdbg_hex_image_equal(image, test_image)) {
-               int i;
-               fprintf(stderr, "Image not loaded\n");
-               for (i = 0;i < 0x10; i++)
-                       printf ("0x%02x : 0x%02x\n", image->data[i], test_image->data[i]);
-               return 1;
-       }
-       return 0;
-#endif
-       return 0;
-}
diff --git a/ccdbg-hex.c b/ccdbg-hex.c
deleted file mode 100644 (file)
index 86478da..0000000
+++ /dev/null
@@ -1,330 +0,0 @@
-/*
- * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
- */
-
-#include "ccdbg.h"
-#include <stdarg.h>
-#include <ctype.h>
-
-struct hex_input {
-       FILE    *file;
-       int     line;
-       char    *name;
-};
-
-enum hex_read_state {
-       read_marker,
-       read_length,
-       read_address,
-       read_type,
-       read_data,
-       read_checksum,
-       read_newline,
-       read_white,
-       read_done,
-};
-
-
-static void
-ccdbg_hex_error(struct hex_input *input, char *format, ...)
-{
-       va_list ap;
-
-       va_start(ap, format);
-       fprintf(stderr, "Hex error %s:%d: ", input->name, input->line);
-       vfprintf(stderr, format, ap);
-       fprintf(stderr, "\n");
-       va_end(ap);
-}
-
-static void
-ccdbg_hex_free(struct hex_record *record)
-{
-       if (!record) return;
-       free(record);
-}
-
-static struct hex_record *
-ccdbg_hex_alloc(uint8_t length)
-{
-       struct hex_record *record;
-
-       record = calloc(1, sizeof(struct hex_record) + length);
-       record->length = length;
-       return record;
-}
-
-static int
-ishex(char c)
-{
-       return isdigit(c) || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F');
-}
-
-static int
-fromhex(char c)
-{
-       if (isdigit(c))
-               return c - '0';
-       if ('a' <= c && c <= 'f')
-               return c - 'a' + 10;
-       if ('A' <= c && c <= 'F')
-               return c - 'A' + 10;
-       abort();
-       return 0;
-}
-
-static uint8_t
-ccdbg_hex_checksum(struct hex_record *record)
-{
-       uint8_t checksum = 0;
-       int i;
-
-       checksum += record->length;
-       checksum += record->address >> 8;
-       checksum += record->address & 0xff;
-       checksum += record->type;
-       for (i = 0; i < record->length; i++)
-               checksum += record->data[i];
-       return -checksum;
-}
-
-static struct hex_record *
-ccdbg_hex_read_record(struct hex_input *input)
-{
-       struct hex_record *record = NULL;
-       enum hex_read_state state = read_marker;
-       char c;
-       int nhexbytes;
-       uint32_t hex;
-       uint32_t ndata;
-       uint8_t checksum;
-
-       while (state != read_done) {
-               c = getc(input->file);
-               if (c == EOF && state != read_white) {
-                       ccdbg_hex_error(input, "Unexpected EOF");
-                       goto bail;
-               }
-               if (c == ' ')
-                       continue;
-               if (c == '\n')
-                       input->line++;
-               switch (state) {
-               case read_marker:
-                       if (c != ':') {
-                               ccdbg_hex_error(input, "Missing ':'");
-                               goto bail;
-                       }
-                       state = read_length;
-                       nhexbytes = 2;
-                       hex = 0;
-                       break;
-               case read_length:
-               case read_address:
-               case read_type:
-               case read_data:
-               case read_checksum:
-                       if (!ishex(c)) {
-                               ccdbg_hex_error(input, "Non-hex char '%c'",
-                                               c);
-                               goto bail;
-                       }
-                       hex = hex << 4 | fromhex(c);
-                       --nhexbytes;
-                       if (nhexbytes != 0)
-                               break;
-                       
-                       switch (state) {
-                       case read_length:
-                               record = ccdbg_hex_alloc(hex);
-                               if (!record) {
-                                       ccdbg_hex_error(input, "Out of memory");
-                                       goto bail;
-                               }
-                               state = read_address;
-                               nhexbytes = 4;
-                               break;
-                       case read_address:
-                               record->address = hex;
-                               state = read_type;
-                               nhexbytes = 2;
-                               break;
-                       case read_type:
-                               record->type = hex;
-                               state = read_data;
-                               nhexbytes = 2;
-                               ndata = 0;
-                               break;
-                       case read_data:
-                               record->data[ndata] = hex;
-                               ndata++;
-                               nhexbytes = 2;
-                               break;
-                       case read_checksum:
-                               record->checksum = hex;
-                               state = read_newline;
-                               break;
-                       default:
-                               break;
-                       }
-                       if (state == read_data)
-                               if (ndata == record->length) {
-                                       nhexbytes = 2;
-                                       state = read_checksum;
-                               }
-                       hex = 0;
-                       break;
-               case read_newline:
-                       if (c != '\n' && c != '\r') {
-                               ccdbg_hex_error(input, "Missing newline");
-                               goto bail;
-                       }
-                       state = read_white;
-                       break;
-               case read_white:
-                       if (!isspace(c)) {
-                               if (c == '\n')
-                                       input->line--;
-                               if (c != EOF)
-                                       ungetc(c, input->file);
-                               state = read_done;
-                       }
-                       break;
-               case read_done:
-                       break;
-               }
-       }
-       checksum = ccdbg_hex_checksum(record);
-       if (checksum != record->checksum) {
-               ccdbg_hex_error(input, "Invalid checksum (read 0x%02x computed 0x%02x)\n",
-                               record->checksum, checksum);
-               goto bail;
-       }
-       return record;
-
-bail:
-       ccdbg_hex_free(record);
-       return NULL;
-}
-
-void
-ccdbg_hex_file_free(struct hex_file *hex)
-{
-       int     i;
-
-       if (!hex)
-               return;
-       for (i = 0; i < hex->nrecord; i++)
-               ccdbg_hex_free(hex->records[i]);
-       free(hex);
-}
-
-static int
-ccdbg_hex_record_compar(const void *av, const void *bv)
-{
-       const struct hex_record *a = *(struct hex_record **) av;
-       const struct hex_record *b = *(struct hex_record **) bv;
-
-       return (int) a->address - (int) b->address;
-}
-
-struct hex_file *
-ccdbg_hex_file_read(FILE *file, char *name)
-{
-       struct hex_input input;
-       struct hex_file *hex = NULL, *newhex;
-       struct hex_record *record;
-       int srecord = 1;
-       int done = 0;
-
-       hex = calloc(sizeof (struct hex_file) + sizeof (struct hex_record *), 1);
-       input.name = name;
-       input.line = 1;
-       input.file = file;
-       while (!done) {
-               record = ccdbg_hex_read_record(&input);
-               if (!record)
-                       goto bail;
-               if (hex->nrecord == srecord) {
-                       srecord *= 2;
-                       newhex = realloc(hex, 
-                                        sizeof (struct hex_file) +
-                                        srecord * sizeof (struct hex_record *));
-                       if (!newhex)
-                               goto bail;
-                       hex = newhex;
-               }
-               hex->records[hex->nrecord++] = record;
-               if (record->type == HEX_RECORD_EOF)
-                       done = 1;
-       }
-       /*
-        * Sort them into increasing addresses, except for EOF
-        */
-       qsort(hex->records, hex->nrecord - 1, sizeof (struct hex_record *),
-             ccdbg_hex_record_compar);
-       return hex;
-
-bail:
-       ccdbg_hex_file_free(hex);
-       return NULL;
-}
-
-struct hex_image *
-ccdbg_hex_image_create(struct hex_file *hex)
-{
-       struct hex_image *image;
-       struct hex_record *first, *last, *record;
-       int i;
-       uint32_t base, bound;
-       uint32_t offset;
-       int length;
-
-       first = hex->records[0];
-       last = hex->records[hex->nrecord - 2];  /* skip EOF */
-       base = (uint32_t) first->address;
-       bound = (uint32_t) last->address + (uint32_t) last->length;
-       length = bound - base;
-       image = calloc(sizeof(struct hex_image) + length, 1);
-       if (!image)
-               return NULL;
-       image->address = base;
-       image->length = length;
-       memset(image->data, 0xff, length);
-       for (i = 0; i < hex->nrecord - 1; i++) {
-               record = hex->records[i];
-               offset = record->address - base;
-               memcpy(image->data + offset, record->data, record->length);
-       }
-       return image;
-}
-
-void
-ccdbg_hex_image_free(struct hex_image *image)
-{
-       free(image);
-}
-
-int
-ccdbg_hex_image_equal(struct hex_image *a, struct hex_image *b)
-{
-       if (a->length != b->length)
-               return 0;
-       if (memcmp(a->data, b->data, a->length) != 0)
-               return 0;
-       return 1;
-}
diff --git a/ccdbg-io.c b/ccdbg-io.c
deleted file mode 100644 (file)
index b78e3aa..0000000
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
- */
-
-#include "ccdbg.h"
-#include <time.h>
-
-void
-ccdbg_half_clock(struct ccdbg *dbg)
-{
-       struct timespec req, rem;
-       req.tv_sec = (CC_CLOCK_US / 2) / 1000000;
-       req.tv_nsec = ((CC_CLOCK_US / 2) % 1000000) * 1000;
-       nanosleep(&req, &rem);
-}
-
-struct ccdbg *
-ccdbg_open(char *file)
-{
-       struct ccdbg *dbg;
-
-       dbg = calloc(sizeof (struct ccdbg), 1);
-       if (!dbg) {
-               perror("calloc");
-               return NULL;
-       }
-       dbg->clock = 1;
-#ifdef USE_KERNEL
-       dbg->fd = open(file, 2);
-       if (dbg->fd < 0) {
-               perror(file);
-               free(dbg);
-               return NULL;
-       }
-       cccp_init(dbg);
-       cccp_write(dbg, CC_CLOCK, CC_CLOCK);
-#else
-       cp_usb_init(dbg);
-#endif
-       dbg->clock = 1;
-       return dbg;
-}
-
-void
-ccdbg_close(struct ccdbg *dbg)
-{
-#if USE_KERNEL
-       cccp_fini(dbg);
-       close (dbg->fd);
-#else
-       cp_usb_fini(dbg);
-#endif
-       free (dbg);
-}
-
-int
-ccdbg_write(struct ccdbg *dbg, uint8_t mask, uint8_t value)
-{
-#if USE_KERNEL
-       return cccp_write(dbg, mask, value);
-#else
-       cp_usb_write(dbg, mask, value);
-       return 0;
-#endif
-}
-
-uint8_t
-ccdbg_read(struct ccdbg *dbg)
-{
-#if USE_KERNEL
-       return cccp_read_all(dbg);
-#else
-       return cp_usb_read(dbg);
-#endif
-}
-
-static char
-is_bit(uint8_t get, uint8_t mask, char on, uint8_t bit)
-{
-       if (mask&bit) {
-               if (get&bit)
-                       return on;
-               else
-                       return '.';
-       } else
-               return '-';
-}
-void
-ccdbg_print(char *format, uint8_t mask, uint8_t set)
-{
-       ccdbg_debug (CC_DEBUG_BITBANG, format,
-                    is_bit(set, mask, 'C', CC_CLOCK),
-                    is_bit(set, mask, 'D', CC_DATA),
-                    is_bit(set, mask, 'R', CC_RESET_N));
-}
-
-void
-ccdbg_send(struct ccdbg *dbg, uint8_t mask, uint8_t set)
-{
-       ccdbg_write(dbg, mask, set);
-       ccdbg_print("%c %c %c\n", mask, set);
-       ccdbg_half_clock(dbg);
-}
-
-void
-ccdbg_send_bit(struct ccdbg *dbg, uint8_t bit)
-{
-       if (bit) bit = CC_DATA;
-       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|bit|CC_RESET_N);
-       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N,          bit|CC_RESET_N);
-}
-
-void
-ccdbg_send_byte(struct ccdbg *dbg, uint8_t byte)
-{
-       int bit;
-       ccdbg_debug(CC_DEBUG_BITBANG, "#\n# Send Byte 0x%02x\n#\n", byte);
-       for (bit = 7; bit >= 0; bit--) {
-               ccdbg_send_bit(dbg, (byte >> bit) & 1);
-               if (bit == 3)
-                       ccdbg_debug(CC_DEBUG_BITBANG, "\n");
-       }
-}
-
-void
-ccdbg_send_bytes(struct ccdbg *dbg, uint8_t *bytes, int nbytes)
-{
-       while (nbytes--)
-               ccdbg_send_byte(dbg, *bytes++);
-}
-
-uint8_t
-ccdbg_recv_bit(struct ccdbg *dbg, int first)
-{
-       uint8_t mask = first ? CC_DATA : 0;
-       uint8_t read;
-
-       ccdbg_send(dbg, CC_CLOCK|mask|CC_RESET_N, CC_CLOCK|CC_DATA|CC_RESET_N);
-       read = ccdbg_read(dbg);
-       ccdbg_send(dbg, CC_CLOCK|     CC_RESET_N,                  CC_RESET_N);
-       return (read & CC_DATA) ? 1 : 0;
-}
-
-uint8_t
-ccdbg_recv_byte(struct ccdbg *dbg, int first)
-{
-       uint8_t byte = 0;
-       int     bit;
-
-       ccdbg_debug(CC_DEBUG_BITBANG, "#\n# Recv byte\n#\n");
-       for (bit = 0; bit < 8; bit++) {
-               byte = byte << 1;
-               byte |= ccdbg_recv_bit(dbg, first);
-               if (bit == 3)
-                       ccdbg_debug(CC_DEBUG_BITBANG, "\n");
-               first = 0;
-       }
-       ccdbg_debug(CC_DEBUG_BITBANG, "#\n# Recv 0x%02x\n#\n", byte);
-       return byte;
-}
-
-void
-ccdbg_recv_bytes(struct ccdbg *dbg, uint8_t *bytes, int nbytes)
-{
-       int first = 1;
-       while (nbytes--) {
-               *bytes++ = ccdbg_recv_byte(dbg, first);
-               first = 0;
-       }
-}
-
-void
-ccdbg_cmd_write(struct ccdbg *dbg, uint8_t cmd, uint8_t *data, int len)
-{
-       int     i;
-       ccdbg_send_byte(dbg, cmd);
-       for (i = 0; i < len; i++)
-               ccdbg_send_byte(dbg, data[i]);
-}
-
-uint8_t
-ccdbg_cmd_write_read8(struct ccdbg *dbg, uint8_t cmd, uint8_t *data, int len)
-{
-       uint8_t byte[1];
-       ccdbg_cmd_write(dbg, cmd, data, len);
-       ccdbg_recv_bytes(dbg, byte, 1);
-       return byte[0];
-}
-
-uint16_t
-ccdbg_cmd_write_read16(struct ccdbg *dbg, uint8_t cmd, uint8_t *data, int len)
-{
-       uint8_t byte[2];
-       ccdbg_cmd_write(dbg, cmd, data, len);
-       ccdbg_recv_bytes(dbg, byte, 2);
-       return (byte[0] << 8) | byte[1];
-}
diff --git a/ccdbg-manual.c b/ccdbg-manual.c
deleted file mode 100644 (file)
index b83dc45..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
- */
-
-#include "ccdbg.h"
-
-/*
- * Manual bit-banging to debug the low level protocol
- */
-
-static void
-get_bit(char *line, int i, char on, uint8_t bit, uint8_t *bits, uint8_t *masks)
-{
-       if (line[i] == on) {
-               *bits |= bit;
-               *masks |= bit;
-               return;
-       }
-       if (line[i] == '.') {
-               *masks |= bit;
-               return;
-       }
-       if (line[i] == '-') {
-               return;
-       }
-       fprintf(stderr, "bad line %s\n", line);
-       exit (1);
-}
-
-void
-ccdbg_manual(struct ccdbg *dbg, FILE *input)
-{
-       char    line[80];
-       uint8_t set, mask;
-
-       while (fgets(line, sizeof line, input)) {
-               if (line[0] == '#' || line[0] == '\n') {
-                       printf ("%s", line);
-                       continue;
-               }
-               set = 0;
-               mask = 0;
-               get_bit(line, 0, 'C', CC_CLOCK, &set, &mask);
-               get_bit(line, 2, 'D', CC_DATA, &set, &mask);
-               get_bit(line, 4, 'R', CC_RESET_N, &set, &mask);
-               if (mask != (CC_CLOCK|CC_DATA|CC_RESET_N)) {
-                       uint8_t read;
-                       read = ccdbg_read(dbg);
-                       ccdbg_print("\t%c %c %c", CC_CLOCK|CC_DATA|CC_RESET_N, read);
-                       if ((set & CC_CLOCK) == 0)
-                               printf ("\t%d", (read&CC_DATA) ? 1 : 0);
-                       printf ("\n");
-               }
-               ccdbg_send(dbg, mask, set);
-       }
-}
diff --git a/ccdbg-memory.c b/ccdbg-memory.c
deleted file mode 100644 (file)
index 105295d..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
- */
-
-#include "ccdbg.h"
-
-/*
- * Read and write arbitrary memory through the debug port
- */
-
-static uint8_t memory_init[] = {
-       3,      MOV_DPTR_data16,        0,      0,
-#define HIGH_START     2
-#define LOW_START      3
-       0,
-};
-
-
-static uint8_t write8[] = {
-       2,      MOV_A_data,     0,
-#define DATA_BYTE      2
-       1,      MOVX_atDPTR_A,
-       1,      INC_DPTR,
-       0
-};
-
-static uint8_t read8[] = {
-       1,      MOVX_A_atDPTR,
-       1,      INC_DPTR,
-       0,
-};
-
-uint8_t
-ccdbg_write_memory(struct ccdbg *dbg, uint16_t addr, uint8_t *bytes, int nbytes)
-{
-       int i, nl = 0;
-       memory_init[HIGH_START] = addr >> 8;
-       memory_init[LOW_START] = addr;
-       (void) ccdbg_execute(dbg, memory_init);
-       for (i = 0; i < nbytes; i++) {
-               write8[DATA_BYTE] = *bytes++;
-               ccdbg_execute(dbg, write8);
-               if ((i & 0xf) == 0xf) { printf ("."); fflush(stdout); nl = 1; }
-               if ((i & 0xff) == 0xff) { printf ("\n"); nl = 0; }
-       }
-       if (nl) printf ("\n");
-       return 0;
-}
-
-uint8_t
-ccdbg_read_memory(struct ccdbg *dbg, uint16_t addr, uint8_t *bytes, int nbytes)
-{
-       int i, nl = 0;
-       memory_init[HIGH_START] = addr >> 8;
-       memory_init[LOW_START] = addr;
-       (void) ccdbg_execute(dbg, memory_init);
-       for (i = 0; i < nbytes; i++) {
-               *bytes++ = ccdbg_execute(dbg, read8);
-               if ((i & 0xf) == 0xf) { printf ("."); fflush(stdout); nl = 1; }
-               if ((i & 0xff) == 0xff) { printf ("\n"); nl = 0; }
-       }
-       if (nl) printf ("\n");
-       return 0;
-}
-
-uint8_t
-ccdbg_write_uint8(struct ccdbg *dbg, uint16_t addr, uint8_t byte)
-{
-       return ccdbg_write_memory(dbg, addr, &byte, 1);
-}
-
-uint8_t
-ccdbg_write_hex_image(struct ccdbg *dbg, struct hex_image *image, uint16_t offset)
-{
-       ccdbg_write_memory(dbg, image->address + offset, image->data, image->length);
-       return 0;
-}
-
-struct hex_image *
-ccdbg_read_hex_image(struct ccdbg *dbg, uint16_t address, uint16_t length)
-{
-       struct hex_image *image;
-       
-       image = calloc(sizeof(struct hex_image) + length, 1);
-       image->address = address;
-       image->length = length;
-       memset(image->data, 0xff, length);
-       ccdbg_read_memory(dbg, address, image->data, length);
-       return image;
-}
diff --git a/ccdbg.c b/ccdbg.c
deleted file mode 100644 (file)
index c144a06..0000000
--- a/ccdbg.c
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
- */
-
-#include "ccdbg.h"
-
-#if 0
-static uint8_t instructions[] = {
-       3, MOV_direct_data, 0xfe, 0x02,
-       3, MOV_direct_data, 0x90, 0xff,
-       0
-};
-#endif
-
-#if 0
-static uint8_t mem_instr[] = {
-       MOV_direct_data, 0xfe, 0x02,
-       MOV_Rn_data(0), 0x00,
-       MOV_Rn_data(1), 0x00,
-       MOV_direct_data, 0x90, 0xff,
-       MOV_Rn_data(2), 0x10,
-       DJNZ_Rn_rel(1), 0xfe,
-       DJNZ_Rn_rel(0), 0xfc,
-       DJNZ_Rn_rel(2), 0xfa,
-       MOV_direct_data, 0x90, 0xfd,
-       MOV_Rn_data(2), 0x10,
-       DJNZ_Rn_rel(1), 0xfe,
-       DJNZ_Rn_rel(0), 0xfc,
-       DJNZ_Rn_rel(2), 0xfa,
-       SJMP, 0xe7,
-};
-#endif
-
-#if 0
-static struct hex_image *
-make_hex_image(uint16_t addr, uint8_t *data, uint16_t length)
-{
-       struct hex_image        *image;
-
-       image = malloc(sizeof (struct hex_image) + length);
-       image->address = addr;
-       image->length = length;
-       memcpy(image->data, data, length);
-       return image;
-}
-#endif
-
-int
-main (int argc, char **argv)
-{
-       struct ccdbg    *dbg;
-       uint8_t         status;
-       uint16_t        pc;
-       struct hex_file *hex;
-       struct hex_image *image;
-
-       dbg = ccdbg_open("/dev/ttyUSB0");
-       if (!dbg)
-               exit (1);
-#if 0
-       ccdbg_manual(dbg, stdin);
-#endif
-#if 1
-       hex = ccdbg_hex_file_read(stdin, "<stdin>");
-       if (!hex)
-               exit (1);
-       image = ccdbg_hex_image_create(hex);
-       ccdbg_hex_file_free(hex);
-#else
-       image = make_hex_image(0xf000, mem_instr, sizeof (mem_instr));
-#endif
-       
-       ccdbg_debug_mode(dbg);
-       
-#if 1
-       if (!image) {
-               fprintf(stderr, "image create failed\n");
-               exit (1);
-       }
-       if (image->address == 0xf000) {
-               printf("Loading %d bytes to execute from RAM\n", image->length);
-               ccdbg_write_hex_image(dbg, image, 0);
-       } else if (image->address == 0x0000) {
-               printf("Loading code to execute from FLASH\n");
-               ccdbg_flash_hex_image(dbg, image);
-       } else {
-               printf("Cannot load code to 0x%04x\n",
-                      image->address);
-               ccdbg_hex_image_free(image);
-               ccdbg_close(dbg);
-               exit(1);
-       }
-       ccdbg_set_pc(dbg, image->address);
-#endif
-       ccdbg_resume(dbg);
-       ccdbg_close(dbg);
-       exit (0);
-}
diff --git a/ccdbg.h b/ccdbg.h
deleted file mode 100644 (file)
index 3bb5722..0000000
--- a/ccdbg.h
+++ /dev/null
@@ -1,351 +0,0 @@
-/*
- * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
- */
-
-#ifndef _CCDBG_H_
-#define _CCDBG_H_
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <assert.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-#undef USE_KERNEL
-#ifdef USE_KERNEL
-#include <cp2101.h>
-#define CC_CLOCK       CP2101_GPIO_MASK(0)
-#define CC_DATA                CP2101_GPIO_MASK(1)
-#define CC_RESET_N     CP2101_GPIO_MASK(2)
-#else
-#define CC_CLOCK       0x1
-#define CC_DATA                0x2
-#define CC_RESET_N     0x4
-#include <usb.h>
-#endif
-
-
-/* painfully slow for now */
-#define CC_CLOCK_US    (50)
-
-#define MOV_direct_data                0x75
-#define LJMP                   0x02
-#define MOV_Rn_data(n)         (0x78 | (n))
-#define DJNZ_Rn_rel(n)         (0xd8 | (n))
-#define MOV_A_direct           0xe5
-#define MOV_direct_A           0xf5
-#define MOV_DPTR_data16                0x90
-#define MOV_A_data     0x74
-#define MOVX_atDPTR_A  0xf0
-#define MOVX_A_atDPTR  0xe0
-#define INC_DPTR       0xa3
-#define TRAP           0xa5
-
-#define SJMP           0x80
-
-#define FWT            0xAB
-#define FADDRL         0xAC
-#define FADDRH         0xAD
-#define FCTL           0xAE
-# define FCTL_BUSY     0x80
-# define FCTL_BUSY_BIT 7
-# define FCTL_SWBSY    0x40
-# define FCTL_SWBSY_BIT        6
-# define FCTL_CONTRD   0x10
-# define FCTL_WRITE    0x02
-# define FCTL_ERASE    0x01
-#define FWDATA         0xAF
-
-#define CLKCON         0xC6
-#define  CLKCON_OSC32K 0x80
-#define  CLKCON_OSC    0x40
-#define  CLKCON_TICKSPD        0x38
-#define  CLKCON_CLKSPD 0x07
-
-#define P0             0x80
-#define P1             0x90
-#define P2             0xA0
-#define P0DIR          0xFD
-#define P1DIR          0xFE
-#define P2DIR          0xFF
-
-#define SLEEP          0xBE
-
-#define JB             0x20
-
-#define ACC(bit)       (0xE0 | (bit))
-
-struct ccdbg {
-       usb_dev_handle  *usb_dev;
-       uint8_t gpio;
-#ifdef USE_KERNEL
-       int     fd;
-#endif
-       uint8_t debug_data;
-       int     clock;
-};
-
-struct hex_record {
-       uint8_t length;
-       uint16_t address;
-       uint8_t type;
-       uint8_t checksum;
-       uint8_t data[0];
-};
-
-struct hex_file {
-       int                     nrecord;
-       struct hex_record       *records[0];
-};
-
-struct hex_image {
-       uint16_t        address;
-       uint16_t        length;
-       uint8_t         data[0];
-};
-
-#define HEX_RECORD_NORMAL              0x00
-#define HEX_RECORD_EOF                 0x01
-#define HEX_RECORD_EXTENDED_ADDRESS    0x02
-
-#include "cccp.h"
-
-#define CC_CHIP_ERASE          0x14
-
-#define CC_WR_CONFIG           0x1d
-#define CC_RD_CONFIG           0x24
-# define CC_CONFIG_TIMERS_OFF          (1 << 3)
-# define CC_CONFIG_DMA_PAUSE           (1 << 2)
-# define CC_CONFIG_TIMER_SUSPEND       (1 << 1)
-# define CC_SET_FLASH_INFO_PAGE                (1 << 0)
-
-#define CC_GET_PC              0x28
-#define CC_READ_STATUS         0x34
-# define CC_STATUS_CHIP_ERASE_DONE     (1 << 7)
-# define CC_STATUS_PCON_IDLE           (1 << 6)
-# define CC_STATUS_CPU_HALTED          (1 << 5)
-# define CC_STATUS_POWER_MODE_0                (1 << 4)
-# define CC_STATUS_HALT_STATUS         (1 << 3)
-# define CC_STATUS_DEBUG_LOCKED                (1 << 2)
-# define CC_STATUS_OSCILLATOR_STABLE   (1 << 1)
-# define CC_STATUS_STACK_OVERFLOW      (1 << 0)
-
-#define CC_SET_HW_BRKPNT       0x3b
-# define CC_HW_BRKPNT_N(n)     ((n) << 3)
-# define CC_HW_BRKPNT_N_MASK   (0x3 << 3)
-# define CC_HW_BRKPNT_ENABLE   (1 << 2)
-
-#define CC_HALT                        0x44
-#define CC_RESUME              0x4c
-#define CC_DEBUG_INSTR(n)      (0x54|(n))
-#define CC_STEP_INSTR          0x5c
-#define CC_STEP_REPLACE(n)     (0x64|(n))
-#define CC_GET_CHIP_ID         0x68
-
-#define CC_DEBUG_BITBANG       0x00000001
-#define CC_DEBUG_COMMAND       0x00000002
-#define CC_DEBUG_INSTRUCTIONS  0x00000004
-
-/* ccdbg-command.c */
-void
-ccdbg_debug_mode(struct ccdbg *dbg);
-
-void
-ccdbg_reset(struct ccdbg *dbg);
-
-uint8_t
-ccdbg_chip_erase(struct ccdbg *dbg);
-
-uint8_t
-ccdbg_wr_config(struct ccdbg *dbg, uint8_t config);
-
-uint8_t
-ccdbg_rd_config(struct ccdbg *dbg);
-
-uint16_t
-ccdbg_get_pc(struct ccdbg *dbg);
-
-uint8_t
-ccdbg_read_status(struct ccdbg *dbg);
-
-uint8_t
-ccdbg_set_hw_brkpnt(struct ccdbg *dbg, uint8_t number, uint8_t enable, uint16_t addr);
-
-uint8_t
-ccdbg_halt(struct ccdbg *dbg);
-
-uint8_t
-ccdbg_resume(struct ccdbg *dbg);
-
-uint8_t
-ccdbg_debug_instr(struct ccdbg *dbg, uint8_t *instr, int nbytes);
-
-uint8_t
-ccdbg_step_instr(struct ccdbg *dbg);
-
-uint8_t
-ccdbg_step_replace(struct ccdbg *dbg, uint8_t *instr, int nbytes);
-
-uint16_t
-ccdbg_get_chip_id(struct ccdbg *dbg);
-
-uint8_t
-ccdbg_execute(struct ccdbg *dbg, uint8_t *inst);
-       
-uint8_t
-ccdbg_set_pc(struct ccdbg *dbg, uint16_t pc);
-       
-uint8_t
-ccdbg_execute_hex_image(struct ccdbg *dbg, struct hex_image *image);
-
-/* ccdbg-debug.c */
-void
-ccdbg_debug(int level, char *format, ...);
-
-void
-ccdbg_add_debug(int level);
-
-void
-ccdbg_clear_debug(int level);
-
-/* ccdbg-flash.c */
-uint8_t
-ccdbg_flash_hex_image(struct ccdbg *dbg, struct hex_image *image);
-
-/* ccdbg-hex.c */
-struct hex_file *
-ccdbg_hex_file_read(FILE *file, char *name);
-
-void
-ccdbg_hex_file_free(struct hex_file *hex);
-
-struct hex_image *
-ccdbg_hex_image_create(struct hex_file *hex);
-
-void
-ccdbg_hex_image_free(struct hex_image *image);
-
-int
-ccdbg_hex_image_equal(struct hex_image *a, struct hex_image *b);
-
-/* ccdbg-io.c */
-void
-ccdbg_half_clock(struct ccdbg *dbg);
-
-int
-ccdbg_write(struct ccdbg *dbg, uint8_t mask, uint8_t value);
-
-uint8_t
-ccdbg_read(struct ccdbg *dbg);
-
-struct ccdbg *
-ccdbg_open(char *file);
-
-void
-ccdbg_close(struct ccdbg *dbg);
-
-void
-ccdbg_clock_1_0(struct ccdbg *dbg);
-
-void
-ccdbg_clock_0_1(struct ccdbg *dbg);
-
-void
-ccdbg_write_bit(struct ccdbg *dbg, uint8_t bit);
-
-void
-ccdbg_write_byte(struct ccdbg *dbg, uint8_t byte);
-
-uint8_t
-ccdbg_read_bit(struct ccdbg *dbg);
-
-uint8_t
-ccdbg_read_byte(struct ccdbg *dbg);
-
-void
-ccdbg_cmd_write(struct ccdbg *dbg, uint8_t cmd, uint8_t *data, int len);
-
-uint8_t
-ccdbg_cmd_write_read8(struct ccdbg *dbg, uint8_t cmd, uint8_t *data, int len);
-
-uint16_t
-ccdbg_cmd_write_read16(struct ccdbg *dbg, uint8_t cmd, uint8_t *data, int len);
-
-void
-ccdbg_send(struct ccdbg *dbg, uint8_t mask, uint8_t set);
-
-void
-ccdbg_send_bit(struct ccdbg *dbg, uint8_t bit);
-
-void
-ccdbg_send_byte(struct ccdbg *dbg, uint8_t byte);
-
-void
-ccdbg_send_bytes(struct ccdbg *dbg, uint8_t *bytes, int nbytes);
-
-uint8_t
-ccdbg_recv_bit(struct ccdbg *dbg, int first);
-
-uint8_t
-ccdbg_recv_byte(struct ccdbg *dbg, int first);
-
-void
-ccdbg_recv_bytes(struct ccdbg *dbg, uint8_t *bytes, int nbytes);
-
-void
-ccdbg_print(char *format, uint8_t mask, uint8_t set);
-
-/* ccdbg-manual.c */
-
-void
-ccdbg_manual(struct ccdbg *dbg, FILE *input);
-
-/* ccdbg-memory.c */
-uint8_t
-ccdbg_write_memory(struct ccdbg *dbg, uint16_t addr, uint8_t *bytes, int nbytes);
-
-uint8_t
-ccdbg_read_memory(struct ccdbg *dbg, uint16_t addr, uint8_t *bytes, int nbytes);
-
-uint8_t
-ccdbg_write_uint8(struct ccdbg *dbg, uint16_t addr, uint8_t byte);
-
-uint8_t
-ccdbg_write_hex_image(struct ccdbg *dbg, struct hex_image *image, uint16_t offset);
-
-struct hex_image *
-ccdbg_read_hex_image(struct ccdbg *dbg, uint16_t address, uint16_t length);
-
-/* cp-usb.c */
-void
-cp_usb_init(struct ccdbg *dbg);
-
-void
-cp_usb_fini(struct ccdbg *dbg);
-
-void
-cp_usb_write(struct ccdbg *dbg, uint8_t mask, uint8_t value);
-
-uint8_t
-cp_usb_read(struct ccdbg *dbg);
-
-#endif /* _CCDBG_H_ */
diff --git a/ccload/Makefile.am b/ccload/Makefile.am
new file mode 100644 (file)
index 0000000..f54f4aa
--- /dev/null
@@ -0,0 +1,10 @@
+bin_PROGRAMS=ccload
+
+AM_CFLAGS=-I$(top_srcdir)/lib
+CCLOAD_LIBS=../lib/libcc.a
+
+ccload_DEPENDENCIES = $(CCLOAD_LIBS)
+
+ccload_LDADD=$(CCLOAD_LIBS) $(USB_LIBS)
+
+ccload_SOURCES = ccload.c
diff --git a/ccload/ccload.c b/ccload/ccload.c
new file mode 100644 (file)
index 0000000..b4bb144
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
+ */
+
+#include "ccdbg.h"
+
+int
+main (int argc, char **argv)
+{
+       struct ccdbg    *dbg;
+       uint8_t         status;
+       uint16_t        pc;
+       struct hex_file *hex;
+       struct hex_image *image;
+       char *filename;
+       FILE *file;
+
+       filename = argv[1];
+       if (filename == NULL) {
+               fprintf(stderr, "usage: %s <filename.ihx>\n", argv[0]);
+               exit(1);
+       }
+       file = fopen(filename, "r");
+       if (!file) {
+               perror(filename);
+               exit(1);
+       }
+       hex = ccdbg_hex_file_read(file, filename);
+       fclose(file);
+       if (!hex)
+               exit (1);
+       image = ccdbg_hex_image_create(hex);
+       if (!image) {
+               fprintf(stderr, "image create failed\n");
+               exit (1);
+       }
+       
+       ccdbg_hex_file_free(hex);
+       dbg = ccdbg_open();
+       if (!dbg)
+               exit (1);
+       
+       ccdbg_debug_mode(dbg);
+       ccdbg_halt(dbg);
+       if (image->address == 0xf000) {
+               printf("Loading %d bytes to execute from RAM\n",
+                      image->length);
+               ccdbg_write_hex_image(dbg, image, 0);
+       } else if (image->address == 0x0000) {
+               printf("Loading %d bytes to execute from FLASH\n",
+                      image->length);
+               ccdbg_flash_hex_image(dbg, image);
+       } else {
+               printf("Cannot load code to 0x%04x\n",
+                      image->address);
+               ccdbg_hex_image_free(image);
+               ccdbg_close(dbg);
+               exit(1);
+       }
+       ccdbg_set_pc(dbg, image->address);
+       ccdbg_resume(dbg);
+       ccdbg_close(dbg);
+       exit (0);
+}
diff --git a/chip_id b/chip_id
deleted file mode 100644 (file)
index b3ecf31..0000000
--- a/chip_id
+++ /dev/null
@@ -1,71 +0,0 @@
-#
-# Debug mode - drive RESET_N low for two clock cycles
-#
-C D R
-. D .
-C D .
-. D .
-C D .
-. D R
-
-#
-# GET_CHIP_ID
-
-C . R  0
-. . R
-C D R  1
-. D R
-C D R  1
-. D R
-C . R  0
-. . R
-
-C D R  1
-. D R
-C . R  0
-. . R
-C . R  0
-. . R
-C . R  0
-. . R
-
-#
-# start reading again
-
-C D R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-C D R
diff --git a/cp-usb.c b/cp-usb.c
deleted file mode 100644 (file)
index 3822e8c..0000000
--- a/cp-usb.c
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
- */
-
-#include "ccdbg.h"
-#include <usb.h>
-
-#define CP2101_UART    0x00
-#define UART_ENABLE    0x0001
-#define UART_DISABLE   0x0000
-#define REQTYPE_HOST_TO_DEVICE  0x41
-#define REQTYPE_DEVICE_TO_HOST  0xc1
-
-static int
-cp_usb_gpio_get(struct ccdbg *dbg, uint8_t *gpio_get)
-{
-       return usb_control_msg(dbg->usb_dev,            /* dev */
-                              0xc0,                    /* request */
-                              0xff,                    /* requesttype */
-                              0x00c2,                  /* value */
-                              0,                       /* index */
-                              (char *) gpio_get,       /* bytes */
-                              1,                       /* size */
-                              300);                    /* timeout */
-}
-
-static int
-cp_usb_gpio_set(struct ccdbg *dbg, uint8_t mask, uint8_t value)
-{
-       uint16_t gpio_set = ((uint16_t) value << 8) | mask;
-
-       return usb_control_msg(dbg->usb_dev,            /* dev */
-                              0x40,                    /* request */
-                              0xff,                    /* requesttype */
-                              0x37e1,                  /* value */
-                              gpio_set,                /* index */
-                              NULL,                    /* bytes */
-                              0,                       /* size */
-                              300);                    /* timeout */
-}
-
-static int
-cp_usb_uart_enable_disable(struct ccdbg *dbg, uint16_t enable)
-{
-       return usb_control_msg(dbg->usb_dev,
-                              CP2101_UART,
-                              REQTYPE_HOST_TO_DEVICE,
-                              enable,
-                              0,
-                              NULL,
-                              0,
-                              300);
-}
-
-void
-cp_usb_init(struct ccdbg *dbg)
-{
-       usb_dev_handle *dev_handle;
-       struct usb_device *dev;
-       struct usb_bus *bus, *busses;
-       int interface;
-       int ret;
-       uint8_t gpio;
-       
-       usb_init();
-       usb_find_busses();
-       usb_find_devices();
-       
-       busses = usb_get_busses();
-       for (bus = busses; bus; bus = bus->next) {
-               for (dev = bus->devices; dev; dev = dev->next) {
-                       if (dev->descriptor.idVendor == 0x10c4 &&
-                           dev->descriptor.idProduct == 0xea60)
-                               break;
-               }
-               if (dev)
-                       break;
-       }
-       if (!dev){
-               perror("No CP2103 found\n");
-               exit(1);
-       }
-       interface = 0;
-       dev_handle = usb_open(dev);
-       usb_detach_kernel_driver_np(dev_handle, interface);
-       usb_claim_interface(dev_handle, interface);
-       dbg->usb_dev = dev_handle;
-       ret = cp_usb_uart_enable_disable(dbg, UART_DISABLE);
-       dbg->gpio = 0xf;
-       ret = cp_usb_gpio_set(dbg, 0xf, dbg->gpio);
-       ret = cp_usb_gpio_get(dbg, &gpio);
-}
-
-void
-cp_usb_fini(struct ccdbg *dbg)
-{
-       cp_usb_uart_enable_disable(dbg, UART_DISABLE);
-       usb_close(dbg->usb_dev);
-}
-
-void
-cp_usb_write(struct ccdbg *dbg, uint8_t mask, uint8_t value)
-{
-       uint8_t new_gpio;
-       int ret;
-
-       new_gpio = (dbg->gpio & ~mask) | (value & mask);
-       if (new_gpio != dbg->gpio) {
-               ret = cp_usb_gpio_set(dbg, new_gpio ^ dbg->gpio, new_gpio);
-               if (ret < 0)
-                       perror("gpio_set");
-               dbg->gpio = new_gpio;
-       }
-}
-
-uint8_t
-cp_usb_read(struct ccdbg *dbg)
-{
-       int ret;
-       uint8_t gpio;
-
-       ret = cp_usb_gpio_get(dbg, &gpio);
-       if (ret < 0)
-               perror("gpio_set");
-       return gpio;
-}
diff --git a/debug_mode b/debug_mode
deleted file mode 100644 (file)
index fe25bfe..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#
-# Debug mode - drive RESET_N low for two clock cycles
-#
-
-C D R
-. D .
-C D .
-. D .
-C D .
-. D R
-
diff --git a/get_pc b/get_pc
deleted file mode 100644 (file)
index 13bcba1..0000000
--- a/get_pc
+++ /dev/null
@@ -1,71 +0,0 @@
-#
-# Debug mode - drive RESET_N low for two clock cycles
-#
-C D R
-. D .
-C D .
-. D .
-C D .
-. D R
-
-#
-# GET_STATUS
-#
-
-C . R  0
-. . R
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-
-C D R  1
-. D R
-C . R  0
-. . R
-C . R  0
-. . R
-C . R  0
-. . R
-
-#
-# Now read for a while
-#
-
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
diff --git a/get_status b/get_status
deleted file mode 100644 (file)
index 1d4ff03..0000000
+++ /dev/null
@@ -1,329 +0,0 @@
-#
-# Debug mode - drive RESET_N low for two clock cycles
-#
-C D R
-. D .
-C D .
-. D .
-C D .
-. D R
-
-#
-# Halt 0x44
-#
-
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-C . R  0
-. . R
-
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-C . R  0
-. . R
-
-# status byte
-
-C D R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-# Resume 0x4c
-#
-
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-C . R  0
-. . R
-
-C D R  1
-. D R
-C D R  1
-. D R
-C . R  0
-. . R
-C . R  0
-. . R
-
-# status byte
-
-C D R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-#
-# READ_STATUS
-#
-
-C . R  0
-. . R
-C . R  0
-. . R
-C D R  1
-. D R
-C D R  1
-. D R
-
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-C . R  0
-. . R
-
-#
-# status
-#
-
-C D R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-#
-# READ_STATUS
-#
-
-C . R  0
-. . R
-C . R  0
-. . R
-C D R  1
-. D R
-C D R  1
-. D R
-
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-C . R  0
-. . R
-
-#
-# status
-#
-
-C D R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-#
-# READ_STATUS
-#
-
-C . R  0
-. . R
-C . R  0
-. . R
-C D R  1
-. D R
-C D R  1
-. D R
-
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-C . R  0
-. . R
-
-#
-# status
-#
-
-C D R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-#
-# Halt 0x44
-#
-
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-C . R  0
-. . R
-
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-C . R  0
-. . R
-
-# status byte
-
-C D R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-#
-# READ_STATUS
-#
-
-C . R  0
-. . R
-C . R  0
-. . R
-C D R  1
-. D R
-C D R  1
-. D R
-
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-C . R  0
-. . R
-
-#
-# status
-#
-
-C D R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
diff --git a/half_phase b/half_phase
deleted file mode 100644 (file)
index 3ca4a30..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-#
-# Debug mode - drive RESET_N low for two clock cycles
-#
-C D R
-. D .
-C D .
-. D .
-C D .
-. D R
-
-#
-# GET_STATUS
-#
-
-C . R  0
-. . R
-C . R  0
-. . R
-C D R  1
-. D R
-C D R  1
-. D R
-
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-C . R  0
-. . R
-
-#
-# Now read for a while
-#
-
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
diff --git a/in b/in
deleted file mode 100644 (file)
index 93341e3..0000000
--- a/in
+++ /dev/null
@@ -1,146 +0,0 @@
-#
-# Debug mode - drive RESET_N low for two clock cycles
-#
-C D R
-. D .
-C D .
-. D .
-C D .
-. D .
-
-#C D R
-#. D R
-#C D R
-#. D R
-#C D R
-#. D R
-#C D R
-#. D R
-
-#
-# Ok, we're in debug mode now
-#
-
-#
-# GET_CHIP_ID
-
-#C . R 0
-#. . R
-#C D R 1
-#. D R
-#C D R 1
-#. D R
-#C . R 0
-#. . R
-#
-#C D R 1
-#. D R
-#C . R 0
-#. . R
-#C . R 0
-#. . R
-#C . R 0
-#. . R
-#
-##
-## Read the chip id
-##
-#
-#C D R
-#. D R
-#C D R
-#. D R
-#C D R
-#. D R
-#C D R
-#. D R
-#
-#C D R
-#. D R
-#C D R
-#. D R
-#C D R
-#. D R
-#C D R
-#. D R
-#
-#C D R
-#. D R
-#C D R
-#. D R
-#C D R
-#. D R
-#C D R
-#. D R
-#
-#C D R
-#. D R
-#C D R
-#. D R
-#C D R
-#. D R
-#C D R
-#. D R
-#
-
-#
-# GET_STATUS
-#
-
-C . R  0
-. . R
-C . R  0
-. . R
-C D R  1
-. D R
-C D R  1
-. D R
-
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-C . R  0
-. . R
-
-#
-# Now read for a while
-#
-
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
diff --git a/isr.c b/isr.c
deleted file mode 100644 (file)
index 43aedc2..0000000
--- a/isr.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
- */
-
-void rftxrx_isr (void) __interrupt(0) __using(1)
-{
-}
-
-void adc_isr (void) __interrupt(1) __using(1)
-{
-}
-
-void urx0_isr (void) __interrupt(2) __using(1)
-{
-}
-
-void urx1_isr (void) __interrupt(3) __using(1)
-{
-}
-
-void enc_isr (void) __interrupt(4) __using(1)
-{
-}
-
-void st_isr (void) __interrupt(5) __using(1)
-{
-}
-
-void usb_isr (void) __interrupt(6) __using(1)
-{
-}
-
-void utx0_isr (void) __interrupt(7) __using(1)
-{
-}
-
-void dma_isr (void) __interrupt(8) __using(1)
-{
-}
-
-void t1_isr (void) __interrupt(9) __using(1)
-{
-}
-
-void t2_isr (void) __interrupt(10) __using(1)
-{
-}
-
-void t3_isr (void) __interrupt(11) __using(1)
-{
-}
-
-void t4_isr (void) __interrupt(12) __using(1)
-{
-}
-
-void p0int_isr (void) __interrupt(13) __using(1)
-{
-}
-
-void utx1_isr (void) __interrupt(14) __using(1)
-{
-}
-
-void p1int_isr (void) __interrupt(15) __using(1)
-{
-}
-
-void rf_isr (void) __interrupt(16) __using(1)
-{
-}
-
-void wdt_isr (void) __interrupt(17) __using(1)
-{
-}
-
diff --git a/lib/Makefile.am b/lib/Makefile.am
new file mode 100644 (file)
index 0000000..a5e5932
--- /dev/null
@@ -0,0 +1,14 @@
+noinst_LIBRARIES = libcc.a
+
+AM_CFLAGS=$(WARN_CFLAGS)
+
+libcc_a_SOURCES = \
+       ccdbg-command.c \
+       ccdbg-debug.c \
+       ccdbg-flash.c \
+       ccdbg.h \
+       ccdbg-hex.c \
+       ccdbg-io.c \
+       ccdbg-manual.c \
+       ccdbg-memory.c \
+       cp-usb.c
diff --git a/lib/cccp.c b/lib/cccp.c
new file mode 100644 (file)
index 0000000..99a0d81
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
+ */
+
+#include "ccdbg.h"
+
+static void
+say(char *name, uint8_t bits)
+{
+       printf("%s: ", name);
+       if (bits & CC_RESET_N)
+               printf ("R ");
+       else
+               printf (". ");
+       if (bits & CC_CLOCK)
+               printf ("C ");
+       else
+               printf (". ");
+       if (bits & CC_DATA)
+               printf ("D\n");
+       else
+               printf (".\n");
+}
+
+static void
+_cccp_write(struct ccdbg *dbg, uint8_t mask, uint8_t value)
+{
+       uint16_t        set;
+       int             ret;
+
+       set = (mask) | (value << 8);
+       dbg->debug_data = (dbg->debug_data & ~mask) | (value & mask);
+       ret = ioctl(dbg->fd, CP2101_IOCTL_GPIOSET, &set);
+       if (ret < 0)
+               perror("CP2101_IOCTL_GPIOSET");
+}
+
+void
+cccp_write(struct ccdbg *dbg, uint8_t mask, uint8_t value)
+{
+       _cccp_write(dbg, mask, value);
+//     say("w", dbg->debug_data);
+}
+
+uint8_t
+cccp_read_all(struct ccdbg *dbg)
+{
+       int ret;
+       uint8_t get;
+       ret = ioctl(dbg->fd, CP2101_IOCTL_GPIOGET, &get);
+       if (ret < 0) {
+               perror("CP2101_IOCTL_GPIOGET");
+               get = 0;
+       }
+       return get;
+}
+
+uint8_t
+cccp_read(struct ccdbg *dbg, uint8_t mask)
+{
+       uint8_t         pull_up;
+       uint8_t         get;
+
+       /* tri-state the bits of interest */
+       pull_up = (~dbg->debug_data) & mask;
+       if (pull_up)
+               _cccp_write(dbg, pull_up, pull_up);
+       get = cccp_read_all(dbg);
+       say("\t\tr", get);
+       return get & mask;
+}
+
+void
+cccp_init(struct ccdbg *dbg)
+{
+       /* set all of the GPIOs to a known state */
+       cccp_write(dbg, 0xf, 0xf);
+}
+
+void
+cccp_fini(struct ccdbg *dbg)
+{
+       /* set all of the GPIOs to a known state */
+       cccp_write(dbg, 0xf, 0xf);
+       dbg->clock = 1;
+}
diff --git a/lib/cccp.h b/lib/cccp.h
new file mode 100644 (file)
index 0000000..eecdbb4
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
+ */
+
+/*
+ * Interface for using a CP2103 to talk to a CC1111
+ */
+
+#ifndef _CCCP_H_
+#define _CCCP_H_
+
+void
+cccp_write(struct ccdbg *dbg, uint8_t mask, uint8_t value);
+
+uint8_t
+cccp_read_all(struct ccdbg *dbg);
+
+uint8_t
+cccp_read(struct ccdbg *dbg, uint8_t mask);
+
+void
+cccp_init(struct ccdbg *dbg);
+
+void
+cccp_fini(struct ccdbg *dbg);
+
+#endif /* _CCCP_H_ */
diff --git a/lib/ccdbg-command.c b/lib/ccdbg-command.c
new file mode 100644 (file)
index 0000000..38c006c
--- /dev/null
@@ -0,0 +1,182 @@
+/*
+ * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
+ */
+
+#include "ccdbg.h"
+
+void
+ccdbg_debug_mode(struct ccdbg *dbg)
+{
+       /* force two rising clocks while holding RESET_N low */
+       ccdbg_debug(CC_DEBUG_COMMAND, "#\n");
+       ccdbg_debug(CC_DEBUG_COMMAND, "# Debug mode\n");
+       ccdbg_debug(CC_DEBUG_COMMAND, "#\n");
+       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA|CC_RESET_N);
+       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N,          CC_DATA           );
+       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA           );
+       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N,          CC_DATA           );
+       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA           );
+       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N,          CC_DATA|CC_RESET_N);
+}
+
+void
+ccdbg_reset(struct ccdbg *dbg)
+{
+       ccdbg_debug(CC_DEBUG_COMMAND, "#\n");
+       ccdbg_debug(CC_DEBUG_COMMAND, "# Reset\n");
+       ccdbg_debug(CC_DEBUG_COMMAND, "#\n");
+       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA|CC_RESET_N);
+       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA           );
+       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA           );
+       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA           );
+       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA           );
+       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|CC_DATA|CC_RESET_N);
+}
+
+uint8_t
+ccdbg_chip_erase(struct ccdbg *dbg)
+{
+       return ccdbg_cmd_write_read8(dbg, CC_CHIP_ERASE, NULL, 0);
+}
+
+uint8_t
+ccdbg_wr_config(struct ccdbg *dbg, uint8_t config)
+{
+       return ccdbg_cmd_write_read8(dbg, CC_WR_CONFIG, &config, 1);
+}
+
+uint8_t
+ccdbg_rd_config(struct ccdbg *dbg)
+{
+       return ccdbg_cmd_write_read8(dbg, CC_RD_CONFIG, NULL, 0);
+}
+
+uint16_t
+ccdbg_get_pc(struct ccdbg *dbg)
+{
+       return ccdbg_cmd_write_read16(dbg, CC_GET_PC, NULL, 0);
+}
+
+uint8_t
+ccdbg_read_status(struct ccdbg *dbg)
+{
+       return ccdbg_cmd_write_read8(dbg, CC_READ_STATUS, NULL, 0);
+}
+
+uint8_t
+ccdbg_set_hw_brkpnt(struct ccdbg *dbg, uint8_t number, uint8_t enable, uint16_t addr)
+{
+       uint8_t data[3];
+
+       data[0] = (number << 3) | (enable << 2);
+       data[1] = (addr >> 8);
+       data[2] = addr;
+       return ccdbg_cmd_write_read8(dbg, CC_SET_HW_BRKPNT, data, 3);
+}
+
+uint8_t
+ccdbg_halt(struct ccdbg *dbg)
+{
+       return ccdbg_cmd_write_read8(dbg, CC_HALT, NULL, 0);
+}
+
+uint8_t
+ccdbg_resume(struct ccdbg *dbg)
+{
+       return ccdbg_cmd_write_read8(dbg, CC_RESUME, NULL, 0);
+}
+
+uint8_t
+ccdbg_debug_instr(struct ccdbg *dbg, uint8_t *instr, int nbytes)
+{
+       return ccdbg_cmd_write_read8(dbg, CC_DEBUG_INSTR(nbytes), instr, nbytes);
+}
+
+uint8_t
+ccdbg_step_instr(struct ccdbg *dbg)
+{
+       return ccdbg_cmd_write_read8(dbg, CC_STEP_INSTR, NULL, 0);
+}
+
+uint8_t
+ccdbg_step_replace(struct ccdbg *dbg, uint8_t *instr, int nbytes)
+{
+       return ccdbg_cmd_write_read8(dbg, CC_STEP_REPLACE(nbytes), instr, nbytes);
+}
+
+uint16_t
+ccdbg_get_chip_id(struct ccdbg *dbg)
+{
+       return ccdbg_cmd_write_read16(dbg, CC_GET_CHIP_ID, NULL, 0);
+}
+
+/*
+ * Execute a sequence of instructions
+ */
+uint8_t
+ccdbg_execute(struct ccdbg *dbg, uint8_t *inst)
+{
+       uint8_t status = 0;
+       while(inst[0] != 0) {
+               uint8_t len = inst[0];
+               int i;
+               ccdbg_debug(CC_DEBUG_INSTRUCTIONS, "\t%02x", inst[1]);
+               for (i = 0; i < len - 1; i++)
+                       ccdbg_debug(CC_DEBUG_INSTRUCTIONS, " %02x", inst[i+2]);
+               status = ccdbg_debug_instr(dbg, inst+1, len);
+               for (; i < 3; i++)
+                       ccdbg_debug(CC_DEBUG_INSTRUCTIONS, "   ");
+               ccdbg_debug(CC_DEBUG_INSTRUCTIONS, " -> %02x\n", status);
+               inst += len + 1;
+       }
+       return status;
+}
+
+static uint8_t jump_mem[] = {
+       3, LJMP, 0xf0, 0x00,
+#define PC_HIGH        2
+#define PC_LOW 3
+       0
+};
+
+uint8_t
+ccdbg_set_pc(struct ccdbg *dbg, uint16_t pc)
+{
+       jump_mem[PC_HIGH] = pc >> 8;
+       jump_mem[PC_LOW] = pc & 0xff;
+       return ccdbg_execute(dbg, jump_mem);
+}
+
+uint8_t
+ccdbg_execute_hex_image(struct ccdbg *dbg, struct hex_image *image)
+{
+       uint16_t pc;
+       uint8_t status;
+       
+       if (image->address < 0xf000) {
+               fprintf(stderr, "Cannot execute program starting at 0x%04x\n", image->address);
+               return -1;
+       }
+       ccdbg_write_hex_image(dbg, image, 0);
+       ccdbg_set_pc(dbg, image->address);
+       pc = ccdbg_get_pc(dbg);
+       printf ("pc starts at 0x%04x\n", pc);
+       status = ccdbg_resume(dbg);
+       printf ("resume status: 0x%02x\n", status);
+       return 0;
+}
+
diff --git a/lib/ccdbg-debug.c b/lib/ccdbg-debug.c
new file mode 100644 (file)
index 0000000..2e67bc8
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
+ */
+
+#include "ccdbg.h"
+#include <stdarg.h>
+
+int
+ccdbg_level = 0;
+
+void
+ccdbg_add_debug(int level)
+{
+       ccdbg_level |= level;
+}
+
+void
+ccdbg_clear_debug(int level)
+{
+       ccdbg_level &= ~level;
+}
+
+void
+ccdbg_debug(int level, char *format, ...)
+{
+       va_list ap;
+
+       if (ccdbg_level & level) {
+               va_start(ap, format);
+               vprintf(format, ap);
+               va_end(ap);
+       }
+}
diff --git a/lib/ccdbg-flash.c b/lib/ccdbg-flash.c
new file mode 100644 (file)
index 0000000..aa2c518
--- /dev/null
@@ -0,0 +1,337 @@
+/*
+ * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
+ */
+
+#include "ccdbg.h"
+
+/* From SWRA124 section 3.1.6 */
+
+static uint8_t flash_page[] = {
+
+       MOV_direct_data, P1DIR, 0x02,
+       MOV_direct_data, P1,    0xFF,
+
+       MOV_direct_data, FADDRH, 0,
+#define FLASH_ADDR_HIGH        8
+
+       MOV_direct_data, FADDRL, 0,
+#define FLASH_ADDR_LOW 11
+
+       MOV_DPTR_data16, 0, 0,
+#define RAM_ADDR_HIGH  13
+#define RAM_ADDR_LOW   14
+
+       MOV_Rn_data(7), 0,
+#define FLASH_WORDS_HIGH       16
+       
+       MOV_Rn_data(6), 0,
+#define FLASH_WORDS_LOW                18
+       
+       MOV_direct_data, FWT, 0x20,
+#define FLASH_TIMING           21
+
+       MOV_direct_data, FCTL, FCTL_ERASE,
+/* eraseWaitLoop: */
+               MOV_A_direct,           FCTL,
+       JB, ACC(FCTL_BUSY_BIT), 0xfb,
+
+       MOV_direct_data, P1, 0xfd,
+
+       MOV_direct_data, FCTL, FCTL_WRITE,
+/* writeLoop: */
+               MOV_Rn_data(5), 2,
+/* writeWordLoop: */
+                       MOVX_A_atDPTR,
+                       INC_DPTR,
+                       MOV_direct_A, FWDATA,
+               DJNZ_Rn_rel(5), 0xfa,           /* writeWordLoop */
+/* writeWaitLoop: */
+                       MOV_A_direct, FCTL,
+               JB, ACC(FCTL_SWBSY_BIT), 0xfb,          /* writeWaitLoop */
+       DJNZ_Rn_rel(6), 0xf1,                   /* writeLoop */
+       DJNZ_Rn_rel(7), 0xef,                   /* writeLoop */
+
+       MOV_direct_data, P1DIR, 0x00,
+       MOV_direct_data, P1,    0xFF,
+       TRAP,
+};
+
+#define FLASH_RAM      0xf000
+
+#if 0
+static uint8_t flash_erase_page[] = {
+       3,      MOV_direct_data, FADDRH, 0,
+#define ERASE_PAGE_HIGH        3
+       
+       3,      MOV_direct_data, FADDRL, 0,
+#define ERASE_PAGE_LOW 7
+
+       3,      MOV_direct_data, FWT, 0x2A,
+       3,      MOV_direct_data, FCTL, FCTL_ERASE,
+       0
+};
+
+static uint8_t flash_read_control[] = {
+       2,      MOV_A_direct,   FCTL,
+       0
+};
+#endif
+
+#if 0
+static uint8_t flash_control_clear[] = {
+       3,      MOV_direct_data,        FCTL, 0,
+       2,      MOV_A_direct,           FCTL,
+       0
+};
+#endif
+
+#if 0
+static uint8_t
+ccdbg_flash_erase_page(struct ccdbg *dbg, uint16_t addr)
+{
+       uint16_t        page_addr = addr >> 1;
+       uint8_t         status;
+       uint8_t         old[0x10], new[0x10];
+       int             i;
+       
+       ccdbg_read_memory(dbg, addr, old, 0x10);
+       flash_erase_page[ERASE_PAGE_HIGH] = page_addr >> 8;
+       flash_erase_page[ERASE_PAGE_LOW] = page_addr & 0xff;
+       status = ccdbg_execute(dbg, flash_erase_page);
+       printf("erase status 0x%02x\n", status);
+       do {
+               status = ccdbg_execute(dbg, flash_read_control);
+               printf("fctl 0x%02x\n", status);
+       } while (status & FCTL_BUSY);
+       ccdbg_read_memory(dbg, addr, new, 0x10);
+       for (i = 0; i < 0x10; i++)
+               printf("0x%02x -> 0x%02x\n", old[i], new[i]);
+       status = ccdbg_execute(dbg, flash_control_clear);
+       printf("clear fctl 0x%02x\n", status);
+       return 0;
+}
+#endif
+
+#if 0
+static uint8_t flash_write[] = {
+       MOV_direct_data, P1DIR, 0x02,
+       MOV_direct_data, P1,    0xFD,
+       
+       MOV_A_direct, FCTL,
+       JB,     ACC(FCTL_BUSY_BIT), 0xf1,
+
+       MOV_direct_data, FCTL, 0x20,
+
+       MOV_direct_data, FADDRH, 0,
+#define WRITE_PAGE_HIGH        16
+       
+       MOV_direct_data, FADDRL, 0,
+#define WRITE_PAGE_LOW 19
+       
+       MOV_direct_data, FCTL, FCTL_WRITE,
+       MOV_direct_data, FWDATA, 0,
+#define WRITE_BYTE_0   25
+       MOV_direct_data, FWDATA, 0,
+#define WRITE_BYTE_1   28
+       MOV_A_direct, FCTL,
+       JB,     ACC(FCTL_SWBSY_BIT), 0xf1,
+
+       MOV_direct_data, P1,    0xFF,
+       TRAP,
+};
+#endif
+
+static uint8_t
+ccdbg_clock_init(struct ccdbg *dbg)
+{
+       static uint8_t set_clkcon_fast[] = {
+               3,      MOV_direct_data,        CLKCON, 0x00,
+               0
+       };
+
+       static uint8_t get_sleep[] = {
+               2,      MOV_A_direct, SLEEP,
+               0
+       };
+
+       uint8_t status;
+
+       ccdbg_execute(dbg, set_clkcon_fast);
+       do {
+               status = ccdbg_execute(dbg, get_sleep);
+       } while (!(status & 0x40));
+       return 0;
+}
+
+#if 0
+static uint8_t
+ccdbg_flash_write_word(struct ccdbg *dbg, uint16_t addr, uint8_t data[2])
+{
+       uint16_t page_addr = addr >> 1;
+       uint8_t check[2];
+       uint8_t status;
+       int i;
+
+       flash_write[WRITE_PAGE_HIGH] = page_addr >> 8;
+       flash_write[WRITE_PAGE_LOW] = page_addr & 0xff;
+       flash_write[WRITE_BYTE_0] = data[0];
+       flash_write[WRITE_BYTE_1] = data[1];
+       printf("upload flash write\n");
+       ccdbg_write_memory(dbg, 0xf000, flash_write, sizeof(flash_write));
+       ccdbg_set_pc(dbg, 0xf000);
+       ccdbg_resume(dbg);
+       for (;;) {
+               status = ccdbg_read_status(dbg);
+               printf("waiting for write 0x%02x\n", status);
+               if ((status & CC_STATUS_CPU_HALTED) != 0)
+                       break;
+               sleep (1);
+       }
+       status = ccdbg_execute(dbg, flash_control_clear);
+       printf("clear fctl 0x%02x\n", status);
+       ccdbg_read_memory(dbg, addr, check, 2);
+       for (i = 0; i < 2; i++)
+               printf("0x%02x : 0x%02x\n", data[i], check[i]);
+       return 0;
+}
+#endif
+
+#define TIMERS_OFF             0x08
+#define DMA_PAUSE              0x04
+#define TIMER_SUSPEND          0x02
+#define SEL_FLASH_INFO_PAGE    0x01
+
+#if 0
+static uint8_t
+ccdbg_flash_lock(struct ccdbg *dbg, uint8_t lock)
+{
+       uint8_t config;
+       uint8_t bytes[2];
+       uint8_t old[1], new[1];
+
+       config = ccdbg_rd_config(dbg);
+       ccdbg_wr_config(dbg, config|SEL_FLASH_INFO_PAGE);
+       bytes[0] = lock;
+       bytes[1] = 0;
+       ccdbg_flash_erase_page(dbg, 0);
+       ccdbg_read_memory(dbg, 0, old, 1);
+       ccdbg_flash_write_word(dbg, 0, bytes);
+       ccdbg_read_memory(dbg, 0, new, 1);
+       printf ("flash lock 0x%02x -> 0x%02x\n", old[0], new[0]);
+       ccdbg_wr_config(dbg, config & ~SEL_FLASH_INFO_PAGE);
+       return 0;
+}
+#endif
+
+uint8_t
+ccdbg_flash_hex_image(struct ccdbg *dbg, struct hex_image *image)
+{
+       uint16_t offset;
+       uint16_t flash_prog;
+       uint16_t flash_len;
+       uint8_t fwt;
+       uint16_t flash_word_addr;
+       uint16_t flash_words;
+       uint16_t ram_addr;
+       uint16_t pc;
+       uint8_t status;
+       uint16_t remain, this_time, start;
+       uint8_t verify[0x400];
+
+       ccdbg_clock_init(dbg);
+       if (image->address + image->length > 0x8000) {
+               fprintf(stderr, "cannot flash image from 0x%04x to 0x%04x\n",
+                       image->address, image->address + image->length);
+               return 1;
+       }
+       if (image->address & 0x3ff) {
+               fprintf(stderr, "flash image must start on page boundary\n");
+               return 1;
+       }
+       ram_addr = 0xf000;
+
+       
+       flash_prog = 0xf400;
+
+       fwt = 0x20;
+
+       flash_page[FLASH_TIMING] = fwt;
+       printf("Upload %d flash program bytes to 0x%04x\n",
+              sizeof (flash_page), flash_prog);
+       ccdbg_write_memory(dbg, flash_prog, flash_page, sizeof(flash_page));
+       
+       remain = image->length;
+       start = 0;
+       while (remain) {
+               this_time = remain;
+               if (this_time > 0x400)
+                       this_time = 0x400;
+
+               offset = ram_addr - (image->address + start);
+
+               printf("Upload %d bytes at 0x%04x\n", this_time, ram_addr);
+               ccdbg_write_memory(dbg, ram_addr, image->data + start, this_time);
+
+               printf("Verify %d bytes\n", image->length);
+               ccdbg_read_memory(dbg, ram_addr, verify, this_time);
+               if (memcmp (image->data + start, verify, this_time) != 0) {
+                       fprintf(stderr, "image verify failed\n");
+                       return 1;
+               }
+               
+               flash_word_addr = (image->address + start) >> 1;
+               flash_len = this_time + (this_time & 1);
+               flash_words = flash_len >> 1;
+
+               ccdbg_write_uint8(dbg, flash_prog + FLASH_ADDR_HIGH, flash_word_addr >> 8);
+               ccdbg_write_uint8(dbg, flash_prog + FLASH_ADDR_LOW, flash_word_addr & 0xff);
+
+               ccdbg_write_uint8(dbg, flash_prog + RAM_ADDR_HIGH, ram_addr >> 8);
+               ccdbg_write_uint8(dbg, flash_prog + RAM_ADDR_LOW, ram_addr & 0xff);
+
+               ccdbg_write_uint8(dbg, flash_prog + FLASH_WORDS_HIGH, flash_words >> 8);
+               ccdbg_write_uint8(dbg, flash_prog + FLASH_WORDS_LOW, flash_words & 0xff);
+
+               ccdbg_set_pc(dbg, flash_prog);
+               pc = ccdbg_get_pc(dbg);
+               printf("Starting flash program at 0x%04x\n", pc);
+               status = ccdbg_resume(dbg);
+               printf("resume status is 0x%02x\n", status);
+               do {
+                       status = ccdbg_read_status(dbg);
+                       printf("chip status is 0x%02x\n", status);
+                       sleep(1);
+               } while ((status & CC_STATUS_CPU_HALTED) == 0);
+               
+               remain -= this_time;
+               start += this_time;
+       }
+#if 1
+       printf("Downloading flash to check\n");
+       struct hex_image *test_image;
+       test_image = ccdbg_read_hex_image(dbg, image->address, image->length);
+       if (!ccdbg_hex_image_equal(image, test_image)) {
+               int i;
+               fprintf(stderr, "Image not loaded\n");
+               for (i = 0;i < 0x10; i++)
+                       printf ("0x%02x : 0x%02x\n", image->data[i], test_image->data[i]);
+               return 1;
+       }
+       return 0;
+#endif
+       return 0;
+}
diff --git a/lib/ccdbg-hex.c b/lib/ccdbg-hex.c
new file mode 100644 (file)
index 0000000..86478da
--- /dev/null
@@ -0,0 +1,330 @@
+/*
+ * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
+ */
+
+#include "ccdbg.h"
+#include <stdarg.h>
+#include <ctype.h>
+
+struct hex_input {
+       FILE    *file;
+       int     line;
+       char    *name;
+};
+
+enum hex_read_state {
+       read_marker,
+       read_length,
+       read_address,
+       read_type,
+       read_data,
+       read_checksum,
+       read_newline,
+       read_white,
+       read_done,
+};
+
+
+static void
+ccdbg_hex_error(struct hex_input *input, char *format, ...)
+{
+       va_list ap;
+
+       va_start(ap, format);
+       fprintf(stderr, "Hex error %s:%d: ", input->name, input->line);
+       vfprintf(stderr, format, ap);
+       fprintf(stderr, "\n");
+       va_end(ap);
+}
+
+static void
+ccdbg_hex_free(struct hex_record *record)
+{
+       if (!record) return;
+       free(record);
+}
+
+static struct hex_record *
+ccdbg_hex_alloc(uint8_t length)
+{
+       struct hex_record *record;
+
+       record = calloc(1, sizeof(struct hex_record) + length);
+       record->length = length;
+       return record;
+}
+
+static int
+ishex(char c)
+{
+       return isdigit(c) || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F');
+}
+
+static int
+fromhex(char c)
+{
+       if (isdigit(c))
+               return c - '0';
+       if ('a' <= c && c <= 'f')
+               return c - 'a' + 10;
+       if ('A' <= c && c <= 'F')
+               return c - 'A' + 10;
+       abort();
+       return 0;
+}
+
+static uint8_t
+ccdbg_hex_checksum(struct hex_record *record)
+{
+       uint8_t checksum = 0;
+       int i;
+
+       checksum += record->length;
+       checksum += record->address >> 8;
+       checksum += record->address & 0xff;
+       checksum += record->type;
+       for (i = 0; i < record->length; i++)
+               checksum += record->data[i];
+       return -checksum;
+}
+
+static struct hex_record *
+ccdbg_hex_read_record(struct hex_input *input)
+{
+       struct hex_record *record = NULL;
+       enum hex_read_state state = read_marker;
+       char c;
+       int nhexbytes;
+       uint32_t hex;
+       uint32_t ndata;
+       uint8_t checksum;
+
+       while (state != read_done) {
+               c = getc(input->file);
+               if (c == EOF && state != read_white) {
+                       ccdbg_hex_error(input, "Unexpected EOF");
+                       goto bail;
+               }
+               if (c == ' ')
+                       continue;
+               if (c == '\n')
+                       input->line++;
+               switch (state) {
+               case read_marker:
+                       if (c != ':') {
+                               ccdbg_hex_error(input, "Missing ':'");
+                               goto bail;
+                       }
+                       state = read_length;
+                       nhexbytes = 2;
+                       hex = 0;
+                       break;
+               case read_length:
+               case read_address:
+               case read_type:
+               case read_data:
+               case read_checksum:
+                       if (!ishex(c)) {
+                               ccdbg_hex_error(input, "Non-hex char '%c'",
+                                               c);
+                               goto bail;
+                       }
+                       hex = hex << 4 | fromhex(c);
+                       --nhexbytes;
+                       if (nhexbytes != 0)
+                               break;
+                       
+                       switch (state) {
+                       case read_length:
+                               record = ccdbg_hex_alloc(hex);
+                               if (!record) {
+                                       ccdbg_hex_error(input, "Out of memory");
+                                       goto bail;
+                               }
+                               state = read_address;
+                               nhexbytes = 4;
+                               break;
+                       case read_address:
+                               record->address = hex;
+                               state = read_type;
+                               nhexbytes = 2;
+                               break;
+                       case read_type:
+                               record->type = hex;
+                               state = read_data;
+                               nhexbytes = 2;
+                               ndata = 0;
+                               break;
+                       case read_data:
+                               record->data[ndata] = hex;
+                               ndata++;
+                               nhexbytes = 2;
+                               break;
+                       case read_checksum:
+                               record->checksum = hex;
+                               state = read_newline;
+                               break;
+                       default:
+                               break;
+                       }
+                       if (state == read_data)
+                               if (ndata == record->length) {
+                                       nhexbytes = 2;
+                                       state = read_checksum;
+                               }
+                       hex = 0;
+                       break;
+               case read_newline:
+                       if (c != '\n' && c != '\r') {
+                               ccdbg_hex_error(input, "Missing newline");
+                               goto bail;
+                       }
+                       state = read_white;
+                       break;
+               case read_white:
+                       if (!isspace(c)) {
+                               if (c == '\n')
+                                       input->line--;
+                               if (c != EOF)
+                                       ungetc(c, input->file);
+                               state = read_done;
+                       }
+                       break;
+               case read_done:
+                       break;
+               }
+       }
+       checksum = ccdbg_hex_checksum(record);
+       if (checksum != record->checksum) {
+               ccdbg_hex_error(input, "Invalid checksum (read 0x%02x computed 0x%02x)\n",
+                               record->checksum, checksum);
+               goto bail;
+       }
+       return record;
+
+bail:
+       ccdbg_hex_free(record);
+       return NULL;
+}
+
+void
+ccdbg_hex_file_free(struct hex_file *hex)
+{
+       int     i;
+
+       if (!hex)
+               return;
+       for (i = 0; i < hex->nrecord; i++)
+               ccdbg_hex_free(hex->records[i]);
+       free(hex);
+}
+
+static int
+ccdbg_hex_record_compar(const void *av, const void *bv)
+{
+       const struct hex_record *a = *(struct hex_record **) av;
+       const struct hex_record *b = *(struct hex_record **) bv;
+
+       return (int) a->address - (int) b->address;
+}
+
+struct hex_file *
+ccdbg_hex_file_read(FILE *file, char *name)
+{
+       struct hex_input input;
+       struct hex_file *hex = NULL, *newhex;
+       struct hex_record *record;
+       int srecord = 1;
+       int done = 0;
+
+       hex = calloc(sizeof (struct hex_file) + sizeof (struct hex_record *), 1);
+       input.name = name;
+       input.line = 1;
+       input.file = file;
+       while (!done) {
+               record = ccdbg_hex_read_record(&input);
+               if (!record)
+                       goto bail;
+               if (hex->nrecord == srecord) {
+                       srecord *= 2;
+                       newhex = realloc(hex, 
+                                        sizeof (struct hex_file) +
+                                        srecord * sizeof (struct hex_record *));
+                       if (!newhex)
+                               goto bail;
+                       hex = newhex;
+               }
+               hex->records[hex->nrecord++] = record;
+               if (record->type == HEX_RECORD_EOF)
+                       done = 1;
+       }
+       /*
+        * Sort them into increasing addresses, except for EOF
+        */
+       qsort(hex->records, hex->nrecord - 1, sizeof (struct hex_record *),
+             ccdbg_hex_record_compar);
+       return hex;
+
+bail:
+       ccdbg_hex_file_free(hex);
+       return NULL;
+}
+
+struct hex_image *
+ccdbg_hex_image_create(struct hex_file *hex)
+{
+       struct hex_image *image;
+       struct hex_record *first, *last, *record;
+       int i;
+       uint32_t base, bound;
+       uint32_t offset;
+       int length;
+
+       first = hex->records[0];
+       last = hex->records[hex->nrecord - 2];  /* skip EOF */
+       base = (uint32_t) first->address;
+       bound = (uint32_t) last->address + (uint32_t) last->length;
+       length = bound - base;
+       image = calloc(sizeof(struct hex_image) + length, 1);
+       if (!image)
+               return NULL;
+       image->address = base;
+       image->length = length;
+       memset(image->data, 0xff, length);
+       for (i = 0; i < hex->nrecord - 1; i++) {
+               record = hex->records[i];
+               offset = record->address - base;
+               memcpy(image->data + offset, record->data, record->length);
+       }
+       return image;
+}
+
+void
+ccdbg_hex_image_free(struct hex_image *image)
+{
+       free(image);
+}
+
+int
+ccdbg_hex_image_equal(struct hex_image *a, struct hex_image *b)
+{
+       if (a->length != b->length)
+               return 0;
+       if (memcmp(a->data, b->data, a->length) != 0)
+               return 0;
+       return 1;
+}
diff --git a/lib/ccdbg-io.c b/lib/ccdbg-io.c
new file mode 100644 (file)
index 0000000..2947678
--- /dev/null
@@ -0,0 +1,211 @@
+/*
+ * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
+ */
+
+#include "ccdbg.h"
+#include <time.h>
+
+void
+ccdbg_half_clock(struct ccdbg *dbg)
+{
+       struct timespec req, rem;
+       req.tv_sec = (CC_CLOCK_US / 2) / 1000000;
+       req.tv_nsec = ((CC_CLOCK_US / 2) % 1000000) * 1000;
+       nanosleep(&req, &rem);
+}
+
+struct ccdbg *
+ccdbg_open(void)
+{
+       struct ccdbg *dbg;
+
+       dbg = calloc(sizeof (struct ccdbg), 1);
+       if (!dbg) {
+               perror("calloc");
+               return NULL;
+       }
+       dbg->clock = 1;
+#ifdef USE_KERNEL
+       dbg->fd = open("/dev/ttyUSB0", 2);
+       if (dbg->fd < 0) {
+               perror(file);
+               free(dbg);
+               return NULL;
+       }
+       cccp_init(dbg);
+       cccp_write(dbg, CC_CLOCK, CC_CLOCK);
+#else
+       cp_usb_init(dbg);
+#endif
+       dbg->clock = 1;
+       return dbg;
+}
+
+void
+ccdbg_close(struct ccdbg *dbg)
+{
+#if USE_KERNEL
+       cccp_fini(dbg);
+       close (dbg->fd);
+#else
+       cp_usb_fini(dbg);
+#endif
+       free (dbg);
+}
+
+int
+ccdbg_write(struct ccdbg *dbg, uint8_t mask, uint8_t value)
+{
+#if USE_KERNEL
+       return cccp_write(dbg, mask, value);
+#else
+       cp_usb_write(dbg, mask, value);
+       return 0;
+#endif
+}
+
+uint8_t
+ccdbg_read(struct ccdbg *dbg)
+{
+#if USE_KERNEL
+       return cccp_read_all(dbg);
+#else
+       return cp_usb_read(dbg);
+#endif
+}
+
+static char
+is_bit(uint8_t get, uint8_t mask, char on, uint8_t bit)
+{
+       if (mask&bit) {
+               if (get&bit)
+                       return on;
+               else
+                       return '.';
+       } else
+               return '-';
+}
+void
+ccdbg_print(char *format, uint8_t mask, uint8_t set)
+{
+       ccdbg_debug (CC_DEBUG_BITBANG, format,
+                    is_bit(set, mask, 'C', CC_CLOCK),
+                    is_bit(set, mask, 'D', CC_DATA),
+                    is_bit(set, mask, 'R', CC_RESET_N));
+}
+
+void
+ccdbg_send(struct ccdbg *dbg, uint8_t mask, uint8_t set)
+{
+       ccdbg_write(dbg, mask, set);
+       ccdbg_print("%c %c %c\n", mask, set);
+       ccdbg_half_clock(dbg);
+}
+
+void
+ccdbg_send_bit(struct ccdbg *dbg, uint8_t bit)
+{
+       if (bit) bit = CC_DATA;
+       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N, CC_CLOCK|bit|CC_RESET_N);
+       ccdbg_send(dbg, CC_CLOCK|CC_DATA|CC_RESET_N,          bit|CC_RESET_N);
+}
+
+void
+ccdbg_send_byte(struct ccdbg *dbg, uint8_t byte)
+{
+       int bit;
+       ccdbg_debug(CC_DEBUG_BITBANG, "#\n# Send Byte 0x%02x\n#\n", byte);
+       for (bit = 7; bit >= 0; bit--) {
+               ccdbg_send_bit(dbg, (byte >> bit) & 1);
+               if (bit == 3)
+                       ccdbg_debug(CC_DEBUG_BITBANG, "\n");
+       }
+}
+
+void
+ccdbg_send_bytes(struct ccdbg *dbg, uint8_t *bytes, int nbytes)
+{
+       while (nbytes--)
+               ccdbg_send_byte(dbg, *bytes++);
+}
+
+uint8_t
+ccdbg_recv_bit(struct ccdbg *dbg, int first)
+{
+       uint8_t mask = first ? CC_DATA : 0;
+       uint8_t read;
+
+       ccdbg_send(dbg, CC_CLOCK|mask|CC_RESET_N, CC_CLOCK|CC_DATA|CC_RESET_N);
+       read = ccdbg_read(dbg);
+       ccdbg_send(dbg, CC_CLOCK|     CC_RESET_N,                  CC_RESET_N);
+       return (read & CC_DATA) ? 1 : 0;
+}
+
+uint8_t
+ccdbg_recv_byte(struct ccdbg *dbg, int first)
+{
+       uint8_t byte = 0;
+       int     bit;
+
+       ccdbg_debug(CC_DEBUG_BITBANG, "#\n# Recv byte\n#\n");
+       for (bit = 0; bit < 8; bit++) {
+               byte = byte << 1;
+               byte |= ccdbg_recv_bit(dbg, first);
+               if (bit == 3)
+                       ccdbg_debug(CC_DEBUG_BITBANG, "\n");
+               first = 0;
+       }
+       ccdbg_debug(CC_DEBUG_BITBANG, "#\n# Recv 0x%02x\n#\n", byte);
+       return byte;
+}
+
+void
+ccdbg_recv_bytes(struct ccdbg *dbg, uint8_t *bytes, int nbytes)
+{
+       int first = 1;
+       while (nbytes--) {
+               *bytes++ = ccdbg_recv_byte(dbg, first);
+               first = 0;
+       }
+}
+
+void
+ccdbg_cmd_write(struct ccdbg *dbg, uint8_t cmd, uint8_t *data, int len)
+{
+       int     i;
+       ccdbg_send_byte(dbg, cmd);
+       for (i = 0; i < len; i++)
+               ccdbg_send_byte(dbg, data[i]);
+}
+
+uint8_t
+ccdbg_cmd_write_read8(struct ccdbg *dbg, uint8_t cmd, uint8_t *data, int len)
+{
+       uint8_t byte[1];
+       ccdbg_cmd_write(dbg, cmd, data, len);
+       ccdbg_recv_bytes(dbg, byte, 1);
+       return byte[0];
+}
+
+uint16_t
+ccdbg_cmd_write_read16(struct ccdbg *dbg, uint8_t cmd, uint8_t *data, int len)
+{
+       uint8_t byte[2];
+       ccdbg_cmd_write(dbg, cmd, data, len);
+       ccdbg_recv_bytes(dbg, byte, 2);
+       return (byte[0] << 8) | byte[1];
+}
diff --git a/lib/ccdbg-manual.c b/lib/ccdbg-manual.c
new file mode 100644 (file)
index 0000000..b83dc45
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
+ */
+
+#include "ccdbg.h"
+
+/*
+ * Manual bit-banging to debug the low level protocol
+ */
+
+static void
+get_bit(char *line, int i, char on, uint8_t bit, uint8_t *bits, uint8_t *masks)
+{
+       if (line[i] == on) {
+               *bits |= bit;
+               *masks |= bit;
+               return;
+       }
+       if (line[i] == '.') {
+               *masks |= bit;
+               return;
+       }
+       if (line[i] == '-') {
+               return;
+       }
+       fprintf(stderr, "bad line %s\n", line);
+       exit (1);
+}
+
+void
+ccdbg_manual(struct ccdbg *dbg, FILE *input)
+{
+       char    line[80];
+       uint8_t set, mask;
+
+       while (fgets(line, sizeof line, input)) {
+               if (line[0] == '#' || line[0] == '\n') {
+                       printf ("%s", line);
+                       continue;
+               }
+               set = 0;
+               mask = 0;
+               get_bit(line, 0, 'C', CC_CLOCK, &set, &mask);
+               get_bit(line, 2, 'D', CC_DATA, &set, &mask);
+               get_bit(line, 4, 'R', CC_RESET_N, &set, &mask);
+               if (mask != (CC_CLOCK|CC_DATA|CC_RESET_N)) {
+                       uint8_t read;
+                       read = ccdbg_read(dbg);
+                       ccdbg_print("\t%c %c %c", CC_CLOCK|CC_DATA|CC_RESET_N, read);
+                       if ((set & CC_CLOCK) == 0)
+                               printf ("\t%d", (read&CC_DATA) ? 1 : 0);
+                       printf ("\n");
+               }
+               ccdbg_send(dbg, mask, set);
+       }
+}
diff --git a/lib/ccdbg-memory.c b/lib/ccdbg-memory.c
new file mode 100644 (file)
index 0000000..105295d
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
+ */
+
+#include "ccdbg.h"
+
+/*
+ * Read and write arbitrary memory through the debug port
+ */
+
+static uint8_t memory_init[] = {
+       3,      MOV_DPTR_data16,        0,      0,
+#define HIGH_START     2
+#define LOW_START      3
+       0,
+};
+
+
+static uint8_t write8[] = {
+       2,      MOV_A_data,     0,
+#define DATA_BYTE      2
+       1,      MOVX_atDPTR_A,
+       1,      INC_DPTR,
+       0
+};
+
+static uint8_t read8[] = {
+       1,      MOVX_A_atDPTR,
+       1,      INC_DPTR,
+       0,
+};
+
+uint8_t
+ccdbg_write_memory(struct ccdbg *dbg, uint16_t addr, uint8_t *bytes, int nbytes)
+{
+       int i, nl = 0;
+       memory_init[HIGH_START] = addr >> 8;
+       memory_init[LOW_START] = addr;
+       (void) ccdbg_execute(dbg, memory_init);
+       for (i = 0; i < nbytes; i++) {
+               write8[DATA_BYTE] = *bytes++;
+               ccdbg_execute(dbg, write8);
+               if ((i & 0xf) == 0xf) { printf ("."); fflush(stdout); nl = 1; }
+               if ((i & 0xff) == 0xff) { printf ("\n"); nl = 0; }
+       }
+       if (nl) printf ("\n");
+       return 0;
+}
+
+uint8_t
+ccdbg_read_memory(struct ccdbg *dbg, uint16_t addr, uint8_t *bytes, int nbytes)
+{
+       int i, nl = 0;
+       memory_init[HIGH_START] = addr >> 8;
+       memory_init[LOW_START] = addr;
+       (void) ccdbg_execute(dbg, memory_init);
+       for (i = 0; i < nbytes; i++) {
+               *bytes++ = ccdbg_execute(dbg, read8);
+               if ((i & 0xf) == 0xf) { printf ("."); fflush(stdout); nl = 1; }
+               if ((i & 0xff) == 0xff) { printf ("\n"); nl = 0; }
+       }
+       if (nl) printf ("\n");
+       return 0;
+}
+
+uint8_t
+ccdbg_write_uint8(struct ccdbg *dbg, uint16_t addr, uint8_t byte)
+{
+       return ccdbg_write_memory(dbg, addr, &byte, 1);
+}
+
+uint8_t
+ccdbg_write_hex_image(struct ccdbg *dbg, struct hex_image *image, uint16_t offset)
+{
+       ccdbg_write_memory(dbg, image->address + offset, image->data, image->length);
+       return 0;
+}
+
+struct hex_image *
+ccdbg_read_hex_image(struct ccdbg *dbg, uint16_t address, uint16_t length)
+{
+       struct hex_image *image;
+       
+       image = calloc(sizeof(struct hex_image) + length, 1);
+       image->address = address;
+       image->length = length;
+       memset(image->data, 0xff, length);
+       ccdbg_read_memory(dbg, address, image->data, length);
+       return image;
+}
diff --git a/lib/ccdbg.h b/lib/ccdbg.h
new file mode 100644 (file)
index 0000000..b74d13c
--- /dev/null
@@ -0,0 +1,351 @@
+/*
+ * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
+ */
+
+#ifndef _CCDBG_H_
+#define _CCDBG_H_
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <assert.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#undef USE_KERNEL
+#ifdef USE_KERNEL
+#include <cp2101.h>
+#define CC_CLOCK       CP2101_GPIO_MASK(0)
+#define CC_DATA                CP2101_GPIO_MASK(1)
+#define CC_RESET_N     CP2101_GPIO_MASK(2)
+#else
+#define CC_CLOCK       0x1
+#define CC_DATA                0x2
+#define CC_RESET_N     0x4
+#include <usb.h>
+#endif
+
+
+/* painfully slow for now */
+#define CC_CLOCK_US    (50)
+
+#define MOV_direct_data                0x75
+#define LJMP                   0x02
+#define MOV_Rn_data(n)         (0x78 | (n))
+#define DJNZ_Rn_rel(n)         (0xd8 | (n))
+#define MOV_A_direct           0xe5
+#define MOV_direct_A           0xf5
+#define MOV_DPTR_data16                0x90
+#define MOV_A_data     0x74
+#define MOVX_atDPTR_A  0xf0
+#define MOVX_A_atDPTR  0xe0
+#define INC_DPTR       0xa3
+#define TRAP           0xa5
+
+#define SJMP           0x80
+
+#define FWT            0xAB
+#define FADDRL         0xAC
+#define FADDRH         0xAD
+#define FCTL           0xAE
+# define FCTL_BUSY     0x80
+# define FCTL_BUSY_BIT 7
+# define FCTL_SWBSY    0x40
+# define FCTL_SWBSY_BIT        6
+# define FCTL_CONTRD   0x10
+# define FCTL_WRITE    0x02
+# define FCTL_ERASE    0x01
+#define FWDATA         0xAF
+
+#define CLKCON         0xC6
+#define  CLKCON_OSC32K 0x80
+#define  CLKCON_OSC    0x40
+#define  CLKCON_TICKSPD        0x38
+#define  CLKCON_CLKSPD 0x07
+
+#define P0             0x80
+#define P1             0x90
+#define P2             0xA0
+#define P0DIR          0xFD
+#define P1DIR          0xFE
+#define P2DIR          0xFF
+
+#define SLEEP          0xBE
+
+#define JB             0x20
+
+#define ACC(bit)       (0xE0 | (bit))
+
+struct ccdbg {
+       usb_dev_handle  *usb_dev;
+       uint8_t gpio;
+#ifdef USE_KERNEL
+       int     fd;
+#endif
+       uint8_t debug_data;
+       int     clock;
+};
+
+struct hex_record {
+       uint8_t length;
+       uint16_t address;
+       uint8_t type;
+       uint8_t checksum;
+       uint8_t data[0];
+};
+
+struct hex_file {
+       int                     nrecord;
+       struct hex_record       *records[0];
+};
+
+struct hex_image {
+       uint16_t        address;
+       uint16_t        length;
+       uint8_t         data[0];
+};
+
+#define HEX_RECORD_NORMAL              0x00
+#define HEX_RECORD_EOF                 0x01
+#define HEX_RECORD_EXTENDED_ADDRESS    0x02
+
+#include "cccp.h"
+
+#define CC_CHIP_ERASE          0x14
+
+#define CC_WR_CONFIG           0x1d
+#define CC_RD_CONFIG           0x24
+# define CC_CONFIG_TIMERS_OFF          (1 << 3)
+# define CC_CONFIG_DMA_PAUSE           (1 << 2)
+# define CC_CONFIG_TIMER_SUSPEND       (1 << 1)
+# define CC_SET_FLASH_INFO_PAGE                (1 << 0)
+
+#define CC_GET_PC              0x28
+#define CC_READ_STATUS         0x34
+# define CC_STATUS_CHIP_ERASE_DONE     (1 << 7)
+# define CC_STATUS_PCON_IDLE           (1 << 6)
+# define CC_STATUS_CPU_HALTED          (1 << 5)
+# define CC_STATUS_POWER_MODE_0                (1 << 4)
+# define CC_STATUS_HALT_STATUS         (1 << 3)
+# define CC_STATUS_DEBUG_LOCKED                (1 << 2)
+# define CC_STATUS_OSCILLATOR_STABLE   (1 << 1)
+# define CC_STATUS_STACK_OVERFLOW      (1 << 0)
+
+#define CC_SET_HW_BRKPNT       0x3b
+# define CC_HW_BRKPNT_N(n)     ((n) << 3)
+# define CC_HW_BRKPNT_N_MASK   (0x3 << 3)
+# define CC_HW_BRKPNT_ENABLE   (1 << 2)
+
+#define CC_HALT                        0x44
+#define CC_RESUME              0x4c
+#define CC_DEBUG_INSTR(n)      (0x54|(n))
+#define CC_STEP_INSTR          0x5c
+#define CC_STEP_REPLACE(n)     (0x64|(n))
+#define CC_GET_CHIP_ID         0x68
+
+#define CC_DEBUG_BITBANG       0x00000001
+#define CC_DEBUG_COMMAND       0x00000002
+#define CC_DEBUG_INSTRUCTIONS  0x00000004
+
+/* ccdbg-command.c */
+void
+ccdbg_debug_mode(struct ccdbg *dbg);
+
+void
+ccdbg_reset(struct ccdbg *dbg);
+
+uint8_t
+ccdbg_chip_erase(struct ccdbg *dbg);
+
+uint8_t
+ccdbg_wr_config(struct ccdbg *dbg, uint8_t config);
+
+uint8_t
+ccdbg_rd_config(struct ccdbg *dbg);
+
+uint16_t
+ccdbg_get_pc(struct ccdbg *dbg);
+
+uint8_t
+ccdbg_read_status(struct ccdbg *dbg);
+
+uint8_t
+ccdbg_set_hw_brkpnt(struct ccdbg *dbg, uint8_t number, uint8_t enable, uint16_t addr);
+
+uint8_t
+ccdbg_halt(struct ccdbg *dbg);
+
+uint8_t
+ccdbg_resume(struct ccdbg *dbg);
+
+uint8_t
+ccdbg_debug_instr(struct ccdbg *dbg, uint8_t *instr, int nbytes);
+
+uint8_t
+ccdbg_step_instr(struct ccdbg *dbg);
+
+uint8_t
+ccdbg_step_replace(struct ccdbg *dbg, uint8_t *instr, int nbytes);
+
+uint16_t
+ccdbg_get_chip_id(struct ccdbg *dbg);
+
+uint8_t
+ccdbg_execute(struct ccdbg *dbg, uint8_t *inst);
+       
+uint8_t
+ccdbg_set_pc(struct ccdbg *dbg, uint16_t pc);
+       
+uint8_t
+ccdbg_execute_hex_image(struct ccdbg *dbg, struct hex_image *image);
+
+/* ccdbg-debug.c */
+void
+ccdbg_debug(int level, char *format, ...);
+
+void
+ccdbg_add_debug(int level);
+
+void
+ccdbg_clear_debug(int level);
+
+/* ccdbg-flash.c */
+uint8_t
+ccdbg_flash_hex_image(struct ccdbg *dbg, struct hex_image *image);
+
+/* ccdbg-hex.c */
+struct hex_file *
+ccdbg_hex_file_read(FILE *file, char *name);
+
+void
+ccdbg_hex_file_free(struct hex_file *hex);
+
+struct hex_image *
+ccdbg_hex_image_create(struct hex_file *hex);
+
+void
+ccdbg_hex_image_free(struct hex_image *image);
+
+int
+ccdbg_hex_image_equal(struct hex_image *a, struct hex_image *b);
+
+/* ccdbg-io.c */
+void
+ccdbg_half_clock(struct ccdbg *dbg);
+
+int
+ccdbg_write(struct ccdbg *dbg, uint8_t mask, uint8_t value);
+
+uint8_t
+ccdbg_read(struct ccdbg *dbg);
+
+struct ccdbg *
+ccdbg_open(void);
+
+void
+ccdbg_close(struct ccdbg *dbg);
+
+void
+ccdbg_clock_1_0(struct ccdbg *dbg);
+
+void
+ccdbg_clock_0_1(struct ccdbg *dbg);
+
+void
+ccdbg_write_bit(struct ccdbg *dbg, uint8_t bit);
+
+void
+ccdbg_write_byte(struct ccdbg *dbg, uint8_t byte);
+
+uint8_t
+ccdbg_read_bit(struct ccdbg *dbg);
+
+uint8_t
+ccdbg_read_byte(struct ccdbg *dbg);
+
+void
+ccdbg_cmd_write(struct ccdbg *dbg, uint8_t cmd, uint8_t *data, int len);
+
+uint8_t
+ccdbg_cmd_write_read8(struct ccdbg *dbg, uint8_t cmd, uint8_t *data, int len);
+
+uint16_t
+ccdbg_cmd_write_read16(struct ccdbg *dbg, uint8_t cmd, uint8_t *data, int len);
+
+void
+ccdbg_send(struct ccdbg *dbg, uint8_t mask, uint8_t set);
+
+void
+ccdbg_send_bit(struct ccdbg *dbg, uint8_t bit);
+
+void
+ccdbg_send_byte(struct ccdbg *dbg, uint8_t byte);
+
+void
+ccdbg_send_bytes(struct ccdbg *dbg, uint8_t *bytes, int nbytes);
+
+uint8_t
+ccdbg_recv_bit(struct ccdbg *dbg, int first);
+
+uint8_t
+ccdbg_recv_byte(struct ccdbg *dbg, int first);
+
+void
+ccdbg_recv_bytes(struct ccdbg *dbg, uint8_t *bytes, int nbytes);
+
+void
+ccdbg_print(char *format, uint8_t mask, uint8_t set);
+
+/* ccdbg-manual.c */
+
+void
+ccdbg_manual(struct ccdbg *dbg, FILE *input);
+
+/* ccdbg-memory.c */
+uint8_t
+ccdbg_write_memory(struct ccdbg *dbg, uint16_t addr, uint8_t *bytes, int nbytes);
+
+uint8_t
+ccdbg_read_memory(struct ccdbg *dbg, uint16_t addr, uint8_t *bytes, int nbytes);
+
+uint8_t
+ccdbg_write_uint8(struct ccdbg *dbg, uint16_t addr, uint8_t byte);
+
+uint8_t
+ccdbg_write_hex_image(struct ccdbg *dbg, struct hex_image *image, uint16_t offset);
+
+struct hex_image *
+ccdbg_read_hex_image(struct ccdbg *dbg, uint16_t address, uint16_t length);
+
+/* cp-usb.c */
+void
+cp_usb_init(struct ccdbg *dbg);
+
+void
+cp_usb_fini(struct ccdbg *dbg);
+
+void
+cp_usb_write(struct ccdbg *dbg, uint8_t mask, uint8_t value);
+
+uint8_t
+cp_usb_read(struct ccdbg *dbg);
+
+#endif /* _CCDBG_H_ */
diff --git a/lib/cp-usb.c b/lib/cp-usb.c
new file mode 100644 (file)
index 0000000..61b684a
--- /dev/null
@@ -0,0 +1,140 @@
+/*
+ * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
+ */
+
+#include "ccdbg.h"
+#include <usb.h>
+
+#define CP2101_UART    0x00
+#define UART_ENABLE    0x0001
+#define UART_DISABLE   0x0000
+#define REQTYPE_HOST_TO_DEVICE  0x41
+#define REQTYPE_DEVICE_TO_HOST  0xc1
+
+static int
+cp_usb_gpio_get(struct ccdbg *dbg, uint8_t *gpio_get)
+{
+       return usb_control_msg(dbg->usb_dev,            /* dev */
+                              0xc0,                    /* request */
+                              0xff,                    /* requesttype */
+                              0x00c2,                  /* value */
+                              0,                       /* index */
+                              (char *) gpio_get,       /* bytes */
+                              1,                       /* size */
+                              300);                    /* timeout */
+}
+
+static int
+cp_usb_gpio_set(struct ccdbg *dbg, uint8_t mask, uint8_t value)
+{
+       uint16_t gpio_set = ((uint16_t) value << 8) | mask;
+
+       return usb_control_msg(dbg->usb_dev,            /* dev */
+                              0x40,                    /* request */
+                              0xff,                    /* requesttype */
+                              0x37e1,                  /* value */
+                              gpio_set,                /* index */
+                              NULL,                    /* bytes */
+                              0,                       /* size */
+                              300);                    /* timeout */
+}
+
+static int
+cp_usb_uart_enable_disable(struct ccdbg *dbg, uint16_t enable)
+{
+       return usb_control_msg(dbg->usb_dev,
+                              CP2101_UART,
+                              REQTYPE_HOST_TO_DEVICE,
+                              enable,
+                              0,
+                              NULL,
+                              0,
+                              300);
+}
+
+void
+cp_usb_init(struct ccdbg *dbg)
+{
+       usb_dev_handle *dev_handle;
+       struct usb_device *dev = NULL;
+       struct usb_bus *bus, *busses;
+       int interface;
+       int ret;
+       uint8_t gpio;
+       
+       usb_init();
+       usb_find_busses();
+       usb_find_devices();
+       
+       busses = usb_get_busses();
+       for (bus = busses; bus; bus = bus->next) {
+               for (dev = bus->devices; dev; dev = dev->next) {
+                       if (dev->descriptor.idVendor == 0x10c4 &&
+                           dev->descriptor.idProduct == 0xea60)
+                               break;
+               }
+               if (dev)
+                       break;
+       }
+       if (!dev){
+               perror("No CP2103 found");
+               exit(1);
+       }
+       interface = 0;
+       dev_handle = usb_open(dev);
+       usb_detach_kernel_driver_np(dev_handle, interface);
+       usb_claim_interface(dev_handle, interface);
+       dbg->usb_dev = dev_handle;
+       ret = cp_usb_uart_enable_disable(dbg, UART_DISABLE);
+       dbg->gpio = 0xf;
+       ret = cp_usb_gpio_set(dbg, 0xf, dbg->gpio);
+       ret = cp_usb_gpio_get(dbg, &gpio);
+}
+
+void
+cp_usb_fini(struct ccdbg *dbg)
+{
+       cp_usb_uart_enable_disable(dbg, UART_DISABLE);
+       usb_close(dbg->usb_dev);
+}
+
+void
+cp_usb_write(struct ccdbg *dbg, uint8_t mask, uint8_t value)
+{
+       uint8_t new_gpio;
+       int ret;
+
+       new_gpio = (dbg->gpio & ~mask) | (value & mask);
+       if (new_gpio != dbg->gpio) {
+               ret = cp_usb_gpio_set(dbg, new_gpio ^ dbg->gpio, new_gpio);
+               if (ret < 0)
+                       perror("gpio_set");
+               dbg->gpio = new_gpio;
+       }
+}
+
+uint8_t
+cp_usb_read(struct ccdbg *dbg)
+{
+       int ret;
+       uint8_t gpio;
+
+       ret = cp_usb_gpio_get(dbg, &gpio);
+       if (ret < 0)
+               perror("gpio_set");
+       return gpio;
+}
diff --git a/p1_1 b/p1_1
deleted file mode 100644 (file)
index 08d8ab5..0000000
--- a/p1_1
+++ /dev/null
@@ -1,360 +0,0 @@
-#
-# Debug mode - drive RESET_N low for two clock cycles
-#
-C D R
-. D .
-C D .
-. D .
-C D .
-. D R
-
-#
-# Halt 0x44
-#
-
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-C . R  0
-. . R
-
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-C . R  0
-. . R
-
-# status byte
-
-C D R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-#
-# DEBUG_INSTR
-#
-
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-C D R  1
-. D R
-
-C . R  0
-. . R
-C D R  1
-. D R
-C D R  1
-. D R
-C D R  1
-. D R
-
-# MOV 0xfe, 0x02
-
-# 0x75 0x02 0xfe
-
-# 0x75
-C . R  0
-. . R
-C D R  1
-. D R
-C D R  1
-. D R
-C D R  1
-. D R
-
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-C D R  1
-. D R
-
-# 0xfe
-C D R  1
-. D R
-C D R  1
-. D R
-C D R  1
-. D R
-C D R  1
-. D R
-
-C D R  1
-. D R
-C D R  1
-. D R
-C D R  1
-. D R
-C . R  0
-. . R
-
-# 0x02
-C . R  0
-. . R
-C . R  0
-. . R
-C . R  0
-. . R
-C . R  0
-. . R
-
-C . R  0
-. . R
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-
-# status byte
-
-C D R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-#
-# DEBUG_INSTR
-#
-
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-C D R  1
-. D R
-
-C . R  0
-. . R
-C D R  1
-. D R
-C D R  1
-. D R
-C D R  1
-. D R
-
-# MOV 0x90, 0xfd
-# 0x75 0xfd 0x90
-
-# 0x75
-C . R  0
-. . R
-C D R  1
-. D R
-C D R  1
-. D R
-C D R  1
-. D R
-
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-C D R  1
-. D R
-
-# 0x90
-C D R  1
-. D R
-C . R  0
-. . R
-C . R  0
-. . R
-C D R  1
-. D R
-
-C . R  0
-. . R
-C . R  0
-. . R
-C . R  0
-. . R
-C . R  0
-. . R
-
-# 0xff
-C D R  1
-. D R
-C D R  1
-. D R
-C D R  1
-. D R
-C D R  1
-. D R
-
-C D R  1
-. D R
-C D R  1
-. D R
-C D R  1
-. D R
-C D R  1
-. D R
-
-# status byte
-
-C D R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-#
-# DEBUG_INSTR
-#
-
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-C D R  1
-. D R
-
-C . R  0
-. . R
-C D R  1
-. D R
-C D R  1
-. D R
-C D R  1
-. D R
-
-# MOV 0x90, 0xfd
-# 0x75 0xfd 0x90
-
-# 0x75
-C . R  0
-. . R
-C D R  1
-. D R
-C D R  1
-. D R
-C D R  1
-. D R
-
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-C D R  1
-. D R
-
-# 0x90
-C D R  1
-. D R
-C . R  0
-. . R
-C . R  0
-. . R
-C D R  1
-. D R
-
-C . R  0
-. . R
-C . R  0
-. . R
-C . R  0
-. . R
-C . R  0
-. . R
-
-# 0xfd
-C D R  1
-. D R
-C D R  1
-. D R
-C D R  1
-. D R
-C D R  1
-. D R
-
-C D R  1
-. D R
-C D R  1
-. D R
-C . R  0
-. . R
-C D R  1
-. D R
-
-# status byte
-
-C D R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-C D R
diff --git a/rd_config b/rd_config
deleted file mode 100644 (file)
index e2d43f1..0000000
--- a/rd_config
+++ /dev/null
@@ -1,55 +0,0 @@
-#
-# Debug mode - drive RESET_N low for two clock cycles
-#
-C D R
-. D .
-C D .
-. D .
-C D .
-. D R
-
-#
-# RD_CONFIG
-#
-
-C . R  0
-. . R
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-C . R  0
-. . R
-
-#
-# Now read for a while
-#
-
-C D R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-C D R
diff --git a/read_status b/read_status
deleted file mode 100644 (file)
index 3ae4605..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-#
-# Debug mode - drive RESET_N low for two clock cycles
-#
-C D R
-. D .
-C D .
-. D .
-C D .
-. D R
-
-#
-# READ_STATUS
-#
-
-C . R  0
-. . R
-C . R  0
-. . R
-C D R  1
-. D R
-C D R  1
-. D R
-
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-C . R  0
-. . R
-
-#
-# Now read for a while
-#
-
-C D R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-C - R
-. - R
-
-C D R
diff --git a/reset b/reset
deleted file mode 100644 (file)
index a32c8be..0000000
--- a/reset
+++ /dev/null
@@ -1,5 +0,0 @@
-# reset
-C D R
-C D R
-C D R
-C D R
diff --git a/target/blink/Makefile b/target/blink/Makefile
new file mode 100644 (file)
index 0000000..1f18f52
--- /dev/null
@@ -0,0 +1,44 @@
+CC=sdcc
+NO_OPT=--nogcse --noinvariant --noinduction --nojtbound --noloopreverse \
+       --nolabelopt --nooverlay --peep-asm
+DEBUG=--debug
+
+CFLAGS=--model-large $(DEBUG) --less-pedantic \
+       --no-peep --int-long-reent --float-reent \
+       --data-loc 0x30
+
+LDFLAGS=-L/usr/share/sdcc/lib/large --out-fmt-ihx
+LDFLAGS_RAM=$(LDFLAGS) --code-loc 0xf000 --xram-loc 0xf400 --xram-size 1024
+
+LDFLAGS_FLASH=$(LDFLAGS) --code-loc 0x0000 --xram-loc 0xf000 --xram-size 1024
+
+SRC=blink.c
+ADB=$(SRC:.c=.adb)
+ASM=$(SRC:.c=.asm)
+LNK=$(SRC:.c=.lnk)
+LST=$(SRC:.c=.lst)
+REL=$(SRC:.c=.rel)
+RST=$(SRC:.c=.rst)
+SYM=$(SRC:.c=.sym)
+
+PROGS=blink-flash.ihx blink-ram.ihx
+PCDB=$(PROGS:.ihx=.cdb)
+PLNK=$(PROGS:.ihx=.lnk)
+PMAP=$(PROGS:.ihx=.map)
+PMEM=$(PROGS:.ihx=.mem)
+PAOM=$(PROGS:.ihx=)
+
+%.rel : %.c
+       $(CC) -c $(CFLAGS) -o$*.rel $<
+
+all: $(PROGS)
+
+blink-ram.ihx: $(REL) Makefile
+       $(CC) $(LDFLAGS_RAM) $(CFLAGS) -o blink-ram.ihx $(REL)
+       $(CC) $(LDFLAGS_FLASH) $(CFLAGS) -o blink-flash.ihx $(REL)
+
+blink-flash.ihx: blink-ram.ihx
+
+clean:
+       rm -f $(ADB) $(ASM) $(LNK) $(LST) $(REL) $(RST) $(SYM)
+       rm -f $(PROGS) $(PCDB) $(PLNK) $(PMAP) $(PMEM) $(PAOM)
diff --git a/target/blink/blink.c b/target/blink/blink.c
new file mode 100644 (file)
index 0000000..907c82b
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
+ */
+
+sfr at 0x80 P0;
+sfr at 0x90 P1;
+sfr at 0xA0 P2;
+sfr at 0xC6 CLKCON;
+
+sfr at 0xF1 PERCFG;
+sfr at 0xF2 ADCCFG;
+sfr at 0xF3 P0SEL;
+sfr at 0xF4 P1SEL;
+sfr at 0xF5 P2SEL;
+
+sfr at 0xFD P0DIR;
+sfr at 0xFE P1DIR;
+sfr at 0xFF P2DIR;
+sfr at 0x8F P0INP;
+sfr at 0xF6 P1INP;
+sfr at 0xF7 P2INP;
+
+sfr at 0x89 P0IFG;
+sfr at 0x8A P1IFG;
+sfr at 0x8B P2IFG;
+
+#define nop()  _asm nop _endasm;
+
+void
+delay (unsigned char n)
+{
+       unsigned char i = 0, j = 0;
+
+       n <<= 1;
+       while (--n != 0)
+               while (--j != 0)
+                       while (--i != 0)
+                               nop();
+}
+
+void
+dit() {
+       P1 = 0xff;
+       delay(1);
+       P1 = 0xfd;
+       delay(1);
+}
+
+void
+dah () {
+       P1 = 0xff;
+       delay(3);
+       P1 = 0xfd;
+       delay(1);
+}
+
+void
+charspace () {
+       delay(2);
+}
+
+void
+wordspace () {
+       delay(8);
+}
+
+#define _ dit();
+#define ___ dah();
+#define C charspace();
+#define W wordspace();
+
+main ()
+{
+       CLKCON = 0;
+       /* Set p1_1 to output */
+       P1DIR = 0x02;
+       P1INP = 0x00;
+       P2INP = 0x00;
+       for (;;) {
+               ___ _ ___ _ C ___ ___ _ ___ W   /* cq */
+               ___ _ _ C _ W                   /* de */
+               ___ _ ___ C ___ _ _ C           /* kd */
+               ___ ___ _ _ _ C _ _ _ C         /* 7s */
+               ___ ___ _ ___ C ___ ___ _ W     /* qg */
+       }
+}
diff --git a/target/isr.c b/target/isr.c
new file mode 100644 (file)
index 0000000..43aedc2
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * Copyright Â© 2008 Keith Packard <keithp@keithp.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.
+ */
+
+void rftxrx_isr (void) __interrupt(0) __using(1)
+{
+}
+
+void adc_isr (void) __interrupt(1) __using(1)
+{
+}
+
+void urx0_isr (void) __interrupt(2) __using(1)
+{
+}
+
+void urx1_isr (void) __interrupt(3) __using(1)
+{
+}
+
+void enc_isr (void) __interrupt(4) __using(1)
+{
+}
+
+void st_isr (void) __interrupt(5) __using(1)
+{
+}
+
+void usb_isr (void) __interrupt(6) __using(1)
+{
+}
+
+void utx0_isr (void) __interrupt(7) __using(1)
+{
+}
+
+void dma_isr (void) __interrupt(8) __using(1)
+{
+}
+
+void t1_isr (void) __interrupt(9) __using(1)
+{
+}
+
+void t2_isr (void) __interrupt(10) __using(1)
+{
+}
+
+void t3_isr (void) __interrupt(11) __using(1)
+{
+}
+
+void t4_isr (void) __interrupt(12) __using(1)
+{
+}
+
+void p0int_isr (void) __interrupt(13) __using(1)
+{
+}
+
+void utx1_isr (void) __interrupt(14) __using(1)
+{
+}
+
+void p1int_isr (void) __interrupt(15) __using(1)
+{
+}
+
+void rf_isr (void) __interrupt(16) __using(1)
+{
+}
+
+void wdt_isr (void) __interrupt(17) __using(1)
+{
+}
+
diff --git a/tests/blink-tiny b/tests/blink-tiny
new file mode 100644 (file)
index 0000000..fd075e5
--- /dev/null
@@ -0,0 +1,5 @@
+:03 0000 00 75 FE 02 88
+:03 0003 00 75 90 FF F6
+:02 0006 00 80 FE    7A
+:02 0008 00 80 FE    78
+:00 0000 01          FF
diff --git a/tests/blink-tiny-ram b/tests/blink-tiny-ram
new file mode 100644 (file)
index 0000000..018716d
--- /dev/null
@@ -0,0 +1,4 @@
+:03 F000 00 75 FE 02 98
+:03 F003 00 75 90 FF 06
+:02 F006 00 80 FE    8A
+:00000001FF
diff --git a/tests/chip_id b/tests/chip_id
new file mode 100644 (file)
index 0000000..b3ecf31
--- /dev/null
@@ -0,0 +1,71 @@
+#
+# Debug mode - drive RESET_N low for two clock cycles
+#
+C D R
+. D .
+C D .
+. D .
+C D .
+. D R
+
+#
+# GET_CHIP_ID
+
+C . R  0
+. . R
+C D R  1
+. D R
+C D R  1
+. D R
+C . R  0
+. . R
+
+C D R  1
+. D R
+C . R  0
+. . R
+C . R  0
+. . R
+C . R  0
+. . R
+
+#
+# start reading again
+
+C D R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+C D R
diff --git a/tests/debug_mode b/tests/debug_mode
new file mode 100644 (file)
index 0000000..fe25bfe
--- /dev/null
@@ -0,0 +1,11 @@
+#
+# Debug mode - drive RESET_N low for two clock cycles
+#
+
+C D R
+. D .
+C D .
+. D .
+C D .
+. D R
+
diff --git a/tests/get_pc b/tests/get_pc
new file mode 100644 (file)
index 0000000..13bcba1
--- /dev/null
@@ -0,0 +1,71 @@
+#
+# Debug mode - drive RESET_N low for two clock cycles
+#
+C D R
+. D .
+C D .
+. D .
+C D .
+. D R
+
+#
+# GET_STATUS
+#
+
+C . R  0
+. . R
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+
+C D R  1
+. D R
+C . R  0
+. . R
+C . R  0
+. . R
+C . R  0
+. . R
+
+#
+# Now read for a while
+#
+
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
diff --git a/tests/get_status b/tests/get_status
new file mode 100644 (file)
index 0000000..1d4ff03
--- /dev/null
@@ -0,0 +1,329 @@
+#
+# Debug mode - drive RESET_N low for two clock cycles
+#
+C D R
+. D .
+C D .
+. D .
+C D .
+. D R
+
+#
+# Halt 0x44
+#
+
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+C . R  0
+. . R
+
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+C . R  0
+. . R
+
+# status byte
+
+C D R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+# Resume 0x4c
+#
+
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+C . R  0
+. . R
+
+C D R  1
+. D R
+C D R  1
+. D R
+C . R  0
+. . R
+C . R  0
+. . R
+
+# status byte
+
+C D R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+#
+# READ_STATUS
+#
+
+C . R  0
+. . R
+C . R  0
+. . R
+C D R  1
+. D R
+C D R  1
+. D R
+
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+C . R  0
+. . R
+
+#
+# status
+#
+
+C D R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+#
+# READ_STATUS
+#
+
+C . R  0
+. . R
+C . R  0
+. . R
+C D R  1
+. D R
+C D R  1
+. D R
+
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+C . R  0
+. . R
+
+#
+# status
+#
+
+C D R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+#
+# READ_STATUS
+#
+
+C . R  0
+. . R
+C . R  0
+. . R
+C D R  1
+. D R
+C D R  1
+. D R
+
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+C . R  0
+. . R
+
+#
+# status
+#
+
+C D R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+#
+# Halt 0x44
+#
+
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+C . R  0
+. . R
+
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+C . R  0
+. . R
+
+# status byte
+
+C D R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+#
+# READ_STATUS
+#
+
+C . R  0
+. . R
+C . R  0
+. . R
+C D R  1
+. D R
+C D R  1
+. D R
+
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+C . R  0
+. . R
+
+#
+# status
+#
+
+C D R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
diff --git a/tests/half_phase b/tests/half_phase
new file mode 100644 (file)
index 0000000..3ca4a30
--- /dev/null
@@ -0,0 +1,71 @@
+#
+# Debug mode - drive RESET_N low for two clock cycles
+#
+C D R
+. D .
+C D .
+. D .
+C D .
+. D R
+
+#
+# GET_STATUS
+#
+
+C . R  0
+. . R
+C . R  0
+. . R
+C D R  1
+. D R
+C D R  1
+. D R
+
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+C . R  0
+. . R
+
+#
+# Now read for a while
+#
+
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
diff --git a/tests/in b/tests/in
new file mode 100644 (file)
index 0000000..93341e3
--- /dev/null
+++ b/tests/in
@@ -0,0 +1,146 @@
+#
+# Debug mode - drive RESET_N low for two clock cycles
+#
+C D R
+. D .
+C D .
+. D .
+C D .
+. D .
+
+#C D R
+#. D R
+#C D R
+#. D R
+#C D R
+#. D R
+#C D R
+#. D R
+
+#
+# Ok, we're in debug mode now
+#
+
+#
+# GET_CHIP_ID
+
+#C . R 0
+#. . R
+#C D R 1
+#. D R
+#C D R 1
+#. D R
+#C . R 0
+#. . R
+#
+#C D R 1
+#. D R
+#C . R 0
+#. . R
+#C . R 0
+#. . R
+#C . R 0
+#. . R
+#
+##
+## Read the chip id
+##
+#
+#C D R
+#. D R
+#C D R
+#. D R
+#C D R
+#. D R
+#C D R
+#. D R
+#
+#C D R
+#. D R
+#C D R
+#. D R
+#C D R
+#. D R
+#C D R
+#. D R
+#
+#C D R
+#. D R
+#C D R
+#. D R
+#C D R
+#. D R
+#C D R
+#. D R
+#
+#C D R
+#. D R
+#C D R
+#. D R
+#C D R
+#. D R
+#C D R
+#. D R
+#
+
+#
+# GET_STATUS
+#
+
+C . R  0
+. . R
+C . R  0
+. . R
+C D R  1
+. D R
+C D R  1
+. D R
+
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+C . R  0
+. . R
+
+#
+# Now read for a while
+#
+
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
diff --git a/tests/p1_1 b/tests/p1_1
new file mode 100644 (file)
index 0000000..08d8ab5
--- /dev/null
@@ -0,0 +1,360 @@
+#
+# Debug mode - drive RESET_N low for two clock cycles
+#
+C D R
+. D .
+C D .
+. D .
+C D .
+. D R
+
+#
+# Halt 0x44
+#
+
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+C . R  0
+. . R
+
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+C . R  0
+. . R
+
+# status byte
+
+C D R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+#
+# DEBUG_INSTR
+#
+
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+C D R  1
+. D R
+
+C . R  0
+. . R
+C D R  1
+. D R
+C D R  1
+. D R
+C D R  1
+. D R
+
+# MOV 0xfe, 0x02
+
+# 0x75 0x02 0xfe
+
+# 0x75
+C . R  0
+. . R
+C D R  1
+. D R
+C D R  1
+. D R
+C D R  1
+. D R
+
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+C D R  1
+. D R
+
+# 0xfe
+C D R  1
+. D R
+C D R  1
+. D R
+C D R  1
+. D R
+C D R  1
+. D R
+
+C D R  1
+. D R
+C D R  1
+. D R
+C D R  1
+. D R
+C . R  0
+. . R
+
+# 0x02
+C . R  0
+. . R
+C . R  0
+. . R
+C . R  0
+. . R
+C . R  0
+. . R
+
+C . R  0
+. . R
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+
+# status byte
+
+C D R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+#
+# DEBUG_INSTR
+#
+
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+C D R  1
+. D R
+
+C . R  0
+. . R
+C D R  1
+. D R
+C D R  1
+. D R
+C D R  1
+. D R
+
+# MOV 0x90, 0xfd
+# 0x75 0xfd 0x90
+
+# 0x75
+C . R  0
+. . R
+C D R  1
+. D R
+C D R  1
+. D R
+C D R  1
+. D R
+
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+C D R  1
+. D R
+
+# 0x90
+C D R  1
+. D R
+C . R  0
+. . R
+C . R  0
+. . R
+C D R  1
+. D R
+
+C . R  0
+. . R
+C . R  0
+. . R
+C . R  0
+. . R
+C . R  0
+. . R
+
+# 0xff
+C D R  1
+. D R
+C D R  1
+. D R
+C D R  1
+. D R
+C D R  1
+. D R
+
+C D R  1
+. D R
+C D R  1
+. D R
+C D R  1
+. D R
+C D R  1
+. D R
+
+# status byte
+
+C D R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+#
+# DEBUG_INSTR
+#
+
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+C D R  1
+. D R
+
+C . R  0
+. . R
+C D R  1
+. D R
+C D R  1
+. D R
+C D R  1
+. D R
+
+# MOV 0x90, 0xfd
+# 0x75 0xfd 0x90
+
+# 0x75
+C . R  0
+. . R
+C D R  1
+. D R
+C D R  1
+. D R
+C D R  1
+. D R
+
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+C D R  1
+. D R
+
+# 0x90
+C D R  1
+. D R
+C . R  0
+. . R
+C . R  0
+. . R
+C D R  1
+. D R
+
+C . R  0
+. . R
+C . R  0
+. . R
+C . R  0
+. . R
+C . R  0
+. . R
+
+# 0xfd
+C D R  1
+. D R
+C D R  1
+. D R
+C D R  1
+. D R
+C D R  1
+. D R
+
+C D R  1
+. D R
+C D R  1
+. D R
+C . R  0
+. . R
+C D R  1
+. D R
+
+# status byte
+
+C D R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+C D R
diff --git a/tests/rd_config b/tests/rd_config
new file mode 100644 (file)
index 0000000..e2d43f1
--- /dev/null
@@ -0,0 +1,55 @@
+#
+# Debug mode - drive RESET_N low for two clock cycles
+#
+C D R
+. D .
+C D .
+. D .
+C D .
+. D R
+
+#
+# RD_CONFIG
+#
+
+C . R  0
+. . R
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+C . R  0
+. . R
+
+#
+# Now read for a while
+#
+
+C D R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+C D R
diff --git a/tests/read_status b/tests/read_status
new file mode 100644 (file)
index 0000000..3ae4605
--- /dev/null
@@ -0,0 +1,55 @@
+#
+# Debug mode - drive RESET_N low for two clock cycles
+#
+C D R
+. D .
+C D .
+. D .
+C D .
+. D R
+
+#
+# READ_STATUS
+#
+
+C . R  0
+. . R
+C . R  0
+. . R
+C D R  1
+. D R
+C D R  1
+. D R
+
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+C . R  0
+. . R
+
+#
+# Now read for a while
+#
+
+C D R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+C - R
+. - R
+
+C D R
diff --git a/tests/reset b/tests/reset
new file mode 100644 (file)
index 0000000..a32c8be
--- /dev/null
@@ -0,0 +1,5 @@
+# reset
+C D R
+C D R
+C D R
+C D R
diff --git a/tests/wr_config b/tests/wr_config
new file mode 100644 (file)
index 0000000..1ee3162
--- /dev/null
@@ -0,0 +1,116 @@
+#
+# Debug mode - drive RESET_N low for two clock cycles
+#
+C D R
+. D .
+C D .
+. D .
+C D .
+. D R
+
+#
+# WR_CONFIG
+#
+
+C . R  0
+. . R
+C . R  0
+. . R
+C . R  0
+. . R
+C D R  1
+. D R
+
+C D R  1
+. D R
+C D R  1
+. D R
+C . R  0
+. . R
+C D R  1
+. D R
+
+C . R  0
+. . R
+C . R  0
+. . R
+C . R  0
+. . R
+C . R  0
+. . R
+
+C D R  1
+. D R
+C . R  0
+. . R
+C . R  0
+. . R
+C . R  0
+. . R
+
+#
+# Now read for a while
+#
+
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+
+
+#
+# RD_CONFIG
+#
+
+C . R  0
+. . R
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+
+C . R  0
+. . R
+C D R  1
+. D R
+C . R  0
+. . R
+C . R  0
+. . R
+
+#
+# Now read for a while
+#
+
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
+C D R
+. D R
diff --git a/wr_config b/wr_config
deleted file mode 100644 (file)
index 1ee3162..0000000
--- a/wr_config
+++ /dev/null
@@ -1,116 +0,0 @@
-#
-# Debug mode - drive RESET_N low for two clock cycles
-#
-C D R
-. D .
-C D .
-. D .
-C D .
-. D R
-
-#
-# WR_CONFIG
-#
-
-C . R  0
-. . R
-C . R  0
-. . R
-C . R  0
-. . R
-C D R  1
-. D R
-
-C D R  1
-. D R
-C D R  1
-. D R
-C . R  0
-. . R
-C D R  1
-. D R
-
-C . R  0
-. . R
-C . R  0
-. . R
-C . R  0
-. . R
-C . R  0
-. . R
-
-C D R  1
-. D R
-C . R  0
-. . R
-C . R  0
-. . R
-C . R  0
-. . R
-
-#
-# Now read for a while
-#
-
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-
-
-#
-# RD_CONFIG
-#
-
-C . R  0
-. . R
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-
-C . R  0
-. . R
-C D R  1
-. D R
-C . R  0
-. . R
-C . R  0
-. . R
-
-#
-# Now read for a while
-#
-
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R
-C D R
-. D R