copy
This commit is contained in:
1
BlockDiagram.drawio
Normal file
1
BlockDiagram.drawio
Normal file
File diff suppressed because one or more lines are too long
1
FUNDING.yml
Normal file
1
FUNDING.yml
Normal file
@@ -0,0 +1 @@
|
||||
liberapay: hansfbaier
|
||||
311
LICENSE
Normal file
311
LICENSE
Normal file
@@ -0,0 +1,311 @@
|
||||
CERN Open Hardware Licence Version 2 - Weakly Reciprocal
|
||||
|
||||
|
||||
Preamble
|
||||
|
||||
CERN has developed this licence to promote collaboration among
|
||||
hardware designers and to provide a legal tool which supports the
|
||||
freedom to use, study, modify, share and distribute hardware designs
|
||||
and products based on those designs. Version 2 of the CERN Open
|
||||
Hardware Licence comes in three variants: CERN-OHL-P (permissive); and
|
||||
two reciprocal licences: this licence, CERN-OHL-W (weakly reciprocal)
|
||||
and CERN-OHL-S (strongly reciprocal).
|
||||
|
||||
The CERN-OHL-W is copyright CERN 2020. Anyone is welcome to use it, in
|
||||
unmodified form only.
|
||||
|
||||
Use of this Licence does not imply any endorsement by CERN of any
|
||||
Licensor or their designs nor does it imply any involvement by CERN in
|
||||
their development.
|
||||
|
||||
|
||||
1 Definitions
|
||||
|
||||
1.1 'Licence' means this CERN-OHL-W.
|
||||
|
||||
1.2 'Compatible Licence' means
|
||||
|
||||
a) any earlier version of the CERN Open Hardware licence, or
|
||||
|
||||
b) any version of the CERN-OHL-S or the CERN-OHL-W, or
|
||||
|
||||
c) any licence which permits You to treat the Source to which
|
||||
it applies as licensed under CERN-OHL-S or CERN-OHL-W
|
||||
provided that on Conveyance of any such Source, or any
|
||||
associated Product You treat the Source in question as being
|
||||
licensed under CERN-OHL-S or CERN-OHL-W as appropriate.
|
||||
|
||||
1.3 'Source' means information such as design materials or digital
|
||||
code which can be applied to Make or test a Product or to
|
||||
prepare a Product for use, Conveyance or sale, regardless of its
|
||||
medium or how it is expressed. It may include Notices.
|
||||
|
||||
1.4 'Covered Source' means Source that is explicitly made available
|
||||
under this Licence.
|
||||
|
||||
1.5 'Product' means any device, component, work or physical object,
|
||||
whether in finished or intermediate form, arising from the use,
|
||||
application or processing of Covered Source.
|
||||
|
||||
1.6 'Make' means to create or configure something, whether by
|
||||
manufacture, assembly, compiling, loading or applying Covered
|
||||
Source or another Product or otherwise.
|
||||
|
||||
1.7 'Available Component' means any part, sub-assembly, library or
|
||||
code which:
|
||||
|
||||
a) is licensed to You as Complete Source under a Compatible
|
||||
Licence; or
|
||||
|
||||
b) is available, at the time a Product or the Source containing
|
||||
it is first Conveyed, to You and any other prospective
|
||||
licensees
|
||||
|
||||
i) with sufficient rights and information (including any
|
||||
configuration and programming files and information
|
||||
about its characteristics and interfaces) to enable it
|
||||
either to be Made itself, or to be sourced and used to
|
||||
Make the Product; or
|
||||
ii) as part of the normal distribution of a tool used to
|
||||
design or Make the Product.
|
||||
|
||||
1.8 'External Material' means anything (including Source) which:
|
||||
|
||||
a) is only combined with Covered Source in such a way that it
|
||||
interfaces with the Covered Source using a documented
|
||||
interface which is described in the Covered Source; and
|
||||
|
||||
b) is not a derivative of or contains Covered Source, or, if it
|
||||
is, it is solely to the extent necessary to facilitate such
|
||||
interfacing.
|
||||
|
||||
1.9 'Complete Source' means the set of all Source necessary to Make
|
||||
a Product, in the preferred form for making modifications,
|
||||
including necessary installation and interfacing information
|
||||
both for the Product, and for any included Available Components.
|
||||
If the format is proprietary, it must also be made available in
|
||||
a format (if the proprietary tool can create it) which is
|
||||
viewable with a tool available to potential licensees and
|
||||
licensed under a licence approved by the Free Software
|
||||
Foundation or the Open Source Initiative. Complete Source need
|
||||
not include the Source of any Available Component, provided that
|
||||
You include in the Complete Source sufficient information to
|
||||
enable a recipient to Make or source and use the Available
|
||||
Component to Make the Product.
|
||||
|
||||
1.10 'Source Location' means a location where a Licensor has placed
|
||||
Covered Source, and which that Licensor reasonably believes will
|
||||
remain easily accessible for at least three years for anyone to
|
||||
obtain a digital copy.
|
||||
|
||||
1.11 'Notice' means copyright, acknowledgement and trademark notices,
|
||||
Source Location references, modification notices (subsection
|
||||
3.3(b)) and all notices that refer to this Licence and to the
|
||||
disclaimer of warranties that are included in the Covered
|
||||
Source.
|
||||
|
||||
1.12 'Licensee' or 'You' means any person exercising rights under
|
||||
this Licence.
|
||||
|
||||
1.13 'Licensor' means a natural or legal person who creates or
|
||||
modifies Covered Source. A person may be a Licensee and a
|
||||
Licensor at the same time.
|
||||
|
||||
1.14 'Convey' means to communicate to the public or distribute.
|
||||
|
||||
|
||||
2 Applicability
|
||||
|
||||
2.1 This Licence governs the use, copying, modification, Conveying
|
||||
of Covered Source and Products, and the Making of Products. By
|
||||
exercising any right granted under this Licence, You irrevocably
|
||||
accept these terms and conditions.
|
||||
|
||||
2.2 This Licence is granted by the Licensor directly to You, and
|
||||
shall apply worldwide and without limitation in time.
|
||||
|
||||
2.3 You shall not attempt to restrict by contract or otherwise the
|
||||
rights granted under this Licence to other Licensees.
|
||||
|
||||
2.4 This Licence is not intended to restrict fair use, fair dealing,
|
||||
or any other similar right.
|
||||
|
||||
|
||||
3 Copying, Modifying and Conveying Covered Source
|
||||
|
||||
3.1 You may copy and Convey verbatim copies of Covered Source, in
|
||||
any medium, provided You retain all Notices.
|
||||
|
||||
3.2 You may modify Covered Source, other than Notices, provided that
|
||||
You irrevocably undertake to make that modified Covered Source
|
||||
available from a Source Location should You Convey a Product in
|
||||
circumstances where the recipient does not otherwise receive a
|
||||
copy of the modified Covered Source. In each case subsection 3.3
|
||||
shall apply.
|
||||
|
||||
You may only delete Notices if they are no longer applicable to
|
||||
the corresponding Covered Source as modified by You and You may
|
||||
add additional Notices applicable to Your modifications.
|
||||
|
||||
3.3 You may Convey modified Covered Source (with the effect that You
|
||||
shall also become a Licensor) provided that You:
|
||||
|
||||
a) retain Notices as required in subsection 3.2;
|
||||
|
||||
b) add a Notice to the modified Covered Source stating that You
|
||||
have modified it, with the date and brief description of how
|
||||
You have modified it;
|
||||
|
||||
c) add a Source Location Notice for the modified Covered Source
|
||||
if You Convey in circumstances where the recipient does not
|
||||
otherwise receive a copy of the modified Covered Source; and
|
||||
|
||||
d) license the modified Covered Source under the terms and
|
||||
conditions of this Licence (or, as set out in subsection
|
||||
8.3, a later version, if permitted by the licence of the
|
||||
original Covered Source). Such modified Covered Source must
|
||||
be licensed as a whole, but excluding Available Components
|
||||
contained in it or External Material to which it is
|
||||
interfaced, which remain licensed under their own applicable
|
||||
licences.
|
||||
|
||||
|
||||
4 Making and Conveying Products
|
||||
|
||||
4.1 You may Make Products, and/or Convey them, provided that You
|
||||
either provide each recipient with a copy of the Complete Source
|
||||
or ensure that each recipient is notified of the Source Location
|
||||
of the Complete Source. That Complete Source includes Covered
|
||||
Source and You must accordingly satisfy Your obligations set out
|
||||
in subsection 3.3. If specified in a Notice, the Product must
|
||||
visibly and securely display the Source Location on it or its
|
||||
packaging or documentation in the manner specified in that
|
||||
Notice.
|
||||
|
||||
4.2 Where You Convey a Product which incorporates External Material,
|
||||
the Complete Source for that Product which You are required to
|
||||
provide under subsection 4.1 need not include any Source for the
|
||||
External Material.
|
||||
|
||||
4.3 You may license Products under terms of Your choice, provided
|
||||
that such terms do not restrict or attempt to restrict any
|
||||
recipients' rights under this Licence to the Covered Source.
|
||||
|
||||
|
||||
5 Research and Development
|
||||
|
||||
You may Convey Covered Source, modified Covered Source or Products to
|
||||
a legal entity carrying out development, testing or quality assurance
|
||||
work on Your behalf provided that the work is performed on terms which
|
||||
prevent the entity from both using the Source or Products for its own
|
||||
internal purposes and Conveying the Source or Products or any
|
||||
modifications to them to any person other than You. Any modifications
|
||||
made by the entity shall be deemed to be made by You pursuant to
|
||||
subsection 3.2.
|
||||
|
||||
|
||||
6 DISCLAIMER AND LIABILITY
|
||||
|
||||
6.1 DISCLAIMER OF WARRANTY -- The Covered Source and any Products
|
||||
are provided 'as is' and any express or implied warranties,
|
||||
including, but not limited to, implied warranties of
|
||||
merchantability, of satisfactory quality, non-infringement of
|
||||
third party rights, and fitness for a particular purpose or use
|
||||
are disclaimed in respect of any Source or Product to the
|
||||
maximum extent permitted by law. The Licensor makes no
|
||||
representation that any Source or Product does not or will not
|
||||
infringe any patent, copyright, trade secret or other
|
||||
proprietary right. The entire risk as to the use, quality, and
|
||||
performance of any Source or Product shall be with You and not
|
||||
the Licensor. This disclaimer of warranty is an essential part
|
||||
of this Licence and a condition for the grant of any rights
|
||||
granted under this Licence.
|
||||
|
||||
6.2 EXCLUSION AND LIMITATION OF LIABILITY -- The Licensor shall, to
|
||||
the maximum extent permitted by law, have no liability for
|
||||
direct, indirect, special, incidental, consequential, exemplary,
|
||||
punitive or other damages of any character including, without
|
||||
limitation, procurement of substitute goods or services, loss of
|
||||
use, data or profits, or business interruption, however caused
|
||||
and on any theory of contract, warranty, tort (including
|
||||
negligence), product liability or otherwise, arising in any way
|
||||
in relation to the Covered Source, modified Covered Source
|
||||
and/or the Making or Conveyance of a Product, even if advised of
|
||||
the possibility of such damages, and You shall hold the
|
||||
Licensor(s) free and harmless from any liability, costs,
|
||||
damages, fees and expenses, including claims by third parties,
|
||||
in relation to such use.
|
||||
|
||||
|
||||
7 Patents
|
||||
|
||||
7.1 Subject to the terms and conditions of this Licence, each
|
||||
Licensor hereby grants to You a perpetual, worldwide,
|
||||
non-exclusive, no-charge, royalty-free, irrevocable (except as
|
||||
stated in subsections 7.2 and 8.4) patent licence to Make, have
|
||||
Made, use, offer to sell, sell, import, and otherwise transfer
|
||||
the Covered Source and Products, where such licence applies only
|
||||
to those patent claims licensable by such Licensor that are
|
||||
necessarily infringed by exercising rights under the Covered
|
||||
Source as Conveyed by that Licensor.
|
||||
|
||||
7.2 If You institute patent litigation against any entity (including
|
||||
a cross-claim or counterclaim in a lawsuit) alleging that the
|
||||
Covered Source or a Product constitutes direct or contributory
|
||||
patent infringement, or You seek any declaration that a patent
|
||||
licensed to You under this Licence is invalid or unenforceable
|
||||
then any rights granted to You under this Licence shall
|
||||
terminate as of the date such process is initiated.
|
||||
|
||||
|
||||
8 General
|
||||
|
||||
8.1 If any provisions of this Licence are or subsequently become
|
||||
invalid or unenforceable for any reason, the remaining
|
||||
provisions shall remain effective.
|
||||
|
||||
8.2 You shall not use any of the name (including acronyms and
|
||||
abbreviations), image, or logo by which the Licensor or CERN is
|
||||
known, except where needed to comply with section 3, or where
|
||||
the use is otherwise allowed by law. Any such permitted use
|
||||
shall be factual and shall not be made so as to suggest any kind
|
||||
of endorsement or implication of involvement by the Licensor or
|
||||
its personnel.
|
||||
|
||||
8.3 CERN may publish updated versions and variants of this Licence
|
||||
which it considers to be in the spirit of this version, but may
|
||||
differ in detail to address new problems or concerns. New
|
||||
versions will be published with a unique version number and a
|
||||
variant identifier specifying the variant. If the Licensor has
|
||||
specified that a given variant applies to the Covered Source
|
||||
without specifying a version, You may treat that Covered Source
|
||||
as being released under any version of the CERN-OHL with that
|
||||
variant. If no variant is specified, the Covered Source shall be
|
||||
treated as being released under CERN-OHL-S. The Licensor may
|
||||
also specify that the Covered Source is subject to a specific
|
||||
version of the CERN-OHL or any later version in which case You
|
||||
may apply this or any later version of CERN-OHL with the same
|
||||
variant identifier published by CERN.
|
||||
|
||||
You may treat Covered Source licensed under CERN-OHL-W as
|
||||
licensed under CERN-OHL-S if and only if all Available
|
||||
Components referenced in the Covered Source comply with the
|
||||
corresponding definition of Available Component for CERN-OHL-S.
|
||||
|
||||
8.4 This Licence shall terminate with immediate effect if You fail
|
||||
to comply with any of its terms and conditions.
|
||||
|
||||
8.5 However, if You cease all breaches of this Licence, then Your
|
||||
Licence from any Licensor is reinstated unless such Licensor has
|
||||
terminated this Licence by giving You, while You remain in
|
||||
breach, a notice specifying the breach and requiring You to cure
|
||||
it within 30 days, and You have failed to come into compliance
|
||||
in all material respects by the end of the 30 day period. Should
|
||||
You repeat the breach after receipt of a cure notice and
|
||||
subsequent reinstatement, this Licence will terminate
|
||||
immediately and permanently. Section 6 shall continue to apply
|
||||
after any termination.
|
||||
|
||||
8.6 This Licence shall not be enforceable except by a Licensor
|
||||
acting as such, and third party beneficiary rights are
|
||||
specifically excluded.
|
||||
71
README.md
Normal file
71
README.md
Normal file
@@ -0,0 +1,71 @@
|
||||
# ADAT USB Audio Interface
|
||||
|
||||
FPGA based USB 2.0 High Speed audio interface featuring multiple optical ADAT inputs and outputs
|
||||
|
||||

|
||||
|
||||
## Status / current limitations
|
||||
* Enumerates as class compliant audio device on Windows and Linux (Mac OS not tested). 2 and 32 channel modes.
|
||||
* Audio input and output seems to work glitch free.
|
||||
* Only 48kHz sample rate supported
|
||||
* Integrated USB2 high speed logic analyzer works
|
||||
* Runs without dropouts with FlexASIO with a buffer size of 32 samples (0.67ms latency)
|
||||
* Has a hardware roundtrip latency (USB out -> ADAT out -> cable -> ADAT in -> USB in)
|
||||
of 2-3 USB2 microframes which is about 0.25ms to 0.375 ms
|
||||
* Both headphone DACs on the board work now. In two channel mode, they are both wired to channels 0/1.
|
||||
In 36 channel mode DAC1 is wired to channels 0/1 and DAC2 to channels 2/3
|
||||
* Both USB PHYs now are operational. USB1 has access to all 32 ADAT I/Os and has 4 extra channels to/from USB2.
|
||||
USB2 enumerates as a 4-channel sound card which sends/receives audio to/from USB1
|
||||
* Both USB interfaces will also enumerate as USB MIDI devices and send each other MIDI
|
||||
* The current board design has not been designed with the case in mind: In the current version of the case,
|
||||
only ADAT-cables with thin connectors will fit into the holes. Cables with fat connectors will hit the case
|
||||
wall before they can be fully inserted. This will be fixed in a future iteration of the PCB and case.
|
||||
* The current case design lacks a guide channel for the LED light pipes. Therefore there is considerable bleed
|
||||
from lightpipes into each other, and they also can't be positioned exactly over the LEDs.
|
||||
Will be fixed in the next version of the case.
|
||||
* Limitation: Currently audio input will not work properly when audio output is inactive.
|
||||
This should not be a problem for most uses (VoIP, Videoconference, DAW recording).
|
||||
If you have an important use case which needs this, please file an issue.
|
||||
|
||||
## Hardware
|
||||
The current board design is a custom development board,
|
||||
based on the QMTech core FPGA boards.
|
||||
Once the chip shortage is over, it is planned to move to
|
||||
a complete custom design, including the FPGA.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## How to build
|
||||
1. Download and install [Intel Quartus Lite](https://fpgasoftware.intel.com/?edition=lite)
|
||||
2. put the bin/ directory of Quartus into your PATH variable:
|
||||
```bash
|
||||
export PATH=$PATH:/opt/intelFPGA_lite/21.1/quartus/bin/
|
||||
```
|
||||
Of course you need to adjust this to the install directory and version of your particular installation.
|
||||
|
||||
3. Set up python venv and install requirements:
|
||||
```bash
|
||||
$ cd gateware/
|
||||
$ ./initialize-python-environment.sh
|
||||
$ cd ..
|
||||
```
|
||||
|
||||
4. Activate the venv and build
|
||||
```bash
|
||||
$ source ./gateware/venv/bin/activate
|
||||
$ python3 gateware/adat_usb2_audio_interface.py --keep
|
||||
```
|
||||
|
||||
This will create a directory named build/ and after a successful build will directly
|
||||
try to load the generated bitstream into the FPGA, if an USB-Blaster is connected.
|
||||
Or, you can flash the bitstream manually, by opening the Quartus GUI with:
|
||||
```bash
|
||||
quartus build/*.qpf
|
||||
```
|
||||
and then open the programmer application from there.
|
||||
Alternatively you could directly start the programmer with:
|
||||
```bash
|
||||
quartus_pgmw
|
||||
```
|
||||
39
firmware/Makefile
Normal file
39
firmware/Makefile
Normal file
@@ -0,0 +1,39 @@
|
||||
TARGET = firmware
|
||||
BAUDRATE = 115200
|
||||
SERIALPORT ?= /dev/ttyACM0
|
||||
|
||||
CROSS ?= riscv64-unknown-elf-
|
||||
|
||||
CC = $(CROSS)gcc
|
||||
OBJCOPY = $(CROSS)objcopy
|
||||
|
||||
CFLAGS = -march=rv32i -mabi=ilp32 -g -Os -Wall -Werror
|
||||
LDFLAGS = -Tsoc.ld -Triscv_standalone.ld -nostdlib
|
||||
|
||||
SOURCES = \
|
||||
start.S \
|
||||
$(TARGET).c
|
||||
|
||||
|
||||
# By default, build our binary.
|
||||
all: $(TARGET).bin
|
||||
|
||||
#
|
||||
# Firmware binary.
|
||||
#
|
||||
|
||||
$(TARGET).elf: $(SOURCES) soc.ld resources.h
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) $(SOURCES) -o $@
|
||||
|
||||
$(TARGET).bin: $(TARGET).elf
|
||||
$(OBJCOPY) -O binary $< $@
|
||||
|
||||
|
||||
#
|
||||
# Virtual/command targets.
|
||||
#
|
||||
|
||||
.PHONY: clean
|
||||
|
||||
clean:
|
||||
rm -f $(TARGET).elf $(TARGET).bin
|
||||
71
firmware/firmware.c
Normal file
71
firmware/firmware.c
Normal file
@@ -0,0 +1,71 @@
|
||||
/**
|
||||
* Copyright (c) 2020 Great Scott Gadgets <info@greatscottgadgets.com>
|
||||
* Copyright (c) 2022 Hans Baier <hansfbaier@gmail.com>
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "resources.h"
|
||||
|
||||
#define ARRAY_SIZE(array) (sizeof(array) / sizeof(*array))
|
||||
|
||||
//
|
||||
// Support functions.
|
||||
//
|
||||
|
||||
/**
|
||||
* Transmits a single charater over our example UART.
|
||||
*/
|
||||
void print_char(char c)
|
||||
{
|
||||
while(!uart_tx_rdy_read());
|
||||
uart_tx_data_write(c);
|
||||
}
|
||||
|
||||
/**
|
||||
* Transmits a string over our UART.
|
||||
*/
|
||||
void uart_puts(char *str)
|
||||
{
|
||||
for (char *c = str; *c; ++c) {
|
||||
if (*c == '\n') {
|
||||
print_char('\r');
|
||||
}
|
||||
|
||||
print_char(*c);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints a hex character over our UART.
|
||||
*/
|
||||
void print_nibble(uint8_t nibble)
|
||||
{
|
||||
static const char hexits[] = "0123456789abcdef";
|
||||
print_char(hexits[nibble & 0xf]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints a single byte, in hex, over our UART.
|
||||
*/
|
||||
void print_byte(uint8_t byte)
|
||||
{
|
||||
print_nibble(byte >> 4);
|
||||
print_nibble(byte & 0xf);
|
||||
}
|
||||
|
||||
//
|
||||
// Core application.
|
||||
//
|
||||
|
||||
int main(void)
|
||||
{
|
||||
uart_puts("SoC started! (built: " __TIME__ ")\n");
|
||||
|
||||
while (1) {
|
||||
for(int i=0; i<(1<<23); i++) ;
|
||||
uart_puts("Ping...\r\n");
|
||||
}
|
||||
}
|
||||
44
firmware/riscv_standalone.ld
Normal file
44
firmware/riscv_standalone.ld
Normal file
@@ -0,0 +1,44 @@
|
||||
OUTPUT_FORMAT("elf32-littleriscv")
|
||||
OUTPUT_ARCH("riscv")
|
||||
ENTRY(_start)
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = 0x00000000;
|
||||
|
||||
/* Start of day code. */
|
||||
.init :
|
||||
{
|
||||
*(.init) *(.init.*)
|
||||
} > rom
|
||||
.text :
|
||||
{
|
||||
*(.text) *(.text.*)
|
||||
} > rom
|
||||
|
||||
.rodata :
|
||||
{
|
||||
*(.rodata) *(.rodata.*)
|
||||
} > rom
|
||||
.sdata :
|
||||
{
|
||||
PROVIDE(__global_pointer$ = .);
|
||||
*(.sdata) *(.sdata.*)
|
||||
}
|
||||
.data :
|
||||
{
|
||||
*(.data) *(.data.*)
|
||||
} > ram
|
||||
.bss :
|
||||
{
|
||||
*(.bss) *(.bss.*)
|
||||
} > ram
|
||||
|
||||
/DISCARD/ :
|
||||
{
|
||||
*(.eh_frame) *(.eh_frame.*)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
PROVIDE(__stack_top = ORIGIN(ram) + LENGTH(ram));
|
||||
35
firmware/start.S
Normal file
35
firmware/start.S
Normal file
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright (c) 2020 Great Scott Gadgets <info@greatscottgadgets.com>
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
.section .init, "ax"
|
||||
|
||||
.global _start
|
||||
_start:
|
||||
.cfi_startproc
|
||||
.cfi_undefined ra
|
||||
|
||||
/* Set up our global pointer. */
|
||||
.option push
|
||||
.option norelax
|
||||
la gp, __global_pointer$
|
||||
.option pop
|
||||
|
||||
/* Set up our stack. */
|
||||
la sp, __stack_top
|
||||
add s0, sp, zero
|
||||
|
||||
/*
|
||||
* NOTE: In most cases, we'd clear the BSS, here.
|
||||
*
|
||||
* In our case, our FPGA automaticaly starts with all of our RAM
|
||||
* initialized to zero; so our BSS comes pre-cleared. We'll skip the
|
||||
* formality of re-clearing it.
|
||||
*/
|
||||
|
||||
/* Finally, start our main routine. */
|
||||
jal zero, main
|
||||
|
||||
.cfi_endproc
|
||||
.end
|
||||
BIN
gateware/IRs/DT990_crossfeed_4800taps.wav
Normal file
BIN
gateware/IRs/DT990_crossfeed_4800taps.wav
Normal file
Binary file not shown.
775
gateware/adat_usb2_audio_interface.py
Normal file
775
gateware/adat_usb2_audio_interface.py
Normal file
@@ -0,0 +1,775 @@
|
||||
#!/usr/bin/env python3
|
||||
#
|
||||
# Copyright (c) 2021 Hans Baier <hansfbaier@gmail.com>
|
||||
# SPDX-License-Identifier: CERN-OHL-W-2.0
|
||||
import os
|
||||
|
||||
from amaranth import *
|
||||
from amaranth.lib.fifo import AsyncFIFOBuffered, AsyncFIFO, SyncFIFOBuffered, SyncFIFO
|
||||
from amaranth.lib.cdc import FFSynchronizer
|
||||
|
||||
from amlib.stream import connect_fifo_to_stream, connect_stream_to_fifo
|
||||
from amlib.io.i2s import I2STransmitter
|
||||
from amlib.io.debouncer import Debouncer
|
||||
from amlib.dsp.convolution.mac import StereoConvolutionMAC, ConvolutionMode
|
||||
|
||||
from luna import top_level_cli
|
||||
from luna.usb2 import USBDevice, \
|
||||
USBStreamInEndpoint, \
|
||||
USBStreamOutEndpoint, \
|
||||
USBIsochronousInMemoryEndpoint, \
|
||||
USBIsochronousOutStreamEndpoint, \
|
||||
USBIsochronousInStreamEndpoint
|
||||
|
||||
from usb_protocol.types import USBRequestType, USBStandardRequests
|
||||
|
||||
from luna.gateware.usb.usb2.device import USBDevice
|
||||
|
||||
from adat import ADATTransmitter, ADATReceiver
|
||||
from adat import EdgeToPulse
|
||||
|
||||
from usb_stream_to_channels import USBStreamToChannels
|
||||
from channels_to_usb_stream import ChannelsToUSBStream
|
||||
from channel_stream_combiner import ChannelStreamCombiner
|
||||
from channel_stream_splitter import ChannelStreamSplitter
|
||||
from bundle_multiplexer import BundleMultiplexer
|
||||
from bundle_demultiplexer import BundleDemultiplexer
|
||||
from stereopair_extractor import StereoPairExtractor
|
||||
from requesthandlers import UAC2RequestHandlers
|
||||
from debug import setup_ila, add_debug_led_array
|
||||
|
||||
from usb_descriptors import USBDescriptors
|
||||
|
||||
import wave
|
||||
import numpy as np
|
||||
|
||||
class USB2AudioInterface(Elaboratable):
|
||||
""" USB Audio Class v2 interface """
|
||||
# one isochronous packet typically has 6 or 7 samples of 8 channels of 32 bit samples
|
||||
# 6 samples * 8 channels * 4 bytes/sample = 192 bytes
|
||||
# 7 samples * 8 channels * 4 bytes/sample = 224 bytes
|
||||
USB2_NO_CHANNELS = 4
|
||||
USB1_NO_CHANNELS = 32 + USB2_NO_CHANNELS
|
||||
USB2_MAX_PACKET_SIZE = int(224 // 8 * USB2_NO_CHANNELS)
|
||||
USB1_MAX_PACKET_SIZE = int(224 * 4 + USB2_MAX_PACKET_SIZE)
|
||||
INPUT_CDC_FIFO_DEPTH = 256 * 4
|
||||
|
||||
USE_ILA = False
|
||||
ILA_MAX_PACKET_SIZE = 512
|
||||
|
||||
USE_DEBUG_LED_ARRAY = False
|
||||
|
||||
USE_CONVOLUTION = False
|
||||
|
||||
USE_SOC = False
|
||||
|
||||
def __init__(self) -> None:
|
||||
if self.USE_SOC:
|
||||
from amlib.soc import SimpleSoC
|
||||
from lambdasoc.periph.serial import AsyncSerialPeripheral, AsyncSerial
|
||||
from lambdasoc.periph.timer import TimerPeripheral
|
||||
|
||||
self.soc = soc = SimpleSoC()
|
||||
|
||||
soc.add_rom("firmware/firmware.bin", 0x4000)
|
||||
soc.add_ram(0x4000)
|
||||
|
||||
self.uart_pins = Record([
|
||||
('rx', [('i', 1)]),
|
||||
('tx', [('o', 1)])
|
||||
])
|
||||
|
||||
uart = AsyncSerialPeripheral(core=AsyncSerial(divisor=int(60e6 // 115200), pins=self.uart_pins))
|
||||
soc.add_peripheral(uart)
|
||||
|
||||
timer = TimerPeripheral(24)
|
||||
soc.add_peripheral(timer)
|
||||
|
||||
with open("firmware/soc.ld", 'w') as ld:
|
||||
soc.generate_ld_script(file=ld)
|
||||
with open("firmware/resources.h", 'w') as res_header:
|
||||
soc.generate_c_header(file=res_header)
|
||||
|
||||
result = os.system("(cd firmware; make)")
|
||||
assert result == 0, "compilation failed, aborting...."
|
||||
print("firmware compilation succeeded.")
|
||||
|
||||
super().__init__()
|
||||
|
||||
def elaborate(self, platform):
|
||||
m = Module()
|
||||
|
||||
usb1_number_of_channels = self.USB1_NO_CHANNELS
|
||||
usb1_number_of_channels_bits = Shape.cast(range(usb1_number_of_channels)).width
|
||||
usb2_number_of_channels = self.USB2_NO_CHANNELS
|
||||
usb2_number_of_channels_bits = Shape.cast(range(usb2_number_of_channels)).width
|
||||
audio_bits = 24
|
||||
samplerate = 48000
|
||||
adat_number_of_channels = usb1_number_of_channels - usb2_number_of_channels
|
||||
|
||||
m.submodules.car = platform.clock_domain_generator()
|
||||
|
||||
#
|
||||
# SoC
|
||||
#
|
||||
if self.USE_SOC:
|
||||
m.submodules.soc = self.soc
|
||||
uart_pads = platform.request("uart", 0)
|
||||
m.d.comb += [
|
||||
uart_pads.tx .eq(self.uart_pins.tx),
|
||||
self.uart_pins.rx .eq(uart_pads.rx)
|
||||
]
|
||||
|
||||
#
|
||||
# USB
|
||||
#
|
||||
ulpi1 = platform.request("ulpi", 1)
|
||||
ulpi2 = platform.request("ulpi", 2)
|
||||
m.submodules.usb1 = usb1 = USBDevice(bus=ulpi1)
|
||||
m.submodules.usb2 = usb2 = USBDevice(bus=ulpi2)
|
||||
|
||||
descriptors = USBDescriptors(ila_max_packet_size=self.ILA_MAX_PACKET_SIZE, \
|
||||
use_ila=self.USE_ILA)
|
||||
|
||||
usb1_control_ep = usb1.add_control_endpoint()
|
||||
usb1_descriptors = descriptors.create_usb1_descriptors(usb1_number_of_channels, self.USB1_MAX_PACKET_SIZE)
|
||||
usb1_control_ep.add_standard_request_handlers(usb1_descriptors, blacklist=[
|
||||
lambda setup: (setup.type == USBRequestType.STANDARD)
|
||||
& (setup.request == USBStandardRequests.SET_INTERFACE)
|
||||
])
|
||||
usb1_class_request_handler = UAC2RequestHandlers()
|
||||
usb1_control_ep.add_request_handler(usb1_class_request_handler)
|
||||
|
||||
usb2_control_ep = usb2.add_control_endpoint()
|
||||
usb2_descriptors = descriptors.create_usb2_descriptors(usb2_number_of_channels, self.USB2_MAX_PACKET_SIZE)
|
||||
usb2_control_ep.add_standard_request_handlers(usb2_descriptors, blacklist=[
|
||||
lambda setup: (setup.type == USBRequestType.STANDARD)
|
||||
& (setup.request == USBStandardRequests.SET_INTERFACE)
|
||||
])
|
||||
usb2_class_request_handler = UAC2RequestHandlers()
|
||||
usb2_control_ep.add_request_handler(usb2_class_request_handler)
|
||||
|
||||
# audio out ports of the host
|
||||
usb1_ep1_out = USBIsochronousOutStreamEndpoint(
|
||||
endpoint_number=1, # EP 1 OUT
|
||||
max_packet_size=self.USB1_MAX_PACKET_SIZE)
|
||||
usb1.add_endpoint(usb1_ep1_out)
|
||||
usb2_ep1_out = USBIsochronousOutStreamEndpoint(
|
||||
endpoint_number=1, # EP 1 OUT
|
||||
max_packet_size=self.USB2_MAX_PACKET_SIZE)
|
||||
usb2.add_endpoint(usb2_ep1_out)
|
||||
|
||||
# audio rate feedback input ports of the host
|
||||
usb1_ep1_in = USBIsochronousInMemoryEndpoint(
|
||||
endpoint_number=1, # EP 1 IN
|
||||
max_packet_size=4)
|
||||
usb1.add_endpoint(usb1_ep1_in)
|
||||
usb2_ep1_in = USBIsochronousInMemoryEndpoint(
|
||||
endpoint_number=1, # EP 1 IN
|
||||
max_packet_size=4)
|
||||
usb2.add_endpoint(usb2_ep1_in)
|
||||
|
||||
# audio input ports of the host
|
||||
usb1_ep2_in = USBIsochronousInStreamEndpoint(
|
||||
endpoint_number=2, # EP 2 IN
|
||||
max_packet_size=self.USB1_MAX_PACKET_SIZE)
|
||||
usb1.add_endpoint(usb1_ep2_in)
|
||||
usb2_ep2_in = USBIsochronousInStreamEndpoint(
|
||||
endpoint_number=2, # EP 2 IN
|
||||
max_packet_size=self.USB2_MAX_PACKET_SIZE)
|
||||
usb2.add_endpoint(usb2_ep2_in)
|
||||
|
||||
# MIDI endpoints
|
||||
usb1_ep3_out = USBStreamOutEndpoint(
|
||||
endpoint_number=3, # EP 3 OUT
|
||||
max_packet_size=USBDescriptors.MAX_PACKET_SIZE_MIDI)
|
||||
usb1.add_endpoint(usb1_ep3_out)
|
||||
usb2_ep3_out = USBStreamOutEndpoint(
|
||||
endpoint_number=3, # EP 3 OUT
|
||||
max_packet_size=USBDescriptors.MAX_PACKET_SIZE_MIDI)
|
||||
usb2.add_endpoint(usb2_ep3_out)
|
||||
|
||||
usb1_ep3_in = USBStreamInEndpoint(
|
||||
endpoint_number=3, # EP 3 IN
|
||||
max_packet_size=USBDescriptors.MAX_PACKET_SIZE_MIDI)
|
||||
usb1.add_endpoint(usb1_ep3_in)
|
||||
usb2_ep3_in = USBStreamInEndpoint(
|
||||
endpoint_number=3, # EP 3 IN
|
||||
max_packet_size=USBDescriptors.MAX_PACKET_SIZE_MIDI)
|
||||
usb2.add_endpoint(usb2_ep3_in)
|
||||
|
||||
|
||||
m.d.comb += [
|
||||
usb1.connect .eq(1),
|
||||
usb2.connect .eq(1),
|
||||
# Connect our device as a high speed device
|
||||
usb1.full_speed_only .eq(0),
|
||||
usb2.full_speed_only .eq(0),
|
||||
]
|
||||
|
||||
usb1_audio_in_frame_bytes = \
|
||||
self.calculate_usb_input_frame_size(m, "usb1", usb1_ep1_out, usb1_ep2_in, usb1_number_of_channels, self.USB1_MAX_PACKET_SIZE)
|
||||
usb2_audio_in_frame_bytes = \
|
||||
self.calculate_usb_input_frame_size(m, "usb2", usb2_ep1_out, usb2_ep2_in, usb2_number_of_channels, self.USB2_MAX_PACKET_SIZE)
|
||||
|
||||
usb1_sof_counter, usb1_to_output_fifo_level, usb1_to_output_fifo_depth, \
|
||||
usb2_sof_counter, usb2_to_usb1_fifo_level, usb2_to_usb1_fifo_depth = \
|
||||
self.create_sample_rate_feedback_circuit(m, usb1, usb1_ep1_in, usb2, usb2_ep1_in)
|
||||
|
||||
usb1_audio_in_active = self.detect_active_audio_in (m, "usb1", usb1, usb1_ep2_in)
|
||||
usb2_audio_in_active = self.detect_active_audio_in (m, "usb2", usb2, usb2_ep2_in)
|
||||
usb2_audio_out_active = self.detect_active_audio_out(m, "usb2", usb2, usb2_ep1_out)
|
||||
|
||||
#
|
||||
# USB <-> Channel Stream conversion
|
||||
#
|
||||
m.submodules.usb1_to_channel_stream = usb1_to_channel_stream = \
|
||||
DomainRenamer("usb")(USBStreamToChannels(usb1_number_of_channels))
|
||||
m.submodules.usb2_to_channel_stream = usb2_to_channel_stream = \
|
||||
DomainRenamer("usb")(USBStreamToChannels(usb2_number_of_channels))
|
||||
|
||||
m.submodules.usb1_channel_stream_combiner = usb1_channel_stream_combiner = \
|
||||
DomainRenamer("usb")(ChannelStreamCombiner(adat_number_of_channels, usb2_number_of_channels))
|
||||
|
||||
m.submodules.usb1_channel_stream_splitter = usb1_channel_stream_splitter = \
|
||||
DomainRenamer("usb")(ChannelStreamSplitter(adat_number_of_channels, usb2_number_of_channels))
|
||||
|
||||
m.submodules.channels_to_usb1_stream = channels_to_usb1_stream = \
|
||||
DomainRenamer("usb")(ChannelsToUSBStream(usb1_number_of_channels, max_packet_size=self.USB1_MAX_PACKET_SIZE))
|
||||
m.submodules.channels_to_usb2_stream = channels_to_usb2_stream = \
|
||||
DomainRenamer("usb")(ChannelsToUSBStream(usb2_number_of_channels, max_packet_size=self.USB2_MAX_PACKET_SIZE))
|
||||
|
||||
usb1_no_channels = Signal(range(usb1_number_of_channels * 2), reset=2)
|
||||
usb1_no_channels_sync = Signal.like(usb1_no_channels)
|
||||
|
||||
usb2_no_channels = Signal(range(usb2_number_of_channels * 2), reset=2)
|
||||
|
||||
m.submodules.no_channels_sync_synchronizer = FFSynchronizer(usb1_no_channels, usb1_no_channels_sync, o_domain="sync")
|
||||
|
||||
m.d.comb += [
|
||||
usb1_to_channel_stream.no_channels_in.eq(usb1_no_channels),
|
||||
channels_to_usb1_stream.no_channels_in.eq(usb1_no_channels),
|
||||
channels_to_usb1_stream.audio_in_active.eq(usb1_audio_in_active),
|
||||
|
||||
usb2_to_channel_stream.no_channels_in.eq(usb2_no_channels),
|
||||
channels_to_usb2_stream.no_channels_in.eq(usb2_no_channels),
|
||||
channels_to_usb2_stream.audio_in_active.eq(usb2_audio_in_active),
|
||||
]
|
||||
|
||||
with m.Switch(usb1_class_request_handler.output_interface_altsetting_nr):
|
||||
with m.Case(2):
|
||||
m.d.usb += usb1_no_channels.eq(usb1_number_of_channels)
|
||||
with m.Default():
|
||||
m.d.usb += usb1_no_channels.eq(2)
|
||||
|
||||
with m.Switch(usb2_class_request_handler.output_interface_altsetting_nr):
|
||||
with m.Case(2):
|
||||
m.d.usb += usb2_no_channels.eq(usb2_number_of_channels)
|
||||
with m.Default():
|
||||
m.d.usb += usb2_no_channels.eq(2)
|
||||
|
||||
m.submodules.usb_to_output_fifo = usb1_to_output_fifo = \
|
||||
AsyncFIFO(width=audio_bits + usb1_number_of_channels_bits + 2, depth=usb1_to_output_fifo_depth, w_domain="usb", r_domain="sync")
|
||||
|
||||
m.submodules.usb2_to_usb1_fifo = usb2_to_usb1_fifo = \
|
||||
DomainRenamer("usb")(SyncFIFOBuffered(width=audio_bits + usb2_number_of_channels_bits + 2, depth=usb2_to_usb1_fifo_depth))
|
||||
|
||||
m.submodules.bundle_demultiplexer = bundle_demultiplexer = BundleDemultiplexer()
|
||||
m.submodules.bundle_multiplexer = bundle_multiplexer = DomainRenamer("fast")(BundleMultiplexer())
|
||||
|
||||
adat_transmitters = []
|
||||
adat_receivers = []
|
||||
adat_pads = []
|
||||
for i in range(1, 5):
|
||||
transmitter = ADATTransmitter(fifo_depth=9*4)
|
||||
setattr(m.submodules, f"adat{i}_transmitter", transmitter)
|
||||
adat_transmitters.append(transmitter)
|
||||
|
||||
receiver = DomainRenamer("fast")(ADATReceiver(platform.fast_domain_clock_freq))
|
||||
setattr(m.submodules, f"adat{i}_receiver", receiver)
|
||||
adat_receivers.append(receiver)
|
||||
|
||||
adat_pads.append(platform.request("toslink", i))
|
||||
|
||||
#
|
||||
# signal path: USB ===> ADAT transmitters
|
||||
#
|
||||
audio_bits_end = audio_bits
|
||||
channel_bits_start = audio_bits
|
||||
|
||||
usb1_channel_bits_end = channel_bits_start + usb1_number_of_channels_bits
|
||||
usb1_first_bit_pos = usb1_channel_bits_end
|
||||
usb1_last_bit_pos = usb1_first_bit_pos + 1
|
||||
|
||||
m.d.comb += [
|
||||
# convert USB stream to channel splitter to (output audio, USB2 audio IN)
|
||||
usb1_to_channel_stream.usb_stream_in.stream_eq(usb1_ep1_out.stream),
|
||||
usb1_channel_stream_splitter.combined_channel_stream_in.stream_eq(usb1_to_channel_stream.channel_stream_out),
|
||||
|
||||
*connect_stream_to_fifo(usb1_channel_stream_splitter.lower_channel_stream_out, usb1_to_output_fifo),
|
||||
|
||||
usb1_to_output_fifo.w_data[channel_bits_start:usb1_channel_bits_end]
|
||||
.eq(usb1_channel_stream_splitter.lower_channel_stream_out.channel_nr),
|
||||
|
||||
usb1_to_output_fifo.w_data[usb1_first_bit_pos]
|
||||
.eq(usb1_channel_stream_splitter.lower_channel_stream_out.first),
|
||||
|
||||
usb1_to_output_fifo.w_data[usb1_last_bit_pos]
|
||||
.eq(usb1_channel_stream_splitter.lower_channel_stream_out.last),
|
||||
|
||||
usb1_to_output_fifo.r_en .eq(bundle_demultiplexer.channel_stream_in.ready),
|
||||
usb1_to_output_fifo_level .eq(usb1_to_output_fifo.w_level),
|
||||
|
||||
# demultiplex channel stream to the different transmitters
|
||||
bundle_demultiplexer.channel_stream_in.payload.eq(usb1_to_output_fifo.r_data[0:audio_bits_end]),
|
||||
bundle_demultiplexer.channel_stream_in.channel_nr.eq(usb1_to_output_fifo.r_data[channel_bits_start:usb1_channel_bits_end]),
|
||||
bundle_demultiplexer.channel_stream_in.last.eq(usb1_to_output_fifo.r_data[-1]),
|
||||
bundle_demultiplexer.channel_stream_in.valid.eq(usb1_to_output_fifo.r_rdy & usb1_to_output_fifo.r_en),
|
||||
bundle_demultiplexer.no_channels_in.eq(usb1_no_channels_sync),
|
||||
]
|
||||
|
||||
# wire up transmitters / receivers
|
||||
for i in range(4):
|
||||
m.d.comb += [
|
||||
# transmitters
|
||||
adat_transmitters[i].sample_in .eq(bundle_demultiplexer.bundles_out[i].payload),
|
||||
adat_transmitters[i].addr_in .eq(bundle_demultiplexer.bundles_out[i].channel_nr),
|
||||
adat_transmitters[i].last_in .eq(bundle_demultiplexer.bundles_out[i].last),
|
||||
adat_transmitters[i].valid_in .eq(bundle_demultiplexer.bundles_out[i].valid),
|
||||
bundle_demultiplexer.bundles_out[i].ready.eq(adat_transmitters[i].ready_out),
|
||||
adat_transmitters[i].user_data_in .eq(0),
|
||||
|
||||
adat_pads[i].tx.eq(adat_transmitters[i].adat_out),
|
||||
|
||||
# receivers
|
||||
adat_receivers[i].adat_in.eq(adat_pads[i].rx),
|
||||
|
||||
# wire up receive FIFO to ADAT receiver
|
||||
bundle_multiplexer.no_channels_in[i] .eq(8),
|
||||
bundle_multiplexer.bundles_in[i].payload .eq(adat_receivers[i].sample_out),
|
||||
bundle_multiplexer.bundles_in[i].channel_nr .eq(adat_receivers[i].addr_out),
|
||||
bundle_multiplexer.bundles_in[i].valid .eq(adat_receivers[i].output_enable),
|
||||
bundle_multiplexer.bundles_in[i].last .eq(adat_receivers[i].addr_out == 7),
|
||||
bundle_multiplexer.bundle_active_in[i] .eq(adat_receivers[i].synced_out),
|
||||
]
|
||||
|
||||
#
|
||||
# signal path: ADAT receivers ===> USB
|
||||
#
|
||||
m.submodules.input_to_usb_fifo = input_to_usb_fifo = \
|
||||
AsyncFIFOBuffered(width=audio_bits + usb1_number_of_channels_bits + 2, depth=self.INPUT_CDC_FIFO_DEPTH, w_domain="fast", r_domain="usb")
|
||||
|
||||
chnr_start = audio_bits
|
||||
input_chnr_end = chnr_start + adat_number_of_channels
|
||||
input_channel_nr = input_to_usb_fifo.r_data[chnr_start:input_chnr_end]
|
||||
|
||||
first_channel = 0
|
||||
input_last_channel = (adat_number_of_channels - 1)
|
||||
|
||||
m.d.comb += [
|
||||
# wire up receive FIFO to bundle multiplexer
|
||||
input_to_usb_fifo.w_data[0:chnr_start] .eq(bundle_multiplexer.channel_stream_out.payload),
|
||||
input_to_usb_fifo.w_data[chnr_start:input_chnr_end] .eq(bundle_multiplexer.channel_stream_out.channel_nr),
|
||||
input_to_usb_fifo.w_en .eq(bundle_multiplexer.channel_stream_out.valid & input_to_usb_fifo.w_rdy),
|
||||
bundle_multiplexer.channel_stream_out.ready.eq(input_to_usb_fifo.w_rdy),
|
||||
|
||||
# convert audio stream to USB stream
|
||||
# connect ADAT channels to combiner
|
||||
usb1_channel_stream_combiner.lower_channel_stream_in.payload .eq(input_to_usb_fifo.r_data[0:chnr_start]),
|
||||
usb1_channel_stream_combiner.lower_channel_stream_in.channel_nr .eq(input_channel_nr),
|
||||
usb1_channel_stream_combiner.lower_channel_stream_in.first .eq(input_channel_nr == first_channel),
|
||||
usb1_channel_stream_combiner.lower_channel_stream_in.last .eq(input_channel_nr == input_last_channel),
|
||||
usb1_channel_stream_combiner.lower_channel_stream_in.valid .eq(input_to_usb_fifo.r_rdy),
|
||||
input_to_usb_fifo.r_en.eq(usb1_channel_stream_combiner.lower_channel_stream_in.ready),
|
||||
|
||||
# connect combiner output to USB1
|
||||
channels_to_usb1_stream.channel_stream_in.stream_eq(usb1_channel_stream_combiner.combined_channel_stream_out),
|
||||
channels_to_usb1_stream.data_requested_in .eq(usb1_ep2_in.data_requested),
|
||||
channels_to_usb1_stream.frame_finished_in .eq(usb1_ep2_in.frame_finished),
|
||||
|
||||
# wire up USB1 audio IN
|
||||
usb1_ep2_in.stream.stream_eq(channels_to_usb1_stream.usb_stream_out),
|
||||
]
|
||||
|
||||
#
|
||||
# signal path: USB2 <-> USB1
|
||||
#
|
||||
usb2_channel_bits_end = channel_bits_start + usb2_number_of_channels_bits
|
||||
usb2_first_bit_pos = usb2_channel_bits_end
|
||||
usb2_last_bit_pos = usb2_first_bit_pos + 1
|
||||
|
||||
usb2_channel_nr = usb2_to_usb1_fifo.r_data[chnr_start:usb2_channel_bits_end]
|
||||
m.d.comb +=[
|
||||
usb2_to_channel_stream.usb_stream_in.stream_eq(usb2_ep1_out.stream),
|
||||
*connect_stream_to_fifo(usb2_to_channel_stream.channel_stream_out, usb2_to_usb1_fifo),
|
||||
|
||||
usb2_to_usb1_fifo.w_data[channel_bits_start:usb2_channel_bits_end]
|
||||
.eq(usb2_to_channel_stream.channel_stream_out.channel_nr),
|
||||
|
||||
usb2_to_usb1_fifo.w_data[usb2_first_bit_pos]
|
||||
.eq(usb2_to_channel_stream.channel_stream_out.first),
|
||||
|
||||
usb2_to_usb1_fifo.w_data[usb2_last_bit_pos]
|
||||
.eq(usb2_to_channel_stream.channel_stream_out.last),
|
||||
|
||||
usb2_to_usb1_fifo_level
|
||||
.eq(usb2_to_usb1_fifo.w_level),
|
||||
|
||||
# connect USB2 OUT channels to USB1 IN
|
||||
usb1_channel_stream_combiner.upper_channels_active_in .eq(~usb2.suspended & usb2_audio_out_active),
|
||||
usb1_channel_stream_combiner.upper_channel_stream_in.payload .eq(usb2_to_usb1_fifo.r_data[0:chnr_start]),
|
||||
usb1_channel_stream_combiner.upper_channel_stream_in.channel_nr .eq(usb2_channel_nr),
|
||||
usb1_channel_stream_combiner.upper_channel_stream_in.first .eq(usb2_to_usb1_fifo.r_data[usb2_first_bit_pos]),
|
||||
usb1_channel_stream_combiner.upper_channel_stream_in.last .eq(usb2_to_usb1_fifo.r_data[usb2_last_bit_pos]),
|
||||
usb1_channel_stream_combiner.upper_channel_stream_in.valid .eq(usb2_to_usb1_fifo.r_rdy),
|
||||
usb2_to_usb1_fifo.r_en.eq(usb1_channel_stream_combiner.upper_channel_stream_in.ready),
|
||||
|
||||
# connect USB2 IN channels to USB1 OUT
|
||||
channels_to_usb2_stream.channel_stream_in.stream_eq(usb1_channel_stream_splitter.upper_channel_stream_out),
|
||||
channels_to_usb2_stream.data_requested_in .eq(usb2_ep2_in.data_requested),
|
||||
channels_to_usb2_stream.frame_finished_in .eq(usb2_ep2_in.frame_finished),
|
||||
|
||||
usb2_ep2_in.stream.stream_eq(channels_to_usb2_stream.usb_stream_out),
|
||||
]
|
||||
|
||||
#
|
||||
# I2S DACs
|
||||
#
|
||||
dac1_fifo_depth = 32 if self.USE_CONVOLUTION else 16 #when introducing delay with the convolver we need a larger fifo
|
||||
m.submodules.dac1_transmitter = dac1 = DomainRenamer("usb")(I2STransmitter(sample_width=audio_bits, fifo_depth=dac1_fifo_depth))
|
||||
m.submodules.dac2_transmitter = dac2 = DomainRenamer("usb")(I2STransmitter(sample_width=audio_bits))
|
||||
m.submodules.dac1_extractor = dac1_extractor = DomainRenamer("usb")(StereoPairExtractor(usb1_number_of_channels, usb1_to_output_fifo_depth))
|
||||
m.submodules.dac2_extractor = dac2_extractor = DomainRenamer("usb")(StereoPairExtractor(usb1_number_of_channels, usb1_to_output_fifo_depth))
|
||||
dac1_pads = platform.request("i2s", 1)
|
||||
dac2_pads = platform.request("i2s", 2)
|
||||
|
||||
# divide bitclock to get word clock
|
||||
# each half cycle has 32 bits in it
|
||||
lrclk = Signal(reset=1)
|
||||
bit_counter = Signal(6)
|
||||
|
||||
m.d.dac += bit_counter.eq(bit_counter + 1)
|
||||
m.d.comb += lrclk.eq(bit_counter[-1])
|
||||
|
||||
# hardwire DAC1 to channels 0/1 and DAC2 to 2/3
|
||||
# until making it switchable via USB request
|
||||
m.d.comb += [
|
||||
dac1_extractor.selected_channel_in.eq(0),
|
||||
# if stereo mode is enabled we want the second DAC to be wired
|
||||
# to main lef/right channels, just as the first one
|
||||
dac2_extractor.selected_channel_in.eq(Mux(usb1_no_channels == 2, 0, 2)),
|
||||
]
|
||||
|
||||
if self.USE_CONVOLUTION:
|
||||
enable_convolver = Signal()
|
||||
|
||||
# load the IR data
|
||||
with wave.open('IRs/DT990_crossfeed_4800taps.wav', 'rb') as wav:
|
||||
ir_data = wav.readframes(wav.getnframes())
|
||||
ir_sample_rate = wav.getframerate()
|
||||
|
||||
ir_sig = np.zeros((len(ir_data) // 6, 2), dtype='int32')
|
||||
for i in range(0, len(ir_sig), 6):
|
||||
ir_sig[i // 6, 0] = int.from_bytes(ir_data[i:i + 3], byteorder='little', signed=True)
|
||||
ir_sig[i // 6, 1] = int.from_bytes(ir_data[i + 3:i + 6], byteorder='little', signed=True)
|
||||
|
||||
# tapcount 4096 - more is failing to synthesize right now. 4800 would be the goal for 100ms.
|
||||
taps = ir_sig[:4096,:]
|
||||
|
||||
m.submodules.convolver = convolver = DomainRenamer("usb")(StereoConvolutionMAC(taps=taps, samplerate=samplerate, clockfrequency=60e6,
|
||||
bitwidth=audio_bits, convolutionMode=ConvolutionMode.CROSSFEED))
|
||||
|
||||
# validate the IR file
|
||||
assert ir_sample_rate == samplerate, f"Unsupported samplerate {ir_sample_rate} for IR file. Required samplerate is {samplerate}"
|
||||
for tap in range(len(taps)):
|
||||
assert -1 * 2 ** (audio_bits - 1) <= taps[tap, 0] <= 1 * 2 ** (audio_bits - 1) - 1,\
|
||||
f"Tap #{tap} is out of range for bitwidth {audio_bits}: {taps[tap, 0]}"
|
||||
else:
|
||||
convolver = None
|
||||
enable_convolver = None
|
||||
|
||||
self.wire_up_dac(m, usb1_to_channel_stream, dac1_extractor, dac1, lrclk, dac1_pads, convolver, enable_convolver)
|
||||
self.wire_up_dac(m, usb1_to_channel_stream, dac2_extractor, dac2, lrclk, dac2_pads)
|
||||
|
||||
if self.USE_CONVOLUTION:
|
||||
# the convolver can be toggled in-/active either via the first button on the devboard or via the
|
||||
# TOGGLE_CONVOLUTION(1) vendor request
|
||||
m.submodules.button_debouncer = button_debouncer = Debouncer()
|
||||
m.submodules.request_debouncer = request_debouncer = Debouncer()
|
||||
m.d.comb += [
|
||||
button_debouncer.btn_in.eq(platform.request("core_button")[0]),
|
||||
request_debouncer.btn_in.eq(usb1_class_request_handler.enable_convolution)
|
||||
]
|
||||
with m.If(button_debouncer.btn_up_out | request_debouncer.btn_up_out): # toggle convolution on/off
|
||||
m.d.sync += enable_convolver.eq(~enable_convolver)
|
||||
m.d.comb += dac1.enable_in.eq(0) # reset the DAC once we toggle its signal source
|
||||
|
||||
#
|
||||
# USB => output FIFO level debug signals
|
||||
#
|
||||
min_fifo_level = Signal.like(usb1_to_output_fifo_level, reset=usb1_to_output_fifo_depth)
|
||||
max_fifo_level = Signal.like(usb1_to_output_fifo_level)
|
||||
|
||||
with m.If(usb1_to_output_fifo_level > max_fifo_level):
|
||||
m.d.sync += max_fifo_level.eq(usb1_to_output_fifo_level)
|
||||
|
||||
with m.If(usb1_to_output_fifo_level < min_fifo_level):
|
||||
m.d.sync += min_fifo_level.eq(usb1_to_output_fifo_level)
|
||||
|
||||
#
|
||||
# USB MIDI
|
||||
#
|
||||
usb_midi_fifo_depth = USBDescriptors.MAX_PACKET_SIZE_MIDI
|
||||
m.submodules.usb1_to_usb2_midi_fifo = usb1_to_usb2_midi_fifo = \
|
||||
DomainRenamer("usb")(SyncFIFOBuffered(width=8+2, depth=usb_midi_fifo_depth))
|
||||
m.submodules.usb2_to_usb1_midi_fifo = usb2_to_usb1_midi_fifo = \
|
||||
DomainRenamer("usb")(SyncFIFOBuffered(width=8+2, depth=usb_midi_fifo_depth))
|
||||
|
||||
m.d.comb += [
|
||||
*connect_stream_to_fifo(usb1_ep3_out.stream, usb1_to_usb2_midi_fifo, firstBit=-2, lastBit=-1),
|
||||
*connect_fifo_to_stream(usb1_to_usb2_midi_fifo, usb2_ep3_in.stream, firstBit=-2, lastBit=-1),
|
||||
*connect_stream_to_fifo(usb2_ep3_out.stream, usb2_to_usb1_midi_fifo, firstBit=-2, lastBit=-1),
|
||||
*connect_fifo_to_stream(usb2_to_usb1_midi_fifo, usb1_ep3_in.stream, firstBit=-2, lastBit=-1),
|
||||
]
|
||||
|
||||
# Internal Logic Analyzer
|
||||
if self.USE_ILA:
|
||||
setup_ila(locals(), self.ILA_MAX_PACKET_SIZE, self.USE_CONVOLUTION)
|
||||
|
||||
if self.USE_DEBUG_LED_ARRAY:
|
||||
add_debug_led_array(locals())
|
||||
|
||||
usb_aux1 = platform.request("usb_aux", 1)
|
||||
usb_aux2 = platform.request("usb_aux", 2)
|
||||
|
||||
#
|
||||
# board status LEDs
|
||||
#
|
||||
leds = platform.request("leds")
|
||||
|
||||
m.d.comb += [
|
||||
leds.active1.eq(usb1.tx_activity_led | usb1.rx_activity_led),
|
||||
leds.suspended1.eq(usb1.suspended),
|
||||
leds.active2.eq(usb2.tx_activity_led | usb2.rx_activity_led),
|
||||
leds.suspended2.eq(usb2.suspended),
|
||||
leds.usb1.eq(usb_aux1.vbus),
|
||||
leds.usb2.eq(usb_aux2.vbus),
|
||||
]
|
||||
m.d.comb += [getattr(leds, f"sync{i + 1}").eq(adat_receivers[i].synced_out) for i in range(4)]
|
||||
|
||||
if self.USE_CONVOLUTION:
|
||||
convolver_led = platform.request("core_led", 0)
|
||||
m.d.comb += convolver_led.o.eq(enable_convolver)
|
||||
|
||||
return m
|
||||
|
||||
|
||||
def detect_active_audio_in(self, m, name: str, usb, ep2_in):
|
||||
audio_in_seen = Signal(name=f"{name}_audio_in_seen")
|
||||
audio_in_active = Signal(name=f"{name}_audio_in_active")
|
||||
|
||||
# detect if we don't have a USB audio IN packet
|
||||
with m.If(usb.sof_detected):
|
||||
m.d.usb += [
|
||||
audio_in_active.eq(audio_in_seen),
|
||||
audio_in_seen.eq(0),
|
||||
]
|
||||
|
||||
with m.If(ep2_in.data_requested):
|
||||
m.d.usb += audio_in_seen.eq(1)
|
||||
|
||||
return audio_in_active
|
||||
|
||||
|
||||
def detect_active_audio_out(self, m, name: str, usb, ep1_out):
|
||||
audio_out_seen = Signal(name=f"{name}_audio_out_seen")
|
||||
audio_out_active = Signal(name=f"{name}_audio_out_active")
|
||||
|
||||
# detect if we don't have a USB audio OUT packet
|
||||
with m.If(usb.sof_detected):
|
||||
m.d.usb += [
|
||||
audio_out_active.eq(audio_out_seen),
|
||||
audio_out_seen.eq(0),
|
||||
]
|
||||
|
||||
with m.If(ep1_out.stream.last):
|
||||
m.d.usb += audio_out_seen.eq(1)
|
||||
|
||||
return audio_out_active
|
||||
|
||||
|
||||
def calculate_usb_input_frame_size(self, m: Module, usb_name: str, ep1_out, ep2_in, number_of_channels: int, max_packet_size: int):
|
||||
"""calculate the number of bytes one packet of audio input contains"""
|
||||
|
||||
audio_in_frame_byte_counter = Signal(range(max_packet_size), name=f"{usb_name}_audio_in_frame_byte_counter", reset=24 * number_of_channels)
|
||||
audio_in_frame_bytes_counting = Signal(name=f"{usb_name}_audio_in_frame_bytes_counting")
|
||||
audio_in_frame_bytes = Signal.like(audio_in_frame_byte_counter, name=f"{usb_name}_audio_in_frame_bytes")
|
||||
|
||||
with m.If(ep1_out.stream.valid & ep1_out.stream.ready):
|
||||
with m.If(audio_in_frame_bytes_counting):
|
||||
m.d.usb += audio_in_frame_byte_counter.eq(audio_in_frame_byte_counter + 1)
|
||||
|
||||
with m.If(ep1_out.stream.first):
|
||||
m.d.usb += [
|
||||
audio_in_frame_byte_counter.eq(1),
|
||||
audio_in_frame_bytes_counting.eq(1),
|
||||
]
|
||||
|
||||
with m.If(ep1_out.stream.last):
|
||||
m.d.usb += [
|
||||
audio_in_frame_bytes_counting.eq(0),
|
||||
audio_in_frame_bytes.eq(audio_in_frame_byte_counter + 1),
|
||||
]
|
||||
|
||||
m.d.comb += ep2_in.bytes_in_frame.eq(audio_in_frame_bytes),
|
||||
|
||||
return audio_in_frame_bytes
|
||||
|
||||
|
||||
def create_sample_rate_feedback_circuit(self, m: Module, usb1, usb1_ep1_in, usb2, usb2_ep1_in):
|
||||
#
|
||||
# USB rate feedback
|
||||
#
|
||||
adat_clock_usb = Signal()
|
||||
m.submodules.adat_clock_usb_sync = FFSynchronizer(ClockSignal("adat"), adat_clock_usb, o_domain="usb")
|
||||
m.submodules.adat_clock_usb_pulse = adat_clock_usb_pulse = DomainRenamer("usb")(EdgeToPulse())
|
||||
adat_clock_tick = Signal()
|
||||
m.d.usb += [
|
||||
adat_clock_usb_pulse.edge_in.eq(adat_clock_usb),
|
||||
adat_clock_tick.eq(adat_clock_usb_pulse.pulse_out),
|
||||
]
|
||||
|
||||
usb1_feedback_value = Signal(32, reset=0x60000)
|
||||
usb1_bit_pos = Signal(5)
|
||||
usb2_feedback_value = Signal(32, reset=0x60000)
|
||||
usb2_bit_pos = Signal(5)
|
||||
|
||||
# this tracks the number of ADAT frames in N microframes
|
||||
# with 12.288MHz / 8kHz = 1536 samples per microframe
|
||||
# we have N = 256, so we need
|
||||
# math.ceil(math.log2(1536 * 256)) = 19 bits
|
||||
usb1_adat_clock_counter = Signal(19)
|
||||
usb2_adat_clock_counter = Signal(19)
|
||||
|
||||
# according to USB2 standard chapter 5.12.4.2
|
||||
# we need at least 2**13 / 2**8 = 2**5 = 32 SOF-frames of
|
||||
# sample master frequency counter to get the minimal
|
||||
# precision for the sample frequency estimate
|
||||
# / 2**8 because the ADAT-clock = 256 times = 2**8
|
||||
# the sample frequency
|
||||
# we average over 256 microframes, because that gives
|
||||
# us the maximum precision needed by the feedback endpoint
|
||||
usb1_sof_counter = Signal(8)
|
||||
usb2_sof_counter = Signal(8)
|
||||
|
||||
# since samples are constantly consumed from the FIFO
|
||||
# half the maximum USB packet size should be more than enough
|
||||
usb1_to_output_fifo_depth = self.USB1_MAX_PACKET_SIZE // 2
|
||||
usb1_to_output_fifo_level = Signal(range(usb1_to_output_fifo_depth + 1))
|
||||
print("usb1_to_output_fifo_depth in bits: " + str(usb1_to_output_fifo_level.width))
|
||||
usb1_fifo_level_feedback = Signal.like(usb1_to_output_fifo_level)
|
||||
m.d.comb += usb1_fifo_level_feedback.eq(usb1_to_output_fifo_level >> (usb1_to_output_fifo_level.width - 7))
|
||||
|
||||
usb2_to_usb1_fifo_depth = self.USB2_MAX_PACKET_SIZE // 2
|
||||
usb2_to_usb1_fifo_level = Signal(range(usb2_to_usb1_fifo_depth + 1))
|
||||
print("usb2_to_usb1_fifo_depth in bits: " + str(usb2_to_usb1_fifo_level.width))
|
||||
usb2_fifo_level_feedback = Signal.like(usb2_to_usb1_fifo_level)
|
||||
m.d.comb += usb2_fifo_level_feedback.eq(usb2_to_usb1_fifo_level >> (usb2_to_usb1_fifo_level.width - 4))
|
||||
|
||||
with m.If(adat_clock_tick):
|
||||
m.d.usb += [
|
||||
usb1_adat_clock_counter.eq(usb1_adat_clock_counter + 1),
|
||||
usb2_adat_clock_counter.eq(usb2_adat_clock_counter + 1),
|
||||
]
|
||||
|
||||
with m.If(usb1.sof_detected):
|
||||
m.d.usb += usb1_sof_counter.eq(usb1_sof_counter + 1)
|
||||
|
||||
with m.If(usb1_sof_counter == 0):
|
||||
# when feedbackValue == adat_clock_counter the
|
||||
# FIFO underflows slowly, but also when
|
||||
# feedbackValue == adat_clock_counter + 1
|
||||
# the FIFO slowly but surely fills to overflow.
|
||||
# since both of those feedback values are only one apart,
|
||||
# we need to start with the slowly overflowing value and
|
||||
# provide negative feedback proportional to the fill level
|
||||
# of the FIFO
|
||||
m.d.usb += [
|
||||
usb1_feedback_value.eq(usb1_adat_clock_counter + 1 - usb1_fifo_level_feedback),
|
||||
usb1_adat_clock_counter.eq(0),
|
||||
]
|
||||
|
||||
with m.If(usb2.sof_detected):
|
||||
m.d.usb += usb2_sof_counter.eq(usb2_sof_counter + 1)
|
||||
|
||||
with m.If(usb2_sof_counter == 0):
|
||||
m.d.usb += [
|
||||
usb2_feedback_value.eq(usb2_adat_clock_counter + 1 - usb2_fifo_level_feedback),
|
||||
usb2_adat_clock_counter.eq(0),
|
||||
]
|
||||
|
||||
|
||||
m.d.comb += [
|
||||
usb1_ep1_in.bytes_in_frame.eq(4),
|
||||
usb1_bit_pos.eq(usb1_ep1_in.address << 3),
|
||||
usb1_ep1_in.value.eq(0xff & (usb1_feedback_value >> usb1_bit_pos)),
|
||||
|
||||
usb2_ep1_in.bytes_in_frame.eq(4),
|
||||
usb2_bit_pos.eq(usb2_ep1_in.address << 3),
|
||||
usb2_ep1_in.value.eq(0xff & (usb2_feedback_value >> usb2_bit_pos)),
|
||||
]
|
||||
|
||||
return (usb1_sof_counter, usb1_to_output_fifo_level, usb1_to_output_fifo_depth, \
|
||||
usb2_sof_counter, usb2_to_usb1_fifo_level, usb2_to_usb1_fifo_depth)
|
||||
|
||||
|
||||
def wire_up_dac(self, m, usb_to_channel_stream, dac_extractor, dac, lrclk, dac_pads, convolver=None, enable_convolver=None):
|
||||
# wire up DAC extractor
|
||||
m.d.comb += [
|
||||
dac_extractor.channel_stream_in.valid.eq( usb_to_channel_stream.channel_stream_out.valid
|
||||
& usb_to_channel_stream.channel_stream_out.ready),
|
||||
dac_extractor.channel_stream_in.payload.eq(usb_to_channel_stream.channel_stream_out.payload),
|
||||
dac_extractor.channel_stream_in.channel_nr.eq(usb_to_channel_stream.channel_stream_out.channel_nr),
|
||||
]
|
||||
|
||||
if convolver:
|
||||
with m.If(enable_convolver):
|
||||
m.d.comb += [
|
||||
convolver.signal_in.stream_eq(dac_extractor.channel_stream_out),
|
||||
dac.stream_in.stream_eq(convolver.signal_out)
|
||||
]
|
||||
with m.Else():
|
||||
m.d.comb += dac.stream_in.stream_eq(dac_extractor.channel_stream_out)
|
||||
else:
|
||||
m.d.comb += dac.stream_in.stream_eq(dac_extractor.channel_stream_out)
|
||||
|
||||
# wire up DAC/ADC
|
||||
m.d.comb += [
|
||||
# wire up DAC/ADC
|
||||
# in I2S, everything happens on the negedge
|
||||
# the easiest way to achieve this, is to invert
|
||||
# the clock signal
|
||||
dac_pads.sclk.eq(~ClockSignal("adat")),
|
||||
dac_pads.bclk.eq(~ClockSignal("dac")),
|
||||
dac_pads.lrclk.eq(~lrclk),
|
||||
dac_pads.data.eq(dac.serial_data_out),
|
||||
dac.enable_in.eq(1),
|
||||
|
||||
# wire up I2S transmitter
|
||||
dac.word_select_in.eq(~lrclk),
|
||||
dac.serial_clock_in.eq(~ClockSignal("dac")),
|
||||
]
|
||||
|
||||
if __name__ == "__main__":
|
||||
os.environ["AMARANTH_verbose"] = "True"
|
||||
#os.environ["LUNA_PLATFORM"] = "platforms:ADATFaceCycloneIV"
|
||||
#os.environ["LUNA_PLATFORM"] = "platforms:ADATFaceCycloneV"
|
||||
#os.environ["LUNA_PLATFORM"] = "platforms:ADATFaceCyclone10"
|
||||
#os.environ["LUNA_PLATFORM"] = "platforms:ADATFaceArtix7"
|
||||
|
||||
# ECP5 platform
|
||||
os.environ["AMARANTH_synth_opts"] = "-abc9"
|
||||
os.environ["AMARANTH_nextpnr_opts"] = "--timing-allow-fail"
|
||||
os.environ["LUNA_PLATFORM"] = "platforms:ADATFaceColorlight"
|
||||
|
||||
top_level_cli(USB2AudioInterface)
|
||||
96
gateware/adatface_rev0_baseboard.py
Normal file
96
gateware/adatface_rev0_baseboard.py
Normal file
@@ -0,0 +1,96 @@
|
||||
from amaranth.build import *
|
||||
from amaranth_boards.resources import *
|
||||
|
||||
class ADATFaceRev0Baseboard:
|
||||
@staticmethod
|
||||
def resources(attrs, colorlight=False):
|
||||
return [
|
||||
# LEDS
|
||||
Resource("leds", 0,
|
||||
Subsignal("host", Pins ("J_3:60", dir="o")),
|
||||
Subsignal("usb1", Pins ("J_3:57", dir="o")),
|
||||
Subsignal("usb2", Pins ("J_3:58", dir="o")),
|
||||
Subsignal("sync1", Pins ("J_3:55", dir="o")),
|
||||
Subsignal("sync2", Pins ("J_3:56", dir="o")),
|
||||
Subsignal("sync3", Pins ("J_3:53", dir="o")),
|
||||
Subsignal("sync4", Pins ("J_3:54", dir="o")),
|
||||
Subsignal("active1", Pins ("J_3:51", dir="o")),
|
||||
Subsignal("active2", Pins ("J_3:49", dir="o")),
|
||||
Subsignal("suspended1", Pins ("J_3:52", dir="o")),
|
||||
Subsignal("suspended2", Pins ("J_3:50", dir="o")),
|
||||
attrs),
|
||||
|
||||
|
||||
# USB
|
||||
ULPIResource("ulpi", 1,
|
||||
data="J_3:37 J_3:38 J_3:39 J_3:40 J_3:41 J_3:42 J_3:43 J_3:44",
|
||||
clk="J_3:27", clk_dir="o", # this needs to be a clock pin of the FPGA or the core won't work
|
||||
dir="J_3:31", nxt="J_3:33", stp="J_3:29", rst="J_3:34", rst_invert=True, # USB3320 reset is active low
|
||||
attrs=attrs),
|
||||
|
||||
Resource("usb_aux", 1,
|
||||
Subsignal("vbus", Pins("J_3:30", dir="i")),
|
||||
Subsignal("id", Pins("J_3:32", dir="o")),
|
||||
Subsignal("sbu1", Pins("J_3:45", dir="i")),
|
||||
Subsignal("sbu2", Pins("J_3:46", dir="i")),
|
||||
attrs),
|
||||
|
||||
ULPIResource("ulpi", 2,
|
||||
data="J_3:17 J_3:18 J_3:19 J_3:20 J_3:21 J_3:22 J_3:23 J_3:24",
|
||||
clk="J_3:7", clk_dir="o", # this needs to be a clock pin of the FPGA or the core won't work
|
||||
dir="J_3:11", nxt="J_3:13", stp="J_3:9", rst="J_3:14", rst_invert=True, # USB3320 reset is active low
|
||||
attrs=attrs),
|
||||
|
||||
Resource("usb_aux", 2,
|
||||
Subsignal("vbus", Pins("J_3:10", dir="i")),
|
||||
Subsignal("id", Pins("J_3:12", dir="o")),
|
||||
Subsignal("sbu1", Pins("J_3:25", dir="i")),
|
||||
Subsignal("sbu2", Pins("J_3:26", dir="i")),
|
||||
attrs),
|
||||
|
||||
Resource("i2s", 1,
|
||||
Subsignal("sclk", Pins("J_2:53", dir="o")),
|
||||
Subsignal("bclk", Pins("J_2:54", dir="o")),
|
||||
Subsignal("data", Pins("J_2:55", dir="o")),
|
||||
Subsignal("lrclk", Pins("J_2:56", dir="o")),
|
||||
attrs),
|
||||
|
||||
Resource("i2s", 2,
|
||||
Subsignal("sclk", Pins("J_2:57", dir="o")),
|
||||
Subsignal("bclk", Pins("J_2:58", dir="o")),
|
||||
Subsignal("data", Pins("J_2:50", dir="o") if colorlight else Pins("J_2:59", dir="o")),
|
||||
Subsignal("lrclk", Pins("J_2:52", dir="o") if colorlight else Pins("J_2:60", dir="o")),
|
||||
attrs),
|
||||
|
||||
|
||||
# TOSLINK
|
||||
Resource("toslink", 1,
|
||||
Subsignal("tx", Pins("J_2:49", dir="o")),
|
||||
Subsignal("rx", Pins("J_2:51", dir="i")),
|
||||
attrs),
|
||||
|
||||
Resource("toslink", 2,
|
||||
Subsignal("tx", Pins("J_2:33", dir="o")),
|
||||
Subsignal("rx", Pins("J_2:35", dir="i")),
|
||||
attrs),
|
||||
|
||||
Resource("toslink", 3,
|
||||
Subsignal("tx", Pins("J_2:23", dir="o")),
|
||||
Subsignal("rx", Pins("J_2:25", dir="i")),
|
||||
attrs),
|
||||
|
||||
Resource("toslink", 4,
|
||||
Subsignal("tx", Pins("J_2:18", dir="o") if colorlight else Pins("J_2:7", dir="o")),
|
||||
Subsignal("rx", Pins("J_2:9", dir="i")),
|
||||
attrs),
|
||||
|
||||
|
||||
# Debug
|
||||
SPIResource(0, clk="J_2:12", copi="J_2:8", cipo=None, cs_n="J_2:10", attrs=attrs),
|
||||
#UARTResource(0, tx="J_2:14", rx="J_2:16", attrs=attrs),
|
||||
|
||||
Resource("debug", 0, Pins("J_2:44", dir="o")),
|
||||
Resource("debug", 1, Pins("J_2:46", dir="o")),
|
||||
Resource("debug", 2, Pins("J_2:48", dir="o")),
|
||||
Resource("debug", 3, Pins("J_2:42", dir="o")),
|
||||
]
|
||||
3
gateware/attic/README.txt
Normal file
3
gateware/attic/README.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
This directory contains platform files which are not maintained
|
||||
anymore, but still can serve as examples on how to run on
|
||||
other boards.
|
||||
216
gateware/attic/de0nanoplatform.py
Normal file
216
gateware/attic/de0nanoplatform.py
Normal file
@@ -0,0 +1,216 @@
|
||||
#
|
||||
# This file is part of LUNA.
|
||||
#
|
||||
# Copyright (c) 2020 Great Scott Gadgets <info@greatscottgadgets.com>
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
"""
|
||||
The DE0 Nano does not have an explicit USB port. Instead, you'll need to connect an external ULPI PHY breakout,
|
||||
such as https://www.waveshare.com/wiki/USB3300_USB_HS_Board.
|
||||
|
||||
See the pin definitions below for connection information (ULPIResource).
|
||||
|
||||
The DE0 Nano is an -unsupported- platform! To use it, you'll need to set your LUNA_PLATFORM variable:
|
||||
> export LUNA_PLATFORM="luna.gateware.platform.de0_nano:DE0NanoPlatform"
|
||||
"""
|
||||
|
||||
import os
|
||||
import logging
|
||||
import subprocess
|
||||
|
||||
from amaranth import *
|
||||
from amaranth.build import *
|
||||
from amaranth.vendor.intel import IntelPlatform
|
||||
|
||||
from amaranth_boards.resources import *
|
||||
|
||||
from luna.gateware.platform.core import LUNAPlatform
|
||||
|
||||
__all__ = ["DE0NanoPlatform"]
|
||||
|
||||
|
||||
class DE0NanoClockAndResetController(Elaboratable):
|
||||
""" Controller for de0_nano's clocking and global resets. """
|
||||
def __init__(self, *, clock_frequencies=None, clock_signal_name=None):
|
||||
pass
|
||||
|
||||
def elaborate(self, platform):
|
||||
m = Module()
|
||||
|
||||
# Create our domains; but don't do anything else for them, for now.
|
||||
m.domains.sync = ClockDomain()
|
||||
m.domains.usb = ClockDomain()
|
||||
m.domains.jt51 = ClockDomain()
|
||||
m.domains.adat = ClockDomain()
|
||||
|
||||
m.submodules.mainpll = Instance("ALTPLL",
|
||||
p_BANDWIDTH_TYPE = "AUTO",
|
||||
p_CLK0_DIVIDE_BY = 1,
|
||||
p_CLK0_DUTY_CYCLE = 50,
|
||||
p_CLK0_MULTIPLY_BY = 1,
|
||||
p_CLK0_PHASE_SHIFT = 0,
|
||||
p_INCLK0_INPUT_FREQUENCY = 16666,
|
||||
p_OPERATION_MODE = "NORMAL",
|
||||
|
||||
# Drive our clock from the USB clock
|
||||
# coming from the USB clock pin of the USB3300
|
||||
i_inclk = ClockSignal("usb"),
|
||||
o_clk = ClockSignal("sync"),
|
||||
)
|
||||
|
||||
m.submodules.jt51pll = Instance("ALTPLL",
|
||||
p_BANDWIDTH_TYPE = "AUTO",
|
||||
p_CLK0_DIVIDE_BY = 218,
|
||||
p_CLK0_DUTY_CYCLE = 50,
|
||||
p_CLK0_MULTIPLY_BY = 13,
|
||||
p_CLK0_PHASE_SHIFT = 0,
|
||||
p_INCLK0_INPUT_FREQUENCY = 16666,
|
||||
p_OPERATION_MODE = "NORMAL",
|
||||
|
||||
# Drive our clock from the USB clock
|
||||
# coming from the USB clock pin of the USB3300
|
||||
i_inclk = ClockSignal("usb"),
|
||||
o_clk = ClockSignal("jt51"),
|
||||
)
|
||||
|
||||
m.submodules.adatpll = Instance("ALTPLL",
|
||||
p_BANDWIDTH_TYPE = "AUTO",
|
||||
p_CLK0_DIVIDE_BY = 83,
|
||||
p_CLK0_DUTY_CYCLE = 50,
|
||||
p_CLK0_MULTIPLY_BY = 17,
|
||||
p_CLK0_PHASE_SHIFT = 0,
|
||||
p_INCLK0_INPUT_FREQUENCY = 16666,
|
||||
p_OPERATION_MODE = "NORMAL",
|
||||
|
||||
# Drive our clock from the USB clock
|
||||
# coming from the USB clock pin of the USB3300
|
||||
i_inclk = ClockSignal("usb"),
|
||||
o_clk = ClockSignal("adat"),
|
||||
)
|
||||
|
||||
# Use a blinky to see if the clock signal works
|
||||
# from amaranth_boards.test.blinky import Blinky
|
||||
# m.submodules += Blinky()
|
||||
|
||||
return m
|
||||
|
||||
class DE0NanoPlatform(IntelPlatform, LUNAPlatform):
|
||||
""" This is a de0_nano board with an USB3300 PHY attached to JP_2 """
|
||||
|
||||
name = "de0_nano"
|
||||
device = "EP4CE22"
|
||||
package = "F17"
|
||||
speed = "C6"
|
||||
|
||||
default_clk = "clk_50MHz"
|
||||
clock_domain_generator = DE0NanoClockAndResetController
|
||||
default_usb_connection = "ulpi"
|
||||
ignore_phy_vbus = True
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
logging.warning("This platform is not officially supported, and thus not tested. Your results may vary.")
|
||||
logging.warning("Note also that this platform does not use the DE0 nano's main USB port!")
|
||||
logging.warning("You'll need to connect a ULPI PHY breakout. See the platform file for more info.")
|
||||
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
#
|
||||
# I/O resources.
|
||||
#
|
||||
resources = [
|
||||
# Primary clock generator clocks.
|
||||
Resource("clk_50MHz", 0, Pins("R8", dir="i"), Clock(50e6), Attrs(io_standard="3.3-V LVTTL")),
|
||||
|
||||
# USB2 / ULPI section of the USB3300.
|
||||
ULPIResource("ulpi", 0,
|
||||
data="JP_2:27 JP_2:25 JP_2:23 JP_2:21 JP_2:19 JP_2:17 JP_2:15 JP_2:13",
|
||||
clk="JP_2:1", # this needs to be a clock pin of the FPGA or the core won't work
|
||||
dir="JP_2:18", nxt="JP_2:16", stp="JP_2:14", rst="JP_2:22",
|
||||
attrs=Attrs(io_standard="3.3-V LVCMOS")
|
||||
),
|
||||
|
||||
UARTResource(0,
|
||||
# GND on JP1 Pin 12.
|
||||
rx="JP_1:8", tx="JP_1:10",
|
||||
attrs=Attrs(io_standard="3.3-V LVTTL")),
|
||||
|
||||
*LEDResources(
|
||||
pins="A15 A13 B13 A11 D1 F3 B1 L3",
|
||||
attrs=Attrs(io_standard="3.3-V LVTTL")),
|
||||
|
||||
*ButtonResources(
|
||||
pins="J15 E1", invert=True,
|
||||
attrs=Attrs(io_standard="3.3-V LVTTL")),
|
||||
|
||||
*SwitchResources(
|
||||
pins="M1 T8 B9 M15",
|
||||
attrs=Attrs(io_standard="3.3-V LVTTL")),
|
||||
|
||||
SDRAMResource(0,
|
||||
clk="R4", cke="L7", cs_n="P6", we_n="C2", ras_n="L2", cas_n="L1",
|
||||
ba="M7 M6", a="P2 N5 N6 M8 P8 T7 N8 T6 R1 P1 N2 N1 L4",
|
||||
dq="G2 G1 L8 K5 K2 J2 J1 R7 T4 T2 T3 R3 R5 P3 N3 K1", dqm="R6 T5",
|
||||
attrs=Attrs(io_standard="3.3-V LVTTL")),
|
||||
|
||||
# Accelerometer
|
||||
Resource("acc", 0,
|
||||
Subsignal("cs_n", Pins("G5", dir="o")),
|
||||
Subsignal("int", Pins("M2", dir="i")),
|
||||
Attrs(io_standard="3.3-V LVTTL")),
|
||||
# I2C is part of the Accelerometer
|
||||
I2CResource(0,
|
||||
scl="F2", sda="F1",
|
||||
attrs=Attrs(io_standard="3.3-V LVTTL")),
|
||||
|
||||
# ADC
|
||||
Resource("adc", 0,
|
||||
Subsignal("cs_n", Pins("A10")),
|
||||
Subsignal("saddr", Pins("B10")),
|
||||
Subsignal("sclk", Pins("B14")),
|
||||
Subsignal("sdat", Pins("A9")),
|
||||
Attrs(io_standard="3.3-V LVTTL")),
|
||||
|
||||
# ECPS
|
||||
Resource("epcs", 0,
|
||||
Subsignal("data0", Pins("H2")),
|
||||
Subsignal("dclk", Pins("H1")),
|
||||
Subsignal("ncs0", Pins("D2")),
|
||||
Subsignal("asd0", Pins("C1")),
|
||||
Attrs(io_standard="3.3-V LVTTL")),
|
||||
|
||||
Resource("adat", 0,
|
||||
Subsignal("tx", Pins("JP_3:5", dir="o")),
|
||||
Subsignal("rx", Pins("JP_3:6", dir="i")),
|
||||
Attrs(io_standard="3.3-V LVTTL")),
|
||||
]
|
||||
|
||||
connectors = [
|
||||
# PIN 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
||||
Connector("JP", 1, "A8 D3 B8 C3 A2 A3 B3 B4 A4 B5 - - A5 D5 B6 A6 B7 D6 A7 C6 C8 E6 E7 D8 E8 F8 F9 E9 - - C9 D9 E11 E10 C11 B11 A12 D11 D12 B12"),
|
||||
Connector("JP", 2, "T9 F13 R9 T15 T14 T13 R13 T12 R12 T11 - - T10 R11 P11 R10 N12 P9 N9 N11 L16 K16 R16 L15 P15 P16 R14 N16 - - N15 P14 L14 N14 M10 L13 J16 K15 J13 J14"),
|
||||
Connector("JP", 3, "- E15 E16 M16 A14 B16 C14 C16 C15 D16 D15 D14 F15 F16 F14 G16 G15 - - - - - - - - -")
|
||||
]
|
||||
|
||||
@property
|
||||
def file_templates(self):
|
||||
templates = super().file_templates
|
||||
templates["{{name}}.qsf"] += r"""
|
||||
set_global_assignment -name OPTIMIZATION_MODE "Aggressive Performance"
|
||||
set_global_assignment -name FITTER_EFFORT "Standard Fit"
|
||||
set_global_assignment -name PHYSICAL_SYNTHESIS_EFFORT "Extra"
|
||||
set_instance_assignment -name DECREASE_INPUT_DELAY_TO_INPUT_REGISTER OFF -to *ulpi*
|
||||
set_instance_assignment -name INCREASE_DELAY_TO_OUTPUT_PIN OFF -to *ulpi*
|
||||
set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL
|
||||
"""
|
||||
templates["{{name}}.sdc"] += r"""
|
||||
create_clock -name "clk_60MHz" -period 16.667 [get_ports "ulpi_0__clk__io"]
|
||||
"""
|
||||
return templates
|
||||
|
||||
|
||||
def toolchain_program(self, products, name):
|
||||
""" Programs the attached de0_nano board via a Quartus programming cable. """
|
||||
|
||||
quartus_pgm = os.environ.get("QUARTUS_PGM", "quartus_pgm")
|
||||
with products.extract("{}.sof".format(name)) as bitstream_filename:
|
||||
subprocess.check_call([quartus_pgm, "--haltcc", "--mode", "JTAG",
|
||||
"--operation", "P;" + bitstream_filename])
|
||||
56
gateware/attic/tinybx_luna.py
Normal file
56
gateware/attic/tinybx_luna.py
Normal file
@@ -0,0 +1,56 @@
|
||||
"""
|
||||
use the LUNA usb config for the tinyFPGA-Bx
|
||||
add some pins (at random) for adat and debug
|
||||
create an audio clock domain
|
||||
|
||||
Issues:
|
||||
The audio clock is just a carbon copy of usb 12MHz because the Bx only has one PLL.
|
||||
|
||||
"""
|
||||
|
||||
import os
|
||||
import logging
|
||||
import subprocess
|
||||
|
||||
from amaranth import *
|
||||
from amaranth.build import *
|
||||
from amaranth_boards.resources import *
|
||||
|
||||
from luna.gateware.platform.tinyfpga import TinyFPGABxPlatform, TinyFPGABxDomainGenerator
|
||||
|
||||
|
||||
class TinyBxAdatDomainGenerator(Elaboratable):
|
||||
""" Creates audio clock domains on top of the LUNA domains for the TinyFPGA Bx. """
|
||||
|
||||
def elaborate(self, platform):
|
||||
m = TinyFPGABxDomainGenerator.elaborate(self, platform)
|
||||
|
||||
# Create our domains...
|
||||
m.domains.adat = ClockDomain()
|
||||
m.d.comb += [
|
||||
ClockSignal("adat").eq(ClockSignal("usb")),
|
||||
ResetSignal("adat").eq(ResetSignal("usb")),
|
||||
]
|
||||
|
||||
return m
|
||||
|
||||
|
||||
class TinyBxAdatPlatform(TinyFPGABxPlatform):
|
||||
clock_domain_generator = TinyBxAdatDomainGenerator
|
||||
number_of_channels = 4
|
||||
bitwidth = 24
|
||||
|
||||
def __init__(self):
|
||||
self.resources += [
|
||||
Resource("adat", 0,
|
||||
Subsignal("tx", Pins("A2", dir="o")),
|
||||
Subsignal("rx", Pins("A1", dir="i")),
|
||||
Attrs(IO_STANDARD="SB_LVCMOS")),
|
||||
|
||||
Resource("debug_led", 0, Pins("C9 A9 B8 A8 B7 A7 B6 A6", dir="o"),
|
||||
Attrs(IO_STANDARD="SB_LVCMOS")),
|
||||
]
|
||||
super().__init__(toolchain="IceStorm")
|
||||
|
||||
|
||||
|
||||
56
gateware/bundle_demultiplexer-bench.gtkw
Normal file
56
gateware/bundle_demultiplexer-bench.gtkw
Normal file
@@ -0,0 +1,56 @@
|
||||
[*]
|
||||
[*] GTKWave Analyzer v3.4.0 (w)1999-2022 BSI
|
||||
[*] Mon Dec 13 23:39:41 2021
|
||||
[*]
|
||||
[dumpfile] "test_BundleDemultiplexerTest_test_smoke.vcd"
|
||||
[dumpfile_mtime] "Mon Dec 13 23:35:48 2021"
|
||||
[dumpfile_size] 8023
|
||||
[savefile] "gateware/bundle_demultiplexer-bench.gtkw"
|
||||
[timestart] 0
|
||||
[size] 3828 2090
|
||||
[pos] -1 -1
|
||||
*-15.000000 384000 384000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
|
||||
[treeopen] top.
|
||||
[sst_width] 65
|
||||
[signals_width] 510
|
||||
[sst_expanded] 0
|
||||
[sst_vpaned_height] 658
|
||||
@28
|
||||
top.clk
|
||||
top.channel_stream__ready
|
||||
top.channel_stream__valid
|
||||
@22
|
||||
top.channel_stream__channel_nr[4:0]
|
||||
top.channel_stream__payload[23:0]
|
||||
@200
|
||||
-Multiplexer
|
||||
@22
|
||||
top.bundle_nr[1:0]
|
||||
top.channel_nr[2:0]
|
||||
@200
|
||||
-Output
|
||||
@28
|
||||
top.ready
|
||||
@22
|
||||
top.output_bundle_0__valid
|
||||
top.output_bundle_0__channel_nr[2:0]
|
||||
top.output_bundle_0__payload[23:0]
|
||||
top.output_bundle_0__first
|
||||
top.output_bundle_0__last
|
||||
top.output_bundle_1__valid
|
||||
top.output_bundle_1__channel_nr[2:0]
|
||||
top.output_bundle_1__payload[23:0]
|
||||
top.output_bundle_1__first
|
||||
top.output_bundle_1__last
|
||||
top.output_bundle_2__valid
|
||||
top.output_bundle_2__channel_nr[2:0]
|
||||
top.output_bundle_2__payload[23:0]
|
||||
top.output_bundle_2__first
|
||||
top.output_bundle_2__last
|
||||
top.output_bundle_3__valid
|
||||
top.output_bundle_3__channel_nr[2:0]
|
||||
top.output_bundle_3__payload[23:0]
|
||||
top.output_bundle_3__first
|
||||
top.output_bundle_3__last
|
||||
[pattern_trace] 1
|
||||
[pattern_trace] 0
|
||||
95
gateware/bundle_demultiplexer.py
Normal file
95
gateware/bundle_demultiplexer.py
Normal file
@@ -0,0 +1,95 @@
|
||||
import operator
|
||||
from functools import reduce
|
||||
|
||||
from amaranth import *
|
||||
from amaranth.build import Platform
|
||||
from amlib.stream import StreamInterface
|
||||
from amlib.test import GatewareTestCase, sync_test_case
|
||||
|
||||
class BundleDemultiplexer(Elaboratable):
|
||||
NO_CHANNELS_ADAT = 8
|
||||
SAMPLE_WIDTH = 24
|
||||
|
||||
def __init__(self, no_bundles=4):
|
||||
# parameters
|
||||
self._no_bundles = no_bundles
|
||||
self._channel_bits = Shape.cast(range(no_bundles * self.NO_CHANNELS_ADAT)).width
|
||||
self._bundle_channel_bits = Shape.cast(range(self.NO_CHANNELS_ADAT)).width
|
||||
|
||||
# ports
|
||||
self.no_channels_in = Signal(range(32 + 1))
|
||||
|
||||
self.channel_stream_in = StreamInterface(name="channel_stream",
|
||||
payload_width=self.SAMPLE_WIDTH,
|
||||
extra_fields=[("channel_nr", self._channel_bits)])
|
||||
|
||||
self.bundles_out = Array(StreamInterface(name=f"output_bundle_{i}",
|
||||
payload_width=self.SAMPLE_WIDTH,
|
||||
extra_fields=[("channel_nr", self._bundle_channel_bits)])
|
||||
for i in range(no_bundles))
|
||||
|
||||
# debug signals
|
||||
self.bundle_nr = Signal(range(self._no_bundles))
|
||||
|
||||
def elaborate(self, platform: Platform) -> Module:
|
||||
m = Module()
|
||||
|
||||
# this is necessary to keep the simulator happy
|
||||
keep_sync = Signal()
|
||||
m.d.sync += keep_sync.eq(1)
|
||||
|
||||
channel_stream = self.channel_stream_in
|
||||
bundle_ready = Signal()
|
||||
bundle_nr = Signal(range(self._no_bundles))
|
||||
channel_nr = Signal(range(self.NO_CHANNELS_ADAT))
|
||||
|
||||
last_channel = Signal(3)
|
||||
channel_mask = last_channel
|
||||
|
||||
m.d.comb += [
|
||||
bundle_nr .eq(channel_stream.channel_nr >> channel_nr.width),
|
||||
self.bundle_nr .eq(bundle_nr),
|
||||
channel_nr .eq(channel_stream.channel_nr & channel_mask),
|
||||
last_channel .eq(Mux(self.no_channels_in == 2, 1, 7)),
|
||||
|
||||
bundle_ready .eq(self.bundles_out[bundle_nr].ready),
|
||||
channel_stream.ready .eq(bundle_ready),
|
||||
]
|
||||
|
||||
with m.If(bundle_ready & channel_stream.valid):
|
||||
m.d.comb += [
|
||||
self.bundles_out[bundle_nr].valid.eq(1),
|
||||
self.bundles_out[bundle_nr].payload.eq(channel_stream.payload),
|
||||
self.bundles_out[bundle_nr].channel_nr.eq(channel_nr),
|
||||
self.bundles_out[bundle_nr].first.eq(channel_nr == 0),
|
||||
self.bundles_out[bundle_nr].last.eq(channel_nr == last_channel),
|
||||
]
|
||||
|
||||
return m
|
||||
|
||||
class BundleDemultiplexerTest(GatewareTestCase):
|
||||
FRAGMENT_UNDER_TEST = BundleDemultiplexer
|
||||
FRAGMENT_ARGUMENTS = dict()
|
||||
|
||||
def send_one_frame(self, sample: int, channel: int, wait=True):
|
||||
yield self.dut.channel_stream_in.channel_nr.eq(channel)
|
||||
yield self.dut.channel_stream_in.payload.eq(sample)
|
||||
yield self.dut.channel_stream_in.valid.eq(1)
|
||||
yield
|
||||
yield self.dut.channel_stream_in.valid.eq(0)
|
||||
if wait:
|
||||
yield
|
||||
|
||||
@sync_test_case
|
||||
def test_smoke(self):
|
||||
dut = self.dut
|
||||
for bundle in range(4):
|
||||
yield dut.bundles_out[bundle].ready.eq(1)
|
||||
yield
|
||||
yield
|
||||
for sample in range(3):
|
||||
for ch in range(4*BundleDemultiplexer.NO_CHANNELS_ADAT):
|
||||
yield from self.send_one_frame((sample << 8) | ch, ch, wait=False)
|
||||
|
||||
yield
|
||||
yield
|
||||
88
gateware/bundle_multiplexer-bench-inactive.gtkw
Normal file
88
gateware/bundle_multiplexer-bench-inactive.gtkw
Normal file
@@ -0,0 +1,88 @@
|
||||
[*]
|
||||
[*] GTKWave Analyzer v3.4.0 (w)1999-2022 BSI
|
||||
[*] Tue Dec 14 22:59:41 2021
|
||||
[*]
|
||||
[dumpfile] "test_BundleMultiplexerTest_test_inactive_bundle.vcd"
|
||||
[dumpfile_mtime] "Tue Dec 14 22:35:59 2021"
|
||||
[dumpfile_size] 17202
|
||||
[savefile] "gateware/bundle_multiplexer-bench.gtkw"
|
||||
[timestart] 0
|
||||
[size] 3828 2090
|
||||
[pos] -1921 27
|
||||
*-15.418433 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
|
||||
[treeopen] top.
|
||||
[sst_width] 562
|
||||
[signals_width] 606
|
||||
[sst_expanded] 1
|
||||
[sst_vpaned_height] 658
|
||||
@28
|
||||
bench.top.clk
|
||||
@200
|
||||
-Inputs
|
||||
@22
|
||||
bench.top.no_channels0[3:0]
|
||||
bench.top.no_channels1[3:0]
|
||||
bench.top.no_channels2[3:0]
|
||||
bench.top.no_channels3[3:0]
|
||||
bench.top.input_bundle0__channel_nr[2:0]
|
||||
bench.top.input_bundle0__last
|
||||
bench.top.input_bundle0__payload[23:0]
|
||||
bench.top.input_bundle0__valid
|
||||
bench.top.input_bundle1__channel_nr[2:0]
|
||||
bench.top.input_bundle1__last
|
||||
bench.top.input_bundle1__payload[23:0]
|
||||
bench.top.input_bundle1__valid
|
||||
bench.top.input_bundle2__channel_nr[2:0]
|
||||
bench.top.input_bundle2__last
|
||||
bench.top.input_bundle2__payload[23:0]
|
||||
bench.top.input_bundle2__valid
|
||||
bench.top.input_bundle3__channel_nr[2:0]
|
||||
bench.top.input_bundle3__last
|
||||
bench.top.input_bundle3__payload[23:0]
|
||||
bench.top.input_bundle3__valid
|
||||
@200
|
||||
-Module
|
||||
@22
|
||||
bench.top.current_bundle[1:0]
|
||||
bench.top.current_channel[4:0]
|
||||
@29
|
||||
bench.top.bundle0_active
|
||||
bench.top.bundle1_active
|
||||
bench.top.bundle2_active
|
||||
bench.top.bundle3_active
|
||||
@22
|
||||
bench.top.first_bundle_channel[4:0]
|
||||
bench.top.bundle0_channel[2:0]
|
||||
bench.top.bundle0_last
|
||||
bench.top.bundle0_read_en
|
||||
bench.top.bundle0_ready
|
||||
bench.top.bundle0_sample[23:0]
|
||||
bench.top.bundle1_channel[2:0]
|
||||
bench.top.bundle1_last
|
||||
bench.top.bundle1_read_en
|
||||
bench.top.bundle1_ready
|
||||
bench.top.bundle1_sample[23:0]
|
||||
bench.top.bundle2_channel[2:0]
|
||||
bench.top.bundle2_last
|
||||
bench.top.bundle2_read_en
|
||||
bench.top.bundle2_ready
|
||||
bench.top.bundle2_sample[23:0]
|
||||
bench.top.bundle3_channel[2:0]
|
||||
bench.top.bundle3_last
|
||||
bench.top.bundle3_read_en
|
||||
bench.top.bundle3_ready
|
||||
bench.top.bundle3_sample[23:0]
|
||||
@200
|
||||
-Output
|
||||
@28
|
||||
bench.top.channel_stream__first
|
||||
bench.top.channel_stream__last
|
||||
@23
|
||||
bench.top.channel_stream__channel_nr[4:0]
|
||||
@22
|
||||
bench.top.channel_stream__payload[23:0]
|
||||
@28
|
||||
bench.top.channel_stream__ready
|
||||
bench.top.channel_stream__valid
|
||||
[pattern_trace] 1
|
||||
[pattern_trace] 0
|
||||
103
gateware/bundle_multiplexer-bench.gtkw
Normal file
103
gateware/bundle_multiplexer-bench.gtkw
Normal file
@@ -0,0 +1,103 @@
|
||||
[*]
|
||||
[*] GTKWave Analyzer v3.4.0 (w)1999-2022 BSI
|
||||
[*] Fri Dec 31 08:36:29 2021
|
||||
[*]
|
||||
[dumpfile] "test_BundleMultiplexerTest_test_all_sending.vcd"
|
||||
[dumpfile_mtime] "Fri Dec 31 08:35:29 2021"
|
||||
[dumpfile_size] 55739
|
||||
[savefile] "gateware/bundle_multiplexer-bench.gtkw"
|
||||
[timestart] 0
|
||||
[size] 3828 2090
|
||||
[pos] -1 -1
|
||||
*-15.418433 151500 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
|
||||
[treeopen] bench.
|
||||
[treeopen] bench.top.
|
||||
[sst_width] 562
|
||||
[signals_width] 606
|
||||
[sst_expanded] 1
|
||||
[sst_vpaned_height] 650
|
||||
@28
|
||||
bench.top.clk
|
||||
@200
|
||||
-Inputs
|
||||
@22
|
||||
bench.top.no_channels0[3:0]
|
||||
bench.top.no_channels1[3:0]
|
||||
bench.top.no_channels2[3:0]
|
||||
bench.top.no_channels3[3:0]
|
||||
bench.top.input_bundle0__channel_nr[2:0]
|
||||
@28
|
||||
bench.top.input_bundle0__valid
|
||||
@22
|
||||
bench.top.input_bundle1__channel_nr[2:0]
|
||||
bench.top.input_bundle1__valid
|
||||
bench.top.input_bundle2__channel_nr[2:0]
|
||||
bench.top.input_bundle2__valid
|
||||
bench.top.input_bundle3__channel_nr[2:0]
|
||||
bench.top.input_bundle3__valid
|
||||
@200
|
||||
-FIFOS
|
||||
@22
|
||||
bench.top.receive_fifo0.w_level[4:0]
|
||||
bench.top.receive_fifo1.w_level[4:0]
|
||||
bench.top.receive_fifo2.w_level[4:0]
|
||||
@23
|
||||
bench.top.receive_fifo3.w_level[4:0]
|
||||
@200
|
||||
-Module
|
||||
@22
|
||||
bench.top.current_bundle[1:0]
|
||||
bench.top.current_channel[4:0]
|
||||
@28
|
||||
bench.top.bundle0_active
|
||||
bench.top.bundle1_active
|
||||
bench.top.bundle2_active
|
||||
bench.top.bundle3_active
|
||||
@22
|
||||
bench.top.first_bundle_channel[4:0]
|
||||
@200
|
||||
-
|
||||
@22
|
||||
bench.top.bundle0_channel[2:0]
|
||||
bench.top.bundle0_last
|
||||
bench.top.bundle0_read_en
|
||||
bench.top.bundle0_ready
|
||||
bench.top.bundle0_sample[23:0]
|
||||
@200
|
||||
-
|
||||
@22
|
||||
bench.top.bundle1_channel[2:0]
|
||||
bench.top.bundle1_last
|
||||
bench.top.bundle1_read_en
|
||||
bench.top.bundle1_ready
|
||||
bench.top.bundle1_sample[23:0]
|
||||
@200
|
||||
-
|
||||
@22
|
||||
bench.top.bundle2_channel[2:0]
|
||||
bench.top.bundle2_last
|
||||
bench.top.bundle2_read_en
|
||||
bench.top.bundle2_ready
|
||||
bench.top.bundle2_sample[23:0]
|
||||
@200
|
||||
-
|
||||
@22
|
||||
bench.top.bundle3_channel[2:0]
|
||||
bench.top.bundle3_last
|
||||
bench.top.bundle3_read_en
|
||||
bench.top.bundle3_ready
|
||||
bench.top.bundle3_sample[23:0]
|
||||
@200
|
||||
-
|
||||
-Output
|
||||
@28
|
||||
bench.top.channel_stream__first
|
||||
bench.top.channel_stream__last
|
||||
@22
|
||||
bench.top.channel_stream__channel_nr[4:0]
|
||||
bench.top.channel_stream__payload[23:0]
|
||||
@28
|
||||
bench.top.channel_stream__ready
|
||||
bench.top.channel_stream__valid
|
||||
[pattern_trace] 1
|
||||
[pattern_trace] 0
|
||||
233
gateware/bundle_multiplexer.py
Normal file
233
gateware/bundle_multiplexer.py
Normal file
@@ -0,0 +1,233 @@
|
||||
from amaranth import *
|
||||
from amaranth.build import Platform
|
||||
from amaranth.lib.fifo import SyncFIFO
|
||||
|
||||
from amlib.stream import StreamInterface, connect_stream_to_fifo
|
||||
from amlib.test import GatewareTestCase, sync_test_case
|
||||
|
||||
class BundleMultiplexer(Elaboratable):
|
||||
NO_CHANNELS_ADAT = 8
|
||||
SAMPLE_WIDTH = 24
|
||||
FIFO_DEPTH = 32 * NO_CHANNELS_ADAT
|
||||
|
||||
def __init__(self, no_bundles=4):
|
||||
# parameters
|
||||
self._no_bundles = no_bundles
|
||||
self._channel_bits = Shape.cast(range(no_bundles * self.NO_CHANNELS_ADAT)).width
|
||||
self._bundle_channel_bits = Shape.cast(range(self.NO_CHANNELS_ADAT)).width
|
||||
|
||||
# ports
|
||||
self.channel_stream_out = StreamInterface(name="channel_stream",
|
||||
payload_width=self.SAMPLE_WIDTH,
|
||||
extra_fields=[("channel_nr", self._channel_bits)])
|
||||
|
||||
self.bundles_in = Array(StreamInterface(name=f"input_bundle{i}",
|
||||
payload_width=self.SAMPLE_WIDTH,
|
||||
extra_fields=[("channel_nr", self._bundle_channel_bits)])
|
||||
for i in range(no_bundles))
|
||||
|
||||
self.bundle_active_in = Array(Signal(name=f"bundle{i}_active") for i in range(no_bundles))
|
||||
|
||||
self.no_channels_in = Array(Signal(self._bundle_channel_bits + 1, name=f"no_channels{i}") for i in range(no_bundles))
|
||||
|
||||
# debug ports
|
||||
self.current_bundle = Signal(range(no_bundles))
|
||||
self.last_bundle = Signal()
|
||||
self.levels = Array(Signal(5, name=f"rx{i}_fifo_level") for i in range(1,5))
|
||||
|
||||
def elaborate(self, platform: Platform) -> Module:
|
||||
m = Module()
|
||||
sample_width = self.SAMPLE_WIDTH
|
||||
bundle_bits = self._bundle_channel_bits
|
||||
|
||||
bundle_ready = Array(Signal( name=f"bundle{i}_ready") for i in range(self._no_bundles))
|
||||
bundle_sample = Array(Signal(sample_width, name=f"bundle{i}_sample") for i in range(self._no_bundles))
|
||||
bundle_channel = Array(Signal(bundle_bits, name=f"bundle{i}_channel") for i in range(self._no_bundles))
|
||||
last = Array(Signal( name=f"bundle{i}_last") for i in range(self._no_bundles))
|
||||
read_enable = Array(Signal( name=f"bundle{i}_read_en") for i in range(self._no_bundles))
|
||||
|
||||
for i in range(self._no_bundles):
|
||||
fifo = SyncFIFO(width=sample_width + bundle_bits + 1, depth=self.FIFO_DEPTH)
|
||||
setattr(m.submodules, f"receive_fifo{i}", fifo)
|
||||
|
||||
m.d.comb += [
|
||||
*connect_stream_to_fifo(self.bundles_in[i], fifo),
|
||||
fifo.w_data[sample_width:].eq(self.bundles_in[i].channel_nr),
|
||||
fifo.w_data[-1].eq(self.bundles_in[i].last),
|
||||
|
||||
bundle_ready[i] .eq(fifo.r_rdy),
|
||||
bundle_sample[i] .eq(fifo.r_data[:sample_width]),
|
||||
bundle_channel[i] .eq(fifo.r_data[sample_width:sample_width + bundle_bits]),
|
||||
self.levels[i] .eq(fifo.r_level),
|
||||
|
||||
last[i].eq(fifo.r_data[-1]),
|
||||
fifo.r_en.eq(read_enable[i]),
|
||||
]
|
||||
|
||||
current_bundle = Signal(range(self._no_bundles))
|
||||
first_bundle_channel = Signal(self._channel_bits)
|
||||
current_channel = Signal(self._channel_bits)
|
||||
last_bundle = Signal(self._bundle_channel_bits)
|
||||
|
||||
m.d.comb += last_bundle.eq(current_bundle == (self._no_bundles - 1))
|
||||
m.d.comb += [
|
||||
self.current_bundle.eq(current_bundle),
|
||||
self.last_bundle.eq(last_bundle),
|
||||
]
|
||||
|
||||
def handle_last_channel():
|
||||
with m.If(last_bundle):
|
||||
m.d.comb += self.channel_stream_out.last.eq(1)
|
||||
m.d.sync += [
|
||||
current_bundle.eq(0),
|
||||
first_bundle_channel.eq(0),
|
||||
]
|
||||
with m.Else():
|
||||
m.d.sync += [
|
||||
current_bundle.eq(current_bundle + 1),
|
||||
first_bundle_channel.eq(first_bundle_channel + self.no_channels_in[current_bundle])
|
||||
]
|
||||
|
||||
with m.If(self.channel_stream_out.ready):
|
||||
# bundle is active (ie. ADAT cable plugged in and synced)
|
||||
with m.If(self.bundle_active_in[current_bundle]):
|
||||
with m.If(bundle_ready[current_bundle]):
|
||||
m.d.comb += [
|
||||
self.channel_stream_out.payload.eq(bundle_sample[current_bundle]),
|
||||
self.channel_stream_out.channel_nr.eq(first_bundle_channel + bundle_channel[current_bundle]),
|
||||
read_enable[current_bundle].eq(1),
|
||||
self.channel_stream_out.valid.eq(1),
|
||||
self.channel_stream_out.first.eq((current_bundle == 0) & (bundle_channel[current_bundle] == 0))
|
||||
]
|
||||
|
||||
with m.If(last[current_bundle]):
|
||||
handle_last_channel()
|
||||
|
||||
# bundle inactive (eg. no ADAT/SPDIF cable plugged in or not synced) => fill zeros
|
||||
with m.Else():
|
||||
last_channel = Signal()
|
||||
m.d.comb += [
|
||||
self.channel_stream_out.payload.eq(0),
|
||||
self.channel_stream_out.channel_nr.eq(first_bundle_channel + current_channel),
|
||||
self.channel_stream_out.valid.eq(1),
|
||||
self.channel_stream_out.first.eq(0),
|
||||
self.channel_stream_out.last.eq(0),
|
||||
last_channel.eq(current_channel == (self.no_channels_in[current_bundle] - 1))
|
||||
]
|
||||
m.d.sync += current_channel.eq(current_channel + 1)
|
||||
|
||||
with m.If(last_channel):
|
||||
m.d.sync += current_channel.eq(0)
|
||||
handle_last_channel()
|
||||
|
||||
return m
|
||||
|
||||
class BundleMultiplexerTest(GatewareTestCase):
|
||||
FRAGMENT_UNDER_TEST = BundleMultiplexer
|
||||
FRAGMENT_ARGUMENTS = dict()
|
||||
|
||||
def send_one_frame(self, bundle: int, sample: int, channel: int, wait=False):
|
||||
yield self.dut.bundles_in[bundle].channel_nr.eq(channel)
|
||||
yield self.dut.bundles_in[bundle].payload.eq(sample)
|
||||
yield self.dut.bundles_in[bundle].valid.eq(1)
|
||||
yield self.dut.bundles_in[bundle].first.eq(channel == 0)
|
||||
yield self.dut.bundles_in[bundle].last.eq(channel == 7)
|
||||
yield
|
||||
yield self.dut.bundles_in[bundle].valid.eq(0)
|
||||
if wait:
|
||||
yield
|
||||
|
||||
def send_bundle_frame(self, bundle: int, sample: int):
|
||||
ch = list(range(self.dut.NO_CHANNELS_ADAT))
|
||||
first = ch[0:4]
|
||||
second = ch[4:]
|
||||
for channel in first:
|
||||
yield from self.send_one_frame(bundle, (sample << 8) + channel, channel)
|
||||
|
||||
yield self.dut.bundles_in[bundle].valid.eq(0)
|
||||
yield
|
||||
yield
|
||||
|
||||
for channel in second:
|
||||
yield from self.send_one_frame(bundle, (sample << 8) + channel, channel)
|
||||
|
||||
|
||||
@sync_test_case
|
||||
def test_smoke(self):
|
||||
dut = self.dut
|
||||
yield
|
||||
for bundle in range(4):
|
||||
yield self.dut.no_channels_in[bundle].eq(8)
|
||||
yield self.dut.bundle_active_in[bundle].eq(1)
|
||||
yield dut.channel_stream_out.ready.eq(1)
|
||||
yield
|
||||
for bundle in range(4):
|
||||
yield from self.send_bundle_frame(bundle, bundle)
|
||||
yield
|
||||
yield
|
||||
|
||||
yield
|
||||
yield
|
||||
|
||||
@sync_test_case
|
||||
def test_inactive_bundle(self):
|
||||
dut = self.dut
|
||||
yield
|
||||
yield dut.channel_stream_out.ready.eq(1)
|
||||
for bundle in range(4):
|
||||
yield self.dut.no_channels_in[bundle].eq(8)
|
||||
if (bundle != 2):
|
||||
yield dut.bundle_active_in[bundle].eq(1)
|
||||
yield
|
||||
for bundle in range(4):
|
||||
if bundle != 2:
|
||||
yield from self.send_bundle_frame(bundle, bundle)
|
||||
if bundle == 0:
|
||||
yield from self.advance_cycles(8)
|
||||
|
||||
yield from self.advance_cycles(16)
|
||||
|
||||
|
||||
@sync_test_case
|
||||
def test_all_inactive(self):
|
||||
dut = self.dut
|
||||
yield
|
||||
yield dut.channel_stream_out.ready.eq(1)
|
||||
for bundle in range(4):
|
||||
yield self.dut.no_channels_in[bundle].eq(8)
|
||||
yield dut.bundle_active_in[bundle].eq(0)
|
||||
|
||||
yield
|
||||
yield from self.advance_cycles(96)
|
||||
|
||||
|
||||
def send_all_bundle_frame(self):
|
||||
for channel in range(8):
|
||||
for bundle in range(4):
|
||||
yield self.dut.bundles_in[bundle].valid.eq(1)
|
||||
yield self.dut.bundles_in[bundle].channel_nr.eq(channel)
|
||||
yield self.dut.bundles_in[bundle].payload.eq((bundle << 16) | channel)
|
||||
yield self.dut.bundles_in[bundle].first.eq(channel == 0)
|
||||
yield self.dut.bundles_in[bundle].last.eq(channel == 7)
|
||||
|
||||
yield
|
||||
|
||||
for bundle in range(4):
|
||||
yield self.dut.bundles_in[bundle].valid.eq(0)
|
||||
|
||||
yield
|
||||
|
||||
@sync_test_case
|
||||
def test_all_sending(self):
|
||||
dut = self.dut
|
||||
yield
|
||||
yield dut.channel_stream_out.ready.eq(1)
|
||||
for bundle in range(4):
|
||||
yield self.dut.no_channels_in[bundle].eq(8)
|
||||
yield dut.bundle_active_in[bundle].eq(1)
|
||||
|
||||
yield
|
||||
for _ in range(20):
|
||||
yield from self.send_all_bundle_frame()
|
||||
|
||||
yield from self.advance_cycles(64)
|
||||
566
gateware/car.py
Normal file
566
gateware/car.py
Normal file
@@ -0,0 +1,566 @@
|
||||
from amaranth import *
|
||||
from amaranth.build import *
|
||||
from amaranth.lib.cdc import ResetSynchronizer
|
||||
from amaranth.lib.wiring import flipped
|
||||
|
||||
from amlib.utils import SimpleClockDivider
|
||||
|
||||
|
||||
class ClockDomainGeneratorBase():
|
||||
NO_PHASE_SHIFT = 0
|
||||
|
||||
def wire_up_reset(self, m, reset):
|
||||
m.submodules.reset_sync_fast = ResetSynchronizer(reset, domain="fast")
|
||||
m.submodules.reset_sync_usb = ResetSynchronizer(reset, domain="usb")
|
||||
m.submodules.reset_sync_sync = ResetSynchronizer(reset, domain="sync")
|
||||
m.submodules.reset_sync_dac = ResetSynchronizer(reset, domain="dac")
|
||||
m.submodules.reset_sync_adat = ResetSynchronizer(reset, domain="adat")
|
||||
|
||||
class IntelCycloneIVClockDomainGenerator(Elaboratable, ClockDomainGeneratorBase):
|
||||
ADAT_DIV_48k = 83
|
||||
ADAT_MULT_48k = 17
|
||||
|
||||
ADAT_DIV_44_1k = 62
|
||||
ADAT_MULT_44_1k = 14
|
||||
|
||||
DUTY_CYCLE = 50
|
||||
|
||||
def __init__(self, *, clock_frequencies=None, clock_signal_name=None):
|
||||
pass
|
||||
|
||||
def elaborate(self, platform):
|
||||
m = Module()
|
||||
|
||||
# Create our domains
|
||||
m.domains.usb = ClockDomain("usb")
|
||||
m.domains.sync = ClockDomain("sync")
|
||||
m.domains.fast = ClockDomain("fast")
|
||||
m.domains.adat = ClockDomain("adat")
|
||||
m.domains.dac = ClockDomain("dac")
|
||||
|
||||
clk = flipped(platform.request(platform.default_clk))
|
||||
|
||||
main_clocks = Signal(5)
|
||||
audio_clocks = Signal(4)
|
||||
fast_clock_48k = Signal()
|
||||
|
||||
sys_locked = Signal()
|
||||
audio_locked = Signal()
|
||||
fast_locked = Signal()
|
||||
reset = Signal()
|
||||
|
||||
m.submodules.mainpll = Instance("ALTPLL",
|
||||
p_BANDWIDTH_TYPE = "AUTO",
|
||||
|
||||
# USB clock: 60MHz
|
||||
p_CLK0_DIVIDE_BY = 5,
|
||||
p_CLK0_DUTY_CYCLE = self.DUTY_CYCLE,
|
||||
p_CLK0_MULTIPLY_BY = 6,
|
||||
p_CLK0_PHASE_SHIFT = self.NO_PHASE_SHIFT,
|
||||
|
||||
# 44.1k ADAT Clock 11.2896 MHz = 44.1kHz * 256
|
||||
p_CLK1_DIVIDE_BY = self.ADAT_DIV_44_1k,
|
||||
p_CLK1_DUTY_CYCLE = self.DUTY_CYCLE,
|
||||
p_CLK1_MULTIPLY_BY = self.ADAT_MULT_44_1k,
|
||||
p_CLK1_PHASE_SHIFT = self.NO_PHASE_SHIFT,
|
||||
|
||||
# I2S DAC clock 44.1k = 3.072 MHz = 44.1kHz * 32 bit * 2 channels
|
||||
p_CLK2_DIVIDE_BY = self.ADAT_DIV_44_1k * 4,
|
||||
p_CLK2_DUTY_CYCLE = self.DUTY_CYCLE,
|
||||
p_CLK2_MULTIPLY_BY = self.ADAT_MULT_44_1k,
|
||||
p_CLK2_PHASE_SHIFT = self.NO_PHASE_SHIFT,
|
||||
|
||||
# ADAT sampling clock = 44.1kHz * 256 * 8 times oversampling
|
||||
p_CLK3_DIVIDE_BY = self.ADAT_DIV_44_1k,
|
||||
p_CLK3_DUTY_CYCLE = self.DUTY_CYCLE,
|
||||
p_CLK3_MULTIPLY_BY = self.ADAT_MULT_44_1k * 8,
|
||||
p_CLK3_PHASE_SHIFT = self.NO_PHASE_SHIFT,
|
||||
|
||||
# ADAT transmit domain clock = 44.1kHz * 5 output terminals
|
||||
p_CLK4_DIVIDE_BY = self.ADAT_DIV_44_1k,
|
||||
p_CLK4_DUTY_CYCLE = self.DUTY_CYCLE,
|
||||
p_CLK4_MULTIPLY_BY = self.ADAT_MULT_44_1k * 5,
|
||||
p_CLK4_PHASE_SHIFT = self.NO_PHASE_SHIFT,
|
||||
|
||||
# 50MHz = 20000 picoseconds
|
||||
p_INCLK0_INPUT_FREQUENCY = 20000,
|
||||
p_OPERATION_MODE = "NORMAL",
|
||||
|
||||
# Drive our clock from the USB clock
|
||||
# coming from the USB clock pin of the USB3300
|
||||
i_inclk = clk,
|
||||
o_clk = main_clocks,
|
||||
o_locked = sys_locked,
|
||||
)
|
||||
|
||||
m.submodules.audiopll = Instance("ALTPLL",
|
||||
p_BANDWIDTH_TYPE = "AUTO",
|
||||
|
||||
# ADAT clock = 12.288 MHz = 48 kHz * 256
|
||||
p_CLK0_DIVIDE_BY = self.ADAT_DIV_48k,
|
||||
p_CLK0_DUTY_CYCLE = self.DUTY_CYCLE,
|
||||
p_CLK0_MULTIPLY_BY = self.ADAT_MULT_48k,
|
||||
p_CLK0_PHASE_SHIFT = self.NO_PHASE_SHIFT,
|
||||
|
||||
# I2S DAC clock 48k = 3.072 MHz = 48 kHz * 32 bit * 2 channels
|
||||
p_CLK1_DIVIDE_BY = self.ADAT_DIV_48k * 4,
|
||||
p_CLK1_DUTY_CYCLE = self.DUTY_CYCLE,
|
||||
p_CLK1_MULTIPLY_BY = self.ADAT_MULT_48k,
|
||||
p_CLK1_PHASE_SHIFT = self.NO_PHASE_SHIFT,
|
||||
|
||||
# ADAT sampling clock = 48 kHz * 256 * 8 times oversampling
|
||||
p_CLK2_DIVIDE_BY = self.ADAT_DIV_48k,
|
||||
p_CLK2_DUTY_CYCLE = self.DUTY_CYCLE,
|
||||
p_CLK2_MULTIPLY_BY = self.ADAT_MULT_48k * 8,
|
||||
p_CLK2_PHASE_SHIFT = self.NO_PHASE_SHIFT,
|
||||
|
||||
# ADAT transmit domain clock = 48 kHz * 256 * 5 output terminals
|
||||
p_CLK3_DIVIDE_BY = self.ADAT_DIV_48k,
|
||||
p_CLK3_DUTY_CYCLE = self.DUTY_CYCLE,
|
||||
p_CLK3_MULTIPLY_BY = self.ADAT_MULT_48k * 5,
|
||||
p_CLK3_PHASE_SHIFT = self.NO_PHASE_SHIFT,
|
||||
|
||||
p_INCLK0_INPUT_FREQUENCY = 16667,
|
||||
p_OPERATION_MODE = "NORMAL",
|
||||
|
||||
i_inclk = main_clocks[0],
|
||||
o_clk = audio_clocks,
|
||||
o_locked = audio_locked,
|
||||
)
|
||||
|
||||
m.submodules.fastpll = Instance("ALTPLL",
|
||||
p_BANDWIDTH_TYPE = "AUTO",
|
||||
|
||||
# ADAT sampling clock = 48 kHz * 256 * 8 times oversampling
|
||||
p_CLK0_DIVIDE_BY = 1,
|
||||
p_CLK0_DUTY_CYCLE = self.DUTY_CYCLE,
|
||||
p_CLK0_MULTIPLY_BY = platform.fast_multiplier,
|
||||
p_CLK0_PHASE_SHIFT = self.NO_PHASE_SHIFT,
|
||||
|
||||
p_INCLK0_INPUT_FREQUENCY = 81395,
|
||||
p_OPERATION_MODE = "NORMAL",
|
||||
|
||||
i_inclk = audio_clocks[0],
|
||||
o_clk = fast_clock_48k,
|
||||
o_locked = fast_locked,
|
||||
)
|
||||
|
||||
|
||||
m.d.comb += [
|
||||
reset.eq(~(sys_locked & audio_locked & fast_locked)),
|
||||
ClockSignal("fast").eq(fast_clock_48k),
|
||||
ClockSignal("usb") .eq(main_clocks[0]),
|
||||
ClockSignal("adat").eq(audio_clocks[0]),
|
||||
ClockSignal("dac").eq(audio_clocks[1]),
|
||||
ClockSignal("sync").eq(audio_clocks[3]),
|
||||
]
|
||||
|
||||
self.wire_up_reset(m, reset)
|
||||
|
||||
return m
|
||||
|
||||
|
||||
class IntelCycloneVClockDomainGenerator(Elaboratable, ClockDomainGeneratorBase):
|
||||
|
||||
def __init__(self, *, clock_frequencies=None, clock_signal_name=None):
|
||||
pass
|
||||
|
||||
def elaborate(self, platform):
|
||||
m = Module()
|
||||
|
||||
# Create our domains
|
||||
# usb: USB clock: 60MHz
|
||||
# adat: ADAT clock = 12.288 MHz = 48 kHz * 256
|
||||
# dac: I2S DAC clock 48k = 3.072 MHz = 48 kHz * 32 bit * 2 channels
|
||||
# sync: ADAT transmit domain clock = 61.44 MHz = 48 kHz * 256 * 5 output terminals
|
||||
# fast: ADAT sampling clock = 98.304 MHz = 48 kHz * 256 * 8 times oversampling
|
||||
m.domains.usb = ClockDomain("usb")
|
||||
m.domains.sync = ClockDomain("sync")
|
||||
m.domains.fast = ClockDomain("fast")
|
||||
m.domains.adat = ClockDomain("adat")
|
||||
m.domains.dac = ClockDomain("dac")
|
||||
|
||||
clk = flipped(platform.request(platform.default_clk))
|
||||
|
||||
main_clock = Signal()
|
||||
audio_clocks = Signal(4)
|
||||
|
||||
sys_locked = Signal()
|
||||
audio_locked = Signal()
|
||||
|
||||
reset = Signal()
|
||||
|
||||
m.submodules.mainpll = Instance("altera_pll",
|
||||
p_pll_type="General",
|
||||
p_pll_subtype="General",
|
||||
p_fractional_vco_multiplier="false",
|
||||
p_operation_mode="normal",
|
||||
p_reference_clock_frequency="50.0 MHz",
|
||||
p_number_of_clocks="1",
|
||||
|
||||
p_output_clock_frequency0="60.000000 MHz",
|
||||
|
||||
|
||||
# Drive our clock from the internal 50MHz clock
|
||||
i_refclk = clk,
|
||||
o_outclk = main_clock,
|
||||
o_locked = sys_locked
|
||||
)
|
||||
|
||||
m.submodules.audiopll = Instance("altera_pll",
|
||||
p_pll_type="General",
|
||||
p_pll_subtype="General",
|
||||
p_fractional_vco_multiplier="true",
|
||||
p_operation_mode="normal",
|
||||
p_reference_clock_frequency="60.0 MHz",
|
||||
p_number_of_clocks="4",
|
||||
|
||||
p_output_clock_frequency0="12.288000 MHz",
|
||||
p_output_clock_frequency1="3.072000 MHz",
|
||||
p_output_clock_frequency2="61.440000 MHz",
|
||||
p_output_clock_frequency3="98.304000 MHz",
|
||||
|
||||
# Drive our clock from the mainpll
|
||||
i_refclk=main_clock,
|
||||
o_outclk=audio_clocks,
|
||||
o_locked=audio_locked
|
||||
)
|
||||
|
||||
m.d.comb += [
|
||||
reset.eq(~(sys_locked & audio_locked)),
|
||||
ClockSignal("usb") .eq(main_clock),
|
||||
ClockSignal("adat").eq(audio_clocks[0]),
|
||||
ClockSignal("dac").eq(audio_clocks[1]),
|
||||
ClockSignal("sync").eq(audio_clocks[2]),
|
||||
ClockSignal("fast").eq(audio_clocks[3])
|
||||
]
|
||||
|
||||
self.wire_up_reset(m, reset)
|
||||
|
||||
return m
|
||||
|
||||
class Xilinx7SeriesClockDomainGenerator(Elaboratable, ClockDomainGeneratorBase):
|
||||
ADAT_DIV_48k = 83
|
||||
ADAT_MULT_48k = 17
|
||||
DUTY_CYCLE = 0.5
|
||||
|
||||
def __init__(self, *, clock_frequencies=None, clock_signal_name=None):
|
||||
pass
|
||||
|
||||
def elaborate(self, platform):
|
||||
m = Module()
|
||||
|
||||
# Create our domains
|
||||
m.domains.usb = ClockDomain("usb")
|
||||
m.domains.sync = ClockDomain("sync")
|
||||
m.domains.fast = ClockDomain("fast")
|
||||
m.domains.adat = ClockDomain("adat")
|
||||
m.domains.dac = ClockDomain("dac")
|
||||
|
||||
clk = flipped(platform.request(platform.default_clk))
|
||||
|
||||
main_clocks = Signal()
|
||||
audio_clocks = Signal(4)
|
||||
fast_clock_48k = Signal()
|
||||
|
||||
sys_locked = Signal()
|
||||
audio_locked = Signal()
|
||||
fast_locked = Signal()
|
||||
reset = Signal()
|
||||
|
||||
mainpll_feedback = Signal()
|
||||
audiopll_feedback = Signal()
|
||||
fastpll_feedback = Signal()
|
||||
|
||||
m.submodules.mainpll = Instance("PLLE2_ADV",
|
||||
p_CLKIN1_PERIOD = 20,
|
||||
p_BANDWIDTH = "OPTIMIZED",
|
||||
p_COMPENSATION = "ZHOLD",
|
||||
p_STARTUP_WAIT = "FALSE",
|
||||
|
||||
p_DIVCLK_DIVIDE = 1,
|
||||
p_CLKFBOUT_MULT = 30,
|
||||
p_CLKFBOUT_PHASE = self.NO_PHASE_SHIFT,
|
||||
|
||||
# 60MHz
|
||||
p_CLKOUT0_DIVIDE = 25,
|
||||
p_CLKOUT0_PHASE = self.NO_PHASE_SHIFT,
|
||||
p_CLKOUT0_DUTY_CYCLE = self.DUTY_CYCLE,
|
||||
|
||||
i_CLKFBIN = mainpll_feedback,
|
||||
o_CLKFBOUT = mainpll_feedback,
|
||||
i_CLKIN1 = clk,
|
||||
o_CLKOUT0 = main_clocks,
|
||||
o_LOCKED = sys_locked,
|
||||
)
|
||||
|
||||
m.submodules.audiopll = Instance("PLLE2_ADV",
|
||||
p_CLKIN1_PERIOD = 16.666,
|
||||
p_BANDWIDTH = "OPTIMIZED",
|
||||
p_COMPENSATION = "ZHOLD",
|
||||
p_STARTUP_WAIT = "FALSE",
|
||||
p_DIVCLK_DIVIDE = 1,
|
||||
p_CLKFBOUT_MULT = self.ADAT_MULT_48k,
|
||||
p_CLKFBOUT_PHASE = self.NO_PHASE_SHIFT,
|
||||
|
||||
# ADAT clock = 12.288 MHz = 48 kHz * 256
|
||||
p_CLKOUT2_DIVIDE = self.ADAT_DIV_48k,
|
||||
p_CLKOUT2_PHASE = self.NO_PHASE_SHIFT,
|
||||
p_CLKOUT2_DUTY_CYCLE = self.DUTY_CYCLE,
|
||||
|
||||
|
||||
# ADAT sampling clock = 48 kHz * 256 * 8 times oversampling
|
||||
p_CLKOUT0_DIVIDE = self.ADAT_DIV_48k / 8,
|
||||
p_CLKOUT0_PHASE = self.NO_PHASE_SHIFT,
|
||||
p_CLKOUT0_DUTY_CYCLE = self.DUTY_CYCLE,
|
||||
|
||||
# ADAT transmit domain clock = 48 kHz * 256 * 5 output terminals
|
||||
p_CLKOUT3_DIVIDE = self.ADAT_DIV_48k / 5,
|
||||
p_CLKOUT3_PHASE = self.NO_PHASE_SHIFT,
|
||||
p_CLKOUT3_DUTY_CYCLE = self.DUTY_CYCLE,
|
||||
|
||||
i_CLKFBIN = audiopll_feedback,
|
||||
o_CLKFBOUT = audiopll_feedback,
|
||||
i_CLKIN1 = main_clocks[0],
|
||||
o_CLKOUT0 = audio_clocks[2],
|
||||
o_CLKOUT2 = audio_clocks[0],
|
||||
o_CLKOUT3 = audio_clocks[3],
|
||||
o_LOCKED = audio_locked,
|
||||
)
|
||||
|
||||
VCO_SCALER_FAST = 1
|
||||
|
||||
m.submodules.fastpll = Instance("PLLE2_ADV",
|
||||
p_CLKIN1_PERIOD = 10.172,
|
||||
p_BANDWIDTH = "OPTIMIZED",
|
||||
p_COMPENSATION = "ZHOLD",
|
||||
p_STARTUP_WAIT = "FALSE",
|
||||
p_DIVCLK_DIVIDE = 1,
|
||||
p_CLKFBOUT_MULT = VCO_SCALER_FAST * platform.fast_multiplier,
|
||||
p_CLKFBOUT_PHASE = self.NO_PHASE_SHIFT,
|
||||
|
||||
# Fast clock = 48 kHz * 256 * 9
|
||||
p_CLKOUT0_DIVIDE = VCO_SCALER_FAST,
|
||||
p_CLKOUT0_PHASE = self.NO_PHASE_SHIFT,
|
||||
p_CLKOUT0_DUTY_CYCLE = self.DUTY_CYCLE,
|
||||
|
||||
# I2S DAC clock 48k = 3.072 MHz = 48 kHz * 32 bit * 2 channels
|
||||
p_CLKOUT1_DIVIDE = VCO_SCALER_FAST * platform.fast_multiplier * 4,
|
||||
p_CLKOUT1_PHASE = self.NO_PHASE_SHIFT,
|
||||
p_CLKOUT1_DUTY_CYCLE = self.DUTY_CYCLE,
|
||||
|
||||
i_CLKFBIN = fastpll_feedback,
|
||||
o_CLKFBOUT = fastpll_feedback,
|
||||
i_CLKIN1 = audio_clocks[2],
|
||||
o_CLKOUT0 = fast_clock_48k,
|
||||
o_CLKOUT1 = audio_clocks[1],
|
||||
o_LOCKED = fast_locked,
|
||||
)
|
||||
|
||||
|
||||
m.d.comb += [
|
||||
reset.eq(~(sys_locked & audio_locked & fast_locked)),
|
||||
ClockSignal("fast").eq(fast_clock_48k),
|
||||
ClockSignal("usb") .eq(main_clocks[0]),
|
||||
ClockSignal("adat").eq(audio_clocks[0]),
|
||||
ClockSignal("dac").eq(audio_clocks[1]),
|
||||
ClockSignal("sync").eq(audio_clocks[3]),
|
||||
]
|
||||
|
||||
self.wire_up_reset(m, reset)
|
||||
|
||||
return m
|
||||
|
||||
class ColorlightDomainGenerator(Elaboratable, ClockDomainGeneratorBase):
|
||||
""" Clock generator for the Colorlight I5 board. """
|
||||
FastDomainDivider = 7
|
||||
FastClockFreq = 25e6 * 29 / FastDomainDivider
|
||||
|
||||
def __init__(self, clock_frequencies=None):
|
||||
pass
|
||||
|
||||
def elaborate(self, platform):
|
||||
m = Module()
|
||||
|
||||
# Create our domains.
|
||||
m.domains.sync = ClockDomain("sync")
|
||||
m.domains.usb = ClockDomain("usb")
|
||||
m.domains.fast = ClockDomain("fast")
|
||||
m.domains.adat = ClockDomain("adat")
|
||||
m.domains.dac = ClockDomain("dac")
|
||||
|
||||
|
||||
# Grab our clock and global reset signals.
|
||||
clk25 = flipped(platform.request(platform.default_clk))
|
||||
|
||||
main_clocks = Signal(5)
|
||||
audio_clocks = Signal(4)
|
||||
fast_clock_48k = Signal()
|
||||
|
||||
main_locked = Signal()
|
||||
audio_locked = Signal()
|
||||
fast_locked = Signal()
|
||||
reset = Signal()
|
||||
|
||||
# USB PLL
|
||||
main_feedback = Signal()
|
||||
m.submodules.main_pll = Instance("EHXPLLL",
|
||||
|
||||
# Status.
|
||||
o_LOCK=main_locked,
|
||||
|
||||
# PLL parameters...
|
||||
p_PLLRST_ENA="DISABLED",
|
||||
p_INTFB_WAKE="DISABLED",
|
||||
p_STDBY_ENABLE="DISABLED",
|
||||
p_DPHASE_SOURCE="DISABLED",
|
||||
p_OUTDIVIDER_MUXA="DIVA",
|
||||
p_OUTDIVIDER_MUXB="DIVB",
|
||||
p_OUTDIVIDER_MUXC="DIVC",
|
||||
p_OUTDIVIDER_MUXD="DIVD",
|
||||
|
||||
# 60 MHz
|
||||
p_CLKI_DIV = 5,
|
||||
p_CLKOP_ENABLE = "ENABLED",
|
||||
p_CLKOP_DIV = 10,
|
||||
p_CLKOP_CPHASE = 15,
|
||||
p_CLKOP_FPHASE = 0,
|
||||
|
||||
p_FEEDBK_PATH = "CLKOP",
|
||||
p_CLKFB_DIV = 12,
|
||||
|
||||
# Clock in.
|
||||
i_CLKI=clk25,
|
||||
|
||||
# Internal feedback.
|
||||
i_CLKFB=main_feedback,
|
||||
|
||||
# Control signals.
|
||||
i_RST=reset,
|
||||
i_PHASESEL0=0,
|
||||
i_PHASESEL1=0,
|
||||
i_PHASEDIR=1,
|
||||
i_PHASESTEP=1,
|
||||
i_PHASELOADREG=1,
|
||||
i_STDBY=0,
|
||||
i_PLLWAKESYNC=0,
|
||||
|
||||
# Output Enables.
|
||||
i_ENCLKOP=0,
|
||||
i_ENCLKOS=0,
|
||||
|
||||
# Generated clock outputs.
|
||||
o_CLKOP=main_feedback,
|
||||
|
||||
# Synthesis attributes.
|
||||
a_FREQUENCY_PIN_CLKI="25",
|
||||
a_FREQUENCY_PIN_CLKOP="60",
|
||||
|
||||
a_ICP_CURRENT="6",
|
||||
a_LPF_RESISTOR="16",
|
||||
a_MFG_ENABLE_FILTEROPAMP="1",
|
||||
a_MFG_GMCREF_SEL="2"
|
||||
)
|
||||
|
||||
audio_feedback = Signal()
|
||||
audio_locked = Signal()
|
||||
m.submodules.audio_pll = Instance("EHXPLLL",
|
||||
|
||||
# Status.
|
||||
o_LOCK=audio_locked,
|
||||
|
||||
# PLL parameters...
|
||||
p_PLLRST_ENA="DISABLED",
|
||||
p_INTFB_WAKE="DISABLED",
|
||||
p_STDBY_ENABLE="DISABLED",
|
||||
p_DPHASE_SOURCE="DISABLED",
|
||||
p_OUTDIVIDER_MUXA="DIVA",
|
||||
p_OUTDIVIDER_MUXB="DIVB",
|
||||
p_OUTDIVIDER_MUXC="DIVC",
|
||||
p_OUTDIVIDER_MUXD="DIVD",
|
||||
|
||||
# 25MHz * 29 = 725 MHz PLL freqency
|
||||
p_CLKI_DIV = 1,
|
||||
p_CLKOP_ENABLE = "ENABLED",
|
||||
p_CLKOP_DIV = 29,
|
||||
p_CLKOP_CPHASE = 0,
|
||||
p_CLKOP_FPHASE = 0,
|
||||
|
||||
# 12.288 MHz = 725 MHz / 59
|
||||
p_CLKOS_ENABLE = "ENABLED",
|
||||
p_CLKOS_DIV = 59,
|
||||
p_CLKOS_CPHASE = 0,
|
||||
p_CLKOS_FPHASE = 0,
|
||||
|
||||
# fast domain clock
|
||||
p_CLKOS3_ENABLE = "ENABLED",
|
||||
p_CLKOS3_DIV = self.FastDomainDivider,
|
||||
p_CLKOS3_CPHASE = 0,
|
||||
p_CLKOS3_FPHASE = 0,
|
||||
|
||||
p_FEEDBK_PATH = "CLKOP",
|
||||
p_CLKFB_DIV = 1,
|
||||
|
||||
# Clock in.
|
||||
i_CLKI=clk25,
|
||||
|
||||
# Internal feedback.
|
||||
i_CLKFB=audio_feedback,
|
||||
|
||||
# Control signals.
|
||||
i_RST=reset,
|
||||
i_PHASESEL0=0,
|
||||
i_PHASESEL1=0,
|
||||
i_PHASEDIR=1,
|
||||
i_PHASESTEP=1,
|
||||
i_PHASELOADREG=1,
|
||||
i_STDBY=0,
|
||||
i_PLLWAKESYNC=0,
|
||||
|
||||
# Output Enables.
|
||||
i_ENCLKOP=0,
|
||||
i_ENCLKOS=0,
|
||||
i_ENCLKOS3=0,
|
||||
|
||||
# Generated clock outputs.
|
||||
o_CLKOP=audio_feedback,
|
||||
o_CLKOS=ClockSignal("adat"),
|
||||
o_CLKOS3=ClockSignal("fast"),
|
||||
|
||||
# Synthesis attributes.
|
||||
a_FREQUENCY_PIN_CLKI="25",
|
||||
a_FREQUENCY_PIN_CLKOS="12.288",
|
||||
|
||||
a_ICP_CURRENT="6",
|
||||
a_LPF_RESISTOR="16",
|
||||
a_MFG_ENABLE_FILTEROPAMP="1",
|
||||
a_MFG_GMCREF_SEL="2"
|
||||
)
|
||||
|
||||
debug0 = platform.request("debug", 0)
|
||||
debug1 = platform.request("debug", 1)
|
||||
debug2 = platform.request("debug", 2)
|
||||
debug3 = platform.request("debug", 3)
|
||||
|
||||
m.submodules.bclk_div = clk_div = DomainRenamer("adat")(SimpleClockDivider(4))
|
||||
|
||||
reset = Signal()
|
||||
# Control our resets.
|
||||
m.d.comb += [
|
||||
ClockSignal("usb") .eq(main_feedback),
|
||||
ClockSignal("sync") .eq(ClockSignal("usb")),
|
||||
ClockSignal("dac") .eq(clk_div.clock_out),
|
||||
clk_div.clock_enable_in.eq(1),
|
||||
|
||||
reset.eq(~(main_locked & audio_locked)),
|
||||
|
||||
debug0.eq(ClockSignal("usb")),
|
||||
debug1.eq(ClockSignal("adat")),
|
||||
debug2.eq(ClockSignal("fast")),
|
||||
debug3.eq(reset),
|
||||
|
||||
]
|
||||
|
||||
self.wire_up_reset(m, reset)
|
||||
|
||||
return m
|
||||
153
gateware/channel_stream_combiner.py
Normal file
153
gateware/channel_stream_combiner.py
Normal file
@@ -0,0 +1,153 @@
|
||||
from amaranth import *
|
||||
from amaranth.build import Platform
|
||||
|
||||
from amlib.stream import StreamInterface
|
||||
from amlib.test import GatewareTestCase, sync_test_case
|
||||
|
||||
class ChannelStreamCombiner(Elaboratable):
|
||||
SAMPLE_WIDTH = 24
|
||||
|
||||
def __init__(self, no_lower_channels, no_upper_channels):
|
||||
self.no_lower_channels = no_lower_channels
|
||||
self.no_upper_channels = no_upper_channels
|
||||
self.lower_channel_bits = Shape.cast(range(no_lower_channels)).width
|
||||
self.upper_channel_bits = Shape.cast(range(no_upper_channels)).width
|
||||
self.combined_channel_bits = Shape.cast(range(no_lower_channels + no_upper_channels)).width
|
||||
|
||||
self.lower_channel_stream_in = StreamInterface(name="lower_channels",
|
||||
payload_width=self.SAMPLE_WIDTH,
|
||||
extra_fields=[("channel_nr", self.lower_channel_bits)])
|
||||
|
||||
self.upper_channels_active_in = Signal()
|
||||
self.upper_channel_stream_in = StreamInterface(name="upper_channels",
|
||||
payload_width=self.SAMPLE_WIDTH,
|
||||
extra_fields=[("channel_nr", self.lower_channel_bits)])
|
||||
|
||||
self.combined_channel_stream_out = StreamInterface(name="combined_channels",
|
||||
payload_width=self.SAMPLE_WIDTH,
|
||||
extra_fields=[("channel_nr", self.combined_channel_bits)])
|
||||
|
||||
# debug signals
|
||||
self.state = Signal(range(3))
|
||||
self.upper_channel_counter = Signal(self.upper_channel_bits)
|
||||
|
||||
# debug signals
|
||||
self.state = Signal(range(3))
|
||||
|
||||
def elaborate(self, platform: Platform) -> Module:
|
||||
m = Module()
|
||||
|
||||
upper_channel_counter = Signal(self.upper_channel_bits)
|
||||
m.d.comb += self.upper_channel_counter.eq(upper_channel_counter)
|
||||
|
||||
with m.FSM() as fsm:
|
||||
m.d.comb += self.state.eq(fsm.state)
|
||||
|
||||
with m.State("LOWER_CHANNELS"):
|
||||
with m.If( self.combined_channel_stream_out.ready
|
||||
& self.lower_channel_stream_in.valid):
|
||||
m.d.comb += [
|
||||
self.combined_channel_stream_out.payload.eq(self.lower_channel_stream_in.payload),
|
||||
self.combined_channel_stream_out.channel_nr.eq(self.lower_channel_stream_in.channel_nr),
|
||||
self.lower_channel_stream_in.ready.eq(1),
|
||||
self.combined_channel_stream_out.valid.eq(1),
|
||||
self.combined_channel_stream_out.first.eq(self.lower_channel_stream_in.first),
|
||||
self.combined_channel_stream_out.last.eq(0),
|
||||
]
|
||||
|
||||
with m.If(self.lower_channel_stream_in.last):
|
||||
m.d.sync += upper_channel_counter.eq(0)
|
||||
with m.If(self.upper_channels_active_in):
|
||||
m.next = "UPPER_CHANNELS"
|
||||
with m.Else():
|
||||
m.next = "FILL_UPPER"
|
||||
|
||||
with m.State("UPPER_CHANNELS"):
|
||||
with m.If(self.combined_channel_stream_out.ready):
|
||||
with m.If(self.upper_channels_active_in):
|
||||
with m.If(self.upper_channel_stream_in.valid):
|
||||
m.d.comb += [
|
||||
self.combined_channel_stream_out.payload.eq(self.upper_channel_stream_in.payload),
|
||||
self.combined_channel_stream_out.channel_nr.eq(\
|
||||
self.no_lower_channels +
|
||||
self.upper_channel_stream_in.channel_nr),
|
||||
self.upper_channel_stream_in.ready.eq(1),
|
||||
self.combined_channel_stream_out.valid.eq(1),
|
||||
self.combined_channel_stream_out.first.eq(0),
|
||||
self.combined_channel_stream_out.last.eq(self.upper_channel_stream_in.last),
|
||||
]
|
||||
|
||||
with m.If(self.upper_channel_stream_in.last):
|
||||
with m.If(self.upper_channel_stream_in.channel_nr == 1):
|
||||
m.d.sync += upper_channel_counter.eq(2)
|
||||
m.next = "FILL_UPPER"
|
||||
with m.Else():
|
||||
m.next = "LOWER_CHANNELS"
|
||||
|
||||
# USB is not active: Fill in zeros
|
||||
with m.Else():
|
||||
m.next = "FILL_UPPER"
|
||||
|
||||
with m.State("FILL_UPPER"):
|
||||
with m.If(self.combined_channel_stream_out.ready):
|
||||
with m.If( ~self.upper_channels_active_in
|
||||
& self.upper_channel_stream_in.valid):
|
||||
# we just drain all stale data from the upstream FIFOs
|
||||
# if the upper channels are not active
|
||||
m.d.comb += self.upper_channel_stream_in.ready.eq(1)
|
||||
|
||||
m.d.sync += upper_channel_counter.eq(upper_channel_counter + 1)
|
||||
m.d.comb += [
|
||||
self.combined_channel_stream_out.payload.eq(0),
|
||||
self.combined_channel_stream_out.channel_nr.eq(\
|
||||
self.no_lower_channels +
|
||||
upper_channel_counter),
|
||||
self.combined_channel_stream_out.valid.eq(1),
|
||||
self.combined_channel_stream_out.first.eq(0),
|
||||
self.combined_channel_stream_out.last.eq(0),
|
||||
]
|
||||
|
||||
last_channel = upper_channel_counter >= (self.no_upper_channels - 1)
|
||||
with m.If(last_channel):
|
||||
m.d.comb += self.combined_channel_stream_out.last.eq(1)
|
||||
m.next = "LOWER_CHANNELS"
|
||||
|
||||
return m
|
||||
|
||||
class ChannelStreamCombinerTest(GatewareTestCase):
|
||||
FRAGMENT_UNDER_TEST = ChannelStreamCombiner
|
||||
FRAGMENT_ARGUMENTS = dict(no_lower_channels=32, no_upper_channels=6)
|
||||
|
||||
def send_lower_frame(self, sample: int, channel: int, wait=False):
|
||||
yield self.dut.lower_channel_stream_in.channel_nr.eq(channel)
|
||||
yield self.dut.lower_channel_stream_in.payload.eq(sample)
|
||||
yield self.dut.lower_channel_stream_in.valid.eq(1)
|
||||
yield self.dut.lower_channel_stream_in.first.eq(channel == 0)
|
||||
yield self.dut.lower_channel_stream_in.last.eq(channel == 31)
|
||||
yield
|
||||
yield self.dut.lower_channel_stream_in.valid.eq(0)
|
||||
if wait:
|
||||
yield
|
||||
|
||||
def send_upper_frame(self, sample: int, channel: int, last_channel: int=6, wait=False):
|
||||
yield self.dut.upper_channel_stream_in.channel_nr.eq(channel)
|
||||
yield self.dut.upper_channel_stream_in.payload.eq(sample)
|
||||
yield self.dut.upper_channel_stream_in.valid.eq(1)
|
||||
yield self.dut.upper_channel_stream_in.first.eq(channel == 0)
|
||||
yield self.dut.upper_channel_stream_in.last.eq(channel == last_channel)
|
||||
yield
|
||||
yield self.dut.upper_channel_stream_in.valid.eq(0)
|
||||
if wait:
|
||||
yield
|
||||
|
||||
@sync_test_case
|
||||
def test_smoke(self):
|
||||
dut = self.dut
|
||||
yield
|
||||
yield dut.combined_channel_stream_out.ready.eq(1)
|
||||
for channel in range(32):
|
||||
yield from self.send_lower_frame(channel, channel)
|
||||
yield from self.advance_cycles(13)
|
||||
for channel in range(32):
|
||||
yield from self.send_lower_frame(channel, channel)
|
||||
yield from self.advance_cycles(13)
|
||||
52
gateware/channel_stream_splitter-bench.gtkw
Normal file
52
gateware/channel_stream_splitter-bench.gtkw
Normal file
@@ -0,0 +1,52 @@
|
||||
[*]
|
||||
[*] GTKWave Analyzer v3.4.0 (w)1999-2022 BSI
|
||||
[*] Thu Jan 6 02:29:19 2022
|
||||
[*]
|
||||
[dumpfile] "test_ChannelStreamSplitterTest_test_smoke.vcd"
|
||||
[dumpfile_mtime] "Thu Jan 6 02:28:21 2022"
|
||||
[dumpfile_size] 5390
|
||||
[savefile] "gateware/channel_stream_splitter-bench.gtkw"
|
||||
[timestart] 0
|
||||
[size] 3828 2090
|
||||
[pos] -1 -1
|
||||
*-16.000000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
|
||||
[treeopen] bench.
|
||||
[sst_width] 65
|
||||
[signals_width] 540
|
||||
[sst_expanded] 0
|
||||
[sst_vpaned_height] 658
|
||||
@28
|
||||
bench.top.clk
|
||||
@200
|
||||
-Input
|
||||
@22
|
||||
bench.top.combined_channels__channel_nr[5:0]
|
||||
bench.top.combined_channels__payload[23:0]
|
||||
@28
|
||||
bench.top.combined_channels__first
|
||||
bench.top.combined_channels__last
|
||||
bench.top.combined_channels__ready
|
||||
bench.top.combined_channels__valid
|
||||
@200
|
||||
-Output 1
|
||||
@22
|
||||
bench.top.lower_channels__channel_nr[4:0]
|
||||
bench.top.lower_channels__payload[23:0]
|
||||
@28
|
||||
bench.top.lower_channels__first
|
||||
bench.top.lower_channels__last
|
||||
bench.top.lower_channels__ready
|
||||
bench.top.lower_channels__valid
|
||||
@200
|
||||
-Output 2
|
||||
@22
|
||||
bench.top.upper_channels__channel_nr[4:0]
|
||||
@23
|
||||
bench.top.upper_channels__payload[23:0]
|
||||
@28
|
||||
bench.top.upper_channels__first
|
||||
bench.top.upper_channels__last
|
||||
bench.top.upper_channels__ready
|
||||
bench.top.upper_channels__valid
|
||||
[pattern_trace] 1
|
||||
[pattern_trace] 0
|
||||
111
gateware/channel_stream_splitter.py
Normal file
111
gateware/channel_stream_splitter.py
Normal file
@@ -0,0 +1,111 @@
|
||||
from amaranth import *
|
||||
from amaranth.build import Platform
|
||||
|
||||
from amlib.stream import StreamInterface
|
||||
from amlib.test import GatewareTestCase, sync_test_case
|
||||
|
||||
class ChannelStreamSplitter(Elaboratable):
|
||||
SAMPLE_WIDTH = 24
|
||||
|
||||
def __init__(self, no_lower_channels, no_upper_channels, test=False):
|
||||
self.test = test
|
||||
self.no_lower_channels = no_lower_channels
|
||||
self.no_upper_channels = no_upper_channels
|
||||
self.lower_channel_bits = Shape.cast(range(no_lower_channels)).width
|
||||
self.upper_channel_bits = Shape.cast(range(no_upper_channels)).width
|
||||
self.combined_channel_bits = Shape.cast(range(no_lower_channels + no_upper_channels)).width
|
||||
|
||||
self.lower_channel_stream_out = StreamInterface(name="lower_channels",
|
||||
payload_width=self.SAMPLE_WIDTH,
|
||||
extra_fields=[("channel_nr", self.lower_channel_bits)])
|
||||
|
||||
self.upper_channel_stream_out = StreamInterface(name="upper_channels",
|
||||
payload_width=self.SAMPLE_WIDTH,
|
||||
extra_fields=[("channel_nr", self.lower_channel_bits)])
|
||||
|
||||
self.combined_channel_stream_in = StreamInterface(name="combined_channels",
|
||||
payload_width=self.SAMPLE_WIDTH,
|
||||
extra_fields=[("channel_nr", self.combined_channel_bits)])
|
||||
|
||||
# debug signals
|
||||
|
||||
def elaborate(self, platform: Platform) -> Module:
|
||||
m = Module()
|
||||
|
||||
if (self.test):
|
||||
dummy = Signal()
|
||||
m.d.sync += dummy.eq(1)
|
||||
|
||||
input_stream = self.combined_channel_stream_in
|
||||
|
||||
m.d.comb += [
|
||||
input_stream.ready.eq(self.lower_channel_stream_out.ready & self.upper_channel_stream_out.ready),
|
||||
]
|
||||
|
||||
with m.If(input_stream.valid & input_stream.ready):
|
||||
with m.If(input_stream.channel_nr < self.no_lower_channels):
|
||||
m.d.comb += [
|
||||
self.lower_channel_stream_out.payload.eq(input_stream.payload),
|
||||
self.lower_channel_stream_out.channel_nr.eq(input_stream.channel_nr),
|
||||
self.lower_channel_stream_out.first.eq(input_stream.first),
|
||||
self.lower_channel_stream_out.last.eq(input_stream.channel_nr == (self.no_lower_channels - 1)),
|
||||
self.lower_channel_stream_out.valid.eq(1),
|
||||
]
|
||||
with m.Else():
|
||||
m.d.comb += [
|
||||
self.upper_channel_stream_out.payload.eq(input_stream.payload),
|
||||
self.upper_channel_stream_out.channel_nr.eq(input_stream.channel_nr - self.no_lower_channels),
|
||||
self.upper_channel_stream_out.first.eq(input_stream.channel_nr == self.no_lower_channels),
|
||||
self.upper_channel_stream_out.last.eq(input_stream.last),
|
||||
self.upper_channel_stream_out.valid.eq(1),
|
||||
]
|
||||
|
||||
return m
|
||||
|
||||
class ChannelStreamSplitterTest(GatewareTestCase):
|
||||
FRAGMENT_UNDER_TEST = ChannelStreamSplitter
|
||||
FRAGMENT_ARGUMENTS = dict(no_lower_channels=32, no_upper_channels=6, test=True)
|
||||
|
||||
def send_frame(self, sample: int, channel: int, wait=False):
|
||||
yield self.dut.combined_channel_stream_in.channel_nr.eq(channel)
|
||||
yield self.dut.combined_channel_stream_in.payload.eq(sample)
|
||||
yield self.dut.combined_channel_stream_in.valid.eq(1)
|
||||
yield self.dut.combined_channel_stream_in.first.eq(channel == 0)
|
||||
yield self.dut.combined_channel_stream_in.last.eq(channel == 35)
|
||||
yield
|
||||
yield self.dut.combined_channel_stream_in.valid.eq(0)
|
||||
if wait:
|
||||
yield
|
||||
|
||||
@sync_test_case
|
||||
def test_smoke(self):
|
||||
dut = self.dut
|
||||
yield
|
||||
channels = list(range(36))
|
||||
yield from self.advance_cycles(3)
|
||||
|
||||
yield self.dut.lower_channel_stream_out.ready.eq(1)
|
||||
yield self.dut.upper_channel_stream_out.ready.eq(1)
|
||||
|
||||
for channel in channels:
|
||||
yield from self.send_frame(channel, channel)
|
||||
yield from self.advance_cycles(3)
|
||||
|
||||
|
||||
for channel in channels[:20]:
|
||||
yield from self.send_frame(channel, channel)
|
||||
yield self.dut.lower_channel_stream_out.ready.eq(0)
|
||||
yield from self.send_frame(channels[20], channels[20])
|
||||
yield self.dut.lower_channel_stream_out.ready.eq(1)
|
||||
for channel in channels[20:32]:
|
||||
yield from self.send_frame(channel, channel)
|
||||
yield
|
||||
for channel in channels[32:34]:
|
||||
yield from self.send_frame(channel, channel)
|
||||
yield self.dut.upper_channel_stream_out.ready.eq(0)
|
||||
yield from self.send_frame(channels[34], channels[34])
|
||||
yield self.dut.upper_channel_stream_out.ready.eq(1)
|
||||
for channel in channels[34:]:
|
||||
yield from self.send_frame(channel, channel)
|
||||
yield
|
||||
|
||||
63
gateware/channels_to_usb_stream.gtkw
Normal file
63
gateware/channels_to_usb_stream.gtkw
Normal file
@@ -0,0 +1,63 @@
|
||||
[*]
|
||||
[*] GTKWave Analyzer v3.4.0 (w)1999-2022 BSI
|
||||
[*] Wed Jan 19 00:02:36 2022
|
||||
[*]
|
||||
[dumpfile] "test_ChannelsToUSBStreamTest_test_smoke.vcd"
|
||||
[dumpfile_mtime] "Tue Jan 18 23:57:47 2022"
|
||||
[dumpfile_size] 44363
|
||||
[savefile] "channels_to_usb_stream.gtkw"
|
||||
[timestart] 0
|
||||
[size] 3828 2090
|
||||
[pos] -1921 27
|
||||
*-16.270115 48200 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
|
||||
[treeopen] bench.
|
||||
[treeopen] bench.top.
|
||||
[treeopen] bench.top.out_fifo.
|
||||
[sst_width] 447
|
||||
[signals_width] 495
|
||||
[sst_expanded] 1
|
||||
[sst_vpaned_height] 650
|
||||
@28
|
||||
bench.top.clk
|
||||
bench.top.channel_stream__ready
|
||||
bench.top.channel_stream__valid
|
||||
@22
|
||||
bench.top.channel_stream__payload[23:0]
|
||||
@24
|
||||
bench.top.channel_stream__channel_nr[2:0]
|
||||
@22
|
||||
bench.top.no_channels_in[3:0]
|
||||
@28
|
||||
bench.top.data_requested_in
|
||||
@200
|
||||
-Channels To USB
|
||||
@28
|
||||
bench.top.current_byte[1:0]
|
||||
bench.top.current_channel[2:0]
|
||||
@22
|
||||
bench.top.current_sample[31:0]
|
||||
@28
|
||||
bench.top.usb_byte_pos[1:0]
|
||||
bench.top.feeder_state
|
||||
@200
|
||||
-Output FIFO
|
||||
@28
|
||||
bench.top.fifo_full
|
||||
bench.top.fifo_level_insufficient
|
||||
bench.top.fifo_level_sufficient
|
||||
bench.top.fifo_postprocess_state
|
||||
@200
|
||||
-USB Stream
|
||||
@28
|
||||
bench.top.skipping
|
||||
bench.top.filling
|
||||
bench.top.usb_byte_pos[1:0]
|
||||
bench.top.usb_channel[2:0]
|
||||
@22
|
||||
bench.top.usb_stream__payload[7:0]
|
||||
@29
|
||||
bench.top.usb_stream__valid
|
||||
@28
|
||||
bench.top.usb_stream__ready
|
||||
[pattern_trace] 1
|
||||
[pattern_trace] 0
|
||||
293
gateware/channels_to_usb_stream.py
Normal file
293
gateware/channels_to_usb_stream.py
Normal file
@@ -0,0 +1,293 @@
|
||||
from amaranth import *
|
||||
from amaranth.build import Platform
|
||||
from amaranth.lib.fifo import SyncFIFO
|
||||
from amlib.stream import StreamInterface, connect_fifo_to_stream
|
||||
from amlib.test import GatewareTestCase, sync_test_case
|
||||
|
||||
class ChannelsToUSBStream(Elaboratable):
|
||||
def __init__(self, max_nr_channels=2, sample_width=24, max_packet_size=256):
|
||||
assert sample_width in [16, 24, 32]
|
||||
|
||||
# parameters
|
||||
self._max_nr_channels = max_nr_channels
|
||||
self._channel_bits = Shape.cast(range(max_nr_channels)).width
|
||||
self._sample_width = sample_width
|
||||
self._fifo_depth = 2 * max_packet_size
|
||||
|
||||
# ports
|
||||
self.no_channels_in = Signal(self._channel_bits + 1)
|
||||
self.channel_stream_in = StreamInterface(name="channel_stream", payload_width=self._sample_width, extra_fields=[("channel_nr", self._channel_bits)])
|
||||
self.usb_stream_out = StreamInterface(name="usb_stream")
|
||||
self.audio_in_active = Signal()
|
||||
self.data_requested_in = Signal()
|
||||
self.frame_finished_in = Signal()
|
||||
|
||||
# debug signals
|
||||
self.feeder_state = Signal()
|
||||
self.current_channel = Signal(self._channel_bits)
|
||||
self.level = Signal(range(self._fifo_depth + 1))
|
||||
self.fifo_read = Signal()
|
||||
self.fifo_full = Signal()
|
||||
self.fifo_level_insufficient = Signal()
|
||||
self.done = Signal.like(self.level)
|
||||
self.out_channel = Signal(self._channel_bits)
|
||||
self.usb_channel = Signal.like(self.out_channel)
|
||||
self.usb_byte_pos = Signal.like(2)
|
||||
self.skipping = Signal()
|
||||
self.filling = Signal()
|
||||
|
||||
def elaborate(self, platform: Platform) -> Module:
|
||||
m = Module()
|
||||
m.submodules.out_fifo = out_fifo = SyncFIFO(width=8 + self._channel_bits, depth=self._fifo_depth, fwft=True)
|
||||
|
||||
channel_stream = self.channel_stream_in
|
||||
channel_valid = Signal()
|
||||
channel_ready = Signal()
|
||||
|
||||
out_valid = Signal()
|
||||
out_stream_ready = Signal()
|
||||
|
||||
# latch packet start and end
|
||||
first_packet_seen = Signal()
|
||||
frame_finished_seen = Signal()
|
||||
|
||||
with m.If(self.data_requested_in):
|
||||
m.d.sync += [
|
||||
first_packet_seen.eq(1),
|
||||
frame_finished_seen.eq(0),
|
||||
]
|
||||
|
||||
with m.If(self.frame_finished_in):
|
||||
m.d.sync += [
|
||||
frame_finished_seen.eq(1),
|
||||
first_packet_seen.eq(0),
|
||||
]
|
||||
|
||||
m.d.comb += [
|
||||
self.usb_stream_out.payload.eq(out_fifo.r_data[:8]),
|
||||
self.out_channel.eq(out_fifo.r_data[8:]),
|
||||
self.usb_stream_out.valid.eq(out_valid),
|
||||
out_stream_ready.eq(self.usb_stream_out.ready),
|
||||
channel_valid.eq(channel_stream.valid),
|
||||
channel_stream.ready.eq(channel_ready),
|
||||
self.level.eq(out_fifo.r_level),
|
||||
self.fifo_full.eq(self.level >= (self._fifo_depth - 4)),
|
||||
self.fifo_read.eq(out_fifo.r_en),
|
||||
]
|
||||
|
||||
with m.If(self.usb_stream_out.valid & self.usb_stream_out.ready):
|
||||
m.d.sync += self.done.eq(self.done + 1)
|
||||
|
||||
with m.If(self.data_requested_in):
|
||||
m.d.sync += self.done.eq(0)
|
||||
|
||||
current_sample = Signal(32 if self._sample_width > 16 else 16)
|
||||
current_channel = Signal(self._channel_bits)
|
||||
current_byte = Signal(2 if self._sample_width > 16 else 1)
|
||||
|
||||
m.d.comb += self.current_channel.eq(current_channel),
|
||||
|
||||
bytes_per_sample = 4
|
||||
last_byte_of_sample = bytes_per_sample - 1
|
||||
|
||||
# USB audio still sends 32 bit samples,
|
||||
# even if the descriptor says 24
|
||||
shift = 8 if self._sample_width == 24 else 0
|
||||
|
||||
out_fifo_can_write_sample = Signal()
|
||||
m.d.comb += out_fifo_can_write_sample.eq(
|
||||
out_fifo.w_rdy
|
||||
& (out_fifo.w_level < (out_fifo.depth - bytes_per_sample)))
|
||||
|
||||
# this FSM handles writing into the FIFO
|
||||
with m.FSM(name="fifo_feeder") as fsm:
|
||||
m.d.comb += self.feeder_state.eq(fsm.state)
|
||||
|
||||
with m.State("WAIT"):
|
||||
m.d.comb += channel_ready.eq(out_fifo_can_write_sample)
|
||||
|
||||
# discard all channels above no_channels_in
|
||||
# important for stereo operation
|
||||
with m.If( out_fifo_can_write_sample
|
||||
& channel_valid
|
||||
& (channel_stream.channel_nr < self.no_channels_in)):
|
||||
m.d.sync += [
|
||||
current_sample.eq(channel_stream.payload << shift),
|
||||
current_channel.eq(channel_stream.channel_nr),
|
||||
]
|
||||
m.next = "SEND"
|
||||
|
||||
with m.State("SEND"):
|
||||
m.d.comb += [
|
||||
out_fifo.w_data[:8].eq(current_sample[0:8]),
|
||||
out_fifo.w_data[8:].eq(current_channel),
|
||||
out_fifo.w_en.eq(1),
|
||||
]
|
||||
m.d.sync += [
|
||||
current_byte.eq(current_byte + 1),
|
||||
current_sample.eq(current_sample >> 8),
|
||||
]
|
||||
|
||||
with m.If(current_byte == last_byte_of_sample):
|
||||
m.d.sync += current_byte.eq(0)
|
||||
m.next = "WAIT"
|
||||
|
||||
|
||||
channel_counter = Signal.like(self.no_channels_in)
|
||||
byte_pos = Signal(2)
|
||||
first_byte = byte_pos == 0
|
||||
last_byte = byte_pos == 3
|
||||
|
||||
with m.If(out_valid & out_stream_ready):
|
||||
m.d.sync += byte_pos.eq(byte_pos + 1)
|
||||
|
||||
with m.If(last_byte):
|
||||
m.d.sync += channel_counter.eq(channel_counter + 1)
|
||||
with m.If(channel_counter == (self.no_channels_in - 1)):
|
||||
m.d.sync += channel_counter.eq(0)
|
||||
|
||||
with m.If(self.data_requested_in):
|
||||
m.d.sync += channel_counter.eq(0)
|
||||
|
||||
fifo_level_sufficient = Signal()
|
||||
m.d.comb += [
|
||||
self.usb_channel.eq(channel_counter),
|
||||
self.usb_byte_pos.eq(byte_pos),
|
||||
fifo_level_sufficient.eq(out_fifo.level >= (self.no_channels_in << 2)),
|
||||
self.fifo_level_insufficient.eq(~fifo_level_sufficient),
|
||||
]
|
||||
|
||||
with m.If(self.frame_finished_in):
|
||||
m.d.sync += byte_pos.eq(0)
|
||||
|
||||
# this FSM handles reading fron the FIFO
|
||||
# this FSM provides robustness against
|
||||
# short reads. On next frame all bytes
|
||||
# for nonzero channels will be discarded until
|
||||
# we reach channel 0 again.
|
||||
with m.FSM(name="fifo_postprocess") as fsm:
|
||||
with m.State("NORMAL"):
|
||||
m.d.comb += [
|
||||
out_fifo.r_en.eq(self.usb_stream_out.ready),
|
||||
out_valid.eq(out_fifo.r_rdy)
|
||||
]
|
||||
|
||||
with m.If(~self.audio_in_active & out_fifo.r_rdy):
|
||||
m.next = "DISCARD"
|
||||
|
||||
# frame ongoing
|
||||
with m.Elif(~frame_finished_seen):
|
||||
# start filling if there are not enough enough samples buffered
|
||||
# for one channel set of audio samples
|
||||
last_channel = self.out_channel == (self._max_nr_channels - 1)
|
||||
|
||||
with m.If(last_byte & last_channel & ~fifo_level_sufficient):
|
||||
m.next = "FILL"
|
||||
|
||||
with m.If((self.out_channel != channel_counter)):
|
||||
m.d.comb += [
|
||||
out_fifo.r_en.eq(0),
|
||||
self.usb_stream_out.payload.eq(0),
|
||||
out_valid.eq(1),
|
||||
self.filling.eq(1),
|
||||
]
|
||||
|
||||
# frame finished: discard extraneous samples
|
||||
with m.Else():
|
||||
with m.If(out_fifo.r_rdy & (self.out_channel != 0)):
|
||||
m.d.comb += [
|
||||
out_fifo.r_en.eq(1),
|
||||
out_valid.eq(0),
|
||||
]
|
||||
m.d.sync += [
|
||||
frame_finished_seen.eq(0),
|
||||
byte_pos.eq(0),
|
||||
]
|
||||
m.next = "DISCARD"
|
||||
|
||||
with m.State("DISCARD"):
|
||||
with m.If(out_fifo.r_rdy):
|
||||
m.d.comb += [
|
||||
out_fifo.r_en.eq(1),
|
||||
out_valid.eq(0),
|
||||
self.skipping.eq(1),
|
||||
]
|
||||
with m.If(self.audio_in_active & (self.out_channel == 0)):
|
||||
m.d.comb += out_fifo.r_en.eq(0)
|
||||
m.next = "NORMAL"
|
||||
|
||||
with m.State("FILL"):
|
||||
channel_is_ok = fifo_level_sufficient & (self.out_channel == channel_counter)
|
||||
with m.If(self.frame_finished_in | channel_is_ok):
|
||||
m.next = "NORMAL"
|
||||
with m.Else():
|
||||
m.d.comb += [
|
||||
out_fifo.r_en.eq(0),
|
||||
self.usb_stream_out.payload.eq(0),
|
||||
out_valid.eq(1),
|
||||
self.filling.eq(1),
|
||||
]
|
||||
|
||||
return m
|
||||
|
||||
|
||||
class ChannelsToUSBStreamTest(GatewareTestCase):
|
||||
FRAGMENT_UNDER_TEST = ChannelsToUSBStream
|
||||
FRAGMENT_ARGUMENTS = dict(max_nr_channels=8)
|
||||
|
||||
def send_one_frame(self, sample: int, channel: int, wait=True):
|
||||
yield self.dut.channel_stream_in.channel_nr.eq(channel)
|
||||
yield self.dut.channel_stream_in.payload.eq(sample)
|
||||
yield self.dut.channel_stream_in.valid.eq(1)
|
||||
yield
|
||||
if wait:
|
||||
yield
|
||||
yield
|
||||
yield
|
||||
|
||||
@sync_test_case
|
||||
def test_smoke(self):
|
||||
dut = self.dut
|
||||
yield dut.usb_stream_out.ready.eq(0)
|
||||
yield dut.frame_finished_in.eq(1)
|
||||
yield
|
||||
yield dut.frame_finished_in.eq(0)
|
||||
yield
|
||||
yield
|
||||
yield
|
||||
yield
|
||||
yield
|
||||
yield
|
||||
yield dut.usb_stream_out.ready.eq(1)
|
||||
yield from self.send_one_frame(0x030201, 0, wait=False)
|
||||
yield from self.send_one_frame(0x131211, 1)
|
||||
yield from self.send_one_frame(0x232221, 2)
|
||||
yield from self.send_one_frame(0x333231, 3)
|
||||
# source stream stalls, see if we wait
|
||||
yield dut.channel_stream_in.valid.eq(0)
|
||||
for _ in range(7): yield
|
||||
yield from self.send_one_frame(0x434241, 4)
|
||||
yield from self.send_one_frame(0x535251, 5)
|
||||
yield from self.send_one_frame(0x636261, 6)
|
||||
yield from self.send_one_frame(0x737271, 7, wait=False)
|
||||
# out stream quits early, see if it
|
||||
# consumes extraneous bytes
|
||||
yield dut.usb_stream_out.ready.eq(0)
|
||||
yield
|
||||
for _ in range(15): yield
|
||||
yield dut.frame_finished_in.eq(1)
|
||||
yield
|
||||
yield dut.frame_finished_in.eq(0)
|
||||
for _ in range(35): yield
|
||||
yield from self.send_one_frame(0x030201, 0)
|
||||
yield from self.send_one_frame(0x131211, 1)
|
||||
yield dut.usb_stream_out.ready.eq(1)
|
||||
yield from self.send_one_frame(0x232221, 2)
|
||||
yield from self.send_one_frame(0x333231, 3)
|
||||
yield from self.send_one_frame(0x434241, 4)
|
||||
yield from self.send_one_frame(0x535251, 5)
|
||||
yield from self.send_one_frame(0x636261, 6)
|
||||
yield from self.send_one_frame(0x737271, 7)
|
||||
yield dut.channel_stream_in.valid.eq(0)
|
||||
yield
|
||||
for _ in range(45): yield
|
||||
587
gateware/debug.py
Normal file
587
gateware/debug.py
Normal file
@@ -0,0 +1,587 @@
|
||||
from amaranth import *
|
||||
from amaranth.lib.cdc import FFSynchronizer, PulseSynchronizer
|
||||
|
||||
from amlib.debug.ila import StreamILA, ILACoreParameters
|
||||
from amlib.stream import StreamInterface
|
||||
from amlib.io.led import NumberToBitBar
|
||||
from amlib.io.max7219 import SerialLEDArray
|
||||
|
||||
from luna.gateware.usb.usb2.endpoints.stream import USBMultibyteStreamInEndpoint
|
||||
|
||||
def add_debug_led_array(v):
|
||||
self = v['self']
|
||||
m = v['m']
|
||||
platform = v['platform']
|
||||
channels_to_usb1_stream = v['channels_to_usb1_stream']
|
||||
input_to_usb_fifo = v['input_to_usb_fifo']
|
||||
usb1_to_output_fifo_level = v['usb1_to_output_fifo_level']
|
||||
usb1_to_output_fifo_depth = v['usb1_to_output_fifo_depth']
|
||||
usb2_to_usb1_fifo_level = v['usb2_to_usb1_fifo_level']
|
||||
usb2_to_usb1_fifo_depth = v['usb2_to_usb1_fifo_depth']
|
||||
channels_to_usb2_stream = v['channels_to_usb2_stream']
|
||||
usb2_audio_out_active = v['usb2_audio_out_active']
|
||||
usb2_audio_in_active = v['usb2_audio_in_active']
|
||||
bundle_multiplexer = v['bundle_multiplexer']
|
||||
adat_transmitters = v['adat_transmitters']
|
||||
usb1_to_usb2_midi_fifo = v['usb1_to_usb2_midi_fifo']
|
||||
usb2_to_usb1_midi_fifo = v['usb2_to_usb1_midi_fifo']
|
||||
usb_midi_fifo_depth = v['usb_midi_fifo_depth']
|
||||
|
||||
|
||||
adat1_underflow_count = Signal(16)
|
||||
with m.If(adat_transmitters[0].underflow_out):
|
||||
m.d.sync += adat1_underflow_count.eq(adat1_underflow_count + 1)
|
||||
|
||||
spi = platform.request("spi")
|
||||
m.submodules.led_display = led_display = SerialLEDArray(divisor=10, init_delay=24e6, no_modules=2)
|
||||
|
||||
rx_level_bars = []
|
||||
for i in range(1, 5):
|
||||
rx_level_bar = NumberToBitBar(0, bundle_multiplexer.FIFO_DEPTH, 8)
|
||||
setattr(m.submodules, f"rx{i}_level_bar", rx_level_bar)
|
||||
m.d.comb += rx_level_bar.value_in.eq(bundle_multiplexer.levels[i - 1])
|
||||
rx_level_bars.append(rx_level_bar)
|
||||
|
||||
m.submodules.in_bar = in_to_usb_fifo_bar = NumberToBitBar(0, self.INPUT_CDC_FIFO_DEPTH, 8)
|
||||
m.submodules.in_fifo_bar = channels_to_usb_bar = NumberToBitBar(0, 2 * self.USB1_MAX_PACKET_SIZE, 8)
|
||||
m.submodules.out_fifo_bar = out_fifo_bar = NumberToBitBar(0, usb1_to_output_fifo_depth, 8)
|
||||
|
||||
m.d.comb += [
|
||||
# LED bar displays
|
||||
in_to_usb_fifo_bar.value_in.eq(input_to_usb_fifo.r_level),
|
||||
channels_to_usb_bar.value_in.eq(channels_to_usb1_stream.level >> 3),
|
||||
out_fifo_bar.value_in.eq(usb1_to_output_fifo_level >> 1),
|
||||
|
||||
*[led_display.digits_in[i].eq(Cat(reversed(rx_level_bars[i].bitbar_out))) for i in range(4)],
|
||||
led_display.digits_in[4].eq(Cat(reversed(in_to_usb_fifo_bar.bitbar_out))),
|
||||
led_display.digits_in[5].eq(Cat(reversed(channels_to_usb_bar.bitbar_out))),
|
||||
led_display.digits_in[6].eq(Cat(reversed(out_fifo_bar.bitbar_out))),
|
||||
led_display.digits_in[7].eq(adat1_underflow_count),
|
||||
]
|
||||
|
||||
usb2 = lambda x: 8 + x
|
||||
|
||||
m.submodules.usb2_output_fifo_bar = usb2_output_fifo_bar = NumberToBitBar(0, usb2_to_usb1_fifo_depth, 8)
|
||||
m.submodules.usb2_input_fifo_bar = usb2_input_fifo_bar = NumberToBitBar(0, channels_to_usb2_stream._fifo_depth, 8)
|
||||
m.submodules.usb2_to_usb1_bar = usb2_to_usb1_bar = NumberToBitBar(0, usb_midi_fifo_depth, 8)
|
||||
m.submodules.usb1_to_usb2_bar = usb1_to_usb2_bar = NumberToBitBar(0, usb_midi_fifo_depth, 8)
|
||||
|
||||
m.d.comb += [
|
||||
usb2_output_fifo_bar.value_in.eq(usb2_to_usb1_fifo_level),
|
||||
usb2_input_fifo_bar.value_in.eq(channels_to_usb2_stream.level),
|
||||
led_display.digits_in[usb2(0)][0].eq(usb2_audio_out_active),
|
||||
led_display.digits_in[usb2(0)][7].eq(usb2_audio_in_active),
|
||||
led_display.digits_in[usb2(1)].eq(Cat(usb2_output_fifo_bar.bitbar_out)),
|
||||
led_display.digits_in[usb2(2)].eq(Cat(reversed(usb2_input_fifo_bar.bitbar_out))),
|
||||
led_display.digits_in[usb2(3)].eq(usb2_to_usb1_bar.bitbar_out),
|
||||
led_display.digits_in[usb2(4)].eq(usb1_to_usb2_bar.bitbar_out),
|
||||
]
|
||||
|
||||
m.d.comb += [
|
||||
*led_display.connect_to_resource(spi),
|
||||
led_display.valid_in.eq(1),
|
||||
]
|
||||
|
||||
|
||||
def setup_ila(v, ila_max_packet_size, use_convolution):
|
||||
examined_usb = "usb1"
|
||||
m = v['m']
|
||||
usb1_sof_counter = v['usb1_sof_counter']
|
||||
usb1 = v['usb1']
|
||||
|
||||
usb1_ep3_in = v['usb1_ep3_in']
|
||||
usb1_ep3_out = v['usb1_ep3_out']
|
||||
usb2_ep3_in = v['usb2_ep3_in']
|
||||
usb2_ep3_out = v['usb2_ep3_out']
|
||||
ep1_out = v[f'{examined_usb}_ep1_out']
|
||||
ep2_in = v[f'{examined_usb}_ep2_in']
|
||||
channels_to_usb_stream = v[f'channels_to_{examined_usb}_stream']
|
||||
usb_to_channel_stream = v[f'{examined_usb}_to_channel_stream']
|
||||
|
||||
usb1_audio_in_active = v['usb1_audio_in_active']
|
||||
usb2_audio_out_active = v['usb2_audio_out_active']
|
||||
|
||||
input_to_usb_fifo = v['input_to_usb_fifo']
|
||||
usb1_to_output_fifo = v['usb1_to_output_fifo']
|
||||
usb1_to_output_fifo_level = v['usb1_to_output_fifo_level']
|
||||
usb1_to_output_fifo_depth = v['usb1_to_output_fifo_depth']
|
||||
|
||||
audio_in_frame_bytes = v['usb2_audio_in_frame_bytes']
|
||||
min_fifo_level = v['min_fifo_level']
|
||||
max_fifo_level = v['max_fifo_level']
|
||||
adat_transmitters = v['adat_transmitters']
|
||||
adat_receivers = v['adat_receivers']
|
||||
bundle_demultiplexer = v['bundle_demultiplexer']
|
||||
bundle_multiplexer = v['bundle_multiplexer']
|
||||
usb1_channel_stream_combiner = v['usb1_channel_stream_combiner']
|
||||
usb1_channel_stream_splitter = v['usb1_channel_stream_splitter']
|
||||
|
||||
usb1_to_usb2_midi_fifo = v['usb1_to_usb2_midi_fifo']
|
||||
usb2_to_usb1_midi_fifo = v['usb2_to_usb1_midi_fifo']
|
||||
|
||||
dac1_extractor = v['dac1_extractor']
|
||||
dac1 = v['dac1']
|
||||
convolver = v['convolver']
|
||||
enable_convolver = v['enable_convolver']
|
||||
|
||||
adat_clock = Signal()
|
||||
m.d.comb += adat_clock.eq(ClockSignal("adat"))
|
||||
sof_wrap = Signal()
|
||||
m.d.comb += sof_wrap.eq(usb1_sof_counter == 0)
|
||||
|
||||
usb_packet_counter = Signal(10)
|
||||
with m.If(ep1_out.stream.valid & ep1_out.stream.ready):
|
||||
m.d.usb += usb_packet_counter.eq(usb_packet_counter + 1)
|
||||
with m.If(ep1_out.stream.last):
|
||||
m.d.usb += usb_packet_counter.eq(0)
|
||||
|
||||
weird_packet = Signal()
|
||||
m.d.comb += weird_packet.eq(ep1_out.stream.last & (
|
||||
usb_packet_counter[0:2] != Const(0b11, 2)
|
||||
))
|
||||
|
||||
strange_input = Signal()
|
||||
input_active = Signal()
|
||||
output_active = Signal()
|
||||
input_or_output_active = Signal()
|
||||
garbage = Signal()
|
||||
usb_frame_borders = Signal()
|
||||
|
||||
m.d.comb += [
|
||||
input_active.eq ( channels_to_usb_stream.channel_stream_in.ready
|
||||
& channels_to_usb_stream.channel_stream_in.valid),
|
||||
output_active.eq( channels_to_usb_stream.usb_stream_out.ready
|
||||
& channels_to_usb_stream.usb_stream_out.valid),
|
||||
input_or_output_active.eq(input_active | output_active),
|
||||
|
||||
strange_input.eq( (channels_to_usb_stream.channel_stream_in.payload != 0)
|
||||
& (channels_to_usb_stream.channel_stream_in.channel_nr > 1)),
|
||||
garbage.eq(channels_to_usb_stream.skipping | channels_to_usb_stream.filling),
|
||||
usb_frame_borders.eq(ep2_in.data_requested | ep2_in.frame_finished),
|
||||
]
|
||||
|
||||
fill_count = Signal(16)
|
||||
with m.If(channels_to_usb_stream.filling):
|
||||
m.d.usb += fill_count.eq(fill_count + 1)
|
||||
|
||||
channels_to_usb_input_frame = [
|
||||
usb1.sof_detected,
|
||||
input_to_usb_fifo.r_level,
|
||||
channels_to_usb_stream.channel_stream_in.channel_nr,
|
||||
channels_to_usb_stream.channel_stream_in.first,
|
||||
channels_to_usb_stream.channel_stream_in.last,
|
||||
input_active,
|
||||
#channels_to_usb_stream.channel_stream_in.payload,
|
||||
]
|
||||
|
||||
weird_frame_size = Signal()
|
||||
usb_outputting = Signal()
|
||||
m.d.comb += usb_outputting.eq(ep1_out.stream.valid & ep1_out.stream.ready)
|
||||
|
||||
usb_out_level_maxed = Signal()
|
||||
m.d.comb += usb_out_level_maxed.eq(usb1_to_output_fifo_level >= (usb1_to_output_fifo_depth - 1))
|
||||
|
||||
m.d.comb += weird_frame_size.eq((audio_in_frame_bytes & 0b11) != 0)
|
||||
|
||||
channels_to_usb_debug = [
|
||||
usb2_audio_out_active,
|
||||
audio_in_frame_bytes,
|
||||
channels_to_usb_stream.current_channel,
|
||||
channels_to_usb_stream.channel_stream_in.ready,
|
||||
channels_to_usb_stream.level,
|
||||
channels_to_usb_stream.fifo_full,
|
||||
channels_to_usb_stream.fifo_level_insufficient,
|
||||
channels_to_usb_stream.out_channel,
|
||||
channels_to_usb_stream.fifo_read,
|
||||
channels_to_usb_stream.usb_channel,
|
||||
channels_to_usb_stream.done,
|
||||
channels_to_usb_stream.usb_byte_pos,
|
||||
channels_to_usb_stream.skipping,
|
||||
channels_to_usb_stream.filling,
|
||||
ep2_in.data_requested,
|
||||
ep2_in.frame_finished,
|
||||
channels_to_usb_stream.usb_stream_out.valid,
|
||||
channels_to_usb_stream.usb_stream_out.ready,
|
||||
channels_to_usb_stream.usb_stream_out.first,
|
||||
channels_to_usb_stream.usb_stream_out.last,
|
||||
channels_to_usb_stream.usb_stream_out.payload,
|
||||
]
|
||||
|
||||
usb_out_debug = [
|
||||
usb_to_channel_stream.channel_stream_out.payload,
|
||||
usb_to_channel_stream.channel_stream_out.channel_nr,
|
||||
usb_to_channel_stream.channel_stream_out.first,
|
||||
usb_to_channel_stream.channel_stream_out.last,
|
||||
#usb1_to_output_fifo_level,
|
||||
#usb_out_level_maxed
|
||||
]
|
||||
|
||||
usb_channel_outputting = Signal()
|
||||
m.d.comb += usb_channel_outputting.eq(
|
||||
usb_out_level_maxed |
|
||||
usb_to_channel_stream.channel_stream_out.first |
|
||||
usb_to_channel_stream.channel_stream_out.last |
|
||||
( usb_to_channel_stream.channel_stream_out.ready &
|
||||
usb_to_channel_stream.channel_stream_out.valid)
|
||||
)
|
||||
|
||||
ep1_out_fifo_debug = [
|
||||
audio_in_frame_bytes,
|
||||
min_fifo_level,
|
||||
usb1_to_output_fifo_level,
|
||||
max_fifo_level,
|
||||
usb1.sof_detected,
|
||||
]
|
||||
|
||||
adat_nr = 0
|
||||
receiver_debug = [
|
||||
adat_receivers[adat_nr].sample_out,
|
||||
adat_receivers[adat_nr].addr_out,
|
||||
adat_receivers[adat_nr].output_enable,
|
||||
#adat_receivers[adat_nr].recovered_clock_out,
|
||||
]
|
||||
|
||||
adat_first = Signal()
|
||||
m.d.comb += adat_first.eq(adat_receivers[adat_nr].output_enable & (adat_receivers[adat_nr].addr_out == 0))
|
||||
adat_clock = Signal()
|
||||
m.d.comb += adat_clock.eq(ClockSignal("adat"))
|
||||
|
||||
adat_debug = [
|
||||
adat_clock,
|
||||
adat_transmitters[adat_nr].adat_out,
|
||||
adat_receivers[adat_nr].recovered_clock_out,
|
||||
adat_receivers[adat_nr].adat_in,
|
||||
adat_first,
|
||||
adat_receivers[adat_nr].output_enable,
|
||||
]
|
||||
|
||||
adat_transmitter_debug = [
|
||||
adat_clock,
|
||||
bundle_demultiplexer.bundles_out[adat_nr].channel_nr,
|
||||
adat_transmitters[adat_nr].sample_in,
|
||||
adat_transmitters[adat_nr].valid_in,
|
||||
adat_transmitters[adat_nr].last_in,
|
||||
adat_transmitters[adat_nr].ready_out,
|
||||
adat_transmitters[adat_nr].fifo_level_out,
|
||||
adat_transmitters[adat_nr].underflow_out,
|
||||
adat_transmitters[adat_nr].adat_out,
|
||||
]
|
||||
|
||||
bundle0_active = Signal()
|
||||
bundle3_active = Signal()
|
||||
bundle_multiplexer_active = Signal()
|
||||
multiplexer_enable = Signal()
|
||||
|
||||
m.d.comb += [
|
||||
bundle0_active.eq((bundle_multiplexer.bundles_in[0].valid &
|
||||
bundle_multiplexer.bundles_in[0].ready)),
|
||||
bundle3_active.eq((bundle_multiplexer.bundles_in[3].valid &
|
||||
bundle_multiplexer.bundles_in[3].ready)),
|
||||
bundle_multiplexer_active.eq((bundle_multiplexer.channel_stream_out.valid &
|
||||
bundle_multiplexer.channel_stream_out.ready)),
|
||||
multiplexer_enable.eq(bundle0_active | bundle3_active | bundle_multiplexer_active),
|
||||
]
|
||||
|
||||
multiplexer_debug = [
|
||||
bundle_multiplexer.current_bundle,
|
||||
bundle_multiplexer.last_bundle,
|
||||
bundle0_active,
|
||||
#bundle_multiplexer.bundles_in[0].payload,
|
||||
bundle_multiplexer.bundles_in[0].channel_nr,
|
||||
bundle_multiplexer.bundles_in[0].last,
|
||||
bundle3_active,
|
||||
#bundle_multiplexer.bundles_in[3].payload,
|
||||
bundle_multiplexer.bundles_in[3].channel_nr,
|
||||
bundle_multiplexer.bundles_in[3].last,
|
||||
#bundle_multiplexer.channel_stream_out.payload,
|
||||
bundle_multiplexer_active,
|
||||
bundle_multiplexer.channel_stream_out.channel_nr,
|
||||
bundle_multiplexer.channel_stream_out.last,
|
||||
input_to_usb_fifo.w_level,
|
||||
]
|
||||
|
||||
demultiplexer_debug = [
|
||||
bundle_demultiplexer.channel_stream_in.ready,
|
||||
bundle_demultiplexer.channel_stream_in.valid,
|
||||
bundle_demultiplexer.channel_stream_in.channel_nr,
|
||||
#bundle_demultiplexer.channel_stream_in.payload,
|
||||
*[bundle_demultiplexer.bundles_out[i].ready for i in range(4)],
|
||||
*[bundle_demultiplexer.bundles_out[i].valid for i in range(4)],
|
||||
*[bundle_demultiplexer.bundles_out[i].channel_nr for i in range(4)],
|
||||
]
|
||||
|
||||
demultiplexer_enable = Signal()
|
||||
m.d.comb += demultiplexer_enable.eq(
|
||||
(bundle_demultiplexer.bundles_out[0].valid &
|
||||
bundle_demultiplexer.bundles_out[0].ready) |
|
||||
(bundle_demultiplexer.bundles_out[3].valid &
|
||||
bundle_demultiplexer.bundles_out[3].ready) |
|
||||
(bundle_demultiplexer.channel_stream_in.valid &
|
||||
bundle_demultiplexer.channel_stream_in.ready)
|
||||
)
|
||||
|
||||
levels = [
|
||||
input_to_usb_fifo.r_level,
|
||||
channels_to_usb_stream.level,
|
||||
]
|
||||
|
||||
adat_transmit_count = Signal(8)
|
||||
adat_transmit_frames = Signal.like(adat_transmit_count)
|
||||
adat_receiver0_count = Signal.like(adat_transmit_count)
|
||||
adat_receiver0_frames = Signal.like(adat_transmit_count)
|
||||
adat_receiver3_count = Signal.like(adat_transmit_count)
|
||||
adat_receiver3_frames = Signal.like(adat_transmit_count)
|
||||
adat_multiplexer_count = Signal.like(adat_transmit_count)
|
||||
adat_multiplexer_frames = Signal.like(adat_transmit_count)
|
||||
adat_channels2usb_count = Signal.like(adat_transmit_count)
|
||||
adat_channels2usb_frames = Signal.like(adat_transmit_count)
|
||||
usb_receive_frames = Signal.like(adat_transmit_count)
|
||||
|
||||
m.submodules.sof_synchronizer = sof_synchronizer = PulseSynchronizer("usb", "fast")
|
||||
sof_fast = Signal()
|
||||
adat_receiver0_fast = Signal()
|
||||
adat_receiver3_fast = Signal()
|
||||
adat_multiplexer_out_fast = Signal()
|
||||
|
||||
m.d.comb += [
|
||||
sof_synchronizer.i.eq(usb1.sof_detected),
|
||||
sof_fast.eq(sof_synchronizer.o),
|
||||
|
||||
adat_receiver0_fast.eq((adat_receivers[0].addr_out == 7) & adat_receivers[0].output_enable),
|
||||
adat_receiver3_fast.eq((adat_receivers[3].addr_out == 7) & adat_receivers[3].output_enable),
|
||||
adat_multiplexer_out_fast.eq(bundle_multiplexer.channel_stream_out.ready & bundle_multiplexer.channel_stream_out.valid & bundle_multiplexer.channel_stream_out.last),
|
||||
]
|
||||
|
||||
with m.If(sof_fast):
|
||||
m.d.fast += [
|
||||
adat_receiver0_frames.eq(adat_receiver0_count),
|
||||
adat_receiver0_count.eq(0),
|
||||
adat_receiver3_frames.eq(adat_receiver3_count),
|
||||
adat_receiver3_count.eq(0),
|
||||
adat_multiplexer_frames.eq(adat_multiplexer_count),
|
||||
adat_multiplexer_count.eq(0),
|
||||
]
|
||||
|
||||
with m.If(adat_receiver0_fast):
|
||||
m.d.fast += adat_receiver0_count.eq(adat_receiver0_count + 1)
|
||||
|
||||
with m.If(adat_receiver3_fast):
|
||||
m.d.fast += adat_receiver3_count.eq(adat_receiver3_count + 1)
|
||||
|
||||
with m.If(adat_multiplexer_out_fast):
|
||||
m.d.fast += adat_multiplexer_count.eq(adat_multiplexer_count + 1)
|
||||
|
||||
frame_counts = [
|
||||
adat_transmit_frames,
|
||||
adat_receiver0_frames,
|
||||
adat_receiver3_frames,
|
||||
adat_multiplexer_frames,
|
||||
adat_channels2usb_frames,
|
||||
usb_receive_frames,
|
||||
]
|
||||
|
||||
with m.If(channels_to_usb_stream.channel_stream_in.last & channels_to_usb_stream.channel_stream_in.valid & channels_to_usb_stream.channel_stream_in.ready):
|
||||
m.d.usb += adat_channels2usb_count.eq(adat_channels2usb_count + 1)
|
||||
|
||||
with m.If(usb_to_channel_stream.channel_stream_out.last & usb_to_channel_stream.channel_stream_out.valid & usb_to_channel_stream.channel_stream_out.ready):
|
||||
m.d.usb += adat_transmit_count.eq(adat_transmit_count + 1)
|
||||
|
||||
with m.If(usb1.sof_detected):
|
||||
m.d.usb += [
|
||||
adat_transmit_frames.eq(adat_transmit_count),
|
||||
adat_transmit_count.eq(0),
|
||||
adat_channels2usb_frames.eq(adat_channels2usb_count),
|
||||
adat_channels2usb_count.eq(0),
|
||||
usb_receive_frames.eq(audio_in_frame_bytes >> 7),
|
||||
]
|
||||
|
||||
channel_stream_combiner_debug = [
|
||||
#usb1_channel_stream_combiner.lower_channel_stream_in.valid,
|
||||
#usb1_channel_stream_combiner.lower_channel_stream_in.ready,
|
||||
#usb1_channel_stream_combiner.lower_channel_stream_in.payload,
|
||||
#usb1_channel_stream_combiner.lower_channel_stream_in.channel_nr,
|
||||
#usb1_channel_stream_combiner.lower_channel_stream_in.first,
|
||||
#usb1_channel_stream_combiner.lower_channel_stream_in.last,
|
||||
usb2_audio_out_active,
|
||||
usb1_channel_stream_combiner.upper_channel_stream_in.valid,
|
||||
usb1_channel_stream_combiner.upper_channel_stream_in.ready,
|
||||
usb1_channel_stream_combiner.upper_channel_stream_in.payload,
|
||||
usb1_channel_stream_combiner.upper_channel_stream_in.channel_nr,
|
||||
usb1_channel_stream_combiner.upper_channel_stream_in.first,
|
||||
usb1_channel_stream_combiner.upper_channel_stream_in.last,
|
||||
usb1_channel_stream_combiner.upper_channel_counter,
|
||||
usb1_channel_stream_combiner.state,
|
||||
#usb1_channel_stream_combiner.combined_channel_stream_out.valid,
|
||||
#usb1_channel_stream_combiner.combined_channel_stream_out.ready,
|
||||
#usb1_channel_stream_combiner.combined_channel_stream_out.payload,
|
||||
#usb1_channel_stream_combiner.combined_channel_stream_out.channel_nr,
|
||||
#usb1_channel_stream_combiner.combined_channel_stream_out.first,
|
||||
#usb1_channel_stream_combiner.combined_channel_stream_out.last,
|
||||
]
|
||||
|
||||
upper_channel_active = Signal()
|
||||
channel_stream_combiner_active = Signal()
|
||||
m.d.comb += [
|
||||
upper_channel_active.eq(usb1_channel_stream_combiner.upper_channel_stream_in.valid &
|
||||
usb1_channel_stream_combiner.upper_channel_stream_in.ready),
|
||||
channel_stream_combiner_active.eq(
|
||||
upper_channel_active |
|
||||
(usb1_channel_stream_combiner.combined_channel_stream_out.valid &
|
||||
usb1_channel_stream_combiner.combined_channel_stream_out.ready) |
|
||||
(usb1_channel_stream_combiner.lower_channel_stream_in.valid &
|
||||
usb1_channel_stream_combiner.lower_channel_stream_in.ready))
|
||||
]
|
||||
|
||||
channel_stream_splitter_debug = [
|
||||
usb1_channel_stream_splitter.lower_channel_stream_out.valid,
|
||||
usb1_channel_stream_splitter.lower_channel_stream_out.ready,
|
||||
usb1_channel_stream_splitter.lower_channel_stream_out.payload,
|
||||
usb1_channel_stream_splitter.lower_channel_stream_out.channel_nr,
|
||||
usb1_channel_stream_splitter.lower_channel_stream_out.first,
|
||||
usb1_channel_stream_splitter.lower_channel_stream_out.last,
|
||||
usb2_audio_out_active,
|
||||
usb1_channel_stream_splitter.upper_channel_stream_out.valid,
|
||||
usb1_channel_stream_splitter.upper_channel_stream_out.ready,
|
||||
usb1_channel_stream_splitter.upper_channel_stream_out.payload,
|
||||
usb1_channel_stream_splitter.upper_channel_stream_out.channel_nr,
|
||||
usb1_channel_stream_splitter.upper_channel_stream_out.first,
|
||||
usb1_channel_stream_splitter.upper_channel_stream_out.last,
|
||||
usb1_channel_stream_splitter.combined_channel_stream_in.valid,
|
||||
usb1_channel_stream_splitter.combined_channel_stream_in.ready,
|
||||
usb1_channel_stream_splitter.combined_channel_stream_in.payload,
|
||||
usb1_channel_stream_splitter.combined_channel_stream_in.channel_nr,
|
||||
usb1_channel_stream_splitter.combined_channel_stream_in.first,
|
||||
usb1_channel_stream_splitter.combined_channel_stream_in.last,
|
||||
]
|
||||
|
||||
splitter_upper_channel_active = Signal()
|
||||
channel_stream_splitter_active = Signal()
|
||||
m.d.comb += [
|
||||
splitter_upper_channel_active.eq(usb1_channel_stream_splitter.upper_channel_stream_out.valid &
|
||||
usb1_channel_stream_splitter.upper_channel_stream_out.ready),
|
||||
channel_stream_splitter_active.eq(
|
||||
splitter_upper_channel_active |
|
||||
(usb1_channel_stream_splitter.combined_channel_stream_in.valid &
|
||||
usb1_channel_stream_splitter.combined_channel_stream_in.ready) |
|
||||
(usb1_channel_stream_splitter.lower_channel_stream_out.valid &
|
||||
usb1_channel_stream_splitter.lower_channel_stream_out.ready))
|
||||
]
|
||||
|
||||
midi_in_active = Signal()
|
||||
m.d.comb += midi_in_active.eq(usb2_ep3_in.stream.valid & usb2_ep3_in.stream.ready)
|
||||
midi_out_active = Signal()
|
||||
m.d.comb += midi_out_active.eq(usb2_ep3_out.stream.valid & usb2_ep3_out.stream.ready)
|
||||
midi_active = Signal()
|
||||
m.d.comb += midi_active.eq(midi_in_active | midi_out_active)
|
||||
|
||||
midi_out_stream = StreamInterface(name="midi_out")
|
||||
m.d.comb += midi_out_stream.stream_eq(usb2_ep3_out.stream, omit="ready")
|
||||
midi_in_stream = StreamInterface(name="midi_in")
|
||||
m.d.comb += midi_in_stream.stream_eq(usb1_ep3_in.stream, omit="ready")
|
||||
in_ready = Signal()
|
||||
m.d.comb += in_ready.eq(usb1_ep3_in.stream.ready)
|
||||
|
||||
midi_out = [
|
||||
usb2_ep3_out.stream.ready,
|
||||
usb2_ep3_out.stream.valid,
|
||||
midi_out_stream.payload,
|
||||
midi_out_stream.first,
|
||||
midi_out_stream.last,
|
||||
usb2_to_usb1_midi_fifo.r_level,
|
||||
in_ready,
|
||||
midi_in_stream.valid,
|
||||
midi_in_stream.payload,
|
||||
midi_in_stream.first,
|
||||
midi_in_stream.last,
|
||||
]
|
||||
|
||||
dac_extractor_debug = [
|
||||
#dac1_extractor.selected_channel_in,
|
||||
dac1_extractor.level,
|
||||
dac1_extractor.channel_stream_in.channel_nr,
|
||||
#dac1_extractor.channel_stream_in.payload,
|
||||
dac1_extractor.channel_stream_in.valid,
|
||||
#dac1_extractor.channel_stream_out.payload,
|
||||
#dac1_extractor.channel_stream_out.valid,
|
||||
dac1_extractor.channel_stream_out.ready,
|
||||
dac1_extractor.channel_stream_out.first,
|
||||
dac1_extractor.channel_stream_out.last,
|
||||
dac1.underflow_out,
|
||||
dac1.fifo_level_out,
|
||||
enable_convolver,
|
||||
]
|
||||
|
||||
convolver_signal_in_valid = Signal()
|
||||
convolver_signal_in_first = Signal()
|
||||
convolver_signal_in_last = Signal()
|
||||
convolver_signal_in_ready = Signal()
|
||||
convolver_signal_in_payload = Signal(signed(24))
|
||||
convolver_signal_out_valid = Signal()
|
||||
convolver_signal_out_first = Signal()
|
||||
convolver_signal_out_last = Signal()
|
||||
convolver_signal_out_payload = Signal(24)
|
||||
convolver_signal_out_ready = Signal()
|
||||
|
||||
if use_convolution:
|
||||
m.d.comb += [
|
||||
convolver_signal_in_valid.eq(convolver.signal_in.valid),
|
||||
convolver_signal_in_first.eq(convolver.signal_in.first),
|
||||
convolver_signal_in_last.eq(convolver.signal_in.last),
|
||||
convolver_signal_in_payload.eq(convolver.signal_in.payload),
|
||||
convolver_signal_in_ready.eq(convolver.signal_in.ready),
|
||||
convolver_signal_out_valid.eq(convolver.signal_out.valid),
|
||||
convolver_signal_out_first.eq(convolver.signal_out.first),
|
||||
convolver_signal_out_last.eq(convolver.signal_out.last),
|
||||
convolver_signal_out_payload.eq(convolver.signal_out.payload),
|
||||
convolver_signal_out_ready.eq(convolver.signal_out.ready),
|
||||
]
|
||||
|
||||
convolution_debug = [
|
||||
convolver_signal_in_ready,
|
||||
convolver_signal_in_valid,
|
||||
convolver_signal_in_first,
|
||||
convolver_signal_in_last,
|
||||
convolver_signal_in_payload,
|
||||
convolver_signal_out_valid,
|
||||
convolver_signal_out_first,
|
||||
convolver_signal_out_last,
|
||||
convolver_signal_out_payload,
|
||||
convolver_signal_out_ready,
|
||||
dac1_extractor.level,
|
||||
enable_convolver,
|
||||
]
|
||||
|
||||
#
|
||||
# signals to trace
|
||||
#
|
||||
signals = adat_transmitter_debug
|
||||
|
||||
signals_bits = sum([s.width for s in signals])
|
||||
m.submodules.ila = ila = \
|
||||
StreamILA(
|
||||
domain="usb", o_domain="usb",
|
||||
#sample_rate=60e6, # usb domain
|
||||
#sample_rate=48e3 * 256 * 5, # sync domain
|
||||
#sample_rate=48e3 * 256 * 9, # fast domain
|
||||
#sample_rate=25e6 * 29 / 7, # fast domain, ECP5
|
||||
signals=signals,
|
||||
sample_depth = int(10 * 8 * 1024 / signals_bits),
|
||||
samples_pretrigger = 2, #int(78 * 8 * 1024 / signals_bits),
|
||||
with_enable=True)
|
||||
|
||||
stream_ep = USBMultibyteStreamInEndpoint(
|
||||
endpoint_number=4, # EP 4 IN
|
||||
max_packet_size=ila_max_packet_size,
|
||||
byte_width=ila.bytes_per_sample
|
||||
)
|
||||
usb1.add_endpoint(stream_ep)
|
||||
|
||||
m.d.comb += [
|
||||
stream_ep.stream.stream_eq(ila.stream),
|
||||
# ila.enable.eq(input_or_output_active | garbage | usb_frame_borders),
|
||||
ila.trigger.eq(1),
|
||||
ila.enable .eq(input_or_output_active),
|
||||
]
|
||||
|
||||
ILACoreParameters(ila).pickle()
|
||||
|
||||
4
gateware/initialize-python-environment.sh
Executable file
4
gateware/initialize-python-environment.sh
Executable file
@@ -0,0 +1,4 @@
|
||||
#!/bin/bash
|
||||
python3 -m venv venv
|
||||
. venv/bin/activate
|
||||
pip3 install -r requirements.txt
|
||||
134
gateware/platforms.py
Normal file
134
gateware/platforms.py
Normal file
@@ -0,0 +1,134 @@
|
||||
from amaranth import *
|
||||
from amaranth.build import *
|
||||
|
||||
from amaranth_boards.resources import *
|
||||
from amaranth_boards.qmtech_ep4ce import QMTechEP4CEPlatform
|
||||
from amaranth_boards.qmtech_5cefa2 import QMTech5CEFA2Platform
|
||||
from amaranth_boards.qmtech_10cl006 import QMTech10CL006Platform
|
||||
from amaranth_boards.qmtech_xc7a35t import QMTechXC7A35TPlatform
|
||||
from amaranth_boards.colorlight_qmtech import ColorlightQMTechPlatform
|
||||
|
||||
from luna.gateware.platform.core import LUNAPlatform
|
||||
|
||||
from car import ColorlightDomainGenerator, IntelCycloneIVClockDomainGenerator, IntelCycloneVClockDomainGenerator, Xilinx7SeriesClockDomainGenerator
|
||||
from adatface_rev0_baseboard import ADATFaceRev0Baseboard
|
||||
|
||||
class IntelFPGAParameters:
|
||||
QSF_ADDITIONS = r"""
|
||||
set_global_assignment -name OPTIMIZATION_MODE "Aggressive Performance"
|
||||
set_global_assignment -name FITTER_EFFORT "Standard Fit"
|
||||
set_global_assignment -name PHYSICAL_SYNTHESIS_EFFORT "Extra"
|
||||
set_instance_assignment -name DECREASE_INPUT_DELAY_TO_INPUT_REGISTER OFF -to *ulpi*
|
||||
set_instance_assignment -name INCREASE_DELAY_TO_OUTPUT_PIN OFF -to *ulpi*
|
||||
set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL
|
||||
"""
|
||||
|
||||
SDC_ADDITIONS = r"""
|
||||
derive_pll_clocks
|
||||
derive_clock_uncertainty
|
||||
# sync clock domain crossing to ADAT clock domain crossing
|
||||
set_max_delay -from [get_clocks {car|audiopll|auto_generated|pll1|clk[3]}] -to [get_clocks {car|audiopll|auto_generated|pll1|clk[0]}] 5
|
||||
|
||||
# USB to fast clock domain crossing
|
||||
set_max_delay -from [get_clocks {car|mainpll|auto_generated|pll1|clk[0]}] -to [get_clocks {car|fastopll|auto_generated|pll1|clk[0]}] 5
|
||||
"""
|
||||
|
||||
class ADATFaceCycloneV(QMTech5CEFA2Platform, LUNAPlatform):
|
||||
fast_multiplier = 9
|
||||
clock_domain_generator = IntelCycloneVClockDomainGenerator
|
||||
fast_domain_clock_freq = int(48e3 * 256 * fast_multiplier)
|
||||
|
||||
@property
|
||||
def file_templates(self):
|
||||
templates = super().file_templates
|
||||
templates["{{name}}.qsf"] += IntelFPGAParameters.QSF_ADDITIONS
|
||||
templates["{{name}}.sdc"] += IntelFPGAParameters.SDC_ADDITIONS
|
||||
return templates
|
||||
|
||||
def __init__(self):
|
||||
self.resources += ADATFaceRev0Baseboard.resources(Attrs(io_standard="3.3-V LVCMOS"))
|
||||
# swap connector numbers, because on ADATface the connector
|
||||
# names are swapped compared to the QMTech daughterboard
|
||||
self.connectors[0].number = 3
|
||||
self.connectors[1].number = 2
|
||||
super().__init__(standalone=False)
|
||||
|
||||
class ADATFaceCycloneIV(QMTechEP4CEPlatform, LUNAPlatform):
|
||||
fast_multiplier = 9
|
||||
clock_domain_generator = IntelCycloneIVClockDomainGenerator
|
||||
fast_domain_clock_freq = int(48e3 * 256 * fast_multiplier)
|
||||
|
||||
@property
|
||||
def file_templates(self):
|
||||
templates = super().file_templates
|
||||
templates["{{name}}.qsf"] += IntelFPGAParameters.QSF_ADDITIONS
|
||||
templates["{{name}}.sdc"] += IntelFPGAParameters.SDC_ADDITIONS
|
||||
return templates
|
||||
|
||||
def __init__(self):
|
||||
self.resources += ADATFaceRev0Baseboard.resources(Attrs(io_standard="3.3-V LVCMOS"))
|
||||
# swap connector numbers, because on ADATface the connector
|
||||
# names are swapped compared to the QMTech daughterboard
|
||||
self.connectors[0].number = 3
|
||||
self.connectors[1].number = 2
|
||||
super().__init__(no_kluts=55, standalone=False)
|
||||
|
||||
# This is here just for experimental reasons.
|
||||
# right now the design probably would not fit into this device anymore
|
||||
class ADATFaceCyclone10(QMTech10CL006Platform, LUNAPlatform):
|
||||
clock_domain_generator = IntelCycloneIVClockDomainGenerator
|
||||
fast_multiplier = 9
|
||||
fast_domain_clock_freq = int(48e3 * 256 * fast_multiplier)
|
||||
|
||||
@property
|
||||
def file_templates(self):
|
||||
templates = super().file_templates
|
||||
templates["{{name}}.qsf"] += IntelFPGAParameters.QSF_ADDITIONS
|
||||
templates["{{name}}.sdc"] += IntelFPGAParameters.SDC_ADDITIONS
|
||||
return templates
|
||||
|
||||
def __init__(self):
|
||||
self.resources += ADATFaceRev0Baseboard.resources(Attrs(io_standard="3.3-V LVCMOS"))
|
||||
# swap connector numbers, because on ADATface the connector
|
||||
# names are swapped compared to the QMTech daughterboard
|
||||
self.connectors[0].number = 3
|
||||
self.connectors[1].number = 2
|
||||
|
||||
super().__init__(standalone=False)
|
||||
|
||||
class ADATFaceArtix7(QMTechXC7A35TPlatform, LUNAPlatform):
|
||||
clock_domain_generator = Xilinx7SeriesClockDomainGenerator
|
||||
fast_multiplier = 9
|
||||
fast_domain_clock_freq = int(48e3 * 256 * fast_multiplier)
|
||||
|
||||
@property
|
||||
def file_templates(self):
|
||||
templates = super().file_templates
|
||||
return templates
|
||||
|
||||
def __init__(self):
|
||||
self.resources += ADATFaceRev0Baseboard.resources(Attrs(IOSTANDARD="LVCMOS33"))
|
||||
# swap connector numbers, because on ADATface the connector
|
||||
# names are swapped compared to the QMTech daughterboard
|
||||
self.connectors[0].number = 3
|
||||
self.connectors[1].number = 2
|
||||
|
||||
super().__init__(standalone=False)
|
||||
|
||||
class ADATFaceColorlight(ColorlightQMTechPlatform, LUNAPlatform):
|
||||
clock_domain_generator = ColorlightDomainGenerator
|
||||
fast_domain_clock_freq = ColorlightDomainGenerator.FastClockFreq
|
||||
|
||||
@property
|
||||
def file_templates(self):
|
||||
templates = super().file_templates
|
||||
return templates
|
||||
|
||||
def __init__(self):
|
||||
adatface_resources = ADATFaceRev0Baseboard.resources(Attrs(IO_TYPE="LVCMOS33"), colorlight=True)
|
||||
# swap connector numbers, because on ADATface the connector
|
||||
# names are swapped compared to the QMTech daughterboard
|
||||
self.connectors[0].number = 3
|
||||
self.connectors[1].number = 2
|
||||
from amaranth_boards.colorlight_i9 import ColorLightI9Platform
|
||||
super().__init__(colorlight=ColorLightI9Platform, daughterboard=False, extra_resources=adatface_resources)
|
||||
148
gateware/requesthandlers.py
Normal file
148
gateware/requesthandlers.py
Normal file
@@ -0,0 +1,148 @@
|
||||
from enum import IntEnum
|
||||
from amaranth import *
|
||||
from luna.gateware.usb.usb2.request import USBRequestHandler
|
||||
from luna.gateware.stream.generator import StreamSerializer
|
||||
|
||||
from usb_protocol.types import USBRequestType, USBRequestRecipient, USBStandardRequests
|
||||
from usb_protocol.types.descriptors.uac2 import AudioClassSpecificRequestCodes, ClockSourceControlSelectors
|
||||
from luna.gateware.usb.stream import USBInStreamInterface
|
||||
|
||||
from usb_descriptors import USBDescriptors
|
||||
|
||||
class VendorRequests(IntEnum):
|
||||
ILA_STOP_CAPTURE = 0
|
||||
TOGGLE_CONVOLUTION = 1
|
||||
|
||||
class UAC2RequestHandlers(USBRequestHandler):
|
||||
""" request handlers to implement UAC2 functionality. """
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
self.output_interface_altsetting_nr = Signal(3)
|
||||
self.input_interface_altsetting_nr = Signal(3)
|
||||
self.interface_settings_changed = Signal()
|
||||
self.enable_convolution = Signal()
|
||||
|
||||
def elaborate(self, platform):
|
||||
m = Module()
|
||||
|
||||
interface = self.interface
|
||||
setup = self.interface.setup
|
||||
|
||||
m.submodules.transmitter = transmitter = \
|
||||
StreamSerializer(data_length=14, domain="usb", stream_type=USBInStreamInterface, max_length_width=14)
|
||||
|
||||
m.d.usb += self.interface_settings_changed.eq(0)
|
||||
m.d.comb += self.enable_convolution.eq(0)
|
||||
|
||||
#
|
||||
# Class request handlers.
|
||||
#
|
||||
with m.If(setup.type == USBRequestType.STANDARD):
|
||||
with m.If((setup.recipient == USBRequestRecipient.INTERFACE) &
|
||||
(setup.request == USBStandardRequests.SET_INTERFACE)):
|
||||
|
||||
interface_nr = setup.index
|
||||
alt_setting_nr = setup.value
|
||||
|
||||
m.d.usb += [
|
||||
self.output_interface_altsetting_nr.eq(0),
|
||||
self.input_interface_altsetting_nr.eq(0),
|
||||
self.interface_settings_changed.eq(1),
|
||||
]
|
||||
|
||||
with m.Switch(interface_nr):
|
||||
with m.Case(1):
|
||||
m.d.usb += self.output_interface_altsetting_nr.eq(alt_setting_nr)
|
||||
with m.Case(2):
|
||||
m.d.usb += self.input_interface_altsetting_nr.eq(alt_setting_nr)
|
||||
|
||||
# Always ACK the data out...
|
||||
with m.If(interface.rx_ready_for_response):
|
||||
m.d.comb += interface.handshakes_out.ack.eq(1)
|
||||
|
||||
# ... and accept whatever the request was.
|
||||
with m.If(interface.status_requested):
|
||||
m.d.comb += self.send_zlp()
|
||||
|
||||
clock_freq = (setup.value == Const(ClockSourceControlSelectors.CS_SAM_FREQ_CONTROL << 8, 16)) \
|
||||
& (setup.index == Const(USBDescriptors.CLOCK_ID << 8, 16))
|
||||
|
||||
request_clock_freq = clock_freq & setup.is_in_request
|
||||
set_clock_freq = clock_freq & ~setup.is_in_request
|
||||
|
||||
SRATE_44_1k = Const(44100, 32)
|
||||
SRATE_48k = Const(48000, 32)
|
||||
ZERO = Const(0, 32)
|
||||
|
||||
with m.Elif(setup.type == USBRequestType.CLASS):
|
||||
with m.Switch(setup.request):
|
||||
with m.Case(AudioClassSpecificRequestCodes.RANGE):
|
||||
m.d.comb += transmitter.stream.attach(self.interface.tx)
|
||||
|
||||
with m.If(request_clock_freq):
|
||||
m.d.comb += [
|
||||
Cat(transmitter.data).eq(
|
||||
Cat(Const(0x1, 16), # no triples
|
||||
SRATE_48k, # MIN
|
||||
SRATE_48k, # MAX
|
||||
ZERO)), # RES
|
||||
transmitter.max_length.eq(setup.length)
|
||||
]
|
||||
with m.Else():
|
||||
m.d.comb += interface.handshakes_out.stall.eq(1)
|
||||
|
||||
# ... trigger it to respond when data's requested...
|
||||
with m.If(interface.data_requested):
|
||||
m.d.comb += transmitter.start.eq(1)
|
||||
|
||||
# ... and ACK our status stage.
|
||||
with m.If(interface.status_requested):
|
||||
m.d.comb += interface.handshakes_out.ack.eq(1)
|
||||
|
||||
with m.Case(AudioClassSpecificRequestCodes.CUR):
|
||||
m.d.comb += transmitter.stream.attach(self.interface.tx)
|
||||
with m.If(request_clock_freq & (setup.length == 4)):
|
||||
m.d.comb += [
|
||||
Cat(transmitter.data[0:4]).eq(Const(48000, 32)),
|
||||
transmitter.max_length.eq(4)
|
||||
]
|
||||
with m.Else():
|
||||
m.d.comb += interface.handshakes_out.stall.eq(1)
|
||||
|
||||
# ... trigger it to respond when data's requested...
|
||||
with m.If(interface.data_requested):
|
||||
m.d.comb += transmitter.start.eq(1)
|
||||
|
||||
# ... and ACK our status stage.
|
||||
with m.If(interface.status_requested):
|
||||
m.d.comb += interface.handshakes_out.ack.eq(1)
|
||||
|
||||
with m.Default():
|
||||
#
|
||||
# Stall unhandled requests.
|
||||
#
|
||||
with m.If(interface.status_requested | interface.data_requested):
|
||||
m.d.comb += interface.handshakes_out.stall.eq(1)
|
||||
|
||||
with m.Elif(setup.type == USBRequestType.VENDOR):
|
||||
with m.Switch(setup.request):
|
||||
with m.Case(VendorRequests.TOGGLE_CONVOLUTION):
|
||||
m.d.comb += self.enable_convolution.eq(1)
|
||||
# m.d.usb += self.enable_convolution.eq(~self.enable_convolution)
|
||||
# ... and ACK our status stage.
|
||||
with m.If(interface.status_requested | interface.data_requested):
|
||||
m.d.comb += interface.handshakes_out.ack.eq(1)
|
||||
# m.d.comb += self.interface.handshakes_out.stall.eq(1)
|
||||
# pass
|
||||
with m.Case(VendorRequests.ILA_STOP_CAPTURE):
|
||||
# TODO - will be implemented when needed
|
||||
pass
|
||||
|
||||
with m.Default():
|
||||
m.d.comb += self.interface.handshakes_out.stall.eq(1)
|
||||
|
||||
with m.Else():
|
||||
m.d.comb += self.interface.handshakes_out.stall.eq(1)
|
||||
|
||||
return m
|
||||
9
gateware/requirements.txt
Normal file
9
gateware/requirements.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
wheel
|
||||
setuptools
|
||||
git+https://github.com/amaranth-lang/amaranth.git@v0.4.5
|
||||
git+https://github.com/amaranth-lang/amaranth-soc.git@59223a82399df45addf1db362ad6fb9670e72b51
|
||||
git+https://github.com/amaranth-farm/python-usb-descriptors.git
|
||||
git+https://github.com/amaranth-farm/usb2-highspeed-core.git
|
||||
git+https://github.com/amaranth-farm/adat-core.git
|
||||
git+https://github.com/amaranth-farm/amlib.git
|
||||
git+https://github.com/amaranth-farm/amaranth-boards.git
|
||||
45
gateware/stereopair_extractor.py
Normal file
45
gateware/stereopair_extractor.py
Normal file
@@ -0,0 +1,45 @@
|
||||
from amaranth import *
|
||||
from amaranth.build import Platform
|
||||
from amaranth.lib.fifo import SyncFIFOBuffered
|
||||
from amlib.stream import StreamInterface, connect_fifo_to_stream
|
||||
|
||||
class StereoPairExtractor(Elaboratable):
|
||||
def __init__(self, max_no_channels: int, fifo_depth):
|
||||
self._channel_bits = Shape.cast(range(max_no_channels)).width
|
||||
self._fifo_depth = fifo_depth
|
||||
|
||||
# I/O
|
||||
self.channel_stream_in = StreamInterface(name="channel_stream_in", payload_width=24, extra_fields=[("channel_nr", self._channel_bits)])
|
||||
self.selected_channel_in = Signal(range(max_no_channels))
|
||||
# the first=left and last=right signals mark the channel on the output stream
|
||||
self.channel_stream_out = StreamInterface(name="channel_stream_out", payload_width=24)
|
||||
self.level = Signal(range(fifo_depth))
|
||||
|
||||
def elaborate(self, platform: Platform) -> Module:
|
||||
m = Module()
|
||||
|
||||
m.submodules.fifo = fifo = SyncFIFOBuffered(width=24+1, depth=self._fifo_depth)
|
||||
|
||||
in_channel_nr = self.channel_stream_in.channel_nr
|
||||
out_channel_nr = Signal(self._channel_bits)
|
||||
|
||||
# the ready signal is not wired in the input stream because this
|
||||
# module must not exert upstream back pressure
|
||||
with m.If( self.channel_stream_in.valid
|
||||
& ( (in_channel_nr == self.selected_channel_in)
|
||||
| (in_channel_nr == (self.selected_channel_in + 1)))):
|
||||
|
||||
m.d.comb += [
|
||||
fifo.w_data.eq(Cat(self.channel_stream_in.payload, out_channel_nr[0])),
|
||||
fifo.w_en.eq(1)
|
||||
]
|
||||
|
||||
m.d.comb += [
|
||||
self.level.eq(fifo.r_level),
|
||||
out_channel_nr.eq(in_channel_nr - self.selected_channel_in),
|
||||
*connect_fifo_to_stream(fifo, self.channel_stream_out),
|
||||
self.channel_stream_out.first.eq(~fifo.r_data[-1]),
|
||||
self.channel_stream_out.last.eq(fifo.r_data[-1]),
|
||||
]
|
||||
|
||||
return m
|
||||
302
gateware/usb_descriptors.py
Normal file
302
gateware/usb_descriptors.py
Normal file
@@ -0,0 +1,302 @@
|
||||
#!/usr/bin/env python3
|
||||
#
|
||||
# Copyright (c) 2021 Hans Baier <hansfbaier@gmail.com>
|
||||
# SPDX-License-Identifier: CERN-OHL-W-2.0
|
||||
|
||||
from amaranth import *
|
||||
|
||||
from usb_protocol.types import USBRequestType, USBRequestRecipient, USBTransferType, USBSynchronizationType, USBUsageType, USBDirection, USBStandardRequests
|
||||
from usb_protocol.types.descriptors.uac2 import AudioClassSpecificRequestCodes
|
||||
from usb_protocol.emitters import DeviceDescriptorCollection
|
||||
from usb_protocol.emitters.descriptors import uac2, standard
|
||||
from usb_protocol.emitters.descriptors import midi1
|
||||
|
||||
class USBDescriptors():
|
||||
MAX_PACKET_SIZE_MIDI = 64
|
||||
CLOCK_ID = 1
|
||||
|
||||
def __init__(self, *, ila_max_packet_size: int, use_ila=False) -> None:
|
||||
|
||||
# ILA
|
||||
self.USE_ILA = use_ila
|
||||
self.ILA_MAX_PACKET_SIZE = ila_max_packet_size
|
||||
|
||||
|
||||
def create_usb1_descriptors(self, no_channels: int, max_packet_size: int):
|
||||
""" Creates the descriptors for the main USB interface """
|
||||
|
||||
return self.create_descriptors("ADATface (USB1)", no_channels, max_packet_size, self.USE_ILA)
|
||||
|
||||
|
||||
def create_usb2_descriptors(self, no_channels: int, max_packet_size: int):
|
||||
""" Creates the descriptors for the secondary USB interface """
|
||||
return self.create_descriptors("ADATface (USB2)", no_channels, max_packet_size)
|
||||
|
||||
|
||||
def create_descriptors(self, product_id: str, no_channels: int, max_packet_size: int, create_ila=False):
|
||||
""" Creates the descriptors for the main USB interface """
|
||||
|
||||
descriptors = DeviceDescriptorCollection()
|
||||
|
||||
with descriptors.DeviceDescriptor() as d:
|
||||
d.bcdUSB = 2.00
|
||||
d.bDeviceClass = 0xEF
|
||||
d.bDeviceSubclass = 0x02
|
||||
d.bDeviceProtocol = 0x01
|
||||
d.idVendor = 0x1209
|
||||
d.idProduct = 0xADA1 if "USB1" in product_id else 0xADA2
|
||||
d.iManufacturer = "OpenAudioGear"
|
||||
d.iProduct = product_id
|
||||
d.iSerialNumber = "0"
|
||||
d.bcdDevice = 0.01
|
||||
|
||||
d.bNumConfigurations = 1
|
||||
|
||||
with descriptors.ConfigurationDescriptor() as configDescr:
|
||||
# Interface Association
|
||||
interfaceAssociationDescriptor = uac2.InterfaceAssociationDescriptorEmitter()
|
||||
interfaceAssociationDescriptor.bInterfaceCount = 3 # Audio Control + Inputs + Outputs
|
||||
configDescr.add_subordinate_descriptor(interfaceAssociationDescriptor)
|
||||
|
||||
# Interface Descriptor (Control)
|
||||
interfaceDescriptor = uac2.StandardAudioControlInterfaceDescriptorEmitter()
|
||||
interfaceDescriptor.bInterfaceNumber = 0
|
||||
configDescr.add_subordinate_descriptor(interfaceDescriptor)
|
||||
|
||||
# AudioControl Interface Descriptor
|
||||
audioControlInterface = self.create_audio_control_interface_descriptor(no_channels)
|
||||
configDescr.add_subordinate_descriptor(audioControlInterface)
|
||||
|
||||
self.create_output_channels_descriptor(configDescr, no_channels, max_packet_size)
|
||||
|
||||
self.create_input_channels_descriptor(configDescr, no_channels, max_packet_size)
|
||||
|
||||
midi_interface, midi_streaming_interface = self.create_midi_interface_descriptor()
|
||||
configDescr.add_subordinate_descriptor(midi_interface)
|
||||
configDescr.add_subordinate_descriptor(midi_streaming_interface)
|
||||
|
||||
if create_ila:
|
||||
with configDescr.InterfaceDescriptor() as i:
|
||||
i.bInterfaceNumber = 4
|
||||
|
||||
with i.EndpointDescriptor() as e:
|
||||
e.bEndpointAddress = USBDirection.IN.to_endpoint_address(4)
|
||||
e.wMaxPacketSize = self.ILA_MAX_PACKET_SIZE
|
||||
|
||||
return descriptors
|
||||
|
||||
|
||||
def create_audio_control_interface_descriptor(self, number_of_channels):
|
||||
audioControlInterface = uac2.ClassSpecificAudioControlInterfaceDescriptorEmitter()
|
||||
|
||||
# AudioControl Interface Descriptor (ClockSource)
|
||||
clockSource = uac2.ClockSourceDescriptorEmitter()
|
||||
clockSource.bClockID = self.CLOCK_ID
|
||||
clockSource.bmAttributes = uac2.ClockAttributes.INTERNAL_FIXED_CLOCK
|
||||
clockSource.bmControls = uac2.ClockFrequencyControl.HOST_READ_ONLY
|
||||
audioControlInterface.add_subordinate_descriptor(clockSource)
|
||||
|
||||
# streaming input port from the host to the USB interface
|
||||
inputTerminal = uac2.InputTerminalDescriptorEmitter()
|
||||
inputTerminal.bTerminalID = 2
|
||||
inputTerminal.wTerminalType = uac2.USBTerminalTypes.USB_STREAMING
|
||||
# The number of channels needs to be 2 here in order to be recognized
|
||||
# default audio out device by Windows. We provide an alternate
|
||||
# setting with the full channel count, which also references
|
||||
# this terminal ID
|
||||
inputTerminal.bNrChannels = 2
|
||||
inputTerminal.bCSourceID = 1
|
||||
audioControlInterface.add_subordinate_descriptor(inputTerminal)
|
||||
|
||||
# audio output port from the USB interface to the outside world
|
||||
outputTerminal = uac2.OutputTerminalDescriptorEmitter()
|
||||
outputTerminal.bTerminalID = 3
|
||||
outputTerminal.wTerminalType = uac2.OutputTerminalTypes.SPEAKER
|
||||
outputTerminal.bSourceID = 2
|
||||
outputTerminal.bCSourceID = 1
|
||||
audioControlInterface.add_subordinate_descriptor(outputTerminal)
|
||||
|
||||
# audio input port from the outside world to the USB interface
|
||||
inputTerminal = uac2.InputTerminalDescriptorEmitter()
|
||||
inputTerminal.bTerminalID = 4
|
||||
inputTerminal.wTerminalType = uac2.InputTerminalTypes.MICROPHONE
|
||||
inputTerminal.bNrChannels = number_of_channels
|
||||
inputTerminal.bCSourceID = 1
|
||||
audioControlInterface.add_subordinate_descriptor(inputTerminal)
|
||||
|
||||
# audio output port from the USB interface to the host
|
||||
outputTerminal = uac2.OutputTerminalDescriptorEmitter()
|
||||
outputTerminal.bTerminalID = 5
|
||||
outputTerminal.wTerminalType = uac2.USBTerminalTypes.USB_STREAMING
|
||||
outputTerminal.bSourceID = 4
|
||||
outputTerminal.bCSourceID = 1
|
||||
audioControlInterface.add_subordinate_descriptor(outputTerminal)
|
||||
|
||||
return audioControlInterface
|
||||
|
||||
|
||||
def create_output_streaming_interface(self, c, *, no_channels: int, alt_setting_nr: int, max_packet_size):
|
||||
# Interface Descriptor (Streaming, OUT, active setting)
|
||||
activeAudioStreamingInterface = uac2.AudioStreamingInterfaceDescriptorEmitter()
|
||||
activeAudioStreamingInterface.bInterfaceNumber = 1
|
||||
activeAudioStreamingInterface.bAlternateSetting = alt_setting_nr
|
||||
activeAudioStreamingInterface.bNumEndpoints = 2
|
||||
c.add_subordinate_descriptor(activeAudioStreamingInterface)
|
||||
|
||||
# AudioStreaming Interface Descriptor (General)
|
||||
audioStreamingInterface = uac2.ClassSpecificAudioStreamingInterfaceDescriptorEmitter()
|
||||
audioStreamingInterface.bTerminalLink = 2
|
||||
audioStreamingInterface.bFormatType = uac2.FormatTypes.FORMAT_TYPE_I
|
||||
audioStreamingInterface.bmFormats = uac2.TypeIFormats.PCM
|
||||
audioStreamingInterface.bNrChannels = no_channels
|
||||
c.add_subordinate_descriptor(audioStreamingInterface)
|
||||
|
||||
# AudioStreaming Interface Descriptor (Type I)
|
||||
typeIStreamingInterface = uac2.TypeIFormatTypeDescriptorEmitter()
|
||||
typeIStreamingInterface.bSubslotSize = 4
|
||||
typeIStreamingInterface.bBitResolution = 24
|
||||
c.add_subordinate_descriptor(typeIStreamingInterface)
|
||||
|
||||
# Endpoint Descriptor (Audio out)
|
||||
audioOutEndpoint = standard.EndpointDescriptorEmitter()
|
||||
audioOutEndpoint.bEndpointAddress = USBDirection.OUT.to_endpoint_address(1) # EP 1 OUT
|
||||
audioOutEndpoint.bmAttributes = USBTransferType.ISOCHRONOUS | \
|
||||
(USBSynchronizationType.ASYNC << 2) | \
|
||||
(USBUsageType.DATA << 4)
|
||||
audioOutEndpoint.wMaxPacketSize = max_packet_size
|
||||
audioOutEndpoint.bInterval = 1
|
||||
c.add_subordinate_descriptor(audioOutEndpoint)
|
||||
|
||||
# AudioControl Endpoint Descriptor
|
||||
audioControlEndpoint = uac2.ClassSpecificAudioStreamingIsochronousAudioDataEndpointDescriptorEmitter()
|
||||
c.add_subordinate_descriptor(audioControlEndpoint)
|
||||
|
||||
# Endpoint Descriptor (Feedback IN)
|
||||
feedbackInEndpoint = standard.EndpointDescriptorEmitter()
|
||||
feedbackInEndpoint.bEndpointAddress = USBDirection.IN.to_endpoint_address(1) # EP 1 IN
|
||||
feedbackInEndpoint.bmAttributes = USBTransferType.ISOCHRONOUS | \
|
||||
(USBSynchronizationType.NONE << 2) | \
|
||||
(USBUsageType.FEEDBACK << 4)
|
||||
feedbackInEndpoint.wMaxPacketSize = 4
|
||||
feedbackInEndpoint.bInterval = 4
|
||||
c.add_subordinate_descriptor(feedbackInEndpoint)
|
||||
|
||||
|
||||
def create_output_channels_descriptor(self, c, no_channels: int, max_packet_size: int):
|
||||
#
|
||||
# Interface Descriptor (Streaming, OUT, quiet setting)
|
||||
#
|
||||
quietAudioStreamingInterface = uac2.AudioStreamingInterfaceDescriptorEmitter()
|
||||
quietAudioStreamingInterface.bInterfaceNumber = 1
|
||||
quietAudioStreamingInterface.bAlternateSetting = 0
|
||||
c.add_subordinate_descriptor(quietAudioStreamingInterface)
|
||||
|
||||
# we need the default alternate setting to be stereo
|
||||
# out for windows to automatically recognize
|
||||
# and use this audio interface
|
||||
self.create_output_streaming_interface(c, no_channels=2, alt_setting_nr=1, max_packet_size=max_packet_size)
|
||||
if no_channels > 2:
|
||||
self.create_output_streaming_interface(c, no_channels=no_channels, alt_setting_nr=2, max_packet_size=max_packet_size)
|
||||
|
||||
|
||||
def create_input_streaming_interface(self, c, *, no_channels: int, alt_setting_nr: int, channel_config: int=0, max_packet_size: int):
|
||||
# Interface Descriptor (Streaming, IN, active setting)
|
||||
activeAudioStreamingInterface = uac2.AudioStreamingInterfaceDescriptorEmitter()
|
||||
activeAudioStreamingInterface.bInterfaceNumber = 2
|
||||
activeAudioStreamingInterface.bAlternateSetting = alt_setting_nr
|
||||
activeAudioStreamingInterface.bNumEndpoints = 1
|
||||
c.add_subordinate_descriptor(activeAudioStreamingInterface)
|
||||
|
||||
# AudioStreaming Interface Descriptor (General)
|
||||
audioStreamingInterface = uac2.ClassSpecificAudioStreamingInterfaceDescriptorEmitter()
|
||||
audioStreamingInterface.bTerminalLink = 5
|
||||
audioStreamingInterface.bFormatType = uac2.FormatTypes.FORMAT_TYPE_I
|
||||
audioStreamingInterface.bmFormats = uac2.TypeIFormats.PCM
|
||||
audioStreamingInterface.bNrChannels = no_channels
|
||||
audioStreamingInterface.bmChannelConfig = channel_config
|
||||
c.add_subordinate_descriptor(audioStreamingInterface)
|
||||
|
||||
# AudioStreaming Interface Descriptor (Type I)
|
||||
typeIStreamingInterface = uac2.TypeIFormatTypeDescriptorEmitter()
|
||||
typeIStreamingInterface.bSubslotSize = 4
|
||||
typeIStreamingInterface.bBitResolution = 24 # we use all 24 bits
|
||||
c.add_subordinate_descriptor(typeIStreamingInterface)
|
||||
|
||||
# Endpoint Descriptor (Audio out)
|
||||
audioOutEndpoint = standard.EndpointDescriptorEmitter()
|
||||
audioOutEndpoint.bEndpointAddress = USBDirection.IN.to_endpoint_address(2) # EP 2 IN
|
||||
audioOutEndpoint.bmAttributes = USBTransferType.ISOCHRONOUS | \
|
||||
(USBSynchronizationType.ASYNC << 2) | \
|
||||
(USBUsageType.DATA << 4)
|
||||
audioOutEndpoint.wMaxPacketSize = max_packet_size
|
||||
audioOutEndpoint.bInterval = 1
|
||||
c.add_subordinate_descriptor(audioOutEndpoint)
|
||||
|
||||
# AudioControl Endpoint Descriptor
|
||||
audioControlEndpoint = uac2.ClassSpecificAudioStreamingIsochronousAudioDataEndpointDescriptorEmitter()
|
||||
c.add_subordinate_descriptor(audioControlEndpoint)
|
||||
|
||||
|
||||
def create_input_channels_descriptor(self, c, no_channels: int, max_packet_size: int):
|
||||
#
|
||||
# Interface Descriptor (Streaming, IN, quiet setting)
|
||||
#
|
||||
quietAudioStreamingInterface = uac2.AudioStreamingInterfaceDescriptorEmitter()
|
||||
quietAudioStreamingInterface.bInterfaceNumber = 2
|
||||
quietAudioStreamingInterface.bAlternateSetting = 0
|
||||
c.add_subordinate_descriptor(quietAudioStreamingInterface)
|
||||
|
||||
# Windows wants a stereo pair as default setting, so let's have it
|
||||
self.create_input_streaming_interface(c, no_channels=2, alt_setting_nr=1, channel_config=0x3, max_packet_size=max_packet_size)
|
||||
if no_channels > 2:
|
||||
self.create_input_streaming_interface(c, no_channels=no_channels, alt_setting_nr=2, channel_config=0x0, max_packet_size=max_packet_size)
|
||||
|
||||
|
||||
def create_midi_interface_descriptor(self):
|
||||
midi_interface = midi1.StandardMidiStreamingInterfaceDescriptorEmitter()
|
||||
midi_interface.bInterfaceNumber = 3
|
||||
midi_interface.bNumEndpoints = 2
|
||||
|
||||
midi_streaming_interface = midi1.ClassSpecificMidiStreamingInterfaceDescriptorEmitter()
|
||||
|
||||
outToHostJack = midi1.MidiOutJackDescriptorEmitter()
|
||||
outToHostJack.bJackID = 1
|
||||
outToHostJack.bJackType = midi1.MidiStreamingJackTypes.EMBEDDED
|
||||
outToHostJack.add_source(2)
|
||||
midi_streaming_interface.add_subordinate_descriptor(outToHostJack)
|
||||
|
||||
inToDeviceJack = midi1.MidiInJackDescriptorEmitter()
|
||||
inToDeviceJack.bJackID = 2
|
||||
inToDeviceJack.bJackType = midi1.MidiStreamingJackTypes.EXTERNAL
|
||||
midi_streaming_interface.add_subordinate_descriptor(inToDeviceJack)
|
||||
|
||||
inFromHostJack = midi1.MidiInJackDescriptorEmitter()
|
||||
inFromHostJack.bJackID = 3
|
||||
inFromHostJack.bJackType = midi1.MidiStreamingJackTypes.EMBEDDED
|
||||
midi_streaming_interface.add_subordinate_descriptor(inFromHostJack)
|
||||
|
||||
outFromDeviceJack = midi1.MidiOutJackDescriptorEmitter()
|
||||
outFromDeviceJack.bJackID = 4
|
||||
outFromDeviceJack.bJackType = midi1.MidiStreamingJackTypes.EXTERNAL
|
||||
outFromDeviceJack.add_source(3)
|
||||
midi_streaming_interface.add_subordinate_descriptor(outFromDeviceJack)
|
||||
|
||||
outEndpoint = midi1.StandardMidiStreamingBulkDataEndpointDescriptorEmitter()
|
||||
outEndpoint.bEndpointAddress = USBDirection.OUT.to_endpoint_address(3)
|
||||
outEndpoint.wMaxPacketSize = self.MAX_PACKET_SIZE_MIDI
|
||||
midi_streaming_interface.add_subordinate_descriptor(outEndpoint)
|
||||
|
||||
outMidiEndpoint = midi1.ClassSpecificMidiStreamingBulkDataEndpointDescriptorEmitter()
|
||||
outMidiEndpoint.add_associated_jack(3)
|
||||
midi_streaming_interface.add_subordinate_descriptor(outMidiEndpoint)
|
||||
|
||||
inEndpoint = midi1.StandardMidiStreamingBulkDataEndpointDescriptorEmitter()
|
||||
inEndpoint.bEndpointAddress = USBDirection.IN.to_endpoint_address(3)
|
||||
inEndpoint.wMaxPacketSize = self.MAX_PACKET_SIZE_MIDI
|
||||
midi_streaming_interface.add_subordinate_descriptor(inEndpoint)
|
||||
|
||||
inMidiEndpoint = midi1.ClassSpecificMidiStreamingBulkDataEndpointDescriptorEmitter()
|
||||
inMidiEndpoint.add_associated_jack(1)
|
||||
midi_streaming_interface.add_subordinate_descriptor(inMidiEndpoint)
|
||||
|
||||
return (midi_interface, midi_streaming_interface)
|
||||
49
gateware/usb_stream_to_channels-bench.gtkw
Normal file
49
gateware/usb_stream_to_channels-bench.gtkw
Normal file
@@ -0,0 +1,49 @@
|
||||
[*]
|
||||
[*] GTKWave Analyzer v3.3.109 (w)1999-2020 BSI
|
||||
[*] Tue Aug 31 23:46:03 2021
|
||||
[*]
|
||||
[dumpfile] "usb_stream_to_channels.vcd"
|
||||
[dumpfile_mtime] "Tue Aug 31 23:45:35 2021"
|
||||
[dumpfile_size] 7952
|
||||
[savefile] "gateware/usb_stream_to_channels-bench.gtkw"
|
||||
[timestart] 0
|
||||
[size] 3828 2090
|
||||
[pos] -1 -1
|
||||
*-17.716705 169900 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
|
||||
[sst_width] 357
|
||||
[signals_width] 345
|
||||
[sst_expanded] 1
|
||||
[sst_vpaned_height] 628
|
||||
@28
|
||||
top.clk
|
||||
@200
|
||||
-Input Stream
|
||||
@28
|
||||
top.usb_first
|
||||
top.usb_valid
|
||||
top.out_ready
|
||||
@22
|
||||
top.usb_payload[7:0]
|
||||
@200
|
||||
-Core
|
||||
@28
|
||||
top.fsm_state
|
||||
@24
|
||||
top.out_channel_nr[2:0]
|
||||
@200
|
||||
-Output Stream
|
||||
@25
|
||||
[color] 2
|
||||
top.channel_nr[2:0]
|
||||
@22
|
||||
[color] 2
|
||||
top.payload$1[23:0]
|
||||
@28
|
||||
[color] 2
|
||||
top.valid$1
|
||||
[color] 2
|
||||
top.first$1
|
||||
[color] 2
|
||||
top.last
|
||||
[pattern_trace] 1
|
||||
[pattern_trace] 0
|
||||
49
gateware/usb_stream_to_channels-bench.py
Normal file
49
gateware/usb_stream_to_channels-bench.py
Normal file
@@ -0,0 +1,49 @@
|
||||
#!/usr/bin/env python3
|
||||
from usb_stream_to_channels import USBStreamToChannels
|
||||
from amaranth.sim import Simulator, Tick
|
||||
|
||||
if __name__ == "__main__":
|
||||
dut = USBStreamToChannels(8)
|
||||
|
||||
def send_one_frame(seamless=False, drop_valid=False, drop_ready=False):
|
||||
data = [n % 4 + (n//4 << 4) for n in range(32)]
|
||||
yield dut.no_channels_in.eq(8)
|
||||
yield dut.usb_stream_in.valid.eq(1)
|
||||
yield dut.usb_stream_in.first.eq(1)
|
||||
yield dut.channel_stream_out.ready.eq(1)
|
||||
for pos, byte in enumerate(data):
|
||||
yield dut.usb_stream_in.payload.eq(byte)
|
||||
yield Tick()
|
||||
yield dut.usb_stream_in.first.eq(0)
|
||||
if drop_valid and pos == 7 * 4 + 2:
|
||||
yield dut.usb_stream_in.valid.eq(0)
|
||||
for _ in range(4): yield Tick()
|
||||
yield dut.usb_stream_in.valid.eq(1)
|
||||
if drop_ready and pos == 7 * 2 + 3:
|
||||
yield dut.channel_stream_out.ready.eq(0)
|
||||
for _ in range(7): yield Tick()
|
||||
yield dut.channel_stream_out.ready.eq(1)
|
||||
yield dut.usb_stream_in.last.eq(1)
|
||||
yield dut.usb_stream_in.valid.eq(0)
|
||||
if not seamless:
|
||||
for _ in range(10): yield Tick()
|
||||
yield dut.usb_stream_in.first.eq(1)
|
||||
yield dut.usb_stream_in.payload.eq(data[0])
|
||||
yield dut.usb_stream_in.last.eq(0)
|
||||
|
||||
def process():
|
||||
yield dut.usb_stream_in.payload.eq(0xff)
|
||||
yield Tick()
|
||||
yield from send_one_frame()
|
||||
yield Tick()
|
||||
yield Tick()
|
||||
yield from send_one_frame(seamless=True, drop_valid=True)
|
||||
yield from send_one_frame(seamless=True, drop_ready=True)
|
||||
for _ in range(5): yield Tick()
|
||||
|
||||
sim = Simulator(dut)
|
||||
sim.add_clock(1.0/60e6,)
|
||||
sim.add_sync_process(process)
|
||||
|
||||
with sim.write_vcd(f'usb_stream_to_channels.vcd'):
|
||||
sim.run()
|
||||
91
gateware/usb_stream_to_channels.py
Normal file
91
gateware/usb_stream_to_channels.py
Normal file
@@ -0,0 +1,91 @@
|
||||
from amaranth import *
|
||||
from amaranth.build import Platform
|
||||
|
||||
from amlib.stream import StreamInterface
|
||||
|
||||
class USBStreamToChannels(Elaboratable):
|
||||
def __init__(self, max_no_channels=2):
|
||||
# parameters
|
||||
self._max_nr_channels = max_no_channels
|
||||
self._channel_bits = Shape.cast(range(max_no_channels)).width
|
||||
|
||||
# ports
|
||||
self.no_channels_in = Signal(self._channel_bits + 1)
|
||||
self.usb_stream_in = StreamInterface()
|
||||
self.channel_stream_out = StreamInterface(payload_width=24, extra_fields=[("channel_nr", self._channel_bits)])
|
||||
self.garbage_seen_out = Signal()
|
||||
|
||||
def elaborate(self, platform: Platform) -> Module:
|
||||
m = Module()
|
||||
|
||||
out_channel_nr = Signal(self._channel_bits)
|
||||
out_sample = Signal(16)
|
||||
usb_valid = Signal()
|
||||
usb_first = Signal()
|
||||
usb_payload = Signal(8)
|
||||
out_ready = Signal()
|
||||
|
||||
last_channel = Signal(self._channel_bits)
|
||||
|
||||
m.d.comb += [
|
||||
usb_first.eq(self.usb_stream_in.first),
|
||||
usb_valid.eq(self.usb_stream_in.valid),
|
||||
usb_payload.eq(self.usb_stream_in.payload),
|
||||
out_ready.eq(self.channel_stream_out.ready),
|
||||
self.usb_stream_in.ready.eq(out_ready),
|
||||
last_channel.eq(self.no_channels_in - 1),
|
||||
]
|
||||
|
||||
m.d.sync += [
|
||||
self.channel_stream_out.valid.eq(0),
|
||||
self.channel_stream_out.first.eq(0),
|
||||
self.channel_stream_out.last.eq(0),
|
||||
]
|
||||
|
||||
with m.If(usb_valid & out_ready):
|
||||
with m.FSM() as fsm:
|
||||
with m.State("B0"):
|
||||
with m.If(usb_first):
|
||||
m.d.sync += out_channel_nr.eq(0)
|
||||
with m.Else():
|
||||
m.d.sync += out_channel_nr.eq(out_channel_nr + 1)
|
||||
m.next = "B1"
|
||||
|
||||
with m.State("B1"):
|
||||
with m.If(usb_first):
|
||||
m.d.sync += out_channel_nr.eq(0)
|
||||
m.d.comb += self.garbage_seen_out.eq(1)
|
||||
m.next = "B1"
|
||||
with m.Else():
|
||||
m.d.sync += out_sample[:8].eq(usb_payload)
|
||||
m.next = "B2"
|
||||
|
||||
with m.State("B2"):
|
||||
with m.If(usb_first):
|
||||
m.d.sync += out_channel_nr.eq(0)
|
||||
m.d.comb += self.garbage_seen_out.eq(1)
|
||||
m.next = "B1"
|
||||
with m.Else():
|
||||
m.d.sync += out_sample[8:16].eq(usb_payload)
|
||||
m.next = "B3"
|
||||
|
||||
with m.State("B3"):
|
||||
with m.If(usb_first):
|
||||
m.d.sync += out_channel_nr.eq(0)
|
||||
m.d.comb += self.garbage_seen_out.eq(1)
|
||||
m.next = "B1"
|
||||
with m.Else():
|
||||
m.d.sync += [
|
||||
self.channel_stream_out.payload.eq(Cat(out_sample, usb_payload)),
|
||||
self.channel_stream_out.valid.eq(1),
|
||||
self.channel_stream_out.channel_nr.eq(out_channel_nr),
|
||||
self.channel_stream_out.first.eq(out_channel_nr == 0),
|
||||
self.channel_stream_out.last.eq(out_channel_nr == last_channel),
|
||||
]
|
||||
|
||||
with m.If(out_channel_nr == last_channel):
|
||||
m.d.sync += out_channel_nr.eq(-1)
|
||||
|
||||
m.next = "B0"
|
||||
|
||||
return m
|
||||
30
hardware/rev0/.gitignore
vendored
Normal file
30
hardware/rev0/.gitignore
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
# For PCBs designed using KiCad: https://www.kicad.org/
|
||||
# Format documentation: https://kicad.org/help/file-formats/
|
||||
|
||||
# Temporary files
|
||||
\#auto_saved_files\#
|
||||
*.000
|
||||
*.bak
|
||||
*.bck
|
||||
*.kicad_pcb-bak
|
||||
*.kicad_sch-bak
|
||||
**/*-backups/*
|
||||
**/bak/*
|
||||
*.kicad_prl
|
||||
*.sch-bak
|
||||
*~
|
||||
_autosave-*
|
||||
*.tmp
|
||||
*-save.pro
|
||||
*-save.kicad_pcb
|
||||
fp-info-cache
|
||||
|
||||
# Netlist files (exported from Eeschema)
|
||||
*.net
|
||||
|
||||
# Autorouter files (exported from Pcbnew)
|
||||
*.dsn
|
||||
*.ses
|
||||
|
||||
# Exported BOM files
|
||||
*.xml
|
||||
4377
hardware/rev0/3d/HRO TYPE-C-31-M-12.step
Normal file
4377
hardware/rev0/3d/HRO TYPE-C-31-M-12.step
Normal file
File diff suppressed because it is too large
Load Diff
1355
hardware/rev0/3d/PLR135_T8.stp
Normal file
1355
hardware/rev0/3d/PLR135_T8.stp
Normal file
File diff suppressed because it is too large
Load Diff
3777
hardware/rev0/3d/PLR135_T8.wrl
Normal file
3777
hardware/rev0/3d/PLR135_T8.wrl
Normal file
File diff suppressed because it is too large
Load Diff
1450
hardware/rev0/3d/PLT133_T10.step
Normal file
1450
hardware/rev0/3d/PLT133_T10.step
Normal file
File diff suppressed because it is too large
Load Diff
8341
hardware/rev0/3d/QFN-32-1EP_5x5mm_P0.5mm_EP3.3x3.3mm.step
Normal file
8341
hardware/rev0/3d/QFN-32-1EP_5x5mm_P0.5mm_EP3.3x3.3mm.step
Normal file
File diff suppressed because it is too large
Load Diff
1287
hardware/rev0/3d/QFN-32-1EP_5x5mm_P0.5mm_EP3.3x3.3mm.wrl
Normal file
1287
hardware/rev0/3d/QFN-32-1EP_5x5mm_P0.5mm_EP3.3x3.3mm.wrl
Normal file
File diff suppressed because one or more lines are too long
29
hardware/rev0/adatface_baseboard-cache.lib
Normal file
29
hardware/rev0/adatface_baseboard-cache.lib
Normal file
@@ -0,0 +1,29 @@
|
||||
EESchema-LIBRARY Version 2.4
|
||||
#encoding utf-8
|
||||
#
|
||||
# SquantorLabels:OHWLOGO
|
||||
#
|
||||
DEF SquantorLabels:OHWLOGO N 0 40 Y Y 1 F N
|
||||
F0 "N" 0 150 60 H V C CNN
|
||||
F1 "SquantorLabels:OHWLOGO" 0 -150 60 H V C CNN
|
||||
F2 "" 0 0 60 H I C CNN
|
||||
F3 "" 0 0 60 H I C CNN
|
||||
DRAW
|
||||
C 0 0 50 0 1 0 N
|
||||
C 0 0 100 0 1 0 N
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# SquantorLabels:VYYYYMMDD
|
||||
#
|
||||
DEF SquantorLabels:VYYYYMMDD N 0 40 Y Y 1 F N
|
||||
F0 "N" 0 100 60 H V C CNN
|
||||
F1 "SquantorLabels:VYYYYMMDD" 0 0 60 H V C CNN
|
||||
F2 "" 0 0 60 H I C CNN
|
||||
F3 "" 0 0 60 H I C CNN
|
||||
DRAW
|
||||
S 300 -50 -300 150 0 1 0 N
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
#End Library
|
||||
94
hardware/rev0/adatface_baseboard.kicad_dru
Normal file
94
hardware/rev0/adatface_baseboard.kicad_dru
Normal file
@@ -0,0 +1,94 @@
|
||||
(version 1)
|
||||
|
||||
# 4-layer, 1oz copper
|
||||
# In global rules
|
||||
#(rule "Minimum Trace Width and Spacing (outer layer)"
|
||||
# (constraint track_width (min 3.5mil))
|
||||
# (constraint clearance (min 3.5mil))
|
||||
# (layer outer)
|
||||
# (condition "A.Type == 'track' && B.Type != 'Zone'"))
|
||||
|
||||
(rule "Minimum Trace Width and Spacing (inner layer)"
|
||||
(constraint track_width (min 5mil))
|
||||
(constraint clearance (min 5mil))
|
||||
(layer inner)
|
||||
(condition "A.Type == 'track' && B.Type != 'Zone'"))
|
||||
|
||||
|
||||
# silkscreen
|
||||
# This is just JLCPCB being overly cautious, <6mil is readable.
|
||||
#(rule "Minimum line width"
|
||||
# (constraint track_width (min 6mil))
|
||||
# (layer "F.Silkscreen") (layer "B.Silkscreen"))
|
||||
|
||||
(rule "Pad to Silkscreen"
|
||||
(constraint clearance (min 0.15mm))
|
||||
(layer outer)
|
||||
(condition "A.Type == 'pad' && (B.Type == 'text' || B.Type == 'graphic')"))
|
||||
|
||||
# edge clearance
|
||||
# in global rules
|
||||
#(rule "Trace to Outline"
|
||||
# (constraint edge_clearance (min 0.2mm))
|
||||
# (condition "A.Type == 'track'"))
|
||||
|
||||
# drill/hole size
|
||||
# in global rules
|
||||
#(rule "drill hole size (mechanical)"
|
||||
# (constraint hole (min 0.2mm) (max 6.3mm))
|
||||
# (condition "A.Type == 'hole'"))
|
||||
#
|
||||
#(rule "Minimum Via Hole Size"
|
||||
# (constraint hole (min 0.2mm))
|
||||
# (condition "A.Type == 'via'"))
|
||||
#
|
||||
#(rule "Minimum Via Diameter"
|
||||
# (constraint length (min 0.4mm))
|
||||
# (condition "A.Type == 'via' && Lay"))
|
||||
|
||||
# JLCPCB's guidelines here are contradictory; they say that PTH hole size minimum is .2,
|
||||
# then they immediately after that they say that the pad has to be 1mm in size with a minimum .5mm hole size?
|
||||
# At first they say that the minimum PTH annular width is .15, but then they say it's .25?
|
||||
# this is very confusing, we'll just go with the smaller number.
|
||||
|
||||
(rule "PTH Hole Size"
|
||||
(constraint hole (min 0.2mm) )
|
||||
(condition "A.isPlated() && A.Type != 'via'"))
|
||||
|
||||
(rule "PTH Annular Width"
|
||||
(constraint annular_width (min 0.15mm) )
|
||||
(condition "A.isPlated() && A.Type != 'via'"))
|
||||
|
||||
(rule "Minimum Non-plated Hole Size"
|
||||
(constraint hole (min 0.5mm))
|
||||
(condition "A.Type == 'pad' && !A.isPlated()"))
|
||||
|
||||
# clearance
|
||||
(rule "via to track clearance"
|
||||
(constraint hole_clearance (min 0.254mm))
|
||||
(condition "A.Type == 'via' && B.Type == 'track'"))
|
||||
|
||||
(rule "via to via clearance (same nets)"
|
||||
(constraint hole_clearance (min 0.254mm))
|
||||
(condition "A.Type == 'via' && B.Type == 'via' && A.Net == B.Net"))
|
||||
|
||||
(rule "pad to pad clearance (with hole, different nets)"
|
||||
(constraint hole_clearance (min 0.5mm))
|
||||
(condition "A.Type == 'through-hole' && B.Type == A.Type && A.Net != B.Net"))
|
||||
|
||||
(rule "pad to pad clearance (without hole, different nets)"
|
||||
(constraint clearance (min 0.127mm))
|
||||
(condition "A.Type == 'pad' && B.Type == A.Type && A.Net != B.Net"))
|
||||
|
||||
(rule "NPTH to Track clearance)"
|
||||
(constraint hole_clearance (min 0.254mm))
|
||||
(condition "A.Pad_Type == 'NPTH, mechanical' && B.Type == 'track'"))
|
||||
|
||||
(rule "PTH to Track clearance)"
|
||||
(constraint hole_clearance (min 0.33mm))
|
||||
(condition "A.isPlated() && B.Type == 'track'"))
|
||||
|
||||
#Only non-via pads
|
||||
(rule "Pad to Track clearance)"
|
||||
(constraint clearance (min 0.2mm))
|
||||
(condition "A.isPlated() && A.type != 'via' && B.Type == 'track'"))
|
||||
89740
hardware/rev0/adatface_baseboard.kicad_pcb
Normal file
89740
hardware/rev0/adatface_baseboard.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
475
hardware/rev0/adatface_baseboard.kicad_pro
Normal file
475
hardware/rev0/adatface_baseboard.kicad_pro
Normal file
@@ -0,0 +1,475 @@
|
||||
{
|
||||
"board": {
|
||||
"design_settings": {
|
||||
"defaults": {
|
||||
"board_outline_line_width": 0.15,
|
||||
"copper_line_width": 0.19999999999999998,
|
||||
"copper_text_italic": false,
|
||||
"copper_text_size_h": 1.5,
|
||||
"copper_text_size_v": 1.5,
|
||||
"copper_text_thickness": 0.3,
|
||||
"copper_text_upright": false,
|
||||
"courtyard_line_width": 0.049999999999999996,
|
||||
"dimension_precision": 4,
|
||||
"dimension_units": 3,
|
||||
"dimensions": {
|
||||
"arrow_length": 1270000,
|
||||
"extension_offset": 500000,
|
||||
"keep_text_aligned": true,
|
||||
"suppress_zeroes": false,
|
||||
"text_position": 0,
|
||||
"units_format": 1
|
||||
},
|
||||
"fab_line_width": 0.09999999999999999,
|
||||
"fab_text_italic": false,
|
||||
"fab_text_size_h": 1.0,
|
||||
"fab_text_size_v": 1.0,
|
||||
"fab_text_thickness": 0.15,
|
||||
"fab_text_upright": false,
|
||||
"other_line_width": 0.09999999999999999,
|
||||
"other_text_italic": false,
|
||||
"other_text_size_h": 1.0,
|
||||
"other_text_size_v": 1.0,
|
||||
"other_text_thickness": 0.15,
|
||||
"other_text_upright": false,
|
||||
"pads": {
|
||||
"drill": 0.762,
|
||||
"height": 1.524,
|
||||
"width": 1.524
|
||||
},
|
||||
"silk_line_width": 0.15,
|
||||
"silk_text_italic": false,
|
||||
"silk_text_size_h": 1.0,
|
||||
"silk_text_size_v": 1.0,
|
||||
"silk_text_thickness": 0.15,
|
||||
"silk_text_upright": false,
|
||||
"zones": {
|
||||
"45_degree_only": false,
|
||||
"min_clearance": 0.508
|
||||
}
|
||||
},
|
||||
"diff_pair_dimensions": [
|
||||
{
|
||||
"gap": 0.0,
|
||||
"via_gap": 0.0,
|
||||
"width": 0.0
|
||||
}
|
||||
],
|
||||
"drc_exclusions": [],
|
||||
"meta": {
|
||||
"filename": "board_design_settings.json",
|
||||
"version": 2
|
||||
},
|
||||
"rule_severities": {
|
||||
"annular_width": "error",
|
||||
"clearance": "error",
|
||||
"copper_edge_clearance": "error",
|
||||
"courtyards_overlap": "error",
|
||||
"diff_pair_gap_out_of_range": "error",
|
||||
"diff_pair_uncoupled_length_too_long": "error",
|
||||
"drill_out_of_range": "error",
|
||||
"duplicate_footprints": "warning",
|
||||
"extra_footprint": "warning",
|
||||
"footprint_type_mismatch": "error",
|
||||
"hole_clearance": "error",
|
||||
"hole_near_hole": "error",
|
||||
"invalid_outline": "error",
|
||||
"item_on_disabled_layer": "error",
|
||||
"items_not_allowed": "error",
|
||||
"length_out_of_range": "error",
|
||||
"malformed_courtyard": "error",
|
||||
"microvia_drill_out_of_range": "error",
|
||||
"missing_courtyard": "ignore",
|
||||
"missing_footprint": "warning",
|
||||
"net_conflict": "warning",
|
||||
"npth_inside_courtyard": "ignore",
|
||||
"padstack": "error",
|
||||
"pth_inside_courtyard": "ignore",
|
||||
"shorting_items": "error",
|
||||
"silk_over_copper": "ignore",
|
||||
"silk_overlap": "warning",
|
||||
"skew_out_of_range": "error",
|
||||
"through_hole_pad_without_hole": "error",
|
||||
"too_many_vias": "error",
|
||||
"track_dangling": "warning",
|
||||
"track_width": "error",
|
||||
"tracks_crossing": "error",
|
||||
"unconnected_items": "error",
|
||||
"unresolved_variable": "error",
|
||||
"via_dangling": "warning",
|
||||
"zone_has_empty_net": "error",
|
||||
"zones_intersect": "error"
|
||||
},
|
||||
"rules": {
|
||||
"allow_blind_buried_vias": false,
|
||||
"allow_microvias": false,
|
||||
"max_error": 0.005,
|
||||
"min_clearance": 0.08889999999999999,
|
||||
"min_copper_edge_clearance": 0.19999999999999998,
|
||||
"min_hole_clearance": 0.254,
|
||||
"min_hole_to_hole": 0.5,
|
||||
"min_microvia_diameter": 0.381,
|
||||
"min_microvia_drill": 0.254,
|
||||
"min_silk_clearance": 0.0,
|
||||
"min_through_hole_diameter": 0.19999999999999998,
|
||||
"min_track_width": 0.08889999999999999,
|
||||
"min_via_annular_width": 0.13,
|
||||
"min_via_diameter": 0.44999999999999996,
|
||||
"use_height_for_length_calcs": true
|
||||
},
|
||||
"track_widths": [
|
||||
0.0,
|
||||
0.15,
|
||||
0.2,
|
||||
0.3,
|
||||
0.4,
|
||||
0.6,
|
||||
1.0,
|
||||
1.5,
|
||||
2.0
|
||||
],
|
||||
"via_dimensions": [
|
||||
{
|
||||
"diameter": 0.0,
|
||||
"drill": 0.0
|
||||
},
|
||||
{
|
||||
"diameter": 0.46,
|
||||
"drill": 0.2
|
||||
},
|
||||
{
|
||||
"diameter": 0.66,
|
||||
"drill": 0.4
|
||||
},
|
||||
{
|
||||
"diameter": 0.86,
|
||||
"drill": 0.6
|
||||
},
|
||||
{
|
||||
"diameter": 1.08,
|
||||
"drill": 0.8
|
||||
},
|
||||
{
|
||||
"diameter": 1.3,
|
||||
"drill": 1.0
|
||||
},
|
||||
{
|
||||
"diameter": 1.5,
|
||||
"drill": 1.2
|
||||
},
|
||||
{
|
||||
"diameter": 1.7,
|
||||
"drill": 1.4
|
||||
},
|
||||
{
|
||||
"diameter": 1.9,
|
||||
"drill": 1.6
|
||||
}
|
||||
],
|
||||
"zones_allow_external_fillets": false,
|
||||
"zones_use_no_outline": true
|
||||
},
|
||||
"layer_presets": []
|
||||
},
|
||||
"boards": [],
|
||||
"cvpcb": {
|
||||
"equivalence_files": []
|
||||
},
|
||||
"erc": {
|
||||
"erc_exclusions": [],
|
||||
"meta": {
|
||||
"version": 0
|
||||
},
|
||||
"pin_map": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
2,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
2,
|
||||
1,
|
||||
1,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
2,
|
||||
1,
|
||||
2,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
2,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
2,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
2,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
2,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2
|
||||
]
|
||||
],
|
||||
"rule_severities": {
|
||||
"bus_definition_conflict": "error",
|
||||
"bus_entry_needed": "error",
|
||||
"bus_label_syntax": "error",
|
||||
"bus_to_bus_conflict": "error",
|
||||
"bus_to_net_conflict": "error",
|
||||
"different_unit_footprint": "error",
|
||||
"different_unit_net": "error",
|
||||
"duplicate_reference": "error",
|
||||
"duplicate_sheet_names": "error",
|
||||
"extra_units": "error",
|
||||
"global_label_dangling": "warning",
|
||||
"hier_label_mismatch": "error",
|
||||
"label_dangling": "error",
|
||||
"lib_symbol_issues": "warning",
|
||||
"multiple_net_names": "warning",
|
||||
"net_not_bus_member": "warning",
|
||||
"no_connect_connected": "warning",
|
||||
"no_connect_dangling": "warning",
|
||||
"pin_not_connected": "error",
|
||||
"pin_not_driven": "error",
|
||||
"pin_to_pin": "warning",
|
||||
"power_pin_not_driven": "error",
|
||||
"similar_labels": "warning",
|
||||
"unannotated": "error",
|
||||
"unit_value_mismatch": "error",
|
||||
"unresolved_variable": "error",
|
||||
"wire_dangling": "error"
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"pinned_footprint_libs": [],
|
||||
"pinned_symbol_libs": []
|
||||
},
|
||||
"meta": {
|
||||
"filename": "adatface_baseboard.kicad_pro",
|
||||
"version": 1
|
||||
},
|
||||
"net_settings": {
|
||||
"classes": [
|
||||
{
|
||||
"bus_width": 12.0,
|
||||
"clearance": 0.09,
|
||||
"diff_pair_gap": 0.25,
|
||||
"diff_pair_via_gap": 0.25,
|
||||
"diff_pair_width": 0.2,
|
||||
"line_style": 0,
|
||||
"microvia_diameter": 0.6,
|
||||
"microvia_drill": 0.3,
|
||||
"name": "Default",
|
||||
"pcb_color": "rgba(0, 0, 0, 0.000)",
|
||||
"schematic_color": "rgba(0, 0, 0, 0.000)",
|
||||
"track_width": 0.0889,
|
||||
"via_diameter": 0.46,
|
||||
"via_drill": 0.2,
|
||||
"wire_width": 6.0
|
||||
}
|
||||
],
|
||||
"meta": {
|
||||
"version": 2
|
||||
},
|
||||
"net_colors": null
|
||||
},
|
||||
"pcbnew": {
|
||||
"last_paths": {
|
||||
"gencad": "",
|
||||
"idf": "",
|
||||
"netlist": "",
|
||||
"specctra_dsn": "",
|
||||
"step": "",
|
||||
"vrml": ""
|
||||
},
|
||||
"page_layout_descr_file": ""
|
||||
},
|
||||
"schematic": {
|
||||
"annotate_start_num": 0,
|
||||
"drawing": {
|
||||
"default_bus_thickness": 12.0,
|
||||
"default_junction_size": 40.0,
|
||||
"default_line_thickness": 6.0,
|
||||
"default_text_size": 50.0,
|
||||
"default_wire_thickness": 6.0,
|
||||
"field_names": [],
|
||||
"intersheets_ref_own_page": false,
|
||||
"intersheets_ref_prefix": "",
|
||||
"intersheets_ref_short": false,
|
||||
"intersheets_ref_show": false,
|
||||
"intersheets_ref_suffix": "",
|
||||
"junction_size_choice": 3,
|
||||
"label_size_ratio": 0.3,
|
||||
"pin_symbol_size": 25.0,
|
||||
"text_offset_ratio": 0.3
|
||||
},
|
||||
"legacy_lib_dir": "",
|
||||
"legacy_lib_list": [],
|
||||
"meta": {
|
||||
"version": 1
|
||||
},
|
||||
"net_format_name": "",
|
||||
"ngspice": {
|
||||
"fix_include_paths": true,
|
||||
"fix_passive_vals": false,
|
||||
"meta": {
|
||||
"version": 0
|
||||
},
|
||||
"model_mode": 0,
|
||||
"workbook_filename": ""
|
||||
},
|
||||
"page_layout_descr_file": "",
|
||||
"plot_directory": "",
|
||||
"spice_adjust_passive_values": false,
|
||||
"spice_external_command": "spice \"%I\"",
|
||||
"subpart_first_id": 65,
|
||||
"subpart_id_separator": 0
|
||||
},
|
||||
"sheets": [
|
||||
[
|
||||
"8c8ee5d7-3451-4a2e-85b6-a20d3d490147",
|
||||
""
|
||||
]
|
||||
],
|
||||
"text_variables": {}
|
||||
}
|
||||
9920
hardware/rev0/adatface_baseboard.kicad_sch
Normal file
9920
hardware/rev0/adatface_baseboard.kicad_sch
Normal file
File diff suppressed because it is too large
Load Diff
30
hardware/rev0/adatface_baseboard.pro
Normal file
30
hardware/rev0/adatface_baseboard.pro
Normal file
@@ -0,0 +1,30 @@
|
||||
update=do 26 jul 2018 21:08:19 CEST
|
||||
version=1
|
||||
last_client=kicad
|
||||
[pcbnew]
|
||||
version=1
|
||||
LastNetListRead=
|
||||
UseCmpFile=1
|
||||
PadDrill=0.600000000000
|
||||
PadDrillOvalY=0.600000000000
|
||||
PadSizeH=1.500000000000
|
||||
PadSizeV=1.500000000000
|
||||
PcbTextSizeV=1.500000000000
|
||||
PcbTextSizeH=1.500000000000
|
||||
PcbTextThickness=0.300000000000
|
||||
ModuleTextSizeV=1.000000000000
|
||||
ModuleTextSizeH=1.000000000000
|
||||
ModuleTextSizeThickness=0.150000000000
|
||||
SolderMaskClearance=0.000000000000
|
||||
SolderMaskMinWidth=0.000000000000
|
||||
DrawSegmentWidth=0.200000000000
|
||||
BoardOutlineThickness=0.100000000000
|
||||
ModuleOutlineThickness=0.150000000000
|
||||
[cvpcb]
|
||||
version=1
|
||||
NetIExt=net
|
||||
[general]
|
||||
version=1
|
||||
[eeschema]
|
||||
version=1
|
||||
LibDir=
|
||||
39
hardware/rev0/adatface_baseboard.sch
Normal file
39
hardware/rev0/adatface_baseboard.sch
Normal file
@@ -0,0 +1,39 @@
|
||||
EESchema Schematic File Version 4
|
||||
LIBS:adatface_baseboard-cache
|
||||
EELAYER 26 0
|
||||
EELAYER END
|
||||
$Descr A4 11693 8268
|
||||
encoding utf-8
|
||||
Sheet 1 1
|
||||
Title ""
|
||||
Date ""
|
||||
Rev ""
|
||||
Comp ""
|
||||
Comment1 ""
|
||||
Comment2 ""
|
||||
Comment3 ""
|
||||
Comment4 ""
|
||||
$EndDescr
|
||||
$Comp
|
||||
L SquantorLabels:VYYYYMMDD N2
|
||||
U 1 1 5A1357A5
|
||||
P 850 7700
|
||||
F 0 "N2" H 850 7800 60 0000 C CNN
|
||||
F 1 "V20180726" H 850 7700 60 0000 C CNN
|
||||
F 2 "SquantorLabels:Label_version" H 850 7700 60 0001 C CNN
|
||||
F 3 "" H 850 7700 60 0001 C CNN
|
||||
1 850 7700
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$Comp
|
||||
L SquantorLabels:OHWLOGO N1
|
||||
U 1 1 5A135869
|
||||
P 850 7350
|
||||
F 0 "N1" H 850 7500 60 0000 C CNN
|
||||
F 1 "OHWLOGO" H 850 7200 60 0000 C CNN
|
||||
F 2 "Symbols:OSHW-Symbol_6.7x6mm_SilkScreen" H 850 7350 60 0001 C CNN
|
||||
F 3 "" H 850 7350 60 0001 C CNN
|
||||
1 850 7350
|
||||
1 0 0 -1
|
||||
$EndComp
|
||||
$EndSCHEMATC
|
||||
BIN
hardware/rev0/case/ADATFaceCase.FCStd
Normal file
BIN
hardware/rev0/case/ADATFaceCase.FCStd
Normal file
Binary file not shown.
BIN
hardware/rev0/case/fonts/Droid Sans Mono for Powerline.otf
Normal file
BIN
hardware/rev0/case/fonts/Droid Sans Mono for Powerline.otf
Normal file
Binary file not shown.
13
hardware/rev0/case/fonts/LICENSE.txt
Normal file
13
hardware/rev0/case/fonts/LICENSE.txt
Normal file
@@ -0,0 +1,13 @@
|
||||
Copyright 2006, 2007, 2008, 2009, 2010 Google Corp.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
6
hardware/rev0/case/fonts/README.rst
Normal file
6
hardware/rev0/case/fonts/README.rst
Normal file
@@ -0,0 +1,6 @@
|
||||
Droid Sans Mono for Powerline
|
||||
=============================
|
||||
|
||||
:Font creator: Ascender Corporation
|
||||
:Source: Provided by system
|
||||
:Patched by: `mt3 <https://github.com/mt3>`_
|
||||
@@ -0,0 +1,77 @@
|
||||
(module QFN-32-1EP_5x5mm_P0.5mm_EP3.3x3.3mm (layer F.Cu) (tedit 5E2FFDFC)
|
||||
(descr "QFN, 32 Pin (http://ww1.microchip.com/downloads/en/DeviceDoc/00002164B.pdf#page=68), generated with kicad-footprint-generator ipc_noLead_generator.py")
|
||||
(tags "QFN NoLead")
|
||||
(attr smd)
|
||||
(fp_text reference REF** (at 0 -3.82) (layer F.SilkS)
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
)
|
||||
(fp_text value QFN-32-1EP_5x5mm_P0.5mm_EP3.3x3.3mm (at 0 3.82) (layer F.Fab)
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
)
|
||||
(fp_line (start 2.135 -2.61) (end 2.61 -2.61) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start 2.61 -2.61) (end 2.61 -2.135) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start -2.135 2.61) (end -2.61 2.61) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start -2.61 2.61) (end -2.61 2.135) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start 2.135 2.61) (end 2.61 2.61) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start 2.61 2.61) (end 2.61 2.135) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start -2.135 -2.61) (end -2.61 -2.61) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start -1.5 -2.5) (end 2.5 -2.5) (layer F.Fab) (width 0.1))
|
||||
(fp_line (start 2.5 -2.5) (end 2.5 2.5) (layer F.Fab) (width 0.1))
|
||||
(fp_line (start 2.5 2.5) (end -2.5 2.5) (layer F.Fab) (width 0.1))
|
||||
(fp_line (start -2.5 2.5) (end -2.5 -1.5) (layer F.Fab) (width 0.1))
|
||||
(fp_line (start -2.5 -1.5) (end -1.5 -2.5) (layer F.Fab) (width 0.1))
|
||||
(fp_line (start -3.12 -3.12) (end -3.12 3.12) (layer F.CrtYd) (width 0.05))
|
||||
(fp_line (start -3.12 3.12) (end 3.12 3.12) (layer F.CrtYd) (width 0.05))
|
||||
(fp_line (start 3.12 3.12) (end 3.12 -3.12) (layer F.CrtYd) (width 0.05))
|
||||
(fp_line (start 3.12 -3.12) (end -3.12 -3.12) (layer F.CrtYd) (width 0.05))
|
||||
(pad 1 smd roundrect (at -2.4375 -1.75) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 2 smd roundrect (at -2.4375 -1.25) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 3 smd roundrect (at -2.4375 -0.75) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 4 smd roundrect (at -2.4375 -0.25) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 5 smd roundrect (at -2.4375 0.25) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 6 smd roundrect (at -2.4375 0.75) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 7 smd roundrect (at -2.4375 1.25) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 8 smd roundrect (at -2.4375 1.75) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 9 smd roundrect (at -1.75 2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 10 smd roundrect (at -1.25 2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 11 smd roundrect (at -0.75 2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 12 smd roundrect (at -0.25 2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 13 smd roundrect (at 0.25 2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 14 smd roundrect (at 0.75 2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 15 smd roundrect (at 1.25 2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 16 smd roundrect (at 1.75 2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 17 smd roundrect (at 2.4375 1.75) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 18 smd roundrect (at 2.4375 1.25) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 19 smd roundrect (at 2.4375 0.75) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 20 smd roundrect (at 2.4375 0.25) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 21 smd roundrect (at 2.4375 -0.25) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 22 smd roundrect (at 2.4375 -0.75) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 23 smd roundrect (at 2.4375 -1.25) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 24 smd roundrect (at 2.4375 -1.75) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 25 smd roundrect (at 1.75 -2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 26 smd roundrect (at 1.25 -2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 27 smd roundrect (at 0.75 -2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 28 smd roundrect (at 0.25 -2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 29 smd roundrect (at -0.25 -2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 30 smd roundrect (at -0.75 -2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 31 smd roundrect (at -1.25 -2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 32 smd roundrect (at -1.75 -2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 33 smd rect (at 0 0) (size 3.3 3.3) (layers F.Cu F.Mask))
|
||||
(pad "" smd roundrect (at -1.1 -1.1) (size 0.89 0.89) (layers F.Paste) (roundrect_rratio 0.25))
|
||||
(pad "" smd roundrect (at -1.1 0) (size 0.89 0.89) (layers F.Paste) (roundrect_rratio 0.25))
|
||||
(pad "" smd roundrect (at -1.1 1.1) (size 0.89 0.89) (layers F.Paste) (roundrect_rratio 0.25))
|
||||
(pad "" smd roundrect (at 0 -1.1) (size 0.89 0.89) (layers F.Paste) (roundrect_rratio 0.25))
|
||||
(pad "" smd roundrect (at 0 0) (size 0.89 0.89) (layers F.Paste) (roundrect_rratio 0.25))
|
||||
(pad "" smd roundrect (at 0 1.1) (size 0.89 0.89) (layers F.Paste) (roundrect_rratio 0.25))
|
||||
(pad "" smd roundrect (at 1.1 -1.1) (size 0.89 0.89) (layers F.Paste) (roundrect_rratio 0.25))
|
||||
(pad "" smd roundrect (at 1.1 0) (size 0.89 0.89) (layers F.Paste) (roundrect_rratio 0.25))
|
||||
(pad "" smd roundrect (at 1.1 1.1) (size 0.89 0.89) (layers F.Paste) (roundrect_rratio 0.25))
|
||||
(fp_text user %R (at 0 0) (layer F.Fab)
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
)
|
||||
(model ${KISYS3DMOD}/Package_DFN_QFN.3dshapes/QFN-32-1EP_5x5mm_P0.5mm_EP3.3x3.3mm.wrl
|
||||
(at (xyz 0 0 0))
|
||||
(scale (xyz 1 1 1))
|
||||
(rotate (xyz 0 0 0))
|
||||
)
|
||||
)
|
||||
@@ -0,0 +1,166 @@
|
||||
(module QFN-32-1EP_5x5mm_P0.5mm_EP3.3x3.3mm_ThermalVias (layer F.Cu) (tedit 5E2FFDFC)
|
||||
(descr "QFN, 32 Pin (http://ww1.microchip.com/downloads/en/DeviceDoc/00002164B.pdf#page=68), generated with kicad-footprint-generator ipc_noLead_generator.py")
|
||||
(tags "QFN NoLead")
|
||||
(attr smd)
|
||||
(fp_text reference REF** (at 0 -3.82) (layer F.SilkS)
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
)
|
||||
(fp_text value QFN-32-1EP_5x5mm_P0.5mm_EP3.3x3.3mm_ThermalVias (at 0 3.82) (layer F.Fab)
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
)
|
||||
(fp_line (start 2.135 -2.61) (end 2.61 -2.61) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start 2.61 -2.61) (end 2.61 -2.135) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start -2.135 2.61) (end -2.61 2.61) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start -2.61 2.61) (end -2.61 2.135) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start 2.135 2.61) (end 2.61 2.61) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start 2.61 2.61) (end 2.61 2.135) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start -2.135 -2.61) (end -2.61 -2.61) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start -1.5 -2.5) (end 2.5 -2.5) (layer F.Fab) (width 0.1))
|
||||
(fp_line (start 2.5 -2.5) (end 2.5 2.5) (layer F.Fab) (width 0.1))
|
||||
(fp_line (start 2.5 2.5) (end -2.5 2.5) (layer F.Fab) (width 0.1))
|
||||
(fp_line (start -2.5 2.5) (end -2.5 -1.5) (layer F.Fab) (width 0.1))
|
||||
(fp_line (start -2.5 -1.5) (end -1.5 -2.5) (layer F.Fab) (width 0.1))
|
||||
(fp_line (start -3.12 -3.12) (end -3.12 3.12) (layer F.CrtYd) (width 0.05))
|
||||
(fp_line (start -3.12 3.12) (end 3.12 3.12) (layer F.CrtYd) (width 0.05))
|
||||
(fp_line (start 3.12 3.12) (end 3.12 -3.12) (layer F.CrtYd) (width 0.05))
|
||||
(fp_line (start 3.12 -3.12) (end -3.12 -3.12) (layer F.CrtYd) (width 0.05))
|
||||
(pad 1 smd roundrect (at -2.4375 -1.75) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 2 smd roundrect (at -2.4375 -1.25) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 3 smd roundrect (at -2.4375 -0.75) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 4 smd roundrect (at -2.4375 -0.25) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 5 smd roundrect (at -2.4375 0.25) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 6 smd roundrect (at -2.4375 0.75) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 7 smd roundrect (at -2.4375 1.25) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 8 smd roundrect (at -2.4375 1.75) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 9 smd roundrect (at -1.75 2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 10 smd roundrect (at -1.25 2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 11 smd roundrect (at -0.75 2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 12 smd roundrect (at -0.25 2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 13 smd roundrect (at 0.25 2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 14 smd roundrect (at 0.75 2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 15 smd roundrect (at 1.25 2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 16 smd roundrect (at 1.75 2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 17 smd roundrect (at 2.4375 1.75) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 18 smd roundrect (at 2.4375 1.25) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 19 smd roundrect (at 2.4375 0.75) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 20 smd roundrect (at 2.4375 0.25) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 21 smd roundrect (at 2.4375 -0.25) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 22 smd roundrect (at 2.4375 -0.75) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 23 smd roundrect (at 2.4375 -1.25) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 24 smd roundrect (at 2.4375 -1.75) (size 0.875 0.25) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 25 smd roundrect (at 1.75 -2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 26 smd roundrect (at 1.25 -2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 27 smd roundrect (at 0.75 -2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 28 smd roundrect (at 0.25 -2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 29 smd roundrect (at -0.25 -2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 30 smd roundrect (at -0.75 -2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 31 smd roundrect (at -1.25 -2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 32 smd roundrect (at -1.75 -2.4375) (size 0.25 0.875) (layers F.Cu F.Mask F.Paste) (roundrect_rratio 0.25))
|
||||
(pad 33 smd rect (at 0 0) (size 3.3 3.3) (layers F.Cu F.Mask))
|
||||
(pad 33 thru_hole circle (at -1 -1) (size 0.5 0.5) (drill 0.2) (layers *.Cu))
|
||||
(pad 33 thru_hole circle (at 0 -1) (size 0.5 0.5) (drill 0.2) (layers *.Cu))
|
||||
(pad 33 thru_hole circle (at 1 -1) (size 0.5 0.5) (drill 0.2) (layers *.Cu))
|
||||
(pad 33 thru_hole circle (at -1 0) (size 0.5 0.5) (drill 0.2) (layers *.Cu))
|
||||
(pad 33 thru_hole circle (at 0 0) (size 0.5 0.5) (drill 0.2) (layers *.Cu))
|
||||
(pad 33 thru_hole circle (at 1 0) (size 0.5 0.5) (drill 0.2) (layers *.Cu))
|
||||
(pad 33 thru_hole circle (at -1 1) (size 0.5 0.5) (drill 0.2) (layers *.Cu))
|
||||
(pad 33 thru_hole circle (at 0 1) (size 0.5 0.5) (drill 0.2) (layers *.Cu))
|
||||
(pad 33 thru_hole circle (at 1 1) (size 0.5 0.5) (drill 0.2) (layers *.Cu))
|
||||
(pad 33 smd rect (at 0 0) (size 2.5 2.5) (layers B.Cu))
|
||||
(pad "" smd roundrect (at -0.5 -0.5) (size 0.806226 0.806226) (layers F.Paste) (roundrect_rratio 0.25))
|
||||
(pad "" smd roundrect (at -0.5 0.5) (size 0.806226 0.806226) (layers F.Paste) (roundrect_rratio 0.25))
|
||||
(pad "" smd roundrect (at 0.5 -0.5) (size 0.806226 0.806226) (layers F.Paste) (roundrect_rratio 0.25))
|
||||
(pad "" smd roundrect (at 0.5 0.5) (size 0.806226 0.806226) (layers F.Paste) (roundrect_rratio 0.25))
|
||||
(pad "" smd custom (at -1.325 -0.5) (size 0.437087 0.437087) (layers F.Paste)
|
||||
(options (clearance outline) (anchor circle))
|
||||
(primitives
|
||||
(gr_poly (pts
|
||||
(xy -0.175064 -0.316154) (xy 0.103025 -0.316154) (xy 0.175064 -0.244114) (xy 0.175064 0.244114)
|
||||
(xy 0.103025 0.316154) (xy -0.175064 0.316154)) (width 0.173919))
|
||||
))
|
||||
(pad "" smd custom (at -1.325 0.5) (size 0.437087 0.437087) (layers F.Paste)
|
||||
(options (clearance outline) (anchor circle))
|
||||
(primitives
|
||||
(gr_poly (pts
|
||||
(xy -0.175064 -0.316154) (xy 0.103025 -0.316154) (xy 0.175064 -0.244114) (xy 0.175064 0.244114)
|
||||
(xy 0.103025 0.316154) (xy -0.175064 0.316154)) (width 0.173919))
|
||||
))
|
||||
(pad "" smd custom (at 1.325 -0.5) (size 0.437087 0.437087) (layers F.Paste)
|
||||
(options (clearance outline) (anchor circle))
|
||||
(primitives
|
||||
(gr_poly (pts
|
||||
(xy -0.175064 -0.244114) (xy -0.103025 -0.316154) (xy 0.175064 -0.316154) (xy 0.175064 0.316154)
|
||||
(xy -0.103025 0.316154) (xy -0.175064 0.244114)) (width 0.173919))
|
||||
))
|
||||
(pad "" smd custom (at 1.325 0.5) (size 0.437087 0.437087) (layers F.Paste)
|
||||
(options (clearance outline) (anchor circle))
|
||||
(primitives
|
||||
(gr_poly (pts
|
||||
(xy -0.175064 -0.244114) (xy -0.103025 -0.316154) (xy 0.175064 -0.316154) (xy 0.175064 0.316154)
|
||||
(xy -0.103025 0.316154) (xy -0.175064 0.244114)) (width 0.173919))
|
||||
))
|
||||
(pad "" smd custom (at -0.5 -1.325) (size 0.437087 0.437087) (layers F.Paste)
|
||||
(options (clearance outline) (anchor circle))
|
||||
(primitives
|
||||
(gr_poly (pts
|
||||
(xy -0.316154 -0.175064) (xy 0.316154 -0.175064) (xy 0.316154 0.103025) (xy 0.244114 0.175064)
|
||||
(xy -0.244114 0.175064) (xy -0.316154 0.103025)) (width 0.173919))
|
||||
))
|
||||
(pad "" smd custom (at 0.5 -1.325) (size 0.437087 0.437087) (layers F.Paste)
|
||||
(options (clearance outline) (anchor circle))
|
||||
(primitives
|
||||
(gr_poly (pts
|
||||
(xy -0.316154 -0.175064) (xy 0.316154 -0.175064) (xy 0.316154 0.103025) (xy 0.244114 0.175064)
|
||||
(xy -0.244114 0.175064) (xy -0.316154 0.103025)) (width 0.173919))
|
||||
))
|
||||
(pad "" smd custom (at -0.5 1.325) (size 0.437087 0.437087) (layers F.Paste)
|
||||
(options (clearance outline) (anchor circle))
|
||||
(primitives
|
||||
(gr_poly (pts
|
||||
(xy -0.316154 -0.103025) (xy -0.244114 -0.175064) (xy 0.244114 -0.175064) (xy 0.316154 -0.103025)
|
||||
(xy 0.316154 0.175064) (xy -0.316154 0.175064)) (width 0.173919))
|
||||
))
|
||||
(pad "" smd custom (at 0.5 1.325) (size 0.437087 0.437087) (layers F.Paste)
|
||||
(options (clearance outline) (anchor circle))
|
||||
(primitives
|
||||
(gr_poly (pts
|
||||
(xy -0.316154 -0.103025) (xy -0.244114 -0.175064) (xy 0.244114 -0.175064) (xy 0.316154 -0.103025)
|
||||
(xy 0.316154 0.175064) (xy -0.316154 0.175064)) (width 0.173919))
|
||||
))
|
||||
(pad "" smd custom (at -1.325 -1.325) (size 0.413109 0.413109) (layers F.Paste)
|
||||
(options (clearance outline) (anchor circle))
|
||||
(primitives
|
||||
(gr_poly (pts
|
||||
(xy -0.151086 -0.151086) (xy 0.151086 -0.151086) (xy 0.151086 0.059182) (xy 0.059182 0.151086)
|
||||
(xy -0.151086 0.151086)) (width 0.221875))
|
||||
))
|
||||
(pad "" smd custom (at -1.325 1.325) (size 0.413109 0.413109) (layers F.Paste)
|
||||
(options (clearance outline) (anchor circle))
|
||||
(primitives
|
||||
(gr_poly (pts
|
||||
(xy -0.151086 -0.151086) (xy 0.059182 -0.151086) (xy 0.151086 -0.059182) (xy 0.151086 0.151086)
|
||||
(xy -0.151086 0.151086)) (width 0.221875))
|
||||
))
|
||||
(pad "" smd custom (at 1.325 -1.325) (size 0.413109 0.413109) (layers F.Paste)
|
||||
(options (clearance outline) (anchor circle))
|
||||
(primitives
|
||||
(gr_poly (pts
|
||||
(xy -0.151086 -0.151086) (xy 0.151086 -0.151086) (xy 0.151086 0.151086) (xy -0.059182 0.151086)
|
||||
(xy -0.151086 0.059182)) (width 0.221875))
|
||||
))
|
||||
(pad "" smd custom (at 1.325 1.325) (size 0.413109 0.413109) (layers F.Paste)
|
||||
(options (clearance outline) (anchor circle))
|
||||
(primitives
|
||||
(gr_poly (pts
|
||||
(xy -0.151086 -0.059182) (xy -0.059182 -0.151086) (xy 0.151086 -0.151086) (xy 0.151086 0.151086)
|
||||
(xy -0.151086 0.151086)) (width 0.221875))
|
||||
))
|
||||
(fp_text user %R (at 0 0) (layer F.Fab)
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
)
|
||||
(model ${KISYS3DMOD}/Package_DFN_QFN.3dshapes/QFN-32-1EP_5x5mm_P0.5mm_EP3.3x3.3mm.wrl
|
||||
(at (xyz 0 0 0))
|
||||
(scale (xyz 1 1 1))
|
||||
(rotate (xyz 0 0 0))
|
||||
)
|
||||
)
|
||||
@@ -0,0 +1,54 @@
|
||||
(module USB_C_Receptacle_XKB_U262-16XN-4BVC11 (layer F.Cu) (tedit 5E1305FC)
|
||||
(descr "USB Type C, right-angle, SMT, https://datasheet.lcsc.com/szlcsc/1811141824_XKB-Enterprise-U262-161N-4BVC11_C319148.pdf")
|
||||
(tags "USB C Type-C Receptacle SMD")
|
||||
(attr smd)
|
||||
(fp_text reference REF** (at 0 -5.715) (layer F.SilkS)
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
)
|
||||
(fp_text value USB_C_Receptacle_XKB_U262-16XN-4BVC11 (at 0 4.935) (layer F.Fab)
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
)
|
||||
(fp_line (start -4.58 -1.85) (end -4.58 0.07) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start 4.58 0.07) (end 4.58 -1.85) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start 4.58 2.08) (end 4.58 3.785) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start -4.58 3.785) (end -4.58 2.08) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start 4.58 3.785) (end -4.58 3.785) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start -5.32 -4.75) (end 5.32 -4.75) (layer F.CrtYd) (width 0.05))
|
||||
(fp_line (start 5.32 -4.75) (end 5.32 4.18) (layer F.CrtYd) (width 0.05))
|
||||
(fp_line (start 5.32 4.18) (end -5.32 4.18) (layer F.CrtYd) (width 0.05))
|
||||
(fp_line (start -5.32 4.18) (end -5.32 -4.75) (layer F.CrtYd) (width 0.05))
|
||||
(fp_line (start -4.47 -3.675) (end -4.47 3.675) (layer F.Fab) (width 0.1))
|
||||
(fp_line (start -4.47 3.675) (end 4.47 3.675) (layer F.Fab) (width 0.1))
|
||||
(fp_line (start 4.47 3.675) (end 4.47 -3.675) (layer F.Fab) (width 0.1))
|
||||
(fp_line (start -4.47 -3.675) (end 4.47 -3.675) (layer F.Fab) (width 0.1))
|
||||
(fp_text user %R (at 0 0) (layer F.Fab)
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
)
|
||||
(pad S1 thru_hole oval (at -4.32 -3.105) (size 1 2.1) (drill oval 0.6 1.7) (layers *.Cu *.Mask))
|
||||
(pad S1 thru_hole oval (at 4.32 -3.105) (size 1 2.1) (drill oval 0.6 1.7) (layers *.Cu *.Mask))
|
||||
(pad S1 thru_hole oval (at -4.32 1.075) (size 1 1.6) (drill oval 0.6 1.2) (layers *.Cu *.Mask))
|
||||
(pad S1 thru_hole oval (at 4.32 1.075) (size 1 1.6) (drill oval 0.6 1.2) (layers *.Cu *.Mask))
|
||||
(pad "" np_thru_hole circle (at 2.89 -2.605) (size 0.65 0.65) (drill 0.65) (layers *.Cu *.Mask))
|
||||
(pad "" np_thru_hole circle (at -2.89 -2.605) (size 0.65 0.65) (drill 0.65) (layers *.Cu *.Mask))
|
||||
(pad B1 smd rect (at 3.05 -3.67) (size 0.3 1.15) (layers F.Cu F.Paste F.Mask))
|
||||
(pad B4 smd rect (at 2.25 -3.67) (size 0.3 1.15) (layers F.Cu F.Paste F.Mask))
|
||||
(pad B5 smd rect (at 1.75 -3.67) (size 0.3 1.15) (layers F.Cu F.Paste F.Mask))
|
||||
(pad A8 smd rect (at 1.25 -3.67) (size 0.3 1.15) (layers F.Cu F.Paste F.Mask))
|
||||
(pad B6 smd rect (at 0.75 -3.67) (size 0.3 1.15) (layers F.Cu F.Paste F.Mask))
|
||||
(pad A7 smd rect (at 0.25 -3.67) (size 0.3 1.15) (layers F.Cu F.Paste F.Mask))
|
||||
(pad A6 smd rect (at -0.25 -3.67) (size 0.3 1.15) (layers F.Cu F.Paste F.Mask))
|
||||
(pad B7 smd rect (at -0.75 -3.67) (size 0.3 1.15) (layers F.Cu F.Paste F.Mask))
|
||||
(pad A5 smd rect (at -1.25 -3.67) (size 0.3 1.15) (layers F.Cu F.Paste F.Mask))
|
||||
(pad B8 smd rect (at -1.75 -3.67) (size 0.3 1.15) (layers F.Cu F.Paste F.Mask))
|
||||
(pad A4 smd rect (at -2.55 -3.67) (size 0.3 1.15) (layers F.Cu F.Paste F.Mask))
|
||||
(pad A1 smd rect (at -3.35 -3.67) (size 0.3 1.15) (layers F.Cu F.Paste F.Mask))
|
||||
(pad B12 smd rect (at -3.05 -3.67) (size 0.3 1.15) (layers F.Cu F.Paste F.Mask))
|
||||
(pad B9 smd rect (at -2.25 -3.67) (size 0.3 1.15) (layers F.Cu F.Paste F.Mask))
|
||||
(pad A9 smd rect (at 2.55 -3.67) (size 0.3 1.15) (layers F.Cu F.Paste F.Mask))
|
||||
(pad A12 smd rect (at 3.35 -3.67) (size 0.3 1.15) (layers F.Cu F.Paste F.Mask))
|
||||
(model ${KISYS3DMOD}/Connector_USB.3dshapes/USB_C_Receptacle_XKB_U262-16XN-4BVC11.wrl
|
||||
(at (xyz 0 0 0))
|
||||
(scale (xyz 1 1 1))
|
||||
(rotate (xyz 0 0 0))
|
||||
)
|
||||
)
|
||||
4
hardware/rev0/fp-lib-table
Normal file
4
hardware/rev0/fp-lib-table
Normal file
@@ -0,0 +1,4 @@
|
||||
(fp_lib_table
|
||||
(lib (name "toslink")(type "KiCad")(uri "${KIPRJMOD}/toslink")(options "")(descr ""))
|
||||
(lib (name "footprints")(type "KiCad")(uri "${KIPRJMOD}/footprints")(options "")(descr ""))
|
||||
)
|
||||
38
hardware/rev0/jlcpcb/assembly/BOM-adatface_baseboard.csv
Normal file
38
hardware/rev0/jlcpcb/assembly/BOM-adatface_baseboard.csv
Normal file
@@ -0,0 +1,38 @@
|
||||
Comment,Designator,Footprint,LCSC
|
||||
10k,"R10,R3,R4,R5,R6,R9",R_0603_1608Metric, C25804
|
||||
USB3320,"U5,U6",QFN-32-1EP_5x5mm_P0.5mm_EP3.3x3.3mm,C132156
|
||||
PLR135_T8,"U1,U2,U3,U4",PLR135-T8_PLT133-T8,C133351
|
||||
47uH,"L1,L2,L3,L4",L_0805_2012Metric,C14304
|
||||
100n,"C1,C12,C14,C15,C17,C2,C20,C3,C4,C5,C6,C7,C8",C_0603_1608Metric,C14663
|
||||
1u,"C11,C13",C_0603_1608Metric,C15849
|
||||
10u,C21,C_0805_2012Metric,C15850
|
||||
Connector_USB_C_Receptacle_USB2.0,"J4,J5",USB_C_Receptacle_XKB_U262-16XN-4BVC11,C165948
|
||||
1.5A,FB1,L_1206_3216Metric,C16902
|
||||
10n,C19,C_0805_2012Metric,C1710
|
||||
1k,"R1,R11,R2,R21,R23,R25,R8",R_0603_1608Metric,C21190
|
||||
Schottky,"D12,D13",D_SMA,C22452
|
||||
red,D1,LED_0603_1608Metric,C2286
|
||||
1M,"R12,R7",R_0603_1608Metric,C22935
|
||||
2k,"R24,R26",R_0603_1608Metric,C22975
|
||||
8k06 1%,"R17,R18",R_0603_1608Metric,C23112
|
||||
5k1,"R13,R14,R15,R16",R_0603_1608Metric,C23186
|
||||
2u2,"C10,C16,C18,C9",C_0603_1608Metric,C23630
|
||||
ME6212C18M5G,U7,SOT-23-5,C236669
|
||||
10k,"R19,R20",R_0603_1608Metric,C25804
|
||||
PLT133_T8,"TR1,TR2,TR3,TR4",PLT133_T8,C2940206
|
||||
yellow,"D10,D11,D2,D7",LED_0603_1608Metric,C72038
|
||||
green,"D3,D4,D5,D6,D8,D9",LED_0603_1608Metric,C72043
|
||||
MountingHole,H3,MountingHole_3.2mm_M3_Pad_Via,
|
||||
MountingHole,H4,MountingHole_3.2mm_M3_Pad_Via,
|
||||
Conn_02x32_Odd_Even,J3,PinHeader_2x32_P2.54mm_Vertical,
|
||||
Conn_01x26_Male,J7,PinHeader_1x26_P2.54mm_Horizontal,
|
||||
Conn_01x06_Male,J6,PinHeader_1x06_P2.54mm_Vertical,
|
||||
TestPoint,TP5,TestPoint_Pad_D1.5mm,
|
||||
Conn_01x01_Male,J9,PinHeader_1x01_P2.54mm_Horizontal,
|
||||
MountingHole,H2,MountingHole_3.2mm_M3_Pad_Via,
|
||||
Conn_01x06_Male,J1,PinHeader_1x06_P2.54mm_Vertical,
|
||||
Conn_01x01_Male,J8,PinHeader_1x01_P2.54mm_Horizontal,
|
||||
MountingHole,H1,MountingHole_3.2mm_M3_Pad_Via,
|
||||
Conn_02x32_Odd_Even,J2,PinHeader_2x32_P2.54mm_Vertical,
|
||||
Conn_01x04_Male,J11,PinHeader_1x04_P2.54mm_Horizontal,
|
||||
Conn_01x04_Male,J10,PinHeader_1x04_P2.54mm_Horizontal,
|
||||
|
87
hardware/rev0/jlcpcb/assembly/POS-adatface_baseboard.csv
Normal file
87
hardware/rev0/jlcpcb/assembly/POS-adatface_baseboard.csv
Normal file
@@ -0,0 +1,87 @@
|
||||
Designator,Val,Package,Mid X,Mid Y,Rotation,Layer
|
||||
C1,100n,C_0603_1608Metric,55.65,-138.6,90.0,top
|
||||
C2,100n,C_0603_1608Metric,55.65,-54.85,90.0,top
|
||||
C3,100n,C_0603_1608Metric,55.65,-82.6375,90.0,top
|
||||
C4,100n,C_0603_1608Metric,55.525979,-110.519892,90.0,top
|
||||
C5,100n,C_0603_1608Metric,55.65,-127.85,-90.0,top
|
||||
C6,100n,C_0603_1608Metric,55.5,-44.675,-90.0,top
|
||||
C7,100n,C_0603_1608Metric,55.45,-72.65,-90.0,top
|
||||
C8,100n,C_0603_1608Metric,56.136737,-100.320543,-90.0,top
|
||||
C9,2u2,C_0603_1608Metric,152.4,-60.35,-90.0,top
|
||||
C10,2u2,C_0603_1608Metric,151.3,-90.5,180.0,top
|
||||
C11,1u,C_0603_1608Metric,150.45,-70.95,-90.0,top
|
||||
C12,100n,C_0603_1608Metric,137.97,-82.5,180.0,top
|
||||
C13,1u,C_0603_1608Metric,157.75,-71.25,-90.0,top
|
||||
C14,100n,C_0603_1608Metric,137.72,-53.69,180.0,top
|
||||
C15,100n,C_0603_1608Metric,140.21,-80.73,180.0,top
|
||||
C16,2u2,C_0603_1608Metric,146.825,-83.9,90.0,top
|
||||
C17,100n,C_0603_1608Metric,139.45,-51.74,180.0,top
|
||||
C18,2u2,C_0603_1608Metric,147.55,-54.67,90.0,top
|
||||
C19,10n,C_0805_2012Metric,157.25,-102.0,0.0,top
|
||||
C20,100n,C_0603_1608Metric,157.5,-99.25,0.0,top
|
||||
C21,10u,C_0805_2012Metric,157.5,-97.25,0.0,top
|
||||
D1,red,LED_0603_1608Metric,157.0,-128.6,180.0,top
|
||||
D2,yellow,LED_0603_1608Metric,157.0,-122.816664,180.0,top
|
||||
D3,green,LED_0603_1608Metric,157.0,-111.25,180.0,top
|
||||
D4,green,LED_0603_1608Metric,157.0,-114.141666,180.0,top
|
||||
D5,green,LED_0603_1608Metric,157.0,-117.033332,180.0,top
|
||||
D6,green,LED_0603_1608Metric,157.0,-119.924998,180.0,top
|
||||
D7,yellow,LED_0603_1608Metric,146.025,-101.02,180.0,top
|
||||
D8,green,LED_0603_1608Metric,146.025,-103.597321,180.0,top
|
||||
D9,green,LED_0603_1608Metric,146.025,-108.751964,180.0,top
|
||||
D10,yellow,LED_0603_1608Metric,146.025,-106.174642,180.0,top
|
||||
D11,yellow,LED_0603_1608Metric,157.0,-125.70833,180.0,top
|
||||
D12,Schottky,D_SMA,156.9,-48.9,180.0,top
|
||||
D13,Schottky,D_SMA,157.0,-94.0,180.0,top
|
||||
FB1,1.5A,L_1206_3216Metric,160.5,-100.75,90.0,top
|
||||
J1,Conn_01x06_Male,PinHeader_1x06_P2.54mm_Vertical,132.25,-132.9,0.0,top
|
||||
J2,Conn_02x32_Odd_Even,PinHeader_2x32_P2.54mm_Vertical,67.945,-41.91,0.0,top
|
||||
J3,Conn_02x32_Odd_Even,PinHeader_2x32_P2.54mm_Vertical,128.65,-41.91,0.0,top
|
||||
J4,Connector_USB_C_Receptacle_USB2.0,USB_C_Receptacle_XKB_U262-16XN-4BVC11,158.65,-85.85,90.0,top
|
||||
J5,Connector_USB_C_Receptacle_USB2.0,USB_C_Receptacle_XKB_U262-16XN-4BVC11,158.65,-56.85,90.0,top
|
||||
J6,Conn_01x06_Male,PinHeader_1x06_P2.54mm_Vertical,99.0,-132.9,0.0,top
|
||||
J7,Conn_01x26_Male,PinHeader_1x26_P2.54mm_Horizontal,80.01,-41.783,0.0,top
|
||||
J8,Conn_01x01_Male,PinHeader_1x01_P2.54mm_Horizontal,124.25,-47.0,180.0,top
|
||||
J9,Conn_01x01_Male,PinHeader_1x01_P2.54mm_Horizontal,124.25,-43.25,180.0,top
|
||||
J10,Conn_01x04_Male,PinHeader_1x04_P2.54mm_Horizontal,107.49,-39.31,90.0,top
|
||||
J11,Conn_01x04_Male,PinHeader_1x04_P2.54mm_Horizontal,93.64,-39.365,90.0,top
|
||||
L1,47uH,L_0805_2012Metric,58.4,-136.85,-90.0,top
|
||||
L2,47uH,L_0805_2012Metric,58.65,-53.09375,-90.0,top
|
||||
L3,47uH,L_0805_2012Metric,58.45,-80.85,-90.0,top
|
||||
L4,47uH,L_0805_2012Metric,58.55,-108.8125,-90.0,top
|
||||
R1,1k,R_0603_1608Metric,135.8,-128.64,180.0,top
|
||||
R2,1k,R_0603_1608Metric,135.8,-122.856664,180.0,top
|
||||
R3,10k,R_0603_1608Metric,135.8,-111.29,180.0,top
|
||||
R4,10k,R_0603_1608Metric,135.8,-114.181666,180.0,top
|
||||
R5,10k,R_0603_1608Metric,135.8,-117.073332,180.0,top
|
||||
R6,10k,R_0603_1608Metric,135.8,-119.964998,180.0,top
|
||||
R7,1M,R_0603_1608Metric,157.7625,-79.25,0.0,top
|
||||
R8,1k,R_0603_1608Metric,135.8,-101.027811,180.0,top
|
||||
R9,10k,R_0603_1608Metric,135.8,-103.593358,180.0,top
|
||||
R10,10k,R_0603_1608Metric,135.8,-108.724452,180.0,top
|
||||
R11,1k,R_0603_1608Metric,135.8,-106.158905,180.0,top
|
||||
R12,1M,R_0603_1608Metric,157.65,-63.85,0.0,top
|
||||
R13,5k1,R_0603_1608Metric,151.2875,-87.2,180.0,top
|
||||
R14,5k1,R_0603_1608Metric,151.725,-82.675,180.0,top
|
||||
R15,5k1,R_0603_1608Metric,149.85,-58.3,180.0,top
|
||||
R16,5k1,R_0603_1608Metric,150.22,-55.07,0.0,top
|
||||
R17,8k06 1%,R_0603_1608Metric,144.8,-50.4,90.0,top
|
||||
R18,8k06 1%,R_0603_1608Metric,146.05,-80.85,0.0,top
|
||||
R19,10k,R_0603_1608Metric,149.7,-49.1,180.0,top
|
||||
R20,10k,R_0603_1608Metric,151.2625,-88.9,180.0,top
|
||||
R21,1k,R_0603_1608Metric,135.8,-125.74833,180.0,top
|
||||
R23,1k,R_0603_1608Metric,149.9,-61.1,180.0,top
|
||||
R24,2k,R_0603_1608Metric,146.3,-62.425,-90.0,top
|
||||
R25,1k,R_0603_1608Metric,150.925,-77.3625,180.0,top
|
||||
R26,2k,R_0603_1608Metric,148.51,-76.6375,90.0,top
|
||||
TR1,PLT133_T8,PLT133_T8,48.416023,-126.551533,-90.0,top
|
||||
TR2,PLT133_T8,PLT133_T8,48.430408,-43.357745,-90.0,top
|
||||
TR3,PLT133_T8,PLT133_T8,48.406111,-71.121385,-90.0,top
|
||||
TR4,PLT133_T8,PLT133_T8,48.32653,-98.843594,-90.0,top
|
||||
U1,PLR135_T8,PLR135-T8_PLT133-T8,48.426023,-139.789033,90.0,top
|
||||
U2,PLR135_T8,PLR135-T8_PLT133-T8,48.440408,-56.120245,90.0,top
|
||||
U3,PLR135_T8,PLR135-T8_PLT133-T8,48.4,-83.85,90.0,top
|
||||
U4,PLR135_T8,PLR135-T8_PLT133-T8,48.426023,-111.789033,90.0,top
|
||||
U5,USB3320,QFN-32-1EP_5x5mm_P0.5mm_EP3.3x3.3mm,142.65,-55.85,270.0,top
|
||||
U6,USB3320,QFN-32-1EP_5x5mm_P0.5mm_EP3.3x3.3mm,142.7,-84.875,270.0,top
|
||||
U7,ME6212C18M5G,SOT-23-5,154.15,-71.3875,180.0,top
|
||||
|
BIN
hardware/rev0/jlcpcb/gerber/GERBER-adatface_baseboard.zip
Normal file
BIN
hardware/rev0/jlcpcb/gerber/GERBER-adatface_baseboard.zip
Normal file
Binary file not shown.
23011
hardware/rev0/jlcpcb/gerber/adatface_baseboard-CuBottom.gbr
Normal file
23011
hardware/rev0/jlcpcb/gerber/adatface_baseboard-CuBottom.gbr
Normal file
File diff suppressed because it is too large
Load Diff
20514
hardware/rev0/jlcpcb/gerber/adatface_baseboard-CuIn1.gbr
Normal file
20514
hardware/rev0/jlcpcb/gerber/adatface_baseboard-CuIn1.gbr
Normal file
File diff suppressed because it is too large
Load Diff
20440
hardware/rev0/jlcpcb/gerber/adatface_baseboard-CuIn2.gbr
Normal file
20440
hardware/rev0/jlcpcb/gerber/adatface_baseboard-CuIn2.gbr
Normal file
File diff suppressed because it is too large
Load Diff
27700
hardware/rev0/jlcpcb/gerber/adatface_baseboard-CuTop.gbr
Normal file
27700
hardware/rev0/jlcpcb/gerber/adatface_baseboard-CuTop.gbr
Normal file
File diff suppressed because it is too large
Load Diff
26
hardware/rev0/jlcpcb/gerber/adatface_baseboard-EdgeCuts.gbr
Normal file
26
hardware/rev0/jlcpcb/gerber/adatface_baseboard-EdgeCuts.gbr
Normal file
@@ -0,0 +1,26 @@
|
||||
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.7)*%
|
||||
%TF.CreationDate,2022-08-08T23:44:24-07:00*%
|
||||
%TF.ProjectId,adatface_baseboard,61646174-6661-4636-955f-62617365626f,rev?*%
|
||||
%TF.SameCoordinates,Original*%
|
||||
%TF.FileFunction,Profile,NP*%
|
||||
%FSLAX46Y46*%
|
||||
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
|
||||
G04 Created by KiCad (PCBNEW (6.0.7)) date 2022-08-08 23:44:24*
|
||||
%MOMM*%
|
||||
%LPD*%
|
||||
G01*
|
||||
G04 APERTURE LIST*
|
||||
%TA.AperFunction,Profile*%
|
||||
%ADD10C,0.150000*%
|
||||
%TD*%
|
||||
G04 APERTURE END LIST*
|
||||
D10*
|
||||
X41350000Y-36650000D02*
|
||||
X162650000Y-36650000D01*
|
||||
X162650000Y-36650000D02*
|
||||
X162650000Y-148250000D01*
|
||||
X162650000Y-148250000D02*
|
||||
X41350000Y-148250000D01*
|
||||
X41350000Y-148250000D02*
|
||||
X41350000Y-36650000D01*
|
||||
M02*
|
||||
670
hardware/rev0/jlcpcb/gerber/adatface_baseboard-MaskBottom.gbr
Normal file
670
hardware/rev0/jlcpcb/gerber/adatface_baseboard-MaskBottom.gbr
Normal file
@@ -0,0 +1,670 @@
|
||||
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.7)*%
|
||||
%TF.CreationDate,2022-08-08T23:44:24-07:00*%
|
||||
%TF.ProjectId,adatface_baseboard,61646174-6661-4636-955f-62617365626f,rev?*%
|
||||
%TF.SameCoordinates,Original*%
|
||||
%TF.FileFunction,Soldermask,Bot*%
|
||||
%TF.FilePolarity,Negative*%
|
||||
%FSLAX46Y46*%
|
||||
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
|
||||
G04 Created by KiCad (PCBNEW (6.0.7)) date 2022-08-08 23:44:24*
|
||||
%MOMM*%
|
||||
%LPD*%
|
||||
G01*
|
||||
G04 APERTURE LIST*
|
||||
G04 Aperture macros list*
|
||||
%AMRoundRect*
|
||||
0 Rectangle with rounded corners*
|
||||
0 $1 Rounding radius*
|
||||
0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y pos of 4 corners*
|
||||
0 Add a 4 corners polygon primitive as box body*
|
||||
4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0*
|
||||
0 Add four circle primitives for the rounded corners*
|
||||
1,1,$1+$1,$2,$3*
|
||||
1,1,$1+$1,$4,$5*
|
||||
1,1,$1+$1,$6,$7*
|
||||
1,1,$1+$1,$8,$9*
|
||||
0 Add four rect primitives between the rounded corners*
|
||||
20,1,$1+$1,$2,$3,$4,$5,0*
|
||||
20,1,$1+$1,$4,$5,$6,$7,0*
|
||||
20,1,$1+$1,$6,$7,$8,$9,0*
|
||||
20,1,$1+$1,$8,$9,$2,$3,0*%
|
||||
G04 Aperture macros list end*
|
||||
%ADD10C,2.100000*%
|
||||
%ADD11C,1.708000*%
|
||||
%ADD12C,1.700000*%
|
||||
%ADD13C,2.050000*%
|
||||
%ADD14RoundRect,0.200000X-0.679000X0.679000X-0.679000X-0.679000X0.679000X-0.679000X0.679000X0.679000X0*%
|
||||
%ADD15C,1.758000*%
|
||||
%ADD16C,2.125000*%
|
||||
%ADD17RoundRect,0.200000X0.850000X-0.850000X0.850000X0.850000X-0.850000X0.850000X-0.850000X-0.850000X0*%
|
||||
%ADD18O,2.100000X2.100000*%
|
||||
%ADD19C,1.200000*%
|
||||
%ADD20C,6.800000*%
|
||||
%ADD21RoundRect,0.200000X-0.850000X-0.850000X0.850000X-0.850000X0.850000X0.850000X-0.850000X0.850000X0*%
|
||||
%ADD22C,1.050000*%
|
||||
%ADD23O,2.500000X1.400000*%
|
||||
%ADD24O,2.000000X1.400000*%
|
||||
%ADD25RoundRect,0.200000X0.850000X0.850000X-0.850000X0.850000X-0.850000X-0.850000X0.850000X-0.850000X0*%
|
||||
%ADD26C,0.860000*%
|
||||
%ADD27C,1.900000*%
|
||||
%ADD28C,1.060000*%
|
||||
%ADD29C,1.480000*%
|
||||
%ADD30C,1.260000*%
|
||||
G04 APERTURE END LIST*
|
||||
D10*
|
||||
%TO.C,U1*%
|
||||
X45816023Y-142589033D03*
|
||||
X45816023Y-136989033D03*
|
||||
D11*
|
||||
X51056023Y-137249033D03*
|
||||
D12*
|
||||
X51056023Y-139789033D03*
|
||||
D11*
|
||||
X51056023Y-142329033D03*
|
||||
D13*
|
||||
X48426023Y-137249033D03*
|
||||
X48426023Y-142329033D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,TR2*%
|
||||
X45810408Y-40557745D03*
|
||||
X45810408Y-46157745D03*
|
||||
D14*
|
||||
X51050408Y-40817745D03*
|
||||
D15*
|
||||
X51050408Y-43357745D03*
|
||||
X51050408Y-45897745D03*
|
||||
D16*
|
||||
X48430408Y-40817745D03*
|
||||
X48430408Y-45897745D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,TR3*%
|
||||
X45786111Y-68321385D03*
|
||||
X45786111Y-73921385D03*
|
||||
D14*
|
||||
X51026111Y-68581385D03*
|
||||
D15*
|
||||
X51026111Y-71121385D03*
|
||||
X51026111Y-73661385D03*
|
||||
D16*
|
||||
X48406111Y-68581385D03*
|
||||
X48406111Y-73661385D03*
|
||||
%TD*%
|
||||
D17*
|
||||
%TO.C,J11*%
|
||||
X93640000Y-39365000D03*
|
||||
D18*
|
||||
X96180000Y-39365000D03*
|
||||
X98720000Y-39365000D03*
|
||||
X101260000Y-39365000D03*
|
||||
%TD*%
|
||||
D19*
|
||||
%TO.C,H3*%
|
||||
X60050000Y-63700000D03*
|
||||
X64147056Y-62002944D03*
|
||||
X64850000Y-63700000D03*
|
||||
X60752944Y-62002944D03*
|
||||
X64147056Y-65397056D03*
|
||||
D20*
|
||||
X62450000Y-63700000D03*
|
||||
D19*
|
||||
X62450000Y-66100000D03*
|
||||
X60752944Y-65397056D03*
|
||||
X62450000Y-61300000D03*
|
||||
%TD*%
|
||||
%TO.C,H4*%
|
||||
X121793000Y-115049000D03*
|
||||
X123490056Y-110951944D03*
|
||||
X124193000Y-112649000D03*
|
||||
X123490056Y-114346056D03*
|
||||
X120095944Y-110951944D03*
|
||||
D20*
|
||||
X121793000Y-112649000D03*
|
||||
D19*
|
||||
X121793000Y-110249000D03*
|
||||
X119393000Y-112649000D03*
|
||||
X120095944Y-114346056D03*
|
||||
%TD*%
|
||||
D17*
|
||||
%TO.C,J10*%
|
||||
X107490000Y-39310000D03*
|
||||
D18*
|
||||
X110030000Y-39310000D03*
|
||||
X112570000Y-39310000D03*
|
||||
X115110000Y-39310000D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,U2*%
|
||||
X45830408Y-58920245D03*
|
||||
X45830408Y-53320245D03*
|
||||
D11*
|
||||
X51070408Y-53580245D03*
|
||||
D12*
|
||||
X51070408Y-56120245D03*
|
||||
D11*
|
||||
X51070408Y-58660245D03*
|
||||
D13*
|
||||
X48440408Y-53580245D03*
|
||||
X48440408Y-58660245D03*
|
||||
%TD*%
|
||||
D21*
|
||||
%TO.C,J3*%
|
||||
X128650000Y-41910000D03*
|
||||
D18*
|
||||
X131190000Y-41910000D03*
|
||||
X128650000Y-44450000D03*
|
||||
X131190000Y-44450000D03*
|
||||
X128650000Y-46990000D03*
|
||||
X131190000Y-46990000D03*
|
||||
X128650000Y-49530000D03*
|
||||
X131190000Y-49530000D03*
|
||||
X128650000Y-52070000D03*
|
||||
X131190000Y-52070000D03*
|
||||
X128650000Y-54610000D03*
|
||||
X131190000Y-54610000D03*
|
||||
X128650000Y-57150000D03*
|
||||
X131190000Y-57150000D03*
|
||||
X128650000Y-59690000D03*
|
||||
X131190000Y-59690000D03*
|
||||
X128650000Y-62230000D03*
|
||||
X131190000Y-62230000D03*
|
||||
X128650000Y-64770000D03*
|
||||
X131190000Y-64770000D03*
|
||||
X128650000Y-67310000D03*
|
||||
X131190000Y-67310000D03*
|
||||
X128650000Y-69850000D03*
|
||||
X131190000Y-69850000D03*
|
||||
X128650000Y-72390000D03*
|
||||
X131190000Y-72390000D03*
|
||||
X128650000Y-74930000D03*
|
||||
X131190000Y-74930000D03*
|
||||
X128650000Y-77470000D03*
|
||||
X131190000Y-77470000D03*
|
||||
X128650000Y-80010000D03*
|
||||
X131190000Y-80010000D03*
|
||||
X128650000Y-82550000D03*
|
||||
X131190000Y-82550000D03*
|
||||
X128650000Y-85090000D03*
|
||||
X131190000Y-85090000D03*
|
||||
X128650000Y-87630000D03*
|
||||
X131190000Y-87630000D03*
|
||||
X128650000Y-90170000D03*
|
||||
X131190000Y-90170000D03*
|
||||
X128650000Y-92710000D03*
|
||||
X131190000Y-92710000D03*
|
||||
X128650000Y-95250000D03*
|
||||
X131190000Y-95250000D03*
|
||||
X128650000Y-97790000D03*
|
||||
X131190000Y-97790000D03*
|
||||
X128650000Y-100330000D03*
|
||||
X131190000Y-100330000D03*
|
||||
X128650000Y-102870000D03*
|
||||
X131190000Y-102870000D03*
|
||||
X128650000Y-105410000D03*
|
||||
X131190000Y-105410000D03*
|
||||
X128650000Y-107950000D03*
|
||||
X131190000Y-107950000D03*
|
||||
X128650000Y-110490000D03*
|
||||
X131190000Y-110490000D03*
|
||||
X128650000Y-113030000D03*
|
||||
X131190000Y-113030000D03*
|
||||
X128650000Y-115570000D03*
|
||||
X131190000Y-115570000D03*
|
||||
X128650000Y-118110000D03*
|
||||
X131190000Y-118110000D03*
|
||||
X128650000Y-120650000D03*
|
||||
X131190000Y-120650000D03*
|
||||
%TD*%
|
||||
D21*
|
||||
%TO.C,J7*%
|
||||
X80010000Y-41783000D03*
|
||||
D18*
|
||||
X80010000Y-44323000D03*
|
||||
X80010000Y-46863000D03*
|
||||
X80010000Y-49403000D03*
|
||||
X80010000Y-51943000D03*
|
||||
X80010000Y-54483000D03*
|
||||
X80010000Y-57023000D03*
|
||||
X80010000Y-59563000D03*
|
||||
X80010000Y-62103000D03*
|
||||
X80010000Y-64643000D03*
|
||||
X80010000Y-67183000D03*
|
||||
X80010000Y-69723000D03*
|
||||
X80010000Y-72263000D03*
|
||||
X80010000Y-74803000D03*
|
||||
X80010000Y-77343000D03*
|
||||
X80010000Y-79883000D03*
|
||||
X80010000Y-82423000D03*
|
||||
X80010000Y-84963000D03*
|
||||
X80010000Y-87503000D03*
|
||||
X80010000Y-90043000D03*
|
||||
X80010000Y-92583000D03*
|
||||
X80010000Y-95123000D03*
|
||||
X80010000Y-97663000D03*
|
||||
X80010000Y-100203000D03*
|
||||
X80010000Y-102743000D03*
|
||||
X80010000Y-105283000D03*
|
||||
%TD*%
|
||||
D21*
|
||||
%TO.C,J6*%
|
||||
X99000000Y-132900000D03*
|
||||
D18*
|
||||
X99000000Y-135440000D03*
|
||||
X99000000Y-137980000D03*
|
||||
X99000000Y-140520000D03*
|
||||
X99000000Y-143060000D03*
|
||||
X99000000Y-145600000D03*
|
||||
%TD*%
|
||||
D22*
|
||||
%TO.C,J4*%
|
||||
X156045000Y-82960000D03*
|
||||
X156045000Y-88740000D03*
|
||||
D23*
|
||||
X155545000Y-90170000D03*
|
||||
D24*
|
||||
X159725000Y-90170000D03*
|
||||
X159725000Y-81530000D03*
|
||||
D23*
|
||||
X155545000Y-81530000D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,U3*%
|
||||
X45790000Y-86650000D03*
|
||||
X45790000Y-81050000D03*
|
||||
D11*
|
||||
X51030000Y-81310000D03*
|
||||
D12*
|
||||
X51030000Y-83850000D03*
|
||||
D11*
|
||||
X51030000Y-86390000D03*
|
||||
D13*
|
||||
X48400000Y-81310000D03*
|
||||
X48400000Y-86390000D03*
|
||||
%TD*%
|
||||
D25*
|
||||
%TO.C,J9*%
|
||||
X124250000Y-43250000D03*
|
||||
%TD*%
|
||||
D19*
|
||||
%TO.C,H2*%
|
||||
X62752944Y-141902944D03*
|
||||
X66850000Y-143600000D03*
|
||||
X64450000Y-146000000D03*
|
||||
X66147056Y-145297056D03*
|
||||
X64450000Y-141200000D03*
|
||||
X66147056Y-141902944D03*
|
||||
X62752944Y-145297056D03*
|
||||
X62050000Y-143600000D03*
|
||||
D20*
|
||||
X64450000Y-143600000D03*
|
||||
%TD*%
|
||||
D21*
|
||||
%TO.C,J1*%
|
||||
X132250000Y-132900000D03*
|
||||
D18*
|
||||
X132250000Y-135440000D03*
|
||||
X132250000Y-137980000D03*
|
||||
X132250000Y-140520000D03*
|
||||
X132250000Y-143060000D03*
|
||||
X132250000Y-145600000D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,TR4*%
|
||||
X45706530Y-96043594D03*
|
||||
X45706530Y-101643594D03*
|
||||
D14*
|
||||
X50946530Y-96303594D03*
|
||||
D15*
|
||||
X50946530Y-98843594D03*
|
||||
X50946530Y-101383594D03*
|
||||
D16*
|
||||
X48326530Y-96303594D03*
|
||||
X48326530Y-101383594D03*
|
||||
%TD*%
|
||||
D25*
|
||||
%TO.C,J8*%
|
||||
X124250000Y-47000000D03*
|
||||
%TD*%
|
||||
D20*
|
||||
%TO.C,H1*%
|
||||
X137925000Y-42100000D03*
|
||||
D19*
|
||||
X137925000Y-39700000D03*
|
||||
X137925000Y-44500000D03*
|
||||
X140325000Y-42100000D03*
|
||||
X139622056Y-43797056D03*
|
||||
X136227944Y-40402944D03*
|
||||
X135525000Y-42100000D03*
|
||||
X136227944Y-43797056D03*
|
||||
X139622056Y-40402944D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,U4*%
|
||||
X45816023Y-108989033D03*
|
||||
X45816023Y-114589033D03*
|
||||
D11*
|
||||
X51056023Y-109249033D03*
|
||||
D12*
|
||||
X51056023Y-111789033D03*
|
||||
D11*
|
||||
X51056023Y-114329033D03*
|
||||
D13*
|
||||
X48426023Y-109249033D03*
|
||||
X48426023Y-114329033D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,TR1*%
|
||||
X45796023Y-123751533D03*
|
||||
X45796023Y-129351533D03*
|
||||
D14*
|
||||
X51036023Y-124011533D03*
|
||||
D15*
|
||||
X51036023Y-126551533D03*
|
||||
X51036023Y-129091533D03*
|
||||
D16*
|
||||
X48416023Y-124011533D03*
|
||||
X48416023Y-129091533D03*
|
||||
%TD*%
|
||||
D21*
|
||||
%TO.C,J2*%
|
||||
X67945000Y-41910000D03*
|
||||
D18*
|
||||
X70485000Y-41910000D03*
|
||||
X67945000Y-44450000D03*
|
||||
X70485000Y-44450000D03*
|
||||
X67945000Y-46990000D03*
|
||||
X70485000Y-46990000D03*
|
||||
X67945000Y-49530000D03*
|
||||
X70485000Y-49530000D03*
|
||||
X67945000Y-52070000D03*
|
||||
X70485000Y-52070000D03*
|
||||
X67945000Y-54610000D03*
|
||||
X70485000Y-54610000D03*
|
||||
X67945000Y-57150000D03*
|
||||
X70485000Y-57150000D03*
|
||||
X67945000Y-59690000D03*
|
||||
X70485000Y-59690000D03*
|
||||
X67945000Y-62230000D03*
|
||||
X70485000Y-62230000D03*
|
||||
X67945000Y-64770000D03*
|
||||
X70485000Y-64770000D03*
|
||||
X67945000Y-67310000D03*
|
||||
X70485000Y-67310000D03*
|
||||
X67945000Y-69850000D03*
|
||||
X70485000Y-69850000D03*
|
||||
X67945000Y-72390000D03*
|
||||
X70485000Y-72390000D03*
|
||||
X67945000Y-74930000D03*
|
||||
X70485000Y-74930000D03*
|
||||
X67945000Y-77470000D03*
|
||||
X70485000Y-77470000D03*
|
||||
X67945000Y-80010000D03*
|
||||
X70485000Y-80010000D03*
|
||||
X67945000Y-82550000D03*
|
||||
X70485000Y-82550000D03*
|
||||
X67945000Y-85090000D03*
|
||||
X70485000Y-85090000D03*
|
||||
X67945000Y-87630000D03*
|
||||
X70485000Y-87630000D03*
|
||||
X67945000Y-90170000D03*
|
||||
X70485000Y-90170000D03*
|
||||
X67945000Y-92710000D03*
|
||||
X70485000Y-92710000D03*
|
||||
X67945000Y-95250000D03*
|
||||
X70485000Y-95250000D03*
|
||||
X67945000Y-97790000D03*
|
||||
X70485000Y-97790000D03*
|
||||
X67945000Y-100330000D03*
|
||||
X70485000Y-100330000D03*
|
||||
X67945000Y-102870000D03*
|
||||
X70485000Y-102870000D03*
|
||||
X67945000Y-105410000D03*
|
||||
X70485000Y-105410000D03*
|
||||
X67945000Y-107950000D03*
|
||||
X70485000Y-107950000D03*
|
||||
X67945000Y-110490000D03*
|
||||
X70485000Y-110490000D03*
|
||||
X67945000Y-113030000D03*
|
||||
X70485000Y-113030000D03*
|
||||
X67945000Y-115570000D03*
|
||||
X70485000Y-115570000D03*
|
||||
X67945000Y-118110000D03*
|
||||
X70485000Y-118110000D03*
|
||||
X67945000Y-120650000D03*
|
||||
X70485000Y-120650000D03*
|
||||
%TD*%
|
||||
D22*
|
||||
%TO.C,J5*%
|
||||
X156045000Y-53960000D03*
|
||||
X156045000Y-59740000D03*
|
||||
D23*
|
||||
X155545000Y-52530000D03*
|
||||
D24*
|
||||
X159725000Y-61170000D03*
|
||||
X159725000Y-52530000D03*
|
||||
D23*
|
||||
X155545000Y-61170000D03*
|
||||
%TD*%
|
||||
D26*
|
||||
X156425000Y-57125000D03*
|
||||
X156425000Y-56000000D03*
|
||||
X156035000Y-57775000D03*
|
||||
X155895500Y-56579500D03*
|
||||
X143650000Y-54850000D03*
|
||||
X141550000Y-61940000D03*
|
||||
D27*
|
||||
X155000000Y-97250000D03*
|
||||
D26*
|
||||
X142630000Y-91570000D03*
|
||||
X138430000Y-88610000D03*
|
||||
D28*
|
||||
X133030000Y-47130000D03*
|
||||
X135720000Y-47070000D03*
|
||||
D26*
|
||||
X141754384Y-83960199D03*
|
||||
X137350000Y-93040000D03*
|
||||
D12*
|
||||
X150450000Y-73100000D03*
|
||||
D26*
|
||||
X143650000Y-55850000D03*
|
||||
X149850000Y-50340000D03*
|
||||
X142750000Y-85950000D03*
|
||||
D28*
|
||||
X148500000Y-74250000D03*
|
||||
D26*
|
||||
X143310000Y-60280000D03*
|
||||
X137420000Y-86410000D03*
|
||||
D29*
|
||||
X144850000Y-63275000D03*
|
||||
D26*
|
||||
X133460000Y-66360000D03*
|
||||
X142650000Y-56850000D03*
|
||||
D28*
|
||||
X132940000Y-54600000D03*
|
||||
X153560000Y-82570000D03*
|
||||
D26*
|
||||
X132600000Y-59100000D03*
|
||||
X133010000Y-82430000D03*
|
||||
D27*
|
||||
X155000000Y-99300000D03*
|
||||
D30*
|
||||
X153550000Y-89200000D03*
|
||||
D26*
|
||||
X139990000Y-89530000D03*
|
||||
D29*
|
||||
X159600000Y-119900000D03*
|
||||
D26*
|
||||
X140480000Y-94090000D03*
|
||||
X135600000Y-77900000D03*
|
||||
X133020000Y-69860000D03*
|
||||
D28*
|
||||
X144800000Y-48750000D03*
|
||||
D26*
|
||||
X138300000Y-84650000D03*
|
||||
X138540000Y-64980000D03*
|
||||
X139180000Y-95670000D03*
|
||||
X143130000Y-89860000D03*
|
||||
X135060000Y-66330000D03*
|
||||
X141650000Y-54850000D03*
|
||||
X141750000Y-84850000D03*
|
||||
D28*
|
||||
X135710000Y-53680000D03*
|
||||
D26*
|
||||
X132490000Y-63710000D03*
|
||||
X141650000Y-55850000D03*
|
||||
D30*
|
||||
X153825000Y-53325000D03*
|
||||
D26*
|
||||
X142750000Y-83800000D03*
|
||||
X143650000Y-84850000D03*
|
||||
X141750000Y-85950000D03*
|
||||
D28*
|
||||
X137980000Y-80730000D03*
|
||||
D26*
|
||||
X136890000Y-64530000D03*
|
||||
D28*
|
||||
X137400000Y-51740000D03*
|
||||
D26*
|
||||
X133370000Y-90340000D03*
|
||||
X132600000Y-95790000D03*
|
||||
X143650000Y-85950000D03*
|
||||
X132860000Y-79660000D03*
|
||||
X147820000Y-87080000D03*
|
||||
D27*
|
||||
X154700000Y-102000000D03*
|
||||
D26*
|
||||
X147080000Y-60210000D03*
|
||||
X142750000Y-84850000D03*
|
||||
D29*
|
||||
X149420000Y-53910000D03*
|
||||
D28*
|
||||
X149412500Y-87200000D03*
|
||||
D26*
|
||||
X141200000Y-49890000D03*
|
||||
X133330000Y-77890000D03*
|
||||
X143650000Y-56850000D03*
|
||||
X135870000Y-91820000D03*
|
||||
D28*
|
||||
X136150000Y-82330000D03*
|
||||
D26*
|
||||
X138190000Y-92130000D03*
|
||||
X139940000Y-61480000D03*
|
||||
D28*
|
||||
X146825000Y-81975000D03*
|
||||
X149425000Y-90525000D03*
|
||||
X135950000Y-55600000D03*
|
||||
D26*
|
||||
X137330000Y-49910000D03*
|
||||
X143650000Y-83800000D03*
|
||||
X141650000Y-56850000D03*
|
||||
X140400000Y-91300000D03*
|
||||
D12*
|
||||
X155650000Y-63850000D03*
|
||||
D26*
|
||||
X132910000Y-75370000D03*
|
||||
X137520000Y-75810000D03*
|
||||
X135480000Y-80250000D03*
|
||||
X141400000Y-89670000D03*
|
||||
D28*
|
||||
X147520000Y-52640000D03*
|
||||
D26*
|
||||
X142650000Y-55850000D03*
|
||||
X135050000Y-93210000D03*
|
||||
X142650000Y-54850000D03*
|
||||
D12*
|
||||
X155400000Y-79250000D03*
|
||||
D29*
|
||||
X152400000Y-62550000D03*
|
||||
D26*
|
||||
X137420000Y-84850000D03*
|
||||
D12*
|
||||
X157750000Y-73800000D03*
|
||||
D29*
|
||||
X147841950Y-58391950D03*
|
||||
D30*
|
||||
X153775000Y-60500000D03*
|
||||
D26*
|
||||
X141290000Y-92730000D03*
|
||||
X135530000Y-67940000D03*
|
||||
X133790000Y-49070000D03*
|
||||
X141870000Y-76460000D03*
|
||||
D12*
|
||||
X58550000Y-106150000D03*
|
||||
X57650000Y-71850000D03*
|
||||
D26*
|
||||
X143529500Y-88095000D03*
|
||||
D28*
|
||||
X139667911Y-58032917D03*
|
||||
X143630000Y-59230000D03*
|
||||
X139240000Y-53920500D03*
|
||||
D26*
|
||||
X142029500Y-88114428D03*
|
||||
D12*
|
||||
X58650000Y-50343750D03*
|
||||
X58450000Y-78112500D03*
|
||||
D28*
|
||||
X142074144Y-59210155D03*
|
||||
D12*
|
||||
X153100000Y-68900000D03*
|
||||
X57900000Y-127100000D03*
|
||||
X153050000Y-73900000D03*
|
||||
D28*
|
||||
X140000000Y-82500000D03*
|
||||
D12*
|
||||
X58450000Y-99450000D03*
|
||||
D28*
|
||||
X139270000Y-87810000D03*
|
||||
D12*
|
||||
X58400000Y-134100000D03*
|
||||
X57150000Y-43850000D03*
|
||||
D28*
|
||||
X146350000Y-55850000D03*
|
||||
X145975000Y-84900000D03*
|
||||
D27*
|
||||
X159775000Y-68050000D03*
|
||||
D12*
|
||||
X145737840Y-67109048D03*
|
||||
D26*
|
||||
X142954263Y-80810000D03*
|
||||
D28*
|
||||
X141705105Y-52364145D03*
|
||||
D26*
|
||||
X141795263Y-81290000D03*
|
||||
D28*
|
||||
X142760000Y-51420000D03*
|
||||
D30*
|
||||
X133000000Y-127500000D03*
|
||||
D28*
|
||||
X133500000Y-121000000D03*
|
||||
X142460000Y-61320000D03*
|
||||
X137490000Y-47380000D03*
|
||||
D26*
|
||||
X143479500Y-52170000D03*
|
||||
X153070000Y-55710000D03*
|
||||
D28*
|
||||
X148912500Y-52427598D03*
|
||||
X146600000Y-54800000D03*
|
||||
D26*
|
||||
X148350000Y-83875000D03*
|
||||
D28*
|
||||
X149425000Y-88900000D03*
|
||||
X138950098Y-72390000D03*
|
||||
X149490000Y-59810000D03*
|
||||
X151730000Y-79770000D03*
|
||||
X153470000Y-83480000D03*
|
||||
D26*
|
||||
X142890000Y-77280000D03*
|
||||
X142970000Y-78004500D03*
|
||||
X145910000Y-83530000D03*
|
||||
X145900000Y-79490000D03*
|
||||
X143491719Y-81519809D03*
|
||||
X132150000Y-91450000D03*
|
||||
X139129124Y-86811999D03*
|
||||
X150450000Y-84625000D03*
|
||||
X153400000Y-87375000D03*
|
||||
X156425000Y-85000000D03*
|
||||
X156425000Y-86125000D03*
|
||||
X155895500Y-85579500D03*
|
||||
X156035000Y-86775000D03*
|
||||
M02*
|
||||
1114
hardware/rev0/jlcpcb/gerber/adatface_baseboard-MaskTop.gbr
Normal file
1114
hardware/rev0/jlcpcb/gerber/adatface_baseboard-MaskTop.gbr
Normal file
File diff suppressed because it is too large
Load Diff
BIN
hardware/rev0/jlcpcb/gerber/adatface_baseboard-NPTH-drl_map.pdf
Normal file
BIN
hardware/rev0/jlcpcb/gerber/adatface_baseboard-NPTH-drl_map.pdf
Normal file
Binary file not shown.
39
hardware/rev0/jlcpcb/gerber/adatface_baseboard-NPTH.drl
Normal file
39
hardware/rev0/jlcpcb/gerber/adatface_baseboard-NPTH.drl
Normal file
@@ -0,0 +1,39 @@
|
||||
M48
|
||||
; DRILL file {KiCad (6.0.7)} date Mon Aug 8 23:44:24 2022
|
||||
; FORMAT={-:-/ absolute / inch / decimal}
|
||||
; #@! TF.CreationDate,2022-08-08T23:44:24-07:00
|
||||
; #@! TF.GenerationSoftware,Kicad,Pcbnew,(6.0.7)
|
||||
; #@! TF.FileFunction,NonPlated,1,4,NPTH
|
||||
FMAT,2
|
||||
INCH
|
||||
; #@! TA.AperFunction,NonPlated,NPTH,ComponentDrill
|
||||
T1C0.0256
|
||||
; #@! TA.AperFunction,NonPlated,NPTH,ComponentDrill
|
||||
T2C0.0669
|
||||
%
|
||||
G90
|
||||
G05
|
||||
T1
|
||||
X6.1435Y-2.1244
|
||||
X6.1435Y-2.352
|
||||
X6.1435Y-3.2661
|
||||
X6.1435Y-3.4937
|
||||
T2
|
||||
X1.7995Y-3.7812
|
||||
X1.7995Y-4.0017
|
||||
X1.8026Y-2.6898
|
||||
X1.8026Y-2.9103
|
||||
X1.8028Y-3.1909
|
||||
X1.8028Y-3.4114
|
||||
X1.803Y-4.8721
|
||||
X1.803Y-5.0926
|
||||
X1.8036Y-1.5968
|
||||
X1.8036Y-1.8172
|
||||
X1.8038Y-4.2909
|
||||
X1.8038Y-4.5114
|
||||
X1.8038Y-5.3933
|
||||
X1.8038Y-5.6137
|
||||
X1.8043Y-2.0992
|
||||
X1.8043Y-2.3197
|
||||
T0
|
||||
M30
|
||||
BIN
hardware/rev0/jlcpcb/gerber/adatface_baseboard-PTH-drl_map.pdf
Normal file
BIN
hardware/rev0/jlcpcb/gerber/adatface_baseboard-PTH-drl_map.pdf
Normal file
Binary file not shown.
495
hardware/rev0/jlcpcb/gerber/adatface_baseboard-PTH.drl
Normal file
495
hardware/rev0/jlcpcb/gerber/adatface_baseboard-PTH.drl
Normal file
@@ -0,0 +1,495 @@
|
||||
M48
|
||||
; DRILL file {KiCad (6.0.7)} date Mon Aug 8 23:44:24 2022
|
||||
; FORMAT={-:-/ absolute / inch / decimal}
|
||||
; #@! TF.CreationDate,2022-08-08T23:44:24-07:00
|
||||
; #@! TF.GenerationSoftware,Kicad,Pcbnew,(6.0.7)
|
||||
; #@! TF.FileFunction,Plated,1,4,PTH
|
||||
FMAT,2
|
||||
INCH
|
||||
; #@! TA.AperFunction,Plated,PTH,ViaDrill
|
||||
T1C0.0079
|
||||
; #@! TA.AperFunction,Plated,PTH,ViaDrill
|
||||
T2C0.0157
|
||||
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
|
||||
T3C0.0197
|
||||
; #@! TA.AperFunction,Plated,PTH,ViaDrill
|
||||
T4C0.0236
|
||||
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
|
||||
T5C0.0236
|
||||
; #@! TA.AperFunction,Plated,PTH,ViaDrill
|
||||
T6C0.0315
|
||||
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
|
||||
T7C0.0315
|
||||
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
|
||||
T8C0.0335
|
||||
; #@! TA.AperFunction,Plated,PTH,ViaDrill
|
||||
T9C0.0394
|
||||
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
|
||||
T10C0.0394
|
||||
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
|
||||
T11C0.0433
|
||||
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
|
||||
T12C0.0453
|
||||
; #@! TA.AperFunction,Plated,PTH,ViaDrill
|
||||
T13C0.0472
|
||||
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
|
||||
T14C0.1260
|
||||
%
|
||||
G90
|
||||
G05
|
||||
T1
|
||||
X5.2028Y-3.6004
|
||||
X5.2161Y-2.5083
|
||||
X5.2205Y-2.3268
|
||||
X5.2205Y-3.7713
|
||||
X5.2307Y-3.1362
|
||||
X5.2327Y-2.9673
|
||||
X5.2366Y-3.2453
|
||||
X5.237Y-2.7504
|
||||
X5.2492Y-3.0665
|
||||
X5.2508Y-3.5567
|
||||
X5.2543Y-2.6126
|
||||
X5.2673Y-1.9319
|
||||
X5.3169Y-3.6697
|
||||
X5.3173Y-2.6114
|
||||
X5.3339Y-3.1594
|
||||
X5.3358Y-2.6748
|
||||
X5.3386Y-3.0669
|
||||
X5.3492Y-3.615
|
||||
X5.3894Y-2.5406
|
||||
X5.4067Y-1.965
|
||||
X5.4075Y-3.663
|
||||
X5.4102Y-3.3406
|
||||
X5.4102Y-3.402
|
||||
X5.4142Y-2.9846
|
||||
X5.4406Y-3.6272
|
||||
X5.4449Y-3.3327
|
||||
X5.45Y-3.4886
|
||||
X5.4543Y-2.5583
|
||||
X5.4775Y-3.4178
|
||||
X5.4795Y-3.7665
|
||||
X5.5094Y-2.4205
|
||||
X5.5114Y-3.5248
|
||||
X5.5276Y-3.5945
|
||||
X5.5307Y-3.7043
|
||||
X5.5591Y-1.9642
|
||||
X5.5626Y-3.6508
|
||||
X5.5669Y-3.5303
|
||||
X5.5728Y-2.4386
|
||||
X5.5768Y-2.1594
|
||||
X5.5768Y-2.1988
|
||||
X5.5768Y-2.2382
|
||||
X5.5807Y-3.3406
|
||||
X5.5807Y-3.3839
|
||||
X5.5809Y-3.3055
|
||||
X5.5825Y-3.2004
|
||||
X5.5854Y-3.0102
|
||||
X5.5917Y-3.4691
|
||||
X5.6154Y-3.6051
|
||||
X5.6161Y-2.1594
|
||||
X5.6161Y-2.1988
|
||||
X5.6161Y-2.2382
|
||||
X5.6201Y-3.2992
|
||||
X5.6201Y-3.3406
|
||||
X5.6201Y-3.3839
|
||||
X5.6256Y-3.0425
|
||||
X5.6281Y-3.1815
|
||||
X5.6287Y-3.071
|
||||
X5.635Y-3.5378
|
||||
X5.6421Y-2.3732
|
||||
X5.6488Y-2.0539
|
||||
X5.6493Y-3.2094
|
||||
X5.6508Y-3.4683
|
||||
X5.6555Y-2.1594
|
||||
X5.6555Y-2.1988
|
||||
X5.6555Y-2.2382
|
||||
X5.6555Y-3.2992
|
||||
X5.6555Y-3.3406
|
||||
X5.6555Y-3.3839
|
||||
X5.7441Y-3.1295
|
||||
X5.7445Y-3.2886
|
||||
X5.7906Y-2.3705
|
||||
X5.8197Y-3.4283
|
||||
X5.8406Y-3.3022
|
||||
X5.8996Y-1.9819
|
||||
X5.9232Y-3.3317
|
||||
X6.0264Y-2.1933
|
||||
X6.0394Y-3.44
|
||||
X6.1376Y-2.2275
|
||||
X6.1376Y-3.3693
|
||||
X6.1431Y-2.2746
|
||||
X6.1431Y-3.4163
|
||||
X6.1585Y-2.2047
|
||||
X6.1585Y-2.249
|
||||
X6.1585Y-3.3465
|
||||
X6.1585Y-3.3907
|
||||
T2
|
||||
X5.2339Y-2.1496
|
||||
X5.2374Y-1.8555
|
||||
X5.2559Y-4.7638
|
||||
X5.3429Y-2.1134
|
||||
X5.3433Y-1.8531
|
||||
X5.3524Y-2.189
|
||||
X5.3602Y-3.2413
|
||||
X5.4094Y-2.037
|
||||
X5.413Y-1.8654
|
||||
X5.4323Y-3.1783
|
||||
X5.4705Y-2.85
|
||||
X5.4819Y-2.1229
|
||||
X5.4831Y-3.4571
|
||||
X5.4987Y-2.2848
|
||||
X5.5118Y-3.248
|
||||
X5.5789Y-2.0616
|
||||
X5.5935Y-2.3311
|
||||
X5.6087Y-2.4142
|
||||
X5.6205Y-2.0244
|
||||
X5.6547Y-2.3319
|
||||
X5.7008Y-1.9193
|
||||
X5.747Y-3.3425
|
||||
X5.7618Y-2.1988
|
||||
X5.7717Y-2.1575
|
||||
X5.7805Y-3.2274
|
||||
X5.8079Y-2.0724
|
||||
X5.8465Y-2.9232
|
||||
X5.8627Y-2.0641
|
||||
X5.8824Y-3.4331
|
||||
X5.8829Y-3.5
|
||||
X5.8829Y-3.564
|
||||
X5.8854Y-2.3547
|
||||
X5.9736Y-3.1406
|
||||
X6.0421Y-3.2866
|
||||
X6.0457Y-3.2508
|
||||
T3
|
||||
X2.3642Y-2.5079
|
||||
X2.3918Y-2.4411
|
||||
X2.3918Y-2.5747
|
||||
X2.4429Y-5.6535
|
||||
X2.4587Y-2.4134
|
||||
X2.4587Y-2.6024
|
||||
X2.4706Y-5.5867
|
||||
X2.4706Y-5.7204
|
||||
X2.5255Y-2.4411
|
||||
X2.5255Y-2.5747
|
||||
X2.5374Y-5.5591
|
||||
X2.5374Y-5.748
|
||||
X2.5531Y-2.5079
|
||||
X2.6042Y-5.5867
|
||||
X2.6042Y-5.7204
|
||||
X2.6319Y-5.6535
|
||||
X4.7005Y-4.435
|
||||
X4.7282Y-4.3682
|
||||
X4.7282Y-4.5018
|
||||
X4.795Y-4.3405
|
||||
X4.795Y-4.5295
|
||||
X4.8618Y-4.3682
|
||||
X4.8618Y-4.5018
|
||||
X4.8895Y-4.435
|
||||
X5.3356Y-1.6575
|
||||
X5.3633Y-1.5907
|
||||
X5.3633Y-1.7243
|
||||
X5.4301Y-1.563
|
||||
X5.4301Y-1.752
|
||||
X5.4969Y-1.5907
|
||||
X5.4969Y-1.7243
|
||||
X5.5246Y-1.6575
|
||||
T4
|
||||
X5.2362Y-5.0197
|
||||
X6.0453Y-3.5118
|
||||
X6.0541Y-2.3819
|
||||
X6.0561Y-2.0994
|
||||
T6
|
||||
X5.7028Y-2.4911
|
||||
X5.8205Y-2.2989
|
||||
X5.8827Y-2.1224
|
||||
X6.0Y-2.4626
|
||||
X6.2835Y-4.7205
|
||||
T7
|
||||
X2.0091Y-3.2012
|
||||
X2.0091Y-3.3012
|
||||
X2.0091Y-3.4012
|
||||
X2.0101Y-4.3011
|
||||
X2.0101Y-4.4011
|
||||
X2.0101Y-4.5011
|
||||
X2.0101Y-5.4035
|
||||
X2.0101Y-5.5035
|
||||
X2.0101Y-5.6035
|
||||
X2.0106Y-2.1095
|
||||
X2.0106Y-2.2095
|
||||
X2.0106Y-2.3095
|
||||
T8
|
||||
X2.0058Y-3.7915
|
||||
X2.0058Y-3.8915
|
||||
X2.0058Y-3.9915
|
||||
X2.0089Y-2.7001
|
||||
X2.0089Y-2.8001
|
||||
X2.0089Y-2.9001
|
||||
X2.0093Y-4.8823
|
||||
X2.0093Y-4.9823
|
||||
X2.0093Y-5.0823
|
||||
X2.0099Y-1.607
|
||||
X2.0099Y-1.707
|
||||
X2.0099Y-1.807
|
||||
T9
|
||||
X2.25Y-1.7264
|
||||
X2.2697Y-2.8287
|
||||
X2.2795Y-5.0039
|
||||
X2.2992Y-5.2795
|
||||
X2.3012Y-3.0753
|
||||
X2.3012Y-3.9154
|
||||
X2.3051Y-4.1791
|
||||
X2.3091Y-1.982
|
||||
X5.7377Y-2.6421
|
||||
X5.9232Y-2.878
|
||||
X6.0256Y-2.9094
|
||||
X6.0276Y-2.7126
|
||||
X6.1181Y-3.1201
|
||||
X6.128Y-2.5138
|
||||
X6.2106Y-2.9055
|
||||
T10
|
||||
X2.675Y-1.65
|
||||
X2.675Y-1.75
|
||||
X2.675Y-1.85
|
||||
X2.675Y-1.95
|
||||
X2.675Y-2.05
|
||||
X2.675Y-2.15
|
||||
X2.675Y-2.25
|
||||
X2.675Y-2.35
|
||||
X2.675Y-2.45
|
||||
X2.675Y-2.55
|
||||
X2.675Y-2.65
|
||||
X2.675Y-2.75
|
||||
X2.675Y-2.85
|
||||
X2.675Y-2.95
|
||||
X2.675Y-3.05
|
||||
X2.675Y-3.15
|
||||
X2.675Y-3.25
|
||||
X2.675Y-3.35
|
||||
X2.675Y-3.45
|
||||
X2.675Y-3.55
|
||||
X2.675Y-3.65
|
||||
X2.675Y-3.75
|
||||
X2.675Y-3.85
|
||||
X2.675Y-3.95
|
||||
X2.675Y-4.05
|
||||
X2.675Y-4.15
|
||||
X2.675Y-4.25
|
||||
X2.675Y-4.35
|
||||
X2.675Y-4.45
|
||||
X2.675Y-4.55
|
||||
X2.675Y-4.65
|
||||
X2.675Y-4.75
|
||||
X2.775Y-1.65
|
||||
X2.775Y-1.75
|
||||
X2.775Y-1.85
|
||||
X2.775Y-1.95
|
||||
X2.775Y-2.05
|
||||
X2.775Y-2.15
|
||||
X2.775Y-2.25
|
||||
X2.775Y-2.35
|
||||
X2.775Y-2.45
|
||||
X2.775Y-2.55
|
||||
X2.775Y-2.65
|
||||
X2.775Y-2.75
|
||||
X2.775Y-2.85
|
||||
X2.775Y-2.95
|
||||
X2.775Y-3.05
|
||||
X2.775Y-3.15
|
||||
X2.775Y-3.25
|
||||
X2.775Y-3.35
|
||||
X2.775Y-3.45
|
||||
X2.775Y-3.55
|
||||
X2.775Y-3.65
|
||||
X2.775Y-3.75
|
||||
X2.775Y-3.85
|
||||
X2.775Y-3.95
|
||||
X2.775Y-4.05
|
||||
X2.775Y-4.15
|
||||
X2.775Y-4.25
|
||||
X2.775Y-4.35
|
||||
X2.775Y-4.45
|
||||
X2.775Y-4.55
|
||||
X2.775Y-4.65
|
||||
X2.775Y-4.75
|
||||
X3.15Y-1.645
|
||||
X3.15Y-1.745
|
||||
X3.15Y-1.845
|
||||
X3.15Y-1.945
|
||||
X3.15Y-2.045
|
||||
X3.15Y-2.145
|
||||
X3.15Y-2.245
|
||||
X3.15Y-2.345
|
||||
X3.15Y-2.445
|
||||
X3.15Y-2.545
|
||||
X3.15Y-2.645
|
||||
X3.15Y-2.745
|
||||
X3.15Y-2.845
|
||||
X3.15Y-2.945
|
||||
X3.15Y-3.045
|
||||
X3.15Y-3.145
|
||||
X3.15Y-3.245
|
||||
X3.15Y-3.345
|
||||
X3.15Y-3.445
|
||||
X3.15Y-3.545
|
||||
X3.15Y-3.645
|
||||
X3.15Y-3.745
|
||||
X3.15Y-3.845
|
||||
X3.15Y-3.945
|
||||
X3.15Y-4.045
|
||||
X3.15Y-4.145
|
||||
X3.6866Y-1.5498
|
||||
X3.7866Y-1.5498
|
||||
X3.8866Y-1.5498
|
||||
X3.8976Y-5.2323
|
||||
X3.8976Y-5.3323
|
||||
X3.8976Y-5.4323
|
||||
X3.8976Y-5.5323
|
||||
X3.8976Y-5.6323
|
||||
X3.8976Y-5.7323
|
||||
X3.9866Y-1.5498
|
||||
X4.2319Y-1.5476
|
||||
X4.3319Y-1.5476
|
||||
X4.4319Y-1.5476
|
||||
X4.5319Y-1.5476
|
||||
X4.8917Y-1.7028
|
||||
X4.8917Y-1.8504
|
||||
X5.065Y-1.65
|
||||
X5.065Y-1.75
|
||||
X5.065Y-1.85
|
||||
X5.065Y-1.95
|
||||
X5.065Y-2.05
|
||||
X5.065Y-2.15
|
||||
X5.065Y-2.25
|
||||
X5.065Y-2.35
|
||||
X5.065Y-2.45
|
||||
X5.065Y-2.55
|
||||
X5.065Y-2.65
|
||||
X5.065Y-2.75
|
||||
X5.065Y-2.85
|
||||
X5.065Y-2.95
|
||||
X5.065Y-3.05
|
||||
X5.065Y-3.15
|
||||
X5.065Y-3.25
|
||||
X5.065Y-3.35
|
||||
X5.065Y-3.45
|
||||
X5.065Y-3.55
|
||||
X5.065Y-3.65
|
||||
X5.065Y-3.75
|
||||
X5.065Y-3.85
|
||||
X5.065Y-3.95
|
||||
X5.065Y-4.05
|
||||
X5.065Y-4.15
|
||||
X5.065Y-4.25
|
||||
X5.065Y-4.35
|
||||
X5.065Y-4.45
|
||||
X5.065Y-4.55
|
||||
X5.065Y-4.65
|
||||
X5.065Y-4.75
|
||||
X5.165Y-1.65
|
||||
X5.165Y-1.75
|
||||
X5.165Y-1.85
|
||||
X5.165Y-1.95
|
||||
X5.165Y-2.05
|
||||
X5.165Y-2.15
|
||||
X5.165Y-2.25
|
||||
X5.165Y-2.35
|
||||
X5.165Y-2.45
|
||||
X5.165Y-2.55
|
||||
X5.165Y-2.65
|
||||
X5.165Y-2.75
|
||||
X5.165Y-2.85
|
||||
X5.165Y-2.95
|
||||
X5.165Y-3.05
|
||||
X5.165Y-3.15
|
||||
X5.165Y-3.25
|
||||
X5.165Y-3.35
|
||||
X5.165Y-3.45
|
||||
X5.165Y-3.55
|
||||
X5.165Y-3.65
|
||||
X5.165Y-3.75
|
||||
X5.165Y-3.85
|
||||
X5.165Y-3.95
|
||||
X5.165Y-4.05
|
||||
X5.165Y-4.15
|
||||
X5.165Y-4.25
|
||||
X5.165Y-4.35
|
||||
X5.165Y-4.45
|
||||
X5.165Y-4.55
|
||||
X5.165Y-4.65
|
||||
X5.165Y-4.75
|
||||
X5.2067Y-5.2323
|
||||
X5.2067Y-5.3323
|
||||
X5.2067Y-5.4323
|
||||
X5.2067Y-5.5323
|
||||
X5.2067Y-5.6323
|
||||
X5.2067Y-5.7323
|
||||
T11
|
||||
X1.9055Y-3.2012
|
||||
X1.9055Y-3.4012
|
||||
X1.9065Y-4.3011
|
||||
X1.9065Y-4.5011
|
||||
X1.9065Y-5.4035
|
||||
X1.9065Y-5.6035
|
||||
X1.9071Y-2.1095
|
||||
X1.9071Y-2.3095
|
||||
T12
|
||||
X1.9026Y-3.7915
|
||||
X1.9026Y-3.9915
|
||||
X1.9058Y-2.7001
|
||||
X1.9058Y-2.9001
|
||||
X1.9061Y-4.8823
|
||||
X1.9061Y-5.0823
|
||||
X1.9067Y-1.607
|
||||
X1.9067Y-1.807
|
||||
T13
|
||||
X6.0906Y-4.0157
|
||||
X6.1024Y-3.8287
|
||||
X6.1024Y-3.9094
|
||||
X6.2904Y-2.6791
|
||||
T14
|
||||
X2.4587Y-2.5079
|
||||
X2.5374Y-5.6535
|
||||
X4.795Y-4.435
|
||||
X5.4301Y-1.6575
|
||||
T5
|
||||
G00X6.1022Y-2.0681
|
||||
M15
|
||||
G01X6.1455Y-2.0681
|
||||
M16
|
||||
G05
|
||||
G00X6.1022Y-2.4083
|
||||
M15
|
||||
G01X6.1455Y-2.4083
|
||||
M16
|
||||
G05
|
||||
G00X6.1022Y-3.2098
|
||||
M15
|
||||
G01X6.1455Y-3.2098
|
||||
M16
|
||||
G05
|
||||
G00X6.1022Y-3.55
|
||||
M15
|
||||
G01X6.1455Y-3.55
|
||||
M16
|
||||
G05
|
||||
G00X6.2766Y-2.0681
|
||||
M15
|
||||
G01X6.3002Y-2.0681
|
||||
M16
|
||||
G05
|
||||
G00X6.2766Y-2.4083
|
||||
M15
|
||||
G01X6.3002Y-2.4083
|
||||
M16
|
||||
G05
|
||||
G00X6.2766Y-3.2098
|
||||
M15
|
||||
G01X6.3002Y-3.2098
|
||||
M16
|
||||
G05
|
||||
G00X6.2766Y-3.55
|
||||
M15
|
||||
G01X6.3002Y-3.55
|
||||
M16
|
||||
G05
|
||||
T0
|
||||
M30
|
||||
@@ -0,0 +1,15 @@
|
||||
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.7)*%
|
||||
%TF.CreationDate,2022-08-08T23:44:24-07:00*%
|
||||
%TF.ProjectId,adatface_baseboard,61646174-6661-4636-955f-62617365626f,rev?*%
|
||||
%TF.SameCoordinates,Original*%
|
||||
%TF.FileFunction,Paste,Bot*%
|
||||
%TF.FilePolarity,Positive*%
|
||||
%FSLAX46Y46*%
|
||||
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
|
||||
G04 Created by KiCad (PCBNEW (6.0.7)) date 2022-08-08 23:44:24*
|
||||
%MOMM*%
|
||||
%LPD*%
|
||||
G01*
|
||||
G04 APERTURE LIST*
|
||||
G04 APERTURE END LIST*
|
||||
M02*
|
||||
492
hardware/rev0/jlcpcb/gerber/adatface_baseboard-PasteTop.gbr
Normal file
492
hardware/rev0/jlcpcb/gerber/adatface_baseboard-PasteTop.gbr
Normal file
@@ -0,0 +1,492 @@
|
||||
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.7)*%
|
||||
%TF.CreationDate,2022-08-08T23:44:24-07:00*%
|
||||
%TF.ProjectId,adatface_baseboard,61646174-6661-4636-955f-62617365626f,rev?*%
|
||||
%TF.SameCoordinates,Original*%
|
||||
%TF.FileFunction,Paste,Top*%
|
||||
%TF.FilePolarity,Positive*%
|
||||
%FSLAX46Y46*%
|
||||
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
|
||||
G04 Created by KiCad (PCBNEW (6.0.7)) date 2022-08-08 23:44:24*
|
||||
%MOMM*%
|
||||
%LPD*%
|
||||
G01*
|
||||
G04 APERTURE LIST*
|
||||
G04 Aperture macros list*
|
||||
%AMRoundRect*
|
||||
0 Rectangle with rounded corners*
|
||||
0 $1 Rounding radius*
|
||||
0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y pos of 4 corners*
|
||||
0 Add a 4 corners polygon primitive as box body*
|
||||
4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0*
|
||||
0 Add four circle primitives for the rounded corners*
|
||||
1,1,$1+$1,$2,$3*
|
||||
1,1,$1+$1,$4,$5*
|
||||
1,1,$1+$1,$6,$7*
|
||||
1,1,$1+$1,$8,$9*
|
||||
0 Add four rect primitives between the rounded corners*
|
||||
20,1,$1+$1,$2,$3,$4,$5,0*
|
||||
20,1,$1+$1,$4,$5,$6,$7,0*
|
||||
20,1,$1+$1,$6,$7,$8,$9,0*
|
||||
20,1,$1+$1,$8,$9,$2,$3,0*%
|
||||
G04 Aperture macros list end*
|
||||
%ADD10RoundRect,0.218750X0.218750X0.256250X-0.218750X0.256250X-0.218750X-0.256250X0.218750X-0.256250X0*%
|
||||
%ADD11RoundRect,0.243750X-0.456250X0.243750X-0.456250X-0.243750X0.456250X-0.243750X0.456250X0.243750X0*%
|
||||
%ADD12RoundRect,0.218750X-0.256250X0.218750X-0.256250X-0.218750X0.256250X-0.218750X0.256250X0.218750X0*%
|
||||
%ADD13RoundRect,0.250000X0.625000X-0.375000X0.625000X0.375000X-0.625000X0.375000X-0.625000X-0.375000X0*%
|
||||
%ADD14R,1.060000X0.650000*%
|
||||
%ADD15RoundRect,0.218750X0.256250X-0.218750X0.256250X0.218750X-0.256250X0.218750X-0.256250X-0.218750X0*%
|
||||
%ADD16RoundRect,0.218750X-0.218750X-0.256250X0.218750X-0.256250X0.218750X0.256250X-0.218750X0.256250X0*%
|
||||
%ADD17RoundRect,0.243750X-0.243750X-0.456250X0.243750X-0.456250X0.243750X0.456250X-0.243750X0.456250X0*%
|
||||
%ADD18R,1.150000X0.300000*%
|
||||
%ADD19R,2.500000X1.800000*%
|
||||
%ADD20RoundRect,0.222500X-0.222500X-0.222500X0.222500X-0.222500X0.222500X0.222500X-0.222500X0.222500X0*%
|
||||
%ADD21RoundRect,0.062500X-0.375000X-0.062500X0.375000X-0.062500X0.375000X0.062500X-0.375000X0.062500X0*%
|
||||
%ADD22RoundRect,0.062500X-0.062500X-0.375000X0.062500X-0.375000X0.062500X0.375000X-0.062500X0.375000X0*%
|
||||
G04 APERTURE END LIST*
|
||||
D10*
|
||||
%TO.C,C10*%
|
||||
X152087500Y-90500000D03*
|
||||
X150512500Y-90500000D03*
|
||||
%TD*%
|
||||
%TO.C,R4*%
|
||||
X136587500Y-114181666D03*
|
||||
X135012500Y-114181666D03*
|
||||
%TD*%
|
||||
D11*
|
||||
%TO.C,L3*%
|
||||
X58450000Y-79912500D03*
|
||||
X58450000Y-81787500D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,C9*%
|
||||
X152400000Y-59562500D03*
|
||||
X152400000Y-61137500D03*
|
||||
%TD*%
|
||||
D13*
|
||||
%TO.C,FB1*%
|
||||
X160500000Y-102150000D03*
|
||||
X160500000Y-99350000D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,R8*%
|
||||
X136587500Y-101027811D03*
|
||||
X135012500Y-101027811D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,C5*%
|
||||
X55650000Y-127062500D03*
|
||||
X55650000Y-128637500D03*
|
||||
%TD*%
|
||||
D14*
|
||||
%TO.C,U7*%
|
||||
X153050000Y-70437500D03*
|
||||
X153050000Y-71387500D03*
|
||||
X153050000Y-72337500D03*
|
||||
X155250000Y-72337500D03*
|
||||
X155250000Y-70437500D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,D4*%
|
||||
X157787500Y-114141666D03*
|
||||
X156212500Y-114141666D03*
|
||||
%TD*%
|
||||
%TO.C,R13*%
|
||||
X152075000Y-87200000D03*
|
||||
X150500000Y-87200000D03*
|
||||
%TD*%
|
||||
%TO.C,D5*%
|
||||
X157787500Y-117033332D03*
|
||||
X156212500Y-117033332D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,C7*%
|
||||
X55450000Y-71862500D03*
|
||||
X55450000Y-73437500D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,R14*%
|
||||
X152512500Y-82675000D03*
|
||||
X150937500Y-82675000D03*
|
||||
%TD*%
|
||||
%TO.C,C12*%
|
||||
X138757500Y-82500000D03*
|
||||
X137182500Y-82500000D03*
|
||||
%TD*%
|
||||
D15*
|
||||
%TO.C,R17*%
|
||||
X144800000Y-51187500D03*
|
||||
X144800000Y-49612500D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,C11*%
|
||||
X150450000Y-70162500D03*
|
||||
X150450000Y-71737500D03*
|
||||
%TD*%
|
||||
D11*
|
||||
%TO.C,L4*%
|
||||
X58550000Y-107875000D03*
|
||||
X58550000Y-109750000D03*
|
||||
%TD*%
|
||||
D16*
|
||||
%TO.C,R18*%
|
||||
X145262500Y-80850000D03*
|
||||
X146837500Y-80850000D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,D1*%
|
||||
X157787500Y-128600000D03*
|
||||
X156212500Y-128600000D03*
|
||||
%TD*%
|
||||
D15*
|
||||
%TO.C,C3*%
|
||||
X55650000Y-83425000D03*
|
||||
X55650000Y-81850000D03*
|
||||
%TD*%
|
||||
D17*
|
||||
%TO.C,C21*%
|
||||
X156562500Y-97250000D03*
|
||||
X158437500Y-97250000D03*
|
||||
%TD*%
|
||||
D11*
|
||||
%TO.C,L1*%
|
||||
X58400000Y-135912500D03*
|
||||
X58400000Y-137787500D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,C14*%
|
||||
X138507500Y-53690000D03*
|
||||
X136932500Y-53690000D03*
|
||||
%TD*%
|
||||
D15*
|
||||
%TO.C,C2*%
|
||||
X55650000Y-55637500D03*
|
||||
X55650000Y-54062500D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,R3*%
|
||||
X136587500Y-111290000D03*
|
||||
X135012500Y-111290000D03*
|
||||
%TD*%
|
||||
D16*
|
||||
%TO.C,R12*%
|
||||
X156862500Y-63850000D03*
|
||||
X158437500Y-63850000D03*
|
||||
%TD*%
|
||||
D18*
|
||||
%TO.C,J4*%
|
||||
X154980000Y-89200000D03*
|
||||
X154980000Y-88400000D03*
|
||||
X154980000Y-87100000D03*
|
||||
X154980000Y-86100000D03*
|
||||
X154980000Y-85600000D03*
|
||||
X154980000Y-84600000D03*
|
||||
X154980000Y-83300000D03*
|
||||
X154980000Y-82500000D03*
|
||||
X154980000Y-82800000D03*
|
||||
X154980000Y-83600000D03*
|
||||
X154980000Y-84100000D03*
|
||||
X154980000Y-85100000D03*
|
||||
X154980000Y-86600000D03*
|
||||
X154980000Y-87600000D03*
|
||||
X154980000Y-88100000D03*
|
||||
X154980000Y-88900000D03*
|
||||
%TD*%
|
||||
D15*
|
||||
%TO.C,C1*%
|
||||
X55650000Y-139387500D03*
|
||||
X55650000Y-137812500D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,D2*%
|
||||
X157787500Y-122816664D03*
|
||||
X156212500Y-122816664D03*
|
||||
%TD*%
|
||||
D19*
|
||||
%TO.C,D12*%
|
||||
X158900000Y-48900000D03*
|
||||
X154900000Y-48900000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,R24*%
|
||||
X146300000Y-61637500D03*
|
||||
X146300000Y-63212500D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,R15*%
|
||||
X150637500Y-58300000D03*
|
||||
X149062500Y-58300000D03*
|
||||
%TD*%
|
||||
%TO.C,D9*%
|
||||
X146812500Y-108751964D03*
|
||||
X145237500Y-108751964D03*
|
||||
%TD*%
|
||||
%TO.C,R9*%
|
||||
X136587500Y-103593358D03*
|
||||
X135012500Y-103593358D03*
|
||||
%TD*%
|
||||
%TO.C,R1*%
|
||||
X136587500Y-128640000D03*
|
||||
X135012500Y-128640000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,C8*%
|
||||
X56136737Y-99533043D03*
|
||||
X56136737Y-101108043D03*
|
||||
%TD*%
|
||||
D15*
|
||||
%TO.C,R26*%
|
||||
X148510000Y-77425000D03*
|
||||
X148510000Y-75850000D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,D6*%
|
||||
X157787500Y-119924998D03*
|
||||
X156212500Y-119924998D03*
|
||||
%TD*%
|
||||
%TO.C,R5*%
|
||||
X136587500Y-117073332D03*
|
||||
X135012500Y-117073332D03*
|
||||
%TD*%
|
||||
%TO.C,R23*%
|
||||
X150687500Y-61100000D03*
|
||||
X149112500Y-61100000D03*
|
||||
%TD*%
|
||||
D15*
|
||||
%TO.C,C18*%
|
||||
X147550000Y-55457500D03*
|
||||
X147550000Y-53882500D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,R11*%
|
||||
X136587500Y-106158905D03*
|
||||
X135012500Y-106158905D03*
|
||||
%TD*%
|
||||
D16*
|
||||
%TO.C,R16*%
|
||||
X149432500Y-55070000D03*
|
||||
X151007500Y-55070000D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,R19*%
|
||||
X150487500Y-49100000D03*
|
||||
X148912500Y-49100000D03*
|
||||
%TD*%
|
||||
%TO.C,D10*%
|
||||
X146812500Y-106174642D03*
|
||||
X145237500Y-106174642D03*
|
||||
%TD*%
|
||||
%TO.C,R10*%
|
||||
X136587500Y-108724452D03*
|
||||
X135012500Y-108724452D03*
|
||||
%TD*%
|
||||
%TO.C,D7*%
|
||||
X146812500Y-101020000D03*
|
||||
X145237500Y-101020000D03*
|
||||
%TD*%
|
||||
D15*
|
||||
%TO.C,C4*%
|
||||
X55525979Y-111307392D03*
|
||||
X55525979Y-109732392D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,D11*%
|
||||
X157787500Y-125708330D03*
|
||||
X156212500Y-125708330D03*
|
||||
%TD*%
|
||||
D15*
|
||||
%TO.C,C16*%
|
||||
X146825000Y-84687500D03*
|
||||
X146825000Y-83112500D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,C17*%
|
||||
X140237500Y-51740000D03*
|
||||
X138662500Y-51740000D03*
|
||||
%TD*%
|
||||
%TO.C,D3*%
|
||||
X157787500Y-111250000D03*
|
||||
X156212500Y-111250000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,C6*%
|
||||
X55500000Y-43887500D03*
|
||||
X55500000Y-45462500D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,R6*%
|
||||
X136587500Y-119964998D03*
|
||||
X135012500Y-119964998D03*
|
||||
%TD*%
|
||||
%TO.C,R25*%
|
||||
X151712500Y-77362500D03*
|
||||
X150137500Y-77362500D03*
|
||||
%TD*%
|
||||
%TO.C,C15*%
|
||||
X140997500Y-80730000D03*
|
||||
X139422500Y-80730000D03*
|
||||
%TD*%
|
||||
D16*
|
||||
%TO.C,R7*%
|
||||
X156975000Y-79250000D03*
|
||||
X158550000Y-79250000D03*
|
||||
%TD*%
|
||||
%TO.C,C20*%
|
||||
X156712500Y-99250000D03*
|
||||
X158287500Y-99250000D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,R21*%
|
||||
X136587500Y-125748330D03*
|
||||
X135012500Y-125748330D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,C13*%
|
||||
X157750000Y-70462500D03*
|
||||
X157750000Y-72037500D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,D8*%
|
||||
X146812500Y-103597321D03*
|
||||
X145237500Y-103597321D03*
|
||||
%TD*%
|
||||
D20*
|
||||
%TO.C,U5*%
|
||||
X143750000Y-55850000D03*
|
||||
X142650000Y-55850000D03*
|
||||
X142650000Y-54750000D03*
|
||||
X143750000Y-54750000D03*
|
||||
X141550000Y-56950000D03*
|
||||
X141550000Y-55850000D03*
|
||||
X141550000Y-54750000D03*
|
||||
X142650000Y-56950000D03*
|
||||
X143750000Y-56950000D03*
|
||||
D21*
|
||||
X140212500Y-54100000D03*
|
||||
X140212500Y-54600000D03*
|
||||
X140212500Y-55100000D03*
|
||||
X140212500Y-55600000D03*
|
||||
X140212500Y-56100000D03*
|
||||
X140212500Y-56600000D03*
|
||||
X140212500Y-57100000D03*
|
||||
X140212500Y-57600000D03*
|
||||
D22*
|
||||
X140900000Y-58287500D03*
|
||||
X141400000Y-58287500D03*
|
||||
X141900000Y-58287500D03*
|
||||
X142400000Y-58287500D03*
|
||||
X142900000Y-58287500D03*
|
||||
X143400000Y-58287500D03*
|
||||
X143900000Y-58287500D03*
|
||||
X144400000Y-58287500D03*
|
||||
D21*
|
||||
X145087500Y-57600000D03*
|
||||
X145087500Y-57100000D03*
|
||||
X145087500Y-56600000D03*
|
||||
X145087500Y-56100000D03*
|
||||
X145087500Y-55600000D03*
|
||||
X145087500Y-55100000D03*
|
||||
X145087500Y-54600000D03*
|
||||
X145087500Y-54100000D03*
|
||||
D22*
|
||||
X144400000Y-53412500D03*
|
||||
X143900000Y-53412500D03*
|
||||
X143400000Y-53412500D03*
|
||||
X142900000Y-53412500D03*
|
||||
X142400000Y-53412500D03*
|
||||
X141900000Y-53412500D03*
|
||||
X141400000Y-53412500D03*
|
||||
X140900000Y-53412500D03*
|
||||
%TD*%
|
||||
D17*
|
||||
%TO.C,C19*%
|
||||
X156312500Y-102000000D03*
|
||||
X158187500Y-102000000D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,R2*%
|
||||
X136587500Y-122856664D03*
|
||||
X135012500Y-122856664D03*
|
||||
%TD*%
|
||||
D18*
|
||||
%TO.C,J5*%
|
||||
X154980000Y-60200000D03*
|
||||
X154980000Y-59400000D03*
|
||||
X154980000Y-58100000D03*
|
||||
X154980000Y-57100000D03*
|
||||
X154980000Y-56600000D03*
|
||||
X154980000Y-55600000D03*
|
||||
X154980000Y-54300000D03*
|
||||
X154980000Y-53500000D03*
|
||||
X154980000Y-53800000D03*
|
||||
X154980000Y-54600000D03*
|
||||
X154980000Y-55100000D03*
|
||||
X154980000Y-56100000D03*
|
||||
X154980000Y-57600000D03*
|
||||
X154980000Y-58600000D03*
|
||||
X154980000Y-59100000D03*
|
||||
X154980000Y-59900000D03*
|
||||
%TD*%
|
||||
D20*
|
||||
%TO.C,U6*%
|
||||
X141600000Y-85975000D03*
|
||||
X143800000Y-84875000D03*
|
||||
X141600000Y-84875000D03*
|
||||
X141600000Y-83775000D03*
|
||||
X142700000Y-83775000D03*
|
||||
X143800000Y-85975000D03*
|
||||
X143800000Y-83775000D03*
|
||||
X142700000Y-84875000D03*
|
||||
X142700000Y-85975000D03*
|
||||
D21*
|
||||
X140262500Y-83125000D03*
|
||||
X140262500Y-83625000D03*
|
||||
X140262500Y-84125000D03*
|
||||
X140262500Y-84625000D03*
|
||||
X140262500Y-85125000D03*
|
||||
X140262500Y-85625000D03*
|
||||
X140262500Y-86125000D03*
|
||||
X140262500Y-86625000D03*
|
||||
D22*
|
||||
X140950000Y-87312500D03*
|
||||
X141450000Y-87312500D03*
|
||||
X141950000Y-87312500D03*
|
||||
X142450000Y-87312500D03*
|
||||
X142950000Y-87312500D03*
|
||||
X143450000Y-87312500D03*
|
||||
X143950000Y-87312500D03*
|
||||
X144450000Y-87312500D03*
|
||||
D21*
|
||||
X145137500Y-86625000D03*
|
||||
X145137500Y-86125000D03*
|
||||
X145137500Y-85625000D03*
|
||||
X145137500Y-85125000D03*
|
||||
X145137500Y-84625000D03*
|
||||
X145137500Y-84125000D03*
|
||||
X145137500Y-83625000D03*
|
||||
X145137500Y-83125000D03*
|
||||
D22*
|
||||
X144450000Y-82437500D03*
|
||||
X143950000Y-82437500D03*
|
||||
X143450000Y-82437500D03*
|
||||
X142950000Y-82437500D03*
|
||||
X142450000Y-82437500D03*
|
||||
X141950000Y-82437500D03*
|
||||
X141450000Y-82437500D03*
|
||||
X140950000Y-82437500D03*
|
||||
%TD*%
|
||||
D19*
|
||||
%TO.C,D13*%
|
||||
X159000000Y-94000000D03*
|
||||
X155000000Y-94000000D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,R20*%
|
||||
X152050000Y-88900000D03*
|
||||
X150475000Y-88900000D03*
|
||||
%TD*%
|
||||
D11*
|
||||
%TO.C,L2*%
|
||||
X58650000Y-52156250D03*
|
||||
X58650000Y-54031250D03*
|
||||
%TD*%
|
||||
M02*
|
||||
671
hardware/rev0/jlcpcb/gerber/adatface_baseboard-SilkBottom.gbr
Normal file
671
hardware/rev0/jlcpcb/gerber/adatface_baseboard-SilkBottom.gbr
Normal file
@@ -0,0 +1,671 @@
|
||||
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.7)*%
|
||||
%TF.CreationDate,2022-08-08T23:44:24-07:00*%
|
||||
%TF.ProjectId,adatface_baseboard,61646174-6661-4636-955f-62617365626f,rev?*%
|
||||
%TF.SameCoordinates,Original*%
|
||||
%TF.FileFunction,Legend,Bot*%
|
||||
%TF.FilePolarity,Positive*%
|
||||
%FSLAX46Y46*%
|
||||
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
|
||||
G04 Created by KiCad (PCBNEW (6.0.7)) date 2022-08-08 23:44:24*
|
||||
%MOMM*%
|
||||
%LPD*%
|
||||
G01*
|
||||
G04 APERTURE LIST*
|
||||
G04 Aperture macros list*
|
||||
%AMRoundRect*
|
||||
0 Rectangle with rounded corners*
|
||||
0 $1 Rounding radius*
|
||||
0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y pos of 4 corners*
|
||||
0 Add a 4 corners polygon primitive as box body*
|
||||
4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0*
|
||||
0 Add four circle primitives for the rounded corners*
|
||||
1,1,$1+$1,$2,$3*
|
||||
1,1,$1+$1,$4,$5*
|
||||
1,1,$1+$1,$6,$7*
|
||||
1,1,$1+$1,$8,$9*
|
||||
0 Add four rect primitives between the rounded corners*
|
||||
20,1,$1+$1,$2,$3,$4,$5,0*
|
||||
20,1,$1+$1,$4,$5,$6,$7,0*
|
||||
20,1,$1+$1,$6,$7,$8,$9,0*
|
||||
20,1,$1+$1,$8,$9,$2,$3,0*%
|
||||
G04 Aperture macros list end*
|
||||
%ADD10C,2.100000*%
|
||||
%ADD11C,1.708000*%
|
||||
%ADD12C,1.700000*%
|
||||
%ADD13C,2.050000*%
|
||||
%ADD14RoundRect,0.200000X-0.679000X0.679000X-0.679000X-0.679000X0.679000X-0.679000X0.679000X0.679000X0*%
|
||||
%ADD15C,1.758000*%
|
||||
%ADD16C,2.125000*%
|
||||
%ADD17RoundRect,0.200000X0.850000X-0.850000X0.850000X0.850000X-0.850000X0.850000X-0.850000X-0.850000X0*%
|
||||
%ADD18O,2.100000X2.100000*%
|
||||
%ADD19C,1.200000*%
|
||||
%ADD20C,6.800000*%
|
||||
%ADD21RoundRect,0.200000X-0.850000X-0.850000X0.850000X-0.850000X0.850000X0.850000X-0.850000X0.850000X0*%
|
||||
%ADD22C,1.050000*%
|
||||
%ADD23O,2.500000X1.400000*%
|
||||
%ADD24O,2.000000X1.400000*%
|
||||
%ADD25RoundRect,0.200000X0.850000X0.850000X-0.850000X0.850000X-0.850000X-0.850000X0.850000X-0.850000X0*%
|
||||
%ADD26C,0.860000*%
|
||||
%ADD27C,1.900000*%
|
||||
%ADD28C,1.060000*%
|
||||
%ADD29C,1.480000*%
|
||||
%ADD30C,1.260000*%
|
||||
G04 APERTURE END LIST*
|
||||
%LPC*%
|
||||
D10*
|
||||
%TO.C,U1*%
|
||||
X45816023Y-142589033D03*
|
||||
X45816023Y-136989033D03*
|
||||
D11*
|
||||
X51056023Y-137249033D03*
|
||||
D12*
|
||||
X51056023Y-139789033D03*
|
||||
D11*
|
||||
X51056023Y-142329033D03*
|
||||
D13*
|
||||
X48426023Y-137249033D03*
|
||||
X48426023Y-142329033D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,TR2*%
|
||||
X45810408Y-40557745D03*
|
||||
X45810408Y-46157745D03*
|
||||
D14*
|
||||
X51050408Y-40817745D03*
|
||||
D15*
|
||||
X51050408Y-43357745D03*
|
||||
X51050408Y-45897745D03*
|
||||
D16*
|
||||
X48430408Y-40817745D03*
|
||||
X48430408Y-45897745D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,TR3*%
|
||||
X45786111Y-68321385D03*
|
||||
X45786111Y-73921385D03*
|
||||
D14*
|
||||
X51026111Y-68581385D03*
|
||||
D15*
|
||||
X51026111Y-71121385D03*
|
||||
X51026111Y-73661385D03*
|
||||
D16*
|
||||
X48406111Y-68581385D03*
|
||||
X48406111Y-73661385D03*
|
||||
%TD*%
|
||||
D17*
|
||||
%TO.C,J11*%
|
||||
X93640000Y-39365000D03*
|
||||
D18*
|
||||
X96180000Y-39365000D03*
|
||||
X98720000Y-39365000D03*
|
||||
X101260000Y-39365000D03*
|
||||
%TD*%
|
||||
D19*
|
||||
%TO.C,H3*%
|
||||
X60050000Y-63700000D03*
|
||||
X64147056Y-62002944D03*
|
||||
X64850000Y-63700000D03*
|
||||
X60752944Y-62002944D03*
|
||||
X64147056Y-65397056D03*
|
||||
D20*
|
||||
X62450000Y-63700000D03*
|
||||
D19*
|
||||
X62450000Y-66100000D03*
|
||||
X60752944Y-65397056D03*
|
||||
X62450000Y-61300000D03*
|
||||
%TD*%
|
||||
%TO.C,H4*%
|
||||
X121793000Y-115049000D03*
|
||||
X123490056Y-110951944D03*
|
||||
X124193000Y-112649000D03*
|
||||
X123490056Y-114346056D03*
|
||||
X120095944Y-110951944D03*
|
||||
D20*
|
||||
X121793000Y-112649000D03*
|
||||
D19*
|
||||
X121793000Y-110249000D03*
|
||||
X119393000Y-112649000D03*
|
||||
X120095944Y-114346056D03*
|
||||
%TD*%
|
||||
D17*
|
||||
%TO.C,J10*%
|
||||
X107490000Y-39310000D03*
|
||||
D18*
|
||||
X110030000Y-39310000D03*
|
||||
X112570000Y-39310000D03*
|
||||
X115110000Y-39310000D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,U2*%
|
||||
X45830408Y-58920245D03*
|
||||
X45830408Y-53320245D03*
|
||||
D11*
|
||||
X51070408Y-53580245D03*
|
||||
D12*
|
||||
X51070408Y-56120245D03*
|
||||
D11*
|
||||
X51070408Y-58660245D03*
|
||||
D13*
|
||||
X48440408Y-53580245D03*
|
||||
X48440408Y-58660245D03*
|
||||
%TD*%
|
||||
D21*
|
||||
%TO.C,J3*%
|
||||
X128650000Y-41910000D03*
|
||||
D18*
|
||||
X131190000Y-41910000D03*
|
||||
X128650000Y-44450000D03*
|
||||
X131190000Y-44450000D03*
|
||||
X128650000Y-46990000D03*
|
||||
X131190000Y-46990000D03*
|
||||
X128650000Y-49530000D03*
|
||||
X131190000Y-49530000D03*
|
||||
X128650000Y-52070000D03*
|
||||
X131190000Y-52070000D03*
|
||||
X128650000Y-54610000D03*
|
||||
X131190000Y-54610000D03*
|
||||
X128650000Y-57150000D03*
|
||||
X131190000Y-57150000D03*
|
||||
X128650000Y-59690000D03*
|
||||
X131190000Y-59690000D03*
|
||||
X128650000Y-62230000D03*
|
||||
X131190000Y-62230000D03*
|
||||
X128650000Y-64770000D03*
|
||||
X131190000Y-64770000D03*
|
||||
X128650000Y-67310000D03*
|
||||
X131190000Y-67310000D03*
|
||||
X128650000Y-69850000D03*
|
||||
X131190000Y-69850000D03*
|
||||
X128650000Y-72390000D03*
|
||||
X131190000Y-72390000D03*
|
||||
X128650000Y-74930000D03*
|
||||
X131190000Y-74930000D03*
|
||||
X128650000Y-77470000D03*
|
||||
X131190000Y-77470000D03*
|
||||
X128650000Y-80010000D03*
|
||||
X131190000Y-80010000D03*
|
||||
X128650000Y-82550000D03*
|
||||
X131190000Y-82550000D03*
|
||||
X128650000Y-85090000D03*
|
||||
X131190000Y-85090000D03*
|
||||
X128650000Y-87630000D03*
|
||||
X131190000Y-87630000D03*
|
||||
X128650000Y-90170000D03*
|
||||
X131190000Y-90170000D03*
|
||||
X128650000Y-92710000D03*
|
||||
X131190000Y-92710000D03*
|
||||
X128650000Y-95250000D03*
|
||||
X131190000Y-95250000D03*
|
||||
X128650000Y-97790000D03*
|
||||
X131190000Y-97790000D03*
|
||||
X128650000Y-100330000D03*
|
||||
X131190000Y-100330000D03*
|
||||
X128650000Y-102870000D03*
|
||||
X131190000Y-102870000D03*
|
||||
X128650000Y-105410000D03*
|
||||
X131190000Y-105410000D03*
|
||||
X128650000Y-107950000D03*
|
||||
X131190000Y-107950000D03*
|
||||
X128650000Y-110490000D03*
|
||||
X131190000Y-110490000D03*
|
||||
X128650000Y-113030000D03*
|
||||
X131190000Y-113030000D03*
|
||||
X128650000Y-115570000D03*
|
||||
X131190000Y-115570000D03*
|
||||
X128650000Y-118110000D03*
|
||||
X131190000Y-118110000D03*
|
||||
X128650000Y-120650000D03*
|
||||
X131190000Y-120650000D03*
|
||||
%TD*%
|
||||
D21*
|
||||
%TO.C,J7*%
|
||||
X80010000Y-41783000D03*
|
||||
D18*
|
||||
X80010000Y-44323000D03*
|
||||
X80010000Y-46863000D03*
|
||||
X80010000Y-49403000D03*
|
||||
X80010000Y-51943000D03*
|
||||
X80010000Y-54483000D03*
|
||||
X80010000Y-57023000D03*
|
||||
X80010000Y-59563000D03*
|
||||
X80010000Y-62103000D03*
|
||||
X80010000Y-64643000D03*
|
||||
X80010000Y-67183000D03*
|
||||
X80010000Y-69723000D03*
|
||||
X80010000Y-72263000D03*
|
||||
X80010000Y-74803000D03*
|
||||
X80010000Y-77343000D03*
|
||||
X80010000Y-79883000D03*
|
||||
X80010000Y-82423000D03*
|
||||
X80010000Y-84963000D03*
|
||||
X80010000Y-87503000D03*
|
||||
X80010000Y-90043000D03*
|
||||
X80010000Y-92583000D03*
|
||||
X80010000Y-95123000D03*
|
||||
X80010000Y-97663000D03*
|
||||
X80010000Y-100203000D03*
|
||||
X80010000Y-102743000D03*
|
||||
X80010000Y-105283000D03*
|
||||
%TD*%
|
||||
D21*
|
||||
%TO.C,J6*%
|
||||
X99000000Y-132900000D03*
|
||||
D18*
|
||||
X99000000Y-135440000D03*
|
||||
X99000000Y-137980000D03*
|
||||
X99000000Y-140520000D03*
|
||||
X99000000Y-143060000D03*
|
||||
X99000000Y-145600000D03*
|
||||
%TD*%
|
||||
D22*
|
||||
%TO.C,J4*%
|
||||
X156045000Y-82960000D03*
|
||||
X156045000Y-88740000D03*
|
||||
D23*
|
||||
X155545000Y-90170000D03*
|
||||
D24*
|
||||
X159725000Y-90170000D03*
|
||||
X159725000Y-81530000D03*
|
||||
D23*
|
||||
X155545000Y-81530000D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,U3*%
|
||||
X45790000Y-86650000D03*
|
||||
X45790000Y-81050000D03*
|
||||
D11*
|
||||
X51030000Y-81310000D03*
|
||||
D12*
|
||||
X51030000Y-83850000D03*
|
||||
D11*
|
||||
X51030000Y-86390000D03*
|
||||
D13*
|
||||
X48400000Y-81310000D03*
|
||||
X48400000Y-86390000D03*
|
||||
%TD*%
|
||||
D25*
|
||||
%TO.C,J9*%
|
||||
X124250000Y-43250000D03*
|
||||
%TD*%
|
||||
D19*
|
||||
%TO.C,H2*%
|
||||
X62752944Y-141902944D03*
|
||||
X66850000Y-143600000D03*
|
||||
X64450000Y-146000000D03*
|
||||
X66147056Y-145297056D03*
|
||||
X64450000Y-141200000D03*
|
||||
X66147056Y-141902944D03*
|
||||
X62752944Y-145297056D03*
|
||||
X62050000Y-143600000D03*
|
||||
D20*
|
||||
X64450000Y-143600000D03*
|
||||
%TD*%
|
||||
D21*
|
||||
%TO.C,J1*%
|
||||
X132250000Y-132900000D03*
|
||||
D18*
|
||||
X132250000Y-135440000D03*
|
||||
X132250000Y-137980000D03*
|
||||
X132250000Y-140520000D03*
|
||||
X132250000Y-143060000D03*
|
||||
X132250000Y-145600000D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,TR4*%
|
||||
X45706530Y-96043594D03*
|
||||
X45706530Y-101643594D03*
|
||||
D14*
|
||||
X50946530Y-96303594D03*
|
||||
D15*
|
||||
X50946530Y-98843594D03*
|
||||
X50946530Y-101383594D03*
|
||||
D16*
|
||||
X48326530Y-96303594D03*
|
||||
X48326530Y-101383594D03*
|
||||
%TD*%
|
||||
D25*
|
||||
%TO.C,J8*%
|
||||
X124250000Y-47000000D03*
|
||||
%TD*%
|
||||
D20*
|
||||
%TO.C,H1*%
|
||||
X137925000Y-42100000D03*
|
||||
D19*
|
||||
X137925000Y-39700000D03*
|
||||
X137925000Y-44500000D03*
|
||||
X140325000Y-42100000D03*
|
||||
X139622056Y-43797056D03*
|
||||
X136227944Y-40402944D03*
|
||||
X135525000Y-42100000D03*
|
||||
X136227944Y-43797056D03*
|
||||
X139622056Y-40402944D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,U4*%
|
||||
X45816023Y-108989033D03*
|
||||
X45816023Y-114589033D03*
|
||||
D11*
|
||||
X51056023Y-109249033D03*
|
||||
D12*
|
||||
X51056023Y-111789033D03*
|
||||
D11*
|
||||
X51056023Y-114329033D03*
|
||||
D13*
|
||||
X48426023Y-109249033D03*
|
||||
X48426023Y-114329033D03*
|
||||
%TD*%
|
||||
D10*
|
||||
%TO.C,TR1*%
|
||||
X45796023Y-123751533D03*
|
||||
X45796023Y-129351533D03*
|
||||
D14*
|
||||
X51036023Y-124011533D03*
|
||||
D15*
|
||||
X51036023Y-126551533D03*
|
||||
X51036023Y-129091533D03*
|
||||
D16*
|
||||
X48416023Y-124011533D03*
|
||||
X48416023Y-129091533D03*
|
||||
%TD*%
|
||||
D21*
|
||||
%TO.C,J2*%
|
||||
X67945000Y-41910000D03*
|
||||
D18*
|
||||
X70485000Y-41910000D03*
|
||||
X67945000Y-44450000D03*
|
||||
X70485000Y-44450000D03*
|
||||
X67945000Y-46990000D03*
|
||||
X70485000Y-46990000D03*
|
||||
X67945000Y-49530000D03*
|
||||
X70485000Y-49530000D03*
|
||||
X67945000Y-52070000D03*
|
||||
X70485000Y-52070000D03*
|
||||
X67945000Y-54610000D03*
|
||||
X70485000Y-54610000D03*
|
||||
X67945000Y-57150000D03*
|
||||
X70485000Y-57150000D03*
|
||||
X67945000Y-59690000D03*
|
||||
X70485000Y-59690000D03*
|
||||
X67945000Y-62230000D03*
|
||||
X70485000Y-62230000D03*
|
||||
X67945000Y-64770000D03*
|
||||
X70485000Y-64770000D03*
|
||||
X67945000Y-67310000D03*
|
||||
X70485000Y-67310000D03*
|
||||
X67945000Y-69850000D03*
|
||||
X70485000Y-69850000D03*
|
||||
X67945000Y-72390000D03*
|
||||
X70485000Y-72390000D03*
|
||||
X67945000Y-74930000D03*
|
||||
X70485000Y-74930000D03*
|
||||
X67945000Y-77470000D03*
|
||||
X70485000Y-77470000D03*
|
||||
X67945000Y-80010000D03*
|
||||
X70485000Y-80010000D03*
|
||||
X67945000Y-82550000D03*
|
||||
X70485000Y-82550000D03*
|
||||
X67945000Y-85090000D03*
|
||||
X70485000Y-85090000D03*
|
||||
X67945000Y-87630000D03*
|
||||
X70485000Y-87630000D03*
|
||||
X67945000Y-90170000D03*
|
||||
X70485000Y-90170000D03*
|
||||
X67945000Y-92710000D03*
|
||||
X70485000Y-92710000D03*
|
||||
X67945000Y-95250000D03*
|
||||
X70485000Y-95250000D03*
|
||||
X67945000Y-97790000D03*
|
||||
X70485000Y-97790000D03*
|
||||
X67945000Y-100330000D03*
|
||||
X70485000Y-100330000D03*
|
||||
X67945000Y-102870000D03*
|
||||
X70485000Y-102870000D03*
|
||||
X67945000Y-105410000D03*
|
||||
X70485000Y-105410000D03*
|
||||
X67945000Y-107950000D03*
|
||||
X70485000Y-107950000D03*
|
||||
X67945000Y-110490000D03*
|
||||
X70485000Y-110490000D03*
|
||||
X67945000Y-113030000D03*
|
||||
X70485000Y-113030000D03*
|
||||
X67945000Y-115570000D03*
|
||||
X70485000Y-115570000D03*
|
||||
X67945000Y-118110000D03*
|
||||
X70485000Y-118110000D03*
|
||||
X67945000Y-120650000D03*
|
||||
X70485000Y-120650000D03*
|
||||
%TD*%
|
||||
D22*
|
||||
%TO.C,J5*%
|
||||
X156045000Y-53960000D03*
|
||||
X156045000Y-59740000D03*
|
||||
D23*
|
||||
X155545000Y-52530000D03*
|
||||
D24*
|
||||
X159725000Y-61170000D03*
|
||||
X159725000Y-52530000D03*
|
||||
D23*
|
||||
X155545000Y-61170000D03*
|
||||
%TD*%
|
||||
D26*
|
||||
X156425000Y-57125000D03*
|
||||
X156425000Y-56000000D03*
|
||||
X156035000Y-57775000D03*
|
||||
X155895500Y-56579500D03*
|
||||
X143650000Y-54850000D03*
|
||||
X141550000Y-61940000D03*
|
||||
D27*
|
||||
X155000000Y-97250000D03*
|
||||
D26*
|
||||
X142630000Y-91570000D03*
|
||||
X138430000Y-88610000D03*
|
||||
D28*
|
||||
X133030000Y-47130000D03*
|
||||
X135720000Y-47070000D03*
|
||||
D26*
|
||||
X141754384Y-83960199D03*
|
||||
X137350000Y-93040000D03*
|
||||
D12*
|
||||
X150450000Y-73100000D03*
|
||||
D26*
|
||||
X143650000Y-55850000D03*
|
||||
X149850000Y-50340000D03*
|
||||
X142750000Y-85950000D03*
|
||||
D28*
|
||||
X148500000Y-74250000D03*
|
||||
D26*
|
||||
X143310000Y-60280000D03*
|
||||
X137420000Y-86410000D03*
|
||||
D29*
|
||||
X144850000Y-63275000D03*
|
||||
D26*
|
||||
X133460000Y-66360000D03*
|
||||
X142650000Y-56850000D03*
|
||||
D28*
|
||||
X132940000Y-54600000D03*
|
||||
X153560000Y-82570000D03*
|
||||
D26*
|
||||
X132600000Y-59100000D03*
|
||||
X133010000Y-82430000D03*
|
||||
D27*
|
||||
X155000000Y-99300000D03*
|
||||
D30*
|
||||
X153550000Y-89200000D03*
|
||||
D26*
|
||||
X139990000Y-89530000D03*
|
||||
D29*
|
||||
X159600000Y-119900000D03*
|
||||
D26*
|
||||
X140480000Y-94090000D03*
|
||||
X135600000Y-77900000D03*
|
||||
X133020000Y-69860000D03*
|
||||
D28*
|
||||
X144800000Y-48750000D03*
|
||||
D26*
|
||||
X138300000Y-84650000D03*
|
||||
X138540000Y-64980000D03*
|
||||
X139180000Y-95670000D03*
|
||||
X143130000Y-89860000D03*
|
||||
X135060000Y-66330000D03*
|
||||
X141650000Y-54850000D03*
|
||||
X141750000Y-84850000D03*
|
||||
D28*
|
||||
X135710000Y-53680000D03*
|
||||
D26*
|
||||
X132490000Y-63710000D03*
|
||||
X141650000Y-55850000D03*
|
||||
D30*
|
||||
X153825000Y-53325000D03*
|
||||
D26*
|
||||
X142750000Y-83800000D03*
|
||||
X143650000Y-84850000D03*
|
||||
X141750000Y-85950000D03*
|
||||
D28*
|
||||
X137980000Y-80730000D03*
|
||||
D26*
|
||||
X136890000Y-64530000D03*
|
||||
D28*
|
||||
X137400000Y-51740000D03*
|
||||
D26*
|
||||
X133370000Y-90340000D03*
|
||||
X132600000Y-95790000D03*
|
||||
X143650000Y-85950000D03*
|
||||
X132860000Y-79660000D03*
|
||||
X147820000Y-87080000D03*
|
||||
D27*
|
||||
X154700000Y-102000000D03*
|
||||
D26*
|
||||
X147080000Y-60210000D03*
|
||||
X142750000Y-84850000D03*
|
||||
D29*
|
||||
X149420000Y-53910000D03*
|
||||
D28*
|
||||
X149412500Y-87200000D03*
|
||||
D26*
|
||||
X141200000Y-49890000D03*
|
||||
X133330000Y-77890000D03*
|
||||
X143650000Y-56850000D03*
|
||||
X135870000Y-91820000D03*
|
||||
D28*
|
||||
X136150000Y-82330000D03*
|
||||
D26*
|
||||
X138190000Y-92130000D03*
|
||||
X139940000Y-61480000D03*
|
||||
D28*
|
||||
X146825000Y-81975000D03*
|
||||
X149425000Y-90525000D03*
|
||||
X135950000Y-55600000D03*
|
||||
D26*
|
||||
X137330000Y-49910000D03*
|
||||
X143650000Y-83800000D03*
|
||||
X141650000Y-56850000D03*
|
||||
X140400000Y-91300000D03*
|
||||
D12*
|
||||
X155650000Y-63850000D03*
|
||||
D26*
|
||||
X132910000Y-75370000D03*
|
||||
X137520000Y-75810000D03*
|
||||
X135480000Y-80250000D03*
|
||||
X141400000Y-89670000D03*
|
||||
D28*
|
||||
X147520000Y-52640000D03*
|
||||
D26*
|
||||
X142650000Y-55850000D03*
|
||||
X135050000Y-93210000D03*
|
||||
X142650000Y-54850000D03*
|
||||
D12*
|
||||
X155400000Y-79250000D03*
|
||||
D29*
|
||||
X152400000Y-62550000D03*
|
||||
D26*
|
||||
X137420000Y-84850000D03*
|
||||
D12*
|
||||
X157750000Y-73800000D03*
|
||||
D29*
|
||||
X147841950Y-58391950D03*
|
||||
D30*
|
||||
X153775000Y-60500000D03*
|
||||
D26*
|
||||
X141290000Y-92730000D03*
|
||||
X135530000Y-67940000D03*
|
||||
X133790000Y-49070000D03*
|
||||
X141870000Y-76460000D03*
|
||||
D12*
|
||||
X58550000Y-106150000D03*
|
||||
X57650000Y-71850000D03*
|
||||
D26*
|
||||
X143529500Y-88095000D03*
|
||||
D28*
|
||||
X139667911Y-58032917D03*
|
||||
X143630000Y-59230000D03*
|
||||
X139240000Y-53920500D03*
|
||||
D26*
|
||||
X142029500Y-88114428D03*
|
||||
D12*
|
||||
X58650000Y-50343750D03*
|
||||
X58450000Y-78112500D03*
|
||||
D28*
|
||||
X142074144Y-59210155D03*
|
||||
D12*
|
||||
X153100000Y-68900000D03*
|
||||
X57900000Y-127100000D03*
|
||||
X153050000Y-73900000D03*
|
||||
D28*
|
||||
X140000000Y-82500000D03*
|
||||
D12*
|
||||
X58450000Y-99450000D03*
|
||||
D28*
|
||||
X139270000Y-87810000D03*
|
||||
D12*
|
||||
X58400000Y-134100000D03*
|
||||
X57150000Y-43850000D03*
|
||||
D28*
|
||||
X146350000Y-55850000D03*
|
||||
X145975000Y-84900000D03*
|
||||
D27*
|
||||
X159775000Y-68050000D03*
|
||||
D12*
|
||||
X145737840Y-67109048D03*
|
||||
D26*
|
||||
X142954263Y-80810000D03*
|
||||
D28*
|
||||
X141705105Y-52364145D03*
|
||||
D26*
|
||||
X141795263Y-81290000D03*
|
||||
D28*
|
||||
X142760000Y-51420000D03*
|
||||
D30*
|
||||
X133000000Y-127500000D03*
|
||||
D28*
|
||||
X133500000Y-121000000D03*
|
||||
X142460000Y-61320000D03*
|
||||
X137490000Y-47380000D03*
|
||||
D26*
|
||||
X143479500Y-52170000D03*
|
||||
X153070000Y-55710000D03*
|
||||
D28*
|
||||
X148912500Y-52427598D03*
|
||||
X146600000Y-54800000D03*
|
||||
D26*
|
||||
X148350000Y-83875000D03*
|
||||
D28*
|
||||
X149425000Y-88900000D03*
|
||||
X138950098Y-72390000D03*
|
||||
X149490000Y-59810000D03*
|
||||
X151730000Y-79770000D03*
|
||||
X153470000Y-83480000D03*
|
||||
D26*
|
||||
X142890000Y-77280000D03*
|
||||
X142970000Y-78004500D03*
|
||||
X145910000Y-83530000D03*
|
||||
X145900000Y-79490000D03*
|
||||
X143491719Y-81519809D03*
|
||||
X132150000Y-91450000D03*
|
||||
X139129124Y-86811999D03*
|
||||
X150450000Y-84625000D03*
|
||||
X153400000Y-87375000D03*
|
||||
X156425000Y-85000000D03*
|
||||
X156425000Y-86125000D03*
|
||||
X155895500Y-85579500D03*
|
||||
X156035000Y-86775000D03*
|
||||
M02*
|
||||
6828
hardware/rev0/jlcpcb/gerber/adatface_baseboard-SilkTop.gbr
Normal file
6828
hardware/rev0/jlcpcb/gerber/adatface_baseboard-SilkTop.gbr
Normal file
File diff suppressed because it is too large
Load Diff
41
hardware/rev0/jlcpcb/gerber/adatface_baseboard-VScore.gbr
Normal file
41
hardware/rev0/jlcpcb/gerber/adatface_baseboard-VScore.gbr
Normal file
@@ -0,0 +1,41 @@
|
||||
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.7)*%
|
||||
%TF.CreationDate,2022-08-08T23:44:24-07:00*%
|
||||
%TF.ProjectId,adatface_baseboard,61646174-6661-4636-955f-62617365626f,rev?*%
|
||||
%TF.SameCoordinates,Original*%
|
||||
%TF.FileFunction,Other,Comment*%
|
||||
%FSLAX46Y46*%
|
||||
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
|
||||
G04 Created by KiCad (PCBNEW (6.0.7)) date 2022-08-08 23:44:24*
|
||||
%MOMM*%
|
||||
%LPD*%
|
||||
G01*
|
||||
G04 APERTURE LIST*
|
||||
%ADD10C,0.150000*%
|
||||
G04 APERTURE END LIST*
|
||||
D10*
|
||||
%TO.C,H3*%
|
||||
X65650000Y-63700000D02*
|
||||
G75*
|
||||
G03*
|
||||
X65650000Y-63700000I-3200000J0D01*
|
||||
G01*
|
||||
%TO.C,H4*%
|
||||
X124993000Y-112649000D02*
|
||||
G75*
|
||||
G03*
|
||||
X124993000Y-112649000I-3200000J0D01*
|
||||
G01*
|
||||
%TO.C,H2*%
|
||||
X67650000Y-143600000D02*
|
||||
G75*
|
||||
G03*
|
||||
X67650000Y-143600000I-3200000J0D01*
|
||||
G01*
|
||||
%TO.C,H1*%
|
||||
X141125000Y-42100000D02*
|
||||
G75*
|
||||
G03*
|
||||
X141125000Y-42100000I-3200000J0D01*
|
||||
G01*
|
||||
%TD*%
|
||||
M02*
|
||||
90
hardware/rev0/jlcpcb/part_assignments.csv.backup
Normal file
90
hardware/rev0/jlcpcb/part_assignments.csv.backup
Normal file
@@ -0,0 +1,90 @@
|
||||
N1,,1,1
|
||||
C10,C23630,0,0
|
||||
R4, C25804,0,0
|
||||
U1,,0,0
|
||||
TR2,,0,0
|
||||
L3,C14304,0,0
|
||||
TR3,,0,0
|
||||
C9,C23630,0,0
|
||||
FB1,C16902,0,0
|
||||
R8,C21190,0,0
|
||||
C5,C14663,0,0
|
||||
U7,C236669,0,0
|
||||
H3,,0,1
|
||||
H4,,0,1
|
||||
D4,C72043,0,0
|
||||
R13,C23186,0,0
|
||||
D5,C72043,0,0
|
||||
C7,C14663,0,0
|
||||
R14,C23186,0,0
|
||||
C12,C14663,0,0
|
||||
R17,C23112,0,0
|
||||
C11,C15849,0,0
|
||||
L4,C14304,0,0
|
||||
R18,C23112,0,0
|
||||
U2,,0,0
|
||||
D1,C2286,0,0
|
||||
C3,C14663,0,0
|
||||
C21,C15850,0,0
|
||||
L1,C14304,0,0
|
||||
J3,,0,0
|
||||
C14,C14663,0,0
|
||||
C2,C14663,0,0
|
||||
R3, C25804,0,0
|
||||
J6,,0,0
|
||||
R12,C22935,0,0
|
||||
TP5,,0,1
|
||||
J4,C165948,0,0
|
||||
C1,C14663,0,0
|
||||
D2,C72038,0,0
|
||||
D12,C22452,0,0
|
||||
R24,C22975,0,0
|
||||
R15,C23186,0,0
|
||||
D9,C72043,0,0
|
||||
R9, C25804,0,0
|
||||
R1,C21190,0,0
|
||||
U3,,0,0
|
||||
C8,C14663,0,0
|
||||
R26,C22975,0,0
|
||||
D6,C72043,0,0
|
||||
R5, C25804,0,0
|
||||
R23,C21190,0,0
|
||||
C18,C23630,0,0
|
||||
R11,C21190,0,0
|
||||
R16,C23186,0,0
|
||||
R19,C25804,0,0
|
||||
D10,C72038,0,0
|
||||
R10, C25804,0,0
|
||||
D7,C72038,0,0
|
||||
J9,,0,0
|
||||
H2,,0,1
|
||||
J1,,0,0
|
||||
C4,C14663,0,0
|
||||
D11,C72038,0,0
|
||||
C16,C23630,0,0
|
||||
C17,C14663,0,0
|
||||
D3,C72043,0,0
|
||||
C6,C14663,0,0
|
||||
TR4,,0,0
|
||||
R6, C25804,0,0
|
||||
R25,C21190,0,0
|
||||
J8,,0,0
|
||||
J7,,0,0
|
||||
C15,C14663,0,0
|
||||
R7,C22935,0,0
|
||||
C20,C14663,0,0
|
||||
H1,,0,1
|
||||
R21,C21190,0,0
|
||||
U4,,0,0
|
||||
C13,C15849,0,0
|
||||
D8,C72043,0,0
|
||||
TR1,,0,0
|
||||
J2,,0,0
|
||||
U5,C132156,0,0
|
||||
C19,C1710,0,0
|
||||
R2,C21190,0,0
|
||||
J5,C165948,0,0
|
||||
U6,C132156,0,0
|
||||
D13,C22452,0,0
|
||||
R20,C25804,0,0
|
||||
L2,C14304,0,0
|
||||
BIN
hardware/rev0/jlcpcb/project.db
Normal file
BIN
hardware/rev0/jlcpcb/project.db
Normal file
Binary file not shown.
4
hardware/rev0/sym-lib-table
Normal file
4
hardware/rev0/sym-lib-table
Normal file
@@ -0,0 +1,4 @@
|
||||
(sym_lib_table
|
||||
(lib (name "usb_ulpi")(type "KiCad")(uri "${KIPRJMOD}/usb_ulpi.kicad_sym")(options "")(descr ""))
|
||||
(lib (name "toslink")(type "KiCad")(uri "${KIPRJMOD}/toslink.kicad_sym")(options "")(descr ""))
|
||||
)
|
||||
242
hardware/rev0/toslink.kicad_sym
Normal file
242
hardware/rev0/toslink.kicad_sym
Normal file
@@ -0,0 +1,242 @@
|
||||
(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
|
||||
(symbol "PLR135_T10" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
|
||||
(property "Reference" "U?" (id 0) (at 10.0585 0.9085 0)
|
||||
(effects (font (size 1.27 1.27)) (justify left))
|
||||
)
|
||||
(property "Value" "PLR135_T10" (id 1) (at 10.0585 -1.8666 0)
|
||||
(effects (font (size 1.27 1.27)) (justify left))
|
||||
)
|
||||
(property "Footprint" "toslink:PLR135-T10_PLT133-T10W" (id 2) (at 0 0 0)
|
||||
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
|
||||
)
|
||||
(property "Datasheet" "" (id 3) (at 0 0 0)
|
||||
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
|
||||
)
|
||||
(symbol "PLR135_T10_0_0"
|
||||
(rectangle (start -5.08 -10.16) (end 5.08 10.16)
|
||||
(stroke (width 0.254) (type default) (color 0 0 0 0))
|
||||
(fill (type background))
|
||||
)
|
||||
(polyline
|
||||
(pts
|
||||
(xy 9.271 0.8636)
|
||||
(xy 7.62 -0.7874)
|
||||
)
|
||||
(stroke (width 0.3048) (type default) (color 0 0 0 0))
|
||||
(fill (type none))
|
||||
)
|
||||
(polyline
|
||||
(pts
|
||||
(xy 9.271 2.8956)
|
||||
(xy 7.62 1.2446)
|
||||
)
|
||||
(stroke (width 0.3048) (type default) (color 0 0 0 0))
|
||||
(fill (type none))
|
||||
)
|
||||
(polyline
|
||||
(pts
|
||||
(xy 6.604 -1.8034)
|
||||
(xy 7.239 -0.1524)
|
||||
(xy 8.255 -1.1684)
|
||||
(xy 6.604 -1.8034)
|
||||
)
|
||||
(stroke (width 0.1524) (type default) (color 0 0 0 0))
|
||||
(fill (type background))
|
||||
)
|
||||
(polyline
|
||||
(pts
|
||||
(xy 6.604 0.2286)
|
||||
(xy 7.239 1.8796)
|
||||
(xy 8.255 0.8636)
|
||||
(xy 6.604 0.2286)
|
||||
)
|
||||
(stroke (width 0.1524) (type default) (color 0 0 0 0))
|
||||
(fill (type background))
|
||||
)
|
||||
(pin input line (at -10.16 0 0) (length 5.08)
|
||||
(name "VCC" (effects (font (size 1.016 1.016))))
|
||||
(number "1" (effects (font (size 1.016 1.016))))
|
||||
)
|
||||
(pin power_in line (at -10.16 -7.62 0) (length 5.08)
|
||||
(name "GND" (effects (font (size 1.016 1.016))))
|
||||
(number "2" (effects (font (size 1.016 1.016))))
|
||||
)
|
||||
(pin output line (at -10.16 7.62 0) (length 5.08)
|
||||
(name "VOUT" (effects (font (size 1.016 1.016))))
|
||||
(number "3" (effects (font (size 1.016 1.016))))
|
||||
)
|
||||
)
|
||||
)
|
||||
(symbol "PLR135_T8" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
|
||||
(property "Reference" "U?" (id 0) (at 10.0585 0.9085 0)
|
||||
(effects (font (size 1.27 1.27)) (justify left))
|
||||
)
|
||||
(property "Value" "PLR135_T8" (id 1) (at 10.0585 -1.8666 0)
|
||||
(effects (font (size 1.27 1.27)) (justify left))
|
||||
)
|
||||
(property "Footprint" "toslink:PLR135-T8_PLT133-T8" (id 2) (at 0 0 0)
|
||||
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
|
||||
)
|
||||
(property "Datasheet" "" (id 3) (at 0 0 0)
|
||||
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
|
||||
)
|
||||
(symbol "PLR135_T8_0_0"
|
||||
(rectangle (start -5.08 -10.16) (end 5.08 10.16)
|
||||
(stroke (width 0.254) (type default) (color 0 0 0 0))
|
||||
(fill (type background))
|
||||
)
|
||||
(polyline
|
||||
(pts
|
||||
(xy 9.271 0.8636)
|
||||
(xy 7.62 -0.7874)
|
||||
)
|
||||
(stroke (width 0.3048) (type default) (color 0 0 0 0))
|
||||
(fill (type none))
|
||||
)
|
||||
(polyline
|
||||
(pts
|
||||
(xy 9.271 2.8956)
|
||||
(xy 7.62 1.2446)
|
||||
)
|
||||
(stroke (width 0.3048) (type default) (color 0 0 0 0))
|
||||
(fill (type none))
|
||||
)
|
||||
(polyline
|
||||
(pts
|
||||
(xy 6.604 -1.8034)
|
||||
(xy 7.239 -0.1524)
|
||||
(xy 8.255 -1.1684)
|
||||
(xy 6.604 -1.8034)
|
||||
)
|
||||
(stroke (width 0.1524) (type default) (color 0 0 0 0))
|
||||
(fill (type background))
|
||||
)
|
||||
(polyline
|
||||
(pts
|
||||
(xy 6.604 0.2286)
|
||||
(xy 7.239 1.8796)
|
||||
(xy 8.255 0.8636)
|
||||
(xy 6.604 0.2286)
|
||||
)
|
||||
(stroke (width 0.1524) (type default) (color 0 0 0 0))
|
||||
(fill (type background))
|
||||
)
|
||||
(pin input line (at -10.16 0 0) (length 5.08)
|
||||
(name "VCC" (effects (font (size 1.016 1.016))))
|
||||
(number "1" (effects (font (size 1.016 1.016))))
|
||||
)
|
||||
(pin power_in line (at -10.16 -7.62 0) (length 5.08)
|
||||
(name "GND" (effects (font (size 1.016 1.016))))
|
||||
(number "2" (effects (font (size 1.016 1.016))))
|
||||
)
|
||||
(pin output line (at -10.16 7.62 0) (length 5.08)
|
||||
(name "VOUT" (effects (font (size 1.016 1.016))))
|
||||
(number "3" (effects (font (size 1.016 1.016))))
|
||||
)
|
||||
)
|
||||
)
|
||||
(symbol "PLT133_T10W" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
|
||||
(property "Reference" "TR?" (id 0) (at 0 11.5866 0)
|
||||
(effects (font (size 1.27 1.27)))
|
||||
)
|
||||
(property "Value" "PLT133_T10W" (id 1) (at 0 8.8115 0)
|
||||
(effects (font (size 1.27 1.27)))
|
||||
)
|
||||
(property "Footprint" "toslink:PLT133_T10W" (id 2) (at 0 0 0)
|
||||
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
|
||||
)
|
||||
(property "Datasheet" "" (id 3) (at 0 0 0)
|
||||
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
|
||||
)
|
||||
(property "MAXIMUM_PACKAGE_HEIGHT" "10.3 mm" (id 4) (at 0 0 0)
|
||||
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
|
||||
)
|
||||
(property "MANUFACTURER" "Everlight Electronics" (id 5) (at 0 0 0)
|
||||
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
|
||||
)
|
||||
(property "PARTREV" "5" (id 6) (at 0 0 0)
|
||||
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
|
||||
)
|
||||
(property "STANDARD" "Manufacturer Recommendations" (id 7) (at 0 0 0)
|
||||
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
|
||||
)
|
||||
(symbol "PLT133_T10W_0_0"
|
||||
(rectangle (start -10.16 -7.62) (end 10.16 7.62)
|
||||
(stroke (width 0.254) (type default) (color 0 0 0 0))
|
||||
(fill (type background))
|
||||
)
|
||||
(pin input line (at -15.24 0 0) (length 5.08)
|
||||
(name "VIN" (effects (font (size 1.016 1.016))))
|
||||
(number "1" (effects (font (size 1.016 1.016))))
|
||||
)
|
||||
(pin power_in line (at 15.24 5.08 180) (length 5.08)
|
||||
(name "VCC" (effects (font (size 1.016 1.016))))
|
||||
(number "2" (effects (font (size 1.016 1.016))))
|
||||
)
|
||||
(pin power_in line (at 15.24 -5.08 180) (length 5.08)
|
||||
(name "GND" (effects (font (size 1.016 1.016))))
|
||||
(number "3" (effects (font (size 1.016 1.016))))
|
||||
)
|
||||
(pin no_connect line (at 15.24 -1.27 180) (length 5.08)
|
||||
(name "NC" (effects (font (size 1.016 1.016))))
|
||||
(number "4" (effects (font (size 1.016 1.016))))
|
||||
)
|
||||
(pin no_connect line (at 15.24 1.27 180) (length 5.08)
|
||||
(name "NC" (effects (font (size 1.016 1.016))))
|
||||
(number "5" (effects (font (size 1.016 1.016))))
|
||||
)
|
||||
)
|
||||
)
|
||||
(symbol "PLT133_T8" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
|
||||
(property "Reference" "TR?" (id 0) (at 0 11.5866 0)
|
||||
(effects (font (size 1.27 1.27)))
|
||||
)
|
||||
(property "Value" "PLT133_T8" (id 1) (at 0 8.8115 0)
|
||||
(effects (font (size 1.27 1.27)))
|
||||
)
|
||||
(property "Footprint" "toslink:PLT133_T8" (id 2) (at 0 0 0)
|
||||
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
|
||||
)
|
||||
(property "Datasheet" "" (id 3) (at 0 0 0)
|
||||
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
|
||||
)
|
||||
(property "MAXIMUM_PACKAGE_HEIGHT" "10.3 mm" (id 4) (at 0 0 0)
|
||||
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
|
||||
)
|
||||
(property "MANUFACTURER" "Everlight Electronics" (id 5) (at 0 0 0)
|
||||
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
|
||||
)
|
||||
(property "PARTREV" "5" (id 6) (at 0 0 0)
|
||||
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
|
||||
)
|
||||
(property "STANDARD" "Manufacturer Recommendations" (id 7) (at 0 0 0)
|
||||
(effects (font (size 1.27 1.27)) (justify left bottom) hide)
|
||||
)
|
||||
(symbol "PLT133_T8_0_0"
|
||||
(rectangle (start -10.16 -7.62) (end 10.16 7.62)
|
||||
(stroke (width 0.254) (type default) (color 0 0 0 0))
|
||||
(fill (type background))
|
||||
)
|
||||
(pin input line (at -15.24 0 0) (length 5.08)
|
||||
(name "VIN" (effects (font (size 1.016 1.016))))
|
||||
(number "1" (effects (font (size 1.016 1.016))))
|
||||
)
|
||||
(pin power_in line (at 15.24 5.08 180) (length 5.08)
|
||||
(name "VCC" (effects (font (size 1.016 1.016))))
|
||||
(number "2" (effects (font (size 1.016 1.016))))
|
||||
)
|
||||
(pin power_in line (at 15.24 -5.08 180) (length 5.08)
|
||||
(name "GND" (effects (font (size 1.016 1.016))))
|
||||
(number "3" (effects (font (size 1.016 1.016))))
|
||||
)
|
||||
(pin no_connect line (at 15.24 -1.27 180) (length 5.08)
|
||||
(name "NC" (effects (font (size 1.016 1.016))))
|
||||
(number "4" (effects (font (size 1.016 1.016))))
|
||||
)
|
||||
(pin no_connect line (at 15.24 1.27 180) (length 5.08)
|
||||
(name "NC" (effects (font (size 1.016 1.016))))
|
||||
(number "5" (effects (font (size 1.016 1.016))))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
33
hardware/rev0/toslink/PLR135-T10_PLT133-T10W.kicad_mod
Normal file
33
hardware/rev0/toslink/PLR135-T10_PLT133-T10W.kicad_mod
Normal file
@@ -0,0 +1,33 @@
|
||||
(footprint "PLR135-T10_PLT133-T10W" (version 20211014) (generator pcbnew)
|
||||
(layer "F.Cu")
|
||||
(tedit 62ED845D)
|
||||
(property "Sheetfile" "adatface_baseboard.kicad_sch")
|
||||
(property "Sheetname" "")
|
||||
(attr through_hole)
|
||||
(fp_text reference "U?" (at 4.520245 6.659592) (layer "F.SilkS")
|
||||
(effects (font (size 1.001236 1.001236) (thickness 0.15)))
|
||||
(tstamp 274a4512-10db-4170-a2fe-62e969b54fbd)
|
||||
)
|
||||
(fp_text value "PLR135-T10" (at 8.9712 6.365845) (layer "F.Fab") hide
|
||||
(effects (font (size 1.000134 1.000134) (thickness 0.15)))
|
||||
(tstamp c8e00d1e-5e9f-40d8-bace-ba352f916ad9)
|
||||
)
|
||||
(fp_line (start 4.85 -8.49) (end -4.85 -8.49) (layer "F.SilkS") (width 0.127) (tstamp 4713bb18-4205-4e4e-b7c4-681760de8a9d))
|
||||
(fp_line (start 4.85 -8.49) (end 4.85 5.01) (layer "F.SilkS") (width 0.127) (tstamp 61bccab3-566f-4dea-a450-cfd1d6e147ea))
|
||||
(fp_line (start -4.85 -8.49) (end -4.85 5.01) (layer "F.SilkS") (width 0.127) (tstamp 87d30ef5-7a07-4598-bf9a-1bebed659240))
|
||||
(fp_line (start 4.85 5.01) (end -4.85 5.01) (layer "F.SilkS") (width 0.127) (tstamp bd808326-5148-4995-ba70-28d10caf13d8))
|
||||
(fp_line (start -5.1 5.2) (end -5.1 -8.7) (layer "F.CrtYd") (width 0.127) (tstamp 2646ffa2-edd6-45fa-83aa-d8e75466a3e8))
|
||||
(fp_line (start -5.1 -8.7) (end 5.1 -8.7) (layer "F.CrtYd") (width 0.127) (tstamp 39aaf0c6-7e8d-4c33-bb2d-4f99396fcfb3))
|
||||
(fp_line (start 5.1 5.2) (end -5.1 5.2) (layer "F.CrtYd") (width 0.127) (tstamp 4812c9a8-aab9-4c0f-a6ef-12729e3cb61c))
|
||||
(fp_line (start 5.1 -8.7) (end 5.1 5.2) (layer "F.CrtYd") (width 0.127) (tstamp 9f9a383c-f1ba-4e21-94e5-2ab4285fcfde))
|
||||
(pad "1" thru_hole circle (at 2.54 2.63) (size 1.308 1.308) (drill 0.8) (layers *.Cu *.Mask) (tstamp 5772fbf1-8203-492b-a675-93c30d3ed452))
|
||||
(pad "2" thru_hole circle (at 0 2.63 180) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask) (tstamp 6d8a4612-2528-4718-9ceb-40e9028e8579))
|
||||
(pad "3" thru_hole circle (at -2.54 2.63) (size 1.308 1.308) (drill 0.8) (layers *.Cu *.Mask) (tstamp fcf637c4-a1c4-4fb4-bb87-8a7012a89df0))
|
||||
(pad "NC1" thru_hole circle (at 2.54 0) (size 1.65 1.65) (drill 1.1) (layers *.Cu *.Mask) (tstamp f5ecd236-566b-453a-a3d0-afc83a913511))
|
||||
(pad "NC2" thru_hole circle (at -2.54 0) (size 1.65 1.65) (drill 1.1) (layers *.Cu *.Mask) (tstamp 0770cbe5-4f07-4fb4-ae36-8abcb1535653))
|
||||
(model "${KIPRJMOD}/3d/PLT133_T10.step"
|
||||
(offset (xyz 0 8.5 0))
|
||||
(scale (xyz 1 1 1))
|
||||
(rotate (xyz -90 0 0))
|
||||
)
|
||||
)
|
||||
35
hardware/rev0/toslink/PLR135-T8_PLT133-T8.kicad_mod
Normal file
35
hardware/rev0/toslink/PLR135-T8_PLT133-T8.kicad_mod
Normal file
@@ -0,0 +1,35 @@
|
||||
(footprint "PLR135-T8_PLT133-T8" (version 20211014) (generator pcbnew)
|
||||
(layer "F.Cu")
|
||||
(tedit 62ED8454)
|
||||
(property "Sheetfile" "adatface_baseboard.kicad_sch")
|
||||
(property "Sheetname" "")
|
||||
(attr through_hole)
|
||||
(fp_text reference "U?" (at 4.520245 6.659592) (layer "F.SilkS")
|
||||
(effects (font (size 1.001236 1.001236) (thickness 0.15)))
|
||||
(tstamp 274a4512-10db-4170-a2fe-62e969b54fbd)
|
||||
)
|
||||
(fp_text value "PLR135-T10" (at 8.9712 6.365845) (layer "F.Fab") hide
|
||||
(effects (font (size 1.000134 1.000134) (thickness 0.15)))
|
||||
(tstamp c8e00d1e-5e9f-40d8-bace-ba352f916ad9)
|
||||
)
|
||||
(fp_line (start 4.85 -8.49) (end -4.85 -8.49) (layer "F.SilkS") (width 0.127) (tstamp 4713bb18-4205-4e4e-b7c4-681760de8a9d))
|
||||
(fp_line (start 4.85 -8.49) (end 4.85 5.01) (layer "F.SilkS") (width 0.127) (tstamp 61bccab3-566f-4dea-a450-cfd1d6e147ea))
|
||||
(fp_line (start -4.85 -8.49) (end -4.85 5.01) (layer "F.SilkS") (width 0.127) (tstamp 87d30ef5-7a07-4598-bf9a-1bebed659240))
|
||||
(fp_line (start 4.85 5.01) (end -4.85 5.01) (layer "F.SilkS") (width 0.127) (tstamp bd808326-5148-4995-ba70-28d10caf13d8))
|
||||
(fp_line (start -5.1 5.2) (end -5.1 -8.7) (layer "F.CrtYd") (width 0.127) (tstamp 2646ffa2-edd6-45fa-83aa-d8e75466a3e8))
|
||||
(fp_line (start -5.1 -8.7) (end 5.1 -8.7) (layer "F.CrtYd") (width 0.127) (tstamp 39aaf0c6-7e8d-4c33-bb2d-4f99396fcfb3))
|
||||
(fp_line (start 5.1 5.2) (end -5.1 5.2) (layer "F.CrtYd") (width 0.127) (tstamp 4812c9a8-aab9-4c0f-a6ef-12729e3cb61c))
|
||||
(fp_line (start 5.1 -8.7) (end 5.1 5.2) (layer "F.CrtYd") (width 0.127) (tstamp 9f9a383c-f1ba-4e21-94e5-2ab4285fcfde))
|
||||
(pad "" np_thru_hole circle (at 2.8 -2.61 180) (size 1.7 1.7) (drill 1.7) (layers *.Cu *.Mask) (tstamp 35d5c8cf-202c-492a-b75c-50edd0f3cf49))
|
||||
(pad "" np_thru_hole circle (at -2.8 -2.61 180) (size 1.7 1.7) (drill 1.7) (layers *.Cu *.Mask) (tstamp 9712cf59-dc7b-4c7d-8d23-b5a296888b8c))
|
||||
(pad "1" thru_hole circle (at 2.54 2.63) (size 1.308 1.308) (drill 0.8) (layers *.Cu *.Mask) (tstamp 5772fbf1-8203-492b-a675-93c30d3ed452))
|
||||
(pad "2" thru_hole circle (at 0 2.63 180) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask) (tstamp 6d8a4612-2528-4718-9ceb-40e9028e8579))
|
||||
(pad "3" thru_hole circle (at -2.54 2.63) (size 1.308 1.308) (drill 0.8) (layers *.Cu *.Mask) (tstamp fcf637c4-a1c4-4fb4-bb87-8a7012a89df0))
|
||||
(pad "NC1" thru_hole circle (at 2.54 0) (size 1.65 1.65) (drill 1.1) (layers *.Cu *.Mask) (tstamp f5ecd236-566b-453a-a3d0-afc83a913511))
|
||||
(pad "NC2" thru_hole circle (at -2.54 0) (size 1.65 1.65) (drill 1.1) (layers *.Cu *.Mask) (tstamp 0770cbe5-4f07-4fb4-ae36-8abcb1535653))
|
||||
(model "${KIPRJMOD}/3d/PLR135_T8.stp"
|
||||
(offset (xyz -2.54 -2.54 -0.127))
|
||||
(scale (xyz 1 1 1))
|
||||
(rotate (xyz 0 0 180))
|
||||
)
|
||||
)
|
||||
43
hardware/rev0/toslink/PLT133_T10W.kicad_mod
Normal file
43
hardware/rev0/toslink/PLT133_T10W.kicad_mod
Normal file
@@ -0,0 +1,43 @@
|
||||
(footprint "PLT133_T10W" (version 20211014) (generator pcbnew)
|
||||
(layer "F.Cu")
|
||||
(tedit 62ED8104)
|
||||
(property "MANUFACTURER" "Everlight Electronics")
|
||||
(property "MAXIMUM_PACKAGE_HEIGHT" "10.3 mm")
|
||||
(property "PARTREV" "5")
|
||||
(property "STANDARD" "Manufacturer Recommendations")
|
||||
(property "Sheetfile" "adatface_baseboard.kicad_sch")
|
||||
(property "Sheetname" "")
|
||||
(attr through_hole)
|
||||
(fp_text reference "TR?" (at -3.757745 -6.669592 180) (layer "F.SilkS")
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp 4846382d-ddbf-4e1e-8ac7-85b7bcae3eea)
|
||||
)
|
||||
(fp_text value "PLT133_T10W" (at 5.16 9.865 180) (layer "F.Fab") hide
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp 353f31aa-4004-42a5-b0f9-0015aa1d630c)
|
||||
)
|
||||
(fp_line (start -4.85 8.49) (end -4.85 -5.01) (layer "F.SilkS") (width 0.127) (tstamp 0eca6b4a-1db8-4dc0-acb1-3583d299a29e))
|
||||
(fp_line (start -4.85 8.49) (end 4.85 8.49) (layer "F.SilkS") (width 0.127) (tstamp 1298dce0-8173-4279-88dd-1e6f490be095))
|
||||
(fp_line (start -4.85 -5.01) (end 4.85 -5.01) (layer "F.SilkS") (width 0.127) (tstamp caf4e03a-b4ac-4289-a81a-5b1f96d9b3eb))
|
||||
(fp_line (start 4.85 8.49) (end 4.85 -5.01) (layer "F.SilkS") (width 0.127) (tstamp d6aa1abe-a47f-427e-807e-631bf58e4b42))
|
||||
(fp_circle (center -5.4 -2.62) (end -5.3 -2.62) (layer "F.SilkS") (width 0.2) (fill none) (tstamp d21d7616-8bd3-4879-8a20-b6e388d2f492))
|
||||
(fp_line (start 5.1 8.74) (end -5.1 8.74) (layer "F.CrtYd") (width 0.05) (tstamp 0dbf5f00-0fcf-4062-b0e8-b71667c6750c))
|
||||
(fp_line (start -5.1 8.74) (end -5.1 -5.26) (layer "F.CrtYd") (width 0.05) (tstamp 359a6f95-9f71-4b49-9093-61a6c7538fd9))
|
||||
(fp_line (start -5.1 -5.26) (end 5.1 -5.26) (layer "F.CrtYd") (width 0.05) (tstamp 4cde9787-61b9-40c9-b61e-2f1ddb6197d9))
|
||||
(fp_line (start 5.1 -5.26) (end 5.1 8.74) (layer "F.CrtYd") (width 0.05) (tstamp e4461b35-cb34-496c-a55c-b06d6ea6de0e))
|
||||
(fp_line (start -4.85 8.49) (end -4.85 -5.01) (layer "F.Fab") (width 0.127) (tstamp 33ec82cd-cac8-46d4-bfe2-883cfdc799a6))
|
||||
(fp_line (start -4.85 8.49) (end 4.85 8.49) (layer "F.Fab") (width 0.127) (tstamp 6262c5a8-8816-4e5c-b532-127e6bc15e9b))
|
||||
(fp_line (start -4.85 -5.01) (end 4.85 -5.01) (layer "F.Fab") (width 0.127) (tstamp 7e690956-6dfd-455f-ab4b-877cde9bbec3))
|
||||
(fp_line (start 4.85 8.49) (end 4.85 -5.01) (layer "F.Fab") (width 0.127) (tstamp 956a6877-d519-4f7b-b5f6-0fb0be55f6da))
|
||||
(fp_circle (center -5.4 -2.62) (end -5.3 -2.62) (layer "F.Fab") (width 0.2) (fill none) (tstamp 1472c624-edd9-4b58-ae41-7b50a4a0d5be))
|
||||
(pad "1" thru_hole rect (at -2.54 -2.62) (size 1.358 1.358) (drill 0.85) (layers *.Cu *.Mask) (tstamp 1264c3d6-3a9d-4304-a1ba-2ecf28689c84))
|
||||
(pad "2" thru_hole circle (at 0 -2.62) (size 1.358 1.358) (drill 0.85) (layers *.Cu *.Mask) (tstamp 42b86eb2-da34-4245-a669-2ed06961957a))
|
||||
(pad "3" thru_hole circle (at 2.54 -2.62) (size 1.358 1.358) (drill 0.85) (layers *.Cu *.Mask) (tstamp 76553da1-0353-45af-926a-42bcf4ee5e4c))
|
||||
(pad "4" thru_hole circle (at -2.54 0) (size 1.725 1.725) (drill 1.15) (layers *.Cu *.Mask) (tstamp 23136332-1fec-402d-97cf-3f04eb336397))
|
||||
(pad "5" thru_hole circle (at 2.54 0) (size 1.725 1.725) (drill 1.15) (layers *.Cu *.Mask) (tstamp d462d8ce-bf59-4e64-bbff-abe63047bba1))
|
||||
(model "${KIPRJMOD}/3d/PLT133_T10.step"
|
||||
(offset (xyz 0 -8.5 0))
|
||||
(scale (xyz 1 1 1))
|
||||
(rotate (xyz -90 0 180))
|
||||
)
|
||||
)
|
||||
45
hardware/rev0/toslink/PLT133_T8.kicad_mod
Normal file
45
hardware/rev0/toslink/PLT133_T8.kicad_mod
Normal file
@@ -0,0 +1,45 @@
|
||||
(footprint "PLT133_T8" (version 20211014) (generator pcbnew)
|
||||
(layer "F.Cu")
|
||||
(tedit 62ED84F6)
|
||||
(property "MANUFACTURER" "Everlight Electronics")
|
||||
(property "MAXIMUM_PACKAGE_HEIGHT" "10.3 mm")
|
||||
(property "PARTREV" "5")
|
||||
(property "STANDARD" "Manufacturer Recommendations")
|
||||
(property "Sheetfile" "adatface_baseboard.kicad_sch")
|
||||
(property "Sheetname" "")
|
||||
(attr through_hole)
|
||||
(fp_text reference "TR?" (at -3.757745 -6.669592 180) (layer "F.SilkS")
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp 4846382d-ddbf-4e1e-8ac7-85b7bcae3eea)
|
||||
)
|
||||
(fp_text value "PLT133_T8" (at 5.16 9.865 180) (layer "F.Fab") hide
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
(tstamp 353f31aa-4004-42a5-b0f9-0015aa1d630c)
|
||||
)
|
||||
(fp_line (start -4.85 8.49) (end -4.85 -5.01) (layer "F.SilkS") (width 0.127) (tstamp 0eca6b4a-1db8-4dc0-acb1-3583d299a29e))
|
||||
(fp_line (start -4.85 8.49) (end 4.85 8.49) (layer "F.SilkS") (width 0.127) (tstamp 1298dce0-8173-4279-88dd-1e6f490be095))
|
||||
(fp_line (start -4.85 -5.01) (end 4.85 -5.01) (layer "F.SilkS") (width 0.127) (tstamp caf4e03a-b4ac-4289-a81a-5b1f96d9b3eb))
|
||||
(fp_line (start 4.85 8.49) (end 4.85 -5.01) (layer "F.SilkS") (width 0.127) (tstamp d6aa1abe-a47f-427e-807e-631bf58e4b42))
|
||||
(fp_circle (center -5.4 -2.62) (end -5.3 -2.62) (layer "F.SilkS") (width 0.2) (fill none) (tstamp d21d7616-8bd3-4879-8a20-b6e388d2f492))
|
||||
(fp_line (start 5.1 8.74) (end -5.1 8.74) (layer "F.CrtYd") (width 0.05) (tstamp 0dbf5f00-0fcf-4062-b0e8-b71667c6750c))
|
||||
(fp_line (start -5.1 8.74) (end -5.1 -5.26) (layer "F.CrtYd") (width 0.05) (tstamp 359a6f95-9f71-4b49-9093-61a6c7538fd9))
|
||||
(fp_line (start -5.1 -5.26) (end 5.1 -5.26) (layer "F.CrtYd") (width 0.05) (tstamp 4cde9787-61b9-40c9-b61e-2f1ddb6197d9))
|
||||
(fp_line (start 5.1 -5.26) (end 5.1 8.74) (layer "F.CrtYd") (width 0.05) (tstamp e4461b35-cb34-496c-a55c-b06d6ea6de0e))
|
||||
(fp_line (start -4.85 8.49) (end -4.85 -5.01) (layer "F.Fab") (width 0.127) (tstamp 33ec82cd-cac8-46d4-bfe2-883cfdc799a6))
|
||||
(fp_line (start -4.85 8.49) (end 4.85 8.49) (layer "F.Fab") (width 0.127) (tstamp 6262c5a8-8816-4e5c-b532-127e6bc15e9b))
|
||||
(fp_line (start -4.85 -5.01) (end 4.85 -5.01) (layer "F.Fab") (width 0.127) (tstamp 7e690956-6dfd-455f-ab4b-877cde9bbec3))
|
||||
(fp_line (start 4.85 8.49) (end 4.85 -5.01) (layer "F.Fab") (width 0.127) (tstamp 956a6877-d519-4f7b-b5f6-0fb0be55f6da))
|
||||
(fp_circle (center -5.4 -2.62) (end -5.3 -2.62) (layer "F.Fab") (width 0.2) (fill none) (tstamp 1472c624-edd9-4b58-ae41-7b50a4a0d5be))
|
||||
(pad "" np_thru_hole circle (at 2.8 2.62) (size 1.7 1.7) (drill 1.7) (layers *.Cu *.Mask) (tstamp 291bc89b-10f0-4cb4-8690-9bfbd70a4754))
|
||||
(pad "" np_thru_hole circle (at -2.8 2.62) (size 1.7 1.7) (drill 1.7) (layers *.Cu *.Mask) (tstamp ee6098c6-69d8-4db6-9aa6-97c9de7b6cdf))
|
||||
(pad "1" thru_hole rect (at -2.54 -2.62) (size 1.358 1.358) (drill 0.85) (layers *.Cu *.Mask) (tstamp 1264c3d6-3a9d-4304-a1ba-2ecf28689c84))
|
||||
(pad "2" thru_hole circle (at 0 -2.62) (size 1.358 1.358) (drill 0.85) (layers *.Cu *.Mask) (tstamp 42b86eb2-da34-4245-a669-2ed06961957a))
|
||||
(pad "3" thru_hole circle (at 2.54 -2.62) (size 1.358 1.358) (drill 0.85) (layers *.Cu *.Mask) (tstamp 76553da1-0353-45af-926a-42bcf4ee5e4c))
|
||||
(pad "4" thru_hole circle (at -2.54 0) (size 1.725 1.725) (drill 1.15) (layers *.Cu *.Mask) (tstamp 23136332-1fec-402d-97cf-3f04eb336397))
|
||||
(pad "5" thru_hole circle (at 2.54 0) (size 1.725 1.725) (drill 1.15) (layers *.Cu *.Mask) (tstamp d462d8ce-bf59-4e64-bbff-abe63047bba1))
|
||||
(model "${KIPRJMOD}/3d/PLR135_T8.stp"
|
||||
(offset (xyz 2.54 2.54 -0.127))
|
||||
(scale (xyz 1 1 1))
|
||||
(rotate (xyz 0 0 0))
|
||||
)
|
||||
)
|
||||
1003
hardware/rev0/usb_ulpi.kicad_sym
Normal file
1003
hardware/rev0/usb_ulpi.kicad_sym
Normal file
File diff suppressed because it is too large
Load Diff
299
hardware/rev0/usb_ulpi.lib
Normal file
299
hardware/rev0/usb_ulpi.lib
Normal file
@@ -0,0 +1,299 @@
|
||||
EESchema-LIBRARY Version 2.4
|
||||
#encoding utf-8
|
||||
#
|
||||
# Connector_Generic_Conn_02x06_Odd_Even
|
||||
#
|
||||
DEF Connector_Generic_Conn_02x06_Odd_Even J 0 40 Y N 1 F N
|
||||
F0 "J" 50 300 50 H V C CNN
|
||||
F1 "Connector_Generic_Conn_02x06_Odd_Even" 50 -400 50 H V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
$FPLIST
|
||||
Connector*:*_2x??_*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
S -50 -295 0 -305 1 1 6 N
|
||||
S -50 -195 0 -205 1 1 6 N
|
||||
S -50 -95 0 -105 1 1 6 N
|
||||
S -50 5 0 -5 1 1 6 N
|
||||
S -50 105 0 95 1 1 6 N
|
||||
S -50 205 0 195 1 1 6 N
|
||||
S -50 250 150 -350 1 1 10 f
|
||||
S 150 -295 100 -305 1 1 6 N
|
||||
S 150 -195 100 -205 1 1 6 N
|
||||
S 150 -95 100 -105 1 1 6 N
|
||||
S 150 5 100 -5 1 1 6 N
|
||||
S 150 105 100 95 1 1 6 N
|
||||
S 150 205 100 195 1 1 6 N
|
||||
X Pin_1 1 -200 200 150 R 50 50 1 1 P
|
||||
X Pin_10 10 300 -200 150 L 50 50 1 1 P
|
||||
X Pin_11 11 -200 -300 150 R 50 50 1 1 P
|
||||
X Pin_12 12 300 -300 150 L 50 50 1 1 P
|
||||
X Pin_2 2 300 200 150 L 50 50 1 1 P
|
||||
X Pin_3 3 -200 100 150 R 50 50 1 1 P
|
||||
X Pin_4 4 300 100 150 L 50 50 1 1 P
|
||||
X Pin_5 5 -200 0 150 R 50 50 1 1 P
|
||||
X Pin_6 6 300 0 150 L 50 50 1 1 P
|
||||
X Pin_7 7 -200 -100 150 R 50 50 1 1 P
|
||||
X Pin_8 8 300 -100 150 L 50 50 1 1 P
|
||||
X Pin_9 9 -200 -200 150 R 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Connector_USB_C_Receptacle_USB2.0
|
||||
#
|
||||
DEF Connector_USB_C_Receptacle_USB2.0 J 0 40 Y Y 1 F N
|
||||
F0 "J" -400 750 50 H V L CNN
|
||||
F1 "Connector_USB_C_Receptacle_USB2.0" 750 750 50 H V R CNN
|
||||
F2 "" 150 0 50 H I C CNN
|
||||
F3 "" 150 0 50 H I C CNN
|
||||
$FPLIST
|
||||
USB*C*Receptacle*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
A -275 -150 75 -1799 -1 0 1 20 N -350 -150 -200 -150
|
||||
A -275 -150 25 -1799 -1 0 1 10 N -300 -150 -250 -150
|
||||
A -275 -150 25 -1799 -1 0 1 10 F -300 -150 -250 -150
|
||||
A -275 150 25 1 1799 0 1 10 F -250 150 -300 150
|
||||
A -275 150 25 1 1799 0 1 10 N -250 150 -300 150
|
||||
A -275 150 75 1 1799 0 1 20 N -200 150 -350 150
|
||||
C -100 45 25 0 1 10 F
|
||||
C 0 -230 50 0 1 0 F
|
||||
S -10 -700 10 -660 0 0 0 N
|
||||
S 400 -590 360 -610 0 0 0 N
|
||||
S 400 -490 360 -510 0 0 0 N
|
||||
S 400 -190 360 -210 0 0 0 N
|
||||
S 400 -90 360 -110 0 0 0 N
|
||||
S 400 10 360 -10 0 0 0 N
|
||||
S 400 110 360 90 0 0 0 N
|
||||
S 400 310 360 290 0 0 0 N
|
||||
S 400 410 360 390 0 0 0 N
|
||||
S 400 610 360 590 0 0 0 N
|
||||
S -400 700 400 -700 0 1 10 f
|
||||
S -300 -150 -250 150 0 1 10 F
|
||||
S 75 70 125 120 0 1 10 F
|
||||
P 2 0 1 20 -350 -150 -350 150 N
|
||||
P 2 0 1 20 -200 150 -200 -150 N
|
||||
P 2 0 1 20 0 -230 0 170 N
|
||||
P 3 0 1 20 0 -130 -100 -30 -100 20 N
|
||||
P 3 0 1 20 0 -80 100 20 100 70 N
|
||||
P 4 0 1 10 -50 170 0 270 50 170 -50 170 F
|
||||
X GND A1 0 -900 200 U 50 50 1 1 P
|
||||
X GND A12 0 -900 200 U 50 50 1 1 P N
|
||||
X VBUS A4 600 600 200 L 50 50 1 1 P
|
||||
X CC1 A5 600 400 200 L 50 50 1 1 B
|
||||
X D+ A6 600 -100 200 L 50 50 1 1 B
|
||||
X D- A7 600 100 200 L 50 50 1 1 B
|
||||
X SBU1 A8 600 -500 200 L 50 50 1 1 B
|
||||
X VBUS A9 600 600 200 L 50 50 1 1 P N
|
||||
X GND B1 0 -900 200 U 50 50 1 1 P N
|
||||
X GND B12 0 -900 200 U 50 50 1 1 P N
|
||||
X VBUS B4 600 600 200 L 50 50 1 1 P N
|
||||
X CC2 B5 600 300 200 L 50 50 1 1 B
|
||||
X D+ B6 600 -200 200 L 50 50 1 1 B
|
||||
X D- B7 600 0 200 L 50 50 1 1 B
|
||||
X SBU2 B8 600 -600 200 L 50 50 1 1 B
|
||||
X VBUS B9 600 600 200 L 50 50 1 1 P N
|
||||
X SHIELD S1 -300 -900 200 U 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Device_C_Small
|
||||
#
|
||||
DEF Device_C_Small C 0 10 N N 1 F N
|
||||
F0 "C" 10 70 50 H V L CNN
|
||||
F1 "Device_C_Small" 10 -80 50 H V L CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
$FPLIST
|
||||
C_*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
P 2 0 1 13 -60 -20 60 -20 N
|
||||
P 2 0 1 12 -60 20 60 20 N
|
||||
X ~ 1 0 100 80 D 50 50 1 1 P
|
||||
X ~ 2 0 -100 80 U 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Device_LED_Small
|
||||
#
|
||||
DEF Device_LED_Small D 0 10 N N 1 F N
|
||||
F0 "D" -50 125 50 H V L CNN
|
||||
F1 "Device_LED_Small" -175 -100 50 H V L CNN
|
||||
F2 "" 0 0 50 V I C CNN
|
||||
F3 "" 0 0 50 V I C CNN
|
||||
$FPLIST
|
||||
LED*
|
||||
LED_SMD:*
|
||||
LED_THT:*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
P 2 0 1 10 -30 -40 -30 40 N
|
||||
P 2 0 1 0 40 0 -30 0 N
|
||||
P 4 0 1 10 30 -40 -30 0 30 40 30 -40 N
|
||||
P 5 0 1 0 0 30 -20 50 -10 50 -20 50 -20 40 N
|
||||
P 5 0 1 0 20 50 0 70 10 70 0 70 0 60 N
|
||||
X K 1 -100 0 70 R 50 50 1 1 P
|
||||
X A 2 100 0 70 L 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Device_R_Small
|
||||
#
|
||||
DEF Device_R_Small R 0 10 N N 1 F N
|
||||
F0 "R" 30 20 50 H V L CNN
|
||||
F1 "Device_R_Small" 30 -40 50 H V L CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
$FPLIST
|
||||
R_*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
S -30 70 30 -70 0 1 8 N
|
||||
X ~ 1 0 100 30 D 50 50 1 1 P
|
||||
X ~ 2 0 -100 30 U 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Regulator_Linear_TPS76318
|
||||
#
|
||||
DEF Regulator_Linear_TPS76318 U 0 10 Y Y 1 F N
|
||||
F0 "U" -150 225 50 H V C CNN
|
||||
F1 "Regulator_Linear_TPS76318" 0 225 50 H V L CNN
|
||||
F2 "Package_TO_SOT_SMD:SOT-23-5" 0 325 50 H I C CIN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
ALIAS TPS76318 TPS76325 TPS76327 TPS76329 TPS76330 TPS76333 TPS76338 TPS76350
|
||||
$FPLIST
|
||||
SOT?23*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
S -200 175 200 -200 0 1 10 f
|
||||
X VIN 1 -300 100 100 R 50 50 1 1 W
|
||||
X GND 2 0 -300 100 U 50 50 1 1 W
|
||||
X EN 3 -300 0 100 R 50 50 1 1 I
|
||||
X NC 4 300 0 100 L 50 50 1 1 N N
|
||||
X VOUT 5 300 100 100 L 50 50 1 1 w
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# power_+1V8
|
||||
#
|
||||
DEF power_+1V8 #PWR 0 0 Y Y 1 F P
|
||||
F0 "#PWR" 0 -150 50 H I C CNN
|
||||
F1 "power_+1V8" 0 140 50 H V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
DRAW
|
||||
P 2 0 1 0 -30 50 0 100 N
|
||||
P 2 0 1 0 0 0 0 100 N
|
||||
P 2 0 1 0 0 100 30 50 N
|
||||
X +1V8 1 0 0 0 U 50 50 1 1 W N
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# power_+3.3V
|
||||
#
|
||||
DEF power_+3.3V #PWR 0 0 Y Y 1 F P
|
||||
F0 "#PWR" 0 -150 50 H I C CNN
|
||||
F1 "power_+3.3V" 0 140 50 H V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
DRAW
|
||||
P 2 0 1 0 -30 50 0 100 N
|
||||
P 2 0 1 0 0 0 0 100 N
|
||||
P 2 0 1 0 0 100 30 50 N
|
||||
X +3V3 1 0 0 0 U 50 50 1 1 W N
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# power_+3V3
|
||||
#
|
||||
DEF power_+3V3 #PWR 0 0 Y Y 1 F P
|
||||
F0 "#PWR" 0 -150 50 H I C CNN
|
||||
F1 "power_+3V3" 0 140 50 H V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
ALIAS +3.3V
|
||||
DRAW
|
||||
P 2 0 1 0 -30 50 0 100 N
|
||||
P 2 0 1 0 0 0 0 100 N
|
||||
P 2 0 1 0 0 100 30 50 N
|
||||
X +3V3 1 0 0 0 U 50 50 1 1 W N
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# power_GND
|
||||
#
|
||||
DEF power_GND #PWR 0 0 Y Y 1 F P
|
||||
F0 "#PWR" 0 -250 50 H I C CNN
|
||||
F1 "power_GND" 0 -150 50 H V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
DRAW
|
||||
P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N
|
||||
X GND 1 0 0 0 D 50 50 1 1 W N
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# power_VBUS
|
||||
#
|
||||
DEF power_VBUS #PWR 0 0 Y Y 1 F P
|
||||
F0 "#PWR" 0 -150 50 H I C CNN
|
||||
F1 "power_VBUS" 0 150 50 H V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
DRAW
|
||||
P 2 0 1 0 -30 50 0 100 N
|
||||
P 2 0 1 0 0 0 0 100 N
|
||||
P 2 0 1 0 0 100 30 50 N
|
||||
X VBUS 1 0 0 0 U 50 50 1 1 W N
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# twam-Misc_USB3320
|
||||
#
|
||||
DEF twam-Misc_USB3320 U 0 40 Y Y 1 F N
|
||||
F0 "U" 0 1250 50 H V C CNN
|
||||
F1 "twam-Misc_USB3320" 0 -1150 50 H V C CNN
|
||||
F2 "" 2600 600 50 H I C CNN
|
||||
F3 "" 2600 600 50 H I C CNN
|
||||
DRAW
|
||||
S -500 1200 500 -1100 0 1 0 f
|
||||
X CLKOUT 1 -600 -100 100 R 50 50 1 1 O
|
||||
X DATA6 10 -600 500 100 R 50 50 1 1 B
|
||||
X REFSEL1 11 -600 -400 100 R 50 50 1 1 I
|
||||
X ~ 12 -600 -1000 100 R 50 50 1 1 N N
|
||||
X DATA7 13 -600 400 100 R 50 50 1 1 B
|
||||
X REFSEL2 14 -600 -500 100 R 50 50 1 1 I
|
||||
X SPK_L 15 600 -500 100 L 50 50 1 1 B
|
||||
X SPK_R 16 600 -600 100 L 50 50 1 1 B
|
||||
X CPEN 17 600 200 100 L 50 50 1 1 O
|
||||
X DP 18 600 -200 100 L 50 50 1 1 B
|
||||
X DM 19 600 -100 100 L 50 50 1 1 B
|
||||
X NXT 2 -600 100 100 R 50 50 1 1 O
|
||||
X VDD33 20 600 900 100 L 50 50 1 1 w
|
||||
X VBAT 21 600 1100 100 L 50 50 1 1 W
|
||||
X VBUS 22 600 0 100 L 50 50 1 1 I
|
||||
X ID 23 600 -300 100 L 50 50 1 1 I
|
||||
X RBIAS 24 600 -800 100 L 50 50 1 1 P
|
||||
X XO 25 -600 -700 100 R 50 50 1 1 O
|
||||
X REFCLK 26 -600 -800 100 R 50 50 1 1 I
|
||||
X RESETB 27 -600 -900 100 R 50 50 1 1 I
|
||||
X VDD18 28 600 700 100 L 50 50 1 1 W
|
||||
X STP 29 -600 200 100 R 50 50 1 1 I
|
||||
X DATA0 3 -600 1100 100 R 50 50 1 1 B
|
||||
X VDD18 30 600 600 100 L 50 50 1 1 W
|
||||
X DIR 31 -600 0 100 R 50 50 1 1 O
|
||||
X VDDIO 32 600 400 100 L 50 50 1 1 W
|
||||
X GND 33 600 -1000 100 L 50 50 1 1 W
|
||||
X DATA1 4 -600 1000 100 R 50 50 1 1 B
|
||||
X DATA2 5 -600 900 100 R 50 50 1 1 B
|
||||
X DATA3 6 -600 800 100 R 50 50 1 1 B
|
||||
X DATA4 7 -600 700 100 R 50 50 1 1 B
|
||||
X REFSEL0 8 -600 -300 100 R 50 50 1 1 I
|
||||
X DATA5 9 -600 600 100 R 50 50 1 1 B
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
#End Library
|
||||
11
ila.py
Executable file
11
ila.py
Executable file
@@ -0,0 +1,11 @@
|
||||
#!/usr/bin/env python3
|
||||
import usb
|
||||
from luna.gateware.usb.devices.ila import USBIntegratedLogicAnalyzerFrontend
|
||||
from amlib.debug.ila import ILACoreParameters
|
||||
|
||||
|
||||
dev=usb.core.find(idVendor=0x1209, idProduct=0xADA1)
|
||||
print(dev)
|
||||
|
||||
frontend = USBIntegratedLogicAnalyzerFrontend(ila=ILACoreParameters.unpickle(), idVendor=0x1209, idProduct=0xADA1, endpoint_no=4)
|
||||
frontend.interactive_display()
|
||||
Reference in New Issue
Block a user