From: Keith Packard Date: Sat, 20 Dec 2008 05:11:45 +0000 (-0800) Subject: Autotools. X-Git-Tag: 0.5~58^2~86 X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=commitdiff_plain;h=9025eb792861930e6af918d2727c4f5d97a69936;hp=ab909db28307cfbf7ee8d692506bb79d7ffd627a Autotools. Signed-off-by: Keith Packard --- diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 00000000..a5b6500c --- /dev/null +++ b/AUTHORS @@ -0,0 +1,2 @@ +Keith Packard +Bdale Garbee diff --git a/COPYING b/COPYING new file mode 100644 index 00000000..10828e06 --- /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. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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. + + , 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 index 00000000..e69de29b diff --git a/INSTALL b/INSTALL new file mode 100644 index 00000000..23e5f25d --- /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 index 9603dc22..00000000 --- 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 index 00000000..71aee980 --- /dev/null +++ b/Makefile.am @@ -0,0 +1 @@ +SUBDIRS=lib ccload target/blink diff --git a/NEWS b/NEWS new file mode 100644 index 00000000..e69de29b diff --git a/README b/README new file mode 100644 index 00000000..e69de29b diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 00000000..4e8b11ba --- /dev/null +++ b/autogen.sh @@ -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 index fd075e57..00000000 --- a/blink-tiny +++ /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 index 018716d5..00000000 --- a/blink-tiny-ram +++ /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 index 1f18f529..00000000 --- a/blink/Makefile +++ /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 index 907c82b8..00000000 --- a/blink/blink.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright © 2008 Keith Packard - * - * 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 index 99a0d81f..00000000 --- a/cccp.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright © 2008 Keith Packard - * - * 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 index eecdbb49..00000000 --- a/cccp.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright © 2008 Keith Packard - * - * 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 index 38c006cb..00000000 --- a/ccdbg-command.c +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright © 2008 Keith Packard - * - * 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 index 2e67bc8d..00000000 --- a/ccdbg-debug.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright © 2008 Keith Packard - * - * 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 - -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 index aa2c5187..00000000 --- a/ccdbg-flash.c +++ /dev/null @@ -1,337 +0,0 @@ -/* - * Copyright © 2008 Keith Packard - * - * 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 index 86478da0..00000000 --- a/ccdbg-hex.c +++ /dev/null @@ -1,330 +0,0 @@ -/* - * Copyright © 2008 Keith Packard - * - * 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 -#include - -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 index b78e3aad..00000000 --- a/ccdbg-io.c +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Copyright © 2008 Keith Packard - * - * 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 - -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 index b83dc450..00000000 --- a/ccdbg-manual.c +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright © 2008 Keith Packard - * - * 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 index 105295db..00000000 --- a/ccdbg-memory.c +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright © 2008 Keith Packard - * - * 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 index c144a06a..00000000 --- a/ccdbg.c +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright © 2008 Keith Packard - * - * 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, ""); - 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 index 3bb5722f..00000000 --- a/ccdbg.h +++ /dev/null @@ -1,351 +0,0 @@ -/* - * Copyright © 2008 Keith Packard - * - * 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#undef USE_KERNEL -#ifdef USE_KERNEL -#include -#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 -#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 index 00000000..f54f4aaa --- /dev/null +++ b/ccload/Makefile.am @@ -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 index 00000000..b4bb1443 --- /dev/null +++ b/ccload/ccload.c @@ -0,0 +1,78 @@ +/* + * Copyright © 2008 Keith Packard + * + * 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 \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 index b3ecf314..00000000 --- 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 index 3822e8cd..00000000 --- a/cp-usb.c +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright © 2008 Keith Packard - * - * 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 - -#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 index fe25bfef..00000000 --- a/debug_mode +++ /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 index 13bcba15..00000000 --- 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 index 1d4ff03d..00000000 --- a/get_status +++ /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 index 3ca4a303..00000000 --- a/half_phase +++ /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 index 93341e32..00000000 --- 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 index 43aedc29..00000000 --- a/isr.c +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright © 2008 Keith Packard - * - * 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 index 00000000..a5e5932b --- /dev/null +++ b/lib/Makefile.am @@ -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 index 00000000..99a0d81f --- /dev/null +++ b/lib/cccp.c @@ -0,0 +1,100 @@ +/* + * Copyright © 2008 Keith Packard + * + * 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 index 00000000..eecdbb49 --- /dev/null +++ b/lib/cccp.h @@ -0,0 +1,41 @@ +/* + * Copyright © 2008 Keith Packard + * + * 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 index 00000000..38c006cb --- /dev/null +++ b/lib/ccdbg-command.c @@ -0,0 +1,182 @@ +/* + * Copyright © 2008 Keith Packard + * + * 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 index 00000000..2e67bc8d --- /dev/null +++ b/lib/ccdbg-debug.c @@ -0,0 +1,47 @@ +/* + * Copyright © 2008 Keith Packard + * + * 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 + +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 index 00000000..aa2c5187 --- /dev/null +++ b/lib/ccdbg-flash.c @@ -0,0 +1,337 @@ +/* + * Copyright © 2008 Keith Packard + * + * 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 index 00000000..86478da0 --- /dev/null +++ b/lib/ccdbg-hex.c @@ -0,0 +1,330 @@ +/* + * Copyright © 2008 Keith Packard + * + * 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 +#include + +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 index 00000000..29476785 --- /dev/null +++ b/lib/ccdbg-io.c @@ -0,0 +1,211 @@ +/* + * Copyright © 2008 Keith Packard + * + * 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 + +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 index 00000000..b83dc450 --- /dev/null +++ b/lib/ccdbg-manual.c @@ -0,0 +1,70 @@ +/* + * Copyright © 2008 Keith Packard + * + * 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 index 00000000..105295db --- /dev/null +++ b/lib/ccdbg-memory.c @@ -0,0 +1,104 @@ +/* + * Copyright © 2008 Keith Packard + * + * 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 index 00000000..b74d13ca --- /dev/null +++ b/lib/ccdbg.h @@ -0,0 +1,351 @@ +/* + * Copyright © 2008 Keith Packard + * + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#undef USE_KERNEL +#ifdef USE_KERNEL +#include +#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 +#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 index 00000000..61b684a2 --- /dev/null +++ b/lib/cp-usb.c @@ -0,0 +1,140 @@ +/* + * Copyright © 2008 Keith Packard + * + * 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 + +#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 index 08d8ab50..00000000 --- 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 index e2d43f10..00000000 --- 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 index 3ae46058..00000000 --- a/read_status +++ /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 index a32c8bec..00000000 --- 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 index 00000000..1f18f529 --- /dev/null +++ b/target/blink/Makefile @@ -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 index 00000000..907c82b8 --- /dev/null +++ b/target/blink/blink.c @@ -0,0 +1,100 @@ +/* + * Copyright © 2008 Keith Packard + * + * 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 index 00000000..43aedc29 --- /dev/null +++ b/target/isr.c @@ -0,0 +1,90 @@ +/* + * Copyright © 2008 Keith Packard + * + * 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 index 00000000..fd075e57 --- /dev/null +++ b/tests/blink-tiny @@ -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 index 00000000..018716d5 --- /dev/null +++ b/tests/blink-tiny-ram @@ -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 index 00000000..b3ecf314 --- /dev/null +++ b/tests/chip_id @@ -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 index 00000000..fe25bfef --- /dev/null +++ b/tests/debug_mode @@ -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 index 00000000..13bcba15 --- /dev/null +++ b/tests/get_pc @@ -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 index 00000000..1d4ff03d --- /dev/null +++ b/tests/get_status @@ -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 index 00000000..3ca4a303 --- /dev/null +++ b/tests/half_phase @@ -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 index 00000000..93341e32 --- /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 index 00000000..08d8ab50 --- /dev/null +++ b/tests/p1_1 @@ -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 index 00000000..e2d43f10 --- /dev/null +++ b/tests/rd_config @@ -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 index 00000000..3ae46058 --- /dev/null +++ b/tests/read_status @@ -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 index 00000000..a32c8bec --- /dev/null +++ b/tests/reset @@ -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 index 00000000..1ee31623 --- /dev/null +++ b/tests/wr_config @@ -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 index 1ee31623..00000000 --- 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