Updated HackRF firmware

This commit is contained in:
2022-05-13 13:08:12 -04:00
parent 3618a32734
commit 8dae36514e
611 changed files with 286269 additions and 159089 deletions

View File

@ -0,0 +1,340 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) 19yy <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) 19yy name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.

View File

@ -0,0 +1,226 @@
HackRF 2021.03.1 Release Notes
To upgrade to this release, you must update libhackrf and hackrf-tools on your
host computer. You must also update firmware on your HackRF.
Major changes in this release include:
- CPLD bitstreams are now included in and loaded automatically by the firmware.
There is no longer a need to update the CPLD separately.
- The clock output (CLKOUT) is now turned off by default.
- A new utility, hackrf_clock, provides a way to inspect and modify
configuration of hardware clocks, including turning on and off CLKOUT.
- The rad1o badge is now supported by firmware in this release. Firmware from
the HackRF release/repository is different than the original CCCamp firmware
and only supports operation as a USB SDR peripheral.
- When using a HackRF One with a PortaPack in "HackRF Mode" (operating as a USB
peripheral), the PortaPack display now indicates operational status and
settings.
There have been many more enhancements and bug fixes. For a full list of
changes, see the git log.
Thanks to Jared Boone, Dominic Spill, schneider, and Mike Walters for major
contributions to this release!
==============================
HackRF 2018.01.1 Release Notes
This is a firmware maintenance release that improves reliability of HackRF One
when booting from the DFU bootloader. If you do not frequently use DFU boot,
there is no reason to upgrade to this release.
==============================
HackRF 2017.02.1 Release Notes
To upgrade to this release, you must update libhackrf and hackrf-tools on your
host computer. You must also update firmware on your HackRF. It is important
to update both the host code and firmware for this release to work properly.
If you only update one or the other, you may experience unpredictable behavior.
Major changes in this release include:
- Sweep mode: A new firmware function enables wideband spectrum monitoring by
rapidly retuning the radio without requiring individual tuning requests from
the host computer. The new hackrf_sweep utility demonstrates this function,
allowing you to collect spectrum measurements at a sweep rate of 8 GHz per
second. Thanks to Mike Walters, author of inspectrum, for getting this
feature working!
- Hardware synchronization: It is now possible to wire the expansion headers of
two or more HackRF Ones together so that they start sampling at the same
time. This is advantageous during phase coherent operation with clock
synchronized HackRFs. See the -H option of hackrf_transfer. Thank you, Mike
Davis!
- A new utility, hackrf_debug, replaces three older debug utilities,
hackrf_si5351c, hackrf_max2837, and hackrf_rffc5071.
- Power consumption has been reduced by turning off some microcontroller
features we weren't using.
There have been many more enhancements and bug fixes. For a full list of
changes, see the git log.
Special thanks to Dominic Spill who has taken over much of the software
development effort and has helped with nearly every improvement since the
previous release!
==============================
HackRF 2015.07.2 Release Notes
Bonus release! This release contains fixes for CMake configuration bugs that
affected installation of 2015.07.1 on some platforms.
==============================
HackRF 2015.07.1 Release Notes
To upgrade to this release, you must update libhackrf and hackrf-tools on your
host computer. You must also update firmware on your HackRF. It is important
to update both the host code and firmware for this release to work properly.
If you only update one or the other, you may experience unpredictable
behaviour.
Major changes in this release include:
- Multiple HackRF support. Users with more than one HackRF can target a
specific device from software using the device serial number. The serial
number is easy to find with hackrf_info. Thanks, Hessu!
- Linux kernel module detaching. A work-around to avoid the unofficial HackRF
kernel module in recent kernel versions that has been causing problems for
many users.
- Updating the CPLD is now possible from Windows. There is no CPLD update with
this release, but Windows users should now be able to update.
- Support for rad1o hardware, the badge of CCCamp 2015 based on HackRF One.
This package contains host software supporting rad1o; for firmware and other
resources, refer to: https://rad1o.badge.events.ccc.de/
There have been many more enhancements and bug fixes, for a full list of
changes, see the git log.
==============================
HackRF 2014.08.1 Release Notes
To upgrade to this release, you must update libhackrf and hackrf-tools on your
host computer. You must also update firmware and the CPLD. It is important to
update both the firmware and the CPLD for this release to work properly. If
you only update one or the other, you may experience an inverted baseband
spectrum.
For a complete list of changes, see the git log. Highlights include:
- HackRF now uses high side injection when tuning to frequencies below 2150
MHz. This significantly reduces images on both RX and TX that resulted from
harmonics of the front-end local oscillator. If you ever wondered why you
were picking up broadcast FM stations at frequencies well outside the FM
broadcast band, they were probably such images.
- A CLKIN firmware bug was fixed. The bug prevented switching to the external
clock source. Switching now works automatically at the start of every TX or
RX operation. If a clock signal is detected on CLKIN, that external source
is used. If a clock signal is not detected on CLKIN, the internal crystal is
used.
- hackrf_transfer now has a signal source mode that transmits a CW signal.
Thanks, dovecho!
- The optional udev rules file was moved from hackrf-tools to libhackrf.
==============================
HackRF 2014.04.1 Release Notes
To upgrade to this release, you must install updates to the software on your
host computer including libhackrf, hackrf-tools, and any other software (e.g.
gr-osmosdr) that uses libhackrf. You must also update firmware and the CPLD
(which should be updated after firmware and host software is updated).
For a complete list of changes, see the git log. Highlights include:
- The sample format has changed from unsigned 8 bit integers to signed 8 bit
integers. This affects all HackRF software and changes the file format used
by hackrf_transfer. If you need to convert a file from unsigned bytes to
signed bytes, I recommend sox:
$ sox old.ub new.sb
- HackRF One is now supported and is the default target platform when compiling
firmware. To compile firmware for Jawbreaker, set the BOARD variable:
$ make -e BOARD=JAWBREAKER
- HackRF One hardware design and documentation are complete. It is now the
preferred platform.
- Automatic clock synchronization is enabled in the firmware. To activate
clock synchronization, simply connect an SMA cable from CLKOUT on one HackRF
One to CLKIN on another HackRF One. The clock signal is a 10 MHz square wave
at 3.3 V DC. This also works on Jawbreaker but requires the installation of
SMA connectors and a few other components noted in the schematic diagram.
- The automatic tuning algorithm is improved for frequencies above 2150 MHz.
The algorithm (in firmware) automatically avoids spurs caused by harmonic
relationships between oscillator frequencies in the analog RF section.
Similar improvements below 2150 MHz will require further effort.
- An explicit tuning option is now available to select tuning parameters
different from those chosen by the automatic tuning algorithm. Automatic
tuning should be preferred for most use cases, but advanced users can use
explicit tuning when there is a need, for example, to avoid a particular
local oscillator frequency for a specific application. Explicit tuning is
implemented only in hackrf_transfer so far.
- Antenna port power on HackRF One can be enabled or disabled during RX or TX.
This is implemented in hackrf_transfer. When activated, 3.0 to 3.3 V DC is
supplied to the antenna port. This can safely supply up to 50 mA, enabling
equipment including some active antennas.
- The firmware compilation and installation instructions have changed. See
firmware/README and firmware/cpld/README for details.
Known bug: CPLD update does not work on Windows. See:
https://github.com/mossmann/hackrf/issues/113
Many thanks to Ben Gamari and Jared Boone for their considerable efforts to
improve the firmware in this release!
==============================
HackRF 2013.07.1 Release Notes
A firmware update is required to take advantage of features of this release and
for compatibility with future software based on this release.
For a complete list of changes, see the git log. Highlights include:
- DC offset correction (greatly reducing the spike seen in the center of an FFT
display)
- Intermediate Frequency (IF) selection
==============================
HackRF 2013.06.1 Release Notes
This is the first release of the HackRF project.
This release package is simply a copy of the git repository with the addition
of a binary firmware image (in the firmware-bin directory) that may be used
to upgrade the firmware on a HackRF Jawbreaker. For instructions, see:
https://github.com/mossmann/hackrf/wiki/Updating-Firmware
The git repository is located at:
https://github.com/mossmann/hackrf

View File

