]> sigrok.org Git - sigrok-firmware-fx2lafw.git/commitdiff
Import fx2lib into fx2lafw directly.
authorUwe Hermann <redacted>
Wed, 18 Jul 2012 09:31:24 +0000 (11:31 +0200)
committerUwe Hermann <redacted>
Wed, 18 Jul 2012 10:41:49 +0000 (12:41 +0200)
We want a local fx2lib copy in fx2lafw for various reasons, e.g. to make
life simpler for all distros (none of which ship any fx2lib packages,
and neither would it make sense to do so really), and as we'll want/need
local changes to fix build issues and possibly other stuff anyway.

This copy of fx2lib is not the main upstream version from

  git://github.com/mulicheng/fx2lib.git

which has been last updated in 2010, but rather from

  git://github.com/ubixum/fx2lib.git

The only difference is that the latter contains one patch which fixes
some issues with more recent sdcc versions (interrupt vs. __interrupt,
_asm vs. __asm, xdata vs. __xdata__, and many others).

The imported fx2lib copy is "416c104cbd" from Feb 12, 2012.

119 files changed:
README
fx2lib/.gitignore [new file with mode: 0644]
fx2lib/CHANGELOG [new file with mode: 0644]
fx2lib/COPYING [new file with mode: 0644]
fx2lib/COPYING.LESSER [new file with mode: 0644]
fx2lib/Makefile [new file with mode: 0644]
fx2lib/NOTES [new file with mode: 0644]
fx2lib/README [new file with mode: 0644]
fx2lib/docs/docs.conf [new file with mode: 0644]
fx2lib/docs/intro/.gitignore [new file with mode: 0644]
fx2lib/docs/intro/Makefile [new file with mode: 0644]
fx2lib/docs/intro/intro.tex [new file with mode: 0644]
fx2lib/examples/NOTES [new file with mode: 0644]
fx2lib/examples/bulkloop/Makefile [new file with mode: 0644]
fx2lib/examples/bulkloop/bulkloop.c [new file with mode: 0644]
fx2lib/examples/bulkloop/dscr.a51 [new file with mode: 0644]
fx2lib/examples/bulkloop/load.py [new file with mode: 0644]
fx2lib/examples/bulkloop/test.cpp [new file with mode: 0644]
fx2lib/examples/bulkloop/test.py [new file with mode: 0644]
fx2lib/examples/eeprom/client.py [new file with mode: 0644]
fx2lib/examples/eeprom/firmware/Makefile [new file with mode: 0644]
fx2lib/examples/eeprom/firmware/dscr.a51 [new file with mode: 0644]
fx2lib/examples/eeprom/firmware/eeprom.c [new file with mode: 0644]
fx2lib/examples/fx2/.gitignore [new file with mode: 0644]
fx2lib/examples/fx2/cpp/.gitignore [new file with mode: 0644]
fx2lib/examples/fx2/cpp/__init__.py [new file with mode: 0644]
fx2lib/examples/fx2/cpp/fx2.cpp [new file with mode: 0644]
fx2lib/examples/fx2/cpp/fx2.h [new file with mode: 0644]
fx2lib/examples/fx2/cpp/fx2.i [new file with mode: 0644]
fx2lib/examples/fx2/fx2load/__init__.py [new file with mode: 0644]
fx2lib/examples/fx2/scripts/fx2load [new file with mode: 0755]
fx2lib/examples/fx2/setup.py [new file with mode: 0644]
fx2lib/examples/i2c/Makefile [new file with mode: 0644]
fx2lib/examples/i2c/i2c.c [new file with mode: 0644]
fx2lib/examples/i2c/load.py [new file with mode: 0644]
fx2lib/examples/lights/.gitignore [new file with mode: 0644]
fx2lib/examples/lights/Makefile [new file with mode: 0644]
fx2lib/examples/lights/lights.c [new file with mode: 0644]
fx2lib/examples/reset/Makefile [new file with mode: 0644]
fx2lib/examples/reset/fx2_c0.c [new file with mode: 0644]
fx2lib/examples/reset/reset.c [new file with mode: 0644]
fx2lib/examples/serial/Makefile [new file with mode: 0644]
fx2lib/examples/serial/serial.c [new file with mode: 0644]
fx2lib/examples/timers/.gitignore [new file with mode: 0644]
fx2lib/examples/timers/Makefile [new file with mode: 0644]
fx2lib/examples/timers/timers.c [new file with mode: 0644]
fx2lib/fw/.gitignore [new file with mode: 0644]
fx2lib/fw/Makefile [new file with mode: 0644]
fx2lib/fw/device.c [new file with mode: 0644]
fx2lib/fw/dscr.a51 [new file with mode: 0644]
fx2lib/fw/fw.c [new file with mode: 0644]
fx2lib/fw/readme.txt [new file with mode: 0644]
fx2lib/include/autovector.h [new file with mode: 0644]
fx2lib/include/delay.h [new file with mode: 0644]
fx2lib/include/eputils.h [new file with mode: 0644]
fx2lib/include/fx2ints.h [new file with mode: 0644]
fx2lib/include/fx2macros.h [new file with mode: 0644]
fx2lib/include/fx2regs.h [new file with mode: 0644]
fx2lib/include/fx2types.h [new file with mode: 0644]
fx2lib/include/gpif.h [new file with mode: 0644]
fx2lib/include/i2c.h [new file with mode: 0644]
fx2lib/include/lights.h [new file with mode: 0644]
fx2lib/include/serial.h [new file with mode: 0644]
fx2lib/include/setupdat.h [new file with mode: 0644]
fx2lib/lib/.gitignore [new file with mode: 0644]
fx2lib/lib/Makefile [new file with mode: 0644]
fx2lib/lib/delay.c [new file with mode: 0644]
fx2lib/lib/eputils.c [new file with mode: 0644]
fx2lib/lib/fx2.mk [new file with mode: 0644]
fx2lib/lib/gpif.c [new file with mode: 0644]
fx2lib/lib/i2c.c [new file with mode: 0644]
fx2lib/lib/int4av.a51 [new file with mode: 0644]
fx2lib/lib/interrupts/ep0ack_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep0in_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep0out_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep0ping_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep1in_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep1out_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep1ping_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep2_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep2ef_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep2ff_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep2isoerr_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep2pf_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep2ping_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep4_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep4ef_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep4ff_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep4isoerr_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep4pf_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep4ping_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep6_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep6ef_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep6ff_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep6isoerr_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep6pf_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep6ping_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep8_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep8ef_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep8ff_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep8isoerr_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep8pf_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ep8ping_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/errlimit_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/gpifdone_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/gpifwf_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/hispeed_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/ibn_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/sof_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/spare_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/sudav_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/suspend_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/sutok_isr.c [new file with mode: 0644]
fx2lib/lib/interrupts/usbreset_isr.c [new file with mode: 0644]
fx2lib/lib/serial.c [new file with mode: 0644]
fx2lib/lib/setupdat.c [new file with mode: 0644]
fx2lib/lib/usbav.a51 [new file with mode: 0644]
fx2lib/utils/gpif2dat [new file with mode: 0755]
fx2lib/utils/ihx2iic.py [new file with mode: 0755]

diff --git a/README b/README
index e9b8c8dece8024c268de7d869ac2e5c124e60beb..fd9dc2531f7d7585cfa65f197614d37aad5c9121 100644 (file)
--- a/README
+++ b/README
@@ -23,7 +23,6 @@ Building
 
   $ git clone git://sigrok.git.sourceforge.net/gitroot/sigrok/fx2lafw
   $ cd fx2lafw
-  $ git clone git://github.com/mulicheng/fx2lib.git
   $ make
 
 
