mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2026-05-12 11:18:11 -07:00
Initial commit for the firmware. Used the 20090306_ela version as baseline.
It is identical to the popular 20081211, with the doob addition (20090301), a linux client, and two additional commands for LF analysis. Let me know if you find issues here!
This commit is contained in:
+281
@@ -0,0 +1,281 @@
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
@@ -0,0 +1,3 @@
|
||||
|
||||
MAY 2008: Added ISO14443 type A support, Gerhard de Koning Gans
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
Modifications to 20081211 release by d18c7db on proxmark.org
|
||||
|
||||
This compiles fine under the pre-built windows compile environment ProxSpace
|
||||
|
||||
I make no apologies for the utterly cr@p coding. It's rubbish, you've been warned.
|
||||
|
||||
Changes made to armsrc and winsrc, no changed to fpga code. Works fine with the bootloader and fpga images that you will build using the 20081211 release.
|
||||
|
||||
|
||||
Extra functionality includes:
|
||||
|
||||
ISO1443a support
|
||||
================
|
||||
|
||||
i) Support for cascade 2 select (used for UID's longer than 4 bytes)
|
||||
ii) Hard-coded (some) responses in for DESfire
|
||||
|
||||
|
||||
ISO15563 support
|
||||
================
|
||||
|
||||
i) demodulation all moved onto the arm
|
||||
ii) Addition of a command, hi15reader (a reader simulator)
|
||||
iii) Addition of a command, hi15sim (a tag simulator) - not working too well
|
||||
|
||||
|
||||
|
||||
greg.jones@digitalassurance.com
|
||||
+156
@@ -0,0 +1,156 @@
|
||||
INTRO:
|
||||
|
||||
This file contains enough software, logic (for the FPGA), and design
|
||||
documentation for the hardware that you could, at least in theory,
|
||||
do something useful with a proxmark3. It has commands to:
|
||||
|
||||
* read any kind of 125 kHz unidirectional tag
|
||||
* simulate any kind of 125 kHz unidirectional tag
|
||||
|
||||
(This is enough to perform all of the silly cloning attacks, like the
|
||||
ones that I did at the Capitol in Sacramento, or anything involving
|
||||
a Verichip. From a technical standpoint, these are not that exciting,
|
||||
although the `software radio' architecture of the proxmark3 makes it
|
||||
easy and fun to support new formats.)
|
||||
|
||||
As a bonus, I include some code to use the 13.56 MHz hardware, so you can:
|
||||
|
||||
* do anything that a (medium-range) ISO 15693 reader could
|
||||
* read an ISO 14443 tag, if you know the higher-layer protocol
|
||||
* pretend to be an ISO 14443 tag, if you know the higher-layer protocol
|
||||
* snoop on an ISO 14443 transaction
|
||||
|
||||
I am not actively developing any of this. I have other projects that
|
||||
seem to be more useful.
|
||||
|
||||
USING THE PACKAGE:
|
||||
|
||||
The software tools required to build include:
|
||||
|
||||
* cygwin or other unix-like tools for Windows
|
||||
* the Microsoft Visual C++ compiler (I use Version 6)
|
||||
* arm-elf-gcc; I use WinterMute's build, from http://www.devkitpro.org/
|
||||
* Xilinx's WebPack tools
|
||||
* Modelsim (for test only)
|
||||
* perl
|
||||
|
||||
It is not necessary to build the FPGA image yourself; a pre-compiled
|
||||
image is provided, as armsrc/fpgaimg.c. This is a generated file,
|
||||
though, and you can rebuild it by running fpga/go.bat.
|
||||
|
||||
Documentation is minimal, but see the doc/ directory for what exists. A
|
||||
previous familiarity with the ARM, with digital signal processing,
|
||||
and with embedded programming in general is assumed.
|
||||
|
||||
The device is used through a specialized command line interface; for
|
||||
example, to clone a Verichip, you might type:
|
||||
|
||||
loread ; this reads the tag, and stores the
|
||||
; raw samples in memory on the ARM
|
||||
|
||||
losamples ; then we download the samples to
|
||||
; the PC
|
||||
|
||||
vchdemod clone ; demodulate the ID, and then put it
|
||||
; back in a format that we can replay
|
||||
|
||||
losim ; and then replay it
|
||||
|
||||
To read an ISO 15693 tag, you might type:
|
||||
|
||||
hiread ; read the tag; this involves sending a
|
||||
; particular command, and then getting
|
||||
; the response (which is stored as raw
|
||||
; samples in memory on the ARM)
|
||||
|
||||
hisamples ; then download those samples to the PC
|
||||
|
||||
hi15demod ; and demod them to bits (and check the
|
||||
; CRC etc. at the same time)
|
||||
|
||||
Notice that in both cases the signal processing mostly happened on the PC
|
||||
side; that is of course not practical for a real reader, but it is easier
|
||||
to initially write your code and debug on the PC side than on the ARM. As
|
||||
long as you use integer math (and I do), it's trivial to port it over
|
||||
when you're done.
|
||||
|
||||
The USB driver and bootloader are documented (and available separately
|
||||
for download, if you wish to use them in another project) at
|
||||
|
||||
http://cq.cx/trivia.pl
|
||||
|
||||
|
||||
OBTAINING HARDWARE:
|
||||
|
||||
Most of the ultra-low-volume contract assemblers that have sprung up
|
||||
(Screaming Circuits, the various cheap Asian suppliers, etc.) could put
|
||||
something like this together with a reasonable yield. A run of around
|
||||
a dozen units is probably cost-effective. The BOM includes (possibly-
|
||||
outdated) component pricing, and everything is available from Digikey
|
||||
and the usual distributors.
|
||||
|
||||
If you've never assembled a modern circuit board by hand, then this is
|
||||
not a good place to start. Some of the components (e.g. the crystals)
|
||||
must not be assembled with a soldering iron, and require hot air.
|
||||
|
||||
The schematics are included; the component values given are not
|
||||
necessarily correct for all situations, but it should be possible to do
|
||||
nearly anything you would want with appropriate population options.
|
||||
|
||||
The printed circuit board artwork is also available, as Gerbers and an
|
||||
Excellon drill file.
|
||||
|
||||
|
||||
FUTURE PLANS, ENHANCEMENTS THAT YOU COULD MAKE:
|
||||
|
||||
At some point I should write software involving a proper real-time
|
||||
operating system for the ARM. I would then provide interrupt-driven
|
||||
drivers for many of the peripherals that are polled now (the USB,
|
||||
the data stream from the FPGA), which would make it easier to develop
|
||||
complex applications.
|
||||
|
||||
It would not be all that hard to implement the ISO 15693 reader properly
|
||||
(with anticollision, all the commands supported, and so on)--the signal
|
||||
processing is already written, so it is all straightforward applications
|
||||
work.
|
||||
|
||||
I have basic support for ISO 14443 as well: a sniffer, a simulated
|
||||
tag, and a reader. It won't do anything useful unless you fill in the
|
||||
high-layer protocol.
|
||||
|
||||
Nicer (i.e., closer-to-optimal) implementations of all kinds of signal
|
||||
processing would be useful as well.
|
||||
|
||||
A practical implementation of the learning-the-tag's-ID-from-what-the-
|
||||
reader-broadcasts-during-anticollision attacks would be relatively
|
||||
straightforward. This would involve some signal processing on the FPGA,
|
||||
but not much else after that.
|
||||
|
||||
It would be neat to write a driver that could stream samples from the A/Ds
|
||||
over USB to the PC, using the full available bandwidth of USB. I am not
|
||||
yet sure what that would be good for, but surely something. This would
|
||||
require a kernel-mode driver under Windows, though, which is more work.
|
||||
|
||||
|
||||
LICENSING:
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
|
||||
Jonathan Westhues
|
||||
user jwesthues, at host cq.cx
|
||||
|
||||
May 2007, Cambridge MA
|
||||
|
||||
+123
@@ -0,0 +1,123 @@
|
||||
#include <proxmark3.h>
|
||||
#include "apps.h"
|
||||
#include "LCD.h"
|
||||
|
||||
void LCDSend(unsigned int data)
|
||||
{
|
||||
// 9th bit set for data, clear for command
|
||||
while ((SPI_STATUS & SPI_STATUS_TX_EMPTY) == 0); // wait for the transfer to complete
|
||||
// For clarity's sake we pass data with 9th bit clear and commands with 9th
|
||||
// bit set since they're implemented as defines, se we need to invert bit
|
||||
SPI_TX_DATA = data^0x100; // Send the data/command
|
||||
}
|
||||
|
||||
void LCDSetXY(unsigned char x, unsigned char y)
|
||||
{
|
||||
LCDSend(PPASET); // page start/end ram
|
||||
LCDSend(y); // Start Page to display to
|
||||
LCDSend(131); // End Page to display to
|
||||
|
||||
LCDSend(PCASET); // column start/end ram
|
||||
LCDSend(x); // Start Column to display to
|
||||
LCDSend(131); // End Column to display to
|
||||
}
|
||||
|
||||
void LCDSetPixel(unsigned char x, unsigned char y, unsigned char color)
|
||||
{
|
||||
LCDSetXY(x,y); // Set position
|
||||
LCDSend(PRAMWR); // Now write the pixel to the display
|
||||
LCDSend(color); // Write the data in the specified Color
|
||||
}
|
||||
|
||||
void LCDFill (unsigned char xs,unsigned char ys,unsigned char width,unsigned char height, unsigned char color)
|
||||
{
|
||||
unsigned char i,j;
|
||||
|
||||
for (i=0;i < height;i++) // Number of horizontal lines
|
||||
{
|
||||
LCDSetXY(xs,ys+i); // Goto start of fill area (Top Left)
|
||||
LCDSend(PRAMWR); // Write to display
|
||||
|
||||
for (j=0;j < width;j++) // pixels per line
|
||||
LCDSend(color);
|
||||
}
|
||||
}
|
||||
|
||||
void LCDString (char *lcd_string, const char *font_style,unsigned char x, unsigned char y, unsigned char fcolor, unsigned char bcolor)
|
||||
{
|
||||
unsigned int i;
|
||||
unsigned char mask=0, px, py, xme, yme, offset;
|
||||
const char *data;
|
||||
|
||||
data = font_style; // point to the start of the font table
|
||||
|
||||
xme = *data; // get font x width
|
||||
data++;
|
||||
yme = *data; // get font y length
|
||||
data++;
|
||||
offset = *data; // get data bytes per font
|
||||
|
||||
do
|
||||
{
|
||||
// point to data in table to be loaded
|
||||
data = (font_style + offset) + (offset * (int)(*lcd_string - 32));
|
||||
|
||||
for (i=0;i < yme;i++) {
|
||||
mask |=0x80;
|
||||
|
||||
for (px=x; px < (x + xme); px++) {
|
||||
py= y + i;
|
||||
|
||||
if (*data & mask) LCDSetPixel (px,py,fcolor);
|
||||
else LCDSetPixel (px,py,bcolor);
|
||||
|
||||
mask>>=1;
|
||||
}
|
||||
data++;
|
||||
}
|
||||
x+=xme;
|
||||
|
||||
lcd_string++; // next character in string
|
||||
|
||||
} while(*lcd_string !='\0'); // keep spitting chars out until end of string
|
||||
}
|
||||
|
||||
void LCDReset(void)
|
||||
{
|
||||
LED_A_ON();
|
||||
SetupSpi(SPI_LCD_MODE);
|
||||
LCD_RESET_LOW();
|
||||
SpinDelay(100);
|
||||
|
||||
LCD_RESET_HIGH();
|
||||
SpinDelay(100);
|
||||
LED_A_OFF();
|
||||
}
|
||||
|
||||
void LCDInit(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
LCDReset();
|
||||
|
||||
LCDSend(PSWRESET); // software reset
|
||||
SpinDelay(100);
|
||||
LCDSend(PSLEEPOUT); // exit sleep mode
|
||||
LCDSend(PBSTRON); // booster on
|
||||
LCDSend(PDISPON); // display on
|
||||
LCDSend(PNORON); // normal on
|
||||
LCDSend(PMADCTL); // rotate display 180 deg
|
||||
LCDSend(0xC0);
|
||||
|
||||
LCDSend(PCOLMOD); // color mode
|
||||
LCDSend(0x02); // 8bpp color mode
|
||||
|
||||
LCDSend(PSETCON); // set contrast
|
||||
LCDSend(0xDC);
|
||||
|
||||
// clear display
|
||||
LCDSetXY(0,0);
|
||||
LCDSend(PRAMWR); // Write to display
|
||||
i=LCD_XRES*LCD_YRES;
|
||||
while(i--) LCDSend(WHITE);
|
||||
}
|
||||
+120
@@ -0,0 +1,120 @@
|
||||
#ifndef __LCD
|
||||
#define __LCD
|
||||
|
||||
#define LCD_RESET_HIGH() PIO_OUTPUT_DATA_SET |= (1<<GPIO_LRST)
|
||||
#define LCD_RESET_LOW() PIO_OUTPUT_DATA_CLEAR |= (1<<GPIO_LRST)
|
||||
|
||||
// The resolution of the LCD
|
||||
#define LCD_XRES 132
|
||||
#define LCD_YRES 132
|
||||
|
||||
// 8bpp Color Mode - Some basic colors defined for ease of use
|
||||
// remember 8bpp color = 3xRed, 3xGreen & 2xBlue bits
|
||||
// organised as RRRGGGBB
|
||||
|
||||
#define BLACK 0x00
|
||||
#define BLUE 0x03
|
||||
#define GREEN 0x1C
|
||||
#define CYAN 0x1F
|
||||
#define RED 0xE0
|
||||
#define MAGENTA 0xE3
|
||||
#define YELLOW 0xFC
|
||||
#define WHITE 0xFF
|
||||
|
||||
// EPSON LCD command set
|
||||
#define ECASET 0x115
|
||||
#define EPWRCTR 0x120
|
||||
#define ENOP 0x125
|
||||
#define ERAMWR 0x15C
|
||||
#define ERAMRD 0x15D
|
||||
#define EPASET 0x175
|
||||
#define EEPSRRD1 0x17C
|
||||
#define EEPSRRD2 0x17D
|
||||
#define EVOLCTR 0x181
|
||||
#define ETMPGRD 0x182
|
||||
#define ESLPOUT 0x194
|
||||
#define ESLPIN 0x195
|
||||
#define EDISNOR 0x1A6
|
||||
#define EDISINV 0x1A7
|
||||
#define EPTLIN 0x1A8
|
||||
#define EPTLOUT 0x1A9
|
||||
#define EASCSET 0x1AA
|
||||
#define ESCSTART 0x1AB
|
||||
#define EDISOFF 0x1AE
|
||||
#define EDISON 0x1AF
|
||||
#define ECOMSCN 0x1BB
|
||||
#define EDATCTL 0x1BC
|
||||
#define EDISCTL 0x1CA
|
||||
#define EEPCOUT 0x1CC
|
||||
#define EEPCTIN 0x1CD
|
||||
#define ERGBSET8 0x1CE
|
||||
#define EOSCON 0x1D1
|
||||
#define EOSCOFF 0x1D2
|
||||
#define EVOLUP 0x1D6
|
||||
#define EVOLDOWN 0x1D7
|
||||
#define ERMWIN 0x1E0
|
||||
#define ERMWOUT 0x1EE
|
||||
#define EEPMWR 0x1FC
|
||||
#define EEPMRD 0x1FD
|
||||
|
||||
// PHILIPS LCD command set
|
||||
#define PNOP 0x100
|
||||
#define PSWRESET 0x101
|
||||
#define PBSTROFF 0x102
|
||||
#define PBSTRON 0x103
|
||||
#define PRDDIDIF 0x104
|
||||
#define PRDDST 0x109
|
||||
#define PSLEEPIN 0x110
|
||||
#define PSLEEPOUT 0x111
|
||||
#define PPTLON 0x112
|
||||
#define PNORON 0x113
|
||||
#define PINVOFF 0x120
|
||||
#define PINVON 0x121
|
||||
#define PDALO 0x122
|
||||
#define PDAL 0x123
|
||||
#define PSETCON 0x125
|
||||
#define PDISPOFF 0x128
|
||||
#define PDISPON 0x129
|
||||
#define PCASET 0x12A
|
||||
#define PPASET 0x12B
|
||||
#define PRAMWR 0x12C
|
||||
#define PRGBSET 0x12D
|
||||
#define PPTLAR 0x130
|
||||
#define PVSCRDEF 0x133
|
||||
#define PTEOFF 0x134
|
||||
#define PTEON 0x135
|
||||
#define PMADCTL 0x136
|
||||
#define PSEP 0x137
|
||||
#define PIDMOFF 0x138
|
||||
#define PIDMON 0x139
|
||||
#define PCOLMOD 0x13A
|
||||
#define PSETVOP 0x1B0
|
||||
#define PBRS 0x1B4
|
||||
#define PTRS 0x1B6
|
||||
#define PFINV 0x1B9
|
||||
#define PDOR 0x1BA
|
||||
#define PTCDFE 0x1BD
|
||||
#define PTCVOPE 0x1BF
|
||||
#define PEC 0x1C0
|
||||
#define PSETMUL 0x1C2
|
||||
#define PTCVOPAB 0x1C3
|
||||
#define PTCVOPCD 0x1C4
|
||||
#define PTCDF 0x1C5
|
||||
#define PDF8C 0x1C6
|
||||
#define PSETBS 0x1C7
|
||||
#define PRDTEMP 0x1C8
|
||||
#define PNLI 0x1C9
|
||||
#define PRDID1 0x1DA
|
||||
#define PRDID2 0x1DB
|
||||
#define PRDID3 0x1DC
|
||||
#define PSFD 0x1EF
|
||||
#define PECM 0x1F0
|
||||
|
||||
void LCDSend(unsigned int data);
|
||||
void LCDInit(void);
|
||||
void LCDReset(void);
|
||||
void LCDSetXY(unsigned char x, unsigned char y);
|
||||
void LCDSetPixel(unsigned char x, unsigned char y, unsigned char color);
|
||||
void LCDString (char *lcd_string, const char *font_style,unsigned char x, unsigned char y, unsigned char fcolor, unsigned char bcolor);
|
||||
void LCDFill (unsigned char xs,unsigned char ys,unsigned char width,unsigned char height, unsigned char color);
|
||||
#endif
|
||||
@@ -0,0 +1,61 @@
|
||||
CC = arm-elf-gcc
|
||||
AS = arm-elf-as
|
||||
LD = arm-elf-ld
|
||||
OBJCOPY = arm-elf-objcopy
|
||||
|
||||
OBJDIR = obj
|
||||
|
||||
INCLUDE = -I../include
|
||||
|
||||
INCLUDES = ../include/proxmark3.h ../include/at91sam7s128.h ../include/config_gpio.h ../include/usb_cmd.h apps.h
|
||||
LIB = "..\..\devkitARM\lib\gcc\arm-elf\4.1.0\interwork"
|
||||
|
||||
CFLAGS = -O6 -c $(INCLUDE) -Wall
|
||||
|
||||
OBJ = $(OBJDIR)/start.o \
|
||||
$(OBJDIR)/appmain.o \
|
||||
$(OBJDIR)/fpga.o \
|
||||
$(OBJDIR)/iso14443.o \
|
||||
$(OBJDIR)/iso14443a.o \
|
||||
$(OBJDIR)/iso15693.o \
|
||||
$(OBJDIR)/util.o \
|
||||
$(OBJDIR)/fonts.o \
|
||||
$(OBJDIR)/LCD.o
|
||||
|
||||
OBJFPGA = \
|
||||
$(OBJDIR)/fpgaimg.o
|
||||
|
||||
OBJCOMMON = \
|
||||
$(OBJDIR)/usb.o
|
||||
|
||||
all: osimage.s19
|
||||
|
||||
$(OBJDIR)/fpgaimage.s19: $(OBJDIR)/fpgaimg.o
|
||||
@echo obj/fpgaimage.s19
|
||||
@$(LD) -g -Tldscript-fpga -o $(OBJDIR)\fpgaimage.elf $(OBJDIR)/fpgaimg.o
|
||||
@$(OBJCOPY) -Osrec --srec-forceS3 $(OBJDIR)\fpgaimage.elf $(OBJDIR)\fpgaimage.s19
|
||||
|
||||
$(OBJDIR)/osimage.s19: $(OBJ) $(OBJCOMMON)
|
||||
@echo obj/osimage.s19
|
||||
@$(LD) -g -Tldscript -o $(OBJDIR)\osimage.elf $(OBJ) $(OBJCOMMON) $(LIB)\libgcc.a
|
||||
@$(OBJCOPY) -Osrec --srec-forceS3 $(OBJDIR)\osimage.elf $(OBJDIR)\osimage.s19
|
||||
|
||||
osimage.s19: $(OBJDIR)/osimage.s19 $(OBJDIR)/fpgaimage.s19
|
||||
@echo osimage.s19
|
||||
|
||||
$(OBJ): $(@B).c $(INCLUDES)
|
||||
@echo $(@B).c
|
||||
@$(CC) $(CFLAGS) -mthumb -mthumb-interwork $(@B).c -o $(OBJDIR)/$(@B).o
|
||||
|
||||
$(OBJCOMMON): ../common/$(@B).c $(INCLUDES)
|
||||
@echo $(@B).c
|
||||
@$(CC) $(CFLAGS) -mthumb -mthumb-interwork ../common/$(@B).c -o $(OBJDIR)/$(@B).o
|
||||
|
||||
$(OBJFPGA): $(@B).c $(INCLUDES)
|
||||
@echo $(@B).c
|
||||
@$(CC) $(CFLAGS) -mthumb -mthumb-interwork $(@B).c -o $(OBJDIR)/$(@B).o
|
||||
|
||||
clean:
|
||||
del /q obj\*.o
|
||||
del /q obj\*.elf
|
||||
del /q obj\*.s19
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,77 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// Definitions internal to the app source.
|
||||
// Jonathan Westhues, Aug 2005
|
||||
// Added ISO14443-A support by Gerhard de Koning Gans, April 2008
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef __APPS_H
|
||||
#define __APPS_H
|
||||
|
||||
/// appmain.c
|
||||
void AppMain(void);
|
||||
void DbpIntegers(int a, int b, int c);
|
||||
void DbpString(char *str);
|
||||
void SpinDelay(int ms);
|
||||
void ToSendStuffBit(int b);
|
||||
void ToSendReset(void);
|
||||
extern int ToSendMax;
|
||||
extern BYTE ToSend[];
|
||||
extern DWORD BigBuf[];
|
||||
|
||||
/// fpga.c
|
||||
void FpgaWriteConfWord(BYTE v);
|
||||
void FpgaDownloadAndGo(void);
|
||||
void FpgaSetupSsc(void);
|
||||
void SetupSpi(int mode);
|
||||
void FpgaSetupSscDma(BYTE *buf, int len);
|
||||
void SetAdcMuxFor(int whichGpio);
|
||||
|
||||
// Definitions for the FPGA configuration word.
|
||||
#define FPGA_MAJOR_MODE_LF_READER (0<<5)
|
||||
#define FPGA_MAJOR_MODE_LF_SIMULATOR (1<<5)
|
||||
#define FPGA_MAJOR_MODE_HF_READER_TX (2<<5)
|
||||
#define FPGA_MAJOR_MODE_HF_READER_RX_XCORR (3<<5)
|
||||
#define FPGA_MAJOR_MODE_HF_SIMULATOR (4<<5)
|
||||
#define FPGA_MAJOR_MODE_HF_ISO14443A (5<<5)
|
||||
#define FPGA_MAJOR_MODE_UNUSED (6<<5)
|
||||
#define FPGA_MAJOR_MODE_OFF (7<<5)
|
||||
// Options for the LF reader
|
||||
#define FPGA_LF_READER_USE_125_KHZ (1<<3)
|
||||
#define FPGA_LF_READER_USE_134_KHZ (0<<3)
|
||||
// Options for the HF reader, tx to tag
|
||||
#define FPGA_HF_READER_TX_SHALLOW_MOD (1<<0)
|
||||
// Options for the HF reader, correlating against rx from tag
|
||||
#define FPGA_HF_READER_RX_XCORR_848_KHZ (1<<0)
|
||||
#define FPGA_HF_READER_RX_XCORR_SNOOP (1<<1)
|
||||
// Options for the HF simulated tag, how to modulate
|
||||
#define FPGA_HF_SIMULATOR_NO_MODULATION (0<<0)
|
||||
#define FPGA_HF_SIMULATOR_MODULATE_BPSK (1<<0)
|
||||
// Options for ISO14443A
|
||||
#define FPGA_HF_ISO14443A_SNIFFER (0<<0)
|
||||
#define FPGA_HF_ISO14443A_TAGSIM_LISTEN (1<<0)
|
||||
#define FPGA_HF_ISO14443A_TAGSIM_MOD (2<<0)
|
||||
#define FPGA_HF_ISO14443A_READER_LISTEN (3<<0)
|
||||
#define FPGA_HF_ISO14443A_READER_MOD (4<<0)
|
||||
|
||||
/// iso14443.h
|
||||
void SimulateIso14443Tag(void);
|
||||
void AcquireRawAdcSamplesIso14443(DWORD parameter);
|
||||
void SnoopIso14443(void);
|
||||
|
||||
/// iso14443a.h
|
||||
void SnoopIso14443a(void);
|
||||
void SimulateIso14443aTag(int tagType, int TagUid); // ## simulate iso14443a tag
|
||||
void ReaderIso14443a(DWORD parameter);
|
||||
|
||||
/// iso15693.h
|
||||
void AcquireRawAdcSamplesIso15693(void);
|
||||
void ReaderIso15693(DWORD parameter); // Simulate an ISO15693 reader - greg
|
||||
void SimTagIso15693(DWORD parameter); // simulate an ISO15693 tag - greg
|
||||
|
||||
/// util.h
|
||||
int strlen(char *str);
|
||||
void *memcpy(void *dest, const void *src, int len);
|
||||
void *memset(void *dest, int c, int len);
|
||||
int memcmp(const void *av, const void *bv, int len);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,269 @@
|
||||
unsigned char somestring[25];
|
||||
|
||||
//*********************************************************************
|
||||
//******************** SYSTERM HEARTBEAT @ 10 ms *********************
|
||||
//*********************************************************************
|
||||
void InitSPI (void)
|
||||
{
|
||||
//set functionalite to pins:
|
||||
//port0.11 -> NPCS0
|
||||
//port0.12 -> MISO
|
||||
//port0.13 -> MOSI
|
||||
//port0.14 -> SPCK
|
||||
PIOA_PDR = BIT11 | BIT12 | BIT13 | BIT14;
|
||||
PIOA_ASR = BIT11 | BIT12 | BIT13 | BIT14;
|
||||
PIOA_BSR = 0;
|
||||
|
||||
|
||||
PMC_PCER |= 1 << 5; // Enable SPI timer clock.
|
||||
|
||||
/**** Fixed mode ****/
|
||||
SPI_CR = 0x81; //SPI Enable, Sowtware reset
|
||||
SPI_CR = 0x01; //SPI Enable
|
||||
|
||||
|
||||
|
||||
SPI_MR = 0x000E0011; //Master mode
|
||||
SPI_CSR0 = 0x01010B11; //9 bit
|
||||
|
||||
}
|
||||
|
||||
//*********************************************************************
|
||||
//*************************** Task 1 ********************************
|
||||
//*********************************************************************
|
||||
void Task_1(void *p)
|
||||
{
|
||||
char beat=0; // just flash the onboard LED for Heatbeat
|
||||
|
||||
while(1)
|
||||
{
|
||||
if(beat)
|
||||
{
|
||||
PIOA_SODR = BIT18;
|
||||
beat=0;
|
||||
}
|
||||
else
|
||||
{
|
||||
PIOA_CODR = BIT18;
|
||||
beat=1;
|
||||
}
|
||||
|
||||
ctl_timeout_wait(ctl_get_current_time()+ 150);
|
||||
|
||||
}
|
||||
}
|
||||
//*********************************************************************
|
||||
//*************************** Task 2 ********************************
|
||||
//*********************************************************************
|
||||
void Task_2(void *p)
|
||||
{
|
||||
unsigned long z;
|
||||
unsigned int x,y;
|
||||
unsigned char a,b,c,d,e;
|
||||
|
||||
char seconds,minutes,hours;
|
||||
|
||||
unsigned int nowold,tenths;
|
||||
|
||||
|
||||
InitLCD();
|
||||
|
||||
|
||||
/******* Put smiley face up in 4096 color mode *******/
|
||||
LCD_Fill(0,0,132,132,Black);
|
||||
|
||||
LCD_Set_Resolution(HIGH_RES); // set 4096 color mode
|
||||
|
||||
// ShowImage_4096(0,0,smiley);
|
||||
LCD_Set_Resolution(LOW_RES); // set 256 color mode
|
||||
|
||||
ctl_timeout_wait(ctl_get_current_time()+ 4000); // wait 4 seconds to view it
|
||||
|
||||
/******* Do some static on screen *******/
|
||||
|
||||
LCD_Fill(0,0,132,132,Black);
|
||||
|
||||
for(z=0;z<100000;z++)
|
||||
{
|
||||
while( (a = rand()) > 132);
|
||||
while( (b = rand()) > 132);
|
||||
c = rand();
|
||||
LCD_PixelPut(a,b,c);
|
||||
}
|
||||
|
||||
/******* Do some lines on screen *******/
|
||||
LCD_Fill(0,0,132,132,Black);
|
||||
|
||||
for(z=1;z<300;z++)
|
||||
{
|
||||
while( (a = rand()) > 132);
|
||||
while( (b = rand()) > 132);
|
||||
while( (c = rand()) > 132);
|
||||
while( (d = rand()) > 132);
|
||||
e = rand(); // pick color
|
||||
|
||||
LCD_Line(a,b,c,d,e);
|
||||
ctl_timeout_wait(ctl_get_current_time()+ 10);
|
||||
}
|
||||
|
||||
/******* Do some Boxes on screen *******/
|
||||
LCD_Fill(0,0,132,132,Black);
|
||||
|
||||
for(z=0;z<300;z++)
|
||||
{
|
||||
|
||||
while( (a = rand()) > 132);
|
||||
while( (b = rand()) > 132);
|
||||
while( (c = rand()) > 132);
|
||||
while( (d = rand()) > 132);
|
||||
|
||||
e = rand(); // pick color
|
||||
LCD_Box(a,b,c,d,e);
|
||||
|
||||
ctl_timeout_wait(ctl_get_current_time()+ 10);
|
||||
}
|
||||
/******* Do some Circles on screen *******/
|
||||
LCD_Fill(0,0,132,132,Black);
|
||||
|
||||
for(z=0;z<100;z++)
|
||||
{
|
||||
|
||||
while( (a = rand()) > 132);
|
||||
while( (b = rand()) > 132);
|
||||
while( (c = rand()) > 127); // diameter
|
||||
|
||||
d = rand(); // pick color
|
||||
LCD_Circle(a,b,c,d);
|
||||
|
||||
ctl_timeout_wait(ctl_get_current_time()+ 10);
|
||||
}
|
||||
|
||||
/******* Do some Thick Circles on screen *******/
|
||||
LCD_Fill(0,0,132,132,Black);
|
||||
|
||||
for(z=0;z<25;z++)
|
||||
{
|
||||
while( (a = rand()) > 132);
|
||||
while( (b = rand()) > 132);
|
||||
while( (c = rand()) > 40); // diameter
|
||||
while( (d = rand()) > 10); // wall thicknes
|
||||
e = rand(); // pick color
|
||||
LCD_Thick_Circle(a,b,c,d,e);
|
||||
|
||||
ctl_timeout_wait(ctl_get_current_time()+ 1);
|
||||
}
|
||||
|
||||
/******* Do something funky to wipe screen *******/
|
||||
b=0;
|
||||
|
||||
for(a=0;a<131;a++)
|
||||
{
|
||||
LCD_Line(a,b,65,65,0x62);
|
||||
}
|
||||
for(b=0;b<131;b++)
|
||||
{
|
||||
LCD_Line(a,b,65,65,0x62);
|
||||
}
|
||||
for(;a>1;a--)
|
||||
{
|
||||
LCD_Line(a,b,65,65,0x62);
|
||||
}
|
||||
for(;b>1;b--)
|
||||
{
|
||||
LCD_Line(a,b,65,65,0x62);
|
||||
}
|
||||
|
||||
ctl_timeout_wait(ctl_get_current_time()+ 1000);
|
||||
|
||||
/******* Show Image scrolling *******/
|
||||
LCD_Fill(0,0,132,132,Black);
|
||||
|
||||
ShowImage(0,50,sparkfun);
|
||||
|
||||
sprintf(somestring,"Thanks SparkFun");
|
||||
LCD_String(somestring,&FONT8x8F[0][0],5,10,LightGreen,Black);
|
||||
|
||||
ctl_timeout_wait(ctl_get_current_time()+ 2000); // hold sparkfun image for a bit
|
||||
|
||||
for(y=50;y<140;y++)
|
||||
{
|
||||
LCD_Line(0,y-1,132,y-1,Black); // wipe the white line as it moves down
|
||||
ShowImage(0,y,sparkfun); // move image to Y location
|
||||
ctl_timeout_wait(ctl_get_current_time()+ 25); // wait a bit
|
||||
}
|
||||
|
||||
/******* Run radar in loop with example fonts displayed *******/
|
||||
LCD_Fill(0,0,132,132,Black);
|
||||
|
||||
LCD_Thick_Circle(66,66,30,2,DarkBlue);
|
||||
|
||||
y=0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
LCD_Circle_Line(66,66,28,0,y,LightGreen);
|
||||
|
||||
ctl_timeout_wait(ctl_get_current_time()+ 1);
|
||||
|
||||
tenths = ctl_current_time / 1000;
|
||||
|
||||
if(tenths != nowold)
|
||||
{
|
||||
nowold = tenths;
|
||||
|
||||
if(++seconds == 60)
|
||||
{
|
||||
seconds = 0;
|
||||
|
||||
if(++minutes == 60)
|
||||
{
|
||||
minutes=0;
|
||||
hours++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
printf("a=%6lu - b=%6lu - c=%6lu - d=%6lu : Time=%lu\r\n",a,b,c,d,ctl_current_time);
|
||||
|
||||
sprintf(somestring,"%05lu",y);
|
||||
LCD_String(somestring,&FONT6x8[0][0],52,25,White,Black);
|
||||
|
||||
sprintf(somestring,"Time:%02u:%02u:%02u",hours,minutes,seconds);
|
||||
LCD_String(somestring,&FONT8x8F[0][0],14,10,DarkRed,Black);
|
||||
|
||||
sprintf(somestring,"Time:%02u:%02u:%02u",hours,minutes,seconds);
|
||||
LCD_String(somestring,&FONT8x16[0][0],14,115,LightGreen,Black);
|
||||
|
||||
LCD_Circle_Line(66,66,28,0,y,Black);
|
||||
|
||||
if(++y==360)
|
||||
{
|
||||
y=0;
|
||||
}
|
||||
|
||||
ctl_timeout_wait(ctl_get_current_time()+ 10);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
********************* Main Module *************************
|
||||
********************* *************************
|
||||
********************* Initialize Program *************************
|
||||
********************* Sequences *************************
|
||||
********************* *************************
|
||||
*************************************************************************/
|
||||
int main(void)
|
||||
{
|
||||
BoardInit();
|
||||
|
||||
InitSPI();
|
||||
|
||||
while (1)
|
||||
{
|
||||
Idle();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
+300
@@ -0,0 +1,300 @@
|
||||
const char FONT6x8[97][8] = {
|
||||
{0x06,0x08,0x08,0x00,0x00,0x00,0x00,0x00}, // columns, rows, bytes per char
|
||||
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // space
|
||||
{0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00}, // !
|
||||
{0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00}, // "
|
||||
{0x50,0x50,0xF8,0x50,0xF8,0x50,0x50,0x00}, // #
|
||||
{0x20,0x78,0xA0,0x70,0x28,0xF0,0x20,0x00}, // $
|
||||
{0xC0,0xC8,0x10,0x20,0x40,0x98,0x18,0x00}, // %
|
||||
{0x40,0xA0,0xA0,0x40,0xA8,0x90,0x68,0x00}, // &
|
||||
{0x30,0x30,0x20,0x40,0x00,0x00,0x00,0x00}, // '
|
||||
{0x10,0x20,0x40,0x40,0x40,0x20,0x10,0x00}, // (
|
||||
{0x40,0x20,0x10,0x10,0x10,0x20,0x40,0x00}, // )
|
||||
{0x00,0x20,0xA8,0x70,0x70,0xA8,0x20,0x00}, // *
|
||||
{0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0x00}, // +
|
||||
{0x00,0x00,0x00,0x00,0x30,0x30,0x20,0x40}, // ,
|
||||
{0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00}, // -
|
||||
{0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00}, // .
|
||||
{0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00}, // /
|
||||
{0x70,0x88,0x88,0xA8,0x88,0x88,0x70,0x00}, // 0
|
||||
{0x20,0x60,0x20,0x20,0x20,0x20,0x70,0x00}, // 1
|
||||
{0x70,0x88,0x08,0x70,0x80,0x80,0xF8,0x00}, // 2
|
||||
{0xF8,0x08,0x10,0x30,0x08,0x88,0x70,0x00}, // 3
|
||||
{0x10,0x30,0x50,0x90,0xF8,0x10,0x10,0x00}, // 4
|
||||
{0xF8,0x80,0xF0,0x08,0x08,0x88,0x70,0x00}, // 5
|
||||
{0x38,0x40,0x80,0xF0,0x88,0x88,0x70,0x00}, // 6
|
||||
{0xF8,0x08,0x08,0x10,0x20,0x40,0x80,0x00}, // 7
|
||||
{0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x00}, // 8
|
||||
{0x70,0x88,0x88,0x78,0x08,0x10,0xE0,0x00}, // 9
|
||||
{0x00,0x00,0x20,0x00,0x20,0x00,0x00,0x00}, // :
|
||||
{0x00,0x00,0x20,0x00,0x20,0x20,0x40,0x00}, // ;
|
||||
{0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x00}, // <
|
||||
{0x00,0x00,0xF8,0x00,0xF8,0x00,0x00,0x00}, // =
|
||||
{0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x00}, // >
|
||||
{0x70,0x88,0x08,0x30,0x20,0x00,0x20,0x00}, // ?
|
||||
{0x70,0x88,0xA8,0xB8,0xB0,0x80,0x78,0x00}, // @
|
||||
{0x20,0x50,0x88,0x88,0xF8,0x88,0x88,0x00}, // A
|
||||
{0xF0,0x88,0x88,0xF0,0x88,0x88,0xF0,0x00}, // B
|
||||
{0x70,0x88,0x80,0x80,0x80,0x88,0x70,0x00}, // C
|
||||
{0xF0,0x88,0x88,0x88,0x88,0x88,0xF0,0x00}, // D
|
||||
{0xF8,0x80,0x80,0xF0,0x80,0x80,0xF8,0x00}, // E
|
||||
{0xF8,0x80,0x80,0xF0,0x80,0x80,0x80,0x00}, // F
|
||||
{0x78,0x88,0x80,0x80,0x98,0x88,0x78,0x00}, // G
|
||||
{0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x00}, // H
|
||||
{0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00}, // I
|
||||
{0x38,0x10,0x10,0x10,0x10,0x90,0x60,0x00}, // J
|
||||
{0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x00}, // K
|
||||
{0x80,0x80,0x80,0x80,0x80,0x80,0xF8,0x00}, // L
|
||||
{0x88,0xD8,0xA8,0xA8,0xA8,0x88,0x88,0x00}, // M
|
||||
{0x88,0x88,0xC8,0xA8,0x98,0x88,0x88,0x00}, // N
|
||||
{0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00}, // O
|
||||
{0xF0,0x88,0x88,0xF0,0x80,0x80,0x80,0x00}, // P
|
||||
{0x70,0x88,0x88,0x88,0xA8,0x90,0x68,0x00}, // Q
|
||||
{0xF0,0x88,0x88,0xF0,0xA0,0x90,0x88,0x00}, // R
|
||||
{0x70,0x88,0x80,0x70,0x08,0x88,0x70,0x00}, // S
|
||||
{0xF8,0xA8,0x20,0x20,0x20,0x20,0x20,0x00}, // T
|
||||
{0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00}, // U
|
||||
{0x88,0x88,0x88,0x88,0x88,0x50,0x20,0x00}, // V
|
||||
{0x88,0x88,0x88,0xA8,0xA8,0xA8,0x50,0x00}, // W
|
||||
{0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x00}, // X
|
||||
{0x88,0x88,0x50,0x20,0x20,0x20,0x20,0x00}, // Y
|
||||
{0xF8,0x08,0x10,0x70,0x40,0x80,0xF8,0x00}, // Z
|
||||
{0x78,0x40,0x40,0x40,0x40,0x40,0x78,0x00}, // [
|
||||
{0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00}, // backslash
|
||||
{0x78,0x08,0x08,0x08,0x08,0x08,0x78,0x00}, // ]
|
||||
{0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00}, // ^
|
||||
{0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00}, // _
|
||||
{0x60,0x60,0x20,0x10,0x00,0x00,0x00,0x00}, // `
|
||||
{0x00,0x00,0x60,0x10,0x70,0x90,0x78,0x00}, // a
|
||||
{0x80,0x80,0xB0,0xC8,0x88,0xC8,0xB0,0x00}, // b
|
||||
{0x00,0x00,0x70,0x88,0x80,0x88,0x70,0x00}, // c
|
||||
{0x08,0x08,0x68,0x98,0x88,0x98,0x68,0x00}, // d
|
||||
{0x00,0x00,0x70,0x88,0xF8,0x80,0x70,0x00}, // e
|
||||
{0x10,0x28,0x20,0x70,0x20,0x20,0x20,0x00}, // f
|
||||
{0x00,0x00,0x70,0x98,0x98,0x68,0x08,0x70}, // g
|
||||
{0x80,0x80,0xB0,0xC8,0x88,0x88,0x88,0x00}, // h
|
||||
{0x20,0x00,0x60,0x20,0x20,0x20,0x70,0x00}, // i
|
||||
{0x10,0x00,0x10,0x10,0x10,0x90,0x60,0x00}, // j
|
||||
{0x80,0x80,0x90,0xA0,0xC0,0xA0,0x90,0x00}, // k
|
||||
{0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00}, // l
|
||||
{0x00,0x00,0xD0,0xA8,0xA8,0xA8,0xA8,0x00}, // m
|
||||
{0x00,0x00,0xB0,0xC8,0x88,0x88,0x88,0x00}, // n
|
||||
{0x00,0x00,0x70,0x88,0x88,0x88,0x70,0x00}, // o
|
||||
{0x00,0x00,0xB0,0xC8,0xC8,0xB0,0x80,0x80}, // p
|
||||
{0x00,0x00,0x68,0x98,0x98,0x68,0x08,0x08}, // q
|
||||
{0x00,0x00,0xB0,0xC8,0x80,0x80,0x80,0x00}, // r
|
||||
{0x00,0x00,0x78,0x80,0x70,0x08,0xF0,0x00}, // s
|
||||
{0x20,0x20,0xF8,0x20,0x20,0x28,0x10,0x00}, // t
|
||||
{0x00,0x00,0x88,0x88,0x88,0x98,0x68,0x00}, // u
|
||||
{0x00,0x00,0x88,0x88,0x88,0x50,0x20,0x00}, // v
|
||||
{0x00,0x00,0x88,0x88,0xA8,0xA8,0x50,0x00}, // w
|
||||
{0x00,0x00,0x88,0x50,0x20,0x50,0x88,0x00}, // x
|
||||
{0x00,0x00,0x88,0x88,0x78,0x08,0x88,0x70}, // y
|
||||
{0x00,0x00,0xF8,0x10,0x20,0x40,0xF8,0x00}, // z
|
||||
{0x10,0x20,0x20,0x40,0x20,0x20,0x10,0x00}, // {
|
||||
{0x20,0x20,0x20,0x00,0x20,0x20,0x20,0x00}, // |
|
||||
{0x40,0x20,0x20,0x10,0x20,0x20,0x40,0x00}, // }
|
||||
{0x40,0xA8,0x10,0x00,0x00,0x00,0x00,0x00}, // ~
|
||||
{0x70,0xD8,0xD8,0x70,0x00,0x00,0x00,0x00} // DEL
|
||||
};
|
||||
/*
|
||||
const char FONT8x8F[97][8] = {
|
||||
{0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00}, // columns, rows, bytes per char
|
||||
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // space
|
||||
{0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00}, // !
|
||||
{0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00}, // "
|
||||
{0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00}, // #
|
||||
{0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00}, // $
|
||||
{0x00,0x63,0x66,0x0C,0x18,0x33,0x63,0x00}, // %
|
||||
{0x1C,0x36,0x1C,0x3B,0x6E,0x66,0x3B,0x00}, // &
|
||||
{0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00}, // '
|
||||
{0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00}, // (
|
||||
{0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00}, // )
|
||||
{0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00}, // *
|
||||
{0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00}, // +
|
||||
{0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30}, // ,
|
||||
{0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00}, // -
|
||||
{0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00}, // .
|
||||
{0x03,0x06,0x0C,0x18,0x30,0x60,0x40,0x00}, // /
|
||||
{0x3E,0x63,0x63,0x6B,0x63,0x63,0x3E,0x00}, // 0
|
||||
{0x18,0x38,0x58,0x18,0x18,0x18,0x7E,0x00}, // 1
|
||||
{0x3C,0x66,0x06,0x1C,0x30,0x66,0x7E,0x00}, // 2
|
||||
{0x3C,0x66,0x06,0x1C,0x06,0x66,0x3C,0x00}, // 3
|
||||
{0x0E,0x1E,0x36,0x66,0x7F,0x06,0x0F,0x00}, // 4
|
||||
{0x7E,0x60,0x7C,0x06,0x06,0x66,0x3C,0x00}, // 5
|
||||
{0x1C,0x30,0x60,0x7C,0x66,0x66,0x3C,0x00}, // 6
|
||||
{0x7E,0x66,0x06,0x0C,0x18,0x18,0x18,0x00}, // 7
|
||||
{0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00}, // 8
|
||||
{0x3C,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00}, // 9
|
||||
{0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00}, // :
|
||||
{0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x30}, // ;
|
||||
{0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00}, // <
|
||||
{0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00}, // =
|
||||
{0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00}, // >
|
||||
{0x3C,0x66,0x06,0x0C,0x18,0x00,0x18,0x00}, // ?
|
||||
{0x3E,0x63,0x6F,0x69,0x6F,0x60,0x3E,0x00}, // @
|
||||
{0x18,0x3C,0x66,0x66,0x7E,0x66,0x66,0x00}, // A
|
||||
{0x7E,0x33,0x33,0x3E,0x33,0x33,0x7E,0x00}, // B
|
||||
{0x1E,0x33,0x60,0x60,0x60,0x33,0x1E,0x00}, // C
|
||||
{0x7C,0x36,0x33,0x33,0x33,0x36,0x7C,0x00}, // D
|
||||
{0x7F,0x31,0x34,0x3C,0x34,0x31,0x7F,0x00}, // E
|
||||
{0x7F,0x31,0x34,0x3C,0x34,0x30,0x78,0x00}, // F
|
||||
{0x1E,0x33,0x60,0x60,0x67,0x33,0x1F,0x00}, // G
|
||||
{0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00}, // H
|
||||
{0x3C,0x18,0x18,0x18,0x18,0x18,0x3C,0x00}, // I
|
||||
{0x0F,0x06,0x06,0x06,0x66,0x66,0x3C,0x00}, // J
|
||||
{0x73,0x33,0x36,0x3C,0x36,0x33,0x73,0x00}, // K
|
||||
{0x78,0x30,0x30,0x30,0x31,0x33,0x7F,0x00}, // L
|
||||
{0x63,0x77,0x7F,0x7F,0x6B,0x63,0x63,0x00}, // M
|
||||
{0x63,0x73,0x7B,0x6F,0x67,0x63,0x63,0x00}, // N
|
||||
{0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00}, // O
|
||||
{0x7E,0x33,0x33,0x3E,0x30,0x30,0x78,0x00}, // P
|
||||
{0x3C,0x66,0x66,0x66,0x6E,0x3C,0x0E,0x00}, // Q
|
||||
{0x7E,0x33,0x33,0x3E,0x36,0x33,0x73,0x00}, // R
|
||||
{0x3C,0x66,0x30,0x18,0x0C,0x66,0x3C,0x00}, // S
|
||||
{0x7E,0x5A,0x18,0x18,0x18,0x18,0x3C,0x00}, // T
|
||||
{0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x00}, // U
|
||||
{0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00}, // V
|
||||
{0x63,0x63,0x63,0x6B,0x7F,0x77,0x63,0x00}, // W
|
||||
{0x63,0x63,0x36,0x1C,0x1C,0x36,0x63,0x00}, // X
|
||||
{0x66,0x66,0x66,0x3C,0x18,0x18,0x3C,0x00}, // Y
|
||||
{0x7F,0x63,0x46,0x0C,0x19,0x33,0x7F,0x00}, // Z
|
||||
{0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00}, // [
|
||||
{0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00}, // backslash
|
||||
{0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00}, // ]
|
||||
{0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00}, // ^
|
||||
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF}, // _
|
||||
{0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00}, // `
|
||||
{0x00,0x00,0x3C,0x06,0x3E,0x66,0x3B,0x00}, // a
|
||||
{0x70,0x30,0x3E,0x33,0x33,0x33,0x6E,0x00}, // b
|
||||
{0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x00}, // c
|
||||
{0x0E,0x06,0x3E,0x66,0x66,0x66,0x3B,0x00}, // d
|
||||
{0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00}, // e
|
||||
{0x1C,0x36,0x30,0x78,0x30,0x30,0x78,0x00}, // f
|
||||
{0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x7C}, // g
|
||||
{0x70,0x30,0x36,0x3B,0x33,0x33,0x73,0x00}, // h
|
||||
{0x18,0x00,0x38,0x18,0x18,0x18,0x3C,0x00}, // i
|
||||
{0x06,0x00,0x06,0x06,0x06,0x66,0x66,0x3C}, // j
|
||||
{0x70,0x30,0x33,0x36,0x3C,0x36,0x73,0x00}, // k
|
||||
{0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00}, // l
|
||||
{0x00,0x00,0x66,0x7F,0x7F,0x6B,0x63,0x00}, // m
|
||||
{0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00}, // n
|
||||
{0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00}, // o
|
||||
{0x00,0x00,0x6E,0x33,0x33,0x3E,0x30,0x78}, // p
|
||||
{0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x0F}, // q
|
||||
{0x00,0x00,0x6E,0x3B,0x33,0x30,0x78,0x00}, // r
|
||||
{0x00,0x00,0x3E,0x60,0x3C,0x06,0x7C,0x00}, // s
|
||||
{0x08,0x18,0x3E,0x18,0x18,0x1A,0x0C,0x00}, // t
|
||||
{0x00,0x00,0x66,0x66,0x66,0x66,0x3B,0x00}, // u
|
||||
{0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00}, // v
|
||||
{0x00,0x00,0x63,0x6B,0x7F,0x7F,0x36,0x00}, // w
|
||||
{0x00,0x00,0x63,0x36,0x1C,0x36,0x63,0x00}, // x
|
||||
{0x00,0x00,0x66,0x66,0x66,0x3E,0x06,0x7C}, // y
|
||||
{0x00,0x00,0x7E,0x4C,0x18,0x32,0x7E,0x00}, // z
|
||||
{0x0E,0x18,0x18,0x70,0x18,0x18,0x0E,0x00}, // {
|
||||
{0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x0C,0x00}, // |
|
||||
{0x70,0x18,0x18,0x0E,0x18,0x18,0x70,0x00}, // }
|
||||
{0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00}, // ~
|
||||
{0x1C,0x36,0x36,0x1C,0x00,0x00,0x00,0x00} // DEL
|
||||
};
|
||||
|
||||
const char FONT8x16[97][16] = {
|
||||
{0x08,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // columns, rows, bytes per char
|
||||
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // space
|
||||
{0x00,0x00,0x18,0x3C,0x3C,0x3C,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00}, // !
|
||||
{0x00,0x63,0x63,0x63,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // "
|
||||
{0x00,0x00,0x00,0x36,0x36,0x7F,0x36,0x36,0x36,0x7F,0x36,0x36,0x00,0x00,0x00,0x00}, // #
|
||||
{0x0C,0x0C,0x3E,0x63,0x61,0x60,0x3E,0x03,0x03,0x43,0x63,0x3E,0x0C,0x0C,0x00,0x00}, // $
|
||||
{0x00,0x00,0x00,0x00,0x00,0x61,0x63,0x06,0x0C,0x18,0x33,0x63,0x00,0x00,0x00,0x00}, // %
|
||||
{0x00,0x00,0x00,0x1C,0x36,0x36,0x1C,0x3B,0x6E,0x66,0x66,0x3B,0x00,0x00,0x00,0x00}, // &
|
||||
{0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // '
|
||||
{0x00,0x00,0x0C,0x18,0x18,0x30,0x30,0x30,0x30,0x18,0x18,0x0C,0x00,0x00,0x00,0x00}, // (
|
||||
{0x00,0x00,0x18,0x0C,0x0C,0x06,0x06,0x06,0x06,0x0C,0x0C,0x18,0x00,0x00,0x00,0x00}, // )
|
||||
{0x00,0x00,0x00,0x00,0x42,0x66,0x3C,0xFF,0x3C,0x66,0x42,0x00,0x00,0x00,0x00,0x00}, // *
|
||||
{0x00,0x00,0x00,0x00,0x18,0x18,0x18,0xFF,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00}, // +
|
||||
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00}, // ,
|
||||
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // -
|
||||
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00}, // .
|
||||
{0x00,0x00,0x01,0x03,0x07,0x0E,0x1C,0x38,0x70,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00}, // /
|
||||
{0x00,0x00,0x3E,0x63,0x63,0x63,0x6B,0x6B,0x63,0x63,0x63,0x3E,0x00,0x00,0x00,0x00}, // 0
|
||||
{0x00,0x00,0x0C,0x1C,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3F,0x00,0x00,0x00,0x00}, // 1
|
||||
{0x00,0x00,0x3E,0x63,0x03,0x06,0x0C,0x18,0x30,0x61,0x63,0x7F,0x00,0x00,0x00,0x00}, // 2
|
||||
{0x00,0x00,0x3E,0x63,0x03,0x03,0x1E,0x03,0x03,0x03,0x63,0x3E,0x00,0x00,0x00,0x00}, // 3
|
||||
{0x00,0x00,0x06,0x0E,0x1E,0x36,0x66,0x66,0x7F,0x06,0x06,0x0F,0x00,0x00,0x00,0x00}, // 4
|
||||
{0x00,0x00,0x7F,0x60,0x60,0x60,0x7E,0x03,0x03,0x63,0x73,0x3E,0x00,0x00,0x00,0x00}, // 5
|
||||
{0x00,0x00,0x1C,0x30,0x60,0x60,0x7E,0x63,0x63,0x63,0x63,0x3E,0x00,0x00,0x00,0x00}, // 6
|
||||
{0x00,0x00,0x7F,0x63,0x03,0x06,0x06,0x0C,0x0C,0x18,0x18,0x18,0x00,0x00,0x00,0x00}, // 7
|
||||
{0x00,0x00,0x3E,0x63,0x63,0x63,0x3E,0x63,0x63,0x63,0x63,0x3E,0x00,0x00,0x00,0x00}, // 8
|
||||
{0x00,0x00,0x3E,0x63,0x63,0x63,0x63,0x3F,0x03,0x03,0x06,0x3C,0x00,0x00,0x00,0x00}, // 9
|
||||
{0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00}, // :
|
||||
{0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00}, // ;
|
||||
{0x00,0x00,0x00,0x06,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x06,0x00,0x00,0x00,0x00}, // <
|
||||
{0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00}, // =
|
||||
{0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x60,0x00,0x00,0x00,0x00}, // >
|
||||
{0x00,0x00,0x3E,0x63,0x63,0x06,0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x00,0x00,0x00,0x00}, // ?
|
||||
{0x00,0x00,0x3E,0x63,0x63,0x6F,0x6B,0x6B,0x6E,0x60,0x60,0x3E,0x00,0x00,0x00,0x00}, // @
|
||||
{0x00,0x00,0x08,0x1C,0x36,0x63,0x63,0x63,0x7F,0x63,0x63,0x63,0x00,0x00,0x00,0x00}, // A
|
||||
{0x00,0x00,0x7E,0x33,0x33,0x33,0x3E,0x33,0x33,0x33,0x33,0x7E,0x00,0x00,0x00,0x00}, // B
|
||||
{0x00,0x00,0x1E,0x33,0x61,0x60,0x60,0x60,0x60,0x61,0x33,0x1E,0x00,0x00,0x00,0x00}, // C
|
||||
{0x00,0x00,0x7C,0x36,0x33,0x33,0x33,0x33,0x33,0x33,0x36,0x7C,0x00,0x00,0x00,0x00}, // D
|
||||
{0x00,0x00,0x7F,0x33,0x31,0x34,0x3C,0x34,0x30,0x31,0x33,0x7F,0x00,0x00,0x00,0x00}, // E
|
||||
{0x00,0x00,0x7F,0x33,0x31,0x34,0x3C,0x34,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00}, // F
|
||||
{0x00,0x00,0x1E,0x33,0x61,0x60,0x60,0x6F,0x63,0x63,0x37,0x1D,0x00,0x00,0x00,0x00}, // G
|
||||
{0x00,0x00,0x63,0x63,0x63,0x63,0x7F,0x63,0x63,0x63,0x63,0x63,0x00,0x00,0x00,0x00}, // H
|
||||
{0x00,0x00,0x3C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00}, // I
|
||||
{0x00,0x00,0x0F,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3C,0x00,0x00,0x00,0x00}, // J
|
||||
{0x00,0x00,0x73,0x33,0x36,0x36,0x3C,0x36,0x36,0x33,0x33,0x73,0x00,0x00,0x00,0x00}, // K
|
||||
{0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x33,0x7F,0x00,0x00,0x00,0x00}, // L
|
||||
{0x00,0x00,0x63,0x77,0x7F,0x6B,0x63,0x63,0x63,0x63,0x63,0x63,0x00,0x00,0x00,0x00}, // M
|
||||
{0x00,0x00,0x63,0x63,0x73,0x7B,0x7F,0x6F,0x67,0x63,0x63,0x63,0x00,0x00,0x00,0x00}, // N
|
||||
{0x00,0x00,0x1C,0x36,0x63,0x63,0x63,0x63,0x63,0x63,0x36,0x1C,0x00,0x00,0x00,0x00}, // O
|
||||
{0x00,0x00,0x7E,0x33,0x33,0x33,0x3E,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00}, // P
|
||||
{0x00,0x00,0x3E,0x63,0x63,0x63,0x63,0x63,0x63,0x6B,0x6F,0x3E,0x06,0x07,0x00,0x00}, // Q
|
||||
{0x00,0x00,0x7E,0x33,0x33,0x33,0x3E,0x36,0x36,0x33,0x33,0x73,0x00,0x00,0x00,0x00}, // R
|
||||
{0x00,0x00,0x3E,0x63,0x63,0x30,0x1C,0x06,0x03,0x63,0x63,0x3E,0x00,0x00,0x00,0x00}, // S
|
||||
{0x00,0x00,0xFF,0xDB,0x99,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00}, // T
|
||||
{0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x3E,0x00,0x00,0x00,0x00}, // U
|
||||
{0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x36,0x1C,0x08,0x00,0x00,0x00,0x00}, // V
|
||||
{0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x6B,0x6B,0x7F,0x36,0x36,0x00,0x00,0x00,0x00}, // W
|
||||
{0x00,0x00,0xC3,0xC3,0x66,0x3C,0x18,0x18,0x3C,0x66,0xC3,0xC3,0x00,0x00,0x00,0x00}, // X
|
||||
{0x00,0x00,0xC3,0xC3,0xC3,0x66,0x3C,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00}, // Y
|
||||
{0x00,0x00,0x7F,0x63,0x43,0x06,0x0C,0x18,0x30,0x61,0x63,0x7F,0x00,0x00,0x00,0x00}, // Z
|
||||
{0x00,0x00,0x3C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3C,0x00,0x00,0x00,0x00}, // [
|
||||
{0x00,0x00,0x80,0xC0,0xE0,0x70,0x38,0x1C,0x0E,0x07,0x03,0x01,0x00,0x00,0x00,0x00}, // backslash
|
||||
{0x00,0x00,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00,0x00,0x00,0x00}, // ]
|
||||
{0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // ^
|
||||
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00}, // _
|
||||
{0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // `
|
||||
{0x00,0x00,0x00,0x00,0x00,0x3C,0x46,0x06,0x3E,0x66,0x66,0x3B,0x00,0x00,0x00,0x00}, // a
|
||||
{0x00,0x00,0x70,0x30,0x30,0x3C,0x36,0x33,0x33,0x33,0x33,0x6E,0x00,0x00,0x00,0x00}, // b
|
||||
{0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x60,0x60,0x60,0x63,0x3E,0x00,0x00,0x00,0x00}, // c
|
||||
{0x00,0x00,0x0E,0x06,0x06,0x1E,0x36,0x66,0x66,0x66,0x66,0x3B,0x00,0x00,0x00,0x00}, // d
|
||||
{0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x63,0x7E,0x60,0x63,0x3E,0x00,0x00,0x00,0x00}, // e
|
||||
{0x00,0x00,0x1C,0x36,0x32,0x30,0x7C,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00}, // f
|
||||
{0x00,0x00,0x00,0x00,0x00,0x3B,0x66,0x66,0x66,0x66,0x3E,0x06,0x66,0x3C,0x00,0x00}, // g
|
||||
{0x00,0x00,0x70,0x30,0x30,0x36,0x3B,0x33,0x33,0x33,0x33,0x73,0x00,0x00,0x00,0x00}, // h
|
||||
{0x00,0x00,0x0C,0x0C,0x00,0x1C,0x0C,0x0C,0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00}, // i
|
||||
{0x00,0x00,0x06,0x06,0x00,0x0E,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3C,0x00,0x00}, // j
|
||||
{0x00,0x00,0x70,0x30,0x30,0x33,0x33,0x36,0x3C,0x36,0x33,0x73,0x00,0x00,0x00,0x00}, // k
|
||||
{0x00,0x00,0x1C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00}, // l
|
||||
{0x00,0x00,0x00,0x00,0x00,0x6E,0x7F,0x6B,0x6B,0x6B,0x6B,0x6B,0x00,0x00,0x00,0x00}, // m
|
||||
{0x00,0x00,0x00,0x00,0x00,0x6E,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x00,0x00,0x00}, // n
|
||||
{0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00,0x00,0x00,0x00}, // o
|
||||
{0x00,0x00,0x00,0x00,0x00,0x6E,0x33,0x33,0x33,0x33,0x3E,0x30,0x30,0x78,0x00,0x00}, // p
|
||||
{0x00,0x00,0x00,0x00,0x00,0x3B,0x66,0x66,0x66,0x66,0x3E,0x06,0x06,0x0F,0x00,0x00}, // q
|
||||
{0x00,0x00,0x00,0x00,0x00,0x6E,0x3B,0x33,0x30,0x30,0x30,0x78,0x00,0x00,0x00,0x00}, // r
|
||||
{0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x38,0x0E,0x03,0x63,0x3E,0x00,0x00,0x00,0x00}, // s
|
||||
{0x00,0x00,0x08,0x18,0x18,0x7E,0x18,0x18,0x18,0x18,0x1B,0x0E,0x00,0x00,0x00,0x00}, // t
|
||||
{0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x3B,0x00,0x00,0x00,0x00}, // u
|
||||
{0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x36,0x36,0x1C,0x1C,0x08,0x00,0x00,0x00,0x00}, // v
|
||||
{0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x63,0x6B,0x6B,0x7F,0x36,0x00,0x00,0x00,0x00}, // w
|
||||
{0x00,0x00,0x00,0x00,0x00,0x63,0x36,0x1C,0x1C,0x1C,0x36,0x63,0x00,0x00,0x00,0x00}, // x
|
||||
{0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x3F,0x03,0x06,0x3C,0x00,0x00}, // y
|
||||
{0x00,0x00,0x00,0x00,0x00,0x7F,0x66,0x0C,0x18,0x30,0x63,0x7F,0x00,0x00,0x00,0x00}, // z
|
||||
{0x00,0x00,0x0E,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x18,0x0E,0x00,0x00,0x00,0x00}, // {
|
||||
{0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00}, // |
|
||||
{0x00,0x00,0x70,0x18,0x18,0x18,0x0E,0x18,0x18,0x18,0x18,0x70,0x00,0x00,0x00,0x00}, // }
|
||||
{0x00,0x00,0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // ~
|
||||
{0x00,0x70,0xD8,0xD8,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00} // DEL
|
||||
};
|
||||
*/
|
||||
@@ -0,0 +1,6 @@
|
||||
#ifndef __FONTS_H
|
||||
#define __FONTS_H
|
||||
extern const char FONT6x8[97][8];
|
||||
extern const char FONT8x8F[97][8];
|
||||
extern const char FONT8x16[97][16];
|
||||
#endif
|
||||
+222
@@ -0,0 +1,222 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// Routines to load the FPGA image, and then to configure the FPGA's major
|
||||
// mode once it is configured.
|
||||
//
|
||||
// Jonathan Westhues, April 2006
|
||||
//-----------------------------------------------------------------------------
|
||||
#include <proxmark3.h>
|
||||
#include "apps.h"
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Set up the Serial Peripheral Interface as master
|
||||
// Used to write the FPGA config word
|
||||
// May also be used to write to other SPI attached devices like an LCD
|
||||
//-----------------------------------------------------------------------------
|
||||
void SetupSpi(int mode)
|
||||
{
|
||||
// PA10 -> SPI_NCS2 chip select (LCD)
|
||||
// PA11 -> SPI_NCS0 chip select (FPGA)
|
||||
// PA12 -> SPI_MISO Master-In Slave-Out
|
||||
// PA13 -> SPI_MOSI Master-Out Slave-In
|
||||
// PA14 -> SPI_SPCK Serial Clock
|
||||
|
||||
// Disable PIO control of the following pins, allows use by the SPI peripheral
|
||||
PIO_DISABLE = (1 << GPIO_NCS0) |
|
||||
(1 << GPIO_NCS2) |
|
||||
(1 << GPIO_MISO) |
|
||||
(1 << GPIO_MOSI) |
|
||||
(1 << GPIO_SPCK);
|
||||
|
||||
PIO_PERIPHERAL_A_SEL = (1 << GPIO_NCS0) |
|
||||
(1 << GPIO_MISO) |
|
||||
(1 << GPIO_MOSI) |
|
||||
(1 << GPIO_SPCK);
|
||||
|
||||
PIO_PERIPHERAL_B_SEL = (1 << GPIO_NCS2);
|
||||
|
||||
//enable the SPI Peripheral clock
|
||||
PMC_PERIPHERAL_CLK_ENABLE = (1<<PERIPH_SPI);
|
||||
// Enable SPI
|
||||
SPI_CONTROL = SPI_CONTROL_ENABLE;
|
||||
|
||||
switch (mode) {
|
||||
case SPI_FPGA_MODE:
|
||||
SPI_MODE =
|
||||
( 0 << 24) | // Delay between chip selects (take default: 6 MCK periods)
|
||||
(14 << 16) | // Peripheral Chip Select (selects FPGA SPI_NCS0 or PA11)
|
||||
( 0 << 7) | // Local Loopback Disabled
|
||||
( 1 << 4) | // Mode Fault Detection disabled
|
||||
( 0 << 2) | // Chip selects connected directly to peripheral
|
||||
( 0 << 1) | // Fixed Peripheral Select
|
||||
( 1 << 0); // Master Mode
|
||||
SPI_FOR_CHIPSEL_0 =
|
||||
( 1 << 24) | // Delay between Consecutive Transfers (32 MCK periods)
|
||||
( 1 << 16) | // Delay Before SPCK (1 MCK period)
|
||||
( 6 << 8) | // Serial Clock Baud Rate (baudrate = MCK/6 = 24Mhz/6 = 4M baud
|
||||
( 0 << 4) | // Bits per Transfer (8 bits)
|
||||
( 0 << 3) | // Chip Select inactive after transfer
|
||||
( 1 << 1) | // Clock Phase data captured on leading edge, changes on following edge
|
||||
( 0 << 0); // Clock Polarity inactive state is logic 0
|
||||
break;
|
||||
case SPI_LCD_MODE:
|
||||
SPI_MODE =
|
||||
( 0 << 24) | // Delay between chip selects (take default: 6 MCK periods)
|
||||
(11 << 16) | // Peripheral Chip Select (selects LCD SPI_NCS2 or PA10)
|
||||
( 0 << 7) | // Local Loopback Disabled
|
||||
( 1 << 4) | // Mode Fault Detection disabled
|
||||
( 0 << 2) | // Chip selects connected directly to peripheral
|
||||
( 0 << 1) | // Fixed Peripheral Select
|
||||
( 1 << 0); // Master Mode
|
||||
SPI_FOR_CHIPSEL_2 =
|
||||
( 1 << 24) | // Delay between Consecutive Transfers (32 MCK periods)
|
||||
( 1 << 16) | // Delay Before SPCK (1 MCK period)
|
||||
( 6 << 8) | // Serial Clock Baud Rate (baudrate = MCK/6 = 24Mhz/6 = 4M baud
|
||||
( 1 << 4) | // Bits per Transfer (9 bits)
|
||||
( 0 << 3) | // Chip Select inactive after transfer
|
||||
( 1 << 1) | // Clock Phase data captured on leading edge, changes on following edge
|
||||
( 0 << 0); // Clock Polarity inactive state is logic 0
|
||||
break;
|
||||
default: // Disable SPI
|
||||
SPI_CONTROL = SPI_CONTROL_DISABLE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Set up the synchronous serial port, with the one set of options that we
|
||||
// always use when we are talking to the FPGA. Both RX and TX are enabled.
|
||||
//-----------------------------------------------------------------------------
|
||||
void FpgaSetupSsc(void)
|
||||
{
|
||||
// First configure the GPIOs, and get ourselves a clock.
|
||||
PIO_PERIPHERAL_A_SEL = (1 << GPIO_SSC_FRAME) |
|
||||
(1 << GPIO_SSC_DIN) |
|
||||
(1 << GPIO_SSC_DOUT) |
|
||||
(1 << GPIO_SSC_CLK);
|
||||
PIO_DISABLE = (1 << GPIO_SSC_DOUT);
|
||||
|
||||
PMC_PERIPHERAL_CLK_ENABLE = (1 << PERIPH_SSC);
|
||||
|
||||
// Now set up the SSC proper, starting from a known state.
|
||||
SSC_CONTROL = SSC_CONTROL_RESET;
|
||||
|
||||
// RX clock comes from TX clock, RX starts when TX starts, data changes
|
||||
// on RX clock rising edge, sampled on falling edge
|
||||
SSC_RECEIVE_CLOCK_MODE = SSC_CLOCK_MODE_SELECT(1) | SSC_CLOCK_MODE_START(1);
|
||||
|
||||
// 8 bits per transfer, no loopback, MSB first, 1 transfer per sync
|
||||
// pulse, no output sync, start on positive-going edge of sync
|
||||
SSC_RECEIVE_FRAME_MODE = SSC_FRAME_MODE_BITS_IN_WORD(8) |
|
||||
SSC_FRAME_MODE_MSB_FIRST | SSC_FRAME_MODE_WORDS_PER_TRANSFER(0);
|
||||
|
||||
// clock comes from TK pin, no clock output, outputs change on falling
|
||||
// edge of TK, start on rising edge of TF
|
||||
SSC_TRANSMIT_CLOCK_MODE = SSC_CLOCK_MODE_SELECT(2) |
|
||||
SSC_CLOCK_MODE_START(5);
|
||||
|
||||
// tx framing is the same as the rx framing
|
||||
SSC_TRANSMIT_FRAME_MODE = SSC_RECEIVE_FRAME_MODE;
|
||||
|
||||
SSC_CONTROL = SSC_CONTROL_RX_ENABLE | SSC_CONTROL_TX_ENABLE;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Set up DMA to receive samples from the FPGA. We will use the PDC, with
|
||||
// a single buffer as a circular buffer (so that we just chain back to
|
||||
// ourselves, not to another buffer). The stuff to manipulate those buffers
|
||||
// is in apps.h, because it should be inlined, for speed.
|
||||
//-----------------------------------------------------------------------------
|
||||
void FpgaSetupSscDma(BYTE *buf, int len)
|
||||
{
|
||||
PDC_RX_POINTER(SSC_BASE) = (DWORD)buf;
|
||||
PDC_RX_COUNTER(SSC_BASE) = len;
|
||||
PDC_RX_NEXT_POINTER(SSC_BASE) = (DWORD)buf;
|
||||
PDC_RX_NEXT_COUNTER(SSC_BASE) = len;
|
||||
PDC_CONTROL(SSC_BASE) = PDC_RX_ENABLE;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Download the FPGA image stored in flash (slave serial).
|
||||
//-----------------------------------------------------------------------------
|
||||
void FpgaDownloadAndGo(void)
|
||||
{
|
||||
// FPGA image lives in FLASH at base address 0x2000
|
||||
// The current board design can not accomodate anything bigger than a XC2S30
|
||||
// FPGA and the config file size is fixed at 336,768 bits = 10,524 DWORDs
|
||||
const DWORD *FpgaImage=((DWORD *)0x2000);
|
||||
const DWORD FpgaImageLen=10524;
|
||||
|
||||
int i, j;
|
||||
|
||||
PIO_OUTPUT_ENABLE = (1 << GPIO_FPGA_ON);
|
||||
PIO_ENABLE = (1 << GPIO_FPGA_ON);
|
||||
PIO_OUTPUT_DATA_SET = (1 << GPIO_FPGA_ON);
|
||||
|
||||
SpinDelay(50);
|
||||
|
||||
LED_D_ON();
|
||||
|
||||
HIGH(GPIO_FPGA_NPROGRAM);
|
||||
LOW(GPIO_FPGA_CCLK);
|
||||
LOW(GPIO_FPGA_DIN);
|
||||
PIO_OUTPUT_ENABLE = (1 << GPIO_FPGA_NPROGRAM) |
|
||||
(1 << GPIO_FPGA_CCLK) |
|
||||
(1 << GPIO_FPGA_DIN);
|
||||
SpinDelay(1);
|
||||
|
||||
LOW(GPIO_FPGA_NPROGRAM);
|
||||
SpinDelay(50);
|
||||
HIGH(GPIO_FPGA_NPROGRAM);
|
||||
|
||||
for(i = 0; i < FpgaImageLen; i++) {
|
||||
DWORD v = FpgaImage[i];
|
||||
for(j = 0; j < 32; j++) {
|
||||
if(v & 0x80000000) {
|
||||
HIGH(GPIO_FPGA_DIN);
|
||||
} else {
|
||||
LOW(GPIO_FPGA_DIN);
|
||||
}
|
||||
HIGH(GPIO_FPGA_CCLK);
|
||||
LOW(GPIO_FPGA_CCLK);
|
||||
v <<= 1;
|
||||
}
|
||||
}
|
||||
|
||||
LED_D_OFF();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Write the FPGA setup word (that determines what mode the logic is in, read
|
||||
// vs. clone vs. etc.).
|
||||
//-----------------------------------------------------------------------------
|
||||
void FpgaWriteConfWord(BYTE v)
|
||||
{
|
||||
SetupSpi(SPI_FPGA_MODE);
|
||||
while ((SPI_STATUS & SPI_STATUS_TX_EMPTY) == 0); // wait for the transfer to complete
|
||||
SPI_TX_DATA = SPI_CONTROL_LAST_TRANSFER | v; // send the data
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Set up the CMOS switches that mux the ADC: four switches, independently
|
||||
// closable, but should only close one at a time. Not an FPGA thing, but
|
||||
// the samples from the ADC always flow through the FPGA.
|
||||
//-----------------------------------------------------------------------------
|
||||
void SetAdcMuxFor(int whichGpio)
|
||||
{
|
||||
PIO_OUTPUT_ENABLE = (1 << GPIO_MUXSEL_HIPKD) |
|
||||
(1 << GPIO_MUXSEL_LOPKD) |
|
||||
(1 << GPIO_MUXSEL_LORAW) |
|
||||
(1 << GPIO_MUXSEL_HIRAW);
|
||||
|
||||
PIO_ENABLE = (1 << GPIO_MUXSEL_HIPKD) |
|
||||
(1 << GPIO_MUXSEL_LOPKD) |
|
||||
(1 << GPIO_MUXSEL_LORAW) |
|
||||
(1 << GPIO_MUXSEL_HIRAW);
|
||||
|
||||
LOW(GPIO_MUXSEL_HIPKD);
|
||||
LOW(GPIO_MUXSEL_HIRAW);
|
||||
LOW(GPIO_MUXSEL_LORAW);
|
||||
LOW(GPIO_MUXSEL_LOPKD);
|
||||
|
||||
HIGH(whichGpio);
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
+1815
File diff suppressed because it is too large
Load Diff
+1226
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,11 @@
|
||||
SECTIONS
|
||||
{
|
||||
. = 0x00010000;
|
||||
.text : { obj/start.o(.text) *(.text) }
|
||||
.rodata : { *(.rodata) }
|
||||
. = 0x00200000;
|
||||
.data : { *(.data) }
|
||||
__bss_start__ = .;
|
||||
.bss : { *(.bss) }
|
||||
__bss_end__ = .;
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
SECTIONS
|
||||
{
|
||||
. = 0x00002000;
|
||||
.text : { obj/fpgaimg.o(.text) *(.text) }
|
||||
.rodata : { *(.rodata) }
|
||||
. = 0x00200000;
|
||||
.data : { *(.data) }
|
||||
__bss_start__ = .;
|
||||
.bss : { *(.bss) }
|
||||
__bss_end__ = .;
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// Just vector to AppMain(). This is in its own file so that I can place it
|
||||
// with the linker script.
|
||||
// Jonathan Westhues, Mar 2006
|
||||
//-----------------------------------------------------------------------------
|
||||
#include <proxmark3.h>
|
||||
#include "apps.h"
|
||||
|
||||
void Vector(void)
|
||||
{
|
||||
AppMain();
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user