@ -0,0 +1,10 @@
This repository contains hardware designs and software for HackRF,
a low cost, open source Software Defined Radio platform.
![HackRF One](https://raw.github.com/mossmann/hackrf/master/doc/HackRF-One-fd0-0009.jpeg)
(photo by fd0 from https://github.com/fd0/hackrf-one-pictures)
principal author: Michael Ossmann <mike@ossmann.com>
http://greatscottgadgets.com/hackrf/

View File

@ -0,0 +1,3 @@
"HackRF" is a trademark of Great Scott Gadgets. Permission to use the trademark
with attribution to Great Scott Gadgets is granted to all licensees of HackRF for
the sole purpose of naming or describing copies or derived works. (See COPYING.)

Binary file not shown.

After

Width:  |  Height:  |  Size: 679 KiB

View File

@ -0,0 +1,7 @@
The primary source of documentation is the wiki on github:
https://github.com/mossmann/hackrf/wiki
This directory contains supplemental documentation.
(photo jawbreaker-fd0-145436.jpeg by fd0 from https://github.com/fd0/jawbreaker-pictures)

View File

@ -0,0 +1,127 @@
OLS version used from: git://github.com/jawi/ols.git
Warning sometimes there's a bug between Mode3 & Mode0 in OLS 0.9.6b3
Expected is when /CS = 0 at first SCK Rising Edge data shall be read.
1) Read JDEC ID:
----------------
SPI Standard, Mode3, 8bits, MSB first, Show /CS & Honour /CS, SCK=About 32MHz:
Send(MOSI)=0x9F(Read JDEC ID)
Receive(MISO)=0xEF => Manufacturer ID(Winbond) and 0x40, 0x14 => Device ID
2) Read Status Register-2:
--------------------------
SPI Standard, Mode3, 8bits, MSB first, Show /CS & Honour /CS, SCK=About 32MHz:
Send(MOSI)=0x35(Read Status Register-2)
Receive(MISO)=0x02 (Status Register-2 => S15-S8)
3) Read Unknown Command 0xA3 (maybe for other SPIFI memory ??):
---------------------------------------------------------------
SPI Standard, Mode3, 8bits, MSB first, Show /CS & Honour /CS, SCK=About 32MHz:
Send(MOSI)=0xA3
Receive(MISO)=0x00 0x00 0x00
4) Fast Read Quad I/O with "Continuous Read Mode"(0xEB):
--------------------------------------------------------
SPI Standard, Mode3, 8bits, MSB first, Show /CS & Honour /CS, SCK=About 32MHz:
Send(MOSI)=0xEB(Fast Read Quad I/O)
SPI Quad, Mode3, 8bits, MSB first, Show /CS & Honour /CS:
Send(IO0 to IO3) hexa:
00 00 00 (A23-16) (A15-8) (A7-0)
A5 (M7-0) => A5 = 1010 0101 (Continuous Read Mode enabled)
A5 A5 (Dummy 2 bytes)
Receive(IO0 to IO3) hexa:
00 00 02 10 B1 01 00 14 (Data) => Vect Table = 0x10020000(Stack Pointer), 0x140001B1(Thumb) Real Addr=0x140001B0 (Reset_Handler/ResetISR)
79 01 00 14 7B 01 00 14 (Data)
7D 01 00 14 7F 01 00 14 (Data)
Dump from Debug (Big Endian to swap 32bits):
0x80000000 00000210 B1010014 79010014 7B010014 ....<2E>...y...{...
0x80000010 7D010014 7F010014 }.......
5) Fast Read Quad I/O with "Continuous Read Mode"(0xEB):
--------------------------------------------------------
SPI Quad, Mode3, 8bits, MSB first, Show /CS & Honour /CS, SCK=About 32MHz:
Send(IO0 to IO3) hexa:
00 01 B0 (A23-16) (A15-8) (A7-0) (Corresponds to Real Addr=0x140001B0 (Reset_Handler/ResetISR))
A5 (M7-0) => A5 = 1010 0101 (Continuous Read Mode enabled)
A5 A5 (Dummy 2 bytes)
Receive(IO0 to IO3) hexa:
10 B5 72 B6 19 4B 1A 4A (Data)
1A 60 1A 4A 5A 60 1A 4A (Data)
4F F0 FF 33 13 60 53 60 (Data)
Dump from Debug (Big Endian to swap 32bits):
0x800001B0 10B572B6 194B1A4A 1A601A4A 5A601A4A .<2E>r<EFBFBD>.K.J.`.JZ`.J
0x800001C0 4FF0FF33 13605360 O<><4F>3.`S`
6) Fast Read Quad I/O with "Continuous Read Mode"(0xEB):
--------------------------------------------------------
SPI Quad, Mode3, 8bits, MSB first, Show /CS & Honour /CS:
Send(IO0 to IO3) hexa:
00 02 18 (A23-16) (A15-8) (A7-0)
A5 (M7-0) => A5 = 1010 0101 (Continuous Read Mode enabled)
A5 A5 (Dummy 2 bytes)
Receive(IO0 to IO3) hexa:
FE E7 00 BF 00 31 05 40 (Data)
00 00 DF 10 FF F7 DF 01 (Data)
80 E2 00 E0 14 01 00 14 (Data)
Dump from Debug (Big Endian to swap 32bits):
0x80000218 FEE700BF 00310540 0000DF10 FFF7DF01 <20><>.<2E>.1.@..<2E>.<2E><><EFBFBD>.
0x80000228 80E200E0 14010014 .<2E>.<2E>....
7) Fast Read Quad I/O with "Continuous Read Mode"(0xEB):
--------------------------------------------------------
SPI Quad, Mode3, 8bits, MSB first, Show /CS & Honour /CS:
Send(IO0 to IO3) hexa:
00 01 C8 (A23-16) (A15-8) (A7-0)
A5 (M7-0) => A5 = 1010 0101 (Continuous Read Mode enabled)
A5 A5 (Dummy 2 bytes)
Receive(IO0 to IO3) hexa:
93 60 D3 60 13 61 53 61 (Data)
93 61 D3 61 62 B6 15 4C (Data)
Dump from Debug (Big Endian to swap 32bits):
0x800001C8 9360D360 13615361 9361D361 62B6154C .`<60>`.aSa.a<>ab<61>.L
8) Fast Read Quad I/O with "Continuous Read Mode"(0xEB):
--------------------------------------------------------
SPI Quad, Mode3, 8bits, MSB first, Show /CS & Honour /CS:
Send(IO0 to IO3) hexa:
00 02 30 (A23-16) (A15-8) (A7-0)
A5 (M7-0) => A5 = 1010 0101 (Continuous Read Mode enabled)
A5 A5 (Dummy 2 bytes)
Receive(IO0 to IO3) hexa:
50 01 00 14 78 01 00 14 (Data)
Dump from Debug (Big Endian to swap 32bits):
0x80000230 50010014 78010014 P...x...
9) Fast Read Quad I/O with "Continuous Read Mode"(0xEB):
--------------------------------------------------------
SPI Quad, Mode3, 8bits, MSB first, Show /CS & Honour /CS:
Send(IO0 to IO3) hexa:
00 01 D8 (A23-16) (A15-8) (A7-0)
A5 (M7-0) => A5 = 1010 0101 (Continuous Read Mode enabled)
A5 A5 (Dummy 2 bytes)
Receive(IO0 to IO3) hexa:
05 E0 20 68 61 68 A2 68 (Data)
0C 34 FF F7 D2 FF 12 4B (Data
9C 42 F6 D3 04 E0 20 68 (Data)
61 68 08 34 FF F7 D2 FF (Data)
0E 4B 9C 42 F7 D3 DF F8 (Data)
Dump from Debug (Big Endian to swap 32bits):
0x800001D8 05E02068 6168A268 0C34FFF7 D2FF124B .<2E> hah<61>h.4<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.K
0x800001E8 9C42F6D3 04E02068 61680834 FFF7D2FF .B<><42>.<2E> hah.4<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
0x800001F8 0E4B9C42 F7D3DFF8 .K.B<><42><EFBFBD><EFBFBD>
Nota:
Tested on JellyBean.
SCK is about 32MHz After about 620us from startup.
SCK change to about 660KHz/700KHz during about 400us. (During Read from 00 0C 78 => During CGU SetPLL1 code).
SCK change from 4MHz to about 8MHz during about 15us. (Read from 00 0D 98 => During CGU SetPLL1 code).
SCK stabilize to 8MHz during 122us (no data anymore OLS memory is full) (Read from 00 05 B0).
...
During Code running the SCK run at 8MHz MCU is configured at 72MHz => 12MHz(IRC)*6.
SPIFI CLK(0x40050070) = 0xD000800 0x0D=IDIVB & 0x800=AUTOBLOCK_CLOCK_BIT Enabled
IDIVB_CTRL(0x4005004C) = 0x9000820 => IDIB=1000(8+1)=9 => for 72MHz Core => 72/9=8MHz
IDIVB_CTRL(0x4005004C) = 0x9000800 => IDIB=0000(0+1)=1 => for 72MHz Core => 72/1=72MHz => This configuration just crash.
IDIVB_CTRL(0x4005004C) = 0x9000800 => IDIB=0000(0+1)=1 => for 72MHz Core => 72/2=36MHz => This configuration works fine.

View File

@ -0,0 +1,67 @@
Item,Qty,Reference(s),Value,LibPart,Footprint,Datasheet,Description,Manufacturer,Note,Note:,Part Number
1,26,"C1, C3, C5, C7, C11, C24, C29, C33, C34, C35, C36, C37, C38, C39, C40, C45, C47, C55, C57, C60, C63, C65, C66, C67, C115, C125",33pF,Device:C,hackrf:GSG-0402,,CAP CER 33PF 50V 5% NP0 0402,Murata,,,GRM1555C1H330JA01D
2,17,"C2, C4, C6, C10, C16, C19, C22, C30, C54, C56, C87, C88, C89, C92, C93, C162, C163",10nF,Device:C,hackrf:GSG-0402,,CAP CER 10000PF 16V 10% X7R 0402,Murata,,,GRM155R71C103KA01D
3,3,"C97, C98, C100",330nF,Device:C,hackrf:GSG-0402,,CAP CER 0.33UF 10V 10% X5R 0402,Murata,,,GRM155R61A334KE15D
4,12,"C8, C21, C32, C43, C48, C51, C84, C85, C86, C94, C99, C102",22pF,Device:C,hackrf:GSG-0402,,CAP CER 22PF 50V 5% NP0 0402,Murata,,,GRM1555C1H220JA01D
5,2,"C104, C111",3pF,Device:C,hackrf:GSG-0402,,CAP CER 3PF 50V NP0 0402,Murata,,,GRM1555C1H3R0CA01D
6,6,"C105, C126, C127, C143, C145, C146",10uF,Device:C,hackrf:GSG-0805,,CAP CER 10UF 10V 10% X5R 0805,Murata,,,GRM21BR61A106KE19L
7,4,"C53, C106, C161, C171",1uF,Device:C,hackrf:GSG-0402,,CAP CER 1UF 10V 10% X5R 0402,Taiyo Yuden,,,LMK105BJ105KV-F
8,2,"C15, C112",180pF,Device:C,hackrf:GSG-0402,,CAP CER 180PF 50V 5% NP0 0402,Murata,,,GRM1555C1H181JA01D
9,57,"C9, C17, C18, C20, C23, C25, C28, C31, C44, C46, C49, C50, C58, C59, C61, C62, C64, C71, C73, C75, C77, C79, C81, C83, C91, C113, C119, C120, C121, C122, C123, C128, C129, C130, C131, C132, C133, C134, C135, C136, C137, C138, C139, C140, C141, C142, C144, C147, C148, C149, C150, C151, C152, C153, C154, C166, C167",100nF,Device:C,hackrf:GSG-0402,,CAP CER 0.1UF 10V 10% X5R 0402,Murata,,,GRM155R61A104KA01D
10,1,C114,3.3nF,Device:C,hackrf:GSG-0402,,CAP CER 3300PF 50V 10% X7R 0402,Murata,,,GRM155R71H332KA01D
11,3,"C26, C27, C116",47pF,Device:C,hackrf:GSG-0402,,CAP CER 47PF 50V 5% NP0 0402,Murata,,,GRM1555C1H470JA01D
12,4,"C118, C157, C158, C164",18pF,Device:C,hackrf:GSG-0402,,CAP CER 18PF 50V 5% NP0 0402,Murata,,,GRM1555C1H180JA01D
13,2,"C12, C13",330pF,Device:C,hackrf:GSG-0402,,CAP CER 330PF 50V 10% X7R 0402,Murata,,,GRM155R71H331KA01D
14,7,"C72, C74, C76, C78, C80, C82, C124",2.2uF,Device:C,hackrf:GSG-0402,,CAP CER 2.2UF 10V 20% X5R 0402,Taiyo Yuden,,,LMK105BJ225MV-F
15,1,C14,8p2,Device:C,hackrf:GSG-0402,,CAP CER 8.2PF 50V NP0 0402,Taiyo Yuden,,,UMK105CG8R2DV-F
16,6,"C41, C42, C52, C70, C90, C160",100pF,Device:C,hackrf:GSG-0402,,CAP CER 100PF 50V 5% NP0 0402,Murata,,,GRM1555C1H101JA01D
17,2,"C169, C170",1.8pF,Device:C,hackrf:GSG-0402,,CAP CER 1.8PF 25V C0G/NP0 0402,Murata,,,GRM1555C1E1R8BA01D
18,3,"D1, D3, D9",GSG-DIODE-TVS-BI,hackrf:GSG-DIODE-TVS-BI,hackrf:GSG-0402,,TVS DIODE ESD .05PF 15KV 0402,Murata,,,LXES15AAA1-100
19,2,"D2, D6",TXLED,Device:LED,gsg-modules:LTST-S220,,LED SUPR RED CLR RT ANG 0805,Lite-On,,,LTST-S220KRKT
20,2,"D4, D7",VCCLED,Device:LED,gsg-modules:LTST-S220,,LED GREEN CLEAR RT ANG 0805,Lite-On,,,LTST-S220KGKT
21,2,"D5, D8",1V8LED,Device:LED,gsg-modules:LTST-S220,,LED YELLOW CLEAR RT ANG 0805,Lite-On,,,LTST-S220KSKT
22,3,"FB1, FB2, FB3",FILTER,Device:Ferrite_Bead_Small,hackrf:GSG-0805,,FERRITE CHIP 220 OHM 2000MA 0805,Murata,,,BLM21PG221SN1D
23,1,J1,USB-MICRO-B,hackrf:GSG-USB-MICRO-B-SHIELDED,hackrf:GSG-USB-MICROB-FCI-10103592-EXT,,CONN RCPT REV MICRO USB TYPE B,FCI,,,10103592-0001LF
24,2,"L10, L11",4u7,Device:L,hackrf:GSG-NRG4026,,INDUCTOR 4.7UH 1.6A 20% SMD,Taiyo Yuden,,,NRG4026T4R7M
25,5,"L2, L3, L5, L12, L13",10uH,Device:L,hackrf:GSG-0603,,INDUCTR 10UH 220MA 20% 0603 SMD,Taiyo Yuden,,,BRL1608T100M
26,1,L7,6.2nH,Device:L,hackrf:GSG-0402,,INDUCTOR HIFREQ 6.2+/-0.3NH 0402,Taiyo Yuden,,,HK10056N2S-T
27,3,"P2, P4, P16",ANTENNA,hackrf:GSG-RF-CONN,hackrf:GSG-SMA-73251-2120,,CONN SMA JACK 50 OHM EDGE MNT W/JAM NUT & LOCK WASHER,Molex,,,73251-2121
28,2,"P20, P28",SD,Connector_Generic:Conn_02x11_Odd_Even,hackrf:GSG-HEADER-2x11,,"CONN HEADER FMAL 22PS.1"" DL GOLD",Sullins,,,PPPC112LFBN-RC
29,1,P22,I2S,Connector_Generic:Conn_02x13_Odd_Even,hackrf:GSG-HEADER-2x13,,"CONN HEADER FMAL 26PS.1"" DL GOLD",Sullins,,,PPPC132LFBN-RC
30,1,P9,BASEBAND,Connector_Generic:Conn_02x08_Odd_Even,hackrf:GSG-HEADER-2x8,,"CONN HEADER FMAL 16PS.1"" DL GOLD",Sullins,,,PPPC082LFBN-RC
31,3,"Q1, Q2, Q4",MOSFET_P,Device:Q_PMOS_GSD,gsg-modules:SOT23-3,,MOSFET P-CH 50V 130MA SOT-23,Fairchild,,,BSS84
32,1,Q3,MOSFET_P,Device:Q_PMOS_GSD,gsg-modules:SOT23-3,,MOSFET P-CH 20V 4.2A SOT-23,Diodes Inc.,,,DMP2305U-7
33,1,Q5,MOSFET_P,Device:Q_PMOS_GSD,gsg-modules:SOT23-3,,MOSFET P-CH -30V -4.3A SOT23,Alpha and Omega,,,AO3407A
34,6,"R1, R2, R25, R26, R72, R75",470,Device:R,hackrf:GSG-0402,,RES TF 1/16W 470 OHM 5% 0402,Stackpole,,,RMCF0402JT470R
35,6,"R8, R9, R10, R13, R73, R76",1k,Device:R,hackrf:GSG-0402,,RES 1K OHM 1/16W 1% 0402,Stackpole,,,RMCF0402FT1K00
36,22,"R19, R30, R31, R32, R33, R34, R77, R78, R79, R80, R81, R86, R87, R88, R89, R90, R91, R94, R96, R98, R99, R100",39,Device:R,hackrf:GSG-0402,,RES 39 OHM 1/16W 5% 0402 SMD,Stackpole,,,RMCF0402JT39R0
37,26,"R5, R6, R7, R11, R12, R24, R29, R36, R37, R41, R48, R49, R51, R52, R54, R59, R63, R64, R65, R66, R67, R68, R85, R93, R104, R105",10k,Device:R,hackrf:GSG-0402,,RES 10K OHM 1/16W 5% 0402 SMD,Stackpole,,,RMCF0402JT10K0
38,4,"R14, R15, R16, R17",4k7,Device:R,hackrf:GSG-0402,,RES 4.7K OHM 1/16W 1% 0402,Stackpole,,,RMCF0402FT4K70
39,4,"R18, R27, R28, R74",1k8,Device:R,hackrf:GSG-0402,,RES TF 1.8K OHM 5% 1/16W 0402,Stackpole,,,RMCF0402JT1K80
40,7,"R20, R21, R22, R23, R57, R58, R62",0,Device:R,hackrf:GSG-0402,,RES 0.0 OHM 1/16W 0402 SMD,Stackpole,,,RMCF0402ZT0R00
41,1,R3,22k,Device:R,hackrf:GSG-0402,,RES 22K OHM 1/10W 5% 0402 SMD,Panasonic,,,ERJ-2GEJ223X
42,1,R4,51k,Device:R,hackrf:GSG-0402,,RES TF 51K OHM 1% 0.0625W 0402,Stackpole,,,RMCF0402FT51K0
43,2,"R46, R55",162k,Device:R,hackrf:GSG-0402,,RES TF 1/16W 162K OHM 1% 0402,Stackpole,,,RMCF0402FT162K
44,1,R47,330k,Device:R,hackrf:GSG-0402,,RES TF 1/16W 330K OHM 1% 0402,Stackpole,,,RMCF0402FT330K
45,1,R56,715k,Device:R,hackrf:GSG-0402,,RES TF 1/16W 715K OHM 1% 0402,Stackpole,,,RMCF0402FT715K
46,1,R69,12k,Device:R,hackrf:GSG-0402,,RES 12.0K OHM 1/16W 1% 0402 SMD,Rohm,,,MCR01MRTF1202
47,2,"SW1, SW2",RESET,hackrf:SW_PUSH_SHIELDED,hackrf:GSG-SWITCH-FSMRA,,SWITCH TACTILE SPST-NO 0.05A 12V,TE Connectivity,,,FSMRA3JH
48,2,"T1, T2",MIX_OUT_BALUN,hackrf:BALUN-B0310J50100AHF,hackrf:GSG-B0310J50100AHF,,Ultra Low Profile 0805 Balun 50 to 100 ohm Balanced,Anaren,,,B0310J50100AHF
49,2,"T3, T4",TX_BALUN,hackrf:BALUN,hackrf:GSG-2500BL14M100,,BALUN CERAMIC CHIP WIMAX 2.5GHZ,Johanson Technology,Alternative part: Murata LDB182G4510G-120,Alternative part: Murata LDB182G4510G-120,2500BL14M100T
50,7,"U1, U2, U5, U6, U7, U10, U11",SKY13453,gsg-symbols:SKY13453,gsg-modules:SKY13350-385LF,,IC RF SWITCH 6GHZ 6QFN,Skyworks,,,SKY13453-385LF
51,3,"U9, U12, U14",SKY13317,hackrf:SKY13317,hackrf:GSG-SKY13317-373LF,,20 MHz-6.0 GHz pHEMT GaAs SP3T Switch,Skyworks,,,SKY13317-373LF
52,2,"U13, U25",MGA-81563,hackrf:MGA-81563,hackrf:GSG-SOT363,,"0.1-6 GHz 3 V, 14 dBm Amplifier",Avago,,,MGA-81563-TR1G
53,1,U15,TVS,hackrf:LXES1TBCC2-004,hackrf:GSG-LXES1TBCC2-004,~,TVS DIODE 5.5V 22V LLP75-6L,Vishay,,,VBUS54CV-HSF-G4-08
54,1,U17,MAX2837,hackrf:MAX2837,hackrf:GSG-QFN48-6,,IC TXRX 2.3GHZ-2.7GHZ 48TQFN,Maxim,,,MAX2837ETM+
55,1,U18,MAX5864,hackrf:MAX5864,hackrf:GSG-QFN48-7,,IC ANLG FRONT END 22MSPS 48-TQFN,Maxim,,,MAX5864ETM+
56,1,U19,SI5351C,hackrf:SI5351C,hackrf:GSG-QFN20-4,,IC CLK GENERATOR 160MHZ 20QFN,Silicon Laboratories Inc,,,SI5351C-B-GM
57,1,U20,W25Q80,hackrf:W25Q80BV,hackrf:GSG-SOIC8-208,,IC FLASH 8MBIT 8SOIC,Winbond,,,W25Q80DVSSIG
58,1,U21,TPS62410,hackrf:TPS62410,hackrf:GSG-S-PVSON-N10,,IC BUCK SYNC DUAL ADJ 0.8A 10SON,Texas Instruments,,,TPS62410DRCR
59,1,U23,LPC4320FBD144,hackrf:LPC43XXFBD144,hackrf:GSG-LQFP144,,IC MCU 32BIT 144LQFP,NXP,,,"LPC4320FBD144,551"
60,1,U24,GSG-XC2C64A-7VQG100C,hackrf:GSG-XC2C64A-7VQG100C,hackrf:GSG-VQ100,,IC CR-II CPLD 64MCELL 100-VQFP,Xilinx,,,XC2C64A-7VQG100C
61,1,U3,RX_LOWPASS_FILTER,hackrf:FIL-LP0603,hackrf:GSG-LP0603,,FILTER LOW PASS 1880MHZ 0603 SMD,AVX,,,LP0603A1880ANTR
62,1,U4,RFFC5072,hackrf:RFFC5072,hackrf:GSG-QFN32,,WIDEBAND SYNTHESIZER/VCO WITH INTEGRATED 6GHz MIXER,RFMD,,,RFFC5072TR7
63,1,U8,RX_HIGHPASS_FILTER,hackrf:FIL-DEA,hackrf:GSG-HP-DEA,,FILTER HIGHPASS WLAN&BLUETOOTH,TDK,,,DEA162400HT-8004B1
64,1,X1,GSG-XTAL4PIN,hackrf:GSG-XTAL4PIN,hackrf:GSG-XTAL3.2x2.5mm,,CRYSTAL 25.0000MHZ 10PF SMD,Abracon,,,ABM8-25.000MHZ-10-D1G-T
65,1,X2,MCU_XTAL,hackrf:GSG-XTAL4PIN,hackrf:GSG-XTAL3.2x2.5mm,,CRYSTAL 12.000 MHZ 12PF SMD,TXC,,,7V-12.000MAAE-T
66,1,X3,RTC_XTAL,Device:Crystal,hackrf:GSG-XTAL-AB26TRQ,,CRYSTAL 32.768KHZ 12.5PF SMD,Abracon,,,AB26TRQ-32.768KHZ-T
1 Item Qty Reference(s) Value LibPart Footprint Datasheet Description Manufacturer Note Note: Part Number
2 1 26 C1, C3, C5, C7, C11, C24, C29, C33, C34, C35, C36, C37, C38, C39, C40, C45, C47, C55, C57, C60, C63, C65, C66, C67, C115, C125 33pF Device:C hackrf:GSG-0402 CAP CER 33PF 50V 5% NP0 0402 Murata GRM1555C1H330JA01D
3 2 17 C2, C4, C6, C10, C16, C19, C22, C30, C54, C56, C87, C88, C89, C92, C93, C162, C163 10nF Device:C hackrf:GSG-0402 CAP CER 10000PF 16V 10% X7R 0402 Murata GRM155R71C103KA01D
4 3 3 C97, C98, C100 330nF Device:C hackrf:GSG-0402 CAP CER 0.33UF 10V 10% X5R 0402 Murata GRM155R61A334KE15D
5 4 12 C8, C21, C32, C43, C48, C51, C84, C85, C86, C94, C99, C102 22pF Device:C hackrf:GSG-0402 CAP CER 22PF 50V 5% NP0 0402 Murata GRM1555C1H220JA01D
6 5 2 C104, C111 3pF Device:C hackrf:GSG-0402 CAP CER 3PF 50V NP0 0402 Murata GRM1555C1H3R0CA01D
7 6 6 C105, C126, C127, C143, C145, C146 10uF Device:C hackrf:GSG-0805 CAP CER 10UF 10V 10% X5R 0805 Murata GRM21BR61A106KE19L
8 7 4 C53, C106, C161, C171 1uF Device:C hackrf:GSG-0402 CAP CER 1UF 10V 10% X5R 0402 Taiyo Yuden LMK105BJ105KV-F
9 8 2 C15, C112 180pF Device:C hackrf:GSG-0402 CAP CER 180PF 50V 5% NP0 0402 Murata GRM1555C1H181JA01D
10 9 57 C9, C17, C18, C20, C23, C25, C28, C31, C44, C46, C49, C50, C58, C59, C61, C62, C64, C71, C73, C75, C77, C79, C81, C83, C91, C113, C119, C120, C121, C122, C123, C128, C129, C130, C131, C132, C133, C134, C135, C136, C137, C138, C139, C140, C141, C142, C144, C147, C148, C149, C150, C151, C152, C153, C154, C166, C167 100nF Device:C hackrf:GSG-0402 CAP CER 0.1UF 10V 10% X5R 0402 Murata GRM155R61A104KA01D
11 10 1 C114 3.3nF Device:C hackrf:GSG-0402 CAP CER 3300PF 50V 10% X7R 0402 Murata GRM155R71H332KA01D
12 11 3 C26, C27, C116 47pF Device:C hackrf:GSG-0402 CAP CER 47PF 50V 5% NP0 0402 Murata GRM1555C1H470JA01D
13 12 4 C118, C157, C158, C164 18pF Device:C hackrf:GSG-0402 CAP CER 18PF 50V 5% NP0 0402 Murata GRM1555C1H180JA01D
14 13 2 C12, C13 330pF Device:C hackrf:GSG-0402 CAP CER 330PF 50V 10% X7R 0402 Murata GRM155R71H331KA01D
15 14 7 C72, C74, C76, C78, C80, C82, C124 2.2uF Device:C hackrf:GSG-0402 CAP CER 2.2UF 10V 20% X5R 0402 Taiyo Yuden LMK105BJ225MV-F
16 15 1 C14 8p2 Device:C hackrf:GSG-0402 CAP CER 8.2PF 50V NP0 0402 Taiyo Yuden UMK105CG8R2DV-F
17 16 6 C41, C42, C52, C70, C90, C160 100pF Device:C hackrf:GSG-0402 CAP CER 100PF 50V 5% NP0 0402 Murata GRM1555C1H101JA01D
18 17 2 C169, C170 1.8pF Device:C hackrf:GSG-0402 CAP CER 1.8PF 25V C0G/NP0 0402 Murata GRM1555C1E1R8BA01D
19 18 3 D1, D3, D9 GSG-DIODE-TVS-BI hackrf:GSG-DIODE-TVS-BI hackrf:GSG-0402 TVS DIODE ESD .05PF 15KV 0402 Murata LXES15AAA1-100
20 19 2 D2, D6 TXLED Device:LED gsg-modules:LTST-S220 LED SUPR RED CLR RT ANG 0805 Lite-On LTST-S220KRKT
21 20 2 D4, D7 VCCLED Device:LED gsg-modules:LTST-S220 LED GREEN CLEAR RT ANG 0805 Lite-On LTST-S220KGKT
22 21 2 D5, D8 1V8LED Device:LED gsg-modules:LTST-S220 LED YELLOW CLEAR RT ANG 0805 Lite-On LTST-S220KSKT
23 22 3 FB1, FB2, FB3 FILTER Device:Ferrite_Bead_Small hackrf:GSG-0805 FERRITE CHIP 220 OHM 2000MA 0805 Murata BLM21PG221SN1D
24 23 1 J1 USB-MICRO-B hackrf:GSG-USB-MICRO-B-SHIELDED hackrf:GSG-USB-MICROB-FCI-10103592-EXT CONN RCPT REV MICRO USB TYPE B FCI 10103592-0001LF
25 24 2 L10, L11 4u7 Device:L hackrf:GSG-NRG4026 INDUCTOR 4.7UH 1.6A 20% SMD Taiyo Yuden NRG4026T4R7M
26 25 5 L2, L3, L5, L12, L13 10uH Device:L hackrf:GSG-0603 INDUCTR 10UH 220MA 20% 0603 SMD Taiyo Yuden BRL1608T100M
27 26 1 L7 6.2nH Device:L hackrf:GSG-0402 INDUCTOR HIFREQ 6.2+/-0.3NH 0402 Taiyo Yuden HK10056N2S-T
28 27 3 P2, P4, P16 ANTENNA hackrf:GSG-RF-CONN hackrf:GSG-SMA-73251-2120 CONN SMA JACK 50 OHM EDGE MNT W/JAM NUT & LOCK WASHER Molex 73251-2121
29 28 2 P20, P28 SD Connector_Generic:Conn_02x11_Odd_Even hackrf:GSG-HEADER-2x11 CONN HEADER FMAL 22PS.1" DL GOLD Sullins PPPC112LFBN-RC
30 29 1 P22 I2S Connector_Generic:Conn_02x13_Odd_Even hackrf:GSG-HEADER-2x13 CONN HEADER FMAL 26PS.1" DL GOLD Sullins PPPC132LFBN-RC
31 30 1 P9 BASEBAND Connector_Generic:Conn_02x08_Odd_Even hackrf:GSG-HEADER-2x8 CONN HEADER FMAL 16PS.1" DL GOLD Sullins PPPC082LFBN-RC
32 31 3 Q1, Q2, Q4 MOSFET_P Device:Q_PMOS_GSD gsg-modules:SOT23-3 MOSFET P-CH 50V 130MA SOT-23 Fairchild BSS84
33 32 1 Q3 MOSFET_P Device:Q_PMOS_GSD gsg-modules:SOT23-3 MOSFET P-CH 20V 4.2A SOT-23 Diodes Inc. DMP2305U-7
34 33 1 Q5 MOSFET_P Device:Q_PMOS_GSD gsg-modules:SOT23-3 MOSFET P-CH -30V -4.3A SOT23 Alpha and Omega AO3407A
35 34 6 R1, R2, R25, R26, R72, R75 470 Device:R hackrf:GSG-0402 RES TF 1/16W 470 OHM 5% 0402 Stackpole RMCF0402JT470R
36 35 6 R8, R9, R10, R13, R73, R76 1k Device:R hackrf:GSG-0402 RES 1K OHM 1/16W 1% 0402 Stackpole RMCF0402FT1K00
37 36 22 R19, R30, R31, R32, R33, R34, R77, R78, R79, R80, R81, R86, R87, R88, R89, R90, R91, R94, R96, R98, R99, R100 39 Device:R hackrf:GSG-0402 RES 39 OHM 1/16W 5% 0402 SMD Stackpole RMCF0402JT39R0
38 37 26 R5, R6, R7, R11, R12, R24, R29, R36, R37, R41, R48, R49, R51, R52, R54, R59, R63, R64, R65, R66, R67, R68, R85, R93, R104, R105 10k Device:R hackrf:GSG-0402 RES 10K OHM 1/16W 5% 0402 SMD Stackpole RMCF0402JT10K0
39 38 4 R14, R15, R16, R17 4k7 Device:R hackrf:GSG-0402 RES 4.7K OHM 1/16W 1% 0402 Stackpole RMCF0402FT4K70
40 39 4 R18, R27, R28, R74 1k8 Device:R hackrf:GSG-0402 RES TF 1.8K OHM 5% 1/16W 0402 Stackpole RMCF0402JT1K80
41 40 7 R20, R21, R22, R23, R57, R58, R62 0 Device:R hackrf:GSG-0402 RES 0.0 OHM 1/16W 0402 SMD Stackpole RMCF0402ZT0R00
42 41 1 R3 22k Device:R hackrf:GSG-0402 RES 22K OHM 1/10W 5% 0402 SMD Panasonic ERJ-2GEJ223X
43 42 1 R4 51k Device:R hackrf:GSG-0402 RES TF 51K OHM 1% 0.0625W 0402 Stackpole RMCF0402FT51K0
44 43 2 R46, R55 162k Device:R hackrf:GSG-0402 RES TF 1/16W 162K OHM 1% 0402 Stackpole RMCF0402FT162K
45 44 1 R47 330k Device:R hackrf:GSG-0402 RES TF 1/16W 330K OHM 1% 0402 Stackpole RMCF0402FT330K
46 45 1 R56 715k Device:R hackrf:GSG-0402 RES TF 1/16W 715K OHM 1% 0402 Stackpole RMCF0402FT715K
47 46 1 R69 12k Device:R hackrf:GSG-0402 RES 12.0K OHM 1/16W 1% 0402 SMD Rohm MCR01MRTF1202
48 47 2 SW1, SW2 RESET hackrf:SW_PUSH_SHIELDED hackrf:GSG-SWITCH-FSMRA SWITCH TACTILE SPST-NO 0.05A 12V TE Connectivity FSMRA3JH
49 48 2 T1, T2 MIX_OUT_BALUN hackrf:BALUN-B0310J50100AHF hackrf:GSG-B0310J50100AHF Ultra Low Profile 0805 Balun 50 to 100 ohm Balanced Anaren B0310J50100AHF
50 49 2 T3, T4 TX_BALUN hackrf:BALUN hackrf:GSG-2500BL14M100 BALUN CERAMIC CHIP WIMAX 2.5GHZ Johanson Technology Alternative part: Murata LDB182G4510G-120 Alternative part: Murata LDB182G4510G-120 2500BL14M100T
51 50 7 U1, U2, U5, U6, U7, U10, U11 SKY13453 gsg-symbols:SKY13453 gsg-modules:SKY13350-385LF IC RF SWITCH 6GHZ 6QFN Skyworks SKY13453-385LF
52 51 3 U9, U12, U14 SKY13317 hackrf:SKY13317 hackrf:GSG-SKY13317-373LF 20 MHz-6.0 GHz pHEMT GaAs SP3T Switch Skyworks SKY13317-373LF
53 52 2 U13, U25 MGA-81563 hackrf:MGA-81563 hackrf:GSG-SOT363 0.1-6 GHz 3 V, 14 dBm Amplifier Avago MGA-81563-TR1G
54 53 1 U15 TVS hackrf:LXES1TBCC2-004 hackrf:GSG-LXES1TBCC2-004 ~ TVS DIODE 5.5V 22V LLP75-6L Vishay VBUS54CV-HSF-G4-08
55 54 1 U17 MAX2837 hackrf:MAX2837 hackrf:GSG-QFN48-6 IC TXRX 2.3GHZ-2.7GHZ 48TQFN Maxim MAX2837ETM+
56 55 1 U18 MAX5864 hackrf:MAX5864 hackrf:GSG-QFN48-7 IC ANLG FRONT END 22MSPS 48-TQFN Maxim MAX5864ETM+
57 56 1 U19 SI5351C hackrf:SI5351C hackrf:GSG-QFN20-4 IC CLK GENERATOR 160MHZ 20QFN Silicon Laboratories Inc SI5351C-B-GM
58 57 1 U20 W25Q80 hackrf:W25Q80BV hackrf:GSG-SOIC8-208 IC FLASH 8MBIT 8SOIC Winbond W25Q80DVSSIG
59 58 1 U21 TPS62410 hackrf:TPS62410 hackrf:GSG-S-PVSON-N10 IC BUCK SYNC DUAL ADJ 0.8A 10SON Texas Instruments TPS62410DRCR
60 59 1 U23 LPC4320FBD144 hackrf:LPC43XXFBD144 hackrf:GSG-LQFP144 IC MCU 32BIT 144LQFP NXP LPC4320FBD144,551
61 60 1 U24 GSG-XC2C64A-7VQG100C hackrf:GSG-XC2C64A-7VQG100C hackrf:GSG-VQ100 IC CR-II CPLD 64MCELL 100-VQFP Xilinx XC2C64A-7VQG100C
62 61 1 U3 RX_LOWPASS_FILTER hackrf:FIL-LP0603 hackrf:GSG-LP0603 FILTER LOW PASS 1880MHZ 0603 SMD AVX LP0603A1880ANTR
63 62 1 U4 RFFC5072 hackrf:RFFC5072 hackrf:GSG-QFN32 WIDEBAND SYNTHESIZER/VCO WITH INTEGRATED 6GHz MIXER RFMD RFFC5072TR7
64 63 1 U8 RX_HIGHPASS_FILTER hackrf:FIL-DEA hackrf:GSG-HP-DEA FILTER HIGHPASS WLAN&BLUETOOTH TDK DEA162400HT-8004B1
65 64 1 X1 GSG-XTAL4PIN hackrf:GSG-XTAL4PIN hackrf:GSG-XTAL3.2x2.5mm CRYSTAL 25.0000MHZ 10PF SMD Abracon ABM8-25.000MHZ-10-D1G-T
66 65 1 X2 MCU_XTAL hackrf:GSG-XTAL4PIN hackrf:GSG-XTAL3.2x2.5mm CRYSTAL 12.000 MHZ 12PF SMD TXC 7V-12.000MAAE-T
67 66 1 X3 RTC_XTAL Device:Crystal hackrf:GSG-XTAL-AB26TRQ CRYSTAL 32.768KHZ 12.5PF SMD Abracon AB26TRQ-32.768KHZ-T

View File

@ -0,0 +1,48 @@
Copyright 2012, 2013, 2014 Michael Ossmann
These files are part of HackRF.
This is a free hardware design; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This design 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 design; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street,
Boston, MA 02110-1301, USA.
HackRF One is a wideband software radio transceiver with a USB interface.
hardware notes:
Schematic and layout files were designed in KiCad, an open source electronic
design automation package.
order of copper layers:
Copper 1: C1F (front)
Copper 2: C2
Copper 3: C3
Copper 4: C4B (back)
PCB description: 4 layer PCB 0.062 in
Copper 1 0.5 oz foil plated to approximately 0.0017 in
Dielectric 1-2 0.0119 in
Copper 2 1 oz foil (0.0014 in)
Dielectric 2-3 0.0280 in
Copper 3 1 oz foil (0.0014 in)
Dielectric 3-4 0.0119 in
Copper 4 0.5 oz foil plated to approximately 0.0017 in
FR4 or similar substrate with Er=4.5 (+/- 0.1)
required impedance: 50 ohm (+/- 5%) 20 mil microstrip impedance
double side solder mask green
single side silkscreen white
6 mil min trace width and
6 mil min isolation

View File

@ -0,0 +1,829 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,5.1.9*
G04 #@! TF.CreationDate,2021-03-19T18:57:38-06:00*
G04 #@! TF.ProjectId,hackrf-one,6861636b-7266-42d6-9f6e-652e6b696361,r6*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Soldermask,Bot*
G04 #@! TF.FilePolarity,Negative*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 5.1.9) date 2021-03-19 18:57:38*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%ADD10C,1.676400*%
%ADD11C,0.742240*%
%ADD12C,2.000000*%
%ADD13C,1.652400*%
%ADD14C,1.552400*%
%ADD15C,5.752400*%
%ADD16C,0.752400*%
%ADD17C,1.219200*%
%ADD18C,2.152400*%
%ADD19C,0.737400*%
%ADD20C,0.736600*%
%ADD21C,0.777240*%
G04 APERTURE END LIST*
G04 #@! TO.C,NT3*
G36*
G01*
X84892000Y-128848200D02*
X83368000Y-128848200D01*
G75*
G02*
X83291800Y-128772000I0J76200D01*
G01*
X83291800Y-127248000D01*
G75*
G02*
X83368000Y-127171800I76200J0D01*
G01*
X84892000Y-127171800D01*
G75*
G02*
X84968200Y-127248000I0J-76200D01*
G01*
X84968200Y-128772000D01*
G75*
G02*
X84892000Y-128848200I-76200J0D01*
G01*
G37*
D10*
X84130000Y-125470000D03*
G04 #@! TD*
G04 #@! TO.C,NT2*
G36*
G01*
X156951800Y-113532000D02*
X156951800Y-112008000D01*
G75*
G02*
X157028000Y-111931800I76200J0D01*
G01*
X158552000Y-111931800D01*
G75*
G02*
X158628200Y-112008000I0J-76200D01*
G01*
X158628200Y-113532000D01*
G75*
G02*
X158552000Y-113608200I-76200J0D01*
G01*
X157028000Y-113608200D01*
G75*
G02*
X156951800Y-113532000I0J76200D01*
G01*
G37*
X160330000Y-112770000D03*
G04 #@! TD*
G04 #@! TO.C,NT1*
G36*
G01*
X144251800Y-113532000D02*
X144251800Y-112008000D01*
G75*
G02*
X144328000Y-111931800I76200J0D01*
G01*
X145852000Y-111931800D01*
G75*
G02*
X145928200Y-112008000I0J-76200D01*
G01*
X145928200Y-113532000D01*
G75*
G02*
X145852000Y-113608200I-76200J0D01*
G01*
X144328000Y-113608200D01*
G75*
G02*
X144251800Y-113532000I0J76200D01*
G01*
G37*
X147630000Y-112770000D03*
G04 #@! TD*
D11*
G04 #@! TO.C,U19*
X127469200Y-162926000D03*
X126809200Y-163586000D03*
X126809200Y-162266000D03*
X128129200Y-162266000D03*
X128129200Y-163586000D03*
G04 #@! TD*
D12*
G04 #@! TO.C,MARK1MM*
X171000000Y-102000000D03*
G04 #@! TD*
D13*
G04 #@! TO.C,J1*
X178800000Y-128125000D03*
X178800000Y-119875000D03*
D14*
X175770000Y-126490000D03*
X175770000Y-121510000D03*
G04 #@! TD*
D15*
G04 #@! TO.C,J4*
X64000000Y-104000000D03*
D16*
X64000000Y-101800000D03*
X61800000Y-104000000D03*
X64000000Y-106200000D03*
X66200000Y-104000000D03*
X65550000Y-102450000D03*
X62450000Y-102450000D03*
X62450000Y-105550000D03*
X65550000Y-105550000D03*
G04 #@! TD*
D15*
G04 #@! TO.C,J5*
X64000000Y-171000000D03*
D16*
X64000000Y-168800000D03*
X61800000Y-171000000D03*
X64000000Y-173200000D03*
X66200000Y-171000000D03*
X65550000Y-169450000D03*
X62450000Y-169450000D03*
X62450000Y-172550000D03*
X65550000Y-172550000D03*
G04 #@! TD*
D15*
G04 #@! TO.C,J6*
X176000000Y-171000000D03*
D16*
X176000000Y-168800000D03*
X173800000Y-171000000D03*
X176000000Y-173200000D03*
X178200000Y-171000000D03*
X177550000Y-169450000D03*
X174450000Y-169450000D03*
X174450000Y-172550000D03*
X177550000Y-172550000D03*
G04 #@! TD*
D15*
G04 #@! TO.C,J7*
X176000000Y-104000000D03*
D16*
X176000000Y-101800000D03*
X173800000Y-104000000D03*
X176000000Y-106200000D03*
X178200000Y-104000000D03*
X177550000Y-102450000D03*
X174450000Y-102450000D03*
X174450000Y-105550000D03*
X177550000Y-105550000D03*
G04 #@! TD*
D15*
G04 #@! TO.C,J8*
X126000000Y-104000000D03*
D16*
X126000000Y-101800000D03*
X123800000Y-104000000D03*
X126000000Y-106200000D03*
X128200000Y-104000000D03*
X127550000Y-102450000D03*
X124450000Y-102450000D03*
X124450000Y-105550000D03*
X127550000Y-105550000D03*
G04 #@! TD*
D15*
G04 #@! TO.C,J9*
X131000000Y-144000000D03*
D16*
X131000000Y-141800000D03*
X128800000Y-144000000D03*
X131000000Y-146200000D03*
X133200000Y-144000000D03*
X132550000Y-142450000D03*
X129450000Y-142450000D03*
X129450000Y-145550000D03*
X132550000Y-145550000D03*
G04 #@! TD*
G04 #@! TO.C,P2*
G36*
G01*
X179056200Y-147160000D02*
X179056200Y-149825000D01*
G75*
G02*
X178980000Y-149901200I-76200J0D01*
G01*
X174790000Y-149901200D01*
G75*
G02*
X174713800Y-149825000I0J76200D01*
G01*
X174713800Y-147160000D01*
G75*
G02*
X174790000Y-147083800I76200J0D01*
G01*
X178980000Y-147083800D01*
G75*
G02*
X179056200Y-147160000I0J-76200D01*
G01*
G37*
G36*
G01*
X179056200Y-140175000D02*
X179056200Y-142840000D01*
G75*
G02*
X178980000Y-142916200I-76200J0D01*
G01*
X174790000Y-142916200D01*
G75*
G02*
X174713800Y-142840000I0J76200D01*
G01*
X174713800Y-140175000D01*
G75*
G02*
X174790000Y-140098800I76200J0D01*
G01*
X178980000Y-140098800D01*
G75*
G02*
X179056200Y-140175000I0J-76200D01*
G01*
G37*
G04 #@! TD*
G04 #@! TO.C,P3*
G36*
G01*
X144328000Y-117011800D02*
X145852000Y-117011800D01*
G75*
G02*
X145928200Y-117088000I0J-76200D01*
G01*
X145928200Y-118612000D01*
G75*
G02*
X145852000Y-118688200I-76200J0D01*
G01*
X144328000Y-118688200D01*
G75*
G02*
X144251800Y-118612000I0J76200D01*
G01*
X144251800Y-117088000D01*
G75*
G02*
X144328000Y-117011800I76200J0D01*
G01*
G37*
D10*
X145090000Y-120390000D03*
G04 #@! TD*
G04 #@! TO.C,P4*
G36*
G01*
X60943800Y-158840000D02*
X60943800Y-156175000D01*
G75*
G02*
X61020000Y-156098800I76200J0D01*
G01*
X65210000Y-156098800D01*
G75*
G02*
X65286200Y-156175000I0J-76200D01*
G01*
X65286200Y-158840000D01*
G75*
G02*
X65210000Y-158916200I-76200J0D01*
G01*
X61020000Y-158916200D01*
G75*
G02*
X60943800Y-158840000I0J76200D01*
G01*
G37*
G36*
G01*
X60943800Y-165825000D02*
X60943800Y-163160000D01*
G75*
G02*
X61020000Y-163083800I76200J0D01*
G01*
X65210000Y-163083800D01*
G75*
G02*
X65286200Y-163160000I0J-76200D01*
G01*
X65286200Y-165825000D01*
G75*
G02*
X65210000Y-165901200I-76200J0D01*
G01*
X61020000Y-165901200D01*
G75*
G02*
X60943800Y-165825000I0J76200D01*
G01*
G37*
G04 #@! TD*
G04 #@! TO.C,P5*
G36*
G01*
X92588200Y-104388000D02*
X92588200Y-105912000D01*
G75*
G02*
X92512000Y-105988200I-76200J0D01*
G01*
X90988000Y-105988200D01*
G75*
G02*
X90911800Y-105912000I0J76200D01*
G01*
X90911800Y-104388000D01*
G75*
G02*
X90988000Y-104311800I76200J0D01*
G01*
X92512000Y-104311800D01*
G75*
G02*
X92588200Y-104388000I0J-76200D01*
G01*
G37*
X91750000Y-107690000D03*
X89210000Y-105150000D03*
X89210000Y-107690000D03*
X86670000Y-105150000D03*
X86670000Y-107690000D03*
G04 #@! TD*
G04 #@! TO.C,P9*
G36*
G01*
X107828200Y-127248000D02*
X107828200Y-128772000D01*
G75*
G02*
X107752000Y-128848200I-76200J0D01*
G01*
X106228000Y-128848200D01*
G75*
G02*
X106151800Y-128772000I0J76200D01*
G01*
X106151800Y-127248000D01*
G75*
G02*
X106228000Y-127171800I76200J0D01*
G01*
X107752000Y-127171800D01*
G75*
G02*
X107828200Y-127248000I0J-76200D01*
G01*
G37*
X106990000Y-130550000D03*
X104450000Y-128010000D03*
X104450000Y-130550000D03*
X101910000Y-128010000D03*
X101910000Y-130550000D03*
X99370000Y-128010000D03*
X99370000Y-130550000D03*
X96830000Y-128010000D03*
X96830000Y-130550000D03*
X94290000Y-128010000D03*
X94290000Y-130550000D03*
X91750000Y-128010000D03*
X91750000Y-130550000D03*
X89210000Y-128010000D03*
X89210000Y-130550000D03*
G04 #@! TD*
G04 #@! TO.C,P16*
G36*
G01*
X179056200Y-165160000D02*
X179056200Y-167825000D01*
G75*
G02*
X178980000Y-167901200I-76200J0D01*
G01*
X174790000Y-167901200D01*
G75*
G02*
X174713800Y-167825000I0J76200D01*
G01*
X174713800Y-165160000D01*
G75*
G02*
X174790000Y-165083800I76200J0D01*
G01*
X178980000Y-165083800D01*
G75*
G02*
X179056200Y-165160000I0J-76200D01*
G01*
G37*
G36*
G01*
X179056200Y-158175000D02*
X179056200Y-160840000D01*
G75*
G02*
X178980000Y-160916200I-76200J0D01*
G01*
X174790000Y-160916200D01*
G75*
G02*
X174713800Y-160840000I0J76200D01*
G01*
X174713800Y-158175000D01*
G75*
G02*
X174790000Y-158098800I76200J0D01*
G01*
X178980000Y-158098800D01*
G75*
G02*
X179056200Y-158175000I0J-76200D01*
G01*
G37*
G04 #@! TD*
G04 #@! TO.C,P20*
G36*
G01*
X173792000Y-156788200D02*
X172268000Y-156788200D01*
G75*
G02*
X172191800Y-156712000I0J76200D01*
G01*
X172191800Y-155188000D01*
G75*
G02*
X172268000Y-155111800I76200J0D01*
G01*
X173792000Y-155111800D01*
G75*
G02*
X173868200Y-155188000I0J-76200D01*
G01*
X173868200Y-156712000D01*
G75*
G02*
X173792000Y-156788200I-76200J0D01*
G01*
G37*
X170490000Y-155950000D03*
X173030000Y-153410000D03*
X170490000Y-153410000D03*
X173030000Y-150870000D03*
X170490000Y-150870000D03*
X173030000Y-148330000D03*
X170490000Y-148330000D03*
X173030000Y-145790000D03*
X170490000Y-145790000D03*
X173030000Y-143250000D03*
X170490000Y-143250000D03*
X173030000Y-140710000D03*
X170490000Y-140710000D03*
X173030000Y-138170000D03*
X170490000Y-138170000D03*
X173030000Y-135630000D03*
X170490000Y-135630000D03*
X173030000Y-133090000D03*
X170490000Y-133090000D03*
X173030000Y-130550000D03*
X170490000Y-130550000D03*
G04 #@! TD*
G04 #@! TO.C,P22*
G36*
G01*
X168788200Y-162808000D02*
X168788200Y-164332000D01*
G75*
G02*
X168712000Y-164408200I-76200J0D01*
G01*
X167188000Y-164408200D01*
G75*
G02*
X167111800Y-164332000I0J76200D01*
G01*
X167111800Y-162808000D01*
G75*
G02*
X167188000Y-162731800I76200J0D01*
G01*
X168712000Y-162731800D01*
G75*
G02*
X168788200Y-162808000I0J-76200D01*
G01*
G37*
X167950000Y-166110000D03*
X165410000Y-163570000D03*
X165410000Y-166110000D03*
X162870000Y-163570000D03*
X162870000Y-166110000D03*
X160330000Y-163570000D03*
X160330000Y-166110000D03*
X157790000Y-163570000D03*
X157790000Y-166110000D03*
X155250000Y-163570000D03*
X155250000Y-166110000D03*
X152710000Y-163570000D03*
X152710000Y-166110000D03*
X150170000Y-163570000D03*
X150170000Y-166110000D03*
X147630000Y-163570000D03*
X147630000Y-166110000D03*
X145090000Y-163570000D03*
X145090000Y-166110000D03*
X142550000Y-163570000D03*
X142550000Y-166110000D03*
X140010000Y-163570000D03*
X140010000Y-166110000D03*
X137470000Y-163570000D03*
X137470000Y-166110000D03*
G04 #@! TD*
G04 #@! TO.C,P25*
G36*
G01*
X136631800Y-159252000D02*
X136631800Y-157728000D01*
G75*
G02*
X136708000Y-157651800I76200J0D01*
G01*
X138232000Y-157651800D01*
G75*
G02*
X138308200Y-157728000I0J-76200D01*
G01*
X138308200Y-159252000D01*
G75*
G02*
X138232000Y-159328200I-76200J0D01*
G01*
X136708000Y-159328200D01*
G75*
G02*
X136631800Y-159252000I0J76200D01*
G01*
G37*
X140010000Y-158490000D03*
X142550000Y-158490000D03*
X145090000Y-158490000D03*
X147630000Y-158490000D03*
X150170000Y-158490000D03*
G04 #@! TD*
G04 #@! TO.C,P26*
G36*
G01*
X151129200Y-113857000D02*
X152196000Y-113857000D01*
G75*
G02*
X152272200Y-113933200I0J-76200D01*
G01*
X152272200Y-115000000D01*
G75*
G02*
X152196000Y-115076200I-76200J0D01*
G01*
X151129200Y-115076200D01*
G75*
G02*
X151053000Y-115000000I0J76200D01*
G01*
X151053000Y-113933200D01*
G75*
G02*
X151129200Y-113857000I76200J0D01*
G01*
G37*
D17*
X152932600Y-114466600D03*
X151662600Y-115736600D03*
X152932600Y-115736600D03*
X151662600Y-117006600D03*
X152932600Y-117006600D03*
X151662600Y-118276600D03*
X152932600Y-118276600D03*
X151662600Y-119546600D03*
X152932600Y-119546600D03*
G04 #@! TD*
G04 #@! TO.C,P28*
G36*
G01*
X125532000Y-156788200D02*
X124008000Y-156788200D01*
G75*
G02*
X123931800Y-156712000I0J76200D01*
G01*
X123931800Y-155188000D01*
G75*
G02*
X124008000Y-155111800I76200J0D01*
G01*
X125532000Y-155111800D01*
G75*
G02*
X125608200Y-155188000I0J-76200D01*
G01*
X125608200Y-156712000D01*
G75*
G02*
X125532000Y-156788200I-76200J0D01*
G01*
G37*
D10*
X122230000Y-155950000D03*
X124770000Y-153410000D03*
X122230000Y-153410000D03*
X124770000Y-150870000D03*
X122230000Y-150870000D03*
X124770000Y-148330000D03*
X122230000Y-148330000D03*
X124770000Y-145790000D03*
X122230000Y-145790000D03*
X124770000Y-143250000D03*
X122230000Y-143250000D03*
X124770000Y-140710000D03*
X122230000Y-140710000D03*
X124770000Y-138170000D03*
X122230000Y-138170000D03*
X124770000Y-135630000D03*
X122230000Y-135630000D03*
X124770000Y-133090000D03*
X122230000Y-133090000D03*
X124770000Y-130550000D03*
X122230000Y-130550000D03*
G04 #@! TD*
G04 #@! TO.C,P29*
G36*
G01*
X129011800Y-133852000D02*
X129011800Y-132328000D01*
G75*
G02*
X129088000Y-132251800I76200J0D01*
G01*
X130612000Y-132251800D01*
G75*
G02*
X130688200Y-132328000I0J-76200D01*
G01*
X130688200Y-133852000D01*
G75*
G02*
X130612000Y-133928200I-76200J0D01*
G01*
X129088000Y-133928200D01*
G75*
G02*
X129011800Y-133852000I0J76200D01*
G01*
G37*
X132390000Y-133090000D03*
G04 #@! TD*
G04 #@! TO.C,P30*
G36*
G01*
X161168200Y-104388000D02*
X161168200Y-105912000D01*
G75*
G02*
X161092000Y-105988200I-76200J0D01*
G01*
X159568000Y-105988200D01*
G75*
G02*
X159491800Y-105912000I0J76200D01*
G01*
X159491800Y-104388000D01*
G75*
G02*
X159568000Y-104311800I76200J0D01*
G01*
X161092000Y-104311800D01*
G75*
G02*
X161168200Y-104388000I0J-76200D01*
G01*
G37*
X160330000Y-107690000D03*
X157790000Y-105150000D03*
X157790000Y-107690000D03*
X155250000Y-105150000D03*
X155250000Y-107690000D03*
X152710000Y-105150000D03*
X152710000Y-107690000D03*
X150170000Y-105150000D03*
X150170000Y-107690000D03*
X147630000Y-105150000D03*
X147630000Y-107690000D03*
X145090000Y-105150000D03*
X145090000Y-107690000D03*
X142550000Y-105150000D03*
X142550000Y-107690000D03*
X140010000Y-105150000D03*
X140010000Y-107690000D03*
X137470000Y-105150000D03*
X137470000Y-107690000D03*
G04 #@! TD*
G04 #@! TO.C,P80*
G36*
G01*
X177348000Y-129711800D02*
X178872000Y-129711800D01*
G75*
G02*
X178948200Y-129788000I0J-76200D01*
G01*
X178948200Y-131312000D01*
G75*
G02*
X178872000Y-131388200I-76200J0D01*
G01*
X177348000Y-131388200D01*
G75*
G02*
X177271800Y-131312000I0J76200D01*
G01*
X177271800Y-129788000D01*
G75*
G02*
X177348000Y-129711800I76200J0D01*
G01*
G37*
X178110000Y-133090000D03*
G04 #@! TD*
D13*
G04 #@! TO.C,SW1*
X62700000Y-122150000D03*
X62700000Y-126650000D03*
D18*
X65190000Y-127905000D03*
X65190000Y-120895000D03*
G04 #@! TD*
D13*
G04 #@! TO.C,SW2*
X62700000Y-109150000D03*
X62700000Y-113650000D03*
D18*
X65190000Y-114905000D03*
X65190000Y-107895000D03*
G04 #@! TD*
D19*
G04 #@! TO.C,U21*
X169530000Y-111951200D03*
X169030000Y-112701200D03*
X170030000Y-112701200D03*
X170030000Y-111201200D03*
X169030000Y-111201200D03*
G04 #@! TD*
D11*
G04 #@! TO.C,U4*
X92620400Y-157763600D03*
X92620400Y-156663600D03*
X93720400Y-156663600D03*
X93720400Y-157763600D03*
X93720400Y-158863600D03*
X92620400Y-158863600D03*
X91520400Y-158863600D03*
X91520400Y-157763600D03*
X91520400Y-156663600D03*
G04 #@! TD*
D20*
G04 #@! TO.C,U17*
X108648500Y-141897100D03*
X108648500Y-143397100D03*
X107148500Y-143397100D03*
X107148500Y-141897100D03*
X107148500Y-140397100D03*
X108648500Y-140397100D03*
X110148500Y-140397100D03*
X110148500Y-141897100D03*
X110148500Y-143397100D03*
G04 #@! TD*
D21*
G04 #@! TO.C,U18*
X102895400Y-112461800D03*
X102895400Y-114111800D03*
X101245400Y-114111800D03*
X101245400Y-112461800D03*
X101245400Y-110811800D03*
X102895400Y-110811800D03*
X104545400Y-110811800D03*
X104545400Y-112461800D03*
X104545400Y-114111800D03*
G04 #@! TD*
M02*

View File

@ -0,0 +1,124 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,5.1.9*
G04 #@! TF.CreationDate,2021-03-19T18:57:38-06:00*
G04 #@! TF.ProjectId,hackrf-one,6861636b-7266-42d6-9f6e-652e6b696361,r6*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Profile,NP*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 5.1.9) date 2021-03-19 18:57:38*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 #@! TA.AperFunction,Profile*
%ADD10C,0.381000*%
G04 #@! TD*
G04 APERTURE END LIST*
D10*
X180000000Y-126825000D02*
X180000000Y-138740000D01*
X180000000Y-122075000D02*
X180000000Y-125925000D01*
X180000000Y-104000000D02*
X180000000Y-121175000D01*
X178850000Y-125925000D02*
G75*
G03*
X178850000Y-126825000I0J-450000D01*
G01*
X180000000Y-126825000D02*
X178850000Y-126825000D01*
X180000000Y-125925000D02*
X178850000Y-125925000D01*
X178850000Y-121175000D02*
G75*
G03*
X178850000Y-122075000I0J-450000D01*
G01*
X178850000Y-122075000D02*
X180000000Y-122075000D01*
X180000000Y-121175000D02*
X178850000Y-121175000D01*
X60580000Y-155940000D02*
X60440000Y-155800000D01*
X60440000Y-166200000D02*
X60580000Y-166060000D01*
X60439340Y-166199340D02*
G75*
G03*
X60000000Y-167260000I1060660J-1060660D01*
G01*
X60580660Y-166060660D02*
G75*
G03*
X61020000Y-165000000I-1060660J1060660D01*
G01*
X60439340Y-155800660D02*
G75*
G02*
X60000000Y-154740000I1060660J1060660D01*
G01*
X60580660Y-155939340D02*
G75*
G02*
X61020000Y-157000000I-1060660J-1060660D01*
G01*
X180000000Y-171000000D02*
X180000000Y-169260000D01*
X179420000Y-168060000D02*
X179560000Y-168200000D01*
X179560660Y-168199340D02*
G75*
G02*
X180000000Y-169260000I-1060660J-1060660D01*
G01*
X179419340Y-168060660D02*
G75*
G02*
X178980000Y-167000000I1060660J1060660D01*
G01*
X179420000Y-139940000D02*
X179560000Y-139800000D01*
X179560660Y-139800660D02*
G75*
G03*
X180000000Y-138740000I-1060660J1060660D01*
G01*
X179419340Y-139939340D02*
G75*
G03*
X178980000Y-141000000I1060660J-1060660D01*
G01*
X60000000Y-167260000D02*
X60000000Y-171000000D01*
X60000000Y-154740000D02*
X60000000Y-104000000D01*
X61020000Y-157000000D02*
X61020000Y-165000000D01*
X178980000Y-141000000D02*
X178980000Y-167000000D01*
X176000000Y-100000000D02*
X64000000Y-100000000D01*
X64000000Y-175000000D02*
X176000000Y-175000000D01*
X176000000Y-175000000D02*
G75*
G03*
X180000000Y-171000000I0J4000000D01*
G01*
X180000000Y-104000000D02*
G75*
G03*
X176000000Y-100000000I-4000000J0D01*
G01*
X60000000Y-171000000D02*
G75*
G03*
X64000000Y-175000000I4000000J0D01*
G01*
X64000000Y-100000000D02*
G75*
G03*
X60000000Y-104000000I0J-4000000D01*
G01*
M02*

View File

@ -0,0 +1,835 @@
M48
; DRILL file {KiCad 5.1.9} date Fri Mar 19 18:57:43 2021
; FORMAT={-:-/ absolute / inch / decimal}
; #@! TF.CreationDate,2021-03-19T18:57:43-06:00
; #@! TF.GenerationSoftware,Kicad,Pcbnew,5.1.9
FMAT,2
INCH
T1C0.0130
T2C0.0130
T3C0.0138
T4C0.0150
T5C0.0160
T6C0.0200
T7C0.0250
T8C0.0276
T9C0.0280
T10C0.0354
T11C0.0390
T12C0.0400
T13C0.0512
T14C0.1260
%
G90
G05
T1
X6.6547Y-4.4371
X6.6744Y-4.4075
T2
X2.7744Y-6.1755
X2.7744Y-6.2605
X2.8644Y-6.1705
X2.8874Y-5.7845
X2.895Y-6.338
X2.9035Y-6.189
X2.9092Y-5.6731
X2.9112Y-5.6231
X2.9754Y-5.9245
X3.005Y-6.6064
X3.0302Y-5.4621
X3.0352Y-5.5881
X3.0464Y-6.1305
X3.0784Y-6.1455
X3.1434Y-6.0765
X3.166Y-5.778
X3.1752Y-5.3831
X3.1752Y-5.4281
X3.1752Y-5.4731
X3.1972Y-6.6158
X3.3352Y-5.4681
X3.3352Y-5.5931
X3.4152Y-6.3008
X3.475Y-6.156
X3.4838Y-5.6789
X3.6128Y-5.6939
X3.615Y-4.9756
X3.665Y-4.9756
X3.738Y-4.9756
X3.7805Y-5.9962
X3.7882Y-4.9758
X3.824Y-6.136
X3.8255Y-6.0062
X3.8335Y-6.1712
X3.8343Y-6.5364
X3.87Y-6.044
X3.8765Y-4.2911
X3.94Y-4.7546
X3.99Y-4.7546
X4.0335Y-4.6101
X4.063Y-4.7546
X4.096Y-5.698
X4.11Y-6.165
X4.1105Y-5.6465
X4.113Y-4.7546
X4.1175Y-5.5555
X4.124Y-5.733
X4.1607Y-6.6367
X4.233Y-5.388
X4.233Y-5.427
X4.26Y-6.128
X4.282Y-5.304
X4.4025Y-5.4405
X5.0935Y-6.5394
X5.0942Y-6.5738
X5.3662Y-4.7208
X5.4292Y-6.3508
X5.4402Y-5.8688
X5.4582Y-5.8408
X5.4652Y-6.1393
X5.4887Y-6.1668
X5.5642Y-5.7088
X5.5982Y-5.7118
X5.6352Y-5.4078
X5.6539Y-5.0409
X5.6546Y-5.9976
X5.6765Y-5.3336
X5.7092Y-5.6008
X5.7122Y-4.5578
X5.7122Y-5.3708
X5.7122Y-5.5608
X5.7132Y-5.2638
X5.7252Y-5.1918
X5.7282Y-6.0598
X5.7322Y-5.3118
X5.7442Y-5.9168
X5.7562Y-5.2178
X5.7662Y-5.3078
X5.7742Y-5.1228
X5.8002Y-5.9768
X5.8186Y-4.9143
X5.8252Y-4.8428
X5.8252Y-5.9998
X5.8502Y-5.5668
X5.8522Y-4.8108
X5.8742Y-5.5958
X5.907Y-5.1484
X5.9572Y-5.2538
X5.9772Y-6.2808
X6.0132Y-5.6858
X6.0182Y-5.7578
X6.0512Y-5.7228
X6.0542Y-6.0438
X6.0712Y-6.0728
X6.0774Y-6.0132
X6.0792Y-5.5738
X6.0802Y-5.6108
X6.0812Y-5.5038
X6.0842Y-5.5408
X6.0906Y-5.2322
X6.1882Y-5.7258
X6.2192Y-5.5788
X6.2606Y-5.5557
X6.3044Y-5.5288
X6.315Y-5.5635
X6.4994Y-4.4325
X6.5444Y-4.3625
X6.6547Y-4.378
X6.6941Y-4.378
X6.6941Y-4.4371
X6.8224Y-4.5075
X6.8904Y-4.2575
T3
X3.6032Y-6.1679
X3.6032Y-6.2112
X3.6032Y-6.2545
X3.6465Y-6.1679
X3.6465Y-6.2112
X3.6465Y-6.2545
X3.6898Y-6.1679
X3.6898Y-6.2112
X3.6898Y-6.2545
X4.9925Y-6.3884
X4.9925Y-6.4404
X5.0185Y-6.4144
X5.0445Y-6.3884
X5.0445Y-6.4404
T4
X2.4331Y-4.0945
X2.4331Y-6.7323
X2.4587Y-4.0335
X2.4587Y-4.1555
X2.4587Y-6.6713
X2.4587Y-6.7933
X2.4614Y-6.1614
X2.4614Y-6.2008
X2.4614Y-6.2402
X2.4614Y-6.437
X2.4614Y-6.4764
X2.4614Y-6.5157
X2.5008Y-6.1614
X2.5008Y-6.2008
X2.5008Y-6.2402
X2.5008Y-6.437
X2.5008Y-6.4764
X2.5008Y-6.5157
X2.5197Y-4.0079
X2.5197Y-4.1811
X2.5197Y-6.6457
X2.5197Y-6.8189
X2.5402Y-6.1614
X2.5402Y-6.2008
X2.5402Y-6.2402
X2.5402Y-6.437
X2.5402Y-6.4764
X2.5402Y-6.5157
X2.5807Y-4.0335
X2.5807Y-4.1555
X2.5807Y-6.6713
X2.5807Y-6.7933
X2.6063Y-4.0945
X2.6063Y-6.7323
X3.986Y-4.3627
X3.986Y-4.4276
X3.986Y-4.4926
X4.051Y-4.3627
X4.051Y-4.4276
X4.051Y-4.4926
X4.116Y-4.3627
X4.116Y-4.4276
X4.116Y-4.4926
X4.2184Y-5.5274
X4.2184Y-5.5865
X4.2184Y-5.6456
X4.2775Y-5.5274
X4.2775Y-5.5865
X4.2775Y-5.6456
X4.3366Y-5.5274
X4.3366Y-5.5865
X4.3366Y-5.6456
X4.874Y-4.0945
X4.8996Y-4.0335
X4.8996Y-4.1555
X4.9606Y-4.0079
X4.9606Y-4.1811
X5.0217Y-4.0335
X5.0217Y-4.1555
X5.0472Y-4.0945
X5.0709Y-5.6693
X5.0965Y-5.6083
X5.0965Y-5.7303
X5.1575Y-5.5827
X5.1575Y-5.7559
X5.2185Y-5.6083
X5.2185Y-5.7303
X5.2441Y-5.6693
X6.8425Y-4.0945
X6.8425Y-6.7323
X6.8681Y-4.0335
X6.8681Y-4.1555
X6.8681Y-6.6713
X6.8681Y-6.7933
X6.9087Y-5.5315
X6.9087Y-5.5709
X6.9087Y-5.6102
X6.9087Y-5.8071
X6.9087Y-5.8465
X6.9087Y-5.8858
X6.9087Y-6.2402
X6.9087Y-6.2795
X6.9087Y-6.3189
X6.9087Y-6.5157
X6.9087Y-6.5551
X6.9087Y-6.5945
X6.9291Y-4.0079
X6.9291Y-4.1811
X6.9291Y-6.6457
X6.9291Y-6.8189
X6.948Y-5.5315
X6.948Y-5.5709
X6.948Y-5.6102
X6.948Y-5.8071
X6.948Y-5.8465
X6.948Y-5.8858
X6.948Y-6.2402
X6.948Y-6.2795
X6.948Y-6.3189
X6.948Y-6.5157
X6.948Y-6.5551
X6.948Y-6.5945
X6.9874Y-5.5315
X6.9874Y-5.5709
X6.9874Y-5.6102
X6.9874Y-5.8071
X6.9874Y-5.8465
X6.9874Y-5.8858
X6.9874Y-6.2402
X6.9874Y-6.2795
X6.9874Y-6.3189
X6.9874Y-6.5157
X6.9874Y-6.5551
X6.9874Y-6.5945
X6.9902Y-4.0335
X6.9902Y-4.1555
X6.9902Y-6.6713
X6.9902Y-6.7933
X7.0157Y-4.0945
X7.0157Y-6.7323
T5
X2.5032Y-4.6368
X3.6355Y-5.8922
X3.6355Y-5.9452
X3.6755Y-5.9452
X3.7155Y-5.9452
X3.7452Y-5.9098
X3.7805Y-5.8812
X3.796Y-4.7176
X3.8255Y-5.8962
X3.836Y-4.7176
X3.8705Y-5.9262
X3.876Y-4.7176
X3.916Y-4.7176
X3.9212Y-4.2148
X3.9268Y-4.2578
X3.956Y-4.6076
X3.956Y-4.7176
X3.9892Y-6.3158
X4.0052Y-6.4648
X4.04Y-4.7176
X4.076Y-4.7136
X4.1055Y-5.5195
X4.112Y-6.286
X4.1532Y-4.7228
X4.1607Y-6.5113
X4.1992Y-4.7288
X4.269Y-6.483
X4.4375Y-5.5305
X4.4435Y-5.5845
X4.4602Y-5.6588
X4.4725Y-5.5475
X4.546Y-5.364
X4.61Y-4.393
X4.6192Y-4.7448
X4.6232Y-4.8048
X4.699Y-6.6475
X4.736Y-6.812
X4.7462Y-4.7868
X4.8042Y-4.6878
X4.8042Y-4.8028
X4.8052Y-4.7648
X4.8062Y-4.7268
X4.8542Y-6.2188
X4.8902Y-6.3418
X4.9232Y-4.9848
X4.9642Y-5.8258
X4.9792Y-5.8908
X4.9942Y-5.9438
X5.0062Y-5.8648
X5.0082Y-4.4088
X5.0102Y-4.3698
X5.0202Y-5.8998
X5.0602Y-4.4328
X5.0692Y-4.3748
X5.0832Y-5.3108
X5.0892Y-4.4068
X5.0912Y-5.1178
X5.0972Y-5.3458
X5.1082Y-4.4398
X5.1202Y-5.3988
X5.1792Y-5.9088
X5.2052Y-5.1268
X5.2442Y-5.9538
X5.2792Y-6.2628
X5.3072Y-5.9548
X5.3082Y-6.4048
X5.3223Y-5.1069
X5.3292Y-6.4428
X5.3662Y-6.3488
X5.4302Y-5.0778
X5.4422Y-5.0198
X5.499Y-5.641
X5.592Y-5.532
X5.6182Y-5.0338
X5.6212Y-6.0358
X5.6332Y-5.8068
X5.641Y-5.537
X5.6722Y-4.5148
X5.6912Y-5.7288
X5.7022Y-5.8718
X5.7282Y-4.8168
X5.7712Y-4.8158
X5.8522Y-5.4918
X5.9062Y-5.2108
X5.9222Y-5.2468
X5.9692Y-5.3098
X6.0762Y-5.6748
X6.08Y-5.846
X6.108Y-4.5976
X6.1082Y-4.6388
X6.117Y-6.27
X6.1492Y-4.7878
X6.1632Y-6.1358
X6.1782Y-6.1008
X6.1872Y-5.1258
X6.2042Y-5.3228
X6.2082Y-4.6858
X6.2172Y-6.1048
X6.2342Y-4.5988
X6.2342Y-4.8668
X6.2358Y-5.8647
X6.2772Y-4.9368
X6.2832Y-6.0688
X6.3202Y-4.8768
X6.3572Y-4.6988
X6.3701Y-4.8583
X6.39Y-6.191
X6.417Y-6.221
X6.4472Y-5.9808
X6.49Y-5.485
X6.5082Y-5.0818
X6.5682Y-5.9148
X6.599Y-5.891
X6.6142Y-5.2108
X6.628Y-6.198
X6.665Y-5.806
X6.7934Y-4.3505
X6.8044Y-4.4675
X6.8894Y-4.3075
X6.8894Y-4.5575
X6.925Y-4.2336
T6
X2.8774Y-6.4385
X2.9234Y-6.3705
X3.5715Y-6.4792
X3.6765Y-6.4792
X3.7335Y-4.4801
X4.0015Y-5.5375
X4.081Y-4.6076
X4.2855Y-5.9445
X4.2995Y-5.9885
X4.3275Y-5.3055
X4.3385Y-5.4105
X4.5575Y-5.5065
X4.5585Y-5.5845
X5.0985Y-6.6144
X5.1885Y-6.5594
X6.2591Y-5.6646
X6.3348Y-5.2495
T7
X2.4622Y-4.6738
X2.4722Y-5.1898
X2.4722Y-5.3698
X2.4722Y-5.5488
X2.4722Y-5.7288
X2.4722Y-5.9088
X2.5122Y-5.2898
X2.5822Y-6.4098
X2.6673Y-5.3937
X2.6673Y-5.6299
X2.6673Y-5.8661
X2.6673Y-6.1024
X2.6673Y-6.5748
X2.6722Y-4.3088
X2.6722Y-4.8188
X2.7165Y-6.2598
X2.7244Y-6.0205
X2.7284Y-6.0995
X2.7284Y-6.1825
X2.7342Y-5.8268
X2.7594Y-5.9405
X2.7704Y-5.8805
X2.7894Y-6.0875
X2.7932Y-5.6721
X2.8254Y-6.2705
X2.8312Y-5.5851
X2.8346Y-5.2362
X2.8346Y-6.7323
X2.8702Y-6.5008
X2.8982Y-6.6198
X2.9324Y-5.9245
X2.9344Y-5.8605
X2.948Y-5.5
X2.9494Y-6.1135
X2.96Y-6.6064
X2.965Y-6.42
X2.987Y-5.862
X3.0034Y-6.0675
X3.025Y-5.945
X3.0604Y-6.2075
X3.065Y-5.823
X3.0702Y-5.6641
X3.0709Y-5.2362
X3.0709Y-6.7323
X3.1002Y-5.5281
X3.113Y-6.642
X3.125Y-6.5514
X3.1652Y-5.6781
X3.1802Y-4.7498
X3.2152Y-5.6781
X3.2194Y-6.2335
X3.2244Y-6.0405
X3.239Y-5.822
X3.2602Y-4.6718
X3.2702Y-5.5281
X3.2892Y-4.1898
X3.2952Y-5.6691
X3.3071Y-5.2362
X3.3071Y-6.7323
X3.3232Y-4.0778
X3.3802Y-4.3278
X3.3912Y-4.0428
X3.4048Y-5.6489
X3.4312Y-4.7898
X3.4528Y-5.4409
X3.4615Y-5.9812
X3.492Y-6.202
X3.4965Y-6.0812
X3.5065Y-6.4192
X3.5388Y-5.7589
X3.5433Y-5.2362
X3.5433Y-6.7323
X3.5865Y-6.3692
X3.6265Y-6.4792
X3.6405Y-6.0462
X3.6488Y-5.5899
X3.6655Y-6.3712
X3.7008Y-5.2854
X3.7185Y-6.5412
X3.7252Y-4.4233
X3.7485Y-4.3451
X3.7795Y-6.7323
X3.7827Y-4.5788
X3.8055Y-6.0962
X3.8427Y-4.4258
X3.8475Y-6.4062
X3.8515Y-4.5171
X3.8635Y-4.2401
X3.8682Y-4.3368
X3.8965Y-6.5962
X3.8976Y-5.2953
X3.905Y-6.42
X3.9225Y-4.1661
X3.9255Y-6.1412
X3.926Y-6.321
X3.954Y-6.096
X3.9705Y-6.3712
X3.9945Y-4.2451
X4.0157Y-6.7323
X4.016Y-6.09
X4.0365Y-5.4765
X4.0365Y-5.6915
X4.039Y-6.324
X4.0412Y-4.1668
X4.1009Y-6.5769
X4.1043Y-5.2854
X4.1529Y-6.4429
X4.156Y-4.6086
X4.1725Y-5.7475
X4.1725Y-5.8665
X4.1785Y-5.9665
X4.1874Y-6.2269
X4.2065Y-4.5711
X4.215Y-6.037
X4.229Y-4.6886
X4.2362Y-4.4458
X4.252Y-5.2362
X4.252Y-6.7323
X4.2769Y-6.6369
X4.2925Y-5.7485
X4.2925Y-5.8665
X4.3161Y-6.2076
X4.3505Y-4.4071
X4.3505Y-4.4551
X4.3775Y-5.3055
X4.4065Y-5.9665
X4.4094Y-5.0984
X4.416Y-6.223
X4.4375Y-5.6965
X4.4475Y-5.3455
X4.4775Y-5.7765
X4.4882Y-5.2362
X4.4882Y-6.7323
X4.49Y-4.567
X4.57Y-4.607
X4.5875Y-5.5465
X4.6063Y-5.7087
X4.61Y-4.345
X4.6442Y-5.0278
X4.65Y-4.247
X4.6555Y-5.3937
X4.6555Y-5.8661
X4.6555Y-6.1024
X4.6555Y-6.3386
X4.6555Y-6.5748
X4.7047Y-5.5512
X4.7052Y-6.4338
X4.707Y-6.351
X4.7142Y-6.4828
X4.73Y-4.987
X4.736Y-4.485
X4.7452Y-6.4058
X4.7669Y-6.6094
X4.7742Y-6.2598
X4.8085Y-6.5354
X4.824Y-6.689
X4.833Y-4.356
X4.8652Y-6.4148
X4.87Y-4.541
X4.8702Y-4.8588
X4.8722Y-5.6898
X4.8952Y-6.2328
X4.898Y-6.485
X4.9192Y-5.0778
X4.9485Y-6.5444
X4.971Y-4.858
X4.9735Y-6.2744
X5.0182Y-6.0698
X5.0672Y-4.4898
X5.077Y-6.689
X5.091Y-6.3
X5.0982Y-5.9438
X5.1032Y-4.8608
X5.1292Y-6.2178
X5.1432Y-6.0738
X5.1432Y-6.3468
X5.15Y-4.217
X5.1732Y-5.3938
X5.1802Y-6.7238
X5.1822Y-6.2628
X5.185Y-4.136
X5.2322Y-6.1878
X5.2382Y-6.5608
X5.2532Y-5.7788
X5.2612Y-6.3108
X5.2918Y-5.3945
X5.2961Y-5.6731
X5.3052Y-4.3363
X5.3392Y-5.6968
X5.3731Y-5.1434
X5.375Y-4.627
X5.38Y-4.677
X5.395Y-4.397
X5.4412Y-4.8698
X5.4412Y-4.9208
X5.4412Y-4.9708
X5.458Y-5.2283
X5.4862Y-6.0058
X5.4932Y-6.1098
X5.5172Y-4.3868
X5.5711Y-5.9212
X5.6112Y-6.1568
X5.6242Y-4.8924
X5.6672Y-6.1318
X5.7168Y-4.9737
X5.7514Y-6.1016
X5.8165Y-5.055
X5.8964Y-4.8677
X5.9636Y-4.9136
X5.9742Y-6.1207
X5.988Y-6.322
X6.0131Y-6.0874
X6.0732Y-5.1929
X6.0979Y-6.1723
X6.111Y-6.321
X6.1297Y-5.2495
X6.151Y-5.0656
X6.2358Y-4.9808
X6.2623Y-5.1846
X6.2712Y-5.0162
X6.2942Y-5.8108
X6.3207Y-5.9495
X6.3355Y-5.4496
X6.3461Y-5.0968
X6.3737Y-5.7268
X6.3744Y-4.4075
X6.3772Y-5.893
X6.4303Y-5.6702
X6.4367Y-5.3588
X6.4586Y-5.8116
X6.479Y-6.124
X6.5072Y-4.7368
X6.5151Y-5.2955
X6.5151Y-5.7551
X6.5328Y-5.1222
X6.5363Y-5.3591
X6.5399Y-5.2071
X6.5594Y-4.4075
X6.6112Y-4.9163
X6.6302Y-5.0318
X6.6372Y-4.8048
X6.7144Y-4.1425
X6.7144Y-4.6725
X6.7594Y-4.2575
X6.7594Y-4.5575
X6.7776Y-4.9163
X6.8122Y-6.5718
X6.8694Y-4.5075
X6.8898Y-4.6969
X6.9324Y-4.3749
X6.9372Y-5.9848
T8
X6.9201Y-4.7839
X6.9201Y-4.9799
T9
X5.971Y-4.5066
X5.971Y-4.5566
X5.971Y-4.6066
X5.971Y-4.6566
X5.971Y-4.7066
X6.021Y-4.5066
X6.021Y-4.5566
X6.021Y-4.6066
X6.021Y-4.6566
X6.021Y-4.7066
T10
X7.0394Y-4.7195
X7.0394Y-5.0443
T11
X2.4685Y-4.2972
X2.4685Y-4.4744
X2.4685Y-4.8091
X2.4685Y-4.9862
T12
X3.3122Y-4.9398
X3.3122Y-5.0398
X3.4122Y-4.1398
X3.4122Y-4.2398
X3.5122Y-4.1398
X3.5122Y-4.2398
X3.5122Y-5.0398
X3.5122Y-5.1398
X3.6122Y-4.1398
X3.6122Y-4.2398
X3.6122Y-5.0398
X3.6122Y-5.1398
X3.7122Y-5.0398
X3.7122Y-5.1398
X3.8122Y-5.0398
X3.8122Y-5.1398
X3.9122Y-5.0398
X3.9122Y-5.1398
X4.0122Y-5.0398
X4.0122Y-5.1398
X4.1122Y-5.0398
X4.1122Y-5.1398
X4.2122Y-5.0398
X4.2122Y-5.1398
X4.8122Y-5.1398
X4.8122Y-5.2398
X4.8122Y-5.3398
X4.8122Y-5.4398
X4.8122Y-5.5398
X4.8122Y-5.6398
X4.8122Y-5.7398
X4.8122Y-5.8398
X4.8122Y-5.9398
X4.8122Y-6.0398
X4.8122Y-6.1398
X4.9122Y-5.1398
X4.9122Y-5.2398
X4.9122Y-5.3398
X4.9122Y-5.4398
X4.9122Y-5.5398
X4.9122Y-5.6398
X4.9122Y-5.7398
X4.9122Y-5.8398
X4.9122Y-5.9398
X4.9122Y-6.0398
X4.9122Y-6.1398
X5.1122Y-5.2398
X5.2122Y-5.2398
X5.4122Y-4.1398
X5.4122Y-4.2398
X5.4122Y-6.2398
X5.4122Y-6.4398
X5.4122Y-6.5398
X5.5122Y-4.1398
X5.5122Y-4.2398
X5.5122Y-6.2398
X5.5122Y-6.4398
X5.5122Y-6.5398
X5.6122Y-4.1398
X5.6122Y-4.2398
X5.6122Y-6.2398
X5.6122Y-6.4398
X5.6122Y-6.5398
X5.7122Y-4.1398
X5.7122Y-4.2398
X5.7122Y-4.4398
X5.7122Y-4.6398
X5.7122Y-4.7398
X5.7122Y-6.2398
X5.7122Y-6.4398
X5.7122Y-6.5398
X5.8122Y-4.1398
X5.8122Y-4.2398
X5.8122Y-4.4398
X5.8122Y-6.2398
X5.8122Y-6.4398
X5.8122Y-6.5398
X5.9122Y-4.1398
X5.9122Y-4.2398
X5.9122Y-6.2398
X5.9122Y-6.4398
X5.9122Y-6.5398
X6.0122Y-4.1398
X6.0122Y-4.2398
X6.0122Y-6.4398
X6.0122Y-6.5398
X6.1122Y-4.1398
X6.1122Y-4.2398
X6.1122Y-6.4398
X6.1122Y-6.5398
X6.2122Y-4.1398
X6.2122Y-4.2398
X6.2122Y-4.4398
X6.2122Y-6.4398
X6.2122Y-6.5398
X6.3122Y-4.1398
X6.3122Y-4.2398
X6.3122Y-4.4398
X6.3122Y-6.4398
X6.3122Y-6.5398
X6.4122Y-6.4398
X6.4122Y-6.5398
X6.5122Y-6.4398
X6.5122Y-6.5398
X6.6122Y-6.4398
X6.6122Y-6.5398
X6.7122Y-5.1398
X6.7122Y-5.2398
X6.7122Y-5.3398
X6.7122Y-5.4398
X6.7122Y-5.5398
X6.7122Y-5.6398
X6.7122Y-5.7398
X6.7122Y-5.8398
X6.7122Y-5.9398
X6.7122Y-6.0398
X6.7122Y-6.1398
X6.8122Y-5.1398
X6.8122Y-5.2398
X6.8122Y-5.3398
X6.8122Y-5.4398
X6.8122Y-5.5398
X6.8122Y-5.6398
X6.8122Y-5.7398
X6.8122Y-5.8398
X6.8122Y-5.9398
X6.8122Y-6.0398
X6.8122Y-6.1398
X7.0122Y-5.1398
X7.0122Y-5.2398
T13
X2.5665Y-4.2478
X2.5665Y-4.5238
X2.5665Y-4.7596
X2.5665Y-5.0356
T14
X2.5197Y-4.0945
X2.5197Y-6.7323
X4.9606Y-4.0945
X5.1575Y-5.6693
X6.9291Y-4.0945
X6.9291Y-6.7323
T0
M30

View File

@ -0,0 +1,368 @@
ref;value;Field1;Field2;Field3;Field4;Field5;Field6;Field7;Field8
C1;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C2;10nF;Murata;GRM155R71C103KA01D;CAP CER 10000PF 16V 10% X7R 0402
C3;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C4;10nF;Murata;GRM155R71C103KA01D;CAP CER 10000PF 16V 10% X7R 0402
C5;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C6;10nF;Murata;GRM155R71C103KA01D;CAP CER 10000PF 16V 10% X7R 0402
C7;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C8;47pF;Murata;GRM1555C1H470JZ01D;CAP CER 47PF 50V 5% NP0 0402
C9;10nF;Murata;GRM155R71C103KA01D;CAP CER 10000PF 16V 10% X7R 0402
C10;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C11;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C12;330pF;Murata;GRM155R71H331KA01D;CAP CER 330PF 50V 10% X7R 0402
C13;330pF;Murata;GRM155R71H331KA01D;CAP CER 330PF 50V 10% X7R 0402
C14;8p2;Taiyo Yuden;UMK105CG8R2DV-F;CAP CER 8.2PF 50V NP0 0402
C15;180pF;Murata;GRM1555C1H181JA01D;CAP CER 180PF 50V 5% NP0 0402
C16;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C17;10nF;Murata;GRM155R71C103KA01D;CAP CER 10000PF 16V 10% X7R 0402
C18;10nF;Murata;GRM155R71C103KA01D;CAP CER 10000PF 16V 10% X7R 0402
C19;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C20;10nF;Murata;GRM155R71C103KA01D;CAP CER 10000PF 16V 10% X7R 0402
C21;47pF;Murata;GRM1555C1H470JZ01D;CAP CER 47PF 50V 5% NP0 0402
C22;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C23;10nF;Murata;GRM155R71C103KA01D;CAP CER 10000PF 16V 10% X7R 0402
C24;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C25;10nF;Murata;GRM155R71C103KA01D;CAP CER 10000PF 16V 10% X7R 0402
C26;47pF;Murata;GRM1555C1H470JZ01D;CAP CER 47PF 50V 5% NP0 0402
C27;47pF;Murata;GRM1555C1H470JZ01D;CAP CER 47PF 50V 5% NP0 0402
C28;10nF;Murata;GRM155R71C103KA01D;CAP CER 10000PF 16V 10% X7R 0402
C29;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C30;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C31;10nF;Murata;GRM155R71C103KA01D;CAP CER 10000PF 16V 10% X7R 0402
C32;47pF;Murata;GRM1555C1H470JZ01D;CAP CER 47PF 50V 5% NP0 0402
C33;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C34;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C35;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C36;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C37;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C38;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C39;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C40;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C41;100pF;Murata;GRM1555C1H101JZ01D;CAP CER 100PF 50V 5% NP0 0402
C42;100pF;Murata;GRM1555C1H101JZ01D;CAP CER 100PF 50V 5% NP0 0402
C43;47pF;Murata;GRM1555C1H470JZ01D;CAP CER 47PF 50V 5% NP0 0402
C44;10nF;Murata;GRM155R71C103KA01D;CAP CER 10000PF 16V 10% X7R 0402
C45;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C46;10nF;Murata;GRM155R71C103KA01D;CAP CER 10000PF 16V 10% X7R 0402
C47;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C48;47pF;Murata;GRM1555C1H470JZ01D;CAP CER 47PF 50V 5% NP0 0402
C49;10nF;Murata;GRM155R71C103KA01D;CAP CER 10000PF 16V 10% X7R 0402
C50;100pF;Murata;GRM1555C1H101JZ01D;CAP CER 100PF 50V 5% NP0 0402
C51;47pF;Murata;GRM1555C1H470JZ01D;CAP CER 47PF 50V 5% NP0 0402
C52;100pF;Murata;GRM1555C1H101JZ01D;CAP CER 100PF 50V 5% NP0 0402
C53;1uF;Taiyo Yuden;LMK105BJ105KV-F;CAP CER 1UF 10V 10% X5R 0402
C54;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C55;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C56;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C57;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C58;100pF;Murata;GRM1555C1H101JZ01D;CAP CER 100PF 50V 5% NP0 0402
C59;100pF;Murata;GRM1555C1H101JZ01D;CAP CER 100PF 50V 5% NP0 0402
C60;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C61;10nF;Murata;GRM155R71C103KA01D;CAP CER 10000PF 16V 10% X7R 0402
C62;100pF;Murata;GRM1555C1H101JZ01D;CAP CER 100PF 50V 5% NP0 0402
C63;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C64;10nF;Murata;GRM155R71C103KA01D;CAP CER 10000PF 16V 10% X7R 0402
C65;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C66;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C67;47pF;Murata;GRM1555C1H470JZ01D;CAP CER 47PF 50V 5% NP0 0402
C68;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C69;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C70;47pF;Murata;GRM1555C1H470JZ01D;CAP CER 47PF 50V 5% NP0 0402
C71;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C72;2.2uF;Taiyo Yuden;LMK105BJ225MV-F;CAP CER 2.2UF 10V 20% X5R 0402
C73;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C74;2.2uF;Taiyo Yuden;LMK105BJ225MV-F;CAP CER 2.2UF 10V 20% X5R 0402
C75;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C76;2.2uF;Taiyo Yuden;LMK105BJ225MV-F;CAP CER 2.2UF 10V 20% X5R 0402
C77;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C78;2.2uF;Taiyo Yuden;LMK105BJ225MV-F;CAP CER 2.2UF 10V 20% X5R 0402
C79;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C80;2.2uF;Taiyo Yuden;LMK105BJ225MV-F;CAP CER 2.2UF 10V 20% X5R 0402
C81;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C82;2.2uF;Taiyo Yuden;LMK105BJ225MV-F;CAP CER 2.2UF 10V 20% X5R 0402
C83;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C84;22pF;Murata;GRM1555C1H220JA01D;CAP CER 22PF 50V 5% NP0 0402
C85;22pF;Murata;GRM1555C1H220JA01D;CAP CER 22PF 50V 5% NP0 0402
C86;22pF;Murata;GRM1555C1H220JA01D;CAP CER 22PF 50V 5% NP0 0402
C87;10nF;Murata;GRM155R71C103KA01D;CAP CER 10000PF 16V 10% X7R 0402
C88;10nF;Murata;GRM155R71C103KA01D;CAP CER 10000PF 16V 10% X7R 0402
C89;10nF;Murata;GRM155R71C103KA01D;CAP CER 10000PF 16V 10% X7R 0402
C90;100pF;Murata;GRM1555C1H101JZ01D;CAP CER 100PF 50V 5% NP0 0402
C91;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C92;10nF;Murata;GRM155R71C103KA01D;CAP CER 10000PF 16V 10% X7R 0402
C93;10nF;Murata;GRM155R71C103KA01D;CAP CER 10000PF 16V 10% X7R 0402
C94;22pF;Murata;GRM1555C1H220JA01D;CAP CER 22PF 50V 5% NP0 0402
C95;22pF;Murata;GRM1555C1H220JA01D;CAP CER 22PF 50V 5% NP0 0402;DNP
C96;22pF;Murata;GRM1555C1H220JA01D;CAP CER 22PF 50V 5% NP0 0402;DNP
C97;330nF;Murata;GRM155R61A334KE15D;CAP CER 0.33UF 10V 10% X5R 0402
C98;330nF;Murata;GRM155R61A334KE15D;CAP CER 0.33UF 10V 10% X5R 0402
C99;22pF;Murata;GRM1555C1H220JA01D;CAP CER 22PF 50V 5% NP0 0402
C100;330nF;Murata;GRM155R61A334KE15D;CAP CER 0.33UF 10V 10% X5R 0402
C101;22pF;Murata;GRM1555C1H220JA01D;CAP CER 22PF 50V 5% NP0 0402;DNP
C102;22pF;Murata;GRM1555C1H220JA01D;CAP CER 22PF 50V 5% NP0 0402
C103;22pF;Murata;GRM1555C1H220JA01D;CAP CER 22PF 50V 5% NP0 0402;DNP
C104;3pF;Murata;GRM1555C1H3R0CA01D;CAP CER 3PF 50V NP0 0402
C105;10uF;Murata;GRM21BR61A106KE19L;CAP CER 10UF 10V 10% X5R 0805
C106;1uF;Taiyo Yuden;LMK105BJ105KV-F;CAP CER 1UF 10V 10% X5R 0402
C107;22pF;Murata;GRM1555C1H220JA01D;CAP CER 22PF 50V 5% NP0 0402;DNP
C108;22pF;Murata;GRM1555C1H220JA01D;CAP CER 22PF 50V 5% NP0 0402;DNP
C109;22pF;Murata;GRM1555C1H220JA01D;CAP CER 22PF 50V 5% NP0 0402;DNP
C110;22pF;Murata;GRM1555C1H220JA01D;CAP CER 22PF 50V 5% NP0 0402;DNP
C111;3pF;Murata;GRM1555C1H3R0CA01D;CAP CER 3PF 50V NP0 0402
C112;180pF;Murata;GRM1555C1H181JA01D;CAP CER 180PF 50V 5% NP0 0402
C113;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C114;3.3nF;Murata;GRM155R71H332KA01D;CAP CER 3300PF 50V 10% X7R 0402
C115;10nF;Murata;GRM155R71C103KA01D;CAP CER 10000PF 16V 10% X7R 0402
C116;100pF;Murata;GRM1555C1H101JZ01D;CAP CER 100PF 50V 5% NP0 0402
C117;DNP;DNP
C118;DNP;DNP
C119;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C120;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C121;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C122;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C123;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C124;2.2uF;Taiyo Yuden;LMK105BJ225MV-F;CAP CER 2.2UF 10V 20% X5R 0402
C125;33pF;Murata;GRM1555C1H330JZ01D;CAP CER 33PF 50V 5% NP0 0402
C126;10uF;Murata;GRM21BR61A106KE19L;CAP CER 10UF 10V 10% X5R 0805
C127;10uF;Murata;GRM21BR61A106KE19L;CAP CER 10UF 10V 10% X5R 0805
C128;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C129;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C130;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C131;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C132;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C133;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C134;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C135;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C136;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C137;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C138;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C139;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C140;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C141;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C142;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C143;10uF;Murata;GRM21BR61A106KE19L;CAP CER 10UF 10V 10% X5R 0805
C144;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C145;10uF;Murata;GRM21BR61A106KE19L;CAP CER 10UF 10V 10% X5R 0805
C146;10uF;Murata;GRM21BR61A106KE19L;CAP CER 10UF 10V 10% X5R 0805
C147;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C148;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C149;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C150;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C151;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C152;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C153;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C154;100nF;Murata;GRM155R61A104KA01D;CAP CER 0.1UF 10V 10% X5R 0402
C155;100pF;Murata;GRM1555C1H101JZ01D;CAP CER 100PF 50V 5% NP0 0402
C156;47pF;Murata;GRM1555C1H470JZ01D;CAP CER 47PF 50V 5% NP0 0402
C157;18pF;Murata;GRM1555C1H180JZ01D;CAP CER 18PF 50V 5% NP0 0402
C158;18pF;Murata;GRM1555C1H180JZ01D;CAP CER 18PF 50V 5% NP0 0402
C159;1uF;Murata;GRM155R61A105ME15D;CAP CER 1UF 10V 20% X5R 0402;DNP
C160;100pF;Murata;GRM1555C1H101JZ01D;CAP CER 100PF 50V 5% NP0 0402
C161;1uF;Taiyo Yuden;LMK105BJ105KV-F;CAP CER 1UF 10V 10% X5R 0402
C162;10nF;Murata;GRM155R71C103KA01D;CAP CER 10000PF 16V 10% X7R 0402
C163;10nF;Murata;GRM155R71C103KA01D;CAP CER 10000PF 16V 10% X7R 0402
C164;DNP;DNP
C165;DNP;DNP
D1;GSG-DIODE-TVS-BI;Murata;LXES15AAA1-100;TVS DIODE ESD .05PF 15KV 0402
D2;USBLED1;Everlight;QTLP601C4TR;LED GREEN STD BRIGHT 0603 SMD
D3;USBLED0;Everlight;QTLP600CYTR;LED YLW SUPER BRIGHT 0606 SMD
D4;LED1;Everlight;QTLP601C4TR;LED GREEN STD BRIGHT 0603 SMD
D5;LED2;Everlight;QTLP600CYTR;LED YLW SUPER BRIGHT 0606 SMD
D6;LED3;Everlight;QTLP601CRTR;LED RED STD BRIGHT 0603 SMD
D7;VCCLED;Everlight;QTLP601C4TR;LED GREEN STD BRIGHT 0603 SMD
D8;1V8LED;Everlight;QTLP600CYTR;LED YLW SUPER BRIGHT 0606 SMD
FB1;FILTER;Murata;BLM21PG221SN1D;FERRITE CHIP 220 OHM 2000MA 0805
FB2;FILTER;Murata;BLM21PG221SN1D;FERRITE CHIP 220 OHM 2000MA 0805
J1;GSG-USB-MICRO-B;FCI;10103594-0001LF;CONN RCPT STD MICRO USB TYPE B
J2;900MHZ-F-ANTENNA;DNP
L1;DNP;DNP
L2;1uH;Taiyo Yuden;BRL1608T1R0M;INDUCTR 1.0UH 650MA 20% 0603 SMD
L3;1uH;Taiyo Yuden;BRL1608T1R0M;INDUCTR 1.0UH 650MA 20% 0603 SMD
L4;DNP;DNP
L5;1uH;Taiyo Yuden;BRL1608T1R0M;INDUCTR 1.0UH 650MA 20% 0603 SMD
L6;DNP;DNP
L7;6.2nH;Taiyo Yuden;HK10056N2S-T;INDUCTOR HIFREQ 6.2+/-0.3NH 0402
L8;DNP;DNP
L9;DNP;DNP
L10;4u7;Taiyo Yuden;NRG4026T4R7M;INDUCTOR 4.7UH 1.6A 20% SMD
L11;4u7;Taiyo Yuden;NRG4026T4R7M;INDUCTOR 4.7UH 1.6A 20% SMD
L12;1uH;Taiyo Yuden;BRL1608T1R0M;INDUCTR 1.0UH 650MA 20% 0603 SMD
L13;INDUCTOR;DNP
L14;INDUCTOR;DNP
P1;1V8;DNP
P2;CLKOUT;TE Connectivity;2081233-1;CONN JACK SMA PCB VERT;DNP
P3;GND;DNP
P4;ANTENNA;TE Connectivity;2081233-1;CONN JACK SMA PCB VERT
P5;WAKEUP;DNP
P6;TRACECLK;DNP
P7;CTIN_4;DNP
P8;VCC;DNP
P9;CTOUT_4;DNP
P10;CTOUT_2;DNP
P11;CTIN_2;DNP
P12;U3_RXD;DNP
P13;U3_TXD;DNP
P14;XCVR_CLKOUT;DNP
P15;INTR;DNP
P16;CLKIN;TE Connectivity;2081233-1;CONN JACK SMA PCB VERT;DNP
P17;CLKIN_JMP;DNP
P18;OEB;DNP
P19;SPIFI;DNP
P20;GPIO;DNP
P21;ANALOG;DNP
P22;I2S;DNP
P23;DBGEN;DNP
P24;TRST;DNP
P25;LPC_ISP;DNP
P26;LPC_JTAG;DNP
P27;CONN_3;DNP
P28;SD;DNP
P29;CPLD_JTAG;DNP
P30;BANK2_AUX;DNP
P31;BANK1_AUX;DNP
P32;CONN_3;DNP
P33;CONN_3;DNP
P34;CONN_3;DNP
P35;GCK0;DNP
P36;VAA;DNP
P37;SCL;DNP
P38;SDA;DNP
P39;SSP1_SCK;DNP
P40;SSP1_MOSI;DNP
P41;SSP1_MISO;DNP
Q1;MOSFET_P;Fairchild;BSS84;MOSFET P-CH 50V 130MA SOT-23
Q2;MOSFET_P;Fairchild;BSS84;MOSFET P-CH 50V 130MA SOT-23
R1;470;Stackpole;RMCF0402JT470R;RES TF 1/16W 470 OHM 5% 0402
R2;470;Stackpole;RMCF0402JT470R;RES TF 1/16W 470 OHM 5% 0402
R3;22k;Panasonic;ERJ-2GEJ223X;RES 22K OHM 1/10W 5% 0402 SMD
R4;51k;Stackpole;RMCF0402FT51K0;RES TF 51K OHM 1% 0.0625W 0402
R5;4k7;Stackpole;RMCF0402JT4K70;RES 4.7K OHM 1/16W 5% 0402 SMD
R6;4k7;Stackpole;RMCF0402JT4K70;RES 4.7K OHM 1/16W 5% 0402 SMD
R7;10k;Stackpole;RMCF0402JT10K0;RES 10K OHM 1/16W 5% 0402 SMD
R8;1k;Stackpole;RMCF0402JT1K00;RES 1K OHM 1/16W 5% 0402 SMD
R9;1k;Stackpole;RMCF0402JT1K00;RES 1K OHM 1/16W 5% 0402 SMD
R10;1k;Stackpole;RMCF0402JT1K00;RES 1K OHM 1/16W 5% 0402 SMD
R11;39;Stackpole;RMCF0402JT39R0;RES 39 OHM 1/16W 5% 0402 SMD
R12;39;Stackpole;RMCF0402JT39R0;RES 39 OHM 1/16W 5% 0402 SMD
R13;1k;Stackpole;RMCF0402JT1K00;RES 1K OHM 1/16W 5% 0402 SMD
R14;4k7;Stackpole;RMCF0402JT4K70;RES 4.7K OHM 1/16W 5% 0402 SMD
R15;4k7;Stackpole;RMCF0402JT4K70;RES 4.7K OHM 1/16W 5% 0402 SMD
R16;4k7;Stackpole;RMCF0402JT4K70;RES 4.7K OHM 1/16W 5% 0402 SMD
R17;4k7;Stackpole;RMCF0402JT4K70;RES 4.7K OHM 1/16W 5% 0402 SMD
R18;47;DNP
R19;47;DNP
R20;0;Stackpole;RMCF0402ZT0R00;RES 0.0 OHM 1/16W 0402 SMD
R21;0;Stackpole;RMCF0402ZT0R00;RES 0.0 OHM 1/16W 0402 SMD
R22;0;Stackpole;RMCF0402ZT0R00;RES 0.0 OHM 1/16W 0402 SMD
R23;0;Stackpole;RMCF0402ZT0R00;RES 0.0 OHM 1/16W 0402 SMD
R24;4k7;Stackpole;RMCF0402JT4K70;RES 4.7K OHM 1/16W 5% 0402 SMD
R25;475;Stackpole;RMCF0402JT470R;RES TF 1/16W 470 OHM 5% 0402
R26;475;Stackpole;RMCF0402JT470R;RES TF 1/16W 470 OHM 5% 0402
R27;1k8;Stackpole;RMCF0402JT1K80;RES TF 1.8K OHM 5% 1/16W 0402
R28;1k8;Stackpole;RMCF0402JT1K80;RES TF 1.8K OHM 5% 1/16W 0402
R29;4k7;Stackpole;RMCF0402JT4K70;RES 4.7K OHM 1/16W 5% 0402 SMD
R30;0;DNP
R31;0;DNP
R32;0;DNP
R33;0;DNP
R34;0;DNP
R35;0;DNP
R36;0;DNP
R37;0;DNP
R38;0;DNP
R39;0;DNP
R40;10k;Stackpole;RMCF0402JT10K0;RES 10K OHM 1/16W 5% 0402 SMD;DNP
R41;4k7;Stackpole;RMCF0402JT4K70;RES 4.7K OHM 1/16W 5% 0402 SMD
R42;10k;Stackpole;RMCF0402JT10K0;RES 10K OHM 1/16W 5% 0402 SMD;DNP
R43;10k;Stackpole;RMCF0402JT10K0;RES 10K OHM 1/16W 5% 0402 SMD;DNP
R44;0;DNP
R45;DNP;DNP
R46;162k;Stackpole;RMCF0402FT162K;RES TF 1/16W 162K OHM 1% 0402
R47;330k;Stackpole;RMCF0402FT330K;RES TF 1/16W 330K OHM 1% 0402
R48;10k;Stackpole;RMCF0402JT10K0;RES 10K OHM 1/16W 5% 0402 SMD
R49;10k;Stackpole;RMCF0402JT10K0;RES 10K OHM 1/16W 5% 0402 SMD
R50;DNP;DNP
R51;10k;Stackpole;RMCF0402JT10K0;RES 10K OHM 1/16W 5% 0402 SMD
R52;10k;Stackpole;RMCF0402JT10K0;RES 10K OHM 1/16W 5% 0402 SMD
R53;DNP;DNP
R54;10k;Stackpole;RMCF0402JT10K0;RES 10K OHM 1/16W 5% 0402 SMD
R55;162k;Stackpole;RMCF0402FT162K;RES TF 1/16W 162K OHM 1% 0402
R56;715k;Stackpole;RMCF0402FT715K;RES TF 1/16W 715K OHM 1% 0402
R57;0;Stackpole;RMCF0402ZT0R00;RES 0.0 OHM 1/16W 0402 SMD
R58;0;Stackpole;RMCF0402ZT0R00;RES 0.0 OHM 1/16W 0402 SMD
R59;10k;Stackpole;RMCF0402JT10K0;RES 10K OHM 1/16W 5% 0402 SMD
R60;0;DNP
R61;0;DNP
R62;0;Stackpole;RMCF0402ZT0R00;RES 0.0 OHM 1/16W 0402 SMD
R63;10k;Stackpole;RMCF0402JT10K0;RES 10K OHM 1/16W 5% 0402 SMD
R64;10k;Stackpole;RMCF0402JT10K0;RES 10K OHM 1/16W 5% 0402 SMD
R65;10k;Stackpole;RMCF0402JT10K0;RES 10K OHM 1/16W 5% 0402 SMD;DNP
R66;10k;Stackpole;RMCF0402JT10K0;RES 10K OHM 1/16W 5% 0402 SMD
R67;10k;Stackpole;RMCF0402JT10K0;RES 10K OHM 1/16W 5% 0402 SMD
R68;10k;Stackpole;RMCF0402JT10K0;RES 10K OHM 1/16W 5% 0402 SMD
R69;12k;Rohm;MCR01MRTF1202;RES 12.0K OHM 1/16W 1% 0402 SMD
R70;470;Stackpole;RMCF0402JT470R;RES TF 1/16W 470 OHM 5% 0402
R71;470;Stackpole;RMCF0402JT470R;RES TF 1/16W 470 OHM 5% 0402
R72;470;Stackpole;RMCF0402JT470R;RES TF 1/16W 470 OHM 5% 0402
R73;470;Stackpole;RMCF0402JT470R;RES TF 1/16W 470 OHM 5% 0402
R74;470;Stackpole;RMCF0402JT470R;RES TF 1/16W 470 OHM 5% 0402
R75;470;Stackpole;RMCF0402JT470R;RES TF 1/16W 470 OHM 5% 0402
R76;470;Stackpole;RMCF0402JT470R;RES TF 1/16W 470 OHM 5% 0402
R77;39;Stackpole;RMCF0402JT39R0;RES 39 OHM 1/16W 5% 0402 SMD
R78;39;Stackpole;RMCF0402JT39R0;RES 39 OHM 1/16W 5% 0402 SMD
R79;39;Stackpole;RMCF0402JT39R0;RES 39 OHM 1/16W 5% 0402 SMD
R80;39;Stackpole;RMCF0402JT39R0;RES 39 OHM 1/16W 5% 0402 SMD
R81;39;Stackpole;RMCF0402JT39R0;RES 39 OHM 1/16W 5% 0402 SMD
R82;10k;Stackpole;RMCF0402JT10K0;RES 10K OHM 1/16W 5% 0402 SMD;DNP
R83;0;DNP
R84;50;DNP
R85;DNP;DNP
R86;39;Stackpole;RMCF0402JT39R0;RES 39 OHM 1/16W 5% 0402 SMD
R87;39;Stackpole;RMCF0402JT39R0;RES 39 OHM 1/16W 5% 0402 SMD
R88;39;Stackpole;RMCF0402JT39R0;RES 39 OHM 1/16W 5% 0402 SMD
R89;39;Stackpole;RMCF0402JT39R0;RES 39 OHM 1/16W 5% 0402 SMD
R90;39;Stackpole;RMCF0402JT39R0;RES 39 OHM 1/16W 5% 0402 SMD
R91;39;Stackpole;RMCF0402JT39R0;RES 39 OHM 1/16W 5% 0402 SMD
R92;50;DNP
R93;10k;Stackpole;RMCF0402JT10K0;RES 10K OHM 1/16W 5% 0402 SMD
R94;39;Stackpole;RMCF0402JT39R0;RES 39 OHM 1/16W 5% 0402 SMD
R96;39;Stackpole;RMCF0402JT39R0;RES 39 OHM 1/16W 5% 0402 SMD
R97;39;Stackpole;RMCF0402JT39R0;RES 39 OHM 1/16W 5% 0402 SMD;DNP
R98;39;Stackpole;RMCF0402JT39R0;RES 39 OHM 1/16W 5% 0402 SMD
R99;39;Stackpole;RMCF0402JT39R0;RES 39 OHM 1/16W 5% 0402 SMD
R100;39;Stackpole;RMCF0402JT39R0;RES 39 OHM 1/16W 5% 0402 SMD
R104;4k7;Stackpole;RMCF0402JT4K70;RES 4.7K OHM 1/16W 5% 0402 SMD
R105;4k7;Stackpole;RMCF0402JT4K70;RES 4.7K OHM 1/16W 5% 0402 SMD
T1;MIX_IN_BALUN;Anaren;B0310J50100AHF;Ultra Low Profile 0805 Balun 50 to 100 ohm Balanced
T2;MIX_OUT_BALUN;Anaren;B0310J50100AHF;Ultra Low Profile 0805 Balun 50 to 100 ohm Balanced
T3;RX_BALUN;Johanson Technology;2500BL14M100T;BALUN CERAMIC CHIP WIMAX 2.5GHZ
T4;TX_BALUN;Johanson Technology;2500BL14M100T;BALUN CERAMIC CHIP WIMAX 2.5GHZ
U1;SKY13350;Skyworks;SKY13350-385LF;0.01-6.0 GHz GaAs SPDT Switch
U2;SKY13350;Skyworks;SKY13350-385LF;0.01-6.0 GHz GaAs SPDT Switch
U3;RX_LOWPASS_FILTER;AVX;LP0603A1880ANTR;FILTER LOW PASS 1880MHZ 0603 SMD
U4;RFFC5072;RFMD;RFFC5072TR7;WIDEBAND SYNTHESIZER/VCO WITH INTEGRATED 6GHz MIXER
U5;SKY13350;Skyworks;SKY13350-385LF;0.01-6.0 GHz GaAs SPDT Switch
U6;SKY13350;Skyworks;SKY13350-385LF;0.01-6.0 GHz GaAs SPDT Switch
U7;SKY13350;Skyworks;SKY13350-385LF;0.01-6.0 GHz GaAs SPDT Switch
U8;RX_HIGHPASS_FILTER;TDK;DEA162400HT-8004B1;FILTER HIGHPASS WLAN&BLUETOOTH
U9;SKY13317;Skyworks;SKY13317-373LF;20 MHz-6.0 GHz pHEMT GaAs SP3T Switch
U10;SKY13350;Skyworks;SKY13350-385LF;0.01-6.0 GHz GaAs SPDT Switch
U11;SKY13350;Skyworks;SKY13350-385LF;0.01-6.0 GHz GaAs SPDT Switch
U12;SKY13317;Skyworks;SKY13317-373LF;20 MHz-6.0 GHz pHEMT GaAs SP3T Switch
U13;MGA-81563;Avago;MGA-81563-TR1G;0.1-6 GHz 3 V, 14 dBm Amplifier
U14;SKY13317;Skyworks;SKY13317-373LF;20 MHz-6.0 GHz pHEMT GaAs SP3T Switch
U15;GSG-74HC04;Texas Instruments;SN74AHC04RGYR;IC HEX INVERTERS 14-QFN
U16;GSG-74HC08;Texas Instruments;SN74AHC08RGYR;IC QUAD 2IN POS-AND GATE 14-QFN
U17;MAX2837;Maxim;MAX2837ETM+;IC TXRX 2.3GHZ-2.7GHZ 48TQFN
U18;MAX5864;Maxim;MAX5864ETM+;IC ANLG FRONT END 22MSPS 48-TQFN
U19;SI5351C;Silicon Laboratories Inc;SI5351C-B-GM;IC CLK GENERATOR 160MHZ 20QFN
U20;W25Q80BV;Winbond;W25Q80BVSSIG;IC FLASH 8MBIT 8SOIC
U21;TPS62410;Texas Instruments;TPS62410DRCR;IC BUCK SYNC DUAL ADJ 0.8A 10SON
U22;GSG-IP4220CZ6;NXP;IP4220CZ6,125;IC USB DUAL ESD PROTECT 6TSOP
U23;LPC43XXFBD144;NXP;LPC4330FBD144,551;IC MCU 32BIT 144LQFP
U24;GSG-XC2C64A-7VQG100C;Xilinx;XC2C64A-7VQG100C;IC CR-II CPLD 64MCELL 100-VQFP
U25;MGA-81563;Avago;MGA-81563-TR1G;0.1-6 GHz 3 V, 14 dBm Amplifier
U26;RF LDO;DNP
X1;GSG-XTAL4PIN;AVX;CX3225GB25000D0HEQZ1;CRYSTAL 25.000MHZ 8PF SMD
X2;MCU_XTAL;TXC;7V-12.000MAAE-T;CRYSTAL 12.000 MHZ 12PF SMD
Can't render this file because it has a wrong number of fields in line 353.

View File

@ -0,0 +1,19 @@
order of copper layers:
Copper 1: Front
Copper 2: Inner3
Copper 3: Inner2
Copper 4: Back
PCB description: 4 layer PCB 0.062 in
Copper 1 0.5 oz foil plated to approximately 0.0017 in
Dielectric 1-2 0.0119 in
Copper 2 1 oz foil (0.0014 in)
Dielectric 2-3 0.0280 in
Copper 3 1 oz foil (0.0014 in)
Dielectric 3-4 0.0119 in
Copper 4 0.5 oz foil plated to approximately 0.0017 in
FR4 or similar substrate with Er=4.5 (+/- 0.1)
double side solder mask black
single side silkscreen white
6 mil min trace width and
6 mil min isolation

View File

@ -0,0 +1,257 @@
G04 (created by PCBNEW (2013-01-23 BZR 3920)-stable) date Mon Jun 10 00:49:26 2013*
%MOIN*%
G04 Gerber Fmt 3.4, Leading zero omitted, Abs format*
%FSLAX34Y34*%
G01*
G70*
G90*
G04 APERTURE LIST*
%ADD10C,2.3622e-06*%
%ADD11C,0.075*%
%ADD12C,0.0691*%
%ADD13C,0.0292*%
%ADD14C,0.029*%
%ADD15R,0.072X0.072*%
%ADD16C,0.072*%
%ADD17C,0.112*%
%ADD18C,0.138*%
%ADD19C,0.0306*%
%ADD20R,0.054X0.054*%
%ADD21C,0.054*%
%ADD22C,0.035*%
G04 APERTURE END LIST*
G54D10*
G54D11*
X70583Y-22169D03*
X68417Y-22169D03*
G54D12*
X70479Y-23339D03*
X68521Y-23339D03*
G54D13*
X44202Y-47702D03*
X43798Y-47702D03*
X43798Y-47298D03*
X44202Y-47298D03*
X40202Y-47702D03*
X39798Y-47702D03*
X39798Y-47298D03*
X40202Y-47298D03*
G54D14*
X51225Y-27025D03*
X51225Y-26431D03*
X51819Y-26431D03*
X51819Y-27025D03*
X51819Y-27619D03*
X51225Y-27619D03*
X50631Y-27619D03*
X50631Y-27025D03*
X50631Y-26431D03*
G54D13*
X38150Y-27200D03*
X37717Y-27200D03*
X37717Y-26767D03*
X38150Y-26767D03*
X38583Y-26767D03*
X38583Y-27200D03*
X38583Y-27633D03*
X38150Y-27633D03*
X37717Y-27633D03*
X46300Y-31600D03*
X46039Y-31339D03*
X46561Y-31339D03*
X46561Y-31861D03*
X46039Y-31861D03*
G54D15*
X59500Y-29000D03*
G54D16*
X60500Y-29000D03*
X59500Y-30000D03*
X60500Y-30000D03*
X59500Y-31000D03*
X60500Y-31000D03*
X59500Y-32000D03*
X60500Y-32000D03*
X59500Y-33000D03*
X60500Y-33000D03*
X59500Y-34000D03*
X60500Y-34000D03*
X59500Y-35000D03*
X60500Y-35000D03*
X59500Y-36000D03*
X60500Y-36000D03*
G54D15*
X66500Y-48500D03*
G54D16*
X66500Y-49500D03*
X65500Y-48500D03*
X65500Y-49500D03*
X64500Y-48500D03*
X64500Y-49500D03*
X63500Y-48500D03*
X63500Y-49500D03*
X62500Y-48500D03*
X62500Y-49500D03*
X61500Y-48500D03*
X61500Y-49500D03*
G54D15*
X78500Y-43500D03*
G54D16*
X77500Y-43500D03*
X78500Y-42500D03*
X77500Y-42500D03*
X78500Y-41500D03*
X77500Y-41500D03*
X78500Y-40500D03*
X77500Y-40500D03*
X78500Y-39500D03*
X77500Y-39500D03*
X78500Y-38500D03*
X77500Y-38500D03*
G54D15*
X78500Y-35500D03*
G54D16*
X77500Y-35500D03*
X78500Y-34500D03*
X77500Y-34500D03*
X78500Y-33500D03*
X77500Y-33500D03*
X78500Y-32500D03*
X77500Y-32500D03*
X78500Y-31500D03*
X77500Y-31500D03*
G54D15*
X50500Y-49500D03*
G54D16*
X50500Y-48500D03*
X51500Y-49500D03*
X51500Y-48500D03*
X52500Y-49500D03*
X52500Y-48500D03*
X53500Y-49500D03*
X53500Y-48500D03*
X54500Y-49500D03*
X54500Y-48500D03*
G54D15*
X76500Y-29000D03*
G54D16*
X76500Y-30000D03*
X75500Y-29000D03*
X75500Y-30000D03*
X74500Y-29000D03*
X74500Y-30000D03*
X73500Y-29000D03*
X73500Y-30000D03*
G54D15*
X78510Y-46500D03*
G54D16*
X78510Y-47500D03*
X77510Y-46500D03*
X77510Y-47500D03*
X76510Y-46500D03*
X76510Y-47500D03*
G54D15*
X69500Y-49500D03*
G54D16*
X70500Y-49500D03*
X71500Y-49500D03*
X72500Y-49500D03*
X73500Y-49500D03*
X74500Y-49500D03*
G54D15*
X47500Y-44500D03*
G54D16*
X47500Y-45500D03*
X47500Y-46500D03*
X47500Y-47500D03*
X47500Y-48500D03*
X47500Y-49500D03*
G54D15*
X63500Y-24000D03*
G54D16*
X64500Y-24000D03*
X65500Y-24000D03*
G54D15*
X63500Y-23000D03*
G54D16*
X64500Y-23000D03*
X65500Y-23000D03*
G54D15*
X63500Y-25000D03*
G54D16*
X64500Y-25000D03*
X65500Y-25000D03*
G54D15*
X63500Y-26000D03*
G54D16*
X64500Y-26000D03*
X65500Y-26000D03*
G54D15*
X67500Y-26000D03*
G54D16*
X67500Y-25000D03*
G54D17*
X43500Y-36500D03*
X42500Y-37500D03*
X44500Y-37500D03*
X44500Y-35500D03*
X42500Y-35500D03*
X35000Y-44500D03*
X36000Y-43500D03*
X34000Y-43500D03*
X34000Y-45500D03*
X36000Y-45500D03*
X43500Y-42500D03*
X42500Y-43500D03*
X44500Y-43500D03*
X44500Y-41500D03*
X42500Y-41500D03*
G54D15*
X54500Y-24000D03*
G54D16*
X54500Y-23000D03*
G54D15*
X77500Y-24000D03*
G54D16*
X77500Y-23000D03*
G54D15*
X77500Y-27000D03*
G54D16*
X77500Y-26000D03*
G54D15*
X42500Y-33500D03*
G54D16*
X43500Y-33500D03*
G54D18*
X26075Y-23075D03*
X80925Y-23075D03*
X80925Y-48925D03*
X26075Y-48925D03*
G54D19*
X52575Y-34275D03*
X52575Y-33625D03*
X53225Y-33625D03*
X53225Y-34275D03*
X53225Y-34925D03*
X52575Y-34925D03*
X51925Y-34925D03*
X51925Y-34275D03*
X51925Y-33625D03*
G54D20*
X63000Y-29900D03*
G54D21*
X63000Y-29400D03*
X63500Y-29900D03*
X63500Y-29400D03*
X64000Y-29900D03*
X64000Y-29400D03*
X64500Y-29900D03*
X64500Y-29400D03*
X65000Y-29900D03*
X65000Y-29400D03*
G54D22*
X73750Y-25000D03*
X73947Y-24705D03*
X73553Y-24705D03*
X73553Y-25295D03*
X73947Y-25295D03*
M02*

View File

@ -0,0 +1,42 @@
G04 (created by PCBNEW (2013-01-23 BZR 3920)-stable) date Mon Jun 10 00:49:26 2013*
%MOIN*%
G04 Gerber Fmt 3.4, Leading zero omitted, Abs format*
%FSLAX34Y34*%
G01*
G70*
G90*
G04 APERTURE LIST*
%ADD10C,2.3622e-06*%
%ADD11C,0.015*%
G04 APERTURE END LIST*
G54D10*
G54D11*
X26075Y-21500D02*
X80975Y-21500D01*
X26075Y-50500D02*
X80925Y-50500D01*
X24500Y-23075D02*
X24500Y-48925D01*
X82500Y-23075D02*
X82500Y-48925D01*
X82500Y-23075D02*
G75*
G03X80925Y-21500I-1575J0D01*
G74*
G01*
X80925Y-50500D02*
G75*
G03X82500Y-48925I0J1575D01*
G74*
G01*
X24500Y-48925D02*
G75*
G03X26075Y-50500I1575J0D01*
G74*
G01*
X26075Y-21500D02*
G75*
G03X24500Y-23075I0J-1575D01*
G74*
G01*
M02*

View File

@ -0,0 +1,715 @@
M48
INCH,TZ
T1C0.013
T2C0.014
T3C0.015
T4C0.016
T5C0.020
T6C0.025
T7C0.028
T8C0.040
T9C0.041
T10C0.047
T11C0.060
T12C0.067
T13C0.126
%
G90
G05
T1
X033650Y-039550
X033650Y-040400
X034350Y-022550
X034550Y-039500
X034740Y-041100
X034750Y-030250
X034780Y-035640
X034850Y-026330
X034900Y-034400
X034900Y-034750
X035010Y-039720
X035150Y-033100
X035420Y-022550
X035600Y-033100
X035660Y-037040
X036000Y-025950
X036000Y-031500
X036050Y-033100
X036050Y-034550
X036090Y-024630
X036100Y-025500
X036280Y-035280
X036370Y-039100
X036450Y-024300
X036620Y-035260
X036690Y-039250
X036800Y-036850
X036810Y-026610
X036810Y-030200
X037200Y-034500
X037250Y-031500
X037330Y-028590
X037340Y-037710
X037340Y-038560
X037430Y-025680
X037750Y-025420
X038100Y-030350
X038150Y-042350
X038550Y-047360
X038560Y-048220
X038600Y-028630
X038850Y-047960
X038930Y-047230
X038970Y-025670
X039000Y-046870
X039010Y-028610
X039020Y-022820
X039220Y-045050
X039240Y-036530
X039260Y-025930
X039270Y-023190
X039400Y-035520
X039590Y-023020
X039670Y-045890
X039880Y-029130
X040160Y-045620
X040230Y-023850
X040250Y-035260
X040390Y-031410
X040410Y-042350
X040570Y-035690
X040580Y-048550
X040600Y-044770
X040730Y-034350
X040740Y-034770
X040750Y-031420
X040970Y-044750
X041100Y-046180
X041260Y-024230
X041280Y-047760
X041410Y-025250
X041450Y-031410
X041600Y-047570
X041710Y-031150
X042000Y-047190
X042200Y-023670
X042340Y-023280
X042370Y-047570
X042870Y-047040
X043098Y-025298
X043100Y-024150
X043130Y-026360
X043390Y-046520
X043870Y-026410
X044130Y-026170
X044620Y-027220
X044680Y-026560
X044700Y-032300
X044780Y-026900
X044950Y-047000
X045050Y-032350
X045310Y-047400
X045330Y-047030
X045670Y-047790
X046000Y-030000
X046030Y-047120
X046350Y-034060
X046450Y-036600
X047350Y-036600
X047650Y-031600
X047650Y-031950
X049575Y-026375
X049975Y-028485
X050200Y-040360
X051180Y-029850
X051180Y-030230
X051620Y-029390
X051670Y-028620
X051670Y-029010
X051800Y-038500
X052025Y-030975
X052525Y-030975
X052750Y-032450
X052825Y-027335
X052895Y-026425
X053025Y-030975
X053525Y-030975
X053850Y-036180
X054060Y-035880
X054075Y-028675
X054320Y-035640
X054575Y-028675
X055075Y-028675
X055575Y-028675
X056340Y-036940
X056460Y-033110
X056460Y-033550
X056630Y-030180
X056960Y-030050
X057340Y-036940
X057520Y-026850
X057550Y-029130
X057690Y-043610
X057760Y-031520
X059030Y-024610
X060080Y-026420
X060220Y-026080
X060320Y-046400
X060650Y-026060
X061140Y-035260
X061210Y-035700
X061310Y-036060
X061560Y-036350
X061710Y-046540
X061800Y-037050
X062020Y-026880
X062060Y-045810
X062120Y-036860
X062280Y-034350
X062330Y-045130
X062500Y-031850
X062700Y-046100
X062720Y-034080
X063630Y-035750
X063630Y-036820
X063630Y-038280
X063660Y-036110
X064010Y-032720
X064030Y-031800
X064180Y-039980
X064320Y-032500
X064420Y-038540
X064580Y-033700
X064580Y-034080
X064940Y-034130
X065020Y-040750
X065060Y-036190
X065330Y-034130
X066210Y-035570
X066370Y-036240
X066610Y-035640
X066650Y-036620
X066660Y-037010
X066960Y-037490
X067190Y-037210
X067280Y-044690
X067290Y-038100
X067390Y-049290
X067440Y-037760
X067610Y-035160
X067610Y-038790
X067660Y-049530
X067710Y-038440
X067930Y-039250
X067940Y-040990
X067970Y-041810
X068040Y-035150
X068220Y-041230
X068240Y-042920
X068460Y-035140
X068480Y-040710
X070100Y-027500
X070210Y-028110
X070400Y-029650
X071190Y-026830
X071380Y-028550
X071590Y-026500
X071740Y-041300
X071830Y-042950
X072250Y-029600
X072270Y-024000
X072560Y-037690
X072830Y-035860
X072990Y-035540
X073110Y-035040
X073430Y-035210
X073553Y-024705
X073553Y-025295
X073720Y-036910
X073740Y-037710
X073750Y-025000
X073947Y-024705
X073947Y-025295
X074880Y-040430
X074930Y-040070
X075050Y-025450
X075270Y-040640
X075500Y-024750
X075610Y-036730
T2
X037717Y-026767
X037717Y-027200
X037717Y-027633
X038150Y-026767
X038150Y-027200
X038150Y-027633
X038583Y-026767
X038583Y-027200
X038583Y-027633
X039798Y-047298
X039798Y-047702
X040202Y-047298
X040202Y-047702
X043798Y-047298
X043798Y-047702
X044202Y-047298
X044202Y-047702
X046039Y-031339
X046039Y-031861
X046300Y-031600
X046561Y-031339
X046561Y-031861
T3
X050631Y-026431
X050631Y-027025
X050631Y-027619
X051225Y-026431
X051225Y-027025
X051225Y-027619
X051819Y-026431
X051819Y-027025
X051819Y-027619
X051925Y-033625
X051925Y-034275
X051925Y-034925
X052575Y-033625
X052575Y-034275
X052575Y-034925
X053225Y-033625
X053225Y-034275
X053225Y-034925
T4
X034850Y-025950
X035000Y-025500
X035100Y-027300
X035300Y-025050
X035630Y-026500
X035630Y-026900
X035630Y-027300
X049275Y-027415
X049470Y-036330
X049565Y-027045
X049625Y-027585
X049820Y-035960
X052325Y-031415
X052685Y-031375
X052945Y-027695
X053525Y-031375
X053525Y-032475
X053925Y-031375
X054325Y-031375
X054725Y-031375
X055125Y-031375
X063910Y-028530
X064500Y-028250
X068750Y-028710
X069490Y-027840
X070790Y-028050
X071190Y-028050
X071600Y-023500
X071600Y-026000
X072450Y-024400
X072560Y-025570
X076450Y-039200
X076450Y-039900
X076450Y-040350
X079830Y-040270
X080690Y-040200
T5
X034680Y-042180
X035140Y-041500
X035650Y-034600
X035890Y-042320
X036450Y-025700
X036640Y-027250
X040650Y-026900
X040650Y-027950
X044300Y-032400
X044850Y-033300
X048415Y-027045
X048425Y-027825
X050615Y-028785
X050725Y-029835
X051005Y-023005
X051145Y-023445
X052275Y-032475
X053985Y-027515
X055750Y-033750
X055750Y-034300
X057400Y-030800
X071350Y-032850
X073750Y-036320
T6
X033070Y-044460
X033150Y-038000
X033190Y-038790
X033190Y-039620
X033290Y-042550
X033500Y-037200
X033610Y-036600
X033640Y-022950
X033700Y-035650
X033750Y-034050
X033750Y-034750
X033800Y-038670
X034160Y-040500
X034900Y-023200
X035230Y-037040
X035250Y-031900
X035250Y-036400
X035400Y-038930
X035800Y-023650
X035850Y-029050
X035940Y-038470
X035970Y-036150
X036070Y-030860
X036510Y-039870
X036560Y-022550
X036600Y-032150
X036600Y-033850
X036850Y-028700
X036980Y-024100
X037000Y-025700
X037200Y-029130
X037450Y-024500
X037550Y-029550
X037600Y-041150
X037750Y-022950
X037760Y-037710
X037950Y-034850
X038010Y-031900
X038050Y-028700
X038100Y-032700
X038100Y-033200
X038100Y-040130
X038150Y-036900
X038150Y-038200
X038150Y-042800
X038890Y-030650
X038890Y-049050
X038900Y-041650
X039250Y-025300
X039550Y-027800
X039570Y-027010
X039710Y-048650
X039750Y-024050
X040050Y-028600
X040100Y-025190
X040280Y-046320
X040490Y-024680
X040650Y-027400
X041450Y-026400
X041750Y-040350
X042000Y-024700
X042200Y-038750
X042500Y-024700
X042890Y-049050
X043000Y-023500
X043500Y-038700
X043710Y-048650
X043940Y-029720
X044260Y-025300
X044300Y-046320
X045000Y-030900
X045090Y-029500
X045250Y-034600
X045650Y-029000
X045660Y-030400
X046450Y-037750
X046500Y-028850
X046600Y-028050
X046730Y-034310
X046950Y-029650
X047300Y-034310
X047350Y-037750
X047400Y-032300
X047650Y-031150
X047690Y-033200
X048125Y-027425
X048340Y-029160
X048450Y-033500
X048500Y-031450
X048650Y-032200
X048800Y-030200
X048800Y-030750
X048800Y-032700
X049000Y-042100
X049225Y-025125
X049525Y-029435
X049580Y-034160
X049580Y-034640
X049625Y-025925
X049800Y-042500
X049935Y-023225
X050200Y-039880
X050225Y-029835
X050450Y-045900
X050450Y-047150
X050600Y-038900
X050795Y-031665
X051020Y-032840
X051075Y-024225
X051075Y-025405
X051300Y-047600
X051400Y-046300
X051460Y-041280
X051505Y-031265
X051525Y-032465
X052215Y-023225
X052275Y-024225
X052275Y-025415
X052430Y-039990
X052700Y-047600
X052800Y-046400
X053130Y-037260
X053140Y-036100
X053635Y-025975
X053635Y-028125
X053810Y-045010
X053860Y-036890
X054400Y-035100
X054450Y-036150
X054500Y-034300
X054570Y-033380
X055180Y-045010
X055200Y-032800
X055600Y-035100
X055600Y-038600
X055800Y-024400
X055950Y-037790
X056150Y-024900
X056300Y-025800
X057150Y-026100
X057200Y-022200
X057400Y-024900
X057500Y-039850
X057850Y-042700
X057900Y-043200
X058050Y-040400
X058400Y-039500
X058600Y-022900
X061400Y-023300
X061400Y-024300
X061400Y-025300
X061400Y-026300
X062500Y-033000
X062900Y-033550
X063500Y-027740
X063800Y-035350
X063800Y-038900
X064050Y-037540
X064550Y-040800
X064990Y-031000
X065000Y-038900
X065000Y-041250
X065030Y-035270
X065550Y-033250
X066310Y-035140
X066350Y-033100
X066640Y-030840
X067000Y-043190
X067350Y-029600
X067540Y-043020
X067540Y-044230
X067900Y-029100
X068750Y-031650
X068750Y-032850
X068800Y-023950
X069100Y-034300
X069250Y-031650
X069650Y-024150
X069700Y-048250
X069900Y-034300
X070350Y-031690
X070378Y-032904
X070700Y-043000
X070700Y-044200
X071000Y-045300
X071000Y-046100
X071200Y-030040
X071800Y-024000
X071850Y-030550
X072250Y-033000
X072500Y-031100
X072770Y-034260
X072800Y-045050
X072810Y-032920
X072900Y-023500
X072900Y-026500
X072950Y-031900
X073250Y-043000
X073250Y-044200
X073350Y-022350
X073350Y-027650
X073550Y-032200
X073700Y-048250
X074040Y-031190
X074900Y-025000
X074960Y-041560
X075000Y-035150
X075000Y-035950
X075000Y-037100
X075000Y-037900
X075000Y-041050
X076000Y-033150
X076200Y-031100
X076200Y-035150
X076200Y-035950
X076200Y-037100
X076200Y-037900
X076200Y-041050
X076750Y-025000
X078150Y-037100
X079330Y-039490
X080400Y-043600
X081250Y-043200
T7
X063000Y-029400
X063000Y-029900
X063500Y-029400
X063500Y-029900
X064000Y-029400
X064000Y-029900
X064500Y-029400
X064500Y-029900
X065000Y-029400
X065000Y-029900
T8
X042500Y-033500
X043500Y-033500
X047500Y-044500
X047500Y-045500
X047500Y-046500
X047500Y-047500
X047500Y-048500
X047500Y-049500
X050500Y-048500
X050500Y-049500
X051500Y-048500
X051500Y-049500
X052500Y-048500
X052500Y-049500
X053500Y-048500
X053500Y-049500
X054500Y-023000
X054500Y-024000
X054500Y-048500
X054500Y-049500
X059500Y-029000
X059500Y-030000
X059500Y-031000
X059500Y-032000
X059500Y-033000
X059500Y-034000
X059500Y-035000
X059500Y-036000
X060500Y-029000
X060500Y-030000
X060500Y-031000
X060500Y-032000
X060500Y-033000
X060500Y-034000
X060500Y-035000
X060500Y-036000
X061500Y-048500
X061500Y-049500
X062500Y-048500
X062500Y-049500
X063500Y-023000
X063500Y-024000
X063500Y-025000
X063500Y-026000
X063500Y-048500
X063500Y-049500
X064500Y-023000
X064500Y-024000
X064500Y-025000
X064500Y-026000
X064500Y-048500
X064500Y-049500
X065500Y-023000
X065500Y-024000
X065500Y-025000
X065500Y-026000
X065500Y-048500
X065500Y-049500
X066500Y-048500
X066500Y-049500
X067500Y-025000
X067500Y-026000
X069500Y-049500
X070500Y-049500
X071500Y-049500
X072500Y-049500
X073500Y-029000
X073500Y-030000
X073500Y-049500
X074500Y-029000
X074500Y-030000
X074500Y-049500
X075500Y-029000
X075500Y-030000
X076500Y-029000
X076500Y-030000
X076510Y-046500
X076510Y-047500
X077500Y-023000
X077500Y-024000
X077500Y-026000
X077500Y-027000
X077500Y-031500
X077500Y-032500
X077500Y-033500
X077500Y-034500
X077500Y-035500
X077500Y-038500
X077500Y-039500
X077500Y-040500
X077500Y-041500
X077500Y-042500
X077500Y-043500
X077510Y-046500
X077510Y-047500
X078500Y-031500
X078500Y-032500
X078500Y-033500
X078500Y-034500
X078500Y-035500
X078500Y-038500
X078500Y-039500
X078500Y-040500
X078500Y-041500
X078500Y-042500
X078500Y-043500
X078510Y-046500
X078510Y-047500
T9
X068521Y-023339
X070479Y-023339
T10
X068417Y-022169
X070583Y-022169
T11
X035000Y-044500
X043500Y-036500
X043500Y-042500
T12
X034000Y-043500
X034000Y-045500
X036000Y-043500
X036000Y-045500
X042500Y-035500
X042500Y-037500
X042500Y-041500
X042500Y-043500
X044500Y-035500
X044500Y-037500
X044500Y-041500
X044500Y-043500
T13
X026075Y-023075
X026075Y-048925
X080925Y-023075
X080925Y-048925
T0
M30

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 434 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 651 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 372 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

View File

@ -0,0 +1,185 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg3324"
version="1.1"
inkscape:version="0.48.3.1 r9886"
width="992.5"
height="743.75"
xml:space="preserve"
sodipodi:docname="Day2-04.HackRF A Low Cost Software Defined Radio Platform by Benjamin Vernoux.pdf"><metadata
id="metadata3330"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs3328"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3338"><path
d="m 0,-0.2 793.6,0 0,595.2 L 0,595 0,-0.2 z"
clip-rule="evenodd"
id="path3340" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3438"><path
d="m 397,81 0,0 0,433.1 0,0 0,-433.1 z"
id="path3440" /></clipPath></defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="953"
inkscape:window-height="745"
id="namedview3326"
showgrid="false"
inkscape:zoom="0.31731092"
inkscape:cx="496.25"
inkscape:cy="371.875"
inkscape:window-x="0"
inkscape:window-y="19"
inkscape:window-maximized="0"
inkscape:current-layer="g3332" /><g
id="g3332"
inkscape:groupmode="layer"
inkscape:label="Day2-04.HackRF A Low Cost Software Defined Radio Platform by Benjamin Vernoux"
transform="matrix(1.25,0,0,-1.25,0,743.75)"><g
id="g3334"><g
id="g3336"
clip-path="url(#clipPath3338)"><path
d="m 0,595 793.7,0 0,-595.2 L 0,-0.2 0,595 z"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path3342" /><g
id="g3344" /><g
id="g3350"><text
transform="matrix(1,0,0,-1,46.8,497.9)"
id="text3352"><tspan
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Arial;font-variant:normal;font-weight:900;font-size:60;writing-mode:lr;-inkscape-font-specification:Arial-Black"
x="0 50.04 89.94 128.82 168.78 215.4 255.36 275.4 322.02 342.06 381.96 402 428.58 468.54 488.52 508.56 551.88 578.46 619.32 659.28"
y="0"
sodipodi:role="line"
id="tspan3354">HackRF Digital Stage</tspan></text>
</g><path
d="m 37.4,443.7 c 0,12.7 19.1,25.4 38.2,25.4 l 249,0 c 19.1,0 38.3,-12.7 38.3,-25.4 l 0,-165.2 c 0,-12.7 -19.2,-25.4 -38.3,-25.4 l -249,0 c -19.1,0 -38.2,12.7 -38.2,25.4 l 0,165.2 z"
style="fill:#99ccff;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path3356" /><g
id="g3358"><path
d="m 37.4,443.7 c 0,12.7 19.1,25.4 38.2,25.4 l 249,0 c 19.1,0 38.3,-12.7 38.3,-25.4 l 0,-165.2 c 0,-12.7 -19.2,-25.4 -38.3,-25.4 l -249,0 c -19.1,0 -38.2,12.7 -38.2,25.4 l 0,165.2 z"
style="fill:none;stroke:none"
id="path3360" /></g><g
id="g3362"><path
d="m 37.4,469.1 0,0 z"
style="fill:none;stroke:none"
id="path3364" /></g><g
id="g3366"><path
d="m 362.9,253.1 0,0 z"
style="fill:none;stroke:none"
id="path3368" /></g><g
id="g3370"><text
transform="matrix(1,0,0,-1,76,404.3)"
id="text3372"><tspan
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Arial;font-variant:normal;font-weight:900;font-size:48;writing-mode:lr;-inkscape-font-specification:Arial-Black"
x="0 45.36 82.656 119.952 151.92 183.984 215.952"
y="0"
sodipodi:role="line"
id="tspan3374">MAX5864</tspan></text>
</g><g
id="g3376"><text
transform="matrix(1,0,0,-1,92.7,340.9)"
id="text3378"><tspan
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Arial;font-variant:normal;font-weight:900;font-size:44;writing-mode:lr;-inkscape-font-specification:Arial-Black"
x="0 34.276 68.376 102.652 114.84 147.136 180.444"
y="0"
sodipodi:role="line"
id="tspan3380">ADC/DAC</tspan></text>
</g><g
id="g3382"><text
transform="matrix(1,0,0,-1,47.1,278.8)"
id="text3384"><tspan
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Arial;font-variant:normal;font-weight:900;font-size:44;writing-mode:lr;-inkscape-font-specification:Arial-Black"
x="0 36.652 66.088 80.696 100.232 129.58 144.188 173.536 202.884 244.376 281.028"
y="0"
sodipodi:role="line"
id="tspan3386">Up to 22MHz</tspan></text>
</g><path
d="m 457.6,443.7 c 0,12.7 16.9,25.4 33.8,25.4 l 220.5,0 c 16.9,0 33.9,-12.7 33.9,-25.4 l 0,-165.2 c 0,-12.7 -17,-25.4 -33.9,-25.4 l -220.5,0 c -16.9,0 -33.8,12.7 -33.8,25.4 l 0,165.2 z"
style="fill:#99ccff;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path3388" /><g
id="g3390"><path
d="m 457.6,443.7 c 0,12.7 16.9,25.4 33.8,25.4 l 220.5,0 c 16.9,0 33.9,-12.7 33.9,-25.4 l 0,-165.2 c 0,-12.7 -17,-25.4 -33.9,-25.4 l -220.5,0 c -16.9,0 -33.8,12.7 -33.8,25.4 l 0,165.2 z"
style="fill:none;stroke:none"
id="path3392" /></g><g
id="g3394"><path
d="m 457.6,469.1 0,0 z"
style="fill:none;stroke:none"
id="path3396" /></g><g
id="g3398"><path
d="m 745.8,253.1 0,0 z"
style="fill:none;stroke:none"
id="path3400" /></g><g
id="g3402"><text
transform="matrix(1,0,0,-1,545.7,376)"
id="text3404"><tspan
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Arial;font-variant:normal;font-weight:900;font-size:48;writing-mode:lr;-inkscape-font-specification:Arial-Black"
x="0 39.888 77.184"
y="0"
sodipodi:role="line"
id="tspan3406">NXP</tspan></text>
</g><g
id="g3408"><text
transform="matrix(1,0,0,-1,485.5,308.3)"
id="text3410"><tspan
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Arial;font-variant:normal;font-weight:900;font-size:48;writing-mode:lr;-inkscape-font-specification:Arial-Black"
x="0 32.064 66.72 104.016 135.984 168.048 200.016"
y="0"
sodipodi:role="line"
id="tspan3412">LPC43xx</tspan></text>
</g><g
id="g3414"><path
d="m 429.9,361.1 -39.4,0"
style="fill:none;stroke:#000000;stroke-opacity:1;stroke-width:7.07499;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none"
id="path3416" /></g><path
d="m 457.6,361.1 -28.9,9.6 0,-19.3 28.9,9.7 z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path3418" /><path
d="m 362.8,361.1 28.9,-9.7 0,19.3 -28.9,-9.6 z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path3420" /><text
transform="matrix(1,0,0,-1,49,181.9)"
id="text3422"><tspan
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Arial;font-variant:normal;font-weight:900;font-size:48;writing-mode:lr;-inkscape-font-specification:Arial-Black"
x="0 45.264 77.328 109.296 125.28 173.28 205.248 253.248 269.232 301.2 333.264 378.528 418.512 445.104 461.088 498.384 535.68 572.976 586.32 621.504 657.984 695.28"
y="0"
sodipodi:role="line"
id="tspan3424">Maximum 20MHz ADC/DAC </tspan></text>
<text
transform="matrix(1,0,0,-1,142.3,114.2)"
id="text3426"><tspan
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Arial;font-variant:normal;font-weight:900;font-size:48;writing-mode:lr;-inkscape-font-specification:Arial-Black"
x="0 15.888 31.872 79.872 95.76 117.12 149.088 181.152 197.136 229.104 258.384 274.272 314.256 348.912 386.208 418.176 434.16 474.144"
y="0"
sodipodi:role="line"
id="tspan3428">limited by USB2 HS</tspan></text>
<text
transform="matrix(1,0,0,-1,192.5,46.5)"
id="text3430"><tspan
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;font-family:Arial;font-variant:normal;font-weight:900;font-size:48;writing-mode:lr;-inkscape-font-specification:Arial-Black"
x="0 18.672 51.216 83.184 115.152 147.216 168.48 184.464 216.432 248.496 293.76 309.744 347.04 360.336 389.616"
y="0"
sodipodi:role="line"
id="tspan3432">(about 40MiB/s)</tspan></text>
</g></g><g
id="g3434"><g
id="g3436" /><g
id="g3442"><g
clip-path="url(#clipPath3438)"
opacity="0.5"
id="g3444" /></g></g></g></svg>

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 62 KiB

View File

@ -0,0 +1,29 @@
# Copyright 2012 Jared Boone <jared@sharebrained.com>
#
# This file is part of HackRF.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; see the file COPYING. If not, write to
# the Free Software Foundation, Inc., 51 Franklin Street,
# Boston, MA 02110-1301, USA.
#
# Top directory CMake project for HackRF firmware
cmake_minimum_required(VERSION 3.1.3)
set(CMAKE_TOOLCHAIN_FILE toolchain-arm-cortex-m.cmake)
project (hackrf_firmware_all C)
add_subdirectory(blinky)
add_subdirectory(hackrf_usb)

View File

@ -0,0 +1,50 @@
The primary firmware source code for USB HackRF devices is hackrf_usb. Most of
the other directories contain firmware source code for test and development.
The common directory contains source code shared by multiple HackRF firmware
projects. The cpld directory contains HDL source for the CPLD.
The firmware is set up for compilation with the GCC toolchain available here:
https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads
Required dependency:
https://github.com/mossmann/libopencm3
If you are using git, the preferred way to install libopencm3 is to use the
submodule:
$ cd ..
$ git submodule init
$ git submodule update
To build and install a standard firmware image for HackRF One:
$ cd hackrf_usb
$ mkdir build
$ cd build
$ cmake ..
$ make
$ hackrf_spiflash -w hackrf_usb.bin
If you have a Jawbreaker, add -DBOARD=JAWBREAKER to the cmake command.
If you have a rad1o, use -DBOARD=RAD1O instead.
It is possible to use a USB Device Firmware Upgrade (DFU) method to load
firmware into RAM. This is normally only required to recover a device that has
had faulty firmware loaded, but it can also be useful for firmware developers.
For loading firmware into RAM with DFU you will need:
http://dfu-util.sourceforge.net/
To start up HackRF One in DFU mode, hold down the DFU button while powering it
on or while pressing and releasing the RESET button. Release the DFU button
after the 3V3 LED illuminates.
A .dfu file is built by default when building firmware. Alternatively you can
use a known good .dfu file from a release package. Load the firmware into RAM
with:
$ dfu-util --device 1fc9:000c --alt 0 --download hackrf_usb.dfu

View File

@ -0,0 +1,14 @@
#!/bin/sh
/usr/bin/env python -m ensurepip
/usr/bin/env python -m pip install pyyaml
cd firmware/libopencm3
export SRCLIBDIR='c:\projects\hackrf\firmware\libopencm3\lib\'
make lib/lpc43xx/m0
make lib/lpc43xx/m4
cd ..
mkdir build-hackrf-one
cd build-hackrf-one
cmake -G "Unix Makefiles" ..
make VERBOSE=1

View File

@ -0,0 +1,33 @@
# Copyright 2012 Michael Ossmann <mike@ossmann.com>
# Copyright 2012 Jared Boone <jared@sharebrained.com>
#
# This file is part of HackRF.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; see the file COPYING. If not, write to
# the Free Software Foundation, Inc., 51 Franklin Street,
# Boston, MA 02110-1301, USA.
#
cmake_minimum_required(VERSION 3.1.3)
set(CMAKE_TOOLCHAIN_FILE ../toolchain-arm-cortex-m.cmake)
project(blinky C)
include(../hackrf-common.cmake)
set(SRC_M4
blinky.c
)
DeclareTargets()

View File

@ -0,0 +1 @@
This is the simplest example firmware for HackRF. It flashes three LEDs.

View File

@ -0,0 +1,48 @@
/*
* Copyright 2010 - 2012 Michael Ossmann
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#include "hackrf_core.h"
int main(void)
{
pin_setup();
/* enable all power supplies */
enable_1v8_power();
/* Blink LED1/2/3 on the board. */
while (1)
{
led_on(LED1);
led_on(LED2);
led_on(LED3);
delay(2000000);
led_off(LED1);
led_off(LED2);
led_off(LED3);
delay(2000000);
}
return 0;
}