diff --git a/fx2lib/.gitignore b/fx2lib/.gitignore
new file mode 100644 (file)
index 0000000..a6cde12
--- /dev/null
@@ -0,0 +1,17 @@
+*.asm
+*.rel
+*.lst
+*.sym
+*.adb
+*.cdb
+*.ihx
+*.bix
+*.rst
+*.mem
+*.map
+*.lnk
+*.kpf
+*.swp
+*.iic
+docs/html
+build
diff --git a/fx2lib/CHANGELOG b/fx2lib/CHANGELOG
new file mode 100644 (file)
index 0000000..fbe7fdd
--- /dev/null
@@ -0,0 +1,32 @@
+0.2
+ * Change I2C routines to return FALSE intead of infinite loop possibility.
+ * Addition of fx2load script to load eeprom information.
+ * EEprom upload/download example.
+ * New SETUP_TYPE macro
+ * Removed printfs from setupdat module.
+ * Add usb "other speed" descriptor handling to setupdat
+ * Support for usb suspend/wakeup
+ * Enhanced renumerate macro to handle properly when loading from eeprom
+ * Addition of framework files.  Allows quick starting of new firmware projects.
+ * ihx2iic helper script.  Allows easy converting of ihx files to iic for 
+   loading to eeprom.
+ * New GPIF macros to set TC with 16 or 32 bit values.
+ * Addtional enable/disable macros for endpoint interrupts.
+ * Additional ep0 utilities (writeep0)
+ * Additional i2c write functionality for i2c parts requiring different
+   address width's or even no address data.
+ * Correct fx2 register documentation.
+ * Addition of serial io example.
+ * Added cancel_i2c_trans extern bool to allow canceling a blocked i2c transaction.
+ * FX1 development board debug light addresses.
+ * Various other minor bug fixes/optimizations.
+ * remove usbjt.h.  In place, use autovector.h.  jump table routines no longer
+   need defined in your firmware.  fx2.lib contains default routines.  Override 
+   them with interrupt handlers you want to handle.
+ * added fx2ints.h.  Interrupt numbers/macros for standard fx2 interrupts.
+ * added timer example
+ * Moved examples and firmwware framework to use common lib/fx2.mk Makefile.
+   fx2.mk can be easily adapted for any firmware project.
+
+0.1
+ * Initial Release.
diff --git a/fx2lib/COPYING b/fx2lib/COPYING
new file mode 100644 (file)
index 0000000..94a9ed0
--- /dev/null
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/fx2lib/COPYING.LESSER b/fx2lib/COPYING.LESSER
new file mode 100644 (file)
index 0000000..cca7fc2
--- /dev/null
@@ -0,0 +1,165 @@
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser 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
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
diff --git a/fx2lib/Makefile b/fx2lib/Makefile
new file mode 100644 (file)
index 0000000..463d07f
--- /dev/null
@@ -0,0 +1,24 @@
+
+
+VER=devel
+TAG=HEAD
+
+.PHONY: all docs
+
+all:
+       make -C lib
+
+docs:
+       doxygen docs/docs.conf
+       make -C docs/intro
+
+dist: all docs
+       mkdir -p build  
+       git archive --prefix=fx2lib/ $(TAG) > build/fx2-$(VER).tar
+       tar -C .. -rf build/fx2-$(VER).tar \
+               fx2lib/docs/html \
+               fx2lib/lib/fx2.lib \
+               fx2lib/docs/intro/intro.pdf
+       cat build/fx2-$(VER).tar | gzip > build/fx2-$(VER).tgz
+       
+
diff --git a/fx2lib/NOTES b/fx2lib/NOTES
new file mode 100644 (file)
index 0000000..aff01c5
--- /dev/null
@@ -0,0 +1,42 @@
+Notes on Various things I've learned about SDCC and the FX2
+
+* libusb on Linux
+* cycfx2prog: http://www.triplespark.net/elec/periph/USB-FX2/software/index.html
+ - most of this functionality is now in the fx2load package for python
+ - which is in examples/fx2
+* sdcc has sdcc/support/scripts/keil2sdcc.pl which I used to create the fx2regs.h file from the keil header. 
+* sdcc is little endian, keil is big endian (important if doing usb communication)
+* xdata can go up to 64k on the EZ-USB development board but
+  - the fx2 chip itself only has 16k (end at 0x4000) Firmware written for other than the dev board
+  - should use --xram-size --xram-loc etc to make sure it isn't using memory beyond 16k.
+* linux has objcopy, which can be used in place of Hex2bix for bix files 
+  - objcopy -I ihex -O binary --pad-to=8192 input [output]
+
+
+Memory
+ * 256 bytes internal
+   - lower 128=registers/bits (direct or indirect)
+   - upper 128=stack (or whatever but only indirect addressing)
+   - sfs occupy upper 128 space only direct addressing
+
+ * external
+  - 16k on chip 0-0x3fff
+  - 512 bytes on chip scratch ram 0xe000 - 0xe1ff (data memory only)
+  - epbuffers and control at 0xe200-0xffff (data memory only)
+  
+   Only the on chip 16k and 512 bytes can be uploaded w/ eeprom or downloaded to host with SETUPPTR
+   Might be possible to load the descriptors to the scratch ram instead of code ram area?
+
+sdcc data types
+  data/near=direct addressable internal memory (default for model-small)
+  xdata/far=external ram (default for model-large)
+  idata=indirect addressable internal memory
+  pdata=access to xdata area, but uses sfr to get to address (sdcc 4.1)
+  code=code memory, study this more.
+  bit=uses lower 128 bit area
+  
+
+TODO:
+ * Possibly add CKCON and bmSTRETCH customization
+ * IN2CLR and INT4CLR registers can be used intead of explicitly clearing int2 and int4 interrupts. (Faster)
+   See (15.5)
diff --git a/fx2lib/README b/fx2lib/README
new file mode 100644 (file)
index 0000000..261106a
--- /dev/null
@@ -0,0 +1,40 @@
+Before building this library, you need have sdcc installed and in your path.
+
+http://sdcc.sf.net
+
+To build this library, run make
+
+> make
+
+This produces lib/fx2.lib.  You can also run make in the lib folder.
+
+You can also build the documentation if you have doxygen installed.
+
+> make docs
+
+** Firmware framework Quickstart
+
+> cd fw
+> make
+
+You can copy the fw directory to your own directory and customize it as needed.
+
+** More custom firmware
+
+To use routines included with this library in your own firmware,
+add the include files to your include path and the lib file to your compile command:
+
+> sdcc -mmcs51 -I<path to includes> <your c file> fx2.lib -L <path to fx2.lib dir>
+
+fx2lib also includes an example program for loading firmware onto your device. 
+See examples/fx2.
+
+
+Enjoy!
+Comments, Patches, all welcome.
+
+Contributors
+ Dennis Muhlestein
+ Ubixum, Inc
+ Steve Calfee
+
diff --git a/fx2lib/docs/docs.conf b/fx2lib/docs/docs.conf
new file mode 100644 (file)
index 0000000..d5e91c8
--- /dev/null
@@ -0,0 +1,1473 @@
+# Doxyfile 1.5.7.1
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file 
+# that follow. The default is UTF-8 which is also the encoding used for all 
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the 
+# iconv built into libc) for the transcoding. See 
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = Fx2lib 
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
+# This could be handy for archiving the generated documentation or 
+# if some version control system is used.
+
+PROJECT_NUMBER         = 0.2
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
+# base path where the generated documentation will be put. 
+# If a relative path is entered, it will be relative to the location 
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = docs 
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
+# 4096 sub-directories (in 2 levels) under the output directory of each output 
+# format and will distribute the generated files over these directories. 
+# Enabling this option can be useful when feeding doxygen a huge amount of 
+# source files, where putting all generated files in the same directory would 
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
+# documentation generated by doxygen is written. Doxygen will use this 
+# information to generate all constant output in the proper language. 
+# The default language is English, other supported languages are: 
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
+# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, 
+# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), 
+# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, 
+# Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene, 
+# Spanish, Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
+# include brief member descriptions after the members that are listed in 
+# the file and class documentation (similar to JavaDoc). 
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
+# the brief description of a member or function before the detailed description. 
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator 
+# that is used to form the text in various listings. Each string 
+# in this list, if found as the leading text of the brief description, will be 
+# stripped from the text and the result after processing the whole list, is 
+# used as the annotated text. Otherwise, the brief description is used as-is. 
+# If left blank, the following values are used ("$name" is automatically 
+# replaced with the name of the entity): "The $name class" "The $name widget" 
+# "The $name file" "is" "provides" "specifies" "contains" 
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       = 
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
+# Doxygen will generate a detailed section even if there is only a brief 
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
+# inherited members of a class in the documentation of that class as if those 
+# members were ordinary class members. Constructors, destructors and assignment 
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
+# path before files name in the file list and in the header files. If set 
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
+# can be used to strip a user-defined part of the path. Stripping is 
+# only done if one of the specified strings matches the left-hand part of 
+# the path. The tag can be used to show relative paths in the file list. 
+# If left blank the directory from which doxygen is run is used as the 
+# path to strip.
+
+STRIP_FROM_PATH        = 
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
+# the path mentioned in the documentation of a class, which tells 
+# the reader which header file to include in order to use a class. 
+# If left blank only the name of the header file containing the class 
+# definition is used. Otherwise one should specify the include paths that 
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    = 
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
+# (but less readable) file names. This can be useful is your file systems 
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
+# will interpret the first line (until the first dot) of a JavaDoc-style 
+# comment as the brief description. If set to NO, the JavaDoc 
+# comments will behave just like regular Qt-style comments 
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will 
+# interpret the first line (until the first dot) of a Qt-style 
+# comment as the brief description. If set to NO, the comments 
+# will behave just like regular Qt-style comments (thus requiring 
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
+# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
+# comments) as a brief description. This used to be the default behaviour. 
+# The new default is to treat a multi-line C++ comment block as a detailed 
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
+# member inherits the documentation from any documented member that it 
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
+# a new page for each member. If set to NO, the documentation of a member will 
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that acts 
+# as commands in the documentation. An alias has the form "name=value". 
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
+# put the command \sideeffect (or @sideeffect) in the documentation, which 
+# will result in a user-defined paragraph with heading "Side Effects:". 
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                = 
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
+# sources only. Doxygen will then generate output that is more tailored for C. 
+# For instance, some of the names that are used will be different. The list 
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = YES 
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
+# sources only. Doxygen will then generate output that is more tailored for 
+# Java. For instance, namespaces will be presented as packages, qualified 
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran 
+# sources only. Doxygen will then generate output that is more tailored for 
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL 
+# sources. Doxygen will then generate output that is tailored for 
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want 
+# to include (a tag file for) the STL sources as input, then you should 
+# set this tag to YES in order to let doxygen match functions declarations and 
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
+# func(std::string) {}). This also make the inheritance and collaboration 
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. 
+# Doxygen will parse them like normal C++ but will assume all classes use public 
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter 
+# and setter methods for a property. Setting this option to YES (the default) 
+# will make doxygen to replace the get and set methods by a property in the 
+# documentation. This will only work if the methods are indeed getting or 
+# setting a simple type. If this is not the case, or you want to show the 
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
+# tag is set to YES, then doxygen will reuse the documentation of the first 
+# member in the group (if any) for the other members of the group. By default 
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
+# the same type (for instance a group of public functions) to be put as a 
+# subgroup of that type (e.g. under the Public Functions section). Set it to 
+# NO to prevent subgrouping. Alternatively, this can be done per class using 
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum 
+# is documented as struct, union, or enum with the name of the typedef. So 
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct 
+# with name TypeT. When disabled the typedef will appear as a member of a file, 
+# namespace, or class. And the struct will be named TypeS. This can typically 
+# be useful for C code in case the coding convention dictates that all compound 
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to 
+# determine which symbols to keep in memory and which to flush to disk.
+# When the cache is full, less often used symbols will be written to disk.
+# For small to medium size projects (<1000 input files) the default value is 
+# probably good enough. For larger projects a too small cache size can cause 
+# doxygen to be busy swapping symbols to and from disk most of the time 
+# causing a significant performance penality. 
+# If the system has enough physical memory increasing the cache will improve the 
+# performance by keeping more symbols in memory. Note that the value works on 
+# a logarithmic scale so increasing the size by one will rougly double the 
+# memory usage. The cache size is given by this formula: 
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, 
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+SYMBOL_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
+# documentation are documented, even if no documentation was available. 
+# Private class members and static file members will be hidden unless 
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = YES 
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file 
+# will be included in the documentation.
+
+EXTRACT_STATIC         = YES 
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
+# defined locally in source files will be included in the documentation. 
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local 
+# methods, which are defined in the implementation section but not in 
+# the interface are included in the documentation. 
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be 
+# extracted and appear in the documentation as a namespace called 
+# 'anonymous_namespace{file}', where file will be replaced with the base 
+# name of the file that contains the anonymous namespace. By default 
+# anonymous namespace are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
+# undocumented members of documented classes, files or namespaces. 
+# If set to NO (the default) these members will be included in the 
+# various overviews, but no documentation section is generated. 
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
+# undocumented classes that are normally visible in the class hierarchy. 
+# If set to NO (the default) these classes will be included in the various 
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
+# friend (class|struct|union) declarations. 
+# If set to NO (the default) these declarations will be included in the 
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
+# documentation blocks found inside the body of a function. 
+# If set to NO (the default) these blocks will be appended to the 
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation 
+# that is typed after a \internal command is included. If the tag is set 
+# to NO (the default) then the documentation will be excluded. 
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
+# file names in lower-case letters. If set to YES upper-case letters are also 
+# allowed. This is useful if you have classes or files whose names only differ 
+# in case and if your file system supports case sensitive file names. Windows 
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
+# will show members with their full class and namespace scopes in the 
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
+# will put a list of the files that are included by a file in the documentation 
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
+# will sort the (detailed) documentation of file and class members 
+# alphabetically by member name. If set to NO the members will appear in 
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
+# brief documentation of file, namespace and class members alphabetically 
+# by member name. If set to NO (the default) the members will appear in 
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the 
+# hierarchy of group names into alphabetical order. If set to NO (the default) 
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
+# sorted by fully-qualified names, including namespaces. If set to 
+# NO (the default), the class list will be sorted only by class name, 
+# not including the namespace part. 
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the 
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or 
+# disable (NO) the todo list. This list is created by putting \todo 
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or 
+# disable (NO) the test list. This list is created by putting \test 
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or 
+# disable (NO) the bug list. This list is created by putting \bug 
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
+# disable (NO) the deprecated list. This list is created by putting 
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional 
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = 
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
+# the initial value of a variable or define consists of for it to appear in 
+# the documentation. If the initializer consists of more lines than specified 
+# here it will be hidden. Use a value of 0 to hide initializers completely. 
+# The appearance of the initializer of individual variables and defines in the 
+# documentation can be controlled using \showinitializer or \hideinitializer 
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
+# at the bottom of the documentation of classes and structs. If set to YES the 
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# If the sources in your project are distributed over multiple directories 
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = NO
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
+# This will remove the Files entry from the Quick Index and from the 
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the 
+# Namespaces page.  This will remove the Namespaces entry from the Quick Index
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
+# doxygen should invoke to get the current version for each file (typically from 
+# the version control system). Doxygen will invoke the program by executing (via 
+# popen()) the command <command> <input-file>, where <command> is the value of 
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
+# provided by doxygen. Whatever the program writes to standard output 
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    = 
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by 
+# doxygen. The layout file controls the global structure of the generated output files 
+# in an output format independent way. The create the layout file that represents 
+# doxygen's defaults, run doxygen with the -l option. You can optionally specify a 
+# file name after the option, if omitted DoxygenLayout.xml will be used as the name 
+# of the layout file.
+
+LAYOUT_FILE            = 
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated 
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are 
+# generated by doxygen. Possible values are YES and NO. If left blank 
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
+# potential errors in the documentation, such as not documenting some 
+# parameters in a documented function, or documenting parameters that 
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for 
+# functions that are documented, but have no documentation for their parameters 
+# or return value. If set to NO (the default) doxygen will only warn about 
+# wrong or incomplete parameter documentation, but not about the absence of 
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that 
+# doxygen can produce. The string should contain the $file, $line, and $text 
+# tags, which will be replaced by the file and line number from which the 
+# warning originated and the warning text. Optionally the format may contain 
+# $version, which will be replaced by the version of the file (if it could 
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning 
+# and error messages should be written. If left blank the output is written 
+# to stderr.
+
+WARN_LOGFILE           = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain 
+# documented source files. You may enter file names like "myfile.cpp" or 
+# directories like "/usr/src/myproject". Separate the files or directories 
+# with spaces.
+
+INPUT                  = include
+
+# This tag can be used to specify the character encoding of the source files 
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is 
+# also the default input encoding. Doxygen uses libiconv (or the iconv built 
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for 
+# the list of possible encodings.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the 
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank the following patterns are tested: 
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
+
+FILE_PATTERNS          = *.c *.h 
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
+# should be searched for input files as well. Possible values are YES and NO. 
+# If left blank NO is used.
+
+RECURSIVE              = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should 
+# excluded from the INPUT source files. This way you can easily exclude a 
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                = 
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
+# directories that are symbolic links (a Unix filesystem feature) are excluded 
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the 
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
+# certain files from those directories. Note that the wildcards are matched 
+# against the file with absolute path, so to exclude all test directories 
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = 
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
+# (namespaces, classes, functions, etc.) that should be excluded from the 
+# output. The symbol name can be a fully qualified name, a word, or if the 
+# wildcard * is used, a substring. Examples: ANamespace, AClass, 
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        = 
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or 
+# directories that contain example code fragments that are included (see 
+# the \include command).
+
+EXAMPLE_PATH           = . fw
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank all files are included.
+
+EXAMPLE_PATTERNS       = 
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
+# searched for input files to be used with the \include or \dontinclude 
+# commands irrespective of the value of the RECURSIVE tag. 
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or 
+# directories that contain image that are included in the documentation (see 
+# the \image command).
+
+IMAGE_PATH             = 
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should 
+# invoke to filter for each input file. Doxygen will invoke the filter program 
+# by executing (via popen()) the command <filter> <input-file>, where <filter> 
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
+# input file. Doxygen will then use the output that the filter program writes 
+# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
+# ignored.
+
+INPUT_FILTER           = 
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
+# basis.  Doxygen will compare the file name with each pattern and apply the 
+# filter if there is a match.  The filters are a list of the form: 
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
+# is applied to all files.
+
+FILTER_PATTERNS        = 
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
+# INPUT_FILTER) will be used to filter the input files when producing source 
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
+# be generated. Documented entities will be cross-referenced with these sources. 
+# Note: To get rid of all source code in the generated output, make sure also 
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = YES 
+
+# Setting the INLINE_SOURCES tag to YES will include the body 
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
+# doxygen to hide any special comment blocks from generated source code 
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES 
+# then for each documented function all documented 
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES 
+# then for each documented function all documented entities 
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code.  Otherwise they will link to the documentstion.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code 
+# will point to the HTML generated by the htags(1) tool instead of doxygen 
+# built-in source browser. The htags tool is part of GNU's global source 
+# tagging system (see http://www.gnu.org/software/global/global.html). You 
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
+# will generate a verbatim copy of the header file for each class for 
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
+# of all compounds will be generated. Enable this if the project 
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all 
+# classes will be put under the same header in the alphabetical index. 
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard header.
+
+HTML_HEADER            = 
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard footer.
+
+HTML_FOOTER            = 
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
+# style sheet that is used by each HTML page. It can be used to 
+# fine-tune the look of the HTML output. If the tag is left blank doxygen 
+# will generate a default style sheet. Note that doxygen will try to copy 
+# the style sheet file to the HTML output directory, so don't put your own 
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        = 
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
+# files or namespaces will be aligned in HTML using tables. If set to 
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
+# documentation will contain sections that can be hidden and shown after the 
+# page has loaded. For this to work a browser that supports 
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox 
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files 
+# will be generated that can be used as input for Apple's Xcode 3 
+# integrated development environment, introduced with OSX 10.5 (Leopard). 
+# To create a documentation set, doxygen will generate a Makefile in the 
+# HTML output directory. Running make will produce the docset in that 
+# directory and running "make install" will install the docset in 
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find 
+# it at startup. 
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information.
+
+GENERATE_DOCSET        = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the 
+# feed. A documentation feed provides an umbrella under which multiple 
+# documentation sets from a single provider (such as a company or product suite) 
+# can be grouped.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that 
+# should uniquely identify the documentation set bundle. This should be a 
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen 
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
+# will be generated that can be used as input for tools like the 
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) 
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
+# be used to specify the file name of the resulting .chm file. You 
+# can add a path in front of the file if the result should not be 
+# written to the html output directory.
+
+CHM_FILE               = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
+# be used to specify the location (absolute path including file name) of 
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
+# controls if a separate .chi index file is generated (YES) or that 
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file
+# content.
+
+CHM_INDEX_ENCODING     = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
+# controls whether a binary table of contents is generated (YES) or a 
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members 
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER 
+# are set, an additional index file will be generated that can be used as input for 
+# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated 
+# HTML documentation.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can 
+# be used to specify the file name of the resulting .qch file. 
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE               = 
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating 
+# Qt Help Project output. For more information please see 
+# <a href="http://doc.trolltech.com/qthelpproject.html#namespace">Qt Help Project / Namespace</a>.
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating 
+# Qt Help Project output. For more information please see 
+# <a href="http://doc.trolltech.com/qthelpproject.html#virtual-folders">Qt Help Project / Virtual Folders</a>.
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can 
+# be used to specify the location of Qt's qhelpgenerator. 
+# If non-empty doxygen will try to run qhelpgenerator on the generated 
+# .qhp file .
+
+QHG_LOCATION           = 
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
+# top of each HTML page. The value NO (the default) enables the index and 
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20]) 
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information.
+# If the tag value is set to FRAME, a side panel will be generated
+# containing a tree-like index structure (just like the one that 
+# is generated for HTML Help). For this to work a browser that supports 
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
+# probably better off using the HTML help feature. Other possible values 
+# for this tag are: HIERARCHIES, which will generate the Groups, Directories,
+# and Class Hierarchy pages using a tree view instead of an ordered list;
+# ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which
+# disables this behavior completely. For backwards compatibility with previous
+# releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE
+# respectively.
+
+GENERATE_TREEVIEW      = NONE
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
+# used to set the initial width (in pixels) of the frame in which the tree 
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+# Use this tag to change the font size of Latex formulas included 
+# as images in the HTML documentation. The default is 10. Note that 
+# when you change the font size after a successful doxygen run you need 
+# to manually remove any form_*.png images from the HTML output directory 
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE       = 10
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
+# generate index for LaTeX. If left blank `makeindex' will be used as the 
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
+# LaTeX documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used 
+# by the printer. Possible values are: a4, a4wide, letter, legal and 
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = 
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
+# the generated latex document. The header should contain everything until 
+# the first chapter. If it is left blank doxygen will generate a 
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           = 
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
+# contain links (just like the HTML output) instead of page references 
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
+# plain latex in the generated Makefile. Set this option to YES to get a 
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
+# command to the generated LaTeX files. This will instruct LaTeX to keep 
+# running if errors occur, instead of asking the user for help. 
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
+# include the index chapters (such as File Index, Compound Index, etc.) 
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
+# The RTF output is optimized for Word 97 and may not look very pretty with 
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
+# RTF documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
+# will contain hyperlink fields. The RTF file will 
+# contain links (just like the HTML output) instead of page references. 
+# This makes the output suitable for online browsing using WORD or other 
+# programs which support those fields. 
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's 
+# config file, i.e. a series of assignments. You only have to provide 
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    = 
+
+# Set optional variables used in the generation of an rtf document. 
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to 
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
+# then it will generate one additional man file for each entity 
+# documented in the real man page(s). These additional files 
+# only source the real man page, but without them the man command 
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will 
+# generate an XML file that captures the structure of 
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_SCHEMA             = 
+
+# The XML_DTD tag can be used to specify an XML DTD, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_DTD                = 
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
+# dump the program listings (including syntax highlighting 
+# and cross-referencing information) to the XML output. Note that 
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
+# generate an AutoGen Definitions (see autogen.sf.net) file 
+# that captures the structure of the code including all 
+# documentation. Note that this feature is still experimental 
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
+# generate a Perl module file that captures the structure of 
+# the code including all documentation. Note that this 
+# feature is still experimental and incomplete at the 
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
+# nicely formatted so it can be parsed by a human reader.  This is useful 
+# if you want to understand what is going on.  On the other hand, if this 
+# tag is set to NO the size of the Perl module output will be much smaller 
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file 
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
+# This is useful so different doxyrules.make files included by the same 
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
+# evaluate all C-preprocessor directives found in the sources and include 
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
+# names in the source code. If set to NO (the default) only conditional 
+# compilation will be performed. Macro expansion can be done in a controlled 
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
+# then the macro expansion is limited to the macros specified with the 
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that 
+# contain include files that are not input files but should be processed by 
+# the preprocessor.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
+# patterns (like *.h and *.hpp) to filter out the header-files in the 
+# directories. If left blank, the patterns specified with FILE_PATTERNS will 
+# be used.
+
+INCLUDE_FILE_PATTERNS  = 
+
+# The PREDEFINED tag can be used to specify one or more macro names that 
+# are defined before the preprocessor is started (similar to the -D option of 
+# gcc). The argument of the tag is a list of macros of the form: name 
+# or name=definition (no spaces). If the definition and the = are 
+# omitted =1 is assumed. To prevent a macro definition from being 
+# undefined via #undef or recursively expanded use the := operator 
+# instead of the = operator.
+
+PREDEFINED             = 
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
+# this tag can be used to specify a list of macro names that should be expanded. 
+# The macro definition that is found in the sources will be used. 
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      = 
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
+# doxygen's preprocessor will remove all function-like macros that are alone 
+# on a line, have an all uppercase name, and do not end with a semicolon. Such 
+# function macros are typically used for boiler-plate code, and will confuse 
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. 
+# Optionally an initial location of the external documentation 
+# can be added for each tagfile. The format of a tag file without 
+# this location is as follows: 
+#   TAGFILES = file1 file2 ... 
+# Adding location for the tag files is done as follows: 
+#   TAGFILES = file1=loc1 "file2 = loc2" ... 
+# where "loc1" and "loc2" can be relative or absolute paths or 
+# URLs. If a location is present for each tag, the installdox tool 
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen 
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               = 
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       = 
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
+# in the class index. If set to NO only the inherited external classes 
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
+# in the modules index. If set to NO, only the current project's groups will 
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script 
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
+# or super classes. Setting the tag to NO turns the diagrams off. Note that 
+# this option is superseded by the HAVE_DOT option below. This is only a 
+# fallback. It is recommended to install and use dot, since it yields more 
+# powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc 
+# command. Doxygen will then run the mscgen tool (see 
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the 
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where 
+# the mscgen tool resides. If left empty the tool is assumed to be found in the 
+# default search path.
+
+MSCGEN_PATH            = 
+
+# If set to YES, the inheritance and collaboration graphs will hide 
+# inheritance and usage relations if the target is undocumented 
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
+# available from the path. This tool is part of Graphviz, a graph visualization 
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = NO
+
+# By default doxygen will write a font called FreeSans.ttf to the output 
+# directory and reference it in all dot files that doxygen generates. This 
+# font does not include all possible unicode characters however, so when you need 
+# these (or just want a differently looking font) you can specify the font name 
+# using DOT_FONTNAME. You need need to make sure dot is able to find the font, 
+# which can be done by putting it in a standard location or by setting the 
+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory 
+# containing the font.
+
+DOT_FONTNAME           = FreeSans
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. 
+# The default size is 10pt.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the output directory to look for the 
+# FreeSans.ttf font (which doxygen will put there itself). If you specify a 
+# different font using DOT_FONTNAME you can set the path where dot 
+# can find it using this tag.
+
+DOT_FONTPATH           = 
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect inheritance relations. Setting this tag to YES will force the 
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect implementation dependencies (inheritance, containment, and 
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
+# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the 
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
+# tags are set to YES then doxygen will generate a graph for each documented 
+# file showing the direct and indirect include dependencies of the file with 
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
+# documented header file showing the documented files that directly or 
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then 
+# doxygen will generate a call dependency graph for every global function 
+# or class method. Note that enabling this option will significantly increase 
+# the time of a run. So in most cases it will be better to enable call graphs 
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then 
+# doxygen will generate a caller dependency graph for every global function 
+# or class method. Note that enabling this option will significantly increase 
+# the time of a run. So in most cases it will be better to enable caller 
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
+# then doxygen will show the dependencies a directory has on other directories 
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               = 
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that 
+# contain dot files that are included in the documentation (see the 
+# \dotfile command).
+
+DOTFILE_DIRS           = 
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
+# nodes that will be shown in the graph. If the number of nodes in a graph 
+# becomes larger than this value, doxygen will truncate the graph, which is 
+# visualized by representing a node as a red box. Note that doxygen if the 
+# number of direct children of the root node in a graph is already larger than 
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note 
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
+# graphs generated by dot. A depth value of 3 means that only nodes reachable 
+# from the root by following a path via at most 3 edges will be shown. Nodes 
+# that lay further from the root node will be omitted. Note that setting this 
+# option to 1 or 2 may greatly reduce the computation time needed for large 
+# code bases. Also note that the size of a graph can be further restricted by 
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
+# background. This is disabled by default, because dot on Windows does not 
+# seem to support this out of the box. Warning: Depending on the platform used, 
+# enabling this option may lead to badly anti-aliased labels on the edges of 
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
+# files in one run (i.e. multiple -o and -T options on the command line). This 
+# makes dot run faster, but since only newer versions of dot (>1.8.10) 
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
+# generate a legend page explaining the meaning of the various boxes and 
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
+# remove the intermediate dot files that are used to generate 
+# the various graphs.
+
+DOT_CLEANUP            = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be 
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE           = NO
diff --git a/fx2lib/docs/intro/.gitignore b/fx2lib/docs/intro/.gitignore
new file mode 100644 (file)
index 0000000..d59d748
--- /dev/null
@@ -0,0 +1,6 @@
+*.aux
+*.log
+*.toc
+html
+*.pdf
+*.out
diff --git a/fx2lib/docs/intro/Makefile b/fx2lib/docs/intro/Makefile
new file mode 100644 (file)
index 0000000..c1f32e7
--- /dev/null
@@ -0,0 +1,11 @@
+
+.PHONY: pdf html
+
+
+pdf: intro.pdf
+intro.pdf: intro.tex
+       rubber -d intro
+
+html: intro.tex 
+       mkdir -p html
+       latex2html -dir html intro.tex
diff --git a/fx2lib/docs/intro/intro.tex b/fx2lib/docs/intro/intro.tex
new file mode 100644 (file)
index 0000000..e499fd5
--- /dev/null
@@ -0,0 +1,80 @@
+
+\documentclass[12pt]{article}
+\usepackage[pdftex,bookmarks=true,linktocpage=true,pdfborder={0 0 0 0}]{hyperref}
+\usepackage{amsmath}
+
+\newcommand{\itwoc}{$\text{I}^{2}\text{C}$ }
+
+
+\title{Fx2lib Introduction}
+\begin{document}
+\maketitle
+\tableofcontents
+\section{Introduction}
+Fx2lib is an open source library for the Cypress EZ-USB Fx2 8051 and variants.
+It is written in C and can be compiled with \href{http://sdcc.sourceforge.net}{SDCC}.
+Fx2lib contains libraries for performing common tasks with the Fx2 chip as well as a framework for starting new firmware projects.
+There are also a number of utilities for performing common firmware development tasks.
+
+\section{Fx2lib Features}
+
+Fx2lib provides libaries for the following common firmware tasks:
+
+\begin{itemize}
+ \item Serial IO.  Ease of setting BAUD rate and reading and writing from serial ports. 
+ \item Vendor Commands.  Handling of required USB vendor commands and ease of implementing your own vendor command handlers. 
+ \item USB interrupts.  Ease of enabling/disabling USB interrupts and adding your own interrupt handlers.
+ \item \itwoc IO.  Ease of reading and writing to \itwoc devices. EEprom functions are also included. 
+ \item GPIF.  Functions for setting up the GPIF as well as performing single and fifo reads/writes.
+ \item Endpoints.  Simplify reading/writing with endpoint 0.
+ \item Other definitions and macros.  All Fx2 SFR, sbit and registers defined as well as other macros for common fx2 tasks.
+\end{itemize}
+
+Detailed  documentation for the library API is available online or with your downloaded fx2lib copy. 
+
+\section{Fx2lib Utilities}
+
+\begin{itemize}
+ \item gpif2dat.  Takes the output from the Cypress GPIF designer (the .c file) and creates an sdcc compatible c file with only the waveforms and initialization structures needed for use with the Fx2lib GPIF functions.
+ \item ihx2iic.  Creates a compressed iic from your firmware ihx file.  Used for storing your firmware on an eeprom.
+ \item fx2load.  Command line interface and Python bindings for loading firmware onto an Fx2 device and for doing basic device IO. 
+\end{itemize}
+
+\section{Getting Started}
+
+\begin{enumerate}
+\item Obtain Fx2lib. 
+
+ Fx2lib can be compiled from sources or is available as a pre-compiled library.
+ If you choose to compile Fx2lib from sources, simply make sure sdcc is in your path and run make in the fx2lib root folder.  
+ Whether you have downloaded a pre-compiled version or build your own Fx2lib library, you should have fx2lib/lib/fx2.lib available for the examples and your own firmware.
+\item Install the drivers.
+
+ Fx2lib uses \href{http://libusb.sourceforge.net}{libusb} to handle low level USB communication with the underlying operating system.
+ Each operating system has different requirements for driver installation.
+ See the Fx2lib driver guide for details on installing USB drivers for your specific operating system.
+ You'll need to install the drivers specifically for the device you plan on doing the Fx2 development with.
+\item Running Example Firmware. 
+
+ Each firmware example has a Makefile and a load script.
+ Simply run make to create the associated .ihx file and then run make load to load the firmware onto your device.
+ The examples/NOTES contains more details on each examples firmware.
+
+ The default load targets use the Cypress vendor id with the development board product ID.
+ Depending on your hardware, you'll need to change these appropriately.
+\item Starting your own firmware.
+
+ Fx2lib provides a quick start firmware framework in the fx2lib/fw directory.
+ Simply copy this directory to your own location and begin modifying the files to start your own firmware.
+
+\end{enumerate}
+
+
+\section{Where Next}
+
+ \begin{itemize}
+  \item \href{http://fx2lib.sourceforge.net/docs/}{Fx2lib API documentation}
+ \end{itemize}
+
+\end{document}
diff --git a/fx2lib/examples/NOTES b/fx2lib/examples/NOTES
new file mode 100644 (file)
index 0000000..090c930
--- /dev/null
@@ -0,0 +1,67 @@
+The examples here show various firmware examples and also various ways to
+start new firmware projects as well as various ways to start communicating with your device.
+In addition, you can look at the fx2.mk include and the example project Makefiles
+to see how you might set up your own project.
+
+For simple examples, you can ignore the link warnings. (Those pertain to the usb jump table
+and device descriptor areas and are not used for all examples)
+
+You can move up the food chain of programming languages pretty quickly if you like:
+
+      C:    Program Your Firmware
+    C++:    Write a libusb driver
+ Python:    Write Bindings for your driver so you can test things interactively!
+
+fx2:
+ An example firmware loader and basic firmware terminal using the above strategy.
+ Requires libusb-1.0, Python 2.5
+
+ Installation:
+  cd fx2
+  python setup.py install
+
+
+ Use the fx2load w/ reset_bix function to load firmware onto a device.
+ Example:
+  python
+  > from fx2load import *
+  > openfx2()
+  > reset_bix('<path to bix file>')
+  > f.do_usb_command (.....
+  > f.ep_bulk(......
+ There is also an fx2load script for doing the same thing with the command line.
+
+eeprom:
+ Simple firmware for reading and writing information from the eeprom.  The client.py
+ file contains a function to read an existing prom image.
+
+
+lights:
+ A really simple program that cycles the lights on the CY3864 development board.
+
+bulkloop:
+ Demonstrations:
+  * looping data on endpoints.
+  * Custom device descriptor.
+  * Vendor commands.
+  * Usb jump table.
+  * serial IO
+
+i2c:
+ A port of the Cypress i2c example.
+
+reset:
+ Shows writing to the eeprom on the dev board.  The included iic data is the default data
+ on the dev board and you can use this program to reset your board back to the default 
+ state if you happen to write a non-working iic file to the device.  You shouldn't 
+ probably use this on a real board unless you really know what you're doing :)
+
+
+serial:
+ A simple terminal echo firmware.  Echos whatever you type back to the serial terminal.
+
+timers:
+ Demonstrates setting up timers t0, t1, and t2 to be 16 bit counters and also demonstrates
+ installing interrupts to process the timer overlow.
+
diff --git a/fx2lib/examples/bulkloop/Makefile b/fx2lib/examples/bulkloop/Makefile
new file mode 100644 (file)
index 0000000..c5cb8c6
--- /dev/null
@@ -0,0 +1,12 @@
+FX2LIBDIR=../../
+BASENAME = bulkloop
+SOURCES=bulkloop.c
+A51_SOURCES=dscr.a51
+PID=0x1004
+
+include $(FX2LIBDIR)lib/fx2.mk
+
+
+test: test.cpp
+       g++ -o test test.cpp -lusb-1.0
+
diff --git a/fx2lib/examples/bulkloop/bulkloop.c b/fx2lib/examples/bulkloop/bulkloop.c
new file mode 100644 (file)
index 0000000..ffcef04
--- /dev/null
@@ -0,0 +1,223 @@
+/**
+ * Copyright (C) 2009 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+#include <stdio.h>
+
+#include <fx2regs.h>
+#include <fx2macros.h>
+#include <serial.h>
+#include <delay.h>
+#include <autovector.h>
+#include <lights.h>
+#include <setupdat.h>
+#include <eputils.h>
+
+
+#define SYNCDELAY() SYNCDELAY4
+#define REARMVAL 0x80
+#define REARM() EP2BCL=REARMVAL
+
+
+
+volatile WORD bytes;
+volatile bit gotbuf;
+volatile BYTE icount;
+volatile bit got_sud;
+DWORD lcount;
+bit on;
+
+void main() {
+
+ REVCTL=0; // not using advanced endpoint controls
+
+ d2off();
+ on=0;
+ lcount=0;
+ got_sud=FALSE;
+ icount=0;
+ gotbuf=FALSE;
+ bytes=0;
+
+ // renumerate
+ RENUMERATE_UNCOND(); 
+
+ SETCPUFREQ(CLK_48M);
+ SETIF48MHZ();
+ sio0_init(57600);
+ USE_USB_INTS(); 
+ ENABLE_SUDAV();
+ ENABLE_SOF();
+ ENABLE_HISPEED();
+ ENABLE_USBRESET();
+ // only valid endpoints are 2/6
+ EP2CFG = 0xA2; // 10100010
+ SYNCDELAY();
+ EP6CFG = 0xE2; // 11100010 
+ SYNCDELAY();
+ EP1INCFG &= ~bmVALID;
+ SYNCDELAY();
+ EP1OUTCFG &= ~bmVALID;
+ SYNCDELAY();
+ EP4CFG &= ~bmVALID;
+ SYNCDELAY();
+ EP8CFG &= ~bmVALID;
+ SYNCDELAY(); 
+ // arm ep2
+ EP2BCL = 0x80; // write once
+ SYNCDELAY();
+ EP2BCL = 0x80; // do it again
+
+ // make it so we enumberate
+
+ EA=1; // global interrupt enable 
+ printf ( "Done initializing stuff\n" );
+
+ d3off();
+ while(TRUE) {
+  if ( got_sud ) {
+      printf ( "Handle setupdata\n" );
+      handle_setupdata(); 
+      got_sud=FALSE;
+  }
+
+  if ( !(EP2468STAT & bmEP2EMPTY) ) {
+       printf ( "ep2 out received data\n" );
+      if  ( !(EP2468STAT & bmEP6FULL) ) { // wait for at least one empty in buffer
+                 WORD i;
+                 printf ( "Sending data to ep6 in\n");
+    
+                 bytes = MAKEWORD(EP2BCH,EP2BCL);
+                 
+                 for (i=0;i<bytes;++i) EP6FIFOBUF[i] = EP2FIFOBUF[i];
+                 
+                 // can copy whole string w/ autoptr instead.
+                 // or copy directly from one buf to another
+
+                 // ARM ep6 out
+                 EP6BCH=MSB(bytes);
+                 SYNCDELAY();
+                 EP6BCL=LSB(bytes); 
+
+                 REARM(); // ep2
+                 //printf ( "Re-Armed ep2\n" );
+
+         }
+   }
+ }
+
+}
+
+// copied routines from setupdat.h
+
+// value (low byte) = ep
+#define VC_EPSTAT 0xB1
+
+BOOL handle_vendorcommand(BYTE cmd) {
+
+ switch ( cmd ) {
+     case VC_EPSTAT:
+        {         
+         xdata BYTE* pep= ep_addr(SETUPDAT[2]);
+         printf ( "ep %02x\n" , *pep );
+         if (pep) {
+          EP0BUF[0] = *pep;
+          EP0BCH=0;
+          EP0BCL=1;
+          return TRUE;
+         } 
+        }
+     default:
+          printf ( "Need to implement vendor command: %02x\n", cmd );
+ }
+ return FALSE;
+}
+
+// this firmware only supports 0,0
+BOOL handle_get_interface(BYTE ifc, BYTE* alt_ifc) { 
+ printf ( "Get Interface\n" );
+ if (ifc==0) {*alt_ifc=0; return TRUE;} else { return FALSE;}
+}
+BOOL handle_set_interface(BYTE ifc, BYTE alt_ifc) { 
+ printf ( "Set interface %d to alt: %d\n" , ifc, alt_ifc );
+ if (ifc==0&&alt_ifc==0) {
+    // SEE TRM 2.3.7
+    // reset toggles
+    RESETTOGGLE(0x02);
+    RESETTOGGLE(0x86);
+    // restore endpoints to default condition
+    RESETFIFO(0x02);
+    EP2BCL=0x80;
+    SYNCDELAY();
+    EP2BCL=0X80;
+    SYNCDELAY();
+    RESETFIFO(0x86);
+    return TRUE;
+ } else 
+    return FALSE;
+}
+
+// get/set configuration
+BYTE handle_get_configuration() {
+ return 1; 
+ }
+BOOL handle_set_configuration(BYTE cfg) { 
+ return cfg==1 ? TRUE : FALSE; // we only handle cfg 1
+}
+
+
+// copied usb jt routines from usbjt.h
+void sudav_isr() interrupt SUDAV_ISR {
+  
+  got_sud=TRUE;
+  CLEAR_SUDAV();
+}
+
+bit on5;
+xdata WORD sofct=0;
+void sof_isr () interrupt SOF_ISR using 1 {
+    ++sofct;
+    if(sofct==8000) { // about 8000 sof interrupts per second at high speed
+        on5=!on5;
+        if (on5) {d5on();} else {d5off();}
+        sofct=0;
+    }
+    CLEAR_SOF();
+}
+
+void usbreset_isr() interrupt USBRESET_ISR {
+    handle_hispeed(FALSE);
+    CLEAR_USBRESET();
+}
+void hispeed_isr() interrupt HISPEED_ISR {
+    handle_hispeed(TRUE);
+    CLEAR_HISPEED();
+}
+
diff --git a/fx2lib/examples/bulkloop/dscr.a51 b/fx2lib/examples/bulkloop/dscr.a51
new file mode 100644 (file)
index 0000000..12991e4
--- /dev/null
@@ -0,0 +1,225 @@
+; Copyright (C) 2009 Ubixum, Inc. 
+;
+; This library is free software; you can redistribute it and/or
+; modify it under the terms of the GNU Lesser General Public
+; License as published by the Free Software Foundation; either
+; version 2.1 of the License, or (at your option) any later version.
+; 
+; This library is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+; Lesser General Public License for more details.
+; 
+; You should have received a copy of the GNU Lesser General Public
+; License along with this library; if not, write to the Free Software
+; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+; this is a the default 
+; full speed and high speed 
+; descriptors found in the TRM
+; change however you want but leave 
+; the descriptor pointers so the setupdat.c file works right
+
+.module DEV_DSCR 
+
+; descriptor types
+; same as setupdat.h
+DSCR_DEVICE_TYPE=1
+DSCR_CONFIG_TYPE=2
+DSCR_STRING_TYPE=3
+DSCR_INTERFACE_TYPE=4
+DSCR_ENDPOINT_TYPE=5
+DSCR_DEVQUAL_TYPE=6
+
+; for the repeating interfaces
+DSCR_INTERFACE_LEN=9
+DSCR_ENDPOINT_LEN=7
+
+; endpoint types
+ENDPOINT_TYPE_CONTROL=0
+ENDPOINT_TYPE_ISO=1
+ENDPOINT_TYPE_BULK=2
+ENDPOINT_TYPE_INT=3
+
+    .globl     _dev_dscr, _dev_qual_dscr, _highspd_dscr, _fullspd_dscr, _dev_strings, _dev_strings_end
+; These need to be in code memory.  If
+; they aren't you'll have to manully copy them somewhere
+; in code memory otherwise SUDPTRH:L don't work right
+    .area      DSCR_AREA       (CODE)
+
+_dev_dscr:
+       .db     dev_dscr_end-_dev_dscr    ; len
+       .db     DSCR_DEVICE_TYPE                  ; type
+       .dw     0x0002                                    ; usb 2.0
+       .db     0xff                                      ; class (vendor specific)
+       .db     0xff                                      ; subclass (vendor specific)
+       .db     0xff                                      ; protocol (vendor specific)
+       .db     64                                                ; packet size (ep0)
+       .dw     0xB404                                    ; vendor id 
+       .dw     0x0410                                    ; product id
+       .dw     0x0100                                    ; version id
+       .db     1                                 ; manufacturure str idx
+       .db     2                                         ; product str idx     
+       .db     0                                         ; serial str idx 
+       .db     1                                     ; n configurations
+dev_dscr_end:
+
+_dev_qual_dscr:
+       .db     dev_qualdscr_end-_dev_qual_dscr
+       .db     DSCR_DEVQUAL_TYPE
+       .dw     0x0002                              ; usb 2.0
+       .db     0xff
+       .db     0xff
+       .db     0xff
+       .db     64                                  ; max packet
+       .db     1                                                                       ; n configs
+       .db     0                                                                       ; extra reserved byte
+dev_qualdscr_end:
+
+_highspd_dscr:
+       .db     highspd_dscr_end-_highspd_dscr      ; dscr len                                                                                  ;; Descriptor length
+       .db     DSCR_CONFIG_TYPE
+    ; can't use .dw because byte order is different
+       .db     (highspd_dscr_realend-_highspd_dscr) % 256 ; total length of config lsb
+       .db     (highspd_dscr_realend-_highspd_dscr) / 256 ; total length of config msb
+       .db     1                                                                ; n interfaces
+       .db     1                                                                ; config number
+       .db     0                                                                ; config string
+       .db     0x80                             ; attrs = bus powered, no wakeup
+       .db     0x32                             ; max power = 100ma
+highspd_dscr_end:
+
+; all the interfaces next 
+; NOTE the default TRM actually has more alt interfaces
+; but you can add them back in if you need them.
+; here, we just use the default alt setting 1 from the trm
+       .db     DSCR_INTERFACE_LEN
+       .db     DSCR_INTERFACE_TYPE
+       .db     0                                ; index
+       .db     0                                ; alt setting idx
+       .db     2                                ; n endpoints  
+       .db     0xff                     ; class
+       .db     0xff
+       .db     0xff
+       .db     3                    ; string index     
+
+; endpoint 2 out
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x02                            ;  ep2 dir=OUT and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x00                            ; max packet LSB
+       .db     0x02                            ; max packet size=512 bytes
+       .db     0x00                            ; polling interval
+
+; endpoint 6 in
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x86                            ;  ep6 dir=in and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x00                            ; max packet LSB
+       .db     0x02                            ; max packet size=512 bytes
+       .db     0x00                            ; polling interval
+
+highspd_dscr_realend:
+
+    .even
+_fullspd_dscr:
+       .db     fullspd_dscr_end-_fullspd_dscr      ; dscr len
+       .db     DSCR_CONFIG_TYPE
+    ; can't use .dw because byte order is different
+       .db     (fullspd_dscr_realend-_fullspd_dscr) % 256 ; total length of config lsb
+       .db     (fullspd_dscr_realend-_fullspd_dscr) / 256 ; total length of config msb
+       .db     1                                                                ; n interfaces
+       .db     1                                                                ; config number
+       .db     0                                                                ; config string
+       .db     0x80                             ; attrs = bus powered, no wakeup
+       .db     0x32                             ; max power = 100ma
+fullspd_dscr_end:
+
+; all the interfaces next 
+; NOTE the default TRM actually has more alt interfaces
+; but you can add them back in if you need them.
+; here, we just use the default alt setting 1 from the trm
+       .db     DSCR_INTERFACE_LEN
+       .db     DSCR_INTERFACE_TYPE
+       .db     0                                ; index
+       .db     0                                ; alt setting idx
+       .db     2                                ; n endpoints  
+       .db     0xff                     ; class
+       .db     0xff
+       .db     0xff
+       .db     3                    ; string index     
+
+; endpoint 2 out
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x02                            ;  ep2 dir=OUT and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x40                            ; max packet LSB
+       .db     0x00                            ; max packet size=64 bytes
+       .db     0x00                            ; polling interval
+
+; endpoint 6 in
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x86                            ;  ep6 dir=in and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x40                            ; max packet LSB
+       .db     0x00                            ; max packet size=64 bytes
+       .db     0x00                            ; polling interval
+
+fullspd_dscr_realend:
+
+.even
+_dev_strings:
+; sample string
+_string0:
+       .db     string0end-_string0 ; len
+       .db     DSCR_STRING_TYPE
+    .db 0x09, 0x04     ; who knows
+string0end:
+; add more strings here
+
+_string1:
+    .db string1end-_string1
+    .db DSCR_STRING_TYPE
+    .ascii 'H'
+    .db 0
+    .ascii 'i'
+    .db 0
+string1end:
+
+_string2:
+    .db string2end-_string2
+    .db DSCR_STRING_TYPE
+    .ascii 'T'
+    .db 0
+    .ascii 'h'
+    .db 0
+    .ascii 'e'
+    .db 0
+    .ascii 'r'
+    .db 0
+    .ascii 'e'
+    .db 0
+string2end:
+
+_string3:
+    .db string3end-_string3
+    .db DSCR_STRING_TYPE
+    .ascii 'i'
+    .db 0
+    .ascii 'F'
+    .db 0
+    .ascii 'a'
+    .db 0
+    .ascii 'c'
+    .db 0
+    .ascii 'e'
+    .db 0
+string3end:
+    
+_dev_strings_end:
+    .dw 0x0000   ; just in case someone passes an index higher than the end to the firmware
diff --git a/fx2lib/examples/bulkloop/load.py b/fx2lib/examples/bulkloop/load.py
new file mode 100644 (file)
index 0000000..9270515
--- /dev/null
@@ -0,0 +1,5 @@
+
+from fx2load import *
+
+openfx2()
+reset_bix('bulkloop.bix')
diff --git a/fx2lib/examples/bulkloop/test.cpp b/fx2lib/examples/bulkloop/test.cpp
new file mode 100644 (file)
index 0000000..7b8ae46
--- /dev/null
@@ -0,0 +1,54 @@
+/**
+ * Copyright (C) 2009 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+#include <cstdio>
+#include <cassert>
+#include <libusb-1.0/libusb.h>
+
+int main(int argc, char* argv[]) {
+
+ libusb_context* ctx;
+ libusb_init(&ctx);
+
+ libusb_device_handle* hndl = libusb_open_device_with_vid_pid(ctx,0x04b4,0x1004);
+ libusb_claim_interface(hndl,0);
+ libusb_set_interface_alt_setting(hndl,0,0);
+ unsigned short buf[100];
+ for (int i=0;i<100;++i) {
+  buf[i]=i;
+ }
+ int transferred;
+ int rv=libusb_bulk_transfer(hndl,0x02,(unsigned char*)buf,sizeof(buf),&transferred,100);
+ if(rv) {
+  printf ( "OUT Transfer failed: %d\n", rv );
+  return rv;
+ }
+
+ unsigned short buf2[100];
+ rv=libusb_bulk_transfer(hndl,0x86,(unsigned char*)buf2,sizeof(buf2),&transferred,100); 
+ if(rv) {
+  printf ( "IN Transfer failed: %d\n", rv );
+  return rv;
+ }
+ for (int i=0;i<100;++i) {
+  printf ( "%d ", buf2[i] );
+ }
+ printf("\n");
+
+ return 0;
+}
diff --git a/fx2lib/examples/bulkloop/test.py b/fx2lib/examples/bulkloop/test.py
new file mode 100644 (file)
index 0000000..80aaf81
--- /dev/null
@@ -0,0 +1,39 @@
+# Copyright (C) 2009 Ubixum, Inc. 
+#
+# This library is free software; you can redistribute it and/or
+#
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USAimport struct
+
+
+import struct 
+
+from fx2load import *
+
+openfx2(0x04b4,0x1004)
+
+
+def do_bulk():
+    # send 100 shorts to ep2
+    
+    buf=struct.pack ( 'H'*100, *[i for i in range(100)] )
+    f.ep_bulk( buf, 0x02, 1000)
+    
+    # read them back out
+    buf='\x00'*200  
+    f.ep_bulk( buf, 0x86, 1000)
+    
+
+    print struct.unpack ( 'H'*100, buf )
+    
+[do_bulk() for i in range(3)]
diff --git a/fx2lib/examples/eeprom/client.py b/fx2lib/examples/eeprom/client.py
new file mode 100644 (file)
index 0000000..80d630f
--- /dev/null
@@ -0,0 +1,92 @@
+# Copyright (C) 2009 Ubixum, Inc. 
+#
+# This library is free software; you can redistribute it and/or
+#
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+import sys
+from fx2load import *
+
+
+def get_eeprom(addr,length):
+ assert f.isopen()
+
+ prom_val = '';
+ while len(prom_val)<length:
+     buf='\x00'*1024 # read 1024 bytes max at a time
+     transfer_len = length-len(prom_val) > 1024 and 1024 or length-len(prom_val)
+     ret=f.do_usb_command ( buf,
+         0xc0,
+         0xb1,
+       addr+len(prom_val),0,transfer_len )
+     if (ret>=0):
+        prom_val += buf[:ret]
+     else: 
+        raise Exception("eeprom read didn't work: %d" % ret )
+ return prom_val
+  
+  
+def hexchartoint(c):
+    return int(c.encode('hex'),16)
+  
+
+def fetch_eeprom():
+ """
+   See TRM 3.4.2, 3.4,3.
+   This function dynamically determines how much data to read for c2 eeprom data and downloads
+   the eeprom iic file.
+ """
+ assert f.isopen()
+ # fetch 1st 8 bytes
+ prom=get_eeprom(0,8)
+ if prom[0] == '\xc0':
+    return prom # c0 blocks are 8 bytes long
+ if prom[0] != '\xc2': raise Exception ( "Envalid eeprom (%s)" % prom[0].encode('hex') )
+ # the length of the 1st data block is bytes 8,9 (0 based)
+ read_addr=8
+ while True:
+    size_read = get_eeprom(read_addr,4) # get the data length and start address
+    prom += size_read
+    read_addr+=4
+    # if this is the end 0x80 0x01 0xe6 0x00, then break
+    if size_read == '\x80\x01\xe6\x00': break
+    # else it is a data block 
+    size = (hexchartoint(size_read[0]) << 8) + hexchartoint(size_read[1])
+    print "Next eeprom data size %d" % size
+    prom += get_eeprom(read_addr,size)
+    read_addr+=size
+ # one last byte
+ prom += get_eeprom(read_addr,1) # should always be 0
+ assert prom[-1] == '\x00'
+ return prom
+
+def set_eeprom(prom):
+   assert f.isopen()
+   bytes_written=0;
+   while bytes_written<len(prom):
+        # attemp 1024 at a time
+        to_write=len(prom)-bytes_written > 1024 and 1024 or len(prom)-bytes_written
+        print "Writing %d Bytes.." % to_write
+        ret=f.do_usb_command(prom[bytes_written:bytes_written+to_write], 0x40,0xb1,bytes_written, 0, to_write, 10000)
+        if ret>0:
+            bytes_written += ret;
+        else:
+            raise Exception ( "eeprom write didn't work: %d" % ret )
+
+if __name__=='__main__':
+
+   openfx2(0x04b4,0x0083) # vid/pid of eeprom firmware 
+
diff --git a/fx2lib/examples/eeprom/firmware/Makefile b/fx2lib/examples/eeprom/firmware/Makefile
new file mode 100644 (file)
index 0000000..173bcfb
--- /dev/null
@@ -0,0 +1,6 @@
+FX2LIBDIR=../../..
+BASENAME = eeprom
+SOURCES=eeprom.c
+A51_SOURCES=dscr.a51
+
+include $(FX2LIBDIR)/lib/fx2.mk
diff --git a/fx2lib/examples/eeprom/firmware/dscr.a51 b/fx2lib/examples/eeprom/firmware/dscr.a51
new file mode 100644 (file)
index 0000000..515d6e1
--- /dev/null
@@ -0,0 +1,277 @@
+; Copyright (C) 2009 Ubixum, Inc. 
+;
+; This library is free software; you can redistribute it and/or
+; modify it under the terms of the GNU Lesser General Public
+; License as published by the Free Software Foundation; either
+; version 2.1 of the License, or (at your option) any later version.
+; 
+; This library is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+; Lesser General Public License for more details.
+; 
+; You should have received a copy of the GNU Lesser General Public
+; License along with this library; if not, write to the Free Software
+; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+; this is a the default 
+; full speed and high speed 
+; descriptors found in the TRM
+; change however you want but leave 
+; the descriptor pointers so the setupdat.c file works right
+
+.module DEV_DSCR 
+
+; descriptor types
+; same as setupdat.h
+DSCR_DEVICE_TYPE=1
+DSCR_CONFIG_TYPE=2
+DSCR_STRING_TYPE=3
+DSCR_INTERFACE_TYPE=4
+DSCR_ENDPOINT_TYPE=5
+DSCR_DEVQUAL_TYPE=6
+
+; for the repeating interfaces
+DSCR_INTERFACE_LEN=9
+DSCR_ENDPOINT_LEN=7
+
+; endpoint types
+ENDPOINT_TYPE_CONTROL=0
+ENDPOINT_TYPE_ISO=1
+ENDPOINT_TYPE_BULK=2
+ENDPOINT_TYPE_INT=3
+
+    .globl     _dev_dscr, _dev_qual_dscr, _highspd_dscr, _fullspd_dscr, _dev_strings, _dev_strings_end
+; These need to be in code memory.  If
+; they aren't you'll have to manully copy them somewhere
+; in code memory otherwise SUDPTRH:L don't work right
+    .area  DSCR_AREA   (CODE)
+
+_dev_dscr:
+       .db     dev_dscr_end-_dev_dscr    ; len
+       .db     DSCR_DEVICE_TYPE                  ; type
+       .dw     0x0002                                    ; usb 2.0
+       .db     0xff                                      ; class (vendor specific)
+       .db     0xff                                      ; subclass (vendor specific)
+       .db     0xff                                      ; protocol (vendor specific)
+       .db     64                                                ; packet size (ep0)
+       .dw     0xb404                        ; vendor id 
+       .dw     0x8300                                    ; product id
+       .dw     0x0100                                    ; version id
+       .db     0                                 ; manufacturure str idx                               
+       .db     1                                         ; product str idx     
+       .db     0                                         ; serial str idx 
+       .db     1                                     ; n configurations
+dev_dscr_end:
+
+_dev_qual_dscr:
+       .db     dev_qualdscr_end-_dev_qual_dscr
+       .db     DSCR_DEVQUAL_TYPE
+       .dw     0x0002                              ; usb 2.0
+       .db     0xff
+       .db     0xff
+       .db     0xff
+       .db     64                                  ; max packet
+       .db     1                                                                       ; n configs
+       .db     0                                                                       ; extra reserved byte
+dev_qualdscr_end:
+
+_highspd_dscr:
+       .db     highspd_dscr_end-_highspd_dscr      ; dscr len                                                                                  ;; Descriptor length
+       .db     DSCR_CONFIG_TYPE
+    ; can't use .dw because byte order is different
+       .db     (highspd_dscr_realend-_highspd_dscr) % 256 ; total length of config lsb
+       .db     (highspd_dscr_realend-_highspd_dscr) / 256 ; total length of config msb
+       .db     1                                                                ; n interfaces
+       .db     1                                                                ; config number
+       .db     0                                                                ; config string
+       .db     0x80                             ; attrs = bus powered, no wakeup
+       .db     0x32                             ; max power = 100ma
+highspd_dscr_end:
+
+; all the interfaces next 
+; NOTE the default TRM actually has more alt interfaces
+; but you can add them back in if you need them.
+; here, we just use the default alt setting 1 from the trm
+       .db     DSCR_INTERFACE_LEN
+       .db     DSCR_INTERFACE_TYPE
+       .db     0                                ; index
+       .db     0                                ; alt setting idx
+       .db     6                                ; n endpoints  
+       .db     0xff                     ; class
+       .db     0xff
+       .db     0xff
+       .db     0                    ; string index     
+
+; endpoint 1 out
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x01                            ;  ep1 dir=out and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x00                            ; max packet LSB
+       .db     0x02                            ; max packet size=512 bytes
+       .db     0x00                            ; polling interval
+      
+; endpoint 1 in 
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x81                            ;  ep1 dir=in and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x00                            ; max packet LSB
+       .db     0x02                            ; max packet size=512 bytes
+       .db     0x00                            ; polling interval
+
+; endpoint 2 out
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x02                            ;  ep2 dir=OUT and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x00                            ; max packet LSB
+       .db     0x02                            ; max packet size=512 bytes
+       .db     0x00                            ; polling interval
+
+; endpoint 4 out
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x04                            ;  ep4 dir=OUT and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x00                            ; max packet LSB
+       .db     0x02                            ; max packet size=512 bytes
+       .db     0x00                            ; polling interval
+
+; endpoint 6 in
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x86                            ;  ep6 dir=in and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x00                            ; max packet LSB
+       .db     0x02                            ; max packet size=512 bytes
+       .db     0x00                            ; polling interval
+
+; endpoint 8 in
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x88                            ;  ep8 dir=in and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x00                            ; max packet LSB
+       .db     0x02                            ; max packet size=512 bytes
+       .db     0x00                            ; polling interval
+highspd_dscr_realend:
+
+    .even
+_fullspd_dscr:
+       .db     fullspd_dscr_end-_fullspd_dscr      ; dscr len
+       .db     DSCR_CONFIG_TYPE
+    ; can't use .dw because byte order is different
+       .db     (fullspd_dscr_realend-_fullspd_dscr) % 256 ; total length of config lsb
+       .db     (fullspd_dscr_realend-_fullspd_dscr) / 256 ; total length of config msb
+       .db     1                                                                ; n interfaces
+       .db     1                                                                ; config number
+       .db     0                                                                ; config string
+       .db     0x80                             ; attrs = bus powered, no wakeup
+       .db     0x32                             ; max power = 100ma
+fullspd_dscr_end:
+
+; all the interfaces next 
+; NOTE the default TRM actually has more alt interfaces
+; but you can add them back in if you need them.
+; here, we just use the default alt setting 1 from the trm
+       .db     DSCR_INTERFACE_LEN
+       .db     DSCR_INTERFACE_TYPE
+       .db     0                                ; index
+       .db     0                                ; alt setting idx
+       .db     6                                ; n endpoints  
+       .db     0xff                     ; class
+       .db     0xff
+       .db     0xff
+       .db     0                    ; string index     
+
+; endpoint 1 out
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x01                            ;  ep1 dir=out and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x40                            ; max packet LSB
+       .db     0x00                            ; max packet size=64 bytes
+       .db     0x00                            ; polling interval
+      
+; endpoint 1 in 
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x81                            ;  ep1 dir=in and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x40                            ; max packet LSB
+       .db     0x00                            ; max packet size=64 bytes
+       .db     0x00                            ; polling interval
+
+; endpoint 2 out
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x02                            ;  ep2 dir=OUT and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x40                            ; max packet LSB
+       .db     0x00                            ; max packet size=64 bytes
+       .db     0x00                            ; polling interval
+
+; endpoint 4 out
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x04                            ;  ep4 dir=OUT and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x40                            ; max packet LSB
+       .db     0x00                            ; max packet size=64 bytes
+       .db     0x00                            ; polling interval
+
+; endpoint 6 in
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x86                            ;  ep6 dir=in and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x40                            ; max packet LSB
+       .db     0x00                            ; max packet size=64 bytes
+       .db     0x00                            ; polling interval
+; endpoint 6 in
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x88                            ;  ep6 dir=in and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x40                            ; max packet LSB
+       .db     0x00                            ; max packet size=64 bytes
+       .db     0x00                            ; polling interval
+fullspd_dscr_realend:
+
+    .even
+_dev_strings:
+; sample string
+_string0:
+       .db     string0end-_string0 ; len
+       .db     DSCR_STRING_TYPE
+    .db 0x09, 0x04 ; 0x0409 is the language code for English.  Possible to add more codes after this. 
+string0end:
+; add more strings here
+
+string1:
+    .db string1end-string1
+    .db DSCR_STRING_TYPE
+    .ascii 'U'
+    .db 0
+    .ascii 's'
+    .db 0
+    .ascii 'b'
+    .db 0
+    .ascii ' '
+    .db 0
+    .ascii 'T'
+    .db 0
+    .ascii 'e'
+    .db 0
+    .ascii 'r'
+    .db 0
+    .ascii 'm'
+    .db 0
+string1end:
+
+_dev_strings_end:
+    .dw 0x0000
+; in case you wanted to look at memory between _dev_strings and _dev_strings_end
diff --git a/fx2lib/examples/eeprom/firmware/eeprom.c b/fx2lib/examples/eeprom/firmware/eeprom.c
new file mode 100644 (file)
index 0000000..3f30adc
--- /dev/null
@@ -0,0 +1,169 @@
+/**
+ * Copyright (C) 2009 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <string.h>
+#include <stdio.h>
+
+#include <fx2regs.h>
+#include <fx2macros.h>
+#include <autovector.h>
+#include <setupdat.h>
+#include <i2c.h>
+#include <lights.h>
+#include <serial.h>
+#include <gpif.h>
+#include <eputils.h>
+
+#define SYNCDELAY() SYNCDELAY4;
+
+volatile bit dosud;
+bit on;
+WORD count;
+
+
+void main() {
+
+ REVCTL = 0; // not using advanced endpoint controls
+
+ dosud=FALSE;
+ on=FALSE;
+ REVCTL = 0x03; // DYN_OUT=1, ENH_PKT=1
+ RENUMERATE_UNCOND();
+
+ SETCPUFREQ(CLK_48M);
+ sio0_init(57600); // needed for printf on sio0 
+ USE_USB_INTS();
+ ENABLE_SUDAV();
+ ENABLE_USBRESET();
+ ENABLE_HISPEED();
+ EA=1;
+
+ while(TRUE) {
+
+ //printf ( "sud is %d\n" , dosud );
+ if (dosud) {
+   handle_setupdata();
+   dosud=FALSE;
+ } 
+
+ }
+
+}
+
+
+#define VC_EEPROM 0xb1
+        
+BOOL handle_vendorcommand(BYTE cmd) {
+ WORD addr=SETUP_VALUE(),len=SETUP_LENGTH();
+ printf ( "Handle Vendor Command %02x, addr %d, len %d\n" , cmd, addr, len );
+ switch (cmd) {
+    case VC_EEPROM:
+        {            
+            // wait for ep0 not busy
+            switch (SETUP_TYPE) {
+            case 0xc0:
+                 while (len) { // still have bytes to read
+                    BYTE cur_read = len > 64 ? 64 : len; // can't read more than 64 bytes at a time
+                    while (EP0CS&bmEPBUSY); // can't do this until EP0 is ready                
+                    eeprom_read(0x51, addr, cur_read, EP0BUF );
+                    EP0BCH=0;
+                    SYNCDELAY();
+                    EP0BCL=cur_read;
+                    len -= cur_read;
+                    addr += cur_read;
+                }
+                break;
+            case 0x40:                
+                while (len) {
+                   BYTE cur_write, c;
+//                   printf ( "Len More Bytes %d\n" , len );
+                   EP0BCL = 0; // allow pc transfer in
+                   while(EP0CS & bmEPBUSY); // wait
+                   cur_write=EP0BCL;
+//                   printf ( "Writing %d Bytes to %d..\n", cur_write, addr );
+                   if ( !eeprom_write(0x51, addr, cur_write, EP0BUF ) ) return FALSE;
+                   addr += cur_write;
+                   len -= cur_write;
+                }
+                break;
+             default:
+                return FALSE; // bad type
+            }
+            
+            printf ( "All OK\n" );
+            return TRUE;
+        }
+    }
+ return FALSE;
+}
+  
+
+// set *alt_ifc to the current alt interface for ifc
+BOOL handle_get_interface(BYTE ifc, BYTE* alt_ifc) {
+ *alt_ifc=0;
+ return TRUE;
+}
+// return TRUE if you set the interface requested
+// NOTE this function should reconfigure and reset the endpoints
+// according to the interface descriptors you provided.
+BOOL handle_set_interface(BYTE ifc,BYTE alt_ifc) {  
+ //return ifc==0&&alt_ifc==0; 
+ printf ( "Host wants to set interface: %d\n", alt_ifc );
+ return TRUE;
+}
+// handle getting and setting the configuration
+// 0 is the default.  If you support more than one config
+// keep track of the config number and return the correct number
+// config numbers are set int the dscr file.
+volatile BYTE config=1;
+BYTE handle_get_configuration() { 
+ return config; 
+}
+// return TRUE if you handle this request
+// NOTE changing config requires the device to reset all the endpoints
+BOOL handle_set_configuration(BYTE cfg) { 
+ printf ( "host wants config: %d\n" , cfg );
+ config=cfg; 
+ return TRUE;
+}
+
+
+void sudav_isr() interrupt SUDAV_ISR {
+ dosud=TRUE;
+ CLEAR_SUDAV();
+}
+
+void usbreset_isr() interrupt USBRESET_ISR {
+ handle_hispeed(FALSE);
+ CLEAR_USBRESET();
+}
+void hispeed_isr() interrupt HISPEED_ISR {
+ handle_hispeed(TRUE);
+ CLEAR_HISPEED();
+}
+
diff --git a/fx2lib/examples/fx2/.gitignore b/fx2lib/examples/fx2/.gitignore
new file mode 100644 (file)
index 0000000..6f97ca1
--- /dev/null
@@ -0,0 +1,2 @@
+build
+*.pyc
diff --git a/fx2lib/examples/fx2/cpp/.gitignore b/fx2lib/examples/fx2/cpp/.gitignore
new file mode 100644 (file)
index 0000000..c300f8b
--- /dev/null
@@ -0,0 +1,2 @@
+fx2.py
+fx2_wrap.cpp
diff --git a/fx2lib/examples/fx2/cpp/__init__.py b/fx2lib/examples/fx2/cpp/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/fx2lib/examples/fx2/cpp/fx2.cpp b/fx2lib/examples/fx2/cpp/fx2.cpp
new file mode 100644 (file)
index 0000000..f53fbea
--- /dev/null
@@ -0,0 +1,161 @@
+/**
+ * Copyright (C) 2009 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <cstdio>
+#include <cassert>
+
+#include "fx2.h"
+
+
+fx2::fx2():dev_handle(NULL) {
+
+ int rv=libusb_init(&libusb_ctx);
+ assert(!rv);
+ libusb_set_debug(libusb_ctx,0);
+}
+
+void fx2::set_debug_level(int n) {
+ libusb_set_debug(libusb_ctx,n);
+}
+
+fx2::~fx2() {
+
+ if (isopen()) close();
+ libusb_exit(libusb_ctx);
+}
+
+#define CHECK_OPEN(r) if (!dev_handle) {\
+    printf ( "Device not opened.\n" ); \
+    return r;\
+    }
+
+
+void fx2::open(int vid,int pid,int idx) {
+
+    libusb_device **list;
+    int devices = libusb_get_device_list( libusb_ctx, &list );
+    int cur_idx=0;
+    for ( int i=0;i<devices;++i) {
+       libusb_device_descriptor dscr;
+       if ( !libusb_get_device_descriptor ( list[i], &dscr ) ) {
+          if ( dscr.idVendor == vid && dscr.idProduct == pid ) {
+             if ( idx == cur_idx++ ) {
+                int rv = libusb_open( list[i], &dev_handle);
+                if (!rv) {
+                    rv=libusb_claim_interface(dev_handle,0);
+                    if (!rv) {                     interface=0;
+                     rv=libusb_set_interface_alt_setting(dev_handle,0,0);
+                     if (rv) {
+                        libusb_close(dev_handle);
+                        dev_handle=NULL;
+                     }
+                     alt_setting=0;
+                   } else {
+                    libusb_close(dev_handle);
+                    dev_handle=NULL;
+                   }
+                } else {
+                    printf ( "Unable to open device idx: %d, ret: %d\n", idx, rv );
+                }
+             }
+          }
+       }
+    }
+    
+    if (!dev_handle) {
+        printf ( "Device not opened.\n" );
+    }
+    libusb_free_device_list(list,1);
+}
+void fx2::set_interface(int iface, int alt){
+    CHECK_OPEN()
+    if (interface != iface) {
+        libusb_release_interface(dev_handle,interface);
+        int rv=libusb_claim_interface(dev_handle,iface);
+        assert(!rv);
+        this->interface=iface;
+    }
+    int rv=libusb_set_interface_alt_setting(dev_handle,interface,alt);
+    assert(!rv);
+    alt_setting=alt;
+}
+void fx2::close() {
+    CHECK_OPEN()
+    libusb_release_interface(dev_handle,interface);
+    libusb_close(dev_handle);
+    dev_handle=NULL;
+    interface=0;alt_setting=0;
+}
+
+
+int fx2::do_usb_command(char* buf, int size, unsigned char type, unsigned char request, unsigned short value, unsigned short index, unsigned short length, int timeout ) {
+ CHECK_OPEN(-1)
+ return libusb_control_transfer (
+    dev_handle,
+    type,
+    request,
+    value,
+    index,
+    (unsigned char*)buf,
+    length,
+    timeout);
+}
+
+int fx2::clear_halt(char ep) {
+    CHECK_OPEN(-1)
+    return libusb_clear_halt(dev_handle,(unsigned char)ep);
+}
+
+int fx2::reset() {
+    CHECK_OPEN(-1)
+    int rv=libusb_reset_device(dev_handle);
+    if (rv==LIBUSB_ERROR_NO_DEVICE) {
+        printf ( "Device Changed.  Closing\n");
+        libusb_close(dev_handle);
+        interface=0;alt_setting=0;
+    }
+    return rv;
+}
+
+int fx2::set_configuration(int configuration) {
+    CHECK_OPEN(-1)
+    libusb_release_interface(dev_handle,interface);
+    int rv=libusb_set_configuration(dev_handle,configuration);
+    if (!rv) {
+        libusb_claim_interface(dev_handle,interface);
+    }
+}
+
+
+bool fx2::ep_bulk(char* buf, int size, unsigned char ep, int timeout) {
+ CHECK_OPEN(-1)
+ int transferred;
+ int rv=libusb_bulk_transfer ( dev_handle, ep, (unsigned char*)buf, size, &transferred, timeout );
+
+ if (!rv) return true; 
+
+ if (rv==LIBUSB_ERROR_TIMEOUT) {
+    printf ( "Transfer Timeout.  %d bytes transferred.\n", transferred );
+ } else if (rv<0) {
+    printf ( "Transfer Error: %d\n", rv );
+ }
+
+ return false;
+
+}
diff --git a/fx2lib/examples/fx2/cpp/fx2.h b/fx2lib/examples/fx2/cpp/fx2.h
new file mode 100644 (file)
index 0000000..bb61613
--- /dev/null
@@ -0,0 +1,61 @@
+/**
+ * Copyright (C) 2009 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#ifndef FX2_H
+#define FX2_H
+
+#include <libusb-1.0/libusb.h>
+
+const int VID=0x04b4;
+const int PID=0x0082;
+
+class fx2 {
+    
+    private:
+        libusb_context* libusb_ctx;
+        libusb_device_handle* dev_handle;
+        int interface,alt_setting;
+        
+    public:
+        fx2();
+        ~fx2();
+        /**
+         * open
+         * vid = vendor id
+         * pid = product id
+         * idx = nth device if there are more than one.
+         *
+         * Opens device with vid,pid and claims alt 0 of interface 0
+         **/
+        void open(int vid=VID,int pid=PID, int idx=0);
+        void set_interface(int interface, int alt_setting);
+        bool isopen() { return dev_handle != NULL; }
+        void close();
+        /**
+         * level n = 0-3
+         */
+        void set_debug_level(int n);
+        int do_usb_command(char* buf, int size, unsigned char type, unsigned char request, unsigned short value, unsigned short index, unsigned short length, int timeout=1000 );
+        int clear_halt(char ep);
+        int reset();
+        int set_configuration(int config);
+        bool ep_bulk(char* buf, int size, unsigned char ep, int timeout);
+
+};
+
+#endif
diff --git a/fx2lib/examples/fx2/cpp/fx2.i b/fx2lib/examples/fx2/cpp/fx2.i
new file mode 100644 (file)
index 0000000..9ffbc96
--- /dev/null
@@ -0,0 +1,30 @@
+/**
+ * Copyright (C) 2009 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+/* interface file for python/swig */
+
+%module fx2
+//%include "typemaps.i"
+%include "cdata.i"
+%apply (char* STRING, int LENGTH)  { (char* buf, int size) }
+
+%{
+#include "fx2.h"
+%}
+
+%include "fx2.h"
diff --git a/fx2lib/examples/fx2/fx2load/__init__.py b/fx2lib/examples/fx2/fx2load/__init__.py
new file mode 100644 (file)
index 0000000..12465ec
--- /dev/null
@@ -0,0 +1,59 @@
+# Copyright (C) 2009 Ubixum, Inc. 
+#
+# This library is free software; you can redistribute it and/or
+#
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+from time import sleep
+from fx2 import fx2
+
+f=fx2.fx2()
+
+# use this functions 1st
+
+def openfx2(vid=0x04b4,pid=0x0082,idx=0):
+    f.open(vid,pid,idx)
+
+def reset_device(reset):
+ print reset and "Put device in reset" or "Set device to run"
+ write_ram (0xe600,reset and '\x01' or '\x00', 1)
+def write_ram(addr,data,length):
+ transferred=0
+ while(transferred<length):
+  this_transfer_size=length-transferred>1024 and 1024 or length-transferred
+  buf=data[transferred:]
+  ret=f.do_usb_command( buf,
+    0x40,
+    0xa0,
+    addr+transferred, 0,
+    this_transfer_size )
+  if (ret>0):
+   print "wrote %d bytes" % ret
+   transferred+=ret
+  else:
+   print "Error: %d" % ret
+   return
+
+def reset_bix(filename):
+ """
+  Use this function to reset your firmware.  You'll need to reopen the device afterward.
+ """
+ reset_device(True)
+ bix=open(filename).read()
+ print "loading bix file of length: %d" % len(bix) 
+ write_ram( 0, bix,len(bix) );
+ reset_device(False)
+ f.close()
+
diff --git a/fx2lib/examples/fx2/scripts/fx2load b/fx2lib/examples/fx2/scripts/fx2load
new file mode 100755 (executable)
index 0000000..b461c6b
--- /dev/null
@@ -0,0 +1,34 @@
+#!/bin/env python
+
+# Copyright (C) 2009 Ubixum, Inc. 
+#
+# This library is free software; you can redistribute it and/or
+#
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+import optparse
+
+parser=optparse.OptionParser (usage="Usage: %prog [options] bixfile")
+parser.add_option( "-v", "--vid", type='int', default=0x04b4,help='Vendor ID (0x04b4)')
+parser.add_option( "-p", '--pid', type='int', default=0x0082,help='Product Id (0x0082)')
+
+opts,args=parser.parse_args()
+
+if len(args) < 1:
+    parser.error("Specify the path to your firmware bix file as the first argument")
+
+from fx2load import *
+openfx2(opts.vid,opts.pid)
+reset_bix(args[0])
diff --git a/fx2lib/examples/fx2/setup.py b/fx2lib/examples/fx2/setup.py
new file mode 100644 (file)
index 0000000..53a6d41
--- /dev/null
@@ -0,0 +1,19 @@
+from distutils.core import setup, Extension
+
+fx2_mod = Extension (
+ '_fx2',
+ sources=['cpp/fx2.cpp', 'cpp/fx2.i'],
+ swig_opts=['-c++'],
+ include_dirs = ['/usr/include/python2.5'],
+ libraries = ['usb-1.0']
+)
+
+
+setup(
+ name='fx2',
+ version='0.2',
+ ext_modules=[fx2_mod],
+ scripts=['scripts/fx2load'],
+ packages=['fx2load','fx2'],
+ package_dir={'fx2':'cpp'}
+)
diff --git a/fx2lib/examples/i2c/Makefile b/fx2lib/examples/i2c/Makefile
new file mode 100644 (file)
index 0000000..b21e70a
--- /dev/null
@@ -0,0 +1,8 @@
+FX2LIBDIR=../..
+BASENAME = i2c
+SOURCES=i2c.c
+DSCR_AREA=
+INT2JT=
+include $(FX2LIBDIR)/lib/fx2.mk        
+
+
diff --git a/fx2lib/examples/i2c/i2c.c b/fx2lib/examples/i2c/i2c.c
new file mode 100644 (file)
index 0000000..7af95bb
--- /dev/null
@@ -0,0 +1,92 @@
+/**
+ * Copyright (C) 2009 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+
+
+#include <fx2regs.h>
+
+#include <i2c.h>
+
+#define LED_ADDR 0x21
+#define BTN_ADDR 0x20
+
+#define KEY_F1 0
+#define KEY_F2 1
+#define KEY_F3 2
+#define KEY_F4 3
+
+
+BYTE digits[] = { 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x98, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e  };
+
+
+/**
+ * This is pretty much the same function that is provided as the dev_io example from Cypress
+ * Except is uses i2c read and write functions not from their library
+ **/
+void main(void) {
+
+    BYTE    num = 0;
+    //BYTE xdata       buttons;
+    BYTE    buttons;
+       BYTE    kstates = 0xff;
+       BYTE    kdeltas;
+       BYTE    key;
+       BYTE    display = 1;
+
+       while(1)
+       {
+               i2c_read ( BTN_ADDR, 1, &buttons );
+
+               kdeltas = kstates ^ buttons;                    // 
+               kstates = buttons;
+               key = 0;
+
+               while(kdeltas)
+               {
+                       if(kdeltas & 0x01)
+                       {
+                               if(!((kstates >> key) & 0x01))
+                                       switch(key)
+                                       {
+                        case KEY_F1: // wakeup?
+                                                       num = 0;
+                                                       break;
+                                               case KEY_F2:
+                                                       if(--num > 0x0f)
+                                                               num = 0x0f;
+                                                       break;
+                                               case KEY_F3:
+                                                       if(++num > 0x0f)
+                                                               num = 0;
+                                                       break;                                          
+                                               case KEY_F4:
+                                                       num = 0x0f;
+                                       }
+                               display = 1;
+                       }
+                       kdeltas = kdeltas >> 1;
+                       ++key;
+               }
+               if(display)
+               {
+            i2c_write ( LED_ADDR, 1, &digits[num], 0, NULL );
+                       display = 0;
+               }
+    }
+
+}
diff --git a/fx2lib/examples/i2c/load.py b/fx2lib/examples/i2c/load.py
new file mode 100644 (file)
index 0000000..0274237
--- /dev/null
@@ -0,0 +1,20 @@
+# Copyright (C) 2009 Ubixum, Inc. 
+#
+# This library is free software; you can redistribute it and/or
+#
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USAimport struct
+from fx2load import *
+
+openfx2()
+reset_bix('i2c.bix')
diff --git a/fx2lib/examples/lights/.gitignore b/fx2lib/examples/lights/.gitignore
new file mode 100644 (file)
index 0000000..32d2545
--- /dev/null
@@ -0,0 +1 @@
+lights
diff --git a/fx2lib/examples/lights/Makefile b/fx2lib/examples/lights/Makefile
new file mode 100644 (file)
index 0000000..0abc9d4
--- /dev/null
@@ -0,0 +1,8 @@
+FX2LIBDIR=../..
+BASENAME = lights
+SOURCES=lights.c
+DSCR_AREA=
+INT2JT=
+include $(FX2LIBDIR)/lib/fx2.mk
+
+
diff --git a/fx2lib/examples/lights/lights.c b/fx2lib/examples/lights/lights.c
new file mode 100644 (file)
index 0000000..286609a
--- /dev/null
@@ -0,0 +1,37 @@
+/**
+ * Copyright (C) 2009 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <fx2regs.h>
+
+#include <lights.h>
+#include <delay.h>
+
+volatile xdata BYTE* bytes[] = { &D2ON, &D3ON, &D4ON, &D5ON, &D2OFF, &D3OFF, &D4OFF, &D5OFF };
+
+void main(void)
+{
+    volatile BYTE tmp;
+       BYTE cur=0;
+
+    // loop endlessly
+    for(;;) {
+       tmp=*bytes[cur];
+       delay(50);
+       cur = cur == 7 ? 0 : cur+1;
+    }
+}
diff --git a/fx2lib/examples/reset/Makefile b/fx2lib/examples/reset/Makefile
new file mode 100644 (file)
index 0000000..1731c0a
--- /dev/null
@@ -0,0 +1,8 @@
+FX2LIBDIR=../..
+BASENAME = reset
+SOURCES=reset.c fx2_c0.c
+DSCR_AREA=
+INT2JT=
+include $(FX2LIBDIR)/lib/fx2.mk
+
+
diff --git a/fx2lib/examples/reset/fx2_c0.c b/fx2lib/examples/reset/fx2_c0.c
new file mode 100644 (file)
index 0000000..ce801fd
--- /dev/null
@@ -0,0 +1,4 @@
+xdata unsigned char fx2_c0[] = {
+ 0xc0, 0xb4, 0x04, 0x82,
+ 0x00, 0x00, 0x00, 0x00
+};
diff --git a/fx2lib/examples/reset/reset.c b/fx2lib/examples/reset/reset.c
new file mode 100644 (file)
index 0000000..b9ddff9
--- /dev/null
@@ -0,0 +1,82 @@
+/**
+ * Copyright (C) 2009 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <stdio.h>
+
+#include <fx2regs.h>
+#include <fx2macros.h>
+
+#include <serial.h>
+#include <delay.h>
+#include <i2c.h>
+#include <lights.h>
+
+#define LG_PROM 0x51  // large prom ( is 16 bit addr mode)
+
+#define READ_SIZE 100
+
+xdata BYTE buf[READ_SIZE];
+
+#define IIC_SIZE 8
+extern xdata BYTE fx2_c0[];
+
+/*
+ Modified eeprom_write that always uses two byte buffer.
+ So can write to LG_PROM w/ out recompiling lib.
+ (The library dynamically detects the prom based on the startup state.
+  On the dev board, you can switch the prom with EEPROM select while
+  the firmware is running.)
+*/
+void eeprom_write_local(BYTE prom_addr, WORD addr, WORD length, BYTE* buf) {
+    BYTE addr_len=0;
+    // 1st bytes of buffer are address and next byte is value
+    BYTE data_buffer[3];
+    BYTE cur_byte=0;
+    
+    while ( cur_byte<length ) {
+        addr_len=0;
+        printf ( "%d %04x:%02x\n", cur_byte, addr, buf[cur_byte]);
+        data_buffer[addr_len++] = MSB(addr);
+        data_buffer[addr_len++] = LSB(addr);
+        data_buffer[addr_len++] = buf[cur_byte++];
+        i2c_write ( prom_addr, addr_len, data_buffer, 0, NULL );
+        ++addr; // next byte goes to next address
+    }
+    
+}
+
+void main() {
+    
+ BOOL on=FALSE;
+ unsigned int size=0;
+
+ SETCPUFREQ(CLK_48M);
+ sio0_init(57600);
+ eeprom_write_local(LG_PROM, 0, IIC_SIZE, fx2_c0);
+
+ while (1) {
+    delay(1000);
+    if (on) {d5on();} else {d5off();}
+    on = !on;    
+ }
+
+}
diff --git a/fx2lib/examples/serial/Makefile b/fx2lib/examples/serial/Makefile
new file mode 100644 (file)
index 0000000..8ac71af
--- /dev/null
@@ -0,0 +1,8 @@
+FX2LIBDIR=../..
+BASENAME = serial
+SOURCES=serial.c
+DSCR_AREA=
+INT2JT=
+include $(FX2LIBDIR)/lib/fx2.mk
+
+
diff --git a/fx2lib/examples/serial/serial.c b/fx2lib/examples/serial/serial.c
new file mode 100644 (file)
index 0000000..767bb9f
--- /dev/null
@@ -0,0 +1,81 @@
+/**
+ * Copyright (C) 2009 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <stdio.h>
+
+#include <fx2regs.h>
+#include <fx2macros.h>
+#include <lights.h>
+#include <serial.h>
+
+
+
+volatile BYTE ctr=0;
+BYTE ctr_repeat=200;
+volatile BOOL on=FALSE;
+
+
+void timer1_isr() interrupt 3 __critical {
+       
+ if (ctr == 0) { // timer overflowed ctr_repeat times
+  if (on) {
+     d2on();
+  } else {
+     d2off();
+  }
+  on = !on;  
+ }
+ ctr = ctr >= ctr_repeat ? 0 : ctr + 1;
+}
+
+
+
+void main(void)
+{
+
+    SETCPUFREQ(CLK_48M);
+
+    // if this image is loaded to as iic to
+    // the eeprom
+    // the C2 bit will turn this on
+    // turn it back off so the device can 
+    // handle usb requests
+    USBCS &= ~bmRENUM;
+
+       EA=1; // enable interrupts
+
+    sio0_init(57600);
+    
+       // timer 0 setup
+       
+       TL1=TH1=0; // start at 0
+       ET1=1; // timer 1 interrupts
+       TR1=1; // start timer 1
+       
+       
+       d5off(); // end init
+       
+       while (1) {
+               char r=getchar();
+               putchar(r);
+       }
+
+
+}
diff --git a/fx2lib/examples/timers/.gitignore b/fx2lib/examples/timers/.gitignore
new file mode 100644 (file)
index 0000000..2fdd3f2
--- /dev/null
@@ -0,0 +1 @@
+timers
diff --git a/fx2lib/examples/timers/Makefile b/fx2lib/examples/timers/Makefile
new file mode 100644 (file)
index 0000000..4e2384e
--- /dev/null
@@ -0,0 +1,8 @@
+FX2LIBDIR=../..
+BASENAME = timers
+SOURCES=timers.c
+DSCR_AREA=
+INT2JT=
+include $(FX2LIBDIR)/lib/fx2.mk
+
+
diff --git a/fx2lib/examples/timers/timers.c b/fx2lib/examples/timers/timers.c
new file mode 100644 (file)
index 0000000..8ee69fd
--- /dev/null
@@ -0,0 +1,79 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <fx2regs.h>
+#include <fx2macros.h>
+#include <fx2ints.h>
+#include <lights.h>
+
+volatile bit d2;
+volatile bit d3;
+volatile bit d4;
+volatile bit d5;
+
+void timer0_isr() interrupt TF0_ISR {
+ d2 = !d2;
+ if (d2) { d2on(); } else { d2off(); }
+}
+
+void timer1_isr() interrupt TF1_ISR {
+ d3 = !d3;
+ if (d3) { d3on(); } else { d3off(); }
+}
+
+void timer2_isr() interrupt TF2_ISR {
+ d4 = !d4;
+ if (d4) { d4on(); } else { d4off(); }
+
+ CLEAR_TIMER2(); // This one is not done automatically!
+}
+
+
+void main(void)
+{
+    WORD counter=0;
+
+    SETCPUFREQ(CLK_12M);
+
+    // enable timer 0 and timer 1 to be 16 bit counters
+    TMOD = 0x11; 
+
+    // enable timer 2 to also be a 16 bit counter
+    T2CON = 0;
+    RCAP2L = 0; // reload values for t2
+    RCAP2H = 0; 
+
+    EA=1; // enable interrupts
+    ENABLE_TIMER0();
+    ENABLE_TIMER1();
+    ENABLE_TIMER2();
+    TR0=1; // start t0
+    TR1=1; // start t1 
+    TR2=1; // start t2
+
+    // and blink d5
+    while (TRUE) {
+        ++counter;
+        if (!counter) {
+            d5 = !d5;
+            if (d5) { d5off(); } else { d5on(); }
+        }
+    }
+}
+
+
diff --git a/fx2lib/fw/.gitignore b/fx2lib/fw/.gitignore
new file mode 100644 (file)
index 0000000..42e046d
--- /dev/null
@@ -0,0 +1,9 @@
+*.asm
+*.lst
+*.rel
+*.rst
+*.sym
+*.map
+*.mem
+*.bix
+*.iic
diff --git a/fx2lib/fw/Makefile b/fx2lib/fw/Makefile
new file mode 100644 (file)
index 0000000..e8526eb
--- /dev/null
@@ -0,0 +1,26 @@
+# Copyright (C) 2010 Ubixum, Inc. 
+# 
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+
+# change location of fx2libdir if needed
+SOURCES=fw.c device.c
+A51_SOURCES=dscr.a51
+BASENAME=firmware
+
+
+include ../lib/fx2.mk
+
diff --git a/fx2lib/fw/device.c b/fx2lib/fw/device.c
new file mode 100644 (file)
index 0000000..006a220
--- /dev/null
@@ -0,0 +1,94 @@
+/**
+ * Copyright (C) 2009 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <fx2macros.h>
+
+#ifdef DEBUG_FIRMWARE
+#include <stdio.h>
+#else
+#define printf(...)
+#endif
+
+//************************** Configuration Handlers *****************************
+
+// change to support as many interfaces as you need
+//volatile xdata BYTE interface=0;
+//volatile xdata BYTE alt=0; // alt interface
+
+// set *alt_ifc to the current alt interface for ifc
+BOOL handle_get_interface(BYTE ifc, BYTE* alt_ifc) {
+// *alt_ifc=alt;
+ return TRUE;
+}
+// return TRUE if you set the interface requested
+// NOTE this function should reconfigure and reset the endpoints
+// according to the interface descriptors you provided.
+BOOL handle_set_interface(BYTE ifc,BYTE alt_ifc) {  
+ printf ( "Set Interface.\n" );
+ //interface=ifc;
+ //alt=alt_ifc;
+ return TRUE;
+}
+
+// handle getting and setting the configuration
+// 1 is the default.  If you support more than one config
+// keep track of the config number and return the correct number
+// config numbers are set int the dscr file.
+//volatile BYTE config=1;
+BYTE handle_get_configuration() { 
+ return 1;
+}
+
+// NOTE changing config requires the device to reset all the endpoints
+BOOL handle_set_configuration(BYTE cfg) { 
+ printf ( "Set Configuration.\n" );
+ //config=cfg;
+ return TRUE;
+}
+
+
+//******************* VENDOR COMMAND HANDLERS **************************
+
+
+BOOL handle_vendorcommand(BYTE cmd) {
+ // your custom vendor handler code here..
+ return FALSE; // not handled by handlers
+}
+
+
+//********************  INIT ***********************
+
+void main_init() {
+
+ REVCTL=3;
+ SETIF48MHZ();
+
+ // set IFCONFIG
+ // config your endpoints etc.
+ // config gpif
+ printf ( "Initialization Done.\n" );
+
+}
+
+
+void main_loop() {
+ // do some work
+}
+
+
diff --git a/fx2lib/fw/dscr.a51 b/fx2lib/fw/dscr.a51
new file mode 100644 (file)
index 0000000..09167b1
--- /dev/null
@@ -0,0 +1,256 @@
+; Copyright (C) 2009 Ubixum, Inc. 
+;
+; This library is free software; you can redistribute it and/or
+; modify it under the terms of the GNU Lesser General Public
+; License as published by the Free Software Foundation; either
+; version 2.1 of the License, or (at your option) any later version.
+; 
+; This library is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+; Lesser General Public License for more details.
+; 
+; You should have received a copy of the GNU Lesser General Public
+; License along with this library; if not, write to the Free Software
+; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+; this is a the default 
+; full speed and high speed 
+; descriptors found in the TRM
+; change however you want but leave 
+; the descriptor pointers so the setupdat.c file works right
+
+.module DEV_DSCR 
+
+; descriptor types
+; same as setupdat.h
+DSCR_DEVICE_TYPE=1
+DSCR_CONFIG_TYPE=2
+DSCR_STRING_TYPE=3
+DSCR_INTERFACE_TYPE=4
+DSCR_ENDPOINT_TYPE=5
+DSCR_DEVQUAL_TYPE=6
+
+; for the repeating interfaces
+DSCR_INTERFACE_LEN=9
+DSCR_ENDPOINT_LEN=7
+
+; endpoint types
+ENDPOINT_TYPE_CONTROL=0
+ENDPOINT_TYPE_ISO=1
+ENDPOINT_TYPE_BULK=2
+ENDPOINT_TYPE_INT=3
+
+    .globl     _dev_dscr, _dev_qual_dscr, _highspd_dscr, _fullspd_dscr, _dev_strings, _dev_strings_end
+; These need to be in code memory.  If
+; they aren't you'll have to manully copy them somewhere
+; in code memory otherwise SUDPTRH:L don't work right
+    .area      DSCR_AREA       (CODE)
+
+_dev_dscr:
+       .db     dev_dscr_end-_dev_dscr    ; len
+       .db     DSCR_DEVICE_TYPE                  ; type
+       .dw     0x0002                                    ; usb 2.0
+       .db     0xff                                      ; class (vendor specific)
+       .db     0xff                                      ; subclass (vendor specific)
+       .db     0xff                                      ; protocol (vendor specific)
+       .db     64                                                ; packet size (ep0)
+       .dw     0xB404                                    ; vendor id 
+       .dw     0x1386                                    ; product id
+       .dw     0x0100                                    ; version id
+       .db     0                                 ; manufacturure str idx                               
+       .db     2                                         ; product str idx     
+       .db     0                                         ; serial str idx 
+       .db     1                                     ; n configurations
+dev_dscr_end:
+
+_dev_qual_dscr:
+       .db     dev_qualdscr_end-_dev_qual_dscr
+       .db     DSCR_DEVQUAL_TYPE
+       .dw     0x0002                              ; usb 2.0
+       .db     0xff
+       .db     0xff
+       .db     0xff
+       .db     64                                  ; max packet
+       .db     1                                                                       ; n configs
+       .db     0                                                                       ; extra reserved byte
+dev_qualdscr_end:
+
+_highspd_dscr:
+       .db     highspd_dscr_end-_highspd_dscr      ; dscr len                                                                                  ;; Descriptor length
+       .db     DSCR_CONFIG_TYPE
+    ; can't use .dw because byte order is different
+       .db     (highspd_dscr_realend-_highspd_dscr) % 256 ; total length of config lsb
+       .db     (highspd_dscr_realend-_highspd_dscr) / 256 ; total length of config msb
+       .db     1                                                                ; n interfaces
+       .db     1                                                                ; config number
+       .db     0                                                                ; config string
+       .db     0x80                             ; attrs = bus powered, no wakeup
+       .db     0x32                             ; max power = 100ma
+highspd_dscr_end:
+
+; all the interfaces next 
+; NOTE the default TRM actually has more alt interfaces
+; but you can add them back in if you need them.
+; here, we just use the default alt setting 1 from the trm
+       .db     DSCR_INTERFACE_LEN
+       .db     DSCR_INTERFACE_TYPE
+       .db     0                                ; index
+       .db     0                                ; alt setting idx
+       .db     6                                ; n endpoints  
+       .db     0xff                     ; class
+       .db     0xff
+       .db     0xff
+       .db     0                    ; string index     
+
+; endpoint 1 out
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x01                            ;  ep1 dir=out and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x00                            ; max packet LSB
+       .db     0x02                            ; max packet size=512 bytes
+       .db     0x00                            ; polling interval
+      
+; endpoint 1 in 
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x81                            ;  ep1 dir=in and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x00                            ; max packet LSB
+       .db     0x02                            ; max packet size=512 bytes
+       .db     0x00                            ; polling interval
+
+; endpoint 2 out
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x02                            ;  ep2 dir=OUT and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x00                            ; max packet LSB
+       .db     0x02                            ; max packet size=512 bytes
+       .db     0x00                            ; polling interval
+
+; endpoint 4 out
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x04                            ;  ep4 dir=OUT and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x00                            ; max packet LSB
+       .db     0x02                            ; max packet size=512 bytes
+       .db     0x00                            ; polling interval
+
+; endpoint 6 in
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x86                            ;  ep6 dir=in and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x00                            ; max packet LSB
+       .db     0x02                            ; max packet size=512 bytes
+       .db     0x00                            ; polling interval
+
+; endpoint 8 in
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x88                            ;  ep8 dir=in and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x00                            ; max packet LSB
+       .db     0x02                            ; max packet size=512 bytes
+       .db     0x00                            ; polling interval
+highspd_dscr_realend:
+
+.even
+_fullspd_dscr:
+       .db     fullspd_dscr_end-_fullspd_dscr      ; dscr len
+       .db     DSCR_CONFIG_TYPE
+    ; can't use .dw because byte order is different
+       .db     (fullspd_dscr_realend-_fullspd_dscr) % 256 ; total length of config lsb
+       .db     (fullspd_dscr_realend-_fullspd_dscr) / 256 ; total length of config msb
+       .db     1                                                                ; n interfaces
+       .db     1                                                                ; config number
+       .db     0                                                                ; config string
+       .db     0x80                             ; attrs = bus powered, no wakeup
+       .db     0x32                             ; max power = 100ma
+fullspd_dscr_end:
+
+; all the interfaces next 
+; NOTE the default TRM actually has more alt interfaces
+; but you can add them back in if you need them.
+; here, we just use the default alt setting 1 from the trm
+       .db     DSCR_INTERFACE_LEN
+       .db     DSCR_INTERFACE_TYPE
+       .db     0                                ; index
+       .db     0                                ; alt setting idx
+       .db     6                                ; n endpoints  
+       .db     0xff                     ; class
+       .db     0xff
+       .db     0xff
+       .db     0                    ; string index     
+
+; endpoint 1 out
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x01                            ;  ep1 dir=out and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x40                            ; max packet LSB
+       .db     0x00                            ; max packet size=64 bytes
+       .db     0x00                            ; polling interval
+      
+; endpoint 1 in 
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x81                            ;  ep1 dir=in and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x40                            ; max packet LSB
+       .db     0x00                            ; max packet size=64 bytes
+       .db     0x00                            ; polling interval
+
+; endpoint 2 out
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x02                            ;  ep2 dir=OUT and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x40                            ; max packet LSB
+       .db     0x00                            ; max packet size=64 bytes
+       .db     0x00                            ; polling interval
+
+; endpoint 4 out
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x04                            ;  ep4 dir=OUT and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x40                            ; max packet LSB
+       .db     0x00                            ; max packet size=64 bytes
+       .db     0x00                            ; polling interval
+
+; endpoint 6 in
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x86                            ;  ep6 dir=in and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x40                            ; max packet LSB
+       .db     0x00                            ; max packet size=64 bytes
+       .db     0x00                            ; polling interval
+; endpoint 6 in
+       .db     DSCR_ENDPOINT_LEN
+       .db     DSCR_ENDPOINT_TYPE
+       .db     0x88                            ;  ep6 dir=in and address
+       .db     ENDPOINT_TYPE_BULK      ; type
+       .db     0x40                            ; max packet LSB
+       .db     0x00                            ; max packet size=64 bytes
+       .db     0x00                            ; polling interval
+fullspd_dscr_realend:
+
+.even
+_dev_strings:
+; sample string
+_string0:
+       .db     string0end-_string0 ; len
+       .db     DSCR_STRING_TYPE
+    .db 0x09, 0x04 ; 0x0409 is the language code for English.  Possible to add more codes after this. 
+string0end:
+; add more strings here
+
+
+_dev_strings_end:
+    .dw 0x0000  ; in case you wanted to look at memory between _dev_strings and _dev_strings_end
diff --git a/fx2lib/fw/fw.c b/fx2lib/fw/fw.c
new file mode 100644 (file)
index 0000000..ca0d871
--- /dev/null
@@ -0,0 +1,135 @@
+/**
+ * Copyright (C) 2009 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <fx2macros.h>
+#include <fx2ints.h>
+#include <autovector.h>
+#include <delay.h>
+#include <setupdat.h>
+
+#ifdef DEBUG_FIRMWARE 
+#include <serial.h>
+#include <stdio.h>
+#else
+#define printf(...)
+#endif
+
+
+
+
+volatile bit dosud=FALSE;
+volatile bit dosuspend=FALSE;
+
+// custom functions
+extern void main_loop();
+extern void main_init();
+
+
+void main() {
+
+#ifdef DEBUG_FIRMWARE
+ SETCPUFREQ(CLK_48M); // required for sio0_init 
+ // main_init can still set this to whatever you want.
+ sio0_init(57600); // needed for printf if debug defined 
+#endif
+
+ main_init();
+
+ // set up interrupts.
+ USE_USB_INTS();
+ ENABLE_SUDAV();
+ ENABLE_USBRESET();
+ ENABLE_HISPEED(); 
+ ENABLE_SUSPEND();
+ ENABLE_RESUME();
+
+ EA=1;
+
+// iic files (c2 load) don't need to renumerate/delay
+// trm 3.6
+#ifndef NORENUM
+ RENUMERATE();
+#else
+ USBCS &= ~bmDISCON;
+#endif
+ while(TRUE) {
+
+     main_loop();
+
+     if (dosud) {
+       dosud=FALSE;
+       handle_setupdata();
+     }
+
+     if (dosuspend) {
+        dosuspend=FALSE;
+        do {
+           printf ( "I'm going to Suspend.\n" );
+           WAKEUPCS |= bmWU|bmWU2; // make sure ext wakeups are cleared
+           SUSPEND=1;
+           PCON |= 1;
+           __asm
+           nop
+           nop
+           nop
+           nop
+           nop
+           nop
+           nop
+           __endasm;
+        } while ( !remote_wakeup_allowed && REMOTE_WAKEUP()); 
+        printf ( "I'm going to wake up.\n");
+
+        // resume
+        // trm 6.4
+        if ( REMOTE_WAKEUP() ) {
+            delay(5);
+            USBCS |= bmSIGRESUME;
+            delay(15);
+            USBCS &= ~bmSIGRESUME;
+        }
+
+     }
+
+ } // end while
+
+} // end main
+
+void resume_isr() __interrupt RESUME_ISR {
+ CLEAR_RESUME();
+}
+  
+void sudav_isr() __interrupt SUDAV_ISR {
+ dosud=TRUE;
+ CLEAR_SUDAV();
+}
+void usbreset_isr() __interrupt USBRESET_ISR {
+ handle_hispeed(FALSE);
+ CLEAR_USBRESET();
+}
+void hispeed_isr() __interrupt HISPEED_ISR {
+ handle_hispeed(TRUE);
+ CLEAR_HISPEED();
+}
+
+void suspend_isr() __interrupt SUSPEND_ISR {
+ dosuspend=TRUE;
+ CLEAR_SUSPEND();
+}
diff --git a/fx2lib/fw/readme.txt b/fx2lib/fw/readme.txt
new file mode 100644 (file)
index 0000000..b8c5b50
--- /dev/null
@@ -0,0 +1,20 @@
+Starting a new firmware is easy.
+
+1) The fw should build without modification.
+
+> make # builds firmware.ihx
+> make bix # builds firmware.bix
+> make iic # builds firmware.iic
+
+2) modify device.c to initialize your device and
+   handle data according to your needs.
+
+
+3) add more sources, gpif data etc.
+
+4) modify the device descriptor (dscr.a51)
+
+
+For a fast way to deploy, you can use the fx2load
+package provided in examples/fx2
+
diff --git a/fx2lib/include/autovector.h b/fx2lib/include/autovector.h
new file mode 100644 (file)
index 0000000..cc0c504
--- /dev/null
@@ -0,0 +1,218 @@
+// Copyright (C) 2010 Ubixum, Inc. 
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+
+/** \file usbjt.h
+ *
+ * To use usbjt, you must tell the linker where to put the IN2JT.
+ * It must lie on a page boundary or your interrupts won't work right.
+ *
+ * example:
+ * -Wl"-b INT2JT = 0x1A00"
+ *
+ * Make sure that INT2JT doesn't overlap your other code!
+ *
+ * Unlike the standard fx2 interrupts (\ref fx2ints.h), the autovectored
+ * interrupts are defined in assemply and have pre-written function names.
+ * Be sure to override the functions defined in this header or your 
+ * interrupt handler will not be called.
+ **/
+
+#ifndef USBJT_H
+#define USBJT_H
+
+#include "fx2regs.h"
+
+
+
+// this causes usbjt to be included from the lib
+// not used for anything
+extern volatile BYTE INT2JT;
+extern volatile BYTE INT4JT;
+/**
+ * Enable all interrupts (EA=1) separate from this macro.
+ * This macro causes the autovector assembly for int2 interrupts
+ * to be overlayed at 0x43.  In addition, the jump table for the
+ * interrupts will be included in the firmware.  The jump table
+ * must lie on a page boundary.  This is done by passing the linker
+ * arguments to sdcc.
+ *
+ * \code
+ *   sdcc <files> -Wl"-b INT2JT = 0xaddr"
+ * \endcode
+ **/
+#define USE_USB_INTS() {BYTE dummy=INT2JT;\
+                        EUSB=1;\
+                        INTSETUP|=bmAV2EN;}
+/** This macro causes the autovector assemby for int4 to be overlayed
+ * at 0x53.  Don't use this if you want external pin generated int4 interrupts
+ * and want to define your own interrupt handler.  It is possible to use
+ * usb interrupts with autovectoring and not use GPIF interrupts but GPIF
+ * interrupts require the USB jump table.  (You can't USE your own usb interrupt
+ * handler if you want to enable GPIF interrupts.)
+ **/
+#define USE_GPIF_INTS() {BYTE dummy=INT4JT;\
+                        EIEX4=1;\
+                        INTSETUP|=bmAV4EN|INT4IN;}
+             
+
+
+#define CLEAR_USBINT() EXIF &= ~0x10
+#define CLEAR_GPIF() EXIF &= ~0x40
+
+#define ENABLE_SUDAV() USBIE|=bmSUDAV
+#define CLEAR_SUDAV() CLEAR_USBINT(); USBIRQ=bmSUDAV
+
+#define ENABLE_SUTOK() USBIE|=bmSUTOK;
+#define CLEAR_SUTOK() CLEAR_USBINT(); USBIRQ=bmSUTOK
+
+#define ENABLE_SOF() USBIE|=bmSOF
+#define CLEAR_SOF() CLEAR_USBINT(); USBIRQ=bmSOF
+
+#define ENABLE_SUSPEND() USBIE|=bmSUSP
+#define CLEAR_SUSPEND() CLEAR_USBINT(); USBIRQ=bmSUSP
+
+#define ENABLE_USBRESET() USBIE|= bmURES
+#define CLEAR_USBRESET() CLEAR_USBINT(); USBIRQ=bmURES
+
+#define ENABLE_HISPEED() USBIE|=bmHSGRANT
+#define CLEAR_HISPEED() CLEAR_USBINT(); USBIRQ=bmHSGRANT
+
+#define ENABLE_EP1IN() EPIE|=bmEP1IN
+#define CLEAR_EP1IN() CLEAR_USBINT(); EPIRQ=bmEP1IN
+
+#define ENABLE_EP2() EPIE|=bmEP2
+#define CLEAR_EP2() CLEAR_USBINT(); EPIRQ=bmEP2
+
+#define ENABLE_EP6() EPIE|=bmEP6
+#define CLEAR_EP6() CLEAR_USBINT(); EPIRQ=bmEP6
+
+#define ENABLE_EP2ISOERR() USBERRIE |= bmISOEP2
+#define CLEAR_EP2ISOERR() CLEAR_USBINT(); USBERRIRQ = bmISOEP2
+
+#define ENABLE_EP6PF() EP6FIFOIE |= bmBIT2
+#define CLEAR_EP6PF() CLEAR_GPIF(); EP6FIFOIRQ=bmBIT2
+
+#define ENABLE_EP6FF() EP6FIFOIE |= bmBIT0
+#define CLEAR_EP6FF() CLEAR_GPIF(); EP6FIFOIRQ=bmBIT0
+
+#define ENABLE_GPIFDONE() GPIFIE |= 0x01;
+#define CLEAR_GPIFDONE() CLEAR_GPIF(); GPIFIRQ = 0x01;
+
+#define ENABLE_GPIFWF() GPIFIE |= 0x02;
+#define CLEAR_GPIFWF() GLEAR_GPIF(); GPIFIRQ = 0x02;
+
+/**
+ * ez-usb has 12 built in ISRs, to get
+ * sdcc to put these USB ISRs immediately
+ * after the other ISRs (and not waste space)
+ * we start at 13
+ **/
+typedef enum {
+  SUDAV_ISR=13,
+  SOF_ISR,
+  SUTOK_ISR,
+  SUSPEND_ISR,
+  USBRESET_ISR,
+  HISPEED_ISR,
+  EP0ACK_ISR,  
+  EP0IN_ISR,
+  EP0OUT_ISR,
+  EP1IN_ISR,
+  EP1OUT_ISR,
+  EP2_ISR,
+  EP4_ISR,
+  EP6_ISR,
+  EP8_ISR,
+  IBN_ISR,
+  EP0PING_ISR,
+  EP1PING_ISR,
+  EP2PING_ISR,
+  EP4PING_ISR,
+  EP6PING_ISR,
+  EP8PING_ISR,
+  ERRLIMIT_ISR,  
+  EP2ISOERR_ISR,
+  EP4ISOERR_ISR,
+  EP6ISOERR_ISR,
+  EP8ISOERR_ISR,
+  RESERVED_ISR,
+  EP2PF_ISR,
+  EP4PF_ISR,
+  EP6PF_ISR,
+  EP8PF_ISR,
+  EP2EF_ISR,
+  EP4EF_ISR,
+  EP6EF_ISR,
+  EP8EF_ISR,
+  EP2FF_ISR,
+  EP4FF_ISR,
+  EP6FF_ISR,
+  EP8FF_ISR,
+  GPIFDONE_ISR,
+  GPIFWF_ISR
+} USB_ISR;
+
+// you must include the predef of these in the file with your main
+// so lets just define them here
+
+void sudav_isr() __interrupt SUDAV_ISR;
+void sof_isr() __interrupt SOF_ISR;
+void sutok_isr() __interrupt SUTOK_ISR;
+void suspend_isr() __interrupt SUSPEND_ISR;
+void usbreset_isr() __interrupt USBRESET_ISR;
+void hispeed_isr() __interrupt HISPEED_ISR;
+void ep0ack_isr() __interrupt EP0ACK_ISR;
+void ep0in_isr() __interrupt EP0IN_ISR;
+void ep0out_isr() __interrupt EP0OUT_ISR;
+void ep1in_isr() __interrupt EP1IN_ISR;
+void ep1out_isr() __interrupt EP1OUT_ISR;
+void ep2_isr() __interrupt EP2_ISR;
+void ep4_isr() __interrupt EP4_ISR;
+void ep6_isr() __interrupt EP6_ISR;
+void ep8_isr() __interrupt EP8_ISR;
+void ibn_isr() __interrupt IBN_ISR;
+void ep0ping_isr() __interrupt EP0PING_ISR;
+void ep1ping_isr() __interrupt EP1PING_ISR;
+void ep2ping_isr() __interrupt EP2PING_ISR;
+void ep4ping_isr() __interrupt EP4PING_ISR;
+void ep6ping_isr() __interrupt EP6PING_ISR;
+void ep8ping_isr() __interrupt EP8PING_ISR;
+void errlimit_isr() __interrupt ERRLIMIT_ISR;
+void ep2isoerr_isr() __interrupt EP2ISOERR_ISR;
+void ep4isoerr_isr() __interrupt EP4ISOERR_ISR;
+void ep6isoerr_isr() __interrupt EP6ISOERR_ISR;
+void ep8isoerr_isr() __interrupt EP8ISOERR_ISR;
+void spare_isr() __interrupt RESERVED_ISR; // not used
+// gpif ints
+void ep2pf_isr() __interrupt EP2PF_ISR;
+void ep4pf_isr() __interrupt EP4PF_ISR;
+void ep6pf_isr() __interrupt EP6PF_ISR;
+void ep8pf_isr() __interrupt EP8PF_ISR;
+void ep2ef_isr() __interrupt EP2EF_ISR;
+void ep4ef_isr() __interrupt EP4EF_ISR;
+void ep6ef_isr() __interrupt EP6EF_ISR;
+void ep8ef_isr() __interrupt EP8EF_ISR;
+void ep2ff_isr() __interrupt EP2FF_ISR;
+void ep4ff_isr() __interrupt EP4FF_ISR;
+void ep6ff_isr() __interrupt EP6FF_ISR;
+void ep8ff_isr() __interrupt EP8FF_ISR;
+void gpifdone_isr() __interrupt GPIFDONE_ISR;
+void gpifwf_isr() __interrupt GPIFWF_ISR;
+
+#endif
+
diff --git a/fx2lib/include/delay.h b/fx2lib/include/delay.h
new file mode 100644 (file)
index 0000000..a1bb36b
--- /dev/null
@@ -0,0 +1,91 @@
+// Copyright (C) 2009 Ubixum, Inc. 
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+/*! \file 
+ *  Functions for causing delays.
+ * */
+
+
+#ifndef DELAY_H
+#define DELAY_H
+
+#include "fx2types.h"
+
+/**
+ * 0-65536 millis
+ **/
+void delay(WORD millis);
+
+/**
+ * See TRM 15-14,15-15
+ * some registers (r/w) require syncdelay after
+ *
+ * up to the programmer to determine which sync is needed.
+ * for standard 48mhz clock w/ 48mhz IFCONFIG 3 nops is sufficient.
+ *
+ * slower clock and faster ifclock require more delay
+ *
+ * min delay = roof ( 1.5 x (ifclock/clkout + 1) )
+ *
+ * Minimum IFCLOCK is 5mhz but you have to use an
+ * external clock source to go below 30mhz
+ * 
+ * IFCLKSRC 1 = internal, 0=external
+ * 3048mhz 0 = 30mhz, 1 = 48mzh
+ *
+ * Figure your own sync delay out if IFCLKSRC=0.
+ **/
+
+#define NOP __asm nop __endasm
+
+/**
+ * SYNCDELAY2 can work for the following clock speeds
+ *
+ * ifclk/clk
+ * \li 48/12
+ *
+ * ceil(1.5 * (20.8 / 83.3 + 1)) = 2
+ *
+ * \see NOP
+ *
+ **/
+#define SYNCDELAY2 NOP; NOP
+
+/**
+ * SYNCDELAY3 can work for the following clock speeds
+ *
+ * ifcfg/clk
+ * \li 48/24
+ * \li 48/48
+ * \li 30/12
+ * \li 30/24
+ *
+ * \see NOP
+ **/
+#define SYNCDELAY3 NOP; NOP; NOP
+
+/**
+ * SYNCDELAY4 should be used for the following speeds
+ *
+ * ifcfg/clk
+ * \li 30/48
+ *
+ * \see NOP
+ **/
+#define SYNCDELAY4 NOP; NOP; NOP; NOP
+
+#endif
+
diff --git a/fx2lib/include/eputils.h b/fx2lib/include/eputils.h
new file mode 100644 (file)
index 0000000..57a3e21
--- /dev/null
@@ -0,0 +1,86 @@
+// Copyright (C) 2009 Ubixum, Inc. 
+// 
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// 
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+// 
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+/*! \file 
+ *  Functions and macros for working with endpoints.
+ * */
+
+#ifndef EPUTILS_H
+#define EPUTILS_H
+
+#include "fx2types.h"
+
+/**
+ * NOTE you can't use these unless you define SYNCDELAY 
+ * as a macro or function.  The reason is that SYNCDELAY
+ * needs to be longer or shorter depending on your IFCONFIG
+ * settings.  
+ * See delay.h
+ *
+ * Example:
+ * \code
+ *  #define SYNCDELAY() SYNCDELAY4 // SYNCDELAY4 from delay.h
+ * \endcode
+ *
+ *
+ **/
+
+/**
+ * Stalls EP0.
+ **/
+#define STALLEP0() EP0CS |= bmEPSTALL
+
+/**
+ * \brief Reset the toggle on an endpoint.
+ * To use this, the endpoint needs bit 8 to be IN=1,OUT=0
+ **/
+#define RESETTOGGLE(ep) TOGCTL = (ep&0x0F) + ((ep&0x80)>>3); TOGCTL |= bmRESETTOGGLE
+
+
+/**
+ * RESETFIFO should not use 0x80|epnum for IN endpoints
+ * Only use 0x02, 0x04, 0x06, 0x06 for ep value
+ **/
+#define RESETFIFO(ep) {FIFORESET=0x80; SYNCDELAY();\
+                       FIFORESET=ep; SYNCDELAY();\
+                       FIFORESET=0x00; SYNCDELAY();}
+/**
+ * Quickly reset all endpoint FIFOS.
+ **/
+#define RESETFIFOS() {FIFORESET=0x80; SYNCDELAY();\
+                     FIFORESET=0x02; SYNCDELAY();\
+                     FIFORESET=0x04; SYNCDELAY();\
+                     FIFORESET=0x06; SYNCDELAY();\
+                     FIFORESET=0x08; SYNCDELAY();\
+                     FIFORESET=0x00; SYNCDELAY();}
+
+/**
+ * Continually read available bytes from endpoint0 into dst, wait
+ * until more bytes are available, and loop until len bytes have 
+ * been read.
+ **/
+void readep0( BYTE* dst, WORD len );
+
+
+/**
+ * Write bytes from src to ep0, allowing host to transfer data
+ * between 64 byte blocks.
+ **/
+void writeep0 ( BYTE* src, WORD len );
+
+
+
+#endif
diff --git a/fx2lib/include/fx2ints.h b/fx2lib/include/fx2ints.h
new file mode 100644 (file)
index 0000000..45ae71e
--- /dev/null
@@ -0,0 +1,116 @@
+// Copyright (C) 2010 Ubixum, Inc. 
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+/*! \file 
+ *  Define the standard fx2 interrupts.  For int2 and int4 autovector
+ *  interrupts see \ref autovector.h
+ *
+ *  To enable an interrupt, simply define an interrupt handler function
+ *  and use the appropriate ENABLE_* macro.  Interrupt enable macros
+ *  do not enable interrupts globally.  Use EA=1 to enable interrupts.
+ *
+ *  \code
+ *      void main() {
+ *          ENABLE_RESUME();
+ *          EA=1;
+ *          ...
+ *      }
+ *
+ *      void handle_resume() interrupt RESUME_ISR {
+ *          CLEAR_RESUME();
+ *      }
+ *  \endcode
+ *
+ * */
+
+
+/**
+ * \brief interrupt numbers for standard fx2 interrupts
+
+ **/
+typedef enum {
+ IE0_ISR=0, ///< External interrupt 0
+ TF0_ISR, ///< Timer 0 interrupt
+ IE1_ISR, ///< External interrupt 1
+ TF1_ISR, ///< Timer 1 interrupt  
+ TI_0_ISR, ///< Serial port 0 transmit or receive interrupt
+ TF2_ISR, ///< Timer 2 interrupt
+ RESUME_ISR, ///< Resume interrupt
+ TI_1_ISR, ///< Serial port 1 transmit or receive interrupt
+ USBINT_ISR, ///< Usb Interrupt.  An interrupt handler for this should only be used if not using auto vectored interrupts with int2
+ I2CINT_ISR, ///< I2C Bus interrupt
+ IE4_ISR, ///< External interrupt 4.  An interrupt handler for this should only be used if not using auto vectored interrupts with int4
+ IE5_ISR, ///< External interrupt 5
+ IE6_ISR, ///< External interrupt 6
+} FX2_ISR;
+
+
+/**
+ * \brief Enable the timer 0 interrupt.
+ *
+ * There is not CLEAR_TIMER0 because the timer interrupt flag 
+ * is automatically cleared when the isr is called.
+ **/
+#define ENABLE_TIMER0() ET0=1
+
+/**
+ * \brief Enable timer 1 interrupt
+ * There is no CLEAR_TIMER1 because the timer interrupt flag
+ * is automatically cleared when the isr is called.
+ **/
+#define ENABLE_TIMER1() ET1=1
+
+
+/**
+ * \brief Enable timer 2 interrupt
+ *
+ * This is the same interrupt whether timer 2 overflowed or 
+ * for the external EXF2 flag.
+ **/
+#define ENABLE_TIMER2() ET2=1
+/**
+ *  \brief Clear timer 2 interrupt
+ *
+ *  Clears both the TF2 AND EXF2 flag
+ **/
+#define CLEAR_TIMER2() TF2=0;EXF2=0;
+
+/**
+ * \brief Enable the Resume Interrupt.  Requires EA=1 separately.
+ **/
+#define ENABLE_RESUME() ERESI = 1 
+
+/**
+ * \brief Clear the resume interrupt.  Use within the resume
+ *  interrupt handler.
+ **/
+#define CLEAR_RESUME() RESI=0
+
+
+#define ENABLE_INT4() 
+
+/**
+ * \brief 
+ * Enable external interupt for int5#
+ **/
+#define ENABLE_INT5() EIEX5=1 
+
+/**
+ * \brief 
+ * Clear int5# interrupt
+ **/
+#define CLEAR_INT5() EXIF &= ~0x80
+
diff --git a/fx2lib/include/fx2macros.h b/fx2lib/include/fx2macros.h
new file mode 100644 (file)
index 0000000..af749e2
--- /dev/null
@@ -0,0 +1,127 @@
+// Copyright (C) 2009 Ubixum, Inc. 
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+/*! \file 
+ *  Macros for simple common tasks in fx2 firmware.
+ * */
+
+#ifndef FX2MACROS_H
+#define FX2MACROS_H
+
+#include "fx2regs.h"
+#include "fx2types.h"
+
+#define MSB(addr) (BYTE)((addr >> 8) & 0xff)
+#define LSB(addr) (BYTE)(addr & 0xff)
+#define MAKEWORD(msb,lsb) (((WORD)msb << 8) | lsb)
+
+#define MSW(dword) (WORD)((dword >> 16) & 0xffff)
+#define LSW(dword) (WORD)(dword & 0xffff)
+#define MAKEDWORD(msw,lsw) (((DWORD)msw << 16) | lsw)
+
+// clock stuff
+
+/**
+ * \brief Used for getting and setting the CPU clock speed.
+ **/
+typedef enum { CLK_12M =0, CLK_24M, CLK_48M} CLK_SPD;
+
+/**
+ * \brief Evaluates to a CLK_SPD enum.
+ **/
+#define CPUFREQ (CLK_SPD)((CPUCS & bmCLKSPD) >> 3)
+/**
+ * \brief Sets the cpu to operate at a specific
+ *  clock speed.
+ **/
+#define SETCPUFREQ(SPD) CPUCS = (CPUCS & ~bmCLKSPD) | (SPD << 3)
+
+/**
+ * \brief Evaluates to a DWORD value representing 
+ *  the clock speed in cycles per second. 
+ *
+ * Speeds:
+ *
+ *  \li 12000000L
+ *  \li 24000000L
+ *  \li 48000000L
+ *
+ **/
+#define XTAL (CPUFREQ==CLK_12M ? 12000000L :\
+              CPUFREQ==CLK_24M ? 24000000L : 48000000L)
+
+
+/**
+ * \brief Evaluates to the i2c bus frequency in cyles per
+ * second.
+ *
+ * Speeds:
+ *
+ * \li 400000L
+ * \li 100000L
+ *
+ **/
+#define I2CFREQ ((I2CTL & bm400KHZ) ? 400000L : 100000L)
+
+
+#define IFFREQ (IFCONFIG & bm3048MHZ ? 48000000L : 30000000L)
+#define SETIF30MHZ() IFCONFIG &= ~bm3048MHZ
+#define SETIF48MHZ() IFCONFIG |= bm3048MHZ
+
+
+// eeprom stuff
+#define EEPROM_TWO_BYTE (I2CS & bmBIT4)
+
+/**
+ * \brief Cause the device to disconnect and reconnect to USB.  This macro
+ *  unconditionally renumerates the device no matter how the firmware is loaded.
+ *
+ *  <b>NOTE</b> Windows really doesn't like this if the firmware is loaded
+ *  from an eeprom.  You'll see information messages about the device not
+ *  working properly.  On the other hand, if you are changing the device 
+ *  descriptor, e.g., the vendor and product id, when downloading firmware to the device, 
+ *  you'll need to use this macro instead of the  
+ *  standard RENUMERATE macro.
+ **/
+#define RENUMERATE_UNCOND() USBCS|=bmDISCON|bmRENUM;delay(1500);USBCS&=~bmDISCON
+/**
+ * \brief Cause the device to disconnect and reconnect to the USB bus.  This macro
+ *  doesn't do anything if the firmware is loaded from an eeprom.
+ **/
+#define RENUMERATE() if(!(USBCS&bmRENUM)) {USBCS|=bmDISCON|bmRENUM;delay(1500);USBCS &= ~bmDISCON;}
+
+
+// interrupts
+// USB interrupts are in usbjt.h
+
+
+
+
+/**
+ * \brief TRUE if the FX2 has transitioned to high speed on the USB bus..
+ **/
+#define HISPEED (USBCS&bmHSM)
+
+
+
+
+/**
+ * \brief Evaluates to TRUE if a remote wakeup event has occurred.
+ **/
+#define REMOTE_WAKEUP() (((WAKEUPCS & bmWU) && (WAKEUPCS & bmWUEN)) || ((WAKEUPCS & bmWU2) && (WAKEUPCS & bmWU2EN)))
+
+
+#endif
diff --git a/fx2lib/include/fx2regs.h b/fx2lib/include/fx2regs.h
new file mode 100644 (file)
index 0000000..af1e8a0
--- /dev/null
@@ -0,0 +1,628 @@
+// Copyright (C) 2009 Ubixum, Inc. 
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+/*! \file 
+ *
+ * This is the basic header/register file for working with the cypress fx2
+ * (cyc768013) and variants 8051 chipset.  It contains the special function 
+ * register definitions as well as the special configuration registers 
+ * addresses.
+ * 
+ * The TRM for the fx2 chip contains the full documentation for what each of
+ * these registers do.
+ *
+ * */
+
+
+/** \mainpage FX2LIB Documentation
+ *  \verbinclude README
+ **/
+
+/** \example fw.c
+ * The firmware framework allows for easily beginning a new firware project.
+ **/
+
+#ifndef FX2REGS_H 
+#define FX2REGS_H
+
+#include "fx2types.h"
+
+__xdata __at 0xE400 volatile BYTE GPIF_WAVE_DATA;
+__xdata __at 0xE480 volatile BYTE RES_WAVEDATA_END;
+
+// General Configuration
+
+__xdata __at 0xE600 volatile BYTE CPUCS;  ///< Control & Status
+__xdata __at 0xE601 volatile BYTE IFCONFIG;  ///< Interface Configuration
+__xdata __at 0xE602 volatile BYTE PINFLAGSAB;  ///< FIFO FLAGA and FLAGB Assignments
+__xdata __at 0xE603 volatile BYTE PINFLAGSCD;  ///< FIFO FLAGC and FLAGD Assignments
+__xdata __at 0xE604 volatile BYTE FIFORESET;  ///< Restore FIFOS to default state
+__xdata __at 0xE605 volatile BYTE BREAKPT;  ///< Breakpoint
+__xdata __at 0xE606 volatile BYTE BPADDRH;  ///< Breakpoint Address H
+__xdata __at 0xE607 volatile BYTE BPADDRL;  ///< Breakpoint Address L
+__xdata __at 0xE608 volatile BYTE UART230;  ///< 230 Kbaud clock for T0,T1,T2
+__xdata __at 0xE609 volatile BYTE FIFOPINPOLAR;  ///< FIFO polarities
+__xdata __at 0xE60A volatile BYTE REVID;  ///< Chip Revision
+__xdata __at 0xE60B volatile BYTE REVCTL;  ///< Chip Revision Control
+
+// Endpoint Configuration
+
+__xdata __at 0xE610 volatile BYTE EP1OUTCFG;  ///< Endpoint 1-OUT Configuration
+__xdata __at 0xE611 volatile BYTE EP1INCFG;  ///< Endpoint 1-IN Configuration
+__xdata __at 0xE612 volatile BYTE EP2CFG;  ///< Endpoint 2 Configuration
+__xdata __at 0xE613 volatile BYTE EP4CFG;  ///< Endpoint 4 Configuration
+__xdata __at 0xE614 volatile BYTE EP6CFG;  ///< Endpoint 6 Configuration
+__xdata __at 0xE615 volatile BYTE EP8CFG;  ///< Endpoint 8 Configuration
+__xdata __at 0xE618 volatile BYTE EP2FIFOCFG;  ///< Endpoint 2 FIFO configuration
+__xdata __at 0xE619 volatile BYTE EP4FIFOCFG;  ///< Endpoint 4 FIFO configuration
+__xdata __at 0xE61A volatile BYTE EP6FIFOCFG;  ///< Endpoint 6 FIFO configuration
+__xdata __at 0xE61B volatile BYTE EP8FIFOCFG;  ///< Endpoint 8 FIFO configuration
+__xdata __at 0xE620 volatile BYTE EP2AUTOINLENH;  ///< Endpoint 2 Packet Length H (IN only)
+__xdata __at 0xE621 volatile BYTE EP2AUTOINLENL;  ///< Endpoint 2 Packet Length L (IN only)
+__xdata __at 0xE622 volatile BYTE EP4AUTOINLENH;  ///< Endpoint 4 Packet Length H (IN only)
+__xdata __at 0xE623 volatile BYTE EP4AUTOINLENL;  ///< Endpoint 4 Packet Length L (IN only)
+__xdata __at 0xE624 volatile BYTE EP6AUTOINLENH;  ///< Endpoint 6 Packet Length H (IN only)
+__xdata __at 0xE625 volatile BYTE EP6AUTOINLENL;  ///< Endpoint 6 Packet Length L (IN only)
+__xdata __at 0xE626 volatile BYTE EP8AUTOINLENH;  ///< Endpoint 8 Packet Length H (IN only)
+__xdata __at 0xE627 volatile BYTE EP8AUTOINLENL;  ///< Endpoint 8 Packet Length L (IN only)
+__xdata __at 0xE630 volatile BYTE EP2FIFOPFH;  ///< EP2 Programmable Flag trigger H
+__xdata __at 0xE631 volatile BYTE EP2FIFOPFL;  ///< EP2 Programmable Flag trigger L
+__xdata __at 0xE632 volatile BYTE EP4FIFOPFH;  ///< EP4 Programmable Flag trigger H
+__xdata __at 0xE633 volatile BYTE EP4FIFOPFL;  ///< EP4 Programmable Flag trigger L
+__xdata __at 0xE634 volatile BYTE EP6FIFOPFH;  ///< EP6 Programmable Flag trigger H
+__xdata __at 0xE635 volatile BYTE EP6FIFOPFL;  ///< EP6 Programmable Flag trigger L
+__xdata __at 0xE636 volatile BYTE EP8FIFOPFH;  ///< EP8 Programmable Flag trigger H
+__xdata __at 0xE637 volatile BYTE EP8FIFOPFL;  ///< EP8 Programmable Flag trigger L
+__xdata __at 0xE640 volatile BYTE EP2ISOINPKTS;  ///< EP2 (if ISO) IN Packets per frame (1-3)
+__xdata __at 0xE641 volatile BYTE EP4ISOINPKTS;  ///< EP4 (if ISO) IN Packets per frame (1-3)
+__xdata __at 0xE642 volatile BYTE EP6ISOINPKTS;  ///< EP6 (if ISO) IN Packets per frame (1-3)
+__xdata __at 0xE643 volatile BYTE EP8ISOINPKTS;  ///< EP8 (if ISO) IN Packets per frame (1-3)
+__xdata __at 0xE648 volatile BYTE INPKTEND;  ///< Force IN Packet End
+__xdata __at 0xE649 volatile BYTE OUTPKTEND;  ///< Force OUT Packet End
+
+// Interrupts
+
+__xdata __at 0xE650 volatile BYTE EP2FIFOIE;  ///< Endpoint 2 Flag Interrupt Enable
+__xdata __at 0xE651 volatile BYTE EP2FIFOIRQ;  ///< Endpoint 2 Flag Interrupt Request
+__xdata __at 0xE652 volatile BYTE EP4FIFOIE;  ///< Endpoint 4 Flag Interrupt Enable
+__xdata __at 0xE653 volatile BYTE EP4FIFOIRQ;  ///< Endpoint 4 Flag Interrupt Request
+__xdata __at 0xE654 volatile BYTE EP6FIFOIE;  ///< Endpoint 6 Flag Interrupt Enable
+__xdata __at 0xE655 volatile BYTE EP6FIFOIRQ;  ///< Endpoint 6 Flag Interrupt Request
+__xdata __at 0xE656 volatile BYTE EP8FIFOIE;  ///< Endpoint 8 Flag Interrupt Enable
+__xdata __at 0xE657 volatile BYTE EP8FIFOIRQ;  ///< Endpoint 8 Flag Interrupt Request
+__xdata __at 0xE658 volatile BYTE IBNIE;  ///< IN-BULK-NAK Interrupt Enable
+__xdata __at 0xE659 volatile BYTE IBNIRQ;  ///< IN-BULK-NAK interrupt Request
+__xdata __at 0xE65A volatile BYTE NAKIE;  ///< Endpoint Ping NAK interrupt Enable
+__xdata __at 0xE65B volatile BYTE NAKIRQ;  ///< Endpoint Ping NAK interrupt Request
+__xdata __at 0xE65C volatile BYTE USBIE;  ///< USB Int Enables
+__xdata __at 0xE65D volatile BYTE USBIRQ;  ///< USB Interrupt Requests
+__xdata __at 0xE65E volatile BYTE EPIE;  ///< Endpoint Interrupt Enables
+__xdata __at 0xE65F volatile BYTE EPIRQ;  ///< Endpoint Interrupt Requests
+__xdata __at 0xE660 volatile BYTE GPIFIE;  ///< GPIF Interrupt Enable
+__xdata __at 0xE661 volatile BYTE GPIFIRQ;  ///< GPIF Interrupt Request
+__xdata __at 0xE662 volatile BYTE USBERRIE;  ///< USB Error Interrupt Enables
+__xdata __at 0xE663 volatile BYTE USBERRIRQ;  ///< USB Error Interrupt Requests
+__xdata __at 0xE664 volatile BYTE ERRCNTLIM;  ///< USB Error counter and limit
+__xdata __at 0xE665 volatile BYTE CLRERRCNT;  ///< Clear Error Counter EC[3..0]
+__xdata __at 0xE666 volatile BYTE INT2IVEC;  ///< Interupt 2 (USB) Autovector
+__xdata __at 0xE667 volatile BYTE INT4IVEC;  ///< Interupt 4 (FIFOS & GPIF) Autovector
+__xdata __at 0xE668 volatile BYTE INTSETUP;  ///< Interrupt 2&4 Setup
+
+// Input/Output
+
+__xdata __at 0xE670 volatile BYTE PORTACFG;  ///< I/O PORTA Alternate Configuration
+__xdata __at 0xE671 volatile BYTE PORTCCFG;  ///< I/O PORTC Alternate Configuration
+__xdata __at 0xE672 volatile BYTE PORTECFG;  ///< I/O PORTE Alternate Configuration
+__xdata __at 0xE678 volatile BYTE I2CS;  ///< Control & Status
+__xdata __at 0xE679 volatile BYTE I2DAT;  ///< Data
+__xdata __at 0xE67A volatile BYTE I2CTL;  ///< I2C Control
+__xdata __at 0xE67B volatile BYTE XAUTODAT1;  ///< Autoptr1 MOVX access
+__xdata __at 0xE67C volatile BYTE XAUTODAT2;  ///< Autoptr2 MOVX access
+
+#define EXTAUTODAT1 XAUTODAT1
+#define EXTAUTODAT2 XAUTODAT2
+
+// USB Control
+
+__xdata __at 0xE680 volatile BYTE USBCS;  ///< USB Control & Status
+__xdata __at 0xE681 volatile BYTE SUSPEND;  ///< Put chip into suspend
+__xdata __at 0xE682 volatile BYTE WAKEUPCS;  ///< Wakeup source and polarity
+__xdata __at 0xE683 volatile BYTE TOGCTL;  ///< Toggle Control
+__xdata __at 0xE684 volatile BYTE USBFRAMEH;  ///< USB Frame count H
+__xdata __at 0xE685 volatile BYTE USBFRAMEL;  ///< USB Frame count L
+__xdata __at 0xE686 volatile BYTE MICROFRAME;  ///< Microframe count, 0-7
+__xdata __at 0xE687 volatile BYTE FNADDR;  ///< USB Function address
+
+// Endpoints
+
+__xdata __at 0xE68A volatile BYTE EP0BCH;  ///< Endpoint 0 Byte Count H
+__xdata __at 0xE68B volatile BYTE EP0BCL;  ///< Endpoint 0 Byte Count L
+__xdata __at 0xE68D volatile BYTE EP1OUTBC;  ///< Endpoint 1 OUT Byte Count
+__xdata __at 0xE68F volatile BYTE EP1INBC;  ///< Endpoint 1 IN Byte Count
+__xdata __at 0xE690 volatile BYTE EP2BCH;  ///< Endpoint 2 Byte Count H
+__xdata __at 0xE691 volatile BYTE EP2BCL;  ///< Endpoint 2 Byte Count L
+__xdata __at 0xE694 volatile BYTE EP4BCH;  ///< Endpoint 4 Byte Count H
+__xdata __at 0xE695 volatile BYTE EP4BCL;  ///< Endpoint 4 Byte Count L
+__xdata __at 0xE698 volatile BYTE EP6BCH;  ///< Endpoint 6 Byte Count H
+__xdata __at 0xE699 volatile BYTE EP6BCL;  ///< Endpoint 6 Byte Count L
+__xdata __at 0xE69C volatile BYTE EP8BCH;  ///< Endpoint 8 Byte Count H
+__xdata __at 0xE69D volatile BYTE EP8BCL;  ///< Endpoint 8 Byte Count L
+__xdata __at 0xE6A0 volatile BYTE EP0CS;  ///< Endpoint  Control and Status
+__xdata __at 0xE6A1 volatile BYTE EP1OUTCS;  ///< Endpoint 1 OUT Control and Status
+__xdata __at 0xE6A2 volatile BYTE EP1INCS;  ///< Endpoint 1 IN Control and Status
+__xdata __at 0xE6A3 volatile BYTE EP2CS;  ///< Endpoint 2 Control and Status
+__xdata __at 0xE6A4 volatile BYTE EP4CS;  ///< Endpoint 4 Control and Status
+__xdata __at 0xE6A5 volatile BYTE EP6CS;  ///< Endpoint 6 Control and Status
+__xdata __at 0xE6A6 volatile BYTE EP8CS;  ///< Endpoint 8 Control and Status
+__xdata __at 0xE6A7 volatile BYTE EP2FIFOFLGS;  ///< Endpoint 2 Flags
+__xdata __at 0xE6A8 volatile BYTE EP4FIFOFLGS;  ///< Endpoint 4 Flags
+__xdata __at 0xE6A9 volatile BYTE EP6FIFOFLGS;  ///< Endpoint 6 Flags
+__xdata __at 0xE6AA volatile BYTE EP8FIFOFLGS;  ///< Endpoint 8 Flags
+__xdata __at 0xE6AB volatile BYTE EP2FIFOBCH;  ///< EP2 FIFO total byte count H
+__xdata __at 0xE6AC volatile BYTE EP2FIFOBCL;  ///< EP2 FIFO total byte count L
+__xdata __at 0xE6AD volatile BYTE EP4FIFOBCH;  ///< EP4 FIFO total byte count H
+__xdata __at 0xE6AE volatile BYTE EP4FIFOBCL;  ///< EP4 FIFO total byte count L
+__xdata __at 0xE6AF volatile BYTE EP6FIFOBCH;  ///< EP6 FIFO total byte count H
+__xdata __at 0xE6B0 volatile BYTE EP6FIFOBCL;  ///< EP6 FIFO total byte count L
+__xdata __at 0xE6B1 volatile BYTE EP8FIFOBCH;  ///< EP8 FIFO total byte count H
+__xdata __at 0xE6B2 volatile BYTE EP8FIFOBCL;  ///< EP8 FIFO total byte count L
+__xdata __at 0xE6B3 volatile BYTE SUDPTRH;  ///< Setup Data Pointer high address byte
+__xdata __at 0xE6B4 volatile BYTE SUDPTRL;  ///< Setup Data Pointer low address byte
+__xdata __at 0xE6B5 volatile BYTE SUDPTRCTL;  ///< Setup Data Pointer Auto Mode
+__xdata __at 0xE6B8 volatile BYTE SETUPDAT[8];  ///< 8 bytes of SETUP data
+
+// GPIF
+
+__xdata __at 0xE6C0 volatile BYTE GPIFWFSELECT;  ///< Waveform Selector
+__xdata __at 0xE6C1 volatile BYTE GPIFIDLECS;  ///< GPIF Done, GPIF IDLE drive mode
+__xdata __at 0xE6C2 volatile BYTE GPIFIDLECTL;  ///< Inactive Bus, CTL states
+__xdata __at 0xE6C3 volatile BYTE GPIFCTLCFG;  ///< CTL OUT pin drive
+__xdata __at 0xE6C4 volatile BYTE GPIFADRH;  ///< GPIF Address H
+__xdata __at 0xE6C5 volatile BYTE GPIFADRL;  ///< GPIF Address L
+
+__xdata __at 0xE6CE volatile BYTE GPIFTCB3;  ///< GPIF Transaction Count Byte 3
+__xdata __at 0xE6CF volatile BYTE GPIFTCB2;  ///< GPIF Transaction Count Byte 2
+__xdata __at 0xE6D0 volatile BYTE GPIFTCB1;  ///< GPIF Transaction Count Byte 1
+__xdata __at 0xE6D1 volatile BYTE GPIFTCB0;  ///< GPIF Transaction Count Byte 0
+
+__xdata __at 0xE6D2 volatile BYTE EP2GPIFFLGSEL;  ///< EP2 GPIF Flag select
+__xdata __at 0xE6D3 volatile BYTE EP2GPIFPFSTOP;  ///< Stop GPIF EP2 transaction on prog. flag
+__xdata __at 0xE6D4 volatile BYTE EP2GPIFTRIG;  ///< EP2 FIFO Trigger
+__xdata __at 0xE6DA volatile BYTE EP4GPIFFLGSEL;  ///< EP4 GPIF Flag select
+__xdata __at 0xE6DB volatile BYTE EP4GPIFPFSTOP;  ///< Stop GPIF EP4 transaction on prog. flag
+__xdata __at 0xE6DC volatile BYTE EP4GPIFTRIG;  ///< EP4 FIFO Trigger
+__xdata __at 0xE6E2 volatile BYTE EP6GPIFFLGSEL;  ///< EP6 GPIF Flag select
+__xdata __at 0xE6E3 volatile BYTE EP6GPIFPFSTOP;  ///< Stop GPIF EP6 transaction on prog. flag
+__xdata __at 0xE6E4 volatile BYTE EP6GPIFTRIG;  ///< EP6 FIFO Trigger
+__xdata __at 0xE6EA volatile BYTE EP8GPIFFLGSEL;  ///< EP8 GPIF Flag select
+__xdata __at 0xE6EB volatile BYTE EP8GPIFPFSTOP;  ///< Stop GPIF EP8 transaction on prog. flag
+__xdata __at 0xE6EC volatile BYTE EP8GPIFTRIG;  ///< EP8 FIFO Trigger
+__xdata __at 0xE6F0 volatile BYTE XGPIFSGLDATH;  ///< GPIF Data H (16-bit mode only)
+__xdata __at 0xE6F1 volatile BYTE XGPIFSGLDATLX;  ///< Read/Write GPIF Data L & trigger transac
+__xdata __at 0xE6F2 volatile BYTE XGPIFSGLDATLNOX;  ///< Read GPIF Data L, no transac trigger
+__xdata __at 0xE6F3 volatile BYTE GPIFREADYCFG;  ///< Internal RDY,Sync/Async, RDY5CFG
+__xdata __at 0xE6F4 volatile BYTE GPIFREADYSTAT;  ///< RDY pin states
+__xdata __at 0xE6F5 volatile BYTE GPIFABORT;  ///< Abort GPIF cycles
+
+// UDMA
+
+__xdata __at 0xE6C6 volatile BYTE FLOWSTATE; ///<Defines GPIF flow state
+__xdata __at 0xE6C7 volatile BYTE FLOWLOGIC; ///<Defines flow/hold decision criteria
+__xdata __at 0xE6C8 volatile BYTE FLOWEQ0CTL; ///<CTL states during active flow state
+__xdata __at 0xE6C9 volatile BYTE FLOWEQ1CTL; ///<CTL states during hold flow state
+__xdata __at 0xE6CA volatile BYTE FLOWHOLDOFF;
+__xdata __at 0xE6CB volatile BYTE FLOWSTB; ///<CTL/RDY Signal to use as master data strobe 
+__xdata __at 0xE6CC volatile BYTE FLOWSTBEDGE; ///<Defines active master strobe edge
+__xdata __at 0xE6CD volatile BYTE FLOWSTBHPERIOD; ///<Half Period of output master strobe
+__xdata __at 0xE60C volatile BYTE GPIFHOLDAMOUNT; ///<Data delay shift 
+__xdata __at 0xE67D volatile BYTE UDMACRCH; ///<CRC Upper byte
+__xdata __at 0xE67E volatile BYTE UDMACRCL; ///<CRC Lower byte
+__xdata __at 0xE67F volatile BYTE UDMACRCQUAL; ///<UDMA In only, host terminated use only
+
+// Endpoint Buffers
+
+__xdata __at 0xE740 volatile BYTE EP0BUF[64];  ///< EP0 IN-OUT buffer
+__xdata __at 0xE780 volatile BYTE EP1OUTBUF[64];  ///< EP1-OUT buffer
+__xdata __at 0xE7C0 volatile BYTE EP1INBUF[64];  ///< EP1-IN buffer
+__xdata __at 0xF000 volatile BYTE EP2FIFOBUF[1024];  ///< 512/1024-byte EP2 buffer (IN or OUT)
+__xdata __at 0xF400 volatile BYTE EP4FIFOBUF[1024];  ///< 512 byte EP4 buffer (IN or OUT)
+__xdata __at 0xF800 volatile BYTE EP6FIFOBUF[1024];  ///< 512/1024-byte EP6 buffer (IN or OUT)
+__xdata __at 0xFC00 volatile BYTE EP8FIFOBUF[1024];  ///< 512 byte EP8 buffer (IN or OUT)
+
+// Error Correction Code (ECC) Registers (FX2LP/FX1 only)
+
+__xdata __at 0xE628 volatile BYTE ECCCFG;  ///< ECC Configuration
+__xdata __at 0xE629 volatile BYTE ECCRESET;  ///< ECC Reset
+__xdata __at 0xE62A volatile BYTE ECC1B0;  ///< ECC1 Byte 0
+__xdata __at 0xE62B volatile BYTE ECC1B1;  ///< ECC1 Byte 1
+__xdata __at 0xE62C volatile BYTE ECC1B2;  ///< ECC1 Byte 2
+__xdata __at 0xE62D volatile BYTE ECC2B0;  ///< ECC2 Byte 0
+__xdata __at 0xE62E volatile BYTE ECC2B1;  ///< ECC2 Byte 1
+__xdata __at 0xE62F volatile BYTE ECC2B2;  ///< ECC2 Byte 2
+
+// Feature Registers  (FX2LP/FX1 only)
+__xdata __at 0xE50D volatile BYTE GPCR2;  ///< Chip Features
+
+/**
+ * SFRs below
+ *  According to TRM 15.2, only rows 0 and 8 of the SFRs are bit addressible
+ *  row 0: IOA, IOB, IOC, IOD, SCON1, PSW, ACC, B
+ *  row 8: TCON, SCON0, IE, IP, T2CON, IECON, EIE, EIP
+ *
+ *  All others have to move a byte to the SRF address
+ **/
+
+__sfr __at 0x80 IOA;
+         /*  IOA  */
+         __sbit __at 0x80 + 0 PA0;
+         __sbit __at 0x80 + 1 PA1;
+         __sbit __at 0x80 + 2 PA2;
+         __sbit __at 0x80 + 3 PA3;
+         __sbit __at 0x80 + 4 PA4;
+         __sbit __at 0x80 + 5 PA5;
+         __sbit __at 0x80 + 6 PA6;
+         __sbit __at 0x80 + 7 PA7;
+__sfr __at 0x81 SP;
+__sfr __at 0x82 DPL;
+__sfr __at 0x83 DPH;
+__sfr __at 0x84 DPL1;
+__sfr __at 0x85 DPH1;
+__sfr __at 0x86 DPS;
+__sfr __at 0x87 PCON;
+__sfr __at 0x88 TCON;
+         /*  TCON  */
+         __sbit __at 0x88+0 IT0;
+         __sbit __at 0x88+1 IE0;
+         __sbit __at 0x88+2 IT1;
+         __sbit __at 0x88+3 IE1;
+         __sbit __at 0x88+4 TR0;
+         __sbit __at 0x88+5 TF0;
+         __sbit __at 0x88+6 TR1;
+         __sbit __at 0x88+7 TF1;
+__sfr __at 0x89 TMOD;
+__sfr __at 0x8A TL0;
+__sfr __at 0x8B TL1;
+__sfr __at 0x8C TH0;
+__sfr __at 0x8D TH1;
+__sfr __at 0x8E CKCON;
+__sfr __at 0x90 IOB;
+         /*  IOB  */
+         __sbit __at 0x90 + 0 PB0;
+         __sbit __at 0x90 + 1 PB1;
+         __sbit __at 0x90 + 2 PB2;
+         __sbit __at 0x90 + 3 PB3;
+         __sbit __at 0x90 + 4 PB4;
+         __sbit __at 0x90 + 5 PB5;
+         __sbit __at 0x90 + 6 PB6;
+         __sbit __at 0x90 + 7 PB7;
+__sfr __at 0x91 EXIF;
+         
+//__sfr __at 0x92 MPAGE;
+__sfr __at 0x92 _XPAGE; // same as MPAGE for pdata __sfr access w/ sdcc
+__sfr __at 0x98 SCON0;
+         /*  SCON0  */
+         __sbit __at 0x98+0 RI;
+         __sbit __at 0x98+1 TI;
+         __sbit __at 0x98+2 RB8;
+         __sbit __at 0x98+3 TB8;
+         __sbit __at 0x98+4 REN;
+         __sbit __at 0x98+5 SM2;
+         __sbit __at 0x98+6 SM1;
+         __sbit __at 0x98+7 SM0;
+__sfr __at 0x99 SBUF0;
+
+__sfr __at 0x9A AUTOPTRH1; 
+__sfr __at 0x9B AUTOPTRL1; 
+__sfr __at 0x9D AUTOPTRH2;
+__sfr __at 0x9E AUTOPTRL2; 
+
+__sfr __at 0xA0 IOC;
+         /*  IOC  */
+         __sbit __at 0xA0 + 0 PC0;
+         __sbit __at 0xA0 + 1 PC1;
+         __sbit __at 0xA0 + 2 PC2;
+         __sbit __at 0xA0 + 3 PC3;
+         __sbit __at 0xA0 + 4 PC4;
+         __sbit __at 0xA0 + 5 PC5;
+         __sbit __at 0xA0 + 6 PC6;
+         __sbit __at 0xA0 + 7 PC7;
+__sfr __at 0xA1 INT2CLR;
+__sfr __at 0xA2 INT4CLR;
+
+__sfr __at 0xA8 IE;
+         /*  IE  */
+         __sbit __at 0xA8+0 EX0;
+         __sbit __at 0xA8+1 ET0;
+         __sbit __at 0xA8+2 EX1;
+         __sbit __at 0xA8+3 ET1;
+         __sbit __at 0xA8+4 ES0;
+         __sbit __at 0xA8+5 ET2;
+         __sbit __at 0xA8+6 ES1;
+         __sbit __at 0xA8+7 EA;
+
+__sfr __at 0xAA EP2468STAT;
+__sfr __at 0xAB EP24FIFOFLGS;
+__sfr __at 0xAC EP68FIFOFLGS;
+__sfr __at 0xAF AUTOPTRSETUP;
+__sfr __at 0xB0 IOD;
+         /*  IOD  */
+         __sbit __at 0xB0 + 0 PD0;
+         __sbit __at 0xB0 + 1 PD1;
+         __sbit __at 0xB0 + 2 PD2;
+         __sbit __at 0xB0 + 3 PD3;
+         __sbit __at 0xB0 + 4 PD4;
+         __sbit __at 0xB0 + 5 PD5;
+         __sbit __at 0xB0 + 6 PD6;
+         __sbit __at 0xB0 + 7 PD7;
+__sfr __at 0xB1 IOE;
+__sfr __at 0xB2 OEA;
+__sfr __at 0xB3 OEB;
+__sfr __at 0xB4 OEC;
+__sfr __at 0xB5 OED;
+__sfr __at 0xB6 OEE;
+
+__sfr __at 0xB8 IP;
+         /*  IP  */
+         __sbit __at 0xB8+0 PX0;
+         __sbit __at 0xB8+1 PT0;
+         __sbit __at 0xB8+2 PX1;
+         __sbit __at 0xB8+3 PT1;
+         __sbit __at 0xB8+4 PS0;
+         __sbit __at 0xB8+5 PT2;
+         __sbit __at 0xB8+6 PS1;
+
+__sfr __at 0xBA EP01STAT;
+__sfr __at 0xBB GPIFTRIG;
+
+__sfr __at 0xBD GPIFSGLDATH;
+__sfr __at 0xBE GPIFSGLDATLX;
+__sfr __at 0xBF GPIFSGLDATLNOX;
+
+__sfr __at 0xC0 SCON1;
+         /*  SCON1  */
+         __sbit __at 0xC0+0 RI1;
+         __sbit __at 0xC0+1 TI1;
+         __sbit __at 0xC0+2 RB81;
+         __sbit __at 0xC0+3 TB81;
+         __sbit __at 0xC0+4 REN1;
+         __sbit __at 0xC0+5 SM21;
+         __sbit __at 0xC0+6 SM11;
+         __sbit __at 0xC0+7 SM01;
+__sfr __at 0xC1 SBUF1;
+__sfr __at 0xC8 T2CON;
+         /*  T2CON  */
+         __sbit __at 0xC8+0 CP_RL2;
+         __sbit __at 0xC8+1 C_T2;
+         __sbit __at 0xC8+2 TR2;
+         __sbit __at 0xC8+3 EXEN2;
+         __sbit __at 0xC8+4 TCLK;
+         __sbit __at 0xC8+5 RCLK;
+         __sbit __at 0xC8+6 EXF2;
+         __sbit __at 0xC8+7 TF2;
+__sfr __at 0xCA RCAP2L;
+__sfr __at 0xCB RCAP2H;
+__sfr __at 0xCC TL2;
+__sfr __at 0xCD TH2;
+__sfr __at 0xD0 PSW;
+         /*  PSW  */
+         __sbit __at 0xD0+0 P;
+         __sbit __at 0xD0+1 FL;
+         __sbit __at 0xD0+2 OV;
+         __sbit __at 0xD0+3 RS0;
+         __sbit __at 0xD0+4 RS1;
+         __sbit __at 0xD0+5 F0;
+         __sbit __at 0xD0+6 AC;
+         __sbit __at 0xD0+7 CY;
+__sfr __at 0xD8 EICON; // Was WDCON in DS80C320; Bit Values differ from Reg320
+         /*  EICON  */
+         __sbit __at 0xD8+3 INT6;
+         __sbit __at 0xD8+4 RESI;
+         __sbit __at 0xD8+5 ERESI;
+         __sbit __at 0xD8+7 SMOD1;
+__sfr __at 0xE0 ACC;
+__sfr __at 0xE8 EIE; // EIE Bit Values differ from Reg320
+         /*  EIE  */
+         __sbit __at 0xE8+0 EUSB;
+         __sbit __at 0xE8+1 EI2C;
+         __sbit __at 0xE8+2 EIEX4;
+         __sbit __at 0xE8+3 EIEX5;
+         __sbit __at 0xE8+4 EIEX6;
+__sfr __at 0xF0 B;
+__sfr __at 0xF8 EIP; // EIP Bit Values differ from Reg320
+         /*  EIP  */
+         __sbit __at 0xF8+0 PUSB;
+         __sbit __at 0xF8+1 PI2C;
+         __sbit __at 0xF8+2 EIPX4;
+         __sbit __at 0xF8+3 EIPX5;
+         __sbit __at 0xF8+4 EIPX6;
+
+
+/* CPU Control & Status Register (CPUCS) */
+#define bmPRTCSTB    bmBIT5
+#define bmCLKSPD     (bmBIT4 | bmBIT3)
+#define bmCLKSPD1    bmBIT4
+#define bmCLKSPD0    bmBIT3
+#define bmCLKINV     bmBIT2
+#define bmCLKOE      bmBIT1
+#define bm8051RES    bmBIT0
+/* Port Alternate Configuration Registers */
+/* Port A (PORTACFG) */
+#define bmFLAGD      bmBIT7
+#define bmINT1       bmBIT1
+#define bmINT0       bmBIT0
+/* Port C (PORTCCFG) */
+#define bmGPIFA7     bmBIT7
+#define bmGPIFA6     bmBIT6
+#define bmGPIFA5     bmBIT5
+#define bmGPIFA4     bmBIT4
+#define bmGPIFA3     bmBIT3
+#define bmGPIFA2     bmBIT2
+#define bmGPIFA1     bmBIT1
+#define bmGPIFA0     bmBIT0
+/* Port E (PORTECFG) */
+#define bmGPIFA8     bmBIT7
+#define bmT2EX       bmBIT6
+#define bmINT6       bmBIT5
+#define bmRXD1OUT    bmBIT4
+#define bmRXD0OUT    bmBIT3
+#define bmT2OUT      bmBIT2
+#define bmT1OUT      bmBIT1
+#define bmT0OUT      bmBIT0
+
+/* I2C Control & Status Register (I2CS) */
+#define bmSTART      bmBIT7
+#define bmSTOP       bmBIT6
+#define bmLASTRD     bmBIT5
+#define bmID         (bmBIT4 | bmBIT3)
+#define bmBERR       bmBIT2
+#define bmACK        bmBIT1
+#define bmDONE       bmBIT0
+/* I2C Control Register (I2CTL) */
+#define bmSTOPIE     bmBIT1
+#define bm400KHZ     bmBIT0
+/* Interrupt 2 (USB) Autovector Register (INT2IVEC) */
+#define bmIV4        bmBIT6
+#define bmIV3        bmBIT5
+#define bmIV2        bmBIT4
+#define bmIV1        bmBIT3
+#define bmIV0        bmBIT2
+/* USB Interrupt Request & Enable Registers (USBIE/USBIRQ) */
+#define bmEP0ACK     bmBIT6
+#define bmHSGRANT    bmBIT5
+#define bmURES       bmBIT4
+#define bmSUSP       bmBIT3
+#define bmSUTOK      bmBIT2
+#define bmSOF        bmBIT1
+#define bmSUDAV      bmBIT0
+/* USBERRIE/IRQ */
+#define bmERRLIMIT  bmBIT0
+#define bmISOEP2    bmBIT4
+#define bmISOEP4    bmBIT5
+#define bmISOEP6    bmBIT6
+#define bmISOEP8    bmBIT7
+
+/* Endpoint Interrupt & Enable Registers (EPIE/EPIRQ) */
+#define bmEP0IN     bmBIT0
+#define bmEP0OUT    bmBIT1
+#define bmEP1IN     bmBIT2
+#define bmEP1OUT    bmBIT3
+#define bmEP2       bmBIT4
+#define bmEP4       bmBIT5
+#define bmEP6       bmBIT6
+#define bmEP8       bmBIT7
+/* Breakpoint register (BREAKPT) */
+#define bmBREAK      bmBIT3
+#define bmBPPULSE    bmBIT2
+#define bmBPEN       bmBIT1
+/* Interrupt 2 & 4 Setup (INTSETUP) */
+#define bmAV2EN      bmBIT3
+#define INT4IN       bmBIT1
+#define bmAV4EN      bmBIT0
+/* USB Control & Status Register (USBCS) */
+#define bmHSM        bmBIT7
+#define bmDISCON     bmBIT3
+#define bmNOSYNSOF   bmBIT2
+#define bmRENUM      bmBIT1
+#define bmSIGRESUME  bmBIT0
+/* Wakeup Control and Status Register (WAKEUPCS) */
+#define bmWU2        bmBIT7
+#define bmWU         bmBIT6
+#define bmWU2POL     bmBIT5
+#define bmWUPOL      bmBIT4
+#define bmDPEN       bmBIT2
+#define bmWU2EN      bmBIT1
+#define bmWUEN       bmBIT0
+/* End Point 0 Control & Status Register (EP0CS) */
+#define bmHSNAK      bmBIT7
+/* End Point 0-1 Control & Status Registers (EP0CS/EP1OUTCS/EP1INCS) */
+#define bmEPBUSY     bmBIT1
+#define bmEPSTALL    bmBIT0
+/* End Point 2-8 Control & Status Registers (EP2CS/EP4CS/EP6CS/EP8CS) */
+#define bmNPAK       (bmBIT6 | bmBIT5 | bmBIT4)
+#define bmEPFULL     bmBIT3
+#define bmEPEMPTY    bmBIT2
+/* Endpoint Status (EP2468STAT) __SFR bits */
+#define bmEP8FULL    bmBIT7
+#define bmEP8EMPTY   bmBIT6
+#define bmEP6FULL    bmBIT5
+#define bmEP6EMPTY   bmBIT4
+#define bmEP4FULL    bmBIT3
+#define bmEP4EMPTY   bmBIT2
+#define bmEP2FULL    bmBIT1
+#define bmEP2EMPTY   bmBIT0
+/* Endpoint Config (EP[24]CFG) */
+#define bmBUF       (bmBIT0|bmBIT1)
+/* Endpoint Config (EP[2468]CFG) */
+#define bmSIZE      bmBIT3
+#define bmTYPE      (bmBIT4|bmBIT5)
+#define bmDIR       bmBIT6
+#define bmVALID     bmBIT7
+/* SETUP Data Pointer Auto Mode (SUDPTRCTL) */
+#define bmSDPAUTO    bmBIT0
+/* Endpoint Data Toggle Control (TOGCTL) */
+#define bmQUERYTOGGLE  bmBIT7
+#define bmSETTOGGLE    bmBIT6
+#define bmRESETTOGGLE  bmBIT5
+#define bmTOGCTLEPMASK bmBIT3 | bmBIT2 | bmBIT1 | bmBIT0
+/* IBN (In Bulk Nak) enable and request bits (IBNIE/IBNIRQ) */
+#define bmEP8IBN     bmBIT5
+#define bmEP6IBN     bmBIT4
+#define bmEP4IBN     bmBIT3
+#define bmEP2IBN     bmBIT2
+#define bmEP1IBN     bmBIT1
+#define bmEP0IBN     bmBIT0
+
+/* PING-NAK enable and request bits (NAKIE/NAKIRQ) */
+#define bmEP8PING     bmBIT7
+#define bmEP6PING     bmBIT6
+#define bmEP4PING     bmBIT5
+#define bmEP2PING     bmBIT4
+#define bmEP1PING     bmBIT3
+#define bmEP0PING     bmBIT2
+#define bmIBN         bmBIT0
+
+/* Interface Configuration bits (IFCONFIG) */
+#define bmIFCLKSRC    bmBIT7
+#define bm3048MHZ     bmBIT6
+#define bmIFCLKOE     bmBIT5
+#define bmIFCLKPOL    bmBIT4
+#define bmASYNC       bmBIT3
+#define bmGSTATE      bmBIT2
+#define bmIFCFG1      bmBIT1
+#define bmIFCFG0      bmBIT0
+#define bmIFCFGMASK   (bmIFCFG0 | bmIFCFG1)
+#define bmIFGPIF      bmIFCFG1
+
+/* EP 2468 FIFO Configuration bits (EP2FIFOCFG,EP4FIFOCFG,EP6FIFOCFG,EP8FIFOCFG) */
+#define bmINFM       bmBIT6
+#define bmOEP        bmBIT5
+#define bmAUTOOUT    bmBIT4
+#define bmAUTOIN     bmBIT3
+#define bmZEROLENIN  bmBIT2
+#define bmWORDWIDE   bmBIT0
+
+/* Chip Revision Control Bits (REVCTL) - used to ebable/disable revision specidic
+   features */ 
+#define bmNOAUTOARM    bmBIT1
+#define bmSKIPCOMMIT   bmBIT0
+
+/* Fifo Reset bits (FIFORESET) */
+#define bmNAKALL       bmBIT7
+
+/* Chip Feature Register (GPCR2) */
+#define bmFULLSPEEDONLY    bmBIT4
+
+#endif   /* FX2REGS_H */
diff --git a/fx2lib/include/fx2types.h b/fx2lib/include/fx2types.h
new file mode 100644 (file)
index 0000000..7401aa5
--- /dev/null
@@ -0,0 +1,50 @@
+// Copyright (C) 2009 Ubixum, Inc. 
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+/*! \file 
+ *  define standard types of fixed widths.
+ * */
+
+#ifndef FXTYPES_H
+#define FXTYPES_H
+
+typedef unsigned int WORD;
+typedef unsigned char BYTE;
+typedef unsigned long DWORD;
+typedef unsigned char BOOL; 
+typedef enum {
+ FALSE=0,
+ TRUE
+} BOOL_VALS;
+
+#ifndef NULL
+#define NULL (void*)0
+#endif
+
+/*-----------------------------------------------------------------------------
+   Bit Masks
+-----------------------------------------------------------------------------*/
+
+#define bmBIT0 1
+#define bmBIT1 2
+#define bmBIT2 4
+#define bmBIT3 8
+#define bmBIT4 16
+#define bmBIT5 32
+#define bmBIT6 64
+#define bmBIT7 128
+
+#endif
diff --git a/fx2lib/include/gpif.h b/fx2lib/include/gpif.h
new file mode 100644 (file)
index 0000000..b6f40b8
--- /dev/null
@@ -0,0 +1,110 @@
+// Copyright (C) 2009 Ubixum, Inc. 
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+/*! \file 
+ *
+ * These functions do the same thing that the Cypress gpif designer expored c file does.
+ * Instead of including their file directly in your project, you include just the
+ * generated waveform data.  The gpif2dat script in the utils folder will export your
+ * waveform data to a file that can be included in your project.
+ * */
+
+#ifndef GPIF_H
+#define GPIF_H
+
+#include "fx2types.h"
+
+#define GPIFDONE (GPIFTRIG&0x80)
+#define GPIFTC16 (MAKEWORD(GPIFTCB1,GPIFTCB0))
+#define GPIFTC32 (MAKEDWORD(MAKEWORD(GPIFTCB3,GPIFTCB2),MAKEWORD(GPIFTCB1,GPIFTCB0)))
+
+
+/**
+ * Gpif designer generates a c file with waveform data.
+ * Copy the WaveData[128] array
+ * and the InitData[7] to your code somewhere
+ * Then this function is pretty much the reset of the generated
+ * code but ported to sdcc.
+ *
+ * uses syncdelay of 4 which might not be long enough if peripheral
+ * runs slower than 30mhz.  May not affect anything.
+ *
+ * IFCONFIG is set with IFCFG[1:0] = 10 for GPIF master but you still
+ * have to set the ifclk, polarity, and the rest of the bits
+ **/
+
+void gpif_init( BYTE* waveform, BYTE* initdata );
+
+/**
+ * Uses the correct bytes from your flowstates array.
+ * This may or may not be needed depending on whether
+ * your waveform data uses flowstates.  If you don't
+ * know if you need them or not, you probably don't.
+ *
+ * flowstates should have 36 elements.
+ * bank should be 0-3
+ **/
+void gpif_setflowstate( BYTE* flowstates, BYTE bank);
+
+
+
+//! These defines/functions pretty much out of the TRM 10.4
+#define GPIFTRGWR 0
+#define GPIFTRGRD 4
+typedef enum {
+    GPIF_EP2 = 0,
+    GPIF_EP4 = 1,
+    GPIF_EP6 = 2,
+    GPIF_EP8 = 3
+} GPIF_EP_NUM;
+
+/**
+ * \brief Simple function to help set the transaction count for gpif
+ * transactions.
+ * \param tc 32 bit Transaction Count
+ **/
+void gpif_set_tc32(DWORD tc);
+/**
+ * \brief Simple function to set transaction count for gpif transactions.
+ * \param tc 16 bit Transaction Count
+ **/
+void gpif_set_tc16(WORD tc);
+
+
+/**
+ * Use the gpif to read a single word at a time.
+ * Read len words and store in res
+ *
+ * At least one EPxFIFOCFG has to have wordwide=1 or this
+ * functions won't transfer both bytes.
+ **/
+
+void gpif_single_read16( WORD* res , WORD len);
+
+/**
+ * Use the gpif to write a single word at a time.
+ * Write len words from data
+ *
+ * At leat one EPxFIFOCFG has to have wordwide=1 or this
+ * function won't transfer both bytes.
+ **/
+void gpif_single_write16( WORD* data, WORD len);
+
+void gpif_fifo_read ( GPIF_EP_NUM ep_num );
+
+void gpif_fifo_write( GPIF_EP_NUM ep_num );
+
+#endif
diff --git a/fx2lib/include/i2c.h b/fx2lib/include/i2c.h
new file mode 100644 (file)
index 0000000..3d7d5f3
--- /dev/null
@@ -0,0 +1,97 @@
+// Copyright (C) 2009 Ubixum, Inc. 
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+/** \file i2c.h 
+ *  Utilities for reading and writing to i2c devices and as eeproms.
+ **/
+
+#ifndef I2C_H
+#define I2C_H
+
+#include "fx2types.h"
+
+/**
+ * i2c_write and i2c_read set this to FALSE at the beginning of a 
+ * transaction.  If for some reason, the read/write is taking too
+ * long or not returning, firmware can set this to TRUE to cause the
+ * routine to abort.  (Usually done via an interrupt).
+ **/
+extern volatile __xdata BOOL cancel_i2c_trans;
+
+/**
+ * \brief write data to i2c bus.
+ *
+ *  Writes data from addr buffer 1st, then data buffer. 
+ *  Either buffer can be NULL (as long as you set lenN to 0).
+ *  
+ *  Two buffers allows writing data all in one i2c write command without
+ *  having to write a hardware address and a data byte with each 
+ *  i2c transaction.
+ *
+ * \param addr i2c address
+ * \param len1 length of addr data
+ * \param addr_buf addr data
+ * \param len2 length of data
+ * \param data_buf data bytes
+ **/
+BOOL i2c_write ( BYTE addr, WORD len1, BYTE* addr_buf, WORD len2, BYTE* data_buf );
+
+/**
+ * \brief read data on the i2c bus.
+ *
+ * \param addr i2c address
+ * \param len number of bytes to read
+ * \param buf buffer to store data
+ **/
+BOOL i2c_read ( BYTE addr, WORD len, BYTE* buf);
+
+/**
+ * \brief read data from an attached eeprom.
+ *
+ * Writes the address of the data to read then reads len bytes into buf.
+ * This function checks the I2CS register to determine if a one or two
+ * byte address eepom was detected on the i2c bus.  Reading from proms
+ * at non-standard addresses my require using the i2c_read/write commands
+ * explicitly.
+ *
+ * \param prom_addr eeprom i2c address
+ * \param addr address of bytes to start reading
+ * \param len number of bytes to read
+ * \param buf data buffer
+ **/
+BOOL eeprom_read( BYTE prom_addr, WORD addr, WORD len, BYTE* buf);
+
+/**
+ * \brief write data to the eeprom
+ *
+ * This function checks the I2CS register to determin if a one or two
+ * two byte eeprom is detected.  If the prom is not detected at boot time
+ * or is connected to alternate addresses, the i2c_read/write commands should
+ * be used explicitly insread of using this function.
+ *
+ * For each byte in buf, the address is written and then the data byte. Many 
+ * proms support writing multiple bytes at the same time.  For these, it is
+ * also better to use i2c_read/write explicitly.  This function is rather slow
+ * but is effective.
+ *
+ * \param prom_addr eeprom i2c address
+ * \param addr address of bytes to start writing
+ * \param len number of bytes to write
+ * \param buf data buffer
+ **/
+BOOL eeprom_write( BYTE prom_addr, WORD addr, WORD len, BYTE* buf);
+
+#endif
diff --git a/fx2lib/include/lights.h b/fx2lib/include/lights.h
new file mode 100644 (file)
index 0000000..7b1a01e
--- /dev/null
@@ -0,0 +1,96 @@
+// Copyright (C) 2009 Ubixum, Inc. 
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+/** \file lights.h
+ * macros for turning lights on the EZ-USB development board on and off.
+ **/
+
+#ifndef LIGHTS_H
+#define LIGHTS_H
+
+#include "fx2types.h"
+
+#ifndef FX1
+// FX2 Dev board lights
+#define D2ONH #0x88 // assembly high byte of light addr 
+#define D2OFFH #0x80 
+#define D3ONH #0x98 
+#define D3OFFH #0x90 
+#define D4ONH #0xA8 
+#define D4OFFH #0xA0 
+#define D5ONH #0xB8 
+#define D5OFFH #0xB0 
+volatile xdata at 0x8800 BYTE D2ON;
+volatile xdata at 0x8000 BYTE D2OFF;
+volatile xdata at 0x9800 BYTE D3ON;
+volatile xdata at 0x9000 BYTE D3OFF;
+volatile xdata at 0xA800 BYTE D4ON;
+volatile xdata at 0xA000 BYTE D4OFF;
+volatile xdata at 0xB800 BYTE D5ON;
+volatile xdata at 0xB000 BYTE D5OFF;
+#else
+// FX1 dev board lights
+#define D2ONH #0x80 // assembly high byte of light addr 
+#define D2OFFH #0x81 
+#define D3ONH #0x90 
+#define D3OFFH #0x91 
+#define D4ONH #0xA0 
+#define D4OFFH #0xA1 
+#define D5ONH #0xB0 
+#define D5OFFH #0xB1 
+volatile xdata at 0x8000 BYTE D2ON;
+volatile xdata at 0x8100 BYTE D2OFF;
+volatile xdata at 0x9000 BYTE D3ON;
+volatile xdata at 0x9100 BYTE D3OFF;
+volatile xdata at 0xA000 BYTE D4ON;
+volatile xdata at 0xA100 BYTE D4OFF;
+volatile xdata at 0xB000 BYTE D5ON;
+volatile xdata at 0xB100 BYTE D5OFF;
+#endif
+
+/**
+ * Easier to use macros defined below 
+**/
+#define activate_light(LIGHT_ADDR) __asm \
+ mov __XPAGE, LIGHT_ADDR \
+ __endasm; __asm \
+ movx a, @r0 \
+__endasm \
+
+/**
+ *  Easy to make lights blink with these macros:
+ *  \code
+ *      WORD ct=0;
+ *      BOOL on=FALSE;
+ *      while (TRUE) {
+ *          if (!ct) {
+ *              on=!on;
+ *              if (on) d2on(); else d2off();
+ *          }
+ *          ++ct;
+ *      }
+ *  \endcode
+ **/
+#define d2on() activate_light(D2ONH)
+#define d2off() activate_light(D2OFFH)
+#define d3on() activate_light(D3ONH)
+#define d3off() activate_light(D3OFFH)
+#define d4on() activate_light(D4ONH)
+#define d4off() activate_light(D4OFFH)
+#define d5on() activate_light(D5ONH)
+#define d5off() activate_light(D5OFFH)
+
+#endif
diff --git a/fx2lib/include/serial.h b/fx2lib/include/serial.h
new file mode 100644 (file)
index 0000000..df5c782
--- /dev/null
@@ -0,0 +1,55 @@
+// Copyright (C) 2009 Ubixum, Inc. 
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+/** \file serial.h
+ * defines functions to print to a serial console with SIO0
+ **/
+
+#include "fx2types.h"
+
+
+/**
+ * This function inits sio0 to use T2CON (timer 2)
+ * See TRM 14.3.4.1 (Table 14-16)
+ * Certain baud rates have too high an error rate to work.  All baud rates are .16%
+ * except:
+ *
+ *          12MHZ      24MHZ
+ *   \li 57600  -6.99%
+ *   \li 38400  -2.34%     -2.34%
+ *   \li 19200  -2.34%
+ *
+ *   Possible Baud rates:
+ *    \li 2400
+ *    \li 4800
+ *    \li 9600
+ *    \li 19200
+ *    \li 28800
+ *    \li 38400
+ *    \li 57600
+ *
+ *    Any of these rates should work except 57600 at 12mhz.  -2.34% is pushing
+ *    most hardware specs for working.  All rates at 48mhz work at .16%
+ **/
+
+void sio0_init( WORD baud_rate ) __critical ; // baud_rate max should be 57600 since int=2 bytes
+
+/**
+ putchar('\\n') or putchar('\\r') both transmit \\r\\n
+ Just use one or the other. (This makes terminal echo easy)
+**/
+void putchar(char c);
+char getchar();
diff --git a/fx2lib/include/setupdat.h b/fx2lib/include/setupdat.h
new file mode 100644 (file)
index 0000000..cbae0e0
--- /dev/null
@@ -0,0 +1,223 @@
+// Copyright (C) 2009 Ubixum, Inc. 
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+#ifndef SETUPDAT_H
+#define SETUPDAT_H
+
+#include "fx2regs.h"
+#include "delay.h"
+/** \file setupdat.h
+  Utilities for handling setup data and vendor commands.
+
+ \verbatim
+
+ This module needs initialized with a device descriptor.
+ NOTE that your descriptors need to be located in code memory
+ to use the SUDPTRH:L to auto transfer the data
+ and vendor commands handler.  You have to provide callbacks.
+
+DEVICE DESCRIPTORS
+ // copy the dscr_asm file from the lib dir to your
+ // own project directory, change it how
+ // you want, and link it against your project
+
+VENDOR COMMANDS
+
+  0xA0 is handled by ez-usb firmware.  (Upload/Download ram)
+  0xA1-0xAF is reserved for other ez-usb functions so don't use that
+  Any other value (Above 0x0C anyway) can be used for device specific
+  commands.
+  
+  If you include this file, you need to define a function for vendor
+  commands even if you don't want to implement any vendor commands.
+  The function should return TRUE if you handled the command and FALSE
+  if you didn't.  The handle_setup function calls
+  EP0CS |= bmHSNAK;
+  before returning so there is no reason to set that bit in your
+  vendor command handler.  (You do need to Set EP0 data and
+  byte counts appropriately though.)
+  
+  // return TRUE if you handle the command 
+  // you can directly get SETUPDAT[0-7] for the data sent with the command
+  BOOL handle_vendorcommand(BYTE cmd) { return FALSE; }
+  // a note  on vencor commands
+  // this from the usb spec for requesttype
+        D7 Data Phase Transfer Direction
+        0 = Host to Device
+        1 = Device to Host
+        D6..5 Type
+        0 = Standard
+        1 = Class
+        2 = Vendor
+        3 = Reserved
+        D4..0 Recipient
+        0 = Device
+        1 = Interface
+        2 = Endpoint
+        3 = Other
+        4..31 = Reserved
+  // if you want libusb to send data back to the host via ep0, you need to make
+  // sure the requesttype had 1 in bit 7.  This is for libusb on linux anyway.
+  
+  
+  // set *alt_ifc to the current alt interface for ifc
+  BOOL handle_get_interface(BYTE ifc, BYTE* alt_ifc) { *ifc=0;*alt_ifc=0;}
+  // return TRUE if you set the interface requested
+  // NOTE this function should reconfigure and reset the endpoints
+  // according to the interface descriptors you provided.
+  BOOL handle_set_interface(BYTE ifc,BYTE alt_ifc) { return TRUE; }
+  // handle getting and setting the configuration
+  // 0 is the default.  If you support more than one config
+  // keep track of the config number and return the correct number
+  // config numbers are set int the dscr file.
+  BYTE handle_get_configuration() { return 1; }
+  // return TRUE if you handle this request
+  // NOTE changing config requires the device to reset all the endpoints
+  BOOL handle_set_configuration(BYTE cfg) { return FALSE; }
+  // ep num (byte 7 is dir 1=IN,0=OUT)
+  // client needs to reset the endpoint to default state
+  void handle_reset_ep(BYTE ep) { }
+
+  \endverbatim
+*/
+
+
+#define SETUP_VALUE() MAKEWORD(SETUPDAT[3],SETUPDAT[2])
+#define SETUP_INDEX() MAKEWORD(SETUPDAT[5],SETUPDAT[4])
+#define SETUP_LENGTH() MAKEWORD(SETUPDAT[7],SETUPDAT[6]) 
+#define SETUP_TYPE SETUPDAT[0]
+
+/**
+ * self_powered is set to FALSE by default.  It is 
+ * used for GET_FEATURE requests.  Firmware can set it to 
+ * TRUE if the device is not powered by the USB bus.
+ **/
+extern volatile BOOL self_powered;
+
+/**
+ * remote_wakeup_allowed defaults to FALSE but can be
+ * set to TRUE with SET_FEATURE from the host. (firmware shouldn't 
+ * set this.)
+ **/
+extern volatile BOOL remote_wakeup_allowed;
+
+//! see TRM 2-3
+//! here are the usb setup data commands
+//! these are the usb spec pretty much
+
+typedef enum {
+    GET_STATUS,
+    CLEAR_FEATURE,
+    // 0x02 is reserved
+    SET_FEATURE=0x03,
+    // 0x04 is reserved
+    SET_ADDRESS=0x05, // this is handled by EZ-USB core unless RENUM=0
+    GET_DESCRIPTOR,
+    SET_DESCRIPTOR,
+    GET_CONFIGURATION,
+    SET_CONFIGURATION,
+    GET_INTERFACE,
+    SET_INTERFACE,
+    SYNC_FRAME
+} SETUP_DATA;
+
+
+/**
+ * returns the control/status register for an end point
+ * (bit 7=1 for IN, 0 for out
+ **/
+__xdata BYTE* ep_addr(BYTE ep);
+
+/*
+ You can call this function directly if you are polling
+ for setup data in your main loop.
+ You can also use the usbjt and enable the sudav isr
+ and call the function from withing the sudav isr routine
+*/
+void handle_setupdata();
+
+
+/**
+    For devices to properly handle usb hispeed
+    (This is if your descriptor has high speed and full speed versions
+     and it should since the fx2lp is a high speed capable device
+    )
+    enable both USBRESET and HISPEED interrupts and
+    call this function to switch the descriptors.  This function uses
+    a __critical section to switch the descriptors and is safe to call
+    from the hispeed or reset interrupt.  See \ref fw.c
+
+    \param highspeed Call the function with highspeed = TRUE if 
+        calling because the highspeed interrupt was received.
+        If calling from usbreset, call with highspeed=false
+**/
+void handle_hispeed( BOOL highspeed );
+
+
+/* descriptor types */
+#define DSCR_DEVICE_TYPE 1
+#define DSCR_CONFIG_TYPE 2
+#define DSCR_STRING_TYPE 3
+#define DSCR_DEVQUAL_TYPE 6
+#define DSCR_OTHERSPD_TYPE 7
+
+/* usb spec 2 */
+#define DSCR_BCD 2
+
+
+/* device descriptor */
+#define DSCR_DEVICE_LEN 18
+
+typedef struct {
+    BYTE dsc_len; // descriptor length (18 for this )
+    BYTE dsc_type; // dscr type
+    WORD bcd; // bcd
+    BYTE dev_class; // device class
+    BYTE dev_subclass; // sub class
+    BYTE dev_protocol; // sub sub class
+    BYTE max_pkt; // max packet size
+    WORD vendor_id;
+    WORD product_id;
+    WORD dev_version; // product version id
+    BYTE idx_manstr; //  manufacturer string index
+    BYTE idx_devstr; // product string index
+    BYTE idx_serstr; // serial number index
+    BYTE num_configs; // number of configurations
+        
+} DEVICE_DSCR;
+
+
+/* config descriptor */
+#define DSCR_CONFIG_LEN 9
+typedef struct {
+    BYTE dsc_len; // 9 for this one
+    BYTE dsc_type; // dscr type
+    
+} CONFIG_DSCR;
+
+/* string descriptor */
+typedef struct {
+    BYTE dsc_len;
+    BYTE dsc_type;
+    BYTE pstr;
+} STRING_DSCR;
+
+
+
+
+#endif
diff --git a/fx2lib/lib/.gitignore b/fx2lib/lib/.gitignore
new file mode 100644 (file)
index 0000000..08711da
--- /dev/null
@@ -0,0 +1 @@
+fx2.lib
diff --git a/fx2lib/lib/Makefile b/fx2lib/lib/Makefile
new file mode 100644 (file)
index 0000000..1a93180
--- /dev/null
@@ -0,0 +1,40 @@
+# Copyright (C) 2009 Ubixum, Inc. 
+# 
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+SOURCES = serial.c i2c.c delay.c setupdat.c gpif.c eputils.c $(wildcard interrupts/*.c)
+FX2_OBJS = $(patsubst %.c,%.rel, $(SOURCES)) usbav.rel int4av.rel
+INCLUDES = -I../include
+SDCC = sdcc -mmcs51 $(SDCCFLAGS)
+LIBS = fx2.lib
+
+all: $(LIBS)
+
+$(LIBS): $(FX2_OBJS)
+       sdcclib fx2.lib $?
+
+usbav.rel: usbav.a51
+       sdas8051 -logs usbav.a51
+
+int4av.rel: int4av.a51
+       sdas8051 -logs int4av.a51
+
+%.rel: %.c
+       $(SDCC) $(INCLUDES) -c $< -o $@
+
+clean:
+       rm -f *.{asm,ihx,lnk,lst,map,mem,rel,rst,sym,adb,cdb,lib}
+       rm -f interrupts/*.{asm,ihx,lnk,lst,map,mem,rel,rst,sym,adb,dcb,lib}
+
diff --git a/fx2lib/lib/delay.c b/fx2lib/lib/delay.c
new file mode 100644 (file)
index 0000000..3e41e19
--- /dev/null
@@ -0,0 +1,73 @@
+/**
+ * Copyright (C) 2009 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <fx2regs.h>
+#include <fx2macros.h>
+#include <delay.h>
+
+void delay(WORD millis) {
+    /**
+     * It takes 12 crystal pulses to make 1 machine cycle (8051.com)
+     * ez-usb trm 1.13
+     *  83.3 ns at 48mhz per instruction cycle
+     *  (assume 166.6ns at 24mhz)
+     *  (assume 333.3ns at 12mhz)
+     * ez-usb trm 12.1
+     *  Includes the cycles for each instruction
+     **/    
+    WORD loop_count;
+    volatile WORD count;  // NOTE perhaps use different solutions w/ out volatile
+    
+    
+    // set count to the number of times we need to
+    // go around a loop for 1 millisecond
+    
+    // then do that loop millis times. (1000 us=1ms)
+    
+    // 48mhz: 1000 us / (17 cycles * 83.3 ns / cycle / 1000 ns/us) = 706
+    // 24mhz: 353
+    // 12mhz: 177
+    // recalculate if the number of cycles changes
+    // like if you change the loop below
+    loop_count = CPUFREQ == CLK_12M ? 177 :
+                 CPUFREQ == CLK_24M ? 353 : 706;
+    
+    // sdcc generated assembly
+    /*  cycles   code
+                ;   delay.c:31: do {
+                00101$:
+                ;   delay.c:32: } while ( --count );
+        2           dec _delay_count_1_1
+        2           mov a,#0xff
+        4           cjne    a,_delay_count_1_1,00121$
+        2           dec (_delay_count_1_1 + 1)
+                00121$:
+        2           mov a,_delay_count_1_1
+        2           orl a,(_delay_count_1_1 + 1)
+        3           jnz 00101$
+        
+        Total 17
+    */
+    
+    do {
+        count = loop_count;
+        do {            
+        } while ( --count );        
+    } while ( --millis );
+    
+}
diff --git a/fx2lib/lib/eputils.c b/fx2lib/lib/eputils.c
new file mode 100644 (file)
index 0000000..e459aee
--- /dev/null
@@ -0,0 +1,60 @@
+/**
+ * Copyright (C) 2009 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+
+
+
+#include <eputils.h>
+
+#include <fx2regs.h>
+
+#ifdef DEBUG_EPUTILS
+#include <stdio.h>
+#else
+#define printf(...)
+#endif
+
+void readep0( BYTE* dst, WORD len) {
+    WORD read = 0; // n bytes read
+    BYTE c,avail;
+    while (read < len) {
+        EP0BCH = 0;
+        // NOTE need syncdelay?
+        EP0BCL = 0; // re-arm ep so host can send more
+        while (EP0CS & bmEPBUSY);
+        avail = EP0BCL; // max size fits in one byte (64 bytes)
+        for (c=0;c<avail;++c)
+            dst[read+c] = EP0BUF[c];
+        read += avail;
+    }
+}
+
+
+void writeep0( BYTE* src, WORD len) {
+    WORD written = 0;
+    BYTE c;
+    while ( written < len ) {
+        while ( EP0CS & bmEPBUSY ); // wait
+        for (c=0;c<64 && written<len;++c ) {
+            EP0BUF[c] = src[written++];
+        }
+        EP0BCH = 0;
+        EP0BCL= c;
+        printf ( "Write %d bytes\n", c );
+    }
+}
diff --git a/fx2lib/lib/fx2.mk b/fx2lib/lib/fx2.mk
new file mode 100644 (file)
index 0000000..eecedc5
--- /dev/null
@@ -0,0 +1,101 @@
+# common make targets for compiling fx2 firmware
+#
+# In your Makefile, define:
+# SOURCES: list of c files to compile
+# A51_SOURCES: list of any a51 files.
+# DEPS: list of any depedancies (like auto-generated header files) that need
+#       generated prior to compiling. You must provide the target definition
+#       for any DEPS you define.
+# BASENAME: name of your firmware file, i.e., myfirmware, but not myfirmware.c
+#
+# Leave these alone or redefine as necessary to customize firmware.
+# (Redefine after including this makefile)
+# VID vendor id
+# PID product id
+# LIBS optional additional libraries to link with the firmware.
+# SDCC build/link options
+#  CODE_SIZE:    Default --code-size 0x3c00
+#  XRAM_SIZE:    Default --xram-size 0x0200
+#  XRAM_LOC:     Default --xram-loc 0x3c00
+# BUILDDIR: build directory (default build)
+# These two can be changed to be blank if no device descriptor is being used.
+#  DSCR_AREA:    Default -Wl"-b DSCR_AREA=0x3e00"
+#  INT2JT:             Default -Wl"-b INT2JT=0x3f00"
+#
+# Provided targets:
+#
+# default target: creates $(BASENAME).ihx
+# bix: creates $(BASENAME).bix
+# iic: creates $(BASENAME).iic
+# load: uses fx2load to load firmware.bix onto the development board
+#  (You can customize VID/PID if you need to load the firmware onto a device that has different vendor and product id
+#  The default is  0x04b4, 0x8613
+# clean: delete all the temp files.
+#
+#
+#
+
+VID?=0x04b4
+PID?=0x8613
+
+DSCR_AREA?=-Wl"-b DSCR_AREA=0x3e00"
+INT2JT?=-Wl"-b INT2JT=0x3f00"
+CODE_SIZE?=--code-size 0x3c00
+XRAM_SIZE?=--xram-size 0x0200
+XRAM_LOC?=--xram-loc 0x3c00
+BUILDDIR?=build
+
+FX2LIBDIR?=$(dir $(lastword $(MAKEFILE_LIST)))../
+
+RELS=$(addprefix $(BUILDDIR)/, $(addsuffix .rel, $(notdir $(basename $(SOURCES) $(A51_SOURCES)))))
+# these are pretty good settings for most firmwares.  
+# Have to be careful with memory locations for 
+# firmwares that require more xram etc.
+CC = sdcc -mmcs51 \
+       $(SDCCFLAGS) \
+    $(CODE_SIZE) \
+    $(XRAM_SIZE) \
+    $(XRAM_LOC) \
+       $(DSCR_AREA) \
+       $(INT2JT)
+
+
+.PHONY: ihx iic bix load clean clean-all
+
+
+ihx: $(BUILDDIR)/$(BASENAME).ihx
+bix: $(BUILDDIR)/$(BASENAME).bix
+iic: $(BUILDDIR)/$(BASENAME).iic
+
+$(FX2LIBDIR)/lib/fx2.lib: $(FX2LIBDIR)/lib/*.c $(FX2LIBDIR)/lib/*.a51
+       make -C $(FX2LIBDIR)/lib
+
+$(BUILDDIR):
+       mkdir -p $(BUILDDIR)
+
+$(BUILDDIR)/$(BASENAME).ihx: $(BUILDDIR) $(SOURCES) $(A51_SOURCES) $(FX2LIBDIR)/lib/fx2.lib $(DEPS) 
+# can't use default target %.rel because there is no way
+# to differentiate the dependency.  (Is it %.rel: %.c or %.a51)
+       for a in $(A51_SOURCES); do \
+        cp $$a $(BUILDDIR)/; \
+        cd $(BUILDDIR) && sdas8051 -logs `basename $$a` && cd ..; done
+       for s in $(SOURCES); do \
+        THISREL=$$(basename `echo "$$s" | sed -e 's/\.c$$/\.rel/'`); \
+        $(CC) -c -I $(FX2LIBDIR)/include $$s -o $(BUILDDIR)/$$THISREL ; done
+       $(CC) -o $@ $(RELS) fx2.lib -L $(FX2LIBDIR)/lib $(LIBS)
+
+
+$(BUILDDIR)/$(BASENAME).bix: $(BUILDDIR)/$(BASENAME).ihx
+       objcopy -I ihex -O binary $< $@
+$(BUILDDIR)/$(BASENAME).iic: $(BUILDDIR)/$(BASENAME).ihx
+       $(FX2LIBDIR)/utils/ihx2iic.py -v $(VID) -p $(PID) $< $@
+
+load: $(BUILDDIR)/$(BASENAME).bix
+       fx2load -v $(VID) -p $(PID) $(BUILDDIR)/$(BASENAME).bix
+
+clean:
+       rm -f $(BUILDDIR)/*.{asm,ihx,lnk,lst,map,mem,rel,rst,sym,adb,cdb,bix}
+
+clean-all: clean
+       make -C $(FX2LIBDIR)/lib clean
+
diff --git a/fx2lib/lib/gpif.c b/fx2lib/lib/gpif.c
new file mode 100644 (file)
index 0000000..9e03361
--- /dev/null
@@ -0,0 +1,182 @@
+/**
+ * Copyright (C) 2009 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+
+#include <fx2regs.h>
+#include <fx2macros.h>
+#include <delay.h>
+
+#include <gpif.h>
+
+#define SYNCDELAY() SYNCDELAY4
+
+void gpif_init( BYTE* wavedata, BYTE* initdata ) {
+    
+    BYTE i;
+  // Registers which require a synchronization delay, see section 15.14
+  // FIFORESET        FIFOPINPOLAR
+  // INPKTEND         OUTPKTEND
+  // EPxBCH:L         REVCTL
+  // GPIFTCB3         GPIFTCB2
+  // GPIFTCB1         GPIFTCB0
+  // EPxFIFOPFH:L     EPxAUTOINLENH:L
+  // EPxFIFOCFG       EPxGPIFFLGSEL
+  // PINFLAGSxx       EPxFIFOIRQ
+  // EPxFIFOIE        GPIFIRQ
+  // GPIFIE           GPIFADRH:L
+  // UDMACRCH:L       EPxGPIFTRIG
+  // GPIFTRIG
+  
+  // Note: The pre-REVE EPxGPIFTCH/L register are affected, as well...
+  //      ...these have been replaced by GPIFTC[B3:B0] registers
+  // 8051 doesn't have access to waveform memories 'til
+  // the part is in GPIF mode.
+  // IFCLKSRC=1   , FIFOs executes on internal clk source
+  // xMHz=1       , 48MHz internal clk rate
+  // IFCLKOE=0    , Don't drive IFCLK pin signal at 48MHz
+  // IFCLKPOL=0   , Don't invert IFCLK pin signal from internal clk
+  // ASYNC=1      , master samples asynchronous
+  // GSTATE=1     , Drive GPIF states out on PORTE[2:0], debug WF
+  // IFCFG[1:0]=10, FX2 in GPIF master mode  IFCONFIG
+  IFCONFIG &= ~0x03; // turn off IFCFG[1:0]
+  IFCONFIG |= 0x02; // set's IFCFG[1:0] to 10 to put in GPIF master mode.
+  
+  GPIFABORT = 0xFF;  // abort any waveforms pending
+  GPIFREADYCFG = initdata[ 0 ];
+  GPIFCTLCFG = initdata[ 1 ];
+  GPIFIDLECS = initdata[ 2 ];
+  GPIFIDLECTL = initdata[ 3 ];
+  GPIFWFSELECT = initdata[ 5 ];
+  GPIFREADYSTAT = initdata[ 6 ];
+  // use dual autopointer feature... 
+  AUTOPTRSETUP = 0x07;          // inc both pointers, 
+                                // ...warning: this introduces pdata hole(s)
+                                // ...at E67B (XAUTODAT1) and E67C (XAUTODAT2)
+  
+  // source
+  AUTOPTRH1 = MSB( (WORD)wavedata );
+  AUTOPTRL1 = LSB( (WORD)wavedata );
+  
+  // destination
+  AUTOPTRH2 = 0xE4;
+  AUTOPTRL2 = 0x00;
+  // transfer
+  for ( i = 0x00; i < 128; i++ )
+  {
+    EXTAUTODAT2 = EXTAUTODAT1;
+  }
+// Configure GPIF Address pins, output initial value,
+// these instructions don't do anything on the
+// smaller chips (e.g., 56 pin model only has ports a,b,d)
+  PORTCCFG = 0xFF;    // [7:0] as alt. func. GPIFADR[7:0]
+  OEC = 0xFF;         // and as outputs
+  PORTECFG |= 0x80;   // [8] as alt. func. GPIFADR[8]
+  OEE |= 0x80;        // and as output
+// ...OR... tri-state GPIFADR[8:0] pins
+//  PORTCCFG = 0x00;  // [7:0] as port I/O
+//  OEC = 0x00;       // and as inputs
+//  PORTECFG &= 0x7F; // [8] as port I/O
+//  OEE &= 0x7F;      // and as input
+// GPIF address pins update when GPIFADRH/L written
+  SYNCDELAY();                    // 
+  GPIFADRH = 0x00;    // bits[7:1] always 0
+  SYNCDELAY();                    // 
+  GPIFADRL = 0x00;    // point to PERIPHERAL address 0x0000
+
+// set the initial flowstates to be all 0 in case flow states are not used
+
+  FLOWSTATE = 0;
+  FLOWLOGIC = 0;
+  FLOWEQ0CTL = 0;
+  FLOWEQ1CTL = 0;
+  FLOWHOLDOFF = 0;
+  FLOWSTB = 0;
+  FLOWSTBEDGE = 0;
+  FLOWSTBHPERIOD = 0;
+}
+
+void gpif_setflowstate( BYTE* flowstates, BYTE bank) {
+  BYTE base = 9*bank;
+  FLOWSTATE = flowstates[ base ];
+  FLOWLOGIC = flowstates[ base+1 ];
+  FLOWEQ0CTL = flowstates[ base+2 ];
+  FLOWEQ1CTL = flowstates[ base+3 ];
+  FLOWHOLDOFF = flowstates[ base+4 ];
+  FLOWSTB = flowstates[ base+5 ];
+  FLOWSTBEDGE = flowstates[ base+6 ];
+  FLOWSTBHPERIOD = flowstates[ base+7 ];
+}
+
+void gpif_set_tc32(DWORD tc) {
+    GPIFTCB3 = MSB(MSW(tc));
+    SYNCDELAY();
+    GPIFTCB2 = LSB(MSW(tc));
+    SYNCDELAY();
+    GPIFTCB1 = MSB(LSW(tc));
+    SYNCDELAY();
+    GPIFTCB0 = LSB(LSW(tc));
+}
+void gpif_set_tc16(WORD tc) {
+    GPIFTCB1= MSB(tc);
+    SYNCDELAY();
+    GPIFTCB0= LSB(tc);
+}
+
+
+void gpif_single_read16( WORD* res, WORD len ){
+    BYTE c;    
+    while (!(GPIFTRIG & 0x80)); // wait done
+    // dummy read to trigger real read
+    res[0] = XGPIFSGLDATLX;
+    for (c=0;c<len;++c) {
+     while ( !(GPIFTRIG & 0x80) ); // wait done
+     // real read
+     res[c] = GPIFSGLDATH << 8;
+     // whether or not to do another transfer is controlled by GPIFSGLDATLNOX or ..DATLX
+     res[c] |= c==len-1 ? GPIFSGLDATLNOX : GPIFSGLDATLX ;
+    }
+}
+
+void gpif_single_write16( WORD* dat, WORD len) {
+   BYTE c;
+   for (c=0;c<len;++c) {
+    while (!(GPIFTRIG & 0x80) );
+    XGPIFSGLDATH = MSB(dat[c]);
+    XGPIFSGLDATLX = LSB(dat[c]);
+   }
+}
+
+void gpif_fifo_read ( GPIF_EP_NUM ep_num ) {
+    while ( !(GPIFTRIG & 0x80 ) ); // wait until things are finished
+    GPIFTRIG = GPIFTRGRD | ep_num;
+}
+
+void gpif_fifo_write ( GPIF_EP_NUM ep_num ) {
+    while ( !(GPIFTRIG & 0x80) ); // wait until things are finished
+    GPIFTRIG = ep_num; // R/W=0, E[1:0] = ep_num
+}
diff --git a/fx2lib/lib/i2c.c b/fx2lib/lib/i2c.c
new file mode 100644 (file)
index 0000000..c18bcee
--- /dev/null
@@ -0,0 +1,298 @@
+/**
+ * Copyright (C) 2009 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <stdio.h> // NOTE this needs deleted
+
+#include <fx2regs.h>
+#include <fx2macros.h>
+#include <i2c.h>
+#include <delay.h>
+
+
+//#define DEBUG_I2C 1
+
+#ifdef DEBUG_I2C
+#define i2c_printf(...) printf(__VA_ARGS__)
+#else
+#define i2c_printf(...)
+#endif
+
+
+volatile __xdata BOOL cancel_i2c_trans;
+#define CHECK_I2C_CANCEL() if (cancel_i2c_trans) return FALSE
+
+/**
+ *
+    1. Set START=1. If BERR=1, start timer*.
+    2. Write the 7-bit peripheral address and the direction bit (0 for a write) to I2DAT.
+    3. Wait for DONE=1 or for timer to expire*. If BERR=1, go to step 1.
+    4. If ACK=0, go to step 9.
+    5. Load I2DAT with a data byte.
+    6. Wait for DONE=1*. If BERR=1, go to step 1.
+    7. If ACK=0, go to step 9.
+    8. Repeat steps 5-7 for each byte until all bytes have been transferred.
+    9. Set STOP=1. Wait for STOP = 0 before initiating another transfer.
+ **/
+BOOL i2c_write ( BYTE addr, WORD len, BYTE *addr_buf, WORD len2, BYTE* data_buf ) {
+    
+    WORD cur_byte;
+    WORD total_bytes = len+len2; // NOTE overflow error?
+    BYTE retry_count=2; // two tries to write address/read ack
+    cancel_i2c_trans=FALSE;
+    //BOOL wait=FALSE; // use timer if needed
+
+    // 1. Set START=1. If BERR=1, start timer*.
+    step1:
+        CHECK_I2C_CANCEL();
+        cur_byte=0;
+        I2CS |= bmSTART;
+        if ( I2CS & bmBERR ) {
+            i2c_printf ( "Woops.. need to do the timer\n" );
+            delay(10); // way too long probably
+            goto step1;
+            }
+   
+    
+    // 2. Write the 7-bit peripheral address and the direction bit (0 for a write) to I2DAT.
+        I2DAT = addr << 1;
+        
+    // 3. Wait for DONE=1 or for timer to expire*. If BERR=1, go to step 1.
+        while ( !(I2CS & bmDONE) && !cancel_i2c_trans);
+        CHECK_I2C_CANCEL();
+        if (I2CS&bmBERR) {
+            i2c_printf ( "bmBERR, going to step 1\n" );
+            goto step1;
+        }
+    
+        
+    // 4. If ACK=0, go to step 9.
+    if ( !(I2CS & bmACK) ) {
+        I2CS |= bmSTOP;
+        while ( (I2CS & bmSTOP) && !cancel_i2c_trans);
+        CHECK_I2C_CANCEL();
+        --retry_count;
+        if (!retry_count){
+            i2c_printf ( "No ack after writing address.! Fail\n");
+            return FALSE;
+        }
+        delay(10);
+        goto step1;
+    }
+    
+    // 8. Repeat steps 5-7 for each byte until all bytes have been transferred.
+    while ( cur_byte < total_bytes ) {
+        // 5. Load I2DAT with a data byte.
+        I2DAT = cur_byte < len ? addr_buf[cur_byte] : data_buf[cur_byte-len];
+        ++cur_byte;
+        // 6. Wait for DONE=1*. If BERR=1, go to step 1.
+        while (!(I2CS&bmDONE) && !cancel_i2c_trans); CHECK_I2C_CANCEL();
+        if ( I2CS&bmBERR ) {
+         i2c_printf ( "bmBERR on byte %d. Going to step 1\n" , cur_byte-1 );
+         goto step1;
+         //return FALSE;
+        }
+        // 7. If ACK=0, go to step 9.
+        if ( !(I2CS & bmACK) ) {
+            I2CS |= bmSTOP;
+            while ( (I2CS&bmSTOP) && !cancel_i2c_trans);
+            i2c_printf ( "No Ack after byte %d. Fail\n", cur_byte-1 );
+            return FALSE; 
+        }
+    }
+
+    
+    // 9. Set STOP=1. Wait for STOP = 0 before initiating another transfer.
+    //real step 9
+    I2CS |= bmSTOP;
+    while ( (I2CS & bmSTOP) && !cancel_i2c_trans);
+    CHECK_I2C_CANCEL();
+
+    return TRUE;
+
+}
+
+/*
+ trm 13.4.4
+    1. Set START=1. If BERR = 1, start timer*.
+    2. Write the 7-bit peripheral address and the direction bit (1 for a read) to I2DAT.
+    3. Wait for DONE=1 or for timer to expire*. If BERR=1, go to step 1.
+    4. If ACK=0, set STOP=1 and go to step 15.
+    5. Read I2DAT to initiate the first burst of nine SCL pulses to clock in the first byte from the slave.
+    Discard the value that was read from I2DAT.
+    6. Wait for DONE=1. If BERR=1, go to step 1.
+    7. Read the just-received byte of data from I2DAT. This read also initiates the next read transfer.
+    8. Repeat steps 6 and 7 for each byte until ready to read the second-to-last byte.
+    9. Wait for DONE=1. If BERR=1, go to step 1.
+    10. Before reading the second-to-last I2DAT byte, set LASTRD=1.
+    11. Read the second-to-last byte from I2DAT. With LASTRD=1, this initiates the final byte read on
+    the bus.
+    12. Wait for DONE=1. If BERR=1, go to step 1.
+    13. Set STOP=1.
+    14. Read the final byte from I2DAT immediately (the next instruction) after setting the STOP bit. By
+    reading I2DAT while the "stop" condition is being generated, the just-received data byte will be
+    retrieved without initiating an extra read transaction (nine more SCL pulses) on the I²Cbus.
+    15. Wait for STOP = 0 before initiating another transfer
+*/
+
+/*
+  * timer should be at least as long as longest start-stop interval on the bus
+  serial clock for i2c bus runs at 100khz by default and can run at 400khz for devices that support it
+  start-stop interval is about 9 serial clock cycles
+  400KHZ bit 0=100khz, 1=400khz
+  
+  how many cycles at XTAL cycles/second = 9 cycles at 400k (or 100k) cycles/second
+  
+  timeout = n i2c cycles / I2C cycles/sec = timeout seconds
+          timeout seconds * XTAL cycles/sec = XTAL cycles
+          9 / 400 (or 100) * (XTAL)
+  
+*/
+BOOL i2c_read( BYTE addr, WORD len, BYTE* buf) {
+    
+    
+    BYTE tmp;
+    WORD cur_byte;
+    cancel_i2c_trans=FALSE;
+    //WORD timeout_cycles = (WORD)(9.0 * XTAL / I2CFREQ );
+    
+    // 1. Set START=1. If BERR = 1, start timer*.
+    start:
+        CHECK_I2C_CANCEL();
+        cur_byte=0;        
+
+        I2CS |= bmSTART;
+        if ( I2CS & bmBERR ) {            
+            i2c_printf ( "Woops, step1 BERR, need to do timeout\n");
+            delay(10); // NOTE way too long
+            goto start;
+        }
+        
+    // 2. Write the 7-bit peripheral address and the direction bit (1 for a read) to I2DAT.
+        I2DAT = (addr << 1) | 1; // last 1 for read
+    
+    // 3. Wait for DONE=1 or for timer to expire*. If BERR=1, go to step 1.
+                
+        while ( !(I2CS & bmDONE) && !cancel_i2c_trans ); CHECK_I2C_CANCEL();
+        if ( I2CS & bmBERR )
+            goto start;
+            
+    // 4. If ACK=0, set STOP=1 and go to step 15.
+        if (!(I2CS&bmACK) ) {
+            I2CS |= bmSTOP;
+            while ( (I2CS&bmSTOP) && !cancel_i2c_trans );
+            return FALSE; 
+        }
+        
+    // with only one byte to read, this needs set here.
+    // (In this case, the tmp read is the 2nd to last read)
+    if ( len==1 ) I2CS |= bmLASTRD; 
+        
+    // 5. Read I2DAT to initiate the first burst of nine SCL pulses to clock in the first byte from the slave.
+    //    Discard the value that was read from I2DAT.
+        tmp = I2DAT; // discard read
+    
+    while (len>cur_byte+1) { // reserve last byte read for after the loop
+        
+        // 6. Wait for DONE=1. If BERR=1, go to step 1.
+        // 9. Wait for DONE=1. If BERR=1, go to step 1.
+        while (!(I2CS&bmDONE) && !cancel_i2c_trans); CHECK_I2C_CANCEL(); 
+        if ( I2CS&bmBERR ) goto start;
+
+        // 10. Before reading the second-to-last I2DAT byte, set LASTRD=1.
+        if (len==cur_byte+2) // 2nd to last byte
+            I2CS |= bmLASTRD;
+        
+        // 7. Read the just-received byte of data from I2DAT. This read also initiates the next read transfer.
+        // 11. Read the second-to-last byte from I2DAT. With LASTRD=1, this initiates the final byte read on
+        //     the bus.
+            buf[cur_byte++] = I2DAT;
+                        
+        // 8. Repeat steps 6 and 7 for each byte until ready to read the second-to-last byte.
+    }
+    
+    //12. Wait for DONE=1. If BERR=1, go to step 1.
+        while (!(I2CS&bmDONE) && !cancel_i2c_trans); CHECK_I2C_CANCEL();
+        if ( I2CS&bmBERR ) goto start;
+    // 13. Set STOP=1.
+        I2CS |= bmSTOP;
+    // 14. Read the final byte from I2DAT immediately (the next instruction) after setting the STOP bit. By
+    // reading I2DAT while the "stop" condition is being generated, the just-received data byte will be
+    // retrieved without initiating an extra read transaction (nine more SCL pulses) on the I²Cbus.
+        buf[cur_byte] = I2DAT; // use instead of buffer addressing so next instruction reads I2DAT
+
+    while ( (I2CS&bmSTOP) && !cancel_i2c_trans); CHECK_I2C_CANCEL();
+
+    return TRUE;
+}
+
+
+
+BOOL eeprom_write(BYTE prom_addr, WORD addr, WORD length, BYTE* buf) {
+    BYTE addr_len=0;
+    // 1st bytes of buffer are address and next byte is value
+    BYTE data_buffer[3];
+    WORD cur_byte=0;
+
+#ifdef DEBUG_I2C
+    if ( EEPROM_TWO_BYTE ) {
+        i2c_printf ( "Two Byte EEProm Address detected.\n" );
+    } else {
+        i2c_printf ( "Single Byte EEProm address detected.\n" );
+    }
+#endif
+    
+    while ( cur_byte<length ) {
+        addr_len=0;
+        if (EEPROM_TWO_BYTE) {
+            data_buffer[addr_len++] = MSB(addr);
+        }
+        data_buffer[addr_len++] = LSB(addr);
+        data_buffer[addr_len++] = buf[cur_byte++];
+
+        i2c_printf ( "%02x " , data_buffer[addr_len-1] );
+        
+        if ( ! i2c_write ( prom_addr, addr_len, data_buffer, 0, NULL ) ) return FALSE;
+        ++addr; // next byte goes to next address
+    }
+
+    return TRUE;
+    
+}
+
+
+BOOL eeprom_read (BYTE prom_addr, WORD addr, WORD length, BYTE *buf)
+{
+
+    BYTE eeprom_addr[2];
+    BYTE addr_len=0;
+    if (EEPROM_TWO_BYTE) 
+        eeprom_addr[addr_len++] = MSB(addr);
+    
+    eeprom_addr[addr_len++] = LSB(addr);
+
+    // write the address we want to read to the prom
+    //printf ("Starting Addr Write with addr len %d\n", addr_len);
+    if ( !i2c_write( prom_addr, addr_len, eeprom_addr, 0, NULL ) ) return FALSE;
+    //printf ( "Starting read\n" );
+    if ( !i2c_read ( prom_addr, length, buf ) ) return FALSE;
+
+    return TRUE;
+    
+}
+
diff --git a/fx2lib/lib/int4av.a51 b/fx2lib/lib/int4av.a51
new file mode 100644 (file)
index 0000000..85bce78
--- /dev/null
@@ -0,0 +1,28 @@
+; Copyright (C) 2010 Ubixum, Inc. 
+;
+; This library is free software; you can redistribute it and/or
+; modify it under the terms of the GNU Lesser General Public
+; License as published by the Free Software Foundation; either
+; version 2.1 of the License, or (at your option) any later version.
+; 
+; This library is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+; Lesser General Public License for more details.
+; 
+; You should have received a copy of the GNU Lesser General Public
+; License along with this library; if not, write to the Free Software
+; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+.module INT4AV ; jump table for int4AV (GPIF & endpoint interrupts)
+
+.globl _INT4JT
+
+.area INT4AV (ABS,OVR)
+.org    0x53 ; where INT4 jumps to 
+_INT4AV = #. + 2
+    ljmp _INT2JT ; the addr gets replaced so this really goes to int4jt locations
+
+
+.area INT4JT ( CODE )
+_INT4JT: ; doesn't do anything but forces this module to be linked in if gpif macro used.
diff --git a/fx2lib/lib/interrupts/ep0ack_isr.c b/fx2lib/lib/interrupts/ep0ack_isr.c
new file mode 100644 (file)
index 0000000..3ea4b1e
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep0ack_isr() __interrupt EP0ACK_ISR {}
+
diff --git a/fx2lib/lib/interrupts/ep0in_isr.c b/fx2lib/lib/interrupts/ep0in_isr.c
new file mode 100644 (file)
index 0000000..d0ebc22
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep0in_isr() __interrupt EP0IN_ISR {}
+
diff --git a/fx2lib/lib/interrupts/ep0out_isr.c b/fx2lib/lib/interrupts/ep0out_isr.c
new file mode 100644 (file)
index 0000000..5c76574
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep0out_isr() __interrupt EP0OUT_ISR {}
+
diff --git a/fx2lib/lib/interrupts/ep0ping_isr.c b/fx2lib/lib/interrupts/ep0ping_isr.c
new file mode 100644 (file)
index 0000000..85716c9
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep0ping_isr() __interrupt EP0PING_ISR {}
+
diff --git a/fx2lib/lib/interrupts/ep1in_isr.c b/fx2lib/lib/interrupts/ep1in_isr.c
new file mode 100644 (file)
index 0000000..afc8841
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep1in_isr() __interrupt EP1IN_ISR {}
+
diff --git a/fx2lib/lib/interrupts/ep1out_isr.c b/fx2lib/lib/interrupts/ep1out_isr.c
new file mode 100644 (file)
index 0000000..51f5b5c
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep1out_isr() __interrupt EP1OUT_ISR {}
+
diff --git a/fx2lib/lib/interrupts/ep1ping_isr.c b/fx2lib/lib/interrupts/ep1ping_isr.c
new file mode 100644 (file)
index 0000000..fa77349
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep1ping_isr() __interrupt EP1PING_ISR {}
+
diff --git a/fx2lib/lib/interrupts/ep2_isr.c b/fx2lib/lib/interrupts/ep2_isr.c
new file mode 100644 (file)
index 0000000..d91764e
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep2_isr() __interrupt EP2_ISR {}
+
diff --git a/fx2lib/lib/interrupts/ep2ef_isr.c b/fx2lib/lib/interrupts/ep2ef_isr.c
new file mode 100644 (file)
index 0000000..d1509a7
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep2ef_isr() __interrupt EP2EF_ISR{}
+
diff --git a/fx2lib/lib/interrupts/ep2ff_isr.c b/fx2lib/lib/interrupts/ep2ff_isr.c
new file mode 100644 (file)
index 0000000..ebfa8f1
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep2ff_isr() __interrupt EP2FF_ISR{}
+
diff --git a/fx2lib/lib/interrupts/ep2isoerr_isr.c b/fx2lib/lib/interrupts/ep2isoerr_isr.c
new file mode 100644 (file)
index 0000000..1bd1a72
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep2isoerr_isr() __interrupt EP2ISOERR_ISR {}
+
diff --git a/fx2lib/lib/interrupts/ep2pf_isr.c b/fx2lib/lib/interrupts/ep2pf_isr.c
new file mode 100644 (file)
index 0000000..f12c5ba
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep2pf_isr() __interrupt EP2PF_ISR{}
+
diff --git a/fx2lib/lib/interrupts/ep2ping_isr.c b/fx2lib/lib/interrupts/ep2ping_isr.c
new file mode 100644 (file)
index 0000000..e292648
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep2ping_isr() __interrupt EP2PING_ISR {}
+
diff --git a/fx2lib/lib/interrupts/ep4_isr.c b/fx2lib/lib/interrupts/ep4_isr.c
new file mode 100644 (file)
index 0000000..249162e
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep4_isr() __interrupt EP4_ISR {}
+
diff --git a/fx2lib/lib/interrupts/ep4ef_isr.c b/fx2lib/lib/interrupts/ep4ef_isr.c
new file mode 100644 (file)
index 0000000..3e6f102
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep4ef_isr() __interrupt EP4EF_ISR{}
+
diff --git a/fx2lib/lib/interrupts/ep4ff_isr.c b/fx2lib/lib/interrupts/ep4ff_isr.c
new file mode 100644 (file)
index 0000000..eb15bdb
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep4ff_isr() __interrupt EP4FF_ISR{}
+
diff --git a/fx2lib/lib/interrupts/ep4isoerr_isr.c b/fx2lib/lib/interrupts/ep4isoerr_isr.c
new file mode 100644 (file)
index 0000000..bd874c5
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep4isoerr_isr() __interrupt EP4ISOERR_ISR {}
+
diff --git a/fx2lib/lib/interrupts/ep4pf_isr.c b/fx2lib/lib/interrupts/ep4pf_isr.c
new file mode 100644 (file)
index 0000000..a8d3f08
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep4pf_isr() __interrupt EP4PF_ISR{}
+
diff --git a/fx2lib/lib/interrupts/ep4ping_isr.c b/fx2lib/lib/interrupts/ep4ping_isr.c
new file mode 100644 (file)
index 0000000..14b39cc
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep4ping_isr() __interrupt EP4PING_ISR {}
+
diff --git a/fx2lib/lib/interrupts/ep6_isr.c b/fx2lib/lib/interrupts/ep6_isr.c
new file mode 100644 (file)
index 0000000..dc6551e
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep6_isr() __interrupt EP6_ISR {}
+
diff --git a/fx2lib/lib/interrupts/ep6ef_isr.c b/fx2lib/lib/interrupts/ep6ef_isr.c
new file mode 100644 (file)
index 0000000..cf29ba7
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep6ef_isr() __interrupt EP6EF_ISR{}
+
diff --git a/fx2lib/lib/interrupts/ep6ff_isr.c b/fx2lib/lib/interrupts/ep6ff_isr.c
new file mode 100644 (file)
index 0000000..3777f6e
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep6ff_isr() __interrupt EP6FF_ISR{}
+
diff --git a/fx2lib/lib/interrupts/ep6isoerr_isr.c b/fx2lib/lib/interrupts/ep6isoerr_isr.c
new file mode 100644 (file)
index 0000000..f660858
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep6isoerr_isr() __interrupt EP6ISOERR_ISR {}
+
diff --git a/fx2lib/lib/interrupts/ep6pf_isr.c b/fx2lib/lib/interrupts/ep6pf_isr.c
new file mode 100644 (file)
index 0000000..bc1ae7b
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep6pf_isr() __interrupt EP6PF_ISR{}
+
diff --git a/fx2lib/lib/interrupts/ep6ping_isr.c b/fx2lib/lib/interrupts/ep6ping_isr.c
new file mode 100644 (file)
index 0000000..eaabbbc
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep6ping_isr() __interrupt EP6PING_ISR {}
+
diff --git a/fx2lib/lib/interrupts/ep8_isr.c b/fx2lib/lib/interrupts/ep8_isr.c
new file mode 100644 (file)
index 0000000..a82eef0
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep8_isr() __interrupt EP8_ISR {}
+
diff --git a/fx2lib/lib/interrupts/ep8ef_isr.c b/fx2lib/lib/interrupts/ep8ef_isr.c
new file mode 100644 (file)
index 0000000..deca21e
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep8ef_isr() __interrupt EP8EF_ISR{}
+
diff --git a/fx2lib/lib/interrupts/ep8ff_isr.c b/fx2lib/lib/interrupts/ep8ff_isr.c
new file mode 100644 (file)
index 0000000..6fcb0c1
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep8ff_isr() __interrupt EP8FF_ISR{}
+
diff --git a/fx2lib/lib/interrupts/ep8isoerr_isr.c b/fx2lib/lib/interrupts/ep8isoerr_isr.c
new file mode 100644 (file)
index 0000000..0d75ff4
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep8isoerr_isr() __interrupt EP8ISOERR_ISR {}
+
diff --git a/fx2lib/lib/interrupts/ep8pf_isr.c b/fx2lib/lib/interrupts/ep8pf_isr.c
new file mode 100644 (file)
index 0000000..f3a329c
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep8pf_isr() __interrupt EP8PF_ISR{}
+
diff --git a/fx2lib/lib/interrupts/ep8ping_isr.c b/fx2lib/lib/interrupts/ep8ping_isr.c
new file mode 100644 (file)
index 0000000..0bc4abf
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ep8ping_isr() __interrupt EP8PING_ISR {}
+
diff --git a/fx2lib/lib/interrupts/errlimit_isr.c b/fx2lib/lib/interrupts/errlimit_isr.c
new file mode 100644 (file)
index 0000000..115418d
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void errlimit_isr() __interrupt ERRLIMIT_ISR {}
+
diff --git a/fx2lib/lib/interrupts/gpifdone_isr.c b/fx2lib/lib/interrupts/gpifdone_isr.c
new file mode 100644 (file)
index 0000000..6b8b48d
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void gpifdone_isr() __interrupt GPIFDONE_ISR{}
+
diff --git a/fx2lib/lib/interrupts/gpifwf_isr.c b/fx2lib/lib/interrupts/gpifwf_isr.c
new file mode 100644 (file)
index 0000000..de0ab4d
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void gpifwf_isr() __interrupt GPIFWF_ISR{}
+
diff --git a/fx2lib/lib/interrupts/hispeed_isr.c b/fx2lib/lib/interrupts/hispeed_isr.c
new file mode 100644 (file)
index 0000000..14f440a
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void hispeed_isr() __interrupt HISPEED_ISR {}
+
diff --git a/fx2lib/lib/interrupts/ibn_isr.c b/fx2lib/lib/interrupts/ibn_isr.c
new file mode 100644 (file)
index 0000000..4f54937
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void ibn_isr() __interrupt IBN_ISR {}
+
diff --git a/fx2lib/lib/interrupts/sof_isr.c b/fx2lib/lib/interrupts/sof_isr.c
new file mode 100644 (file)
index 0000000..15349c8
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void sof_isr() __interrupt SOF_ISR {}
+
diff --git a/fx2lib/lib/interrupts/spare_isr.c b/fx2lib/lib/interrupts/spare_isr.c
new file mode 100644 (file)
index 0000000..fa84995
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void spare_isr() __interrupt RESERVED_ISR {}
+
diff --git a/fx2lib/lib/interrupts/sudav_isr.c b/fx2lib/lib/interrupts/sudav_isr.c
new file mode 100644 (file)
index 0000000..e72a1a1
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void sudav_isr() __interrupt SUDAV_ISR {}
+
diff --git a/fx2lib/lib/interrupts/suspend_isr.c b/fx2lib/lib/interrupts/suspend_isr.c
new file mode 100644 (file)
index 0000000..ef56b9c
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void suspend_isr() __interrupt SUSPEND_ISR {}
+
diff --git a/fx2lib/lib/interrupts/sutok_isr.c b/fx2lib/lib/interrupts/sutok_isr.c
new file mode 100644 (file)
index 0000000..d857eb7
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void sutok_isr() __interrupt SUTOK_ISR {}
+
diff --git a/fx2lib/lib/interrupts/usbreset_isr.c b/fx2lib/lib/interrupts/usbreset_isr.c
new file mode 100644 (file)
index 0000000..cf0bc47
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ * Copyright (C) 2010 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+#include <autovector.h>
+
+void usbreset_isr() __interrupt USBRESET_ISR {}
+
diff --git a/fx2lib/lib/serial.c b/fx2lib/lib/serial.c
new file mode 100644 (file)
index 0000000..094d311
--- /dev/null
@@ -0,0 +1,92 @@
+/**
+ * Copyright (C) 2009 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+
+#include <fx2regs.h>
+#include <fx2macros.h>
+#include <serial.h>
+
+
+/**
+ * using the comp port implies that timer 2 will be used as
+ * a baud rate generator.  (Don't use timer 2)
+ **/
+void sio0_init( WORD baud_rate ) __critical { // baud_rate max should be 57600 since int=2 bytes
+       
+    WORD hl; // hl value for reload    
+       BYTE mult; // multiplier for clock speed
+    DWORD tmp; // scratch for mult/divide
+
+    // 0 = 12mhz, 1=24mhz, 2=48mhz    
+       mult = CPUFREQ == CLK_12M ? 1 :
+           CPUFREQ == CLK_24M ? 2 : 4; // since only 3 clock speeds, fast switch instead of doing 2^clock speed pow(2,clkspd)
+
+       // set the clock rate
+       // use clock 2
+       RCLK=1;TCLK=1;
+
+//    RCAP2H:L = 0xFFFF - CLKOUT / 32 x baud_rate
+
+    // in order to round to nearest value..
+    // tmp * 2 // double
+    // tmp / rate // do the divide
+    // tmp + 1 // add one (which is like adding 1/2)
+    // tmp / 2 // back to original rounded 
+    tmp = mult * 375000L * 2 ;
+    tmp /= baud_rate;
+    tmp += 1;
+    tmp /= 2;
+
+    hl = 0xFFFF - (WORD)tmp;
+
+       RCAP2H= MSB(hl);
+       // seems that the 24/48mhz calculations are always one less than suggested values    
+    // trm table 14-16
+       RCAP2L= LSB(hl) + (mult>0?1:0);
+       TR2=1; // start the timer
+       
+       // set up the serial port       
+       SM0 = 0; SM1=1;// serial mode 1 (asyncronous)   
+       SM2 = 0 ; // has to do with receiving
+       REN = 1 ; // to enable receiving
+    PCON |= 0x80; // SET SMOD0, baud rate doubler
+    TI = 1; // we send initial byte
+
+}
+
+char getchar() {
+  char c;
+  while (!RI)
+    ;  
+  c=SBUF0;
+  RI=0;
+  return c;
+}
+
+void _transchar(char c) {
+ while ( !TI ); // wait for TI=1 
+ TI=0;
+ SBUF0=c;
+}
+
+void putchar (char c) {
+  if (c=='\n') _transchar('\r'); // transmit \r\n
+  _transchar(c);  
+  if (c == '\r' ) _transchar('\n'); // transmit \r\n
+}
+
diff --git a/fx2lib/lib/setupdat.c b/fx2lib/lib/setupdat.c
new file mode 100644 (file)
index 0000000..f4c217a
--- /dev/null
@@ -0,0 +1,367 @@
+/**
+ * Copyright (C) 2009 Ubixum, Inc. 
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ **/
+
+//#define DEBUG_SETUPDAT
+
+#ifdef DEBUG_SETUPDAT
+#include <stdio.h> // NOTE this needs deleted
+#else
+#define printf(...)
+#define NULL (void*)0;
+#endif
+
+#include <fx2regs.h>
+#include <fx2macros.h>
+#include <eputils.h>
+#include <setupdat.h>
+
+
+extern BOOL handle_vendorcommand(BYTE cmd);
+extern BOOL handle_set_configuration(BYTE cfg);
+extern BOOL handle_get_interface(BYTE ifc, BYTE* alt_ifc);
+extern BOOL handle_set_interface(BYTE ifc,BYTE alt_ifc);
+extern BYTE handle_get_configuration();
+extern BOOL handle_set_configuration(BYTE cfg);
+extern void handle_reset_ep(BYTE ep);
+
+/**
+ * Predefs for handlers
+ **/
+
+
+//  GET_STATUS,
+BOOL handle_get_status();
+//  CLEAR_FEATURE,
+BOOL handle_clear_feature();
+  // 0x02 is reserved
+//  SET_FEATURE=0x03,
+BOOL handle_set_feature();
+  // 0x04 is reserved
+//  SET_ADDRESS=0x05, // this is handled by EZ-USB core unless RENUM=0
+//  GET_DESCRIPTOR,
+void handle_get_descriptor();
+//  SET_DESCRIPTOR,
+//  GET_CONFIGURATION, // handled by callback
+//  SET_CONFIGURATION, // handled by callback
+//  GET_INTERFACE, // handled by callback
+//  SET_INTERFACE, // handled by callback
+//  SYNC_FRAME // not yet implemented
+
+/*
+ TRM 2.2
+ Setup Token ->
+ data transfer ->
+ handshake
+*/
+
+void handle_setupdata() {
+    //printf ( "Handle setupdat: %02x\n", SETUPDAT[1] );
+
+    switch ( SETUPDAT[1] ) {
+
+        case GET_STATUS:
+            if (!handle_get_status())
+                STALLEP0();
+            break;
+        case CLEAR_FEATURE:
+            if (!handle_clear_feature()) {
+                STALLEP0();
+            }
+            break;
+        case SET_FEATURE:
+            if (!handle_set_feature()) {
+                STALLEP0();
+            }
+            break;
+        case GET_DESCRIPTOR:
+            handle_get_descriptor();
+            break;
+        case GET_CONFIGURATION:            
+            EP0BUF[0] = handle_get_configuration();
+            EP0BCH=0;
+            EP0BCL=1;
+            break;
+        case SET_CONFIGURATION:
+            // user callback
+            if( !handle_set_configuration(SETUPDAT[2])) {
+                STALLEP0();
+            }
+            break;
+        case GET_INTERFACE:
+            {
+                BYTE alt_ifc;
+                if (!handle_get_interface(SETUPDAT[4],&alt_ifc)) {
+                    STALLEP0();
+                } else {
+                 EP0BUF[0] = alt_ifc;
+                 EP0BCH=0;
+                 EP0BCL=1;
+                }
+            }
+            break;
+        case SET_INTERFACE:
+            // user callback
+            if ( !handle_set_interface(SETUPDAT[4],SETUPDAT[2])) {
+                STALLEP0();
+            }
+            break;
+        default:
+         if (!handle_vendorcommand(SETUPDAT[1])) {
+            printf ( "Unhandled Vendor Command: %02x\n" , SETUPDAT[1] );
+            STALLEP0();
+         }
+        
+        
+    }
+    
+    // do the handshake
+    EP0CS |= bmHSNAK;
+    
+}
+
+__xdata BYTE* ep_addr(BYTE ep) { // bit 8 of ep_num is the direction
+ BYTE ep_num = ep&~0x80; // mask the direction
+ switch (ep_num) {
+  case 0: return &EP0CS;
+  case 1: return ep&0x80? &EP1INCS : &EP1OUTCS;
+  case 2: return &EP2CS;
+  case 4: return &EP4CS;
+  case 6: return &EP6CS;
+  case 8: return &EP8CS;
+  default: return NULL;
+ }
+}
+
+
+// Get status has three request types
+#define GS_DEVICE 0x80
+#define GS_INTERFACE 0x81
+#define GS_ENDPOINT 0x82
+
+
+volatile BOOL self_powered=FALSE;
+volatile BOOL remote_wakeup_allowed=FALSE;
+
+BOOL handle_get_status() {
+    
+    switch ( SETUPDAT[0] ) {
+
+//        case 0: // sometimes we get a 0 status too
+        case GS_INTERFACE: 
+            EP0BUF[0] = 0;
+            EP0BUF[1] = 0;
+            EP0BCH=0;
+            EP0BCL=2;
+            break;
+        case GS_DEVICE:
+
+            // two byte response
+            // byte 0 bit 0 = self powered bit 1 = remote wakeup
+            EP0BUF[0] = (remote_wakeup_allowed << 1) | self_powered;
+            // byte 1 = 0
+            EP0BUF[1] = 0;
+            EP0BCH = 0;
+            EP0BCL = 2;
+            break;
+        case GS_ENDPOINT:
+            {
+                __xdata BYTE* pep=ep_addr(SETUPDAT[4]);
+                if ( !pep ) return FALSE;
+                // byte 0 bit 0 = stall bit
+                EP0BUF[0] = *pep & bmEPSTALL ? 1 : 0;
+                EP0BUF[1] = 0;
+                EP0BCH=0;
+                EP0BCL=2;
+            }
+            break;
+        default:
+            printf ( "Unexpected Get Status: %02x\n", SETUPDAT[0] );
+            return FALSE;
+            
+                        
+    }
+    return TRUE;
+}
+
+
+#define GF_DEVICE 0
+#define GF_ENDPOINT 2
+
+BOOL handle_clear_feature() {
+ //printf ( "Clear Feature\n" );
+ switch ( SETUPDAT[0] ) {
+   case GF_DEVICE:
+    if (SETUPDAT[2] == 1) {
+        remote_wakeup_allowed=FALSE;
+        break;
+    }
+    return FALSE;
+   case GF_ENDPOINT:
+    if (SETUPDAT[2] == 0) { // ep stall feature
+        __xdata BYTE* pep=ep_addr(SETUPDAT[4]);
+        printf ( "unstall endpoint %02X\n" , SETUPDAT[4] );
+        *pep &= ~bmEPSTALL;        
+    } else {
+        printf ( "unsupported ep feature %02x", SETUPDAT[2] );
+        return FALSE;
+    }
+
+    break;
+   default:
+    return handle_vendorcommand(SETUPDAT[1]);
+ }
+ return TRUE;
+}
+
+BOOL handle_set_feature() {
+ printf ( "Set Feature %02x\n", SETUPDAT[0] );
+ switch ( SETUPDAT[0] ) {
+  case GF_DEVICE:
+    if (SETUPDAT[2] == 2) break; // this is TEST_MODE and we simply need to return the handshake
+    if (SETUPDAT[2] == 1) {
+       remote_wakeup_allowed=TRUE; 
+       break;
+    }
+    return FALSE;
+  case GF_ENDPOINT:
+    if ( SETUPDAT[2] == 0 ) { // ep stall feature
+        // set TRM 2.3.2
+        // stall and endpoint
+        __xdata BYTE* pep = ep_addr(SETUPDAT[4]);
+        printf ( "Stall ep %d\n", SETUPDAT[4] );
+        if (!pep) {            
+            return FALSE;
+        }
+        
+        *pep |= bmEPSTALL;
+        // should now reset data toggles
+        // write ep+dir to TOGCTL
+        RESETTOGGLE(SETUPDAT[4]);
+        // restore stalled ep to default condition
+        // NOTE
+        //handle_reset_ep(SETUPDAT[4]);
+        
+    } else {
+        printf ( "unsupported ep feature %02x\n", SETUPDAT[2] );
+        return FALSE;
+    }  
+   break;
+   default:
+    return handle_vendorcommand(SETUPDAT[1]);
+ }
+ return TRUE;
+}
+
+/* these are devined in dscr.asm
+   and need to be customized then
+   linked in by the firmware manually */
+extern __code WORD dev_dscr;
+extern __code WORD dev_qual_dscr;
+extern __code WORD highspd_dscr;
+extern __code WORD fullspd_dscr;
+extern __code WORD dev_strings;
+
+WORD pDevConfig = (WORD)&fullspd_dscr;
+WORD pOtherConfig = (WORD)&highspd_dscr;
+
+void handle_hispeed(BOOL highspeed) {
+ __critical { 
+     printf ( "Hi Speed or reset Interrupt\n" );
+     if (highspeed) {
+         pDevConfig=(WORD)&highspd_dscr;
+         pOtherConfig=(WORD)&fullspd_dscr;
+     } else {
+        pDevConfig=(WORD)&fullspd_dscr;
+        pOtherConfig=(WORD)&highspd_dscr;
+     }
+ }
+}
+
+/**
+ * Handle:
+ *  Device Descriptor
+ *  Device Qualifier
+ *  Configuration
+ *  String
+ *  Other-Speed
+ **/
+void handle_get_descriptor() {
+    //printf ( "Get Descriptor\n" );
+    
+    switch ( SETUPDAT[3] ) {
+        case DSCR_DEVICE_TYPE:
+            printf ( "Get Device Config\n" );
+            SUDPTRH = MSB((WORD)&dev_dscr);
+            SUDPTRL = LSB((WORD)&dev_dscr);
+            break;
+        case DSCR_CONFIG_TYPE:
+            // get the config descriptor
+            printf ( "Get Config Descriptor\n");
+            SUDPTRH = MSB(pDevConfig);
+            SUDPTRL = LSB(pDevConfig);
+            break;        
+        case DSCR_STRING_TYPE:
+            //printf ( "Get String Descriptor idx: %d\n", SETUPDAT[2] );
+            {
+                STRING_DSCR* pStr = (STRING_DSCR*)&dev_strings;
+                // pStr points to string 0
+                BYTE idx = SETUPDAT[2];
+                BYTE cur=0; // current check
+                do {
+                    if (idx==cur++) break;
+                    //printf ( "Length of pStr: %d\n", pStr->dsc_len );
+                    //printf ( "pstr: %04x to ", pStr );
+                    pStr = (STRING_DSCR*)((BYTE*)pStr + pStr->dsc_len);
+                    //printf ( "%04x\n" , pStr );
+                    if (pStr->dsc_type != DSCR_STRING_TYPE) pStr=NULL;
+                } while ( pStr && cur<=idx);
+                
+                if (pStr) {
+                    /* BYTE i;
+                    //printf ( "found str: '");
+                    for (i=0;i<pStr->dsc_len-2;++i) {
+                       printf ( i%2==0?"%c":"%02x", *((BYTE*)(&pStr->pstr)+i));
+                    } printf ( "\n"); */
+                    
+                    SUDPTRH = MSB((WORD)pStr);
+                    SUDPTRL = LSB((WORD)pStr);
+                    //SUDPTRH = MSB((WORD)&dev_strings);
+                    //SUDPTRL = LSB((WORD)&dev_strings);
+                } else {STALLEP0();}
+                
+            }
+            
+            break;
+        case DSCR_DEVQUAL_TYPE:
+            printf ( "Get Device Qualifier Descriptor\n");
+            // assumes this is a high speed capable device
+            SUDPTRH = MSB((WORD)&dev_qual_dscr);
+            SUDPTRL = LSB((WORD)&dev_qual_dscr);
+            break;
+        case DSCR_OTHERSPD_TYPE:
+            printf ( "Other Speed Descriptor\n");
+            SUDPTRH = MSB(pOtherConfig);
+            SUDPTRL = LSB(pOtherConfig);
+            break;
+        default:
+            printf ( "Unhandled Get Descriptor: %02x\n", SETUPDAT[3]);
+            STALLEP0();
+    }
+    
+}
+
diff --git a/fx2lib/lib/usbav.a51 b/fx2lib/lib/usbav.a51
new file mode 100644 (file)
index 0000000..ce956d9
--- /dev/null
@@ -0,0 +1,125 @@
+; Copyright (C) 2010 Ubixum, Inc. 
+;
+; This library is free software; you can redistribute it and/or
+; modify it under the terms of the GNU Lesser General Public
+; License as published by the Free Software Foundation; either
+; version 2.1 of the License, or (at your option) any later version.
+; 
+; This library is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+; Lesser General Public License for more details.
+; 
+; You should have received a copy of the GNU Lesser General Public
+; License along with this library; if not, write to the Free Software
+; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+.module INT2AV ; jump table for usb auto vector
+
+.globl _INT2JT ; defined as global so this assembly gets included in project 
+
+.area INT2AV (ABS,OVR)
+.org    0x43 ; this is where USBINT ( interrupt 8 ) jumps to
+_INT2AV = #. + 2 ; two bytes for ljmp (auto set by INT2IVEC)
+    ljmp _INT2JT
+
+; INT2 Jump Table
+
+.area INT2JT ( CODE )
+;.org    0x1A00 ; needs to be on a page boundary
+
+_INT2JT:
+    ljmp _sudav_isr
+    .db 0
+    ljmp _sof_isr
+    .db 0
+    ljmp _sutok_isr
+    .db 0
+    ljmp _suspend_isr
+    .db 0
+    ljmp _usbreset_isr
+    .db 0
+    ljmp _hispeed_isr
+    .db 0
+    ljmp _ep0ack_isr
+    .db 0
+    ljmp _spare_isr
+    .db 0
+    ljmp _ep0in_isr
+    .db 0
+    ljmp _ep0out_isr
+    .db 0
+    ljmp _ep1in_isr
+    .db 0
+    ljmp _ep1out_isr
+    .db 0
+    ljmp _ep2_isr
+    .db 0
+    ljmp _ep4_isr
+    .db 0
+    ljmp _ep6_isr
+    .db 0
+    ljmp _ep8_isr
+    .db 0
+    ljmp _ibn_isr
+    .db 0
+    ljmp _spare_isr
+    .db 0
+    ljmp _ep0ping_isr
+    .db 0
+    ljmp _ep1ping_isr
+    .db 0
+    ljmp _ep2ping_isr
+    .db 0
+    ljmp _ep4ping_isr
+    .db 0
+    ljmp _ep6ping_isr
+    .db 0
+    ljmp _ep8ping_isr
+    .db 0
+    ljmp _errlimit_isr
+    .db 0
+    ljmp _spare_isr
+    .db 0
+    ljmp _spare_isr
+    .db 0
+    ljmp _spare_isr
+    .db 0
+    ljmp _ep2isoerr_isr
+    .db 0
+    ljmp _ep4isoerr_isr
+    .db 0
+    ljmp _ep6isoerr_isr
+    .db 0
+    ljmp _ep8isoerr_isr
+    .db 0
+; INT4JT
+    ljmp _ep2pf_isr
+    .db 0
+    ljmp _ep4pf_isr
+    .db 0
+    ljmp _ep6pf_isr
+    .db 0
+    ljmp _ep8pf_isr
+    .db 0
+    ljmp _ep2ef_isr
+    .db 0
+    ljmp _ep4ef_isr
+    .db 0
+    ljmp _ep6ef_isr
+    .db 0
+    ljmp _ep8ef_isr
+    .db 0
+    ljmp _ep2ff_isr
+    .db 0
+    ljmp _ep4ff_isr
+    .db 0
+    ljmp _ep6ff_isr
+    .db 0
+    ljmp _ep8ff_isr
+    .db 0
+    ljmp _gpifdone_isr
+    .db 0
+    ljmp _gpifwf_isr
+    .db 0
+    
diff --git a/fx2lib/utils/gpif2dat b/fx2lib/utils/gpif2dat
new file mode 100755 (executable)
index 0000000..7762f94
--- /dev/null
@@ -0,0 +1,20 @@
+#!/bin/env python
+
+import sys,re
+
+if __name__=='__main__':
+    if len(sys.argv)<3:
+        print "Usage: %s <gpif export file> <save file>" % sys.argv[0]
+        sys.exit(-1)
+
+    f=open(sys.argv[1],'r').read()
+    o=open(sys.argv[2],'w')
+
+    # write every thing between the wave data and the TODO
+    datre = re.compile ( 'const char xdata .*?\};', re.S )
+    data = datre.findall(f)
+    for dat in data:
+        o.write(dat.replace('\r\n','\n'))
+        o.write('\n')
+    o.close()
+
diff --git a/fx2lib/utils/ihx2iic.py b/fx2lib/utils/ihx2iic.py
new file mode 100755 (executable)
index 0000000..3b62f67
--- /dev/null
@@ -0,0 +1,186 @@
+#!/usr/bin/env python
+#
+# Copyright 2009, Ubixum, Inc
+#
+# This file copied and modified for fx2lib from the GnuRadio project
+#
+# Copyright 2004,2006 Free Software Foundation, Inc.
+# 
+# This file is part of GNU Radio
+# 
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+# 
+# GNU Radio 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 GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+# 
+
+import re
+import sys, struct
+import os, os.path
+from optparse import OptionParser
+
+
+def hex_to_bytes (s):
+    if len (s) & 0x1:
+        raise ValueError, "Length must be even"
+    r = []
+    for i in range (0, len(s), 2):
+        r.append (int (s[i:i+2], 16))
+    return r
+    
+def msb (x):
+    return (x >> 8) & 0xff
+
+def lsb (x):
+    return x & 0xff
+
+class ihx_rec (object):
+    def __init__ (self, addr, type, data):
+        self.addr = addr
+        self.type = type
+        self.data = data
+
+class ihx_file (object):
+    def __init__ (self):
+        self.pat = re.compile (r':[0-9A-F]{10,}')
+    def read (self, file):
+        r = []
+        for line in file:
+            line = line.strip().upper ()
+            if not self.pat.match (line):
+                raise ValueError, "Invalid hex record format"
+            bytes = hex_to_bytes (line[1:])
+            sum = reduce (lambda x, y: x + y, bytes, 0) % 256
+            if sum != 0:
+                raise ValueError, "Bad hex checksum"
+            lenx = bytes[0]
+            addr = (bytes[1] << 8) + bytes[2]
+            type = bytes[3]
+            data = bytes[4:-1]
+            if lenx != len (data):
+                raise ValueError, "Invalid hex record (bad length)"
+            if type != 0:
+                break;
+            r.append (ihx_rec (addr, type, data))
+
+        return r
+
+
+def build_eeprom_image (filename, outfile,vid,pid,devid,cb):
+    """Build a ``C2 Load'' EEPROM image.
+
+    For details on this format, see section 3.4.3 of
+    the EZ-USB FX2 Technical Reference Manual
+    """
+
+    image = [
+        0xC2,                           # boot from EEPROM
+        lsb (vid),
+        msb (vid),
+        lsb (pid),
+        msb (pid),
+        lsb (devid),
+        msb (devid),
+        cb                               # configuration byte
+        ]
+
+    # you could just append all the records..
+    # but that would most likely cause a lot of
+    # extra headers/addrs to be written
+    ihx = ihx_file();
+    records = ihx.read(open(filename))
+
+    # create image map of all values we're writing data too
+    image_map={}
+    for r in records:
+        addr=r.addr
+        c=0
+        l=len(r.data)
+        while c<l:
+            image_map[addr] = r.data[c]
+            addr += 1
+            c += 1 
+    # now create new records based on contiguous image data 
+    max_addr = max(image_map.keys())
+    records = []
+    start_addr = 0
+
+    while start_addr <= max_addr:
+        if not image_map.has_key(start_addr):
+            start_addr += 1
+            continue
+        end_addr = start_addr
+        # add continguous data up to 10 bits long (0x3ff)
+        # is max size, trm 3.4.3
+        size=0
+        while image_map.has_key(end_addr) and size < 0x3ff:
+            end_addr += 1
+            size += 1
+
+        l = end_addr - start_addr
+        data = []
+        for d in range(l):
+            data.append(image_map [ start_addr + d ])
+        records.append ( ihx_rec ( start_addr, 0, data ) )
+        start_addr = end_addr
+
+    
+    # 4 byte header that indicates where to load
+    # the immediately follow code bytes.
+
+    for r in records:
+        image.extend( [
+             msb (len (r.data)),
+             lsb (len (r.data)),
+             msb (r.addr),
+             lsb (r.addr)
+             ])
+        image.extend(r.data)
+
+
+    # writes 0 to CPUCS reg (brings FX2 out of reset)
+    image.extend (  [
+        0x80,
+        0x01,
+        0xe6,
+        0x00,
+        0x00
+        ] )
+
+    buf=struct.pack ( "B"*len(image), *image )
+    print "iic Image Size" , len(buf)
+    out=open( outfile, 'w') 
+    out.write(buf)
+    out.close();
+
+if __name__ == '__main__':
+    usage = "usage: %prog [options] firmware.ihx outfile"
+    parser = OptionParser (usage=usage)
+    parser.add_option ( "-v", "--vid", type="int", default=0x04b4,
+                        help="Vendor ID for iic c2 image." )
+    parser.add_option ( "-p", "--pid", type="int", default=0x0082,
+                        help="Product ID for iic c2 image." )
+    parser.add_option ( "-d", "--devid", type="int", default=0,
+                        help="Device ID for iic c2 image." )
+    parser.add_option ( "-c", "--configbyte", type="int", default=0x04,
+                        help="Configuration Byte (i2c & disconnect polarity, default 0x04)" )
+    (options, args) = parser.parse_args ()
+    if len (args) != 2:
+        parser.print_help ()
+        sys.exit (1)
+
+    ihx_filename = args[0]
+    iic_filename = args[1]
+    build_eeprom_image ( ihx_filename, iic_filename, options.vid, options.pid, options.devid, options.configbyte )
+
+