View File

@ -0,0 +1,34 @@
/*
* Copyright 2012 Michael Ossmann <mike@ossmann.com>
* Copyright 2012 Jared Boone <jared@sharebrained.com>
*
* This file is part of HackRF
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
/* Linker script for HackRF One (LPC4320, 1M SPI flash, 200K SRAM). */
MEMORY
{
/* rom is really the shadow region that points to SPI flash or elsewhere */
rom (rx) : ORIGIN = 0x00000000, LENGTH = 96K
ram_local1 (rwx) : ORIGIN = 0x10000000, LENGTH = 96K
ram_local2 (rwx) : ORIGIN = 0x10080000, LENGTH = 32K
ram_sleep (rwx) : ORIGIN = 0x10088000, LENGTH = 8K
}
INCLUDE LPC43xx_M4_memory.ld

View File

@ -0,0 +1,34 @@
/*
* Copyright 2012 Michael Ossmann <mike@ossmann.com>
* Copyright 2012 Jared Boone <jared@sharebrained.com>
*
* This file is part of HackRF
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
/* Linker script for Rad1o badge - (LPC4330, 1M SPI flash, 264K SRAM). */
MEMORY
{
/* rom is really the shadow region that points to SPI flash or elsewhere */
rom (rx) : ORIGIN = 0x00000000, LENGTH = 128K
ram_local1 (rwx) : ORIGIN = 0x10000000, LENGTH = 128K
ram_local2 (rwx) : ORIGIN = 0x10080000, LENGTH = 64K
ram_sleep (rwx) : ORIGIN = 0x10090000, LENGTH = 8K
}
INCLUDE LPC43xx_M4_memory.ld

View File

@ -0,0 +1,26 @@
/*
* Copyright 2012 Michael Ossmann <mike@ossmann.com>
* Copyright 2012 Jared Boone <jared@sharebrained.com>
*
* This file is part of HackRF
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
MEMORY
{
ram (rwx) : ORIGIN = 0x00000000, LENGTH = 28K
}

View File

@ -0,0 +1,31 @@
/*
* Copyright 2012 Michael Ossmann <mike@ossmann.com>
* Copyright 2012 Jared Boone <jared@sharebrained.com>
*
* This file is part of HackRF
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
SECTIONS
{
.text : {
PROVIDE(__m0_start__ = .);
KEEP(*(.m0_bin*));
. = ALIGN(4);
PROVIDE(__m0_end__ = .);
} >rom
}

View File

@ -0,0 +1,39 @@
/*
* Copyright 2012 Michael Ossmann <mike@ossmann.com>
* Copyright 2012 Jared Boone <jared@sharebrained.com>
*
* This file is part of HackRF
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
MEMORY
{
/* Physical address in Flash used to copy Code from Flash to RAM */
rom_flash (rx) : ORIGIN = 0x80000000, LENGTH = 1M
ram_m0 (rwx) : ORIGIN = 0x20000000, LENGTH = 28K
ram_shared (rwx) : ORIGIN = 0x20007000, LENGTH = 4K
ram_usb (rwx) : ORIGIN = 0x20008000, LENGTH = 32K
/* ram_usb: USB buffer. Straddles two blocks of RAM
* to get performance benefit of having two USB buffers addressable
* simultaneously (on two different buses of the AHB multilayer matrix)
*/
}
usb_bulk_buffer = ORIGIN(ram_usb);
usb_bulk_buffer_offset = ORIGIN(ram_shared);
usb_bulk_buffer_tx = ORIGIN(ram_shared)+4;
PROVIDE(__ram_m0_start__ = ORIGIN(ram_m0));

View File

@ -0,0 +1,2 @@
This directory contains things shared by multiple HackRF firmware
implementations.

View File

@ -0,0 +1,45 @@
/*
* Copyright 2012 Jared Boone <jared@sharebrained.com>
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#include "bitband.h"
volatile uint32_t* peripheral_bitband_address(volatile void* const address, const uint_fast8_t bit_number) {
const uint32_t bit_band_base = 0x42000000;
const uint32_t byte_offset = (uint32_t)address - 0x40000000;
const uint32_t bit_word_offset = (byte_offset * 32) + (bit_number * 4);
const uint32_t bit_word_address = bit_band_base + bit_word_offset;
return (volatile uint32_t*)bit_word_address;
}
void peripheral_bitband_set(volatile void* const peripheral_address, const uint_fast8_t bit_number) {
volatile uint32_t* const bitband_address = peripheral_bitband_address(peripheral_address, bit_number);
*bitband_address = 1;
}
void peripheral_bitband_clear(volatile void* const peripheral_address, const uint_fast8_t bit_number) {
volatile uint32_t* const bitband_address = peripheral_bitband_address(peripheral_address, bit_number);
*bitband_address = 0;
}
uint32_t peripheral_bitband_get(volatile void* const peripheral_address, const uint_fast8_t bit_number) {
volatile uint32_t* const bitband_address = peripheral_bitband_address(peripheral_address, bit_number);
return *bitband_address;
}

View File

@ -0,0 +1,32 @@
/*
* Copyright 2012 Jared Boone <jared@sharebrained.com>
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#ifndef __BITBAND_H__
#define __BITBAND_H__
#include <stdint.h>
volatile uint32_t* peripheral_bitband_address(volatile void* const address, const uint_fast8_t bit_number);
void peripheral_bitband_set(volatile void* const peripheral_address, const uint_fast8_t bit_number);
void peripheral_bitband_clear(volatile void* const peripheral_address, const uint_fast8_t bit_number);
uint32_t peripheral_bitband_get(volatile void* const peripheral_address, const uint_fast8_t bit_number);
#endif//__BITBAND_H__

View File

@ -0,0 +1,101 @@
/*
* Copyright 2013 Michael Ossmann <mike@ossmann.com>
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#include "cpld_jtag.h"
#include "hackrf_core.h"
#include "xapp058/micro.h"
#include <libopencm3/lpc43xx/scu.h>
#include <stdint.h>
static refill_buffer_cb refill_buffer;
static uint32_t xsvf_buffer_len, xsvf_pos;
static unsigned char* xsvf_buffer;
void cpld_jtag_take(jtag_t* const jtag) {
const jtag_gpio_t* const gpio = jtag->gpio;
/* Set initial GPIO state to the voltages of the internal or external pull-ups/downs,
* to avoid any glitches.
*/
#ifdef HACKRF_ONE
gpio_set(gpio->gpio_pp_tms);
#endif
gpio_set(gpio->gpio_tms);
gpio_set(gpio->gpio_tdi);
gpio_clear(gpio->gpio_tck);
#ifdef HACKRF_ONE
/* Do not drive PortaPack-specific TMS pin initially, just to be cautious. */
gpio_input(gpio->gpio_pp_tms);
gpio_input(gpio->gpio_pp_tdo);
#endif
gpio_output(gpio->gpio_tms);
gpio_output(gpio->gpio_tdi);
gpio_output(gpio->gpio_tck);
gpio_input(gpio->gpio_tdo);
}
void cpld_jtag_release(jtag_t* const jtag) {
const jtag_gpio_t* const gpio = jtag->gpio;
/* Make all pins inputs when JTAG interface not active.
* Let the pull-ups/downs do the work.
*/
#ifdef HACKRF_ONE
/* Do not drive PortaPack-specific pins, initially, just to be cautious. */
gpio_input(gpio->gpio_pp_tms);
gpio_input(gpio->gpio_pp_tdo);
#endif
gpio_input(gpio->gpio_tms);
gpio_input(gpio->gpio_tdi);
gpio_input(gpio->gpio_tck);
gpio_input(gpio->gpio_tdo);
}
/* return 0 if success else return error code see xsvfExecute() */
int cpld_jtag_program(
jtag_t* const jtag,
const uint32_t buffer_length,
unsigned char* const buffer,
refill_buffer_cb refill
) {
int error;
cpld_jtag_take(jtag);
xsvf_buffer = buffer;
xsvf_buffer_len = buffer_length;
refill_buffer = refill;
error = xsvfExecute(jtag->gpio);
cpld_jtag_release(jtag);
return error;
}
/* this gets called by the XAPP058 code */
unsigned char cpld_jtag_get_next_byte(void) {
if (xsvf_pos == xsvf_buffer_len) {
refill_buffer();
xsvf_pos = 0;
}
unsigned char byte = xsvf_buffer[xsvf_pos];
xsvf_pos++;
return byte;
}

View File

@ -0,0 +1,62 @@
/*
* Copyright 2013 Michael Ossmann <mike@ossmann.com>
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#ifndef __CPLD_JTAG_H__
#define __CPLD_JTAG_H__
#include <stdint.h>
#include "gpio.h"
typedef struct jtag_gpio_t {
gpio_t gpio_tms;
gpio_t gpio_tck;
gpio_t gpio_tdi;
gpio_t gpio_tdo;
#ifdef HACKRF_ONE
gpio_t gpio_pp_tms;
gpio_t gpio_pp_tdo;
#endif
} jtag_gpio_t;
typedef struct jtag_t {
jtag_gpio_t* const gpio;
} jtag_t;
typedef void (*refill_buffer_cb)(void);
void cpld_jtag_take(jtag_t* const jtag);
void cpld_jtag_release(jtag_t* const jtag);
/* Return 0 if success else return error code see xsvfExecute() see micro.h.
*
* We expect the buffer to be initially full of data. After the entire
* contents of the buffer has been streamed to the CPLD the given
* refill_buffer callback will be called. */
int cpld_jtag_program(
jtag_t* const jtag,
const uint32_t buffer_length,
unsigned char* const buffer,
refill_buffer_cb refill
);
unsigned char cpld_jtag_get_next_byte(void);
#endif//__CPLD_JTAG_H__

View File

@ -0,0 +1,418 @@
/*
* Copyright 2019 Jared Boone <jared@sharebrained.com>
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#include "cpld_xc2c.h"
#include "crc.h"
#include <stddef.h>
#include <string.h>
typedef enum {
CPLD_XC2C_IR_INTEST = 0b00000010,
CPLD_XC2C_IR_BYPASS = 0b11111111,
CPLD_XC2C_IR_SAMPLE = 0b00000011,
CPLD_XC2C_IR_EXTEST = 0b00000000,
CPLD_XC2C_IR_IDCODE = 0b00000001,
CPLD_XC2C_IR_USERCODE = 0b11111101,
CPLD_XC2C_IR_HIGHZ = 0b11111100,
CPLD_XC2C_IR_ISC_ENABLE_CLAMP = 0b11101001,
CPLD_XC2C_IR_ISC_ENABLE_OTF = 0b11100100,
CPLD_XC2C_IR_ISC_ENABLE = 0b11101000,
CPLD_XC2C_IR_ISC_SRAM_READ = 0b11100111,
CPLD_XC2C_IR_ISC_WRITE = 0b11100110,
CPLD_XC2C_IR_ISC_ERASE = 0b11101101,
CPLD_XC2C_IR_ISC_PROGRAM = 0b11101010,
CPLD_XC2C_IR_ISC_READ = 0b11101110,
CPLD_XC2C_IR_ISC_INIT = 0b11110000,
CPLD_XC2C_IR_ISC_DISABLE = 0b11000000,
CPLD_XC2C_IR_TEST_ENABLE = 0b00010001,
CPLD_XC2C_IR_BULKPROG = 0b00010010,
CPLD_XC2C_IR_ERASE_ALL = 0b00010100,
CPLD_XC2C_IR_MVERIFY = 0b00010011,
CPLD_XC2C_IR_TEST_DISABLE = 0b00010101,
CPLD_XC2C_IR_STCTEST = 0b00010110,
CPLD_XC2C_IR_ISC_NOOP = 0b11100000,
} cpld_xc2c_ir_t;
static bool cpld_xc2c_jtag_clock(const jtag_t* const jtag, const uint32_t tms, const uint32_t tdi) {
// 8 ns TMS/TDI to TCK setup
gpio_write(jtag->gpio->gpio_tdi, tdi);
gpio_write(jtag->gpio->gpio_tms, tms);
// 20 ns TCK high time
__asm__("nop");
__asm__("nop");
__asm__("nop");
__asm__("nop");
__asm__("nop");
gpio_clear(jtag->gpio->gpio_tck);
// 25 ns TCK falling edge to TDO valid
// 20 ns TCK low time
__asm__("nop");
__asm__("nop");
__asm__("nop");
__asm__("nop");
__asm__("nop");
__asm__("nop");
__asm__("nop");
gpio_set(jtag->gpio->gpio_tck);
// 15 ns TCK to TMS/TDI hold time
__asm__("nop");
__asm__("nop");
__asm__("nop");
__asm__("nop");
return gpio_read(jtag->gpio->gpio_tdo);
}
static void cpld_xc2c_jtag_shift_ptr_tms(const jtag_t* const jtag, uint8_t* const tdi_tdo, const size_t start, const size_t end, const bool tms) {
for(size_t i=start; i<end; i++) {
const size_t byte_n = i >> 3;
const size_t bit_n = i & 7;
const uint32_t mask = (1U << bit_n);
const uint32_t tdo = cpld_xc2c_jtag_clock(jtag, tms, tdi_tdo[byte_n] & mask) ? 1 : 0;
tdi_tdo[byte_n] &= ~mask;
tdi_tdo[byte_n] |= (tdo << bit_n);
}
}
static void cpld_xc2c_jtag_shift_ptr(const jtag_t* const jtag, uint8_t* const tdi_tdo, const size_t count) {
if( count > 0 ) {
cpld_xc2c_jtag_shift_ptr_tms(jtag, tdi_tdo, 0, count - 1, false);
cpld_xc2c_jtag_shift_ptr_tms(jtag, tdi_tdo, count - 1, count, true);
}
}
static uint32_t cpld_xc2c_jtag_shift_u32(const jtag_t* const jtag, const uint32_t tms, const uint32_t tdi, const size_t count) {
uint32_t tdo = 0;
for(size_t i=0; i<count; i++) {
const uint32_t mask = (1U << i);
tdo |= cpld_xc2c_jtag_clock(jtag, tms & mask, tdi & mask) << i;
}
return tdo;
}
static void cpld_xc2c_jtag_clocks(const jtag_t* const jtag, const size_t count) {
for(size_t i=0; i<count; i++) {
cpld_xc2c_jtag_clock(jtag, 0, 0);
}
}
static void cpld_xc2c_jtag_pause(const jtag_t* const jtag, const size_t count) {
for(size_t i=0; i<count; i++) {
cpld_xc2c_jtag_clock(jtag, (i == (count - 1)), 0);
}
}
static void cpld_xc2c_jtag_shift_dr_ir(const jtag_t* const jtag, uint8_t* const tdi_tdo, const size_t bit_count, const size_t pause_count) {
/* Run-Test/Idle or Select-DR-Scan -> Shift-DR or Shift-IR */
cpld_xc2c_jtag_shift_u32(jtag, 0b001, 0b000, 3);
/* Shift-[DI]R -> Exit1-[DI]R */
cpld_xc2c_jtag_shift_ptr(jtag, tdi_tdo, bit_count);
if( pause_count ) {
/* Exit1-[DI]R -> Pause-[DI]R */
cpld_xc2c_jtag_shift_u32(jtag, 0b0, 0, 1);
/* Pause-[DI]R -> Exit2-[DI]R */
cpld_xc2c_jtag_pause(jtag, pause_count);
}
/* Exit1-[DI]R or Exit2-[DI]R -> Run-Test/Idle */
cpld_xc2c_jtag_shift_u32(jtag, 0b01, 0, 2);
}
static void cpld_xc2c_jtag_shift_dr(const jtag_t* const jtag, uint8_t* const tdi_tdo, const size_t bit_count, const size_t pause_count) {
cpld_xc2c_jtag_shift_dr_ir(jtag, tdi_tdo, bit_count, pause_count);
}
static uint8_t cpld_xc2c_jtag_shift_ir_pause(const jtag_t* const jtag, const cpld_xc2c_ir_t ir, const size_t pause_count) {
/* Run-Test/Idle -> Select-DR-Scan */
cpld_xc2c_jtag_shift_u32(jtag, 0b1, 0b0, 1);
uint8_t value = ir;
cpld_xc2c_jtag_shift_dr_ir(jtag, &value, 8, pause_count);
return value;
}
static uint8_t cpld_xc2c_jtag_shift_ir(const jtag_t* const jtag, const cpld_xc2c_ir_t ir) {
return cpld_xc2c_jtag_shift_ir_pause(jtag, ir, 0);
}
static void cpld_xc2c_jtag_reset(const jtag_t* const jtag) {
/* Five TMS=1 to reach Test-Logic-Reset from any point in the TAP state diagram.
*/
cpld_xc2c_jtag_shift_u32(jtag, 0b11111, 0, 5);
}
static void cpld_xc2c_jtag_reset_and_idle(const jtag_t* const jtag) {
/* Five TMS=1 to reach Test-Logic-Reset from any point in the TAP state diagram.
* One TMS=0 to move from Test-Logic-Reset to Run-Test-Idle.
*/
cpld_xc2c_jtag_reset(jtag);
cpld_xc2c_jtag_shift_u32(jtag, 0, 0, 1);
}
static uint32_t cpld_xc2c_jtag_idcode(const jtag_t* const jtag) {
/* Enter and end at Run-Test-Idle state. */
cpld_xc2c_jtag_shift_ir(jtag, CPLD_XC2C_IR_IDCODE);
uint32_t result = 0;
cpld_xc2c_jtag_shift_dr(jtag, (uint8_t*)&result, 32, 0);
return result;
}
static bool cpld_xc2c64a_jtag_idcode_ok(const jtag_t* const jtag) {
return ((cpld_xc2c_jtag_idcode(jtag) ^ 0xf6e5f093) & 0x0fff8fff) == 0;
}
static void cpld_xc2c_jtag_conld(const jtag_t* const jtag) {
cpld_xc2c_jtag_shift_ir(jtag, CPLD_XC2C_IR_ISC_DISABLE);
cpld_xc2c_jtag_clocks(jtag, 100);
}
static void cpld_xc2c_jtag_enable(const jtag_t* const jtag) {
cpld_xc2c_jtag_shift_ir(jtag, CPLD_XC2C_IR_ISC_ENABLE);
cpld_xc2c_jtag_clocks(jtag, 800);
}
static void cpld_xc2c_jtag_disable(const jtag_t* const jtag) {
cpld_xc2c_jtag_shift_ir(jtag, CPLD_XC2C_IR_ISC_DISABLE);
cpld_xc2c_jtag_clocks(jtag, 100);
}
static void cpld_xc2c_jtag_sram_write(const jtag_t* const jtag) {
cpld_xc2c_jtag_shift_ir(jtag, CPLD_XC2C_IR_ISC_WRITE);
}
static void cpld_xc2c_jtag_sram_read(const jtag_t* const jtag) {
cpld_xc2c_jtag_shift_ir(jtag, CPLD_XC2C_IR_ISC_SRAM_READ);
}
static uint32_t cpld_xc2c_jtag_bypass(const jtag_t* const jtag, const bool shift_dr) {
const uint8_t result = cpld_xc2c_jtag_shift_ir(jtag, CPLD_XC2C_IR_BYPASS);
if( shift_dr ) {
uint8_t dr = 0;
cpld_xc2c_jtag_shift_dr(jtag, &dr, 1, 0);
}
return result;
}
static bool cpld_xc2c_jtag_read_write_protect(const jtag_t* const jtag) {
/* Enter and end at Run-Test-Idle state. */
return ((cpld_xc2c_jtag_bypass(jtag, false) ^ 0x01) & 0x03) == 0;
}
static bool cpld_xc2c_jtag_is_done(const jtag_t* const jtag) {
return ((cpld_xc2c_jtag_bypass(jtag, false) ^ 0x05) & 0x07) == 0;
}
static void cpld_xc2c_jtag_init_special(const jtag_t* const jtag) {
cpld_xc2c_jtag_shift_ir(jtag, CPLD_XC2C_IR_ISC_INIT);
cpld_xc2c_jtag_clocks(jtag, 20);
/* Run-Test/Idle -> Shift-IR */
cpld_xc2c_jtag_shift_u32(jtag, 0b0011, 0b0000, 4);
/* Shift-IR: 0xf0 -> Exit1-IR */
cpld_xc2c_jtag_shift_u32(jtag, 0x80, CPLD_XC2C_IR_ISC_INIT, 8);
/* Exit1-IR -> Pause-IR */
cpld_xc2c_jtag_shift_u32(jtag, 0b0, 0, 1);
/* Pause-IR -> Exit2-IR -> Update-IR -> Select-DR-Scan -> Capture-DR -> Exit1-DR -> Update-DR -> Run-Test/Idle */
cpld_xc2c_jtag_shift_u32(jtag, 0b0110111, 0, 7);
cpld_xc2c_jtag_clocks(jtag, 800);
}
static void cpld_xc2c_jtag_read(const jtag_t* const jtag) {
cpld_xc2c_jtag_shift_ir_pause(jtag, CPLD_XC2C_IR_ISC_READ, 1);
}
static void cpld_xc2c64a_jtag_read_row(const jtag_t* const jtag, uint8_t address, uint8_t* const dr) {
cpld_xc2c_jtag_shift_dr(jtag, &address, 7, 20);
cpld_xc2c_jtag_clocks(jtag, 100);
/* Set array to all ones so we don't transmit memory contents over TDI, and if we're not
* reading a full byte's worth of bits, the excess bits will be zero.
*/
memset(dr, 0xff, CPLD_XC2C64A_BYTES_IN_ROW);
cpld_xc2c_jtag_shift_dr(jtag, dr, CPLD_XC2C64A_BITS_IN_ROW, 0);
cpld_xc2c_jtag_clocks(jtag, 100);
}
bool cpld_xc2c64a_jtag_checksum(
const jtag_t* const jtag,
const cpld_xc2c64a_verify_t* const verify,
uint32_t* const crc_value
) {
cpld_xc2c_jtag_reset_and_idle(jtag);
if( cpld_xc2c64a_jtag_idcode_ok(jtag) && cpld_xc2c_jtag_read_write_protect(jtag) &&
cpld_xc2c64a_jtag_idcode_ok(jtag) && cpld_xc2c_jtag_read_write_protect(jtag) ) {
cpld_xc2c_jtag_bypass(jtag, false);
cpld_xc2c_jtag_enable(jtag);
cpld_xc2c_jtag_enable(jtag);
cpld_xc2c_jtag_enable(jtag);
cpld_xc2c_jtag_read(jtag);
crc32_t crc;
crc32_init(&crc);
uint8_t dr[CPLD_XC2C64A_BYTES_IN_ROW];
for(size_t row=0; row<CPLD_XC2C64A_ROWS; row++) {
const size_t address = cpld_hackrf_row_addresses.address[row];
cpld_xc2c64a_jtag_read_row(jtag, address, dr);
const size_t mask_index = verify->mask_index[row];
for(size_t i=0; i<CPLD_XC2C64A_BYTES_IN_ROW; i++) {
dr[i] &= verify->mask[mask_index].value[i];
}
/* Important checksum calculation NOTE:
* Do checksum of all bits in row bytes, but ensure that invalid bits
* are set to zero by masking. This subtlety just wasted several hours
* of my life...
*/
crc32_update(&crc, dr, CPLD_XC2C64A_BYTES_IN_ROW);
}
*crc_value = crc32_digest(&crc);
cpld_xc2c_jtag_init_special(jtag);
cpld_xc2c_jtag_conld(jtag);
if( cpld_xc2c64a_jtag_idcode_ok(jtag) && cpld_xc2c_jtag_is_done(jtag) ) {
cpld_xc2c_jtag_conld(jtag);
cpld_xc2c_jtag_bypass(jtag, false);
cpld_xc2c_jtag_bypass(jtag, true);
return true;
}
}
cpld_xc2c_jtag_reset_and_idle(jtag);
return false;
}
static void cpld_xc2c64a_jtag_sram_write_row(const jtag_t* const jtag, uint8_t address, const uint8_t* const data) {
uint8_t write[CPLD_XC2C64A_BYTES_IN_ROW];
memcpy(&write[0], data, sizeof(write));
/* Update-IR or Run-Test/Idle -> Shift-DR */
cpld_xc2c_jtag_shift_u32(jtag, 0b001, 0b000, 3);
/* Shift-DR -> Shift-DR */
cpld_xc2c_jtag_shift_ptr_tms(jtag, &write[0], 0, CPLD_XC2C64A_BITS_IN_ROW, false);
/* Shift-DR -> Exit1-DR */
cpld_xc2c_jtag_shift_u32(jtag, 0b1000000, address, 7);
/* Exit1-DR -> Update-DR -> Run-Test/Idle */
cpld_xc2c_jtag_shift_u32(jtag, 0b01, 0b00, 2);
}
static void cpld_xc2c64a_jtag_sram_read_row(const jtag_t* const jtag, uint8_t* const data, const uint8_t next_address) {
/* Run-Test/Idle -> Shift-DR */
cpld_xc2c_jtag_shift_u32(jtag, 0b001, 0b000, 3);
/* Shift-DR */
cpld_xc2c_jtag_shift_ptr_tms(jtag, data, 0, CPLD_XC2C64A_BITS_IN_ROW, false);
/* Shift-DR -> Exit1-DR */
cpld_xc2c_jtag_shift_u32(jtag, 0b1000000, next_address, 7);
/* Weird, non-IEEE1532 compliant path through TAP machine, described in Xilinx
* Programmer Qualification Specification, applicable only to XC2C64/A.
* Exit1-DR -> Pause-DR -> Exit2-DR -> Update-DR -> Run-Test/Idle
*/
cpld_xc2c_jtag_shift_u32(jtag, 0b0110, 0b0000, 4);
}
static bool cpld_xc2c64a_jtag_sram_compare_row(const jtag_t* const jtag, const uint8_t* const expected, const uint8_t* const mask, const uint8_t next_address) {
/* Run-Test/Idle -> Shift-DR */
uint8_t read[CPLD_XC2C64A_BYTES_IN_ROW];
memset(read, 0xff, sizeof(read));
cpld_xc2c64a_jtag_sram_read_row(jtag, &read[0], next_address);
bool matched = true;
if( (expected != NULL) && (mask != NULL) ) {
for(size_t i=0; i<CPLD_XC2C64A_BYTES_IN_ROW; i++) {
const uint8_t significant_differences = (read[i] ^ expected[i]) & mask[i];
matched &= (significant_differences == 0);
}
}
return matched;
}
void cpld_xc2c64a_jtag_sram_write(
const jtag_t* const jtag,
const cpld_xc2c64a_program_t* const program
) {
cpld_xc2c_jtag_reset_and_idle(jtag);
cpld_xc2c_jtag_enable(jtag);
cpld_xc2c_jtag_sram_write(jtag);
for(size_t row=0; row<CPLD_XC2C64A_ROWS; row++) {
const uint8_t address = cpld_hackrf_row_addresses.address[row];
cpld_xc2c64a_jtag_sram_write_row(jtag, address, &program->row[row].data[0]);
}
cpld_xc2c_jtag_disable(jtag);
cpld_xc2c_jtag_bypass(jtag, false);
cpld_xc2c_jtag_reset(jtag);
}
bool cpld_xc2c64a_jtag_sram_verify(
const jtag_t* const jtag,
const cpld_xc2c64a_program_t* const program,
const cpld_xc2c64a_verify_t* const verify
) {
cpld_xc2c_jtag_reset_and_idle(jtag);
cpld_xc2c_jtag_enable(jtag);
cpld_xc2c_jtag_sram_read(jtag);
/* Tricky loop to read dummy row first, then first address, then loop back to get
* the first row's data.
*/
bool matched = true;
for(size_t address_row=0; address_row<=CPLD_XC2C64A_ROWS; address_row++) {
const int data_row = (int)address_row - 1;
const size_t mask_index = (data_row >= 0) ? verify->mask_index[data_row] : 0;
const uint8_t* const expected = (data_row >= 0) ? &program->row[data_row].data[0] : NULL;
const uint8_t* const mask = (data_row >= 0) ? &verify->mask[mask_index].value[0] : NULL;
const uint8_t next_address = (address_row < CPLD_XC2C64A_ROWS) ? cpld_hackrf_row_addresses.address[address_row] : 0;
matched &= cpld_xc2c64a_jtag_sram_compare_row(jtag, expected, mask, next_address);
}
cpld_xc2c_jtag_disable(jtag);
cpld_xc2c_jtag_bypass(jtag, false);
cpld_xc2c_jtag_reset(jtag);
return matched;
}

View File

@ -0,0 +1,75 @@
/*
* Copyright 2019 Jared Boone <jared@sharebrained.com>
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#ifndef __CPLD_XC2C_H__
#define __CPLD_XC2C_H__
#include <stdint.h>
#include <stdbool.h>
#include "cpld_jtag.h"
/* Xilinx CoolRunner II XC2C64A bitstream attributes */
#define CPLD_XC2C64A_ROWS (98)
#define CPLD_XC2C64A_BITS_IN_ROW (274)
#define CPLD_XC2C64A_BYTES_IN_ROW ((CPLD_XC2C64A_BITS_IN_ROW + 7) / 8)
typedef struct {
uint8_t data[CPLD_XC2C64A_BYTES_IN_ROW];
} cpld_xc2c64a_row_data_t;
typedef struct {
cpld_xc2c64a_row_data_t row[CPLD_XC2C64A_ROWS];
} cpld_xc2c64a_program_t;
typedef struct {
uint8_t value[CPLD_XC2C64A_BYTES_IN_ROW];
} cpld_xc2c64a_row_mask_t;
typedef struct {
cpld_xc2c64a_row_mask_t mask[6];
uint8_t mask_index[CPLD_XC2C64A_ROWS];
} cpld_xc2c64a_verify_t;
typedef struct {
uint8_t address[CPLD_XC2C64A_ROWS];
} cpld_xc2c64a_row_addresses_t;
bool cpld_xc2c64a_jtag_checksum(
const jtag_t* const jtag,
const cpld_xc2c64a_verify_t* const verify,
uint32_t* const crc_value
);
void cpld_xc2c64a_jtag_sram_write(
const jtag_t* const jtag,
const cpld_xc2c64a_program_t* const program
);
bool cpld_xc2c64a_jtag_sram_verify(
const jtag_t* const jtag,
const cpld_xc2c64a_program_t* const program,
const cpld_xc2c64a_verify_t* const verify
);
extern const cpld_xc2c64a_program_t cpld_hackrf_program_sram;
extern const cpld_xc2c64a_verify_t cpld_hackrf_verify;
extern const cpld_xc2c64a_row_addresses_t cpld_hackrf_row_addresses;
#endif/*__CPLD_XC2C_H__*/

View File

@ -0,0 +1,49 @@
/*
* Copyright 2019 Jared Boone <jared@sharebrained.com>
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#include "crc.h"
#include <stdbool.h>
void crc32_init(crc32_t* const crc) {
crc->remainder = 0xffffffff;
crc->reversed_polynomial = 0xedb88320;
crc->final_xor = 0xffffffff;
}
void crc32_update(crc32_t* const crc, const uint8_t* const data, const size_t byte_count) {
uint32_t remainder = crc->remainder;
const size_t bit_count = byte_count * 8;
for(size_t bit_n=0; bit_n<bit_count; bit_n++) {
const bool bit_in = data[bit_n >> 3] & (1 << (bit_n & 7));
remainder ^= (bit_in ? 1 : 0);
const bool bit_out = (remainder & 1);
remainder >>= 1;
if( bit_out ) {
remainder ^= crc->reversed_polynomial;
}
}
crc->remainder = remainder;
}
uint32_t crc32_digest(const crc32_t* const crc) {
return crc->remainder ^ crc->final_xor;
}

View File

@ -0,0 +1,38 @@
/*
* Copyright 2019 Jared Boone <jared@sharebrained.com>
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#ifndef __CRC_H__
#define __CRC_H__
#include <stdint.h>
#include <stddef.h>
typedef struct {
uint32_t remainder;
uint32_t reversed_polynomial;
uint32_t final_xor;
} crc32_t;
void crc32_init(crc32_t* const crc);
void crc32_update(crc32_t* const crc, const uint8_t* const data, const size_t byte_count);
uint32_t crc32_digest(const crc32_t* const crc);
#endif//__CRC_H__

View File

@ -0,0 +1,86 @@
/*
* Copyright 2012 Jared Boone <jared@sharebrained.com>
* Copyright 2013 Benjamin Vernoux <titanmkd@gmail.com>
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#include <stdint.h>
#include "fault_handler.h"
typedef struct
{
uint32_t r0;
uint32_t r1;
uint32_t r2;
uint32_t r3;
uint32_t r12;
uint32_t lr; /* Link Register. */
uint32_t pc; /* Program Counter. */
uint32_t psr;/* Program Status Register. */
} hard_fault_stack_t;
__attribute__((naked))
void hard_fault_handler(void) {
__asm__("TST LR, #4");
__asm__("ITE EQ");
__asm__("MRSEQ R0, MSP");
__asm__("MRSNE R0, PSP");
__asm__("B hard_fault_handler_c");
}
volatile hard_fault_stack_t* hard_fault_stack_pt;
__attribute__((used)) void hard_fault_handler_c(uint32_t* args)
{
/* hard_fault_stack_pt contains registers saved before the hard fault */
hard_fault_stack_pt = (hard_fault_stack_t*)args;
// args[0-7]: r0, r1, r2, r3, r12, lr, pc, psr
// Other interesting registers to examine:
// CFSR: Configurable Fault Status Register
// HFSR: Hard Fault Status Register
// DFSR: Debug Fault Status Register
// AFSR: Auxiliary Fault Status Register
// MMAR: MemManage Fault Address Register
// BFAR: Bus Fault Address Register
/*
if( SCB->HFSR & SCB_HFSR_FORCED ) {
if( SCB->CFSR & SCB_CFSR_BFSR_BFARVALID ) {
SCB->BFAR;
if( SCB->CFSR & CSCB_CFSR_BFSR_PRECISERR ) {
}
}
}
*/
while(1);
}
void mem_manage_handler() {
while(1);
}
void bus_fault_handler() {
while(1);
}
void usage_fault_handler() {
while(1);
}

View File

@ -0,0 +1,73 @@
/*
* Copyright 2012 Jared Boone <jared@sharebrained.com>
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#ifndef __FAULT_HANDLER__
#define __FAULT_HANDLER__
#include <stdint.h>
#include <libopencm3/cm3/memorymap.h>
// TODO: Move all this to a Cortex-M(?) include file, since these
// structures are supposedly the same between processors (to an
// undetermined extent).
typedef struct armv7m_scb_t armv7m_scb_t;
struct armv7m_scb_t {
volatile const uint32_t CPUID;
volatile uint32_t ICSR;
volatile uint32_t VTOR;
volatile uint32_t AIRCR;
volatile uint32_t SCR;
volatile uint32_t CCR;
volatile uint32_t SHPR1;
volatile uint32_t SHPR2;
volatile uint32_t SHPR3;
volatile uint32_t SHCSR;
volatile uint32_t CFSR;
volatile uint32_t HFSR;
volatile uint32_t DFSR;
volatile uint32_t MMFAR;
volatile uint32_t BFAR;
volatile uint32_t AFSR;
volatile const uint32_t ID_PFR0;
volatile const uint32_t ID_PFR1;
volatile const uint32_t ID_DFR0;
volatile const uint32_t ID_AFR0;
volatile const uint32_t ID_MMFR0;
volatile const uint32_t ID_MMFR1;
volatile const uint32_t ID_MMFR2;
volatile const uint32_t ID_MMFR3;
volatile const uint32_t ID_ISAR0;
volatile const uint32_t ID_ISAR1;
volatile const uint32_t ID_ISAR2;
volatile const uint32_t ID_ISAR3;
volatile const uint32_t ID_ISAR4;
volatile const uint32_t __reserved_0x74_0x87[5];
volatile uint32_t CPACR;
} __attribute__((packed));
static armv7m_scb_t* const SCB = (armv7m_scb_t*)SCB_BASE;
#define SCB_HFSR_DEBUGEVT (1 << 31)
#define SCB_HFSR_FORCED (1 << 30)
#define SCB_HFSR_VECTTBL (1 << 1)
#endif//__FAULT_HANDLER__

View File

@ -0,0 +1,62 @@
/*
* Copyright 2013 Jared Boone <jared@sharebrained.com>
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#include <gpdma.h>
#include <libopencm3/lpc43xx/gpdma.h>
void gpdma_controller_enable() {
GPDMA_CONFIG |= GPDMA_CONFIG_E(1);
while( (GPDMA_CONFIG & GPDMA_CONFIG_E_MASK) == 0 );
}
void gpdma_channel_enable(const uint_fast8_t channel) {
GPDMA_CCONFIG(channel) |= GPDMA_CCONFIG_E(1);
}
void gpdma_channel_disable(const uint_fast8_t channel) {
GPDMA_CCONFIG(channel) &= ~GPDMA_CCONFIG_E_MASK;
while( (GPDMA_ENBLDCHNS & GPDMA_ENBLDCHNS_ENABLEDCHANNELS(1 << channel)) );
}
void gpdma_channel_interrupt_tc_clear(const uint_fast8_t channel) {
GPDMA_INTTCCLEAR = GPDMA_INTTCCLEAR_INTTCCLEAR(1 << channel);
}
void gpdma_channel_interrupt_error_clear(const uint_fast8_t channel) {
GPDMA_INTERRCLR = GPDMA_INTERRCLR_INTERRCLR(1 << channel);
}
void gpdma_lli_enable_interrupt(gpdma_lli_t* const lli) {
lli->ccontrol |= GPDMA_CCONTROL_I(1);
}
void gpdma_lli_create_loop(gpdma_lli_t* const lli, const size_t lli_count) {
for(size_t i=0; i<lli_count; i++) {
gpdma_lli_t* const next_lli = &lli[(i + 1) % lli_count];
lli[i].clli = (lli[i].clli & ~GPDMA_CLLI_LLI_MASK) | GPDMA_CLLI_LLI((uint32_t)next_lli >> 2);
}
}
void gpdma_lli_create_oneshot(gpdma_lli_t* const lli, const size_t lli_count) {
gpdma_lli_create_loop(lli, lli_count);
lli[lli_count - 1].clli &= ~GPDMA_CLLI_LLI_MASK;
}

View File

@ -0,0 +1,43 @@
/*
* Copyright 2013 Jared Boone <jared@sharebrained.com>
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#ifndef __GPDMA_H__
#define __GPDMA_H__
#include <stddef.h>
#include <stdint.h>
#include <libopencm3/lpc43xx/gpdma.h>
void gpdma_controller_enable();
void gpdma_channel_enable(const uint_fast8_t channel);
void gpdma_channel_disable(const uint_fast8_t channel);
void gpdma_channel_interrupt_tc_clear(const uint_fast8_t channel);
void gpdma_channel_interrupt_error_clear(const uint_fast8_t channel);
void gpdma_lli_enable_interrupt(gpdma_lli_t* const lli);
void gpdma_lli_create_loop(gpdma_lli_t* const lli, const size_t lli_count);
void gpdma_lli_create_oneshot(gpdma_lli_t* const lli, const size_t lli_count);
#endif/*__GPDMA_H__*/

View File

@ -0,0 +1,38 @@
/*
* Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc.
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#ifndef __GPIO_H__
#define __GPIO_H__
#include <stdbool.h>
typedef const struct gpio_t* gpio_t;
void gpio_init();
void gpio_set(gpio_t gpio);
void gpio_clear(gpio_t gpio);
void gpio_toggle(gpio_t gpio);
void gpio_output(gpio_t gpio);
void gpio_input(gpio_t gpio);
void gpio_write(gpio_t gpio, const bool value);
bool gpio_read(gpio_t gpio);
#endif/*__GPIO_H__*/

View File

@ -0,0 +1,58 @@
/*
* Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc.
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#include "gpio_lpc.h"
#include <stddef.h>
void gpio_init() {
for(size_t i=0; i<8; i++) {
GPIO_LPC_PORT(i)->dir = 0;
}
}
void gpio_set(gpio_t gpio) {
gpio->port->set = gpio->mask;
}
void gpio_clear(gpio_t gpio) {
gpio->port->clr = gpio->mask;
}
void gpio_toggle(gpio_t gpio) {
gpio->port->not = gpio->mask;
}
void gpio_output(gpio_t gpio) {
gpio->port->dir |= gpio->mask;
}
void gpio_input(gpio_t gpio) {
gpio->port->dir &= ~gpio->mask;
}
void gpio_write(gpio_t gpio, const bool value) {
*gpio->gpio_w = value;
}
bool gpio_read(gpio_t gpio) {
return *gpio->gpio_w;
}

View File

@ -0,0 +1,70 @@
/*
* Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc.
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#ifndef __GPIO_LPC_H__
#define __GPIO_LPC_H__
#include <stdint.h>
#include "gpio.h"
/* NOTE: libopencm3 constants and functions not used here due to naming
* conflicts. I'd recommend changes to libopencm3 design to separate
* register #defines and API declarations into separate header files.
*/
typedef struct gpio_port_t {
volatile uint32_t dir; /* +0x000 */
uint32_t _reserved0[31];
volatile uint32_t mask; /* +0x080 */
uint32_t _reserved1[31];
volatile uint32_t pin; /* +0x100 */
uint32_t _reserved2[31];
volatile uint32_t mpin; /* +0x180 */
uint32_t _reserved3[31];
volatile uint32_t set; /* +0x200 */
uint32_t _reserved4[31];
volatile uint32_t clr; /* +0x280 */
uint32_t _reserved5[31];
volatile uint32_t not; /* +0x300 */
} gpio_port_t;
struct gpio_t {
const uint32_t mask;
gpio_port_t* const port;
volatile uint32_t* const gpio_w;
};
#define GPIO_LPC_BASE (0x400f4000)
#define GPIO_LPC_B_OFFSET (0x0)
#define GPIO_LPC_W_OFFSET (0x1000)
#define GPIO_LPC_PORT_OFFSET (0x2000)
#define GPIO_LPC_PORT(_n) ((gpio_port_t*)((GPIO_LPC_BASE + GPIO_LPC_PORT_OFFSET) + (_n) * 4))
#define GPIO_LPC_W(_port_num, _pin_num) (volatile uint32_t*)((GPIO_LPC_BASE + GPIO_LPC_W_OFFSET) + ((_port_num) * 0x80) + ((_pin_num) * 4))
#define GPIO(_port_num, _pin_num) { \
.mask = (1UL << (_pin_num)), \
.port = GPIO_LPC_PORT(_port_num), \
.gpio_w = GPIO_LPC_W(_port_num, _pin_num), \
}
#endif/*__GPIO_LPC_H__*/

View File

@ -0,0 +1,919 @@
/*
* Copyright 2012 Michael Ossmann <mike@ossmann.com>
* Copyright 2012 Jared Boone <jared@sharebrained.com>
* Copyright 2013 Benjamin Vernoux <titanmkd@gmail.com>
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#include "hackrf_core.h"
#include "hackrf_ui.h"
#include "si5351c.h"
#include "spi_ssp.h"
#include "max2837.h"
#include "max2837_target.h"
#include "max5864.h"
#include "max5864_target.h"
#include "w25q80bv.h"
#include "w25q80bv_target.h"
#include "i2c_bus.h"
#include "i2c_lpc.h"
#include "cpld_jtag.h"
#include <libopencm3/lpc43xx/cgu.h>
#include <libopencm3/lpc43xx/ccu.h>
#include <libopencm3/lpc43xx/scu.h>
#include <libopencm3/lpc43xx/ssp.h>
#ifdef HACKRF_ONE
#include "portapack.h"
#endif
#include "gpio_lpc.h"
#define WAIT_CPU_CLOCK_INIT_DELAY (10000)
/* GPIO Output PinMux */
static struct gpio_t gpio_led[] = {
GPIO(2, 1),
GPIO(2, 2),
GPIO(2, 8),
#ifdef RAD1O
GPIO(5, 26),
#endif
};
static struct gpio_t gpio_1v8_enable = GPIO(3, 6);
/* MAX2837 GPIO (XCVR_CTL) PinMux */
static struct gpio_t gpio_max2837_select = GPIO(0, 15);
static struct gpio_t gpio_max2837_enable = GPIO(2, 6);
static struct gpio_t gpio_max2837_rx_enable = GPIO(2, 5);
static struct gpio_t gpio_max2837_tx_enable = GPIO(2, 4);
/* MAX5864 SPI chip select (AD_CS) GPIO PinMux */
static struct gpio_t gpio_max5864_select = GPIO(2, 7);
/* RFFC5071 GPIO serial interface PinMux */
// #ifdef RAD1O
// static struct gpio_t gpio_rffc5072_select = GPIO(2, 13);
// static struct gpio_t gpio_rffc5072_clock = GPIO(5, 6);
// static struct gpio_t gpio_rffc5072_data = GPIO(3, 3);
// static struct gpio_t gpio_rffc5072_reset = GPIO(2, 14);
// #endif
/* RF supply (VAA) control */
#ifdef HACKRF_ONE
static struct gpio_t gpio_vaa_disable = GPIO(2, 9);
#endif
#ifdef RAD1O
static struct gpio_t gpio_vaa_enable = GPIO(2, 9);
#endif
static struct gpio_t gpio_w25q80bv_hold = GPIO(1, 14);
static struct gpio_t gpio_w25q80bv_wp = GPIO(1, 15);
static struct gpio_t gpio_w25q80bv_select = GPIO(5, 11);
/* RF switch control */
#ifdef HACKRF_ONE
static struct gpio_t gpio_hp = GPIO(2, 0);
static struct gpio_t gpio_lp = GPIO(2, 10);
static struct gpio_t gpio_tx_mix_bp = GPIO(2, 11);
static struct gpio_t gpio_no_mix_bypass = GPIO(1, 0);
static struct gpio_t gpio_rx_mix_bp = GPIO(2, 12);
static struct gpio_t gpio_tx_amp = GPIO(2, 15);
static struct gpio_t gpio_tx = GPIO(5, 15);
static struct gpio_t gpio_mix_bypass = GPIO(5, 16);
static struct gpio_t gpio_rx = GPIO(5, 5);
static struct gpio_t gpio_no_tx_amp_pwr = GPIO(3, 5);
static struct gpio_t gpio_amp_bypass = GPIO(0, 14);
static struct gpio_t gpio_rx_amp = GPIO(1, 11);
static struct gpio_t gpio_no_rx_amp_pwr = GPIO(1, 12);
#endif
#ifdef RAD1O
static struct gpio_t gpio_tx_rx_n = GPIO(1, 11);
static struct gpio_t gpio_tx_rx = GPIO(0, 14);
static struct gpio_t gpio_by_mix = GPIO(1, 12);
static struct gpio_t gpio_by_mix_n = GPIO(2, 10);
static struct gpio_t gpio_by_amp = GPIO(1, 0);
static struct gpio_t gpio_by_amp_n = GPIO(5, 5);
static struct gpio_t gpio_mixer_en = GPIO(5, 16);
static struct gpio_t gpio_low_high_filt = GPIO(2, 11);
static struct gpio_t gpio_low_high_filt_n = GPIO(2, 12);
static struct gpio_t gpio_tx_amp = GPIO(2, 15);
static struct gpio_t gpio_rx_lna = GPIO(5, 15);
#endif
/* CPLD JTAG interface GPIO pins */
static struct gpio_t gpio_cpld_tdo = GPIO(5, 18);
static struct gpio_t gpio_cpld_tck = GPIO(3, 0);
#if (defined HACKRF_ONE || defined RAD1O)
static struct gpio_t gpio_cpld_tms = GPIO(3, 4);
static struct gpio_t gpio_cpld_tdi = GPIO(3, 1);
#else
static struct gpio_t gpio_cpld_tms = GPIO(3, 1);
static struct gpio_t gpio_cpld_tdi = GPIO(3, 4);
#endif
#ifdef HACKRF_ONE
static struct gpio_t gpio_cpld_pp_tms = GPIO(1, 1);
static struct gpio_t gpio_cpld_pp_tdo = GPIO(1, 8);
#endif
static struct gpio_t gpio_hw_sync_enable = GPIO(5,12);
static struct gpio_t gpio_rx_q_invert = GPIO(0, 13);
i2c_bus_t i2c0 = {
.obj = (void*)I2C0_BASE,
.start = i2c_lpc_start,
.stop = i2c_lpc_stop,
.transfer = i2c_lpc_transfer,
};
i2c_bus_t i2c1 = {
.obj = (void*)I2C1_BASE,
.start = i2c_lpc_start,
.stop = i2c_lpc_stop,
.transfer = i2c_lpc_transfer,
};
// const i2c_lpc_config_t i2c_config_si5351c_slow_clock = {
// .duty_cycle_count = 15,
// };
const i2c_lpc_config_t i2c_config_si5351c_fast_clock = {
.duty_cycle_count = 255,
};
si5351c_driver_t clock_gen = {
.bus = &i2c0,
.i2c_address = 0x60,
};
const ssp_config_t ssp_config_max2837 = {
/* FIXME speed up once everything is working reliably */
/*
// Freq About 0.0498MHz / 49.8KHz => Freq = PCLK / (CPSDVSR * [SCR+1]) with PCLK=PLL1=204MHz
const uint8_t serial_clock_rate = 32;
const uint8_t clock_prescale_rate = 128;
*/
// Freq About 4.857MHz => Freq = PCLK / (CPSDVSR * [SCR+1]) with PCLK=PLL1=204MHz
.data_bits = SSP_DATA_16BITS,
.serial_clock_rate = 21,
.clock_prescale_rate = 2,
.gpio_select = &gpio_max2837_select,
};
const ssp_config_t ssp_config_max5864 = {
/* FIXME speed up once everything is working reliably */
/*
// Freq About 0.0498MHz / 49.8KHz => Freq = PCLK / (CPSDVSR * [SCR+1]) with PCLK=PLL1=204MHz
const uint8_t serial_clock_rate = 32;
const uint8_t clock_prescale_rate = 128;
*/
// Freq About 4.857MHz => Freq = PCLK / (CPSDVSR * [SCR+1]) with PCLK=PLL1=204MHz
.data_bits = SSP_DATA_8BITS,
.serial_clock_rate = 21,
.clock_prescale_rate = 2,
.gpio_select = &gpio_max5864_select,
};
spi_bus_t spi_bus_ssp1 = {
.obj = (void*)SSP1_BASE,
.config = &ssp_config_max2837,
.start = spi_ssp_start,
.stop = spi_ssp_stop,
.transfer = spi_ssp_transfer,
.transfer_gather = spi_ssp_transfer_gather,
};
max2837_driver_t max2837 = {
.bus = &spi_bus_ssp1,
.gpio_enable = &gpio_max2837_enable,
.gpio_rx_enable = &gpio_max2837_rx_enable,
.gpio_tx_enable = &gpio_max2837_tx_enable,
.target_init = max2837_target_init,
.set_mode = max2837_target_set_mode,
};
max5864_driver_t max5864 = {
.bus = &spi_bus_ssp1,
.target_init = max5864_target_init,
};
const ssp_config_t ssp_config_w25q80bv = {
.data_bits = SSP_DATA_8BITS,
.serial_clock_rate = 2,
.clock_prescale_rate = 2,
.gpio_select = &gpio_w25q80bv_select,
};
spi_bus_t spi_bus_ssp0 = {
.obj = (void*)SSP0_BASE,
.config = &ssp_config_w25q80bv,
.start = spi_ssp_start,
.stop = spi_ssp_stop,
.transfer = spi_ssp_transfer,
.transfer_gather = spi_ssp_transfer_gather,
};
w25q80bv_driver_t spi_flash = {
.bus = &spi_bus_ssp0,
.gpio_hold = &gpio_w25q80bv_hold,
.gpio_wp = &gpio_w25q80bv_wp,
.target_init = w25q80bv_target_init,
};
sgpio_config_t sgpio_config = {
.gpio_rx_q_invert = &gpio_rx_q_invert,
.gpio_hw_sync_enable = &gpio_hw_sync_enable,
.slice_mode_multislice = true,
};
rf_path_t rf_path = {
.switchctrl = 0,
#ifdef HACKRF_ONE
.gpio_hp = &gpio_hp,
.gpio_lp = &gpio_lp,
.gpio_tx_mix_bp = &gpio_tx_mix_bp,
.gpio_no_mix_bypass = &gpio_no_mix_bypass,
.gpio_rx_mix_bp = &gpio_rx_mix_bp,
.gpio_tx_amp = &gpio_tx_amp,
.gpio_tx = &gpio_tx,
.gpio_mix_bypass = &gpio_mix_bypass,
.gpio_rx = &gpio_rx,
.gpio_no_tx_amp_pwr = &gpio_no_tx_amp_pwr,
.gpio_amp_bypass = &gpio_amp_bypass,
.gpio_rx_amp = &gpio_rx_amp,
.gpio_no_rx_amp_pwr = &gpio_no_rx_amp_pwr,
#endif
#ifdef RAD1O
.gpio_tx_rx_n = &gpio_tx_rx_n,
.gpio_tx_rx = &gpio_tx_rx,
.gpio_by_mix = &gpio_by_mix,
.gpio_by_mix_n = &gpio_by_mix_n,
.gpio_by_amp = &gpio_by_amp,
.gpio_by_amp_n = &gpio_by_amp_n,
.gpio_mixer_en = &gpio_mixer_en,
.gpio_low_high_filt = &gpio_low_high_filt,
.gpio_low_high_filt_n = &gpio_low_high_filt_n,
.gpio_tx_amp = &gpio_tx_amp,
.gpio_rx_lna = &gpio_rx_lna,
#endif
};
jtag_gpio_t jtag_gpio_cpld = {
.gpio_tms = &gpio_cpld_tms,
.gpio_tck = &gpio_cpld_tck,
.gpio_tdi = &gpio_cpld_tdi,
.gpio_tdo = &gpio_cpld_tdo,
#ifdef HACKRF_ONE
.gpio_pp_tms = &gpio_cpld_pp_tms,
.gpio_pp_tdo = &gpio_cpld_pp_tdo,
#endif
};
jtag_t jtag_cpld = {
.gpio = &jtag_gpio_cpld,
};
void delay(uint32_t duration)
{
uint32_t i;
for (i = 0; i < duration; i++)
__asm__("nop");
}
/* GCD algo from wikipedia */
/* http://en.wikipedia.org/wiki/Greatest_common_divisor */
static uint32_t
gcd(uint32_t u, uint32_t v)
{
int s;
if (!u || !v)
return u | v;
for (s=0; !((u|v)&1); s++) {
u >>= 1;
v >>= 1;
}
while (!(u&1))
u >>= 1;
do {
while (!(v&1))
v >>= 1;
if (u>v) {
uint32_t t;
t = v;
v = u;
u = t;
}
v = v - u;
}
while (v);
return u << s;
}
bool sample_rate_frac_set(uint32_t rate_num, uint32_t rate_denom)
{
const uint64_t VCO_FREQ = 800 * 1000 * 1000; /* 800 MHz */
uint32_t MSx_P1,MSx_P2,MSx_P3;
uint32_t a, b, c;
uint32_t rem;
hackrf_ui()->set_sample_rate(rate_num/2);
/* Find best config */
a = (VCO_FREQ * rate_denom) / rate_num;
rem = (VCO_FREQ * rate_denom) - (a * rate_num);
if (!rem) {
/* Integer mode */
b = 0;
c = 1;
} else {
/* Fractional */
uint32_t g = gcd(rem, rate_num);
rem /= g;
rate_num /= g;
if (rate_num < (1<<20)) {
/* Perfect match */
b = rem;
c = rate_num;
} else {
/* Approximate */
c = (1<<20) - 1;
b = ((uint64_t)c * (uint64_t)rem) / rate_num;
g = gcd(b, c);
b /= g;
c /= g;
}
}
/* Can we enable integer mode ? */
if (a & 0x1 || b)
si5351c_set_int_mode(&clock_gen, 0, 0);
else
si5351c_set_int_mode(&clock_gen, 0, 1);
/* Final MS values */
MSx_P1 = 128*a + (128 * b/c) - 512;
MSx_P2 = (128*b) % c;
MSx_P3 = c;
/* MS0/CLK0 is the source for the MAX5864/CPLD (CODEC_CLK). */
si5351c_configure_multisynth(&clock_gen, 0, MSx_P1, MSx_P2, MSx_P3, 1);
/* MS0/CLK1 is the source for the CPLD (CODEC_X2_CLK). */
si5351c_configure_multisynth(&clock_gen, 1, 0, 0, 0, 0);//p1 doesn't matter
/* MS0/CLK2 is the source for SGPIO (CODEC_X2_CLK) */
si5351c_configure_multisynth(&clock_gen, 2, 0, 0, 0, 0);//p1 doesn't matter
return true;
}
bool sample_rate_set(const uint32_t sample_rate_hz) {
uint32_t p1 = 4608;
uint32_t p2 = 0;
uint32_t p3 = 0;
switch(sample_rate_hz) {
case 8000000:
p1 = SI_INTDIV(50); // 800MHz / 50 = 16 MHz (SGPIO), 8 MHz (codec)
break;
case 9216000:
// 43.40277777777778: a = 43; b = 29; c = 72
p1 = 5043;
p2 = 40;
p3 = 72;
break;
case 10000000:
p1 = SI_INTDIV(40); // 800MHz / 40 = 20 MHz (SGPIO), 10 MHz (codec)
break;
case 12288000:
// 32.552083333333336: a = 32; b = 159; c = 288
p1 = 3654;
p2 = 192;
p3 = 288;
break;
case 12500000:
p1 = SI_INTDIV(32); // 800MHz / 32 = 25 MHz (SGPIO), 12.5 MHz (codec)
break;
case 16000000:
p1 = SI_INTDIV(25); // 800MHz / 25 = 32 MHz (SGPIO), 16 MHz (codec)
break;
case 18432000:
// 21.70138888889: a = 21; b = 101; c = 144
p1 = 2265;
p2 = 112;
p3 = 144;
break;
case 20000000:
p1 = SI_INTDIV(20); // 800MHz / 20 = 40 MHz (SGPIO), 20 MHz (codec)
break;
default:
return false;
}
/* MS0/CLK0 is the source for the MAX5864/CPLD (CODEC_CLK). */
si5351c_configure_multisynth(&clock_gen, 0, p1, p2, p3, 1);
/* MS0/CLK1 is the source for the CPLD (CODEC_X2_CLK). */
si5351c_configure_multisynth(&clock_gen, 1, p1, 0, 1, 0);//p1 doesn't matter
/* MS0/CLK2 is the source for SGPIO (CODEC_X2_CLK) */
si5351c_configure_multisynth(&clock_gen, 2, p1, 0, 1, 0);//p1 doesn't matter
return true;
}
bool baseband_filter_bandwidth_set(const uint32_t bandwidth_hz) {
uint32_t bandwidth_hz_real = max2837_set_lpf_bandwidth(&max2837, bandwidth_hz);
if(bandwidth_hz_real) hackrf_ui()->set_filter_bw(bandwidth_hz_real);
return bandwidth_hz_real != 0;
}
/*
Configure PLL1 (Main MCU Clock) to max speed (204MHz).
Note: PLL1 clock is used by M4/M0 core, Peripheral, APB1.
This function shall be called after cpu_clock_init().
*/
static void cpu_clock_pll1_max_speed(void)
{
uint32_t pll_reg;
/* Configure PLL1 to Intermediate Clock (between 90 MHz and 110 MHz) */
/* Integer mode:
FCLKOUT = M*(FCLKIN/N)
FCCO = 2*P*FCLKOUT = 2*P*M*(FCLKIN/N)
*/
pll_reg = CGU_PLL1_CTRL;
/* Clear PLL1 bits */
pll_reg &= ~( CGU_PLL1_CTRL_CLK_SEL_MASK | CGU_PLL1_CTRL_PD_MASK | CGU_PLL1_CTRL_FBSEL_MASK | /* CLK SEL, PowerDown , FBSEL */
CGU_PLL1_CTRL_BYPASS_MASK | /* BYPASS */
CGU_PLL1_CTRL_DIRECT_MASK | /* DIRECT */
CGU_PLL1_CTRL_PSEL_MASK | CGU_PLL1_CTRL_MSEL_MASK | CGU_PLL1_CTRL_NSEL_MASK ); /* PSEL, MSEL, NSEL- divider ratios */
/* Set PLL1 up to 12MHz * 8 = 96MHz. */
pll_reg |= CGU_PLL1_CTRL_CLK_SEL(CGU_SRC_XTAL)
| CGU_PLL1_CTRL_PSEL(0)
| CGU_PLL1_CTRL_NSEL(0)
| CGU_PLL1_CTRL_MSEL(7)
| CGU_PLL1_CTRL_FBSEL(1);
CGU_PLL1_CTRL = pll_reg;
/* wait until stable */
while (!(CGU_PLL1_STAT & CGU_PLL1_STAT_LOCK_MASK));
/* use PLL1 as clock source for BASE_M4_CLK (CPU) */
CGU_BASE_M4_CLK = (CGU_BASE_M4_CLK_CLK_SEL(CGU_SRC_PLL1) | CGU_BASE_M4_CLK_AUTOBLOCK(1));
/* Wait before to switch to max speed */
delay(WAIT_CPU_CLOCK_INIT_DELAY);
/* Configure PLL1 Max Speed */
/* Direct mode: FCLKOUT = FCCO = M*(FCLKIN/N) */
pll_reg = CGU_PLL1_CTRL;
/* Clear PLL1 bits */
pll_reg &= ~( CGU_PLL1_CTRL_CLK_SEL_MASK | CGU_PLL1_CTRL_PD_MASK | CGU_PLL1_CTRL_FBSEL_MASK | /* CLK SEL, PowerDown , FBSEL */
CGU_PLL1_CTRL_BYPASS_MASK | /* BYPASS */
CGU_PLL1_CTRL_DIRECT_MASK | /* DIRECT */
CGU_PLL1_CTRL_PSEL_MASK | CGU_PLL1_CTRL_MSEL_MASK | CGU_PLL1_CTRL_NSEL_MASK ); /* PSEL, MSEL, NSEL- divider ratios */
/* Set PLL1 up to 12MHz * 17 = 204MHz. */
pll_reg |= CGU_PLL1_CTRL_CLK_SEL(CGU_SRC_XTAL)
| CGU_PLL1_CTRL_PSEL(0)
| CGU_PLL1_CTRL_NSEL(0)
| CGU_PLL1_CTRL_MSEL(16)
| CGU_PLL1_CTRL_FBSEL(1)
| CGU_PLL1_CTRL_DIRECT(1);
CGU_PLL1_CTRL = pll_reg;
/* wait until stable */
while (!(CGU_PLL1_STAT & CGU_PLL1_STAT_LOCK_MASK));
}
/* clock startup for LPC4320 configure PLL1 to max speed (204MHz).
Note: PLL1 clock is used by M4/M0 core, Peripheral, APB1. */
void cpu_clock_init(void)
{
/* use IRC as clock source for APB1 (including I2C0) */
CGU_BASE_APB1_CLK = CGU_BASE_APB1_CLK_CLK_SEL(CGU_SRC_IRC);
/* use IRC as clock source for APB3 */
CGU_BASE_APB3_CLK = CGU_BASE_APB3_CLK_CLK_SEL(CGU_SRC_IRC);
i2c_bus_start(clock_gen.bus, &i2c_config_si5351c_fast_clock);
si5351c_disable_all_outputs(&clock_gen);
si5351c_disable_oeb_pin_control(&clock_gen);
si5351c_power_down_all_clocks(&clock_gen);
si5351c_set_crystal_configuration(&clock_gen);
si5351c_enable_xo_and_ms_fanout(&clock_gen);
si5351c_configure_pll_sources(&clock_gen);
si5351c_configure_pll_multisynth(&clock_gen);
/*
* Clocks:
* CLK0 -> MAX5864/CPLD
* CLK1 -> CPLD
* CLK2 -> SGPIO
* CLK3 -> External Clock Output (power down at boot)
* CLK4 -> RFFC5072 (MAX2837 on rad1o)
* CLK5 -> MAX2837 (MAX2871 on rad1o)
* CLK6 -> none
* CLK7 -> LPC43xx (uses a 12MHz crystal by default)
*/
/* MS4/CLK4 is the source for the RFFC5071 mixer (MAX2837 on rad1o). */
si5351c_configure_multisynth(&clock_gen, 4, 20*128-512, 0, 1, 0); /* 800/20 = 40MHz */
/* MS5/CLK5 is the source for the MAX2837 clock input (MAX2871 on rad1o). */
si5351c_configure_multisynth(&clock_gen, 5, 20*128-512, 0, 1, 0); /* 800/20 = 40MHz */
/* MS6/CLK6 is unused. */
/* MS7/CLK7 is unused. */
/* Set to 10 MHz, the common rate between Jawbreaker and HackRF One. */
sample_rate_set(10000000);
si5351c_set_clock_source(&clock_gen, PLL_SOURCE_XTAL);
// soft reset
si5351c_reset_pll(&clock_gen);
si5351c_enable_clock_outputs(&clock_gen);
//FIXME disable I2C
/* Kick I2C0 down to 400kHz when we switch over to APB1 clock = 204MHz */
i2c_bus_start(clock_gen.bus, &i2c_config_si5351c_fast_clock);
/*
* 12MHz clock is entering LPC XTAL1/OSC input now.
* On HackRF One and Jawbreaker, there is a 12 MHz crystal at the LPC.
* Set up PLL1 to run from XTAL1 input.
*/
//FIXME a lot of the details here should be in a CGU driver
/* set xtal oscillator to low frequency mode */
CGU_XTAL_OSC_CTRL &= ~CGU_XTAL_OSC_CTRL_HF_MASK;
/* power on the oscillator and wait until stable */
CGU_XTAL_OSC_CTRL &= ~CGU_XTAL_OSC_CTRL_ENABLE_MASK;
/* Wait about 100us after Crystal Power ON */
delay(WAIT_CPU_CLOCK_INIT_DELAY);
/* use XTAL_OSC as clock source for BASE_M4_CLK (CPU) */
CGU_BASE_M4_CLK = (CGU_BASE_M4_CLK_CLK_SEL(CGU_SRC_XTAL) | CGU_BASE_M4_CLK_AUTOBLOCK(1));
/* use XTAL_OSC as clock source for APB1 */
CGU_BASE_APB1_CLK = CGU_BASE_APB1_CLK_AUTOBLOCK(1)
| CGU_BASE_APB1_CLK_CLK_SEL(CGU_SRC_XTAL);
/* use XTAL_OSC as clock source for APB3 */
CGU_BASE_APB3_CLK = CGU_BASE_APB3_CLK_AUTOBLOCK(1)
| CGU_BASE_APB3_CLK_CLK_SEL(CGU_SRC_XTAL);
cpu_clock_pll1_max_speed();
/* use XTAL_OSC as clock source for PLL0USB */
CGU_PLL0USB_CTRL = CGU_PLL0USB_CTRL_PD(1)
| CGU_PLL0USB_CTRL_AUTOBLOCK(1)
| CGU_PLL0USB_CTRL_CLK_SEL(CGU_SRC_XTAL);
while (CGU_PLL0USB_STAT & CGU_PLL0USB_STAT_LOCK_MASK);
/* configure PLL0USB to produce 480 MHz clock from 12 MHz XTAL_OSC */
/* Values from User Manual v1.4 Table 94, for 12MHz oscillator. */
CGU_PLL0USB_MDIV = 0x06167FFA;
CGU_PLL0USB_NP_DIV = 0x00302062;
CGU_PLL0USB_CTRL |= (CGU_PLL0USB_CTRL_PD(1)
| CGU_PLL0USB_CTRL_DIRECTI(1)
| CGU_PLL0USB_CTRL_DIRECTO(1)
| CGU_PLL0USB_CTRL_CLKEN(1));
/* power on PLL0USB and wait until stable */
CGU_PLL0USB_CTRL &= ~CGU_PLL0USB_CTRL_PD_MASK;
while (!(CGU_PLL0USB_STAT & CGU_PLL0USB_STAT_LOCK_MASK));
/* use PLL0USB as clock source for USB0 */
CGU_BASE_USB0_CLK = CGU_BASE_USB0_CLK_AUTOBLOCK(1)
| CGU_BASE_USB0_CLK_CLK_SEL(CGU_SRC_PLL0USB);
/* Switch peripheral clock over to use PLL1 (204MHz) */
CGU_BASE_PERIPH_CLK = CGU_BASE_PERIPH_CLK_AUTOBLOCK(1)
| CGU_BASE_PERIPH_CLK_CLK_SEL(CGU_SRC_PLL1);
/* Switch APB1 clock over to use PLL1 (204MHz) */
CGU_BASE_APB1_CLK = CGU_BASE_APB1_CLK_AUTOBLOCK(1)
| CGU_BASE_APB1_CLK_CLK_SEL(CGU_SRC_PLL1);
/* Switch APB3 clock over to use PLL1 (204MHz) */
CGU_BASE_APB3_CLK = CGU_BASE_APB3_CLK_AUTOBLOCK(1)
| CGU_BASE_APB3_CLK_CLK_SEL(CGU_SRC_PLL1);
CGU_BASE_SSP0_CLK = CGU_BASE_SSP0_CLK_AUTOBLOCK(1)
| CGU_BASE_SSP0_CLK_CLK_SEL(CGU_SRC_PLL1);
CGU_BASE_SSP1_CLK = CGU_BASE_SSP1_CLK_AUTOBLOCK(1)
| CGU_BASE_SSP1_CLK_CLK_SEL(CGU_SRC_PLL1);
#if (defined JAWBREAKER || defined HACKRF_ONE)
/* Disable unused clocks */
/* Start with PLLs */
CGU_PLL0AUDIO_CTRL = CGU_PLL0AUDIO_CTRL_PD(1);
/* Dividers */
CGU_IDIVA_CTRL = CGU_IDIVA_CTRL_PD(1);
CGU_IDIVB_CTRL = CGU_IDIVB_CTRL_PD(1);
CGU_IDIVC_CTRL = CGU_IDIVC_CTRL_PD(1);
CGU_IDIVD_CTRL = CGU_IDIVD_CTRL_PD(1);
CGU_IDIVE_CTRL = CGU_IDIVE_CTRL_PD(1);
/* Base clocks */
CGU_BASE_SPIFI_CLK = CGU_BASE_SPIFI_CLK_PD(1); /* SPIFI is only used at boot */
CGU_BASE_USB1_CLK = CGU_BASE_USB1_CLK_PD(1); /* USB1 is not exposed on HackRF */
CGU_BASE_PHY_RX_CLK = CGU_BASE_PHY_RX_CLK_PD(1);
CGU_BASE_PHY_TX_CLK = CGU_BASE_PHY_TX_CLK_PD(1);
CGU_BASE_LCD_CLK = CGU_BASE_LCD_CLK_PD(1);
CGU_BASE_VADC_CLK = CGU_BASE_VADC_CLK_PD(1);
CGU_BASE_SDIO_CLK = CGU_BASE_SDIO_CLK_PD(1);
CGU_BASE_UART0_CLK = CGU_BASE_UART0_CLK_PD(1);
CGU_BASE_UART1_CLK = CGU_BASE_UART1_CLK_PD(1);
CGU_BASE_UART2_CLK = CGU_BASE_UART2_CLK_PD(1);
CGU_BASE_UART3_CLK = CGU_BASE_UART3_CLK_PD(1);
CGU_BASE_OUT_CLK = CGU_BASE_OUT_CLK_PD(1);
CGU_BASE_AUDIO_CLK = CGU_BASE_AUDIO_CLK_PD(1);
CGU_BASE_CGU_OUT0_CLK = CGU_BASE_CGU_OUT0_CLK_PD(1);
CGU_BASE_CGU_OUT1_CLK = CGU_BASE_CGU_OUT1_CLK_PD(1);
/* Disable unused peripheral clocks */
CCU1_CLK_APB1_CAN1_CFG = 0;
CCU1_CLK_APB1_I2S_CFG = 0;
CCU1_CLK_APB1_MOTOCONPWM_CFG = 0;
CCU1_CLK_APB3_ADC0_CFG = 0;
CCU1_CLK_APB3_ADC1_CFG = 0;
CCU1_CLK_APB3_CAN0_CFG = 0;
CCU1_CLK_APB3_DAC_CFG = 0;
CCU1_CLK_M4_DMA_CFG = 0;
CCU1_CLK_M4_EMC_CFG = 0;
CCU1_CLK_M4_EMCDIV_CFG = 0;
CCU1_CLK_M4_ETHERNET_CFG = 0;
CCU1_CLK_M4_LCD_CFG = 0;
CCU1_CLK_M4_QEI_CFG = 0;
CCU1_CLK_M4_RITIMER_CFG = 0;
CCU1_CLK_M4_SCT_CFG = 0;
CCU1_CLK_M4_SDIO_CFG = 0;
CCU1_CLK_M4_SPIFI_CFG = 0;
CCU1_CLK_M4_TIMER0_CFG = 0;
CCU1_CLK_M4_TIMER1_CFG = 0;
CCU1_CLK_M4_TIMER2_CFG = 0;
CCU1_CLK_M4_TIMER3_CFG = 0;
CCU1_CLK_M4_UART1_CFG = 0;
CCU1_CLK_M4_USART0_CFG = 0;
CCU1_CLK_M4_USART2_CFG = 0;
CCU1_CLK_M4_USART3_CFG = 0;
CCU1_CLK_M4_USB1_CFG = 0;
CCU1_CLK_M4_VADC_CFG = 0;
// CCU1_CLK_SPIFI_CFG = 0;
// CCU1_CLK_USB1_CFG = 0;
// CCU1_CLK_VADC_CFG = 0;
// CCU2_CLK_APB0_UART1_CFG = 0;
// CCU2_CLK_APB0_USART0_CFG = 0;
// CCU2_CLK_APB2_USART2_CFG = 0;
// CCU2_CLK_APB2_USART3_CFG = 0;
// CCU2_CLK_APLL_CFG = 0;
// CCU2_CLK_SDIO_CFG = 0;
#endif
}
clock_source_t activate_best_clock_source(void)
{
#ifdef HACKRF_ONE
/* Ensure PortaPack reference oscillator is off while checking for external clock input. */
if( portapack_reference_oscillator && portapack()) {
portapack_reference_oscillator(false);
}
#endif
clock_source_t source = CLOCK_SOURCE_HACKRF;
/* Check for external clock input. */
if (si5351c_clkin_signal_valid(&clock_gen)) {
source = CLOCK_SOURCE_EXTERNAL;
} else {
#ifdef HACKRF_ONE
/* Enable PortaPack reference oscillator (if present), and check for valid clock. */
if( portapack_reference_oscillator && portapack() ) {
portapack_reference_oscillator(true);
delay(510000); /* loop iterations @ 204MHz for >10ms for oscillator to enable. */
if (si5351c_clkin_signal_valid(&clock_gen)) {
source = CLOCK_SOURCE_PORTAPACK;
} else {
portapack_reference_oscillator(false);
}
}
#endif
/* No external or PortaPack clock was found. Use HackRF Si5351C crystal. */
}
si5351c_set_clock_source(&clock_gen, (source == CLOCK_SOURCE_HACKRF) ? PLL_SOURCE_XTAL : PLL_SOURCE_CLKIN);
hackrf_ui()->set_clock_source(source);
return source;
}
void ssp1_set_mode_max2837(void)
{
spi_bus_start(max2837.bus, &ssp_config_max2837);
}
void ssp1_set_mode_max5864(void)
{
spi_bus_start(max5864.bus, &ssp_config_max5864);
}
void pin_setup(void) {
/* Configure all GPIO as Input (safe state) */
gpio_init();
/* TDI and TMS pull-ups are required in all JTAG-compliant devices.
*
* The HackRF CPLD is always present, so let the CPLD pull up its TDI and TMS.
*
* The PortaPack may not be present, so pull up the PortaPack TMS pin from the
* microcontroller.
*
* TCK is recommended to be held low, so use microcontroller pull-down.
*
* TDO is undriven except when in Shift-IR or Shift-DR phases.
* Use the microcontroller to pull down to keep from floating.
*
* LPC43xx pull-up and pull-down resistors are approximately 53K.
*/
#ifdef HACKRF_ONE
scu_pinmux(SCU_PINMUX_PP_TMS, SCU_GPIO_PUP | SCU_CONF_FUNCTION0);
scu_pinmux(SCU_PINMUX_PP_TDO, SCU_GPIO_PDN | SCU_CONF_FUNCTION0);
#endif
scu_pinmux(SCU_PINMUX_CPLD_TMS, SCU_GPIO_NOPULL | SCU_CONF_FUNCTION0);
scu_pinmux(SCU_PINMUX_CPLD_TDI, SCU_GPIO_NOPULL | SCU_CONF_FUNCTION0);
scu_pinmux(SCU_PINMUX_CPLD_TDO, SCU_GPIO_PDN | SCU_CONF_FUNCTION4);
scu_pinmux(SCU_PINMUX_CPLD_TCK, SCU_GPIO_PDN | SCU_CONF_FUNCTION0);
/* Configure SCU Pin Mux as GPIO */
scu_pinmux(SCU_PINMUX_LED1, SCU_GPIO_NOPULL);
scu_pinmux(SCU_PINMUX_LED2, SCU_GPIO_NOPULL);
scu_pinmux(SCU_PINMUX_LED3, SCU_GPIO_NOPULL);
#ifdef RAD1O
scu_pinmux(SCU_PINMUX_LED4, SCU_GPIO_NOPULL | SCU_CONF_FUNCTION4);
#endif
/* Configure USB indicators */
#ifdef JAWBREAKER
scu_pinmux(SCU_PINMUX_USB_LED0, SCU_CONF_FUNCTION3);
scu_pinmux(SCU_PINMUX_USB_LED1, SCU_CONF_FUNCTION3);
#endif
gpio_output(&gpio_led[0]);
gpio_output(&gpio_led[1]);
gpio_output(&gpio_led[2]);
#ifdef RAD1O
gpio_output(&gpio_led[3]);
#endif
disable_1v8_power();
gpio_output(&gpio_1v8_enable);
scu_pinmux(SCU_PINMUX_EN1V8, SCU_GPIO_NOPULL | SCU_CONF_FUNCTION0);
#ifdef HACKRF_ONE
/* Safe state: start with VAA turned off: */
disable_rf_power();
/* Configure RF power supply (VAA) switch control signal as output */
gpio_output(&gpio_vaa_disable);
#endif
#ifdef RAD1O
/* Safe state: start with VAA turned off: */
disable_rf_power();
/* Configure RF power supply (VAA) switch control signal as output */
gpio_output(&gpio_vaa_enable);
/* Disable unused clock outputs. They generate noise. */
scu_pinmux(CLK0, SCU_CLK_IN | SCU_CONF_FUNCTION7);
scu_pinmux(CLK2, SCU_CLK_IN | SCU_CONF_FUNCTION7);
scu_pinmux(SCU_PINMUX_GPIO3_10, SCU_GPIO_PDN | SCU_CONF_FUNCTION0);
scu_pinmux(SCU_PINMUX_GPIO3_11, SCU_GPIO_PDN | SCU_CONF_FUNCTION0);
#endif
/* enable input on SCL and SDA pins */
SCU_SFSI2C0 = SCU_I2C0_NOMINAL;
spi_bus_start(&spi_bus_ssp1, &ssp_config_max2837);
mixer_bus_setup(&mixer);
rf_path_pin_setup(&rf_path);
/* Configure external clock in */
scu_pinmux(SCU_PINMUX_GP_CLKIN, SCU_CLK_IN | SCU_CONF_FUNCTION1);
sgpio_configure_pin_functions(&sgpio_config);
}
void enable_1v8_power(void) {
gpio_set(&gpio_1v8_enable);
}
void disable_1v8_power(void) {
gpio_clear(&gpio_1v8_enable);
}
#ifdef HACKRF_ONE
void enable_rf_power(void) {
uint32_t i;
/* many short pulses to avoid one big voltage glitch */
for (i = 0; i < 1000; i++) {
gpio_clear(&gpio_vaa_disable);
gpio_set(&gpio_vaa_disable);
}
gpio_clear(&gpio_vaa_disable);
}
void disable_rf_power(void) {
gpio_set(&gpio_vaa_disable);
}
#endif
#ifdef RAD1O
void enable_rf_power(void) {
gpio_set(&gpio_vaa_enable);
}
void disable_rf_power(void) {
gpio_clear(&gpio_vaa_enable);
}
#endif
void led_on(const led_t led) {
gpio_set(&gpio_led[led]);
}
void led_off(const led_t led) {
gpio_clear(&gpio_led[led]);
}
void led_toggle(const led_t led) {
gpio_toggle(&gpio_led[led]);
}
void hw_sync_enable(const hw_sync_mode_t hw_sync_mode){
gpio_write(&gpio_hw_sync_enable, hw_sync_mode==1);
}
void halt_and_flash(const uint32_t duration) {
/* blink LED1, LED2, and LED3 */
while (1)
{
led_on(LED1);
led_on(LED2);
led_on(LED3);
delay(duration);
led_off(LED1);
led_off(LED2);
led_off(LED3);
delay(duration);
}
}

View File

@ -0,0 +1,330 @@
/*
* Copyright 2012 Michael Ossmann <mike@ossmann.com>
* Copyright 2012 Benjamin Vernoux <titanmkd@gmail.com>
* Copyright 2012 Jared Boone <jared@sharebrained.com>
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#ifndef __HACKRF_CORE_H
#define __HACKRF_CORE_H
#ifdef __cplusplus
extern "C"
{
#endif
#include <stdint.h>
#include <stdbool.h>
#include "si5351c.h"
#include "spi_ssp.h"
#include "max2837.h"
#include "max5864.h"
#include "mixer.h"
#include "w25q80bv.h"
#include "sgpio.h"
#include "rf_path.h"
#include "cpld_jtag.h"
/* hardware identification number */
#define BOARD_ID_JAWBREAKER 1
#define BOARD_ID_HACKRF_ONE 2
#define BOARD_ID_RAD1O 3
#ifdef JAWBREAKER
#define BOARD_ID BOARD_ID_JAWBREAKER
#endif
#ifdef HACKRF_ONE
#define BOARD_ID BOARD_ID_HACKRF_ONE
#endif
#ifdef RAD1O
#define BOARD_ID BOARD_ID_RAD1O
#endif
/*
* SCU PinMux
*/
/* GPIO Output PinMux */
#define SCU_PINMUX_LED1 (P4_1) /* GPIO2[1] on P4_1 */
#define SCU_PINMUX_LED2 (P4_2) /* GPIO2[2] on P4_2 */
#define SCU_PINMUX_LED3 (P6_12) /* GPIO2[8] on P6_12 */
#ifdef RAD1O
#define SCU_PINMUX_LED4 (PB_6) /* GPIO5[26] on PB_6 */
#endif
#define SCU_PINMUX_EN1V8 (P6_10) /* GPIO3[6] on P6_10 */
/* GPIO Input PinMux */
#define SCU_PINMUX_BOOT0 (P1_1) /* GPIO0[8] on P1_1 */
#define SCU_PINMUX_BOOT1 (P1_2) /* GPIO0[9] on P1_2 */
#ifndef HACKRF_ONE
#define SCU_PINMUX_BOOT2 (P2_8) /* GPIO5[7] on P2_8 */
#define SCU_PINMUX_BOOT3 (P2_9) /* GPIO1[10] on P2_9 */
#endif
#define SCU_PINMUX_PP_LCD_TE (P2_3) /* GPIO5[3] on P2_3 */
#define SCU_PINMUX_PP_LCD_RDX (P2_4) /* GPIO5[4] on P2_4 */
#define SCU_PINMUX_PP_UNUSED (P2_8) /* GPIO5[7] on P2_8 */
#define SCU_PINMUX_PP_LCD_WRX (P2_9) /* GPIO1[10] on P2_9 */
#define SCU_PINMUX_PP_DIR (P2_13) /* GPIO1[13] on P2_13 */
/* USB peripheral */
#ifdef JAWBREAKER
#define SCU_PINMUX_USB_LED0 (P6_8)
#define SCU_PINMUX_USB_LED1 (P6_7)
#endif
/* SSP1 Peripheral PinMux */
#define SCU_SSP1_CIPO (P1_3) /* P1_3 */
#define SCU_SSP1_COPI (P1_4) /* P1_4 */
#define SCU_SSP1_SCK (P1_19) /* P1_19 */
#define SCU_SSP1_CS (P1_20) /* P1_20 */
/* CPLD JTAG interface */
#define SCU_PINMUX_CPLD_TDO (P9_5) /* GPIO5[18] */
#define SCU_PINMUX_CPLD_TCK (P6_1) /* GPIO3[ 0] */
#if (defined HACKRF_ONE || defined RAD1O)
#define SCU_PINMUX_CPLD_TMS (P6_5) /* GPIO3[ 4] */
#define SCU_PINMUX_CPLD_TDI (P6_2) /* GPIO3[ 1] */
#else
#define SCU_PINMUX_CPLD_TMS (P6_2) /* GPIO3[ 1] */
#define SCU_PINMUX_CPLD_TDI (P6_5) /* GPIO3[ 4] */
#endif
/* CPLD SGPIO interface */
#define SCU_PINMUX_SGPIO0 (P0_0)
#define SCU_PINMUX_SGPIO1 (P0_1)
#define SCU_PINMUX_SGPIO2 (P1_15)
#define SCU_PINMUX_SGPIO3 (P1_16)
#define SCU_PINMUX_SGPIO4 (P6_3)
#define SCU_PINMUX_SGPIO5 (P6_6)
#define SCU_PINMUX_SGPIO6 (P2_2)
#define SCU_PINMUX_SGPIO7 (P1_0)
#if (defined JAWBREAKER || defined HACKRF_ONE || defined RAD1O)
#define SCU_PINMUX_SGPIO8 (P9_6)
#endif
#define SCU_PINMUX_SGPIO9 (P4_3)
#define SCU_PINMUX_SGPIO10 (P1_14)
#define SCU_PINMUX_SGPIO11 (P1_17)
#define SCU_PINMUX_SGPIO12 (P1_18)
#define SCU_PINMUX_SGPIO13 (P4_8)
#define SCU_PINMUX_SGPIO14 (P4_9)
#define SCU_PINMUX_SGPIO15 (P4_10)
/* MAX2837 GPIO (XCVR_CTL) PinMux */
#ifdef RAD1O
#define SCU_XCVR_RXHP (P8_1) /* GPIO[] on P8_1 */
#define SCU_XCVR_B6 (P8_2) /* GPIO[] on P8_2 */
#define SCU_XCVR_B7 (P9_3) /* GPIO[] on P8_3 */
#endif
#define SCU_XCVR_ENABLE (P4_6) /* GPIO2[6] on P4_6 */
#define SCU_XCVR_RXENABLE (P4_5) /* GPIO2[5] on P4_5 */
#define SCU_XCVR_TXENABLE (P4_4) /* GPIO2[4] on P4_4 */
#define SCU_XCVR_CS (P1_20) /* GPIO0[15] on P1_20 */
/* MAX5864 SPI chip select (AD_CS) GPIO PinMux */
#define SCU_AD_CS (P5_7) /* GPIO2[7] on P5_7 */
/* RFFC5071 GPIO serial interface PinMux */
#if (defined JAWBREAKER || defined HACKRF_ONE)
#define SCU_MIXER_ENX (P5_4) /* GPIO2[13] on P5_4 */
#define SCU_MIXER_SCLK (P2_6) /* GPIO5[6] on P2_6 */
#define SCU_MIXER_SDATA (P6_4) /* GPIO3[3] on P6_4 */
#define SCU_MIXER_RESETX (P5_5) /* GPIO2[14] on P5_5 */
#endif
#ifdef RAD1O
#define SCU_VCO_CE (P5_4) /* GPIO2[13] on P5_4 */
#define SCU_VCO_SCLK (P2_6) /* GPIO5[6] on P2_6 */
#define SCU_VCO_SDATA (P6_4) /* GPIO3[3] on P6_4 */
#define SCU_VCO_LE (P5_5) /* GPIO2[14] on P5_5 */
#define SCU_VCO_MUX (PB_5) /* GPIO5[25] on PB_5 */
#define SCU_MIXER_EN (P6_8) /* GPIO5[16] on P6_8 */
#define SCU_SYNT_RFOUT_EN (P6_9) /* GPIO3[5] on P6_9 */
#endif
/* RF LDO control */
#ifdef JAWBREAKER
#define SCU_RF_LDO_ENABLE (P5_0) /* GPIO2[9] on P5_0 */
#endif
/* RF supply (VAA) control */
#ifdef HACKRF_ONE
#define SCU_NO_VAA_ENABLE (P5_0) /* GPIO2[9] on P5_0 */
#endif
#ifdef RAD1O
#define SCU_VAA_ENABLE (P5_0) /* GPIO2[9] on P5_0 */
#endif
/* SPI flash */
#define SCU_SSP0_CIPO (P3_6)
#define SCU_SSP0_COPI (P3_7)
#define SCU_SSP0_SCK (P3_3)
#define SCU_SSP0_CS (P3_8) /* GPIO5[11] on P3_8 */
#define SCU_FLASH_HOLD (P3_4) /* GPIO1[14] on P3_4 */
#define SCU_FLASH_WP (P3_5) /* GPIO1[15] on P3_5 */
/* RF switch control */
#ifdef HACKRF_ONE
#define SCU_HP (P4_0) /* GPIO2[0] on P4_0 */
#define SCU_LP (P5_1) /* GPIO2[10] on P5_1 */
#define SCU_TX_MIX_BP (P5_2) /* GPIO2[11] on P5_2 */
#define SCU_NO_MIX_BYPASS (P1_7) /* GPIO1[0] on P1_7 */
#define SCU_RX_MIX_BP (P5_3) /* GPIO2[12] on P5_3 */
#define SCU_TX_AMP (P5_6) /* GPIO2[15] on P5_6 */
#define SCU_TX (P6_7) /* GPIO5[15] on P6_7 */
#define SCU_MIX_BYPASS (P6_8) /* GPIO5[16] on P6_8 */
#define SCU_RX (P2_5) /* GPIO5[5] on P2_5 */
#define SCU_NO_TX_AMP_PWR (P6_9) /* GPIO3[5] on P6_9 */
#define SCU_AMP_BYPASS (P2_10) /* GPIO0[14] on P2_10 */
#define SCU_RX_AMP (P2_11) /* GPIO1[11] on P2_11 */
#define SCU_NO_RX_AMP_PWR (P2_12) /* GPIO1[12] on P2_12 */
#endif
#ifdef RAD1O
#define SCU_BY_AMP (P1_7) /* GPIO1[0] on P1_7 */
#define SCU_BY_AMP_N (P2_5) /* GPIO5[5] on P2_5 */
#define SCU_TX_RX (P2_10) /* GPIO0[14] on P2_10 */
#define SCU_TX_RX_N (P2_11) /* GPIO1[11] on P2_11 */
#define SCU_BY_MIX (P2_12) /* GPIO1[12] on P2_12 */
#define SCU_BY_MIX_N (P5_1) /* GPIO2[10] on P5_1 */
#define SCU_LOW_HIGH_FILT (P5_2) /* GPIO2[11] on P5_2 */
#define SCU_LOW_HIGH_FILT_N (P5_3) /* GPIO2[12] on P5_3 */
#define SCU_TX_AMP (P5_6) /* GPIO2[15] on P5_6 */
#define SCU_RX_LNA (P6_7) /* GPIO5[15] on P6_7 */
#endif
#define SCU_PINMUX_PP_D0 (P7_0) /* GPIO3[8] */
#define SCU_PINMUX_PP_D1 (P7_1) /* GPIO3[9] */
#define SCU_PINMUX_PP_D2 (P7_2) /* GPIO3[10] */
#define SCU_PINMUX_PP_D3 (P7_3) /* GPIO3[11] */
#define SCU_PINMUX_PP_D4 (P7_4) /* GPIO3[12] */
#define SCU_PINMUX_PP_D5 (P7_5) /* GPIO3[13] */
#define SCU_PINMUX_PP_D6 (P7_6) /* GPIO3[14] */
#define SCU_PINMUX_PP_D7 (P7_7) /* GPIO3[15] */
/* TODO add other Pins */
#define SCU_PINMUX_GPIO3_8 (P7_0) /* GPIO3[8] */
#define SCU_PINMUX_GPIO3_9 (P7_1) /* GPIO3[9] */
#define SCU_PINMUX_GPIO3_10 (P7_2) /* GPIO3[10] */
#define SCU_PINMUX_GPIO3_11 (P7_3) /* GPIO3[11] */
#define SCU_PINMUX_GPIO3_12 (P7_4) /* GPIO3[12] */
#define SCU_PINMUX_GPIO3_13 (P7_5) /* GPIO3[13] */
#define SCU_PINMUX_GPIO3_14 (P7_6) /* GPIO3[14] */
#define SCU_PINMUX_GPIO3_15 (P7_7) /* GPIO3[15] */
#define SCU_PINMUX_PP_TDO (P1_5) /* GPIO1[8] */
#define SCU_PINMUX_SD_POW (P1_5) /* GPIO1[8] */
#define SCU_PINMUX_SD_CMD (P1_6) /* GPIO1[9] */
#define SCU_PINMUX_PP_TMS (P1_8) /* GPIO1[1] */
#define SCU_PINMUX_SD_VOLT0 (P1_8) /* GPIO1[1] */
#define SCU_PINMUX_SD_DAT0 (P1_9) /* GPIO1[2] */
#define SCU_PINMUX_SD_DAT1 (P1_10) /* GPIO1[3] */
#define SCU_PINMUX_SD_DAT2 (P1_11) /* GPIO1[4] */
#define SCU_PINMUX_SD_DAT3 (P1_12) /* GPIO1[5] */
#define SCU_PINMUX_SD_CD (P1_13) /* GPIO1[6] */
#define SCU_PINMUX_PP_IO_STBX (P2_0) /* GPIO5[0] */
#define SCU_PINMUX_PP_ADDR (P2_1) /* GPIO5[1] */
#define SCU_PINMUX_U0_TXD (P2_0) /* GPIO5[0] */
#define SCU_PINMUX_U0_RXD (P2_1) /* GPIO5[1] */
#define SCU_PINMUX_ISP (P2_7) /* GPIO0[7] */
#define SCU_PINMUX_GP_CLKIN (P4_7)
typedef enum {
TRANSCEIVER_MODE_OFF = 0,
TRANSCEIVER_MODE_RX = 1,
TRANSCEIVER_MODE_TX = 2,
TRANSCEIVER_MODE_SS = 3,
TRANSCEIVER_MODE_CPLD_UPDATE = 4,
TRANSCEIVER_MODE_RX_SWEEP = 5,
} transceiver_mode_t;
typedef enum {
HW_SYNC_MODE_OFF = 0,
HW_SYNC_MODE_ON = 1,
} hw_sync_mode_t;
typedef enum {
CLOCK_SOURCE_HACKRF = 0,
CLOCK_SOURCE_EXTERNAL = 1,
CLOCK_SOURCE_PORTAPACK = 2,
} clock_source_t;
void delay(uint32_t duration);
/* TODO: Hide these configurations */
extern si5351c_driver_t clock_gen;
extern const ssp_config_t ssp_config_w25q80bv;
extern const ssp_config_t ssp_config_max2837;
extern const ssp_config_t ssp_config_max5864;
extern max2837_driver_t max2837;
extern max5864_driver_t max5864;
extern mixer_driver_t mixer;
extern w25q80bv_driver_t spi_flash;
extern sgpio_config_t sgpio_config;
extern rf_path_t rf_path;
extern jtag_t jtag_cpld;
extern i2c_bus_t i2c0;
void cpu_clock_init(void);
void ssp1_set_mode_max2837(void);
void ssp1_set_mode_max5864(void);
void pin_setup(void);
void enable_1v8_power(void);
void disable_1v8_power(void);
bool sample_rate_frac_set(uint32_t rate_num, uint32_t rate_denom);
bool sample_rate_set(const uint32_t sampling_rate_hz);
bool baseband_filter_bandwidth_set(const uint32_t bandwidth_hz);
clock_source_t activate_best_clock_source(void);
#if (defined HACKRF_ONE || defined RAD1O)
void enable_rf_power(void);
void disable_rf_power(void);
#endif
typedef enum {
LED1 = 0,
LED2 = 1,
LED3 = 2,
LED4 = 3,
} led_t;
void led_on(const led_t led);
void led_off(const led_t led);
void led_toggle(const led_t led);
void hw_sync_enable(const hw_sync_mode_t hw_sync_mode);
void halt_and_flash(const uint32_t duration);
#ifdef __cplusplus
}
#endif
#endif /* __HACKRF_CORE_H */

View File

@ -0,0 +1,102 @@
/*
* Copyright (C) 2019 Jared Boone, ShareBrained Technology, Inc.
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#include "hackrf_ui.h"
#include "ui_portapack.h"
#include "ui_rad1o.h"
#include <stddef.h>
#define UNUSED(x) (void)(x)
/* Stub functions for null UI function table */
void hackrf_ui_init_null(void) { }
void hackrf_ui_deinit_null(void) { }
void hackrf_ui_set_frequency_null(uint64_t frequency) { UNUSED(frequency); }
void hackrf_ui_set_sample_rate_null(uint32_t sample_rate) { UNUSED(sample_rate); }
void hackrf_ui_set_direction_null(const rf_path_direction_t direction) { UNUSED(direction); }
void hackrf_ui_set_filter_bw_null(uint32_t bandwidth) { UNUSED(bandwidth); }
void hackrf_ui_set_lna_power_null(bool lna_on) { UNUSED(lna_on); }
void hackrf_ui_set_bb_lna_gain_null(const uint32_t gain_db) { UNUSED(gain_db); }
void hackrf_ui_set_bb_vga_gain_null(const uint32_t gain_db) { UNUSED(gain_db); }
void hackrf_ui_set_bb_tx_vga_gain_null(const uint32_t gain_db) { UNUSED(gain_db); }
void hackrf_ui_set_first_if_frequency_null(const uint64_t frequency) { UNUSED(frequency); }
void hackrf_ui_set_filter_null(const rf_path_filter_t filter) { UNUSED(filter); }
void hackrf_ui_set_antenna_bias_null(bool antenna_bias) { UNUSED(antenna_bias); }
void hackrf_ui_set_clock_source_null(clock_source_t source) { UNUSED(source); }
bool hackrf_ui_operacake_gpio_compatible_null(void) { return true; }
/* Null UI function table, used if there's no hardware UI detected. Eliminates the
* need to check for null UI before calling a function in the table.
*/
static const hackrf_ui_t hackrf_ui_null = {
&hackrf_ui_init_null,
&hackrf_ui_deinit_null,
&hackrf_ui_set_frequency_null,
&hackrf_ui_set_sample_rate_null,
&hackrf_ui_set_direction_null,
&hackrf_ui_set_filter_bw_null,
&hackrf_ui_set_lna_power_null,
&hackrf_ui_set_bb_lna_gain_null,
&hackrf_ui_set_bb_vga_gain_null,
&hackrf_ui_set_bb_tx_vga_gain_null,
&hackrf_ui_set_first_if_frequency_null,
&hackrf_ui_set_filter_null,
&hackrf_ui_set_antenna_bias_null,
&hackrf_ui_set_clock_source_null,
&hackrf_ui_operacake_gpio_compatible_null
};
static const hackrf_ui_t* ui = NULL;
static bool ui_enabled = true;
const hackrf_ui_t* hackrf_ui(void) {
/* Detect on first use. If no UI hardware is detected, use a stub function table. */
if( ui == NULL && ui_enabled ) {
#ifdef HACKRF_ONE
if( portapack_hackrf_ui_init ) {
ui = portapack_hackrf_ui_init();
}
#endif
#ifdef RAD1O
if( rad1o_ui_setup ) {
ui = rad1o_ui_setup();
}
#endif
}
if( ui == NULL ) {
ui = &hackrf_ui_null;
}
return ui;
}
void hackrf_ui_set_enable(bool enabled) {
if (ui_enabled != enabled) {
ui_enabled = enabled;
hackrf_ui()->deinit();
ui = NULL;
if (enabled) {
hackrf_ui()->init();
}
}
}

View File

@ -0,0 +1,69 @@
/*
* Copyright (C) 2018 Jared Boone, ShareBrained Technology, Inc.
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#ifndef HACKRF_UI_H
#define HACKRF_UI_H
#include <hackrf_core.h>
#include <stdint.h>
typedef void (*hackrf_ui_init_fn)(void);
typedef void (*hackrf_ui_deinit_fn)(void);
typedef void (*hackrf_ui_set_frequency_fn)(uint64_t frequency);
typedef void (*hackrf_ui_set_sample_rate_fn)(uint32_t sample_rate);
typedef void (*hackrf_ui_set_direction_fn)(const rf_path_direction_t direction);
typedef void (*hackrf_ui_set_filter_bw_fn)(uint32_t bandwidth);
typedef void (*hackrf_ui_set_lna_power_fn)(bool lna_on);
typedef void (*hackrf_ui_set_bb_lna_gain_fn)(const uint32_t gain_db);
typedef void (*hackrf_ui_set_bb_vga_gain_fn)(const uint32_t gain_db);
typedef void (*hackrf_ui_set_bb_tx_vga_gain_fn)(const uint32_t gain_db);
typedef void (*hackrf_ui_set_first_if_frequency_fn)(const uint64_t frequency);
typedef void (*hackrf_ui_set_filter_fn)(const rf_path_filter_t filter);
typedef void (*hackrf_ui_set_antenna_bias_fn)(bool antenna_bias);
typedef void (*hackrf_ui_set_clock_source_fn)(clock_source_t source);
typedef bool (*hackrf_ui_operacake_gpio_compatible_fn)(void);
typedef struct {
hackrf_ui_init_fn init;
hackrf_ui_deinit_fn deinit;
hackrf_ui_set_frequency_fn set_frequency;
hackrf_ui_set_sample_rate_fn set_sample_rate;
hackrf_ui_set_direction_fn set_direction;
hackrf_ui_set_filter_bw_fn set_filter_bw;
hackrf_ui_set_lna_power_fn set_lna_power;
hackrf_ui_set_bb_lna_gain_fn set_bb_lna_gain;
hackrf_ui_set_bb_vga_gain_fn set_bb_vga_gain;
hackrf_ui_set_bb_tx_vga_gain_fn set_bb_tx_vga_gain;
hackrf_ui_set_first_if_frequency_fn set_first_if_frequency;
hackrf_ui_set_filter_fn set_filter;
hackrf_ui_set_antenna_bias_fn set_antenna_bias;
hackrf_ui_set_clock_source_fn set_clock_source;
hackrf_ui_operacake_gpio_compatible_fn operacake_gpio_compatible;
} hackrf_ui_t;
/* TODO: Lame hack to know that PortaPack was detected.
* In the future, whatever UI was detected will be returned here,
* or NULL if no UI was detected.
*/
const hackrf_ui_t* hackrf_ui(void);
void hackrf_ui_set_enable(bool);
#endif

View File

@ -0,0 +1,39 @@
/*
* Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc.
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#include "i2c_bus.h"
void i2c_bus_start(i2c_bus_t* const bus, const void* const config) {
bus->start(bus, config);
}
void i2c_bus_stop(i2c_bus_t* const bus) {
bus->stop(bus);
}
void i2c_bus_transfer(
i2c_bus_t* const bus,
const uint_fast8_t peripheral_address,
const uint8_t* const tx, const size_t tx_count,
uint8_t* const rx, const size_t rx_count
) {
bus->transfer(bus, peripheral_address, tx, tx_count, rx, rx_count);
}

View File

@ -0,0 +1,52 @@
/*
* Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc.
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#ifndef __I2C_BUS_H__
#define __I2C_BUS_H__
#include <stdint.h>
#include <stddef.h>
struct i2c_bus_t;
typedef struct i2c_bus_t i2c_bus_t;
struct i2c_bus_t {
void* const obj;
void (*start)(i2c_bus_t* const bus, const void* const config);
void (*stop)(i2c_bus_t* const bus);
void (*transfer)(
i2c_bus_t* const bus,
const uint_fast8_t peripheral_address,
const uint8_t* const tx, const size_t tx_count,
uint8_t* const rx, const size_t rx_count
);
};
void i2c_bus_start(i2c_bus_t* const bus, const void* const config);
void i2c_bus_stop(i2c_bus_t* const bus);
void i2c_bus_transfer(
i2c_bus_t* const bus,
const uint_fast8_t peripheral_address,
const uint8_t* const tx, const size_t tx_count,
uint8_t* const rx, const size_t rx_count
);
#endif/*__I2C_BUS_H__*/

View File

@ -0,0 +1,79 @@
/*
* Copyright 2012 Michael Ossmann <mike@ossmann.com>
* Copyright 2012 Jared Boone <jared@sharebrained.com>
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#include "i2c_lpc.h"
#include <libopencm3/lpc43xx/i2c.h>
/* FIXME return i2c0 status from each function */
void i2c_lpc_start(i2c_bus_t* const bus, const void* const _config) {
const i2c_lpc_config_t* const config = _config;
const uint32_t port = (uint32_t)bus->obj;
i2c_init(port, config->duty_cycle_count);
}
void i2c_lpc_stop(i2c_bus_t* const bus) {
const uint32_t port = (uint32_t)bus->obj;
i2c_disable(port);
}
void i2c_lpc_transfer(i2c_bus_t* const bus,
const uint_fast8_t peripheral_address,
const uint8_t* const data_tx, const size_t count_tx,
uint8_t* const data_rx, const size_t count_rx
) {
const uint32_t port = (uint32_t)bus->obj;
size_t i;
bool ack = false;
if (data_tx && (count_tx > 0)) {
i2c_tx_start(port);
i2c_tx_byte(port, (peripheral_address << 1) | I2C_WRITE);
for(i=0; i<count_tx; i++) {
i2c_tx_byte(port, data_tx[i]);
}
}
if (data_rx && (count_rx > 0)) {
i2c_tx_start(port);
i2c_tx_byte(port, (peripheral_address << 1) | I2C_READ);
for(i=0; i<count_rx; i++) {
/* ACK each byte except the last */
ack = (i!=count_rx-1);
data_rx[i] = i2c_rx_byte(port, ack);
}
}
i2c_stop(port);
}
bool i2c_probe(i2c_bus_t* const bus, const uint_fast8_t device_address) {
const uint32_t port = (uint32_t)bus->obj;
i2c_tx_start(port);
i2c_tx_byte(port, (device_address << 1) | I2C_WRITE);
const bool detected = (I2C_STAT(port) == 0x18);
i2c_stop(port);
return detected;
}

View File

@ -0,0 +1,44 @@
/*
* Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc.
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#ifndef __I2C_LPC_H__
#define __I2C_LPC_H__
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#include "i2c_bus.h"
typedef struct i2c_lpc_config_t {
const uint16_t duty_cycle_count;
} i2c_lpc_config_t;
void i2c_lpc_start(i2c_bus_t* const bus, const void* const config);
void i2c_lpc_stop(i2c_bus_t* const bus);
void i2c_lpc_transfer(i2c_bus_t* const bus,
const uint_fast8_t peripheral_address,
const uint8_t* const data_tx, const size_t count_tx,
uint8_t* const data_rx, const size_t count_rx
);
bool i2c_probe(i2c_bus_t* const bus, const uint_fast8_t device_address);
#endif/*__I2C_LPC_H__*/

View File

@ -0,0 +1,23 @@
# Copyright 2013 Jared Boone <jared@sharebrained.com>
#
# This file is part of HackRF.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; see the file COPYING. If not, write to
# the Free Software Foundation, Inc., 51 Franklin Street,
# Boston, MA 02110-1301, USA.
.data
.section .m0_bin, "ax"
.incbin "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_m0.bin"

View File

@ -0,0 +1,26 @@
/*
* Copyright 2013 Jared Boone <jared@sharebrained.com>
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
int main() {
while(1) {
}
}

View File

@ -0,0 +1,349 @@
/*
* Copyright 2012 Will Code? (TODO: Proper attribution)
* Copyright 2014 Jared Boone <jared@sharebrained.com>
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
/*
* 'gcc -DTEST -DDEBUG -O2 -o test max2837.c' prints out what test
* program would do if it had a real spi library
*
* 'gcc -DTEST -DBUS_PIRATE -O2 -o test max2837.c' prints out bus
* pirate commands to do the same thing.
*/
#include <stdint.h>
#include <string.h>
#include "max2837.h"
#include "max2837_regs.def" // private register def macros
/* Default register values. */
static const uint16_t max2837_regs_default[MAX2837_NUM_REGS] = {
0x150, /* 0 */
0x002, /* 1 */
0x1f4, /* 2 */
0x1b9, /* 3 */
0x00a, /* 4 */
0x080, /* 5 */
0x006, /* 6 */
0x000, /* 7 */
0x080, /* 8 */
0x018, /* 9 */
0x058, /* 10 */
0x016, /* 11 */
0x24f, /* 12 */
0x150, /* 13 */
0x1c5, /* 14 */
0x081, /* 15 */
0x01c, /* 16 */
0x155, /* 17 */
0x155, /* 18 */
0x153, /* 19 */
0x241, /* 20 */
/*
* Charge Pump Common Mode Enable bit (0) of register 21 must be set or TX
* does not work. Page 1 of the SPI doc says not to set it (0x02c), but
* page 21 says it should be set by default (0x02d).
*/
0x02d, /* 21 */
0x1a9, /* 22 */
0x24f, /* 23 */
0x180, /* 24 */
0x100, /* 25 */
0x3ca, /* 26 */
0x3e3, /* 27 */
0x0c0, /* 28 */
0x3f0, /* 29 */
0x080, /* 30 */
0x000 }; /* 31 */
/* Set up all registers according to defaults specified in docs. */
static void max2837_init(max2837_driver_t* const drv)
{
drv->target_init(drv);
max2837_set_mode(drv, MAX2837_MODE_SHUTDOWN);
memcpy(drv->regs, max2837_regs_default, sizeof(drv->regs));
drv->regs_dirty = 0xffffffff;
/* Write default register values to chip. */
max2837_regs_commit(drv);
}
/*
* Set up pins for GPIO and SPI control, configure SSP peripheral for SPI, and
* set our own default register configuration.
*/
void max2837_setup(max2837_driver_t* const drv)
{
max2837_init(drv);
/* Use SPI control instead of B1-B7 pins for gain settings. */
set_MAX2837_TXVGA_GAIN_SPI_EN(drv, 1);
set_MAX2837_TXVGA_GAIN_MSB_SPI_EN(drv, 1);
//set_MAX2837_TXVGA_GAIN(0x3f); /* maximum attenuation */
set_MAX2837_TXVGA_GAIN(drv, 0x00); /* minimum attenuation */
set_MAX2837_VGAMUX_enable(drv, 1);
set_MAX2837_VGA_EN(drv, 1);
set_MAX2837_HPC_RXGAIN_EN(drv, 0);
set_MAX2837_HPC_STOP(drv, MAX2837_STOP_1K);
set_MAX2837_LNAgain_SPI_EN(drv, 1);
set_MAX2837_LNAgain(drv, MAX2837_LNAgain_MAX); /* maximum gain */
set_MAX2837_VGAgain_SPI_EN(drv, 1);
set_MAX2837_VGA(drv, 0x18); /* reasonable gain for noisy 2.4GHz environment */
/* maximum rx output common-mode voltage */
set_MAX2837_BUFF_VCM(drv, MAX2837_BUFF_VCM_1_25);
/* configure baseband filter for 8 MHz TX */
set_MAX2837_LPF_EN(drv, 1);
set_MAX2837_ModeCtrl(drv, MAX2837_ModeCtrl_RxLPF);
set_MAX2837_FT(drv, MAX2837_FT_5M);
max2837_regs_commit(drv);
}
static uint16_t max2837_read(max2837_driver_t* const drv, uint8_t r) {
uint16_t value = (1 << 15) | (r << 10);
spi_bus_transfer(drv->bus, &value, 1);
return value & 0x3ff;
}
static void max2837_write(max2837_driver_t* const drv, uint8_t r, uint16_t v) {
uint16_t value = (r << 10) | (v & 0x3ff);
spi_bus_transfer(drv->bus, &value, 1);
}
uint16_t max2837_reg_read(max2837_driver_t* const drv, uint8_t r)
{
if ((drv->regs_dirty >> r) & 0x1) {
drv->regs[r] = max2837_read(drv, r);
};
return drv->regs[r];
}
void max2837_reg_write(max2837_driver_t* const drv, uint8_t r, uint16_t v)
{
drv->regs[r] = v;
max2837_write(drv, r, v);
MAX2837_REG_SET_CLEAN(drv, r);
}
static inline void max2837_reg_commit(max2837_driver_t* const drv, uint8_t r)
{
max2837_reg_write(drv, r, drv->regs[r]);
}
void max2837_regs_commit(max2837_driver_t* const drv)
{
int r;
for(r = 0; r < MAX2837_NUM_REGS; r++) {
if ((drv->regs_dirty >> r) & 0x1) {
max2837_reg_commit(drv, r);
}
}
}
void max2837_set_mode(max2837_driver_t* const drv, const max2837_mode_t new_mode) {
drv->set_mode(drv, new_mode);
}
max2837_mode_t max2837_mode(max2837_driver_t* const drv) {
return drv->mode;
}
void max2837_start(max2837_driver_t* const drv)
{
set_MAX2837_EN_SPI(drv, 1);
max2837_regs_commit(drv);
max2837_set_mode(drv, MAX2837_MODE_STANDBY);
}
void max2837_tx(max2837_driver_t* const drv)
{
set_MAX2837_ModeCtrl(drv, MAX2837_ModeCtrl_TxLPF);
max2837_regs_commit(drv);
max2837_set_mode(drv, MAX2837_MODE_TX);
}
void max2837_rx(max2837_driver_t* const drv)
{
set_MAX2837_ModeCtrl(drv, MAX2837_ModeCtrl_RxLPF);
max2837_regs_commit(drv);
max2837_set_mode(drv, MAX2837_MODE_RX);
}
void max2837_stop(max2837_driver_t* const drv)
{
set_MAX2837_EN_SPI(drv, 0);
max2837_regs_commit(drv);
max2837_set_mode(drv, MAX2837_MODE_SHUTDOWN);
}
void max2837_set_frequency(max2837_driver_t* const drv, uint32_t freq)
{
uint8_t band;
uint8_t lna_band;
uint32_t div_frac;
uint32_t div_int;
uint32_t div_rem;
uint32_t div_cmp;
int i;
/* Select band. Allow tuning outside specified bands. */
if (freq < 2400000000U) {
band = MAX2837_LOGEN_BSW_2_3;
lna_band = MAX2837_LNAband_2_4;
}
else if (freq < 2500000000U) {
band = MAX2837_LOGEN_BSW_2_4;
lna_band = MAX2837_LNAband_2_4;
}
else if (freq < 2600000000U) {
band = MAX2837_LOGEN_BSW_2_5;
lna_band = MAX2837_LNAband_2_6;
}
else {
band = MAX2837_LOGEN_BSW_2_6;
lna_band = MAX2837_LNAband_2_6;
}
/* ASSUME 40MHz PLL. Ratio = F*(4/3)/40,000,000 = F/30,000,000 */
div_int = freq / 30000000;
div_rem = freq % 30000000;
div_frac = 0;
div_cmp = 30000000;
for( i = 0; i < 20; i++) {
div_frac <<= 1;
div_cmp >>= 1;
if (div_rem > div_cmp) {
div_frac |= 0x1;
div_rem -= div_cmp;
}
}
/* Band settings */
set_MAX2837_LOGEN_BSW(drv, band);
set_MAX2837_LNAband(drv, lna_band);
/* Write order matters here, so commit INT and FRAC_HI before
* committing FRAC_LO, which is the trigger for VCO
* auto-select. TODO - it's cleaner this way, but it would be
* faster to explicitly commit the registers explicitly so the
* dirty bits aren't scanned twice. */
set_MAX2837_SYN_INT(drv, div_int);
set_MAX2837_SYN_FRAC_HI(drv, (div_frac >> 10) & 0x3ff);
max2837_regs_commit(drv);
set_MAX2837_SYN_FRAC_LO(drv, div_frac & 0x3ff);
max2837_regs_commit(drv);
}
typedef struct {
uint32_t bandwidth_hz;
uint32_t ft;
} max2837_ft_t;
static const max2837_ft_t max2837_ft[] = {
{ 1750000, MAX2837_FT_1_75M },
{ 2500000, MAX2837_FT_2_5M },
{ 3500000, MAX2837_FT_3_5M },
{ 5000000, MAX2837_FT_5M },
{ 5500000, MAX2837_FT_5_5M },
{ 6000000, MAX2837_FT_6M },
{ 7000000, MAX2837_FT_7M },
{ 8000000, MAX2837_FT_8M },
{ 9000000, MAX2837_FT_9M },
{ 10000000, MAX2837_FT_10M },
{ 12000000, MAX2837_FT_12M },
{ 14000000, MAX2837_FT_14M },
{ 15000000, MAX2837_FT_15M },
{ 20000000, MAX2837_FT_20M },
{ 24000000, MAX2837_FT_24M },
{ 28000000, MAX2837_FT_28M },
{ 0, 0 },
};
uint32_t max2837_set_lpf_bandwidth(max2837_driver_t* const drv, const uint32_t bandwidth_hz) {
const max2837_ft_t* p = max2837_ft;
while( p->bandwidth_hz != 0 ) {
if( p->bandwidth_hz >= bandwidth_hz ) {
break;
}
p++;
}
if( p->bandwidth_hz != 0 ) {
set_MAX2837_FT(drv, p->ft);
max2837_regs_commit(drv);
}
return p->bandwidth_hz;
}
bool max2837_set_lna_gain(max2837_driver_t* const drv, const uint32_t gain_db) {
uint16_t val;
switch(gain_db){
case 40:
val = MAX2837_LNAgain_MAX;
break;
case 32:
val = MAX2837_LNAgain_M8;
break;
case 24:
val = MAX2837_LNAgain_M16;
break;
case 16:
val = MAX2837_LNAgain_M24;
break;
case 8:
val = MAX2837_LNAgain_M32;
break;
case 0:
val = MAX2837_LNAgain_M40;
break;
default:
return false;
}
set_MAX2837_LNAgain(drv, val);
max2837_reg_commit(drv, 1);
return true;
}
bool max2837_set_vga_gain(max2837_driver_t* const drv, const uint32_t gain_db) {
if( (gain_db & 0x1) || gain_db > 62)/* 0b11111*2 */
return false;
set_MAX2837_VGA(drv, 31-(gain_db >> 1) );
max2837_reg_commit(drv, 5);
return true;
}
bool max2837_set_txvga_gain(max2837_driver_t* const drv, const uint32_t gain_db) {
uint16_t val=0;
if(gain_db <16){
val = 31-gain_db;
val |= (1 << 5); // bit6: 16db
} else{
val = 31-(gain_db-16);
}
set_MAX2837_TXVGA_GAIN(drv, val);
max2837_reg_commit(drv, 29);
return true;
}

View File

@ -0,0 +1,92 @@
/*
* Copyright 2012 Will Code? (TODO: Proper attribution)
* Copyright 2014 Jared Boone <jared@sharebrained.com>
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#ifndef __MAX2837_H
#define __MAX2837_H
#include <stdint.h>
#include <stdbool.h>
#include "gpio.h"
#include "spi_bus.h"
/* 32 registers, each containing 10 bits of data. */
#define MAX2837_NUM_REGS 32
#define MAX2837_DATA_REGS_MAX_VALUE 1024
typedef enum {
MAX2837_MODE_SHUTDOWN,
MAX2837_MODE_STANDBY,
MAX2837_MODE_TX,
MAX2837_MODE_RX
} max2837_mode_t;
struct max2837_driver_t;
typedef struct max2837_driver_t max2837_driver_t;
struct max2837_driver_t {
spi_bus_t* const bus;
gpio_t gpio_enable;
gpio_t gpio_rx_enable;
gpio_t gpio_tx_enable;
void (*target_init)(max2837_driver_t* const drv);
void (*set_mode)(max2837_driver_t* const drv, const max2837_mode_t new_mode);
max2837_mode_t mode;
uint16_t regs[MAX2837_NUM_REGS];
uint32_t regs_dirty;
};
/* Initialize chip. */
extern void max2837_setup(max2837_driver_t* const drv);
/* Read a register via SPI. Save a copy to memory and return
* value. Mark clean. */
extern uint16_t max2837_reg_read(max2837_driver_t* const drv, uint8_t r);
/* Write value to register via SPI and save a copy to memory. Mark
* clean. */
extern void max2837_reg_write(max2837_driver_t* const drv, uint8_t r, uint16_t v);
/* Write all dirty registers via SPI from memory. Mark all clean. Some
* operations require registers to be written in a certain order. Use
* provided routines for those operations. */
extern void max2837_regs_commit(max2837_driver_t* const drv);
max2837_mode_t max2837_mode(max2837_driver_t* const drv);
void max2837_set_mode(max2837_driver_t* const drv, const max2837_mode_t new_mode);
/* Turn on/off all chip functions. Does not control oscillator and CLKOUT */
extern void max2837_start(max2837_driver_t* const drv);
extern void max2837_stop(max2837_driver_t* const drv);
/* Set frequency in Hz. Frequency setting is a multi-step function
* where order of register writes matters. */
extern void max2837_set_frequency(max2837_driver_t* const drv, uint32_t freq);
uint32_t max2837_set_lpf_bandwidth(max2837_driver_t* const drv, const uint32_t bandwidth_hz);
bool max2837_set_lna_gain(max2837_driver_t* const drv, const uint32_t gain_db);
bool max2837_set_vga_gain(max2837_driver_t* const drv, const uint32_t gain_db);
bool max2837_set_txvga_gain(max2837_driver_t* const drv, const uint32_t gain_db);
extern void max2837_tx(max2837_driver_t* const drv);
extern void max2837_rx(max2837_driver_t* const drv);
#endif // __MAX2837_H

View File

@ -0,0 +1,408 @@
/* -*- mode: c -*- */
#ifndef __MAX2837_REGS_DEF
#define __MAX2837_REGS_DEF
/* Generate static inline accessors that operate on the global
* regs. Done this way to (1) allow defs to be scraped out and used
* elsewhere, e.g. in scripts, (2) to avoid dealing with endian
* (structs). This may be used in firmware, or on host predefined
* register loads. */
#define MAX2837_REG_SET_CLEAN(_d, _r) (_d->regs_dirty &= ~(1UL<<_r))
#define MAX2837_REG_SET_DIRTY(_d, _r) (_d->regs_dirty |= (1UL<<_r))
/* On set_, register is always set dirty, even if nothing
* changed. This makes sure that write that have side effects,
* e.g. frequency setting, are not skipped. */
/* n=name, r=regnum, o=offset (bits from LSB), l=length (bits) */
#define __MREG__(n,r,o,l) \
static inline uint16_t get_##n(max2837_driver_t* const _d) { \
return (_d->regs[r] >> (o-l+1)) & ((1<<l)-1); \
} \
static inline void set_##n(max2837_driver_t* const _d, uint16_t v) { \
_d->regs[r] &= ~(((1<<l)-1)<<(o-l+1)); \
_d->regs[r] |= ((v&((1<<l)-1))<<(o-l+1)); \
MAX2837_REG_SET_DIRTY(_d, r); \
}
/* REG 0 */
__MREG__(MAX2837_LNA_EN, 0,0,1)
__MREG__(MAX2837_Mixer_EN, 0,1,1)
__MREG__(MAX2837_RxLO_EN, 0,2,1)
__MREG__(MAX2837_Lbias, 0,4,2)
#define MAX2837_Lbias_LOWEST 0
#define MAX2837_Lbias_NOMINAL 2
#define MAX2837_Lbias_HIGHEST 3
__MREG__(MAX2837_Mbias, 0,6,2)
#define MAX2837_Mbias_LOWEST 0
#define MAX2837_Mbias_NOMINAL 2
#define MAX2837_Mbias_HIGHEST 3
__MREG__(MAX2837_buf, 0,8,2)
#define MAX2837_buf_LOWEST 0
#define MAX2837_buf_NOMINAL 2
#define MAX2837_buf_HIGHEST 3
__MREG__(MAX2837_LNAband, 0,9,1)
#define MAX2837_LNAband_2_4 0 // 2.3-2.5 GHz
#define MAX2837_LNAband_2_6 1 // 2.5-2.7 GHz
/* REG 1 */
__MREG__(MAX2837_LNAtune, 1,0,1)
#define MAX2837_LNAtune_NOMINAL 0
#define MAX2837_LNAtune_DOWN 1
__MREG__(MAX2837_LNAde_Q,1,1,1)
#define MAX2837_LNAde_Q_NOMINAL 0
#define MAX2837_LNAde_Q_2DB 1
__MREG__(MAX2837_LNAgain,1,4,3)
#define MAX2837_LNAgain_MAX 0b000 // Pad in 8dB steps, bits reversed
#define MAX2837_LNAgain_M8 0b100
#define MAX2837_LNAgain_M16 0b010
#define MAX2837_LNAgain_M24 0b110
#define MAX2837_LNAgain_M32 0b011
#define MAX2837_LNAgain_M40 0b111
__MREG__(MAX2837_iqerr_trim,1,9,5)
// 0b00000 = +4.0 degree phase error
// 0b01111 = 0.0
// 0b11111 = -4.0
/* REG 2 */
__MREG__(MAX2837_LPF_EN,2,0,1)
__MREG__(MAX2837_TxBB_EN,2,1,1)
__MREG__(MAX2837_ModeCtrl,2,3,2)
#define MAX2837_ModeCtrl_RxCalibration 0
#define MAX2837_ModeCtrl_RxLPF 1
#define MAX2837_ModeCtrl_TxLPF 2
#define MAX2837_ModeCtrl_LPFTrim 3
__MREG__(MAX2837_FT,2,7,4)
#define MAX2837_FT_1_75M 0
#define MAX2837_FT_2_5M 1
#define MAX2837_FT_3_5M 2
#define MAX2837_FT_5M 3
#define MAX2837_FT_5_5M 4
#define MAX2837_FT_6M 5
#define MAX2837_FT_7M 6
#define MAX2837_FT_8M 7
#define MAX2837_FT_9M 8
#define MAX2837_FT_10M 9
#define MAX2837_FT_12M 10
#define MAX2837_FT_14M 11
#define MAX2837_FT_15M 12
#define MAX2837_FT_20M 13
#define MAX2837_FT_24M 14
#define MAX2837_FT_28M 15
__MREG__(MAX2837_dF,2,9,2)
#define MAX2837_dF_M10 0b00 // -10%
#define MAX2837_dF_NOMINAL 0b01
#define MAX2837_dF_10 0b11 // +10%
/* REG 3 */
__MREG__(MAX2837_PT_SPI,3,3,4) // slowest=1111 fastest=0000 nom=1001
__MREG__(MAX2837_Bqd,3,6,3) // MSB doubles bias current, lower 2 25% each
__MREG__(MAX2837_TxRPCM,3,9,3) // 000=1.00V, 0.05V steps, 111 not allowed
/* REG 4 */
__MREG__(MAX2837_RP,4,1,2) // 20% steps, 00=lowest, 11=highest
__MREG__(MAX2837_TxBuff,4,3,2) // 25% steps, 00=lowest, 11=highest
__MREG__(MAX2837_VGA_EN,4,4,1)
__MREG__(MAX2837_VGAMUX_enable,4,5,1)
__MREG__(MAX2837_BUFF_Curr,4,7,2) // 250uA + 125uA steps
__MREG__(MAX2837_BUFF_VCM,4,9,2) // VGA common mode
#define MAX2837_BUFF_VCM_0_9 0 // 0.9V
#define MAX2837_BUFF_VCM_1_0 1 // 1.0V
#define MAX2837_BUFF_VCM_1_1 2 // 1.1V
#define MAX2837_BUFF_VCM_1_25 3 // 1.25V
/* REG 5 */
__MREG__(MAX2837_VGA,5,4,5) // max=00000, attenuation in 2dB steps
__MREG__(MAX2837_sel_In1_In2,5,5,1)
#define MAX2837_sel_In1_In2_RXVGA 0
#define MAX2837_sel_In1_In2_TXAM 1
__MREG__(MAX2837_turbo15n20,5,6,1)
__MREG__(MAX2837_VGA_Curr,5,8,2) // 01=default, 00=-33%, 10=+33%, 11=+67%
__MREG__(MAX2837_fuse_arm,5,9,1)
/* REG 6 */
__MREG__(MAX2837_RSSI_EN,6,6,1) // enable RSSI
__MREG__(MAX2837_RSSI_MUX,6,7,1)
#define MAX2837_RSSI_MUX_RSSI 0
#define MAX2837_RSSI_MUX_TEMP 1
__MREG__(MAX2837_RSSI_MODE,6,8,1) // set to override RXHP pin
__MREG__(MAX2837_LPF_MODE_SEL,6,9,1) // set to enable mode in reg 2 ModeCtrl
/* REG 7 is R/O */
// D4:0 ts_adc (temp sensor)
// D9:5 zeros or test outputs
/* REG 8 */
__MREG__(MAX2837_LNAgain_SPI_EN,8,0,1) // set to override pin control of LNA
__MREG__(MAX2837_VGAgain_SPI_EN,8,1,1) // set to override pin control of VGA
__MREG__(MAX2837_EN_Bias_Trim,8,2,1) // route bias current to bondpad
__MREG__(MAX2837_BIAS_TRIM_SPI,8,7,5) // down=00000, up=11111, nom=10000
__MREG__(MAX2837_BIAS_TRIM_CNTRL,8,8,1) // enable BIAS_TRIM_SPI value
__MREG__(MAX2837_RX_IQERR_SPI_EN,8,9,1) // ???
/* REG 9 */
__MREG__(MAX2837_ts_adc_trigger,9,0,1) // temp sensor trigger (one shot)
__MREG__(MAX2837_ts_en,9,1,1) // temp sensor enable (before trigger)
__MREG__(MAX2837_LPFtrim_SPI_EN,9,2,1)
__MREG__(MAX2837_DOUT_DRVH,9,3,1)
#define MAX2837_DOUT_DRVH_1X 0
#define MAX2837_DOUT_DRVH_4X 1
__MREG__(MAX2837_DOUT_PU,9,4,1) // set to enable CMOS PU (default), else OD
__MREG__(MAX2837_DOUT_SEL,9,7,3)
#define MAX2837_DOUT_SEL_SPI 0 // default, SPI comm
#define MAX2837_DOUT_SEL_PLL_LOCK_DETECT 1
#define MAX2837_DOUT_SEL_VAS_TEST_OUT 2
#define MAX2837_DOUT_SEL_HPFSM_TEST_OUT 3
#define MAX2837_DOUT_SEL_LOGEN_TRIM_OUT 4
#define MAX2837_DOUT_SEL_RX_FUSE_GASKET 5
#define MAX2837_DOUT_SEL_TX_FUSE_GASKET 6
#define MAX2837_DOUT_SEL_ZERO 7
__MREG__(MAX2837_fuse_sh,9,8,1) // ???
__MREG__(MAX2837_fuse_burn_gkt,9,9,1) // enable (don't)
/* REG 10 */
__MREG__(MAX2837_TXCAL_GAIN,10,2,2) // 00=default, steps of +10dB
__MREG__(MAX2837_TXCAL_V2I_FILT,10,5,3) // 000=+12%, 111=-16%, 011=default
__MREG__(MAX2837_TX_BIAS_ADJ,10,7,2) // 00=-10%, 01=default, 10=+10%, 11=+20%
/* REG 11 */
__MREG__(MAX2837_AMD_SPI_EN,11,0,1) // enable AM detector
__MREG__(MAX2837_TXMXR_V2I_GAIN,11,4,4) // 0000=max, steps of -0.5dB
/* REG 12 */
__MREG__(MAX2837_HPC_10M,12,1,2) // steps of 0.4uS (0.0-1.2)
__MREG__(MAX2837_HPC_10M_GAIN,12,3,2) // steps of 0.4uS (0.0-1.2)
__MREG__(MAX2837_HPC_600K,12,6,3) // steps of 0.8uS (0.0-4.8), 7=stay 1
__MREG__(MAX2837_HPC_600K_GAIN,12,9,3) // steps of 0.8uS (0.0-4.8), 7=stay 1
/* REG 13 */
__MREG__(MAX2837_HPC_100K,13,1,2) // steps of 3.2uS (0.0-9.6)
__MREG__(MAX2837_HPC_100K_GAIN,13,3,2) // steps of 3.2uS (0.0-9.6)
__MREG__(MAX2837_HPC_30K,13,5,2) // steps of 3.2uS (0.0-9.6)
__MREG__(MAX2837_HPC_30K_GAIN,13,7,2) // steps of 3.2uS (0.0-9.6)
__MREG__(MAX2837_HPC_1K,13,9,2) // steps of 3.2uS (0.0-9.6)
/* REG 14 */
__MREG__(MAX2837_HPC_1K_GAIN,14,1,2) // steps of 3.2uS (0.0-9.6)
__MREG__(MAX2837_HPC_DELAY,14,3,2) // steps of 0.2uS (0.0-0.6)
__MREG__(MAX2837_HPC_STOP,14,5,2)
#define MAX2837_STOP_100 0
#define MAX2837_STOP_1K 1
#define MAX2837_STOP_30K 2
#define MAX2837_STOP_100K 3
__MREG__(MAX2837_HPC_STOP_M2,14,7,2)
#define MAX2837_STOP_M2_1K 0
#define MAX2837_STOP_M2_30K 1
#define MAX2837_STOP_M2_100K 2
#define MAX2837_STOP_M2_600K 3
__MREG__(MAX2837_HPC_RXGAIN_EN,14,8,1) // RXVGA HPFSM re-triggered by B7 & B6
__MREG__(MAX2837_HPC_MODE,14,9,1) // use RXHP
/* REG 15 */
__MREG__(MAX2837_HPC_DIVH,15,0,1)
#define MAX2837_HPC_DIVH_20M 0
#define MAX2837_HPC_DIVH_40M 1
__MREG__(MAX2837_HPC_TST,15,5,5) // filter test modes ... see doc
__MREG__(MAX2837_HPC_SEQ_BYP,15,6,1) // set to bypass programmed sequence
__MREG__(MAX2837_DOUT_CSB_SEL,15,7,1) // set to tri state DOUT when CSB high
/* REG 16 */
__MREG__(MAX2837_EN_SPI,16,0,1) // enable overall chip
__MREG__(MAX2837_CAL_SPI,16,1,1) // enable calibration mode
__MREG__(MAX2837_LOGEN_SPI_EN,16,2,1) // ???
__MREG__(MAX2837_SYN_SPI_EN,16,3,1) // enable synthesizer
__MREG__(MAX2837_VAS_SPI_EN,16,4,1) // enable VCO autoselect
__MREG__(MAX2837_PADRV_SPI_EN,16,5,1) // enable power amp
__MREG__(MAX2837_PADAC_SPI_EN,16,6,1) // enable power amp bias DAC always
__MREG__(MAX2837_PADAC_TX_EN,16,7,1) // enable power amp bias only if TX pin
__MREG__(MAX2837_TXMX_SPI_EN,16,8,1) // enable TX mixer
__MREG__(MAX2837_TXLO_SPI_EN,16,9,1) // enable TX LO
/* REG 17 */
__MREG__(MAX2837_SYN_FRAC_LO,17,9,10)
/* REG 18 */
__MREG__(MAX2837_SYN_FRAC_HI,18,9,10)
/* REG 19 */
__MREG__(MAX2837_SYN_INT,19,7,8)
__MREG__(MAX2837_LOGEN_BSW,19,9,2)
#define MAX2837_LOGEN_BSW_2_3 0 // 2300 - <2400 MHz
#define MAX2837_LOGEN_BSW_2_4 1 // 2400 - <2500 MHz
#define MAX2837_LOGEN_BSW_2_5 2 // 2500 - <2600 MHz
#define MAX2837_LOGEN_BSW_2_6 3 // 2600 - <2700 MHz
/* REG 20 */
__MREG__(MAX2837_SYN_MODE,20,0,1)
#define MAX2837_SYN_MODE_INTEGER 0
#define MAX2837_SYN_MODE_FRACTIONAL 1
__MREG__(MAX2837_SYN_REF_DIV,20,2,2)
#define MAX2837_SYN_REF_DIV_1 0
#define MAX2837_SYN_REF_DIV_2 1
#define MAX2837_SYN_REF_DIV_4 2
#define MAX2837_SYN_REF_DIV_8 3
__MREG__(MAX2837_SYN_CURRENT_,20,4,2)
#define MAX2837_SYN_CURRENT_3_2_DIFF 0 // 3.2mA differential
#define MAX2837_SYN_CURRENT_1_6_DIFF 1 // 1.6mA differential
#define MAX2837_SYN_CURRENT_1_6_SINGLE 2 // 1.6mA single-ended
#define MAX2837_SYN_CURRENT_0_8_SINGLE 3 // 0.8mA single-ended
__MREG__(MAX2837_SYN_CLOCKOUT_DRIVE,20,5,1)
#define MAX2837_SYN_CLOCKOUT_DRIVE_1X 0
#define MAX2837_SYN_CLOCKOUT_DRIVE_4X 1
__MREG__(MAX2837_SYN_TURBO_EN,20,6,1) // ???
__MREG__(MAX2837_SYN_BIAS_SPI,20,7,1) // Use trim value below
__MREG__(MAX2837_SYN_BIAS_TRIM,20,9,2) // 00=max 10=default 11=min
/* REG 21 */
__MREG__(MAX2837_SYN_CP_COMMON_MODE_EN,21,0,1)
__MREG__(MAX2837_SYN_PRESCALER_BIAS_BOOST,21,1,1) // 0=default 1=+20%
__MREG__(MAX2837_SYN_CP_BETA_EN,21,2,1)
__MREG__(MAX2837_SYN_SD_CLOCK_SEL,21,3,1)
#define MAX2837_SYN_SD_CLOCK_PFD 0 // from PFD reset
#define MAX2837_SYN_SD_CLOCK_PRE 1 // from prescaler
__MREG__(MAX2837_SYN_CP_PULSE_WIDTH_ADJ,21,4,1) // 0=default 1=-20%
__MREG__(MAX2837_SYN_CP_LIN_CUR,21,6,2) // +3% per step
__MREG__(MAX2837_SYN_TEST_OUT,21,9,3) // high bit locks CP in test mode
#define MAX2837_SYN_TEST_LOCK_DETECT 0b000
#define MAX2837_SYN_TEST_SD 0b001
#define MAX2837_SYN_TEST_REF_DIV 0b010
#define MAX2837_SYN_TEST_MAIN_DIV 0b011
#define MAX2837_SYN_TEST_CP_LO_Z_LOCK_DETECT 0b100
#define MAX2837_SYN_TEST_CP_SOURCE_SD 0b101
#define MAX2837_SYN_TEST_CP_SINK_REF_DIV 0b110
#define MAX2837_SYN_TEST_CP_HI_Z_MAIN_DIV 0b111
/* REG 22 */
__MREG__(MAX2837_VAS_EN,22,0,1) // select VCO subband by VAS, vs. reg
__MREG__(MAX2837_VAS_RELOCK_SEL,22,1,1)
#define MAX2837_VAS_RELOCK_SELECTED 0
#define MAX2837_VAS_RELOCK_PRESENT 1
__MREG__(MAX2837_VAS_DIV,22,4,3)
#define MAX2837_VAS_CLK_DIV_8 0
#define MAX2837_VAS_CLK_DIV_9 1
#define MAX2837_VAS_CLK_DIV_10 2
#define MAX2837_VAS_CLK_DIV_11 3
#define MAX2837_VAS_CLK_DIV_12 4
#define MAX2837_VAS_CLK_DIV_13 5
#define MAX2837_VAS_CLK_DIV_14 6
#define MAX2837_VAS_CLK_DIV_2 7
__MREG__(MAX2837_VAS_DLY,22,6,2) // Delay = Txtal * VAS_DIV * VAS_DLY * 7
#define MAX2837_VAS_DLY_16
#define MAX2837_VAS_DLY_32
#define MAX2837_VAS_DLY_64
#define MAX2837_VAS_DLY_128
__MREG__(MAX2837_VAS_TRIG_EN,22,7,1)
__MREG__(MAX2837_VAS_ADE,22,8,1)
__MREG__(MAX2837_VAS_ADL_SPI,22,9,1)
/* REG 23 */
__MREG__(MAX2837_VAS_SPI,23,4,5) // subband selection default is center (15)
__MREG__(MAX2837_XTAL_BIAS,23,6,2)
#define MAX2837_XTAL_BIAS_240_20 0 // 240uA for 20MHz
#define MAX2837_XTAL_BIAS_420_20 1
#define MAX2837_XTAL_BIAS_600_40 2
#define MAX2837_XTAL_BIAS_780_40 3
__MREG__(MAX2837_XTAL_E2C_BIAS,23,7,1)
#define MAX2837_XTAL_E2C_BIAS_360 0 // uA
#define MAX2837_XTAL_E2C_BIAS_540 1
__MREG__(MAX2837_VAS_SE,23,8,1)
#define MAX2837_VAS_SE_DIFF 0
#define MAX2837_VAS_SE_SINGLE 1
__MREG__(MAX2837_VCO_SPI_EN,23,9,1) // set to override mode
/* REG 24 */
__MREG__(MAX2837_XTAL_TUNE,24,6,7) // 0=max 127=min freq
__MREG__(MAX2837_CLKOUT_PIN_EN,24,7,1)
__MREG__(MAX2837_CLKOUT_DIV,24,8,1)
#define MAX2837_CLKOUT_DIV_1 0
#define MAX2837_CLKOUT_DIV_2 1
__MREG__(MAX2837_XTAL_CORE_EN,24,9,1) // set to override mode
/* REG 25 */
__MREG__(MAX2837_VCO_BIAS_SPI_EN,25,0,1) // enable override of vco bias trim
__MREG__(MAX2837_VCO_BIAS,25,4,4) // 0b1000 nominal
__MREG__(MAX2837_VCO_CMEN,25,5,1) // enable Miller capacitor
__MREG__(MAX2837_VCO_PDET_TST,25,7,2) // peak detector test output select
#define MAX2837_VCO_PDET_TST_NORMAL 0
#define MAX2837_VCO_PDET_TST_PDOUT 1 // peak detector output
#define MAX2837_VCO_PDET_TST_PDREF 2 // peak detector reference
#define MAX2837_VCO_PDET_TST_TEMP 3 // VCO temperature sensor
__MREG__(MAX2837_VCO_BUF_BIAS,25,9,2) // VCO buffer bias
#define MAX2837_VCO_BUF_BIAS_800uA 0
#define MAX2837_VCO_BUF_BIAS_1200uA 1 // default
#define MAX2837_VCO_BUF_BIAS_1600uA 2
#define MAX2837_VCO_BUF_BIAS_2000uA 3
/* REG 26 */
__MREG__(MAX2837_LOGEN_BIAS1,26,1,2) // LOGEN emitter follower bias
#define MAX2837_LOGEN_BIAS1_400u 0
#define MAX2837_LOGEN_BIAS1_600u 1
#define MAX2837_LOGEN_BIAS1_800u 2
#define MAX2837_LOGEN_BIAS1_1000u 3
__MREG__(MAX2837_LOGEN_BIAS2,26,2,1) // LOGEN RX/TX Gm bias
#define MAX2837_LOGEN_BIAS2_DEFAULT 0 // default
#define MAX2837_LOGEN_BIAS2_PLUS25 1 // +25%
__MREG__(MAX2837_LOGEN_2GM,26,3,1) //
__MREG__(MAX2837_LOGEN_TRIM1,26,4,1) // mixer tank trim enable
__MREG__(MAX2837_LOGEN_TRIM2,26,5,1) // bandpass filter trim enable
__MREG__(MAX2837_VAS_TST,26,9,4) // DOUT test signal select
#define MAX2837_VAS_TST_VCO_BSW0 0 // VAS band select output (5 bits)
#define MAX2837_VAS_TST_VCO_BSW1 1
#define MAX2837_VAS_TST_VCO_BSW2 2
#define MAX2837_VAS_TST_VCO_BSW3 3
#define MAX2837_VAS_TST_VCO_BSW4 4
#define MAX2837_VAS_TST_Vtune_ADC0 5 // VCO Vtune ADC output (3 bits)
#define MAX2837_VAS_TST_Vtune_ADC1 6
#define MAX2837_VAS_TST_Vtune_ADC2 7
#define MAX2837_VAS_TST_VASA 8 // VAS accomplish (success)
#define MAX2837_VAS_TST_VASE 9 // VAS end (success or gave up)
#define MAX2837_VAS_TST_ZERO 15 // default
/* REG 27 */
__MREG__(MAX2837_PADRV_BIAS,27,2,3) // PA driver bias (0-7), default 3
__MREG__(MAX2837_PADRV_DOWN_SPI_EN,27,3,1) // PA drv down process select enable
__MREG__(MAX2837_PADRV_DOWN,27,4,1) // PA driver down select
#define MAX2837_PADRV_DOWN_DOWN 0
#define MAX2837_PADRV_DOWN_UP 1 // default
__MREG__(MAX2837_PADAC_IV,27,5,1) // PA DAC I/V output select
#define MAX2837_PADAC_IV_VOLTAGE 0
#define MAX2837_PADAC_IV_CURRENT 1 // default
__MREG__(MAX2837_PADAC_VMODE,27,6,1) // set logic 0 or 1 for PADAC_IV out
__MREG__(MAX2837_PADAC_DIV,27,7,1) // PA DAC clock divide ratio
#define MAX2837_PADAC_DIV_20MHz 0
#define MAX2837_PADAC_DIV_40MHz 1
__MREG__(MAX2837_TXGATE_EN,27,8,1) // set to relock when TXOOL=1 or LD=0
__MREG__(MAX2837_TXDCCORR_EN,27,9,1) // TX DC offset correction enable
/* REG 28 */
__MREG__(MAX2837_PADAC_BIAS,28,5,6) // PADAC output current control, 5uA step
__MREG__(MAX2837_PADAC_DLY,28,9,4) // PADAC turn-on delay control
// 0,1 are both 0us
// then 0.5us steps to 7.0us
/* REG 29 */
__MREG__(MAX2837_TXVGA_GAIN_SPI_EN,29,0,1) // Enable SPI control of TXVGA gain
__MREG__(MAX2837_TXVGA_GAIN_MSB_SPI_EN,29,1,1)
__MREG__(MAX2837_TX_DCCORR_SPI_EN,29,2,1)
__MREG__(MAX2837_FUSE_ARM,29,3,1) // Fuse burn enable
__MREG__(MAX2837_TXVGA_GAIN,29,9,6) // 0 = min atten, 63 = max atten
/* REG 30 */
__MREG__(MAX2837_TXLO_IQ,30,4,5)
__MREG__(MAX2837_TXLO_IQ_SPI_EN,30,5,1)
__MREG__(MAX2837_TXLO_BUFF_BIAS,30,7,2)
#define MAX2837_TXLO_BUFF_BIAS_1_0mA 0
#define MAX2837_TXLO_BUFF_BIAS_1_5mA 1
#define MAX2837_TXLO_BUFF_BIAS_2_0mA 2 // default
#define MAX2837_TXLO_BUFF_BIAS_2_5mA 3
__MREG__(MAX2837_FUSE_GKT,30,8,1)
__MREG__(MAX2837_FUSE_RTH,30,9,1)
/* REG 31 */
// 0 -> 992/0uA correction, 15 -> 0/992uA correction ... if TX_DCCORR_SPI_EN
__MREG__(MAX2837_TX_DCCORR_I,31,4,5)
__MREG__(MAX2837_TX_DCCORR_Q,31,9,5)
#endif // __MAX2837_REGS_DEF

View File

@ -0,0 +1,74 @@
/*
* Copyright 2012 Will Code? (TODO: Proper attribution)
* Copyright 2014 Jared Boone <jared@sharebrained.com>
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#include "max2837_target.h"
#include <libopencm3/lpc43xx/scu.h>
#include "hackrf_core.h"
void max2837_target_init(max2837_driver_t* const drv) {
/* Configure SSP1 Peripheral (to be moved later in SSP driver) */
scu_pinmux(SCU_SSP1_CIPO, (SCU_SSP_IO | SCU_CONF_FUNCTION5));
scu_pinmux(SCU_SSP1_COPI, (SCU_SSP_IO | SCU_CONF_FUNCTION5));
scu_pinmux(SCU_SSP1_SCK, (SCU_SSP_IO | SCU_CONF_FUNCTION1));
scu_pinmux(SCU_XCVR_CS, SCU_GPIO_FAST);
/* Configure XCVR_CTL GPIO pins. */
scu_pinmux(SCU_XCVR_ENABLE, SCU_GPIO_FAST);
scu_pinmux(SCU_XCVR_RXENABLE, SCU_GPIO_FAST);
scu_pinmux(SCU_XCVR_TXENABLE, SCU_GPIO_FAST);
/* Set GPIO pins as outputs. */
gpio_output(drv->gpio_enable);
gpio_output(drv->gpio_rx_enable);
gpio_output(drv->gpio_tx_enable);
}
void max2837_target_set_mode(max2837_driver_t* const drv, const max2837_mode_t new_mode) {
/* MAX2837_MODE_SHUTDOWN:
* All circuit blocks are powered down, except the 4-wire serial bus
* and its internal programmable registers.
*
* MAX2837_MODE_STANDBY:
* Used to enable the frequency synthesizer block while the rest of the
* device is powered down. In this mode, PLL, VCO, and LO generator
* are on, so that Tx or Rx modes can be quickly enabled from this mode.
* These and other blocks can be selectively enabled in this mode.
*
* MAX2837_MODE_TX:
* All Tx circuit blocks are powered on. The external PA is powered on
* after a programmable delay using the on-chip PA bias DAC. The slow-
* charging Rx circuits are in a precharged “idle-off” state for fast
* Tx-to-Rx turnaround time.
*
* MAX2837_MODE_RX:
* All Rx circuit blocks are powered on and active. Antenna signal is
* applied; RF is downconverted, filtered, and buffered at Rx BB I and Q
* outputs. The slow- charging Tx circuits are in a precharged “idle-off”
* state for fast Rx-to-Tx turnaround time.
*/
gpio_write(drv->gpio_enable, new_mode != MAX2837_MODE_SHUTDOWN);
gpio_write(drv->gpio_rx_enable, new_mode == MAX2837_MODE_RX);
gpio_write(drv->gpio_tx_enable, new_mode == MAX2837_MODE_TX);
drv->mode = new_mode;
}

View File

@ -0,0 +1,31 @@
/*
* Copyright 2012 Will Code? (TODO: Proper attribution)
* Copyright 2014 Jared Boone <jared@sharebrained.com>
*
* This file is part of HackRF.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#ifndef __MAX2837_TARGET_H
#define __MAX2837_TARGET_H
#include "max2837.h"
void max2837_target_init(max2837_driver_t* const drv);
void max2837_target_set_mode(max2837_driver_t* const drv, const max2837_mode_t new_mode);
#endif // __MAX2837_TARGET_H

Some files were not shown because too many files have changed in this diff Show More