From 739956b42bcd58b63056eeded43e6976fe888e1e Mon Sep 17 00:00:00 2001 From: furrtek Date: Wed, 27 Jul 2016 03:03:40 +0200 Subject: [PATCH] Sync with Sharebrained's fw, only Xylos TX works for now --- firmware/Makefile | 229 +- firmware/application/CMakeLists.txt | 15 + firmware/application/Makefile | 5010 +++++++++++++++-- firmware/application/baseband_api.cpp | 16 +- firmware/application/baseband_api.hpp | 3 +- firmware/application/core_control.cpp | 55 - firmware/application/core_control.hpp | 4 - firmware/application/event_m0.cpp | 1 + firmware/application/radio.cpp | 2 +- firmware/application/transmitter_model.cpp | 21 +- firmware/application/transmitter_model.hpp | 2 +- firmware/application/ui_about.cpp | 59 +- firmware/application/ui_about.hpp | 48 +- firmware/application/ui_afsksetup.cpp | 3 +- firmware/application/ui_afsksetup.hpp | 1 - firmware/application/ui_closecall.cpp | 28 +- firmware/application/ui_closecall.hpp | 19 + firmware/application/ui_handwrite.cpp | 11 - firmware/application/ui_handwrite.hpp | 8 +- firmware/application/ui_jammer.cpp | 53 +- firmware/application/ui_jammer.hpp | 14 +- firmware/application/ui_lcr.cpp | 149 +- firmware/application/ui_lcr.hpp | 30 +- firmware/application/ui_loadmodule.cpp | 9 +- firmware/application/ui_loadmodule.hpp | 1 - firmware/application/ui_navigation.cpp | 24 +- firmware/application/ui_rds.cpp | 31 +- firmware/application/ui_rds.hpp | 12 + firmware/application/ui_setup.cpp | 29 +- firmware/application/ui_setup.hpp | 34 +- firmware/application/ui_xylos.cpp | 209 +- firmware/application/ui_xylos.hpp | 11 +- firmware/baseband-tx/Makefile | 288 - firmware/baseband-tx/audio_compressor.cpp | 52 - firmware/baseband-tx/audio_compressor.hpp | 102 - firmware/baseband-tx/audio_dma.cpp | 238 - firmware/baseband-tx/audio_dma.hpp | 56 - firmware/baseband-tx/audio_output.cpp | 114 - firmware/baseband-tx/audio_output.hpp | 73 - .../baseband-tx/audio_stats_collector.cpp | 67 - .../baseband-tx/audio_stats_collector.hpp | 63 - firmware/baseband-tx/baseband_dma.cpp | 175 - firmware/baseband-tx/baseband_dma.hpp | 53 - firmware/baseband-tx/baseband_processor.cpp | 36 - firmware/baseband-tx/baseband_processor.hpp | 46 - .../baseband-tx/baseband_stats_collector.cpp | 59 - .../baseband-tx/baseband_stats_collector.hpp | 71 - firmware/baseband-tx/baseband_thread.cpp | 152 - firmware/baseband-tx/baseband_thread.hpp | 57 - firmware/baseband-tx/block_decimator.hpp | 100 - firmware/baseband-tx/channel_decimator.cpp | 91 - firmware/baseband-tx/channel_decimator.hpp | 87 - .../baseband-tx/channel_stats_collector.hpp | 66 - firmware/baseband-tx/chconf.h | 546 -- firmware/baseband-tx/clock_recovery.cpp | 22 - firmware/baseband-tx/clock_recovery.hpp | 185 - firmware/baseband-tx/description | 1 - firmware/baseband-tx/dsp_decimate.cpp | 790 --- firmware/baseband-tx/dsp_decimate.hpp | 268 - firmware/baseband-tx/dsp_demodulate.cpp | 151 - firmware/baseband-tx/dsp_demodulate.hpp | 75 - firmware/baseband-tx/dsp_squelch.cpp | 53 - firmware/baseband-tx/dsp_squelch.hpp | 45 - firmware/baseband-tx/event_m4.cpp | 117 - firmware/baseband-tx/event_m4.hpp | 75 - firmware/baseband-tx/fxpt_atan2.cpp | 152 - firmware/baseband-tx/fxpt_atan2.hpp | 29 - firmware/baseband-tx/gpdma_lli.hpp | 225 - firmware/baseband-tx/halconf.h | 313 - firmware/baseband-tx/linear_resampler.hpp | 69 - firmware/baseband-tx/matched_filter.cpp | 107 - firmware/baseband-tx/matched_filter.hpp | 96 - firmware/baseband-tx/mcuconf.h | 47 - firmware/baseband-tx/name | 1 - firmware/baseband-tx/ook.hpp | 93 - firmware/baseband-tx/packet_builder.cpp | 22 - firmware/baseband-tx/packet_builder.hpp | 139 - firmware/baseband-tx/phase_accumulator.hpp | 50 - firmware/baseband-tx/phase_detector.hpp | 68 - firmware/baseband-tx/proc_tpms.cpp | 72 - firmware/baseband-tx/proc_tpms.hpp | 125 - firmware/baseband-tx/rssi.cpp | 74 - firmware/baseband-tx/rssi.hpp | 43 - firmware/baseband-tx/rssi_dma.cpp | 176 - firmware/baseband-tx/rssi_dma.hpp | 51 - firmware/baseband-tx/rssi_stats_collector.hpp | 75 - firmware/baseband-tx/rssi_thread.cpp | 63 - firmware/baseband-tx/rssi_thread.hpp | 41 - firmware/baseband-tx/stream_input.hpp | 70 - firmware/baseband-tx/symbol_coding.hpp | 44 - firmware/baseband-tx/thread_base.hpp | 43 - firmware/baseband-tx/touch_dma.cpp | 129 - firmware/baseband-tx/touch_dma.hpp | 52 - firmware/baseband/CMakeLists.txt | 49 + firmware/baseband/baseband_dma.cpp | 24 +- firmware/baseband/baseband_dma.hpp | 3 + firmware/baseband/baseband_thread.cpp | 90 +- firmware/baseband/baseband_thread.hpp | 10 +- firmware/{baseband-tx => baseband}/main.cpp | 0 .../{baseband-tx => baseband}/proc_afskrx.cpp | 0 .../{baseband-tx => baseband}/proc_afskrx.hpp | 0 firmware/baseband/proc_ais.hpp | 2 +- firmware/baseband/proc_am_audio.hpp | 2 +- .../proc_audiotx.cpp | 7 + .../proc_audiotx.hpp | 1 + firmware/baseband/proc_capture.hpp | 2 +- firmware/baseband/proc_closecall.cpp | 6 + .../{baseband-tx => baseband}/proc_epar.cpp | 12 +- .../{baseband-tx => baseband}/proc_epar.hpp | 3 +- firmware/baseband/proc_ert.hpp | 2 +- .../proc_fsk_lcr.cpp | 7 + .../proc_fsk_lcr.hpp | 3 + .../{baseband-tx => baseband}/proc_jammer.cpp | 7 + .../{baseband-tx => baseband}/proc_jammer.hpp | 1 + firmware/baseband/proc_nfm_audio.hpp | 2 +- .../proc_playaudio.cpp | 7 + .../proc_playaudio.hpp | 0 .../{baseband-tx => baseband}/proc_rds.cpp | 7 + .../{baseband-tx => baseband}/proc_rds.hpp | 0 .../{baseband-tx => baseband}/proc_sigfrx.cpp | 0 .../{baseband-tx => baseband}/proc_sigfrx.hpp | 0 firmware/baseband/proc_tpms.hpp | 2 +- firmware/baseband/proc_wfm_audio.hpp | 2 +- firmware/baseband/proc_wideband_spectrum.hpp | 2 +- .../{baseband-tx => baseband}/proc_xylos.cpp | 34 +- .../{baseband-tx => baseband}/proc_xylos.hpp | 10 +- firmware/baseband/spectrum_collector.cpp | 1 - firmware/baseband/terminator.img | Bin 0 -> 8 bytes firmware/common/message.hpp | 12 +- firmware/common/portapack_shared_memory.hpp | 3 - firmware/common/spi_image.hpp | 9 + firmware/portapack-h1-firmware.bin | Bin 492048 -> 496032 bytes hardware/portapack_h1/README | 55 + hardware/portapack_h1/audio.sch | 989 ++++ hardware/portapack_h1/case/pp_h1_case_2.scad | 80 + .../portapack_h1/case/pp_h1_parameters.scad | 64 + hardware/portapack_h1/case/pp_h1_shell.scad | 152 + hardware/portapack_h1/case/pp_h1_stack.scad | 846 +++ .../portapack_h1/cpld/portapack_h1_cpld.qpf | 30 + .../portapack_h1/cpld/portapack_h1_cpld.qsf | 288 + .../portapack_h1/cpld/portapack_h1_cpld.sdc | 116 + hardware/portapack_h1/cpld/top.vhd | 167 + hardware/portapack_h1/cpld/top_tb.vhd | 185 + hardware/portapack_h1/hackrf_if.sch | 1551 +++++ hardware/portapack_h1/lcd_sw_sd.sch | 656 +++ hardware/portapack_h1/portapack_h1.kicad_pcb | 4541 +++++++++++++++ hardware/portapack_h1/portapack_h1.net | 1685 ++++++ hardware/portapack_h1/portapack_h1.pdf | Bin 0 -> 241466 bytes hardware/portapack_h1/portapack_h1.pro | 70 + hardware/portapack_h1/portapack_h1.sch | 330 ++ 150 files changed, 17236 insertions(+), 7875 deletions(-) mode change 100755 => 100644 firmware/application/Makefile delete mode 100755 firmware/baseband-tx/Makefile delete mode 100644 firmware/baseband-tx/audio_compressor.cpp delete mode 100644 firmware/baseband-tx/audio_compressor.hpp delete mode 100644 firmware/baseband-tx/audio_dma.cpp delete mode 100644 firmware/baseband-tx/audio_dma.hpp delete mode 100644 firmware/baseband-tx/audio_output.cpp delete mode 100644 firmware/baseband-tx/audio_output.hpp delete mode 100644 firmware/baseband-tx/audio_stats_collector.cpp delete mode 100644 firmware/baseband-tx/audio_stats_collector.hpp delete mode 100644 firmware/baseband-tx/baseband_dma.cpp delete mode 100644 firmware/baseband-tx/baseband_dma.hpp delete mode 100644 firmware/baseband-tx/baseband_processor.cpp delete mode 100644 firmware/baseband-tx/baseband_processor.hpp delete mode 100644 firmware/baseband-tx/baseband_stats_collector.cpp delete mode 100644 firmware/baseband-tx/baseband_stats_collector.hpp delete mode 100644 firmware/baseband-tx/baseband_thread.cpp delete mode 100644 firmware/baseband-tx/baseband_thread.hpp delete mode 100644 firmware/baseband-tx/block_decimator.hpp delete mode 100644 firmware/baseband-tx/channel_decimator.cpp delete mode 100644 firmware/baseband-tx/channel_decimator.hpp delete mode 100644 firmware/baseband-tx/channel_stats_collector.hpp delete mode 100755 firmware/baseband-tx/chconf.h delete mode 100644 firmware/baseband-tx/clock_recovery.cpp delete mode 100644 firmware/baseband-tx/clock_recovery.hpp delete mode 100644 firmware/baseband-tx/description delete mode 100644 firmware/baseband-tx/dsp_decimate.cpp delete mode 100644 firmware/baseband-tx/dsp_decimate.hpp delete mode 100644 firmware/baseband-tx/dsp_demodulate.cpp delete mode 100644 firmware/baseband-tx/dsp_demodulate.hpp delete mode 100644 firmware/baseband-tx/dsp_squelch.cpp delete mode 100644 firmware/baseband-tx/dsp_squelch.hpp delete mode 100644 firmware/baseband-tx/event_m4.cpp delete mode 100644 firmware/baseband-tx/event_m4.hpp delete mode 100644 firmware/baseband-tx/fxpt_atan2.cpp delete mode 100644 firmware/baseband-tx/fxpt_atan2.hpp delete mode 100644 firmware/baseband-tx/gpdma_lli.hpp delete mode 100755 firmware/baseband-tx/halconf.h delete mode 100644 firmware/baseband-tx/linear_resampler.hpp delete mode 100644 firmware/baseband-tx/matched_filter.cpp delete mode 100644 firmware/baseband-tx/matched_filter.hpp delete mode 100755 firmware/baseband-tx/mcuconf.h delete mode 100644 firmware/baseband-tx/name delete mode 100644 firmware/baseband-tx/ook.hpp delete mode 100644 firmware/baseband-tx/packet_builder.cpp delete mode 100644 firmware/baseband-tx/packet_builder.hpp delete mode 100644 firmware/baseband-tx/phase_accumulator.hpp delete mode 100644 firmware/baseband-tx/phase_detector.hpp delete mode 100644 firmware/baseband-tx/proc_tpms.cpp delete mode 100644 firmware/baseband-tx/proc_tpms.hpp delete mode 100644 firmware/baseband-tx/rssi.cpp delete mode 100644 firmware/baseband-tx/rssi.hpp delete mode 100644 firmware/baseband-tx/rssi_dma.cpp delete mode 100644 firmware/baseband-tx/rssi_dma.hpp delete mode 100644 firmware/baseband-tx/rssi_stats_collector.hpp delete mode 100644 firmware/baseband-tx/rssi_thread.cpp delete mode 100644 firmware/baseband-tx/rssi_thread.hpp delete mode 100644 firmware/baseband-tx/stream_input.hpp delete mode 100644 firmware/baseband-tx/symbol_coding.hpp delete mode 100644 firmware/baseband-tx/thread_base.hpp delete mode 100644 firmware/baseband-tx/touch_dma.cpp delete mode 100644 firmware/baseband-tx/touch_dma.hpp rename firmware/{baseband-tx => baseband}/main.cpp (100%) rename firmware/{baseband-tx => baseband}/proc_afskrx.cpp (100%) rename firmware/{baseband-tx => baseband}/proc_afskrx.hpp (100%) rename firmware/{baseband-tx => baseband}/proc_audiotx.cpp (90%) rename firmware/{baseband-tx => baseband}/proc_audiotx.hpp (97%) rename firmware/{baseband-tx => baseband}/proc_epar.cpp (92%) rename firmware/{baseband-tx => baseband}/proc_epar.hpp (97%) rename firmware/{baseband-tx => baseband}/proc_fsk_lcr.cpp (95%) rename firmware/{baseband-tx => baseband}/proc_fsk_lcr.hpp (90%) rename firmware/{baseband-tx => baseband}/proc_jammer.cpp (93%) rename firmware/{baseband-tx => baseband}/proc_jammer.hpp (97%) rename firmware/{baseband-tx => baseband}/proc_playaudio.cpp (93%) rename firmware/{baseband-tx => baseband}/proc_playaudio.hpp (100%) rename firmware/{baseband-tx => baseband}/proc_rds.cpp (94%) rename firmware/{baseband-tx => baseband}/proc_rds.hpp (100%) rename firmware/{baseband-tx => baseband}/proc_sigfrx.cpp (100%) rename firmware/{baseband-tx => baseband}/proc_sigfrx.hpp (100%) rename firmware/{baseband-tx => baseband}/proc_xylos.cpp (77%) rename firmware/{baseband-tx => baseband}/proc_xylos.hpp (89%) create mode 100644 firmware/baseband/terminator.img create mode 100644 hardware/portapack_h1/README create mode 100644 hardware/portapack_h1/audio.sch create mode 100644 hardware/portapack_h1/case/pp_h1_case_2.scad create mode 100644 hardware/portapack_h1/case/pp_h1_parameters.scad create mode 100644 hardware/portapack_h1/case/pp_h1_shell.scad create mode 100644 hardware/portapack_h1/case/pp_h1_stack.scad create mode 100644 hardware/portapack_h1/cpld/portapack_h1_cpld.qpf create mode 100644 hardware/portapack_h1/cpld/portapack_h1_cpld.qsf create mode 100644 hardware/portapack_h1/cpld/portapack_h1_cpld.sdc create mode 100644 hardware/portapack_h1/cpld/top.vhd create mode 100644 hardware/portapack_h1/cpld/top_tb.vhd create mode 100644 hardware/portapack_h1/hackrf_if.sch create mode 100644 hardware/portapack_h1/lcd_sw_sd.sch create mode 100644 hardware/portapack_h1/portapack_h1.kicad_pcb create mode 100644 hardware/portapack_h1/portapack_h1.net create mode 100644 hardware/portapack_h1/portapack_h1.pdf create mode 100644 hardware/portapack_h1/portapack_h1.pro create mode 100644 hardware/portapack_h1/portapack_h1.sch diff --git a/firmware/Makefile b/firmware/Makefile index 0def504ce..f1c541360 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -1,104 +1,167 @@ -# -# Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. -# -# This file is part of PortaPack. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, -# Boston, MA 02110-1301, USA. -# +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 -PATH_BOOTSTRAP=bootstrap -PATH_APPLICATION=application -PATH_BASEBAND=baseband -PATH_BASEBAND_TX=baseband-tx +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target -TARGET=portapack-h1-firmware +#============================================================================= +# Special targets provided by cmake. -TARGET_BOOTSTRAP=$(PATH_BOOTSTRAP)/bootstrap -TARGET_HACKRF_FIRMWARE=hackrf_one_usb_ram -TARGET_APPLICATION=$(PATH_APPLICATION)/build/application -TARGET_BASEBAND=$(PATH_BASEBAND)/build/baseband -TARGET_BASEBAND_TX=$(PATH_BASEBAND_TX)/build/baseband-tx +# Disable implicit rules so canonical targets will work. +.SUFFIXES: -MAKE_SPI_IMAGE=tools/make_spi_image.py -MAKE_MODULES_FILE=tools/make_baseband_file.py +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = -DFU_HACKRF=hackrf_one_usb_ram.dfu -LICENSE=../LICENSE +.SUFFIXES: .hpux_make_needs_suffix_list -GIT_REVISION=$(shell git log -n 1 --format=%h) +# Suppress display of executed commands. +$(VERBOSE).SILENT: -CP=arm-none-eabi-objcopy +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force -MODULES = $(PATH_BASEBAND) \ - $(PATH_BASEBAND_TX) +#============================================================================= +# Set environment variables for the build. -all: $(TARGET).bin modules +# The shell in which to execute make rules. +SHELL = /bin/sh -release: $(TARGET).bin $(DFU_HACKRF) $(LICENSE) - # TODO: Bad hack to fix location of LICENSE file for tar. - cp $(LICENSE) LICENSE - tar -c -j -f $(TARGET)-$(GIT_REVISION).tar.bz2 $(TARGET).bin $(DFU_HACKRF) LICENSE - zip -9 -q $(TARGET)-$(GIT_REVISION).zip $(TARGET).bin $(DFU_HACKRF) LICENSE - rm -f LICENSE +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake -program: $(TARGET).bin modules - dfu-util --device 1fc9:000c --download hackrf_one_usb_ram.dfu --reset - sleep 1s - hackrf_spiflash -w $(TARGET).bin - -modules: $(TARGET_BASEBAND).bin $(TARGET_BASEBAND_TX).bin - $(MAKE_MODULES_FILE) $(MODULES) - cp $(PATH_BASEBAND).bin ../sdcard/$(PATH_BASEBAND).bin - cp $(PATH_BASEBAND_TX).bin ../sdcard/$(PATH_BASEBAND_TX).bin +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f -$(TARGET).bin: modules $(MAKE_SPI_IMAGE) $(TARGET_BOOTSTRAP).bin $(TARGET_HACKRF_FIRMWARE).dfu $(TARGET_BASEBAND_TX)_inc.bin $(TARGET_APPLICATION).bin - $(MAKE_SPI_IMAGE) $(TARGET_BOOTSTRAP).bin $(TARGET_HACKRF_FIRMWARE).dfu $(TARGET_BASEBAND_TX)_inc.bin $(TARGET_APPLICATION).bin $(TARGET).bin +# Escaping for special characters. +EQUALS = = -$(TARGET_BOOTSTRAP).bin: $(TARGET_BOOTSTRAP).elf - $(CP) -O binary $(TARGET_BOOTSTRAP).elf $(TARGET_BOOTSTRAP).bin +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/furrtek/portapack-hackrf -$(TARGET_BASEBAND).bin: $(TARGET_BASEBAND).elf - $(CP) -O binary $(TARGET_BASEBAND).elf $(TARGET_BASEBAND).bin - -$(TARGET_BASEBAND_TX).bin: $(TARGET_BASEBAND_TX).elf - $(CP) -O binary $(TARGET_BASEBAND_TX).elf $(TARGET_BASEBAND_TX).bin +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/furrtek/portapack-hackrf -$(TARGET_APPLICATION).bin: $(TARGET_APPLICATION).elf - $(CP) -O binary $(TARGET_APPLICATION).elf $(TARGET_APPLICATION).bin +#============================================================================= +# Targets provided globally by CMake. -$(TARGET_BASEBAND).elf: always_check - @$(MAKE) -s -e GIT_REVISION=$(GIT_REVISION) -C $(PATH_BASEBAND) - -$(TARGET_BASEBAND_TX).elf: always_check - @$(MAKE) -s -e GIT_REVISION=$(GIT_REVISION) -C $(PATH_BASEBAND_TX) +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running interactive CMake command-line interface..." + /usr/bin/cmake -i . +.PHONY : edit_cache -$(TARGET_APPLICATION).elf: always_check - @$(MAKE) -s -e GIT_REVISION=$(GIT_REVISION) -C $(PATH_APPLICATION) +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast -$(TARGET_BOOTSTRAP).elf: always_check - @$(MAKE) -s -e GIT_REVISION=$(GIT_REVISION) -C $(PATH_BOOTSTRAP) +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/furrtek/portapack-hackrf && $(CMAKE_COMMAND) -E cmake_progress_start /home/furrtek/portapack-hackrf/CMakeFiles /home/furrtek/portapack-hackrf/firmware/CMakeFiles/progress.marks + cd /home/furrtek/portapack-hackrf && $(MAKE) -f CMakeFiles/Makefile2 firmware/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/furrtek/portapack-hackrf/CMakeFiles 0 +.PHONY : all + +# The main clean target clean: - rm -f $(TARGET).bin - rm -f $(TARGET_BOOTSTRAP).bin - rm -f $(TARGET_BASEBAND).bin - rm -f $(TARGET_APPLICATION).bin - $(MAKE) -C $(PATH_BASEBAND) clean - $(MAKE) -C $(PATH_APPLICATION) clean - $(MAKE) -C $(PATH_BOOTSTRAP) clean + cd /home/furrtek/portapack-hackrf && $(MAKE) -f CMakeFiles/Makefile2 firmware/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/furrtek/portapack-hackrf && $(MAKE) -f CMakeFiles/Makefile2 firmware/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f CMakeFiles/Makefile2 firmware/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/furrtek/portapack-hackrf && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +firmware/CMakeFiles/firmware.dir/rule: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f CMakeFiles/Makefile2 firmware/CMakeFiles/firmware.dir/rule +.PHONY : firmware/CMakeFiles/firmware.dir/rule + +# Convenience name for target. +firmware: firmware/CMakeFiles/firmware.dir/rule +.PHONY : firmware + +# fast build rule for target. +firmware/fast: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/CMakeFiles/firmware.dir/build.make firmware/CMakeFiles/firmware.dir/build +.PHONY : firmware/fast + +# Convenience name for target. +firmware/CMakeFiles/program.dir/rule: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f CMakeFiles/Makefile2 firmware/CMakeFiles/program.dir/rule +.PHONY : firmware/CMakeFiles/program.dir/rule + +# Convenience name for target. +program: firmware/CMakeFiles/program.dir/rule +.PHONY : program + +# fast build rule for target. +program/fast: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/CMakeFiles/program.dir/build.make firmware/CMakeFiles/program.dir/build +.PHONY : program/fast + +# Convenience name for target. +firmware/CMakeFiles/release.dir/rule: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f CMakeFiles/Makefile2 firmware/CMakeFiles/release.dir/rule +.PHONY : firmware/CMakeFiles/release.dir/rule + +# Convenience name for target. +release: firmware/CMakeFiles/release.dir/rule +.PHONY : release + +# fast build rule for target. +release/fast: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/CMakeFiles/release.dir/build.make firmware/CMakeFiles/release.dir/build +.PHONY : release/fast + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... firmware" + @echo "... program" + @echo "... rebuild_cache" + @echo "... release" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/furrtek/portapack-hackrf && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system -always_check: - @true diff --git a/firmware/application/CMakeLists.txt b/firmware/application/CMakeLists.txt index f4190523f..2cc9f6cb6 100644 --- a/firmware/application/CMakeLists.txt +++ b/firmware/application/CMakeLists.txt @@ -141,6 +141,7 @@ set(CPPSRC ${COMMON}/ui_widget.cpp ${COMMON}/ui_painter.cpp ${COMMON}/ui_focus.cpp + ${COMMON}/msgpack.cpp ui_navigation.cpp ui_menu.cpp ui_rssi.cpp @@ -155,9 +156,23 @@ set(CPPSRC ui_console.cpp ui_receiver.cpp ui_record_view.cpp + ui_textentry.cpp + ui_alphanum.cpp ui_spectrum.cpp + ui_about.cpp + ui_jammer.cpp + ui_handwrite.cpp + ui_afsksetup.cpp + ui_closecall.cpp + ui_soundboard.cpp + ui_rds.cpp + ui_lcr.cpp + ui_xylos.cpp + ui_freqman.cpp + # ui_loadmodule.cpp recent_entries.cpp receiver_model.cpp + transmitter_model.cpp spectrum_color_lut.cpp analog_audio_app.cpp ${COMMON}/ais_baseband.cpp diff --git a/firmware/application/Makefile b/firmware/application/Makefile old mode 100755 new mode 100644 index b50dacdc7..99d16502b --- a/firmware/application/Makefile +++ b/firmware/application/Makefile @@ -1,349 +1,4661 @@ -# -# Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. -# -# This file is part of PortaPack. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, -# Boston, MA 02110-1301, USA. -# - -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -mthumb \ - -Os -ggdb3 \ - -ffunction-sections \ - -fdata-sections \ - -fno-builtin \ - -nostartfiles \ - --specs=nano.specs - #-fomit-frame-pointer -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -std=gnu99 -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -std=c++11 -fno-rtti -fno-exceptions -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO) -ifeq ($(USE_LTO),) - USE_LTO = no -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = application - -# Imported source files and paths -CHIBIOS = ../chibios -CHIBIOS_PORTAPACK = ../chibios-portapack -include $(CHIBIOS_PORTAPACK)/boards/GSG_HACKRF_ONE/board.mk -include $(CHIBIOS_PORTAPACK)/os/hal/platforms/LPC43xx_M0/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS_PORTAPACK)/os/ports/GCC/ARMCMx/LPC43xx_M0/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk -include $(CHIBIOS_PORTAPACK)/os/various/fatfs_bindings/fatfs.mk -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/LPC43xx_M0.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(FATFSSRC) - - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = main.cpp \ - irq_lcd_frame.cpp \ - irq_controls.cpp \ - irq_rtc.cpp \ - event.cpp \ - event_m0.cpp \ - message_queue.cpp \ - hackrf_hal.cpp \ - portapack.cpp \ - portapack_shared_memory.cpp \ - baseband_api.cpp \ - portapack_persistent_memory.cpp \ - portapack_io.cpp \ - i2c_pp.cpp \ - spi_pp.cpp \ - clock_manager.cpp \ - si5351.cpp \ - wm8731.cpp \ - radio.cpp \ - baseband_cpld.cpp \ - tuning.cpp \ - msgpack.cpp \ - rf_path.cpp \ - rffc507x.cpp \ - rffc507x_spi.cpp \ - max2837.cpp \ - max5864.cpp \ - debounce.cpp \ - touch.cpp \ - touch_adc.cpp \ - encoder.cpp \ - audio.cpp \ - lcd_ili9341.cpp \ - ui.cpp \ - ui_about.cpp \ - ui_afskrx.cpp \ - ui_afsksetup.cpp \ - ui_audio.cpp \ - ui_audiotx.cpp \ - ui_alphanum.cpp \ - ui_baseband_stats_view.cpp \ - ui_channel.cpp \ - ui_closecall.cpp \ - ui_console.cpp \ - ui_debug.cpp \ - ui_epar.cpp \ - ui_focus.cpp \ - ui_font_fixed_8x16.cpp \ - ui_freqman.cpp \ - ui_handwrite.cpp \ - ui_jammer.cpp \ - ui_lcr.cpp \ - ui_loadmodule.cpp \ - ui_menu.cpp \ - ui_navigation.cpp \ - ui_numbers.cpp \ - ui_painter.cpp \ - ui_rds.cpp \ - ui_receiver.cpp \ - ui_record_view.cpp \ - ui_rssi.cpp \ - ui_sd_card_debug.cpp \ - ui_sd_card_status_view.cpp \ - ui_setup.cpp \ - ui_sigfrx.cpp \ - ui_soundboard.cpp \ - ui_spectrum.cpp \ - ui_text.cpp \ - ui_textentry.cpp \ - ui_widget.cpp \ - ui_xylos.cpp \ - recent_entries.cpp \ - receiver_model.cpp \ - transmitter_model.cpp \ - spectrum_color_lut.cpp \ - analog_audio_app.cpp \ - ais_baseband.cpp \ - ../commom/ais_packet.cpp \ - ais_app.cpp \ - tpms_app.cpp \ - ../common/tpms_packet.cpp \ - ert_app.cpp \ - ../common/ert_packet.cpp \ - capture_app.cpp \ - sd_card.cpp \ - time.cpp \ - file.cpp \ - log_file.cpp \ - png_writer.cpp \ - capture_thread.cpp \ - manchester.cpp \ - string_format.cpp \ - temperature_logger.cpp \ - ../common/utility.cpp \ - ../common/chibios_cpp.cpp \ - ../common/debug.cpp \ - ../common/gcc.cpp \ - ../common/lfsr_random.cpp \ - core_control.cpp \ - cpld_max5.cpp \ - jtag.cpp \ - cpld_update.cpp \ - portapack_cpld_data.cpp - - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = ../common $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(FATFSINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -# TODO: Entertain using MCU=cortex-m0.small-multiply for LPC43xx M0 core. -# However, on GCC-ARM-Embedded 4.9 2015q2, it seems to produce non-functional -# binaries. -MCU = cortex-m0 - -#TRGT = arm-elf- -TRGT = /usr/local/gcc-arm-none-eabi-5_2-2015q4/bin/arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -#LD = $(TRGT)gcc -LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -SZ = $(TRGT)size -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -# TODO: Switch -DCRT0_INIT_DATA depending on load from RAM or SPIFI? -# NOTE: _RANDOM_TCC to kill a GCC 4.9.3 error with std::max argument types -DDEFS = -DLPC43XX -DLPC43XX_M0 -D__NEWLIB__ -DHACKRF_ONE \ - -DTOOLCHAIN_GCC -DTOOLCHAIN_GCC_ARM -D_RANDOM_TCC=0 \ - -DGIT_REVISION=\"$(GIT_REVISION)\" - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -RULESPATH = $(CHIBIOS)/os/ports/GCC/ARMCMx -include $(RULESPATH)/rules.mk +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/furrtek/portapack-hackrf + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/furrtek/portapack-hackrf + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running interactive CMake command-line interface..." + /usr/bin/cmake -i . +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/furrtek/portapack-hackrf && $(CMAKE_COMMAND) -E cmake_progress_start /home/furrtek/portapack-hackrf/CMakeFiles /home/furrtek/portapack-hackrf/firmware/application/CMakeFiles/progress.marks + cd /home/furrtek/portapack-hackrf && $(MAKE) -f CMakeFiles/Makefile2 firmware/application/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/furrtek/portapack-hackrf/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f CMakeFiles/Makefile2 firmware/application/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/furrtek/portapack-hackrf && $(MAKE) -f CMakeFiles/Makefile2 firmware/application/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f CMakeFiles/Makefile2 firmware/application/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/furrtek/portapack-hackrf && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +firmware/application/CMakeFiles/application.dir/rule: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f CMakeFiles/Makefile2 firmware/application/CMakeFiles/application.dir/rule +.PHONY : firmware/application/CMakeFiles/application.dir/rule + +# Convenience name for target. +application: firmware/application/CMakeFiles/application.dir/rule +.PHONY : application + +# fast build rule for target. +application/fast: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.dir/build.make firmware/application/CMakeFiles/application.dir/build +.PHONY : application/fast + +# Convenience name for target. +firmware/application/CMakeFiles/application.elf.dir/rule: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f CMakeFiles/Makefile2 firmware/application/CMakeFiles/application.elf.dir/rule +.PHONY : firmware/application/CMakeFiles/application.elf.dir/rule + +# Convenience name for target. +application.elf: firmware/application/CMakeFiles/application.elf.dir/rule +.PHONY : application.elf + +# fast build rule for target. +application.elf/fast: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/build +.PHONY : application.elf/fast + +__/chibios-portapack/boards/GSG_HACKRF_ONE/board.obj: __/chibios-portapack/boards/GSG_HACKRF_ONE/board.c.obj +.PHONY : __/chibios-portapack/boards/GSG_HACKRF_ONE/board.obj + +# target to build an object file +__/chibios-portapack/boards/GSG_HACKRF_ONE/board.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/boards/GSG_HACKRF_ONE/board.c.obj +.PHONY : __/chibios-portapack/boards/GSG_HACKRF_ONE/board.c.obj + +__/chibios-portapack/boards/GSG_HACKRF_ONE/board.i: __/chibios-portapack/boards/GSG_HACKRF_ONE/board.c.i +.PHONY : __/chibios-portapack/boards/GSG_HACKRF_ONE/board.i + +# target to preprocess a source file +__/chibios-portapack/boards/GSG_HACKRF_ONE/board.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/boards/GSG_HACKRF_ONE/board.c.i +.PHONY : __/chibios-portapack/boards/GSG_HACKRF_ONE/board.c.i + +__/chibios-portapack/boards/GSG_HACKRF_ONE/board.s: __/chibios-portapack/boards/GSG_HACKRF_ONE/board.c.s +.PHONY : __/chibios-portapack/boards/GSG_HACKRF_ONE/board.s + +# target to generate assembly for a file +__/chibios-portapack/boards/GSG_HACKRF_ONE/board.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/boards/GSG_HACKRF_ONE/board.c.s +.PHONY : __/chibios-portapack/boards/GSG_HACKRF_ONE/board.c.s + +__/chibios-portapack/ext/fatfs/src/ff.obj: __/chibios-portapack/ext/fatfs/src/ff.c.obj +.PHONY : __/chibios-portapack/ext/fatfs/src/ff.obj + +# target to build an object file +__/chibios-portapack/ext/fatfs/src/ff.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/ext/fatfs/src/ff.c.obj +.PHONY : __/chibios-portapack/ext/fatfs/src/ff.c.obj + +__/chibios-portapack/ext/fatfs/src/ff.i: __/chibios-portapack/ext/fatfs/src/ff.c.i +.PHONY : __/chibios-portapack/ext/fatfs/src/ff.i + +# target to preprocess a source file +__/chibios-portapack/ext/fatfs/src/ff.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/ext/fatfs/src/ff.c.i +.PHONY : __/chibios-portapack/ext/fatfs/src/ff.c.i + +__/chibios-portapack/ext/fatfs/src/ff.s: __/chibios-portapack/ext/fatfs/src/ff.c.s +.PHONY : __/chibios-portapack/ext/fatfs/src/ff.s + +# target to generate assembly for a file +__/chibios-portapack/ext/fatfs/src/ff.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/ext/fatfs/src/ff.c.s +.PHONY : __/chibios-portapack/ext/fatfs/src/ff.c.s + +__/chibios-portapack/os/hal/platforms/LPC43xx/gpt_lld.obj: __/chibios-portapack/os/hal/platforms/LPC43xx/gpt_lld.c.obj +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/gpt_lld.obj + +# target to build an object file +__/chibios-portapack/os/hal/platforms/LPC43xx/gpt_lld.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/hal/platforms/LPC43xx/gpt_lld.c.obj +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/gpt_lld.c.obj + +__/chibios-portapack/os/hal/platforms/LPC43xx/gpt_lld.i: __/chibios-portapack/os/hal/platforms/LPC43xx/gpt_lld.c.i +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/gpt_lld.i + +# target to preprocess a source file +__/chibios-portapack/os/hal/platforms/LPC43xx/gpt_lld.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/hal/platforms/LPC43xx/gpt_lld.c.i +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/gpt_lld.c.i + +__/chibios-portapack/os/hal/platforms/LPC43xx/gpt_lld.s: __/chibios-portapack/os/hal/platforms/LPC43xx/gpt_lld.c.s +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/gpt_lld.s + +# target to generate assembly for a file +__/chibios-portapack/os/hal/platforms/LPC43xx/gpt_lld.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/hal/platforms/LPC43xx/gpt_lld.c.s +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/gpt_lld.c.s + +__/chibios-portapack/os/hal/platforms/LPC43xx/i2c_lld.obj: __/chibios-portapack/os/hal/platforms/LPC43xx/i2c_lld.c.obj +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/i2c_lld.obj + +# target to build an object file +__/chibios-portapack/os/hal/platforms/LPC43xx/i2c_lld.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/hal/platforms/LPC43xx/i2c_lld.c.obj +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/i2c_lld.c.obj + +__/chibios-portapack/os/hal/platforms/LPC43xx/i2c_lld.i: __/chibios-portapack/os/hal/platforms/LPC43xx/i2c_lld.c.i +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/i2c_lld.i + +# target to preprocess a source file +__/chibios-portapack/os/hal/platforms/LPC43xx/i2c_lld.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/hal/platforms/LPC43xx/i2c_lld.c.i +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/i2c_lld.c.i + +__/chibios-portapack/os/hal/platforms/LPC43xx/i2c_lld.s: __/chibios-portapack/os/hal/platforms/LPC43xx/i2c_lld.c.s +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/i2c_lld.s + +# target to generate assembly for a file +__/chibios-portapack/os/hal/platforms/LPC43xx/i2c_lld.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/hal/platforms/LPC43xx/i2c_lld.c.s +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/i2c_lld.c.s + +__/chibios-portapack/os/hal/platforms/LPC43xx/pal_lld.obj: __/chibios-portapack/os/hal/platforms/LPC43xx/pal_lld.c.obj +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/pal_lld.obj + +# target to build an object file +__/chibios-portapack/os/hal/platforms/LPC43xx/pal_lld.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/hal/platforms/LPC43xx/pal_lld.c.obj +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/pal_lld.c.obj + +__/chibios-portapack/os/hal/platforms/LPC43xx/pal_lld.i: __/chibios-portapack/os/hal/platforms/LPC43xx/pal_lld.c.i +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/pal_lld.i + +# target to preprocess a source file +__/chibios-portapack/os/hal/platforms/LPC43xx/pal_lld.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/hal/platforms/LPC43xx/pal_lld.c.i +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/pal_lld.c.i + +__/chibios-portapack/os/hal/platforms/LPC43xx/pal_lld.s: __/chibios-portapack/os/hal/platforms/LPC43xx/pal_lld.c.s +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/pal_lld.s + +# target to generate assembly for a file +__/chibios-portapack/os/hal/platforms/LPC43xx/pal_lld.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/hal/platforms/LPC43xx/pal_lld.c.s +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/pal_lld.c.s + +__/chibios-portapack/os/hal/platforms/LPC43xx/rtc_lld.obj: __/chibios-portapack/os/hal/platforms/LPC43xx/rtc_lld.c.obj +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/rtc_lld.obj + +# target to build an object file +__/chibios-portapack/os/hal/platforms/LPC43xx/rtc_lld.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/hal/platforms/LPC43xx/rtc_lld.c.obj +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/rtc_lld.c.obj + +__/chibios-portapack/os/hal/platforms/LPC43xx/rtc_lld.i: __/chibios-portapack/os/hal/platforms/LPC43xx/rtc_lld.c.i +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/rtc_lld.i + +# target to preprocess a source file +__/chibios-portapack/os/hal/platforms/LPC43xx/rtc_lld.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/hal/platforms/LPC43xx/rtc_lld.c.i +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/rtc_lld.c.i + +__/chibios-portapack/os/hal/platforms/LPC43xx/rtc_lld.s: __/chibios-portapack/os/hal/platforms/LPC43xx/rtc_lld.c.s +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/rtc_lld.s + +# target to generate assembly for a file +__/chibios-portapack/os/hal/platforms/LPC43xx/rtc_lld.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/hal/platforms/LPC43xx/rtc_lld.c.s +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/rtc_lld.c.s + +__/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.obj: __/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c.obj +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.obj + +# target to build an object file +__/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c.obj +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c.obj + +__/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.i: __/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c.i +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.i + +# target to preprocess a source file +__/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c.i +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c.i + +__/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.s: __/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c.s +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.s + +# target to generate assembly for a file +__/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c.s +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c.s + +__/chibios-portapack/os/hal/platforms/LPC43xx/serial_lld.obj: __/chibios-portapack/os/hal/platforms/LPC43xx/serial_lld.c.obj +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/serial_lld.obj + +# target to build an object file +__/chibios-portapack/os/hal/platforms/LPC43xx/serial_lld.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/hal/platforms/LPC43xx/serial_lld.c.obj +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/serial_lld.c.obj + +__/chibios-portapack/os/hal/platforms/LPC43xx/serial_lld.i: __/chibios-portapack/os/hal/platforms/LPC43xx/serial_lld.c.i +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/serial_lld.i + +# target to preprocess a source file +__/chibios-portapack/os/hal/platforms/LPC43xx/serial_lld.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/hal/platforms/LPC43xx/serial_lld.c.i +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/serial_lld.c.i + +__/chibios-portapack/os/hal/platforms/LPC43xx/serial_lld.s: __/chibios-portapack/os/hal/platforms/LPC43xx/serial_lld.c.s +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/serial_lld.s + +# target to generate assembly for a file +__/chibios-portapack/os/hal/platforms/LPC43xx/serial_lld.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/hal/platforms/LPC43xx/serial_lld.c.s +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/serial_lld.c.s + +__/chibios-portapack/os/hal/platforms/LPC43xx/spi_lld.obj: __/chibios-portapack/os/hal/platforms/LPC43xx/spi_lld.c.obj +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/spi_lld.obj + +# target to build an object file +__/chibios-portapack/os/hal/platforms/LPC43xx/spi_lld.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/hal/platforms/LPC43xx/spi_lld.c.obj +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/spi_lld.c.obj + +__/chibios-portapack/os/hal/platforms/LPC43xx/spi_lld.i: __/chibios-portapack/os/hal/platforms/LPC43xx/spi_lld.c.i +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/spi_lld.i + +# target to preprocess a source file +__/chibios-portapack/os/hal/platforms/LPC43xx/spi_lld.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/hal/platforms/LPC43xx/spi_lld.c.i +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/spi_lld.c.i + +__/chibios-portapack/os/hal/platforms/LPC43xx/spi_lld.s: __/chibios-portapack/os/hal/platforms/LPC43xx/spi_lld.c.s +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/spi_lld.s + +# target to generate assembly for a file +__/chibios-portapack/os/hal/platforms/LPC43xx/spi_lld.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/hal/platforms/LPC43xx/spi_lld.c.s +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx/spi_lld.c.s + +__/chibios-portapack/os/hal/platforms/LPC43xx_M0/hal_lld.obj: __/chibios-portapack/os/hal/platforms/LPC43xx_M0/hal_lld.c.obj +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx_M0/hal_lld.obj + +# target to build an object file +__/chibios-portapack/os/hal/platforms/LPC43xx_M0/hal_lld.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/hal/platforms/LPC43xx_M0/hal_lld.c.obj +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx_M0/hal_lld.c.obj + +__/chibios-portapack/os/hal/platforms/LPC43xx_M0/hal_lld.i: __/chibios-portapack/os/hal/platforms/LPC43xx_M0/hal_lld.c.i +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx_M0/hal_lld.i + +# target to preprocess a source file +__/chibios-portapack/os/hal/platforms/LPC43xx_M0/hal_lld.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/hal/platforms/LPC43xx_M0/hal_lld.c.i +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx_M0/hal_lld.c.i + +__/chibios-portapack/os/hal/platforms/LPC43xx_M0/hal_lld.s: __/chibios-portapack/os/hal/platforms/LPC43xx_M0/hal_lld.c.s +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx_M0/hal_lld.s + +# target to generate assembly for a file +__/chibios-portapack/os/hal/platforms/LPC43xx_M0/hal_lld.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/hal/platforms/LPC43xx_M0/hal_lld.c.s +.PHONY : __/chibios-portapack/os/hal/platforms/LPC43xx_M0/hal_lld.c.s + +__/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/vectors.obj: __/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/vectors.c.obj +.PHONY : __/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/vectors.obj + +# target to build an object file +__/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/vectors.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/vectors.c.obj +.PHONY : __/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/vectors.c.obj + +__/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/vectors.i: __/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/vectors.c.i +.PHONY : __/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/vectors.i + +# target to preprocess a source file +__/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/vectors.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/vectors.c.i +.PHONY : __/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/vectors.c.i + +__/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/vectors.s: __/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/vectors.c.s +.PHONY : __/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/vectors.s + +# target to generate assembly for a file +__/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/vectors.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/vectors.c.s +.PHONY : __/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/vectors.c.s + +__/chibios-portapack/os/various/fatfs_bindings/fatfs_diskio.obj: __/chibios-portapack/os/various/fatfs_bindings/fatfs_diskio.c.obj +.PHONY : __/chibios-portapack/os/various/fatfs_bindings/fatfs_diskio.obj + +# target to build an object file +__/chibios-portapack/os/various/fatfs_bindings/fatfs_diskio.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/various/fatfs_bindings/fatfs_diskio.c.obj +.PHONY : __/chibios-portapack/os/various/fatfs_bindings/fatfs_diskio.c.obj + +__/chibios-portapack/os/various/fatfs_bindings/fatfs_diskio.i: __/chibios-portapack/os/various/fatfs_bindings/fatfs_diskio.c.i +.PHONY : __/chibios-portapack/os/various/fatfs_bindings/fatfs_diskio.i + +# target to preprocess a source file +__/chibios-portapack/os/various/fatfs_bindings/fatfs_diskio.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/various/fatfs_bindings/fatfs_diskio.c.i +.PHONY : __/chibios-portapack/os/various/fatfs_bindings/fatfs_diskio.c.i + +__/chibios-portapack/os/various/fatfs_bindings/fatfs_diskio.s: __/chibios-portapack/os/various/fatfs_bindings/fatfs_diskio.c.s +.PHONY : __/chibios-portapack/os/various/fatfs_bindings/fatfs_diskio.s + +# target to generate assembly for a file +__/chibios-portapack/os/various/fatfs_bindings/fatfs_diskio.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/various/fatfs_bindings/fatfs_diskio.c.s +.PHONY : __/chibios-portapack/os/various/fatfs_bindings/fatfs_diskio.c.s + +__/chibios-portapack/os/various/fatfs_bindings/fatfs_syscall.obj: __/chibios-portapack/os/various/fatfs_bindings/fatfs_syscall.c.obj +.PHONY : __/chibios-portapack/os/various/fatfs_bindings/fatfs_syscall.obj + +# target to build an object file +__/chibios-portapack/os/various/fatfs_bindings/fatfs_syscall.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/various/fatfs_bindings/fatfs_syscall.c.obj +.PHONY : __/chibios-portapack/os/various/fatfs_bindings/fatfs_syscall.c.obj + +__/chibios-portapack/os/various/fatfs_bindings/fatfs_syscall.i: __/chibios-portapack/os/various/fatfs_bindings/fatfs_syscall.c.i +.PHONY : __/chibios-portapack/os/various/fatfs_bindings/fatfs_syscall.i + +# target to preprocess a source file +__/chibios-portapack/os/various/fatfs_bindings/fatfs_syscall.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/various/fatfs_bindings/fatfs_syscall.c.i +.PHONY : __/chibios-portapack/os/various/fatfs_bindings/fatfs_syscall.c.i + +__/chibios-portapack/os/various/fatfs_bindings/fatfs_syscall.s: __/chibios-portapack/os/various/fatfs_bindings/fatfs_syscall.c.s +.PHONY : __/chibios-portapack/os/various/fatfs_bindings/fatfs_syscall.s + +# target to generate assembly for a file +__/chibios-portapack/os/various/fatfs_bindings/fatfs_syscall.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios-portapack/os/various/fatfs_bindings/fatfs_syscall.c.s +.PHONY : __/chibios-portapack/os/various/fatfs_bindings/fatfs_syscall.c.s + +__/chibios/os/hal/src/adc.obj: __/chibios/os/hal/src/adc.c.obj +.PHONY : __/chibios/os/hal/src/adc.obj + +# target to build an object file +__/chibios/os/hal/src/adc.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/adc.c.obj +.PHONY : __/chibios/os/hal/src/adc.c.obj + +__/chibios/os/hal/src/adc.i: __/chibios/os/hal/src/adc.c.i +.PHONY : __/chibios/os/hal/src/adc.i + +# target to preprocess a source file +__/chibios/os/hal/src/adc.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/adc.c.i +.PHONY : __/chibios/os/hal/src/adc.c.i + +__/chibios/os/hal/src/adc.s: __/chibios/os/hal/src/adc.c.s +.PHONY : __/chibios/os/hal/src/adc.s + +# target to generate assembly for a file +__/chibios/os/hal/src/adc.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/adc.c.s +.PHONY : __/chibios/os/hal/src/adc.c.s + +__/chibios/os/hal/src/can.obj: __/chibios/os/hal/src/can.c.obj +.PHONY : __/chibios/os/hal/src/can.obj + +# target to build an object file +__/chibios/os/hal/src/can.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/can.c.obj +.PHONY : __/chibios/os/hal/src/can.c.obj + +__/chibios/os/hal/src/can.i: __/chibios/os/hal/src/can.c.i +.PHONY : __/chibios/os/hal/src/can.i + +# target to preprocess a source file +__/chibios/os/hal/src/can.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/can.c.i +.PHONY : __/chibios/os/hal/src/can.c.i + +__/chibios/os/hal/src/can.s: __/chibios/os/hal/src/can.c.s +.PHONY : __/chibios/os/hal/src/can.s + +# target to generate assembly for a file +__/chibios/os/hal/src/can.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/can.c.s +.PHONY : __/chibios/os/hal/src/can.c.s + +__/chibios/os/hal/src/ext.obj: __/chibios/os/hal/src/ext.c.obj +.PHONY : __/chibios/os/hal/src/ext.obj + +# target to build an object file +__/chibios/os/hal/src/ext.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/ext.c.obj +.PHONY : __/chibios/os/hal/src/ext.c.obj + +__/chibios/os/hal/src/ext.i: __/chibios/os/hal/src/ext.c.i +.PHONY : __/chibios/os/hal/src/ext.i + +# target to preprocess a source file +__/chibios/os/hal/src/ext.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/ext.c.i +.PHONY : __/chibios/os/hal/src/ext.c.i + +__/chibios/os/hal/src/ext.s: __/chibios/os/hal/src/ext.c.s +.PHONY : __/chibios/os/hal/src/ext.s + +# target to generate assembly for a file +__/chibios/os/hal/src/ext.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/ext.c.s +.PHONY : __/chibios/os/hal/src/ext.c.s + +__/chibios/os/hal/src/gpt.obj: __/chibios/os/hal/src/gpt.c.obj +.PHONY : __/chibios/os/hal/src/gpt.obj + +# target to build an object file +__/chibios/os/hal/src/gpt.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/gpt.c.obj +.PHONY : __/chibios/os/hal/src/gpt.c.obj + +__/chibios/os/hal/src/gpt.i: __/chibios/os/hal/src/gpt.c.i +.PHONY : __/chibios/os/hal/src/gpt.i + +# target to preprocess a source file +__/chibios/os/hal/src/gpt.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/gpt.c.i +.PHONY : __/chibios/os/hal/src/gpt.c.i + +__/chibios/os/hal/src/gpt.s: __/chibios/os/hal/src/gpt.c.s +.PHONY : __/chibios/os/hal/src/gpt.s + +# target to generate assembly for a file +__/chibios/os/hal/src/gpt.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/gpt.c.s +.PHONY : __/chibios/os/hal/src/gpt.c.s + +__/chibios/os/hal/src/hal.obj: __/chibios/os/hal/src/hal.c.obj +.PHONY : __/chibios/os/hal/src/hal.obj + +# target to build an object file +__/chibios/os/hal/src/hal.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/hal.c.obj +.PHONY : __/chibios/os/hal/src/hal.c.obj + +__/chibios/os/hal/src/hal.i: __/chibios/os/hal/src/hal.c.i +.PHONY : __/chibios/os/hal/src/hal.i + +# target to preprocess a source file +__/chibios/os/hal/src/hal.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/hal.c.i +.PHONY : __/chibios/os/hal/src/hal.c.i + +__/chibios/os/hal/src/hal.s: __/chibios/os/hal/src/hal.c.s +.PHONY : __/chibios/os/hal/src/hal.s + +# target to generate assembly for a file +__/chibios/os/hal/src/hal.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/hal.c.s +.PHONY : __/chibios/os/hal/src/hal.c.s + +__/chibios/os/hal/src/i2c.obj: __/chibios/os/hal/src/i2c.c.obj +.PHONY : __/chibios/os/hal/src/i2c.obj + +# target to build an object file +__/chibios/os/hal/src/i2c.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/i2c.c.obj +.PHONY : __/chibios/os/hal/src/i2c.c.obj + +__/chibios/os/hal/src/i2c.i: __/chibios/os/hal/src/i2c.c.i +.PHONY : __/chibios/os/hal/src/i2c.i + +# target to preprocess a source file +__/chibios/os/hal/src/i2c.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/i2c.c.i +.PHONY : __/chibios/os/hal/src/i2c.c.i + +__/chibios/os/hal/src/i2c.s: __/chibios/os/hal/src/i2c.c.s +.PHONY : __/chibios/os/hal/src/i2c.s + +# target to generate assembly for a file +__/chibios/os/hal/src/i2c.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/i2c.c.s +.PHONY : __/chibios/os/hal/src/i2c.c.s + +__/chibios/os/hal/src/icu.obj: __/chibios/os/hal/src/icu.c.obj +.PHONY : __/chibios/os/hal/src/icu.obj + +# target to build an object file +__/chibios/os/hal/src/icu.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/icu.c.obj +.PHONY : __/chibios/os/hal/src/icu.c.obj + +__/chibios/os/hal/src/icu.i: __/chibios/os/hal/src/icu.c.i +.PHONY : __/chibios/os/hal/src/icu.i + +# target to preprocess a source file +__/chibios/os/hal/src/icu.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/icu.c.i +.PHONY : __/chibios/os/hal/src/icu.c.i + +__/chibios/os/hal/src/icu.s: __/chibios/os/hal/src/icu.c.s +.PHONY : __/chibios/os/hal/src/icu.s + +# target to generate assembly for a file +__/chibios/os/hal/src/icu.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/icu.c.s +.PHONY : __/chibios/os/hal/src/icu.c.s + +__/chibios/os/hal/src/mac.obj: __/chibios/os/hal/src/mac.c.obj +.PHONY : __/chibios/os/hal/src/mac.obj + +# target to build an object file +__/chibios/os/hal/src/mac.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/mac.c.obj +.PHONY : __/chibios/os/hal/src/mac.c.obj + +__/chibios/os/hal/src/mac.i: __/chibios/os/hal/src/mac.c.i +.PHONY : __/chibios/os/hal/src/mac.i + +# target to preprocess a source file +__/chibios/os/hal/src/mac.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/mac.c.i +.PHONY : __/chibios/os/hal/src/mac.c.i + +__/chibios/os/hal/src/mac.s: __/chibios/os/hal/src/mac.c.s +.PHONY : __/chibios/os/hal/src/mac.s + +# target to generate assembly for a file +__/chibios/os/hal/src/mac.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/mac.c.s +.PHONY : __/chibios/os/hal/src/mac.c.s + +__/chibios/os/hal/src/mmc_spi.obj: __/chibios/os/hal/src/mmc_spi.c.obj +.PHONY : __/chibios/os/hal/src/mmc_spi.obj + +# target to build an object file +__/chibios/os/hal/src/mmc_spi.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/mmc_spi.c.obj +.PHONY : __/chibios/os/hal/src/mmc_spi.c.obj + +__/chibios/os/hal/src/mmc_spi.i: __/chibios/os/hal/src/mmc_spi.c.i +.PHONY : __/chibios/os/hal/src/mmc_spi.i + +# target to preprocess a source file +__/chibios/os/hal/src/mmc_spi.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/mmc_spi.c.i +.PHONY : __/chibios/os/hal/src/mmc_spi.c.i + +__/chibios/os/hal/src/mmc_spi.s: __/chibios/os/hal/src/mmc_spi.c.s +.PHONY : __/chibios/os/hal/src/mmc_spi.s + +# target to generate assembly for a file +__/chibios/os/hal/src/mmc_spi.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/mmc_spi.c.s +.PHONY : __/chibios/os/hal/src/mmc_spi.c.s + +__/chibios/os/hal/src/mmcsd.obj: __/chibios/os/hal/src/mmcsd.c.obj +.PHONY : __/chibios/os/hal/src/mmcsd.obj + +# target to build an object file +__/chibios/os/hal/src/mmcsd.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/mmcsd.c.obj +.PHONY : __/chibios/os/hal/src/mmcsd.c.obj + +__/chibios/os/hal/src/mmcsd.i: __/chibios/os/hal/src/mmcsd.c.i +.PHONY : __/chibios/os/hal/src/mmcsd.i + +# target to preprocess a source file +__/chibios/os/hal/src/mmcsd.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/mmcsd.c.i +.PHONY : __/chibios/os/hal/src/mmcsd.c.i + +__/chibios/os/hal/src/mmcsd.s: __/chibios/os/hal/src/mmcsd.c.s +.PHONY : __/chibios/os/hal/src/mmcsd.s + +# target to generate assembly for a file +__/chibios/os/hal/src/mmcsd.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/mmcsd.c.s +.PHONY : __/chibios/os/hal/src/mmcsd.c.s + +__/chibios/os/hal/src/pal.obj: __/chibios/os/hal/src/pal.c.obj +.PHONY : __/chibios/os/hal/src/pal.obj + +# target to build an object file +__/chibios/os/hal/src/pal.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/pal.c.obj +.PHONY : __/chibios/os/hal/src/pal.c.obj + +__/chibios/os/hal/src/pal.i: __/chibios/os/hal/src/pal.c.i +.PHONY : __/chibios/os/hal/src/pal.i + +# target to preprocess a source file +__/chibios/os/hal/src/pal.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/pal.c.i +.PHONY : __/chibios/os/hal/src/pal.c.i + +__/chibios/os/hal/src/pal.s: __/chibios/os/hal/src/pal.c.s +.PHONY : __/chibios/os/hal/src/pal.s + +# target to generate assembly for a file +__/chibios/os/hal/src/pal.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/pal.c.s +.PHONY : __/chibios/os/hal/src/pal.c.s + +__/chibios/os/hal/src/pwm.obj: __/chibios/os/hal/src/pwm.c.obj +.PHONY : __/chibios/os/hal/src/pwm.obj + +# target to build an object file +__/chibios/os/hal/src/pwm.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/pwm.c.obj +.PHONY : __/chibios/os/hal/src/pwm.c.obj + +__/chibios/os/hal/src/pwm.i: __/chibios/os/hal/src/pwm.c.i +.PHONY : __/chibios/os/hal/src/pwm.i + +# target to preprocess a source file +__/chibios/os/hal/src/pwm.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/pwm.c.i +.PHONY : __/chibios/os/hal/src/pwm.c.i + +__/chibios/os/hal/src/pwm.s: __/chibios/os/hal/src/pwm.c.s +.PHONY : __/chibios/os/hal/src/pwm.s + +# target to generate assembly for a file +__/chibios/os/hal/src/pwm.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/pwm.c.s +.PHONY : __/chibios/os/hal/src/pwm.c.s + +__/chibios/os/hal/src/rtc.obj: __/chibios/os/hal/src/rtc.c.obj +.PHONY : __/chibios/os/hal/src/rtc.obj + +# target to build an object file +__/chibios/os/hal/src/rtc.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/rtc.c.obj +.PHONY : __/chibios/os/hal/src/rtc.c.obj + +__/chibios/os/hal/src/rtc.i: __/chibios/os/hal/src/rtc.c.i +.PHONY : __/chibios/os/hal/src/rtc.i + +# target to preprocess a source file +__/chibios/os/hal/src/rtc.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/rtc.c.i +.PHONY : __/chibios/os/hal/src/rtc.c.i + +__/chibios/os/hal/src/rtc.s: __/chibios/os/hal/src/rtc.c.s +.PHONY : __/chibios/os/hal/src/rtc.s + +# target to generate assembly for a file +__/chibios/os/hal/src/rtc.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/rtc.c.s +.PHONY : __/chibios/os/hal/src/rtc.c.s + +__/chibios/os/hal/src/sdc.obj: __/chibios/os/hal/src/sdc.c.obj +.PHONY : __/chibios/os/hal/src/sdc.obj + +# target to build an object file +__/chibios/os/hal/src/sdc.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/sdc.c.obj +.PHONY : __/chibios/os/hal/src/sdc.c.obj + +__/chibios/os/hal/src/sdc.i: __/chibios/os/hal/src/sdc.c.i +.PHONY : __/chibios/os/hal/src/sdc.i + +# target to preprocess a source file +__/chibios/os/hal/src/sdc.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/sdc.c.i +.PHONY : __/chibios/os/hal/src/sdc.c.i + +__/chibios/os/hal/src/sdc.s: __/chibios/os/hal/src/sdc.c.s +.PHONY : __/chibios/os/hal/src/sdc.s + +# target to generate assembly for a file +__/chibios/os/hal/src/sdc.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/sdc.c.s +.PHONY : __/chibios/os/hal/src/sdc.c.s + +__/chibios/os/hal/src/serial.obj: __/chibios/os/hal/src/serial.c.obj +.PHONY : __/chibios/os/hal/src/serial.obj + +# target to build an object file +__/chibios/os/hal/src/serial.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/serial.c.obj +.PHONY : __/chibios/os/hal/src/serial.c.obj + +__/chibios/os/hal/src/serial.i: __/chibios/os/hal/src/serial.c.i +.PHONY : __/chibios/os/hal/src/serial.i + +# target to preprocess a source file +__/chibios/os/hal/src/serial.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/serial.c.i +.PHONY : __/chibios/os/hal/src/serial.c.i + +__/chibios/os/hal/src/serial.s: __/chibios/os/hal/src/serial.c.s +.PHONY : __/chibios/os/hal/src/serial.s + +# target to generate assembly for a file +__/chibios/os/hal/src/serial.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/serial.c.s +.PHONY : __/chibios/os/hal/src/serial.c.s + +__/chibios/os/hal/src/serial_usb.obj: __/chibios/os/hal/src/serial_usb.c.obj +.PHONY : __/chibios/os/hal/src/serial_usb.obj + +# target to build an object file +__/chibios/os/hal/src/serial_usb.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/serial_usb.c.obj +.PHONY : __/chibios/os/hal/src/serial_usb.c.obj + +__/chibios/os/hal/src/serial_usb.i: __/chibios/os/hal/src/serial_usb.c.i +.PHONY : __/chibios/os/hal/src/serial_usb.i + +# target to preprocess a source file +__/chibios/os/hal/src/serial_usb.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/serial_usb.c.i +.PHONY : __/chibios/os/hal/src/serial_usb.c.i + +__/chibios/os/hal/src/serial_usb.s: __/chibios/os/hal/src/serial_usb.c.s +.PHONY : __/chibios/os/hal/src/serial_usb.s + +# target to generate assembly for a file +__/chibios/os/hal/src/serial_usb.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/serial_usb.c.s +.PHONY : __/chibios/os/hal/src/serial_usb.c.s + +__/chibios/os/hal/src/spi.obj: __/chibios/os/hal/src/spi.c.obj +.PHONY : __/chibios/os/hal/src/spi.obj + +# target to build an object file +__/chibios/os/hal/src/spi.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/spi.c.obj +.PHONY : __/chibios/os/hal/src/spi.c.obj + +__/chibios/os/hal/src/spi.i: __/chibios/os/hal/src/spi.c.i +.PHONY : __/chibios/os/hal/src/spi.i + +# target to preprocess a source file +__/chibios/os/hal/src/spi.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/spi.c.i +.PHONY : __/chibios/os/hal/src/spi.c.i + +__/chibios/os/hal/src/spi.s: __/chibios/os/hal/src/spi.c.s +.PHONY : __/chibios/os/hal/src/spi.s + +# target to generate assembly for a file +__/chibios/os/hal/src/spi.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/spi.c.s +.PHONY : __/chibios/os/hal/src/spi.c.s + +__/chibios/os/hal/src/tm.obj: __/chibios/os/hal/src/tm.c.obj +.PHONY : __/chibios/os/hal/src/tm.obj + +# target to build an object file +__/chibios/os/hal/src/tm.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/tm.c.obj +.PHONY : __/chibios/os/hal/src/tm.c.obj + +__/chibios/os/hal/src/tm.i: __/chibios/os/hal/src/tm.c.i +.PHONY : __/chibios/os/hal/src/tm.i + +# target to preprocess a source file +__/chibios/os/hal/src/tm.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/tm.c.i +.PHONY : __/chibios/os/hal/src/tm.c.i + +__/chibios/os/hal/src/tm.s: __/chibios/os/hal/src/tm.c.s +.PHONY : __/chibios/os/hal/src/tm.s + +# target to generate assembly for a file +__/chibios/os/hal/src/tm.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/tm.c.s +.PHONY : __/chibios/os/hal/src/tm.c.s + +__/chibios/os/hal/src/uart.obj: __/chibios/os/hal/src/uart.c.obj +.PHONY : __/chibios/os/hal/src/uart.obj + +# target to build an object file +__/chibios/os/hal/src/uart.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/uart.c.obj +.PHONY : __/chibios/os/hal/src/uart.c.obj + +__/chibios/os/hal/src/uart.i: __/chibios/os/hal/src/uart.c.i +.PHONY : __/chibios/os/hal/src/uart.i + +# target to preprocess a source file +__/chibios/os/hal/src/uart.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/uart.c.i +.PHONY : __/chibios/os/hal/src/uart.c.i + +__/chibios/os/hal/src/uart.s: __/chibios/os/hal/src/uart.c.s +.PHONY : __/chibios/os/hal/src/uart.s + +# target to generate assembly for a file +__/chibios/os/hal/src/uart.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/uart.c.s +.PHONY : __/chibios/os/hal/src/uart.c.s + +__/chibios/os/hal/src/usb.obj: __/chibios/os/hal/src/usb.c.obj +.PHONY : __/chibios/os/hal/src/usb.obj + +# target to build an object file +__/chibios/os/hal/src/usb.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/usb.c.obj +.PHONY : __/chibios/os/hal/src/usb.c.obj + +__/chibios/os/hal/src/usb.i: __/chibios/os/hal/src/usb.c.i +.PHONY : __/chibios/os/hal/src/usb.i + +# target to preprocess a source file +__/chibios/os/hal/src/usb.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/usb.c.i +.PHONY : __/chibios/os/hal/src/usb.c.i + +__/chibios/os/hal/src/usb.s: __/chibios/os/hal/src/usb.c.s +.PHONY : __/chibios/os/hal/src/usb.s + +# target to generate assembly for a file +__/chibios/os/hal/src/usb.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/hal/src/usb.c.s +.PHONY : __/chibios/os/hal/src/usb.c.s + +__/chibios/os/kernel/src/chcond.obj: __/chibios/os/kernel/src/chcond.c.obj +.PHONY : __/chibios/os/kernel/src/chcond.obj + +# target to build an object file +__/chibios/os/kernel/src/chcond.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chcond.c.obj +.PHONY : __/chibios/os/kernel/src/chcond.c.obj + +__/chibios/os/kernel/src/chcond.i: __/chibios/os/kernel/src/chcond.c.i +.PHONY : __/chibios/os/kernel/src/chcond.i + +# target to preprocess a source file +__/chibios/os/kernel/src/chcond.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chcond.c.i +.PHONY : __/chibios/os/kernel/src/chcond.c.i + +__/chibios/os/kernel/src/chcond.s: __/chibios/os/kernel/src/chcond.c.s +.PHONY : __/chibios/os/kernel/src/chcond.s + +# target to generate assembly for a file +__/chibios/os/kernel/src/chcond.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chcond.c.s +.PHONY : __/chibios/os/kernel/src/chcond.c.s + +__/chibios/os/kernel/src/chdebug.obj: __/chibios/os/kernel/src/chdebug.c.obj +.PHONY : __/chibios/os/kernel/src/chdebug.obj + +# target to build an object file +__/chibios/os/kernel/src/chdebug.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chdebug.c.obj +.PHONY : __/chibios/os/kernel/src/chdebug.c.obj + +__/chibios/os/kernel/src/chdebug.i: __/chibios/os/kernel/src/chdebug.c.i +.PHONY : __/chibios/os/kernel/src/chdebug.i + +# target to preprocess a source file +__/chibios/os/kernel/src/chdebug.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chdebug.c.i +.PHONY : __/chibios/os/kernel/src/chdebug.c.i + +__/chibios/os/kernel/src/chdebug.s: __/chibios/os/kernel/src/chdebug.c.s +.PHONY : __/chibios/os/kernel/src/chdebug.s + +# target to generate assembly for a file +__/chibios/os/kernel/src/chdebug.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chdebug.c.s +.PHONY : __/chibios/os/kernel/src/chdebug.c.s + +__/chibios/os/kernel/src/chdynamic.obj: __/chibios/os/kernel/src/chdynamic.c.obj +.PHONY : __/chibios/os/kernel/src/chdynamic.obj + +# target to build an object file +__/chibios/os/kernel/src/chdynamic.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chdynamic.c.obj +.PHONY : __/chibios/os/kernel/src/chdynamic.c.obj + +__/chibios/os/kernel/src/chdynamic.i: __/chibios/os/kernel/src/chdynamic.c.i +.PHONY : __/chibios/os/kernel/src/chdynamic.i + +# target to preprocess a source file +__/chibios/os/kernel/src/chdynamic.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chdynamic.c.i +.PHONY : __/chibios/os/kernel/src/chdynamic.c.i + +__/chibios/os/kernel/src/chdynamic.s: __/chibios/os/kernel/src/chdynamic.c.s +.PHONY : __/chibios/os/kernel/src/chdynamic.s + +# target to generate assembly for a file +__/chibios/os/kernel/src/chdynamic.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chdynamic.c.s +.PHONY : __/chibios/os/kernel/src/chdynamic.c.s + +__/chibios/os/kernel/src/chevents.obj: __/chibios/os/kernel/src/chevents.c.obj +.PHONY : __/chibios/os/kernel/src/chevents.obj + +# target to build an object file +__/chibios/os/kernel/src/chevents.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chevents.c.obj +.PHONY : __/chibios/os/kernel/src/chevents.c.obj + +__/chibios/os/kernel/src/chevents.i: __/chibios/os/kernel/src/chevents.c.i +.PHONY : __/chibios/os/kernel/src/chevents.i + +# target to preprocess a source file +__/chibios/os/kernel/src/chevents.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chevents.c.i +.PHONY : __/chibios/os/kernel/src/chevents.c.i + +__/chibios/os/kernel/src/chevents.s: __/chibios/os/kernel/src/chevents.c.s +.PHONY : __/chibios/os/kernel/src/chevents.s + +# target to generate assembly for a file +__/chibios/os/kernel/src/chevents.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chevents.c.s +.PHONY : __/chibios/os/kernel/src/chevents.c.s + +__/chibios/os/kernel/src/chheap.obj: __/chibios/os/kernel/src/chheap.c.obj +.PHONY : __/chibios/os/kernel/src/chheap.obj + +# target to build an object file +__/chibios/os/kernel/src/chheap.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chheap.c.obj +.PHONY : __/chibios/os/kernel/src/chheap.c.obj + +__/chibios/os/kernel/src/chheap.i: __/chibios/os/kernel/src/chheap.c.i +.PHONY : __/chibios/os/kernel/src/chheap.i + +# target to preprocess a source file +__/chibios/os/kernel/src/chheap.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chheap.c.i +.PHONY : __/chibios/os/kernel/src/chheap.c.i + +__/chibios/os/kernel/src/chheap.s: __/chibios/os/kernel/src/chheap.c.s +.PHONY : __/chibios/os/kernel/src/chheap.s + +# target to generate assembly for a file +__/chibios/os/kernel/src/chheap.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chheap.c.s +.PHONY : __/chibios/os/kernel/src/chheap.c.s + +__/chibios/os/kernel/src/chlists.obj: __/chibios/os/kernel/src/chlists.c.obj +.PHONY : __/chibios/os/kernel/src/chlists.obj + +# target to build an object file +__/chibios/os/kernel/src/chlists.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chlists.c.obj +.PHONY : __/chibios/os/kernel/src/chlists.c.obj + +__/chibios/os/kernel/src/chlists.i: __/chibios/os/kernel/src/chlists.c.i +.PHONY : __/chibios/os/kernel/src/chlists.i + +# target to preprocess a source file +__/chibios/os/kernel/src/chlists.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chlists.c.i +.PHONY : __/chibios/os/kernel/src/chlists.c.i + +__/chibios/os/kernel/src/chlists.s: __/chibios/os/kernel/src/chlists.c.s +.PHONY : __/chibios/os/kernel/src/chlists.s + +# target to generate assembly for a file +__/chibios/os/kernel/src/chlists.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chlists.c.s +.PHONY : __/chibios/os/kernel/src/chlists.c.s + +__/chibios/os/kernel/src/chmboxes.obj: __/chibios/os/kernel/src/chmboxes.c.obj +.PHONY : __/chibios/os/kernel/src/chmboxes.obj + +# target to build an object file +__/chibios/os/kernel/src/chmboxes.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chmboxes.c.obj +.PHONY : __/chibios/os/kernel/src/chmboxes.c.obj + +__/chibios/os/kernel/src/chmboxes.i: __/chibios/os/kernel/src/chmboxes.c.i +.PHONY : __/chibios/os/kernel/src/chmboxes.i + +# target to preprocess a source file +__/chibios/os/kernel/src/chmboxes.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chmboxes.c.i +.PHONY : __/chibios/os/kernel/src/chmboxes.c.i + +__/chibios/os/kernel/src/chmboxes.s: __/chibios/os/kernel/src/chmboxes.c.s +.PHONY : __/chibios/os/kernel/src/chmboxes.s + +# target to generate assembly for a file +__/chibios/os/kernel/src/chmboxes.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chmboxes.c.s +.PHONY : __/chibios/os/kernel/src/chmboxes.c.s + +__/chibios/os/kernel/src/chmemcore.obj: __/chibios/os/kernel/src/chmemcore.c.obj +.PHONY : __/chibios/os/kernel/src/chmemcore.obj + +# target to build an object file +__/chibios/os/kernel/src/chmemcore.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chmemcore.c.obj +.PHONY : __/chibios/os/kernel/src/chmemcore.c.obj + +__/chibios/os/kernel/src/chmemcore.i: __/chibios/os/kernel/src/chmemcore.c.i +.PHONY : __/chibios/os/kernel/src/chmemcore.i + +# target to preprocess a source file +__/chibios/os/kernel/src/chmemcore.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chmemcore.c.i +.PHONY : __/chibios/os/kernel/src/chmemcore.c.i + +__/chibios/os/kernel/src/chmemcore.s: __/chibios/os/kernel/src/chmemcore.c.s +.PHONY : __/chibios/os/kernel/src/chmemcore.s + +# target to generate assembly for a file +__/chibios/os/kernel/src/chmemcore.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chmemcore.c.s +.PHONY : __/chibios/os/kernel/src/chmemcore.c.s + +__/chibios/os/kernel/src/chmempools.obj: __/chibios/os/kernel/src/chmempools.c.obj +.PHONY : __/chibios/os/kernel/src/chmempools.obj + +# target to build an object file +__/chibios/os/kernel/src/chmempools.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chmempools.c.obj +.PHONY : __/chibios/os/kernel/src/chmempools.c.obj + +__/chibios/os/kernel/src/chmempools.i: __/chibios/os/kernel/src/chmempools.c.i +.PHONY : __/chibios/os/kernel/src/chmempools.i + +# target to preprocess a source file +__/chibios/os/kernel/src/chmempools.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chmempools.c.i +.PHONY : __/chibios/os/kernel/src/chmempools.c.i + +__/chibios/os/kernel/src/chmempools.s: __/chibios/os/kernel/src/chmempools.c.s +.PHONY : __/chibios/os/kernel/src/chmempools.s + +# target to generate assembly for a file +__/chibios/os/kernel/src/chmempools.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chmempools.c.s +.PHONY : __/chibios/os/kernel/src/chmempools.c.s + +__/chibios/os/kernel/src/chmsg.obj: __/chibios/os/kernel/src/chmsg.c.obj +.PHONY : __/chibios/os/kernel/src/chmsg.obj + +# target to build an object file +__/chibios/os/kernel/src/chmsg.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chmsg.c.obj +.PHONY : __/chibios/os/kernel/src/chmsg.c.obj + +__/chibios/os/kernel/src/chmsg.i: __/chibios/os/kernel/src/chmsg.c.i +.PHONY : __/chibios/os/kernel/src/chmsg.i + +# target to preprocess a source file +__/chibios/os/kernel/src/chmsg.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chmsg.c.i +.PHONY : __/chibios/os/kernel/src/chmsg.c.i + +__/chibios/os/kernel/src/chmsg.s: __/chibios/os/kernel/src/chmsg.c.s +.PHONY : __/chibios/os/kernel/src/chmsg.s + +# target to generate assembly for a file +__/chibios/os/kernel/src/chmsg.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chmsg.c.s +.PHONY : __/chibios/os/kernel/src/chmsg.c.s + +__/chibios/os/kernel/src/chmtx.obj: __/chibios/os/kernel/src/chmtx.c.obj +.PHONY : __/chibios/os/kernel/src/chmtx.obj + +# target to build an object file +__/chibios/os/kernel/src/chmtx.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chmtx.c.obj +.PHONY : __/chibios/os/kernel/src/chmtx.c.obj + +__/chibios/os/kernel/src/chmtx.i: __/chibios/os/kernel/src/chmtx.c.i +.PHONY : __/chibios/os/kernel/src/chmtx.i + +# target to preprocess a source file +__/chibios/os/kernel/src/chmtx.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chmtx.c.i +.PHONY : __/chibios/os/kernel/src/chmtx.c.i + +__/chibios/os/kernel/src/chmtx.s: __/chibios/os/kernel/src/chmtx.c.s +.PHONY : __/chibios/os/kernel/src/chmtx.s + +# target to generate assembly for a file +__/chibios/os/kernel/src/chmtx.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chmtx.c.s +.PHONY : __/chibios/os/kernel/src/chmtx.c.s + +__/chibios/os/kernel/src/chqueues.obj: __/chibios/os/kernel/src/chqueues.c.obj +.PHONY : __/chibios/os/kernel/src/chqueues.obj + +# target to build an object file +__/chibios/os/kernel/src/chqueues.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chqueues.c.obj +.PHONY : __/chibios/os/kernel/src/chqueues.c.obj + +__/chibios/os/kernel/src/chqueues.i: __/chibios/os/kernel/src/chqueues.c.i +.PHONY : __/chibios/os/kernel/src/chqueues.i + +# target to preprocess a source file +__/chibios/os/kernel/src/chqueues.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chqueues.c.i +.PHONY : __/chibios/os/kernel/src/chqueues.c.i + +__/chibios/os/kernel/src/chqueues.s: __/chibios/os/kernel/src/chqueues.c.s +.PHONY : __/chibios/os/kernel/src/chqueues.s + +# target to generate assembly for a file +__/chibios/os/kernel/src/chqueues.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chqueues.c.s +.PHONY : __/chibios/os/kernel/src/chqueues.c.s + +__/chibios/os/kernel/src/chregistry.obj: __/chibios/os/kernel/src/chregistry.c.obj +.PHONY : __/chibios/os/kernel/src/chregistry.obj + +# target to build an object file +__/chibios/os/kernel/src/chregistry.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chregistry.c.obj +.PHONY : __/chibios/os/kernel/src/chregistry.c.obj + +__/chibios/os/kernel/src/chregistry.i: __/chibios/os/kernel/src/chregistry.c.i +.PHONY : __/chibios/os/kernel/src/chregistry.i + +# target to preprocess a source file +__/chibios/os/kernel/src/chregistry.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chregistry.c.i +.PHONY : __/chibios/os/kernel/src/chregistry.c.i + +__/chibios/os/kernel/src/chregistry.s: __/chibios/os/kernel/src/chregistry.c.s +.PHONY : __/chibios/os/kernel/src/chregistry.s + +# target to generate assembly for a file +__/chibios/os/kernel/src/chregistry.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chregistry.c.s +.PHONY : __/chibios/os/kernel/src/chregistry.c.s + +__/chibios/os/kernel/src/chschd.obj: __/chibios/os/kernel/src/chschd.c.obj +.PHONY : __/chibios/os/kernel/src/chschd.obj + +# target to build an object file +__/chibios/os/kernel/src/chschd.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chschd.c.obj +.PHONY : __/chibios/os/kernel/src/chschd.c.obj + +__/chibios/os/kernel/src/chschd.i: __/chibios/os/kernel/src/chschd.c.i +.PHONY : __/chibios/os/kernel/src/chschd.i + +# target to preprocess a source file +__/chibios/os/kernel/src/chschd.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chschd.c.i +.PHONY : __/chibios/os/kernel/src/chschd.c.i + +__/chibios/os/kernel/src/chschd.s: __/chibios/os/kernel/src/chschd.c.s +.PHONY : __/chibios/os/kernel/src/chschd.s + +# target to generate assembly for a file +__/chibios/os/kernel/src/chschd.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chschd.c.s +.PHONY : __/chibios/os/kernel/src/chschd.c.s + +__/chibios/os/kernel/src/chsem.obj: __/chibios/os/kernel/src/chsem.c.obj +.PHONY : __/chibios/os/kernel/src/chsem.obj + +# target to build an object file +__/chibios/os/kernel/src/chsem.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chsem.c.obj +.PHONY : __/chibios/os/kernel/src/chsem.c.obj + +__/chibios/os/kernel/src/chsem.i: __/chibios/os/kernel/src/chsem.c.i +.PHONY : __/chibios/os/kernel/src/chsem.i + +# target to preprocess a source file +__/chibios/os/kernel/src/chsem.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chsem.c.i +.PHONY : __/chibios/os/kernel/src/chsem.c.i + +__/chibios/os/kernel/src/chsem.s: __/chibios/os/kernel/src/chsem.c.s +.PHONY : __/chibios/os/kernel/src/chsem.s + +# target to generate assembly for a file +__/chibios/os/kernel/src/chsem.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chsem.c.s +.PHONY : __/chibios/os/kernel/src/chsem.c.s + +__/chibios/os/kernel/src/chsys.obj: __/chibios/os/kernel/src/chsys.c.obj +.PHONY : __/chibios/os/kernel/src/chsys.obj + +# target to build an object file +__/chibios/os/kernel/src/chsys.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chsys.c.obj +.PHONY : __/chibios/os/kernel/src/chsys.c.obj + +__/chibios/os/kernel/src/chsys.i: __/chibios/os/kernel/src/chsys.c.i +.PHONY : __/chibios/os/kernel/src/chsys.i + +# target to preprocess a source file +__/chibios/os/kernel/src/chsys.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chsys.c.i +.PHONY : __/chibios/os/kernel/src/chsys.c.i + +__/chibios/os/kernel/src/chsys.s: __/chibios/os/kernel/src/chsys.c.s +.PHONY : __/chibios/os/kernel/src/chsys.s + +# target to generate assembly for a file +__/chibios/os/kernel/src/chsys.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chsys.c.s +.PHONY : __/chibios/os/kernel/src/chsys.c.s + +__/chibios/os/kernel/src/chthreads.obj: __/chibios/os/kernel/src/chthreads.c.obj +.PHONY : __/chibios/os/kernel/src/chthreads.obj + +# target to build an object file +__/chibios/os/kernel/src/chthreads.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chthreads.c.obj +.PHONY : __/chibios/os/kernel/src/chthreads.c.obj + +__/chibios/os/kernel/src/chthreads.i: __/chibios/os/kernel/src/chthreads.c.i +.PHONY : __/chibios/os/kernel/src/chthreads.i + +# target to preprocess a source file +__/chibios/os/kernel/src/chthreads.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chthreads.c.i +.PHONY : __/chibios/os/kernel/src/chthreads.c.i + +__/chibios/os/kernel/src/chthreads.s: __/chibios/os/kernel/src/chthreads.c.s +.PHONY : __/chibios/os/kernel/src/chthreads.s + +# target to generate assembly for a file +__/chibios/os/kernel/src/chthreads.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chthreads.c.s +.PHONY : __/chibios/os/kernel/src/chthreads.c.s + +__/chibios/os/kernel/src/chvt.obj: __/chibios/os/kernel/src/chvt.c.obj +.PHONY : __/chibios/os/kernel/src/chvt.obj + +# target to build an object file +__/chibios/os/kernel/src/chvt.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chvt.c.obj +.PHONY : __/chibios/os/kernel/src/chvt.c.obj + +__/chibios/os/kernel/src/chvt.i: __/chibios/os/kernel/src/chvt.c.i +.PHONY : __/chibios/os/kernel/src/chvt.i + +# target to preprocess a source file +__/chibios/os/kernel/src/chvt.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chvt.c.i +.PHONY : __/chibios/os/kernel/src/chvt.c.i + +__/chibios/os/kernel/src/chvt.s: __/chibios/os/kernel/src/chvt.c.s +.PHONY : __/chibios/os/kernel/src/chvt.s + +# target to generate assembly for a file +__/chibios/os/kernel/src/chvt.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/kernel/src/chvt.c.s +.PHONY : __/chibios/os/kernel/src/chvt.c.s + +__/chibios/os/ports/GCC/ARMCMx/chcore.obj: __/chibios/os/ports/GCC/ARMCMx/chcore.c.obj +.PHONY : __/chibios/os/ports/GCC/ARMCMx/chcore.obj + +# target to build an object file +__/chibios/os/ports/GCC/ARMCMx/chcore.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/ports/GCC/ARMCMx/chcore.c.obj +.PHONY : __/chibios/os/ports/GCC/ARMCMx/chcore.c.obj + +__/chibios/os/ports/GCC/ARMCMx/chcore.i: __/chibios/os/ports/GCC/ARMCMx/chcore.c.i +.PHONY : __/chibios/os/ports/GCC/ARMCMx/chcore.i + +# target to preprocess a source file +__/chibios/os/ports/GCC/ARMCMx/chcore.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/ports/GCC/ARMCMx/chcore.c.i +.PHONY : __/chibios/os/ports/GCC/ARMCMx/chcore.c.i + +__/chibios/os/ports/GCC/ARMCMx/chcore.s: __/chibios/os/ports/GCC/ARMCMx/chcore.c.s +.PHONY : __/chibios/os/ports/GCC/ARMCMx/chcore.s + +# target to generate assembly for a file +__/chibios/os/ports/GCC/ARMCMx/chcore.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/ports/GCC/ARMCMx/chcore.c.s +.PHONY : __/chibios/os/ports/GCC/ARMCMx/chcore.c.s + +__/chibios/os/ports/GCC/ARMCMx/chcore_v6m.obj: __/chibios/os/ports/GCC/ARMCMx/chcore_v6m.c.obj +.PHONY : __/chibios/os/ports/GCC/ARMCMx/chcore_v6m.obj + +# target to build an object file +__/chibios/os/ports/GCC/ARMCMx/chcore_v6m.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/ports/GCC/ARMCMx/chcore_v6m.c.obj +.PHONY : __/chibios/os/ports/GCC/ARMCMx/chcore_v6m.c.obj + +__/chibios/os/ports/GCC/ARMCMx/chcore_v6m.i: __/chibios/os/ports/GCC/ARMCMx/chcore_v6m.c.i +.PHONY : __/chibios/os/ports/GCC/ARMCMx/chcore_v6m.i + +# target to preprocess a source file +__/chibios/os/ports/GCC/ARMCMx/chcore_v6m.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/ports/GCC/ARMCMx/chcore_v6m.c.i +.PHONY : __/chibios/os/ports/GCC/ARMCMx/chcore_v6m.c.i + +__/chibios/os/ports/GCC/ARMCMx/chcore_v6m.s: __/chibios/os/ports/GCC/ARMCMx/chcore_v6m.c.s +.PHONY : __/chibios/os/ports/GCC/ARMCMx/chcore_v6m.s + +# target to generate assembly for a file +__/chibios/os/ports/GCC/ARMCMx/chcore_v6m.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/ports/GCC/ARMCMx/chcore_v6m.c.s +.PHONY : __/chibios/os/ports/GCC/ARMCMx/chcore_v6m.c.s + +__/chibios/os/ports/GCC/ARMCMx/crt0.obj: __/chibios/os/ports/GCC/ARMCMx/crt0.c.obj +.PHONY : __/chibios/os/ports/GCC/ARMCMx/crt0.obj + +# target to build an object file +__/chibios/os/ports/GCC/ARMCMx/crt0.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/ports/GCC/ARMCMx/crt0.c.obj +.PHONY : __/chibios/os/ports/GCC/ARMCMx/crt0.c.obj + +__/chibios/os/ports/GCC/ARMCMx/crt0.i: __/chibios/os/ports/GCC/ARMCMx/crt0.c.i +.PHONY : __/chibios/os/ports/GCC/ARMCMx/crt0.i + +# target to preprocess a source file +__/chibios/os/ports/GCC/ARMCMx/crt0.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/ports/GCC/ARMCMx/crt0.c.i +.PHONY : __/chibios/os/ports/GCC/ARMCMx/crt0.c.i + +__/chibios/os/ports/GCC/ARMCMx/crt0.s: __/chibios/os/ports/GCC/ARMCMx/crt0.c.s +.PHONY : __/chibios/os/ports/GCC/ARMCMx/crt0.s + +# target to generate assembly for a file +__/chibios/os/ports/GCC/ARMCMx/crt0.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/ports/GCC/ARMCMx/crt0.c.s +.PHONY : __/chibios/os/ports/GCC/ARMCMx/crt0.c.s + +__/chibios/os/ports/common/ARMCMx/nvic.obj: __/chibios/os/ports/common/ARMCMx/nvic.c.obj +.PHONY : __/chibios/os/ports/common/ARMCMx/nvic.obj + +# target to build an object file +__/chibios/os/ports/common/ARMCMx/nvic.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/ports/common/ARMCMx/nvic.c.obj +.PHONY : __/chibios/os/ports/common/ARMCMx/nvic.c.obj + +__/chibios/os/ports/common/ARMCMx/nvic.i: __/chibios/os/ports/common/ARMCMx/nvic.c.i +.PHONY : __/chibios/os/ports/common/ARMCMx/nvic.i + +# target to preprocess a source file +__/chibios/os/ports/common/ARMCMx/nvic.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/ports/common/ARMCMx/nvic.c.i +.PHONY : __/chibios/os/ports/common/ARMCMx/nvic.c.i + +__/chibios/os/ports/common/ARMCMx/nvic.s: __/chibios/os/ports/common/ARMCMx/nvic.c.s +.PHONY : __/chibios/os/ports/common/ARMCMx/nvic.s + +# target to generate assembly for a file +__/chibios/os/ports/common/ARMCMx/nvic.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/os/ports/common/ARMCMx/nvic.c.s +.PHONY : __/chibios/os/ports/common/ARMCMx/nvic.c.s + +__/chibios/test/test.obj: __/chibios/test/test.c.obj +.PHONY : __/chibios/test/test.obj + +# target to build an object file +__/chibios/test/test.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/test.c.obj +.PHONY : __/chibios/test/test.c.obj + +__/chibios/test/test.i: __/chibios/test/test.c.i +.PHONY : __/chibios/test/test.i + +# target to preprocess a source file +__/chibios/test/test.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/test.c.i +.PHONY : __/chibios/test/test.c.i + +__/chibios/test/test.s: __/chibios/test/test.c.s +.PHONY : __/chibios/test/test.s + +# target to generate assembly for a file +__/chibios/test/test.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/test.c.s +.PHONY : __/chibios/test/test.c.s + +__/chibios/test/testbmk.obj: __/chibios/test/testbmk.c.obj +.PHONY : __/chibios/test/testbmk.obj + +# target to build an object file +__/chibios/test/testbmk.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testbmk.c.obj +.PHONY : __/chibios/test/testbmk.c.obj + +__/chibios/test/testbmk.i: __/chibios/test/testbmk.c.i +.PHONY : __/chibios/test/testbmk.i + +# target to preprocess a source file +__/chibios/test/testbmk.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testbmk.c.i +.PHONY : __/chibios/test/testbmk.c.i + +__/chibios/test/testbmk.s: __/chibios/test/testbmk.c.s +.PHONY : __/chibios/test/testbmk.s + +# target to generate assembly for a file +__/chibios/test/testbmk.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testbmk.c.s +.PHONY : __/chibios/test/testbmk.c.s + +__/chibios/test/testdyn.obj: __/chibios/test/testdyn.c.obj +.PHONY : __/chibios/test/testdyn.obj + +# target to build an object file +__/chibios/test/testdyn.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testdyn.c.obj +.PHONY : __/chibios/test/testdyn.c.obj + +__/chibios/test/testdyn.i: __/chibios/test/testdyn.c.i +.PHONY : __/chibios/test/testdyn.i + +# target to preprocess a source file +__/chibios/test/testdyn.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testdyn.c.i +.PHONY : __/chibios/test/testdyn.c.i + +__/chibios/test/testdyn.s: __/chibios/test/testdyn.c.s +.PHONY : __/chibios/test/testdyn.s + +# target to generate assembly for a file +__/chibios/test/testdyn.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testdyn.c.s +.PHONY : __/chibios/test/testdyn.c.s + +__/chibios/test/testevt.obj: __/chibios/test/testevt.c.obj +.PHONY : __/chibios/test/testevt.obj + +# target to build an object file +__/chibios/test/testevt.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testevt.c.obj +.PHONY : __/chibios/test/testevt.c.obj + +__/chibios/test/testevt.i: __/chibios/test/testevt.c.i +.PHONY : __/chibios/test/testevt.i + +# target to preprocess a source file +__/chibios/test/testevt.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testevt.c.i +.PHONY : __/chibios/test/testevt.c.i + +__/chibios/test/testevt.s: __/chibios/test/testevt.c.s +.PHONY : __/chibios/test/testevt.s + +# target to generate assembly for a file +__/chibios/test/testevt.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testevt.c.s +.PHONY : __/chibios/test/testevt.c.s + +__/chibios/test/testheap.obj: __/chibios/test/testheap.c.obj +.PHONY : __/chibios/test/testheap.obj + +# target to build an object file +__/chibios/test/testheap.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testheap.c.obj +.PHONY : __/chibios/test/testheap.c.obj + +__/chibios/test/testheap.i: __/chibios/test/testheap.c.i +.PHONY : __/chibios/test/testheap.i + +# target to preprocess a source file +__/chibios/test/testheap.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testheap.c.i +.PHONY : __/chibios/test/testheap.c.i + +__/chibios/test/testheap.s: __/chibios/test/testheap.c.s +.PHONY : __/chibios/test/testheap.s + +# target to generate assembly for a file +__/chibios/test/testheap.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testheap.c.s +.PHONY : __/chibios/test/testheap.c.s + +__/chibios/test/testmbox.obj: __/chibios/test/testmbox.c.obj +.PHONY : __/chibios/test/testmbox.obj + +# target to build an object file +__/chibios/test/testmbox.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testmbox.c.obj +.PHONY : __/chibios/test/testmbox.c.obj + +__/chibios/test/testmbox.i: __/chibios/test/testmbox.c.i +.PHONY : __/chibios/test/testmbox.i + +# target to preprocess a source file +__/chibios/test/testmbox.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testmbox.c.i +.PHONY : __/chibios/test/testmbox.c.i + +__/chibios/test/testmbox.s: __/chibios/test/testmbox.c.s +.PHONY : __/chibios/test/testmbox.s + +# target to generate assembly for a file +__/chibios/test/testmbox.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testmbox.c.s +.PHONY : __/chibios/test/testmbox.c.s + +__/chibios/test/testmsg.obj: __/chibios/test/testmsg.c.obj +.PHONY : __/chibios/test/testmsg.obj + +# target to build an object file +__/chibios/test/testmsg.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testmsg.c.obj +.PHONY : __/chibios/test/testmsg.c.obj + +__/chibios/test/testmsg.i: __/chibios/test/testmsg.c.i +.PHONY : __/chibios/test/testmsg.i + +# target to preprocess a source file +__/chibios/test/testmsg.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testmsg.c.i +.PHONY : __/chibios/test/testmsg.c.i + +__/chibios/test/testmsg.s: __/chibios/test/testmsg.c.s +.PHONY : __/chibios/test/testmsg.s + +# target to generate assembly for a file +__/chibios/test/testmsg.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testmsg.c.s +.PHONY : __/chibios/test/testmsg.c.s + +__/chibios/test/testmtx.obj: __/chibios/test/testmtx.c.obj +.PHONY : __/chibios/test/testmtx.obj + +# target to build an object file +__/chibios/test/testmtx.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testmtx.c.obj +.PHONY : __/chibios/test/testmtx.c.obj + +__/chibios/test/testmtx.i: __/chibios/test/testmtx.c.i +.PHONY : __/chibios/test/testmtx.i + +# target to preprocess a source file +__/chibios/test/testmtx.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testmtx.c.i +.PHONY : __/chibios/test/testmtx.c.i + +__/chibios/test/testmtx.s: __/chibios/test/testmtx.c.s +.PHONY : __/chibios/test/testmtx.s + +# target to generate assembly for a file +__/chibios/test/testmtx.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testmtx.c.s +.PHONY : __/chibios/test/testmtx.c.s + +__/chibios/test/testpools.obj: __/chibios/test/testpools.c.obj +.PHONY : __/chibios/test/testpools.obj + +# target to build an object file +__/chibios/test/testpools.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testpools.c.obj +.PHONY : __/chibios/test/testpools.c.obj + +__/chibios/test/testpools.i: __/chibios/test/testpools.c.i +.PHONY : __/chibios/test/testpools.i + +# target to preprocess a source file +__/chibios/test/testpools.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testpools.c.i +.PHONY : __/chibios/test/testpools.c.i + +__/chibios/test/testpools.s: __/chibios/test/testpools.c.s +.PHONY : __/chibios/test/testpools.s + +# target to generate assembly for a file +__/chibios/test/testpools.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testpools.c.s +.PHONY : __/chibios/test/testpools.c.s + +__/chibios/test/testqueues.obj: __/chibios/test/testqueues.c.obj +.PHONY : __/chibios/test/testqueues.obj + +# target to build an object file +__/chibios/test/testqueues.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testqueues.c.obj +.PHONY : __/chibios/test/testqueues.c.obj + +__/chibios/test/testqueues.i: __/chibios/test/testqueues.c.i +.PHONY : __/chibios/test/testqueues.i + +# target to preprocess a source file +__/chibios/test/testqueues.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testqueues.c.i +.PHONY : __/chibios/test/testqueues.c.i + +__/chibios/test/testqueues.s: __/chibios/test/testqueues.c.s +.PHONY : __/chibios/test/testqueues.s + +# target to generate assembly for a file +__/chibios/test/testqueues.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testqueues.c.s +.PHONY : __/chibios/test/testqueues.c.s + +__/chibios/test/testsem.obj: __/chibios/test/testsem.c.obj +.PHONY : __/chibios/test/testsem.obj + +# target to build an object file +__/chibios/test/testsem.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testsem.c.obj +.PHONY : __/chibios/test/testsem.c.obj + +__/chibios/test/testsem.i: __/chibios/test/testsem.c.i +.PHONY : __/chibios/test/testsem.i + +# target to preprocess a source file +__/chibios/test/testsem.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testsem.c.i +.PHONY : __/chibios/test/testsem.c.i + +__/chibios/test/testsem.s: __/chibios/test/testsem.c.s +.PHONY : __/chibios/test/testsem.s + +# target to generate assembly for a file +__/chibios/test/testsem.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testsem.c.s +.PHONY : __/chibios/test/testsem.c.s + +__/chibios/test/testthd.obj: __/chibios/test/testthd.c.obj +.PHONY : __/chibios/test/testthd.obj + +# target to build an object file +__/chibios/test/testthd.c.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testthd.c.obj +.PHONY : __/chibios/test/testthd.c.obj + +__/chibios/test/testthd.i: __/chibios/test/testthd.c.i +.PHONY : __/chibios/test/testthd.i + +# target to preprocess a source file +__/chibios/test/testthd.c.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testthd.c.i +.PHONY : __/chibios/test/testthd.c.i + +__/chibios/test/testthd.s: __/chibios/test/testthd.c.s +.PHONY : __/chibios/test/testthd.s + +# target to generate assembly for a file +__/chibios/test/testthd.c.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/chibios/test/testthd.c.s +.PHONY : __/chibios/test/testthd.c.s + +__/common/ais_baseband.obj: __/common/ais_baseband.cpp.obj +.PHONY : __/common/ais_baseband.obj + +# target to build an object file +__/common/ais_baseband.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/ais_baseband.cpp.obj +.PHONY : __/common/ais_baseband.cpp.obj + +__/common/ais_baseband.i: __/common/ais_baseband.cpp.i +.PHONY : __/common/ais_baseband.i + +# target to preprocess a source file +__/common/ais_baseband.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/ais_baseband.cpp.i +.PHONY : __/common/ais_baseband.cpp.i + +__/common/ais_baseband.s: __/common/ais_baseband.cpp.s +.PHONY : __/common/ais_baseband.s + +# target to generate assembly for a file +__/common/ais_baseband.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/ais_baseband.cpp.s +.PHONY : __/common/ais_baseband.cpp.s + +__/common/ais_packet.obj: __/common/ais_packet.cpp.obj +.PHONY : __/common/ais_packet.obj + +# target to build an object file +__/common/ais_packet.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/ais_packet.cpp.obj +.PHONY : __/common/ais_packet.cpp.obj + +__/common/ais_packet.i: __/common/ais_packet.cpp.i +.PHONY : __/common/ais_packet.i + +# target to preprocess a source file +__/common/ais_packet.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/ais_packet.cpp.i +.PHONY : __/common/ais_packet.cpp.i + +__/common/ais_packet.s: __/common/ais_packet.cpp.s +.PHONY : __/common/ais_packet.s + +# target to generate assembly for a file +__/common/ais_packet.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/ais_packet.cpp.s +.PHONY : __/common/ais_packet.cpp.s + +__/common/chibios_cpp.obj: __/common/chibios_cpp.cpp.obj +.PHONY : __/common/chibios_cpp.obj + +# target to build an object file +__/common/chibios_cpp.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/chibios_cpp.cpp.obj +.PHONY : __/common/chibios_cpp.cpp.obj + +__/common/chibios_cpp.i: __/common/chibios_cpp.cpp.i +.PHONY : __/common/chibios_cpp.i + +# target to preprocess a source file +__/common/chibios_cpp.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/chibios_cpp.cpp.i +.PHONY : __/common/chibios_cpp.cpp.i + +__/common/chibios_cpp.s: __/common/chibios_cpp.cpp.s +.PHONY : __/common/chibios_cpp.s + +# target to generate assembly for a file +__/common/chibios_cpp.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/chibios_cpp.cpp.s +.PHONY : __/common/chibios_cpp.cpp.s + +__/common/cpld_max5.obj: __/common/cpld_max5.cpp.obj +.PHONY : __/common/cpld_max5.obj + +# target to build an object file +__/common/cpld_max5.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/cpld_max5.cpp.obj +.PHONY : __/common/cpld_max5.cpp.obj + +__/common/cpld_max5.i: __/common/cpld_max5.cpp.i +.PHONY : __/common/cpld_max5.i + +# target to preprocess a source file +__/common/cpld_max5.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/cpld_max5.cpp.i +.PHONY : __/common/cpld_max5.cpp.i + +__/common/cpld_max5.s: __/common/cpld_max5.cpp.s +.PHONY : __/common/cpld_max5.s + +# target to generate assembly for a file +__/common/cpld_max5.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/cpld_max5.cpp.s +.PHONY : __/common/cpld_max5.cpp.s + +__/common/cpld_xilinx.obj: __/common/cpld_xilinx.cpp.obj +.PHONY : __/common/cpld_xilinx.obj + +# target to build an object file +__/common/cpld_xilinx.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/cpld_xilinx.cpp.obj +.PHONY : __/common/cpld_xilinx.cpp.obj + +__/common/cpld_xilinx.i: __/common/cpld_xilinx.cpp.i +.PHONY : __/common/cpld_xilinx.i + +# target to preprocess a source file +__/common/cpld_xilinx.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/cpld_xilinx.cpp.i +.PHONY : __/common/cpld_xilinx.cpp.i + +__/common/cpld_xilinx.s: __/common/cpld_xilinx.cpp.s +.PHONY : __/common/cpld_xilinx.s + +# target to generate assembly for a file +__/common/cpld_xilinx.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/cpld_xilinx.cpp.s +.PHONY : __/common/cpld_xilinx.cpp.s + +__/common/debug.obj: __/common/debug.cpp.obj +.PHONY : __/common/debug.obj + +# target to build an object file +__/common/debug.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/debug.cpp.obj +.PHONY : __/common/debug.cpp.obj + +__/common/debug.i: __/common/debug.cpp.i +.PHONY : __/common/debug.i + +# target to preprocess a source file +__/common/debug.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/debug.cpp.i +.PHONY : __/common/debug.cpp.i + +__/common/debug.s: __/common/debug.cpp.s +.PHONY : __/common/debug.s + +# target to generate assembly for a file +__/common/debug.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/debug.cpp.s +.PHONY : __/common/debug.cpp.s + +__/common/ert_packet.obj: __/common/ert_packet.cpp.obj +.PHONY : __/common/ert_packet.obj + +# target to build an object file +__/common/ert_packet.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/ert_packet.cpp.obj +.PHONY : __/common/ert_packet.cpp.obj + +__/common/ert_packet.i: __/common/ert_packet.cpp.i +.PHONY : __/common/ert_packet.i + +# target to preprocess a source file +__/common/ert_packet.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/ert_packet.cpp.i +.PHONY : __/common/ert_packet.cpp.i + +__/common/ert_packet.s: __/common/ert_packet.cpp.s +.PHONY : __/common/ert_packet.s + +# target to generate assembly for a file +__/common/ert_packet.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/ert_packet.cpp.s +.PHONY : __/common/ert_packet.cpp.s + +__/common/event.obj: __/common/event.cpp.obj +.PHONY : __/common/event.obj + +# target to build an object file +__/common/event.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/event.cpp.obj +.PHONY : __/common/event.cpp.obj + +__/common/event.i: __/common/event.cpp.i +.PHONY : __/common/event.i + +# target to preprocess a source file +__/common/event.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/event.cpp.i +.PHONY : __/common/event.cpp.i + +__/common/event.s: __/common/event.cpp.s +.PHONY : __/common/event.s + +# target to generate assembly for a file +__/common/event.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/event.cpp.s +.PHONY : __/common/event.cpp.s + +__/common/gcc.obj: __/common/gcc.cpp.obj +.PHONY : __/common/gcc.obj + +# target to build an object file +__/common/gcc.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/gcc.cpp.obj +.PHONY : __/common/gcc.cpp.obj + +__/common/gcc.i: __/common/gcc.cpp.i +.PHONY : __/common/gcc.i + +# target to preprocess a source file +__/common/gcc.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/gcc.cpp.i +.PHONY : __/common/gcc.cpp.i + +__/common/gcc.s: __/common/gcc.cpp.s +.PHONY : __/common/gcc.s + +# target to generate assembly for a file +__/common/gcc.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/gcc.cpp.s +.PHONY : __/common/gcc.cpp.s + +__/common/hackrf_hal.obj: __/common/hackrf_hal.cpp.obj +.PHONY : __/common/hackrf_hal.obj + +# target to build an object file +__/common/hackrf_hal.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/hackrf_hal.cpp.obj +.PHONY : __/common/hackrf_hal.cpp.obj + +__/common/hackrf_hal.i: __/common/hackrf_hal.cpp.i +.PHONY : __/common/hackrf_hal.i + +# target to preprocess a source file +__/common/hackrf_hal.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/hackrf_hal.cpp.i +.PHONY : __/common/hackrf_hal.cpp.i + +__/common/hackrf_hal.s: __/common/hackrf_hal.cpp.s +.PHONY : __/common/hackrf_hal.s + +# target to generate assembly for a file +__/common/hackrf_hal.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/hackrf_hal.cpp.s +.PHONY : __/common/hackrf_hal.cpp.s + +__/common/i2c_pp.obj: __/common/i2c_pp.cpp.obj +.PHONY : __/common/i2c_pp.obj + +# target to build an object file +__/common/i2c_pp.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/i2c_pp.cpp.obj +.PHONY : __/common/i2c_pp.cpp.obj + +__/common/i2c_pp.i: __/common/i2c_pp.cpp.i +.PHONY : __/common/i2c_pp.i + +# target to preprocess a source file +__/common/i2c_pp.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/i2c_pp.cpp.i +.PHONY : __/common/i2c_pp.cpp.i + +__/common/i2c_pp.s: __/common/i2c_pp.cpp.s +.PHONY : __/common/i2c_pp.s + +# target to generate assembly for a file +__/common/i2c_pp.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/i2c_pp.cpp.s +.PHONY : __/common/i2c_pp.cpp.s + +__/common/jtag.obj: __/common/jtag.cpp.obj +.PHONY : __/common/jtag.obj + +# target to build an object file +__/common/jtag.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/jtag.cpp.obj +.PHONY : __/common/jtag.cpp.obj + +__/common/jtag.i: __/common/jtag.cpp.i +.PHONY : __/common/jtag.i + +# target to preprocess a source file +__/common/jtag.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/jtag.cpp.i +.PHONY : __/common/jtag.cpp.i + +__/common/jtag.s: __/common/jtag.cpp.s +.PHONY : __/common/jtag.s + +# target to generate assembly for a file +__/common/jtag.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/jtag.cpp.s +.PHONY : __/common/jtag.cpp.s + +__/common/jtag_tap.obj: __/common/jtag_tap.cpp.obj +.PHONY : __/common/jtag_tap.obj + +# target to build an object file +__/common/jtag_tap.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/jtag_tap.cpp.obj +.PHONY : __/common/jtag_tap.cpp.obj + +__/common/jtag_tap.i: __/common/jtag_tap.cpp.i +.PHONY : __/common/jtag_tap.i + +# target to preprocess a source file +__/common/jtag_tap.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/jtag_tap.cpp.i +.PHONY : __/common/jtag_tap.cpp.i + +__/common/jtag_tap.s: __/common/jtag_tap.cpp.s +.PHONY : __/common/jtag_tap.s + +# target to generate assembly for a file +__/common/jtag_tap.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/jtag_tap.cpp.s +.PHONY : __/common/jtag_tap.cpp.s + +__/common/lcd_ili9341.obj: __/common/lcd_ili9341.cpp.obj +.PHONY : __/common/lcd_ili9341.obj + +# target to build an object file +__/common/lcd_ili9341.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/lcd_ili9341.cpp.obj +.PHONY : __/common/lcd_ili9341.cpp.obj + +__/common/lcd_ili9341.i: __/common/lcd_ili9341.cpp.i +.PHONY : __/common/lcd_ili9341.i + +# target to preprocess a source file +__/common/lcd_ili9341.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/lcd_ili9341.cpp.i +.PHONY : __/common/lcd_ili9341.cpp.i + +__/common/lcd_ili9341.s: __/common/lcd_ili9341.cpp.s +.PHONY : __/common/lcd_ili9341.s + +# target to generate assembly for a file +__/common/lcd_ili9341.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/lcd_ili9341.cpp.s +.PHONY : __/common/lcd_ili9341.cpp.s + +__/common/lfsr_random.obj: __/common/lfsr_random.cpp.obj +.PHONY : __/common/lfsr_random.obj + +# target to build an object file +__/common/lfsr_random.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/lfsr_random.cpp.obj +.PHONY : __/common/lfsr_random.cpp.obj + +__/common/lfsr_random.i: __/common/lfsr_random.cpp.i +.PHONY : __/common/lfsr_random.i + +# target to preprocess a source file +__/common/lfsr_random.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/lfsr_random.cpp.i +.PHONY : __/common/lfsr_random.cpp.i + +__/common/lfsr_random.s: __/common/lfsr_random.cpp.s +.PHONY : __/common/lfsr_random.s + +# target to generate assembly for a file +__/common/lfsr_random.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/lfsr_random.cpp.s +.PHONY : __/common/lfsr_random.cpp.s + +__/common/manchester.obj: __/common/manchester.cpp.obj +.PHONY : __/common/manchester.obj + +# target to build an object file +__/common/manchester.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/manchester.cpp.obj +.PHONY : __/common/manchester.cpp.obj + +__/common/manchester.i: __/common/manchester.cpp.i +.PHONY : __/common/manchester.i + +# target to preprocess a source file +__/common/manchester.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/manchester.cpp.i +.PHONY : __/common/manchester.cpp.i + +__/common/manchester.s: __/common/manchester.cpp.s +.PHONY : __/common/manchester.s + +# target to generate assembly for a file +__/common/manchester.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/manchester.cpp.s +.PHONY : __/common/manchester.cpp.s + +__/common/message_queue.obj: __/common/message_queue.cpp.obj +.PHONY : __/common/message_queue.obj + +# target to build an object file +__/common/message_queue.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/message_queue.cpp.obj +.PHONY : __/common/message_queue.cpp.obj + +__/common/message_queue.i: __/common/message_queue.cpp.i +.PHONY : __/common/message_queue.i + +# target to preprocess a source file +__/common/message_queue.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/message_queue.cpp.i +.PHONY : __/common/message_queue.cpp.i + +__/common/message_queue.s: __/common/message_queue.cpp.s +.PHONY : __/common/message_queue.s + +# target to generate assembly for a file +__/common/message_queue.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/message_queue.cpp.s +.PHONY : __/common/message_queue.cpp.s + +__/common/msgpack.obj: __/common/msgpack.cpp.obj +.PHONY : __/common/msgpack.obj + +# target to build an object file +__/common/msgpack.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/msgpack.cpp.obj +.PHONY : __/common/msgpack.cpp.obj + +__/common/msgpack.i: __/common/msgpack.cpp.i +.PHONY : __/common/msgpack.i + +# target to preprocess a source file +__/common/msgpack.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/msgpack.cpp.i +.PHONY : __/common/msgpack.cpp.i + +__/common/msgpack.s: __/common/msgpack.cpp.s +.PHONY : __/common/msgpack.s + +# target to generate assembly for a file +__/common/msgpack.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/msgpack.cpp.s +.PHONY : __/common/msgpack.cpp.s + +__/common/png_writer.obj: __/common/png_writer.cpp.obj +.PHONY : __/common/png_writer.obj + +# target to build an object file +__/common/png_writer.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/png_writer.cpp.obj +.PHONY : __/common/png_writer.cpp.obj + +__/common/png_writer.i: __/common/png_writer.cpp.i +.PHONY : __/common/png_writer.i + +# target to preprocess a source file +__/common/png_writer.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/png_writer.cpp.i +.PHONY : __/common/png_writer.cpp.i + +__/common/png_writer.s: __/common/png_writer.cpp.s +.PHONY : __/common/png_writer.s + +# target to generate assembly for a file +__/common/png_writer.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/png_writer.cpp.s +.PHONY : __/common/png_writer.cpp.s + +__/common/portapack_io.obj: __/common/portapack_io.cpp.obj +.PHONY : __/common/portapack_io.obj + +# target to build an object file +__/common/portapack_io.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/portapack_io.cpp.obj +.PHONY : __/common/portapack_io.cpp.obj + +__/common/portapack_io.i: __/common/portapack_io.cpp.i +.PHONY : __/common/portapack_io.i + +# target to preprocess a source file +__/common/portapack_io.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/portapack_io.cpp.i +.PHONY : __/common/portapack_io.cpp.i + +__/common/portapack_io.s: __/common/portapack_io.cpp.s +.PHONY : __/common/portapack_io.s + +# target to generate assembly for a file +__/common/portapack_io.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/portapack_io.cpp.s +.PHONY : __/common/portapack_io.cpp.s + +__/common/portapack_persistent_memory.obj: __/common/portapack_persistent_memory.cpp.obj +.PHONY : __/common/portapack_persistent_memory.obj + +# target to build an object file +__/common/portapack_persistent_memory.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/portapack_persistent_memory.cpp.obj +.PHONY : __/common/portapack_persistent_memory.cpp.obj + +__/common/portapack_persistent_memory.i: __/common/portapack_persistent_memory.cpp.i +.PHONY : __/common/portapack_persistent_memory.i + +# target to preprocess a source file +__/common/portapack_persistent_memory.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/portapack_persistent_memory.cpp.i +.PHONY : __/common/portapack_persistent_memory.cpp.i + +__/common/portapack_persistent_memory.s: __/common/portapack_persistent_memory.cpp.s +.PHONY : __/common/portapack_persistent_memory.s + +# target to generate assembly for a file +__/common/portapack_persistent_memory.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/portapack_persistent_memory.cpp.s +.PHONY : __/common/portapack_persistent_memory.cpp.s + +__/common/portapack_shared_memory.obj: __/common/portapack_shared_memory.cpp.obj +.PHONY : __/common/portapack_shared_memory.obj + +# target to build an object file +__/common/portapack_shared_memory.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/portapack_shared_memory.cpp.obj +.PHONY : __/common/portapack_shared_memory.cpp.obj + +__/common/portapack_shared_memory.i: __/common/portapack_shared_memory.cpp.i +.PHONY : __/common/portapack_shared_memory.i + +# target to preprocess a source file +__/common/portapack_shared_memory.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/portapack_shared_memory.cpp.i +.PHONY : __/common/portapack_shared_memory.cpp.i + +__/common/portapack_shared_memory.s: __/common/portapack_shared_memory.cpp.s +.PHONY : __/common/portapack_shared_memory.s + +# target to generate assembly for a file +__/common/portapack_shared_memory.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/portapack_shared_memory.cpp.s +.PHONY : __/common/portapack_shared_memory.cpp.s + +__/common/tpms_packet.obj: __/common/tpms_packet.cpp.obj +.PHONY : __/common/tpms_packet.obj + +# target to build an object file +__/common/tpms_packet.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/tpms_packet.cpp.obj +.PHONY : __/common/tpms_packet.cpp.obj + +__/common/tpms_packet.i: __/common/tpms_packet.cpp.i +.PHONY : __/common/tpms_packet.i + +# target to preprocess a source file +__/common/tpms_packet.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/tpms_packet.cpp.i +.PHONY : __/common/tpms_packet.cpp.i + +__/common/tpms_packet.s: __/common/tpms_packet.cpp.s +.PHONY : __/common/tpms_packet.s + +# target to generate assembly for a file +__/common/tpms_packet.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/tpms_packet.cpp.s +.PHONY : __/common/tpms_packet.cpp.s + +__/common/ui.obj: __/common/ui.cpp.obj +.PHONY : __/common/ui.obj + +# target to build an object file +__/common/ui.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/ui.cpp.obj +.PHONY : __/common/ui.cpp.obj + +__/common/ui.i: __/common/ui.cpp.i +.PHONY : __/common/ui.i + +# target to preprocess a source file +__/common/ui.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/ui.cpp.i +.PHONY : __/common/ui.cpp.i + +__/common/ui.s: __/common/ui.cpp.s +.PHONY : __/common/ui.s + +# target to generate assembly for a file +__/common/ui.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/ui.cpp.s +.PHONY : __/common/ui.cpp.s + +__/common/ui_focus.obj: __/common/ui_focus.cpp.obj +.PHONY : __/common/ui_focus.obj + +# target to build an object file +__/common/ui_focus.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/ui_focus.cpp.obj +.PHONY : __/common/ui_focus.cpp.obj + +__/common/ui_focus.i: __/common/ui_focus.cpp.i +.PHONY : __/common/ui_focus.i + +# target to preprocess a source file +__/common/ui_focus.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/ui_focus.cpp.i +.PHONY : __/common/ui_focus.cpp.i + +__/common/ui_focus.s: __/common/ui_focus.cpp.s +.PHONY : __/common/ui_focus.s + +# target to generate assembly for a file +__/common/ui_focus.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/ui_focus.cpp.s +.PHONY : __/common/ui_focus.cpp.s + +__/common/ui_painter.obj: __/common/ui_painter.cpp.obj +.PHONY : __/common/ui_painter.obj + +# target to build an object file +__/common/ui_painter.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/ui_painter.cpp.obj +.PHONY : __/common/ui_painter.cpp.obj + +__/common/ui_painter.i: __/common/ui_painter.cpp.i +.PHONY : __/common/ui_painter.i + +# target to preprocess a source file +__/common/ui_painter.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/ui_painter.cpp.i +.PHONY : __/common/ui_painter.cpp.i + +__/common/ui_painter.s: __/common/ui_painter.cpp.s +.PHONY : __/common/ui_painter.s + +# target to generate assembly for a file +__/common/ui_painter.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/ui_painter.cpp.s +.PHONY : __/common/ui_painter.cpp.s + +__/common/ui_text.obj: __/common/ui_text.cpp.obj +.PHONY : __/common/ui_text.obj + +# target to build an object file +__/common/ui_text.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/ui_text.cpp.obj +.PHONY : __/common/ui_text.cpp.obj + +__/common/ui_text.i: __/common/ui_text.cpp.i +.PHONY : __/common/ui_text.i + +# target to preprocess a source file +__/common/ui_text.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/ui_text.cpp.i +.PHONY : __/common/ui_text.cpp.i + +__/common/ui_text.s: __/common/ui_text.cpp.s +.PHONY : __/common/ui_text.s + +# target to generate assembly for a file +__/common/ui_text.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/ui_text.cpp.s +.PHONY : __/common/ui_text.cpp.s + +__/common/ui_widget.obj: __/common/ui_widget.cpp.obj +.PHONY : __/common/ui_widget.obj + +# target to build an object file +__/common/ui_widget.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/ui_widget.cpp.obj +.PHONY : __/common/ui_widget.cpp.obj + +__/common/ui_widget.i: __/common/ui_widget.cpp.i +.PHONY : __/common/ui_widget.i + +# target to preprocess a source file +__/common/ui_widget.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/ui_widget.cpp.i +.PHONY : __/common/ui_widget.cpp.i + +__/common/ui_widget.s: __/common/ui_widget.cpp.s +.PHONY : __/common/ui_widget.s + +# target to generate assembly for a file +__/common/ui_widget.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/ui_widget.cpp.s +.PHONY : __/common/ui_widget.cpp.s + +__/common/utility.obj: __/common/utility.cpp.obj +.PHONY : __/common/utility.obj + +# target to build an object file +__/common/utility.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/utility.cpp.obj +.PHONY : __/common/utility.cpp.obj + +__/common/utility.i: __/common/utility.cpp.i +.PHONY : __/common/utility.i + +# target to preprocess a source file +__/common/utility.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/utility.cpp.i +.PHONY : __/common/utility.cpp.i + +__/common/utility.s: __/common/utility.cpp.s +.PHONY : __/common/utility.s + +# target to generate assembly for a file +__/common/utility.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/utility.cpp.s +.PHONY : __/common/utility.cpp.s + +__/common/wm8731.obj: __/common/wm8731.cpp.obj +.PHONY : __/common/wm8731.obj + +# target to build an object file +__/common/wm8731.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/wm8731.cpp.obj +.PHONY : __/common/wm8731.cpp.obj + +__/common/wm8731.i: __/common/wm8731.cpp.i +.PHONY : __/common/wm8731.i + +# target to preprocess a source file +__/common/wm8731.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/wm8731.cpp.i +.PHONY : __/common/wm8731.cpp.i + +__/common/wm8731.s: __/common/wm8731.cpp.s +.PHONY : __/common/wm8731.s + +# target to generate assembly for a file +__/common/wm8731.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/__/common/wm8731.cpp.s +.PHONY : __/common/wm8731.cpp.s + +ais_app.obj: ais_app.cpp.obj +.PHONY : ais_app.obj + +# target to build an object file +ais_app.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ais_app.cpp.obj +.PHONY : ais_app.cpp.obj + +ais_app.i: ais_app.cpp.i +.PHONY : ais_app.i + +# target to preprocess a source file +ais_app.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ais_app.cpp.i +.PHONY : ais_app.cpp.i + +ais_app.s: ais_app.cpp.s +.PHONY : ais_app.s + +# target to generate assembly for a file +ais_app.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ais_app.cpp.s +.PHONY : ais_app.cpp.s + +analog_audio_app.obj: analog_audio_app.cpp.obj +.PHONY : analog_audio_app.obj + +# target to build an object file +analog_audio_app.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/analog_audio_app.cpp.obj +.PHONY : analog_audio_app.cpp.obj + +analog_audio_app.i: analog_audio_app.cpp.i +.PHONY : analog_audio_app.i + +# target to preprocess a source file +analog_audio_app.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/analog_audio_app.cpp.i +.PHONY : analog_audio_app.cpp.i + +analog_audio_app.s: analog_audio_app.cpp.s +.PHONY : analog_audio_app.s + +# target to generate assembly for a file +analog_audio_app.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/analog_audio_app.cpp.s +.PHONY : analog_audio_app.cpp.s + +audio.obj: audio.cpp.obj +.PHONY : audio.obj + +# target to build an object file +audio.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/audio.cpp.obj +.PHONY : audio.cpp.obj + +audio.i: audio.cpp.i +.PHONY : audio.i + +# target to preprocess a source file +audio.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/audio.cpp.i +.PHONY : audio.cpp.i + +audio.s: audio.cpp.s +.PHONY : audio.s + +# target to generate assembly for a file +audio.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/audio.cpp.s +.PHONY : audio.cpp.s + +baseband_api.obj: baseband_api.cpp.obj +.PHONY : baseband_api.obj + +# target to build an object file +baseband_api.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/baseband_api.cpp.obj +.PHONY : baseband_api.cpp.obj + +baseband_api.i: baseband_api.cpp.i +.PHONY : baseband_api.i + +# target to preprocess a source file +baseband_api.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/baseband_api.cpp.i +.PHONY : baseband_api.cpp.i + +baseband_api.s: baseband_api.cpp.s +.PHONY : baseband_api.s + +# target to generate assembly for a file +baseband_api.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/baseband_api.cpp.s +.PHONY : baseband_api.cpp.s + +baseband_cpld.obj: baseband_cpld.cpp.obj +.PHONY : baseband_cpld.obj + +# target to build an object file +baseband_cpld.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/baseband_cpld.cpp.obj +.PHONY : baseband_cpld.cpp.obj + +baseband_cpld.i: baseband_cpld.cpp.i +.PHONY : baseband_cpld.i + +# target to preprocess a source file +baseband_cpld.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/baseband_cpld.cpp.i +.PHONY : baseband_cpld.cpp.i + +baseband_cpld.s: baseband_cpld.cpp.s +.PHONY : baseband_cpld.s + +# target to generate assembly for a file +baseband_cpld.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/baseband_cpld.cpp.s +.PHONY : baseband_cpld.cpp.s + +capture_app.obj: capture_app.cpp.obj +.PHONY : capture_app.obj + +# target to build an object file +capture_app.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/capture_app.cpp.obj +.PHONY : capture_app.cpp.obj + +capture_app.i: capture_app.cpp.i +.PHONY : capture_app.i + +# target to preprocess a source file +capture_app.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/capture_app.cpp.i +.PHONY : capture_app.cpp.i + +capture_app.s: capture_app.cpp.s +.PHONY : capture_app.s + +# target to generate assembly for a file +capture_app.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/capture_app.cpp.s +.PHONY : capture_app.cpp.s + +capture_thread.obj: capture_thread.cpp.obj +.PHONY : capture_thread.obj + +# target to build an object file +capture_thread.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/capture_thread.cpp.obj +.PHONY : capture_thread.cpp.obj + +capture_thread.i: capture_thread.cpp.i +.PHONY : capture_thread.i + +# target to preprocess a source file +capture_thread.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/capture_thread.cpp.i +.PHONY : capture_thread.cpp.i + +capture_thread.s: capture_thread.cpp.s +.PHONY : capture_thread.s + +# target to generate assembly for a file +capture_thread.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/capture_thread.cpp.s +.PHONY : capture_thread.cpp.s + +clock_manager.obj: clock_manager.cpp.obj +.PHONY : clock_manager.obj + +# target to build an object file +clock_manager.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/clock_manager.cpp.obj +.PHONY : clock_manager.cpp.obj + +clock_manager.i: clock_manager.cpp.i +.PHONY : clock_manager.i + +# target to preprocess a source file +clock_manager.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/clock_manager.cpp.i +.PHONY : clock_manager.cpp.i + +clock_manager.s: clock_manager.cpp.s +.PHONY : clock_manager.s + +# target to generate assembly for a file +clock_manager.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/clock_manager.cpp.s +.PHONY : clock_manager.cpp.s + +core_control.obj: core_control.cpp.obj +.PHONY : core_control.obj + +# target to build an object file +core_control.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/core_control.cpp.obj +.PHONY : core_control.cpp.obj + +core_control.i: core_control.cpp.i +.PHONY : core_control.i + +# target to preprocess a source file +core_control.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/core_control.cpp.i +.PHONY : core_control.cpp.i + +core_control.s: core_control.cpp.s +.PHONY : core_control.s + +# target to generate assembly for a file +core_control.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/core_control.cpp.s +.PHONY : core_control.cpp.s + +cpld_update.obj: cpld_update.cpp.obj +.PHONY : cpld_update.obj + +# target to build an object file +cpld_update.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/cpld_update.cpp.obj +.PHONY : cpld_update.cpp.obj + +cpld_update.i: cpld_update.cpp.i +.PHONY : cpld_update.i + +# target to preprocess a source file +cpld_update.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/cpld_update.cpp.i +.PHONY : cpld_update.cpp.i + +cpld_update.s: cpld_update.cpp.s +.PHONY : cpld_update.s + +# target to generate assembly for a file +cpld_update.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/cpld_update.cpp.s +.PHONY : cpld_update.cpp.s + +debounce.obj: debounce.cpp.obj +.PHONY : debounce.obj + +# target to build an object file +debounce.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/debounce.cpp.obj +.PHONY : debounce.cpp.obj + +debounce.i: debounce.cpp.i +.PHONY : debounce.i + +# target to preprocess a source file +debounce.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/debounce.cpp.i +.PHONY : debounce.cpp.i + +debounce.s: debounce.cpp.s +.PHONY : debounce.s + +# target to generate assembly for a file +debounce.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/debounce.cpp.s +.PHONY : debounce.cpp.s + +encoder.obj: encoder.cpp.obj +.PHONY : encoder.obj + +# target to build an object file +encoder.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/encoder.cpp.obj +.PHONY : encoder.cpp.obj + +encoder.i: encoder.cpp.i +.PHONY : encoder.i + +# target to preprocess a source file +encoder.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/encoder.cpp.i +.PHONY : encoder.cpp.i + +encoder.s: encoder.cpp.s +.PHONY : encoder.s + +# target to generate assembly for a file +encoder.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/encoder.cpp.s +.PHONY : encoder.cpp.s + +ert_app.obj: ert_app.cpp.obj +.PHONY : ert_app.obj + +# target to build an object file +ert_app.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ert_app.cpp.obj +.PHONY : ert_app.cpp.obj + +ert_app.i: ert_app.cpp.i +.PHONY : ert_app.i + +# target to preprocess a source file +ert_app.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ert_app.cpp.i +.PHONY : ert_app.cpp.i + +ert_app.s: ert_app.cpp.s +.PHONY : ert_app.s + +# target to generate assembly for a file +ert_app.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ert_app.cpp.s +.PHONY : ert_app.cpp.s + +event_m0.obj: event_m0.cpp.obj +.PHONY : event_m0.obj + +# target to build an object file +event_m0.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/event_m0.cpp.obj +.PHONY : event_m0.cpp.obj + +event_m0.i: event_m0.cpp.i +.PHONY : event_m0.i + +# target to preprocess a source file +event_m0.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/event_m0.cpp.i +.PHONY : event_m0.cpp.i + +event_m0.s: event_m0.cpp.s +.PHONY : event_m0.s + +# target to generate assembly for a file +event_m0.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/event_m0.cpp.s +.PHONY : event_m0.cpp.s + +file.obj: file.cpp.obj +.PHONY : file.obj + +# target to build an object file +file.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/file.cpp.obj +.PHONY : file.cpp.obj + +file.i: file.cpp.i +.PHONY : file.i + +# target to preprocess a source file +file.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/file.cpp.i +.PHONY : file.cpp.i + +file.s: file.cpp.s +.PHONY : file.s + +# target to generate assembly for a file +file.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/file.cpp.s +.PHONY : file.cpp.s + +hackrf_cpld_data.obj: hackrf_cpld_data.cpp.obj +.PHONY : hackrf_cpld_data.obj + +# target to build an object file +hackrf_cpld_data.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/hackrf_cpld_data.cpp.obj +.PHONY : hackrf_cpld_data.cpp.obj + +hackrf_cpld_data.i: hackrf_cpld_data.cpp.i +.PHONY : hackrf_cpld_data.i + +# target to preprocess a source file +hackrf_cpld_data.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/hackrf_cpld_data.cpp.i +.PHONY : hackrf_cpld_data.cpp.i + +hackrf_cpld_data.s: hackrf_cpld_data.cpp.s +.PHONY : hackrf_cpld_data.s + +# target to generate assembly for a file +hackrf_cpld_data.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/hackrf_cpld_data.cpp.s +.PHONY : hackrf_cpld_data.cpp.s + +irq_controls.obj: irq_controls.cpp.obj +.PHONY : irq_controls.obj + +# target to build an object file +irq_controls.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/irq_controls.cpp.obj +.PHONY : irq_controls.cpp.obj + +irq_controls.i: irq_controls.cpp.i +.PHONY : irq_controls.i + +# target to preprocess a source file +irq_controls.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/irq_controls.cpp.i +.PHONY : irq_controls.cpp.i + +irq_controls.s: irq_controls.cpp.s +.PHONY : irq_controls.s + +# target to generate assembly for a file +irq_controls.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/irq_controls.cpp.s +.PHONY : irq_controls.cpp.s + +irq_lcd_frame.obj: irq_lcd_frame.cpp.obj +.PHONY : irq_lcd_frame.obj + +# target to build an object file +irq_lcd_frame.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/irq_lcd_frame.cpp.obj +.PHONY : irq_lcd_frame.cpp.obj + +irq_lcd_frame.i: irq_lcd_frame.cpp.i +.PHONY : irq_lcd_frame.i + +# target to preprocess a source file +irq_lcd_frame.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/irq_lcd_frame.cpp.i +.PHONY : irq_lcd_frame.cpp.i + +irq_lcd_frame.s: irq_lcd_frame.cpp.s +.PHONY : irq_lcd_frame.s + +# target to generate assembly for a file +irq_lcd_frame.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/irq_lcd_frame.cpp.s +.PHONY : irq_lcd_frame.cpp.s + +irq_rtc.obj: irq_rtc.cpp.obj +.PHONY : irq_rtc.obj + +# target to build an object file +irq_rtc.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/irq_rtc.cpp.obj +.PHONY : irq_rtc.cpp.obj + +irq_rtc.i: irq_rtc.cpp.i +.PHONY : irq_rtc.i + +# target to preprocess a source file +irq_rtc.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/irq_rtc.cpp.i +.PHONY : irq_rtc.cpp.i + +irq_rtc.s: irq_rtc.cpp.s +.PHONY : irq_rtc.s + +# target to generate assembly for a file +irq_rtc.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/irq_rtc.cpp.s +.PHONY : irq_rtc.cpp.s + +log_file.obj: log_file.cpp.obj +.PHONY : log_file.obj + +# target to build an object file +log_file.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/log_file.cpp.obj +.PHONY : log_file.cpp.obj + +log_file.i: log_file.cpp.i +.PHONY : log_file.i + +# target to preprocess a source file +log_file.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/log_file.cpp.i +.PHONY : log_file.cpp.i + +log_file.s: log_file.cpp.s +.PHONY : log_file.s + +# target to generate assembly for a file +log_file.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/log_file.cpp.s +.PHONY : log_file.cpp.s + +main.obj: main.cpp.obj +.PHONY : main.obj + +# target to build an object file +main.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/main.cpp.obj +.PHONY : main.cpp.obj + +main.i: main.cpp.i +.PHONY : main.i + +# target to preprocess a source file +main.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/main.cpp.i +.PHONY : main.cpp.i + +main.s: main.cpp.s +.PHONY : main.s + +# target to generate assembly for a file +main.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/main.cpp.s +.PHONY : main.cpp.s + +max2837.obj: max2837.cpp.obj +.PHONY : max2837.obj + +# target to build an object file +max2837.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/max2837.cpp.obj +.PHONY : max2837.cpp.obj + +max2837.i: max2837.cpp.i +.PHONY : max2837.i + +# target to preprocess a source file +max2837.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/max2837.cpp.i +.PHONY : max2837.cpp.i + +max2837.s: max2837.cpp.s +.PHONY : max2837.s + +# target to generate assembly for a file +max2837.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/max2837.cpp.s +.PHONY : max2837.cpp.s + +max5864.obj: max5864.cpp.obj +.PHONY : max5864.obj + +# target to build an object file +max5864.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/max5864.cpp.obj +.PHONY : max5864.cpp.obj + +max5864.i: max5864.cpp.i +.PHONY : max5864.i + +# target to preprocess a source file +max5864.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/max5864.cpp.i +.PHONY : max5864.cpp.i + +max5864.s: max5864.cpp.s +.PHONY : max5864.s + +# target to generate assembly for a file +max5864.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/max5864.cpp.s +.PHONY : max5864.cpp.s + +portapack.obj: portapack.cpp.obj +.PHONY : portapack.obj + +# target to build an object file +portapack.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/portapack.cpp.obj +.PHONY : portapack.cpp.obj + +portapack.i: portapack.cpp.i +.PHONY : portapack.i + +# target to preprocess a source file +portapack.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/portapack.cpp.i +.PHONY : portapack.cpp.i + +portapack.s: portapack.cpp.s +.PHONY : portapack.s + +# target to generate assembly for a file +portapack.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/portapack.cpp.s +.PHONY : portapack.cpp.s + +portapack_cpld_data.obj: portapack_cpld_data.cpp.obj +.PHONY : portapack_cpld_data.obj + +# target to build an object file +portapack_cpld_data.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/portapack_cpld_data.cpp.obj +.PHONY : portapack_cpld_data.cpp.obj + +portapack_cpld_data.i: portapack_cpld_data.cpp.i +.PHONY : portapack_cpld_data.i + +# target to preprocess a source file +portapack_cpld_data.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/portapack_cpld_data.cpp.i +.PHONY : portapack_cpld_data.cpp.i + +portapack_cpld_data.s: portapack_cpld_data.cpp.s +.PHONY : portapack_cpld_data.s + +# target to generate assembly for a file +portapack_cpld_data.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/portapack_cpld_data.cpp.s +.PHONY : portapack_cpld_data.cpp.s + +radio.obj: radio.cpp.obj +.PHONY : radio.obj + +# target to build an object file +radio.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/radio.cpp.obj +.PHONY : radio.cpp.obj + +radio.i: radio.cpp.i +.PHONY : radio.i + +# target to preprocess a source file +radio.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/radio.cpp.i +.PHONY : radio.cpp.i + +radio.s: radio.cpp.s +.PHONY : radio.s + +# target to generate assembly for a file +radio.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/radio.cpp.s +.PHONY : radio.cpp.s + +receiver_model.obj: receiver_model.cpp.obj +.PHONY : receiver_model.obj + +# target to build an object file +receiver_model.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/receiver_model.cpp.obj +.PHONY : receiver_model.cpp.obj + +receiver_model.i: receiver_model.cpp.i +.PHONY : receiver_model.i + +# target to preprocess a source file +receiver_model.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/receiver_model.cpp.i +.PHONY : receiver_model.cpp.i + +receiver_model.s: receiver_model.cpp.s +.PHONY : receiver_model.s + +# target to generate assembly for a file +receiver_model.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/receiver_model.cpp.s +.PHONY : receiver_model.cpp.s + +recent_entries.obj: recent_entries.cpp.obj +.PHONY : recent_entries.obj + +# target to build an object file +recent_entries.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/recent_entries.cpp.obj +.PHONY : recent_entries.cpp.obj + +recent_entries.i: recent_entries.cpp.i +.PHONY : recent_entries.i + +# target to preprocess a source file +recent_entries.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/recent_entries.cpp.i +.PHONY : recent_entries.cpp.i + +recent_entries.s: recent_entries.cpp.s +.PHONY : recent_entries.s + +# target to generate assembly for a file +recent_entries.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/recent_entries.cpp.s +.PHONY : recent_entries.cpp.s + +rf_path.obj: rf_path.cpp.obj +.PHONY : rf_path.obj + +# target to build an object file +rf_path.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/rf_path.cpp.obj +.PHONY : rf_path.cpp.obj + +rf_path.i: rf_path.cpp.i +.PHONY : rf_path.i + +# target to preprocess a source file +rf_path.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/rf_path.cpp.i +.PHONY : rf_path.cpp.i + +rf_path.s: rf_path.cpp.s +.PHONY : rf_path.s + +# target to generate assembly for a file +rf_path.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/rf_path.cpp.s +.PHONY : rf_path.cpp.s + +rffc507x.obj: rffc507x.cpp.obj +.PHONY : rffc507x.obj + +# target to build an object file +rffc507x.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/rffc507x.cpp.obj +.PHONY : rffc507x.cpp.obj + +rffc507x.i: rffc507x.cpp.i +.PHONY : rffc507x.i + +# target to preprocess a source file +rffc507x.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/rffc507x.cpp.i +.PHONY : rffc507x.cpp.i + +rffc507x.s: rffc507x.cpp.s +.PHONY : rffc507x.s + +# target to generate assembly for a file +rffc507x.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/rffc507x.cpp.s +.PHONY : rffc507x.cpp.s + +rffc507x_spi.obj: rffc507x_spi.cpp.obj +.PHONY : rffc507x_spi.obj + +# target to build an object file +rffc507x_spi.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/rffc507x_spi.cpp.obj +.PHONY : rffc507x_spi.cpp.obj + +rffc507x_spi.i: rffc507x_spi.cpp.i +.PHONY : rffc507x_spi.i + +# target to preprocess a source file +rffc507x_spi.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/rffc507x_spi.cpp.i +.PHONY : rffc507x_spi.cpp.i + +rffc507x_spi.s: rffc507x_spi.cpp.s +.PHONY : rffc507x_spi.s + +# target to generate assembly for a file +rffc507x_spi.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/rffc507x_spi.cpp.s +.PHONY : rffc507x_spi.cpp.s + +sd_card.obj: sd_card.cpp.obj +.PHONY : sd_card.obj + +# target to build an object file +sd_card.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/sd_card.cpp.obj +.PHONY : sd_card.cpp.obj + +sd_card.i: sd_card.cpp.i +.PHONY : sd_card.i + +# target to preprocess a source file +sd_card.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/sd_card.cpp.i +.PHONY : sd_card.cpp.i + +sd_card.s: sd_card.cpp.s +.PHONY : sd_card.s + +# target to generate assembly for a file +sd_card.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/sd_card.cpp.s +.PHONY : sd_card.cpp.s + +si5351.obj: si5351.cpp.obj +.PHONY : si5351.obj + +# target to build an object file +si5351.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/si5351.cpp.obj +.PHONY : si5351.cpp.obj + +si5351.i: si5351.cpp.i +.PHONY : si5351.i + +# target to preprocess a source file +si5351.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/si5351.cpp.i +.PHONY : si5351.cpp.i + +si5351.s: si5351.cpp.s +.PHONY : si5351.s + +# target to generate assembly for a file +si5351.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/si5351.cpp.s +.PHONY : si5351.cpp.s + +spectrum_color_lut.obj: spectrum_color_lut.cpp.obj +.PHONY : spectrum_color_lut.obj + +# target to build an object file +spectrum_color_lut.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/spectrum_color_lut.cpp.obj +.PHONY : spectrum_color_lut.cpp.obj + +spectrum_color_lut.i: spectrum_color_lut.cpp.i +.PHONY : spectrum_color_lut.i + +# target to preprocess a source file +spectrum_color_lut.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/spectrum_color_lut.cpp.i +.PHONY : spectrum_color_lut.cpp.i + +spectrum_color_lut.s: spectrum_color_lut.cpp.s +.PHONY : spectrum_color_lut.s + +# target to generate assembly for a file +spectrum_color_lut.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/spectrum_color_lut.cpp.s +.PHONY : spectrum_color_lut.cpp.s + +spi_pp.obj: spi_pp.cpp.obj +.PHONY : spi_pp.obj + +# target to build an object file +spi_pp.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/spi_pp.cpp.obj +.PHONY : spi_pp.cpp.obj + +spi_pp.i: spi_pp.cpp.i +.PHONY : spi_pp.i + +# target to preprocess a source file +spi_pp.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/spi_pp.cpp.i +.PHONY : spi_pp.cpp.i + +spi_pp.s: spi_pp.cpp.s +.PHONY : spi_pp.s + +# target to generate assembly for a file +spi_pp.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/spi_pp.cpp.s +.PHONY : spi_pp.cpp.s + +string_format.obj: string_format.cpp.obj +.PHONY : string_format.obj + +# target to build an object file +string_format.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/string_format.cpp.obj +.PHONY : string_format.cpp.obj + +string_format.i: string_format.cpp.i +.PHONY : string_format.i + +# target to preprocess a source file +string_format.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/string_format.cpp.i +.PHONY : string_format.cpp.i + +string_format.s: string_format.cpp.s +.PHONY : string_format.s + +# target to generate assembly for a file +string_format.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/string_format.cpp.s +.PHONY : string_format.cpp.s + +temperature_logger.obj: temperature_logger.cpp.obj +.PHONY : temperature_logger.obj + +# target to build an object file +temperature_logger.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/temperature_logger.cpp.obj +.PHONY : temperature_logger.cpp.obj + +temperature_logger.i: temperature_logger.cpp.i +.PHONY : temperature_logger.i + +# target to preprocess a source file +temperature_logger.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/temperature_logger.cpp.i +.PHONY : temperature_logger.cpp.i + +temperature_logger.s: temperature_logger.cpp.s +.PHONY : temperature_logger.s + +# target to generate assembly for a file +temperature_logger.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/temperature_logger.cpp.s +.PHONY : temperature_logger.cpp.s + +time.obj: time.cpp.obj +.PHONY : time.obj + +# target to build an object file +time.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/time.cpp.obj +.PHONY : time.cpp.obj + +time.i: time.cpp.i +.PHONY : time.i + +# target to preprocess a source file +time.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/time.cpp.i +.PHONY : time.cpp.i + +time.s: time.cpp.s +.PHONY : time.s + +# target to generate assembly for a file +time.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/time.cpp.s +.PHONY : time.cpp.s + +touch.obj: touch.cpp.obj +.PHONY : touch.obj + +# target to build an object file +touch.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/touch.cpp.obj +.PHONY : touch.cpp.obj + +touch.i: touch.cpp.i +.PHONY : touch.i + +# target to preprocess a source file +touch.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/touch.cpp.i +.PHONY : touch.cpp.i + +touch.s: touch.cpp.s +.PHONY : touch.s + +# target to generate assembly for a file +touch.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/touch.cpp.s +.PHONY : touch.cpp.s + +touch_adc.obj: touch_adc.cpp.obj +.PHONY : touch_adc.obj + +# target to build an object file +touch_adc.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/touch_adc.cpp.obj +.PHONY : touch_adc.cpp.obj + +touch_adc.i: touch_adc.cpp.i +.PHONY : touch_adc.i + +# target to preprocess a source file +touch_adc.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/touch_adc.cpp.i +.PHONY : touch_adc.cpp.i + +touch_adc.s: touch_adc.cpp.s +.PHONY : touch_adc.s + +# target to generate assembly for a file +touch_adc.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/touch_adc.cpp.s +.PHONY : touch_adc.cpp.s + +tpms_app.obj: tpms_app.cpp.obj +.PHONY : tpms_app.obj + +# target to build an object file +tpms_app.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/tpms_app.cpp.obj +.PHONY : tpms_app.cpp.obj + +tpms_app.i: tpms_app.cpp.i +.PHONY : tpms_app.i + +# target to preprocess a source file +tpms_app.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/tpms_app.cpp.i +.PHONY : tpms_app.cpp.i + +tpms_app.s: tpms_app.cpp.s +.PHONY : tpms_app.s + +# target to generate assembly for a file +tpms_app.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/tpms_app.cpp.s +.PHONY : tpms_app.cpp.s + +transmitter_model.obj: transmitter_model.cpp.obj +.PHONY : transmitter_model.obj + +# target to build an object file +transmitter_model.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/transmitter_model.cpp.obj +.PHONY : transmitter_model.cpp.obj + +transmitter_model.i: transmitter_model.cpp.i +.PHONY : transmitter_model.i + +# target to preprocess a source file +transmitter_model.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/transmitter_model.cpp.i +.PHONY : transmitter_model.cpp.i + +transmitter_model.s: transmitter_model.cpp.s +.PHONY : transmitter_model.s + +# target to generate assembly for a file +transmitter_model.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/transmitter_model.cpp.s +.PHONY : transmitter_model.cpp.s + +tuning.obj: tuning.cpp.obj +.PHONY : tuning.obj + +# target to build an object file +tuning.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/tuning.cpp.obj +.PHONY : tuning.cpp.obj + +tuning.i: tuning.cpp.i +.PHONY : tuning.i + +# target to preprocess a source file +tuning.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/tuning.cpp.i +.PHONY : tuning.cpp.i + +tuning.s: tuning.cpp.s +.PHONY : tuning.s + +# target to generate assembly for a file +tuning.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/tuning.cpp.s +.PHONY : tuning.cpp.s + +ui_about.obj: ui_about.cpp.obj +.PHONY : ui_about.obj + +# target to build an object file +ui_about.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_about.cpp.obj +.PHONY : ui_about.cpp.obj + +ui_about.i: ui_about.cpp.i +.PHONY : ui_about.i + +# target to preprocess a source file +ui_about.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_about.cpp.i +.PHONY : ui_about.cpp.i + +ui_about.s: ui_about.cpp.s +.PHONY : ui_about.s + +# target to generate assembly for a file +ui_about.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_about.cpp.s +.PHONY : ui_about.cpp.s + +ui_afsksetup.obj: ui_afsksetup.cpp.obj +.PHONY : ui_afsksetup.obj + +# target to build an object file +ui_afsksetup.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_afsksetup.cpp.obj +.PHONY : ui_afsksetup.cpp.obj + +ui_afsksetup.i: ui_afsksetup.cpp.i +.PHONY : ui_afsksetup.i + +# target to preprocess a source file +ui_afsksetup.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_afsksetup.cpp.i +.PHONY : ui_afsksetup.cpp.i + +ui_afsksetup.s: ui_afsksetup.cpp.s +.PHONY : ui_afsksetup.s + +# target to generate assembly for a file +ui_afsksetup.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_afsksetup.cpp.s +.PHONY : ui_afsksetup.cpp.s + +ui_alphanum.obj: ui_alphanum.cpp.obj +.PHONY : ui_alphanum.obj + +# target to build an object file +ui_alphanum.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_alphanum.cpp.obj +.PHONY : ui_alphanum.cpp.obj + +ui_alphanum.i: ui_alphanum.cpp.i +.PHONY : ui_alphanum.i + +# target to preprocess a source file +ui_alphanum.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_alphanum.cpp.i +.PHONY : ui_alphanum.cpp.i + +ui_alphanum.s: ui_alphanum.cpp.s +.PHONY : ui_alphanum.s + +# target to generate assembly for a file +ui_alphanum.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_alphanum.cpp.s +.PHONY : ui_alphanum.cpp.s + +ui_audio.obj: ui_audio.cpp.obj +.PHONY : ui_audio.obj + +# target to build an object file +ui_audio.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_audio.cpp.obj +.PHONY : ui_audio.cpp.obj + +ui_audio.i: ui_audio.cpp.i +.PHONY : ui_audio.i + +# target to preprocess a source file +ui_audio.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_audio.cpp.i +.PHONY : ui_audio.cpp.i + +ui_audio.s: ui_audio.cpp.s +.PHONY : ui_audio.s + +# target to generate assembly for a file +ui_audio.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_audio.cpp.s +.PHONY : ui_audio.cpp.s + +ui_baseband_stats_view.obj: ui_baseband_stats_view.cpp.obj +.PHONY : ui_baseband_stats_view.obj + +# target to build an object file +ui_baseband_stats_view.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_baseband_stats_view.cpp.obj +.PHONY : ui_baseband_stats_view.cpp.obj + +ui_baseband_stats_view.i: ui_baseband_stats_view.cpp.i +.PHONY : ui_baseband_stats_view.i + +# target to preprocess a source file +ui_baseband_stats_view.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_baseband_stats_view.cpp.i +.PHONY : ui_baseband_stats_view.cpp.i + +ui_baseband_stats_view.s: ui_baseband_stats_view.cpp.s +.PHONY : ui_baseband_stats_view.s + +# target to generate assembly for a file +ui_baseband_stats_view.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_baseband_stats_view.cpp.s +.PHONY : ui_baseband_stats_view.cpp.s + +ui_channel.obj: ui_channel.cpp.obj +.PHONY : ui_channel.obj + +# target to build an object file +ui_channel.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_channel.cpp.obj +.PHONY : ui_channel.cpp.obj + +ui_channel.i: ui_channel.cpp.i +.PHONY : ui_channel.i + +# target to preprocess a source file +ui_channel.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_channel.cpp.i +.PHONY : ui_channel.cpp.i + +ui_channel.s: ui_channel.cpp.s +.PHONY : ui_channel.s + +# target to generate assembly for a file +ui_channel.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_channel.cpp.s +.PHONY : ui_channel.cpp.s + +ui_closecall.obj: ui_closecall.cpp.obj +.PHONY : ui_closecall.obj + +# target to build an object file +ui_closecall.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_closecall.cpp.obj +.PHONY : ui_closecall.cpp.obj + +ui_closecall.i: ui_closecall.cpp.i +.PHONY : ui_closecall.i + +# target to preprocess a source file +ui_closecall.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_closecall.cpp.i +.PHONY : ui_closecall.cpp.i + +ui_closecall.s: ui_closecall.cpp.s +.PHONY : ui_closecall.s + +# target to generate assembly for a file +ui_closecall.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_closecall.cpp.s +.PHONY : ui_closecall.cpp.s + +ui_console.obj: ui_console.cpp.obj +.PHONY : ui_console.obj + +# target to build an object file +ui_console.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_console.cpp.obj +.PHONY : ui_console.cpp.obj + +ui_console.i: ui_console.cpp.i +.PHONY : ui_console.i + +# target to preprocess a source file +ui_console.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_console.cpp.i +.PHONY : ui_console.cpp.i + +ui_console.s: ui_console.cpp.s +.PHONY : ui_console.s + +# target to generate assembly for a file +ui_console.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_console.cpp.s +.PHONY : ui_console.cpp.s + +ui_debug.obj: ui_debug.cpp.obj +.PHONY : ui_debug.obj + +# target to build an object file +ui_debug.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_debug.cpp.obj +.PHONY : ui_debug.cpp.obj + +ui_debug.i: ui_debug.cpp.i +.PHONY : ui_debug.i + +# target to preprocess a source file +ui_debug.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_debug.cpp.i +.PHONY : ui_debug.cpp.i + +ui_debug.s: ui_debug.cpp.s +.PHONY : ui_debug.s + +# target to generate assembly for a file +ui_debug.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_debug.cpp.s +.PHONY : ui_debug.cpp.s + +ui_font_fixed_8x16.obj: ui_font_fixed_8x16.cpp.obj +.PHONY : ui_font_fixed_8x16.obj + +# target to build an object file +ui_font_fixed_8x16.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_font_fixed_8x16.cpp.obj +.PHONY : ui_font_fixed_8x16.cpp.obj + +ui_font_fixed_8x16.i: ui_font_fixed_8x16.cpp.i +.PHONY : ui_font_fixed_8x16.i + +# target to preprocess a source file +ui_font_fixed_8x16.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_font_fixed_8x16.cpp.i +.PHONY : ui_font_fixed_8x16.cpp.i + +ui_font_fixed_8x16.s: ui_font_fixed_8x16.cpp.s +.PHONY : ui_font_fixed_8x16.s + +# target to generate assembly for a file +ui_font_fixed_8x16.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_font_fixed_8x16.cpp.s +.PHONY : ui_font_fixed_8x16.cpp.s + +ui_freqman.obj: ui_freqman.cpp.obj +.PHONY : ui_freqman.obj + +# target to build an object file +ui_freqman.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_freqman.cpp.obj +.PHONY : ui_freqman.cpp.obj + +ui_freqman.i: ui_freqman.cpp.i +.PHONY : ui_freqman.i + +# target to preprocess a source file +ui_freqman.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_freqman.cpp.i +.PHONY : ui_freqman.cpp.i + +ui_freqman.s: ui_freqman.cpp.s +.PHONY : ui_freqman.s + +# target to generate assembly for a file +ui_freqman.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_freqman.cpp.s +.PHONY : ui_freqman.cpp.s + +ui_handwrite.obj: ui_handwrite.cpp.obj +.PHONY : ui_handwrite.obj + +# target to build an object file +ui_handwrite.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_handwrite.cpp.obj +.PHONY : ui_handwrite.cpp.obj + +ui_handwrite.i: ui_handwrite.cpp.i +.PHONY : ui_handwrite.i + +# target to preprocess a source file +ui_handwrite.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_handwrite.cpp.i +.PHONY : ui_handwrite.cpp.i + +ui_handwrite.s: ui_handwrite.cpp.s +.PHONY : ui_handwrite.s + +# target to generate assembly for a file +ui_handwrite.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_handwrite.cpp.s +.PHONY : ui_handwrite.cpp.s + +ui_jammer.obj: ui_jammer.cpp.obj +.PHONY : ui_jammer.obj + +# target to build an object file +ui_jammer.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_jammer.cpp.obj +.PHONY : ui_jammer.cpp.obj + +ui_jammer.i: ui_jammer.cpp.i +.PHONY : ui_jammer.i + +# target to preprocess a source file +ui_jammer.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_jammer.cpp.i +.PHONY : ui_jammer.cpp.i + +ui_jammer.s: ui_jammer.cpp.s +.PHONY : ui_jammer.s + +# target to generate assembly for a file +ui_jammer.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_jammer.cpp.s +.PHONY : ui_jammer.cpp.s + +ui_lcr.obj: ui_lcr.cpp.obj +.PHONY : ui_lcr.obj + +# target to build an object file +ui_lcr.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_lcr.cpp.obj +.PHONY : ui_lcr.cpp.obj + +ui_lcr.i: ui_lcr.cpp.i +.PHONY : ui_lcr.i + +# target to preprocess a source file +ui_lcr.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_lcr.cpp.i +.PHONY : ui_lcr.cpp.i + +ui_lcr.s: ui_lcr.cpp.s +.PHONY : ui_lcr.s + +# target to generate assembly for a file +ui_lcr.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_lcr.cpp.s +.PHONY : ui_lcr.cpp.s + +ui_menu.obj: ui_menu.cpp.obj +.PHONY : ui_menu.obj + +# target to build an object file +ui_menu.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_menu.cpp.obj +.PHONY : ui_menu.cpp.obj + +ui_menu.i: ui_menu.cpp.i +.PHONY : ui_menu.i + +# target to preprocess a source file +ui_menu.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_menu.cpp.i +.PHONY : ui_menu.cpp.i + +ui_menu.s: ui_menu.cpp.s +.PHONY : ui_menu.s + +# target to generate assembly for a file +ui_menu.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_menu.cpp.s +.PHONY : ui_menu.cpp.s + +ui_navigation.obj: ui_navigation.cpp.obj +.PHONY : ui_navigation.obj + +# target to build an object file +ui_navigation.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_navigation.cpp.obj +.PHONY : ui_navigation.cpp.obj + +ui_navigation.i: ui_navigation.cpp.i +.PHONY : ui_navigation.i + +# target to preprocess a source file +ui_navigation.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_navigation.cpp.i +.PHONY : ui_navigation.cpp.i + +ui_navigation.s: ui_navigation.cpp.s +.PHONY : ui_navigation.s + +# target to generate assembly for a file +ui_navigation.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_navigation.cpp.s +.PHONY : ui_navigation.cpp.s + +ui_rds.obj: ui_rds.cpp.obj +.PHONY : ui_rds.obj + +# target to build an object file +ui_rds.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_rds.cpp.obj +.PHONY : ui_rds.cpp.obj + +ui_rds.i: ui_rds.cpp.i +.PHONY : ui_rds.i + +# target to preprocess a source file +ui_rds.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_rds.cpp.i +.PHONY : ui_rds.cpp.i + +ui_rds.s: ui_rds.cpp.s +.PHONY : ui_rds.s + +# target to generate assembly for a file +ui_rds.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_rds.cpp.s +.PHONY : ui_rds.cpp.s + +ui_receiver.obj: ui_receiver.cpp.obj +.PHONY : ui_receiver.obj + +# target to build an object file +ui_receiver.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_receiver.cpp.obj +.PHONY : ui_receiver.cpp.obj + +ui_receiver.i: ui_receiver.cpp.i +.PHONY : ui_receiver.i + +# target to preprocess a source file +ui_receiver.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_receiver.cpp.i +.PHONY : ui_receiver.cpp.i + +ui_receiver.s: ui_receiver.cpp.s +.PHONY : ui_receiver.s + +# target to generate assembly for a file +ui_receiver.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_receiver.cpp.s +.PHONY : ui_receiver.cpp.s + +ui_record_view.obj: ui_record_view.cpp.obj +.PHONY : ui_record_view.obj + +# target to build an object file +ui_record_view.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_record_view.cpp.obj +.PHONY : ui_record_view.cpp.obj + +ui_record_view.i: ui_record_view.cpp.i +.PHONY : ui_record_view.i + +# target to preprocess a source file +ui_record_view.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_record_view.cpp.i +.PHONY : ui_record_view.cpp.i + +ui_record_view.s: ui_record_view.cpp.s +.PHONY : ui_record_view.s + +# target to generate assembly for a file +ui_record_view.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_record_view.cpp.s +.PHONY : ui_record_view.cpp.s + +ui_rssi.obj: ui_rssi.cpp.obj +.PHONY : ui_rssi.obj + +# target to build an object file +ui_rssi.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_rssi.cpp.obj +.PHONY : ui_rssi.cpp.obj + +ui_rssi.i: ui_rssi.cpp.i +.PHONY : ui_rssi.i + +# target to preprocess a source file +ui_rssi.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_rssi.cpp.i +.PHONY : ui_rssi.cpp.i + +ui_rssi.s: ui_rssi.cpp.s +.PHONY : ui_rssi.s + +# target to generate assembly for a file +ui_rssi.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_rssi.cpp.s +.PHONY : ui_rssi.cpp.s + +ui_sd_card_debug.obj: ui_sd_card_debug.cpp.obj +.PHONY : ui_sd_card_debug.obj + +# target to build an object file +ui_sd_card_debug.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_sd_card_debug.cpp.obj +.PHONY : ui_sd_card_debug.cpp.obj + +ui_sd_card_debug.i: ui_sd_card_debug.cpp.i +.PHONY : ui_sd_card_debug.i + +# target to preprocess a source file +ui_sd_card_debug.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_sd_card_debug.cpp.i +.PHONY : ui_sd_card_debug.cpp.i + +ui_sd_card_debug.s: ui_sd_card_debug.cpp.s +.PHONY : ui_sd_card_debug.s + +# target to generate assembly for a file +ui_sd_card_debug.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_sd_card_debug.cpp.s +.PHONY : ui_sd_card_debug.cpp.s + +ui_sd_card_status_view.obj: ui_sd_card_status_view.cpp.obj +.PHONY : ui_sd_card_status_view.obj + +# target to build an object file +ui_sd_card_status_view.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_sd_card_status_view.cpp.obj +.PHONY : ui_sd_card_status_view.cpp.obj + +ui_sd_card_status_view.i: ui_sd_card_status_view.cpp.i +.PHONY : ui_sd_card_status_view.i + +# target to preprocess a source file +ui_sd_card_status_view.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_sd_card_status_view.cpp.i +.PHONY : ui_sd_card_status_view.cpp.i + +ui_sd_card_status_view.s: ui_sd_card_status_view.cpp.s +.PHONY : ui_sd_card_status_view.s + +# target to generate assembly for a file +ui_sd_card_status_view.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_sd_card_status_view.cpp.s +.PHONY : ui_sd_card_status_view.cpp.s + +ui_setup.obj: ui_setup.cpp.obj +.PHONY : ui_setup.obj + +# target to build an object file +ui_setup.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_setup.cpp.obj +.PHONY : ui_setup.cpp.obj + +ui_setup.i: ui_setup.cpp.i +.PHONY : ui_setup.i + +# target to preprocess a source file +ui_setup.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_setup.cpp.i +.PHONY : ui_setup.cpp.i + +ui_setup.s: ui_setup.cpp.s +.PHONY : ui_setup.s + +# target to generate assembly for a file +ui_setup.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_setup.cpp.s +.PHONY : ui_setup.cpp.s + +ui_soundboard.obj: ui_soundboard.cpp.obj +.PHONY : ui_soundboard.obj + +# target to build an object file +ui_soundboard.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_soundboard.cpp.obj +.PHONY : ui_soundboard.cpp.obj + +ui_soundboard.i: ui_soundboard.cpp.i +.PHONY : ui_soundboard.i + +# target to preprocess a source file +ui_soundboard.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_soundboard.cpp.i +.PHONY : ui_soundboard.cpp.i + +ui_soundboard.s: ui_soundboard.cpp.s +.PHONY : ui_soundboard.s + +# target to generate assembly for a file +ui_soundboard.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_soundboard.cpp.s +.PHONY : ui_soundboard.cpp.s + +ui_spectrum.obj: ui_spectrum.cpp.obj +.PHONY : ui_spectrum.obj + +# target to build an object file +ui_spectrum.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_spectrum.cpp.obj +.PHONY : ui_spectrum.cpp.obj + +ui_spectrum.i: ui_spectrum.cpp.i +.PHONY : ui_spectrum.i + +# target to preprocess a source file +ui_spectrum.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_spectrum.cpp.i +.PHONY : ui_spectrum.cpp.i + +ui_spectrum.s: ui_spectrum.cpp.s +.PHONY : ui_spectrum.s + +# target to generate assembly for a file +ui_spectrum.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_spectrum.cpp.s +.PHONY : ui_spectrum.cpp.s + +ui_textentry.obj: ui_textentry.cpp.obj +.PHONY : ui_textentry.obj + +# target to build an object file +ui_textentry.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_textentry.cpp.obj +.PHONY : ui_textentry.cpp.obj + +ui_textentry.i: ui_textentry.cpp.i +.PHONY : ui_textentry.i + +# target to preprocess a source file +ui_textentry.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_textentry.cpp.i +.PHONY : ui_textentry.cpp.i + +ui_textentry.s: ui_textentry.cpp.s +.PHONY : ui_textentry.s + +# target to generate assembly for a file +ui_textentry.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_textentry.cpp.s +.PHONY : ui_textentry.cpp.s + +ui_xylos.obj: ui_xylos.cpp.obj +.PHONY : ui_xylos.obj + +# target to build an object file +ui_xylos.cpp.obj: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_xylos.cpp.obj +.PHONY : ui_xylos.cpp.obj + +ui_xylos.i: ui_xylos.cpp.i +.PHONY : ui_xylos.i + +# target to preprocess a source file +ui_xylos.cpp.i: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_xylos.cpp.i +.PHONY : ui_xylos.cpp.i + +ui_xylos.s: ui_xylos.cpp.s +.PHONY : ui_xylos.s + +# target to generate assembly for a file +ui_xylos.cpp.s: + cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_xylos.cpp.s +.PHONY : ui_xylos.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... application" + @echo "... application.elf" + @echo "... edit_cache" + @echo "... rebuild_cache" + @echo "... __/chibios-portapack/boards/GSG_HACKRF_ONE/board.obj" + @echo "... __/chibios-portapack/boards/GSG_HACKRF_ONE/board.i" + @echo "... __/chibios-portapack/boards/GSG_HACKRF_ONE/board.s" + @echo "... __/chibios-portapack/ext/fatfs/src/ff.obj" + @echo "... __/chibios-portapack/ext/fatfs/src/ff.i" + @echo "... __/chibios-portapack/ext/fatfs/src/ff.s" + @echo "... __/chibios-portapack/os/hal/platforms/LPC43xx/gpt_lld.obj" + @echo "... __/chibios-portapack/os/hal/platforms/LPC43xx/gpt_lld.i" + @echo "... __/chibios-portapack/os/hal/platforms/LPC43xx/gpt_lld.s" + @echo "... __/chibios-portapack/os/hal/platforms/LPC43xx/i2c_lld.obj" + @echo "... __/chibios-portapack/os/hal/platforms/LPC43xx/i2c_lld.i" + @echo "... __/chibios-portapack/os/hal/platforms/LPC43xx/i2c_lld.s" + @echo "... __/chibios-portapack/os/hal/platforms/LPC43xx/pal_lld.obj" + @echo "... __/chibios-portapack/os/hal/platforms/LPC43xx/pal_lld.i" + @echo "... __/chibios-portapack/os/hal/platforms/LPC43xx/pal_lld.s" + @echo "... __/chibios-portapack/os/hal/platforms/LPC43xx/rtc_lld.obj" + @echo "... __/chibios-portapack/os/hal/platforms/LPC43xx/rtc_lld.i" + @echo "... __/chibios-portapack/os/hal/platforms/LPC43xx/rtc_lld.s" + @echo "... __/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.obj" + @echo "... __/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.i" + @echo "... __/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.s" + @echo "... __/chibios-portapack/os/hal/platforms/LPC43xx/serial_lld.obj" + @echo "... __/chibios-portapack/os/hal/platforms/LPC43xx/serial_lld.i" + @echo "... __/chibios-portapack/os/hal/platforms/LPC43xx/serial_lld.s" + @echo "... __/chibios-portapack/os/hal/platforms/LPC43xx/spi_lld.obj" + @echo "... __/chibios-portapack/os/hal/platforms/LPC43xx/spi_lld.i" + @echo "... __/chibios-portapack/os/hal/platforms/LPC43xx/spi_lld.s" + @echo "... __/chibios-portapack/os/hal/platforms/LPC43xx_M0/hal_lld.obj" + @echo "... __/chibios-portapack/os/hal/platforms/LPC43xx_M0/hal_lld.i" + @echo "... __/chibios-portapack/os/hal/platforms/LPC43xx_M0/hal_lld.s" + @echo "... __/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/vectors.obj" + @echo "... __/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/vectors.i" + @echo "... __/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/vectors.s" + @echo "... __/chibios-portapack/os/various/fatfs_bindings/fatfs_diskio.obj" + @echo "... __/chibios-portapack/os/various/fatfs_bindings/fatfs_diskio.i" + @echo "... __/chibios-portapack/os/various/fatfs_bindings/fatfs_diskio.s" + @echo "... __/chibios-portapack/os/various/fatfs_bindings/fatfs_syscall.obj" + @echo "... __/chibios-portapack/os/various/fatfs_bindings/fatfs_syscall.i" + @echo "... __/chibios-portapack/os/various/fatfs_bindings/fatfs_syscall.s" + @echo "... __/chibios/os/hal/src/adc.obj" + @echo "... __/chibios/os/hal/src/adc.i" + @echo "... __/chibios/os/hal/src/adc.s" + @echo "... __/chibios/os/hal/src/can.obj" + @echo "... __/chibios/os/hal/src/can.i" + @echo "... __/chibios/os/hal/src/can.s" + @echo "... __/chibios/os/hal/src/ext.obj" + @echo "... __/chibios/os/hal/src/ext.i" + @echo "... __/chibios/os/hal/src/ext.s" + @echo "... __/chibios/os/hal/src/gpt.obj" + @echo "... __/chibios/os/hal/src/gpt.i" + @echo "... __/chibios/os/hal/src/gpt.s" + @echo "... __/chibios/os/hal/src/hal.obj" + @echo "... __/chibios/os/hal/src/hal.i" + @echo "... __/chibios/os/hal/src/hal.s" + @echo "... __/chibios/os/hal/src/i2c.obj" + @echo "... __/chibios/os/hal/src/i2c.i" + @echo "... __/chibios/os/hal/src/i2c.s" + @echo "... __/chibios/os/hal/src/icu.obj" + @echo "... __/chibios/os/hal/src/icu.i" + @echo "... __/chibios/os/hal/src/icu.s" + @echo "... __/chibios/os/hal/src/mac.obj" + @echo "... __/chibios/os/hal/src/mac.i" + @echo "... __/chibios/os/hal/src/mac.s" + @echo "... __/chibios/os/hal/src/mmc_spi.obj" + @echo "... __/chibios/os/hal/src/mmc_spi.i" + @echo "... __/chibios/os/hal/src/mmc_spi.s" + @echo "... __/chibios/os/hal/src/mmcsd.obj" + @echo "... __/chibios/os/hal/src/mmcsd.i" + @echo "... __/chibios/os/hal/src/mmcsd.s" + @echo "... __/chibios/os/hal/src/pal.obj" + @echo "... __/chibios/os/hal/src/pal.i" + @echo "... __/chibios/os/hal/src/pal.s" + @echo "... __/chibios/os/hal/src/pwm.obj" + @echo "... __/chibios/os/hal/src/pwm.i" + @echo "... __/chibios/os/hal/src/pwm.s" + @echo "... __/chibios/os/hal/src/rtc.obj" + @echo "... __/chibios/os/hal/src/rtc.i" + @echo "... __/chibios/os/hal/src/rtc.s" + @echo "... __/chibios/os/hal/src/sdc.obj" + @echo "... __/chibios/os/hal/src/sdc.i" + @echo "... __/chibios/os/hal/src/sdc.s" + @echo "... __/chibios/os/hal/src/serial.obj" + @echo "... __/chibios/os/hal/src/serial.i" + @echo "... __/chibios/os/hal/src/serial.s" + @echo "... __/chibios/os/hal/src/serial_usb.obj" + @echo "... __/chibios/os/hal/src/serial_usb.i" + @echo "... __/chibios/os/hal/src/serial_usb.s" + @echo "... __/chibios/os/hal/src/spi.obj" + @echo "... __/chibios/os/hal/src/spi.i" + @echo "... __/chibios/os/hal/src/spi.s" + @echo "... __/chibios/os/hal/src/tm.obj" + @echo "... __/chibios/os/hal/src/tm.i" + @echo "... __/chibios/os/hal/src/tm.s" + @echo "... __/chibios/os/hal/src/uart.obj" + @echo "... __/chibios/os/hal/src/uart.i" + @echo "... __/chibios/os/hal/src/uart.s" + @echo "... __/chibios/os/hal/src/usb.obj" + @echo "... __/chibios/os/hal/src/usb.i" + @echo "... __/chibios/os/hal/src/usb.s" + @echo "... __/chibios/os/kernel/src/chcond.obj" + @echo "... __/chibios/os/kernel/src/chcond.i" + @echo "... __/chibios/os/kernel/src/chcond.s" + @echo "... __/chibios/os/kernel/src/chdebug.obj" + @echo "... __/chibios/os/kernel/src/chdebug.i" + @echo "... __/chibios/os/kernel/src/chdebug.s" + @echo "... __/chibios/os/kernel/src/chdynamic.obj" + @echo "... __/chibios/os/kernel/src/chdynamic.i" + @echo "... __/chibios/os/kernel/src/chdynamic.s" + @echo "... __/chibios/os/kernel/src/chevents.obj" + @echo "... __/chibios/os/kernel/src/chevents.i" + @echo "... __/chibios/os/kernel/src/chevents.s" + @echo "... __/chibios/os/kernel/src/chheap.obj" + @echo "... __/chibios/os/kernel/src/chheap.i" + @echo "... __/chibios/os/kernel/src/chheap.s" + @echo "... __/chibios/os/kernel/src/chlists.obj" + @echo "... __/chibios/os/kernel/src/chlists.i" + @echo "... __/chibios/os/kernel/src/chlists.s" + @echo "... __/chibios/os/kernel/src/chmboxes.obj" + @echo "... __/chibios/os/kernel/src/chmboxes.i" + @echo "... __/chibios/os/kernel/src/chmboxes.s" + @echo "... __/chibios/os/kernel/src/chmemcore.obj" + @echo "... __/chibios/os/kernel/src/chmemcore.i" + @echo "... __/chibios/os/kernel/src/chmemcore.s" + @echo "... __/chibios/os/kernel/src/chmempools.obj" + @echo "... __/chibios/os/kernel/src/chmempools.i" + @echo "... __/chibios/os/kernel/src/chmempools.s" + @echo "... __/chibios/os/kernel/src/chmsg.obj" + @echo "... __/chibios/os/kernel/src/chmsg.i" + @echo "... __/chibios/os/kernel/src/chmsg.s" + @echo "... __/chibios/os/kernel/src/chmtx.obj" + @echo "... __/chibios/os/kernel/src/chmtx.i" + @echo "... __/chibios/os/kernel/src/chmtx.s" + @echo "... __/chibios/os/kernel/src/chqueues.obj" + @echo "... __/chibios/os/kernel/src/chqueues.i" + @echo "... __/chibios/os/kernel/src/chqueues.s" + @echo "... __/chibios/os/kernel/src/chregistry.obj" + @echo "... __/chibios/os/kernel/src/chregistry.i" + @echo "... __/chibios/os/kernel/src/chregistry.s" + @echo "... __/chibios/os/kernel/src/chschd.obj" + @echo "... __/chibios/os/kernel/src/chschd.i" + @echo "... __/chibios/os/kernel/src/chschd.s" + @echo "... __/chibios/os/kernel/src/chsem.obj" + @echo "... __/chibios/os/kernel/src/chsem.i" + @echo "... __/chibios/os/kernel/src/chsem.s" + @echo "... __/chibios/os/kernel/src/chsys.obj" + @echo "... __/chibios/os/kernel/src/chsys.i" + @echo "... __/chibios/os/kernel/src/chsys.s" + @echo "... __/chibios/os/kernel/src/chthreads.obj" + @echo "... __/chibios/os/kernel/src/chthreads.i" + @echo "... __/chibios/os/kernel/src/chthreads.s" + @echo "... __/chibios/os/kernel/src/chvt.obj" + @echo "... __/chibios/os/kernel/src/chvt.i" + @echo "... __/chibios/os/kernel/src/chvt.s" + @echo "... __/chibios/os/ports/GCC/ARMCMx/chcore.obj" + @echo "... __/chibios/os/ports/GCC/ARMCMx/chcore.i" + @echo "... __/chibios/os/ports/GCC/ARMCMx/chcore.s" + @echo "... __/chibios/os/ports/GCC/ARMCMx/chcore_v6m.obj" + @echo "... __/chibios/os/ports/GCC/ARMCMx/chcore_v6m.i" + @echo "... __/chibios/os/ports/GCC/ARMCMx/chcore_v6m.s" + @echo "... __/chibios/os/ports/GCC/ARMCMx/crt0.obj" + @echo "... __/chibios/os/ports/GCC/ARMCMx/crt0.i" + @echo "... __/chibios/os/ports/GCC/ARMCMx/crt0.s" + @echo "... __/chibios/os/ports/common/ARMCMx/nvic.obj" + @echo "... __/chibios/os/ports/common/ARMCMx/nvic.i" + @echo "... __/chibios/os/ports/common/ARMCMx/nvic.s" + @echo "... __/chibios/test/test.obj" + @echo "... __/chibios/test/test.i" + @echo "... __/chibios/test/test.s" + @echo "... __/chibios/test/testbmk.obj" + @echo "... __/chibios/test/testbmk.i" + @echo "... __/chibios/test/testbmk.s" + @echo "... __/chibios/test/testdyn.obj" + @echo "... __/chibios/test/testdyn.i" + @echo "... __/chibios/test/testdyn.s" + @echo "... __/chibios/test/testevt.obj" + @echo "... __/chibios/test/testevt.i" + @echo "... __/chibios/test/testevt.s" + @echo "... __/chibios/test/testheap.obj" + @echo "... __/chibios/test/testheap.i" + @echo "... __/chibios/test/testheap.s" + @echo "... __/chibios/test/testmbox.obj" + @echo "... __/chibios/test/testmbox.i" + @echo "... __/chibios/test/testmbox.s" + @echo "... __/chibios/test/testmsg.obj" + @echo "... __/chibios/test/testmsg.i" + @echo "... __/chibios/test/testmsg.s" + @echo "... __/chibios/test/testmtx.obj" + @echo "... __/chibios/test/testmtx.i" + @echo "... __/chibios/test/testmtx.s" + @echo "... __/chibios/test/testpools.obj" + @echo "... __/chibios/test/testpools.i" + @echo "... __/chibios/test/testpools.s" + @echo "... __/chibios/test/testqueues.obj" + @echo "... __/chibios/test/testqueues.i" + @echo "... __/chibios/test/testqueues.s" + @echo "... __/chibios/test/testsem.obj" + @echo "... __/chibios/test/testsem.i" + @echo "... __/chibios/test/testsem.s" + @echo "... __/chibios/test/testthd.obj" + @echo "... __/chibios/test/testthd.i" + @echo "... __/chibios/test/testthd.s" + @echo "... __/common/ais_baseband.obj" + @echo "... __/common/ais_baseband.i" + @echo "... __/common/ais_baseband.s" + @echo "... __/common/ais_packet.obj" + @echo "... __/common/ais_packet.i" + @echo "... __/common/ais_packet.s" + @echo "... __/common/chibios_cpp.obj" + @echo "... __/common/chibios_cpp.i" + @echo "... __/common/chibios_cpp.s" + @echo "... __/common/cpld_max5.obj" + @echo "... __/common/cpld_max5.i" + @echo "... __/common/cpld_max5.s" + @echo "... __/common/cpld_xilinx.obj" + @echo "... __/common/cpld_xilinx.i" + @echo "... __/common/cpld_xilinx.s" + @echo "... __/common/debug.obj" + @echo "... __/common/debug.i" + @echo "... __/common/debug.s" + @echo "... __/common/ert_packet.obj" + @echo "... __/common/ert_packet.i" + @echo "... __/common/ert_packet.s" + @echo "... __/common/event.obj" + @echo "... __/common/event.i" + @echo "... __/common/event.s" + @echo "... __/common/gcc.obj" + @echo "... __/common/gcc.i" + @echo "... __/common/gcc.s" + @echo "... __/common/hackrf_hal.obj" + @echo "... __/common/hackrf_hal.i" + @echo "... __/common/hackrf_hal.s" + @echo "... __/common/i2c_pp.obj" + @echo "... __/common/i2c_pp.i" + @echo "... __/common/i2c_pp.s" + @echo "... __/common/jtag.obj" + @echo "... __/common/jtag.i" + @echo "... __/common/jtag.s" + @echo "... __/common/jtag_tap.obj" + @echo "... __/common/jtag_tap.i" + @echo "... __/common/jtag_tap.s" + @echo "... __/common/lcd_ili9341.obj" + @echo "... __/common/lcd_ili9341.i" + @echo "... __/common/lcd_ili9341.s" + @echo "... __/common/lfsr_random.obj" + @echo "... __/common/lfsr_random.i" + @echo "... __/common/lfsr_random.s" + @echo "... __/common/manchester.obj" + @echo "... __/common/manchester.i" + @echo "... __/common/manchester.s" + @echo "... __/common/message_queue.obj" + @echo "... __/common/message_queue.i" + @echo "... __/common/message_queue.s" + @echo "... __/common/msgpack.obj" + @echo "... __/common/msgpack.i" + @echo "... __/common/msgpack.s" + @echo "... __/common/png_writer.obj" + @echo "... __/common/png_writer.i" + @echo "... __/common/png_writer.s" + @echo "... __/common/portapack_io.obj" + @echo "... __/common/portapack_io.i" + @echo "... __/common/portapack_io.s" + @echo "... __/common/portapack_persistent_memory.obj" + @echo "... __/common/portapack_persistent_memory.i" + @echo "... __/common/portapack_persistent_memory.s" + @echo "... __/common/portapack_shared_memory.obj" + @echo "... __/common/portapack_shared_memory.i" + @echo "... __/common/portapack_shared_memory.s" + @echo "... __/common/tpms_packet.obj" + @echo "... __/common/tpms_packet.i" + @echo "... __/common/tpms_packet.s" + @echo "... __/common/ui.obj" + @echo "... __/common/ui.i" + @echo "... __/common/ui.s" + @echo "... __/common/ui_focus.obj" + @echo "... __/common/ui_focus.i" + @echo "... __/common/ui_focus.s" + @echo "... __/common/ui_painter.obj" + @echo "... __/common/ui_painter.i" + @echo "... __/common/ui_painter.s" + @echo "... __/common/ui_text.obj" + @echo "... __/common/ui_text.i" + @echo "... __/common/ui_text.s" + @echo "... __/common/ui_widget.obj" + @echo "... __/common/ui_widget.i" + @echo "... __/common/ui_widget.s" + @echo "... __/common/utility.obj" + @echo "... __/common/utility.i" + @echo "... __/common/utility.s" + @echo "... __/common/wm8731.obj" + @echo "... __/common/wm8731.i" + @echo "... __/common/wm8731.s" + @echo "... ais_app.obj" + @echo "... ais_app.i" + @echo "... ais_app.s" + @echo "... analog_audio_app.obj" + @echo "... analog_audio_app.i" + @echo "... analog_audio_app.s" + @echo "... audio.obj" + @echo "... audio.i" + @echo "... audio.s" + @echo "... baseband_api.obj" + @echo "... baseband_api.i" + @echo "... baseband_api.s" + @echo "... baseband_cpld.obj" + @echo "... baseband_cpld.i" + @echo "... baseband_cpld.s" + @echo "... capture_app.obj" + @echo "... capture_app.i" + @echo "... capture_app.s" + @echo "... capture_thread.obj" + @echo "... capture_thread.i" + @echo "... capture_thread.s" + @echo "... clock_manager.obj" + @echo "... clock_manager.i" + @echo "... clock_manager.s" + @echo "... core_control.obj" + @echo "... core_control.i" + @echo "... core_control.s" + @echo "... cpld_update.obj" + @echo "... cpld_update.i" + @echo "... cpld_update.s" + @echo "... debounce.obj" + @echo "... debounce.i" + @echo "... debounce.s" + @echo "... encoder.obj" + @echo "... encoder.i" + @echo "... encoder.s" + @echo "... ert_app.obj" + @echo "... ert_app.i" + @echo "... ert_app.s" + @echo "... event_m0.obj" + @echo "... event_m0.i" + @echo "... event_m0.s" + @echo "... file.obj" + @echo "... file.i" + @echo "... file.s" + @echo "... hackrf_cpld_data.obj" + @echo "... hackrf_cpld_data.i" + @echo "... hackrf_cpld_data.s" + @echo "... irq_controls.obj" + @echo "... irq_controls.i" + @echo "... irq_controls.s" + @echo "... irq_lcd_frame.obj" + @echo "... irq_lcd_frame.i" + @echo "... irq_lcd_frame.s" + @echo "... irq_rtc.obj" + @echo "... irq_rtc.i" + @echo "... irq_rtc.s" + @echo "... log_file.obj" + @echo "... log_file.i" + @echo "... log_file.s" + @echo "... main.obj" + @echo "... main.i" + @echo "... main.s" + @echo "... max2837.obj" + @echo "... max2837.i" + @echo "... max2837.s" + @echo "... max5864.obj" + @echo "... max5864.i" + @echo "... max5864.s" + @echo "... portapack.obj" + @echo "... portapack.i" + @echo "... portapack.s" + @echo "... portapack_cpld_data.obj" + @echo "... portapack_cpld_data.i" + @echo "... portapack_cpld_data.s" + @echo "... radio.obj" + @echo "... radio.i" + @echo "... radio.s" + @echo "... receiver_model.obj" + @echo "... receiver_model.i" + @echo "... receiver_model.s" + @echo "... recent_entries.obj" + @echo "... recent_entries.i" + @echo "... recent_entries.s" + @echo "... rf_path.obj" + @echo "... rf_path.i" + @echo "... rf_path.s" + @echo "... rffc507x.obj" + @echo "... rffc507x.i" + @echo "... rffc507x.s" + @echo "... rffc507x_spi.obj" + @echo "... rffc507x_spi.i" + @echo "... rffc507x_spi.s" + @echo "... sd_card.obj" + @echo "... sd_card.i" + @echo "... sd_card.s" + @echo "... si5351.obj" + @echo "... si5351.i" + @echo "... si5351.s" + @echo "... spectrum_color_lut.obj" + @echo "... spectrum_color_lut.i" + @echo "... spectrum_color_lut.s" + @echo "... spi_pp.obj" + @echo "... spi_pp.i" + @echo "... spi_pp.s" + @echo "... string_format.obj" + @echo "... string_format.i" + @echo "... string_format.s" + @echo "... temperature_logger.obj" + @echo "... temperature_logger.i" + @echo "... temperature_logger.s" + @echo "... time.obj" + @echo "... time.i" + @echo "... time.s" + @echo "... touch.obj" + @echo "... touch.i" + @echo "... touch.s" + @echo "... touch_adc.obj" + @echo "... touch_adc.i" + @echo "... touch_adc.s" + @echo "... tpms_app.obj" + @echo "... tpms_app.i" + @echo "... tpms_app.s" + @echo "... transmitter_model.obj" + @echo "... transmitter_model.i" + @echo "... transmitter_model.s" + @echo "... tuning.obj" + @echo "... tuning.i" + @echo "... tuning.s" + @echo "... ui_about.obj" + @echo "... ui_about.i" + @echo "... ui_about.s" + @echo "... ui_afsksetup.obj" + @echo "... ui_afsksetup.i" + @echo "... ui_afsksetup.s" + @echo "... ui_alphanum.obj" + @echo "... ui_alphanum.i" + @echo "... ui_alphanum.s" + @echo "... ui_audio.obj" + @echo "... ui_audio.i" + @echo "... ui_audio.s" + @echo "... ui_baseband_stats_view.obj" + @echo "... ui_baseband_stats_view.i" + @echo "... ui_baseband_stats_view.s" + @echo "... ui_channel.obj" + @echo "... ui_channel.i" + @echo "... ui_channel.s" + @echo "... ui_closecall.obj" + @echo "... ui_closecall.i" + @echo "... ui_closecall.s" + @echo "... ui_console.obj" + @echo "... ui_console.i" + @echo "... ui_console.s" + @echo "... ui_debug.obj" + @echo "... ui_debug.i" + @echo "... ui_debug.s" + @echo "... ui_font_fixed_8x16.obj" + @echo "... ui_font_fixed_8x16.i" + @echo "... ui_font_fixed_8x16.s" + @echo "... ui_freqman.obj" + @echo "... ui_freqman.i" + @echo "... ui_freqman.s" + @echo "... ui_handwrite.obj" + @echo "... ui_handwrite.i" + @echo "... ui_handwrite.s" + @echo "... ui_jammer.obj" + @echo "... ui_jammer.i" + @echo "... ui_jammer.s" + @echo "... ui_lcr.obj" + @echo "... ui_lcr.i" + @echo "... ui_lcr.s" + @echo "... ui_menu.obj" + @echo "... ui_menu.i" + @echo "... ui_menu.s" + @echo "... ui_navigation.obj" + @echo "... ui_navigation.i" + @echo "... ui_navigation.s" + @echo "... ui_rds.obj" + @echo "... ui_rds.i" + @echo "... ui_rds.s" + @echo "... ui_receiver.obj" + @echo "... ui_receiver.i" + @echo "... ui_receiver.s" + @echo "... ui_record_view.obj" + @echo "... ui_record_view.i" + @echo "... ui_record_view.s" + @echo "... ui_rssi.obj" + @echo "... ui_rssi.i" + @echo "... ui_rssi.s" + @echo "... ui_sd_card_debug.obj" + @echo "... ui_sd_card_debug.i" + @echo "... ui_sd_card_debug.s" + @echo "... ui_sd_card_status_view.obj" + @echo "... ui_sd_card_status_view.i" + @echo "... ui_sd_card_status_view.s" + @echo "... ui_setup.obj" + @echo "... ui_setup.i" + @echo "... ui_setup.s" + @echo "... ui_soundboard.obj" + @echo "... ui_soundboard.i" + @echo "... ui_soundboard.s" + @echo "... ui_spectrum.obj" + @echo "... ui_spectrum.i" + @echo "... ui_spectrum.s" + @echo "... ui_textentry.obj" + @echo "... ui_textentry.i" + @echo "... ui_textentry.s" + @echo "... ui_xylos.obj" + @echo "... ui_xylos.i" + @echo "... ui_xylos.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/furrtek/portapack-hackrf && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/firmware/application/baseband_api.cpp b/firmware/application/baseband_api.cpp index 102d7407a..f6300779e 100644 --- a/firmware/application/baseband_api.cpp +++ b/firmware/application/baseband_api.cpp @@ -78,6 +78,13 @@ void WFMConfig::apply() const { audio::set_rate(audio::Rate::Hz_48000); } +void set_xylos_data(const char ccir_message[]) { + const XylosConfigureMessage message { + ccir_message + }; + send_message(&message); +} + static bool baseband_image_running = false; void run_image(const portapack::spi_flash::image_tag_t image_tag) { @@ -108,15 +115,6 @@ void shutdown() { baseband_image_running = false; } -void spectrum_streaming_start(size_t decimation_factor) { - shared_memory.baseband_queue.push_and_wait( - SpectrumStreamingConfigMessage { - SpectrumStreamingConfigMessage::Mode::Running, - decimation_factor - } - ); -} - void spectrum_streaming_start() { SpectrumStreamingConfigMessage message { SpectrumStreamingConfigMessage::Mode::Running diff --git a/firmware/application/baseband_api.hpp b/firmware/application/baseband_api.hpp index d6993ba18..a2bcea90f 100644 --- a/firmware/application/baseband_api.hpp +++ b/firmware/application/baseband_api.hpp @@ -52,10 +52,11 @@ struct WFMConfig { void apply() const; }; +void set_xylos_data(const char ccir_message[]); + void run_image(const portapack::spi_flash::image_tag_t image_tag); void shutdown(); -void spectrum_streaming_start(size_t decimation_factor); void spectrum_streaming_start(); void spectrum_streaming_stop(); diff --git a/firmware/application/core_control.cpp b/firmware/application/core_control.cpp index f881be167..a0fcccc8a 100644 --- a/firmware/application/core_control.cpp +++ b/firmware/application/core_control.cpp @@ -28,12 +28,9 @@ using namespace lpc43xx; #include "message.hpp" #include "baseband_api.hpp" -#include "portapack_shared_memory.hpp" #include -char * modhash; - /* TODO: OK, this is cool, but how do I put the M4 to sleep so I can switch to * a different image? Other than asking the old image to sleep while the M0 * makes changes? @@ -74,55 +71,3 @@ void m0_halt() { port_wait_for_interrupt(); } } - -int m4_load_image(void) { - uint32_t mod_size; - UINT bw; - uint8_t i; - char md5sum[16]; - FILINFO modinfo; - FIL modfile; - DIR rootdir; - FRESULT res; - - // Scan SD card root directory for files with the right md5 fingerprint at the right location - f_opendir(&rootdir, "/"); - for (;;) { - res = f_readdir(&rootdir, &modinfo); - if (res != FR_OK || modinfo.fname[0] == 0) break; - if (!(modinfo.fattrib & AM_DIR)) { - f_open(&modfile, modinfo.fname, FA_OPEN_EXISTING | FA_READ); - f_lseek(&modfile, 26); - f_read(&modfile, &md5sum, 16, &bw); - for (i = 0; i < 16; i++) { - if (md5sum[i] != modhash[i]) break; - } - if (i == 16) { - f_lseek(&modfile, 6); - f_read(&modfile, &mod_size, 4, &bw); - f_lseek(&modfile, 256); - f_read(&modfile, reinterpret_cast(portapack::memory::map::m4_code.base()), mod_size, &bw); - LPC_RGU->RESET_CTRL[0] = (1 << 13); - f_close(&modfile); - return 1; - } - f_close(&modfile); - } - } - - return 0; -} - -void m4_switch(const char * hash) { - modhash = const_cast(hash); - - // Ask M4 to enter loop in RAM - BasebandConfiguration baseband_switch { - .mode = 0xFF, - .sampling_rate = 0, - .decimation_factor = 1, - }; - - BasebandConfigurationMessage message { baseband_switch }; - shared_memory.baseband_queue.push(message); -} diff --git a/firmware/application/core_control.hpp b/firmware/application/core_control.hpp index 4d5b9cd89..09737705d 100644 --- a/firmware/application/core_control.hpp +++ b/firmware/application/core_control.hpp @@ -24,15 +24,11 @@ #include -#include "ff.h" #include "memory_map.hpp" #include "spi_image.hpp" -#include "ui_navigation.hpp" void m4_init(const portapack::spi_flash::image_tag_t image_tag, const portapack::memory::region_t to); void m4_request_shutdown(); -void m4_switch(const char * hash); -int m4_load_image(void); void m0_halt(); diff --git a/firmware/application/event_m0.cpp b/firmware/application/event_m0.cpp index 5eb980f6d..a55410b0f 100644 --- a/firmware/application/event_m0.cpp +++ b/firmware/application/event_m0.cpp @@ -22,6 +22,7 @@ #include "event_m0.hpp" #include "portapack.hpp" +#include "portapack_persistent_memory.hpp" #include "sd_card.hpp" #include "time.hpp" diff --git a/firmware/application/radio.cpp b/firmware/application/radio.cpp index 88ef4a218..a75f01384 100644 --- a/firmware/application/radio.cpp +++ b/firmware/application/radio.cpp @@ -106,7 +106,7 @@ void set_direction(const rf::Direction new_direction) { /* TODO: Refactor all the various "Direction" enumerations into one. */ /* TODO: Only make changes if direction changes, but beware of clock enabling. */ direction = new_direction; - + second_if.set_mode((direction == rf::Direction::Transmit) ? max2837::Mode::Transmit : max2837::Mode::Receive); rf_path.set_direction(direction); diff --git a/firmware/application/transmitter_model.cpp b/firmware/application/transmitter_model.cpp index 22a9a442b..6ded622ba 100644 --- a/firmware/application/transmitter_model.cpp +++ b/firmware/application/transmitter_model.cpp @@ -78,6 +78,11 @@ uint32_t TransmitterModel::sampling_rate() const { return baseband_configuration.sampling_rate; } +uint32_t TransmitterModel::baseband_oversampling() const { + // TODO: Rename decimation_factor. + return baseband_configuration.decimation_factor; +} + void TransmitterModel::enable() { enabled_ = true; radio::set_direction(rf::Direction::Transmit); @@ -91,20 +96,14 @@ void TransmitterModel::enable() { void TransmitterModel::disable() { enabled_ = false; - baseband::stop(); // TODO: Responsibility for enabling/disabling the radio is muddy. // Some happens in ReceiverModel, some inside radio namespace. radio::disable(); } -uint32_t TransmitterModel::baseband_oversampling() const { - // TODO: Rename decimation_factor. - return baseband_configuration.decimation_factor; -} - void TransmitterModel::update_tuning_frequency() { - radio::set_tuning_frequency(tuning_frequency()); + radio::set_tuning_frequency(persistent_memory::tuned_frequency()); } void TransmitterModel::update_rf_amp() { @@ -123,10 +122,6 @@ void TransmitterModel::update_vga() { radio::set_vga_gain(vga_gain_db_); } -uint32_t TransmitterModel::modulation() const { - return baseband_configuration.mode; -} - void TransmitterModel::set_baseband_configuration(const BasebandConfiguration config) { baseband_configuration = config; update_baseband_configuration(); @@ -138,11 +133,7 @@ void TransmitterModel::update_baseband_configuration() { // protocols that need quick RX/TX turn-around. // Disabling baseband while changing sampling rates seems like a good idea... - baseband::stop(); - radio::set_baseband_rate(sampling_rate() * baseband_oversampling()); update_tuning_frequency(); radio::set_baseband_decimation_by(baseband_oversampling()); - - baseband::start(baseband_configuration); } diff --git a/firmware/application/transmitter_model.hpp b/firmware/application/transmitter_model.hpp index 3de71bfdb..8fc8c9c36 100644 --- a/firmware/application/transmitter_model.hpp +++ b/firmware/application/transmitter_model.hpp @@ -25,7 +25,7 @@ #include #include -#include "clock_manager.hpp" +#include "receiver_model.hpp" #include "message.hpp" #include "rf_path.hpp" #include "max2837.hpp" diff --git a/firmware/application/ui_about.cpp b/firmware/application/ui_about.cpp index bc6b9568c..50e8905aa 100644 --- a/firmware/application/ui_about.cpp +++ b/firmware/application/ui_about.cpp @@ -25,9 +25,11 @@ #include "demofont.hpp" #include "ymdata.hpp" +#include "cpld_update.hpp" #include "portapack.hpp" #include "audio.hpp" #include "event_m0.hpp" +#include "baseband_api.hpp" #include "ui_about.hpp" #include "touch.hpp" @@ -46,42 +48,8 @@ using namespace portapack; namespace ui { void AboutView::on_show() { - // Just in case - EventDispatcher::message_map().unregister_handler(Message::ID::DisplayFrameSync); - - // "Vertical blank interrupt" - EventDispatcher::message_map().register_handler(Message::ID::DisplayFrameSync, - [this](const Message* const) { - update(); - } - ); - - // Just in case - EventDispatcher::message_map().unregister_handler(Message::ID::FIFOSignal); - - // Handle baseband asking to fill up FIFO - EventDispatcher::message_map().register_handler(Message::ID::FIFOSignal, - [this](Message* const p) { - FIFODataMessage datamessage; - const auto message = static_cast(p); - if (message->signaltype == 1) { - //debug_cnt++; - //if (debug_cnt == 250) for(;;) {} - render_audio(); - datamessage.data = ym_buffer; - shared_memory.baseband_queue.push(datamessage); - } - } - ); - - transmitter_model.set_tuning_frequency(92200000); // 92.2MHz, change ! - transmitter_model.set_baseband_configuration({ - .mode = 0, - .sampling_rate = 1536000, - .decimation_factor = 1, - }); - transmitter_model.set_rf_amp(true); - transmitter_model.enable(); + about_radio_config.tuning_frequency = 92200000; // 92.2MHz, change ! + radio::enable(about_radio_config); //audio::headphone::set_volume(volume_t::decibel(0 - 99) + audio::headphone::volume_range().max); } @@ -384,22 +352,20 @@ AboutView::AboutView( { uint8_t p, c; - /* - transmitter_model.set_baseband_configuration({ - .mode = 0, - .sampling_rate = 1536000, - .decimation_factor = 1, - }); - */ - add_children({ { &text_title, &text_firmware, &text_cpld_hackrf, - &text_cpld_portapack, + &text_cpld_hackrf_status, &button_ok, } }); + if( cpld_hackrf_verify_eeprom() ) { + text_cpld_hackrf_status.set(" OK"); + } else { + text_cpld_hackrf_status.set("BAD"); + } + // Politely ask for about 26kB framebuffer = (ui::Color *)chHeapAlloc(0x0, 180 * 72 * sizeof(ui::Color)); @@ -422,14 +388,13 @@ AboutView::AboutView( ym_init(); button_ok.on_select = [this,&nav](Button&){ - EventDispatcher::message_map().unregister_handler(Message::ID::DisplayFrameSync); if (framebuffer) chHeapFree(framebuffer); // Do NOT forget this nav.pop(); }; } AboutView::~AboutView() { - transmitter_model.disable(); + radio::disable(); } void AboutView::focus() { diff --git a/firmware/application/ui_about.hpp b/firmware/application/ui_about.hpp index 53840ad67..3d8caab1a 100644 --- a/firmware/application/ui_about.hpp +++ b/firmware/application/ui_about.hpp @@ -48,6 +48,17 @@ private: void draw_demoglyph(ui::Point p, char ch, ui::Color * pal); uint16_t debug_cnt = 0; + radio::Configuration about_radio_config = { + 0, + 1536000, // ? + 2500000, // ? + rf::Direction::Transmit, + true, + 0, + 0, + 1, + }; + typedef struct ymreg_t { uint8_t value; uint8_t cnt; @@ -127,24 +138,47 @@ private: }; Text text_firmware { - { 0, 224, 240, 16 }, - "Git Commit hash " GIT_REVISION, + { 0, 128, 240, 16 }, + "Git Commit Hash " GIT_REVISION, }; Text text_cpld_hackrf { - { 0, 240, 240, 16 }, - "HackRF CPLD CRC 0x????????", + { 0, 144, 11*8, 16 }, + "HackRF CPLD", }; - Text text_cpld_portapack { - { 0, 256, 240, 16 }, - "PortaPack CPLD CRC 0x????????", + Text text_cpld_hackrf_status { + { 240 - 3*8, 144, 3*8, 16 }, + "???" }; Button button_ok { { 72, 272, 96, 24 }, "OK" }; + + MessageHandlerRegistration message_handler_update { + Message::ID::DisplayFrameSync, + [this](const Message* const) { + this->update(); + } + }; + + MessageHandlerRegistration message_handler_fifo_signal { + Message::ID::FIFOSignal, + [this](const Message* const p) { + FIFODataMessage datamessage; + const auto message = static_cast(p); + if (message->signaltype == 1) { + //debug_cnt++; + //if (debug_cnt == 250) for(;;) {} + this->render_audio(); + datamessage.data = ym_buffer; + EventDispatcher::send_message(datamessage); + } + } + }; + }; } /* namespace ui */ diff --git a/firmware/application/ui_afsksetup.cpp b/firmware/application/ui_afsksetup.cpp index 4b80b51b1..8862f048d 100644 --- a/firmware/application/ui_afsksetup.cpp +++ b/firmware/application/ui_afsksetup.cpp @@ -54,7 +54,6 @@ void AFSKSetupView::updfreq(rf::Frequency f) { char finalstr[9] = {0}; portapack::persistent_memory::set_tuned_frequency(f); - transmitter_model.set_tuning_frequency(f); auto mhz = to_string_dec_int(f / 1000000, 3); auto hz100 = to_string_dec_int((f / 100) % 10000, 4, '0'); @@ -106,7 +105,7 @@ AFSKSetupView::AFSKSetupView( field_repeat.set_value(rpt); button_setfreq.on_select = [this,&nav](Button&){ - auto new_view = nav.push(transmitter_model.tuning_frequency()); + auto new_view = nav.push(portapack::persistent_memory::tuned_frequency()); new_view->on_changed = [this](rf::Frequency f) { updfreq(f); }; diff --git a/firmware/application/ui_afsksetup.hpp b/firmware/application/ui_afsksetup.hpp index 5fcf8a256..d61835789 100644 --- a/firmware/application/ui_afsksetup.hpp +++ b/firmware/application/ui_afsksetup.hpp @@ -30,7 +30,6 @@ #include "rf_path.hpp" #include "max2837.hpp" #include "volume.hpp" -#include "transmitter_model.hpp" namespace ui { diff --git a/firmware/application/ui_closecall.cpp b/firmware/application/ui_closecall.cpp index 695cb7f8b..8596e6570 100644 --- a/firmware/application/ui_closecall.cpp +++ b/firmware/application/ui_closecall.cpp @@ -159,7 +159,7 @@ void CloseCallView::on_channel_spectrum(const ChannelSpectrum& spectrum) { uint8_t threshold; size_t i, m; - baseband::spectrum_streaming_stop; + baseband::spectrum_streaming_stop(); // Spectrum line (for debug) std::array pixel_row; @@ -228,35 +228,15 @@ void CloseCallView::on_channel_spectrum(const ChannelSpectrum& spectrum) { do_detection(); } - baseband::spectrum_streaming_start(1); + baseband::spectrum_streaming_start(); } void CloseCallView::on_show() { - EventDispatcher::message_map().register_handler(Message::ID::ChannelSpectrumConfig, - [this](const Message* const p) { - const auto message = *reinterpret_cast(p); - this->fifo = message.fifo; - } - ); - EventDispatcher::message_map().register_handler(Message::ID::DisplayFrameSync, - [this](const Message* const) { - if( this->fifo ) { - ChannelSpectrum channel_spectrum; - while( fifo->out(channel_spectrum) ) { - this->on_channel_spectrum(channel_spectrum); - } - } - } - ); - - baseband::spectrum_streaming_start(1); + baseband::spectrum_streaming_start(); } void CloseCallView::on_hide() { baseband::spectrum_streaming_stop(); - - EventDispatcher::message_map().unregister_handler(Message::ID::DisplayFrameSync); - EventDispatcher::message_map().unregister_handler(Message::ID::ChannelSpectrumConfig); } void CloseCallView::on_range_changed() { @@ -455,7 +435,7 @@ CloseCallView::CloseCallView( .decimation_factor = 1, }); receiver_model.set_baseband_bandwidth(CC_SLICE_WIDTH); - receiver_model.enable(); + //receiver_model.enable(); } } /* namespace ui */ diff --git a/firmware/application/ui_closecall.hpp b/firmware/application/ui_closecall.hpp index 6b43d6fa0..aa16b5c1a 100644 --- a/firmware/application/ui_closecall.hpp +++ b/firmware/application/ui_closecall.hpp @@ -166,6 +166,25 @@ private: { 92, 264, 56, 32 }, "Exit" }; + + MessageHandlerRegistration message_handler_spectrum_config { + Message::ID::ChannelSpectrumConfig, + [this](const Message* const p) { + const auto message = *reinterpret_cast(p); + this->fifo = message.fifo; + } + }; + MessageHandlerRegistration message_handler_frame_sync { + Message::ID::DisplayFrameSync, + [this](const Message* const) { + if( this->fifo ) { + ChannelSpectrum channel_spectrum; + while( fifo->out(channel_spectrum) ) { + this->on_channel_spectrum(channel_spectrum); + } + } + } + }; }; } /* namespace ui */ diff --git a/firmware/application/ui_handwrite.cpp b/firmware/application/ui_handwrite.cpp index 021988ad1..b972deaf0 100644 --- a/firmware/application/ui_handwrite.cpp +++ b/firmware/application/ui_handwrite.cpp @@ -376,20 +376,9 @@ void HandWriteView::sample_pen() { } void HandWriteView::on_show() { - // Use screen refresh rate as sampling frequency - EventDispatcher::message_map().unregister_handler(Message::ID::DisplayFrameSync); - EventDispatcher::message_map().register_handler(Message::ID::DisplayFrameSync, - [this](const Message* const) { - sample_pen(); - } - ); clear_zone(Color::black(), false); } -void HandWriteView::on_hide() { - EventDispatcher::message_map().unregister_handler(Message::ID::DisplayFrameSync); -} - char * HandWriteView::value() { return txtinput; } diff --git a/firmware/application/ui_handwrite.hpp b/firmware/application/ui_handwrite.hpp index 4a86a8056..c0db6e65d 100644 --- a/firmware/application/ui_handwrite.hpp +++ b/firmware/application/ui_handwrite.hpp @@ -41,7 +41,6 @@ public: void paint(Painter& painter) override; void on_show() override; - void on_hide() override; bool on_touch(const TouchEvent event) override; char * value(); @@ -89,6 +88,13 @@ private: void on_button(Button& button); void update_text(); + + MessageHandlerRegistration message_handler_sample { + Message::ID::DisplayFrameSync, + [this](const Message* const) { + this->sample_pen(); + } + }; }; } /* namespace ui */ diff --git a/firmware/application/ui_jammer.cpp b/firmware/application/ui_jammer.cpp index 0d9257bb7..2f86a4366 100644 --- a/firmware/application/ui_jammer.cpp +++ b/firmware/application/ui_jammer.cpp @@ -24,7 +24,7 @@ #include "ch.h" #include "evtimer.h" - +#include "baseband_api.hpp" #include "ff.h" #include "hackrf_gpio.hpp" #include "portapack.hpp" @@ -48,11 +48,8 @@ void JammerView::focus() { } JammerView::~JammerView() { - transmitter_model.disable(); -} - -void JammerView::paint(Painter& painter) { - (void)painter; + radio::disable(); + baseband::shutdown(); } void JammerView::updfreq(uint8_t id, rf::Frequency f) { @@ -147,10 +144,14 @@ void JammerView::updfreq(uint8_t id, rf::Frequency f) { } } -JammerView::JammerView( - NavigationView& nav -) -{ +void JammerView::on_retune(const int64_t freq) { + if (freq > 0) { + radio::set_tuning_frequency(freq); + } +} + +JammerView::JammerView(NavigationView& nav) { + baseband::run_image(portapack::spi_flash::image_tag_jammer); static constexpr Style style_val { .font = font::fixed_8x16, @@ -170,12 +171,6 @@ JammerView::JammerView( .foreground = Color::grey(), }; - transmitter_model.set_baseband_configuration({ - .mode = 6, - .sampling_rate = 1536000, // ? - .decimation_factor = 1, - }); - add_children({ { &text_type, &options_modulation, @@ -237,16 +232,6 @@ JammerView::JammerView( button_transmit.on_select = [this](Button&) { uint8_t i = 0; rf::Frequency t, range_lower; - EventDispatcher::message_map().unregister_handler(Message::ID::Retune); - - EventDispatcher::message_map().register_handler(Message::ID::Retune, - [this](Message* const p) { - const auto message = static_cast(p); - if (message->freq > 0) { - transmitter_model.set_tuning_frequency(message->freq); - } - } - ); for (i = 0; i < 16; i++) { shared_memory.jammer_ranges[i].active = false; @@ -327,18 +312,16 @@ JammerView::JammerView( } // } - transmitter_model.set_tuning_frequency(shared_memory.jammer_ranges[0].center); - if (jamming == true) { jamming = false; button_transmit.set_style(&style_val); button_transmit.set_text("START"); - transmitter_model.disable(); + radio::disable(); } else { jamming = true; button_transmit.set_style(&style_cancel); button_transmit.set_text("STOP"); - transmitter_model.enable(); + radio::disable(); } }; @@ -346,6 +329,16 @@ JammerView::JammerView( nav.pop(); }; + radio::enable({ + shared_memory.jammer_ranges[0].center, + 1536000, // ? + 2500000, // ? + rf::Direction::Transmit, + true, + static_cast(receiver_model.lna()), + static_cast(receiver_model.vga()), + 1, + }); } } /* namespace ui */ diff --git a/firmware/application/ui_jammer.hpp b/firmware/application/ui_jammer.hpp index af1fe2b13..479824405 100644 --- a/firmware/application/ui_jammer.hpp +++ b/firmware/application/ui_jammer.hpp @@ -30,7 +30,6 @@ #include "rf_path.hpp" #include "max2837.hpp" #include "volume.hpp" -#include "transmitter_model.hpp" namespace ui { @@ -41,9 +40,12 @@ public: void updfreq(uint8_t id, rf::Frequency f); void focus() override; - void paint(Painter& painter) override; + + std::string title() const override { return "Jammer"; }; private: + void on_retune(const int64_t freq); + rf::Frequency range1_min; rf::Frequency range1_max; rf::Frequency range2_min; @@ -253,6 +255,14 @@ private: { 21 * 8, 16 * 16, 64, 32 }, "Exit" }; + + MessageHandlerRegistration message_handler_retune { + Message::ID::Retune, + [this](Message* const p) { + const auto message = static_cast(p); + this->on_retune(message->freq); + } +}; }; } /* namespace ui */ diff --git a/firmware/application/ui_lcr.cpp b/firmware/application/ui_lcr.cpp index 95d4e795f..904e1fb2c 100644 --- a/firmware/application/ui_lcr.cpp +++ b/firmware/application/ui_lcr.cpp @@ -28,6 +28,7 @@ #include "ch.h" #include "ff.h" +#include "baseband_api.hpp" #include "hackrf_gpio.hpp" #include "portapack.hpp" #include "event_m0.hpp" @@ -51,7 +52,7 @@ void LCRView::focus() { } LCRView::~LCRView() { - transmitter_model.disable(); + radio::disable(); } void LCRView::make_frame() { @@ -216,6 +217,69 @@ void LCRView::paint(Painter& painter) { text_recap.set(finalstr); } +void LCRView::on_txdone(int n) { + char str[16]; + + if (abort_scan) { + text_status.set(" "); + strcpy(str, "Abort @"); + strcat(str, rgsb); + text_status.set(str); + progress.set_value(0); + radio::disable(); + txing = false; + scanning = false; + abort_scan = false; + button_scan.set_style(&style_val); + button_scan.set_text("SCAN"); + return; + } + + if (n > 0) { + if (scanning) { + scan_progress += 0.555f; + progress.set_value(scan_progress); + } else { + text_status.set(" "); + strcpy(str, to_string_dec_int(6 - n).c_str()); + strcat(str, "/5"); + text_status.set(str); + progress.set_value((6 - n) * 20); + } + } else { + if (scanning && (scan_index < 36)) { + radio::disable(); + + // Next address + strcpy(rgsb, RGSB_list[scan_index]); + make_frame(); + + memset(shared_memory.radio_data, 0, 256); + memcpy(shared_memory.radio_data, lcrframe_f, 256); + shared_memory.afsk_transmit_done = false; + shared_memory.afsk_repeat = 5; + + text_status.set(" "); + strcpy(str, to_string_dec_int(scan_index).c_str()); + strcat(str, "/36"); + text_status.set(str); + scan_progress += 0.694f; + progress.set_value(scan_progress); + + scan_index++; + radio::disable(); + } else { + text_status.set("Ready "); + progress.set_value(0); + radio::disable(); + txing = false; + scanning = false; + button_scan.set_style(&style_val); + button_scan.set_text("SCAN"); + } + } +} + void LCRView::start_tx() { char str[16]; @@ -226,7 +290,7 @@ void LCRView::start_tx() { make_frame(); - transmitter_model.set_tuning_frequency(portapack::persistent_memory::tuned_frequency()); + lcr_radio_config.tuning_frequency = portapack::persistent_memory::tuned_frequency(); shared_memory.afsk_samples_per_bit = 228000 / portapack::persistent_memory::afsk_bitrate(); shared_memory.afsk_phase_inc_mark = portapack::persistent_memory::afsk_mark_freq() * (0x40000 * 256) / 2280; @@ -244,74 +308,6 @@ void LCRView::start_tx() { shared_memory.afsk_transmit_done = false; shared_memory.afsk_repeat = 5; //(portapack::persistent_memory::afsk_config() >> 8) & 0xFF; - - EventDispatcher::message_map().unregister_handler(Message::ID::TXDone); - - EventDispatcher::message_map().register_handler(Message::ID::TXDone, - [this](Message* const p) { - char str[16]; - - if (abort_scan) { - text_status.set(" "); - strcpy(str, "Abort @"); - strcat(str, rgsb); - text_status.set(str); - progress.set_value(0); - transmitter_model.disable(); - txing = false; - scanning = false; - abort_scan = false; - button_scan.set_style(&style_val); - button_scan.set_text("SCAN"); - return; - } - - const auto message = static_cast(p); - if (message->n > 0) { - if (scanning) { - scan_progress += 0.555f; - progress.set_value(scan_progress); - } else { - text_status.set(" "); - strcpy(str, to_string_dec_int(6 - message->n).c_str()); - strcat(str, "/5"); - text_status.set(str); - progress.set_value((6 - message->n) * 20); - } - } else { - if (scanning && (scan_index < 36)) { - transmitter_model.disable(); - - // Next address - strcpy(rgsb, RGSB_list[scan_index]); - make_frame(); - - memset(shared_memory.radio_data, 0, 256); - memcpy(shared_memory.radio_data, lcrframe_f, 256); - shared_memory.afsk_transmit_done = false; - shared_memory.afsk_repeat = 5; - - text_status.set(" "); - strcpy(str, to_string_dec_int(scan_index).c_str()); - strcat(str, "/36"); - text_status.set(str); - scan_progress += 0.694f; - progress.set_value(scan_progress); - - scan_index++; - transmitter_model.enable(); - } else { - text_status.set("Ready "); - progress.set_value(0); - transmitter_model.disable(); - txing = false; - scanning = false; - button_scan.set_style(&style_val); - button_scan.set_text("SCAN"); - } - } - } - ); if (scanning) { text_status.set(" "); @@ -327,18 +323,11 @@ void LCRView::start_tx() { } txing = true; - transmitter_model.enable(); + radio::enable(lcr_radio_config); } -LCRView::LCRView( - NavigationView& nav -) -{ - transmitter_model.set_baseband_configuration({ - .mode = 3, - .sampling_rate = 2280000, - .decimation_factor = 1, - }); +LCRView::LCRView(NavigationView& nav) { + baseband::run_image(portapack::spi_flash::image_tag_lcr); memset(litteral, 0, 5 * 8); memset(rgsb, 0, 5); diff --git a/firmware/application/ui_lcr.hpp b/firmware/application/ui_lcr.hpp index 2a7ef479f..8d455fa25 100644 --- a/firmware/application/ui_lcr.hpp +++ b/firmware/application/ui_lcr.hpp @@ -73,6 +73,18 @@ private: void make_frame(); void start_tx(); + void on_txdone(int n); + + radio::Configuration lcr_radio_config = { + 0, + 2280000, // ? + 2500000, // ? + rf::Direction::Transmit, + true, + 0, + 0, + 1, + }; // 2: 94 ? // 9: 85 ? @@ -113,12 +125,12 @@ private: }; OptionsField options_ec { - { 20 * 8, 1 * 16 }, - 4, + { 19 * 8, 6 }, + 7, { - { "Auto", 0 }, - { "Jour", 1 }, - { "Nuit", 2 } + { "EC:Auto", 0 }, + { "EC:Jour", 1 }, + { "EC:Nuit", 2 } } }; @@ -206,6 +218,14 @@ private: { 160, 270, 64, 32 }, "CLEAR" }; + + MessageHandlerRegistration message_handler_tx_done { + Message::ID::TXDone, + [this](const Message* const p) { + const auto message = *reinterpret_cast(p); + this->on_txdone(message.n); + } + }; }; } /* namespace ui */ diff --git a/firmware/application/ui_loadmodule.cpp b/firmware/application/ui_loadmodule.cpp index 60f80f7ce..43ca9f9c2 100644 --- a/firmware/application/ui_loadmodule.cpp +++ b/firmware/application/ui_loadmodule.cpp @@ -54,11 +54,6 @@ void LoadModuleView::focus() { button_ok.focus(); } -void LoadModuleView::on_hide() { - EventDispatcher::message_map().unregister_handler(Message::ID::ReadyForSwitch); - EventDispatcher::message_map().unregister_handler(Message::ID::ModuleID); -} - void LoadModuleView::on_show() { char md5_signature[16]; uint8_t c; @@ -129,9 +124,7 @@ int LoadModuleView::load_image() { } void LoadModuleView::loadmodule() { - //message_map.unregister_handler(Message::ID::ReadyForSwitch); - - m4_switch(_hash); + //baseband::shutdown(); /*EventDispatcher::message_map().register_handler(Message::ID::ReadyForSwitch, [this](Message* const p) { diff --git a/firmware/application/ui_loadmodule.hpp b/firmware/application/ui_loadmodule.hpp index 275ec4aba..3f727cf04 100644 --- a/firmware/application/ui_loadmodule.hpp +++ b/firmware/application/ui_loadmodule.hpp @@ -49,7 +49,6 @@ public: void loadmodule(); void on_show() override; - void on_hide() override; void focus() override; private: diff --git a/firmware/application/ui_navigation.cpp b/firmware/application/ui_navigation.cpp index 29a5dc321..a90f39d61 100644 --- a/firmware/application/ui_navigation.cpp +++ b/firmware/application/ui_navigation.cpp @@ -20,7 +20,7 @@ */ #include "ui_navigation.hpp" -#include "ui_loadmodule.hpp" +//#include "ui_loadmodule.hpp" #include "modules.h" @@ -38,6 +38,16 @@ #include "ui_closecall.hpp" // DEBUG #include "ui_freqman.hpp" // DEBUG +#include "ui_setup.hpp" +#include "ui_debug.hpp" +#include "ui_rds.hpp" +#include "ui_xylos.hpp" +#include "ui_epar.hpp" +#include "ui_lcr.hpp" +#include "analog_audio_app.hpp" +#include "ui_audiotx.hpp" +#include "ui_jammer.hpp" + #include "analog_audio_app.hpp" #include "ais_app.hpp" #include "ert_app.hpp" @@ -230,16 +240,16 @@ ReceiverMenuView::ReceiverMenuView(NavigationView& nav) { SystemMenuView::SystemMenuView(NavigationView& nav) { add_items<12>({ { { "Play dead", ui::Color::red(), [&nav](){ nav.push(false); } }, - { "Receiver RX", ui::Color::cyan(), [&nav](){ nav.push(md5_baseband, Receiver); } }, - { "Close Call RX", ui::Color::cyan(), [&nav](){ nav.push(md5_baseband, CloseCall); } }, - { "Pokemon GO Away TX", ui::Color::blue(), [&nav](){ nav.push(md5_baseband_tx, Jammer); } }, + { "Receiver RX", ui::Color::cyan(), [&nav](){ nav.push(); } }, + { "Close Call RX", ui::Color::cyan(), [&nav](){ nav.push(); } }, + { "Pokemon GO Away TX", ui::Color::blue(), [&nav](){ nav.push(); } }, //{ "Soundboard TX", ui::Color::yellow(), [&nav](){ nav.push(md5_baseband_tx, SoundBoard); } }, //{ "Audio TX", ui::Color::yellow(), [&nav](){ nav.push(md5_baseband_tx, AudioTX); } }, { "Frequency manager", ui::Color::white(), [&nav](){ nav.push(); } }, //{ "EPAR TX", ui::Color::green(), [&nav](){ nav.push(md5_baseband_tx, EPAR); } }, - { "Xylos TX", ui::Color::green(), [&nav](){ nav.push(md5_baseband_tx, Xylos); } }, - { "TEDI/LCR TX", ui::Color::orange(), [&nav](){ nav.push(md5_baseband_tx, LCR); } }, - { "RDS TX", ui::Color::yellow(), [&nav](){ nav.push(md5_baseband_tx, RDS); } }, + { "Xylos TX", ui::Color::green(), [&nav](){ nav.push(); } }, + { "TEDI/LCR TX", ui::Color::orange(), [&nav](){ nav.push(); } }, + { "RDS TX", ui::Color::yellow(), [&nav](){ nav.push(); } }, //{ "Capture", ui::Color::white(), [&nav](){ nav.push(); } }, //{ "Analyze", ui::Color::white(), [&nav](){ nav.push(); } }, { "Setup", ui::Color::white(), [&nav](){ nav.push(); } }, diff --git a/firmware/application/ui_rds.cpp b/firmware/application/ui_rds.cpp index 18a7a1ad0..df98a1c97 100644 --- a/firmware/application/ui_rds.cpp +++ b/firmware/application/ui_rds.cpp @@ -27,6 +27,7 @@ #include "hackrf_gpio.hpp" #include "portapack.hpp" #include "radio.hpp" +#include "baseband_api.hpp" #include "hackrf_hal.hpp" #include "portapack_shared_memory.hpp" @@ -42,7 +43,8 @@ void RDSView::focus() { } RDSView::~RDSView() { - transmitter_model.disable(); + radio::disable(); + baseband::shutdown(); } std::string to_string_bin(const uint32_t n, const uint8_t l) { @@ -213,15 +215,8 @@ void RDSView::paint(Painter& painter) { text_radiotextb.set(&RadioText[16]); } -RDSView::RDSView( - NavigationView& nav -) -{ - transmitter_model.set_baseband_configuration({ - .mode = 5, - .sampling_rate = 2280000, - .decimation_factor = 1, - }); +RDSView::RDSView(NavigationView& nav) { + baseband::run_image(portapack::spi_flash::image_tag_rds); strcpy(PSN, "TEST1234"); strcpy(RadioText, "Radiotext test !"); @@ -242,10 +237,10 @@ RDSView::RDSView( &button_exit } }); - field_frequency.set_value(transmitter_model.tuning_frequency()); + rds_radio_config.tuning_frequency = tuning_frequency; field_frequency.set_step(100000); field_frequency.on_edit = [this, &nav]() { - auto new_view = nav.push(transmitter_model.tuning_frequency()); + auto new_view = nav.push(tuning_frequency); new_view->on_changed = [this](rf::Frequency f) { this->field_frequency.set_value(f); }; @@ -260,16 +255,16 @@ RDSView::RDSView( }; button_txpsn.on_select = [this](Button&){ if (txing) { - transmitter_model.disable(); + radio::disable(); button_txpsn.set_text("PSN"); button_txradiotext.set_text("Radiotext"); txing = false; } else { gen_PSN(PSN); - transmitter_model.set_tuning_frequency(field_frequency.value()); + rds_radio_config.tuning_frequency = tuning_frequency; button_txpsn.set_text("STOP"); txing = true; - transmitter_model.enable(); + radio::disable(); } }; @@ -278,16 +273,16 @@ RDSView::RDSView( }; button_txradiotext.on_select = [this](Button&){ if (txing) { - transmitter_model.disable(); + radio::disable(); button_txpsn.set_text("PSN"); button_txradiotext.set_text("Radiotext"); txing = false; } else { gen_RadioText(RadioText); - transmitter_model.set_tuning_frequency(field_frequency.value()); + rds_radio_config.tuning_frequency = tuning_frequency; button_txradiotext.set_text("STOP"); txing = true; - transmitter_model.enable(); + radio::enable(rds_radio_config); } }; diff --git a/firmware/application/ui_rds.hpp b/firmware/application/ui_rds.hpp index 07686e829..0440465e7 100644 --- a/firmware/application/ui_rds.hpp +++ b/firmware/application/ui_rds.hpp @@ -54,6 +54,7 @@ private: char PSN[9]; char RadioText[25]; bool txing = false; + int64_t tuning_frequency = 92200000; // TODO: CHANGE ! uint8_t b2b(const bool in); @@ -64,6 +65,17 @@ private: const bool MS, const bool DI, const uint8_t C, const char * chars); void make_2A_group(uint32_t group[], const uint16_t PI_code, const bool TP, const uint8_t PTY, const bool AB, const bool segment, const char * chars); + + radio::Configuration rds_radio_config = { + 0, + 2280000, // ? + 2500000, // ? + rf::Direction::Transmit, + true, + 0, + 0, + 1, + }; FrequencyField field_frequency { { 1 * 8, 1 * 16 }, diff --git a/firmware/application/ui_setup.cpp b/firmware/application/ui_setup.cpp index a44602ebe..ea448d12c 100644 --- a/firmware/application/ui_setup.cpp +++ b/firmware/application/ui_setup.cpp @@ -27,8 +27,11 @@ using namespace lpc43xx; #include "portapack.hpp" using portapack::receiver_model; +using namespace portapack; -#include "cpld_update.hpp" +#include "string_format.hpp" +#include "portapack_persistent_memory.hpp" +#include "ui_font_fixed_8x16.hpp" namespace ui { @@ -169,28 +172,6 @@ void AntennaBiasSetupView::focus() { button_done.focus(); } -AboutView::AboutView(NavigationView& nav) { - add_children({ { - &text_title, - &text_firmware, - &text_cpld_hackrf, - &text_cpld_hackrf_status, - &button_ok, - } }); - - button_ok.on_select = [&nav](Button&){ nav.pop(); }; - - if( cpld_hackrf_verify_eeprom() ) { - text_cpld_hackrf_status.set(" OK"); - } else { - text_cpld_hackrf_status.set("BAD"); - } -} - -void AboutView::focus() { - button_ok.focus(); -} - void SetTouchCalibView::focus() { button_ok.focus(); } @@ -464,7 +445,7 @@ SetupMenuView::SetupMenuView(NavigationView& nav) { { "Date/Time", ui::Color::white(), [&nav](){ nav.push(); } }, { "Frequency correction", ui::Color::white(), [&nav](){ nav.push(); } }, { "Antenna Bias Voltage", ui::Color::white(), [&nav](){ nav.push(); } }, - { "Touch screen", ui::Color::white(), [&nav](){ nav.push(); } }, + { "Touch screen", ui::Color::white(), [&nav](){ nav.push(); } }, { "Play dead", ui::Color::red(), [&nav](){ nav.push(); } } } }); on_left = [&nav](){ nav.pop(); }; diff --git a/firmware/application/ui_setup.hpp b/firmware/application/ui_setup.hpp index 12acb0df0..ba116e1b2 100644 --- a/firmware/application/ui_setup.hpp +++ b/firmware/application/ui_setup.hpp @@ -25,6 +25,7 @@ #include "ui_widget.hpp" #include "ui_menu.hpp" #include "ui_navigation.hpp" +#include "ff.h" #include @@ -246,39 +247,6 @@ private: }; }; -class AboutView : public View { -public: - AboutView(NavigationView& nav); - - void focus() override; - -private: - Text text_title { - { 100, 96, 40, 16 }, - "About", - }; - - Text text_firmware { - { 0, 128, 240, 16 }, - "Git Commit Hash " GIT_REVISION, - }; - - Text text_cpld_hackrf { - { 0, 144, 11*8, 16 }, - "HackRF CPLD", - }; - - Text text_cpld_hackrf_status { - { 240 - 3*8, 144, 3*8, 16 }, - "???" - }; - - Button button_ok { - { 72, 192, 96, 24 }, - "OK" - }; -}; - class SetUIView : public View { public: SetUIView(NavigationView& nav); diff --git a/firmware/application/ui_xylos.cpp b/firmware/application/ui_xylos.cpp index 53e03888a..3ef118439 100644 --- a/firmware/application/ui_xylos.cpp +++ b/firmware/application/ui_xylos.cpp @@ -32,6 +32,7 @@ #include "hackrf_gpio.hpp" #include "portapack.hpp" #include "radio.hpp" +#include "baseband_api.hpp" #include "hackrf_hal.hpp" #include "portapack_shared_memory.hpp" @@ -117,11 +118,8 @@ void XylosView::focus() { } XylosView::~XylosView() { - transmitter_model.disable(); -} - -void XylosView::paint(Painter& painter) { - (void)painter; + receiver_model.disable(); + baseband::shutdown(); } void XylosView::upd_message() { @@ -187,23 +185,98 @@ void XylosView::upd_message() { void XylosView::start_tx() { upd_message(); - audio::headphone::set_volume(volume_t::decibel(90 - 99) + audio::headphone::volume_range().max); - shared_memory.transmit_done = false; - memcpy(shared_memory.xylosdata, ccirmessage, 21); - transmitter_model.enable(); -} - -XylosView::XylosView( - NavigationView& nav -) -{ - int c; - + //audio::headphone::set_volume(volume_t::decibel(90 - 99) + audio::headphone::volume_range().max); transmitter_model.set_baseband_configuration({ - .mode = 2, - .sampling_rate = 1536000, + .mode = 0, + .sampling_rate = 1536000U, .decimation_factor = 1, }); + transmitter_model.set_rf_amp(true); + transmitter_model.set_baseband_bandwidth(1750000); + transmitter_model.enable(); + + baseband::set_xylos_data(ccirmessage); +} + +void XylosView::on_txdone(const int n) { + int c, sr; + + if (testing == true) { + if (n == 25) { + transmitter_model.disable(); + + if (sequence_idx != 9) { + chThdSleepMilliseconds(15000); + memcpy(ccirmessage, &xylos_sequence[sequence_idx][0], 21); + // ASCII to frequency LUT index + for (c=0; c<20; c++) { + if (ccirmessage[c] > '9') + ccirmessage[c] -= 0x37; + else + ccirmessage[c] -= 0x30; + } + ccirmessage[20] = 0xFF; + //memcpy(shared_memory.xylosdata, ccirmessage, 21); TODO !!! + + sequence_idx++; + txing = true; + transmitter_model.enable(); + } else { + button_txtest.set_style(&style()); + button_txtest.set_text("TEST"); + testing = false; + } + } + } else { + if (n == 25) { + audio::headphone::set_volume(volume_t::decibel(0 - 99) + audio::headphone::volume_range().max); + transmitter_model.disable(); + progress.set_value(0); + + if (inc_cnt) { + chThdSleepMilliseconds(1000); + header_code_b.set_value(header_code_b.value() + 1); + + upd_message(); + start_tx(); + + inc_cnt--; + } else { + header_code_b.set_value(header_init); + if (checkbox_cligno.value() == false) { + txing = false; + button_transmit.set_style(&style_val); + button_transmit.set_text("START"); + } else { + if (checkbox_hinc.value()) + inc_cnt = 3; + else + inc_cnt = 0; + + chThdSleepMilliseconds(tempo_cligno.value() * 1000); + + // Invert relay states + sr = options_ra.selected_index(); + if (sr > 0) options_ra.set_selected_index(sr ^ 3); + sr = options_rb.selected_index(); + if (sr > 0) options_rb.set_selected_index(sr ^ 3); + sr = options_rc.selected_index(); + if (sr > 0) options_rc.set_selected_index(sr ^ 3); + sr = options_rd.selected_index(); + if (sr > 0) options_rd.set_selected_index(sr ^ 3); + + upd_message(); + start_tx(); + } + } + } else { + progress.set_value((n + 1) * 5); + } + } +} + +XylosView::XylosView(NavigationView& nav) { + baseband::run_image(portapack::spi_flash::image_tag_xylos); add_children({ { &checkbox_hinc, @@ -366,38 +439,6 @@ XylosView::XylosView( if (txing == false) { sequence_idx = 0; - EventDispatcher::message_map().unregister_handler(Message::ID::TXDone); - - EventDispatcher::message_map().register_handler(Message::ID::TXDone, - [this](Message* const p) { - int c; - const auto message = static_cast(p); - if (message->n == 25) { - transmitter_model.disable(); - - if (sequence_idx != 9) { - chThdSleepMilliseconds(15000); - memcpy(ccirmessage, &xylos_sequence[sequence_idx][0], 21); - // ASCII to frequency LUT index - for (c=0; c<20; c++) { - if (ccirmessage[c] > '9') - ccirmessage[c] -= 0x37; - else - ccirmessage[c] -= 0x30; - } - ccirmessage[20] = 0xFF; - shared_memory.transmit_done = false; - memcpy(shared_memory.xylosdata, ccirmessage, 21); - sequence_idx++; - txing = true; - transmitter_model.enable(); - } else { - button_txtest.set_style(&style()); - button_txtest.set_text("TEST"); - } - } - } - ); memcpy(ccirmessage, &xylos_sequence[sequence_idx][0], 21); // ASCII to frequency LUT index @@ -408,14 +449,14 @@ XylosView::XylosView( ccirmessage[c] -= 0x30; } ccirmessage[20] = 0xFF; - shared_memory.transmit_done = false; - memcpy(shared_memory.xylosdata, ccirmessage, 21); + //memcpy(shared_memory.xylosdata, ccirmessage, 21); TODO !!! sequence_idx++; - + transmitter_model.set_tuning_frequency(xylos_freqs[options_freq.selected_index()]); txing = true; + testing = true; button_txtest.set_style(&style_cancel); button_txtest.set_text("Wait"); transmitter_model.enable(); @@ -433,70 +474,18 @@ XylosView::XylosView( inc_cnt = 0; header_init = header_code_b.value(); - EventDispatcher::message_map().unregister_handler(Message::ID::TXDone); - - EventDispatcher::message_map().register_handler(Message::ID::TXDone, - [this](Message* const p) { - uint8_t sr; - const auto message = static_cast(p); - if (message->n == 25) { - audio::headphone::set_volume(volume_t::decibel(0 - 99) + audio::headphone::volume_range().max); - transmitter_model.disable(); - progress.set_value(0); - - if (inc_cnt) { - chThdSleepMilliseconds(1000); - header_code_b.set_value(header_code_b.value() + 1); - - upd_message(); - start_tx(); - - inc_cnt--; - } else { - header_code_b.set_value(header_init); - if (checkbox_cligno.value() == false) { - txing = false; - button_transmit.set_style(&style_val); - button_transmit.set_text("START"); - } else { - if (checkbox_hinc.value()) - inc_cnt = 3; - else - inc_cnt = 0; - - chThdSleepMilliseconds(tempo_cligno.value() * 1000); - - // Invert relay states - sr = options_ra.selected_index(); - if (sr > 0) options_ra.set_selected_index(sr ^ 3); - sr = options_rb.selected_index(); - if (sr > 0) options_rb.set_selected_index(sr ^ 3); - sr = options_rc.selected_index(); - if (sr > 0) options_rc.set_selected_index(sr ^ 3); - sr = options_rd.selected_index(); - if (sr > 0) options_rd.set_selected_index(sr ^ 3); - - upd_message(); - start_tx(); - } - } - } else { - progress.set_value((message->n + 1) * 5); - } - } - ); - - shared_memory.transmit_done = false; - memcpy(shared_memory.xylosdata, ccirmessage, 21); + //shared_memory.transmit_done = false; + //memcpy(shared_memory.xylosdata, ccirmessage, 21); transmitter_model.set_tuning_frequency(xylos_freqs[options_freq.selected_index()]); audio::headphone::set_volume(volume_t::decibel(90 - 99) + audio::headphone::volume_range().max); txing = true; + testing = false; button_transmit.set_style(&style_cancel); button_transmit.set_text("Wait"); - transmitter_model.enable(); + start_tx(); } }; } diff --git a/firmware/application/ui_xylos.hpp b/firmware/application/ui_xylos.hpp index ce819f85c..7acd9846e 100644 --- a/firmware/application/ui_xylos.hpp +++ b/firmware/application/ui_xylos.hpp @@ -148,12 +148,12 @@ public: std::string title() const override { return "Xylos transmit"; }; void focus() override; - void paint(Painter& painter) override; private: int inc_cnt; int header_init; bool txing = false; + bool testing = false; const rf::Frequency xylos_freqs[7] = { 31325000, 31387500, 31437500, 31475000, 31687500, 31975000, 88000000 }; char ccirmessage[21]; @@ -173,6 +173,7 @@ private: void start_tx(); void upd_message(); + void on_txdone(const int n); const Style style_val { .font = font::fixed_8x16, @@ -363,6 +364,14 @@ private: { 20 * 8, 16 * 16, 64, 32 }, "TEST" }; + + MessageHandlerRegistration message_handler_tx_done { + Message::ID::TXDone, + [this](const Message* const p) { + const auto message = *reinterpret_cast(p); + this->on_txdone(message.n); + } + }; }; } /* namespace ui */ diff --git a/firmware/baseband-tx/Makefile b/firmware/baseband-tx/Makefile deleted file mode 100755 index b1eb38e82..000000000 --- a/firmware/baseband-tx/Makefile +++ /dev/null @@ -1,288 +0,0 @@ - -# -# Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. -# -# This file is part of PortaPack. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, -# Boston, MA 02110-1301, USA. -# - -############################################################################## -# Build global options -# NOTE: Can be overridden externally. -# - -# Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -mthumb \ - -O3 -ggdb3 \ - -ffunction-sections \ - -fdata-sections \ - -fno-builtin \ - -falign-functions=16 \ - -fno-math-errno \ - --specs=nano.specs - #-fomit-frame-pointer -endif - -# C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -std=gnu99 -endif - -# C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -std=c++11 -fno-rtti -fno-exceptions -endif - -# Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif - -# Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif - -# Enable this if you want link time optimizations (LTO) -ifeq ($(USE_LTO),) - USE_LTO = no -endif - -# If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif - -# Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif - -# -# Build global options -############################################################################## - -############################################################################## -# Architecture or project specific options -# - -# Enables the use of FPU on Cortex-M4 (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = hard -endif - -# -# Architecture or project specific options -############################################################################## - -############################################################################## -# Project, sources and paths -# - -# Define project name here -PROJECT = baseband-tx - -# Imported source files and paths -CHIBIOS = ../chibios -CHIBIOS_PORTAPACK = ../chibios-portapack -include $(CHIBIOS_PORTAPACK)/boards/GSG_HACKRF_ONE/board.mk -include $(CHIBIOS_PORTAPACK)/os/hal/platforms/LPC43xx_M4/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS_PORTAPACK)/os/ports/GCC/ARMCMx/LPC43xx_M4/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk - -include $(CHIBIOS)/test/test.mk - -# Define linker script file here -LDSCRIPT= $(PORTLD)/LPC43xx_M4.ld - -# C sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) - - -# C++ sources that can be compiled in ARM or THUMB mode depending on the global -# setting. -CPPSRC = main.cpp \ - message_queue.cpp \ - event.cpp \ - event_m4.cpp \ - thread_wait.cpp \ - gpdma.cpp \ - baseband_dma.cpp \ - baseband_sgpio.cpp \ - portapack_shared_memory.cpp \ - baseband_thread.cpp \ - baseband_processor.cpp \ - baseband_stats_collector.cpp \ - dsp_decimate.cpp \ - dsp_demodulate.cpp \ - matched_filter.cpp \ - proc_jammer.cpp \ - proc_audiotx.cpp \ - proc_fsk_lcr.cpp \ - proc_epar.cpp \ - proc_playaudio.cpp \ - proc_xylos.cpp \ - proc_rds.cpp \ - dsp_squelch.cpp \ - clock_recovery.cpp \ - packet_builder.cpp \ - dsp_fft.cpp \ - dsp_fir_taps.cpp \ - dsp_iir.cpp \ - fxpt_atan2.cpp \ - rssi.cpp \ - rssi_dma.cpp \ - rssi_thread.cpp \ - audio_compressor.cpp \ - audio_output.cpp \ - audio_dma.cpp \ - audio_stats_collector.cpp \ - touch_dma.cpp \ - ../common/utility.cpp \ - ../common/chibios_cpp.cpp \ - ../common/debug.cpp \ - ../common/gcc.cpp - -# C sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACSRC = - -# C++ sources to be compiled in ARM mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -ACPPSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCSRC = - -# C sources to be compiled in THUMB mode regardless of the global setting. -# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler -# option that results in lower performance and larger code size. -TCPPSRC = - -# List ASM source files here -ASMSRC = $(PORTASM) - -INCDIR = ../common $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various - -# -# Project, sources and paths -############################################################################## - -############################################################################## -# Compiler settings -# - -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = /usr/local/gcc-arm-none-eabi-5_2-2015q4/bin/arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -#LD = $(TRGT)gcc -LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -SZ = $(TRGT)size -HEX = $(CP) -O ihex -BIN = $(CP) -O binary - -# ARM-specific options here -AOPT = - -# THUMB-specific options here -TOPT = -mthumb -DTHUMB - -# Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes - -# Define C++ warning options here -CPPWARN = -Wall -Wextra - -# -# Compiler settings -############################################################################## - -############################################################################## -# Start of default section -# - -# List all default C defines here, like -D_DEBUG=1 -# TODO: Switch -DCRT0_INIT_DATA depending on load from RAM or SPIFI? -# NOTE: _RANDOM_TCC to kill a GCC 4.9.3 error with std::max argument types -DDEFS = -DLPC43XX -DLPC43XX_M4 -D__NEWLIB__ -DHACKRF_ONE \ - -DTOOLCHAIN_GCC -DTOOLCHAIN_GCC_ARM -D_RANDOM_TCC=0 \ - -DGIT_REVISION=\"$(GIT_REVISION)\" - -# List all default ASM defines here, like -D_DEBUG=1 -DADEFS = - -# List all default directories to look for include files here -DINCDIR = - -# List the default directory to look for the libraries here -DLIBDIR = - -# List all default libraries here -DLIBS = - -# -# End of default section -############################################################################## - -############################################################################## -# Start of user section -# - -# List all user C define here, like -D_DEBUG=1 -UDEFS = - -# Define ASM defines here -UADEFS = - -# List all user directories here -UINCDIR = - -# List the user directory to look for the libraries here -ULIBDIR = - -# List all user libraries here -ULIBS = - -# -# End of user defines -############################################################################## - -RULESPATH = $(CHIBIOS)/os/ports/GCC/ARMCMx -include $(RULESPATH)/rules.mk diff --git a/firmware/baseband-tx/audio_compressor.cpp b/firmware/baseband-tx/audio_compressor.cpp deleted file mode 100644 index 95bbaee30..000000000 --- a/firmware/baseband-tx/audio_compressor.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "audio_compressor.hpp" - -float GainComputer::operator()(const float x) const { - const auto abs_x = std::abs(x); - const auto db = (abs_x < lin_floor) ? db_floor : log2_db_k * fast_log2(abs_x); - const auto overshoot_db = db - threshold_db; - if( knee_width_db > 0.0f ) { - const auto w2 = knee_width_db / 2.0f; - const auto a = w2 / (knee_width_db * knee_width_db); - const auto in_transition = (overshoot_db > -w2) && (overshoot_db < w2); - const auto rectified_overshoot = in_transition ? (a * std::pow(overshoot_db + w2, 2.0f)) : std::max(overshoot_db, 0.0f); - return rectified_overshoot * slope; - } else { - const auto rectified_overshoot = std::max(overshoot_db, 0.0f); - return rectified_overshoot * slope; - } -} - -void FeedForwardCompressor::execute_in_place(const buffer_f32_t& buffer) { - constexpr float makeup_gain = std::pow(10.0f, (threshold - (threshold / ratio)) / -20.0f); - for(size_t i=0; i - -/* Code based on article in Journal of the Audio Engineering Society - * Vol. 60, No. 6, 2012 June, by Dimitrios Giannoulis, Michael Massberg, - * Joshua D. Reiss "Digital Dynamic Range Compressor Design – A Tutorial - * and Analysis" - */ - -class GainComputer { -public: - constexpr GainComputer( - float ratio, - float threshold - ) : ratio { ratio }, - slope { 1.0f / ratio - 1.0f }, - threshold_db { threshold } - { - } - - float operator()(const float x) const; - -private: - const float ratio; - const float slope; - const float threshold_db; - - static constexpr float knee_width_db = 0.0f; - - static constexpr float db_floor = -120.0f; - static constexpr float lin_floor = std::pow(10.0f, db_floor / 20.0f); - static constexpr float log2_db_k = 20.0f * std::log10(2.0f); -}; - -class PeakDetectorBranchingSmooth { -public: - constexpr PeakDetectorBranchingSmooth( - float att_a, - float rel_a - ) : att_a { att_a }, - rel_a { rel_a } - { - } - - float operator()(const float db) { - const auto a = (db > state) ? att_a : rel_a; - state = db + a * (state - db); - return state; - } - -private: - float state { 0.0f }; - const float att_a; - const float rel_a; -}; - -class FeedForwardCompressor { -public: - void execute_in_place(const buffer_f32_t& buffer); - -private: - static constexpr float fs = 12000.0f; - static constexpr float ratio = 10.0f; - static constexpr float threshold = -30.0f; - - GainComputer gain_computer { ratio, threshold }; - PeakDetectorBranchingSmooth peak_detector { tau_alpha(0.010f, fs), tau_alpha(0.300f, fs) }; - - float execute_once(const float x); - - static constexpr float tau_alpha(const float tau, const float fs) { - return std::exp(-1.0f / (tau * fs)); - } -}; - -#endif/*__AUDIO_COMPRESSOR_H__*/ diff --git a/firmware/baseband-tx/audio_dma.cpp b/firmware/baseband-tx/audio_dma.cpp deleted file mode 100644 index 60e85096e..000000000 --- a/firmware/baseband-tx/audio_dma.cpp +++ /dev/null @@ -1,238 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "audio_dma.hpp" - -#include -#include -#include - -#include "hal.h" -#include "gpdma.hpp" - -using namespace lpc43xx; - -#include "portapack_dma.hpp" - -namespace audio { -namespace dma { - -constexpr uint32_t gpdma_ahb_master_peripheral = 1; -constexpr uint32_t gpdma_ahb_master_memory = 0; -constexpr uint32_t gpdma_ahb_master_lli_fetch = 0; - -constexpr uint32_t gpdma_rx_peripheral = 0x9; /* I2S0 DMA request 1 */ -constexpr uint32_t gpdma_rx_src_peripheral = gpdma_rx_peripheral; -constexpr uint32_t gpdma_rx_dest_peripheral = gpdma_rx_peripheral; - -constexpr uint32_t gpdma_tx_peripheral = 0xa; /* I2S0 DMA request 2 */ -constexpr uint32_t gpdma_tx_src_peripheral = gpdma_tx_peripheral; -constexpr uint32_t gpdma_tx_dest_peripheral = gpdma_tx_peripheral; - -constexpr gpdma::channel::LLIPointer lli_pointer(const void* lli) { - return { - .lm = gpdma_ahb_master_lli_fetch, - .r = 0, - .lli = reinterpret_cast(lli), - }; -} - -constexpr gpdma::channel::Control control_tx(const size_t transfer_bytes) { - return { - .transfersize = gpdma::buffer_words(transfer_bytes, 4), - .sbsize = 4, /* Burst size: 32 */ - .dbsize = 4, /* Burst size: 32 */ - .swidth = 2, /* Source transfer width: word (32 bits) */ - .dwidth = 2, /* Destination transfer width: word (32 bits) */ - .s = gpdma_ahb_master_memory, - .d = gpdma_ahb_master_peripheral, - .si = 1, - .di = 0, - .prot1 = 0, - .prot2 = 0, - .prot3 = 0, - .i = 1, - }; -} - -constexpr gpdma::channel::Config config_tx() { - return { - .e = 0, - .srcperipheral = gpdma_tx_src_peripheral, - .destperipheral = gpdma_tx_dest_peripheral, - .flowcntrl = gpdma::FlowControl::MemoryToPeripheral_DMAControl, - .ie = 1, - .itc = 1, - .l = 0, - .a = 0, - .h = 0, - }; -} - -constexpr gpdma::channel::Control control_rx(const size_t transfer_bytes) { - return { - .transfersize = gpdma::buffer_words(transfer_bytes, 4), - .sbsize = 4, /* Burst size: 32 */ - .dbsize = 4, /* Burst size: 32 */ - .swidth = 2, /* Source transfer width: word (32 bits) */ - .dwidth = 2, /* Destination transfer width: word (32 bits) */ - .s = gpdma_ahb_master_peripheral, - .d = gpdma_ahb_master_memory, - .si = 0, - .di = 1, - .prot1 = 0, - .prot2 = 0, - .prot3 = 0, - .i = 1, - }; -} - -constexpr gpdma::channel::Config config_rx() { - return { - .e = 0, - .srcperipheral = gpdma_rx_src_peripheral, - .destperipheral = gpdma_rx_dest_peripheral, - .flowcntrl = gpdma::FlowControl::PeripheralToMemory_DMAControl, - .ie = 1, - .itc = 1, - .l = 0, - .a = 0, - .h = 0, - }; -} - -/* TODO: Clean up terminology around "buffer", "transfer", "samples" */ - -constexpr size_t buffer_samples_log2n = 7; -constexpr size_t buffer_samples = (1 << buffer_samples_log2n); -constexpr size_t transfers_per_buffer_log2n = 2; -constexpr size_t transfers_per_buffer = (1 << transfers_per_buffer_log2n); -constexpr size_t transfer_samples = buffer_samples / transfers_per_buffer; -constexpr size_t transfers_mask = transfers_per_buffer - 1; - -constexpr size_t buffer_bytes = buffer_samples * sizeof(sample_t); -constexpr size_t transfer_bytes = transfer_samples * sizeof(sample_t); - -static std::array buffer_tx; -static std::array buffer_rx; - -static std::array lli_tx_loop; -static std::array lli_rx_loop; - -static constexpr auto& gpdma_channel_i2s0_tx = gpdma::channels[portapack::i2s0_tx_gpdma_channel_number]; -static constexpr auto& gpdma_channel_i2s0_rx = gpdma::channels[portapack::i2s0_rx_gpdma_channel_number]; - -static volatile const gpdma::channel::LLI* tx_next_lli = nullptr; -static volatile const gpdma::channel::LLI* rx_next_lli = nullptr; - -static void tx_transfer_complete() { - tx_next_lli = gpdma_channel_i2s0_tx.next_lli(); -} - -static void tx_error() { - disable(); -} - -static void rx_transfer_complete() { - rx_next_lli = gpdma_channel_i2s0_rx.next_lli(); -} - -static void rx_error() { - disable(); -} - -void init() { - gpdma_channel_i2s0_tx.set_handlers(tx_transfer_complete, tx_error); - gpdma_channel_i2s0_rx.set_handlers(rx_transfer_complete, rx_error); - - // LPC_GPDMA->SYNC |= (1 << gpdma_rx_peripheral); - // LPC_GPDMA->SYNC |= (1 << gpdma_tx_peripheral); -} - -static void configure_tx() { - const auto peripheral = reinterpret_cast(&LPC_I2S0->TXFIFO); - const auto control_value = control_tx(transfer_bytes); - for(size_t i=0; i(&buffer_tx[i * transfer_samples]); - lli_tx_loop[i].srcaddr = memory; - lli_tx_loop[i].destaddr = peripheral; - lli_tx_loop[i].lli = lli_pointer(&lli_tx_loop[(i + 1) % lli_tx_loop.size()]); - lli_tx_loop[i].control = control_value; - } -} - -static void configure_rx() { - const auto peripheral = reinterpret_cast(&LPC_I2S0->RXFIFO); - const auto control_value = control_rx(transfer_bytes); - for(size_t i=0; i(&buffer_rx[i * transfer_samples]); - lli_rx_loop[i].srcaddr = peripheral; - lli_rx_loop[i].destaddr = memory; - lli_rx_loop[i].lli = lli_pointer(&lli_rx_loop[(i + 1) % lli_rx_loop.size()]); - lli_rx_loop[i].control = control_value; - } -} - -void configure() { - configure_tx(); - configure_rx(); -} - -void enable() { - const auto gpdma_config_tx = config_tx(); - const auto gpdma_config_rx = config_rx(); - - gpdma_channel_i2s0_tx.configure(lli_tx_loop[0], gpdma_config_tx); - gpdma_channel_i2s0_rx.configure(lli_rx_loop[0], gpdma_config_rx); - - gpdma_channel_i2s0_tx.enable(); - gpdma_channel_i2s0_rx.enable(); -} - -void disable() { - gpdma_channel_i2s0_tx.disable(); - gpdma_channel_i2s0_rx.disable(); -} - -buffer_t tx_empty_buffer() { - const auto next_lli = tx_next_lli; - if( next_lli ) { - const size_t next_index = next_lli - &lli_tx_loop[0]; - const size_t free_index = (next_index + transfers_per_buffer - 2) & transfers_mask; - return { reinterpret_cast(lli_tx_loop[free_index].srcaddr), transfer_samples }; - } else { - return { nullptr, 0 }; - } -} - -buffer_t rx_empty_buffer() { - const auto next_lli = rx_next_lli; - if( next_lli ) { - const size_t next_index = next_lli - &lli_rx_loop[0]; - const size_t free_index = (next_index + transfers_per_buffer - 2) & transfers_mask; - return { reinterpret_cast(lli_rx_loop[free_index].srcaddr), transfer_samples }; - } else { - return { nullptr, 0 }; - } -} - -} /* namespace dma */ -} /* namespace audio */ diff --git a/firmware/baseband-tx/audio_dma.hpp b/firmware/baseband-tx/audio_dma.hpp deleted file mode 100644 index 863a4f396..000000000 --- a/firmware/baseband-tx/audio_dma.hpp +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __AUDIO_DMA_H__ -#define __AUDIO_DMA_H__ - -#include - -#include "buffer.hpp" - -namespace audio { - -struct sample_t { - union { - struct { - int16_t left; - int16_t right; - }; - uint32_t raw; - }; -}; - -using buffer_t = buffer_t; - -namespace dma { - -void init(); -void configure(); -void enable(); -void disable(); - -audio::buffer_t tx_empty_buffer(); -audio::buffer_t rx_empty_buffer(); - -} /* namespace dma */ -} /* namespace audio */ - -#endif/*__AUDIO_DMA_H__*/ diff --git a/firmware/baseband-tx/audio_output.cpp b/firmware/baseband-tx/audio_output.cpp deleted file mode 100644 index 8bb1520ac..000000000 --- a/firmware/baseband-tx/audio_output.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "audio_output.hpp" - -#include "portapack_shared_memory.hpp" - -#include "audio_dma.hpp" - -#include "message.hpp" - -#include -#include -#include - -void AudioOutput::configure( - const iir_biquad_config_t& hpf_config, - const iir_biquad_config_t& deemph_config, - const float squelch_threshold -) { - hpf.configure(hpf_config); - deemph.configure(deemph_config); - squelch.set_threshold(squelch_threshold); -} - -void AudioOutput::write( - const buffer_s16_t& audio -) { - std::array audio_f; - for(size_t i=0; ion_block(buffer); - } - ); -} - -void AudioOutput::on_block( - const buffer_f32_t& audio -) { - const auto audio_present_now = squelch.execute(audio); - - hpf.execute_in_place(audio); - deemph.execute_in_place(audio); - - audio_present_history = (audio_present_history << 1) | (audio_present_now ? 1 : 0); - const bool audio_present = (audio_present_history != 0); - - if( !audio_present ) { - for(size_t i=0; i audio_int; - - auto audio_buffer = audio::dma::tx_empty_buffer(); - for(size_t i=0; iwrite(audio_int.data(), audio_buffer.count * sizeof(audio_int[0])); - } - - feed_audio_stats(audio); -} - -void AudioOutput::feed_audio_stats(const buffer_f32_t& audio) { - audio_stats.feed( - audio, - [](const AudioStatistics& statistics) { - const AudioStatisticsMessage audio_stats_message { statistics }; - shared_memory.application_queue.push(audio_stats_message); - } - ); -} diff --git a/firmware/baseband-tx/audio_output.hpp b/firmware/baseband-tx/audio_output.hpp deleted file mode 100644 index 6462e061f..000000000 --- a/firmware/baseband-tx/audio_output.hpp +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __AUDIO_OUTPUT_H__ -#define __AUDIO_OUTPUT_H__ - -#include "dsp_types.hpp" - -#include "dsp_iir.hpp" -#include "dsp_squelch.hpp" - -#include "stream_input.hpp" -#include "block_decimator.hpp" -#include "audio_stats_collector.hpp" - -#include -#include - -class AudioOutput { -public: - void configure( - const iir_biquad_config_t& hpf_config, - const iir_biquad_config_t& deemph_config = iir_config_passthrough, - const float squelch_threshold = 0.0f - ); - - void write(const buffer_s16_t& audio); - void write(const buffer_f32_t& audio); - - void set_stream(std::unique_ptr new_stream) { - stream = std::move(new_stream); - } - -private: - static constexpr float k = 32768.0f; - static constexpr float ki = 1.0f / k; - - BlockDecimator block_buffer { 1 }; - - IIRBiquadFilter hpf; - IIRBiquadFilter deemph; - FMSquelch squelch; - - std::unique_ptr stream; - - AudioStatsCollector audio_stats; - - uint64_t audio_present_history = 0; - - void on_block(const buffer_f32_t& audio); - void fill_audio_buffer(const buffer_f32_t& audio, const bool send_to_fifo); - void feed_audio_stats(const buffer_f32_t& audio); -}; - -#endif/*__AUDIO_OUTPUT_H__*/ diff --git a/firmware/baseband-tx/audio_stats_collector.cpp b/firmware/baseband-tx/audio_stats_collector.cpp deleted file mode 100644 index 53fceea80..000000000 --- a/firmware/baseband-tx/audio_stats_collector.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "audio_stats_collector.hpp" - -#include "utility.hpp" - -void AudioStatsCollector::consume_audio_buffer(const buffer_f32_t& src) { - auto src_p = src.p; - const auto src_end = &src.p[src.count]; - while(src_p < src_end) { - const auto sample = *(src_p++); - const auto sample_squared = sample * sample; - squared_sum += sample_squared; - if( sample_squared > max_squared ) { - max_squared = sample_squared; - } - } -} - -bool AudioStatsCollector::update_stats(const size_t sample_count, const size_t sampling_rate) { - count += sample_count; - - const size_t samples_per_update = sampling_rate * update_interval; - - if( count >= samples_per_update ) { - statistics.rms_db = mag2_to_dbv_norm(squared_sum / count); - statistics.max_db = mag2_to_dbv_norm(max_squared); - statistics.count = count; - - squared_sum = 0; - max_squared = 0; - count = 0; - - return true; - } else { - return false; - } -} - -bool AudioStatsCollector::feed(const buffer_f32_t& src) { - consume_audio_buffer(src); - - return update_stats(src.count, src.sampling_rate); -} - -bool AudioStatsCollector::mute(const size_t sample_count, const size_t sampling_rate) { - return update_stats(sample_count, sampling_rate); -} diff --git a/firmware/baseband-tx/audio_stats_collector.hpp b/firmware/baseband-tx/audio_stats_collector.hpp deleted file mode 100644 index 10e17edc6..000000000 --- a/firmware/baseband-tx/audio_stats_collector.hpp +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __AUDIO_STATS_COLLECTOR_H__ -#define __AUDIO_STATS_COLLECTOR_H__ - -#include "dsp_types.hpp" -#include "message.hpp" - -#include -#include - -class AudioStatsCollector { -public: - template - void feed(const buffer_f32_t& src, Callback callback) { - if( feed(src) ) { - callback(statistics); - } - } - - template - void mute(const size_t sample_count, const size_t sampling_rate, Callback callback) { - if( mute(sample_count, sampling_rate) ) { - callback(statistics); - } - } - -private: - static constexpr float update_interval { 0.1f }; - float squared_sum { 0 }; - float max_squared { 0 }; - size_t count { 0 }; - - AudioStatistics statistics; - - void consume_audio_buffer(const buffer_f32_t& src); - - bool update_stats(const size_t sample_count, const size_t sampling_rate); - - bool feed(const buffer_f32_t& src); - bool mute(const size_t sample_count, const size_t sampling_rate); -}; - -#endif/*__AUDIO_STATS_COLLECTOR_H__*/ diff --git a/firmware/baseband-tx/baseband_dma.cpp b/firmware/baseband-tx/baseband_dma.cpp deleted file mode 100644 index c44ace814..000000000 --- a/firmware/baseband-tx/baseband_dma.cpp +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "baseband_dma.hpp" - -#include -#include -#include - -#include "hal.h" -#include "gpdma.hpp" - -using namespace lpc43xx; - -#include "portapack_dma.hpp" - -#include "thread_wait.hpp" - -namespace baseband { -namespace dma { - -constexpr uint32_t gpdma_ahb_master_sgpio = 0; -constexpr uint32_t gpdma_ahb_master_memory = 1; -constexpr uint32_t gpdma_ahb_master_lli_fetch = 0; - -constexpr uint32_t gpdma_src_peripheral = 0x0; -constexpr uint32_t gpdma_dest_peripheral = 0x0; - -constexpr gpdma::channel::LLIPointer lli_pointer(const void* lli) { - return { - .lm = gpdma_ahb_master_lli_fetch, - .r = 0, - .lli = reinterpret_cast(lli), - }; -} - -constexpr gpdma::channel::Control control(const baseband::Direction direction, const size_t buffer_words) { - return { - .transfersize = buffer_words, - .sbsize = 0, /* Burst size: 1 */ - .dbsize = 0, /* Burst size: 1 */ - .swidth = 2, /* Source transfer width: word (32 bits) */ - .dwidth = 2, /* Destination transfer width: word (32 bits) */ - .s = (direction == baseband::Direction::Transmit) ? gpdma_ahb_master_memory : gpdma_ahb_master_sgpio, - .d = (direction == baseband::Direction::Transmit) ? gpdma_ahb_master_sgpio : gpdma_ahb_master_memory, - .si = (direction == baseband::Direction::Transmit) ? 1U : 0U, - .di = (direction == baseband::Direction::Transmit) ? 0U : 1U, - .prot1 = 0, - .prot2 = 0, - .prot3 = 0, - .i = 1, - }; -} - -constexpr gpdma::channel::Config config(const baseband::Direction direction) { - return { - .e = 0, - .srcperipheral = gpdma_src_peripheral, - .destperipheral = gpdma_dest_peripheral, - .flowcntrl = (direction == baseband::Direction::Transmit) - ? gpdma::FlowControl::MemoryToPeripheral_DMAControl - : gpdma::FlowControl::PeripheralToMemory_DMAControl, - .ie = 1, - .itc = 1, - .l = 0, - .a = 0, - .h = 0, - }; -} - -constexpr size_t buffer_samples_log2n = 13; -constexpr size_t buffer_samples = (1 << buffer_samples_log2n); -constexpr size_t transfers_per_buffer_log2n = 2; -constexpr size_t transfers_per_buffer = (1 << transfers_per_buffer_log2n); -constexpr size_t transfer_samples = buffer_samples / transfers_per_buffer; -constexpr size_t transfers_mask = transfers_per_buffer - 1; - -constexpr size_t buffer_bytes = buffer_samples * sizeof(baseband::sample_t); -constexpr size_t transfer_bytes = transfer_samples * sizeof(baseband::sample_t); - -constexpr size_t msg_count = transfers_per_buffer - 1; - -static std::array lli_loop; -static constexpr auto& gpdma_channel_sgpio = gpdma::channels[portapack::sgpio_gpdma_channel_number]; - -static ThreadWait thread_wait; - -static void transfer_complete() { - const auto next_lli_index = gpdma_channel_sgpio.next_lli() - &lli_loop[0]; - thread_wait.wake_from_interrupt(next_lli_index); -} - -static void dma_error() { - thread_wait.wake_from_interrupt(-1); - disable(); -} - -void init() { - gpdma_channel_sgpio.set_handlers(transfer_complete, dma_error); - - // LPC_GPDMA->SYNC |= (1 << gpdma_src_peripheral); - // LPC_GPDMA->SYNC |= (1 << gpdma_dest_peripheral); -} - -void configure( - baseband::sample_t* const buffer_base, - const baseband::Direction direction -) { - const auto peripheral = reinterpret_cast(&LPC_SGPIO->REG_SS[0]); - const auto control_value = control(direction, gpdma::buffer_words(transfer_bytes, 4)); - for(size_t i=0; i(&buffer_base[i * transfer_samples]); - lli_loop[i].srcaddr = (direction == Direction::Transmit) ? memory : peripheral; - lli_loop[i].destaddr = (direction == Direction::Transmit) ? peripheral : memory; - lli_loop[i].lli = lli_pointer(&lli_loop[(i + 1) % lli_loop.size()]); - lli_loop[i].control = control_value; - } -} - -void enable(const baseband::Direction direction) { - const auto gpdma_config = config(direction); - gpdma_channel_sgpio.configure(lli_loop[0], gpdma_config); - gpdma_channel_sgpio.enable(); -} - -bool is_enabled() { - return gpdma_channel_sgpio.is_enabled(); -} - -void disable() { - gpdma_channel_sgpio.disable(); -} - -baseband::buffer_t wait_for_rx_buffer() { - const auto next_index = thread_wait.sleep(); - - if( next_index >= 0 ) { - const size_t free_index = (next_index + transfers_per_buffer - 2) & transfers_mask; - return { reinterpret_cast(lli_loop[free_index].destaddr), transfer_samples }; - } else { - return { }; - } -} - -baseband::buffer_t wait_for_tx_buffer() { - const auto next_index = thread_wait.sleep(); - - if( next_index >= 0 ) { - const size_t free_index = (next_index + transfers_per_buffer - 2) & transfers_mask; - return { reinterpret_cast(lli_loop[free_index].srcaddr), transfer_samples }; - } else { - return { }; - } -} - -} /* namespace dma */ -} /* namespace baseband */ diff --git a/firmware/baseband-tx/baseband_dma.hpp b/firmware/baseband-tx/baseband_dma.hpp deleted file mode 100644 index 99e32de8c..000000000 --- a/firmware/baseband-tx/baseband_dma.hpp +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __BASEBAND_DMA_H__ -#define __BASEBAND_DMA_H__ - -#include -#include - -#include "complex.hpp" -#include "baseband.hpp" - -namespace baseband { -namespace dma { - -using Handler = void (*)(); - -void init(); -void configure( - baseband::sample_t* const buffer_base, - const baseband::Direction direction -); - -void enable(const baseband::Direction direction); -bool is_enabled(); - -void disable(); - -baseband::buffer_t wait_for_rx_buffer(); -baseband::buffer_t wait_for_tx_buffer(); - -} /* namespace dma */ -} /* namespace baseband */ - -#endif/*__BASEBAND_DMA_H__*/ diff --git a/firmware/baseband-tx/baseband_processor.cpp b/firmware/baseband-tx/baseband_processor.cpp deleted file mode 100644 index 4113dec5b..000000000 --- a/firmware/baseband-tx/baseband_processor.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "baseband_processor.hpp" - -#include "portapack_shared_memory.hpp" - -#include "message.hpp" - -void BasebandProcessor::feed_channel_stats(const buffer_c16_t& channel) { - channel_stats.feed( - channel, - [](const ChannelStatistics& statistics) { - const ChannelStatisticsMessage channel_stats_message { statistics }; - shared_memory.application_queue.push(channel_stats_message); - } - ); -} diff --git a/firmware/baseband-tx/baseband_processor.hpp b/firmware/baseband-tx/baseband_processor.hpp deleted file mode 100644 index 28ef5063f..000000000 --- a/firmware/baseband-tx/baseband_processor.hpp +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __BASEBAND_PROCESSOR_H__ -#define __BASEBAND_PROCESSOR_H__ - -#include "dsp_types.hpp" - -#include "channel_stats_collector.hpp" - -#include "message.hpp" - -class BasebandProcessor { -public: - virtual ~BasebandProcessor() = default; - - virtual void execute(const buffer_c8_t& buffer) = 0; - - virtual void on_message(const Message* const) { }; - -protected: - void feed_channel_stats(const buffer_c16_t& channel); - -private: - ChannelStatsCollector channel_stats; -}; - -#endif/*__BASEBAND_PROCESSOR_H__*/ diff --git a/firmware/baseband-tx/baseband_stats_collector.cpp b/firmware/baseband-tx/baseband_stats_collector.cpp deleted file mode 100644 index 8eec12c5e..000000000 --- a/firmware/baseband-tx/baseband_stats_collector.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "baseband_stats_collector.hpp" - -#include "lpc43xx_cpp.hpp" - -bool BasebandStatsCollector::process(const buffer_c8_t& buffer) { - samples += buffer.count; - - const size_t report_samples = buffer.sampling_rate * report_interval; - const auto report_delta = samples - samples_last_report; - return report_delta >= report_samples; -} - -BasebandStatistics BasebandStatsCollector::capture_statistics() { - BasebandStatistics statistics; - - const auto idle_ticks = thread_idle->total_ticks; - statistics.idle_ticks = (idle_ticks - last_idle_ticks); - last_idle_ticks = idle_ticks; - - const auto main_ticks = thread_main->total_ticks; - statistics.main_ticks = (main_ticks - last_main_ticks); - last_main_ticks = main_ticks; - - const auto rssi_ticks = thread_rssi->total_ticks; - statistics.rssi_ticks = (rssi_ticks - last_rssi_ticks); - last_rssi_ticks = rssi_ticks; - - const auto baseband_ticks = thread_baseband->total_ticks; - statistics.baseband_ticks = (baseband_ticks - last_baseband_ticks); - last_baseband_ticks = baseband_ticks; - - statistics.saturation = lpc43xx::m4::flag_saturation(); - lpc43xx::m4::clear_flag_saturation(); - - samples_last_report = samples; - - return statistics; -} diff --git a/firmware/baseband-tx/baseband_stats_collector.hpp b/firmware/baseband-tx/baseband_stats_collector.hpp deleted file mode 100644 index b628a8b2b..000000000 --- a/firmware/baseband-tx/baseband_stats_collector.hpp +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __BASEBAND_STATS_COLLECTOR_H__ -#define __BASEBAND_STATS_COLLECTOR_H__ - -#include "ch.h" - -#include "dsp_types.hpp" -#include "message.hpp" - -#include -#include - -class BasebandStatsCollector { -public: - BasebandStatsCollector( - const Thread* const thread_idle, - const Thread* const thread_main, - const Thread* const thread_rssi, - const Thread* const thread_baseband - ) : thread_idle { thread_idle }, - thread_main { thread_main }, - thread_rssi { thread_rssi }, - thread_baseband { thread_baseband } - { - } - - template - void process(const buffer_c8_t& buffer, Callback callback) { - if( process(buffer) ) { - callback(capture_statistics()); - } - } - -private: - static constexpr float report_interval { 1.0f }; - size_t samples { 0 }; - size_t samples_last_report { 0 }; - const Thread* const thread_idle; - uint32_t last_idle_ticks { 0 }; - const Thread* const thread_main; - uint32_t last_main_ticks { 0 }; - const Thread* const thread_rssi; - uint32_t last_rssi_ticks { 0 }; - const Thread* const thread_baseband; - uint32_t last_baseband_ticks { 0 }; - - bool process(const buffer_c8_t& buffer); - BasebandStatistics capture_statistics(); -}; - -#endif/*__BASEBAND_STATS_COLLECTOR_H__*/ diff --git a/firmware/baseband-tx/baseband_thread.cpp b/firmware/baseband-tx/baseband_thread.cpp deleted file mode 100644 index 6256afb86..000000000 --- a/firmware/baseband-tx/baseband_thread.cpp +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "baseband_thread.hpp" - -#include "dsp_types.hpp" - -#include "baseband.hpp" -#include "baseband_stats_collector.hpp" -#include "baseband_sgpio.hpp" -#include "baseband_dma.hpp" - -#include "proc_playaudio.hpp" -#include "proc_audiotx.hpp" -#include "proc_xylos.hpp" -#include "proc_epar.hpp" -#include "proc_fsk_lcr.hpp" -#include "proc_rds.hpp" -#include "proc_jammer.hpp" - -#include "rssi.hpp" -#include "i2s.hpp" - -#include "portapack_shared_memory.hpp" - -#include - -static baseband::SGPIO baseband_sgpio; - -WORKING_AREA(baseband_thread_wa, 4096); - -Thread* BasebandThread::start(const tprio_t priority) { - return chThdCreateStatic(baseband_thread_wa, sizeof(baseband_thread_wa), - priority, ThreadBase::fn, - this - ); -} - -void BasebandThread::set_configuration(const BasebandConfiguration& new_configuration) { - if( new_configuration.mode != baseband_configuration.mode ) { - disable(); - - // TODO: Timing problem around disabling DMA and nulling and deleting old processor - auto old_p = baseband_processor; - baseband_processor = nullptr; - delete old_p; - - baseband_processor = create_processor(new_configuration.mode); - - enable(); - } - - baseband_configuration = new_configuration; -} - -void BasebandThread::on_message(const Message* const message) { - if( message->id == Message::ID::BasebandConfiguration ) { - set_configuration(reinterpret_cast(message)->configuration); - } else { - if( baseband_processor ) { - baseband_processor->on_message(message); - } - } -} - -void BasebandThread::run() { - baseband_sgpio.init(); - baseband::dma::init(); - - const auto baseband_buffer = std::make_unique>(); - baseband::dma::configure( - baseband_buffer->data(), - baseband::Direction::Transmit - ); - //baseband::dma::allocate(4, 2048); - - BasebandStatsCollector stats { - chSysGetIdleThread(), - thread_main, - thread_rssi, - chThdSelf() - }; - - while(true) { - // TODO: Place correct sampling rate into buffer returned here: - const auto buffer_tmp = baseband::dma::wait_for_tx_buffer(); - if( buffer_tmp ) { - buffer_c8_t buffer { - buffer_tmp.p, buffer_tmp.count, baseband_configuration.sampling_rate - }; - - if( baseband_processor ) { - baseband_processor->execute(buffer); - } - - stats.process(buffer, - [](const BasebandStatistics& statistics) { - const BasebandStatisticsMessage message { statistics }; - shared_memory.application_queue.push(message); - } - ); - } - } -} - -BasebandProcessor* BasebandThread::create_processor(const int32_t mode) { - switch(mode) { - case 0: return new PlayAudioProcessor(); - case 1: return new AudioTXProcessor(); - case 2: return new XylosProcessor(); - case 3: return new LCRFSKProcessor(); - case 4: return new EPARProcessor(); - case 5: return new RDSProcessor(); - case 6: return new JammerProcessor(); - default: return nullptr; - } -} - -void BasebandThread::disable() { - if( baseband_processor ) { - i2s::i2s0::tx_mute(); - baseband::dma::disable(); - baseband_sgpio.streaming_disable(); - rf::rssi::stop(); - } -} - -void BasebandThread::enable() { - if( baseband_processor ) { - baseband_sgpio.configure(baseband::Direction::Transmit); - baseband::dma::enable(baseband::Direction::Transmit); - baseband_sgpio.streaming_enable(); - } -} diff --git a/firmware/baseband-tx/baseband_thread.hpp b/firmware/baseband-tx/baseband_thread.hpp deleted file mode 100644 index bc3bf4918..000000000 --- a/firmware/baseband-tx/baseband_thread.hpp +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __BASEBAND_THREAD_H__ -#define __BASEBAND_THREAD_H__ - -#include "thread_base.hpp" -#include "message.hpp" -#include "baseband_processor.hpp" - -#include - -class BasebandThread : public ThreadBase { -public: - Thread* start(const tprio_t priority); - - void on_message(const Message* const message); - - void wait_for_switch(void); - - Thread* thread_main { nullptr }; - Thread* thread_rssi { nullptr }; - -private: - BasebandProcessor* baseband_processor { nullptr }; - - BasebandConfiguration baseband_configuration; - - void run() override; - - BasebandProcessor* create_processor(const int32_t mode); - - void disable(); - void enable(); - - void set_configuration(const BasebandConfiguration& new_configuration); -}; - -#endif/*__BASEBAND_THREAD_H__*/ diff --git a/firmware/baseband-tx/block_decimator.hpp b/firmware/baseband-tx/block_decimator.hpp deleted file mode 100644 index 7782dc371..000000000 --- a/firmware/baseband-tx/block_decimator.hpp +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __BLOCK_DECIMATOR_H__ -#define __BLOCK_DECIMATOR_H__ - -#include -#include -#include - -#include "dsp_types.hpp" -#include "complex.hpp" - -template -class BlockDecimator { -public: - constexpr BlockDecimator( - const size_t factor - ) : factor_ { factor } - { - } - - void set_input_sampling_rate(const uint32_t new_sampling_rate) { - if( new_sampling_rate != input_sampling_rate() ) { - input_sampling_rate_ = new_sampling_rate; - reset_state(); - } - } - - uint32_t input_sampling_rate() const { - return input_sampling_rate_; - } - - void set_factor(const size_t new_factor) { - if( new_factor != factor() ) { - factor_ = new_factor; - reset_state(); - } - } - - size_t factor() const { - return factor_; - } - - uint32_t output_sampling_rate() const { - return input_sampling_rate() / factor(); - } - - template - void feed(const buffer_t& src, BlockCallback callback) { - /* NOTE: Input block size must be >= factor */ - - set_input_sampling_rate(src.sampling_rate); - - while( src_i < src.count ) { - buffer[dst_i++] = src.p[src_i]; - if( dst_i == buffer.size() ) { - callback({ buffer.data(), buffer.size(), output_sampling_rate() }); - reset_state(); - dst_i = 0; - } - - src_i += factor(); - } - - src_i -= src.count; - } - -private: - std::array buffer; - uint32_t input_sampling_rate_ { 0 }; - size_t factor_ { 1 }; - size_t src_i { 0 }; - size_t dst_i { 0 }; - - void reset_state() { - src_i = 0; - dst_i = 0; - } -}; - -#endif/*__BLOCK_DECIMATOR_H__*/ diff --git a/firmware/baseband-tx/channel_decimator.cpp b/firmware/baseband-tx/channel_decimator.cpp deleted file mode 100644 index c8a7cf5c8..000000000 --- a/firmware/baseband-tx/channel_decimator.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "channel_decimator.hpp" - -buffer_c16_t ChannelDecimator::execute_decimation(const buffer_c8_t& buffer) { - const buffer_c16_t work_baseband_buffer { - work_baseband.data(), - work_baseband.size() - }; - - const buffer_s16_t work_audio_buffer { - (int16_t*)work_baseband.data(), - sizeof(work_baseband) / sizeof(int16_t) - }; - - /* 3.072MHz complex[2048], [-128, 127] - * -> Shift by -fs/4 - * -> 3rd order CIC: -0.1dB @ 0.028fs, -1dB @ 0.088fs, -60dB @ 0.468fs - * -0.1dB @ 86kHz, -1dB @ 270kHz, -60dB @ 1.44MHz - * -> gain of 256 - * -> decimation by 2 - * -> 1.544MHz complex[1024], [-32768, 32512] */ - auto stage_0_out = execute_stage_0(buffer, work_baseband_buffer); - if( decimation_factor == DecimationFactor::By2 ) { - return stage_0_out; - } - - /* 1.536MHz complex[1024], [-32768, 32512] - * -> 3rd order CIC: -0.1dB @ 0.028fs, -1dB @ 0.088fs, -60dB @ 0.468fs - * -0.1dB @ 43kHz, -1dB @ 136kHz, -60dB @ 723kHz - * -> gain of 1 - * -> decimation by 2 - * -> 768kHz complex[512], [-8192, 8128] */ - auto cic_1_out = cic_1.execute(stage_0_out, work_baseband_buffer); - if( decimation_factor == DecimationFactor::By4 ) { - return cic_1_out; - } - - /* 768kHz complex[512], [-32768, 32512] - * -> 3rd order CIC decimation by 2, gain of 1 - * -> 384kHz complex[256], [-32768, 32512] */ - auto cic_2_out = cic_2.execute(cic_1_out, work_baseband_buffer); - if( decimation_factor == DecimationFactor::By8 ) { - return cic_2_out; - } - - /* 384kHz complex[256], [-32768, 32512] - * -> 3rd order CIC decimation by 2, gain of 1 - * -> 192kHz complex[128], [-32768, 32512] */ - auto cic_3_out = cic_3.execute(cic_2_out, work_baseband_buffer); - if( decimation_factor == DecimationFactor::By16 ) { - return cic_3_out; - } - - /* 192kHz complex[128], [-32768, 32512] - * -> 3rd order CIC decimation by 2, gain of 1 - * -> 96kHz complex[64], [-32768, 32512] */ - auto cic_4_out = cic_4.execute(cic_3_out, work_baseband_buffer); - - return cic_4_out; -} - -buffer_c16_t ChannelDecimator::execute_stage_0( - const buffer_c8_t& buffer, - const buffer_c16_t& work_baseband_buffer -) { - if( fs_over_4_downconvert ) { - return translate.execute(buffer, work_baseband_buffer); - } else { - return cic_0.execute(buffer, work_baseband_buffer); - } -} diff --git a/firmware/baseband-tx/channel_decimator.hpp b/firmware/baseband-tx/channel_decimator.hpp deleted file mode 100644 index 956964b07..000000000 --- a/firmware/baseband-tx/channel_decimator.hpp +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __CHANNEL_DECIMATOR_H__ -#define __CHANNEL_DECIMATOR_H__ - -#include "buffer.hpp" -#include "complex.hpp" - -#include "dsp_decimate.hpp" - -#include - -class ChannelDecimator { -public: - enum class DecimationFactor { - By2, - By4, - By8, - By16, - By32, - }; - - constexpr ChannelDecimator( - ) : decimation_factor { DecimationFactor::By32 }, - fs_over_4_downconvert { true } - { - } - - constexpr ChannelDecimator( - const DecimationFactor decimation_factor, - const bool fs_over_4_downconvert = true - ) : decimation_factor { decimation_factor }, - fs_over_4_downconvert { fs_over_4_downconvert } - { - } - - void set_decimation_factor(const DecimationFactor f) { - decimation_factor = f; - } - - buffer_c16_t execute(const buffer_c8_t& buffer) { - auto decimated = execute_decimation(buffer); - - return decimated; - } - -private: - std::array work_baseband; - - dsp::decimate::TranslateByFSOver4AndDecimateBy2CIC3 translate; - dsp::decimate::Complex8DecimateBy2CIC3 cic_0; - dsp::decimate::DecimateBy2CIC3 cic_1; - dsp::decimate::DecimateBy2CIC3 cic_2; - dsp::decimate::DecimateBy2CIC3 cic_3; - dsp::decimate::DecimateBy2CIC3 cic_4; - - DecimationFactor decimation_factor; - const bool fs_over_4_downconvert; - - buffer_c16_t execute_decimation(const buffer_c8_t& buffer); - - buffer_c16_t execute_stage_0( - const buffer_c8_t& buffer, - const buffer_c16_t& work_baseband_buffer - ); -}; - -#endif/*__CHANNEL_DECIMATOR_H__*/ diff --git a/firmware/baseband-tx/channel_stats_collector.hpp b/firmware/baseband-tx/channel_stats_collector.hpp deleted file mode 100644 index ca7d0eedb..000000000 --- a/firmware/baseband-tx/channel_stats_collector.hpp +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __CHANNEL_STATS_COLLECTOR_H__ -#define __CHANNEL_STATS_COLLECTOR_H__ - -#include "dsp_types.hpp" -#include "message.hpp" -#include "utility.hpp" - -#include -#include - -#include - -class ChannelStatsCollector { -public: - template - void feed(const buffer_c16_t& src, Callback callback) { - auto src_p = src.p; - while(src_p < &src.p[src.count]) { - const uint32_t sample = *__SIMD32(src_p)++; - const uint32_t mag_sq = __SMUAD(sample, sample); - if( mag_sq > max_squared ) { - max_squared = mag_sq; - } - } - count += src.count; - - const size_t samples_per_update = src.sampling_rate * update_interval; - - if( count >= samples_per_update ) { - const float max_squared_f = max_squared; - const int32_t max_db = mag2_to_dbv_norm(max_squared_f * (1.0f / (32768.0f * 32768.0f))); - callback({ max_db, count }); - - max_squared = 0; - count = 0; - } - } - -private: - static constexpr float update_interval { 0.1f }; - uint32_t max_squared { 0 }; - size_t count { 0 }; -}; - -#endif/*__CHANNEL_STATS_COLLECTOR_H__*/ diff --git a/firmware/baseband-tx/chconf.h b/firmware/baseband-tx/chconf.h deleted file mode 100755 index 0ad245292..000000000 --- a/firmware/baseband-tx/chconf.h +++ /dev/null @@ -1,546 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - Copyright (C) 2014 Jared Boone, ShareBrained Technology - - 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. -*/ - -/** - * @file templates/chconf.h - * @brief Configuration file template. - * @details A copy of this file must be placed in each project directory, it - * contains the application specific kernel settings. - * - * @addtogroup config - * @details Kernel related settings and hooks. - * @{ - */ - -#ifndef _CHCONF_H_ -#define _CHCONF_H_ - -/*===========================================================================*/ -/** - * @name Kernel parameters and options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief System tick frequency. - * @details Frequency of the system timer that drives the system ticks. This - * setting also defines the system tick time unit. - */ -#if !defined(CH_FREQUENCY) || defined(__DOXYGEN__) -#define CH_FREQUENCY 1000 -#endif - -/** - * @brief Round robin interval. - * @details This constant is the number of system ticks allowed for the - * threads before preemption occurs. Setting this value to zero - * disables the preemption for threads with equal priority and the - * round robin becomes cooperative. Note that higher priority - * threads can still preempt, the kernel is always preemptive. - * - * @note Disabling the round robin preemption makes the kernel more compact - * and generally faster. - */ -#if !defined(CH_TIME_QUANTUM) || defined(__DOXYGEN__) -#define CH_TIME_QUANTUM 0 -#endif - -/** - * @brief Managed RAM size. - * @details Size of the RAM area to be managed by the OS. If set to zero - * then the whole available RAM is used. The core memory is made - * available to the heap allocator and/or can be used directly through - * the simplified core memory allocator. - * - * @note In order to let the OS manage the whole RAM the linker script must - * provide the @p __heap_base__ and @p __heap_end__ symbols. - * @note Requires @p CH_USE_MEMCORE. - */ -#if !defined(CH_MEMCORE_SIZE) || defined(__DOXYGEN__) -#define CH_MEMCORE_SIZE 0 -#endif - -/** - * @brief Idle thread automatic spawn suppression. - * @details When this option is activated the function @p chSysInit() - * does not spawn the idle thread automatically. The application has - * then the responsibility to do one of the following: - * - Spawn a custom idle thread at priority @p IDLEPRIO. - * - Change the main() thread priority to @p IDLEPRIO then enter - * an endless loop. In this scenario the @p main() thread acts as - * the idle thread. - * . - * @note Unless an idle thread is spawned the @p main() thread must not - * enter a sleep state. - */ -#if !defined(CH_NO_IDLE_THREAD) || defined(__DOXYGEN__) -#define CH_NO_IDLE_THREAD FALSE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Performance options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief OS optimization. - * @details If enabled then time efficient rather than space efficient code - * is used when two possible implementations exist. - * - * @note This is not related to the compiler optimization options. - * @note The default is @p TRUE. - */ -#if !defined(CH_OPTIMIZE_SPEED) || defined(__DOXYGEN__) -#define CH_OPTIMIZE_SPEED TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Subsystem options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads registry APIs. - * @details If enabled then the registry APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY FALSE -#endif - -/** - * @brief Threads synchronization APIs. - * @details If enabled then the @p chThdWait() function is included in - * the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_WAITEXIT) || defined(__DOXYGEN__) -#define CH_USE_WAITEXIT TRUE -#endif - -/** - * @brief Semaphores APIs. - * @details If enabled then the Semaphores APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_SEMAPHORES) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES TRUE -#endif - -/** - * @brief Semaphores queuing mode. - * @details If enabled then the threads are enqueued on semaphores by - * priority rather than in FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMAPHORES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_SEMAPHORES_PRIORITY FALSE -#endif - -/** - * @brief Atomic semaphore API. - * @details If enabled then the semaphores the @p chSemSignalWait() API - * is included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_SEMSW) || defined(__DOXYGEN__) -#define CH_USE_SEMSW TRUE -#endif - -/** - * @brief Mutexes APIs. - * @details If enabled then the mutexes APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MUTEXES) || defined(__DOXYGEN__) -#define CH_USE_MUTEXES TRUE -#endif - -/** - * @brief Conditional Variables APIs. - * @details If enabled then the conditional variables APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MUTEXES. - */ -#if !defined(CH_USE_CONDVARS) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS TRUE -#endif - -/** - * @brief Conditional Variables APIs with timeout. - * @details If enabled then the conditional variables APIs with timeout - * specification are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_CONDVARS. - */ -#if !defined(CH_USE_CONDVARS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_CONDVARS_TIMEOUT TRUE -#endif - -/** - * @brief Events Flags APIs. - * @details If enabled then the event flags APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_EVENTS) || defined(__DOXYGEN__) -#define CH_USE_EVENTS TRUE -#endif - -/** - * @brief Events Flags APIs with timeout. - * @details If enabled then the events APIs with timeout specification - * are included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_EVENTS. - */ -#if !defined(CH_USE_EVENTS_TIMEOUT) || defined(__DOXYGEN__) -#define CH_USE_EVENTS_TIMEOUT TRUE -#endif - -/** - * @brief Synchronous Messages APIs. - * @details If enabled then the synchronous messages APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MESSAGES) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES TRUE -#endif - -/** - * @brief Synchronous Messages queuing mode. - * @details If enabled then messages are served by priority rather than in - * FIFO order. - * - * @note The default is @p FALSE. Enable this if you have special requirements. - * @note Requires @p CH_USE_MESSAGES. - */ -#if !defined(CH_USE_MESSAGES_PRIORITY) || defined(__DOXYGEN__) -#define CH_USE_MESSAGES_PRIORITY FALSE -#endif - -/** - * @brief Mailboxes APIs. - * @details If enabled then the asynchronous messages (mailboxes) APIs are - * included in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_SEMAPHORES. - */ -#if !defined(CH_USE_MAILBOXES) || defined(__DOXYGEN__) -#define CH_USE_MAILBOXES TRUE -#endif - -/** - * @brief I/O Queues APIs. - * @details If enabled then the I/O queues APIs are included in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_QUEUES) || defined(__DOXYGEN__) -#define CH_USE_QUEUES TRUE -#endif - -/** - * @brief Core Memory Manager APIs. - * @details If enabled then the core memory manager APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMCORE) || defined(__DOXYGEN__) -#define CH_USE_MEMCORE TRUE -#endif - -/** - * @brief Heap Allocator APIs. - * @details If enabled then the memory heap allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_MEMCORE and either @p CH_USE_MUTEXES or - * @p CH_USE_SEMAPHORES. - * @note Mutexes are recommended. - */ -#if !defined(CH_USE_HEAP) || defined(__DOXYGEN__) -#define CH_USE_HEAP TRUE -#endif - -/** - * @brief C-runtime allocator. - * @details If enabled the the heap allocator APIs just wrap the C-runtime - * @p malloc() and @p free() functions. - * - * @note The default is @p FALSE. - * @note Requires @p CH_USE_HEAP. - * @note The C-runtime may or may not require @p CH_USE_MEMCORE, see the - * appropriate documentation. - */ -#if !defined(CH_USE_MALLOC_HEAP) || defined(__DOXYGEN__) -#define CH_USE_MALLOC_HEAP FALSE -#endif - -/** - * @brief Memory Pools Allocator APIs. - * @details If enabled then the memory pools allocator APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - */ -#if !defined(CH_USE_MEMPOOLS) || defined(__DOXYGEN__) -#define CH_USE_MEMPOOLS TRUE -#endif - -/** - * @brief Dynamic Threads APIs. - * @details If enabled then the dynamic threads creation APIs are included - * in the kernel. - * - * @note The default is @p TRUE. - * @note Requires @p CH_USE_WAITEXIT. - * @note Requires @p CH_USE_HEAP and/or @p CH_USE_MEMPOOLS. - */ -#if !defined(CH_USE_DYNAMIC) || defined(__DOXYGEN__) -#define CH_USE_DYNAMIC TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Debug options - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Debug option, system state check. - * @details If enabled the correct call protocol for system APIs is checked - * at runtime. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_SYSTEM_STATE_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_SYSTEM_STATE_CHECK TRUE -#endif - -/** - * @brief Debug option, parameters checks. - * @details If enabled then the checks on the API functions input - * parameters are activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_CHECKS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_CHECKS TRUE -#endif - -/** - * @brief Debug option, consistency checks. - * @details If enabled then all the assertions in the kernel code are - * activated. This includes consistency checks inside the kernel, - * runtime anomalies and port-defined checks. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_ASSERTS) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_ASSERTS TRUE -#endif - -/** - * @brief Debug option, trace buffer. - * @details If enabled then the context switch circular trace buffer is - * activated. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_ENABLE_TRACE) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_TRACE FALSE -#endif - -/** - * @brief Debug option, stack checks. - * @details If enabled then a runtime stack check is performed. - * - * @note The default is @p FALSE. - * @note The stack check is performed in a architecture/port dependent way. - * It may not be implemented or some ports. - * @note The default failure mode is to halt the system with the global - * @p panic_msg variable set to @p NULL. - */ -#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__) -#define CH_DBG_ENABLE_STACK_CHECK TRUE -#endif - -/** - * @brief Debug option, stacks initialization. - * @details If enabled then the threads working area is filled with a byte - * value when a thread is created. This can be useful for the - * runtime measurement of the used stack. - * - * @note The default is @p FALSE. - */ -#if !defined(CH_DBG_FILL_THREADS) || defined(__DOXYGEN__) -#define CH_DBG_FILL_THREADS TRUE -#endif - -/** - * @brief Debug option, threads profiling. - * @details If enabled then a field is added to the @p Thread structure that - * counts the system ticks occurred while executing the thread. - * - * @note The default is @p TRUE. - * @note This debug option is defaulted to TRUE because it is required by - * some test cases into the test suite. - */ -#if !defined(CH_DBG_THREADS_PROFILING) || defined(__DOXYGEN__) -#define CH_DBG_THREADS_PROFILING TRUE -#endif - -/** @} */ - -/*===========================================================================*/ -/** - * @name Kernel hooks - * @{ - */ -/*===========================================================================*/ - -/** - * @brief Threads descriptor structure extension. - * @details User fields added to the end of the @p Thread structure. - */ -#if !defined(THREAD_EXT_FIELDS) || defined(__DOXYGEN__) -#define THREAD_EXT_FIELDS \ - /* Add threads custom fields here.*/ \ - uint32_t switches; \ - uint32_t start_ticks; \ - uint32_t total_ticks; -#endif - -/** - * @brief Threads initialization hook. - * @details User initialization code added to the @p chThdInit() API. - * - * @note It is invoked from within @p chThdInit() and implicitly from all - * the threads creation APIs. - */ -#if !defined(THREAD_EXT_INIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_INIT_HOOK(tp) { \ - /* Add threads initialization code here.*/ \ - tp->switches = 0; \ - tp->start_ticks = 0; \ - tp->total_ticks = 0; \ -} -#endif - -/** - * @brief Threads finalization hook. - * @details User finalization code added to the @p chThdExit() API. - * - * @note It is inserted into lock zone. - * @note It is also invoked when the threads simply return in order to - * terminate. - */ -#if !defined(THREAD_EXT_EXIT_HOOK) || defined(__DOXYGEN__) -#define THREAD_EXT_EXIT_HOOK(tp) { \ - /* Add threads finalization code here.*/ \ -} -#endif - -/** - * @brief Context switch hook. - * @details This hook is invoked just before switching between threads. - */ -#if !defined(THREAD_CONTEXT_SWITCH_HOOK) || defined(__DOXYGEN__) -#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) { \ - /* System halt code here.*/ \ - otp->switches++; \ - ntp->start_ticks = *((volatile uint32_t*)0x400C4008); \ - otp->total_ticks += (ntp->start_ticks - otp->start_ticks); \ -} -#endif - -/** - * @brief Idle Loop hook. - * @details This hook is continuously invoked by the idle thread loop. - */ -#if !defined(IDLE_LOOP_HOOK) || defined(__DOXYGEN__) -#define IDLE_LOOP_HOOK() { \ - /* Idle loop code here.*/ \ -} -#endif - -/** - * @brief System tick event hook. - * @details This hook is invoked in the system tick handler immediately - * after processing the virtual timers queue. - */ -#if !defined(SYSTEM_TICK_EVENT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_TICK_EVENT_HOOK() { \ - /* System tick event code here.*/ \ -} -#endif - -/** - * @brief System halt hook. - * @details This hook is invoked in case to a system halting error before - * the system is halted. - */ -#if !defined(SYSTEM_HALT_HOOK) || defined(__DOXYGEN__) -#define SYSTEM_HALT_HOOK() { \ - /* System halt code here.*/ \ -} -#endif - -/** @} */ - -/*===========================================================================*/ -/* Port-specific settings (override port settings defaulted in chcore.h). */ -/*===========================================================================*/ - -/* NOTE: When changing this option you also have to enable or disable the FPU - in the project options.*/ -#define CORTEX_USE_FPU TRUE -#define CORTEX_ENABLE_WFI_IDLE TRUE - -#endif /* _CHCONF_H_ */ - -/** @} */ diff --git a/firmware/baseband-tx/clock_recovery.cpp b/firmware/baseband-tx/clock_recovery.cpp deleted file mode 100644 index 17cb5c70f..000000000 --- a/firmware/baseband-tx/clock_recovery.cpp +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "clock_recovery.hpp" diff --git a/firmware/baseband-tx/clock_recovery.hpp b/firmware/baseband-tx/clock_recovery.hpp deleted file mode 100644 index 9a6904a34..000000000 --- a/firmware/baseband-tx/clock_recovery.hpp +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __CLOCK_RECOVERY_H__ -#define __CLOCK_RECOVERY_H__ - -#include -#include -#include - -#include "linear_resampler.hpp" - -namespace clock_recovery { - -class GardnerTimingErrorDetector { -public: - static constexpr size_t samples_per_symbol { 2 }; - - /* - Expects retimed samples at a rate of twice the expected symbol rate. - Calculates timing error, sends symbol and error to handler. - */ - template - void operator()( - const float in, - SymbolHandler symbol_handler - ) { - /* NOTE: Algorithm is sensitive to input magnitude. Timing error value - * will scale proportionally. Best practice is to use error sign only. - */ - t[2] = t[1]; - t[1] = t[0]; - t[0] = in; - - if( symbol_phase == 0 ) { - const auto symbol = t[0]; - const float lateness = (t[0] - t[2]) * t[1]; - symbol_handler(symbol, lateness); - } - - symbol_phase = (symbol_phase + 1) % samples_per_symbol; - } - -private: - std::array t { { 0.0f, 0.0f, 0.0f } }; - size_t symbol_phase { 0 }; -}; - -class LinearErrorFilter { -public: - LinearErrorFilter( - const float filter_alpha = 0.95f, - const float error_weight = -1.0f - ) : filter_alpha { filter_alpha }, - error_weight { error_weight } - { - } - - float operator()( - const float error - ) { - error_filtered = filter_alpha * error_filtered + (1.0f - filter_alpha) * error; - return error_filtered * error_weight; - } - -private: - const float filter_alpha; - const float error_weight; - float error_filtered { 0.0f }; -}; - -class FixedErrorFilter { -public: - FixedErrorFilter( - ) { - } - - FixedErrorFilter( - const float weight - ) : weight_ { weight } - { - } - - float operator()( - const float lateness - ) const { - return (lateness < 0.0f) ? weight() : -weight(); - } - - float weight() const { - return weight_; - } - -private: - float weight_ { 1.0f / 16.0f }; -}; - -template -class ClockRecovery { -public: - using SymbolHandler = std::function; - - ClockRecovery( - const float sampling_rate, - const float symbol_rate, - ErrorFilter error_filter, - SymbolHandler symbol_handler - ) : symbol_handler { std::move(symbol_handler) } - { - configure(sampling_rate, symbol_rate, error_filter); - } - - ClockRecovery( - SymbolHandler symbol_handler - ) : symbol_handler { std::move(symbol_handler) } - { - } - - void configure( - const float sampling_rate, - const float symbol_rate, - ErrorFilter error_filter - ) { - resampler.configure(sampling_rate, symbol_rate * timing_error_detector.samples_per_symbol); - error_filter = error_filter; - } - - void operator()( - const float baseband_sample - ) { - resampler(baseband_sample, - [this](const float interpolated_sample) { - this->resampler_callback(interpolated_sample); - } - ); - } - -private: - dsp::interpolation::LinearResampler resampler; - GardnerTimingErrorDetector timing_error_detector; - ErrorFilter error_filter; - const SymbolHandler symbol_handler; - - void resampler_callback(const float interpolated_sample) { - timing_error_detector(interpolated_sample, - [this](const float symbol, const float lateness) { - this->symbol_callback(symbol, lateness); - } - ); - } - - void symbol_callback(const float symbol, const float lateness) { - // NOTE: This check is to avoid std::function nullptr check, which - // brings in "_ZSt25__throw_bad_function_callv" and a lot of extra code. - // TODO: Make symbol_handler known at compile time. - if( symbol_handler) { - symbol_handler(symbol); - } - - const float adjustment = error_filter(lateness); - resampler.advance(adjustment); - } -}; - -} /* namespace clock_recovery */ - -#endif/*__CLOCK_RECOVERY_H__*/ diff --git a/firmware/baseband-tx/description b/firmware/baseband-tx/description deleted file mode 100644 index 4af72ebe7..000000000 --- a/firmware/baseband-tx/description +++ /dev/null @@ -1 +0,0 @@ -More or less experimental stuff, mainly TX. diff --git a/firmware/baseband-tx/dsp_decimate.cpp b/firmware/baseband-tx/dsp_decimate.cpp deleted file mode 100644 index 93dbc6025..000000000 --- a/firmware/baseband-tx/dsp_decimate.cpp +++ /dev/null @@ -1,790 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "dsp_decimate.hpp" - -#include - -namespace dsp { -namespace decimate { - -static inline complex32_t mac_fs4_shift( - const vec2_s16* const z, - const vec2_s16* const t, - const size_t index, - const complex32_t accum -) { - /* Accumulate sample * tap results for samples already in z buffer. - * Multiply using swap/negation to achieve Fs/4 shift. - * For iterations where samples are shifting out of z buffer (being discarded). - * Expect negated tap t[2] to accomodate instruction set limitations. - */ - const bool negated_t2 = index & 1; - const auto q1_i0 = z[index*2 + 0]; - const auto i1_q0 = z[index*2 + 1]; - const auto t1_t0 = t[index]; - const auto real = negated_t2 ? smlsd(q1_i0, t1_t0, accum.real()) : smlad(q1_i0, t1_t0, accum.real()); - const auto imag = negated_t2 ? smlad(i1_q0, t1_t0, accum.imag()) : smlsd(i1_q0, t1_t0, accum.imag()); - return { real, imag }; -} - -static inline complex32_t mac_shift( - const vec2_s16* const z, - const vec2_s16* const t, - const size_t index, - const complex32_t accum -) { - /* Accumulate sample * tap results for samples already in z buffer. - * For iterations where samples are shifting out of z buffer (being discarded). - * real += i1 * t1 + i0 * t0 - * imag += q1 * t1 + q0 * t0 - */ - const auto i1_i0 = z[index*2 + 0]; - const auto q1_q0 = z[index*2 + 1]; - const auto t1_t0 = t[index]; - const auto real = smlad(i1_i0, t1_t0, accum.real()); - const auto imag = smlad(q1_q0, t1_t0, accum.imag()); - return { real, imag }; -} - -static inline complex32_t mac_fs4_shift_and_store( - vec2_s16* const z, - const vec2_s16* const t, - const size_t decimation_factor, - const size_t index, - const complex32_t accum -) { - /* Accumulate sample * tap results for samples already in z buffer. - * Place new samples into z buffer. - * Expect negated tap t[2] to accomodate instruction set limitations. - */ - const bool negated_t2 = index & 1; - const auto q1_i0 = z[decimation_factor + index*2 + 0]; - const auto i1_q0 = z[decimation_factor + index*2 + 1]; - const auto t1_t0 = t[decimation_factor / 2 + index]; - z[index*2 + 0] = q1_i0; - const auto real = negated_t2 ? smlsd(q1_i0, t1_t0, accum.real()) : smlad(q1_i0, t1_t0, accum.real()); - z[index*2 + 1] = i1_q0; - const auto imag = negated_t2 ? smlad(i1_q0, t1_t0, accum.imag()) : smlsd(i1_q0, t1_t0, accum.imag()); - return { real, imag }; -} - -static inline complex32_t mac_shift_and_store( - vec2_s16* const z, - const vec2_s16* const t, - const size_t decimation_factor, - const size_t index, - const complex32_t accum -) { - /* Accumulate sample * tap results for samples already in z buffer. - * Place new samples into z buffer. - * Expect negated tap t[2] to accomodate instruction set limitations. - */ - const auto i1_i0 = z[decimation_factor + index*2 + 0]; - const auto q1_q0 = z[decimation_factor + index*2 + 1]; - const auto t1_t0 = t[decimation_factor / 2 + index]; - z[index*2 + 0] = i1_i0; - const auto real = smlad(i1_i0, t1_t0, accum.real()); - z[index*2 + 1] = q1_q0; - const auto imag = smlad(q1_q0, t1_t0, accum.imag()); - return { real, imag }; -} - -static inline complex32_t mac_fs4_shift_and_store_new_c8_samples( - vec2_s16* const z, - const vec2_s16* const t, - const vec4_s8* const in, - const size_t decimation_factor, - const size_t index, - const size_t length, - const complex32_t accum -) { - /* Accumulate sample * tap results for new samples. - * Place new samples into z buffer. - * Expect negated tap t[2] to accomodate instruction set limitations. - */ - const bool negated_t2 = index & 1; - const auto q1_i1_q0_i0 = in[index]; - const auto t1_t0 = t[(length - decimation_factor) / 2 + index]; - const auto i1_q1_i0_q0 = rev16(q1_i1_q0_i0); - const auto i1_q1_q0_i0 = pkhbt(q1_i1_q0_i0, i1_q1_i0_q0); - const auto q1_i0 = sxtb16(i1_q1_q0_i0); - const auto i1_q0 = sxtb16(i1_q1_q0_i0, 8); - z[length - decimation_factor * 2 + index*2 + 0] = q1_i0; - const auto real = negated_t2 ? smlsd(q1_i0, t1_t0, accum.real()) : smlad(q1_i0, t1_t0, accum.real()); - z[length - decimation_factor * 2 + index*2 + 1] = i1_q0; - const auto imag = negated_t2 ? smlad(i1_q0, t1_t0, accum.imag()) : smlsd(i1_q0, t1_t0, accum.imag()); - return { real, imag }; -} - -static inline complex32_t mac_shift_and_store_new_c16_samples( - vec2_s16* const z, - const vec2_s16* const t, - const vec2_s16* const in, - const size_t decimation_factor, - const size_t index, - const size_t length, - const complex32_t accum -) { - /* Accumulate sample * tap results for new samples. - * Place new samples into z buffer. - * Expect negated tap t[2] to accomodate instruction set limitations. - */ - const auto q0_i0 = in[index*2+0]; - const auto q1_i1 = in[index*2+1]; - const auto i1_i0 = pkhbt(q0_i0, q1_i1, 16); - const auto q1_q0 = pkhtb(q1_i1, q0_i0, 16); - const auto t1_t0 = t[(length - decimation_factor) / 2 + index]; - z[length - decimation_factor * 2 + index*2 + 0] = i1_i0; - const auto real = smlad(i1_i0, t1_t0, accum.real()); - z[length - decimation_factor * 2 + index*2 + 1] = q1_q0; - const auto imag = smlad(q1_q0, t1_t0, accum.imag()); - return { real, imag }; -} - -static inline uint32_t scale_round_and_pack( - const complex32_t value, - const int32_t scale_factor -) { - /* Multiply 32-bit components of the complex by a scale factor, - * into int64_ts, then round to nearest LSB (1 << 32), saturate to 16 bits, - * and pack into a complex. - */ - const auto scaled_real = __SMMULR(value.real(), scale_factor); - const auto saturated_real = __SSAT(scaled_real, 16); - - const auto scaled_imag = __SMMULR(value.imag(), scale_factor); - const auto saturated_imag = __SSAT(scaled_imag, 16); - - return __PKHBT(saturated_real, saturated_imag, 16); -} - -template -static void taps_copy( - const Tap* const source, - Tap* const target, - const size_t count, - const bool shift_up -) { - const uint32_t negate_pattern = shift_up ? 0b1110 : 0b0100; - for(size_t i=0; i> (i & 3)) & 1; - target[i] = negate ? -source[i] : source[i]; - } -} - -// FIRC8xR16x24FS4Decim4 ////////////////////////////////////////////////// - -void FIRC8xR16x24FS4Decim4::configure( - const std::array& taps, - const int32_t scale, - const Shift shift -) { - taps_copy(taps.data(), taps_.data(), taps_.size(), shift == Shift::Up); - output_scale = scale; - z_.fill({}); -} - -buffer_c16_t FIRC8xR16x24FS4Decim4::execute( - const buffer_c8_t& src, - const buffer_c16_t& dst -) { - vec2_s16* const z = static_cast(__builtin_assume_aligned(z_.data(), 4)); - const vec2_s16* const t = static_cast(__builtin_assume_aligned(taps_.data(), 4)); - uint32_t* const d = static_cast(__builtin_assume_aligned(dst.p, 4)); - - const auto k = output_scale; - - const size_t count = src.count / decimation_factor; - for(size_t i=0; i(__builtin_assume_aligned(&src.p[i * decimation_factor], 4)); - - complex32_t accum; - - // Oldest samples are discarded. - accum = mac_fs4_shift(z, t, 0, accum); - accum = mac_fs4_shift(z, t, 1, accum); - - // Middle samples are shifted earlier in the "z" delay buffer. - accum = mac_fs4_shift_and_store(z, t, decimation_factor, 0, accum); - accum = mac_fs4_shift_and_store(z, t, decimation_factor, 1, accum); - accum = mac_fs4_shift_and_store(z, t, decimation_factor, 2, accum); - accum = mac_fs4_shift_and_store(z, t, decimation_factor, 3, accum); - accum = mac_fs4_shift_and_store(z, t, decimation_factor, 4, accum); - accum = mac_fs4_shift_and_store(z, t, decimation_factor, 5, accum); - accum = mac_fs4_shift_and_store(z, t, decimation_factor, 6, accum); - accum = mac_fs4_shift_and_store(z, t, decimation_factor, 7, accum); - - // Newest samples come from "in" buffer, are copied to "z" delay buffer. - accum = mac_fs4_shift_and_store_new_c8_samples(z, t, in, decimation_factor, 0, taps_count, accum); - accum = mac_fs4_shift_and_store_new_c8_samples(z, t, in, decimation_factor, 1, taps_count, accum); - - d[i] = scale_round_and_pack(accum, k); - } - - return { - dst.p, - count, - src.sampling_rate / decimation_factor - }; -} - -// FIRC8xR16x24FS4Decim8 ////////////////////////////////////////////////// - -void FIRC8xR16x24FS4Decim8::configure( - const std::array& taps, - const int32_t scale, - const Shift shift -) { - taps_copy(taps.data(), taps_.data(), taps_.size(), shift == Shift::Up); - output_scale = scale; - z_.fill({}); -} - -buffer_c16_t FIRC8xR16x24FS4Decim8::execute( - const buffer_c8_t& src, - const buffer_c16_t& dst -) { - vec2_s16* const z = static_cast(__builtin_assume_aligned(z_.data(), 4)); - const vec2_s16* const t = static_cast(__builtin_assume_aligned(taps_.data(), 4)); - uint32_t* const d = static_cast(__builtin_assume_aligned(dst.p, 4)); - - const auto k = output_scale; - - const size_t count = src.count / decimation_factor; - for(size_t i=0; i(__builtin_assume_aligned(&src.p[i * decimation_factor], 4)); - - complex32_t accum; - - // Oldest samples are discarded. - accum = mac_fs4_shift(z, t, 0, accum); - accum = mac_fs4_shift(z, t, 1, accum); - accum = mac_fs4_shift(z, t, 2, accum); - accum = mac_fs4_shift(z, t, 3, accum); - - // Middle samples are shifted earlier in the "z" delay buffer. - accum = mac_fs4_shift_and_store(z, t, decimation_factor, 0, accum); - accum = mac_fs4_shift_and_store(z, t, decimation_factor, 1, accum); - accum = mac_fs4_shift_and_store(z, t, decimation_factor, 2, accum); - accum = mac_fs4_shift_and_store(z, t, decimation_factor, 3, accum); - - // Newest samples come from "in" buffer, are copied to "z" delay buffer. - accum = mac_fs4_shift_and_store_new_c8_samples(z, t, in, decimation_factor, 0, taps_count, accum); - accum = mac_fs4_shift_and_store_new_c8_samples(z, t, in, decimation_factor, 1, taps_count, accum); - accum = mac_fs4_shift_and_store_new_c8_samples(z, t, in, decimation_factor, 2, taps_count, accum); - accum = mac_fs4_shift_and_store_new_c8_samples(z, t, in, decimation_factor, 3, taps_count, accum); - - d[i] = scale_round_and_pack(accum, k); - } - - return { - dst.p, - count, - src.sampling_rate / decimation_factor - }; -} - -// FIRC16xR16x16Decim2 //////////////////////////////////////////////////// - -void FIRC16xR16x16Decim2::configure( - const std::array& taps, - const int32_t scale -) { - std::copy(taps.cbegin(), taps.cend(), taps_.begin()); - output_scale = scale; - z_.fill({}); -} - -buffer_c16_t FIRC16xR16x16Decim2::execute( - const buffer_c16_t& src, - const buffer_c16_t& dst -) { - vec2_s16* const z = static_cast(__builtin_assume_aligned(z_.data(), 4)); - const vec2_s16* const t = static_cast(__builtin_assume_aligned(taps_.data(), 4)); - uint32_t* const d = static_cast(__builtin_assume_aligned(dst.p, 4)); - - const auto k = output_scale; - - const size_t count = src.count / decimation_factor; - for(size_t i=0; i(__builtin_assume_aligned(&src.p[i * decimation_factor], 4)); - - complex32_t accum; - - // Oldest samples are discarded. - accum = mac_shift(z, t, 0, accum); - - // Middle samples are shifted earlier in the "z" delay buffer. - accum = mac_shift_and_store(z, t, decimation_factor, 0, accum); - accum = mac_shift_and_store(z, t, decimation_factor, 1, accum); - accum = mac_shift_and_store(z, t, decimation_factor, 2, accum); - accum = mac_shift_and_store(z, t, decimation_factor, 3, accum); - accum = mac_shift_and_store(z, t, decimation_factor, 4, accum); - accum = mac_shift_and_store(z, t, decimation_factor, 5, accum); - - // Newest samples come from "in" buffer, are copied to "z" delay buffer. - accum = mac_shift_and_store_new_c16_samples(z, t, in, decimation_factor, 0, taps_count, accum); - - d[i] = scale_round_and_pack(accum, k); - } - - return { - dst.p, - count, - src.sampling_rate / decimation_factor - }; -} - -// FIRC16xR16x32Decim8 //////////////////////////////////////////////////// - -void FIRC16xR16x32Decim8::configure( - const std::array& taps, - const int32_t scale -) { - std::copy(taps.cbegin(), taps.cend(), taps_.begin()); - output_scale = scale; - z_.fill({}); -} - -buffer_c16_t FIRC16xR16x32Decim8::execute( - const buffer_c16_t& src, - const buffer_c16_t& dst -) { - vec2_s16* const z = static_cast(__builtin_assume_aligned(z_.data(), 4)); - const vec2_s16* const t = static_cast(__builtin_assume_aligned(taps_.data(), 4)); - uint32_t* const d = static_cast(__builtin_assume_aligned(dst.p, 4)); - - const auto k = output_scale; - - const size_t count = src.count / decimation_factor; - for(size_t i=0; i(__builtin_assume_aligned(&src.p[i * decimation_factor], 4)); - - complex32_t accum; - - // Oldest samples are discarded. - accum = mac_shift(z, t, 0, accum); - accum = mac_shift(z, t, 1, accum); - accum = mac_shift(z, t, 2, accum); - accum = mac_shift(z, t, 3, accum); - - // Middle samples are shifted earlier in the "z" delay buffer. - accum = mac_shift_and_store(z, t, decimation_factor, 0, accum); - accum = mac_shift_and_store(z, t, decimation_factor, 1, accum); - accum = mac_shift_and_store(z, t, decimation_factor, 2, accum); - accum = mac_shift_and_store(z, t, decimation_factor, 3, accum); - accum = mac_shift_and_store(z, t, decimation_factor, 4, accum); - accum = mac_shift_and_store(z, t, decimation_factor, 5, accum); - accum = mac_shift_and_store(z, t, decimation_factor, 6, accum); - accum = mac_shift_and_store(z, t, decimation_factor, 7, accum); - - // Newest samples come from "in" buffer, are copied to "z" delay buffer. - accum = mac_shift_and_store_new_c16_samples(z, t, in, decimation_factor, 0, taps_count, accum); - accum = mac_shift_and_store_new_c16_samples(z, t, in, decimation_factor, 1, taps_count, accum); - accum = mac_shift_and_store_new_c16_samples(z, t, in, decimation_factor, 2, taps_count, accum); - accum = mac_shift_and_store_new_c16_samples(z, t, in, decimation_factor, 3, taps_count, accum); - - d[i] = scale_round_and_pack(accum, k); - } - - return { - dst.p, - count, - src.sampling_rate / decimation_factor - }; -} - -buffer_c16_t Complex8DecimateBy2CIC3::execute(const buffer_c8_t& src, const buffer_c16_t& dst) { - /* Decimates by two using a non-recursive third-order CIC filter. - */ - - /* CIC filter (decimating by two): - * D_I0 = i3 * 1 + i2 * 3 + i1 * 3 + i0 * 1 - * D_Q0 = q3 * 1 + q2 * 3 + q1 * 3 + q0 * 1 - * - * D_I1 = i5 * 1 + i4 * 3 + i3 * 3 + i2 * 1 - * D_Q1 = q5 * 1 + q4 * 3 + q3 * 3 + q2 * 1 - */ - - uint32_t i1_i0 = _i1_i0; - uint32_t q1_q0 = _q1_q0; - - /* 3:1 Scaled by 32 to normalize output to +/-32768-ish. */ - constexpr uint32_t scale_factor = 32; - constexpr uint32_t k_3_1 = 0x00030001 * scale_factor; - uint32_t* src_p = reinterpret_cast(&src.p[0]); - uint32_t* const src_end = reinterpret_cast(&src.p[src.count]); - uint32_t* dst_p = reinterpret_cast(&dst.p[0]); - while(src_p < src_end) { - const uint32_t q3_i3_q2_i2 = *(src_p++); // 3 - const uint32_t q5_i5_q4_i4 = *(src_p++); - - const uint32_t d_i0_partial = __SMUAD(k_3_1, i1_i0); // 1: = 3 * i1 + 1 * i0 - const uint32_t i3_i2 = __SXTB16(q3_i3_q2_i2, 0); // 1: (q3_i3_q2_i2 ror 0)[23:16]:(q3_i3_q2_i2 ror 0)[7:0] - const uint32_t d_i0 = __SMLADX(k_3_1, i3_i2, d_i0_partial); // 1: + 3 * i2 + 1 * i3 - - const uint32_t d_q0_partial = __SMUAD(k_3_1, q1_q0); // 1: = 3 * q1 * 1 * q0 - const uint32_t q3_q2 = __SXTB16(q3_i3_q2_i2, 8); // 1: (q3_i3_q2_i2 ror 8)[23:16]:(q3_i3_q2_i2 ror 8)[7:0] - const uint32_t d_q0 = __SMLADX(k_3_1, q3_q2, d_q0_partial); // 1: + 3 * q2 + 1 * q3 - - const uint32_t d_q0_i0 = __PKHBT(d_i0, d_q0, 16); // 1: (Rm<<16)[31:16]:Rn[15:0] - - const uint32_t d_i1_partial = __SMUAD(k_3_1, i3_i2); // 1: = 3 * i3 + 1 * i2 - const uint32_t i5_i4 = __SXTB16(q5_i5_q4_i4, 0); // 1: (q5_i5_q4_i4 ror 0)[23:16]:(q5_i5_q4_i4 ror 0)[7:0] - const uint32_t d_i1 = __SMLADX(k_3_1, i5_i4, d_i1_partial); // 1: + 1 * i5 + 3 * i4 - - const uint32_t d_q1_partial = __SMUAD(k_3_1, q3_q2); // 1: = 3 * q3 * 1 * q2 - const uint32_t q5_q4 = __SXTB16(q5_i5_q4_i4, 8); // 1: (q5_i5_q4_i4 ror 8)[23:16]:(q5_i5_q4_i4 ror 8)[7:0] - const uint32_t d_q1 = __SMLADX(k_3_1, q5_q4, d_q1_partial); // 1: + 1 * q5 + 3 * q4 - - const uint32_t d_q1_i1 = __PKHBT(d_i1, d_q1, 16); // 1: (Rm<<16)[31:16]:Rn[15:0] - - *(dst_p++) = d_q0_i0; // 3 - *(dst_p++) = d_q1_i1; - - i1_i0 = i5_i4; - q1_q0 = q5_q4; - } - _i1_i0 = i1_i0; - _q1_q0 = q1_q0; - - return { dst.p, src.count / 2, src.sampling_rate / 2 }; -} - -buffer_c16_t TranslateByFSOver4AndDecimateBy2CIC3::execute(const buffer_c8_t& src, const buffer_c16_t& dst) { - /* Translates incoming complex samples by -fs/4, - * decimates by two using a non-recursive third-order CIC filter. - */ - - /* Derivation of algorithm: - * Original CIC filter (decimating by two): - * D_I0 = i3 * 1 + i2 * 3 + i1 * 3 + i0 * 1 - * D_Q0 = q3 * 1 + q2 * 3 + q1 * 3 + q0 * 1 - * - * D_I1 = i5 * 1 + i4 * 3 + i3 * 3 + i2 * 1 - * D_Q1 = q5 * 1 + q4 * 3 + q3 * 3 + q2 * 1 - * - * Translate -fs/4, phased 180 degrees, accomplished by complex multiplication - * of complex length-4 sequence: - * - * Substitute: - * i0 = -i0, q0 = -q0 - * i1 = -q1, q1 = i1 - * i2 = i2, q2 = q2 - * i3 = q3, q3 = -i3 - * i4 = -i4, q4 = -q4 - * i5 = -q5, q5 = i5 - * - * Resulting taps (with decimation by 2, four samples in, two samples out): - * D_I0 = q3 * 1 + i2 * 3 + -q1 * 3 + -i0 * 1 - * D_Q0 = -i3 * 1 + q2 * 3 + i1 * 3 + -q0 * 1 - * - * D_I1 = -q5 * 1 + -i4 * 3 + q3 * 3 + i2 * 1 - * D_Q1 = i5 * 1 + -q4 * 3 + -i3 * 3 + q2 * 1 - */ - - // 6 cycles per complex input sample, not including loop overhead. - uint32_t q1_i0 = _q1_i0; - uint32_t q0_i1 = _q0_i1; - /* 3:1 Scaled by 32 to normalize output to +/-32768-ish. */ - constexpr uint32_t scale_factor = 32; - const uint32_t k_3_1 = 0x00030001 * scale_factor; - uint32_t* src_p = reinterpret_cast(&src.p[0]); - uint32_t* const src_end = reinterpret_cast(&src.p[src.count]); - uint32_t* dst_p = reinterpret_cast(&dst.p[0]); - while(src_p < src_end) { - const uint32_t q3_i3_q2_i2 = *(src_p++); // 3 - const uint32_t q5_i5_q4_i4 = *(src_p++); - - const uint32_t i2_i3 = __SXTB16(q3_i3_q2_i2, 16); // 1: (q3_i3_q2_i2 ror 16)[23:16]:(q3_i3_q2_i2 ror 16)[7:0] - const uint32_t q3_q2 = __SXTB16(q3_i3_q2_i2, 8); // 1: (q3_i3_q2_i2 ror 8)[23:16]:(q3_i3_q2_i2 ror 8)[7:0] - const uint32_t i2_q3 = __PKHTB(i2_i3, q3_q2, 16); // 1: Rn[31:16]:(Rm>>16)[15:0] - const uint32_t i3_q2 = __PKHBT(q3_q2, i2_i3, 16); // 1:(Rm<<16)[31:16]:Rn[15:0] - - // D_I0 = 3 * (i2 - q1) + (q3 - i0) - const uint32_t i2_m_q1_q3_m_i0 = __QSUB16(i2_q3, q1_i0); // 1: Rn[31:16]-Rm[31:16]:Rn[15:0]-Rm[15:0] - const uint32_t d_i0 = __SMUAD(k_3_1, i2_m_q1_q3_m_i0); // 1: Rm[15:0]*Rs[15:0]+Rm[31:16]*Rs[31:16] - - // D_Q0 = 3 * (q2 + i1) - (i3 + q0) - const uint32_t i3_p_q0_q2_p_i1 = __QADD16(i3_q2, q0_i1); // 1: Rn[31:16]+Rm[31:16]:Rn[15:0]+Rm[15:0] - const uint32_t d_q0 = __SMUSDX(i3_p_q0_q2_p_i1, k_3_1); // 1: Rm[15:0]*Rs[31:16]–Rm[31:16]*RsX[15:0] - const uint32_t d_q0_i0 = __PKHBT(d_i0, d_q0, 16); // 1: (Rm<<16)[31:16]:Rn[15:0] - - const uint32_t i5_i4 = __SXTB16(q5_i5_q4_i4, 0); // 1: (q5_i5_q4_i4 ror 0)[23:16]:(q5_i5_q4_i4 ror 0)[7:0] - const uint32_t q4_q5 = __SXTB16(q5_i5_q4_i4, 24); // 1: (q5_i5_q4_i4 ror 24)[23:16]:(q5_i5_q4_i4 ror 24)[7:0] - const uint32_t q4_i5 = __PKHTB(q4_q5, i5_i4, 16); // 1: Rn[31:16]:(Rm>>16)[15:0] - const uint32_t q5_i4 = __PKHBT(i5_i4, q4_q5, 16); // 1: (Rm<<16)[31:16]:Rn[15:0] - - // D_I1 = (i2 - q5) + 3 * (q3 - i4) - const uint32_t i2_m_q5_q3_m_i4 = __QSUB16(i2_q3, q5_i4); // 1: Rn[31:16]-Rm[31:16]:Rn[15:0]-Rm[15:0] - const uint32_t d_i1 = __SMUADX(i2_m_q5_q3_m_i4, k_3_1); // 1: Rm[15:0]*Rs[31:16]+Rm[31:16]*Rs[15:0] - - // D_Q1 = (i5 + q2) - 3 * (q4 + i3) - const uint32_t q4_p_i3_i5_p_q2 = __QADD16(q4_i5, i3_q2); // 1: Rn[31:16]+Rm[31:16]:Rn[15:0]+Rm[15:0] - const uint32_t d_q1 = __SMUSD(k_3_1, q4_p_i3_i5_p_q2); // 1: Rm[15:0]*Rs[15:0]–Rm[31:16]*Rs[31:16] - const uint32_t d_q1_i1 = __PKHBT(d_i1, d_q1, 16); // 1: (Rm<<16)[31:16]:Rn[15:0] - *(dst_p++) = d_q0_i0; // 3 - *(dst_p++) = d_q1_i1; - - q1_i0 = q5_i4; - q0_i1 = q4_i5; - } - _q1_i0 = q1_i0; - _q0_i1 = q0_i1; - - return { dst.p, src.count / 2, src.sampling_rate / 2 }; -} - -buffer_c16_t DecimateBy2CIC3::execute( - const buffer_c16_t& src, - const buffer_c16_t& dst -) { - /* Complex non-recursive 3rd-order CIC filter (taps 1,3,3,1). - * Gain of 8. - * Consumes 16 bytes (4 s16:s16 samples) per loop iteration, - * Produces 8 bytes (2 s16:s16 samples) per loop iteration. - */ - uint32_t t1 = _iq0; - uint32_t t2 = _iq1; - const uint32_t taps = 0x00000003; - auto s = src.p; - auto d = dst.p; - const auto d_end = &dst.p[src.count / 2]; - while(d < d_end) { - uint32_t i = __SXTH(t1, 0); /* 1: I0 */ - uint32_t q = __SXTH(t1, 16); /* 1: Q0 */ - i = __SMLABB(t2, taps, i); /* 1: I1*3 + I0 */ - q = __SMLATB(t2, taps, q); /* 1: Q1*3 + Q0 */ - - const uint32_t t3 = *__SIMD32(s)++; /* 3: Q2:I2 */ - const uint32_t t4 = *__SIMD32(s)++; /* Q3:I3 */ - - i = __SMLABB(t3, taps, i); /* 1: I2*3 + I1*3 + I0 */ - q = __SMLATB(t3, taps, q); /* 1: Q2*3 + Q1*3 + Q0 */ - int32_t si0 = __SXTAH(i, t4, 0); /* 1: I3 + Q2*3 + Q1*3 + Q0 */ - int32_t sq0 = __SXTAH(q, t4, 16); /* 1: Q3 + Q2*3 + Q1*3 + Q0 */ - i = __BFI(si0 / 8, sq0 / 8, 16, 16); /* 1: D2_Q0:D2_I0 */ - *__SIMD32(d)++ = i; /* D2_Q0:D2_I0 */ - - i = __SXTH(t3, 0); /* 1: I2 */ - q = __SXTH(t3, 16); /* 1: Q2 */ - i = __SMLABB(t4, taps, i); /* 1: I3*3 + I2 */ - q = __SMLATB(t4, taps, q); /* 1: Q3*3 + Q2 */ - - t1 = *__SIMD32(s)++; /* 3: Q4:I4 */ - t2 = *__SIMD32(s)++; /* Q5:I5 */ - - i = __SMLABB(t1, taps, i); /* 1: I4*3 + I3*3 + I2 */ - q = __SMLATB(t1, taps, q); /* 1: Q4*3 + Q3*3 + Q2 */ - int32_t si1 = __SXTAH(i, t2, 0) ; /* 1: I5 + Q4*3 + Q3*3 + Q2 */ - int32_t sq1 = __SXTAH(q, t2, 16); /* 1: Q5 + Q4*3 + Q3*3 + Q2 */ - i = __BFI(si1 / 8, sq1 / 8, 16, 16); /* 1: D2_Q1:D2_I1 */ - *__SIMD32(d)++ = i; /* D2_Q1:D2_I1 */ - } - _iq0 = t1; - _iq1 = t2; - - return { dst.p, src.count / 2, src.sampling_rate / 2 }; -} - -void FIR64AndDecimateBy2Real::configure( - const std::array& new_taps -) { - std::copy(new_taps.cbegin(), new_taps.cend(), taps.begin()); -} - -buffer_s16_t FIR64AndDecimateBy2Real::execute( - const buffer_s16_t& src, - const buffer_s16_t& dst -) { - /* int16_t input (sample count "n" must be multiple of 4) - * -> int16_t output, decimated by 2. - * taps are normalized to 1 << 16 == 1.0. - */ - auto src_p = src.p; - auto dst_p = dst.p; - int32_t n = src.count; - for(; n>0; n-=2) { - z[taps_count-2] = *(src_p++); - z[taps_count-1] = *(src_p++); - - int32_t t = 0; - for(size_t j=0; j(taps_count); - taps_reversed_ = std::make_unique(taps_count); - taps_count_ = taps_count; - decimation_factor_ = decimation_factor; -} - -buffer_c16_t FIRAndDecimateComplex::execute( - const buffer_c16_t& src, - const buffer_c16_t& dst -) { - /* int16_t input (sample count "n" must be multiple of decimation_factor) - * -> int16_t output, decimated by decimation_factor. - * taps are normalized to 1 << 16 == 1.0. - */ - const auto output_sampling_rate = src.sampling_rate / decimation_factor_; - const size_t output_samples = src.count / decimation_factor_; - - sample_t* dst_p = dst.p; - const buffer_c16_t result { dst.p, output_samples, output_sampling_rate }; - - const sample_t* src_p = src.p; - size_t outer_count = output_samples; - while(outer_count > 0) { - /* Put new samples into delay buffer */ - auto z_new_p = &samples_[taps_count_ - decimation_factor_]; - for(size_t i=0; i 0) { - const auto tap0 = *__SIMD32(t_p)++; - const auto sample0 = *__SIMD32(z_p)++; - const auto tap1 = *__SIMD32(t_p)++; - const auto sample1 = *__SIMD32(z_p)++; - t_real = __SMLSLD(sample0, tap0, t_real); - t_imag = __SMLALDX(sample0, tap0, t_imag); - t_real = __SMLSLD(sample1, tap1, t_real); - t_imag = __SMLALDX(sample1, tap1, t_imag); - - const auto tap2 = *__SIMD32(t_p)++; - const auto sample2 = *__SIMD32(z_p)++; - const auto tap3 = *__SIMD32(t_p)++; - const auto sample3 = *__SIMD32(z_p)++; - t_real = __SMLSLD(sample2, tap2, t_real); - t_imag = __SMLALDX(sample2, tap2, t_imag); - t_real = __SMLSLD(sample3, tap3, t_real); - t_imag = __SMLALDX(sample3, tap3, t_imag); - - const auto tap4 = *__SIMD32(t_p)++; - const auto sample4 = *__SIMD32(z_p)++; - const auto tap5 = *__SIMD32(t_p)++; - const auto sample5 = *__SIMD32(z_p)++; - t_real = __SMLSLD(sample4, tap4, t_real); - t_imag = __SMLALDX(sample4, tap4, t_imag); - t_real = __SMLSLD(sample5, tap5, t_real); - t_imag = __SMLALDX(sample5, tap5, t_imag); - - const auto tap6 = *__SIMD32(t_p)++; - const auto sample6 = *__SIMD32(z_p)++; - const auto tap7 = *__SIMD32(t_p)++; - const auto sample7 = *__SIMD32(z_p)++; - t_real = __SMLSLD(sample6, tap6, t_real); - t_imag = __SMLALDX(sample6, tap6, t_imag); - t_real = __SMLSLD(sample7, tap7, t_real); - t_imag = __SMLALDX(sample7, tap7, t_imag); - - loop_count--; - } - - /* TODO: Re-evaluate whether saturation is performed, normalization, - * all that jazz. - */ - const int32_t r = t_real >> 16; - const int32_t i = t_imag >> 16; - const int32_t r_sat = __SSAT(r, 16); - const int32_t i_sat = __SSAT(i, 16); - *__SIMD32(dst_p)++ = __PKHBT( - r_sat, - i_sat, - 16 - ); - - /* Shift sample buffer left/down by decimation factor. */ - const size_t unroll_factor = 4; - size_t shift_count = (taps_count_ - decimation_factor_) / unroll_factor; - - sample_t* t = &samples_[0]; - const sample_t* s = &samples_[decimation_factor_]; - - while(shift_count > 0) { - *__SIMD32(t)++ = *__SIMD32(s)++; - *__SIMD32(t)++ = *__SIMD32(s)++; - *__SIMD32(t)++ = *__SIMD32(s)++; - *__SIMD32(t)++ = *__SIMD32(s)++; - shift_count--; - } - - shift_count = (taps_count_ - decimation_factor_) % unroll_factor; - while(shift_count > 0) { - *(t++) = *(s++); - shift_count--; - } - - outer_count--; - } - - return result; -} - -buffer_s16_t DecimateBy2CIC4Real::execute( - const buffer_s16_t& src, - const buffer_s16_t& dst -) { - auto src_p = src.p; - auto dst_p = dst.p; - int32_t n = src.count; - for(; n>0; n-=2) { - /* TODO: Probably a lot of room to optimize... */ - z[0] = z[2]; - z[1] = z[3]; - z[2] = z[4]; - z[3] = *(src_p++); - z[4] = *(src_p++); - - int32_t t = z[0] + z[1] * 4 + z[2] * 6 + z[3] * 4 + z[4]; - *(dst_p++) = t / 16; - } - - return { dst.p, src.count / 2, src.sampling_rate / 2 }; -} - -} /* namespace decimate */ -} /* namespace dsp */ diff --git a/firmware/baseband-tx/dsp_decimate.hpp b/firmware/baseband-tx/dsp_decimate.hpp deleted file mode 100644 index 527270756..000000000 --- a/firmware/baseband-tx/dsp_decimate.hpp +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __DSP_DECIMATE_H__ -#define __DSP_DECIMATE_H__ - -#include -#include -#include -#include - -#include "utility.hpp" - -#include "dsp_types.hpp" - -#include "simd.hpp" - -namespace dsp { -namespace decimate { - -class Complex8DecimateBy2CIC3 { -public: - buffer_c16_t execute( - const buffer_c8_t& src, - const buffer_c16_t& dst - ); - -private: - uint32_t _i1_i0 { 0 }; - uint32_t _q1_q0 { 0 }; -}; - -class TranslateByFSOver4AndDecimateBy2CIC3 { -public: - buffer_c16_t execute( - const buffer_c8_t& src, - const buffer_c16_t& dst - ); - -private: - uint32_t _q1_i0 { 0 }; - uint32_t _q0_i1 { 0 }; -}; - -class DecimateBy2CIC3 { -public: - buffer_c16_t execute( - const buffer_c16_t& src, - const buffer_c16_t& dst - ); - -private: - uint32_t _iq0 { 0 }; - uint32_t _iq1 { 0 }; -}; - -class FIR64AndDecimateBy2Real { -public: - static constexpr size_t taps_count = 64; - - void configure( - const std::array& taps - ); - - buffer_s16_t execute( - const buffer_s16_t& src, - const buffer_s16_t& dst - ); - -private: - std::array z; - std::array taps; -}; - -class FIRC8xR16x24FS4Decim4 { -public: - static constexpr size_t taps_count = 24; - static constexpr size_t decimation_factor = 4; - - using sample_t = complex8_t; - using tap_t = int16_t; - - enum class Shift : bool { - Down = true, - Up = false - }; - - void configure( - const std::array& taps, - const int32_t scale, - const Shift shift = Shift::Down - ); - - buffer_c16_t execute( - const buffer_c8_t& src, - const buffer_c16_t& dst - ); - -private: - std::array z_; - std::array taps_; - int32_t output_scale = 0; -}; - -class FIRC8xR16x24FS4Decim8 { -public: - static constexpr size_t taps_count = 24; - static constexpr size_t decimation_factor = 8; - - using sample_t = complex8_t; - using tap_t = int16_t; - - enum class Shift : bool { - Down = true, - Up = false - }; - - void configure( - const std::array& taps, - const int32_t scale, - const Shift shift = Shift::Down - ); - - buffer_c16_t execute( - const buffer_c8_t& src, - const buffer_c16_t& dst - ); - -private: - std::array z_; - std::array taps_; - int32_t output_scale = 0; -}; - -class FIRC16xR16x16Decim2 { -public: - static constexpr size_t taps_count = 16; - static constexpr size_t decimation_factor = 2; - - using sample_t = complex16_t; - using tap_t = int16_t; - - void configure( - const std::array& taps, - const int32_t scale - ); - - buffer_c16_t execute( - const buffer_c16_t& src, - const buffer_c16_t& dst - ); - -private: - std::array z_; - std::array taps_; - int32_t output_scale = 0; -}; - -class FIRC16xR16x32Decim8 { -public: - static constexpr size_t taps_count = 32; - static constexpr size_t decimation_factor = 8; - - using sample_t = complex16_t; - using tap_t = int16_t; - - void configure( - const std::array& taps, - const int32_t scale - ); - - buffer_c16_t execute( - const buffer_c16_t& src, - const buffer_c16_t& dst - ); - -private: - std::array z_; - std::array taps_; - int32_t output_scale = 0; -}; - -class FIRAndDecimateComplex { -public: - using sample_t = complex16_t; - using tap_t = complex16_t; - - using taps_t = tap_t[]; - - /* NOTE! Current code makes an assumption that block of samples to be - * processed will be a multiple of the taps_count. - */ - FIRAndDecimateComplex( - ) : taps_count_ { 0 }, - decimation_factor_ { 1 } - { - } - - template - void configure( - const T& taps, - const size_t decimation_factor - ) { - configure(taps.data(), taps.size(), decimation_factor); - } - - buffer_c16_t execute( - const buffer_c16_t& src, - const buffer_c16_t& dst - ); - -private: - using samples_t = sample_t[]; - - std::unique_ptr samples_; - std::unique_ptr taps_reversed_; - size_t taps_count_; - size_t decimation_factor_; - - template - void configure( - const T* const taps, - const size_t taps_count, - const size_t decimation_factor - ) { - configure_common(taps_count, decimation_factor); - std::reverse_copy(&taps[0], &taps[taps_count], &taps_reversed_[0]); - } - - void configure_common( - const size_t taps_count, - const size_t decimation_factor - ); -}; - -class DecimateBy2CIC4Real { -public: - buffer_s16_t execute( - const buffer_s16_t& src, - const buffer_s16_t& dst - ); - -private: - int16_t z[5]; -}; - -} /* namespace decimate */ -} /* namespace dsp */ - -#endif/*__DSP_DECIMATE_H__*/ diff --git a/firmware/baseband-tx/dsp_demodulate.cpp b/firmware/baseband-tx/dsp_demodulate.cpp deleted file mode 100644 index cf79d0d02..000000000 --- a/firmware/baseband-tx/dsp_demodulate.cpp +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "dsp_demodulate.hpp" - -#include "complex.hpp" -#include "fxpt_atan2.hpp" -#include "utility_m4.hpp" - -#include - -namespace dsp { -namespace demodulate { - -buffer_f32_t AM::execute( - const buffer_c16_t& src, - const buffer_f32_t& dst -) { - const auto src_p = src.p; - const auto src_end = &src.p[src.count]; - auto dst_p = dst.p; - while(src_p < src_end) { - const uint32_t sample0 = *__SIMD32(src_p)++; - const uint32_t sample1 = *__SIMD32(src_p)++; - const uint32_t mag_sq0 = __SMUAD(sample0, sample0); - const uint32_t mag_sq1 = __SMUAD(sample1, sample1); - *(dst_p++) = __builtin_sqrtf(mag_sq0) * k; - *(dst_p++) = __builtin_sqrtf(mag_sq1) * k; - } - - return { dst.p, src.count, src.sampling_rate }; -} - -buffer_f32_t SSB::execute( - const buffer_c16_t& src, - const buffer_f32_t& dst -) { - const complex16_t* src_p = src.p; - const auto src_end = &src.p[src.count]; - auto dst_p = dst.p; - while(src_p < src_end) { - *(dst_p++) = (src_p++)->real() * k; - *(dst_p++) = (src_p++)->real() * k; - *(dst_p++) = (src_p++)->real() * k; - *(dst_p++) = (src_p++)->real() * k; - } - - return { dst.p, src.count, src.sampling_rate }; -} -/* -static inline float angle_approx_4deg0(const complex32_t t) { - const auto x = static_cast(t.imag()) / static_cast(t.real()); - return 16384.0f * x; -} -*/ -static inline float angle_approx_0deg27(const complex32_t t) { - if( t.real() ) { - const auto x = static_cast(t.imag()) / static_cast(t.real()); - return x / (1.0f + 0.28086f * x * x); - } else { - return (t.imag() < 0) ? -1.5707963268f : 1.5707963268f; - } -} - -static inline float angle_precise(const complex32_t t) { - return atan2f(t.imag(), t.real()); -} - -buffer_f32_t FM::execute( - const buffer_c16_t& src, - const buffer_f32_t& dst -) { - auto z = z_; - - const auto src_p = src.p; - const auto src_end = &src.p[src.count]; - auto dst_p = dst.p; - while(src_p < src_end) { - const auto s0 = *__SIMD32(src_p)++; - const auto s1 = *__SIMD32(src_p)++; - const auto t0 = multiply_conjugate_s16_s32(s0, z); - const auto t1 = multiply_conjugate_s16_s32(s1, s0); - z = s1; - *(dst_p++) = angle_precise(t0) * kf; - *(dst_p++) = angle_precise(t1) * kf; - } - z_ = z; - - return { dst.p, src.count, src.sampling_rate }; -} - -buffer_s16_t FM::execute( - const buffer_c16_t& src, - const buffer_s16_t& dst -) { - auto z = z_; - - const auto src_p = src.p; - const auto src_end = &src.p[src.count]; - auto dst_p = dst.p; - while(src_p < src_end) { - const auto s0 = *__SIMD32(src_p)++; - const auto s1 = *__SIMD32(src_p)++; - const auto t0 = multiply_conjugate_s16_s32(s0, z); - const auto t1 = multiply_conjugate_s16_s32(s1, s0); - z = s1; - const int32_t theta0_int = angle_approx_0deg27(t0) * ks16; - const int32_t theta0_sat = __SSAT(theta0_int, 16); - const int32_t theta1_int = angle_approx_0deg27(t1) * ks16; - const int32_t theta1_sat = __SSAT(theta1_int, 16); - *__SIMD32(dst_p)++ = __PKHBT( - theta0_sat, - theta1_sat, - 16 - ); - } - z_ = z; - - return { dst.p, src.count, src.sampling_rate }; -} - -void FM::configure(const float sampling_rate, const float deviation_hz) { - /* - * angle: -pi to pi. output range: -32768 to 32767. - * Maximum delta-theta (output of atan2) at maximum deviation frequency: - * delta_theta_max = 2 * pi * deviation / sampling_rate - */ - kf = static_cast(1.0f / (2.0 * pi * deviation_hz / sampling_rate)); - ks16 = 32767.0f * kf; -} - -} -} diff --git a/firmware/baseband-tx/dsp_demodulate.hpp b/firmware/baseband-tx/dsp_demodulate.hpp deleted file mode 100644 index 727061679..000000000 --- a/firmware/baseband-tx/dsp_demodulate.hpp +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __DSP_DEMODULATE_H__ -#define __DSP_DEMODULATE_H__ - -#include "dsp_types.hpp" - -namespace dsp { -namespace demodulate { - -class AM { -public: - buffer_f32_t execute( - const buffer_c16_t& src, - const buffer_f32_t& dst - ); - -private: - static constexpr float k = 1.0f / 32768.0f; -}; - -class SSB { -public: - buffer_f32_t execute( - const buffer_c16_t& src, - const buffer_f32_t& dst - ); - -private: - static constexpr float k = 1.0f / 32768.0f; -}; - -class FM { -public: - buffer_f32_t execute( - const buffer_c16_t& src, - const buffer_f32_t& dst - ); - - buffer_s16_t execute( - const buffer_c16_t& src, - const buffer_s16_t& dst - ); - - void configure(const float sampling_rate, const float deviation_hz); - -private: - complex16_t::rep_type z_ { 0 }; - float kf { 0 }; - float ks16 { 0 }; -}; - -} /* namespace demodulate */ -} /* namespace dsp */ - -#endif/*__DSP_DEMODULATE_H__*/ diff --git a/firmware/baseband-tx/dsp_squelch.cpp b/firmware/baseband-tx/dsp_squelch.cpp deleted file mode 100644 index b4a2d3a48..000000000 --- a/firmware/baseband-tx/dsp_squelch.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "dsp_squelch.hpp" - -#include -#include - -bool FMSquelch::execute(const buffer_f32_t& audio) { - if( threshold_squared == 0.0f ) { - return true; - } - - // TODO: No hard-coded array size. - std::array squelch_energy_buffer; - const buffer_f32_t squelch_energy { - squelch_energy_buffer.data(), - squelch_energy_buffer.size() - }; - non_audio_hpf.execute(audio, squelch_energy); - - float non_audio_max_squared = 0; - for(const auto sample : squelch_energy_buffer) { - const float sample_squared = sample * sample; - if( sample_squared > non_audio_max_squared ) { - non_audio_max_squared = sample_squared; - } - } - - return (non_audio_max_squared < threshold_squared); -} - -void FMSquelch::set_threshold(const float new_value) { - threshold_squared = new_value * new_value; -} diff --git a/firmware/baseband-tx/dsp_squelch.hpp b/firmware/baseband-tx/dsp_squelch.hpp deleted file mode 100644 index 4701b9acd..000000000 --- a/firmware/baseband-tx/dsp_squelch.hpp +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __DSP_SQUELCH_H__ -#define __DSP_SQUELCH_H__ - -#include "buffer.hpp" -#include "dsp_iir.hpp" -#include "dsp_iir_config.hpp" - -#include -#include - -class FMSquelch { -public: - bool execute(const buffer_f32_t& audio); - - void set_threshold(const float new_value); - -private: - static constexpr size_t N = 32; - float threshold_squared { 0.0f }; - - IIRBiquadFilter non_audio_hpf { non_audio_hpf_config }; -}; - -#endif/*__DSP_SQUELCH_H__*/ diff --git a/firmware/baseband-tx/event_m4.cpp b/firmware/baseband-tx/event_m4.cpp deleted file mode 100644 index 797ef5cb4..000000000 --- a/firmware/baseband-tx/event_m4.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "event_m4.hpp" - -#include "portapack_shared_memory.hpp" - -#include "message_queue.hpp" - -#include "ch.h" - -#include "lpc43xx_cpp.hpp" -using namespace lpc43xx; - -#include -#include - -extern "C" { - -CH_IRQ_HANDLER(MAPP_IRQHandler) { - CH_IRQ_PROLOGUE(); - - chSysLockFromIsr(); - EventDispatcher::events_flag_isr(EVT_MASK_BASEBAND); - chSysUnlockFromIsr(); - - creg::m0apptxevent::clear(); - - CH_IRQ_EPILOGUE(); -} - -} - -Thread* EventDispatcher::thread_event_loop = nullptr; - -void EventDispatcher::run() { - thread_event_loop = chThdSelf(); - lpc43xx::creg::m0apptxevent::enable(); - - baseband_thread.thread_main = chThdSelf(); - baseband_thread.thread_rssi = rssi_thread.start(NORMALPRIO + 10); - baseband_thread.start(NORMALPRIO + 20); - - while(is_running) { - const auto events = wait(); - dispatch(events); - } - - lpc43xx::creg::m0apptxevent::disable(); -} - -void EventDispatcher::request_stop() { - is_running = false; -} - -eventmask_t EventDispatcher::wait() { - return chEvtWaitAny(ALL_EVENTS); -} - -void EventDispatcher::dispatch(const eventmask_t events) { - if( events & EVT_MASK_BASEBAND ) { - handle_baseband_queue(); - } - - if( events & EVT_MASK_SPECTRUM ) { - handle_spectrum(); - } -} - -void EventDispatcher::handle_baseband_queue() { - shared_memory.baseband_queue.handle([this](Message* const message) { - this->on_message(message); - }); -} - -void EventDispatcher::on_message(const Message* const message) { - switch(message->id) { - case Message::ID::Shutdown: - on_message_shutdown(*reinterpret_cast(message)); - break; - - default: - on_message_default(message); - break; - } -} - -void EventDispatcher::on_message_shutdown(const ShutdownMessage&) { - request_stop(); -} - -void EventDispatcher::on_message_default(const Message* const message) { - baseband_thread.on_message(message); -} - -void EventDispatcher::handle_spectrum() { - const UpdateSpectrumMessage message; - baseband_thread.on_message(&message); -} diff --git a/firmware/baseband-tx/event_m4.hpp b/firmware/baseband-tx/event_m4.hpp deleted file mode 100644 index ad9871d15..000000000 --- a/firmware/baseband-tx/event_m4.hpp +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __EVENT_M4_H__ -#define __EVENT_M4_H__ - -#include "event.hpp" - -#include "baseband_thread.hpp" -#include "rssi_thread.hpp" - -#include "message.hpp" - -#include "ch.h" - -constexpr auto EVT_MASK_BASEBAND = EVENT_MASK(0); -constexpr auto EVT_MASK_SPECTRUM = EVENT_MASK(1); - -class EventDispatcher { -public: - void run(); - void request_stop(); - - static inline void events_flag(const eventmask_t events) { - if( thread_event_loop ) { - chEvtSignal(thread_event_loop, events); - } - } - - static inline void events_flag_isr(const eventmask_t events) { - if( thread_event_loop ) { - chEvtSignalI(thread_event_loop, events); - } - } - -private: - static Thread* thread_event_loop; - - BasebandThread baseband_thread; - RSSIThread rssi_thread; - - bool is_running = true; - - eventmask_t wait(); - - void dispatch(const eventmask_t events); - - void handle_baseband_queue(); - - void on_message(const Message* const message); - void on_message_shutdown(const ShutdownMessage&); - void on_message_default(const Message* const message); - - void handle_spectrum(); -}; - -#endif/*__EVENT_M4_H__*/ diff --git a/firmware/baseband-tx/fxpt_atan2.cpp b/firmware/baseband-tx/fxpt_atan2.cpp deleted file mode 100644 index a3531f79a..000000000 --- a/firmware/baseband-tx/fxpt_atan2.cpp +++ /dev/null @@ -1,152 +0,0 @@ -/* - * fxpt_atan2.c - * - * Copyright (C) 2012, Xo Wang - * - * Hacked up to be a bit more ARM-friendly by: - * Copyright (C) 2013 Jared Boone, ShareBrained Technology, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is furnished to do - * so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - */ - -#include -#include -#include - -/** - * Convert floating point to Q15 (1.0.15 fixed point) format. - * - * @param d floating-point value within range -1 to (1 - (2**-15)), inclusive - * @return Q15 value representing d; same range - */ -/* -static inline int16_t q15_from_double(const double d) { - return lrint(d * 32768); -} -*/ -/** - * Negative absolute value. Used to avoid undefined behavior for most negative - * integer (see C99 standard 7.20.6.1.2 and footnote 265 for the description of - * abs/labs/llabs behavior). - * - * @param i 16-bit signed integer - * @return negative absolute value of i; defined for all values of i - */ - /* -static inline int16_t s16_nabs(const int16_t j) { -#if (((int16_t)-1) >> 1) == ((int16_t)-1) - // signed right shift sign-extends (arithmetic) - const int16_t negSign = ~(j >> 15); // splat sign bit into all 16 and complement - // if j is positive (negSign is -1), xor will invert j and sub will add 1 - // otherwise j is unchanged - return (j ^ negSign) - negSign; -#else - return (j < 0 ? j : -j); -#endif -} -*/ -/** - * Q15 (1.0.15 fixed point) multiplication. Various common rounding modes are in - * the function definition for reference (and preference). - * - * @param j 16-bit signed integer representing -1 to (1 - (2**-15)), inclusive - * @param k same format as j - * @return product of j and k, in same format - */ -static inline int16_t q15_mul(const int16_t j, const int16_t k) { - const int32_t intermediate = j * k; -#if 0 // don't round - return intermediate >> 15; -#elif 0 // biased rounding - return (intermediate + 0x4000) >> 15; -#else // unbiased rounding - return (intermediate + ((intermediate & 0x7FFF) == 0x4000 ? 0 : 0x4000)) >> 15; -#endif -} - -/** - * Q15 (1.0.15 fixed point) division (non-saturating). Be careful when using - * this function, as it does not behave well when the result is out-of-range. - * - * Value is not defined if numerator is greater than or equal to denominator. - * - * @param numer 16-bit signed integer representing -1 to (1 - (2**-15)) - * @param denom same format as numer; must be greater than numerator - * @return numer / denom in same format as numer and denom - */ -static inline int16_t q15_div(const int16_t numer, const int16_t denom) { - return (static_cast(numer) << 15) / denom; -} - -/** - * 16-bit fixed point four-quadrant arctangent. Given some Cartesian vector - * (x, y), find the angle subtended by the vector and the positive x-axis. - * - * The value returned is in units of 1/65536ths of one turn. This allows the use - * of the full 16-bit unsigned range to represent a turn. e.g. 0x0000 is 0 - * radians, 0x8000 is pi radians, and 0xFFFF is (65535 / 32768) * pi radians. - * - * Because the magnitude of the input vector does not change the angle it - * represents, the inputs can be in any signed 16-bit fixed-point format. - * - * @param y y-coordinate in signed 16-bit - * @param x x-coordinate in signed 16-bit - * @return angle in (val / 32768) * pi radian increments from 0x0000 to 0xFFFF - */ - -static inline int16_t nabs(const int16_t j) { - //return -abs(x); - return (j < 0 ? j : -j); -} - -int16_t fxpt_atan2(const int16_t y, const int16_t x) { - static const int16_t k1 = 2847; - static const int16_t k2 = 11039; - if (x == y) { // x/y or y/x would return -1 since 1 isn't representable - if (y > 0) { // 1/8 - return 8192; - } else if (y < 0) { // 5/8 - return 40960; - } else { // x = y = 0 - return 0; - } - } - const int16_t nabs_y = nabs(y); - const int16_t nabs_x = nabs(x); - if (nabs_x < nabs_y) { // octants 1, 4, 5, 8 - const int16_t y_over_x = q15_div(y, x); - const int16_t correction = q15_mul(k1, nabs(y_over_x)); - const int16_t unrotated = q15_mul(k2 + correction, y_over_x); - if (x > 0) { // octants 1, 8 - return unrotated; - } else { // octants 4, 5 - return 32768 + unrotated; - } - } else { // octants 2, 3, 6, 7 - const int16_t x_over_y = q15_div(x, y); - const int16_t correction = q15_mul(k1, nabs(x_over_y)); - const int16_t unrotated = q15_mul(k2 + correction, x_over_y); - if (y > 0) { // octants 2, 3 - return 16384 - unrotated; - } else { // octants 6, 7 - return 49152 - unrotated; - } - } -} diff --git a/firmware/baseband-tx/fxpt_atan2.hpp b/firmware/baseband-tx/fxpt_atan2.hpp deleted file mode 100644 index b57d14e24..000000000 --- a/firmware/baseband-tx/fxpt_atan2.hpp +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __FXPT_ATAN2_H__ -#define __FXPT_ATAN2_H__ - -#include - -int16_t fxpt_atan2(const int16_t y, const int16_t x); - -#endif/*__FXPT_ATAN2_H__*/ diff --git a/firmware/baseband-tx/gpdma_lli.hpp b/firmware/baseband-tx/gpdma_lli.hpp deleted file mode 100644 index 3bde23716..000000000 --- a/firmware/baseband-tx/gpdma_lli.hpp +++ /dev/null @@ -1,225 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include -#include - -#include -#include - -#include "gpdma.hpp" - -namespace lpc43xx { -namespace gpdma { -namespace lli { - -enum class ChainType : uint8_t { - Loop = 0, - OneShot = 1, -}; - -enum class Interrupt : uint8_t { - All = 0, - Last = 1, -}; - -struct ChainConfig { - ChainType type; - size_t length; - Interrupt interrupt; -}; - -enum class BurstSize : uint8_t { - Transfer1 = 0, - Transfer4 = 1, - Transfer8 = 2, - Transfer16 = 3, - Transfer32 = 4, - Transfer64 = 5, - Transfer128 = 6, - Transfer256 = 7, -}; - -enum class TransferWidth : uint8_t { - Byte = 0, - HalfWord = 1, - Word = 2, -}; - -enum class Increment : uint8_t { - No = 0, - Yes = 1, -}; - -using PeripheralIndex = uint8_t; - -struct Endpoint { - PeripheralIndex peripheral; - BurstSize burst_size; - TransferWidth transfer_size; - Increment increment; -}; - -struct ChannelConfig { - ChainConfig chain; - FlowControl flow_control; - Endpoint source; - Endpoint destination; - - constexpr gpdma::channel::Control control( - const size_t transfer_size, - const bool last - ) { - return { - .transfersize = transfer_size, - .sbsize = toUType(source.burst_size), - .dbsize = toUType(destination.burst_size), - .swidth = toUType(source.transfer_size), - .dwidth = toUType(destination.transfer_size), - .s = source_endpoint_type(flow_control), - .d = destination_endpoint_type(flow_control), - .si = toUType(source.increment), - .di = toUType(destination.increment), - .prot1 = 0, - .prot2 = 0, - .prot3 = 0, - .i = ((chain.interrupt == Interrupt::All) || last) ? 1U : 0U, - }; - } - - constexpr gpdma::channel::Config config() { - return { - .e = 0, - .srcperipheral = source.peripheral, - .destperipheral = destination.peripheral, - .flowcntrl = flow_control, - .ie = 1, - .itc = 1, - .l = 0, - .a = 0, - .h = 0, - }; - }; -}; - -constexpr ChannelConfig channel_config_baseband_tx { - { ChainType::Loop, 4, Interrupt::All }, - gpdma::FlowControl::MemoryToPeripheral_DMAControl, - { 0x00, BurstSize::Transfer1, TransferWidth::Word, Increment::Yes }, - { 0x00, BurstSize::Transfer1, TransferWidth::Word, Increment::No }, -}; - -constexpr ChannelConfig channel_config_baseband_rx { - { ChainType::Loop, 4, Interrupt::All }, - gpdma::FlowControl::PeripheralToMemory_DMAControl, - { 0x00, BurstSize::Transfer1, TransferWidth::Word, Increment::No }, - { 0x00, BurstSize::Transfer1, TransferWidth::Word, Increment::Yes }, -}; - -constexpr ChannelConfig channel_config_audio_tx { - { ChainType::Loop, 4, Interrupt::All }, - gpdma::FlowControl::MemoryToPeripheral_DMAControl, - { 0x0a, BurstSize::Transfer32, TransferWidth::Word, Increment::Yes }, - { 0x0a, BurstSize::Transfer32, TransferWidth::Word, Increment::No }, -}; - -constexpr ChannelConfig channel_config_audio_rx { - { ChainType::Loop, 4, Interrupt::All }, - gpdma::FlowControl::PeripheralToMemory_DMAControl, - { 0x09, BurstSize::Transfer32, TransferWidth::Word, Increment::No }, - { 0x09, BurstSize::Transfer32, TransferWidth::Word, Increment::Yes }, -}; - -constexpr ChannelConfig channel_config_rssi { - { ChainType::Loop, 4, Interrupt::All }, - gpdma::FlowControl::PeripheralToMemory_DMAControl, - { 0x0e, BurstSize::Transfer1, TransferWidth::Byte, Increment::No }, - { 0x0e, BurstSize::Transfer1, TransferWidth::Word, Increment::Yes }, -}; - -class Chain { -public: - using chain_t = std::vector; - using chain_p = std::unique_ptr; - - Chain(const ChannelConfig& cc) : - chain(std::make_unique(cc.chain.length)) - { - set_lli_sequential(cc.chain_type); - set_source_address()... - } - -private: - chain_p chain; - - void set_source_peripheral(void* const address) { - set_source_address(address, 0); - } - - void set_destination_peripheral(void* const address) { - set_destination_address(address, 0); - } - - void set_source_address(void* const address, const size_t increment) { - size_t offset = 0; - for(auto& item : *chain) { - item.srcaddr = (uint32_t)address + offset; - offset += increment; - } - } - - void set_destination_address(void* const address, const size_t increment) { - size_t offset = 0; - for(auto& item : *chain) { - item.destaddr = (uint32_t)address + offset; - offset += increment; - } - } - - void set_control(const gpdma::channel::Control control) { - for(auto& item : *chain) { - item.control = control; - } - } - - void set_lli_sequential(ChainType chain_type) { - for(auto& item : *chain) { - item.lli = lli_pointer(&item + 1); - } - if( chain_type == ChainType::Loop ) { - chain[chain->size() - 1].lli = lli_pointer(&chain[0]); - } else { - chain[chain->size() - 1].lli = lli_pointer(nullptr); - } - } - - gpdma::channel::LLIPointer lli_pointer(const void* lli) { - return { - .lm = 0, - .r = 0, - .lli = reinterpret_cast(lli), - }; - } -}; - -} /* namespace lli */ -} /* namespace gpdma */ -} /* namespace lpc43xx */ diff --git a/firmware/baseband-tx/halconf.h b/firmware/baseband-tx/halconf.h deleted file mode 100755 index c157afbd8..000000000 --- a/firmware/baseband-tx/halconf.h +++ /dev/null @@ -1,313 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - Copyright (C) 2014 Jared Boone, ShareBrained Technology - - 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. -*/ - -/** - * @file templates/halconf.h - * @brief HAL configuration header. - * @details HAL configuration file, this file allows to enable or disable the - * various device drivers from your application. You may also use - * this file in order to override the device drivers default settings. - * - * @addtogroup HAL_CONF - * @{ - */ - -#ifndef _HALCONF_H_ -#define _HALCONF_H_ - -#include "mcuconf.h" - -/** - * @brief Enables the TM subsystem. - */ -#if !defined(HAL_USE_TM) || defined(__DOXYGEN__) -#define HAL_USE_TM FALSE -#endif - -/** - * @brief Enables the PAL subsystem. - */ -#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) -#define HAL_USE_PAL FALSE -#endif - -/** - * @brief Enables the ADC subsystem. - */ -#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) -#define HAL_USE_ADC FALSE -#endif - -/** - * @brief Enables the CAN subsystem. - */ -#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) -#define HAL_USE_CAN FALSE -#endif - -/** - * @brief Enables the EXT subsystem. - */ -#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) -#define HAL_USE_EXT FALSE -#endif - -/** - * @brief Enables the GPT subsystem. - */ -#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) -#define HAL_USE_GPT FALSE -#endif - -/** - * @brief Enables the I2C subsystem. - */ -#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) -#define HAL_USE_I2C FALSE -#endif - -/** - * @brief Enables the ICU subsystem. - */ -#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) -#define HAL_USE_ICU FALSE -#endif - -/** - * @brief Enables the MAC subsystem. - */ -#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) -#define HAL_USE_MAC FALSE -#endif - -/** - * @brief Enables the MMC_SPI subsystem. - */ -#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) -#define HAL_USE_MMC_SPI FALSE -#endif - -/** - * @brief Enables the PWM subsystem. - */ -#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) -#define HAL_USE_PWM FALSE -#endif - -/** - * @brief Enables the RTC subsystem. - */ -#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) -#define HAL_USE_RTC FALSE -#endif - -/** - * @brief Enables the SDC subsystem. - */ -#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) -#define HAL_USE_SDC FALSE -#endif - -/** - * @brief Enables the SERIAL subsystem. - */ -#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL FALSE -#endif - -/** - * @brief Enables the SERIAL over USB subsystem. - */ -#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) -#define HAL_USE_SERIAL_USB FALSE -#endif - -/** - * @brief Enables the SPI subsystem. - */ -#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) -#define HAL_USE_SPI FALSE -#endif - -/** - * @brief Enables the UART subsystem. - */ -#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) -#define HAL_USE_UART FALSE -#endif - -/** - * @brief Enables the USB subsystem. - */ -#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) -#define HAL_USE_USB FALSE -#endif - -/*===========================================================================*/ -/* ADC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) -#define ADC_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define ADC_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* CAN driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Sleep mode related APIs inclusion switch. - */ -#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) -#define CAN_USE_SLEEP_MODE TRUE -#endif - -/*===========================================================================*/ -/* I2C driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables the mutual exclusion APIs on the I2C bus. - */ -#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define I2C_USE_MUTUAL_EXCLUSION TRUE -#endif - -/*===========================================================================*/ -/* MAC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) -#define MAC_USE_ZERO_COPY FALSE -#endif - -/** - * @brief Enables an event sources for incoming packets. - */ -#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) -#define MAC_USE_EVENTS TRUE -#endif - -/*===========================================================================*/ -/* MMC_SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - * This option is recommended also if the SPI driver does not - * use a DMA channel and heavily loads the CPU. - */ -#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) -#define MMC_NICE_WAITING TRUE -#endif - -/*===========================================================================*/ -/* SDC driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Number of initialization attempts before rejecting the card. - * @note Attempts are performed at 10mS intervals. - */ -#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) -#define SDC_INIT_RETRY 100 -#endif - -/** - * @brief Include support for MMC cards. - * @note MMC support is not yet implemented so this option must be kept - * at @p FALSE. - */ -#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) -#define SDC_MMC_SUPPORT FALSE -#endif - -/** - * @brief Delays insertions. - * @details If enabled this options inserts delays into the MMC waiting - * routines releasing some extra CPU time for the threads with - * lower priority, this may slow down the driver a bit however. - */ -#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING FALSE -#endif - -/*===========================================================================*/ -/* SERIAL driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Default bit rate. - * @details Configuration parameter, this is the baud rate selected for the - * default configuration. - */ -#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) -#define SERIAL_DEFAULT_BITRATE 38400 -#endif - -/** - * @brief Serial buffers size. - * @details Configuration parameter, you can change the depth of the queue - * buffers depending on the requirements of your application. - * @note The default is 64 bytes for both the transmission and receive - * buffers. - */ -#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) -#define SERIAL_BUFFERS_SIZE 16 -#endif - -/*===========================================================================*/ -/* SPI driver related settings. */ -/*===========================================================================*/ - -/** - * @brief Enables synchronous APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) -#define SPI_USE_WAIT TRUE -#endif - -/** - * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. - * @note Disabling this option saves both code and data space. - */ -#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) -#define SPI_USE_MUTUAL_EXCLUSION TRUE -#endif - -#endif /* _HALCONF_H_ */ - -/** @} */ diff --git a/firmware/baseband-tx/linear_resampler.hpp b/firmware/baseband-tx/linear_resampler.hpp deleted file mode 100644 index d889a2c25..000000000 --- a/firmware/baseband-tx/linear_resampler.hpp +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __LINEAR_RESAMPLER_H__ -#define __LINEAR_RESAMPLER_H__ - -namespace dsp { -namespace interpolation { - -class LinearResampler { -public: - void configure( - const float input_rate, - const float output_rate - ) { - phase_increment = calculate_increment(input_rate, output_rate); - } - - template - void operator()( - const float sample, - InterpolatedSampleHandler interpolated_sample_handler - ) { - const float sample_delta = sample - last_sample; - while( phase < 1.0f ) { - const float interpolated_value = last_sample + phase * sample_delta; - interpolated_sample_handler(interpolated_value); - phase += phase_increment; - } - last_sample = sample; - phase -= 1.0f; - } - - void advance(const float fraction) { - phase += (fraction * phase_increment); - } - -private: - float last_sample { 0.0f }; - float phase { 0.0f }; - float phase_increment { 0.0f }; - - static constexpr float calculate_increment(const float input_rate, const float output_rate) { - return input_rate / output_rate; - } -}; - -} /* namespace interpolation */ -} /* namespace dsp */ - -#endif/*__LINEAR_RESAMPLER_H__*/ diff --git a/firmware/baseband-tx/matched_filter.cpp b/firmware/baseband-tx/matched_filter.cpp deleted file mode 100644 index 9471a2029..000000000 --- a/firmware/baseband-tx/matched_filter.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "matched_filter.hpp" - -#include -#include - -#include "utility.hpp" - -namespace dsp { -namespace matched_filter { - -void MatchedFilter::configure( - const tap_t* const taps, - const size_t taps_count, - const size_t decimation_factor -) { - samples_ = std::make_unique(taps_count); - taps_reversed_ = std::make_unique(taps_count); - taps_count_ = taps_count; - decimation_factor_ = decimation_factor; - output = 0; - std::reverse_copy(&taps[0], &taps[taps_count], &taps_reversed_[0]); -} - -bool MatchedFilter::execute_once( - const sample_t input -) { - samples_[taps_count_ - decimation_factor_ + decimation_phase] = input; - - advance_decimation_phase(); - if( is_new_decimation_cycle() ) { - float sr_tr = 0.0f; - float si_tr = 0.0f; - float si_ti = 0.0f; - float sr_ti = 0.0f; - for(size_t n=0; n 0) { - *t++ = *s++; - *t++ = *s++; - *t++ = *s++; - *t++ = *s++; - shift_count--; - } - - shift_count = (taps_count_ - decimation_factor_) % unroll_factor; - while(shift_count > 0) { - *t++ = *s++; - shift_count--; - } -} - -} /* namespace matched_filter */ -} /* namespace dsp */ diff --git a/firmware/baseband-tx/matched_filter.hpp b/firmware/baseband-tx/matched_filter.hpp deleted file mode 100644 index 49045db86..000000000 --- a/firmware/baseband-tx/matched_filter.hpp +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __MATCHED_FILTER_H__ -#define __MATCHED_FILTER_H__ - -#include -#include -#include - -namespace dsp { -namespace matched_filter { - -// This filter contains "magic" (optimizations) that expect the taps to -// combine a low-pass filter with a complex sinusoid that performs shifting of -// the input signal to 0Hz/DC. This also means that the taps length must be -// a multiple of the complex sinusoid period. - -class MatchedFilter { -public: - using sample_t = std::complex; - using tap_t = std::complex; - - using taps_t = tap_t[]; - - template - MatchedFilter( - const T& taps, - size_t decimation_factor = 1 - ) { - configure(taps, decimation_factor); - } - - template - void configure( - const T& taps, - size_t decimation_factor - ) { - configure(taps.data(), taps.size(), decimation_factor); - } - - bool execute_once(const sample_t input); - - float get_output() const { - return output; - } - -private: - using samples_t = sample_t[]; - - std::unique_ptr samples_; - std::unique_ptr taps_reversed_; - size_t taps_count_ { 0 }; - size_t decimation_factor_ { 1 }; - size_t decimation_phase { 0 }; - float output { 0 }; - - void shift_by_decimation_factor(); - - void advance_decimation_phase() { - decimation_phase = (decimation_phase + 1) % decimation_factor_; - } - - bool is_new_decimation_cycle() const { - return (decimation_phase == 0); - } - - void configure( - const tap_t* const taps, - const size_t taps_count, - const size_t decimation_factor - ); -}; - -} /* namespace matched_filter */ -} /* namespace dsp */ - -#endif/*__MATCHED_FILTER_H__*/ diff --git a/firmware/baseband-tx/mcuconf.h b/firmware/baseband-tx/mcuconf.h deleted file mode 100755 index eae375458..000000000 --- a/firmware/baseband-tx/mcuconf.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - Copyright (C) 2014 Jared Boone, ShareBrained Technology - - 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. -*/ - -/* - * LPC43xx drivers configuration. - * The following settings override the default settings present in - * the various device driver implementation headers. - * Note that the settings for each driver only have effect if the whole - * driver is enabled in halconf.h. - * - * IRQ priorities: - * 7...0 Lowest...Highest. - */ - -/* NOTE: Beware setting IRQ priorities < "2": - * dbg_check_enter_isr "#SV8 means that probably you have some IRQ set at a - * priority level above the kernel level (level 0 or 1 usually) so it is able - * to preempt the kernel and mess things up. - */ - -/* - * DMA driver system settings. - */ - -//#define LPC_ADC0_IRQ_PRIORITY 2 -#define LPC_DMA_IRQ_PRIORITY 3 -//#define LPC_ADC1_IRQ_PRIORITY 4 - -#define LPC43XX_M0APPTXEVENT_IRQ_PRIORITY 4 - -/* M4 is initialized by M0, which has already started PLL1 */ -#define LPC43XX_M4_CLK 200000000 -#define LPC43XX_M4_CLK_SRC 0x09 \ No newline at end of file diff --git a/firmware/baseband-tx/name b/firmware/baseband-tx/name deleted file mode 100644 index dd4d2a910..000000000 --- a/firmware/baseband-tx/name +++ /dev/null @@ -1 +0,0 @@ -Experimental diff --git a/firmware/baseband-tx/ook.hpp b/firmware/baseband-tx/ook.hpp deleted file mode 100644 index 273339229..000000000 --- a/firmware/baseband-tx/ook.hpp +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __OOK_HPP__ -#define __OOK_HPP__ - -#include "phase_detector.hpp" -#include "phase_accumulator.hpp" - -#include -#include -#include -#include - -class OOKSlicerMagSquaredInt { -public: - using symbol_t = bool; - - constexpr OOKSlicerMagSquaredInt( - const float samples_per_symbol - ) : mag2_threshold_leak_factor { - static_cast( - factor_sq(-1.0f / (8.0f * samples_per_symbol)) * float(1ULL << 32) - ) - } - { - } - - symbol_t operator()(const std::complex in) { - const uint32_t real2 = in.real() * in.real(); - const uint32_t imag2 = in.imag() * in.imag(); - const uint32_t mag2 = real2 + imag2; - - const uint32_t mag2_attenuated = mag2 >> 3; // Approximation of (-4.5dB)^2 - mag2_threshold = (uint64_t(mag2_threshold) * uint64_t(mag2_threshold_leak_factor)) >> 32; - mag2_threshold = std::max(mag2_threshold, mag2_attenuated); - const bool symbol = (mag2 > mag2_threshold); - return symbol; - } - -private: - const uint32_t mag2_threshold_leak_factor; - uint32_t mag2_threshold = 0; - - constexpr float factor_sq(float db) { - return std::pow(10.0f, db / (10.0f / 2)); - } -}; - -class OOKClockRecovery { -public: - constexpr OOKClockRecovery( - const float samples_per_symbol - ) : symbol_phase_inc_nominal { static_cast(std::round((1ULL << 32) / samples_per_symbol)) }, - phase_detector { samples_per_symbol }, - phase_accumulator { symbol_phase_inc_nominal } - { - } - - template - void operator()(const uint32_t slicer_history, SymbolHandler symbol_handler) { - if( phase_accumulator() ) { - const auto detector_result = phase_detector(slicer_history); - phase_accumulator.set_inc(symbol_phase_inc_nominal + detector_result.error * (symbol_phase_inc_nominal >> 3)); - symbol_handler(detector_result.symbol); - } - } - -private: - const uint32_t symbol_phase_inc_nominal; - PhaseDetectorEarlyLateGate phase_detector; - PhaseAccumulator phase_accumulator; -}; - -#endif/*__OOK_HPP__*/ diff --git a/firmware/baseband-tx/packet_builder.cpp b/firmware/baseband-tx/packet_builder.cpp deleted file mode 100644 index 0fa5ec201..000000000 --- a/firmware/baseband-tx/packet_builder.cpp +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "packet_builder.hpp" diff --git a/firmware/baseband-tx/packet_builder.hpp b/firmware/baseband-tx/packet_builder.hpp deleted file mode 100644 index c8a9ea5bb..000000000 --- a/firmware/baseband-tx/packet_builder.hpp +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __PACKET_BUILDER_H__ -#define __PACKET_BUILDER_H__ - -#include -#include -#include -#include - -#include "bit_pattern.hpp" -#include "baseband_packet.hpp" - -struct NeverMatch { - bool operator()(const BitHistory&, const size_t) const { - return false; - } -}; - -struct FixedLength { - bool operator()(const BitHistory&, const size_t symbols_received) const { - return symbols_received >= length; - } - - const size_t length; -}; - -template -class PacketBuilder { -public: - using PayloadHandlerFunc = std::function; - - PacketBuilder( - const PreambleMatcher preamble_matcher, - const UnstuffMatcher unstuff_matcher, - const EndMatcher end_matcher, - PayloadHandlerFunc payload_handler - ) : payload_handler { std::move(payload_handler) }, - preamble(preamble_matcher), - unstuff(unstuff_matcher), - end(end_matcher) - { - } - - void configure( - const PreambleMatcher preamble_matcher, - const UnstuffMatcher unstuff_matcher - ) { - preamble = preamble_matcher; - unstuff = unstuff_matcher; - - reset_state(); - } - - void execute( - const uint_fast8_t symbol - ) { - bit_history.add(symbol); - - switch(state) { - case State::Preamble: - if( preamble(bit_history, packet.size()) ) { - state = State::Payload; - } - break; - - case State::Payload: - if( !unstuff(bit_history, packet.size()) ) { - packet.add(symbol); - } - - if( end(bit_history, packet.size()) ) { - // NOTE: This check is to avoid std::function nullptr check, which - // brings in "_ZSt25__throw_bad_function_callv" and a lot of extra code. - // TODO: Make payload_handler known at compile time. - if( payload_handler ) { - packet.set_timestamp(Timestamp::now()); - payload_handler(packet); - } - reset_state(); - } else { - if( packet_truncated() ) { - reset_state(); - } - } - break; - - default: - reset_state(); - break; - } - } - -private: - enum State { - Preamble, - Payload, - }; - - bool packet_truncated() const { - return packet.size() >= packet.capacity(); - } - - const PayloadHandlerFunc payload_handler; - - BitHistory bit_history; - PreambleMatcher preamble; - UnstuffMatcher unstuff; - EndMatcher end; - - State state { State::Preamble }; - baseband::Packet packet; - - void reset_state() { - packet.clear(); - state = State::Preamble; - } -}; - -#endif/*__PACKET_BUILDER_H__*/ diff --git a/firmware/baseband-tx/phase_accumulator.hpp b/firmware/baseband-tx/phase_accumulator.hpp deleted file mode 100644 index bf3b331a3..000000000 --- a/firmware/baseband-tx/phase_accumulator.hpp +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __PHASE_ACCUMULATOR_HPP__ -#define __PHASE_ACCUMULATOR_HPP__ - -#include - -class PhaseAccumulator { -public: - constexpr PhaseAccumulator( - const uint32_t phase_inc - ) : phase_inc { phase_inc } - { - } - - bool operator()() { - const auto last_phase = phase; - phase += phase_inc; - return (phase < last_phase); - } - - void set_inc(const uint32_t new_phase_inc) { - phase_inc = new_phase_inc; - } - -private: - uint32_t phase { 0 }; - uint32_t phase_inc; -}; - -#endif/*__PHASE_ACCUMULATOR_HPP__*/ diff --git a/firmware/baseband-tx/phase_detector.hpp b/firmware/baseband-tx/phase_detector.hpp deleted file mode 100644 index 89cf4b5ca..000000000 --- a/firmware/baseband-tx/phase_detector.hpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __PHASE_DETECTOR_HPP__ -#define __PHASE_DETECTOR_HPP__ - -#include -#include -#include - -class PhaseDetectorEarlyLateGate { -public: - using history_t = uint32_t; - - using symbol_t = bool; - using error_t = int; - - struct result_t { - symbol_t symbol; - error_t error; - }; - - constexpr PhaseDetectorEarlyLateGate( - const float samples_per_symbol - ) : late_mask { (1U << static_cast(std::ceil(samples_per_symbol / 2))) - 1 }, - early_mask { late_mask << static_cast(std::floor(samples_per_symbol / 2)) }, - sample_bit { static_cast(std::floor(samples_per_symbol / 2)) } - { - } - - result_t operator()(const history_t symbol_history) const { - // history = ...0111, early - // history = ...1110, late - - const symbol_t symbol = (symbol_history >> sample_bit) & 1; - const int late_side = __builtin_popcount(symbol_history & late_mask); - const int early_side = __builtin_popcount(symbol_history & early_mask); - const int lateness = late_side - early_side; - const int direction = lateness; //std::min(std::max(lateness, -1), 1); - const error_t error = direction; - return { symbol, error }; - } - -private: - const history_t late_mask; - const history_t early_mask; - const size_t sample_bit; -}; - -#endif/*__PHASE_DETECTOR_HPP__*/ diff --git a/firmware/baseband-tx/proc_tpms.cpp b/firmware/baseband-tx/proc_tpms.cpp deleted file mode 100644 index 9d401a1c1..000000000 --- a/firmware/baseband-tx/proc_tpms.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "proc_tpms.hpp" - -#include "dsp_fir_taps.hpp" - -TPMSProcessor::TPMSProcessor() { - decim_0.configure(taps_200k_decim_0.taps, 33554432); - decim_1.configure(taps_200k_decim_1.taps, 131072); -} - -void TPMSProcessor::execute(const buffer_c8_t& buffer) { - /* 2.4576MHz, 2048 samples */ - - const auto decim_0_out = decim_0.execute(buffer, dst_buffer); - const auto decim_1_out = decim_1.execute(decim_0_out, dst_buffer); - const auto decimator_out = decim_1_out; - - /* 307.2kHz, 256 samples */ - feed_channel_stats(decimator_out); - - for(size_t i=0; ipacket_builder_ook_subaru.execute(symbol); - }); - ook_clock_recovery_gmc(slicer_history, [this](const bool symbol) { - this->packet_builder_ook_gmc.execute(symbol); - }); - } -} - -void TPMSProcessor::consume_symbol( - const float raw_symbol -) { - const uint_fast8_t sliced_symbol = (raw_symbol >= 0.0f) ? 1 : 0; - packet_builder.execute(sliced_symbol); -} - -void TPMSProcessor::payload_handler( - const baseband::Packet& packet -) { - const TPMSPacketMessage message { tpms::SignalType::FLM, packet }; - shared_memory.application_queue.push(message); -} diff --git a/firmware/baseband-tx/proc_tpms.hpp b/firmware/baseband-tx/proc_tpms.hpp deleted file mode 100644 index 759f73836..000000000 --- a/firmware/baseband-tx/proc_tpms.hpp +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __PROC_TPMS_H__ -#define __PROC_TPMS_H__ - -#include "baseband_processor.hpp" - -#include "channel_decimator.hpp" -#include "matched_filter.hpp" - -#include "clock_recovery.hpp" -#include "symbol_coding.hpp" -#include "packet_builder.hpp" -#include "baseband_packet.hpp" - -#include "ook.hpp" - -#include "message.hpp" -#include "portapack_shared_memory.hpp" - -#include -#include -#include - -// Translate+rectangular filter -// sample=307.2k, deviation=38400, symbol=19200 -// Length: 16 taps, 1 symbols, 2 cycles of sinusoid -constexpr std::array, 16> rect_taps_307k2_1t_p { { - { 6.2500000000e-02f, 0.0000000000e+00f }, { 4.4194173824e-02f, 4.4194173824e-02f }, - { 0.0000000000e+00f, 6.2500000000e-02f }, { -4.4194173824e-02f, 4.4194173824e-02f }, - { -6.2500000000e-02f, 0.0000000000e+00f }, { -4.4194173824e-02f, -4.4194173824e-02f }, - { 0.0000000000e+00f, -6.2500000000e-02f }, { 4.4194173824e-02f, -4.4194173824e-02f }, - { 6.2500000000e-02f, 0.0000000000e+00f }, { 4.4194173824e-02f, 4.4194173824e-02f }, - { 0.0000000000e+00f, 6.2500000000e-02f }, { -4.4194173824e-02f, 4.4194173824e-02f }, - { -6.2500000000e-02f, 0.0000000000e+00f }, { -4.4194173824e-02f, -4.4194173824e-02f }, - { 0.0000000000e+00f, -6.2500000000e-02f }, { 4.4194173824e-02f, -4.4194173824e-02f }, -} }; - -class TPMSProcessor : public BasebandProcessor { -public: - TPMSProcessor(); - - void execute(const buffer_c8_t& buffer) override; - -private: - std::array dst; - const buffer_c16_t dst_buffer { - dst.data(), - dst.size() - }; - - dsp::decimate::FIRC8xR16x24FS4Decim4 decim_0; - dsp::decimate::FIRC16xR16x16Decim2 decim_1; - - dsp::matched_filter::MatchedFilter mf { rect_taps_307k2_1t_p, 8 }; - - clock_recovery::ClockRecovery clock_recovery { - 38400, 19200, { 0.0555f }, - [this](const float symbol) { this->consume_symbol(symbol); } - }; - PacketBuilder packet_builder { - { 0b010101010101010101010101010110, 30, 1 }, - { }, - { 256 }, - [this](const baseband::Packet& packet) { - this->payload_handler(packet); - } - }; - - static constexpr float channel_rate_in = 307200.0f; - static constexpr size_t channel_decimation = 8; - static constexpr float channel_sample_rate = channel_rate_in / channel_decimation; - OOKSlicerMagSquaredInt ook_slicer_5sps { 5 }; - uint32_t slicer_history { 0 }; - - OOKClockRecovery ook_clock_recovery_subaru { - channel_sample_rate / 8192.0f - }; - - PacketBuilder packet_builder_ook_subaru { - { 0b010101010101010101011110, 24, 0 }, - { }, - { 80 }, - [](const baseband::Packet& packet) { - const TPMSPacketMessage message { tpms::SignalType::Subaru, packet }; - shared_memory.application_queue.push(message); - } - }; - OOKClockRecovery ook_clock_recovery_gmc { - channel_sample_rate / 8400.0f - }; - - PacketBuilder packet_builder_ook_gmc { - { 0b01010101010101010101010101100101, 32, 0 }, - { }, - { 192 }, - [](const baseband::Packet& packet) { - const TPMSPacketMessage message { tpms::SignalType::GMC, packet }; - shared_memory.application_queue.push(message); - } - }; - void consume_symbol(const float symbol); - void payload_handler(const baseband::Packet& packet); -}; - -#endif/*__PROC_TPMS_H__*/ diff --git a/firmware/baseband-tx/rssi.cpp b/firmware/baseband-tx/rssi.cpp deleted file mode 100644 index 2e9cfa32e..000000000 --- a/firmware/baseband-tx/rssi.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "rssi.hpp" - -#include - -#include "adc.hpp" -#include "rssi_dma.hpp" -#include "utility.hpp" - -#include "hal.h" -using namespace lpc43xx; - -#include "hackrf_hal.hpp" -using namespace hackrf::one; - -#include "portapack_adc.hpp" - -namespace rf { -namespace rssi { - -constexpr uint8_t adc1_sel = (1 << portapack::adc1_rssi_input); -const auto adc1_interrupt_mask = flp2(adc1_sel); - -constexpr adc::CR adc1_cr { - .sel = adc1_sel, - .clkdiv = 49, /* 400kHz sample rate, 2.5us/sample @ 200MHz PCLK */ - .resolution = 9, /* Ten clocks */ - .edge = 0, -}; -constexpr adc::Config adc1_config { - .cr = adc1_cr, -}; - -void init() { - adc1.clock_enable(); - adc1.interrupts_disable(); - adc1.power_up(adc1_config); - adc1.interrupts_enable(adc1_interrupt_mask); - - dma::init(); -} - -void start() { - dma::enable(); - adc1.start_burst(); -} - -void stop() { - dma::disable(); - adc1.stop_burst(); -} - -} /* namespace rssi */ -} /* namespace rf */ diff --git a/firmware/baseband-tx/rssi.hpp b/firmware/baseband-tx/rssi.hpp deleted file mode 100644 index d340f338b..000000000 --- a/firmware/baseband-tx/rssi.hpp +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __RSSI_H__ -#define __RSSI_H__ - -#include -#include - -#include "buffer.hpp" - -namespace rf { -namespace rssi { - -using sample_t = uint8_t; -using buffer_t = buffer_t; - -void init(); -void start(); -void stop(); - -} /* namespace rssi */ -} /* namespace rf */ - -#endif/*__RSSI_H__*/ diff --git a/firmware/baseband-tx/rssi_dma.cpp b/firmware/baseband-tx/rssi_dma.cpp deleted file mode 100644 index 355698ad4..000000000 --- a/firmware/baseband-tx/rssi_dma.cpp +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "rssi_dma.hpp" - -#include -#include -#include - -#include "hal.h" -#include "gpdma.hpp" - -using namespace lpc43xx; - -#include "portapack_dma.hpp" -#include "portapack_adc.hpp" - -#include "thread_wait.hpp" - -namespace rf { -namespace rssi { -namespace dma { - -/* TODO: SO MUCH REPEATED CODE IN touch_dma.cpp!!! */ - -static constexpr auto& gpdma_channel = gpdma::channels[portapack::adc1_gpdma_channel_number]; - -constexpr uint32_t gpdma_ahb_master_peripheral = 1; -constexpr uint32_t gpdma_ahb_master_memory = 0; -constexpr uint32_t gpdma_ahb_master_lli_fetch = 0; - -constexpr uint32_t gpdma_peripheral = 0xe; -constexpr uint32_t gpdma_src_peripheral = gpdma_peripheral; -constexpr uint32_t gpdma_dest_peripheral = gpdma_peripheral; - -constexpr gpdma::channel::LLIPointer lli_pointer(const void* lli) { - return { - .lm = gpdma_ahb_master_lli_fetch, - .r = 0, - .lli = reinterpret_cast(lli), - }; -} - -constexpr gpdma::channel::Control control(const size_t number_of_transfers) { - return { - .transfersize = number_of_transfers, - .sbsize = 0, /* Burst size: 1 transfer */ - .dbsize = 0, /* Burst size: 1 transfer */ - .swidth = 0, /* Source transfer width: byte (8 bits) */ - .dwidth = 2, /* Destination transfer width: word (32 bits) */ - .s = gpdma_ahb_master_peripheral, - .d = gpdma_ahb_master_memory, - .si = 0, - .di = 1, - .prot1 = 0, - .prot2 = 0, - .prot3 = 0, - .i = 1, - }; -} - -constexpr gpdma::channel::Config config() { - return { - .e = 0, - .srcperipheral = gpdma_src_peripheral, - .destperipheral = gpdma_dest_peripheral, - .flowcntrl = gpdma::FlowControl::PeripheralToMemory_DMAControl, - .ie = 1, - .itc = 1, - .l = 0, - .a = 0, - .h = 0, - }; -} - -struct buffers_config_t { - size_t count; - size_t items_per_buffer; -}; - -static buffers_config_t buffers_config; - -static sample_t *samples { nullptr }; -static gpdma::channel::LLI *lli { nullptr }; - -static ThreadWait thread_wait; - -static void transfer_complete() { - const auto next_lli_index = gpdma_channel.next_lli() - &lli[0]; - thread_wait.wake_from_interrupt(next_lli_index); -} - -static void dma_error() { - thread_wait.wake_from_interrupt(-1); - disable(); -} - -void init() { - gpdma_channel.set_handlers(transfer_complete, dma_error); - - // LPC_GPDMA->SYNC |= (1 << gpdma_peripheral); -} - -void allocate(size_t buffer_count, size_t items_per_buffer) { - buffers_config = { - .count = buffer_count, - .items_per_buffer = items_per_buffer, - }; - - const auto peripheral = reinterpret_cast(&LPC_ADC1->DR[portapack::adc1_rssi_input]) + 1; - const auto control_value = control(gpdma::buffer_words(buffers_config.items_per_buffer, 1)); - - samples = new sample_t[buffers_config.count * buffers_config.items_per_buffer]; - lli = new gpdma::channel::LLI[buffers_config.count]; - - for(size_t i=0; i(&samples[i * buffers_config.items_per_buffer]); - lli[i].srcaddr = peripheral; - lli[i].destaddr = memory; - lli[i].lli = lli_pointer(&lli[(i + 1) % buffers_config.count]); - lli[i].control = control_value; - } -} - -void free() { - delete samples; - delete lli; -} - -void enable() { - const auto gpdma_config = config(); - gpdma_channel.configure(lli[0], gpdma_config); - gpdma_channel.enable(); -} - -bool is_enabled() { - return gpdma_channel.is_enabled(); -} - -void disable() { - gpdma_channel.disable(); -} - -rf::rssi::buffer_t wait_for_buffer() { - const auto next_index = thread_wait.sleep(); - - if( next_index >= 0 ) { - const size_t free_index = (next_index + buffers_config.count - 2) % buffers_config.count; - return { reinterpret_cast(lli[free_index].destaddr), buffers_config.items_per_buffer }; - } else { - // TODO: Should I return here, or loop if RDY_RESET? - return { nullptr, 0 }; - } -} - -} /* namespace dma */ -} /* namespace rssi */ -} /* namespace rf */ diff --git a/firmware/baseband-tx/rssi_dma.hpp b/firmware/baseband-tx/rssi_dma.hpp deleted file mode 100644 index e543dcf6e..000000000 --- a/firmware/baseband-tx/rssi_dma.hpp +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __RSSI_DMA_H__ -#define __RSSI_DMA_H__ - -#include - -#include "rssi.hpp" - -namespace rf { -namespace rssi { -namespace dma { - -using Handler = void (*)(); - -void init(); - -void allocate(size_t buffer_count, size_t items_per_buffer); -void free(); - -void enable(); -bool is_enabled(); - -void disable(); - -rf::rssi::buffer_t wait_for_buffer(); - -} /* namespace dma */ -} /* namespace rssi */ -} /* namespace rf */ - -#endif/*__RSSI_DMA_H__*/ diff --git a/firmware/baseband-tx/rssi_stats_collector.hpp b/firmware/baseband-tx/rssi_stats_collector.hpp deleted file mode 100644 index 7a1cd4940..000000000 --- a/firmware/baseband-tx/rssi_stats_collector.hpp +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __RSSI_STATS_COLLECTOR_H__ -#define __RSSI_STATS_COLLECTOR_H__ - -#include "rssi.hpp" -#include "message.hpp" - -#include -#include - -class RSSIStatisticsCollector { -public: - template - void process(const rf::rssi::buffer_t& buffer, Callback callback) { - auto p = buffer.p; - if( p == nullptr ) { - return; - } - - if( statistics.count == 0 ) { - const auto value_0 = *p; - statistics.min = value_0; - statistics.max = value_0; - } - - const auto end = &p[buffer.count]; - while(p < end) { - const uint32_t value = *(p++); - - if( statistics.min > value ) { - statistics.min = value; - } - if( statistics.max < value ) { - statistics.max = value; - } - - statistics.accumulator += value; - } - statistics.count += buffer.count; - - const size_t samples_per_update = buffer.sampling_rate * update_interval; - - if( statistics.count >= samples_per_update ) { - callback(statistics); - statistics.accumulator = 0; - statistics.count = 0; - } - } - -private: - static constexpr float update_interval { 0.1f }; - RSSIStatistics statistics; -}; - -#endif/*__RSSI_STATS_COLLECTOR_H__*/ diff --git a/firmware/baseband-tx/rssi_thread.cpp b/firmware/baseband-tx/rssi_thread.cpp deleted file mode 100644 index 0bf153342..000000000 --- a/firmware/baseband-tx/rssi_thread.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "rssi_thread.hpp" - -#include "rssi.hpp" -#include "rssi_dma.hpp" -#include "rssi_stats_collector.hpp" - -#include "message.hpp" -#include "portapack_shared_memory.hpp" - -WORKING_AREA(rssi_thread_wa, 128); - -Thread* RSSIThread::start(const tprio_t priority) { - return chThdCreateStatic(rssi_thread_wa, sizeof(rssi_thread_wa), - priority, ThreadBase::fn, - this - ); -} - -void RSSIThread::run() { - rf::rssi::init(); - rf::rssi::dma::allocate(4, 400); - - RSSIStatisticsCollector stats; - - while(true) { - // TODO: Place correct sampling rate into buffer returned here: - const auto buffer_tmp = rf::rssi::dma::wait_for_buffer(); - const rf::rssi::buffer_t buffer { - buffer_tmp.p, buffer_tmp.count, sampling_rate - }; - - stats.process( - buffer, - [](const RSSIStatistics& statistics) { - const RSSIStatisticsMessage message { statistics }; - shared_memory.application_queue.push(message); - } - ); - } - - rf::rssi::dma::free(); -} diff --git a/firmware/baseband-tx/rssi_thread.hpp b/firmware/baseband-tx/rssi_thread.hpp deleted file mode 100644 index 5233ddd59..000000000 --- a/firmware/baseband-tx/rssi_thread.hpp +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __RSSI_THREAD_H__ -#define __RSSI_THREAD_H__ - -#include "thread_base.hpp" - -#include - -#include - -class RSSIThread : public ThreadBase { -public: - Thread* start(const tprio_t priority); - -private: - void run() override; - - const uint32_t sampling_rate { 400000 }; -}; - -#endif/*__RSSI_THREAD_H__*/ diff --git a/firmware/baseband-tx/stream_input.hpp b/firmware/baseband-tx/stream_input.hpp deleted file mode 100644 index cb4bbe4e1..000000000 --- a/firmware/baseband-tx/stream_input.hpp +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __STREAM_INPUT_H__ -#define __STREAM_INPUT_H__ - -#include "message.hpp" -#include "fifo.hpp" - -#include "lpc43xx_cpp.hpp" -using namespace lpc43xx; - -#include -#include -#include - -class StreamInput { -public: - StreamInput(CaptureConfig* const config) : - config { config }, - K { config->write_size_log2 + config->buffer_count_log2 }, - event_bytes_mask { (1UL << config->write_size_log2) - 1 }, - data { std::make_unique(1UL << K) }, - fifo { data.get(), K } - { - config->fifo = &fifo; - } - - size_t write(const void* const data, const size_t length) { - const auto written = fifo.in(reinterpret_cast(data), length); - - const auto last_bytes_written = bytes_written; - bytes_written += written; - if( (bytes_written & event_bytes_mask) < (last_bytes_written & event_bytes_mask) ) { - creg::m4txevent::assert(); - } - config->baseband_bytes_received += length; - config->baseband_bytes_dropped = config->baseband_bytes_received - bytes_written; - - return written; - } - -private: - CaptureConfig* const config; - const size_t K; - const uint64_t event_bytes_mask; - uint64_t bytes_written = 0; - std::unique_ptr data; - FIFO fifo; -}; - -#endif/*__STREAM_INPUT_H__*/ diff --git a/firmware/baseband-tx/symbol_coding.hpp b/firmware/baseband-tx/symbol_coding.hpp deleted file mode 100644 index 03a424556..000000000 --- a/firmware/baseband-tx/symbol_coding.hpp +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __SYMBOL_CODING_H__ -#define __SYMBOL_CODING_H__ - -#include -#include - -namespace symbol_coding { - -class NRZIDecoder { -public: - uint_fast8_t operator()(const uint_fast8_t symbol) { - const auto out = (~(symbol ^ last)) & 1; - last = symbol; - return out; - } - -private: - uint_fast8_t last { 0 }; -}; - -} /* namespace symbol_coding */ - -#endif/*__SYMBOL_CODING_H__*/ diff --git a/firmware/baseband-tx/thread_base.hpp b/firmware/baseband-tx/thread_base.hpp deleted file mode 100644 index 921aeeb99..000000000 --- a/firmware/baseband-tx/thread_base.hpp +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __THREAD_BASE_H__ -#define __THREAD_BASE_H__ - -#include - -class ThreadBase { -public: - virtual ~ThreadBase() = default; - -protected: - static msg_t fn(void* arg) { - auto obj = static_cast(arg); - obj->run(); - - return 0; - } - -private: - virtual void run() = 0; -}; - -#endif/*__THREAD_BASE_H__*/ diff --git a/firmware/baseband-tx/touch_dma.cpp b/firmware/baseband-tx/touch_dma.cpp deleted file mode 100644 index ce66617a1..000000000 --- a/firmware/baseband-tx/touch_dma.cpp +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "touch_dma.hpp" - -#include -#include -#include - -#include "hal.h" -#include "gpdma.hpp" -using namespace lpc43xx; - -#include "portapack_dma.hpp" -#include "portapack_adc.hpp" -#include "portapack_shared_memory.hpp" - -namespace touch { -namespace dma { - - -/* TODO: SO MUCH REPEATED CODE FROM rssi_dma.cpp!!! */ - -static constexpr auto& gpdma_channel = gpdma::channels[portapack::adc0_gpdma_channel_number]; - -constexpr uint32_t gpdma_ahb_master_peripheral = 1; -constexpr uint32_t gpdma_ahb_master_memory = 0; -constexpr uint32_t gpdma_ahb_master_lli_fetch = 0; - -constexpr uint32_t gpdma_src_peripheral = 0xd; -constexpr uint32_t gpdma_dest_peripheral = 0xd; - -constexpr gpdma::channel::LLIPointer lli_pointer(const void* lli) { - return { - .lm = gpdma_ahb_master_lli_fetch, - .r = 0, - .lli = reinterpret_cast(lli), - }; -} - -constexpr gpdma::channel::Control control(const size_t number_of_transfers) { - return { - .transfersize = number_of_transfers, - .sbsize = 2, /* Burst size: 8 transfers */ - .dbsize = 2, /* Burst size: 8 transfers */ - .swidth = 2, /* Source transfer width: word (32 bits) */ - .dwidth = 2, /* Destination transfer width: word (32 bits) */ - .s = gpdma_ahb_master_peripheral, - .d = gpdma_ahb_master_memory, - .si = 1, - .di = 1, - .prot1 = 0, - .prot2 = 0, - .prot3 = 0, - .i = 0, - }; -} - -constexpr gpdma::channel::Config config() { - return { - .e = 0, - .srcperipheral = gpdma_src_peripheral, - .destperipheral = gpdma_dest_peripheral, - .flowcntrl = gpdma::FlowControl::PeripheralToMemory_DMAControl, - .ie = 0, - .itc = 0, - .l = 0, - .a = 0, - .h = 0, - }; -} - -static gpdma::channel::LLI lli; - -constexpr size_t channels_per_sample = 8; -//constexpr size_t samples_per_frame = 40; -//constexpr size_t channel_samples_per_frame = channels_per_sample * samples_per_frame; - -void init() { -} - -void allocate() { - //samples = new sample_t[channel_samples_per_frame]; - //lli = new gpdma::channel::LLI; - lli.srcaddr = reinterpret_cast(&LPC_ADC0->DR[0]); - lli.destaddr = reinterpret_cast(&shared_memory.touch_adc_frame.dr[0]); - lli.lli = lli_pointer(&lli); - lli.control = control(channels_per_sample); -} - -void free() { - //delete samples; - //delete lli; -} - -void enable() { - const auto gpdma_config = config(); - gpdma_channel.configure(lli, gpdma_config); - gpdma_channel.enable(); -} - -bool is_enabled() { - return gpdma_channel.is_enabled(); -} - -void disable() { - gpdma_channel.disable(); -} - -} /* namespace dma */ -} /* namespace touch */ diff --git a/firmware/baseband-tx/touch_dma.hpp b/firmware/baseband-tx/touch_dma.hpp deleted file mode 100644 index 777230e4c..000000000 --- a/firmware/baseband-tx/touch_dma.hpp +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef __TOUCH_DMA_H__ -#define __TOUCH_DMA_H__ - -#include "buffer.hpp" - -#include - -namespace touch { -namespace dma { - -using sample_t = uint32_t; -using buffer_t = buffer_t; - -using Handler = void (*)(); - -void init(); - -void allocate(); -void free(); - -void enable(); -bool is_enabled(); - -void disable(); - -buffer_t wait_for_buffer(); - -} /* namespace dma */ -} /* namespace touch */ - -#endif/*__TOUCH_DMA_H__*/ diff --git a/firmware/baseband/CMakeLists.txt b/firmware/baseband/CMakeLists.txt index 54010d736..118312382 100644 --- a/firmware/baseband/CMakeLists.txt +++ b/firmware/baseband/CMakeLists.txt @@ -326,6 +326,55 @@ set(MODE_CPPSRC ) DeclareTargets(PSPE wideband_spectrum) +### Jammer + +set(MODE_CPPSRC + proc_jammer.cpp +) +DeclareTargets(PJAM jammer) + +### Audio transmit + +set(MODE_CPPSRC + proc_audiotx.cpp +) +DeclareTargets(PATX audio_tx) + +### FSK LCR + +set(MODE_CPPSRC + proc_fsk_lcr.cpp +) +DeclareTargets(PLCR lcr) + +### Epar + +set(MODE_CPPSRC + proc_epar.cpp +) +DeclareTargets(PEPR epar) + +### Play audio + +set(MODE_CPPSRC + proc_playaudio.cpp +) +DeclareTargets(PPAU play_audio) + +### Xylos + +set(MODE_CPPSRC + proc_xylos.cpp +) +DeclareTargets(PXYL xylos) + +### RDS + +set(MODE_CPPSRC + proc_rds.cpp +) +DeclareTargets(PRDS rds) + ### HackRF "factory" firmware add_custom_command( diff --git a/firmware/baseband/baseband_dma.cpp b/firmware/baseband/baseband_dma.cpp index d86bef72e..c44ace814 100644 --- a/firmware/baseband/baseband_dma.cpp +++ b/firmware/baseband/baseband_dma.cpp @@ -115,16 +115,9 @@ static void dma_error() { void init() { gpdma_channel_sgpio.set_handlers(transfer_complete, dma_error); -#if defined(PORTAPACK_BASEBAND_DMA_NO_SYNC) - /* Disable synchronization logic to improve(?) DMA response time. - * SGPIO (peripheral) must be on same clock as GPDMA peripheral. - * SGPIO runs from BASE_PERIPH_CLK, which is set to PLL1 in normal - * operation, same as the M4 and M0 cores. Memory, of course, is - * running from the same clock as the cores. - */ - LPC_GPDMA->SYNC |= (1 << gpdma_src_peripheral); - LPC_GPDMA->SYNC |= (1 << gpdma_dest_peripheral); -#endif + + // LPC_GPDMA->SYNC |= (1 << gpdma_src_peripheral); + // LPC_GPDMA->SYNC |= (1 << gpdma_dest_peripheral); } void configure( @@ -167,5 +160,16 @@ baseband::buffer_t wait_for_rx_buffer() { } } +baseband::buffer_t wait_for_tx_buffer() { + const auto next_index = thread_wait.sleep(); + + if( next_index >= 0 ) { + const size_t free_index = (next_index + transfers_per_buffer - 2) & transfers_mask; + return { reinterpret_cast(lli_loop[free_index].srcaddr), transfer_samples }; + } else { + return { }; + } +} + } /* namespace dma */ } /* namespace baseband */ diff --git a/firmware/baseband/baseband_dma.hpp b/firmware/baseband/baseband_dma.hpp index 94827d4bc..99e32de8c 100644 --- a/firmware/baseband/baseband_dma.hpp +++ b/firmware/baseband/baseband_dma.hpp @@ -31,6 +31,8 @@ namespace baseband { namespace dma { +using Handler = void (*)(); + void init(); void configure( baseband::sample_t* const buffer_base, @@ -43,6 +45,7 @@ bool is_enabled(); void disable(); baseband::buffer_t wait_for_rx_buffer(); +baseband::buffer_t wait_for_tx_buffer(); } /* namespace dma */ } /* namespace baseband */ diff --git a/firmware/baseband/baseband_thread.cpp b/firmware/baseband/baseband_thread.cpp index e61fd9685..722cc109c 100644 --- a/firmware/baseband/baseband_thread.cpp +++ b/firmware/baseband/baseband_thread.cpp @@ -24,21 +24,12 @@ #include "dsp_types.hpp" #include "baseband.hpp" -#include "baseband_stats_collector.hpp" #include "baseband_sgpio.hpp" #include "baseband_dma.hpp" #include "rssi.hpp" #include "i2s.hpp" - -/*#include "proc_am_audio.hpp" -#include "proc_nfm_audio.hpp" -#include "proc_wfm_audio.hpp" -#include "proc_ais.hpp" -#include "proc_wideband_spectrum.hpp" -#include "proc_tpms.hpp" -#include "proc_ert.hpp" -#include "proc_capture.hpp"*/ +using namespace lpc43xx; #include "portapack_shared_memory.hpp" @@ -53,10 +44,12 @@ Thread* BasebandThread::thread = nullptr; BasebandThread::BasebandThread( uint32_t sampling_rate, BasebandProcessor* const baseband_processor, - const tprio_t priority + const tprio_t priority, + const baseband::Direction dir ) : baseband_processor { baseband_processor }, sampling_rate { sampling_rate } { + direction = dir; thread = chThdCreateStatic(baseband_thread_wa, sizeof(baseband_thread_wa), priority, ThreadBase::fn, this @@ -76,24 +69,40 @@ void BasebandThread::run() { const auto baseband_buffer = std::make_unique>(); baseband::dma::configure( baseband_buffer->data(), - direction() + direction ); //baseband::dma::allocate(4, 2048); - baseband_sgpio.configure(direction()); - baseband::dma::enable(direction()); + baseband_sgpio.configure(direction); + baseband::dma::enable(direction); baseband_sgpio.streaming_enable(); + + if (direction == baseband::Direction::Transmit) { + while( !chThdShouldTerminate() ) { + // TODO: Place correct sampling rate into buffer returned here: + const baseband::buffer_t buffer_tmp = baseband::dma::wait_for_tx_buffer(); + if( buffer_tmp ) { + buffer_c8_t buffer { + buffer_tmp.p, buffer_tmp.count, sampling_rate + }; - while( !chThdShouldTerminate() ) { - // TODO: Place correct sampling rate into buffer returned here: - const auto buffer_tmp = baseband::dma::wait_for_rx_buffer(); - if( buffer_tmp ) { - buffer_c8_t buffer { - buffer_tmp.p, buffer_tmp.count, sampling_rate - }; + if( baseband_processor ) { + baseband_processor->execute(buffer); + } + } + } + } else { + while( !chThdShouldTerminate() ) { + // TODO: Place correct sampling rate into buffer returned here: + const baseband::buffer_t buffer_tmp = baseband::dma::wait_for_rx_buffer(); + if( buffer_tmp ) { + buffer_c8_t buffer { + buffer_tmp.p, buffer_tmp.count, sampling_rate + }; - if( baseband_processor ) { - baseband_processor->execute(buffer); + if( baseband_processor ) { + baseband_processor->execute(buffer); + } } } } @@ -102,38 +111,3 @@ void BasebandThread::run() { baseband::dma::disable(); baseband_sgpio.streaming_disable(); } -/* -BasebandProcessor* BasebandThread::create_processor(const int32_t mode) { - switch(mode) { - case 0: return new NarrowbandAMAudio(); - case 1: return new NarrowbandFMAudio(); - case 2: return new WidebandFMAudio(); - case 3: return new AISProcessor(); - case 4: return new WidebandSpectrum(); - case 5: return new TPMSProcessor(); - case 6: return new ERTProcessor(); - case 7: return new CaptureProcessor(); - default: return nullptr; - } -} - -void BasebandThread::disable() { - if( baseband_processor ) { - i2s::i2s0::tx_mute(); - baseband::dma::disable(); - baseband_sgpio.streaming_disable(); - rf::rssi::stop(); - } -} - -void BasebandThread::enable() { - if( baseband_processor ) { - if( direction() == baseband::Direction::Receive ) { - rf::rssi::start(); - } - baseband_sgpio.configure(direction()); - baseband::dma::enable(direction()); - baseband_sgpio.streaming_enable(); - } -} -*/ diff --git a/firmware/baseband/baseband_thread.hpp b/firmware/baseband/baseband_thread.hpp index 3263b4f19..79b6beda9 100644 --- a/firmware/baseband/baseband_thread.hpp +++ b/firmware/baseband/baseband_thread.hpp @@ -33,18 +33,14 @@ public: BasebandThread( uint32_t sampling_rate, BasebandProcessor* const baseband_processor, - const tprio_t priority + const tprio_t priority, + const baseband::Direction dir ); ~BasebandThread(); - - // This getter should die, it's just here to leak information to code that - // isn't in the right place to begin with. - baseband::Direction direction() const { - return baseband::Direction::Receive; - } private: static Thread* thread; + baseband::Direction direction; BasebandProcessor* baseband_processor { nullptr }; uint32_t sampling_rate; diff --git a/firmware/baseband-tx/main.cpp b/firmware/baseband/main.cpp similarity index 100% rename from firmware/baseband-tx/main.cpp rename to firmware/baseband/main.cpp diff --git a/firmware/baseband-tx/proc_afskrx.cpp b/firmware/baseband/proc_afskrx.cpp similarity index 100% rename from firmware/baseband-tx/proc_afskrx.cpp rename to firmware/baseband/proc_afskrx.cpp diff --git a/firmware/baseband-tx/proc_afskrx.hpp b/firmware/baseband/proc_afskrx.hpp similarity index 100% rename from firmware/baseband-tx/proc_afskrx.hpp rename to firmware/baseband/proc_afskrx.hpp diff --git a/firmware/baseband/proc_ais.hpp b/firmware/baseband/proc_ais.hpp index 7fa0d40c2..f4bf84f9c 100644 --- a/firmware/baseband/proc_ais.hpp +++ b/firmware/baseband/proc_ais.hpp @@ -50,7 +50,7 @@ public: private: static constexpr size_t baseband_fs = 2457600; - BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20 }; + BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20, baseband::Direction::Receive }; std::array dst; const buffer_c16_t dst_buffer { diff --git a/firmware/baseband/proc_am_audio.hpp b/firmware/baseband/proc_am_audio.hpp index 08cca3e52..e5d3431d7 100644 --- a/firmware/baseband/proc_am_audio.hpp +++ b/firmware/baseband/proc_am_audio.hpp @@ -46,7 +46,7 @@ private: static constexpr size_t decim_2_decimation_factor = 4; static constexpr size_t channel_filter_decimation_factor = 1; - BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20 }; + BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20, baseband::Direction::Receive }; RSSIThread rssi_thread { NORMALPRIO + 10 }; std::array dst; diff --git a/firmware/baseband-tx/proc_audiotx.cpp b/firmware/baseband/proc_audiotx.cpp similarity index 90% rename from firmware/baseband-tx/proc_audiotx.cpp rename to firmware/baseband/proc_audiotx.cpp index b47cd02c9..85a40c84c 100644 --- a/firmware/baseband-tx/proc_audiotx.cpp +++ b/firmware/baseband/proc_audiotx.cpp @@ -23,6 +23,7 @@ #include "proc_audiotx.hpp" #include "portapack_shared_memory.hpp" #include "sine_table.hpp" +#include "event_m4.hpp" #include @@ -50,3 +51,9 @@ void AudioTXProcessor::execute(const buffer_c8_t& buffer){ bc++; } + +int main() { + EventDispatcher event_dispatcher { std::make_unique() }; + event_dispatcher.run(); + return 0; +} diff --git a/firmware/baseband-tx/proc_audiotx.hpp b/firmware/baseband/proc_audiotx.hpp similarity index 97% rename from firmware/baseband-tx/proc_audiotx.hpp rename to firmware/baseband/proc_audiotx.hpp index 8babe2e68..34d30be7f 100644 --- a/firmware/baseband-tx/proc_audiotx.hpp +++ b/firmware/baseband/proc_audiotx.hpp @@ -24,6 +24,7 @@ #define __PROC_AUDIOTX_H__ #include "baseband_processor.hpp" +#include "baseband_thread.hpp" #include diff --git a/firmware/baseband/proc_capture.hpp b/firmware/baseband/proc_capture.hpp index c2b48b0c8..412ad71e7 100644 --- a/firmware/baseband/proc_capture.hpp +++ b/firmware/baseband/proc_capture.hpp @@ -48,7 +48,7 @@ private: static constexpr size_t baseband_fs = 4000000; static constexpr auto spectrum_rate_hz = 50.0f; - BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20 }; + BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20, baseband::Direction::Receive }; RSSIThread rssi_thread { NORMALPRIO + 10 }; std::array dst; diff --git a/firmware/baseband/proc_closecall.cpp b/firmware/baseband/proc_closecall.cpp index 2b6bb0694..1ee1dae00 100644 --- a/firmware/baseband/proc_closecall.cpp +++ b/firmware/baseband/proc_closecall.cpp @@ -65,3 +65,9 @@ void CloseCallProcessor::on_message(const Message* const message) { break; } } + +int main() { + EventDispatcher event_dispatcher { std::make_unique() }; + event_dispatcher.run(); + return 0; +} diff --git a/firmware/baseband-tx/proc_epar.cpp b/firmware/baseband/proc_epar.cpp similarity index 92% rename from firmware/baseband-tx/proc_epar.cpp rename to firmware/baseband/proc_epar.cpp index 124ef078b..3129feb3c 100644 --- a/firmware/baseband-tx/proc_epar.cpp +++ b/firmware/baseband/proc_epar.cpp @@ -24,7 +24,7 @@ #include "dsp_iir_config.hpp" #include "audio_output.hpp" - +#include "event_m4.hpp" #include "portapack_shared_memory.hpp" #include "sine_table.hpp" @@ -65,10 +65,10 @@ void EPARProcessor::execute(const buffer_c8_t& buffer) { if (current_tu == EPAR_SPACE) { if (repeat_count == EPAR_REPEAT) { message.n = 100; // End of transmission code - shared_memory.transmit_done = true; + transmit_done = true; shared_memory.application_queue.push(message); } - if (shared_memory.transmit_done == false) { + if (transmit_done == false) { message.n = repeat_count; // Inform UI about progress (just as eye candy) shared_memory.application_queue.push(message); state = 1; @@ -102,3 +102,9 @@ void EPARProcessor::execute(const buffer_c8_t& buffer) { buffer.p[i] = {(int8_t)re,(int8_t)im}; } } + +int main() { + EventDispatcher event_dispatcher { std::make_unique() }; + event_dispatcher.run(); + return 0; +} diff --git a/firmware/baseband-tx/proc_epar.hpp b/firmware/baseband/proc_epar.hpp similarity index 97% rename from firmware/baseband-tx/proc_epar.hpp rename to firmware/baseband/proc_epar.hpp index 257f6de40..407feb01a 100644 --- a/firmware/baseband-tx/proc_epar.hpp +++ b/firmware/baseband/proc_epar.hpp @@ -24,12 +24,12 @@ #define __PROC_EPAR_H__ #include "baseband_processor.hpp" +#include "baseband_thread.hpp" #include "dsp_decimate.hpp" #include "dsp_demodulate.hpp" #include "audio_output.hpp" -#include "baseband_processor.hpp" // One bit is 0.005119048s (~200bps ?) // Time unit is 0.001706349s (586Hz) @@ -49,6 +49,7 @@ public: void execute(const buffer_c8_t& buffer) override; private: + bool transmit_done; const int8_t bitdef[2][3] = { {-127, 127, 127}, {-127, -127, 127} diff --git a/firmware/baseband/proc_ert.hpp b/firmware/baseband/proc_ert.hpp index dc0a9ecc2..e26b98909 100644 --- a/firmware/baseband/proc_ert.hpp +++ b/firmware/baseband/proc_ert.hpp @@ -62,7 +62,7 @@ private: const size_t samples_per_symbol = channel_sampling_rate / symbol_rate; const float clock_recovery_rate = symbol_rate * 2; - BasebandThread baseband_thread { baseband_sampling_rate, this, NORMALPRIO + 20 }; + BasebandThread baseband_thread { baseband_sampling_rate, this, NORMALPRIO + 20, baseband::Direction::Receive }; clock_recovery::ClockRecovery clock_recovery { clock_recovery_rate, symbol_rate, { 1.0f / 18.0f }, diff --git a/firmware/baseband-tx/proc_fsk_lcr.cpp b/firmware/baseband/proc_fsk_lcr.cpp similarity index 95% rename from firmware/baseband-tx/proc_fsk_lcr.cpp rename to firmware/baseband/proc_fsk_lcr.cpp index 4e01a924d..7ab5a8201 100644 --- a/firmware/baseband-tx/proc_fsk_lcr.cpp +++ b/firmware/baseband/proc_fsk_lcr.cpp @@ -22,6 +22,7 @@ #include "proc_fsk_lcr.hpp" #include "portapack_shared_memory.hpp" #include "sine_table.hpp" +#include "event_m4.hpp" #include @@ -108,3 +109,9 @@ void LCRFSKProcessor::execute(const buffer_c8_t& buffer) { buffer.p[i] = {(int8_t)re,(int8_t)im}; } } + +int main() { + EventDispatcher event_dispatcher { std::make_unique() }; + event_dispatcher.run(); + return 0; +} diff --git a/firmware/baseband-tx/proc_fsk_lcr.hpp b/firmware/baseband/proc_fsk_lcr.hpp similarity index 90% rename from firmware/baseband-tx/proc_fsk_lcr.hpp rename to firmware/baseband/proc_fsk_lcr.hpp index 70de97c38..bbcfca0bb 100644 --- a/firmware/baseband-tx/proc_fsk_lcr.hpp +++ b/firmware/baseband/proc_fsk_lcr.hpp @@ -23,12 +23,15 @@ #define __PROC_FSK_LCR_H__ #include "baseband_processor.hpp" +#include "baseband_thread.hpp" class LCRFSKProcessor : public BasebandProcessor { public: void execute(const buffer_c8_t& buffer) override; private: + BasebandThread baseband_thread { 2280000, this, NORMALPRIO + 20, baseband::Direction::Transmit }; + int8_t re, im; uint8_t s; uint8_t bit_pos = 0, byte_pos = 0; diff --git a/firmware/baseband-tx/proc_jammer.cpp b/firmware/baseband/proc_jammer.cpp similarity index 93% rename from firmware/baseband-tx/proc_jammer.cpp rename to firmware/baseband/proc_jammer.cpp index 001b503d5..2cb480067 100644 --- a/firmware/baseband-tx/proc_jammer.cpp +++ b/firmware/baseband/proc_jammer.cpp @@ -22,6 +22,7 @@ #include "proc_jammer.hpp" #include "portapack_shared_memory.hpp" #include "sine_table.hpp" +#include "event_m4.hpp" #include @@ -79,3 +80,9 @@ void JammerProcessor::execute(const buffer_c8_t& buffer) { buffer.p[i] = {(int8_t)re,(int8_t)im}; } }; + +int main() { + EventDispatcher event_dispatcher { std::make_unique() }; + event_dispatcher.run(); + return 0; +} diff --git a/firmware/baseband-tx/proc_jammer.hpp b/firmware/baseband/proc_jammer.hpp similarity index 97% rename from firmware/baseband-tx/proc_jammer.hpp rename to firmware/baseband/proc_jammer.hpp index 50cca639c..04a5f8f52 100644 --- a/firmware/baseband-tx/proc_jammer.hpp +++ b/firmware/baseband/proc_jammer.hpp @@ -23,6 +23,7 @@ #define __PROC_JAMMER_H__ #include "baseband_processor.hpp" +#include "baseband_thread.hpp" class JammerProcessor : public BasebandProcessor { public: diff --git a/firmware/baseband/proc_nfm_audio.hpp b/firmware/baseband/proc_nfm_audio.hpp index f4529a73f..4c39d78c0 100644 --- a/firmware/baseband/proc_nfm_audio.hpp +++ b/firmware/baseband/proc_nfm_audio.hpp @@ -43,7 +43,7 @@ public: private: static constexpr size_t baseband_fs = 3072000; - BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20 }; + BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20, baseband::Direction::Receive }; RSSIThread rssi_thread { NORMALPRIO + 10 }; std::array dst; diff --git a/firmware/baseband-tx/proc_playaudio.cpp b/firmware/baseband/proc_playaudio.cpp similarity index 93% rename from firmware/baseband-tx/proc_playaudio.cpp rename to firmware/baseband/proc_playaudio.cpp index a9aa6e562..b66af4322 100644 --- a/firmware/baseband-tx/proc_playaudio.cpp +++ b/firmware/baseband/proc_playaudio.cpp @@ -24,6 +24,7 @@ #include "portapack_shared_memory.hpp" #include "sine_table.hpp" #include "audio_output.hpp" +#include "event_m4.hpp" #include @@ -74,3 +75,9 @@ void PlayAudioProcessor::execute(const buffer_c8_t& buffer){ //AudioOutput::fill_audio_buffer(preview_audio_buffer, true); } + +int main() { + EventDispatcher event_dispatcher { std::make_unique() }; + event_dispatcher.run(); + return 0; +} diff --git a/firmware/baseband-tx/proc_playaudio.hpp b/firmware/baseband/proc_playaudio.hpp similarity index 100% rename from firmware/baseband-tx/proc_playaudio.hpp rename to firmware/baseband/proc_playaudio.hpp diff --git a/firmware/baseband-tx/proc_rds.cpp b/firmware/baseband/proc_rds.cpp similarity index 94% rename from firmware/baseband-tx/proc_rds.cpp rename to firmware/baseband/proc_rds.cpp index cc05fe308..01199f2ed 100644 --- a/firmware/baseband-tx/proc_rds.cpp +++ b/firmware/baseband/proc_rds.cpp @@ -23,6 +23,7 @@ #include "proc_rds.hpp" #include "portapack_shared_memory.hpp" #include "sine_table.hpp" +#include "event_m4.hpp" #include @@ -93,3 +94,9 @@ void RDSProcessor::execute(const buffer_c8_t& buffer) { buffer.p[i] = {(int8_t)re,(int8_t)im}; } } + +int main() { + EventDispatcher event_dispatcher { std::make_unique() }; + event_dispatcher.run(); + return 0; +} diff --git a/firmware/baseband-tx/proc_rds.hpp b/firmware/baseband/proc_rds.hpp similarity index 100% rename from firmware/baseband-tx/proc_rds.hpp rename to firmware/baseband/proc_rds.hpp diff --git a/firmware/baseband-tx/proc_sigfrx.cpp b/firmware/baseband/proc_sigfrx.cpp similarity index 100% rename from firmware/baseband-tx/proc_sigfrx.cpp rename to firmware/baseband/proc_sigfrx.cpp diff --git a/firmware/baseband-tx/proc_sigfrx.hpp b/firmware/baseband/proc_sigfrx.hpp similarity index 100% rename from firmware/baseband-tx/proc_sigfrx.hpp rename to firmware/baseband/proc_sigfrx.hpp diff --git a/firmware/baseband/proc_tpms.hpp b/firmware/baseband/proc_tpms.hpp index bc1c0b3f5..f85f19fc7 100644 --- a/firmware/baseband/proc_tpms.hpp +++ b/firmware/baseband/proc_tpms.hpp @@ -66,7 +66,7 @@ public: private: static constexpr size_t baseband_fs = 2457600; - BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20 }; + BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20, baseband::Direction::Receive }; RSSIThread rssi_thread { NORMALPRIO + 10 }; std::array dst; diff --git a/firmware/baseband/proc_wfm_audio.hpp b/firmware/baseband/proc_wfm_audio.hpp index 446990f59..6b0c5e178 100644 --- a/firmware/baseband/proc_wfm_audio.hpp +++ b/firmware/baseband/proc_wfm_audio.hpp @@ -42,7 +42,7 @@ private: static constexpr size_t baseband_fs = 3072000; static constexpr auto spectrum_rate_hz = 50.0f; - BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20 }; + BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20, baseband::Direction::Receive }; RSSIThread rssi_thread { NORMALPRIO + 10 }; std::array dst; diff --git a/firmware/baseband/proc_wideband_spectrum.hpp b/firmware/baseband/proc_wideband_spectrum.hpp index 7a650ee0a..3501f6923 100644 --- a/firmware/baseband/proc_wideband_spectrum.hpp +++ b/firmware/baseband/proc_wideband_spectrum.hpp @@ -43,7 +43,7 @@ public: private: static constexpr size_t baseband_fs = 20000000; - BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20 }; + BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20, baseband::Direction::Receive }; RSSIThread rssi_thread { NORMALPRIO + 10 }; SpectrumCollector channel_spectrum; diff --git a/firmware/baseband-tx/proc_xylos.cpp b/firmware/baseband/proc_xylos.cpp similarity index 77% rename from firmware/baseband-tx/proc_xylos.cpp rename to firmware/baseband/proc_xylos.cpp index 57bcbf902..a9ce01ea9 100644 --- a/firmware/baseband-tx/proc_xylos.cpp +++ b/firmware/baseband/proc_xylos.cpp @@ -27,6 +27,7 @@ #include "portapack_shared_memory.hpp" #include "sine_table.hpp" +#include "event_m4.hpp" #include @@ -34,7 +35,9 @@ void XylosProcessor::execute(const buffer_c8_t& buffer) { // This is called at 1536000/2048 = 750Hz - // ai = 0; + if( !configured ) { + return; + } for (size_t i = 0; i= CCIR_TONELENGTH) { - if (shared_memory.transmit_done == false) { + if (transmit_done == false) { message.n = byte_pos; // Inform UI about progress (just as eye candy) shared_memory.application_queue.push(message); - digit = shared_memory.xylosdata[byte_pos++]; + digit = xylosdata[byte_pos++]; } - if (digit == 0xFF) { + if ((digit == 0xFF) || (byte_pos >= 21)) { message.n = 25; // End of message code - shared_memory.transmit_done = true; + transmit_done = true; shared_memory.application_queue.push(message); } @@ -78,7 +81,7 @@ void XylosProcessor::execute(const buffer_c8_t& buffer) { re = 0; im = 0; } else { - sample = (sine_table_f32[(aphase & 0x03FF0000)>>18]*127); // 255 here before :D + sample = (sine_table_f32[(aphase & 0x03FF0000)>>18]*127); // 255 here before // Audio preview sample generation: 1536000/48000 = 32 /*if (as >= 31) { @@ -103,3 +106,22 @@ void XylosProcessor::execute(const buffer_c8_t& buffer) { //audio_output.write(audio_buffer); } + +void XylosProcessor::on_message(const Message* const p) { + const auto message = *reinterpret_cast(p); + if (message.id == Message::ID::XylosConfigure) { + memcpy(xylosdata, message.ccir_message, 21); + byte_pos = 0; + digit = 0; + sample_count = CCIR_TONELENGTH; + as = 0; + transmit_done = false; + configured = true; + } +} + +int main() { + EventDispatcher event_dispatcher { std::make_unique() }; + event_dispatcher.run(); + return 0; +} diff --git a/firmware/baseband-tx/proc_xylos.hpp b/firmware/baseband/proc_xylos.hpp similarity index 89% rename from firmware/baseband-tx/proc_xylos.hpp rename to firmware/baseband/proc_xylos.hpp index db5baab00..2b9b84001 100644 --- a/firmware/baseband-tx/proc_xylos.hpp +++ b/firmware/baseband/proc_xylos.hpp @@ -29,7 +29,7 @@ #include "dsp_demodulate.hpp" #include "audio_output.hpp" -#include "baseband_processor.hpp" +#include "baseband_thread.hpp" #define CCIR_TONELENGTH (15360*2)-1 // 1536000/10/10 #define PHASEV (436.91/2) // (65536*1024)/1536000*10 @@ -38,8 +38,15 @@ class XylosProcessor : public BasebandProcessor { public: void execute(const buffer_c8_t& buffer) override; + + void on_message(const Message* const p) override; private: + bool configured = false; + bool transmit_done = false; + + BasebandThread baseband_thread { 1536000, this, NORMALPRIO + 20, baseband::Direction::Transmit }; + uint32_t ccir_phases[16] = { (uint32_t)(1981*PHASEV), (uint32_t)(1124*PHASEV), @@ -59,6 +66,7 @@ private: (uint32_t)(1055*PHASEV) }; + char xylosdata[21]; int8_t re, im; uint8_t s, as = 0, ai; uint8_t byte_pos = 0; diff --git a/firmware/baseband/spectrum_collector.cpp b/firmware/baseband/spectrum_collector.cpp index 564182e93..0d288beee 100644 --- a/firmware/baseband/spectrum_collector.cpp +++ b/firmware/baseband/spectrum_collector.cpp @@ -47,7 +47,6 @@ void SpectrumCollector::on_message(const Message* const message) { } void SpectrumCollector::set_state(const SpectrumStreamingConfigMessage& message) { - set_decimation_factor(message.decimation_factor); if( message.mode == SpectrumStreamingConfigMessage::Mode::Running ) { start(); } else { diff --git a/firmware/baseband/terminator.img b/firmware/baseband/terminator.img new file mode 100644 index 0000000000000000000000000000000000000000..1b1cb4d44c57c2d7a5122870fa6ac3e62ff7e94e GIT binary patch literal 8 KcmZQzfB*mh2mk>9 literal 0 HcmV?d00001 diff --git a/firmware/common/message.hpp b/firmware/common/message.hpp index 7850b5d18..a2643cd91 100644 --- a/firmware/common/message.hpp +++ b/firmware/common/message.hpp @@ -67,7 +67,7 @@ public: TXDone = 20, Retune = 21, - ReadyForSwitch = 22, + XylosConfigure = 22, AFSKData = 23, ModuleID = 24, FIFOSignal = 25, @@ -490,12 +490,16 @@ public: char md5_signature[16]; }; -class ReadyForSwitchMessage : public Message { +class XylosConfigureMessage : public Message { public: - ReadyForSwitchMessage( - ) : Message { ID::ReadyForSwitch } + XylosConfigureMessage( + const char data[] + ) : Message { ID::XylosConfigure } { + memcpy(ccir_message, data, 21); } + + char ccir_message[21]; }; class RetuneMessage : public Message { diff --git a/firmware/common/portapack_shared_memory.hpp b/firmware/common/portapack_shared_memory.hpp index 0bb9e530f..2940688d4 100644 --- a/firmware/common/portapack_shared_memory.hpp +++ b/firmware/common/portapack_shared_memory.hpp @@ -60,11 +60,8 @@ struct SharedMemory { JammerRange jammer_ranges[16]; - char xylosdata[21]; char epardata[13]; int32_t excursion; - - bool transmit_done; }; extern SharedMemory& shared_memory; diff --git a/firmware/common/spi_image.hpp b/firmware/common/spi_image.hpp index e11437127..6895ad041 100644 --- a/firmware/common/spi_image.hpp +++ b/firmware/common/spi_image.hpp @@ -70,6 +70,15 @@ constexpr image_tag_t image_tag_nfm_audio { 'P', 'N', 'F', 'M' }; constexpr image_tag_t image_tag_tpms { 'P', 'T', 'P', 'M' }; constexpr image_tag_t image_tag_wfm_audio { 'P', 'W', 'F', 'M' }; constexpr image_tag_t image_tag_wideband_spectrum { 'P', 'S', 'P', 'E' }; + +constexpr image_tag_t image_tag_jammer { 'P', 'J', 'A', 'M' }; +constexpr image_tag_t image_tag_audio_tx { 'P', 'A', 'T', 'X' }; +constexpr image_tag_t image_tag_lcr { 'P', 'L', 'C', 'R' }; +constexpr image_tag_t image_tag_epar { 'P', 'E', 'P', 'R' }; +constexpr image_tag_t image_tag_play_audio { 'P', 'P', 'A', 'U' }; +constexpr image_tag_t image_tag_xylos { 'P', 'X', 'Y', 'L' }; +constexpr image_tag_t image_tag_rds { 'P', 'R', 'D', 'S' }; + constexpr image_tag_t image_tag_hackrf { 'H', 'R', 'F', '1' }; struct chunk_t { diff --git a/firmware/portapack-h1-firmware.bin b/firmware/portapack-h1-firmware.bin index 7717ea9c14b88eb7e5a8850f166ef09dbe63d614..6ed98779a7bb4dd040a0629c053d039c846c7b66 100644 GIT binary patch delta 203729 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

UY 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 +//use +use +include + +module case() { + difference() { + if( case_radiused ) { + case_outer_volume_radiused(); + } else { + case_outer_volume_squared(); + } + + union() { + if( case_radiused ) { + case_bottom_void_tool_volume_ball(); + } else { + case_bottom_void_tool_volume_end(); + } + + case_pcb_plane_void_tool_volume(); + pcb_attach_drills_volume(); + case_bumpers_emboss(); + translate([0, 0, h1_pcb_thickness]) portapack_h1_stack_drills(); + } + } +} + +/* Cross section */ +module case_cross_section() { + difference() { + case(); + translate([70, -10, -10]) cube([100, 100, 100]); + } +} + +module case_and_h1() { + case(); + translate([0, 0, h1_pcb_thickness]) hackrf_one(); +} + +module case_and_stack() { + case(); + translate([0, 0, h1_pcb_thickness]) portapack_h1_stack(); +} + +module stack_case_interference() { + intersection() { + case(); + translate([0, 0, h1_pcb_thickness]) portapack_h1_stack(); + } +} + +module stack_stack_interference() { + // Ensure stack and spacers do not interfere. + intersection() { + union() { + portapack_h1_stack_hackrf_one(); + portapack_h1_stack_portapack(); + } + portapack_h1_stack_spacers(); + } + + // Ensure screws do not interfere with stack. + intersection() { + union() { + portapack_h1_stack_hackrf_one(); + portapack_h1_stack_spacers(); + portapack_h1_stack_portapack(); + } + portapack_h1_stack_screws(); + } +} + +case(); +//case_and_h1(); +//case_and_stack(); +//case_cross_section(); +//stack_case_interference(); +//stack_stack_interference(); diff --git a/hardware/portapack_h1/case/pp_h1_parameters.scad b/hardware/portapack_h1/case/pp_h1_parameters.scad new file mode 100644 index 000000000..fa86fa9f8 --- /dev/null +++ b/hardware/portapack_h1/case/pp_h1_parameters.scad @@ -0,0 +1,64 @@ +pcb_l = 120; +pcb_w = 75; +pcb_corner_r = 4; +pcb_hole_r = 3.2 / 2; +pcb_hole_pad_r = 5.6 / 2; + +h1_pcb_thickness = 1.64; +pp_h1_pcb_thickness = 1.56; + +spacer_height = 0.5 * 25.4; + +bolt_drill_d = 3.0; +pcb_attach_drills_depth = 4.0; + +pcb_case_clearance = 0.5; +case_thickness = 1.5; +case_bottom_thickness = case_thickness * 2; +h1_pcb_bottom_clearance = 4.0; +case_bottom_tool_r = 3.0; +case_lid_thickness = 0.125 * 25.4; + +case_height_above_datum = h1_pcb_thickness + spacer_height + pp_h1_pcb_thickness + case_lid_thickness; +case_height_below_datum = case_bottom_thickness + h1_pcb_bottom_clearance; +case_height = case_height_below_datum + case_height_above_datum; + +attach_foot_r = pcb_hole_pad_r; +attach_drill_r = bolt_drill_d / 2.0; + +case_bumper_d = 0.5 * 25.4; +case_bumper_clearance = 0.5; +case_bumper_emboss_depth = 1.0; + +case_radiused = true; + +case_bumper_inset_from_pcb_edge = case_radiused ? 10.0 : 8.0; + +mounting_drills = [ + [4, 4], + [66, pcb_w - 4], + [116, 4], + [4, pcb_w - 4], + [71, pcb_w - 44], + [116, pcb_w - 4] +]; + +module pcb_extents() { + square([pcb_l, pcb_w]); +} + +module pcb_outline() { + minkowski() { + offset(r=-pcb_corner_r) { + pcb_extents(); + } + circle(r=pcb_corner_r); + } +} + +module pcb_outline_clearance() { + minkowski() { + pcb_outline(); + circle(r=pcb_case_clearance); + } +} diff --git a/hardware/portapack_h1/case/pp_h1_shell.scad b/hardware/portapack_h1/case/pp_h1_shell.scad new file mode 100644 index 000000000..86241a336 --- /dev/null +++ b/hardware/portapack_h1/case/pp_h1_shell.scad @@ -0,0 +1,152 @@ +include + +$fs=0.1; + +module attach_corner() { + circle(attach_foot_r); + polygon([[-10, -10],[attach_foot_r, -10],[attach_foot_r, 0],[0, attach_foot_r],[-10, attach_foot_r]]); +} + +module attach_side() { + circle(attach_foot_r); + translate([0, -attach_foot_r]) square([10, attach_foot_r * 2]); +} + +module attach_center() { + circle(attach_foot_r); +} + +module pcb_supports() { + translate(mounting_drills[0]) attach_corner(); + translate(mounting_drills[1]) rotate(90) attach_side(); + translate(mounting_drills[2]) rotate(90) attach_corner(); + translate(mounting_drills[3]) rotate(270) attach_corner(); + translate(mounting_drills[4]) attach_center(); + translate(mounting_drills[5]) rotate(180) attach_corner(); +} + +module pcb_attach_drill_outline() { + circle(r=attach_drill_r); +} + +module pcb_attach_drills_outline() { + for(p = mounting_drills) { + translate(p) pcb_attach_drill_outline(); + } +} + +module pcb_attach_drills_volume() { + translate([0, 0, -pcb_attach_drills_depth]) linear_extrude(height=30) { + pcb_attach_drills_outline(); + } +} + +module case_bottom_void_edge() { + // Edge of PCB, plus case clearance, minus board supports. + difference() { + pcb_outline_clearance(); + pcb_supports(); + } +} + +module case_bottom_void_tool_path() { + // Tool path to cut bottom of case. + offset(r=-case_bottom_tool_r) { + case_bottom_void_edge(); + } +} + +module case_bottom_void_tool_volume_ball() { + $fs=2; + $fn=18; + // Tool cut volume for bottom of case. + // Z=0 at bottom plane of H1 PCB + translate([0, 0, -h1_pcb_bottom_clearance + case_bottom_tool_r]) minkowski() { + linear_extrude(height=50, convexity=10) { + case_bottom_void_tool_path(); + } + sphere(r=case_bottom_tool_r); + } +} + +module case_outer_volume_radiused() { + $fs=2; + $fn=18; + tool_r = case_bottom_tool_r + case_thickness; + tz = h1_pcb_bottom_clearance + case_bottom_thickness - tool_r; + difference() { + // Rounded volume + translate([0, 0, -tz]) { + minkowski() { + linear_extrude(height=30, convexity=10) { + offset(r=-case_bottom_tool_r) { + pcb_outline_clearance(); + } + } + sphere(r=tool_r); + } + } + + // Cut off the top. + translate([-10, -10, case_height_above_datum]) cube([200, 200, 200]); + } +} + +module case_bottom_void_tool_volume_end() { + // Tool cut volume for bottom of case. + // Z=0 at bottom plane of H1 PCB + translate([0, 0, -h1_pcb_bottom_clearance]) { + linear_extrude(height=50) { + minkowski() { + case_bottom_void_tool_path(); + circle(r=case_bottom_tool_r); + } + } + } +} + +module case_bumper_emboss_outline() { + circle(r=case_bumper_d / 2 + case_bumper_clearance); +} + +module case_bumper_emboss_tool() { + height = 10; + translate([0, 0, -height]) linear_extrude(height=height) { + case_bumper_emboss_outline(); + } +} + +module case_bumpers_emboss() { + tz = case_height_below_datum - case_bumper_emboss_depth; + translate([0, 0, -tz]) { + translate([case_bumper_inset_from_pcb_edge, case_bumper_inset_from_pcb_edge, 0]) case_bumper_emboss_tool(); + translate([pcb_l - case_bumper_inset_from_pcb_edge, case_bumper_inset_from_pcb_edge, 0]) case_bumper_emboss_tool(); + translate([case_bumper_inset_from_pcb_edge, pcb_w - case_bumper_inset_from_pcb_edge, 0]) case_bumper_emboss_tool(); + translate([pcb_l - case_bumper_inset_from_pcb_edge, pcb_w - case_bumper_inset_from_pcb_edge, 0]) case_bumper_emboss_tool(); + } +} + +module case_pcb_plane_void_tool_edge() { + offset(r=-pcb_corner_r) { + pcb_outline_clearance(); + } +} + +module case_pcb_plane_void_tool_volume() { + linear_extrude(height=30, convexity=10) { + minkowski() { + case_pcb_plane_void_tool_edge(); + circle(r=pcb_corner_r); + } + } +} + +module case_outer_volume_squared() { + t = case_bottom_thickness + h1_pcb_bottom_clearance; + translate([0, 0, -t]) linear_extrude(height=t + case_height_above_datum) { + minkowski() { + pcb_outline(); + circle(r=pcb_case_clearance + case_thickness); + } + } +} diff --git a/hardware/portapack_h1/case/pp_h1_stack.scad b/hardware/portapack_h1/case/pp_h1_stack.scad new file mode 100644 index 000000000..d028c9d10 --- /dev/null +++ b/hardware/portapack_h1/case/pp_h1_stack.scad @@ -0,0 +1,846 @@ +include + +$fs=0.1; + +module pcb_mounting_hole_drill() { + circle(r=pcb_hole_r); +} + +module pcb_mounting_hole_drills() { + translate([ 64, 104]) pcb_mounting_hole_drill(); + translate([126, 104]) pcb_mounting_hole_drill(); + translate([176, 104]) pcb_mounting_hole_drill(); + translate([ 64, 171]) pcb_mounting_hole_drill(); + translate([131, 144]) pcb_mounting_hole_drill(); + translate([176, 171]) pcb_mounting_hole_drill(); +} + +//////////////////////////////////////////////////////// + +module pcb_cutout_antenna_pos() { + x = 61.5; + y1 = 154.75; + y2 = 167.25; + r = 1.5; + minkowski() { + polygon( + points=[[x+8,y1-4],[x,y1-4],[x,y1],[x+4,y1],[x+4,y2],[x,y2],[x,y2+4],[x+8,y2+4]] + ); + circle(r=r); + }; +} + +module pcb_cutout_antenna_neg_curve() { + x = 59.5; + y1 = 157; + y2 = 165; + r = 1.5; + minkowski() { + polygon( + points=[[x-2,y1],[x,y1],[x,y2],[x-2,y2]] + ); + circle(r=r); + }; +} + +module pcb_cutout_antenna_neg() { + x = 60.5; + y1 = 157; + y2 = 165; + w = -4; + union() { + polygon( + points=[[x+w,y1-3],[x,y1-3],[x,y2+3],[x+w,y2+3]] + ); + pcb_cutout_antenna_neg_curve(); + } +} + +module pcb_cutout_antenna() { + difference() { + pcb_cutout_antenna_neg(); + pcb_cutout_antenna_pos(); + } +} + +//////////////////////////////////////////////////////// + +module pcb_cutout_clocks_pos() { + x = 178.5; + y1 = 138.75; + y2 = 169.25; + r = 1.5; + w = 8; + w2 = 4; + minkowski() { + polygon( + points=[[x-w,y1-4],[x,y1-4],[x,y1],[x-w2,y1],[x-w2,y2],[x,y2],[x,y2+4],[x-w,y2+4]] + ); + circle(r=r); + }; +} + +module pcb_cutout_clock_neg_curve() { + x = 180.5; + y1 = 141; + y2 = 167; + r = 1.5; + w = 2; + minkowski() { + polygon( + points=[[x,y1],[x+w,y1],[x+w,y2],[x,y2]] + ); + circle(r=r); + }; +} + +module pcb_cutout_clocks_neg() { + x = 179.5; + y1 = 141; + y2 = 167; + w = 6; + union() { + polygon( + points=[[x,y1-3],[x+w,y1-3],[x+w,y2+3],[x,y2+3]] + ); + pcb_cutout_clock_neg_curve(); + } +} + +module pcb_cutout_clocks() { + difference() { + pcb_cutout_clocks_neg(); + pcb_cutout_clocks_pos(); + } +} + +//////////////////////////////////////////////////////// + +bulkhead_w = 6.35; +bulkhead_h = 6.35; +bulkhead_thickness = 1.02; + +barrel_d = 6.2; +barrel_clip_d = 5.5; +barrel_l = 12.45 - bulkhead_thickness; + +barrel_r = barrel_d / 2; +barrel_clip_r = barrel_clip_d / 2; + +peg_l = 3.81; +peg_w = 1.02; +peg_bottom_h = 0.76; +peg_top_h = 1.27; +peg_space = 1.78; + +module sma_73251_2120_pegs() { + peg_top_ty = bulkhead_h/2 - peg_bottom_h - peg_space - peg_top_h; + linear_extrude(height=peg_l) + { + translate([-bulkhead_w/2, peg_top_ty]) + square([peg_w, peg_top_h]); + translate([bulkhead_w/2 - peg_w, peg_top_ty]) + square([peg_w, peg_top_h]); + translate([-bulkhead_w/2, bulkhead_h/2 - peg_bottom_h]) + square([peg_w, peg_bottom_h]); + translate([bulkhead_w/2 - peg_w, bulkhead_h/2 - peg_bottom_h]) + square([peg_w, peg_bottom_h]); + } +} + +module sma_73251_2120_barrel_outline_circle() { + circle(r=barrel_r); +} + +module sma_73251_2120_barrel_outline() { + intersection() { + sma_73251_2120_barrel_outline_circle(); + square([barrel_clip_d, barrel_d + 1], center=true); + } +} + +module sma_73251_2120_barrel() { + linear_extrude(height=barrel_l) { + sma_73251_2120_barrel_outline(); + } +} + +module sma_73251_2120_bulkhead() { + linear_extrude(height=bulkhead_thickness) { + square([bulkhead_w, bulkhead_h], center=true); + } +} + +module sma_73251_2120_union() { + union() { + translate([0, 0, -peg_l]) sma_73251_2120_pegs(); + sma_73251_2120_bulkhead(); + translate([0, 0, bulkhead_thickness]) sma_73251_2120_barrel(); + } +} +/* +module sma_73251_2120() { + ty = bulkhead_h/2 - peg_bottom_h - peg_space/2; + rotate([90, 0, 0]) translate([0, -ty, 0]) { + union() { + translate([0, 0, -peg_l]) sma_73251_2120_pegs(); + sma_73251_2120_bulkhead(); + translate([0, 0, bulkhead_thickness]) sma_73251_2120_barrel(); + } + } +} +*/ +module sma_73251_2120_orient(board_thickness) { + // Align so that top surface of bottom peg is at z=0 (bottom of PCB). + t = peg_top_h / 2 + (peg_space - board_thickness) / 2; + translate([0, 0, -t]) rotate([90, 0, -90]) { + children(); + } +} + +module sma_73251_2120(refdes, board_thickness) { + sma_73251_2120_orient(board_thickness) { + sma_73251_2120_union(); + } +} + +module sma_73251_2120_drill(tolerance, board_thickness) { + sma_73251_2120_orient(board_thickness) { + linear_extrude(height=30) { + minkowski() { + sma_73251_2120_barrel_outline_circle(); + circle(r=tolerance); + } + } + } +} + +//////////////////////////////////////////////////////// + +module led(refdes, c) { + rotate(90) translate([-0.25, -2.15/2, -0.60]) { + color("gray") linear_extrude(height=0.60) { + square([0.50, 2.15]); + translate([0, 2.15/2]) circle(r=0.5); + } + } +} + +module led_drill() { + hole_diameter = 2; + + translate([0, -0.25, -0.3]) { + rotate([90, 0, 0]) { + cylinder(d=hole_diameter, h=10); + } + } +} + +//////////////////////////////////////////////////////// + +module sw_outline() { + circle(d=3.51, center=true); +} + +sw_a = 3.25; +sw_l = 5.85; +sw_tz = sw_l - sw_a; + +sw_large_hole_spacing = 7.01; +sw_large_hole_diameter = 1.30; +sw_small_hole_spacing = 4.50; +sw_small_hole_diameter = 0.99; +sw_large_small_hole_spacing = 2.49; +sw_pin_length_below_datum = 3.51; + +sw_button_z_offset = 4.01; + +module sw() { + rotate([180, 0, 90]) { + rotate([90, 0, 0]) { + translate([0, 4.01, sw_tz]) { + color("gray") translate([-7.11/2, -sw_button_z_offset, -3.68]) linear_extrude(height=3.68) square([7.11, 7.01]); + color("blue") linear_extrude(height=sw_a) sw_outline(); + } + } + + rotate([180, 0, 180]) linear_extrude(height=sw_pin_length_below_datum) { + translate([-sw_large_hole_spacing/2, sw_large_small_hole_spacing]) circle(d=sw_large_hole_diameter); + translate([ sw_large_hole_spacing/2, sw_large_small_hole_spacing]) circle(d=sw_large_hole_diameter); + translate([-sw_small_hole_spacing/2, 0]) circle(d=sw_small_hole_diameter); + translate([ sw_small_hole_spacing/2, 0]) circle(d=sw_small_hole_diameter); + } + } +} + +module sw_drill(clearance) { + translate([0, 0, -sw_button_z_offset]) { + rotate([0, -90, 0]) { + linear_extrude(h=10) { + minkowski() { + sw_outline(); + circle(r=clearance); + } + } + } + } +} + +//////////////////////////////////////////////////////// + +module header_x2(nx, b) { + ny = 2; + + w = 5.08; + d = 8.50; + + pin_spacing_x = 2.54; + pin_spacing_y = 2.54; + pin_d = 1.02; + pin_length = 3.2; + + rotate([180, 0, 0]) { + color("gray") translate([-b/2, -w/2, 0]) linear_extrude(height=d) square([b, w]); + + pin_tx = nx * pin_spacing_x / -2; + pin_ty = ny * pin_spacing_y / -2; + translate([pin_tx, pin_ty]) { + for(y = [1 : ny]) { + for(x = [1 : nx]) { + tx = (x - 0.5) * pin_spacing_x; + ty = (y - 0.5) * pin_spacing_y; + translate([tx, ty]) { + rotate([180, 0]) { + linear_extrude(height=pin_length) { + circle(d=pin_d); + } + } + } + } + } + } + } +} + +module header_11x2() { + nx = 11; + b = 28.44; + header_x2(nx, b); +} + +module header_13x2() { + nx = 13; + b = 33.52; + header_x2(nx, b); +} + +//////////////////////////////////////////////////////// + +module usb_plug_poly() { + inner_w1 = 6.9; + inner_h1 = 1.1; + inner_h = 1.85; + inner_w2 = 5.4; + inner_dw = inner_w1 - inner_w2; + + translate([-inner_w1/2, 0]) + polygon(points=[ + [0, 0], + [inner_w1, 0], + [inner_w1, inner_h1], + [inner_w1 - inner_dw/2, inner_h], + [inner_dw/2, inner_h], + [0, inner_h1] + ]); +} + +module usb_body_outline() { + body_buffer_r = 0.3; + + translate([0, body_buffer_r]) { + minkowski() { + usb_plug_poly(); + circle(r=body_buffer_r); + } + } +} + +module usb_plug_outline() { + outer_h = 3; + outer_ty = (outer_h - 2.45) / 2; + outer_buffer_r = 0.6; + + translate([0, outer_ty]) { + minkowski() { + usb_plug_poly(); + circle(r=outer_buffer_r); + } + } +} + +usb_body_h = 2.45; +usb_body_depth = 5.0; + +//usb_outer_w1 = 8; +usb_outer_depth = 0.63; + +module usb_transform() { + rotate([90, 180, 270]) translate([0, 0, -usb_outer_depth - 2.15 + 1.65]) children(); +} + +module usb() { + color("lightgray") usb_transform() { + translate([0, 0, usb_outer_depth]) { + linear_extrude(height=usb_body_depth) { + usb_body_outline(); + } + } + + linear_extrude(height=usb_outer_depth) { + usb_plug_outline(); + } + } +} + +module usb_drill(clearance) { + usb_transform() { + translate([0, 0, -usb_outer_depth - 10]) { + linear_extrude(height=20) { + minkowski() { + usb_plug_outline(); + circle(r=clearance); + } + } + } + } +} + +//////////////////////////////////////////////////////// + +module pcb_outline() { + minkowski() { + polygon( + points=[[64,104], [176,104], [176,171], [64,171]] + ); + circle(r=pcb_corner_r); + } +} + +module pcb_shape() { + difference() { + pcb_outline(); + pcb_cutout_antenna(); + pcb_cutout_clocks(); + pcb_mounting_hole_drills(); + } +} + +//////////////////////////////////////////////////////// + +module hackrf_one_components() { + color("green") linear_extrude(height=h1_pcb_thickness) pcb_shape(); + + translate([ 61.00, 161.00]) rotate( 0) sma_73251_2120("p4" , h1_pcb_thickness); + translate([179.00, 145.00]) rotate(180) sma_73251_2120("p2" , h1_pcb_thickness); + translate([179.00, 163.00]) rotate(180) sma_73251_2120("p16", h1_pcb_thickness); + + translate([ 61.00, 117.90]) rotate(-90) led("d7", "green"); + translate([ 61.27, 130.55]) rotate(-90) led("d8", "yellow"); + translate([ 61.27, 135.12]) rotate(-90) led("d2", "red"); + translate([ 61.27, 139.69]) rotate(-90) led("d4", "green"); + translate([ 61.27, 144.27]) rotate(-90) led("d5", "yellow"); + translate([ 61.27, 148.84]) rotate(-90) led("d6", "red"); + + translate([ 62.70, 111.40]) sw(); + translate([ 62.70, 124.40]) sw(); + + translate([171.76, 143.25]) rotate([0, 0, 90]) header_11x2("p20"); + translate([152.71, 164.84]) rotate([0, 0, 180]) header_13x2("p22"); + translate([123.50, 143.25]) rotate([0, 0, 90]) header_11x2("p28"); + + translate([180.00, 124.00]) usb(); +} + +module hackrf_one_transform() { + rotate([180, 0, 0]) translate([-60, -100 - pcb_w]) + children(); +} + +module hackrf_one() { + hackrf_one_transform() hackrf_one_components(); +} + +//////////////////////////////////////////////////////// + +module spacer() { + outer_d = 0.25 * 25.4; + inner_d = 0.140 * 25.4; + + //inner_d = ? + rotate([0, 180, 0]) { + color("lightgray") { + difference() { + linear_extrude(height=spacer_height) { + circle(d=outer_d); + } + translate([0, 0, -0.5]) { + linear_extrude(height=spacer_height + 1) { + circle(d=inner_d); + } + } + } + } + } +} + +module screw() { + wrench_sides = 6; + wrench_diameter = 2.0 / cos(360 / wrench_sides / 2); + + head_height = 2.0; + head_d = 5.5; + + shaft_length = 20.0; + threaded_d = 3.0; + + color("gray") { + translate([0, 0, -head_height]) difference() { + linear_extrude(height=head_height) + circle(d=head_d); + translate([0, 0, -0.5]) linear_extrude(height=head_height + 1) + circle(d=wrench_diameter, $fn=wrench_sides); + } + linear_extrude(height=shaft_length) + circle(d=threaded_d); + } +} + +//////////////////////////////////////////////////////// + +module header_mle_dual(name, nx) { + w = nx * 2.54; + h = 5; + d = 2.54; + offset = 3.81 - d; + + base_h = 7.44; + + translate([-w/2, -h/2, offset]) { + color("gray") linear_extrude(height=d) square([w, h]); + } + translate([-w/2, -base_h/2]) { + color("lightgray") { + linear_extrude(height=offset) square([w, base_h]); + } + } +} + +module lcd_kingtech() { + body_w = 42.72; + body_h = 60.26; + body_d = 2.50; + + touch_d = 0.7; + + tape_d = 0.1; + + view_w = 36.72; + view_h = 48.96; + view_tx = (body_w - view_w) / 2; + view_ty = 1.25 + 2.95; + + tab_w = 0.7; + tab_h = 2.5; + tab_d = 0.9; + tab_tz = body_d - tab_d; + tab_bot_ty = body_h - tab_h; + + translate([-body_w / 2, -view_ty - view_h/2, -(body_d + touch_d)]) { + translate([0, 0, touch_d]) { + color("beige") difference() { + linear_extrude(height=body_d) { + square([body_w, body_h]); + } + + translate([view_tx, view_ty, -1]) { + linear_extrude(height=2) { + square([view_w, view_h]); + } + } + } + + color("beige") translate([0, 0, tab_tz]) { + linear_extrude(height=tab_d) { + translate([-tab_w, 0]) square([tab_w, tab_h]); + translate([-tab_w, tab_bot_ty]) square([tab_w, tab_h]); + translate([body_w, 0]) square([tab_w, tab_h]); + translate([body_w, tab_bot_ty]) square([tab_w, tab_h]); + } + } + + color("black") translate([view_tx, view_ty]) { + linear_extrude(height=1) { + square([view_w, view_h]); + } + } + } + + color("lightgray", alpha=0.5) { + linear_extrude(height=touch_d) { + square([body_w, body_h]); + } + } + } +} + +module control_wheel() { + h = 6.0; + + top_d = 32.0; + top_h = 3.0; + + ring_d = 34.4; + ring_h = 0.2; + + bot_d = ring_d; + bot_h = h - ring_h - top_h; + + translate([0, 0, -h]) + color("white") + linear_extrude(height=top_h) + circle(d=top_d); + + translate([0, 0, -(h - top_h)]) + color("white") + linear_extrude(height=ring_h) + circle(d=ring_d); + + translate([0, 0, -(h - top_h - ring_h)]) + color("black") + linear_extrude(height=bot_h) + circle(d=bot_d); +} + +module audio_jack_hole() { + hole_outer_d = 5.00; + + circle(d=hole_outer_d); +} + +audio_jack_body_w = 6.00; +audio_jack_body_h = 5.00; +audio_jack_body_depth = 15.5; + +audio_jack_hole_inner_d = 3.600; +audio_jack_hole_depth = 1.5; + +audio_jack_mounting_offset = 7; + +module audio_jack() { + color("gray") rotate([90, 0, 0]) { + translate([0, audio_jack_body_h/2, -audio_jack_hole_depth - audio_jack_mounting_offset]) { + translate([0, 0, audio_jack_hole_depth]) + linear_extrude(height=audio_jack_body_depth) + square([audio_jack_body_w, audio_jack_body_h], center=true); + difference() { + linear_extrude(height=audio_jack_hole_depth) + audio_jack_hole(); + translate([0, 0, -0.5]) + linear_extrude(height=audio_jack_hole_depth + 1) + circle(d=audio_jack_hole_inner_d); + } + } + } +} + +module audio_jack_drill(diameter) { + translate([0, audio_jack_mounting_offset, audio_jack_body_h/2]) { + rotate([-90, 0, 0]) { + linear_extrude(height=10) { + circle(r=diameter / 2.0); + } + } + } +} + +micro_sd_body_h = 1.32; +micro_sd_body_w = 13.825; +micro_sd_body_depth = 15.25; + +micro_sd_card_w = 11.0; +micro_sd_card_h = 1.0; +micro_sd_card_depth = 15.0; + +micro_sd_card_tx = 0.9; +micro_sd_card_ty = (micro_sd_body_h - micro_sd_card_h) / 2; +micro_sd_card_insert_depth = micro_sd_card_depth - 2.3; + +micro_sd_card_eject_depth = micro_sd_card_depth - (2.3 + 3.3); + +module micro_sd() { + translate([-micro_sd_body_w/2, -micro_sd_body_depth/2]) { + rotate([90, 0, 0]) { + color("lightgray") difference() { + translate([0, 0, -micro_sd_body_depth]) + linear_extrude(height=micro_sd_body_depth) + square([micro_sd_body_w, micro_sd_body_h]); + translate([micro_sd_card_tx, micro_sd_card_ty, -micro_sd_card_insert_depth]) + linear_extrude(height=micro_sd_card_depth) + square([micro_sd_card_w, micro_sd_card_h]); + } + + color("black") + translate([micro_sd_card_tx, micro_sd_card_ty, -micro_sd_card_eject_depth]) + linear_extrude(height=micro_sd_card_depth) + square([micro_sd_card_w, micro_sd_card_h]); + } + } +} + +module micro_sd_drill(clearance) { + extra_width = 2; + translate([-micro_sd_body_w/2, 0]) { + rotate([90, 0, 0]) { + translate([micro_sd_card_tx - clearance - extra_width, micro_sd_card_ty - clearance, micro_sd_body_depth/2]) { + cube([micro_sd_card_w + 2 * clearance + extra_width, micro_sd_card_h + 2 * clearance, 10]); + } + } + } +} + +//////////////////////////////////////////////////////// + +module portapack_h1_pcb_mounting_hole_drills() { + translate([ 64, 104]) pcb_mounting_hole_drill(); + translate([126, 104]) pcb_mounting_hole_drill(); + translate([176, 104]) pcb_mounting_hole_drill(); + translate([ 64, 171]) pcb_mounting_hole_drill(); + translate([176, 171]) pcb_mounting_hole_drill(); +} + +module portapack_h1_pcb_shape() { + difference() { + pcb_outline(); + portapack_h1_pcb_mounting_hole_drills(); + } +} + +module portapack_h1_pcb() { + color("green") linear_extrude(height=pp_h1_pcb_thickness) { + portapack_h1_pcb_shape(); + } +} + +module portapack_h1_components_top() { + translate([ 94.83, 137.50]) rotate(90) lcd_kingtech(); + translate([147.50, 137.50]) control_wheel(); +} + +module portapack_h1_components_bottom() { + translate([0, 0, pp_h1_pcb_thickness]) { + translate([171.76, 143.25]) rotate( 90) header_mle_dual("p20", 11); + translate([152.71, 164.84]) rotate(180) header_mle_dual("p22", 13); + translate([123.50, 143.25]) rotate( 90) header_mle_dual("p28", 11); + translate([172.10, 114.80]) rotate(270) audio_jack(); + translate([ 68.40, 114.60]) rotate(270) micro_sd(); + } +} + +module portapack_h1_assembly() { + portapack_h1_pcb(); + portapack_h1_components_top(); + portapack_h1_components_bottom(); +} + +module portapack_h1_transform() { + rotate([180, 0, 0]) translate([-60, -100 - pcb_w]) + children(); +} + +module portapack_h1() { + portapack_h1_transform() portapack_h1_assembly(); +} + +//////////////////////////////////////////////////////// + +module slot() { + hull() { + children(); + translate([0, 0, -20]) children(); + } +} + +module portapack_h1_drills() { + micro_sd_clearance = 0.5; + audio_jack_hole_diameter = 7.0; // 6.5mm + 0.25mm clearance. + + portapack_h1_transform() { + translate([172.10, 114.80, pp_h1_pcb_thickness]) rotate(270) audio_jack_drill(audio_jack_hole_diameter); + slot() translate([ 68.40, 114.60, pp_h1_pcb_thickness]) rotate(270) micro_sd_drill(micro_sd_clearance); + } +} + +module hackrf_one_drills() { + clearance = 0.5; + sw_clearance = 0.6; + + hackrf_one_transform() { + slot() translate([ 61.00, 161.00]) rotate( 0) sma_73251_2120_drill(clearance, h1_pcb_thickness); + translate([179.00, 145.00]) rotate(180) sma_73251_2120_drill(clearance, h1_pcb_thickness); + translate([179.00, 163.00]) rotate(180) sma_73251_2120_drill(clearance, h1_pcb_thickness); + + translate([ 61.00, 117.90]) rotate(-90) led_drill(); + translate([ 61.27, 130.55]) rotate(-90) led_drill(); + translate([ 61.27, 135.12]) rotate(-90) led_drill(); + translate([ 61.27, 139.69]) rotate(-90) led_drill(); + translate([ 61.27, 144.27]) rotate(-90) led_drill(); + translate([ 61.27, 148.84]) rotate(-90) led_drill(); + + slot() translate([ 62.70, 111.40]) sw_drill(sw_clearance); + slot() translate([ 62.70, 124.40]) sw_drill(sw_clearance); + + translate([180.00, 124.00]) usb_drill(clearance); + } +} + +module portapack_h1_stack_hackrf_one() { + hackrf_one(); +} + +module portapack_h1_stack_spacers() { + hackrf_one_transform() { + translate([ 64, 104]) spacer(); + translate([126, 104]) spacer(); + translate([176, 104]) spacer(); + translate([ 64, 171]) spacer(); + translate([176, 171]) spacer(); + } +} + +module portapack_h1_stack_portapack() { + translate([0, 0, spacer_height + pp_h1_pcb_thickness]) portapack_h1(); +} + +module portapack_h1_stack_screws() { + screw_tz = spacer_height + pp_h1_pcb_thickness; + translate([0, 0, screw_tz]) portapack_h1_transform() { + translate([ 64, 104]) screw(); + translate([126, 104]) screw(); + translate([176, 104]) screw(); + translate([ 64, 171]) screw(); + translate([176, 171]) screw(); + } +} + +module portapack_h1_stack() { + portapack_h1_stack_hackrf_one(); + portapack_h1_stack_spacers(); + portapack_h1_stack_portapack(); + portapack_h1_stack_screws(); +} + +module portapack_h1_stack_drills() { + hackrf_one_drills(); + + translate([0, 0, spacer_height + pp_h1_pcb_thickness]) portapack_h1_drills(); +} diff --git a/hardware/portapack_h1/cpld/portapack_h1_cpld.qpf b/hardware/portapack_h1/cpld/portapack_h1_cpld.qpf new file mode 100644 index 000000000..0ced0c844 --- /dev/null +++ b/hardware/portapack_h1/cpld/portapack_h1_cpld.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 32-bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 21:24:55 April 29, 2014 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "21:24:55 April 29, 2014" + +# Revisions + +PROJECT_REVISION = "portapack_h1_cpld" diff --git a/hardware/portapack_h1/cpld/portapack_h1_cpld.qsf b/hardware/portapack_h1/cpld/portapack_h1_cpld.qsf new file mode 100644 index 000000000..b9cec13a8 --- /dev/null +++ b/hardware/portapack_h1/cpld/portapack_h1_cpld.qsf @@ -0,0 +1,288 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# Your use of Altera Corporation's design tools, logic functions +# and other software and tools, and its AMPP partner logic +# functions, and any output files from any of the foregoing +# (including device programming or simulation files), and any +# associated documentation or information are expressly subject +# to the terms and conditions of the Altera Program License +# Subscription Agreement, Altera MegaCore Function License +# Agreement, or other applicable license agreement, including, +# without limitation, that your use is for the sole purpose of +# programming logic devices manufactured by Altera and sold by +# Altera or its authorized distributors. Please refer to the +# applicable agreement for further details. +# +# -------------------------------------------------------------------------- # +# +# Quartus II 32-bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 21:24:55 April 29, 2014 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# portapack_h1_cpld_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + +set_global_assignment -name FAMILY "MAX V" +set_global_assignment -name DEVICE 5M40ZE64C5 +set_global_assignment -name TOP_LEVEL_ENTITY top +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:24:55 APRIL 29, 2014" +set_global_assignment -name LAST_QUARTUS_VERSION 14.1.0 +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name DEVICE_FILTER_PACKAGE EQFP +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 64 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR "-1" +set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim-Altera (VHDL)" +set_global_assignment -name EDA_NETLIST_WRITER_OUTPUT_DIR simulation/modelsim -section_id eda_simulation +set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation +set_global_assignment -name VHDL_INPUT_VERSION VHDL_2008 +set_global_assignment -name VHDL_SHOW_LMF_MAPPING_MESSAGES OFF +set_global_assignment -name SDC_FILE portapack_h1_cpld.sdc +set_global_assignment -name VHDL_FILE top.vhd +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVCMOS" +set_location_assignment PIN_46 -to LCD_DB[15] +set_location_assignment PIN_47 -to LCD_DB[14] +set_location_assignment PIN_48 -to LCD_DB[13] +set_location_assignment PIN_49 -to LCD_DB[12] +set_location_assignment PIN_50 -to LCD_DB[11] +set_location_assignment PIN_51 -to LCD_DB[10] +set_location_assignment PIN_52 -to LCD_DB[9] +set_location_assignment PIN_53 -to LCD_DB[8] +set_location_assignment PIN_54 -to LCD_DB[7] +set_location_assignment PIN_55 -to LCD_DB[6] +set_location_assignment PIN_56 -to LCD_DB[5] +set_location_assignment PIN_58 -to LCD_DB[4] +set_location_assignment PIN_59 -to LCD_DB[3] +set_location_assignment PIN_60 -to LCD_DB[2] +set_location_assignment PIN_61 -to LCD_DB[1] +set_location_assignment PIN_62 -to LCD_DB[0] +set_location_assignment PIN_44 -to LCD_RDX +set_location_assignment PIN_43 -to LCD_RS +set_location_assignment PIN_63 -to LCD_TE +set_location_assignment PIN_45 -to LCD_WRX +set_location_assignment PIN_10 -to SW_D +set_location_assignment PIN_28 -to SW_L +set_location_assignment PIN_9 -to SW_R +set_location_assignment PIN_11 -to SW_ROT_A +set_location_assignment PIN_12 -to SW_ROT_B +set_location_assignment PIN_13 -to SW_SEL +set_location_assignment PIN_25 -to SW_U +set_location_assignment PIN_1 -to TP_D +set_location_assignment PIN_2 -to TP_L +set_location_assignment PIN_64 -to TP_R +set_location_assignment PIN_3 -to TP_U +set_instance_assignment -name IO_STANDARD "3.3V SCHMITT TRIGGER INPUT" -to SW_D +set_instance_assignment -name IO_STANDARD "3.3V SCHMITT TRIGGER INPUT" -to SW_L +set_instance_assignment -name IO_STANDARD "3.3V SCHMITT TRIGGER INPUT" -to SW_R +set_instance_assignment -name IO_STANDARD "3.3V SCHMITT TRIGGER INPUT" -to SW_ROT_A +set_instance_assignment -name IO_STANDARD "3.3V SCHMITT TRIGGER INPUT" -to SW_ROT_B +set_instance_assignment -name IO_STANDARD "3.3V SCHMITT TRIGGER INPUT" -to SW_SEL +set_instance_assignment -name IO_STANDARD "3.3V SCHMITT TRIGGER INPUT" -to SW_U +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to TP_D +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to TP_L +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to TP_R +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to TP_U +set_instance_assignment -name IO_STANDARD "1.8 V" -to LCD_DB[15] +set_instance_assignment -name IO_STANDARD "1.8 V" -to LCD_DB[14] +set_instance_assignment -name IO_STANDARD "1.8 V" -to LCD_DB[13] +set_instance_assignment -name IO_STANDARD "1.8 V" -to LCD_DB[12] +set_instance_assignment -name IO_STANDARD "1.8 V" -to LCD_DB[11] +set_instance_assignment -name IO_STANDARD "1.8 V" -to LCD_DB[10] +set_instance_assignment -name IO_STANDARD "1.8 V" -to LCD_DB[9] +set_instance_assignment -name IO_STANDARD "1.8 V" -to LCD_DB[8] +set_instance_assignment -name IO_STANDARD "1.8 V" -to LCD_DB[7] +set_instance_assignment -name IO_STANDARD "1.8 V" -to LCD_DB[6] +set_instance_assignment -name IO_STANDARD "1.8 V" -to LCD_DB[5] +set_instance_assignment -name IO_STANDARD "1.8 V" -to LCD_DB[4] +set_instance_assignment -name IO_STANDARD "1.8 V" -to LCD_DB[3] +set_instance_assignment -name IO_STANDARD "1.8 V" -to LCD_DB[2] +set_instance_assignment -name IO_STANDARD "1.8 V" -to LCD_DB[1] +set_instance_assignment -name IO_STANDARD "1.8 V" -to LCD_DB[0] +set_instance_assignment -name IO_STANDARD "1.8 V" -to LCD_RDX +set_instance_assignment -name IO_STANDARD "1.8 V" -to LCD_RS +set_instance_assignment -name IO_STANDARD "1.8 V" -to LCD_TE +set_instance_assignment -name IO_STANDARD "1.8 V" -to LCD_WRX +set_global_assignment -name EDA_TEST_BENCH_ENABLE_STATUS TEST_BENCH_MODE -section_id eda_simulation +set_global_assignment -name EDA_NATIVELINK_SIMULATION_TEST_BENCH top_tb -section_id eda_simulation +set_global_assignment -name EDA_TEST_BENCH_NAME top_tb -section_id eda_simulation +set_global_assignment -name EDA_DESIGN_INSTANCE_NAME uut -section_id top_tb +set_global_assignment -name EDA_TEST_BENCH_MODULE_NAME top_tb -section_id top_tb +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "NO HEAT SINK WITH STILL AIR" +set_global_assignment -name EDA_TEST_BENCH_RUN_SIM_FOR "500 ns" -section_id top_tb +set_global_assignment -name EDA_TEST_BENCH_FILE top_tb.vhd -section_id top_tb +set_global_assignment -name EDA_BOARD_DESIGN_BOUNDARY_SCAN_TOOL "BSDL (Boundary Scan)" +set_global_assignment -name EDA_NETLIST_WRITER_OUTPUT_DIR /home/jboone/src/portapack/portapack_hackrf/hardware/portapack_h1/cpld -section_id eda_board_design_boundary_scan +set_global_assignment -name EDA_BOARD_BOUNDARY_SCAN_OPERATION POST_CONFIG -section_id eda_board_design_boundary_scan +set_global_assignment -name AUTO_RESTART_CONFIGURATION OFF +set_global_assignment -name ENABLE_CONFIGURATION_PINS OFF +set_global_assignment -name ENABLE_NCE_PIN OFF +set_global_assignment -name ENABLE_BOOT_SEL_PIN OFF +set_global_assignment -name USE_CONFIGURATION_DEVICE ON +set_global_assignment -name GENERATE_RBF_FILE OFF +set_global_assignment -name GENERATE_SVF_FILE ON +set_global_assignment -name RESERVE_ALL_UNUSED_PINS "AS INPUT TRI-STATED WITH BUS-HOLD" +set_location_assignment PIN_38 -to LCD_RESETX +set_instance_assignment -name IO_STANDARD "1.8 V" -to LCD_RESETX +set_location_assignment PIN_18 -to MCU_D[7] +set_location_assignment PIN_19 -to MCU_D[6] +set_location_assignment PIN_21 -to MCU_D[5] +set_location_assignment PIN_20 -to MCU_D[4] +set_location_assignment PIN_22 -to MCU_D[3] +set_location_assignment PIN_24 -to MCU_D[2] +set_location_assignment PIN_27 -to MCU_D[1] +set_location_assignment PIN_26 -to MCU_D[0] +set_location_assignment PIN_33 -to MCU_ADDR +set_location_assignment PIN_42 -to MCU_DIR +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_ADDR +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[7] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[6] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[5] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[4] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[3] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[2] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[1] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[0] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_DIR +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SW_D +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SW_L +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SW_R +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SW_U +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SW_ROT_B +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SW_SEL +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SW_ROT_A +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[15] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[14] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[13] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[12] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[11] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[10] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[9] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[8] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[7] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[6] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_RDX +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_RESETX +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_RS +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_TE +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_WRX +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_ADDR +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[7] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[6] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_DIR +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_D +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_L +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_R +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_ROT_A +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_ROT_B +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_SEL +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_U +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to TP_D +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to TP_L +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to TP_R +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to TP_U +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[15] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[14] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[13] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[12] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[11] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[10] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[9] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[8] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[7] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[6] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[5] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[4] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[3] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[2] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[1] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[0] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_RDX +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_RESETX +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_RS +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_TE +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_WRX +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_ADDR +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_D[7] +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_D[6] +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_D[5] +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_D[4] +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_D[3] +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_D[2] +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_D[1] +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_D[0] +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_DIR +set_instance_assignment -name SLOW_SLEW_RATE ON -to SW_D +set_instance_assignment -name SLOW_SLEW_RATE ON -to SW_L +set_instance_assignment -name SLOW_SLEW_RATE ON -to SW_R +set_instance_assignment -name SLOW_SLEW_RATE ON -to SW_ROT_A +set_instance_assignment -name SLOW_SLEW_RATE ON -to SW_ROT_B +set_instance_assignment -name SLOW_SLEW_RATE ON -to SW_SEL +set_instance_assignment -name SLOW_SLEW_RATE ON -to SW_U +set_instance_assignment -name SLOW_SLEW_RATE ON -to TP_D +set_instance_assignment -name SLOW_SLEW_RATE ON -to TP_L +set_instance_assignment -name SLOW_SLEW_RATE ON -to TP_R +set_instance_assignment -name SLOW_SLEW_RATE ON -to TP_U +set_global_assignment -name ENABLE_DEVICE_WIDE_RESET ON +set_global_assignment -name IOBANK_VCCIO 1.8V -section_id 2 +set_global_assignment -name IOBANK_VCCIO 3.3V -section_id 1 +set_instance_assignment -name PCI_IO OFF -to MCU_DIR +set_global_assignment -name ALLOW_LVTTL_LVCMOS_INPUT_LEVELS_TO_OVERDRIVE_INPUT_BUFFER ON +set_location_assignment PIN_4 -to LCD_BACKLIGHT +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_BACKLIGHT +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_BACKLIGHT +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_BACKLIGHT +set_instance_assignment -name PCI_IO OFF -to LCD_BACKLIGHT +set_location_assignment PIN_30 -to MCU_LCD_RD +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_LCD_RD +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_LCD_RD +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_LCD_RD +set_location_assignment PIN_40 -to MCU_LCD_WR +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_LCD_WR +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_LCD_WR +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_LCD_WR +set_instance_assignment -name PCI_IO OFF -to MCU_LCD_WR +set_location_assignment PIN_32 -to MCU_IO_STBX +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_IO_STBX +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_IO_STBX +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_IO_STBX +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to TP_R +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to TP_D +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to TP_L +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to TP_U +set_location_assignment PIN_31 -to MCU_LCD_TE +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_LCD_TE +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_LCD_TE +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_LCD_TE +set_location_assignment PIN_34 -to MCU_P2_8 +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_P2_8 +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_P2_8 +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_P2_8 +set_instance_assignment -name PCI_IO OFF -to MCU_P2_8 \ No newline at end of file diff --git a/hardware/portapack_h1/cpld/portapack_h1_cpld.sdc b/hardware/portapack_h1/cpld/portapack_h1_cpld.sdc new file mode 100644 index 000000000..9c05af2ae --- /dev/null +++ b/hardware/portapack_h1/cpld/portapack_h1_cpld.sdc @@ -0,0 +1,116 @@ +## Generated SDC file "portapack_hackrf_one_cpld.sdc" + +## Copyright (C) 1991-2014 Altera Corporation +## Your use of Altera Corporation's design tools, logic functions +## and other software and tools, and its AMPP partner logic +## functions, and any output files from any of the foregoing +## (including device programming or simulation files), and any +## associated documentation or information are expressly subject +## to the terms and conditions of the Altera Program License +## Subscription Agreement, Altera MegaCore Function License +## Agreement, or other applicable license agreement, including, +## without limitation, that your use is for the sole purpose of +## programming logic devices manufactured by Altera and sold by +## Altera or its authorized distributors. Please refer to the +## applicable agreement for further details. + + +## VENDOR "Altera" +## PROGRAM "Quartus II" +## VERSION "Version 13.1.4 Build 182 03/12/2014 SJ Web Edition" + +## DATE "Sat May 3 10:22:18 2014" + +## +## DEVICE "5M40ZE64C5" +## + +# RS = 0, D = DB[15:8] +# wait max(tast = 0 ns, CPLD setup = ?) +# WR = 0, D = DB[7:0] +# wait max(CPLD ) + +#************************************************************** +# Time Information +#************************************************************** + +set_time_format -unit ns -decimal_places 3 + +set mcu_clk_period 4.9 + +set lcd_data_wr_setup 10.0 +set lcd_data_wr_hold 10.0 + +#************************************************************** +# Create Clock +#************************************************************** + +create_clock -name {MCU_STROBE} -period 66.000 -waveform { 0.000 33.000 } [get_ports {MCU_STROBE}] +#create_clock -name strobe_virt -period 66.000 + +#************************************************************** +# Create Generated Clock +#************************************************************** + + + +#************************************************************** +# Set Clock Latency +#************************************************************** + + + +#************************************************************** +# Set Clock Uncertainty +#************************************************************** + + + +#************************************************************** +# Set Input Delay +#************************************************************** + +#set_input_delay -clock strobe_virt [get_ports {D[*]}] + +#************************************************************** +# Set Output Delay +#************************************************************** + + + +#************************************************************** +# Set Clock Groups +#************************************************************** + + + +#************************************************************** +# Set False Path +#************************************************************** + +set_false_path -from [get_clocks {MCU_STROBE}] -to [get_ports {TP_D TP_L TP_R TP_U}] +set_false_path -from [get_ports {SW_D SW_L SW_R SW_ROT_A SW_ROT_B SW_SEL SW_U}] -to [get_ports {MCU_D[*]}] + + +#************************************************************** +# Set Multicycle Path +#************************************************************** + + + +#************************************************************** +# Set Maximum Delay +#************************************************************** + + + +#************************************************************** +# Set Minimum Delay +#************************************************************** + + + +#************************************************************** +# Set Input Transition +#************************************************************** + diff --git a/hardware/portapack_h1/cpld/top.vhd b/hardware/portapack_h1/cpld/top.vhd new file mode 100644 index 000000000..943707eaf --- /dev/null +++ b/hardware/portapack_h1/cpld/top.vhd @@ -0,0 +1,167 @@ +-- +-- Copyright (C) 2012 Jared Boone, ShareBrained Technology, Inc. +-- +-- This file is part of PortaPack. +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 2, or (at your option) +-- any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; see the file COPYING. If not, write to +-- the Free Software Foundation, Inc., 51 Franklin Street, +-- Boston, MA 02110-1301, USA. + +library ieee; +use ieee.std_logic_1164.all; + +entity top is + port ( + MCU_D : inout std_logic_vector(7 downto 0); + MCU_DIR : in std_logic; + MCU_IO_STBX : in std_logic; + MCU_LCD_WR : in std_logic; + MCU_ADDR : in std_logic; + MCU_LCD_TE : out std_logic; + MCU_P2_8 : in std_logic; + MCU_LCD_RD : in std_logic; + + TP_U : out std_logic; + TP_D : out std_logic; + TP_L : out std_logic; + TP_R : out std_logic; + + SW_SEL : in std_logic; + SW_ROT_A : in std_logic; + SW_ROT_B : in std_logic; + SW_U : in std_logic; + SW_D : in std_logic; + SW_L : in std_logic; + SW_R : in std_logic; + + LCD_RESETX : out std_logic; + LCD_RS : out std_logic; + LCD_WRX : out std_logic; + LCD_RDX : out std_logic; + LCD_DB : inout std_logic_vector(15 downto 0); + LCD_TE : in std_logic; + LCD_BACKLIGHT : out std_logic + ); +end top; + +architecture rtl of top is + + signal switches : std_logic_vector(7 downto 0); + + type data_direction_t is (from_mcu, to_mcu); + signal data_dir : data_direction_t; + + signal mcu_data_out_lcd : std_logic_vector(7 downto 0); + signal mcu_data_out_io : std_logic_vector(7 downto 0); + signal mcu_data_out : std_logic_vector(7 downto 0); + signal mcu_data_in : std_logic_vector(7 downto 0); + + signal lcd_data_in : std_logic_vector(15 downto 0); + signal lcd_data_in_mux : std_logic_vector(7 downto 0); + signal lcd_data_out : std_logic_vector(15 downto 0); + + signal lcd_data_in_q : std_logic_vector(7 downto 0) := (others => '0'); + signal lcd_data_out_q : std_logic_vector(7 downto 0) := (others => '0'); + + signal tp_q : std_logic_vector(7 downto 0) := (others => '0'); + + signal lcd_reset_q : std_logic := '1'; + signal lcd_backlight_q : std_logic := '0'; + + signal dir_read : boolean; + signal dir_write : boolean; + + signal lcd_read_strobe : boolean; + signal lcd_write_strobe : boolean; + signal lcd_write : boolean; + + signal io_strobe : boolean; + signal io_read_strobe : boolean; + signal io_write_strobe : boolean; + +begin + + -- I/O data + switches <= LCD_TE & not SW_ROT_B & not SW_ROT_A & not SW_SEL & not SW_U & not SW_D & not SW_L & not SW_R; + + TP_U <= tp_q(3) when tp_q(7) = '1' else 'Z'; + TP_D <= tp_q(2) when tp_q(6) = '1' else 'Z'; + TP_L <= tp_q(1) when tp_q(5) = '1' else 'Z'; + TP_R <= tp_q(0) when tp_q(4) = '1' else 'Z'; + + LCD_BACKLIGHT <= lcd_backlight_q; + + MCU_LCD_TE <= LCD_TE; + + -- State management + data_dir <= to_mcu when MCU_DIR = '1' else from_mcu; + dir_read <= (data_dir = to_mcu); + dir_write <= (data_dir = from_mcu); + + io_strobe <= (MCU_IO_STBX = '0'); + io_read_strobe <= io_strobe and dir_read; + + lcd_read_strobe <= (MCU_LCD_RD = '1'); + lcd_write <= not lcd_read_strobe; + + -- LCD interface + LCD_RS <= MCU_ADDR; + LCD_RDX <= not MCU_LCD_RD; + LCD_WRX <= not MCU_LCD_WR; + + lcd_data_out <= lcd_data_out_q & mcu_data_in; + lcd_data_in <= LCD_DB; + LCD_DB <= lcd_data_out when lcd_write else (others => 'Z'); + + LCD_RESETX <= not lcd_reset_q; + + -- MCU interface + mcu_data_out_lcd <= lcd_data_in(15 downto 8) when lcd_read_strobe else lcd_data_in_q; + mcu_data_out_io <= switches; + mcu_data_out <= mcu_data_out_io when io_read_strobe else mcu_data_out_lcd; + + mcu_data_in <= MCU_D; + MCU_D <= mcu_data_out when dir_read else (others => 'Z'); + + -- Synchronous behaviors: + -- LCD write: Capture LCD high byte on LCD_WRX falling edge. + process(MCU_LCD_WR, mcu_data_in) + begin + if rising_edge(MCU_LCD_WR) then + lcd_data_out_q <= mcu_data_in; + end if; + end process; + + -- LCD read: Capture LCD low byte on LCD_RD falling edge. + process(MCU_LCD_RD, lcd_data_in) + begin + if falling_edge(MCU_LCD_RD) then + lcd_data_in_q <= lcd_data_in(7 downto 0); + end if; + end process; + + -- I/O write (to resistive touch panel): Capture data from + -- MCU and hold on TP pins until further notice. + process(MCU_IO_STBX, dir_write, mcu_data_in, MCU_ADDR) + begin + if rising_edge(MCU_IO_STBX) and dir_write then + if MCU_ADDR = '0' then + tp_q <= mcu_data_in; + else + lcd_reset_q <= mcu_data_in(0); + lcd_backlight_q <= mcu_data_in(7); + end if; + end if; + end process; +end rtl; diff --git a/hardware/portapack_h1/cpld/top_tb.vhd b/hardware/portapack_h1/cpld/top_tb.vhd new file mode 100644 index 000000000..533c1108d --- /dev/null +++ b/hardware/portapack_h1/cpld/top_tb.vhd @@ -0,0 +1,185 @@ +-- +-- Copyright (C) 2012 Jared Boone, ShareBrained Technology, Inc. +-- +-- This file is part of PortaPack. +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 2, or (at your option) +-- any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; see the file COPYING. If not, write to +-- the Free Software Foundation, Inc., 51 Franklin Street, +-- Boston, MA 02110-1301, USA. + +library ieee; +use ieee.std_logic_1164.all; + +entity top_tb is + +end top_tb; + +architecture behavior of top_tb is + + component top + port ( + MCU_D : inout std_logic_vector(7 downto 0); + MCU_DIR : in std_logic; + MCU_MODE : in std_logic; + MCU_STROBE : in std_logic; + MCU_ADDR : in std_logic; + + TP_U : out std_logic; + TP_D : out std_logic; + TP_L : out std_logic; + TP_R : out std_logic; + + SW_SEL : in std_logic; + SW_ROT_A : in std_logic; + SW_ROT_B : in std_logic; + SW_U : in std_logic; + SW_D : in std_logic; + SW_L : in std_logic; + SW_R : in std_logic; + + LCD_RESETX : out std_logic; + LCD_RS : out std_logic; + LCD_WRX : out std_logic; + LCD_RDX : out std_logic; + LCD_DB : inout std_logic_vector(17 downto 0); + LCD_TE : in std_logic + ); + end component; + + signal mcu_d : std_logic_vector(7 downto 0); + signal mcu_strobe : std_logic; + signal mcu_dir : std_logic; + signal mcu_mode : std_logic; + signal mcu_addr : std_logic; + + signal tp_u : std_logic; + signal tp_d : std_logic; + signal tp_l : std_logic; + signal tp_r : std_logic; + + signal sw_sel : std_logic; + signal sw_rot_a : std_logic; + signal sw_rot_b : std_logic; + signal sw_u : std_logic; + signal sw_d : std_logic; + signal sw_l : std_logic; + signal sw_r : std_logic; + + signal lcd_resetx : std_logic; + signal lcd_rs : std_logic; + signal lcd_wrx : std_logic; + signal lcd_rdx : std_logic; + signal lcd_db : std_logic_vector(17 downto 0); + signal lcd_te : std_logic := '0'; +begin + + uut : top + port map ( + MCU_D => mcu_d, + MCU_STROBE => mcu_strobe, + MCU_DIR => mcu_dir, + MCU_MODE => mcu_mode, + MCU_ADDR => mcu_addr, + TP_U => tp_u, + TP_D => tp_d, + TP_L => tp_l, + TP_R => tp_r, + SW_SEL => sw_sel, + SW_ROT_A => sw_rot_a, + SW_ROT_B => sw_rot_b, + SW_U => sw_u, + SW_D => sw_d, + SW_L => sw_l, + SW_R => sw_r, + LCD_RESETX => lcd_resetx, + LCD_RS => lcd_rs, + LCD_WRX => lcd_wrx, + LCD_RDX => lcd_rdx, + LCD_DB => lcd_db, + LCD_TE => lcd_te + ); + + stimulus: process is + begin + sw_sel <= '0'; + sw_rot_a <= '0'; + sw_rot_b <= '0'; + sw_u <= '0'; + sw_d <= '0'; + sw_l <= '0'; + sw_r <= '0'; + + mcu_d <= (others => 'Z'); + mcu_mode <= '1'; + mcu_dir <= '1'; + mcu_addr <= '1'; + mcu_strobe <= '1'; + + wait for 50.0 ns; + + -- Write to resistive touch panel + mcu_mode <= '0'; -- Target: I/O + mcu_dir <= '0'; -- Direction: MCU -> CPLD + mcu_addr <= '0'; -- LCD reset signal + wait for 19.6 ns; -- 4 cycles: Wait for CPLD D to reach Hi-Z + mcu_d <= "11000101"; + wait for 14.7 ns; -- 3 cycles: Setup time on D before STROBE. + mcu_strobe <= '0'; + wait for 9.8 ns; -- 2 cycles + mcu_strobe <= '1'; + wait for 49.0 ns; + + -- Write to LCD (command, then 16-bit data) + mcu_mode <= '1'; -- Target: LCD + mcu_dir <= '0'; -- Direction: MCU -> CPLD + mcu_addr <= '0'; -- Address: RS = 0 (command) + wait for 19.6 ns; -- 4 cycles: Wait for CPLD D to reach Hi-Z + + mcu_d <= "10100101"; + wait for 14.7 ns; -- 3 cycles: Setup time on D before STROBE. + mcu_strobe <= '0'; + wait for 9.8 ns; -- 2 cycles + mcu_d <= "00001111"; + wait for 24.5 ns; -- 5 cycles: Prop from D to LCD_DB[7:0], WRX# minimum low time. + mcu_strobe <= '1'; + wait for 9.8 ns; -- 2 cycles: Part of prop from STROBE to LCD_WRX, delay to keep RS after WRX deassert. + mcu_addr <= '1'; -- Address: RS = 1 (data) + wait for 9.8 ns; -- 2 cycles: Part of prop from STROBE to LCD_WRX. + + mcu_d <= "01011010"; + wait for 14.7 ns; -- 3 cycles: Setup time on D before STROBE. + mcu_strobe <= '0'; + wait for 9.8 ns; -- 2 cycles + mcu_d <= "11110000"; + wait for 24.5 ns; -- 5 cycles: Prop from D to LCD_DB[7:0], WRX# minimum low time. + mcu_strobe <= '1'; + wait for 19.6 ns; -- 4 cycles: Prop from STROBE to LCD_WRX. + + mcu_d <= "01010101"; + wait for 14.7 ns; -- 3 cycles: Setup time on D before STROBE. + mcu_strobe <= '0'; + wait for 9.8 ns; -- 2 cycles + mcu_d <= "10101010"; + wait for 24.5 ns; -- 5 cycles: Prop from D to LCD_DB[7:0], WRX# minimum low time. + mcu_strobe <= '1'; + wait for 19.6 ns; -- 4 cycles: Prop from STROBE to LCD_WRX. + + -- Read from switches + mcu_d <= (others => 'Z'); + mcu_mode <= '0'; -- Target: I/O + mcu_dir <= '1'; -- Direction: MCU <- CPLD + wait for 49.0 ns; + + end process; +end architecture behavior; diff --git a/hardware/portapack_h1/hackrf_if.sch b/hardware/portapack_h1/hackrf_if.sch new file mode 100644 index 000000000..bca7df99c --- /dev/null +++ b/hardware/portapack_h1/hackrf_if.sch @@ -0,0 +1,1551 @@ +EESchema Schematic File Version 2 +LIBS:hackrf_expansion +LIBS:wolfson +LIBS:passive +LIBS:lcd_kingtech +LIBS:supply +LIBS:io_expander +LIBS:trs_jack +LIBS:battery +LIBS:mosfet +LIBS:microphone +LIBS:sd +LIBS:ck +LIBS:altera +LIBS:regulator +LIBS:tp +LIBS:header +LIBS:hole +LIBS:sharebrained +LIBS:fiducial +LIBS:portapack_h1-cache +EELAYER 25 0 +EELAYER END +$Descr A4 11693 8268 +encoding utf-8 +Sheet 4 4 +Title "PortaPack H1" +Date "21 Aug 2015" +Rev "20150821" +Comp "ShareBrained Technology, Inc." +Comment1 "Copyright © 2014, 2015 Jared Boone" +Comment2 "License: GNU General Public License, version 2" +Comment3 "" +Comment4 "" +$EndDescr +Text Label 1300 2600 0 60 ~ 0 +MCU_LCD_RD +$Comp +L GND #PWR050 +U 1 1 53A8CD34 +P 3700 4200 +F 0 "#PWR050" H 3700 4200 30 0001 C CNN +F 1 "GND" H 3700 4130 30 0001 C CNN +F 2 "" H 3700 4200 60 0000 C CNN +F 3 "" H 3700 4200 60 0000 C CNN + 1 3700 4200 + 0 -1 -1 0 +$EndComp +$Comp +L GND #PWR051 +U 1 1 53A8CD3A +P 3700 4700 +F 0 "#PWR051" H 3700 4700 30 0001 C CNN +F 1 "GND" H 3700 4630 30 0001 C CNN +F 2 "" H 3700 4700 60 0000 C CNN +F 3 "" H 3700 4700 60 0000 C CNN + 1 3700 4700 + 0 -1 -1 0 +$EndComp +$Comp +L GND #PWR052 +U 1 1 53A8CD40 +P 3700 3200 +F 0 "#PWR052" H 3700 3200 30 0001 C CNN +F 1 "GND" H 3700 3130 30 0001 C CNN +F 2 "" H 3700 3200 60 0000 C CNN +F 3 "" H 3700 3200 60 0000 C CNN + 1 3700 3200 + 0 -1 -1 0 +$EndComp +$Comp +L GND #PWR053 +U 1 1 53A8CD46 +P 3700 2800 +F 0 "#PWR053" H 3700 2800 30 0001 C CNN +F 1 "GND" H 3700 2730 30 0001 C CNN +F 2 "" H 3700 2800 60 0000 C CNN +F 3 "" H 3700 2800 60 0000 C CNN + 1 3700 2800 + 0 -1 -1 0 +$EndComp +$Comp +L GND #PWR054 +U 1 1 53A8CD4C +P 3700 2500 +F 0 "#PWR054" H 3700 2500 30 0001 C CNN +F 1 "GND" H 3700 2430 30 0001 C CNN +F 2 "" H 3700 2500 60 0000 C CNN +F 3 "" H 3700 2500 60 0000 C CNN + 1 3700 2500 + 0 -1 -1 0 +$EndComp +$Comp +L +3.3V #PWR055 +U 1 1 53A8CD52 +P 1900 2900 +F 0 "#PWR055" H 1900 2860 30 0001 C CNN +F 1 "+3.3V" H 1900 3010 30 0000 C CNN +F 2 "" H 1900 2900 60 0000 C CNN +F 3 "" H 1900 2900 60 0000 C CNN + 1 1900 2900 + 0 -1 -1 0 +$EndComp +$Comp +L +3.3V #PWR056 +U 1 1 53A8CD58 +P 1900 4200 +F 0 "#PWR056" H 1900 4160 30 0001 C CNN +F 1 "+3.3V" H 1900 4310 30 0000 C CNN +F 2 "" H 1900 4200 60 0000 C CNN +F 3 "" H 1900 4200 60 0000 C CNN + 1 1900 4200 + 0 -1 -1 0 +$EndComp +$Comp +L +3.3V #PWR057 +U 1 1 53A8CD5E +P 1900 900 +F 0 "#PWR057" H 1900 860 30 0001 C CNN +F 1 "+3.3V" H 1900 1010 30 0000 C CNN +F 2 "" H 1900 900 60 0000 C CNN +F 3 "" H 1900 900 60 0000 C CNN + 1 1900 900 + 0 -1 -1 0 +$EndComp +$Comp +L GND #PWR058 +U 1 1 53A8CD64 +P 1900 1400 +F 0 "#PWR058" H 1900 1400 30 0001 C CNN +F 1 "GND" H 1900 1330 30 0001 C CNN +F 2 "" H 1900 1400 60 0000 C CNN +F 3 "" H 1900 1400 60 0000 C CNN + 1 1900 1400 + 0 1 1 0 +$EndComp +$Comp +L GND #PWR059 +U 1 1 53A8CD6A +P 1900 1500 +F 0 "#PWR059" H 1900 1500 30 0001 C CNN +F 1 "GND" H 1900 1430 30 0001 C CNN +F 2 "" H 1900 1500 60 0000 C CNN +F 3 "" H 1900 1500 60 0000 C CNN + 1 1900 1500 + 0 1 1 0 +$EndComp +$Comp +L GND #PWR060 +U 1 1 53A8CD70 +P 1900 1700 +F 0 "#PWR060" H 1900 1700 30 0001 C CNN +F 1 "GND" H 1900 1630 30 0001 C CNN +F 2 "" H 1900 1700 60 0000 C CNN +F 3 "" H 1900 1700 60 0000 C CNN + 1 1900 1700 + 0 1 1 0 +$EndComp +NoConn ~ 3600 4800 +NoConn ~ 2000 4800 +NoConn ~ 2000 2400 +NoConn ~ 3600 2400 +NoConn ~ 3600 2700 +NoConn ~ 2000 2700 +NoConn ~ 2000 2800 +Text Label 3700 1000 0 60 ~ 0 +MCU_D1 +Text Label 3700 1100 0 60 ~ 0 +MCU_D3 +Text Label 3700 1200 0 60 ~ 0 +MCU_D5 +Text Label 3700 1300 0 60 ~ 0 +MCU_D7 +Text Label 1300 1300 0 60 ~ 0 +MCU_D6 +Text Label 1300 1200 0 60 ~ 0 +MCU_D4 +Text Label 1300 1100 0 60 ~ 0 +MCU_D2 +Text Label 1300 1000 0 60 ~ 0 +MCU_D0 +NoConn ~ 2000 3600 +NoConn ~ 3600 5000 +NoConn ~ 3600 5100 +NoConn ~ 3600 5200 +NoConn ~ 2000 5200 +Text Label 3700 4600 0 60 ~ 0 +PP_CPLD_TDO +NoConn ~ 2000 4900 +NoConn ~ 3600 4900 +Text Label 1200 5100 0 60 ~ 0 +H1_CPLD_TDI +Text Label 3900 3300 0 60 ~ 0 +MCU_IO_STBX +Text Label 1300 3300 0 60 ~ 0 +MCU_ADDR +Text Label 1300 3400 0 60 ~ 0 +MCU_LCD_WR +Text Label 3900 3400 0 60 ~ 0 +MCU_DIR +Text Label 3700 4500 0 60 ~ 0 +PP_CPLD_TMS +Text Label 1300 3500 0 60 ~ 0 +P2_8 +Text Label 1200 5000 0 60 ~ 0 +H1_CPLD_TCK +Text Label 1300 2500 0 60 ~ 0 +RESET# +NoConn ~ 3600 2900 +NoConn ~ 3600 3000 +$Comp +L HACKRF_ONE_P20 P20 +U 1 1 53A8CDAE +P 2800 1300 +F 0 "P20" H 2800 1950 60 0000 C CNN +F 1 "HACKRF_ONE_P20" H 2800 650 60 0000 C CNN +F 2 "header:HEADER_11X2_REV_SM_254_AP" H 2800 1300 60 0001 C CNN +F 3 "" H 2800 1300 60 0000 C CNN +F 4 "MLE" H 2800 1300 60 0001 C CNN "Mfr" +F 5 "TSHSM-111-D-06-T-V-S-P-TR-AP-LF" H 2800 1300 60 0001 C CNN "Part" + 1 2800 1300 + 1 0 0 -1 +$EndComp +$Comp +L HACKRF_ONE_P22 P22 +U 1 1 53A8CDB6 +P 2800 3000 +F 0 "P22" H 2800 3750 60 0000 C CNN +F 1 "HACKRF_ONE_P22" H 2800 2250 60 0000 C CNN +F 2 "header:HEADER_13X2_REV_SM_254_AP" H 2800 3000 60 0001 C CNN +F 3 "" H 2800 3000 60 0000 C CNN +F 4 "MLE" H 2800 3000 60 0001 C CNN "Mfr" +F 5 "TSHSM-113-D-06-T-V-S-P-TR-AP-LF" H 2800 3000 60 0001 C CNN "Part" + 1 2800 3000 + 1 0 0 -1 +$EndComp +$Comp +L HACKRF_ONE_P28 P28 +U 1 1 53A8CDBE +P 2800 4700 +F 0 "P28" H 2800 5350 60 0000 C CNN +F 1 "HACKRF_ONE_P28" H 2800 4050 60 0000 C CNN +F 2 "header:HEADER_11X2_REV_SM_254_AP" H 2800 4700 60 0001 C CNN +F 3 "" H 2800 4700 60 0000 C CNN +F 4 "MLE" H 2800 4700 60 0001 C CNN "Mfr" +F 5 "TSHSM-111-D-06-T-V-S-P-TR-AP-LF" H 2800 4700 60 0001 C CNN "Part" + 1 2800 4700 + 1 0 0 -1 +$EndComp +NoConn ~ 2000 1600 +NoConn ~ 2000 1800 +NoConn ~ 3600 1800 +NoConn ~ 3600 800 +NoConn ~ 3600 900 +Wire Wire Line + 1100 5000 2000 5000 +Wire Wire Line + 4400 4500 3600 4500 +Wire Wire Line + 1200 3500 2000 3500 +Wire Wire Line + 1200 3400 2000 3400 +Wire Wire Line + 4600 3400 3600 3400 +Wire Wire Line + 1200 3300 2000 3300 +Wire Wire Line + 4600 3300 3600 3300 +Wire Wire Line + 1100 5100 2000 5100 +Wire Wire Line + 3700 3600 3600 3600 +Wire Wire Line + 3700 3500 3600 3500 +Wire Wire Line + 1200 800 2000 800 +Wire Wire Line + 3600 3100 3800 3100 +Wire Wire Line + 1200 3200 2000 3200 +Wire Wire Line + 1200 3100 2000 3100 +Wire Wire Line + 1200 3000 2000 3000 +Wire Wire Line + 1700 4300 2000 4300 +Wire Wire Line + 1700 4400 2000 4400 +Wire Wire Line + 1700 4500 2000 4500 +Wire Wire Line + 1700 4700 2000 4700 +Wire Wire Line + 1700 4600 2000 4600 +Wire Wire Line + 4400 4600 3600 4600 +Wire Wire Line + 4400 4400 3600 4400 +Wire Wire Line + 4400 4300 3600 4300 +Wire Wire Line + 2000 2500 1200 2500 +Wire Wire Line + 4200 1300 3600 1300 +Wire Wire Line + 4200 1200 3600 1200 +Wire Wire Line + 4200 1100 3600 1100 +Wire Wire Line + 4200 1000 3600 1000 +Wire Wire Line + 1200 1300 2000 1300 +Wire Wire Line + 1200 1200 2000 1200 +Wire Wire Line + 1200 1100 2000 1100 +Wire Wire Line + 1200 1000 2000 1000 +Wire Wire Line + 3700 1700 3600 1700 +Wire Wire Line + 3700 1600 3600 1600 +Wire Wire Line + 3700 1500 3600 1500 +Wire Wire Line + 3700 1400 3600 1400 +Wire Wire Line + 2000 1700 1900 1700 +Wire Wire Line + 2000 1500 1900 1500 +Wire Wire Line + 2000 1400 1900 1400 +Wire Wire Line + 2000 900 1900 900 +Wire Wire Line + 2000 4200 1900 4200 +Wire Wire Line + 3700 4700 3600 4700 +Wire Wire Line + 3600 4200 3700 4200 +Wire Wire Line + 3600 3200 3700 3200 +Wire Wire Line + 3700 2800 3600 2800 +Wire Wire Line + 3600 2500 3700 2500 +Wire Wire Line + 2000 2900 1900 2900 +Wire Wire Line + 1200 2600 2000 2600 +Wire Wire Line + 4600 2600 3600 2600 +$Comp +L 5M40ZE64 U3 +U 1 1 53A8D11B +P 7750 3050 +F 0 "U3" H 7750 3100 60 0000 C CNN +F 1 "5M40ZE64" H 7750 3000 60 0000 C CNN +F 2 "ipc_qfp:IPC_QFP40P900X900X120-65N" H 7750 3050 60 0001 C CNN +F 3 "" H 7750 3050 60 0000 C CNN +F 4 "Altera" H 7750 3050 60 0001 C CNN "Mfr" +F 5 "5M40ZE64C5N" H 7750 3050 60 0001 C CNN "Part" + 1 7750 3050 + 1 0 0 -1 +$EndComp +Text Label 7200 1350 1 60 ~ 0 +LCD_DB0 +Text Label 7300 1350 1 60 ~ 0 +LCD_DB1 +Text Label 7400 1350 1 60 ~ 0 +LCD_DB2 +Text Label 7500 1350 1 60 ~ 0 +LCD_DB3 +Text Label 7600 1350 1 60 ~ 0 +LCD_DB4 +Text Label 7800 1350 1 60 ~ 0 +LCD_DB5 +Text Label 7900 1350 1 60 ~ 0 +LCD_DB6 +Text Label 8000 1350 1 60 ~ 0 +LCD_DB7 +Text Label 8100 1350 1 60 ~ 0 +LCD_DB8 +Text Label 8200 1350 1 60 ~ 0 +LCD_DB9 +Text Label 8300 1350 1 60 ~ 0 +LCD_DB10 +Text Label 8400 1350 1 60 ~ 0 +LCD_DB11 +Text Label 8500 1350 1 60 ~ 0 +LCD_DB12 +Text Label 9450 2300 0 60 ~ 0 +LCD_DB13 +Text Label 9450 2400 0 60 ~ 0 +LCD_DB14 +Text Label 9450 2500 0 60 ~ 0 +LCD_DB15 +Text Label 5100 6200 0 60 ~ 0 +MCU_D0 +Text Label 5100 6300 0 60 ~ 0 +MCU_D1 +Text Label 5100 6100 0 60 ~ 0 +MCU_D2 +Text Label 5100 6000 0 60 ~ 0 +MCU_D3 +Text Label 3300 6200 0 60 ~ 0 +MCU_D4 +Text Label 3300 6300 0 60 ~ 0 +MCU_D5 +Text Label 3300 6100 0 60 ~ 0 +MCU_D6 +Text Label 3300 6000 0 60 ~ 0 +MCU_D7 +Text Label 6900 6200 0 60 ~ 0 +MCU_LCD_WR +Text Label 6900 6300 0 60 ~ 0 +MCU_DIR +Text Label 5500 3600 0 60 ~ 0 +PP_CPLD_TMS +$Comp +L +3.3V #PWR061 +U 1 1 53A8D13C +P 7600 4750 +F 0 "#PWR061" H 7600 4710 30 0001 C CNN +F 1 "+3.3V" H 7600 4860 30 0000 C CNN +F 2 "" H 7600 4750 60 0000 C CNN +F 3 "" H 7600 4750 60 0000 C CNN + 1 7600 4750 + -1 0 0 1 +$EndComp +$Comp +L +3.3V #PWR062 +U 1 1 53A8D142 +P 6050 2800 +F 0 "#PWR062" H 6050 2760 30 0001 C CNN +F 1 "+3.3V" H 6050 2910 30 0000 C CNN +F 2 "" H 6050 2800 60 0000 C CNN +F 3 "" H 6050 2800 60 0000 C CNN + 1 6050 2800 + 0 -1 -1 0 +$EndComp +$Comp +L +1.8V #PWR063 +U 1 1 53A8D148 +P 9450 3000 +F 0 "#PWR063" H 9450 3140 20 0001 C CNN +F 1 "+1.8V" H 9450 3110 30 0000 C CNN +F 2 "" H 9450 3000 60 0000 C CNN +F 3 "" H 9450 3000 60 0000 C CNN + 1 9450 3000 + 0 1 1 0 +$EndComp +$Comp +L +1.8V #PWR064 +U 1 1 53A8D14E +P 6050 3000 +F 0 "#PWR064" H 6050 3140 20 0001 C CNN +F 1 "+1.8V" H 6050 3110 30 0000 C CNN +F 2 "" H 6050 3000 60 0000 C CNN +F 3 "" H 6050 3000 60 0000 C CNN + 1 6050 3000 + 0 -1 -1 0 +$EndComp +$Comp +L GND #PWR065 +U 1 1 53A8D154 +P 8950 4750 +F 0 "#PWR065" H 8950 4750 30 0001 C CNN +F 1 "GND" H 8950 4680 30 0001 C CNN +F 2 "" H 8950 4750 60 0000 C CNN +F 3 "" H 8950 4750 60 0000 C CNN + 1 8950 4750 + 1 0 0 -1 +$EndComp +Text Label 8200 5400 1 60 ~ 0 +RESET# +Text Label 8300 5400 1 60 ~ 0 +MCU_LCD_RD_R +Text Label 5500 3700 0 60 ~ 0 +H1_CPLD_TDI +Text Label 9700 3800 0 60 ~ 0 +MCU_ADDR_R +Text Label 8500 5400 1 60 ~ 0 +MCU_IO_STBX_R +$Comp +L +1.8V #PWR066 +U 1 1 53A8D16D +P 9450 3200 +F 0 "#PWR066" H 9450 3340 20 0001 C CNN +F 1 "+1.8V" H 9450 3310 30 0000 C CNN +F 2 "" H 9450 3200 60 0000 C CNN +F 3 "" H 9450 3200 60 0000 C CNN + 1 9450 3200 + 0 1 1 0 +$EndComp +$Comp +L +1.8V #PWR067 +U 1 1 53A8D173 +P 7700 950 +F 0 "#PWR067" H 7700 1090 20 0001 C CNN +F 1 "+1.8V" H 7700 1060 30 0000 C CNN +F 2 "" H 7700 950 60 0000 C CNN +F 3 "" H 7700 950 60 0000 C CNN + 1 7700 950 + 1 0 0 -1 +$EndComp +Wire Wire Line + 5000 6300 5500 6300 +Wire Wire Line + 5000 6200 5500 6200 +Wire Wire Line + 5000 6100 5500 6100 +Wire Wire Line + 5000 6000 5500 6000 +Wire Wire Line + 7000 4650 7000 5500 +Wire Wire Line + 3200 6300 3700 6300 +Wire Wire Line + 3200 6200 3700 6200 +Wire Wire Line + 3200 6100 3700 6100 +Wire Wire Line + 3200 6000 3700 6000 +Wire Wire Line + 5400 3100 6150 3100 +Wire Wire Line + 6800 6100 7500 6100 +Wire Wire Line + 6800 6300 7500 6300 +Wire Wire Line + 6800 6000 7500 6000 +Wire Wire Line + 5400 3600 6150 3600 +Wire Wire Line + 7700 4650 7700 5500 +Wire Wire Line + 7800 4650 7800 5500 +Wire Wire Line + 7900 4650 7900 5500 +Wire Wire Line + 8000 4650 8000 5500 +Wire Wire Line + 8100 5500 8100 4650 +Wire Wire Line + 8200 5500 8200 4650 +Wire Wire Line + 7900 800 7900 1450 +Wire Wire Line + 8000 800 8000 1450 +Wire Wire Line + 8950 4650 8950 4750 +Wire Wire Line + 5400 3700 6150 3700 +Wire Wire Line + 5400 3800 6150 3800 +Wire Wire Line + 6150 3000 6050 3000 +Wire Wire Line + 9450 3000 9350 3000 +Wire Wire Line + 7700 950 7700 1450 +Wire Wire Line + 9450 3200 9350 3200 +Wire Wire Line + 7600 4750 7600 4650 +Wire Wire Line + 6050 2800 6150 2800 +Wire Wire Line + 8300 5500 8300 4650 +Wire Wire Line + 8500 5500 8500 4650 +Wire Wire Line + 7800 800 7800 1450 +Wire Wire Line + 7600 800 7600 1450 +Wire Wire Line + 7500 800 7500 1450 +Wire Wire Line + 7400 800 7400 1450 +Wire Wire Line + 7300 800 7300 1450 +Wire Wire Line + 7200 800 7200 1450 +Wire Wire Line + 7500 5500 7500 4650 +Wire Wire Line + 7400 4650 7400 5500 +Wire Wire Line + 7300 4650 7300 5500 +Wire Wire Line + 7200 4650 7200 5500 +Wire Wire Line + 7100 4650 7100 5500 +Wire Wire Line + 5400 3500 6150 3500 +Wire Wire Line + 5400 3400 6150 3400 +Wire Wire Line + 5400 3300 6150 3300 +Wire Wire Line + 5400 3200 6150 3200 +Wire Wire Line + 6050 2500 6150 2500 +Wire Wire Line + 6050 2400 6150 2400 +Wire Wire Line + 6050 2300 6150 2300 +Wire Wire Line + 8100 1450 8100 800 +Wire Wire Line + 8200 1450 8200 800 +Wire Wire Line + 8300 1450 8300 800 +Wire Wire Line + 8400 1450 8400 800 +Wire Wire Line + 8500 1450 8500 800 +Wire Wire Line + 9950 2300 9350 2300 +Wire Wire Line + 9950 2400 9350 2400 +Wire Wire Line + 9950 2500 9350 2500 +Wire Wire Line + 10400 2800 9350 2800 +Text Label 5500 3800 0 60 ~ 0 +H1_CPLD_TCK +Text Notes 9400 5500 0 60 ~ 0 +TDI, TMS: weak internal PU\nTCK: weak internal PD +Text Label 7000 5400 1 60 ~ 0 +PP_CPLD_TDO +$Comp +L +3.3V #PWR068 +U 1 1 53A8D521 +P 800 5700 +F 0 "#PWR068" H 800 5660 30 0001 C CNN +F 1 "+3.3V" H 800 5810 30 0000 C CNN +F 2 "" H 800 5700 60 0000 C CNN +F 3 "" H 800 5700 60 0000 C CNN + 1 800 5700 + 1 0 0 -1 +$EndComp +$Comp +L C C28 +U 1 1 53A8D527 +P 800 6100 +F 0 "C28" H 850 6200 50 0000 L CNN +F 1 "100N" H 850 6000 50 0000 L CNN +F 2 "ipc_capc:IPC_CAPC1005X55N" H 800 6100 60 0001 C CNN +F 3 "" H 800 6100 60 0000 C CNN +F 4 "Murata" H 800 6100 60 0001 C CNN "Mfr" +F 5 "GRM155R61A104KA01" H 800 6100 60 0001 C CNN "Part" + 1 800 6100 + 1 0 0 -1 +$EndComp +$Comp +L GND #PWR069 +U 1 1 53A8D52D +P 2000 7500 +F 0 "#PWR069" H 2000 7500 30 0001 C CNN +F 1 "GND" H 2000 7430 30 0001 C CNN +F 2 "" H 2000 7500 60 0000 C CNN +F 3 "" H 2000 7500 60 0000 C CNN + 1 2000 7500 + 1 0 0 -1 +$EndComp +$Comp +L BATTERY BT1 +U 1 1 53A8D535 +P 6000 7200 +F 0 "BT1" H 6000 7350 50 0000 C CNN +F 1 "BATTERY" H 6000 7060 50 0000 C CNN +F 2 "bat_coin:MPD_BU2032SM-BT-G" H 6000 7200 60 0001 C CNN +F 3 "" H 6000 7200 60 0000 C CNN +F 4 "MPD" H 6000 7200 60 0001 C CNN "Mfr" +F 5 "BU2032SM-BT-GTR" H 6000 7200 60 0001 C CNN "Part" + 1 6000 7200 + 0 1 1 0 +$EndComp +$Comp +L GND #PWR070 +U 1 1 53A8D53B +P 6000 7500 +F 0 "#PWR070" H 6000 7500 30 0001 C CNN +F 1 "GND" H 6000 7430 30 0001 C CNN +F 2 "" H 6000 7500 60 0000 C CNN +F 3 "" H 6000 7500 60 0000 C CNN + 1 6000 7500 + 1 0 0 -1 +$EndComp +Text Label 6150 6900 0 60 ~ 0 +VBAT +$Comp +L C C30 +U 1 1 53A8D542 +P 1200 6100 +F 0 "C30" H 1250 6200 50 0000 L CNN +F 1 "100N" H 1250 6000 50 0000 L CNN +F 2 "ipc_capc:IPC_CAPC1005X55N" H 1200 6100 60 0001 C CNN +F 3 "" H 1200 6100 60 0000 C CNN +F 4 "Murata" H 1200 6100 60 0001 C CNN "Mfr" +F 5 "GRM155R61A104KA01" H 1200 6100 60 0001 C CNN "Part" + 1 1200 6100 + 1 0 0 -1 +$EndComp +$Comp +L C C29 +U 1 1 53A8D548 +P 800 7200 +F 0 "C29" H 850 7300 50 0000 L CNN +F 1 "100N" H 850 7100 50 0000 L CNN +F 2 "ipc_capc:IPC_CAPC1005X55N" H 800 7200 60 0001 C CNN +F 3 "" H 800 7200 60 0000 C CNN +F 4 "Murata" H 800 7200 60 0001 C CNN "Mfr" +F 5 "GRM155R61A104KA01" H 800 7200 60 0001 C CNN "Part" + 1 800 7200 + 1 0 0 -1 +$EndComp +$Comp +L C C31 +U 1 1 53A8D54E +P 1200 7200 +F 0 "C31" H 1250 7300 50 0000 L CNN +F 1 "100N" H 1250 7100 50 0000 L CNN +F 2 "ipc_capc:IPC_CAPC1005X55N" H 1200 7200 60 0001 C CNN +F 3 "" H 1200 7200 60 0000 C CNN +F 4 "Murata" H 1200 7200 60 0001 C CNN "Mfr" +F 5 "GRM155R61A104KA01" H 1200 7200 60 0001 C CNN "Part" + 1 1200 7200 + 1 0 0 -1 +$EndComp +$Comp +L GND #PWR071 +U 1 1 53A8D554 +P 800 6400 +F 0 "#PWR071" H 800 6400 30 0001 C CNN +F 1 "GND" H 800 6330 30 0001 C CNN +F 2 "" H 800 6400 60 0000 C CNN +F 3 "" H 800 6400 60 0000 C CNN + 1 800 6400 + 1 0 0 -1 +$EndComp +$Comp +L GND #PWR072 +U 1 1 53A8D55A +P 1200 6400 +F 0 "#PWR072" H 1200 6400 30 0001 C CNN +F 1 "GND" H 1200 6330 30 0001 C CNN +F 2 "" H 1200 6400 60 0000 C CNN +F 3 "" H 1200 6400 60 0000 C CNN + 1 1200 6400 + 1 0 0 -1 +$EndComp +$Comp +L GND #PWR073 +U 1 1 53A8D560 +P 800 7500 +F 0 "#PWR073" H 800 7500 30 0001 C CNN +F 1 "GND" H 800 7430 30 0001 C CNN +F 2 "" H 800 7500 60 0000 C CNN +F 3 "" H 800 7500 60 0000 C CNN + 1 800 7500 + 1 0 0 -1 +$EndComp +$Comp +L GND #PWR074 +U 1 1 53A8D566 +P 1200 7500 +F 0 "#PWR074" H 1200 7500 30 0001 C CNN +F 1 "GND" H 1200 7430 30 0001 C CNN +F 2 "" H 1200 7500 60 0000 C CNN +F 3 "" H 1200 7500 60 0000 C CNN + 1 1200 7500 + 1 0 0 -1 +$EndComp +$Comp +L C C33 +U 1 1 53A8D56C +P 1600 7200 +F 0 "C33" H 1650 7300 50 0000 L CNN +F 1 "100N" H 1650 7100 50 0000 L CNN +F 2 "ipc_capc:IPC_CAPC1005X55N" H 1600 7200 60 0001 C CNN +F 3 "" H 1600 7200 60 0000 C CNN +F 4 "Murata" H 1600 7200 60 0001 C CNN "Mfr" +F 5 "GRM155R61A104KA01" H 1600 7200 60 0001 C CNN "Part" + 1 1600 7200 + 1 0 0 -1 +$EndComp +$Comp +L C C35 +U 1 1 53A8D572 +P 2000 7200 +F 0 "C35" H 2050 7300 50 0000 L CNN +F 1 "100N" H 2050 7100 50 0000 L CNN +F 2 "ipc_capc:IPC_CAPC1005X55N" H 2000 7200 60 0001 C CNN +F 3 "" H 2000 7200 60 0000 C CNN +F 4 "Murata" H 2000 7200 60 0001 C CNN "Mfr" +F 5 "GRM155R61A104KA01" H 2000 7200 60 0001 C CNN "Part" + 1 2000 7200 + 1 0 0 -1 +$EndComp +$Comp +L GND #PWR075 +U 1 1 53A8D578 +P 1600 7500 +F 0 "#PWR075" H 1600 7500 30 0001 C CNN +F 1 "GND" H 1600 7430 30 0001 C CNN +F 2 "" H 1600 7500 60 0000 C CNN +F 3 "" H 1600 7500 60 0000 C CNN + 1 1600 7500 + 1 0 0 -1 +$EndComp +$Comp +L +1.8V #PWR076 +U 1 1 53A8D57E +P 800 6800 +F 0 "#PWR076" H 800 6940 20 0001 C CNN +F 1 "+1.8V" H 800 6910 30 0000 C CNN +F 2 "" H 800 6800 60 0000 C CNN +F 3 "" H 800 6800 60 0000 C CNN + 1 800 6800 + 1 0 0 -1 +$EndComp +$Comp +L REGULATOR_SOT23_5 U2 +U 1 1 53A8D586 +P 4400 7000 +F 0 "U2" H 4400 7350 60 0000 C CNN +F 1 "REGULATOR_SOT23_5" H 4400 7250 60 0000 C CNN +F 2 "ipc_sot:IPC_SOT95P280X110-5N" H 4400 7000 60 0001 C CNN +F 3 "" H 4400 7000 60 0000 C CNN +F 4 "Toshiba" H 4400 7000 60 0001 C CNN "Mfr" +F 5 "TCR2EF18,LM" H 4400 7000 60 0001 C CNN "Part" + 1 4400 7000 + 1 0 0 -1 +$EndComp +$Comp +L C C38 +U 1 1 53A8D58C +P 3500 7200 +F 0 "C38" H 3550 7300 50 0000 L CNN +F 1 "10U" H 3550 7100 50 0000 L CNN +F 2 "ipc_capc:IPC_CAPC2012X140N" H 3500 7200 60 0001 C CNN +F 3 "" H 3500 7200 60 0000 C CNN +F 4 "Murata" H 3500 7200 60 0001 C CNN "Mfr" +F 5 "GRM21BR61A106KE19" H 3500 7200 60 0001 C CNN "Part" + 1 3500 7200 + -1 0 0 -1 +$EndComp +$Comp +L C C40 +U 1 1 53A8D592 +P 5300 7200 +F 0 "C40" H 5350 7300 50 0000 L CNN +F 1 "10U" H 5350 7100 50 0000 L CNN +F 2 "ipc_capc:IPC_CAPC2012X140N" H 5300 7200 60 0001 C CNN +F 3 "" H 5300 7200 60 0000 C CNN +F 4 "Murata" H 5300 7200 60 0001 C CNN "Mfr" +F 5 "GRM21BR61A106KE19" H 5300 7200 60 0001 C CNN "Part" + 1 5300 7200 + -1 0 0 -1 +$EndComp +$Comp +L GND #PWR077 +U 1 1 53A8D598 +P 4400 7400 +F 0 "#PWR077" H 4400 7400 30 0001 C CNN +F 1 "GND" H 4400 7330 30 0001 C CNN +F 2 "" H 4400 7400 60 0000 C CNN +F 3 "" H 4400 7400 60 0000 C CNN + 1 4400 7400 + 1 0 0 -1 +$EndComp +$Comp +L GND #PWR078 +U 1 1 53A8D59E +P 3500 7500 +F 0 "#PWR078" H 3500 7500 30 0001 C CNN +F 1 "GND" H 3500 7430 30 0001 C CNN +F 2 "" H 3500 7500 60 0000 C CNN +F 3 "" H 3500 7500 60 0000 C CNN + 1 3500 7500 + 1 0 0 -1 +$EndComp +$Comp +L GND #PWR079 +U 1 1 53A8D5A4 +P 5300 7500 +F 0 "#PWR079" H 5300 7500 30 0001 C CNN +F 1 "GND" H 5300 7430 30 0001 C CNN +F 2 "" H 5300 7500 60 0000 C CNN +F 3 "" H 5300 7500 60 0000 C CNN + 1 5300 7500 + 1 0 0 -1 +$EndComp +$Comp +L C C39 +U 1 1 53A8D5AA +P 4900 7400 +F 0 "C39" H 4950 7500 50 0000 L CNN +F 1 "DNI" H 4950 7300 50 0000 L CNN +F 2 "ipc_capc:IPC_CAPC1608X90N" H 5100 7400 60 0001 C CNN +F 3 "" H 4900 7400 60 0000 C CNN + 1 4900 7400 + -1 0 0 -1 +$EndComp +$Comp +L GND #PWR080 +U 1 1 53A8D5B0 +P 4900 7700 +F 0 "#PWR080" H 4900 7700 30 0001 C CNN +F 1 "GND" H 4900 7630 30 0001 C CNN +F 2 "" H 4900 7700 60 0000 C CNN +F 3 "" H 4900 7700 60 0000 C CNN + 1 4900 7700 + 1 0 0 -1 +$EndComp +$Comp +L +1.8V #PWR081 +U 1 1 53A8D5B6 +P 5300 6800 +F 0 "#PWR081" H 5300 6940 20 0001 C CNN +F 1 "+1.8V" H 5300 6910 30 0000 C CNN +F 2 "" H 5300 6800 60 0000 C CNN +F 3 "" H 5300 6800 60 0000 C CNN + 1 5300 6800 + 1 0 0 -1 +$EndComp +$Comp +L +3.3V #PWR082 +U 1 1 53A8D5BC +P 3500 6800 +F 0 "#PWR082" H 3500 6760 30 0001 C CNN +F 1 "+3.3V" H 3500 6910 30 0000 C CNN +F 2 "" H 3500 6800 60 0000 C CNN +F 3 "" H 3500 6800 60 0000 C CNN + 1 3500 6800 + 1 0 0 -1 +$EndComp +$Comp +L C C32 +U 1 1 53A8D5C2 +P 1600 6100 +F 0 "C32" H 1650 6200 50 0000 L CNN +F 1 "10U" H 1650 6000 50 0000 L CNN +F 2 "ipc_capc:IPC_CAPC2012X140N" H 1600 6100 60 0001 C CNN +F 3 "" H 1600 6100 60 0000 C CNN +F 4 "Murata" H 1600 6100 60 0001 C CNN "Mfr" +F 5 "GRM21BR61A106KE19" H 1600 6100 60 0001 C CNN "Part" + 1 1600 6100 + 1 0 0 -1 +$EndComp +$Comp +L C C34 +U 1 1 53A8D5C8 +P 2000 6100 +F 0 "C34" H 2050 6200 50 0000 L CNN +F 1 "10U" H 2050 6000 50 0000 L CNN +F 2 "ipc_capc:IPC_CAPC2012X140N" H 2000 6100 60 0001 C CNN +F 3 "" H 2000 6100 60 0000 C CNN +F 4 "Murata" H 2000 6100 60 0001 C CNN "Mfr" +F 5 "GRM21BR61A106KE19" H 2000 6100 60 0001 C CNN "Part" + 1 2000 6100 + 1 0 0 -1 +$EndComp +$Comp +L GND #PWR083 +U 1 1 53A8D5CE +P 1600 6400 +F 0 "#PWR083" H 1600 6400 30 0001 C CNN +F 1 "GND" H 1600 6330 30 0001 C CNN +F 2 "" H 1600 6400 60 0000 C CNN +F 3 "" H 1600 6400 60 0000 C CNN + 1 1600 6400 + 1 0 0 -1 +$EndComp +$Comp +L GND #PWR084 +U 1 1 53A8D5D4 +P 2000 6400 +F 0 "#PWR084" H 2000 6400 30 0001 C CNN +F 1 "GND" H 2000 6330 30 0001 C CNN +F 2 "" H 2000 6400 60 0000 C CNN +F 3 "" H 2000 6400 60 0000 C CNN + 1 2000 6400 + 1 0 0 -1 +$EndComp +$Comp +L C C36 +U 1 1 53A8D5DA +P 2400 7200 +F 0 "C36" H 2450 7300 50 0000 L CNN +F 1 "10U" H 2450 7100 50 0000 L CNN +F 2 "ipc_capc:IPC_CAPC2012X140N" H 2400 7200 60 0001 C CNN +F 3 "" H 2400 7200 60 0000 C CNN +F 4 "Murata" H 2400 7200 60 0001 C CNN "Mfr" +F 5 "GRM21BR61A106KE19" H 2400 7200 60 0001 C CNN "Part" + 1 2400 7200 + 1 0 0 -1 +$EndComp +$Comp +L C C37 +U 1 1 53A8D5E0 +P 2800 7200 +F 0 "C37" H 2850 7300 50 0000 L CNN +F 1 "10U" H 2850 7100 50 0000 L CNN +F 2 "ipc_capc:IPC_CAPC2012X140N" H 2800 7200 60 0001 C CNN +F 3 "" H 2800 7200 60 0000 C CNN +F 4 "Murata" H 2800 7200 60 0001 C CNN "Mfr" +F 5 "GRM21BR61A106KE19" H 2800 7200 60 0001 C CNN "Part" + 1 2800 7200 + 1 0 0 -1 +$EndComp +$Comp +L GND #PWR085 +U 1 1 53A8D5E6 +P 2800 7500 +F 0 "#PWR085" H 2800 7500 30 0001 C CNN +F 1 "GND" H 2800 7430 30 0001 C CNN +F 2 "" H 2800 7500 60 0000 C CNN +F 3 "" H 2800 7500 60 0000 C CNN + 1 2800 7500 + 1 0 0 -1 +$EndComp +$Comp +L GND #PWR086 +U 1 1 53A8D5EC +P 2400 7500 +F 0 "#PWR086" H 2400 7500 30 0001 C CNN +F 1 "GND" H 2400 7430 30 0001 C CNN +F 2 "" H 2400 7500 60 0000 C CNN +F 3 "" H 2400 7500 60 0000 C CNN + 1 2400 7500 + 1 0 0 -1 +$EndComp +Wire Wire Line + 2800 7400 2800 7500 +Wire Wire Line + 2400 7400 2400 7500 +Connection ~ 2400 6900 +Wire Wire Line + 2800 6900 2800 7000 +Connection ~ 2000 6900 +Wire Wire Line + 2400 6900 2400 7000 +Wire Wire Line + 2000 6300 2000 6400 +Connection ~ 1600 5800 +Wire Wire Line + 2000 5800 2000 5900 +Wire Wire Line + 1600 6300 1600 6400 +Connection ~ 1200 5800 +Wire Wire Line + 1600 5800 1600 5900 +Connection ~ 1600 6900 +Wire Wire Line + 1600 6900 1600 7000 +Connection ~ 1200 6900 +Connection ~ 3900 6900 +Wire Wire Line + 3900 7100 3900 6900 +Wire Wire Line + 4000 7100 3900 7100 +Connection ~ 3500 6900 +Wire Wire Line + 3500 6800 3500 7000 +Wire Wire Line + 3500 6900 4000 6900 +Connection ~ 5300 6900 +Wire Wire Line + 4900 7600 4900 7700 +Wire Wire Line + 4900 7100 4900 7200 +Wire Wire Line + 4800 7100 4900 7100 +Wire Wire Line + 4400 7300 4400 7400 +Wire Wire Line + 5300 7400 5300 7500 +Wire Wire Line + 5300 6800 5300 7000 +Wire Wire Line + 4800 6900 5300 6900 +Wire Wire Line + 3500 7400 3500 7500 +Wire Wire Line + 1600 7400 1600 7500 +Wire Wire Line + 2000 7400 2000 7500 +Wire Wire Line + 2000 6900 2000 7000 +Connection ~ 800 6900 +Wire Wire Line + 1200 6900 1200 7000 +Wire Wire Line + 800 6900 2800 6900 +Wire Wire Line + 800 6800 800 7000 +Connection ~ 800 5800 +Wire Wire Line + 1200 5800 1200 5900 +Wire Wire Line + 800 5800 2800 5800 +Wire Wire Line + 800 5700 800 5900 +Wire Wire Line + 800 6300 800 6400 +Wire Wire Line + 1200 6300 1200 6400 +Wire Wire Line + 800 7400 800 7500 +Wire Wire Line + 1200 7400 1200 7500 +Wire Wire Line + 6000 7400 6000 7500 +Wire Wire Line + 6000 6900 6000 7000 +$Comp +L C C41 +U 1 1 53A8D62C +P 6500 7200 +F 0 "C41" H 6550 7300 50 0000 L CNN +F 1 "DNI" H 6550 7100 50 0000 L CNN +F 2 "ipc_capc:IPC_CAPC2012X140N" H 6500 7200 60 0001 C CNN +F 3 "" H 6500 7200 60 0000 C CNN +F 4 "Murata" H 6500 7200 60 0001 C CNN "Mfr" +F 5 "GRM21BR61A106KE19" H 6500 7200 60 0001 C CNN "Part" + 1 6500 7200 + -1 0 0 -1 +$EndComp +$Comp +L GND #PWR087 +U 1 1 53A8D632 +P 6500 7500 +F 0 "#PWR087" H 6500 7500 30 0001 C CNN +F 1 "GND" H 6500 7430 30 0001 C CNN +F 2 "" H 6500 7500 60 0000 C CNN +F 3 "" H 6500 7500 60 0000 C CNN + 1 6500 7500 + 1 0 0 -1 +$EndComp +Wire Wire Line + 6500 7000 6500 6900 +Wire Wire Line + 6500 7400 6500 7500 +Wire Wire Line + 6500 6900 6000 6900 +Wire Wire Line + 8400 5500 8400 4650 +Text Label 3900 2600 0 60 ~ 0 +MCU_LCD_TE +Text Label 8400 5400 1 60 ~ 0 +MCU_LCD_TE_R +Wire Wire Line + 8800 6000 7900 6000 +Wire Wire Line + 8800 6100 7900 6100 +Wire Wire Line + 8800 6300 7900 6300 +Text Label 8000 6300 0 60 ~ 0 +MCU_DIR_R +Text Label 8000 6200 0 60 ~ 0 +MCU_LCD_WR_R +Text Label 9650 2900 0 60 ~ 0 +MCU_DIR_R +Text Label 9650 3100 0 60 ~ 0 +MCU_LCD_WR_R +Wire Wire Line + 9000 6000 9700 6000 +Wire Wire Line + 9000 6200 9700 6200 +Wire Wire Line + 9000 6400 9700 6400 +Wire Wire Line + 11100 6000 10200 6000 +Wire Wire Line + 11100 6200 10200 6200 +Wire Wire Line + 11100 6400 10200 6400 +Text Label 9100 6000 0 60 ~ 0 +MCU_LCD_RD +Text Label 9100 6200 0 60 ~ 0 +MCU_LCD_TE +Text Label 6900 6000 0 60 ~ 0 +MCU_ADDR +Text Label 9100 6400 0 60 ~ 0 +MCU_IO_STBX +Text Label 10300 6000 0 60 ~ 0 +MCU_LCD_RD_R +Text Label 10300 6200 0 60 ~ 0 +MCU_LCD_TE_R +Text Label 8000 6000 0 60 ~ 0 +MCU_ADDR_R +Text Label 10300 6400 0 60 ~ 0 +MCU_IO_STBX_R +Text Label 7100 5400 1 60 ~ 0 +MCU_D7_R +Text Label 7200 5400 1 60 ~ 0 +MCU_D6_R +Text Label 7300 5400 1 60 ~ 0 +MCU_D4_R +Text Label 7400 5400 1 60 ~ 0 +MCU_D5_R +Text Label 7500 5400 1 60 ~ 0 +MCU_D3_R +Text Label 7700 5400 1 60 ~ 0 +MCU_D2_R +Text Label 7900 5400 1 60 ~ 0 +MCU_D0_R +Text Label 8000 5400 1 60 ~ 0 +MCU_D1_R +Wire Wire Line + 4800 6000 4100 6000 +Wire Wire Line + 4800 6100 4100 6100 +Wire Wire Line + 4800 6200 4100 6200 +Wire Wire Line + 4800 6300 4100 6300 +Wire Wire Line + 6600 6000 5900 6000 +Wire Wire Line + 6600 6100 5900 6100 +Wire Wire Line + 6600 6200 5900 6200 +Wire Wire Line + 6600 6300 5900 6300 +Text Label 4200 6000 0 60 ~ 0 +MCU_D7_R +Text Label 4200 6100 0 60 ~ 0 +MCU_D6_R +Text Label 4200 6200 0 60 ~ 0 +MCU_D4_R +Text Label 4200 6300 0 60 ~ 0 +MCU_D5_R +Text Label 6000 6000 0 60 ~ 0 +MCU_D3_R +Text Label 6000 6100 0 60 ~ 0 +MCU_D2_R +Text Label 6000 6200 0 60 ~ 0 +MCU_D0_R +Text Label 6000 6300 0 60 ~ 0 +MCU_D1_R +$Comp +L R R22 +U 1 1 53A915E9 +P 1550 5300 +F 0 "R22" V 1630 5300 50 0000 C CNN +F 1 "220R" V 1550 5300 50 0000 C CNN +F 2 "ipc_resc:IPC_RESC1608X55N" H 1550 5300 60 0001 C CNN +F 3 "" H 1550 5300 60 0000 C CNN +F 4 "Yageo" V 1550 5300 60 0001 C CNN "Mfr" +F 5 "RC0603FR-07220RL" V 1550 5300 60 0001 C CNN "Part" + 1 1550 5300 + 0 1 -1 0 +$EndComp +Wire Wire Line + 1900 5100 1900 5300 +Wire Wire Line + 1900 5300 1800 5300 +Connection ~ 1900 5100 +Wire Wire Line + 1300 5300 1200 5300 +Text Label 1300 800 0 60 ~ 0 +VBAT +Wire Bus Line + 6900 700 10050 700 +Entry Wire Line + 7100 700 7200 800 +Entry Wire Line + 7200 700 7300 800 +Entry Wire Line + 7300 700 7400 800 +Entry Wire Line + 7400 700 7500 800 +Entry Wire Line + 7500 700 7600 800 +Entry Wire Line + 7700 700 7800 800 +Entry Wire Line + 7800 700 7900 800 +Entry Wire Line + 7900 700 8000 800 +Entry Wire Line + 8000 700 8100 800 +Entry Wire Line + 8100 700 8200 800 +Entry Wire Line + 8200 700 8300 800 +Entry Wire Line + 8300 700 8400 800 +Entry Wire Line + 8400 700 8500 800 +Entry Wire Line + 9950 2300 10050 2200 +Entry Wire Line + 9950 2400 10050 2300 +Entry Wire Line + 9950 2500 10050 2400 +Wire Wire Line + 7000 1450 7000 1350 +Wire Wire Line + 7000 1350 6900 1350 +Wire Wire Line + 6900 900 7100 900 +Wire Wire Line + 7100 900 7100 1450 +Text HLabel 6900 700 0 60 BiDi ~ 0 +LCD_DB[15..0] +Text HLabel 6900 900 0 60 Input ~ 0 +LCD_TE +Text HLabel 5400 3100 0 60 Input ~ 0 +SW_R +Text HLabel 5400 3400 0 60 Input ~ 0 +SW_ROT_B +Text HLabel 5400 3300 0 60 Input ~ 0 +SW_ROT_A +Text HLabel 5400 3200 0 60 Input ~ 0 +SW_D +Text HLabel 5400 3500 0 60 Input ~ 0 +SW_SEL +Text HLabel 7800 5500 3 60 Input ~ 0 +SW_U +Text HLabel 8100 5500 3 60 Input ~ 0 +SW_L +Text HLabel 6050 2600 0 60 Output ~ 0 +LCD_BACKLIGHT +Text HLabel 10400 3300 2 60 Output ~ 0 +LCD_RESET# +Text HLabel 10400 2800 2 60 Output ~ 0 +LCD_RS +Text HLabel 10400 2700 2 60 Output ~ 0 +LCD_RD# +Text HLabel 10400 2600 2 60 Output ~ 0 +LCD_WR# +Text HLabel 3700 1700 2 60 BiDi ~ 0 +TP_U +Text HLabel 3700 1600 2 60 BiDi ~ 0 +TP_L +Text HLabel 3700 1500 2 60 BiDi ~ 0 +TP_D +Text HLabel 3700 1400 2 60 BiDi ~ 0 +TP_R +Text HLabel 6900 1350 0 60 BiDi ~ 0 +TP_R +Text HLabel 6050 2300 0 60 BiDi ~ 0 +TP_D +Text HLabel 6050 2400 0 60 BiDi ~ 0 +TP_L +Text HLabel 6050 2500 0 60 BiDi ~ 0 +TP_U +Text HLabel 1200 3000 0 60 Output ~ 0 +I2S0_TX_SDA +Text HLabel 1200 3100 0 60 Output ~ 0 +I2S0_WS +Text HLabel 1200 3200 0 60 Output ~ 0 +I2S0_MCLK +Text HLabel 3800 3100 2 60 Output ~ 0 +I2S0_SCK +Text HLabel 3700 3500 2 60 BiDi ~ 0 +SDA +Text HLabel 3700 3600 2 60 Output ~ 0 +SCL +Text HLabel 1700 4300 0 60 Input ~ 0 +SD_CD +Text HLabel 1700 4400 0 60 BiDi ~ 0 +SD_DAT2 +Text HLabel 1700 4500 0 60 BiDi ~ 0 +SD_DAT0 +Text HLabel 1700 4600 0 60 BiDi ~ 0 +SD_CMD +Text HLabel 1700 4700 0 60 Output ~ 0 +SD_CLK +Text HLabel 4400 4300 2 60 BiDi ~ 0 +SD_DAT3 +Text HLabel 4400 4400 2 60 BiDi ~ 0 +SD_DAT1 +Text HLabel 1200 5300 0 60 Input ~ 0 +I2S0_RX_SDA +$Comp +L RPACK4 RP4 +U 1 1 53AB047A +P 7700 6150 +F 0 "RP4" H 7700 6400 60 0000 C CNN +F 1 "220R" H 7700 5900 60 0000 C CNN +F 2 "ipc_resc:IPC_RESCAXS80P160X320X60-8N" H 7700 6150 60 0001 C CNN +F 3 "" H 7700 6150 60 0000 C CNN +F 4 "Panasonic" H 7700 6150 60 0001 C CNN "Mfr" +F 5 "EXB-38V221JV" H 7700 6150 60 0001 C CNN "Part" + 1 7700 6150 + 1 0 0 -1 +$EndComp +$Comp +L RPACK4 RP6 +U 1 1 53AB04B9 +P 3900 6150 +F 0 "RP6" H 3900 6400 60 0000 C CNN +F 1 "220R" H 3900 5900 60 0000 C CNN +F 2 "ipc_resc:IPC_RESCAXS80P160X320X60-8N" H 3900 6150 60 0001 C CNN +F 3 "" H 3900 6150 60 0000 C CNN +F 4 "Panasonic" H 3900 6150 60 0001 C CNN "Mfr" +F 5 "EXB-38V221JV" H 3900 6150 60 0001 C CNN "Part" + 1 3900 6150 + 1 0 0 -1 +$EndComp +$Comp +L RPACK4 RP7 +U 1 1 53AB04D6 +P 5700 6150 +F 0 "RP7" H 5700 6400 60 0000 C CNN +F 1 "220R" H 5700 5900 60 0000 C CNN +F 2 "ipc_resc:IPC_RESCAXS80P160X320X60-8N" H 5700 6150 60 0001 C CNN +F 3 "" H 5700 6150 60 0000 C CNN +F 4 "Panasonic" H 5700 6150 60 0001 C CNN "Mfr" +F 5 "EXB-38V221JV" H 5700 6150 60 0001 C CNN "Part" + 1 5700 6150 + 1 0 0 -1 +$EndComp +Wire Wire Line + 8800 6200 7900 6200 +Wire Wire Line + 6800 6200 7500 6200 +Text Label 6900 6100 0 60 ~ 0 +P2_8 +Text Label 8000 6100 0 60 ~ 0 +P2_8_R +$Comp +L R R1 +U 1 1 53AB79CA +P 9950 6000 +F 0 "R1" V 10030 6000 50 0000 C CNN +F 1 "220R" V 9950 6000 50 0000 C CNN +F 2 "ipc_resc:IPC_RESC1608X55N" H 9950 6000 60 0001 C CNN +F 3 "" H 9950 6000 60 0000 C CNN +F 4 "Yageo" V 9950 6000 60 0001 C CNN "Mfr" +F 5 "RC0603FR-07220RL" V 9950 6000 60 0001 C CNN "Part" + 1 9950 6000 + 0 1 -1 0 +$EndComp +$Comp +L R R2 +U 1 1 53AB79D5 +P 9950 6200 +F 0 "R2" V 10030 6200 50 0000 C CNN +F 1 "220R" V 9950 6200 50 0000 C CNN +F 2 "ipc_resc:IPC_RESC1608X55N" H 9950 6200 60 0001 C CNN +F 3 "" H 9950 6200 60 0000 C CNN +F 4 "Yageo" V 9950 6200 60 0001 C CNN "Mfr" +F 5 "RC0603FR-07220RL" V 9950 6200 60 0001 C CNN "Part" + 1 9950 6200 + 0 1 -1 0 +$EndComp +$Comp +L R R3 +U 1 1 53AB79EA +P 9950 6400 +F 0 "R3" V 10030 6400 50 0000 C CNN +F 1 "220R" V 9950 6400 50 0000 C CNN +F 2 "ipc_resc:IPC_RESC1608X55N" H 9950 6400 60 0001 C CNN +F 3 "" H 9950 6400 60 0000 C CNN +F 4 "Yageo" V 9950 6400 60 0001 C CNN "Mfr" +F 5 "RC0603FR-07220RL" V 9950 6400 60 0001 C CNN "Part" + 1 9950 6400 + 0 1 -1 0 +$EndComp +Text Label 9700 3700 0 60 ~ 0 +P2_8_R +Wire Bus Line + 10050 700 10050 2400 +Wire Wire Line + 9350 2700 10400 2700 +Wire Wire Line + 9350 2600 10400 2600 +Wire Wire Line + 10400 2900 9350 2900 +Wire Wire Line + 10400 3100 9350 3100 +Wire Wire Line + 9350 3300 10400 3300 +Wire Wire Line + 10400 3700 9350 3700 +NoConn ~ 9350 3500 +NoConn ~ 9350 3600 +NoConn ~ 6150 2900 +NoConn ~ 6150 2700 +$Comp +L C C42 +U 1 1 53B1911F +P 2400 6100 +F 0 "C42" H 2450 6200 50 0000 L CNN +F 1 "10U" H 2450 6000 50 0000 L CNN +F 2 "ipc_capc:IPC_CAPC2012X140N" H 2400 6100 60 0001 C CNN +F 3 "" H 2400 6100 60 0000 C CNN +F 4 "Murata" H 2400 6100 60 0001 C CNN "Mfr" +F 5 "GRM21BR61A106KE19" H 2400 6100 60 0001 C CNN "Part" + 1 2400 6100 + 1 0 0 -1 +$EndComp +$Comp +L GND #PWR088 +U 1 1 53B1912C +P 2400 6400 +F 0 "#PWR088" H 2400 6400 30 0001 C CNN +F 1 "GND" H 2400 6330 30 0001 C CNN +F 2 "" H 2400 6400 60 0000 C CNN +F 3 "" H 2400 6400 60 0000 C CNN + 1 2400 6400 + 1 0 0 -1 +$EndComp +Wire Wire Line + 2400 6300 2400 6400 +Wire Wire Line + 2400 5800 2400 5900 +Connection ~ 2000 5800 +$Comp +L C C43 +U 1 1 53B1A065 +P 2800 6100 +F 0 "C43" H 2850 6200 50 0000 L CNN +F 1 "10U" H 2850 6000 50 0000 L CNN +F 2 "ipc_capc:IPC_CAPC2012X140N" H 2800 6100 60 0001 C CNN +F 3 "" H 2800 6100 60 0000 C CNN +F 4 "Murata" H 2800 6100 60 0001 C CNN "Mfr" +F 5 "GRM21BR61A106KE19" H 2800 6100 60 0001 C CNN "Part" + 1 2800 6100 + 1 0 0 -1 +$EndComp +$Comp +L GND #PWR089 +U 1 1 53B1A072 +P 2800 6400 +F 0 "#PWR089" H 2800 6400 30 0001 C CNN +F 1 "GND" H 2800 6330 30 0001 C CNN +F 2 "" H 2800 6400 60 0000 C CNN +F 3 "" H 2800 6400 60 0000 C CNN + 1 2800 6400 + 1 0 0 -1 +$EndComp +Wire Wire Line + 2800 5800 2800 5900 +Connection ~ 2400 5800 +Wire Wire Line + 2800 6300 2800 6400 +Wire Wire Line + 6150 2600 6050 2600 +NoConn ~ 9350 3400 +Wire Wire Line + 10400 3800 9350 3800 +$EndSCHEMATC diff --git a/hardware/portapack_h1/lcd_sw_sd.sch b/hardware/portapack_h1/lcd_sw_sd.sch new file mode 100644 index 000000000..73a879543 --- /dev/null +++ b/hardware/portapack_h1/lcd_sw_sd.sch @@ -0,0 +1,656 @@ +EESchema Schematic File Version 2 +LIBS:hackrf_expansion +LIBS:wolfson +LIBS:passive +LIBS:lcd_kingtech +LIBS:supply +LIBS:io_expander +LIBS:trs_jack +LIBS:battery +LIBS:mosfet +LIBS:microphone +LIBS:sd +LIBS:ck +LIBS:altera +LIBS:regulator +LIBS:tp +LIBS:header +LIBS:hole +LIBS:sharebrained +LIBS:fiducial +LIBS:portapack_h1-cache +EELAYER 25 0 +EELAYER END +$Descr A4 11693 8268 +encoding utf-8 +Sheet 3 4 +Title "PortaPack H1" +Date "21 Aug 2015" +Rev "20150821" +Comp "ShareBrained Technology, Inc." +Comment1 "Copyright © 2014, 2015 Jared Boone" +Comment2 "License: GNU General Public License, version 2" +Comment3 "" +Comment4 "" +$EndDescr +$Comp +L GND #PWR030 +U 1 1 53A91602 +P 9800 1800 +F 0 "#PWR030" H 9800 1800 30 0001 C CNN +F 1 "GND" H 9800 1730 30 0001 C CNN +F 2 "" H 9800 1800 60 0000 C CNN +F 3 "" H 9800 1800 60 0000 C CNN + 1 9800 1800 + 0 1 1 0 +$EndComp +$Comp +L GND #PWR031 +U 1 1 53A91608 +P 9800 5000 +F 0 "#PWR031" H 9800 5000 30 0001 C CNN +F 1 "GND" H 9800 4930 30 0001 C CNN +F 2 "" H 9800 5000 60 0000 C CNN +F 3 "" H 9800 5000 60 0000 C CNN + 1 9800 5000 + 0 1 1 0 +$EndComp +$Comp +L +3.3V #PWR032 +U 1 1 53A9160E +P 9700 1700 +F 0 "#PWR032" H 9700 1660 30 0001 C CNN +F 1 "+3.3V" H 9700 1810 30 0000 C CNN +F 2 "" H 9700 1700 60 0000 C CNN +F 3 "" H 9700 1700 60 0000 C CNN + 1 9700 1700 + 0 -1 -1 0 +$EndComp +$Comp +L +3.3V #PWR033 +U 1 1 53A91614 +P 9700 1900 +F 0 "#PWR033" H 9700 1860 30 0001 C CNN +F 1 "+3.3V" H 9700 2010 30 0000 C CNN +F 2 "" H 9700 1900 60 0000 C CNN +F 3 "" H 9700 1900 60 0000 C CNN + 1 9700 1900 + 0 -1 -1 0 +$EndComp +$Comp +L GND #PWR034 +U 1 1 53A91623 +P 9800 5700 +F 0 "#PWR034" H 9800 5700 30 0001 C CNN +F 1 "GND" H 9800 5630 30 0001 C CNN +F 2 "" H 9800 5700 60 0000 C CNN +F 3 "" H 9800 5700 60 0000 C CNN + 1 9800 5700 + 0 1 1 0 +$EndComp +Text Label 9100 4100 0 60 ~ 0 +LCD_DB7 +Text Label 9100 4200 0 60 ~ 0 +LCD_DB6 +Text Label 9100 4300 0 60 ~ 0 +LCD_DB5 +Text Label 9100 4400 0 60 ~ 0 +LCD_DB4 +Text Label 9100 4500 0 60 ~ 0 +LCD_DB3 +Text Label 9100 4600 0 60 ~ 0 +LCD_DB2 +Text Label 9100 4700 0 60 ~ 0 +LCD_DB1 +Text Label 9100 4800 0 60 ~ 0 +LCD_DB0 +$Comp +L R R20 +U 1 1 53A91635 +P 8300 1350 +F 0 "R20" V 8380 1350 50 0000 C CNN +F 1 "47K" V 8300 1350 50 0000 C CNN +F 2 "ipc_resc:IPC_RESC1608X55N" H 8300 1350 60 0001 C CNN +F 3 "" H 8300 1350 60 0000 C CNN +F 4 "Yageo" V 8300 1350 60 0001 C CNN "Mfr" +F 5 "RC0603FR-0747KL" V 8300 1350 60 0001 C CNN "Part" + 1 8300 1350 + 1 0 0 1 +$EndComp +$Comp +L GND #PWR035 +U 1 1 53A91640 +P 9700 2600 +F 0 "#PWR035" H 9700 2600 30 0001 C CNN +F 1 "GND" H 9700 2530 30 0001 C CNN +F 2 "" H 9700 2600 60 0000 C CNN +F 3 "" H 9700 2600 60 0000 C CNN + 1 9700 2600 + 0 1 1 0 +$EndComp +Text Notes 9050 6200 0 60 ~ 0 +LCD Mode:\n8080 MCU 16-bit bus interface I\nIM[3:0] = 0b0001, DB[15:0] active +Text Label 9100 4000 0 60 ~ 0 +LCD_DB8 +Text Label 9100 3900 0 60 ~ 0 +LCD_DB9 +Text Label 9100 3800 0 60 ~ 0 +LCD_DB10 +Text Label 9100 3700 0 60 ~ 0 +LCD_DB11 +Text Label 9100 3600 0 60 ~ 0 +LCD_DB12 +Text Label 9100 3500 0 60 ~ 0 +LCD_DB13 +Text Label 9100 3400 0 60 ~ 0 +LCD_DB14 +Text Label 9100 3300 0 60 ~ 0 +LCD_DB15 +$Comp +L KINGTECH_DW0240A2BZ_FPC J3 +U 1 1 53A91651 +P 10350 3550 +F 0 "J3" H 10350 5650 60 0000 C CNN +F 1 "KINGTECH_DW0240A2BZ_FPC" H 10350 1250 60 0000 C CNN +F 2 "molex:MOLEX_54132-40XX_LR" H 10250 3550 60 0001 C CNN +F 3 "" H 10250 3550 60 0000 C CNN +F 4 "FCI" H 10350 3550 60 0001 C CNN "Mfr" +F 5 "62684-401100ALF" H 10350 3550 60 0001 C CNN "Part" + 1 10350 3550 + 1 0 0 -1 +$EndComp +$Comp +L R R19 +U 1 1 53A91657 +P 8300 2350 +F 0 "R19" V 8380 2350 50 0000 C CNN +F 1 "47K" V 8300 2350 50 0000 C CNN +F 2 "ipc_resc:IPC_RESC1608X55N" H 8300 2350 60 0001 C CNN +F 3 "" H 8300 2350 60 0000 C CNN +F 4 "Yageo" V 8300 2350 60 0001 C CNN "Mfr" +F 5 "RC0603FR-0747KL" V 8300 2350 60 0001 C CNN "Part" + 1 8300 2350 + -1 0 0 -1 +$EndComp +$Comp +L GND #PWR036 +U 1 1 53A9165D +P 8300 2700 +F 0 "#PWR036" H 8300 2700 30 0001 C CNN +F 1 "GND" H 8300 2630 30 0001 C CNN +F 2 "" H 8300 2700 60 0000 C CNN +F 3 "" H 8300 2700 60 0000 C CNN + 1 8300 2700 + 1 0 0 -1 +$EndComp +$Comp +L +1.8V #PWR037 +U 1 1 53A91663 +P 9700 5100 +F 0 "#PWR037" H 9700 5240 20 0001 C CNN +F 1 "+1.8V" H 9700 5210 30 0000 C CNN +F 2 "" H 9700 5100 60 0000 C CNN +F 3 "" H 9700 5100 60 0000 C CNN + 1 9700 5100 + 0 -1 -1 0 +$EndComp +$Comp +L GND #PWR038 +U 1 1 53A9166C +P 9700 3000 +F 0 "#PWR038" H 9700 3000 30 0001 C CNN +F 1 "GND" H 9700 2930 30 0001 C CNN +F 2 "" H 9700 3000 60 0000 C CNN +F 3 "" H 9700 3000 60 0000 C CNN + 1 9700 3000 + 0 1 1 0 +$EndComp +Wire Wire Line + 9700 3000 9900 3000 +Wire Wire Line + 9900 5000 9800 5000 +Wire Wire Line + 9900 1800 9800 1800 +Wire Wire Line + 9700 5100 9900 5100 +Wire Wire Line + 9700 1900 9900 1900 +Wire Wire Line + 9500 4900 9900 4900 +Wire Wire Line + 9900 5200 9500 5200 +Wire Wire Line + 9500 5300 9900 5300 +Wire Wire Line + 9500 5400 9900 5400 +Wire Wire Line + 9500 5500 9900 5500 +Wire Wire Line + 9800 5700 9900 5700 +Wire Wire Line + 9000 4800 9900 4800 +Wire Wire Line + 9000 4700 9900 4700 +Wire Wire Line + 9000 4600 9900 4600 +Wire Wire Line + 9000 4500 9900 4500 +Wire Wire Line + 9000 4400 9900 4400 +Wire Wire Line + 9000 4300 9900 4300 +Wire Wire Line + 9000 4200 9900 4200 +Wire Wire Line + 9000 4100 9900 4100 +Wire Wire Line + 9600 2100 9900 2100 +Wire Wire Line + 8200 2000 9900 2000 +Wire Wire Line + 9600 2200 9900 2200 +Wire Wire Line + 9600 2500 9900 2500 +Wire Wire Line + 9700 2600 9900 2600 +Wire Wire Line + 9800 2700 9900 2700 +Wire Wire Line + 9800 2800 9900 2800 +Wire Wire Line + 9800 2900 9900 2900 +Wire Wire Line + 9800 2300 9800 3200 +Connection ~ 9800 2800 +Connection ~ 9800 2600 +Connection ~ 9800 2700 +Wire Wire Line + 9000 4000 9900 4000 +Wire Wire Line + 9000 3900 9900 3900 +Wire Wire Line + 9000 3800 9900 3800 +Wire Wire Line + 9000 3700 9900 3700 +Wire Wire Line + 9000 3600 9900 3600 +Wire Wire Line + 9000 3500 9900 3500 +Wire Wire Line + 9000 3400 9900 3400 +Wire Wire Line + 9000 3300 9900 3300 +Wire Wire Line + 8300 2000 8300 2100 +Connection ~ 8300 2000 +Wire Wire Line + 8300 2600 8300 2700 +Wire Wire Line + 9900 1600 9800 1600 +$Comp +L MICROSD_DETSW J2 +U 1 1 53A8C6D0 +P 3900 6300 +F 0 "J2" H 3450 6950 60 0000 C CNN +F 1 "MICROSD_DETSW" H 4050 6950 60 0000 C CNN +F 2 "alps:ALPS_SCHA4B0100" H 3900 6300 60 0001 C CNN +F 3 "" H 3900 6300 60 0000 C CNN +F 4 "ALPS" H 3900 6300 60 0001 C CNN "Mfr" +F 5 "SCHA4B0415" H 3900 6300 60 0001 C CNN "Part" + 1 3900 6300 + 1 0 0 -1 +$EndComp +$Comp +L GND #PWR039 +U 1 1 53A8C6D6 +P 3100 6300 +F 0 "#PWR039" H 3100 6300 30 0001 C CNN +F 1 "GND" H 3100 6230 30 0001 C CNN +F 2 "" H 3100 6300 60 0000 C CNN +F 3 "" H 3100 6300 60 0000 C CNN + 1 3100 6300 + 0 1 1 0 +$EndComp +$Comp +L GND #PWR040 +U 1 1 53A8C6E2 +P 3100 6700 +F 0 "#PWR040" H 3100 6700 30 0001 C CNN +F 1 "GND" H 3100 6630 30 0001 C CNN +F 2 "" H 3100 6700 60 0000 C CNN +F 3 "" H 3100 6700 60 0000 C CNN + 1 3100 6700 + 0 1 1 0 +$EndComp +$Comp +L C C27 +U 1 1 53AA73CE +P 2800 7100 +F 0 "C27" H 2850 7200 50 0000 L CNN +F 1 "100N" H 2850 7000 50 0000 L CNN +F 2 "ipc_capc:IPC_CAPC1005X55N" H 2800 7100 60 0001 C CNN +F 3 "" H 2800 7100 60 0000 C CNN +F 4 "Murata" H 2800 7100 60 0001 C CNN "Mfr" +F 5 "GRM155R61A104KA01" H 2800 7100 60 0001 C CNN "Part" + 1 2800 7100 + -1 0 0 -1 +$EndComp +$Comp +L GND #PWR041 +U 1 1 53A8C6EF +P 2400 7400 +F 0 "#PWR041" H 2400 7400 30 0001 C CNN +F 1 "GND" H 2400 7330 30 0001 C CNN +F 2 "" H 2400 7400 60 0000 C CNN +F 3 "" H 2400 7400 60 0000 C CNN + 1 2400 7400 + 1 0 0 -1 +$EndComp +$Comp +L GND #PWR042 +U 1 1 53A8C6F5 +P 4200 7200 +F 0 "#PWR042" H 4200 7200 30 0001 C CNN +F 1 "GND" H 4200 7130 30 0001 C CNN +F 2 "" H 4200 7200 60 0000 C CNN +F 3 "" H 4200 7200 60 0000 C CNN + 1 4200 7200 + 1 0 0 -1 +$EndComp +$Comp +L CK_TSWB-3N-CB SW1 +U 1 1 53A8C6FD +P 2500 1450 +F 0 "SW1" H 2500 2050 60 0000 C CNN +F 1 "CK_TSWB-3N-CB" H 2500 850 60 0000 C CNN +F 2 "ck:CK_TSWB-3N-CB222_LFS" H 2500 1450 60 0001 C CNN +F 3 "" H 2500 1450 60 0000 C CNN +F 4 "C&K" H 2500 1450 60 0001 C CNN "Mfr" +F 5 "TSWB-3N-CB111 LFS" H 2500 1450 60 0001 C CNN "Part" + 1 2500 1450 + 1 0 0 -1 +$EndComp +$Comp +L GND #PWR043 +U 1 1 53A8C70A +P 1400 2000 +F 0 "#PWR043" H 1400 2000 30 0001 C CNN +F 1 "GND" H 1400 1930 30 0001 C CNN +F 2 "" H 1400 2000 60 0000 C CNN +F 3 "" H 1400 2000 60 0000 C CNN + 1 1400 2000 + 1 0 0 -1 +$EndComp +$Comp +L GND #PWR044 +U 1 1 53A8C710 +P 3600 2000 +F 0 "#PWR044" H 3600 2000 30 0001 C CNN +F 1 "GND" H 3600 1930 30 0001 C CNN +F 2 "" H 3600 2000 60 0000 C CNN +F 3 "" H 3600 2000 60 0000 C CNN + 1 3600 2000 + 1 0 0 -1 +$EndComp +$Comp +L GND #PWR045 +U 1 1 53A8C716 +P 4000 7200 +F 0 "#PWR045" H 4000 7200 30 0001 C CNN +F 1 "GND" H 4000 7130 30 0001 C CNN +F 2 "" H 4000 7200 60 0000 C CNN +F 3 "" H 4000 7200 60 0000 C CNN + 1 4000 7200 + 1 0 0 -1 +$EndComp +$Comp +L C C26 +U 1 1 53A8C71C +P 2400 7100 +F 0 "C26" H 2450 7200 50 0000 L CNN +F 1 "10U" H 2450 7000 50 0000 L CNN +F 2 "ipc_capc:IPC_CAPC2012X140N" H 2400 7100 60 0001 C CNN +F 3 "" H 2400 7100 60 0000 C CNN +F 4 "Murata" H 2400 7100 60 0001 C CNN "Mfr" +F 5 "GRM21BR61A106KE19" H 2400 7100 60 0001 C CNN "Part" + 1 2400 7100 + -1 0 0 -1 +$EndComp +$Comp +L GND #PWR046 +U 1 1 53A8C722 +P 2800 7400 +F 0 "#PWR046" H 2800 7400 30 0001 C CNN +F 1 "GND" H 2800 7330 30 0001 C CNN +F 2 "" H 2800 7400 60 0000 C CNN +F 3 "" H 2800 7400 60 0000 C CNN + 1 2800 7400 + 1 0 0 -1 +$EndComp +$Comp +L +3.3V #PWR047 +U 1 1 53A8C728 +P 2800 5700 +F 0 "#PWR047" H 2800 5660 30 0001 C CNN +F 1 "+3.3V" H 2800 5810 30 0000 C CNN +F 2 "" H 2800 5700 60 0000 C CNN +F 3 "" H 2800 5700 60 0000 C CNN + 1 2800 5700 + 1 0 0 -1 +$EndComp +Wire Wire Line + 2400 6100 2400 6900 +Wire Wire Line + 2800 7300 2800 7400 +Connection ~ 2800 6100 +Wire Wire Line + 2800 5700 2800 6900 +Wire Wire Line + 2200 5800 3200 5800 +Wire Wire Line + 2200 5900 3200 5900 +Wire Wire Line + 2200 6000 3200 6000 +Wire Wire Line + 2200 6200 3200 6200 +Wire Wire Line + 2200 6400 3200 6400 +Wire Wire Line + 2200 6500 3200 6500 +Wire Wire Line + 3200 6300 3100 6300 +Wire Wire Line + 2400 6100 3200 6100 +Wire Wire Line + 2400 7300 2400 7400 +Wire Wire Line + 4200 7100 4200 7200 +Wire Wire Line + 1400 1000 1500 1000 +Wire Wire Line + 1400 1100 1500 1100 +Wire Wire Line + 1400 1200 1500 1200 +Wire Wire Line + 3500 1000 3600 1000 +Wire Wire Line + 3600 1100 3500 1100 +Wire Wire Line + 3600 1200 3500 1200 +Wire Wire Line + 3600 1300 3500 1300 +Wire Wire Line + 3500 1900 3600 1900 +Wire Wire Line + 3600 1900 3600 2000 +Wire Wire Line + 1500 1900 1400 1900 +Wire Wire Line + 1400 1900 1400 2000 +Wire Wire Line + 4000 7100 4000 7200 +$Comp +L KINGTECH_DW0240A2BZ_PANEL LCD1 +U 1 1 53A8C752 +P 8000 4600 +F 0 "LCD1" H 8000 5650 60 0000 C CNN +F 1 "KINGTECH_DW0240A2BZ_PANEL" H 8000 3650 60 0000 C CNN +F 2 "lcd_kingtech:KINGTECH_DW0240A2BZ_PANEL" H 8000 4600 60 0001 C CNN +F 3 "" H 8000 4600 60 0000 C CNN + 1 8000 4600 + 1 0 0 -1 +$EndComp +Wire Bus Line + 8800 2900 8900 2900 +Wire Bus Line + 8900 2900 8900 4700 +Entry Wire Line + 8900 3200 9000 3300 +Entry Wire Line + 8900 3300 9000 3400 +Entry Wire Line + 8900 3400 9000 3500 +Entry Wire Line + 8900 3500 9000 3600 +Entry Wire Line + 8900 3600 9000 3700 +Entry Wire Line + 8900 3700 9000 3800 +Entry Wire Line + 8900 3800 9000 3900 +Entry Wire Line + 8900 3900 9000 4000 +Entry Wire Line + 8900 4000 9000 4100 +Entry Wire Line + 8900 4100 9000 4200 +Entry Wire Line + 8900 4200 9000 4300 +Entry Wire Line + 8900 4300 9000 4400 +Entry Wire Line + 8900 4400 9000 4500 +Entry Wire Line + 8900 4500 9000 4600 +Entry Wire Line + 8900 4600 9000 4700 +Entry Wire Line + 8900 4700 9000 4800 +Text HLabel 8800 2900 0 60 BiDi ~ 0 +LCD_DB[15..0] +Text HLabel 9600 2100 0 60 Input ~ 0 +LCD_RS +Text HLabel 9600 2200 0 60 Input ~ 0 +LCD_RD# +Text HLabel 9600 2500 0 60 Input ~ 0 +LCD_WR# +Text HLabel 8200 2000 0 60 Input ~ 0 +LCD_RESET# +Text HLabel 8200 1000 0 60 Input ~ 0 +LCD_BACKLIGHT +Text HLabel 9500 4900 0 60 Output ~ 0 +LCD_TE +Text HLabel 9500 5200 0 60 BiDi ~ 0 +TP_R +Text HLabel 9500 5300 0 60 BiDi ~ 0 +TP_D +Text HLabel 9500 5400 0 60 BiDi ~ 0 +TP_L +Text HLabel 9500 5500 0 60 BiDi ~ 0 +TP_U +Text HLabel 1400 1000 0 60 Output ~ 0 +SW_SEL +Text HLabel 1400 1100 0 60 Output ~ 0 +SW_ROT_A +Text HLabel 1400 1200 0 60 Output ~ 0 +SW_ROT_B +Text HLabel 3600 1000 2 60 Output ~ 0 +SW_D +Text HLabel 3600 1100 2 60 Output ~ 0 +SW_R +Text HLabel 3600 1200 2 60 Output ~ 0 +SW_U +Text HLabel 3600 1300 2 60 Output ~ 0 +SW_L +Text HLabel 2200 5800 0 60 BiDi ~ 0 +SD_DAT2 +Text HLabel 2200 5900 0 60 BiDi ~ 0 +SD_DAT3 +Text HLabel 2200 6000 0 60 BiDi ~ 0 +SD_CMD +Text HLabel 2200 6200 0 60 Input ~ 0 +SD_CLK +Text HLabel 2200 6400 0 60 BiDi ~ 0 +SD_DAT0 +Text HLabel 2200 6500 0 60 BiDi ~ 0 +SD_DAT1 +Text HLabel 2200 6800 0 60 Output ~ 0 +SD_CD +Wire Wire Line + 9800 3100 9900 3100 +Connection ~ 9800 2900 +Wire Wire Line + 9800 3200 9900 3200 +Connection ~ 9800 3100 +Wire Wire Line + 9900 2400 9800 2400 +Wire Wire Line + 9900 2300 9800 2300 +Connection ~ 9800 2400 +Wire Wire Line + 3200 6800 2200 6800 +Wire Wire Line + 3200 6700 3100 6700 +$Comp +L MOSFET_N Q1 +U 1 1 53C5B6EB +P 8700 950 +F 0 "Q1" H 8700 801 40 0000 R CNN +F 1 "MOSFET_N" H 8700 1100 40 0000 R CNN +F 2 "ipc_sot:IPC_SOT95P230X110-3N" H 8570 1052 29 0001 C CNN +F 3 "" H 8700 950 60 0000 C CNN +F 4 "NXP" H 8700 950 60 0001 C CNN "Mfr" +F 5 "2N7002P,215" H 8700 950 60 0001 C CNN "Part" + 1 8700 950 + 1 0 0 -1 +$EndComp +$Comp +L GND #PWR048 +U 1 1 53C5B707 +P 8800 1250 +F 0 "#PWR048" H 8800 1250 30 0001 C CNN +F 1 "GND" H 8800 1180 30 0001 C CNN +F 2 "" H 8800 1250 60 0000 C CNN +F 3 "" H 8800 1250 60 0000 C CNN + 1 8800 1250 + 1 0 0 -1 +$EndComp +Wire Wire Line + 8800 1150 8800 1250 +Wire Wire Line + 9900 1700 9700 1700 +Wire Wire Line + 8200 1000 8500 1000 +Wire Wire Line + 8300 1000 8300 1100 +Connection ~ 8300 1000 +$Comp +L GND #PWR049 +U 1 1 53C5B8B4 +P 8300 1700 +F 0 "#PWR049" H 8300 1700 30 0001 C CNN +F 1 "GND" H 8300 1630 30 0001 C CNN +F 2 "" H 8300 1700 60 0000 C CNN +F 3 "" H 8300 1700 60 0000 C CNN + 1 8300 1700 + 1 0 0 -1 +$EndComp +Wire Wire Line + 8300 1600 8300 1700 +Wire Wire Line + 8800 750 8800 600 +Wire Wire Line + 8800 600 9800 600 +Wire Wire Line + 9800 600 9800 1600 +$EndSCHEMATC diff --git a/hardware/portapack_h1/portapack_h1.kicad_pcb b/hardware/portapack_h1/portapack_h1.kicad_pcb new file mode 100644 index 000000000..8830b2d21 --- /dev/null +++ b/hardware/portapack_h1/portapack_h1.kicad_pcb @@ -0,0 +1,4541 @@ +(kicad_pcb (version 4) (host pcbnew "(2015-08-20 BZR 6109)-product") + + (general + (links 291) + (no_connects 0) + (area 19.949999 22.3 274.050002 175.190501) + (thickness 1.6) + (drawings 110) + (tracks 1594) + (zones 0) + (modules 77) + (nets 140) + ) + + (page A4) + (title_block + (title "PortaPack H1") + (date 2015-08-31) + (rev 20150831) + (company "ShareBrained Technology, Inc.") + (comment 1 "License: GNU General Public License, version 2") + (comment 2 "Copyright (c) 2014, 2015 Jared Boone") + ) + + (layers + (0 1_top signal) + (1 2_pwr mixed) + (2 3_gnd mixed) + (31 4_bot signal) + (32 B.Adhes user hide) + (33 F.Adhes user hide) + (34 B.Paste user hide) + (35 F.Paste user hide) + (36 B.SilkS user) + (37 F.SilkS user) + (38 B.Mask user hide) + (39 F.Mask user hide) + (40 Dwgs.User user) + (41 Cmts.User user hide) + (42 Eco1.User user hide) + (43 Eco2.User user hide) + (44 Edge.Cuts user) + (46 B.CrtYd user hide) + (47 F.CrtYd user hide) + ) + + (setup + (last_trace_width 0.2) + (user_trace_width 0.2) + (user_trace_width 0.3) + (user_trace_width 0.4) + (trace_clearance 0.198) + (zone_clearance 0.2) + (zone_45_only yes) + (trace_min 0.2) + (segment_width 0.1524) + (edge_width 0.1) + (via_size 0.6858) + (via_drill 0.3302) + (via_min_size 0.6858) + (via_min_drill 0.3302) + (user_via 0.6858 0.3302) + (uvia_size 0.508) + (uvia_drill 0.127) + (uvias_allowed no) + (uvia_min_size 0.508) + (uvia_min_drill 0.127) + (pcb_text_width 0.3) + (pcb_text_size 1.5 1.5) + (mod_edge_width 0.1524) + (mod_text_size 0.6096 0.6096) + (mod_text_width 0.1524) + (pad_size 2.75 2.75) + (pad_drill 0) + (pad_to_mask_clearance 0.0762) + (solder_mask_min_width 0.0762) + (aux_axis_origin 60 175) + (grid_origin 60 100) + (visible_elements FFFEFFFF) + (pcbplotparams + (layerselection 0x011fc_80000007) + (usegerberextensions true) + (excludeedgelayer true) + (linewidth 0.152400) + (plotframeref false) + (viasonmask false) + (mode 1) + (useauxorigin false) + (hpglpennumber 1) + (hpglpenspeed 20) + (hpglpendiameter 15) + (hpglpenoverlay 2) + (psnegative false) + (psa4output false) + (plotreference true) + (plotvalue false) + (plotinvisibletext false) + (padsonsilk false) + (subtractmaskfromsilk true) + (outputformat 1) + (mirror false) + (drillshape 0) + (scaleselection 1) + (outputdirectory gerber/)) + ) + + (net 0 "") + (net 1 +1.8V) + (net 2 +3.3V) + (net 3 /audio/I2S0_MCLK) + (net 4 /audio/I2S0_MCLK_R) + (net 5 /audio/I2S0_RX_SDA) + (net 6 /audio/I2S0_SCK) + (net 7 /audio/I2S0_SCK_R) + (net 8 /audio/I2S0_TX_SDA) + (net 9 /audio/I2S0_TX_SDA_R) + (net 10 /audio/I2S0_WS) + (net 11 /audio/I2S0_WS_R) + (net 12 /audio/LHPOUT) + (net 13 /audio/MICBIAS) + (net 14 /audio/MICIN) + (net 15 /audio/RHPOUT) + (net 16 /audio/SCL) + (net 17 /audio/SDA) + (net 18 /audio/VMID) + (net 19 /hackrf_if/LCD_BACKLIGHT) + (net 20 /hackrf_if/LCD_DB0) + (net 21 /hackrf_if/LCD_DB1) + (net 22 /hackrf_if/LCD_DB10) + (net 23 /hackrf_if/LCD_DB11) + (net 24 /hackrf_if/LCD_DB12) + (net 25 /hackrf_if/LCD_DB13) + (net 26 /hackrf_if/LCD_DB14) + (net 27 /hackrf_if/LCD_DB15) + (net 28 /hackrf_if/LCD_DB2) + (net 29 /hackrf_if/LCD_DB3) + (net 30 /hackrf_if/LCD_DB4) + (net 31 /hackrf_if/LCD_DB5) + (net 32 /hackrf_if/LCD_DB6) + (net 33 /hackrf_if/LCD_DB7) + (net 34 /hackrf_if/LCD_DB8) + (net 35 /hackrf_if/LCD_DB9) + (net 36 /hackrf_if/LCD_RD#) + (net 37 /hackrf_if/LCD_RESET#) + (net 38 /hackrf_if/LCD_RS) + (net 39 /hackrf_if/LCD_TE) + (net 40 /hackrf_if/LCD_WR#) + (net 41 /hackrf_if/P2_8) + (net 42 /hackrf_if/P2_8_R) + (net 43 /hackrf_if/RESET#) + (net 44 /hackrf_if/SD_CD) + (net 45 /hackrf_if/SD_CLK) + (net 46 /hackrf_if/SD_CMD) + (net 47 /hackrf_if/SD_DAT0) + (net 48 /hackrf_if/SD_DAT1) + (net 49 /hackrf_if/SD_DAT2) + (net 50 /hackrf_if/SD_DAT3) + (net 51 /hackrf_if/SW_D) + (net 52 /hackrf_if/SW_L) + (net 53 /hackrf_if/SW_R) + (net 54 /hackrf_if/SW_ROT_A) + (net 55 /hackrf_if/SW_ROT_B) + (net 56 /hackrf_if/SW_SEL) + (net 57 /hackrf_if/SW_U) + (net 58 /hackrf_if/TP_D) + (net 59 /hackrf_if/TP_L) + (net 60 /hackrf_if/TP_R) + (net 61 /hackrf_if/TP_U) + (net 62 /hackrf_if/VBAT) + (net 63 GND) + (net 64 "Net-(C18-Pad2)") + (net 65 "Net-(C19-Pad2)") + (net 66 "Net-(C24-Pad1)") + (net 67 "Net-(C24-Pad2)") + (net 68 "Net-(C39-Pad1)") + (net 69 "Net-(J3-Pad1)") + (net 70 "Net-(L4-Pad1)") + (net 71 "Net-(L5-Pad1)") + (net 72 "Net-(L6-Pad1)") + (net 73 "Net-(L9-Pad1)") + (net 74 "Net-(P2-Pad5)") + (net 75 "Net-(P2-Pad6)") + (net 76 "Net-(P20-Pad2)") + (net 77 "Net-(P20-Pad4)") + (net 78 /hackrf_if/MCU_D1) + (net 79 /hackrf_if/MCU_D0) + (net 80 /hackrf_if/MCU_D3) + (net 81 /hackrf_if/MCU_D2) + (net 82 /hackrf_if/MCU_D5) + (net 83 /hackrf_if/MCU_D4) + (net 84 /hackrf_if/MCU_D7) + (net 85 /hackrf_if/MCU_D6) + (net 86 "Net-(P20-Pad17)") + (net 87 "Net-(P20-Pad22)") + (net 88 "Net-(P20-Pad21)") + (net 89 "Net-(P22-Pad2)") + (net 90 "Net-(P22-Pad1)") + (net 91 /hackrf_if/MCU_LCD_TE) + (net 92 /hackrf_if/MCU_LCD_RD) + (net 93 "Net-(P22-Pad8)") + (net 94 "Net-(P22-Pad7)") + (net 95 "Net-(P22-Pad9)") + (net 96 "Net-(P22-Pad12)") + (net 97 "Net-(P22-Pad14)") + (net 98 /hackrf_if/MCU_IO_STBX) + (net 99 /hackrf_if/MCU_ADDR) + (net 100 /hackrf_if/MCU_DIR) + (net 101 /hackrf_if/MCU_LCD_WR) + (net 102 "Net-(P22-Pad25)") + (net 103 /hackrf_if/PP_CPLD_TMS) + (net 104 /hackrf_if/PP_CPLD_TDO) + (net 105 "Net-(P28-Pad14)") + (net 106 "Net-(P28-Pad13)") + (net 107 "Net-(P28-Pad16)") + (net 108 "Net-(P28-Pad15)") + (net 109 "Net-(P28-Pad18)") + (net 110 /hackrf_if/H1_CPLD_TCK) + (net 111 "Net-(P28-Pad20)") + (net 112 /hackrf_if/H1_CPLD_TDI) + (net 113 "Net-(P28-Pad22)") + (net 114 "Net-(P28-Pad21)") + (net 115 /hackrf_if/MCU_LCD_RD_R) + (net 116 /hackrf_if/MCU_LCD_TE_R) + (net 117 /hackrf_if/MCU_IO_STBX_R) + (net 118 /hackrf_if/MCU_DIR_R) + (net 119 /hackrf_if/MCU_LCD_WR_R) + (net 120 /hackrf_if/MCU_ADDR_R) + (net 121 /hackrf_if/MCU_D5_R) + (net 122 /hackrf_if/MCU_D4_R) + (net 123 /hackrf_if/MCU_D6_R) + (net 124 /hackrf_if/MCU_D7_R) + (net 125 /hackrf_if/MCU_D1_R) + (net 126 /hackrf_if/MCU_D0_R) + (net 127 /hackrf_if/MCU_D2_R) + (net 128 /hackrf_if/MCU_D3_R) + (net 129 "Net-(U1-Pad2)") + (net 130 "Net-(U1-Pad12)") + (net 131 "Net-(U1-Pad13)") + (net 132 "Net-(U1-Pad19)") + (net 133 "Net-(U1-Pad20)") + (net 134 "Net-(U1-Pad26)") + (net 135 "Net-(U3-Pad5)") + (net 136 "Net-(U3-Pad7)") + (net 137 "Net-(U3-Pad35)") + (net 138 "Net-(U3-Pad36)") + (net 139 "Net-(U3-Pad37)") + + (net_class Default "This is the default net class." + (clearance 0.198) + (trace_width 0.2) + (via_dia 0.6858) + (via_drill 0.3302) + (uvia_dia 0.508) + (uvia_drill 0.127) + (add_net +1.8V) + (add_net +3.3V) + (add_net /audio/I2S0_MCLK) + (add_net /audio/I2S0_MCLK_R) + (add_net /audio/I2S0_RX_SDA) + (add_net /audio/I2S0_SCK) + (add_net /audio/I2S0_SCK_R) + (add_net /audio/I2S0_TX_SDA) + (add_net /audio/I2S0_TX_SDA_R) + (add_net /audio/I2S0_WS) + (add_net /audio/I2S0_WS_R) + (add_net /audio/LHPOUT) + (add_net /audio/MICBIAS) + (add_net /audio/MICIN) + (add_net /audio/RHPOUT) + (add_net /audio/SCL) + (add_net /audio/SDA) + (add_net /audio/VMID) + (add_net /hackrf_if/H1_CPLD_TCK) + (add_net /hackrf_if/H1_CPLD_TDI) + (add_net /hackrf_if/LCD_BACKLIGHT) + (add_net /hackrf_if/LCD_DB0) + (add_net /hackrf_if/LCD_DB1) + (add_net /hackrf_if/LCD_DB10) + (add_net /hackrf_if/LCD_DB11) + (add_net /hackrf_if/LCD_DB12) + (add_net /hackrf_if/LCD_DB13) + (add_net /hackrf_if/LCD_DB14) + (add_net /hackrf_if/LCD_DB15) + (add_net /hackrf_if/LCD_DB2) + (add_net /hackrf_if/LCD_DB3) + (add_net /hackrf_if/LCD_DB4) + (add_net /hackrf_if/LCD_DB5) + (add_net /hackrf_if/LCD_DB6) + (add_net /hackrf_if/LCD_DB7) + (add_net /hackrf_if/LCD_DB8) + (add_net /hackrf_if/LCD_DB9) + (add_net /hackrf_if/LCD_RD#) + (add_net /hackrf_if/LCD_RESET#) + (add_net /hackrf_if/LCD_RS) + (add_net /hackrf_if/LCD_TE) + (add_net /hackrf_if/LCD_WR#) + (add_net /hackrf_if/MCU_ADDR) + (add_net /hackrf_if/MCU_ADDR_R) + (add_net /hackrf_if/MCU_D0) + (add_net /hackrf_if/MCU_D0_R) + (add_net /hackrf_if/MCU_D1) + (add_net /hackrf_if/MCU_D1_R) + (add_net /hackrf_if/MCU_D2) + (add_net /hackrf_if/MCU_D2_R) + (add_net /hackrf_if/MCU_D3) + (add_net /hackrf_if/MCU_D3_R) + (add_net /hackrf_if/MCU_D4) + (add_net /hackrf_if/MCU_D4_R) + (add_net /hackrf_if/MCU_D5) + (add_net /hackrf_if/MCU_D5_R) + (add_net /hackrf_if/MCU_D6) + (add_net /hackrf_if/MCU_D6_R) + (add_net /hackrf_if/MCU_D7) + (add_net /hackrf_if/MCU_D7_R) + (add_net /hackrf_if/MCU_DIR) + (add_net /hackrf_if/MCU_DIR_R) + (add_net /hackrf_if/MCU_IO_STBX) + (add_net /hackrf_if/MCU_IO_STBX_R) + (add_net /hackrf_if/MCU_LCD_RD) + (add_net /hackrf_if/MCU_LCD_RD_R) + (add_net /hackrf_if/MCU_LCD_TE) + (add_net /hackrf_if/MCU_LCD_TE_R) + (add_net /hackrf_if/MCU_LCD_WR) + (add_net /hackrf_if/MCU_LCD_WR_R) + (add_net /hackrf_if/P2_8) + (add_net /hackrf_if/P2_8_R) + (add_net /hackrf_if/PP_CPLD_TDO) + (add_net /hackrf_if/PP_CPLD_TMS) + (add_net /hackrf_if/RESET#) + (add_net /hackrf_if/SD_CD) + (add_net /hackrf_if/SD_CLK) + (add_net /hackrf_if/SD_CMD) + (add_net /hackrf_if/SD_DAT0) + (add_net /hackrf_if/SD_DAT1) + (add_net /hackrf_if/SD_DAT2) + (add_net /hackrf_if/SD_DAT3) + (add_net /hackrf_if/SW_D) + (add_net /hackrf_if/SW_L) + (add_net /hackrf_if/SW_R) + (add_net /hackrf_if/SW_ROT_A) + (add_net /hackrf_if/SW_ROT_B) + (add_net /hackrf_if/SW_SEL) + (add_net /hackrf_if/SW_U) + (add_net /hackrf_if/TP_D) + (add_net /hackrf_if/TP_L) + (add_net /hackrf_if/TP_R) + (add_net /hackrf_if/TP_U) + (add_net /hackrf_if/VBAT) + (add_net GND) + (add_net "Net-(C18-Pad2)") + (add_net "Net-(C19-Pad2)") + (add_net "Net-(C24-Pad1)") + (add_net "Net-(C24-Pad2)") + (add_net "Net-(C39-Pad1)") + (add_net "Net-(J3-Pad1)") + (add_net "Net-(L4-Pad1)") + (add_net "Net-(L5-Pad1)") + (add_net "Net-(L6-Pad1)") + (add_net "Net-(L9-Pad1)") + (add_net "Net-(P2-Pad5)") + (add_net "Net-(P2-Pad6)") + (add_net "Net-(P20-Pad17)") + (add_net "Net-(P20-Pad2)") + (add_net "Net-(P20-Pad21)") + (add_net "Net-(P20-Pad22)") + (add_net "Net-(P20-Pad4)") + (add_net "Net-(P22-Pad1)") + (add_net "Net-(P22-Pad12)") + (add_net "Net-(P22-Pad14)") + (add_net "Net-(P22-Pad2)") + (add_net "Net-(P22-Pad25)") + (add_net "Net-(P22-Pad7)") + (add_net "Net-(P22-Pad8)") + (add_net "Net-(P22-Pad9)") + (add_net "Net-(P28-Pad13)") + (add_net "Net-(P28-Pad14)") + (add_net "Net-(P28-Pad15)") + (add_net "Net-(P28-Pad16)") + (add_net "Net-(P28-Pad18)") + (add_net "Net-(P28-Pad20)") + (add_net "Net-(P28-Pad21)") + (add_net "Net-(P28-Pad22)") + (add_net "Net-(U1-Pad12)") + (add_net "Net-(U1-Pad13)") + (add_net "Net-(U1-Pad19)") + (add_net "Net-(U1-Pad2)") + (add_net "Net-(U1-Pad20)") + (add_net "Net-(U1-Pad26)") + (add_net "Net-(U3-Pad35)") + (add_net "Net-(U3-Pad36)") + (add_net "Net-(U3-Pad37)") + (add_net "Net-(U3-Pad5)") + (add_net "Net-(U3-Pad7)") + ) + + (module bat_coin:MPD_BU2032SM-BT-G locked (layer 4_bot) (tedit 53B09B28) (tstamp 53AA25F0) + (at 97 160 180) + (path /53A8C780/53A8D535) + (attr smd) + (fp_text reference BT1 (at -12.6 4.2 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value BATTERY (at 0 0 180) (layer B.SilkS) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_line (start -12 -5) (end -11 -5) (layer B.SilkS) (width 0.1524)) + (fp_line (start -11.5 -4.5) (end -11.5 -5.5) (layer B.SilkS) (width 0.1524)) + (fp_circle (center 0 0) (end 10 0) (layer Cmts.User) (width 0.1524)) + (fp_arc (start 0 0) (end -7.838 -8) (angle -91.2) (layer B.SilkS) (width 0.1524)) + (fp_arc (start 0 0) (end 7.838 8) (angle -91.2) (layer B.SilkS) (width 0.1524)) + (fp_line (start -7.838 -8) (end 7.838 -8) (layer B.SilkS) (width 0.1524)) + (fp_line (start -7.838 8) (end 7.838 8) (layer B.SilkS) (width 0.1524)) + (fp_line (start 10.639 3.5) (end 14.3 3.5) (layer B.SilkS) (width 0.1524)) + (fp_line (start 14.3 3.5) (end 14.3 -3.5) (layer B.SilkS) (width 0.1524)) + (fp_line (start 14.3 -3.5) (end 10.639 -3.5) (layer B.SilkS) (width 0.1524)) + (fp_line (start -10.639 3.5) (end -14.3 3.5) (layer B.SilkS) (width 0.1524)) + (fp_line (start -14.3 3.5) (end -14.3 -3.5) (layer B.SilkS) (width 0.1524)) + (fp_line (start -14.3 -3.5) (end -10.639 -3.5) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -14.65 0 180) (size 3.2 4.2) (layers 4_bot B.Paste B.Mask) + (net 62 /hackrf_if/VBAT)) + (pad 2 smd rect (at 14.65 0 180) (size 3.2 4.2) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC1005X55N (layer 4_bot) (tedit 53B0991D) (tstamp 53AA2604) + (at 142 119.8 180) + (path /53A8BFC3/53A8C6A5) + (attr smd) + (fp_text reference C2 (at 0.2 -1.2 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 100N (at 0 0 180) (layer B.SilkS) hide + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start 0.90932 0.45974) (end 0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start 0.90932 -0.45974) (end -0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 -0.45974) (end -0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 0.45974) (end 0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.44958 0 180) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 2 smd rect (at 0.44958 0 180) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC1005X55N (layer 4_bot) (tedit 53BC270F) (tstamp 53AA260E) + (at 136.6 119.8 180) + (path /53A8BFC3/53A8C69F) + (attr smd) + (fp_text reference C3 (at 5.1 -0.7 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 100N (at 0 0 180) (layer B.SilkS) hide + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start 0.90932 0.45974) (end 0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start 0.90932 -0.45974) (end -0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 -0.45974) (end -0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 0.45974) (end 0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.44958 0 180) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 2 smd rect (at 0.44958 0 180) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC1005X55N (layer 4_bot) (tedit 53BC2708) (tstamp 53AA2618) + (at 133.6 119.8) + (path /53A8BFC3/53A8C6B1) + (attr smd) + (fp_text reference C4 (at -3.9 0.7) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 100N (at 0 0) (layer B.SilkS) hide + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start 0.90932 0.45974) (end 0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start 0.90932 -0.45974) (end -0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 -0.45974) (end -0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 0.45974) (end 0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.44958 0) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 2 smd rect (at 0.44958 0) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC1005X55N (layer 4_bot) (tedit 53B09A42) (tstamp 53AA2622) + (at 142 108.2) + (path /53A8BFC3/53A8C6AB) + (attr smd) + (fp_text reference C5 (at -11.8 0.6) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 100N (at 0 0) (layer B.SilkS) hide + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start 0.90932 0.45974) (end 0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start 0.90932 -0.45974) (end -0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 -0.45974) (end -0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 0.45974) (end 0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.44958 0) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 2 smd rect (at 0.44958 0) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC1005X55N (layer 4_bot) (tedit 53B09A37) (tstamp 53B0A490) + (at 133.2 108.6 180) + (path /53A8BFC3/53A8C687) + (attr smd) + (fp_text reference C6 (at 8.6 -0.4 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 100N (at 0 0 180) (layer B.SilkS) hide + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start 0.90932 0.45974) (end 0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start 0.90932 -0.45974) (end -0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 -0.45974) (end -0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 0.45974) (end 0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.44958 0 180) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 18 /audio/VMID)) + (pad 2 smd rect (at 0.44958 0 180) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC1005X55N (layer 4_bot) (tedit 53B09A3C) (tstamp 53B0A4A6) + (at 135.4 108.2) + (path /53A8BFC3/53A8C68D) + (attr smd) + (fp_text reference C10 (at -9.2 0.6) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 100N (at 0 0) (layer B.SilkS) hide + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start 0.90932 0.45974) (end 0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start 0.90932 -0.45974) (end -0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 -0.45974) (end -0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 0.45974) (end 0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.44958 0) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 13 /audio/MICBIAS)) + (pad 2 smd rect (at 0.44958 0) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capae:IPC_CAPAE830X620N (layer 4_bot) (tedit 55E24037) (tstamp 53AA43B4) + (at 154.2 120) + (tags "CASE E") + (path /53A8BFC3/53A8C256) + (fp_text reference C18 (at -4.4 -4) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 220U (at 0 0) (layer B.SilkS) + (effects (font (thickness 0.3048)) (justify mirror)) + ) + (fp_line (start -4.2 2.4) (end -4.2 -2.4) (layer B.SilkS) (width 0.1524)) + (fp_line (start 4.2 4.2) (end -2.4 4.2) (layer B.SilkS) (width 0.1524)) + (fp_line (start -2.4 -4.2) (end 4.2 -4.2) (layer B.SilkS) (width 0.1524)) + (fp_line (start -4.2 -2.4) (end -2.4 -4.2) (layer B.SilkS) (width 0.1524)) + (fp_line (start -4.2 2.4) (end -2.4 4.2) (layer B.SilkS) (width 0.1524)) + (fp_line (start 4.2 -4.2) (end 4.2 4.2) (layer B.SilkS) (width 0.1524)) + (fp_circle (center 0 0) (end 4 0) (layer B.SilkS) (width 0.1524)) + (fp_line (start -5.725 4.75) (end 5.725 4.75) (layer B.CrtYd) (width 0.1524)) + (fp_line (start 5.725 4.75) (end 5.725 -4.75) (layer B.CrtYd) (width 0.1524)) + (fp_line (start 5.725 -4.75) (end -5.725 -4.75) (layer B.CrtYd) (width 0.1524)) + (fp_line (start -5.725 -4.75) (end -5.725 4.75) (layer B.CrtYd) (width 0.1524)) + (pad 1 smd rect (at -3.15 0) (size 4.15 1.6) (layers 4_bot B.Paste B.Mask) + (net 12 /audio/LHPOUT)) + (pad 2 smd rect (at 3.15 0) (size 4.15 1.6) (layers 4_bot B.Paste B.Mask) + (net 64 "Net-(C18-Pad2)")) + ) + + (module ipc_capae:IPC_CAPAE830X620N (layer 4_bot) (tedit 55E24037) (tstamp 53AA26CA) + (at 154.2 110) + (tags "CASE E") + (path /53A8BFC3/53A8C25E) + (fp_text reference C19 (at -4.4 4) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 220U (at 0 0) (layer B.SilkS) + (effects (font (thickness 0.3048)) (justify mirror)) + ) + (fp_line (start -4.2 2.4) (end -4.2 -2.4) (layer B.SilkS) (width 0.1524)) + (fp_line (start 4.2 4.2) (end -2.4 4.2) (layer B.SilkS) (width 0.1524)) + (fp_line (start -2.4 -4.2) (end 4.2 -4.2) (layer B.SilkS) (width 0.1524)) + (fp_line (start -4.2 -2.4) (end -2.4 -4.2) (layer B.SilkS) (width 0.1524)) + (fp_line (start -4.2 2.4) (end -2.4 4.2) (layer B.SilkS) (width 0.1524)) + (fp_line (start 4.2 -4.2) (end 4.2 4.2) (layer B.SilkS) (width 0.1524)) + (fp_circle (center 0 0) (end 4 0) (layer B.SilkS) (width 0.1524)) + (fp_line (start -5.725 4.75) (end 5.725 4.75) (layer B.CrtYd) (width 0.1524)) + (fp_line (start 5.725 4.75) (end 5.725 -4.75) (layer B.CrtYd) (width 0.1524)) + (fp_line (start 5.725 -4.75) (end -5.725 -4.75) (layer B.CrtYd) (width 0.1524)) + (fp_line (start -5.725 -4.75) (end -5.725 4.75) (layer B.CrtYd) (width 0.1524)) + (pad 1 smd rect (at -3.15 0) (size 4.15 1.6) (layers 4_bot B.Paste B.Mask) + (net 15 /audio/RHPOUT)) + (pad 2 smd rect (at 3.15 0) (size 4.15 1.6) (layers 4_bot B.Paste B.Mask) + (net 65 "Net-(C19-Pad2)")) + ) + + (module ipc_capc:IPC_CAPC1608X95N (layer 4_bot) (tedit 53B09A86) (tstamp 53AA26F6) + (at 162.8 120.8 90) + (tags "1608 metric, 0603 imperial") + (path /53A8BFC3/53A8C27E) + (attr smd) + (fp_text reference C22 (at -3.2 0 90) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 220P (at 0 0 90) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start -1.524 0.7493) (end 1.524 0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.524 0.7493) (end 1.524 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.524 -0.7493) (end -1.524 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.524 -0.7493) (end -1.524 0.7493) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.8001 0 90) (size 0.94996 1.00076) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 2 smd rect (at 0.8001 0 90) (size 0.94996 1.00076) (layers 4_bot B.Paste B.Mask) + (net 64 "Net-(C18-Pad2)")) + ) + + (module ipc_capc:IPC_CAPC1608X95N (layer 4_bot) (tedit 53B09A77) (tstamp 53AA2700) + (at 162.8 109.2 90) + (tags "1608 metric, 0603 imperial") + (path /53A8BFC3/53A8C284) + (attr smd) + (fp_text reference C23 (at 3.2 0 90) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 220P (at 0 0 90) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start -1.524 0.7493) (end 1.524 0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.524 0.7493) (end 1.524 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.524 -0.7493) (end -1.524 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.524 -0.7493) (end -1.524 0.7493) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.8001 0 90) (size 0.94996 1.00076) (layers 4_bot B.Paste B.Mask) + (net 65 "Net-(C19-Pad2)")) + (pad 2 smd rect (at 0.8001 0 90) (size 0.94996 1.00076) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capae:IPC_CAPAE430X540N (layer 4_bot) (tedit 55E23F71) (tstamp 53ADFB14) + (at 141.8 104.4 180) + (tags "CASE B") + (path /53A8BFC3/53A8C2AA) + (fp_text reference C24 (at -2.6 2.2 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 1U (at 0 0 180) (layer B.SilkS) + (effects (font (thickness 0.3048)) (justify mirror)) + ) + (fp_line (start 3.525 -2.75) (end -3.525 -2.75) (layer B.CrtYd) (width 0.1524)) + (fp_line (start -3.525 -2.75) (end -3.525 2.75) (layer B.CrtYd) (width 0.1524)) + (fp_line (start -3.525 2.75) (end 3.525 2.75) (layer B.CrtYd) (width 0.1524)) + (fp_line (start 3.525 2.75) (end 3.525 -2.75) (layer B.CrtYd) (width 0.1524)) + (fp_line (start 2.15 2.15) (end -1.25 2.15) (layer B.SilkS) (width 0.1524)) + (fp_line (start -2.15 -1.25) (end -2.15 1.25) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.25 -2.15) (end 2.15 -2.15) (layer B.SilkS) (width 0.1524)) + (fp_line (start -2.15 -1.25) (end -1.25 -2.15) (layer B.SilkS) (width 0.1524)) + (fp_line (start -2.15 1.25) (end -1.25 2.15) (layer B.SilkS) (width 0.1524)) + (fp_circle (center 0 0) (end 2 0) (layer B.SilkS) (width 0.1524)) + (fp_line (start 2.15 2.15) (end 2.15 -2.15) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -1.75 0 180) (size 2.55 1.6) (layers 4_bot B.Paste B.Mask) + (net 66 "Net-(C24-Pad1)")) + (pad 2 smd rect (at 1.75 0 180) (size 2.55 1.6) (layers 4_bot B.Paste B.Mask) + (net 67 "Net-(C24-Pad2)")) + ) + + (module ipc_capc:IPC_CAPC1608X95N (layer 4_bot) (tedit 53B09AB4) (tstamp 53AA271B) + (at 170.8 122.2 180) + (tags "1608 metric, 0603 imperial") + (path /53A8BFC3/53A8C2A2) + (attr smd) + (fp_text reference C25 (at -0.8 1.4 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 220P (at 0 0 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start -1.524 0.7493) (end 1.524 0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.524 0.7493) (end 1.524 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.524 -0.7493) (end -1.524 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.524 -0.7493) (end -1.524 0.7493) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.8001 0 180) (size 0.94996 1.00076) (layers 4_bot B.Paste B.Mask) + (net 67 "Net-(C24-Pad2)")) + (pad 2 smd rect (at 0.8001 0 180) (size 0.94996 1.00076) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC1005X55N (layer 4_bot) (tedit 53B0979B) (tstamp 53AA272F) + (at 72.2 122.8) + (path /53A9129D/53AA73CE) + (attr smd) + (fp_text reference C27 (at -1 1.8) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 100N (at 0 0) (layer B.SilkS) hide + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start 0.90932 0.45974) (end 0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start 0.90932 -0.45974) (end -0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 -0.45974) (end -0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 0.45974) (end 0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.44958 0) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 2 smd rect (at 0.44958 0) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC1005X55N (layer 4_bot) (tedit 53C5B500) (tstamp 53AA2739) + (at 96 125.2 90) + (path /53A8C780/53A8D527) + (attr smd) + (fp_text reference C28 (at 0.8 -1.2 90) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 100N (at 0 0 90) (layer B.SilkS) hide + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start 0.90932 0.45974) (end 0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start 0.90932 -0.45974) (end -0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 -0.45974) (end -0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 0.45974) (end 0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.44958 0 90) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 2 smd rect (at 0.44958 0 90) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC1005X55N (layer 4_bot) (tedit 53B097F7) (tstamp 53AB74CF) + (at 97.2 125.2 90) + (path /53A8C780/53A8D548) + (attr smd) + (fp_text reference C29 (at 0 1.8 90) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 100N (at 0 0 90) (layer B.SilkS) hide + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start 0.90932 0.45974) (end 0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start 0.90932 -0.45974) (end -0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 -0.45974) (end -0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 0.45974) (end 0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.44958 0 90) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 1 +1.8V)) + (pad 2 smd rect (at 0.44958 0 90) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC1005X55N (layer 4_bot) (tedit 53B09B39) (tstamp 53AA274D) + (at 106 132.2) + (path /53A8C780/53A8D542) + (attr smd) + (fp_text reference C30 (at 0 -1.2) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 100N (at 0 0) (layer B.SilkS) hide + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start 0.90932 0.45974) (end 0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start 0.90932 -0.45974) (end -0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 -0.45974) (end -0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 0.45974) (end 0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.44958 0) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 2 smd rect (at 0.44958 0) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC1005X55N (layer 4_bot) (tedit 53B09B82) (tstamp 53AA2757) + (at 98.6 141.2 270) + (path /53A8C780/53A8D54E) + (attr smd) + (fp_text reference C31 (at -1.8 -1.2 270) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 100N (at 0 0 270) (layer B.SilkS) hide + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start 0.90932 0.45974) (end 0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start 0.90932 -0.45974) (end -0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 -0.45974) (end -0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 0.45974) (end 0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.44958 0 270) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 1 +1.8V)) + (pad 2 smd rect (at 0.44958 0 270) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC1005X55N (layer 4_bot) (tedit 53B09B7D) (tstamp 53AA276B) + (at 97 141.2 270) + (path /53A8C780/53A8D56C) + (attr smd) + (fp_text reference C33 (at -1.8 1.2 270) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 100N (at 0 0 270) (layer B.SilkS) hide + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start 0.90932 0.45974) (end 0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start 0.90932 -0.45974) (end -0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 -0.45974) (end -0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 0.45974) (end 0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.44958 0 270) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 1 +1.8V)) + (pad 2 smd rect (at 0.44958 0 270) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC1005X55N (layer 4_bot) (tedit 53B097B0) (tstamp 53B30722) + (at 89.5 132.6 180) + (path /53A8C780/53A8D572) + (attr smd) + (fp_text reference C35 (at 0 1.2 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 100N (at 0 0 180) (layer B.SilkS) hide + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start 0.90932 0.45974) (end 0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start 0.90932 -0.45974) (end -0.90932 -0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 -0.45974) (end -0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.90932 0.45974) (end 0.90932 0.45974) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.44958 0 180) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 1 +1.8V)) + (pad 2 smd rect (at 0.44958 0 180) (size 0.61976 0.61976) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC1608X90N (layer 4_bot) (tedit 53B09B4A) (tstamp 53AA27A7) + (at 97.4 150.6) + (path /53A8C780/53A8D5AA) + (attr smd) + (fp_text reference C39 (at 2.8 0.8) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value DNI (at 0 0) (layer B.SilkS) + (effects (font (thickness 0.3048)) (justify mirror)) + ) + (fp_line (start -1.524 0.7493) (end 1.524 0.7493) (layer B.SilkS) (width 0.2032)) + (fp_line (start 1.524 0.7493) (end 1.524 -0.7493) (layer B.SilkS) (width 0.2032)) + (fp_line (start 1.524 -0.7493) (end -1.524 -0.7493) (layer B.SilkS) (width 0.2032)) + (fp_line (start -1.524 -0.7493) (end -1.524 0.7493) (layer B.SilkS) (width 0.2032)) + (pad 1 smd rect (at -0.8001 0) (size 0.94996 1.00076) (layers 4_bot B.Paste B.Mask) + (net 68 "Net-(C39-Pad1)")) + (pad 2 smd rect (at 0.8001 0) (size 0.94996 1.00076) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module hole:HOLE_3200UM_VIAS (layer 1_top) (tedit 53AA3E1E) (tstamp 53AA27C8) + (at 126 104) + (path /5369BBC4) + (fp_text reference H1 (at 0 0) (layer F.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524))) + ) + (fp_text value HOLE1 (at 0 0) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.1524))) + ) + (pad 1 thru_hole circle (at 0 0) (size 5.6 5.6) (drill 3.2) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at 0 -2.2) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at -2.2 0) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at 0 2.2) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at 2.2 0) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at 1.55 -1.55) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at -1.55 -1.55) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at -1.55 1.55) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at 1.55 1.55) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + ) + + (module hole:HOLE_3200UM_VIAS (layer 1_top) (tedit 53AA3E1E) (tstamp 53AA27D5) + (at 176 104) + (path /5369BBD8) + (fp_text reference H2 (at 0 0) (layer F.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524))) + ) + (fp_text value HOLE1 (at 0 0) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.1524))) + ) + (pad 1 thru_hole circle (at 0 0) (size 5.6 5.6) (drill 3.2) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at 0 -2.2) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at -2.2 0) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at 0 2.2) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at 2.2 0) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at 1.55 -1.55) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at -1.55 -1.55) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at -1.55 1.55) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at 1.55 1.55) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + ) + + (module hole:HOLE_3200UM_VIAS (layer 1_top) (tedit 53AA3E1E) (tstamp 53AA27E2) + (at 176 171) + (path /5369BBEC) + (fp_text reference H3 (at 0 0) (layer F.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524))) + ) + (fp_text value HOLE1 (at 0 0) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.1524))) + ) + (pad 1 thru_hole circle (at 0 0) (size 5.6 5.6) (drill 3.2) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at 0 -2.2) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at -2.2 0) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at 0 2.2) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at 2.2 0) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at 1.55 -1.55) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at -1.55 -1.55) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at -1.55 1.55) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at 1.55 1.55) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + ) + + (module hole:HOLE_3200UM_VIAS (layer 1_top) (tedit 53AA3E1E) (tstamp 53AA27EF) + (at 64 171) + (path /5369BC00) + (fp_text reference H4 (at 0 0) (layer F.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524))) + ) + (fp_text value HOLE1 (at 0 0) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.1524))) + ) + (pad 1 thru_hole circle (at 0 0) (size 5.6 5.6) (drill 3.2) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at 0 -2.2) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at -2.2 0) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at 0 2.2) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at 2.2 0) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at 1.55 -1.55) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at -1.55 -1.55) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at -1.55 1.55) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at 1.55 1.55) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + ) + + (module hole:HOLE_3200UM_VIAS (layer 1_top) (tedit 53AA3E1E) (tstamp 53AA27FC) + (at 64 104) + (path /5369BC14) + (fp_text reference H5 (at 0 0) (layer F.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524))) + ) + (fp_text value HOLE1 (at 0 0) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.1524))) + ) + (pad 1 thru_hole circle (at 0 0) (size 5.6 5.6) (drill 3.2) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at 0 -2.2) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at -2.2 0) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at 0 2.2) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at 2.2 0) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at 1.55 -1.55) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at -1.55 -1.55) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at -1.55 1.55) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + (pad 1 thru_hole circle (at 1.55 1.55) (size 0.6 0.6) (drill 0.381) (layers *.Cu *.Mask) + (net 63 GND)) + ) + + (module molex:MOLEX_54132-40XX_LR locked (layer 4_bot) (tedit 53B09BB0) (tstamp 53AA2868) + (at 82.5 137.5 90) + (path /53A9129D/53A91651) + (solder_mask_margin 0.0492) + (attr smd) + (fp_text reference J3 (at -13.1 2.1 90) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value KINGTECH_DW0240A2BZ_FPC (at 0 0 90) (layer B.SilkS) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_line (start -10.25 1.1) (end -10.25 -2.5) (layer Eco1.User) (width 0.1524)) + (fp_line (start 10.25 -2.5) (end 10.25 1.1) (layer Eco1.User) (width 0.1524)) + (fp_line (start -10.25 1.1) (end 10.25 1.1) (layer Eco1.User) (width 0.1524)) + (fp_line (start 12.15 -3.2) (end 12.15 -2.5) (layer Eco1.User) (width 0.1524)) + (fp_line (start -12.15 -3.2) (end -12.15 -2.5) (layer Eco1.User) (width 0.1524)) + (fp_line (start -12.75 -2.5) (end 12.75 -2.5) (layer B.SilkS) (width 0.1524)) + (fp_line (start -12.75 -2.5) (end -12.75 -1.5) (layer B.SilkS) (width 0.1524)) + (fp_line (start -12.75 -1.5) (end -12.15 -1.5) (layer B.SilkS) (width 0.1524)) + (fp_line (start -12.15 -1.5) (end -12.15 2.5) (layer B.SilkS) (width 0.1524)) + (fp_line (start 12.75 -2.5) (end 12.75 -1.5) (layer B.SilkS) (width 0.1524)) + (fp_line (start 12.75 -1.5) (end 12.15 -1.5) (layer B.SilkS) (width 0.1524)) + (fp_line (start 12.15 -1.5) (end 12.15 2.5) (layer B.SilkS) (width 0.1524)) + (fp_line (start 12.75 -4.2) (end 12.75 -3.2) (layer Eco1.User) (width 0.1524)) + (fp_line (start -12.75 -4.2) (end -12.75 -3.2) (layer Eco1.User) (width 0.1524)) + (fp_line (start -12.15 -4.2) (end -12.75 -4.2) (layer Eco1.User) (width 0.1524)) + (fp_line (start -12.75 -3.2) (end -12.15 -3.2) (layer Eco1.User) (width 0.1524)) + (fp_line (start 12.15 -4.2) (end 12.75 -4.2) (layer Eco1.User) (width 0.1524)) + (fp_line (start 12.75 -3.2) (end 12.15 -3.2) (layer Eco1.User) (width 0.1524)) + (fp_line (start 12.15 -4.2) (end -12.15 -4.2) (layer Eco1.User) (width 0.1524)) + (fp_line (start -12.15 2.5) (end 12.15 2.5) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -9.75 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 69 "Net-(J3-Pad1)")) + (pad 2 smd rect (at -9.25 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 3 smd rect (at -8.75 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 4 smd rect (at -8.25 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 5 smd rect (at -7.75 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 37 /hackrf_if/LCD_RESET#)) + (pad 6 smd rect (at -7.25 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 38 /hackrf_if/LCD_RS)) + (pad 7 smd rect (at -6.75 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 36 /hackrf_if/LCD_RD#)) + (pad 8 smd rect (at -6.25 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 9 smd rect (at -5.75 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 10 smd rect (at -5.25 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 40 /hackrf_if/LCD_WR#)) + (pad 11 smd rect (at -4.75 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 12 smd rect (at -4.25 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 13 smd rect (at -3.75 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 14 smd rect (at -3.25 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 15 smd rect (at -2.75 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 16 smd rect (at -2.25 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 17 smd rect (at -1.75 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 18 smd rect (at -1.25 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 27 /hackrf_if/LCD_DB15)) + (pad 19 smd rect (at -0.75 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 26 /hackrf_if/LCD_DB14)) + (pad 20 smd rect (at -0.25 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 25 /hackrf_if/LCD_DB13)) + (pad 21 smd rect (at 0.25 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 24 /hackrf_if/LCD_DB12)) + (pad 22 smd rect (at 0.75 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 23 /hackrf_if/LCD_DB11)) + (pad 23 smd rect (at 1.25 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 22 /hackrf_if/LCD_DB10)) + (pad 24 smd rect (at 1.75 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 35 /hackrf_if/LCD_DB9)) + (pad 25 smd rect (at 2.25 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 34 /hackrf_if/LCD_DB8)) + (pad 26 smd rect (at 2.75 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 33 /hackrf_if/LCD_DB7)) + (pad 27 smd rect (at 3.25 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 32 /hackrf_if/LCD_DB6)) + (pad 28 smd rect (at 3.75 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 31 /hackrf_if/LCD_DB5)) + (pad 29 smd rect (at 4.25 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 30 /hackrf_if/LCD_DB4)) + (pad 30 smd rect (at 4.75 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 29 /hackrf_if/LCD_DB3)) + (pad 31 smd rect (at 5.25 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 28 /hackrf_if/LCD_DB2)) + (pad 32 smd rect (at 5.75 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 21 /hackrf_if/LCD_DB1)) + (pad 33 smd rect (at 6.25 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 20 /hackrf_if/LCD_DB0)) + (pad 34 smd rect (at 6.75 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 39 /hackrf_if/LCD_TE)) + (pad 35 smd rect (at 7.25 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 36 smd rect (at 7.75 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 1 +1.8V)) + (pad 37 smd rect (at 8.25 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 60 /hackrf_if/TP_R)) + (pad 38 smd rect (at 8.75 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 58 /hackrf_if/TP_D)) + (pad 39 smd rect (at 9.25 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 59 /hackrf_if/TP_L)) + (pad 40 smd rect (at 9.75 2.8 90) (size 0.3 1.2) (layers 4_bot B.Paste B.Mask) + (net 61 /hackrf_if/TP_U)) + (pad SHLD smd rect (at -11.45 0.9 90) (size 1.6 0.8) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad SHLD smd rect (at -11.85 -0.3 90) (size 2.4 1.6) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad SHLD smd rect (at 11.85 -0.3 90) (size 2.4 1.6) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad SHLD smd rect (at 11.45 0.9 90) (size 1.6 0.8) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_indc:IPC_INDC1608X95N (layer 4_bot) (tedit 53B30A63) (tstamp 53AA28A2) + (at 165.4 121.6 180) + (path /53A8BFC3/53A8C2E2) + (attr smd) + (fp_text reference L4 (at 0 -1.4 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value L (at 0 0 180) (layer B.SilkS) hide + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start 1.524 0.7493) (end 1.524 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.524 -0.7493) (end -1.524 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.524 -0.7493) (end -1.524 0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.524 0.7493) (end 1.524 0.7493) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.8001 0 180) (size 0.94996 0.94996) (layers 4_bot B.Paste B.Mask) + (net 70 "Net-(L4-Pad1)")) + (pad 2 smd rect (at 0.8001 0 180) (size 0.94996 0.94996) (layers 4_bot B.Paste B.Mask) + (net 64 "Net-(C18-Pad2)")) + ) + + (module ipc_indc:IPC_INDC1608X95N (layer 4_bot) (tedit 53B09A7D) (tstamp 53AA28AC) + (at 165.4 110 180) + (path /53A8BFC3/53A8C2E8) + (attr smd) + (fp_text reference L5 (at 0 1.4 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value L (at 0 0 180) (layer B.SilkS) hide + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start 1.524 0.7493) (end 1.524 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.524 -0.7493) (end -1.524 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.524 -0.7493) (end -1.524 0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.524 0.7493) (end 1.524 0.7493) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.8001 0 180) (size 0.94996 0.94996) (layers 4_bot B.Paste B.Mask) + (net 71 "Net-(L5-Pad1)")) + (pad 2 smd rect (at 0.8001 0 180) (size 0.94996 0.94996) (layers 4_bot B.Paste B.Mask) + (net 65 "Net-(C19-Pad2)")) + ) + + (module ipc_indc:IPC_INDC1608X95N (layer 4_bot) (tedit 53B09AA3) (tstamp 53AA28B6) + (at 174.8 121.6 180) + (path /53A8BFC3/53A8C2EE) + (attr smd) + (fp_text reference L6 (at -2.4 0 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value L (at 0 0 180) (layer B.SilkS) hide + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start 1.524 0.7493) (end 1.524 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.524 -0.7493) (end -1.524 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.524 -0.7493) (end -1.524 0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.524 0.7493) (end 1.524 0.7493) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.8001 0 180) (size 0.94996 0.94996) (layers 4_bot B.Paste B.Mask) + (net 72 "Net-(L6-Pad1)")) + (pad 2 smd rect (at 0.8001 0 180) (size 0.94996 0.94996) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_indc:IPC_INDC1608X95N (layer 4_bot) (tedit 53B09AA7) (tstamp 53AA28D4) + (at 174.2 124 180) + (path /53A8BFC3/53A8C2F4) + (attr smd) + (fp_text reference L9 (at -2.4 0 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value L (at 0 0 180) (layer B.SilkS) hide + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start 1.524 0.7493) (end 1.524 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.524 -0.7493) (end -1.524 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.524 -0.7493) (end -1.524 0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.524 0.7493) (end 1.524 0.7493) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.8001 0 180) (size 0.94996 0.94996) (layers 4_bot B.Paste B.Mask) + (net 73 "Net-(L9-Pad1)")) + (pad 2 smd rect (at 0.8001 0 180) (size 0.94996 0.94996) (layers 4_bot B.Paste B.Mask) + (net 67 "Net-(C24-Pad2)")) + ) + + (module lcd_kingtech:KINGTECH_DW0240A2BZ_PANEL locked (layer 1_top) (tedit 53C5BC95) (tstamp 53AA2904) + (at 62 137.5 270) + (path /53A9129D/53A8C752) + (attr smd) + (fp_text reference LCD1 (at 4.5 -4 270) (layer F.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524))) + ) + (fp_text value KINGTECH_DW0240A2BZ_PANEL (at 0 0 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -10.25 -18) (end 10.25 -18) (layer Eco2.User) (width 0.1524)) + (fp_line (start -12.96 -10.72) (end -10.25 -13.39) (layer Eco2.User) (width 0.1524)) + (fp_line (start 10.25 -22) (end -10.25 -22) (layer Eco2.User) (width 0.1524)) + (fp_line (start -10.25 -22) (end -10.25 -13.39) (layer Eco2.User) (width 0.1524)) + (fp_line (start 10.25 -12.5) (end 10.25 -22) (layer Eco2.User) (width 0.1524)) + (fp_line (start 18.54 -12.5) (end 10.25 -12.5) (layer Eco2.User) (width 0.1524)) + (fp_line (start 18.54 -0.5) (end 18.54 -12.5) (layer Eco2.User) (width 0.1524)) + (fp_line (start 10.25 -0.5) (end 18.54 -0.5) (layer Eco2.User) (width 0.1524)) + (fp_line (start 10.25 0) (end 10.25 1.5) (layer Eco1.User) (width 0.1524)) + (fp_line (start -12.96 -0.5) (end -12.96 -10.72) (layer Eco2.User) (width 0.1524)) + (fp_line (start -10.25 0) (end -10.25 1.5) (layer Eco1.User) (width 0.1524)) + (fp_line (start -10.25 -0.5) (end -12.96 -0.5) (layer Eco2.User) (width 0.1524)) + (fp_line (start 0 -31.83) (end 0 -33.83) (layer Cmts.User) (width 0.1524)) + (fp_line (start -1 -32.83) (end 1 -32.83) (layer Cmts.User) (width 0.1524)) + (fp_line (start -21.36 0) (end -22.06 0) (layer F.SilkS) (width 0.1524)) + (fp_line (start -22.06 0) (end -22.06 -2.5) (layer F.SilkS) (width 0.1524)) + (fp_line (start -22.06 -2.5) (end -21.36 -2.5) (layer F.SilkS) (width 0.1524)) + (fp_line (start 21.36 0) (end 22.06 0) (layer F.SilkS) (width 0.1524)) + (fp_line (start 22.06 0) (end 22.06 -2.5) (layer F.SilkS) (width 0.1524)) + (fp_line (start 22.06 -2.5) (end 21.36 -2.5) (layer F.SilkS) (width 0.1524)) + (fp_line (start 21.36 -60.26) (end 22.06 -60.26) (layer F.SilkS) (width 0.1524)) + (fp_line (start 22.06 -60.26) (end 22.06 -57.76) (layer F.SilkS) (width 0.1524)) + (fp_line (start 22.06 -57.76) (end 21.36 -57.76) (layer F.SilkS) (width 0.1524)) + (fp_line (start -21.36 -60.26) (end -22.06 -60.26) (layer F.SilkS) (width 0.1524)) + (fp_line (start -22.06 -60.26) (end -22.06 -57.76) (layer F.SilkS) (width 0.1524)) + (fp_line (start -22.06 -57.76) (end -21.36 -57.76) (layer F.SilkS) (width 0.1524)) + (fp_line (start -18.36 -57.31) (end 18.36 -57.31) (layer F.SilkS) (width 0.1524)) + (fp_line (start 18.36 -57.31) (end 18.36 -8.35) (layer F.SilkS) (width 0.1524)) + (fp_line (start 18.36 -8.35) (end -18.36 -8.35) (layer F.SilkS) (width 0.1524)) + (fp_line (start -18.36 -8.35) (end -18.36 -57.31) (layer F.SilkS) (width 0.1524)) + (fp_line (start 21.36 0) (end -21.36 0) (layer F.SilkS) (width 0.1524)) + (fp_line (start -21.36 0) (end -21.36 -60.26) (layer F.SilkS) (width 0.1524)) + (fp_line (start -21.36 -60.26) (end 21.36 -60.26) (layer F.SilkS) (width 0.1524)) + (fp_line (start 21.36 -60.26) (end 21.36 0) (layer F.SilkS) (width 0.1524)) + ) + + (module ipc_resc:IPC_RESC1608X55N (layer 4_bot) (tedit 53B09A40) (tstamp 53B0A464) + (at 139.4 108.2 180) + (tags "1608 metric, 0603 imperial") + (path /53A8BFC3/53A8C2B0) + (attr smd) + (fp_text reference R10 (at 11 -0.6 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 0R (at 0 0 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start -1.50114 0.7493) (end 1.50114 0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.50114 0.7493) (end 1.50114 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.50114 -0.7493) (end -1.50114 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.50114 -0.7493) (end -1.50114 0.7493) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.8001 0 180) (size 0.89916 1.00076) (layers 4_bot B.Paste B.Mask) + (net 66 "Net-(C24-Pad1)")) + (pad 2 smd rect (at 0.8001 0 180) (size 0.89916 1.00076) (layers 4_bot B.Paste B.Mask) + (net 14 /audio/MICIN)) + ) + + (module ipc_resc:IPC_RESC1608X55N (layer 4_bot) (tedit 53B09A8C) (tstamp 53AA2A28) + (at 161 120.8 90) + (tags "1608 metric, 0603 imperial") + (path /53A8BFC3/53A8C264) + (attr smd) + (fp_text reference R11 (at -3.2 0 90) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 47K (at 0 0 90) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start -1.50114 0.7493) (end 1.50114 0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.50114 0.7493) (end 1.50114 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.50114 -0.7493) (end -1.50114 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.50114 -0.7493) (end -1.50114 0.7493) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.8001 0 90) (size 0.89916 1.00076) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 2 smd rect (at 0.8001 0 90) (size 0.89916 1.00076) (layers 4_bot B.Paste B.Mask) + (net 64 "Net-(C18-Pad2)")) + ) + + (module ipc_resc:IPC_RESC1608X55N (layer 4_bot) (tedit 53B09A73) (tstamp 53AA2A32) + (at 161 109.2 90) + (tags "1608 metric, 0603 imperial") + (path /53A8BFC3/53A8C26A) + (attr smd) + (fp_text reference R12 (at 3.2 0 90) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 47K (at 0 0 90) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start -1.50114 0.7493) (end 1.50114 0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.50114 0.7493) (end 1.50114 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.50114 -0.7493) (end -1.50114 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.50114 -0.7493) (end -1.50114 0.7493) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.8001 0 90) (size 0.89916 1.00076) (layers 4_bot B.Paste B.Mask) + (net 65 "Net-(C19-Pad2)")) + (pad 2 smd rect (at 0.8001 0 90) (size 0.89916 1.00076) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_resc:IPC_RESC1608X55N (layer 4_bot) (tedit 53B09AAF) (tstamp 53AE455C) + (at 170.8 124 180) + (tags "1608 metric, 0603 imperial") + (path /53A8BFC3/53A8C296) + (attr smd) + (fp_text reference R17 (at -0.6 -1.4 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 47K (at 0 0 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start -1.50114 0.7493) (end 1.50114 0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.50114 0.7493) (end 1.50114 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.50114 -0.7493) (end -1.50114 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.50114 -0.7493) (end -1.50114 0.7493) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.8001 0 180) (size 0.89916 1.00076) (layers 4_bot B.Paste B.Mask) + (net 67 "Net-(C24-Pad2)")) + (pad 2 smd rect (at 0.8001 0 180) (size 0.89916 1.00076) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_resc:IPC_RESC1608X55N (layer 4_bot) (tedit 53B09A2B) (tstamp 53B0A485) + (at 136.4 104.4) + (tags "1608 metric, 0603 imperial") + (path /53A8BFC3/53A8C29C) + (attr smd) + (fp_text reference R18 (at -0.6 -1.4) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 680R (at 0 0) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start -1.50114 0.7493) (end 1.50114 0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.50114 0.7493) (end 1.50114 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.50114 -0.7493) (end -1.50114 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.50114 -0.7493) (end -1.50114 0.7493) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.8001 0) (size 0.89916 1.00076) (layers 4_bot B.Paste B.Mask) + (net 13 /audio/MICBIAS)) + (pad 2 smd rect (at 0.8001 0) (size 0.89916 1.00076) (layers 4_bot B.Paste B.Mask) + (net 67 "Net-(C24-Pad2)")) + ) + + (module ipc_resc:IPC_RESC1608X55N (layer 4_bot) (tedit 53B09B9B) (tstamp 53AA2A78) + (at 87.8 146.4 270) + (tags "1608 metric, 0603 imperial") + (path /53A9129D/53A91657) + (attr smd) + (fp_text reference R19 (at -0.8 -1.4 270) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 47K (at 0 0 270) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start -1.50114 0.7493) (end 1.50114 0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.50114 0.7493) (end 1.50114 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.50114 -0.7493) (end -1.50114 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.50114 -0.7493) (end -1.50114 0.7493) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.8001 0 270) (size 0.89916 1.00076) (layers 4_bot B.Paste B.Mask) + (net 37 /hackrf_if/LCD_RESET#)) + (pad 2 smd rect (at 0.8001 0 270) (size 0.89916 1.00076) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_resc:IPC_RESC1608X55N (layer 4_bot) (tedit 53B09B8D) (tstamp 53AA2A82) + (at 94.6 148.3 90) + (tags "1608 metric, 0603 imperial") + (path /53A9129D/53A91635) + (attr smd) + (fp_text reference R20 (at 2.6 0 90) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 47K (at 0 0 90) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start -1.50114 0.7493) (end 1.50114 0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.50114 0.7493) (end 1.50114 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.50114 -0.7493) (end -1.50114 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.50114 -0.7493) (end -1.50114 0.7493) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.8001 0 90) (size 0.89916 1.00076) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 2 smd rect (at 0.8001 0 90) (size 0.89916 1.00076) (layers 4_bot B.Paste B.Mask) + (net 19 /hackrf_if/LCD_BACKLIGHT)) + ) + + (module ipc_resc:IPC_RESC1608X55N (layer 4_bot) (tedit 53B30AF0) (tstamp 53AE033F) + (at 138.5 120.9 90) + (tags "1608 metric, 0603 imperial") + (path /53A8C780/53A915E9) + (attr smd) + (fp_text reference R22 (at -1.1 1.5 90) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 220R (at 0 0 90) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start -1.50114 0.7493) (end 1.50114 0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.50114 0.7493) (end 1.50114 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.50114 -0.7493) (end -1.50114 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.50114 -0.7493) (end -1.50114 0.7493) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.8001 0 90) (size 0.89916 1.00076) (layers 4_bot B.Paste B.Mask) + (net 112 /hackrf_if/H1_CPLD_TDI)) + (pad 2 smd rect (at 0.8001 0 90) (size 0.89916 1.00076) (layers 4_bot B.Paste B.Mask) + (net 5 /audio/I2S0_RX_SDA)) + ) + + (module ipc_resc:IPC_RESCAXS80P160X320X60-8N (layer 4_bot) (tedit 55E240E2) (tstamp 53AB0D66) + (at 149.3 158.5 90) + (path /53A8BFC3/53AB09AD) + (fp_text reference RP1 (at -0.1 2.7 90) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 220R (at 0 0 90) (layer B.SilkS) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_line (start -1.6 1.95) (end 1.6 1.95) (layer B.CrtYd) (width 0.1524)) + (fp_line (start 1.6 1.95) (end 1.6 -1.95) (layer B.CrtYd) (width 0.1524)) + (fp_line (start 1.6 -1.95) (end -1.6 -1.95) (layer B.CrtYd) (width 0.1524)) + (fp_line (start -1.6 -1.95) (end -1.6 1.95) (layer B.CrtYd) (width 0.1524)) + (fp_line (start -0.1 1.7) (end 0.1 1.7) (layer B.SilkS) (width 0.1524)) + (fp_line (start 0.1 1.7) (end 0.1 -1.7) (layer B.SilkS) (width 0.1524)) + (fp_line (start 0.1 -1.7) (end -0.1 -1.7) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.1 -1.7) (end -0.1 1.7) (layer B.SilkS) (width 0.1524)) + (pad 2 smd rect (at -0.85 0.4 90) (size 1 0.5) (layers 4_bot B.Paste B.Mask) + (net 10 /audio/I2S0_WS)) + (pad 3 smd rect (at -0.85 -0.4 90) (size 1 0.5) (layers 4_bot B.Paste B.Mask) + (net 6 /audio/I2S0_SCK)) + (pad 1 smd rect (at -0.85 1.3 90) (size 1 0.7) (layers 4_bot B.Paste B.Mask) + (net 8 /audio/I2S0_TX_SDA)) + (pad 4 smd rect (at -0.85 -1.3 90) (size 1 0.7) (layers 4_bot B.Paste B.Mask) + (net 3 /audio/I2S0_MCLK)) + (pad 5 smd rect (at 0.85 -1.3 90) (size 1 0.7) (layers 4_bot B.Paste B.Mask) + (net 4 /audio/I2S0_MCLK_R)) + (pad 6 smd rect (at 0.85 -0.4 90) (size 1 0.5) (layers 4_bot B.Paste B.Mask) + (net 7 /audio/I2S0_SCK_R)) + (pad 7 smd rect (at 0.85 0.4 90) (size 1 0.5) (layers 4_bot B.Paste B.Mask) + (net 11 /audio/I2S0_WS_R)) + (pad 8 smd rect (at 0.85 1.3 90) (size 1 0.7) (layers 4_bot B.Paste B.Mask) + (net 9 /audio/I2S0_TX_SDA_R)) + ) + + (module ipc_resc:IPC_RESCAXS80P160X320X60-8N (layer 4_bot) (tedit 55E240E2) (tstamp 53ACCB45) + (at 133.6 164 180) + (path /53A8C780/53AB047A) + (fp_text reference RP4 (at -0.8 -2.6 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 220R (at 0 0 180) (layer B.SilkS) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_line (start -1.6 1.95) (end 1.6 1.95) (layer B.CrtYd) (width 0.1524)) + (fp_line (start 1.6 1.95) (end 1.6 -1.95) (layer B.CrtYd) (width 0.1524)) + (fp_line (start 1.6 -1.95) (end -1.6 -1.95) (layer B.CrtYd) (width 0.1524)) + (fp_line (start -1.6 -1.95) (end -1.6 1.95) (layer B.CrtYd) (width 0.1524)) + (fp_line (start -0.1 1.7) (end 0.1 1.7) (layer B.SilkS) (width 0.1524)) + (fp_line (start 0.1 1.7) (end 0.1 -1.7) (layer B.SilkS) (width 0.1524)) + (fp_line (start 0.1 -1.7) (end -0.1 -1.7) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.1 -1.7) (end -0.1 1.7) (layer B.SilkS) (width 0.1524)) + (pad 2 smd rect (at -0.85 0.4 180) (size 1 0.5) (layers 4_bot B.Paste B.Mask) + (net 41 /hackrf_if/P2_8)) + (pad 3 smd rect (at -0.85 -0.4 180) (size 1 0.5) (layers 4_bot B.Paste B.Mask) + (net 101 /hackrf_if/MCU_LCD_WR)) + (pad 1 smd rect (at -0.85 1.3 180) (size 1 0.7) (layers 4_bot B.Paste B.Mask) + (net 99 /hackrf_if/MCU_ADDR)) + (pad 4 smd rect (at -0.85 -1.3 180) (size 1 0.7) (layers 4_bot B.Paste B.Mask) + (net 100 /hackrf_if/MCU_DIR)) + (pad 5 smd rect (at 0.85 -1.3 180) (size 1 0.7) (layers 4_bot B.Paste B.Mask) + (net 118 /hackrf_if/MCU_DIR_R)) + (pad 6 smd rect (at 0.85 -0.4 180) (size 1 0.5) (layers 4_bot B.Paste B.Mask) + (net 119 /hackrf_if/MCU_LCD_WR_R)) + (pad 7 smd rect (at 0.85 0.4 180) (size 1 0.5) (layers 4_bot B.Paste B.Mask) + (net 42 /hackrf_if/P2_8_R)) + (pad 8 smd rect (at 0.85 1.3 180) (size 1 0.7) (layers 4_bot B.Paste B.Mask) + (net 120 /hackrf_if/MCU_ADDR_R)) + ) + + (module ipc_resc:IPC_RESCAXS80P160X320X60-8N (layer 4_bot) (tedit 55E240E2) (tstamp 53AB0DCA) + (at 164.6 144.5 180) + (path /53A8C780/53AB04B9) + (fp_text reference RP6 (at -1.6 2.5 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 220R (at 0 0 180) (layer B.SilkS) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_line (start -1.6 1.95) (end 1.6 1.95) (layer B.CrtYd) (width 0.1524)) + (fp_line (start 1.6 1.95) (end 1.6 -1.95) (layer B.CrtYd) (width 0.1524)) + (fp_line (start 1.6 -1.95) (end -1.6 -1.95) (layer B.CrtYd) (width 0.1524)) + (fp_line (start -1.6 -1.95) (end -1.6 1.95) (layer B.CrtYd) (width 0.1524)) + (fp_line (start -0.1 1.7) (end 0.1 1.7) (layer B.SilkS) (width 0.1524)) + (fp_line (start 0.1 1.7) (end 0.1 -1.7) (layer B.SilkS) (width 0.1524)) + (fp_line (start 0.1 -1.7) (end -0.1 -1.7) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.1 -1.7) (end -0.1 1.7) (layer B.SilkS) (width 0.1524)) + (pad 2 smd rect (at -0.85 0.4 180) (size 1 0.5) (layers 4_bot B.Paste B.Mask) + (net 85 /hackrf_if/MCU_D6)) + (pad 3 smd rect (at -0.85 -0.4 180) (size 1 0.5) (layers 4_bot B.Paste B.Mask) + (net 83 /hackrf_if/MCU_D4)) + (pad 1 smd rect (at -0.85 1.3 180) (size 1 0.7) (layers 4_bot B.Paste B.Mask) + (net 84 /hackrf_if/MCU_D7)) + (pad 4 smd rect (at -0.85 -1.3 180) (size 1 0.7) (layers 4_bot B.Paste B.Mask) + (net 82 /hackrf_if/MCU_D5)) + (pad 5 smd rect (at 0.85 -1.3 180) (size 1 0.7) (layers 4_bot B.Paste B.Mask) + (net 121 /hackrf_if/MCU_D5_R)) + (pad 6 smd rect (at 0.85 -0.4 180) (size 1 0.5) (layers 4_bot B.Paste B.Mask) + (net 122 /hackrf_if/MCU_D4_R)) + (pad 7 smd rect (at 0.85 0.4 180) (size 1 0.5) (layers 4_bot B.Paste B.Mask) + (net 123 /hackrf_if/MCU_D6_R)) + (pad 8 smd rect (at 0.85 1.3 180) (size 1 0.7) (layers 4_bot B.Paste B.Mask) + (net 124 /hackrf_if/MCU_D7_R)) + ) + + (module ipc_resc:IPC_RESCAXS80P160X320X60-8N (layer 4_bot) (tedit 55E240E2) (tstamp 53AB17FF) + (at 164.6 149.6 180) + (path /53A8C780/53AB04D6) + (fp_text reference RP7 (at 1.8 -2.6 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 220R (at 0 0 180) (layer B.SilkS) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_line (start -1.6 1.95) (end 1.6 1.95) (layer B.CrtYd) (width 0.1524)) + (fp_line (start 1.6 1.95) (end 1.6 -1.95) (layer B.CrtYd) (width 0.1524)) + (fp_line (start 1.6 -1.95) (end -1.6 -1.95) (layer B.CrtYd) (width 0.1524)) + (fp_line (start -1.6 -1.95) (end -1.6 1.95) (layer B.CrtYd) (width 0.1524)) + (fp_line (start -0.1 1.7) (end 0.1 1.7) (layer B.SilkS) (width 0.1524)) + (fp_line (start 0.1 1.7) (end 0.1 -1.7) (layer B.SilkS) (width 0.1524)) + (fp_line (start 0.1 -1.7) (end -0.1 -1.7) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.1 -1.7) (end -0.1 1.7) (layer B.SilkS) (width 0.1524)) + (pad 2 smd rect (at -0.85 0.4 180) (size 1 0.5) (layers 4_bot B.Paste B.Mask) + (net 81 /hackrf_if/MCU_D2)) + (pad 3 smd rect (at -0.85 -0.4 180) (size 1 0.5) (layers 4_bot B.Paste B.Mask) + (net 79 /hackrf_if/MCU_D0)) + (pad 1 smd rect (at -0.85 1.3 180) (size 1 0.7) (layers 4_bot B.Paste B.Mask) + (net 80 /hackrf_if/MCU_D3)) + (pad 4 smd rect (at -0.85 -1.3 180) (size 1 0.7) (layers 4_bot B.Paste B.Mask) + (net 78 /hackrf_if/MCU_D1)) + (pad 5 smd rect (at 0.85 -1.3 180) (size 1 0.7) (layers 4_bot B.Paste B.Mask) + (net 125 /hackrf_if/MCU_D1_R)) + (pad 6 smd rect (at 0.85 -0.4 180) (size 1 0.5) (layers 4_bot B.Paste B.Mask) + (net 126 /hackrf_if/MCU_D0_R)) + (pad 7 smd rect (at 0.85 0.4 180) (size 1 0.5) (layers 4_bot B.Paste B.Mask) + (net 127 /hackrf_if/MCU_D2_R)) + (pad 8 smd rect (at 0.85 1.3 180) (size 1 0.7) (layers 4_bot B.Paste B.Mask) + (net 128 /hackrf_if/MCU_D3_R)) + ) + + (module ipc_resc:IPC_RESC1608X55N (layer 4_bot) (tedit 53B09AE6) (tstamp 53AB16DA) + (at 162.8 158.2 270) + (tags "1608 metric, 0603 imperial") + (path /53A8C780/53AB79CA) + (attr smd) + (fp_text reference R1 (at -2.4 0 270) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 220R (at 0 0 270) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start -1.50114 0.7493) (end 1.50114 0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.50114 0.7493) (end 1.50114 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.50114 -0.7493) (end -1.50114 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.50114 -0.7493) (end -1.50114 0.7493) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.8001 0 270) (size 0.89916 1.00076) (layers 4_bot B.Paste B.Mask) + (net 115 /hackrf_if/MCU_LCD_RD_R)) + (pad 2 smd rect (at 0.8001 0 270) (size 0.89916 1.00076) (layers 4_bot B.Paste B.Mask) + (net 92 /hackrf_if/MCU_LCD_RD)) + ) + + (module ipc_resc:IPC_RESC1608X55N (layer 4_bot) (tedit 53B09AEA) (tstamp 53AB2F99) + (at 161 158.2 270) + (tags "1608 metric, 0603 imperial") + (path /53A8C780/53AB79D5) + (attr smd) + (fp_text reference R2 (at -2.4 0 270) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 220R (at 0 0 270) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start -1.50114 0.7493) (end 1.50114 0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.50114 0.7493) (end 1.50114 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.50114 -0.7493) (end -1.50114 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.50114 -0.7493) (end -1.50114 0.7493) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.8001 0 270) (size 0.89916 1.00076) (layers 4_bot B.Paste B.Mask) + (net 116 /hackrf_if/MCU_LCD_TE_R)) + (pad 2 smd rect (at 0.8001 0 270) (size 0.89916 1.00076) (layers 4_bot B.Paste B.Mask) + (net 91 /hackrf_if/MCU_LCD_TE)) + ) + + (module ipc_resc:IPC_RESC1608X55N (layer 4_bot) (tedit 53B09AFE) (tstamp 53AB2FA3) + (at 145.2 158.2) + (tags "1608 metric, 0603 imperial") + (path /53A8C780/53AB79EA) + (attr smd) + (fp_text reference R3 (at 0 -1.4) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 220R (at 0 0) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_line (start -1.50114 0.7493) (end 1.50114 0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.50114 0.7493) (end 1.50114 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.50114 -0.7493) (end -1.50114 -0.7493) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.50114 -0.7493) (end -1.50114 0.7493) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.8001 0) (size 0.89916 1.00076) (layers 4_bot B.Paste B.Mask) + (net 117 /hackrf_if/MCU_IO_STBX_R)) + (pad 2 smd rect (at 0.8001 0) (size 0.89916 1.00076) (layers 4_bot B.Paste B.Mask) + (net 98 /hackrf_if/MCU_IO_STBX)) + ) + + (module ipc_capc:IPC_CAPC2012X140N (layer 4_bot) (tedit 53B108E0) (tstamp 53AA27BB) + (at 173.4 159 180) + (path /53A8C780/53A8D62C) + (attr smd) + (fp_text reference C41 (at -2.8 0 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value DNI (at 0 0 180) (layer B.SilkS) + (effects (font (thickness 0.3048)) (justify mirror)) + ) + (fp_line (start -1.72466 0.97536) (end 1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 0.97536) (end 1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 -0.97536) (end -1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.72466 -0.97536) (end -1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.89916 0 180) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 62 /hackrf_if/VBAT)) + (pad 2 smd rect (at 0.89916 0 180) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC2012X140N (layer 4_bot) (tedit 53B1092C) (tstamp 53AA27B1) + (at 97.6 144.8) + (path /53A8C780/53A8D592) + (attr smd) + (fp_text reference C40 (at 2.8 -1) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 10U (at 0 0) (layer B.SilkS) + (effects (font (thickness 0.3048)) (justify mirror)) + ) + (fp_line (start -1.72466 0.97536) (end 1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 0.97536) (end 1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 -0.97536) (end -1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.72466 -0.97536) (end -1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.89916 0) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 1 +1.8V)) + (pad 2 smd rect (at 0.89916 0) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC2012X140N (layer 4_bot) (tedit 53B108F5) (tstamp 53AA279D) + (at 101.4 147.8 270) + (path /53A8C780/53A8D58C) + (attr smd) + (fp_text reference C38 (at 0 -2.2 270) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 10U (at 0 0 270) (layer B.SilkS) + (effects (font (thickness 0.3048)) (justify mirror)) + ) + (fp_line (start -1.72466 0.97536) (end 1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 0.97536) (end 1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 -0.97536) (end -1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.72466 -0.97536) (end -1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.89916 0 270) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 2 smd rect (at 0.89916 0 270) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC2012X140N (layer 4_bot) (tedit 53B108FA) (tstamp 53AB408E) + (at 90 140.7 180) + (path /53A8C780/53A8D5E0) + (attr smd) + (fp_text reference C37 (at 0 2.1 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 10U (at 0 0 180) (layer B.SilkS) + (effects (font (thickness 0.3048)) (justify mirror)) + ) + (fp_line (start -1.72466 0.97536) (end 1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 0.97536) (end 1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 -0.97536) (end -1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.72466 -0.97536) (end -1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.89916 0 180) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 1 +1.8V)) + (pad 2 smd rect (at 0.89916 0 180) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC2012X140N (layer 4_bot) (tedit 53B1089D) (tstamp 53AA2789) + (at 90 125.7 180) + (path /53A8C780/53A8D5DA) + (attr smd) + (fp_text reference C36 (at 2.8 0.9 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 10U (at 0 0 180) (layer B.SilkS) + (effects (font (thickness 0.3048)) (justify mirror)) + ) + (fp_line (start -1.72466 0.97536) (end 1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 0.97536) (end 1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 -0.97536) (end -1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.72466 -0.97536) (end -1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.89916 0 180) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 1 +1.8V)) + (pad 2 smd rect (at 0.89916 0 180) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC2012X140N (layer 4_bot) (tedit 53B10916) (tstamp 53AA2775) + (at 97 121.3 180) + (path /53A8C780/53A8D5C8) + (attr smd) + (fp_text reference C34 (at -2.8 -1.1 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 10U (at 0 0 180) (layer B.SilkS) + (effects (font (thickness 0.3048)) (justify mirror)) + ) + (fp_line (start -1.72466 0.97536) (end 1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 0.97536) (end 1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 -0.97536) (end -1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.72466 -0.97536) (end -1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.89916 0 180) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 2 smd rect (at 0.89916 0 180) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC2012X140N (layer 4_bot) (tedit 53B108EA) (tstamp 53AB19ED) + (at 123.5 158.9 180) + (path /53A8C780/53A8D5C2) + (attr smd) + (fp_text reference C32 (at 2.9 -1.1 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 10U (at 0 0 180) (layer B.SilkS) + (effects (font (thickness 0.3048)) (justify mirror)) + ) + (fp_line (start -1.72466 0.97536) (end 1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 0.97536) (end 1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 -0.97536) (end -1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.72466 -0.97536) (end -1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.89916 0 180) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 2 smd rect (at 0.89916 0 180) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC2012X140N (layer 4_bot) (tedit 53B1089A) (tstamp 53AA2725) + (at 76.2 123.2) + (path /53A9129D/53A8C71C) + (attr smd) + (fp_text reference C26 (at 2.8 -0.8) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 10U (at 0 0) (layer B.SilkS) + (effects (font (thickness 0.3048)) (justify mirror)) + ) + (fp_line (start -1.72466 0.97536) (end 1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 0.97536) (end 1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 -0.97536) (end -1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.72466 -0.97536) (end -1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.89916 0) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 2 smd rect (at 0.89916 0) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC2012X140N (layer 4_bot) (tedit 53B108C2) (tstamp 53AA2672) + (at 144.6 111.4 270) + (path /53A8BFC3/53A8C720) + (attr smd) + (fp_text reference C13 (at 0 -2.2 270) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 10U (at 0 0 270) (layer B.SilkS) + (effects (font (thickness 0.3048)) (justify mirror)) + ) + (fp_line (start -1.72466 0.97536) (end 1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 0.97536) (end 1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 -0.97536) (end -1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.72466 -0.97536) (end -1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.89916 0 270) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 2 smd rect (at 0.89916 0 270) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC2012X140N (layer 4_bot) (tedit 53B108D2) (tstamp 53B0A47A) + (at 136.2 106.4) + (path /53A8BFC3/53A8C6F0) + (attr smd) + (fp_text reference C12 (at -2.6 -1.4) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 10U (at 0 0) (layer B.SilkS) + (effects (font (thickness 0.3048)) (justify mirror)) + ) + (fp_line (start -1.72466 0.97536) (end 1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 0.97536) (end 1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 -0.97536) (end -1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.72466 -0.97536) (end -1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.89916 0) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 13 /audio/MICBIAS)) + (pad 2 smd rect (at 0.89916 0) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC2012X140N (layer 4_bot) (tedit 53B108AF) (tstamp 53AA265E) + (at 130.2 116.6 90) + (path /53A8BFC3/53A8C72C) + (attr smd) + (fp_text reference C11 (at 2.8 0 90) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 10U (at 0 0 90) (layer B.SilkS) + (effects (font (thickness 0.3048)) (justify mirror)) + ) + (fp_line (start -1.72466 0.97536) (end 1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 0.97536) (end 1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 -0.97536) (end -1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.72466 -0.97536) (end -1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.89916 0 90) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 2 smd rect (at 0.89916 0 90) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC2012X140N (layer 4_bot) (tedit 53BC2715) (tstamp 53AA264A) + (at 135 122 180) + (path /53A8BFC3/53A8C708) + (attr smd) + (fp_text reference C9 (at 3.3 0 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 10U (at 0 0 180) (layer B.SilkS) + (effects (font (thickness 0.3048)) (justify mirror)) + ) + (fp_line (start -1.72466 0.97536) (end 1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 0.97536) (end 1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 -0.97536) (end -1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.72466 -0.97536) (end -1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.89916 0 180) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 2 smd rect (at 0.89916 0 180) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC2012X140N (layer 4_bot) (tedit 53B108CA) (tstamp 53AE5118) + (at 132.4 106.8 180) + (path /53A8BFC3/53A8C6F6) + (attr smd) + (fp_text reference C8 (at 2.6 0.6 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 10U (at 0 0 180) (layer B.SilkS) + (effects (font (thickness 0.3048)) (justify mirror)) + ) + (fp_line (start -1.72466 0.97536) (end 1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 0.97536) (end 1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 -0.97536) (end -1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.72466 -0.97536) (end -1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.89916 0 180) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 18 /audio/VMID)) + (pad 2 smd rect (at 0.89916 0 180) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC2012X140N (layer 4_bot) (tedit 53B108BE) (tstamp 53AA2636) + (at 144.6 116.6 90) + (path /53A8BFC3/53A8C70E) + (attr smd) + (fp_text reference C7 (at 0 2.2 90) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 10U (at 0 0 90) (layer B.SilkS) + (effects (font (thickness 0.3048)) (justify mirror)) + ) + (fp_line (start -1.72466 0.97536) (end 1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 0.97536) (end 1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 -0.97536) (end -1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.72466 -0.97536) (end -1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.89916 0 90) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 2 smd rect (at 0.89916 0 90) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC2012X140N (layer 4_bot) (tedit 53B19259) (tstamp 53B19350) + (at 155.2 157.8) + (path /53A8C780/53B1911F) + (attr smd) + (fp_text reference C42 (at 2.9 1) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 10U (at 0 0) (layer B.SilkS) + (effects (font (thickness 0.3048)) (justify mirror)) + ) + (fp_line (start -1.72466 0.97536) (end 1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 0.97536) (end 1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 -0.97536) (end -1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.72466 -0.97536) (end -1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.89916 0) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 2 smd rect (at 0.89916 0) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_capc:IPC_CAPC2012X140N (layer 4_bot) (tedit 53B193EF) (tstamp 53B19576) + (at 165.2 154.4 270) + (path /53A8C780/53B1A065) + (attr smd) + (fp_text reference C43 (at 2.2 -1.6 270) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 10U (at 0 0 270) (layer B.SilkS) + (effects (font (thickness 0.3048)) (justify mirror)) + ) + (fp_line (start -1.72466 0.97536) (end 1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 0.97536) (end 1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start 1.72466 -0.97536) (end -1.72466 -0.97536) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.72466 -0.97536) (end -1.72466 0.97536) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -0.89916 0 270) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 2 smd rect (at 0.89916 0 270) (size 1.15062 1.45034) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module fiducial:FIDUCIAL_65MIL (layer 4_bot) (tedit 53B2E496) (tstamp 53B2EF36) + (at 71.2 104.2) + (path /53B309AC) + (solder_mask_margin 2.99974) + (attr smd) + (fp_text reference FID1 (at 0 0) (layer B.SilkS) hide + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value FIDUCIAL (at 0 0) (layer B.SilkS) hide + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (pad "" smd circle (at 0 0) (size 1.651 1.651) (layers 4_bot B.Mask) + (solder_mask_margin 0.8255) (clearance 1.0795)) + ) + + (module fiducial:FIDUCIAL_65MIL (layer 4_bot) (tedit 53B2E496) (tstamp 53B2EF3B) + (at 168.8 104.2) + (path /53B30B4C) + (solder_mask_margin 2.99974) + (attr smd) + (fp_text reference FID2 (at 0 0) (layer B.SilkS) hide + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value FIDUCIAL (at 0 0) (layer B.SilkS) hide + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (pad "" smd circle (at 0 0) (size 1.651 1.651) (layers 4_bot B.Mask) + (solder_mask_margin 0.8255) (clearance 1.0795)) + ) + + (module fiducial:FIDUCIAL_65MIL (layer 4_bot) (tedit 53B2E496) (tstamp 53B2EF40) + (at 64.2 161.2) + (path /53B30CEC) + (solder_mask_margin 2.99974) + (attr smd) + (fp_text reference FID3 (at 0 0) (layer B.SilkS) hide + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value FIDUCIAL (at 0 0) (layer B.SilkS) hide + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (pad "" smd circle (at 0 0) (size 1.651 1.651) (layers 4_bot B.Mask) + (solder_mask_margin 0.8255) (clearance 1.0795)) + ) + + (module fiducial:FIDUCIAL_65MIL (layer 4_bot) (tedit 53B2E496) (tstamp 53B2EF45) + (at 175.8 163.8) + (path /53B30E8C) + (solder_mask_margin 2.99974) + (attr smd) + (fp_text reference FID4 (at 0 0) (layer B.SilkS) hide + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value FIDUCIAL (at 0 0) (layer B.SilkS) hide + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (pad "" smd circle (at 0 0) (size 1.651 1.651) (layers 4_bot B.Mask) + (solder_mask_margin 0.8255) (clearance 1.0795)) + ) + + (module ck:CK_TSWB-3N-CB222_LFS (layer 1_top) (tedit 53B3003D) (tstamp 53AA2AAD) + (at 147.5 137.5 90) + (path /53A9129D/53A8C6FD) + (fp_text reference SW1 (at -0.1 -2.7 90) (layer F.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524))) + ) + (fp_text value CK_TSWB-3N-CB (at 0 0 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_circle (center 0 0) (end 11.45 0) (layer F.SilkS) (width 0.15)) + (fp_circle (center 0 0) (end 4.05 0) (layer F.SilkS) (width 0.15)) + (fp_circle (center 0 0) (end 16 0) (layer F.SilkS) (width 0.15)) + (fp_circle (center 0 0) (end 17.2 0) (layer F.SilkS) (width 0.15)) + (pad "" np_thru_hole circle (at -3.182 -3.182 90) (size 1.6 1.6) (drill 1.6) (layers *.Cu *.Mask) + (clearance 0.4)) + (pad "" np_thru_hole circle (at 3.182 3.182 90) (size 1.6 1.6) (drill 1.6) (layers *.Cu *.Mask) + (clearance 0.4)) + (pad CA thru_hole circle (at -6.548 -6.548 90) (size 2.1 2.1) (drill 1.4) (layers *.Cu *.Mask F.SilkS) + (net 63 GND)) + (pad A thru_hole circle (at 6.548 6.548 90) (size 2.1 2.1) (drill 1.4) (layers *.Cu *.Mask F.SilkS) + (net 54 /hackrf_if/SW_ROT_A)) + (pad "" np_thru_hole circle (at -10.607 -10.607 90) (size 4 4) (drill 4) (layers *.Cu *.Mask) + (clearance 0.4)) + (pad "" np_thru_hole circle (at 10.607 -10.607 90) (size 4 4) (drill 4) (layers *.Cu *.Mask) + (clearance 0.4)) + (pad "" np_thru_hole circle (at 10.607 10.607 90) (size 4 4) (drill 4) (layers *.Cu *.Mask) + (clearance 0.4)) + (pad "" np_thru_hole circle (at -10.607 10.607 90) (size 4 4) (drill 4) (layers *.Cu *.Mask) + (clearance 0.4)) + (pad S1 thru_hole circle (at -1.11 1.11 90) (size 2.1 2.1) (drill 1.4) (layers *.Cu *.Mask F.SilkS) + (net 56 /hackrf_if/SW_SEL)) + (pad B thru_hole circle (at 6.548 -6.548 90) (size 2.1 2.1) (drill 1.4) (layers *.Cu *.Mask F.SilkS) + (net 55 /hackrf_if/SW_ROT_B)) + (pad S3 thru_hole circle (at 16.15 -3.606 90) (size 2.1 2.1) (drill 1.4) (layers *.Cu *.Mask F.SilkS) + (net 53 /hackrf_if/SW_R)) + (pad S2 thru_hole circle (at 7.75 15.104 90) (size 2.1 2.1) (drill 1.4) (layers *.Cu *.Mask F.SilkS) + (net 51 /hackrf_if/SW_D)) + (pad CB thru_hole circle (at -3.253 16.08 90) (size 2.1 2.1) (drill 1.4) (layers *.Cu *.Mask F.SilkS) + (net 63 GND)) + (pad S5 thru_hole circle (at -16.15 3.606 90) (size 2.1 2.1) (drill 1.4) (layers *.Cu *.Mask F.SilkS) + (net 52 /hackrf_if/SW_L)) + (pad S4 thru_hole circle (at -7.75 -15.104 90) (size 2.1 2.1) (drill 1.4) (layers *.Cu *.Mask F.SilkS) + (net 57 /hackrf_if/SW_U)) + ) + + (module cui:CUI_SJ-43516-SMT (layer 4_bot) (tedit 53B3001C) (tstamp 53AA3C96) + (at 172.1 114.8 180) + (path /53A8BFC3/53A8C2C6) + (attr smd) + (fp_text reference P2 (at -0.5 -3.8 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value TRRS_SW_JACK (at 0 0 180) (layer B.SilkS) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_line (start 8.5 -3) (end -1.5 -3) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.5 -3) (end -1.5 -3.7) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.5 -3.7) (end -7 -3.7) (layer B.SilkS) (width 0.1524)) + (fp_line (start 8.5 3) (end 8.5 -3) (layer B.SilkS) (width 0.1524)) + (fp_line (start -7 3) (end 8.5 3) (layer B.SilkS) (width 0.1524)) + (fp_line (start -7 3) (end -7 -3.7) (layer B.SilkS) (width 0.1524)) + (fp_line (start -7 2.5) (end -8.5 2.5) (layer B.SilkS) (width 0.1524)) + (fp_line (start -8.5 2.5) (end -8.5 -2.5) (layer B.SilkS) (width 0.1524)) + (fp_line (start -8.5 -2.5) (end -7 -2.5) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -6.4 -3.7 180) (size 2.2 2.8) (layers 4_bot B.Paste B.Mask) + (net 73 "Net-(L9-Pad1)")) + (pad 4 smd rect (at -3.6 -3.7 180) (size 2.2 2.8) (layers 4_bot B.Paste B.Mask) + (net 72 "Net-(L6-Pad1)")) + (pad 2 smd rect (at 5.8 -3.7 180) (size 2.8 2.8) (layers 4_bot B.Paste B.Mask) + (net 70 "Net-(L4-Pad1)")) + (pad 5 smd rect (at 9.9 0.75 180) (size 2.8 2.8) (layers 4_bot B.Paste B.Mask) + (net 74 "Net-(P2-Pad5)")) + (pad 3 smd rect (at -1.7 3.7 180) (size 2 2.8) (layers 4_bot B.Paste B.Mask) + (net 71 "Net-(L5-Pad1)")) + (pad 6 smd rect (at -4.5 3.7 180) (size 2 2.8) (layers 4_bot B.Paste B.Mask) + (net 75 "Net-(P2-Pad6)")) + (pad "" np_thru_hole circle (at -2.5 0 180) (size 1.7 1.7) (drill 1.7) (layers *.Cu *.Mask B.SilkS) + (clearance 0.4)) + (pad "" np_thru_hole circle (at 4.5 0 180) (size 1.7 1.7) (drill 1.7) (layers *.Cu *.Mask B.SilkS) + (clearance 0.4)) + ) + + (module ipc_sop:IPC_SOP65P780X200-28N (layer 4_bot) (tedit 55E2538C) (tstamp 53AA2AD7) + (at 137.4 114 90) + (tags "JEDEC MO-150AH") + (path /53A8BFC3/53A8C66D) + (solder_mask_margin 0.0492) + (fp_text reference U1 (at -5.2 6.2 90) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value WM8731SEDS (at 0 0 90) (layer B.SilkS) + (effects (font (thickness 0.3048)) (justify mirror)) + ) + (fp_circle (center -4.184 4.98602) (end -4.084 4.98602) (layer B.SilkS) (width 0.1524)) + (fp_line (start -1.8 5.1) (end -1.8 -5.1) (layer B.SilkS) (width 0.1524)) + (fp_line (start -4.675 5.5) (end 4.675 5.5) (layer B.CrtYd) (width 0.1524)) + (fp_line (start 4.675 5.5) (end 4.675 -5.5) (layer B.CrtYd) (width 0.1524)) + (fp_line (start 4.675 -5.5) (end -4.675 -5.5) (layer B.CrtYd) (width 0.1524)) + (fp_line (start -4.675 -5.5) (end -4.675 5.5) (layer B.CrtYd) (width 0.1524)) + (fp_line (start -2.25 5.1) (end 2.25 5.1) (layer B.SilkS) (width 0.1524)) + (fp_line (start 2.25 5.1) (end 2.25 -5.1) (layer B.SilkS) (width 0.1524)) + (fp_line (start 2.25 -5.1) (end -2.25 -5.1) (layer B.SilkS) (width 0.1524)) + (fp_line (start -2.25 -5.1) (end -2.25 5.1) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -3.5 4.225 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 2 smd rect (at -3.5 3.575 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 129 "Net-(U1-Pad2)")) + (pad 3 smd rect (at -3.5 2.925 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 7 /audio/I2S0_SCK_R)) + (pad 4 smd rect (at -3.5 2.275 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 9 /audio/I2S0_TX_SDA_R)) + (pad 5 smd rect (at -3.5 1.625 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 11 /audio/I2S0_WS_R)) + (pad 6 smd rect (at -3.5 0.975 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 5 /audio/I2S0_RX_SDA)) + (pad 7 smd rect (at -3.5 0.325 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 11 /audio/I2S0_WS_R)) + (pad 8 smd rect (at -3.5 -0.325 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 9 smd rect (at -3.5 -0.975 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 12 /audio/LHPOUT)) + (pad 10 smd rect (at -3.5 -1.625 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 15 /audio/RHPOUT)) + (pad 11 smd rect (at -3.5 -2.275 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 12 smd rect (at -3.5 -2.925 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 130 "Net-(U1-Pad12)")) + (pad 13 smd rect (at -3.5 -3.575 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 131 "Net-(U1-Pad13)")) + (pad 14 smd rect (at -3.5 -4.225 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 15 smd rect (at 3.5 -4.225 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 16 smd rect (at 3.5 -3.575 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 18 /audio/VMID)) + (pad 17 smd rect (at 3.5 -2.925 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 13 /audio/MICBIAS)) + (pad 18 smd rect (at 3.5 -2.275 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 14 /audio/MICIN)) + (pad 19 smd rect (at 3.5 -1.625 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 132 "Net-(U1-Pad19)")) + (pad 20 smd rect (at 3.5 -0.975 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 133 "Net-(U1-Pad20)")) + (pad 21 smd rect (at 3.5 -0.325 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 22 smd rect (at 3.5 0.325 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 23 smd rect (at 3.5 0.975 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 17 /audio/SDA)) + (pad 24 smd rect (at 3.5 1.625 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 16 /audio/SCL)) + (pad 25 smd rect (at 3.5 2.275 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 4 /audio/I2S0_MCLK_R)) + (pad 26 smd rect (at 3.5 2.925 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 134 "Net-(U1-Pad26)")) + (pad 27 smd rect (at 3.5 3.575 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 28 smd rect (at 3.5 4.225 90) (size 1.85 0.45) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + ) + + (module ipc_sot:IPC_SOT95P280X110-5N (layer 4_bot) (tedit 55E242AA) (tstamp 53AA2AE9) + (at 98 147.8 180) + (path /53A8C780/53A8D586) + (fp_text reference U2 (at -2.8 2.8 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value REGULATOR_SOT23_5 (at 0 0 180) (layer B.SilkS) + (effects (font (thickness 0.3048)) (justify mirror)) + ) + (fp_line (start -0.475 1.45) (end 0.475 1.45) (layer B.SilkS) (width 0.1524)) + (fp_line (start 0.475 1.45) (end 0.475 -1.45) (layer B.SilkS) (width 0.1524)) + (fp_line (start 0.475 -1.45) (end -0.475 -1.45) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.475 -1.45) (end -0.475 1.45) (layer B.SilkS) (width 0.1524)) + (fp_circle (center -1.98 2.22) (end -1.88 2.22) (layer B.SilkS) (width 0.1524)) + (fp_line (start -2.15 1.775) (end 2.15 1.775) (layer B.CrtYd) (width 0.1524)) + (fp_line (start 2.15 1.775) (end 2.15 -1.775) (layer B.CrtYd) (width 0.1524)) + (fp_line (start 2.15 -1.775) (end -2.15 -1.775) (layer B.CrtYd) (width 0.1524)) + (fp_line (start -2.15 -1.775) (end -2.15 1.775) (layer B.CrtYd) (width 0.1524)) + (pad 1 smd rect (at -1.35 0.95 180) (size 1.1 0.6) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 2 smd rect (at -1.35 0 180) (size 1.1 0.6) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 3 smd rect (at -1.35 -0.95 180) (size 1.1 0.6) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 4 smd rect (at 1.35 -0.95 180) (size 1.1 0.6) (layers 4_bot B.Paste B.Mask) + (net 68 "Net-(C39-Pad1)")) + (pad 5 smd rect (at 1.35 0.95 180) (size 1.1 0.6) (layers 4_bot B.Paste B.Mask) + (net 1 +1.8V)) + ) + + (module alps:ALPS_SCHA4B0100 (layer 4_bot) (tedit 53BC708B) (tstamp 53BC708B) + (at 68.4 114.6 90) + (path /53A9129D/53A8C6D0) + (attr smd) + (fp_text reference J2 (at -6.2 8.4 90) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value MICROSD_DETSW (at 0 0 90) (layer B.SilkS) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_line (start -5.5 -13.2) (end 3.5 -13.2) (layer Cmts.User) (width 0.1524)) + (fp_line (start -5.5 -9.9) (end 3.5 -9.9) (layer Cmts.User) (width 0.1524)) + (fp_line (start -5.5 -8.5) (end 3.5 -8.5) (layer Cmts.User) (width 0.1524)) + (fp_line (start -1.4675 7.45) (end -1.4675 6.6) (layer Cmts.User) (width 0.1524)) + (fp_line (start -1.4675 6.6) (end -2.5125 6.6) (layer Cmts.User) (width 0.1524)) + (fp_line (start -2.5125 6.6) (end -2.5125 5.2) (layer Cmts.User) (width 0.1524)) + (fp_line (start -2.5125 5.2) (end 1.0375 5.2) (layer Cmts.User) (width 0.1524)) + (fp_line (start 1.0375 5.2) (end 1.0375 7.45) (layer Cmts.User) (width 0.1524)) + (fp_line (start 1.0375 7.45) (end -1.4675 7.45) (layer Cmts.User) (width 0.1524)) + (fp_line (start -6.0125 3.45) (end 2.8875 3.45) (layer Cmts.User) (width 0.1524)) + (fp_line (start 2.8875 3.45) (end 2.8875 -0.95) (layer Cmts.User) (width 0.1524)) + (fp_line (start 2.8875 -0.95) (end -6.0125 -0.95) (layer Cmts.User) (width 0.1524)) + (fp_line (start -6.0125 -0.95) (end -6.0125 3.45) (layer Cmts.User) (width 0.1524)) + (fp_line (start -6.9 -7.6) (end -6.9 7.6) (layer B.SilkS) (width 0.1524)) + (fp_line (start 6.9 -7.6) (end -6.9 -7.6) (layer B.SilkS) (width 0.1524)) + (fp_line (start 6.9 7.6) (end 6.9 -7.6) (layer B.SilkS) (width 0.1524)) + (fp_line (start -6.9 7.6) (end 6.9 7.6) (layer B.SilkS) (width 0.1524)) + (pad SH smd rect (at -4.725 7.425 90) (size 1.2 0.85) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad A smd rect (at -3.475 7.475 90) (size 0.65 0.75) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad B smd rect (at 2.875 7.475 90) (size 0.65 0.75) (layers 4_bot B.Paste B.Mask) + (net 44 /hackrf_if/SD_CD)) + (pad SH smd rect (at 6.025 7.425 90) (size 1.3 0.85) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad SH smd rect (at -6.575 -7.15 90) (size 0.95 1.1) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad SH smd rect (at 6.575 -7.25 90) (size 0.95 0.9) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 0 smd rect (at -3.275 -5.825 90) (size 0.7 0.95) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 0 smd rect (at 0.725 -5.825 90) (size 0.7 0.95) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 1 smd rect (at 2.225 -4.325 90) (size 0.7 1.05) (layers 4_bot B.Paste B.Mask) + (net 49 /hackrf_if/SD_DAT2)) + (pad 2 smd rect (at 1.225 -4.325 90) (size 0.7 1.05) (layers 4_bot B.Paste B.Mask) + (net 50 /hackrf_if/SD_DAT3)) + (pad 3 smd rect (at 0.225 -4.325 90) (size 0.7 1.05) (layers 4_bot B.Paste B.Mask) + (net 46 /hackrf_if/SD_CMD)) + (pad 4 smd rect (at -0.775 -4.325 90) (size 0.7 1.05) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 5 smd rect (at -1.775 -4.325 90) (size 0.7 1.05) (layers 4_bot B.Paste B.Mask) + (net 45 /hackrf_if/SD_CLK)) + (pad 6 smd rect (at -2.775 -4.325 90) (size 0.7 1.05) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 7 smd rect (at -3.775 -4.325 90) (size 0.7 1.05) (layers 4_bot B.Paste B.Mask) + (net 47 /hackrf_if/SD_DAT0)) + (pad 8 smd rect (at -4.775 -4.325 90) (size 0.7 1.05) (layers 4_bot B.Paste B.Mask) + (net 48 /hackrf_if/SD_DAT1)) + ) + + (module ipc_sot:IPC_SOT95P230X110-3N (layer 4_bot) (tedit 55E241DF) (tstamp 53C5B8DC) + (at 91.6 148.4 180) + (path /53A9129D/53C5B6EB) + (fp_text reference Q1 (at -1.4 2.4 180) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value MOSFET_N (at 0 0 180) (layer B.SilkS) + (effects (font (thickness 0.3048)) (justify mirror)) + ) + (fp_line (start -1.9 1.75) (end 1.9 1.75) (layer B.CrtYd) (width 0.1524)) + (fp_line (start 1.9 1.75) (end 1.9 -1.75) (layer B.CrtYd) (width 0.1524)) + (fp_line (start 1.9 -1.75) (end -1.9 -1.75) (layer B.CrtYd) (width 0.1524)) + (fp_line (start -1.9 -1.75) (end -1.9 1.75) (layer B.CrtYd) (width 0.1524)) + (fp_line (start -0.325 1.45) (end 0.325 1.45) (layer B.SilkS) (width 0.1524)) + (fp_line (start 0.325 1.45) (end 0.325 -1.45) (layer B.SilkS) (width 0.1524)) + (fp_line (start 0.325 -1.45) (end -0.325 -1.45) (layer B.SilkS) (width 0.1524)) + (fp_line (start -0.325 -1.45) (end -0.325 1.45) (layer B.SilkS) (width 0.1524)) + (pad 1 smd rect (at -1.15 0.95 180) (size 1 0.6) (layers 4_bot B.Paste B.Mask) + (net 19 /hackrf_if/LCD_BACKLIGHT)) + (pad 2 smd rect (at -1.15 -0.95 180) (size 1 0.6) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 3 smd rect (at 1.15 0 180) (size 1 0.6) (layers 4_bot B.Paste B.Mask) + (net 69 "Net-(J3-Pad1)")) + ) + + (module header:HEADER_13X2_REV_SM_254_AP (layer 4_bot) (tedit 53F39BE9) (tstamp 53AA297D) + (at 152.71 164.84 90) + (descr "MLE TSHSM-1") + (path /53A8C780/53A8CDB6) + (attr smd) + (fp_text reference P22 (at 4.44 16.69 90) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value HACKRF_ONE_P22 (at 0 0 90) (layer B.SilkS) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_circle (center 3.1 16.6) (end 2.9 16.6) (layer B.SilkS) (width 0.1524)) + (fp_line (start -2.5 16.51) (end 2.5 16.51) (layer B.SilkS) (width 0.1524)) + (fp_line (start 2.5 16.51) (end 2.5 -16.51) (layer B.SilkS) (width 0.1524)) + (fp_line (start 2.5 -16.51) (end -2.5 -16.51) (layer B.SilkS) (width 0.1524)) + (fp_line (start -2.5 -16.51) (end -2.5 16.51) (layer B.SilkS) (width 0.1524)) + (pad 2 smd rect (at -2.73 15.24 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 89 "Net-(P22-Pad2)")) + (pad 1 smd rect (at 2.73 15.24 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 90 "Net-(P22-Pad1)")) + (pad 4 smd rect (at -2.73 12.7 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 3 smd rect (at 2.73 12.7 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 43 /hackrf_if/RESET#)) + (pad 6 smd rect (at -2.73 10.16 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 91 /hackrf_if/MCU_LCD_TE)) + (pad 5 smd rect (at 2.73 10.16 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 92 /hackrf_if/MCU_LCD_RD)) + (pad 8 smd rect (at -2.73 7.62 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 93 "Net-(P22-Pad8)")) + (pad 7 smd rect (at 2.73 7.62 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 94 "Net-(P22-Pad7)")) + (pad 10 smd rect (at -2.73 5.08 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 9 smd rect (at 2.73 5.08 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 95 "Net-(P22-Pad9)")) + (pad 12 smd rect (at -2.73 2.54 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 96 "Net-(P22-Pad12)")) + (pad 11 smd rect (at 2.73 2.54 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 14 smd rect (at -2.73 0 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 97 "Net-(P22-Pad14)")) + (pad 13 smd rect (at 2.73 0 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 8 /audio/I2S0_TX_SDA)) + (pad 16 smd rect (at -2.73 -2.54 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 6 /audio/I2S0_SCK)) + (pad 15 smd rect (at 2.73 -2.54 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 10 /audio/I2S0_WS)) + (pad 18 smd rect (at -2.73 -5.08 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 17 smd rect (at 2.73 -5.08 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 3 /audio/I2S0_MCLK)) + (pad 20 smd rect (at -2.73 -7.62 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 98 /hackrf_if/MCU_IO_STBX)) + (pad 19 smd rect (at 2.73 -7.62 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 99 /hackrf_if/MCU_ADDR)) + (pad 22 smd rect (at -2.73 -10.16 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 100 /hackrf_if/MCU_DIR)) + (pad 21 smd rect (at 2.73 -10.16 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 101 /hackrf_if/MCU_LCD_WR)) + (pad 24 smd rect (at -2.73 -12.7 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 17 /audio/SDA)) + (pad 23 smd rect (at 2.73 -12.7 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 41 /hackrf_if/P2_8)) + (pad 26 smd rect (at -2.73 -15.24 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 16 /audio/SCL)) + (pad 25 smd rect (at 2.73 -15.24 90) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 102 "Net-(P22-Pad25)")) + (pad "" np_thru_hole circle (at 0 13.97 90) (size 1.8 1.8) (drill 1.8) (layers *.Cu *.Mask) + (clearance 0.4)) + (pad "" np_thru_hole circle (at 0 -13.97 90) (size 1.8 1.8) (drill 1.8) (layers *.Cu *.Mask) + (clearance 0.4)) + ) + + (module header:HEADER_11X2_REV_SM_254_AP (layer 4_bot) (tedit 53F39BE1) (tstamp 53AA299C) + (at 123.5 143.25) + (descr "MLE TSHSM-1") + (path /53A8C780/53A8CDBE) + (attr smd) + (fp_text reference P28 (at 4.5 14.15) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value HACKRF_ONE_P28 (at 0 0) (layer B.SilkS) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_circle (center 3.1 14) (end 2.9 14) (layer B.SilkS) (width 0.1524)) + (fp_line (start -2.5 13.97) (end 2.5 13.97) (layer B.SilkS) (width 0.1524)) + (fp_line (start 2.5 13.97) (end 2.5 -13.97) (layer B.SilkS) (width 0.1524)) + (fp_line (start 2.5 -13.97) (end -2.5 -13.97) (layer B.SilkS) (width 0.1524)) + (fp_line (start -2.5 -13.97) (end -2.5 13.97) (layer B.SilkS) (width 0.1524)) + (pad 2 smd rect (at -2.73 12.7) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 1 smd rect (at 2.73 12.7) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 4 smd rect (at -2.73 10.16) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 50 /hackrf_if/SD_DAT3)) + (pad 3 smd rect (at 2.73 10.16) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 44 /hackrf_if/SD_CD)) + (pad 6 smd rect (at -2.73 7.62) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 48 /hackrf_if/SD_DAT1)) + (pad 5 smd rect (at 2.73 7.62) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 49 /hackrf_if/SD_DAT2)) + (pad 8 smd rect (at -2.73 5.08) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 103 /hackrf_if/PP_CPLD_TMS)) + (pad 7 smd rect (at 2.73 5.08) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 47 /hackrf_if/SD_DAT0)) + (pad 10 smd rect (at -2.73 2.54) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 104 /hackrf_if/PP_CPLD_TDO)) + (pad 9 smd rect (at 2.73 2.54) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 46 /hackrf_if/SD_CMD)) + (pad 12 smd rect (at -2.73 0) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 11 smd rect (at 2.73 0) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 45 /hackrf_if/SD_CLK)) + (pad 14 smd rect (at -2.73 -2.54) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 105 "Net-(P28-Pad14)")) + (pad 13 smd rect (at 2.73 -2.54) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 106 "Net-(P28-Pad13)")) + (pad 16 smd rect (at -2.73 -5.08) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 107 "Net-(P28-Pad16)")) + (pad 15 smd rect (at 2.73 -5.08) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 108 "Net-(P28-Pad15)")) + (pad 18 smd rect (at -2.73 -7.62) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 109 "Net-(P28-Pad18)")) + (pad 17 smd rect (at 2.73 -7.62) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 110 /hackrf_if/H1_CPLD_TCK)) + (pad 20 smd rect (at -2.73 -10.16) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 111 "Net-(P28-Pad20)")) + (pad 19 smd rect (at 2.73 -10.16) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 112 /hackrf_if/H1_CPLD_TDI)) + (pad 22 smd rect (at -2.73 -12.7) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 113 "Net-(P28-Pad22)")) + (pad 21 smd rect (at 2.73 -12.7) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 114 "Net-(P28-Pad21)")) + (pad "" np_thru_hole circle (at 0 11.43) (size 1.8 1.8) (drill 1.8) (layers *.Cu *.Mask) + (clearance 0.4)) + (pad "" np_thru_hole circle (at 0 -11.43) (size 1.8 1.8) (drill 1.8) (layers *.Cu *.Mask) + (clearance 0.4)) + ) + + (module header:HEADER_11X2_REV_SM_254_AP (layer 4_bot) (tedit 53F39BF0) (tstamp 53AA295A) + (at 171.76 143.25) + (descr "MLE TSHSM-1") + (path /53A8C780/53A8CDAE) + (attr smd) + (fp_text reference P20 (at 4.44 14.15) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value HACKRF_ONE_P20 (at 0 0) (layer B.SilkS) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_circle (center 3.1 14) (end 2.9 14) (layer B.SilkS) (width 0.1524)) + (fp_line (start -2.5 13.97) (end 2.5 13.97) (layer B.SilkS) (width 0.1524)) + (fp_line (start 2.5 13.97) (end 2.5 -13.97) (layer B.SilkS) (width 0.1524)) + (fp_line (start 2.5 -13.97) (end -2.5 -13.97) (layer B.SilkS) (width 0.1524)) + (fp_line (start -2.5 -13.97) (end -2.5 13.97) (layer B.SilkS) (width 0.1524)) + (pad 2 smd rect (at -2.73 12.7) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 76 "Net-(P20-Pad2)")) + (pad 1 smd rect (at 2.73 12.7) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 62 /hackrf_if/VBAT)) + (pad 4 smd rect (at -2.73 10.16) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 77 "Net-(P20-Pad4)")) + (pad 3 smd rect (at 2.73 10.16) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 6 smd rect (at -2.73 7.62) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 78 /hackrf_if/MCU_D1)) + (pad 5 smd rect (at 2.73 7.62) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 79 /hackrf_if/MCU_D0)) + (pad 8 smd rect (at -2.73 5.08) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 80 /hackrf_if/MCU_D3)) + (pad 7 smd rect (at 2.73 5.08) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 81 /hackrf_if/MCU_D2)) + (pad 10 smd rect (at -2.73 2.54) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 82 /hackrf_if/MCU_D5)) + (pad 9 smd rect (at 2.73 2.54) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 83 /hackrf_if/MCU_D4)) + (pad 12 smd rect (at -2.73 0) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 84 /hackrf_if/MCU_D7)) + (pad 11 smd rect (at 2.73 0) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 85 /hackrf_if/MCU_D6)) + (pad 14 smd rect (at -2.73 -2.54) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 60 /hackrf_if/TP_R)) + (pad 13 smd rect (at 2.73 -2.54) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 16 smd rect (at -2.73 -5.08) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 58 /hackrf_if/TP_D)) + (pad 15 smd rect (at 2.73 -5.08) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 18 smd rect (at -2.73 -7.62) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 59 /hackrf_if/TP_L)) + (pad 17 smd rect (at 2.73 -7.62) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 86 "Net-(P20-Pad17)")) + (pad 20 smd rect (at -2.73 -10.16) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 61 /hackrf_if/TP_U)) + (pad 19 smd rect (at 2.73 -10.16) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 63 GND)) + (pad 22 smd rect (at -2.73 -12.7) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 87 "Net-(P20-Pad22)")) + (pad 21 smd rect (at 2.73 -12.7) (size 3.18 1.02) (layers 4_bot B.Paste B.Mask) + (net 88 "Net-(P20-Pad21)")) + (pad "" np_thru_hole circle (at 0 11.43) (size 1.8 1.8) (drill 1.8) (layers *.Cu *.Mask) + (clearance 0.4)) + (pad "" np_thru_hole circle (at 0 -11.43) (size 1.8 1.8) (drill 1.8) (layers *.Cu *.Mask) + (clearance 0.4)) + ) + + (module ipc_qfp:IPC_QFP40P900X900X120-65N (layer 4_bot) (tedit 55E249FD) (tstamp 53AA699D) + (at 97.6 132.8 270) + (path /53A8C780/53A8D11B) + (solder_mask_margin 0.0492) + (fp_text reference U3 (at -4.8 6 360) (layer B.SilkS) + (effects (font (size 0.6096 0.6096) (thickness 0.1524)) (justify mirror)) + ) + (fp_text value 5M40ZE64 (at 0 0 270) (layer B.SilkS) + (effects (font (size 1 1) (thickness 0.15)) (justify mirror)) + ) + (fp_circle (center -5.6 3) (end -5.5 3) (layer B.SilkS) (width 0.15)) + (fp_line (start -5.2 5.2) (end -5.2 -5.2) (layer B.CrtYd) (width 0.15)) + (fp_line (start -5.2 -5.2) (end 5.2 -5.2) (layer B.CrtYd) (width 0.15)) + (fp_line (start 5.2 -5.2) (end 5.2 5.2) (layer B.CrtYd) (width 0.15)) + (fp_line (start 5.2 5.2) (end -5.2 5.2) (layer B.CrtYd) (width 0.15)) + (fp_line (start -3.1 3.1) (end -3.1 -3.1) (layer B.SilkS) (width 0.15)) + (fp_line (start -3.1 -3.1) (end 3.1 -3.1) (layer B.SilkS) (width 0.15)) + (fp_line (start 3.1 -3.1) (end 3.1 3.1) (layer B.SilkS) (width 0.15)) + (fp_line (start 3.1 3.1) (end -3.1 3.1) (layer B.SilkS) (width 0.15)) + (pad 1 smd rect (at -4.2 3 270) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 58 /hackrf_if/TP_D)) + (pad 2 smd rect (at -4.2 2.6 270) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 59 /hackrf_if/TP_L)) + (pad 3 smd rect (at -4.2 2.2 270) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 61 /hackrf_if/TP_U)) + (pad 4 smd rect (at -4.2 1.8 270) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 19 /hackrf_if/LCD_BACKLIGHT)) + (pad 5 smd rect (at -4.2 1.4 270) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 135 "Net-(U3-Pad5)")) + (pad 6 smd rect (at -4.2 1 270) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 7 smd rect (at -4.2 0.6 270) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 136 "Net-(U3-Pad7)")) + (pad 8 smd rect (at -4.2 0.2 270) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 1 +1.8V)) + (pad 9 smd rect (at -4.2 -0.2 270) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 53 /hackrf_if/SW_R)) + (pad 10 smd rect (at -4.2 -0.6 270) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 51 /hackrf_if/SW_D)) + (pad 11 smd rect (at -4.2 -1 270) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 54 /hackrf_if/SW_ROT_A)) + (pad 12 smd rect (at -4.2 -1.4 270) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 55 /hackrf_if/SW_ROT_B)) + (pad 13 smd rect (at -4.2 -1.8 270) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 56 /hackrf_if/SW_SEL)) + (pad 14 smd rect (at -4.2 -2.2 270) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 103 /hackrf_if/PP_CPLD_TMS)) + (pad 15 smd rect (at -4.2 -2.6 270) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 112 /hackrf_if/H1_CPLD_TDI)) + (pad 16 smd rect (at -4.2 -3 270) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 110 /hackrf_if/H1_CPLD_TCK)) + (pad 17 smd rect (at -3 -4.2 180) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 104 /hackrf_if/PP_CPLD_TDO)) + (pad 18 smd rect (at -2.6 -4.2 180) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 124 /hackrf_if/MCU_D7_R)) + (pad 19 smd rect (at -2.2 -4.2 180) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 123 /hackrf_if/MCU_D6_R)) + (pad 20 smd rect (at -1.8 -4.2 180) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 122 /hackrf_if/MCU_D4_R)) + (pad 21 smd rect (at -1.4 -4.2 180) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 121 /hackrf_if/MCU_D5_R)) + (pad 22 smd rect (at -1 -4.2 180) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 128 /hackrf_if/MCU_D3_R)) + (pad 23 smd rect (at -0.6 -4.2 180) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 2 +3.3V)) + (pad 24 smd rect (at -0.2 -4.2 180) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 127 /hackrf_if/MCU_D2_R)) + (pad 25 smd rect (at 0.2 -4.2 180) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 57 /hackrf_if/SW_U)) + (pad 26 smd rect (at 0.6 -4.2 180) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 126 /hackrf_if/MCU_D0_R)) + (pad 27 smd rect (at 1 -4.2 180) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 125 /hackrf_if/MCU_D1_R)) + (pad 28 smd rect (at 1.4 -4.2 180) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 52 /hackrf_if/SW_L)) + (pad 29 smd rect (at 1.8 -4.2 180) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 43 /hackrf_if/RESET#)) + (pad 30 smd rect (at 2.2 -4.2 180) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 115 /hackrf_if/MCU_LCD_RD_R)) + (pad 31 smd rect (at 2.6 -4.2 180) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 116 /hackrf_if/MCU_LCD_TE_R)) + (pad 32 smd rect (at 3 -4.2 180) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 117 /hackrf_if/MCU_IO_STBX_R)) + (pad 33 smd rect (at 4.2 -3 90) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 120 /hackrf_if/MCU_ADDR_R)) + (pad 34 smd rect (at 4.2 -2.6 90) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 42 /hackrf_if/P2_8_R)) + (pad 35 smd rect (at 4.2 -2.2 90) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 137 "Net-(U3-Pad35)")) + (pad 36 smd rect (at 4.2 -1.8 90) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 138 "Net-(U3-Pad36)")) + (pad 37 smd rect (at 4.2 -1.4 90) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 139 "Net-(U3-Pad37)")) + (pad 38 smd rect (at 4.2 -1 90) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 37 /hackrf_if/LCD_RESET#)) + (pad 39 smd rect (at 4.2 -0.6 90) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 1 +1.8V)) + (pad 40 smd rect (at 4.2 -0.2 90) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 119 /hackrf_if/MCU_LCD_WR_R)) + (pad 41 smd rect (at 4.2 0.2 90) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 1 +1.8V)) + (pad 42 smd rect (at 4.2 0.6 90) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 118 /hackrf_if/MCU_DIR_R)) + (pad 43 smd rect (at 4.2 1 90) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 38 /hackrf_if/LCD_RS)) + (pad 44 smd rect (at 4.2 1.4 90) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 36 /hackrf_if/LCD_RD#)) + (pad 45 smd rect (at 4.2 1.8 90) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 40 /hackrf_if/LCD_WR#)) + (pad 46 smd rect (at 4.2 2.2 90) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 27 /hackrf_if/LCD_DB15)) + (pad 47 smd rect (at 4.2 2.6 90) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 26 /hackrf_if/LCD_DB14)) + (pad 48 smd rect (at 4.2 3 90) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 25 /hackrf_if/LCD_DB13)) + (pad 49 smd rect (at 3 4.2) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 24 /hackrf_if/LCD_DB12)) + (pad 50 smd rect (at 2.6 4.2) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 23 /hackrf_if/LCD_DB11)) + (pad 51 smd rect (at 2.2 4.2) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 22 /hackrf_if/LCD_DB10)) + (pad 52 smd rect (at 1.8 4.2) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 35 /hackrf_if/LCD_DB9)) + (pad 53 smd rect (at 1.4 4.2) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 34 /hackrf_if/LCD_DB8)) + (pad 54 smd rect (at 1 4.2) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 33 /hackrf_if/LCD_DB7)) + (pad 55 smd rect (at 0.6 4.2) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 32 /hackrf_if/LCD_DB6)) + (pad 56 smd rect (at 0.2 4.2) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 31 /hackrf_if/LCD_DB5)) + (pad 57 smd rect (at -0.2 4.2) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 1 +1.8V)) + (pad 58 smd rect (at -0.6 4.2) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 30 /hackrf_if/LCD_DB4)) + (pad 59 smd rect (at -1 4.2) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 29 /hackrf_if/LCD_DB3)) + (pad 60 smd rect (at -1.4 4.2) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 28 /hackrf_if/LCD_DB2)) + (pad 61 smd rect (at -1.8 4.2) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 21 /hackrf_if/LCD_DB1)) + (pad 62 smd rect (at -2.2 4.2) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 20 /hackrf_if/LCD_DB0)) + (pad 63 smd rect (at -2.6 4.2) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 39 /hackrf_if/LCD_TE)) + (pad 64 smd rect (at -3 4.2) (size 1.5 0.2) (layers 4_bot B.Paste B.Mask) + (net 60 /hackrf_if/TP_R)) + (pad 65 smd rect (at -1.375 1.375 270) (size 2.75 2.75) (layers 4_bot B.Paste B.Mask) + (net 63 GND) (solder_mask_margin 0.0762) (solder_paste_margin_ratio -0.1)) + (pad 65 smd rect (at 1.375 1.375 270) (size 2.75 2.75) (layers 4_bot B.Paste B.Mask) + (net 63 GND) (solder_mask_margin 0.0762) (solder_paste_margin_ratio -0.1)) + (pad 65 smd rect (at -1.375 -1.375 270) (size 2.75 2.75) (layers 4_bot B.Paste B.Mask) + (net 63 GND) (solder_mask_margin 0.0762) (solder_paste_margin_ratio -0.1)) + (pad 65 smd rect (at 1.375 -1.375 270) (size 2.75 2.75) (layers 4_bot B.Paste B.Mask) + (net 63 GND) (solder_mask_margin 0.0762) (solder_paste_margin_ratio -0.1)) + ) + + (gr_text "Drills are in two files, one for PTH, one for NPTH." (at 20 61) (layer Dwgs.User) + (effects (font (size 1.5 1.5) (thickness 0.1)) (justify left)) + ) + (gr_text "Dimensions in inches, unless otherwise specified." (at 205 168) (layer Dwgs.User) + (effects (font (size 1.5 1.5) (thickness 0.1)) (justify left)) + ) + (gr_text "Notes, unless otherwise specified:\n\n1. Corner radii, inside: .047 min, unless otherwise stated.\n Corner radii, outside: break all sharp edges and corners.\n\n2. Tolerances:\n Warpage: .010/inch max along longest diag.\n Etching: +/-20% of master pattern.\n\n PTH hole diameter:\n < .100 +/- .003\n > .100 +/- .005\n < .016 + .003, -(hole diameter)\n NPTH hole diameter:\n < .100 +/- .002\n > .100 +/- .003\n\n Front-to-back reg: .005 max.\n (Do not use top-to-bottom pad alignment.)\n Hole plating: .001 min, .003 max.\n Hole diameters are finished sizes.\n\n3. Material: glass-epoxy resin sheet. Refer to board\n stackup for weight of Cu. 2 sides, flame-retardant.\n NEMA grade high temp FR4, TG requirement >= 170C.\n\n4. Finish: Soldermask over bare copper using LPI mask.\n Mask thickness: .0004 min, .0013 max.\n Color: Black\n\n5. Silkscreen legend to board using non-conductive,\n epoxy paint. Remove silkscreen from pads.\n Color: White\n\n6. Acceptability based on IPC-A-600 class 2 (latest revision).\n\n7. Test all boards for opens and shorts.\n\n8. No silkscreen on pads or test points.\n\n9. Do not block mask fine pitch SMD pads.\n\n10. No solder mask on fiducials.\n\n11. No solder mask may cover any gold fingers, if applicable.\n\n12. Do not use top-to-bottom pad alignment.\n Via alignment is recommended.\n\n13. Do not modify solder mask via flooding design.\n Do not modify solder mask chimney designs for test points.\n\n14. No Gerber modifications allowed without prior written\n approval, except for impedance trace width modifications\n to meet requirements, and the addition of tear drops where\n required.\n\n15. Raw material and finished PCB must be RoHS-compliant." (at 200 90) (layer Dwgs.User) + (effects (font (size 1.5 1.5) (thickness 0.1)) (justify left)) + ) + (dimension 75 (width 0.1) (layer Dwgs.User) + (gr_text "75.000 mm" (at 53.65 137.5 90) (layer Dwgs.User) + (effects (font (size 1.5 1.5) (thickness 0.1))) + ) + (feature1 (pts (xy 60 100) (xy 52.3 100))) + (feature2 (pts (xy 60 175) (xy 52.3 175))) + (crossbar (pts (xy 55 175) (xy 55 100))) + (arrow1a (pts (xy 55 100) (xy 55.586421 101.126504))) + (arrow1b (pts (xy 55 100) (xy 54.413579 101.126504))) + (arrow2a (pts (xy 55 175) (xy 55.586421 173.873496))) + (arrow2b (pts (xy 55 175) (xy 54.413579 173.873496))) + ) + (dimension 120 (width 0.1) (layer Dwgs.User) + (gr_text "120.000 mm" (at 120 93.65) (layer Dwgs.User) + (effects (font (size 1.5 1.5) (thickness 0.1))) + ) + (feature1 (pts (xy 180 100) (xy 180 92.3))) + (feature2 (pts (xy 60 100) (xy 60 92.3))) + (crossbar (pts (xy 60 95) (xy 180 95))) + (arrow1a (pts (xy 180 95) (xy 178.873496 95.586421))) + (arrow1b (pts (xy 180 95) (xy 178.873496 94.413579))) + (arrow2a (pts (xy 60 95) (xy 61.126504 95.586421))) + (arrow2b (pts (xy 60 95) (xy 61.126504 94.413579))) + ) + (gr_line (start 90.5 25) (end 101.5 25) (layer Dwgs.User) (width 0.1)) + (gr_line (start 45 25) (end 54 25) (layer Dwgs.User) (width 0.1)) + (gr_line (start 28 25) (end 33 25) (layer Dwgs.User) (width 0.1)) + (gr_line (start 20 25) (end 24 25) (layer Dwgs.User) (width 0.1)) + (gr_text "62 mil +/- 10%\nBoard Thickness" (at 107.5 41) (layer Dwgs.User) + (effects (font (size 1.5 1.5) (thickness 0.1)) (justify left)) + ) + (gr_line (start 105 49) (end 105.5 47.5) (layer Dwgs.User) (width 0.1)) + (gr_line (start 105 49) (end 104.5 47.5) (layer Dwgs.User) (width 0.1)) + (gr_line (start 105 33) (end 105.5 34.5) (layer Dwgs.User) (width 0.1)) + (gr_line (start 105 33) (end 104.5 34.5) (layer Dwgs.User) (width 0.1)) + (gr_line (start 105 33) (end 105 49) (layer Dwgs.User) (width 0.1)) + (gr_line (start 102.5 49) (end 107.5 49) (layer Dwgs.User) (width 0.1)) + (gr_line (start 102.5 33) (end 107.5 33) (layer Dwgs.User) (width 0.1)) + (gr_line (start 72.5 39.7) (end 72.5 37.7) (layer Dwgs.User) (width 0.1) (tstamp 55E38A17)) + (gr_line (start 72.5 38.7) (end 73.5 37.7) (layer Dwgs.User) (width 0.1) (tstamp 55E38A16)) + (gr_line (start 72.5 39.7) (end 74.5 37.7) (layer Dwgs.User) (width 0.1) (tstamp 55E38A15)) + (gr_line (start 73.5 39.7) (end 75.5 37.7) (layer Dwgs.User) (width 0.1) (tstamp 55E38A14)) + (gr_line (start 76.5 39.7) (end 78.5 37.7) (layer Dwgs.User) (width 0.1) (tstamp 55E38A13)) + (gr_line (start 75.5 39.7) (end 77.5 37.7) (layer Dwgs.User) (width 0.1) (tstamp 55E38A12)) + (gr_line (start 74.5 39.7) (end 76.5 37.7) (layer Dwgs.User) (width 0.1) (tstamp 55E38A11)) + (gr_line (start 72.5 39.7) (end 87.5 39.7) (layer Dwgs.User) (width 0.1) (tstamp 55E38A10)) + (gr_line (start 72.5 37.7) (end 87.5 37.7) (layer Dwgs.User) (width 0.1) (tstamp 55E38A0F)) + (gr_line (start 81.5 39.7) (end 83.5 37.7) (layer Dwgs.User) (width 0.1) (tstamp 55E38A0E)) + (gr_line (start 80.5 39.7) (end 82.5 37.7) (layer Dwgs.User) (width 0.1) (tstamp 55E38A0D)) + (gr_line (start 79.5 39.7) (end 81.5 37.7) (layer Dwgs.User) (width 0.1) (tstamp 55E38A0C)) + (gr_line (start 78.5 39.7) (end 80.5 37.7) (layer Dwgs.User) (width 0.1) (tstamp 55E38A0B)) + (gr_line (start 77.5 39.7) (end 79.5 37.7) (layer Dwgs.User) (width 0.1) (tstamp 55E38A0A)) + (gr_line (start 87.5 39.7) (end 87.5 37.7) (layer Dwgs.User) (width 0.1) (tstamp 55E38A09)) + (gr_line (start 86.5 39.7) (end 87.5 38.7) (layer Dwgs.User) (width 0.1) (tstamp 55E38A08)) + (gr_line (start 85.5 39.7) (end 87.5 37.7) (layer Dwgs.User) (width 0.1) (tstamp 55E38A07)) + (gr_line (start 84.5 39.7) (end 86.5 37.7) (layer Dwgs.User) (width 0.1) (tstamp 55E38A06)) + (gr_line (start 83.5 39.7) (end 85.5 37.7) (layer Dwgs.User) (width 0.1) (tstamp 55E38A05)) + (gr_line (start 82.5 39.7) (end 84.5 37.7) (layer Dwgs.User) (width 0.1) (tstamp 55E38A04)) + (gr_line (start 86.5 44.3) (end 87.5 43.3) (layer Dwgs.User) (width 0.1)) + (gr_line (start 85.5 44.3) (end 87.5 42.3) (layer Dwgs.User) (width 0.1)) + (gr_line (start 84.5 44.3) (end 86.5 42.3) (layer Dwgs.User) (width 0.1)) + (gr_line (start 83.5 44.3) (end 85.5 42.3) (layer Dwgs.User) (width 0.1)) + (gr_line (start 82.5 44.3) (end 84.5 42.3) (layer Dwgs.User) (width 0.1)) + (gr_line (start 81.5 44.3) (end 83.5 42.3) (layer Dwgs.User) (width 0.1)) + (gr_line (start 80.5 44.3) (end 82.5 42.3) (layer Dwgs.User) (width 0.1)) + (gr_line (start 79.5 44.3) (end 81.5 42.3) (layer Dwgs.User) (width 0.1)) + (gr_line (start 78.5 44.3) (end 80.5 42.3) (layer Dwgs.User) (width 0.1)) + (gr_line (start 77.5 44.3) (end 79.5 42.3) (layer Dwgs.User) (width 0.1)) + (gr_line (start 76.5 44.3) (end 78.5 42.3) (layer Dwgs.User) (width 0.1)) + (gr_line (start 75.5 44.3) (end 77.5 42.3) (layer Dwgs.User) (width 0.1)) + (gr_line (start 74.5 44.3) (end 76.5 42.3) (layer Dwgs.User) (width 0.1)) + (gr_line (start 73.5 44.3) (end 75.5 42.3) (layer Dwgs.User) (width 0.1)) + (gr_line (start 72.5 44.3) (end 72.5 42.3) (layer Dwgs.User) (width 0.1)) + (gr_line (start 87.5 44.3) (end 87.5 42.3) (layer Dwgs.User) (width 0.1)) + (gr_line (start 82 35.2) (end 82.5 34.7) (layer Dwgs.User) (width 0.1)) + (gr_line (start 81 35.2) (end 82.5 33.7) (layer Dwgs.User) (width 0.1)) + (gr_line (start 80 35.2) (end 81.5 33.7) (layer Dwgs.User) (width 0.1)) + (gr_line (start 79 35.2) (end 80.5 33.7) (layer Dwgs.User) (width 0.1)) + (gr_line (start 78 35.2) (end 79.5 33.7) (layer Dwgs.User) (width 0.1)) + (gr_line (start 77.5 34.7) (end 78.5 33.7) (layer Dwgs.User) (width 0.1)) + (gr_line (start 82 48.3) (end 82.5 47.8) (layer Dwgs.User) (width 0.1)) + (gr_line (start 81 48.3) (end 82.5 46.8) (layer Dwgs.User) (width 0.1)) + (gr_line (start 80 48.3) (end 81.5 46.8) (layer Dwgs.User) (width 0.1)) + (gr_line (start 79 48.3) (end 80.5 46.8) (layer Dwgs.User) (width 0.1)) + (gr_line (start 78 48.3) (end 79.5 46.8) (layer Dwgs.User) (width 0.1)) + (gr_line (start 77.5 47.8) (end 78.5 46.8) (layer Dwgs.User) (width 0.1)) + (gr_line (start 72.5 44.3) (end 74.5 42.3) (layer Dwgs.User) (width 0.1)) + (gr_line (start 72.5 43.3) (end 73.5 42.3) (layer Dwgs.User) (width 0.1)) + (gr_line (start 72.5 51.2) (end 87.5 51.2) (layer Dwgs.User) (width 0.1) (tstamp 55E38631)) + (gr_line (start 72.5 30.8) (end 87.5 30.8) (layer Dwgs.User) (width 0.1) (tstamp 55E385FB)) + (gr_line (start 72.5 49) (end 87.5 49) (layer Dwgs.User) (width 0.1) (tstamp 55E38573)) + (gr_line (start 77.5 48.3) (end 82.5 48.3) (layer Dwgs.User) (width 0.1) (tstamp 55E3856C)) + (gr_line (start 77.5 46.8) (end 77.5 48.3) (layer Dwgs.User) (width 0.1) (tstamp 55E38565)) + (gr_line (start 82.5 46.8) (end 82.5 48.3) (layer Dwgs.User) (width 0.1) (tstamp 55E38563)) + (gr_line (start 72.5 46.8) (end 87.5 46.8) (layer Dwgs.User) (width 0.1) (tstamp 55E3855C)) + (gr_line (start 72.5 44.3) (end 87.5 44.3) (layer Dwgs.User) (width 0.1) (tstamp 55E38536)) + (gr_line (start 72.5 42.3) (end 87.5 42.3) (layer Dwgs.User) (width 0.1) (tstamp 55E38531)) + (gr_line (start 72.5 33) (end 87.5 33) (layer Dwgs.User) (width 0.1) (tstamp 55E384EF)) + (gr_line (start 82.5 33.7) (end 82.5 35.2) (layer Dwgs.User) (width 0.1)) + (gr_line (start 77.5 33.7) (end 82.5 33.7) (layer Dwgs.User) (width 0.1)) + (gr_line (start 77.5 35.2) (end 77.5 33.7) (layer Dwgs.User) (width 0.1)) + (gr_line (start 72.5 35.2) (end 87.5 35.2) (layer Dwgs.User) (width 0.1)) + (gr_text "Material\n\n\nWhite\nBlack\n0.5 oz Copper + ENIG\nFR-4 TG170\n1 oz Copper\nFR-4 TG170\n1 oz Copper\nFR-4 TG170\n0.5 oz Copper + ENIG\nBlack\nWhite\n\nCenter line is finished edge\n" (at 45 40) (layer Dwgs.User) (tstamp 55E3838A) + (effects (font (size 1.5 1.5) (thickness 0.1)) (justify left)) + ) + (gr_text "Thickness\n\n\n\n0.8 mil\n1.7 mil\n8.0 mil\n1.4 mil\n\n1.4 mil\n8.0 mil\n1.7 mil\n0.8 mil\n\n\n\n" (at 90.5 40) (layer Dwgs.User) (tstamp 55E381F6) + (effects (font (size 1.5 1.5) (thickness 0.1)) (justify left)) + ) + (gr_text "Type\n\nSolder paste\nSilkscreen\nSolder mask\nSignal\nPrepreg\nPower\nCore\nPower\nPrepreg\nSignal\nSolder mask\nSilkscreen\nSolder paste\nBoard outline" (at 28 40) (layer Dwgs.User) + (effects (font (size 1.5 1.5) (thickness 0.1)) (justify left)) + ) + (gr_text "File\n\n.GTP\n.GTO\n.GTS\n.GTL\n\n.G1\n\n.G2\n\n.GBL\n.GBS\n.GBO\n.GBP\n.GKO\n" (at 20 40) (layer Dwgs.User) + (effects (font (size 1.5 1.5) (thickness 0.1)) (justify left)) + ) + (gr_text 20150901 (at 75 164 180) (layer F.SilkS) + (effects (font (size 1.524 0.762) (thickness 0.1524))) + ) + (gr_text 4 (at 76.5 139 90) (layer 4_bot) + (effects (font (size 1.016 1.016) (thickness 0.2032)) (justify mirror)) + ) + (gr_text 3 (at 76.5 138 90) (layer 3_gnd) + (effects (font (size 1.016 1.016) (thickness 0.2032)) (justify mirror)) + ) + (gr_text 2 (at 76.5 137 90) (layer 2_pwr) (tstamp 53AE501D) + (effects (font (size 1.016 1.016) (thickness 0.2032)) (justify mirror)) + ) + (gr_text 1 (at 76.5 136 90) (layer 1_top) (tstamp 53AE4FEC) + (effects (font (size 1.016 1.016) (thickness 0.2032)) (justify mirror)) + ) + (gr_line (start 60 104) (end 60 121.5) (angle 90) (layer Edge.Cuts) (width 0.381)) + (gr_line (start 60 171) (end 60 159) (angle 90) (layer Edge.Cuts) (width 0.381)) + (gr_line (start 62 157) (end 67 157) (angle 90) (layer Edge.Cuts) (width 0.381)) + (gr_line (start 68 156) (end 68 124.5) (angle 90) (layer Edge.Cuts) (width 0.381)) + (gr_line (start 62 123.5) (end 67 123.5) (angle 90) (layer Edge.Cuts) (width 0.381)) + (gr_arc (start 67 156) (end 68 156) (angle 90) (layer Edge.Cuts) (width 0.381)) + (gr_arc (start 67 124.5) (end 67 123.5) (angle 90) (layer Edge.Cuts) (width 0.381)) + (gr_arc (start 62 159) (end 60 159) (angle 90) (layer Edge.Cuts) (width 0.381)) + (gr_arc (start 62 121.5) (end 62 123.5) (angle 90) (layer Edge.Cuts) (width 0.381)) + (gr_line (start 180 171) (end 180 104) (angle 90) (layer Edge.Cuts) (width 0.381)) + (gr_line (start 176 100) (end 64 100) (angle 90) (layer Edge.Cuts) (width 0.381)) + (gr_line (start 64 175) (end 176 175) (angle 90) (layer Edge.Cuts) (width 0.381)) + (gr_arc (start 176 171) (end 180 171) (angle 90) (layer Edge.Cuts) (width 0.381)) + (gr_arc (start 176 104) (end 176 100) (angle 90) (layer Edge.Cuts) (width 0.381)) + (gr_arc (start 64 171) (end 64 175) (angle 90) (layer Edge.Cuts) (width 0.381)) + (gr_arc (start 64 104) (end 60 104) (angle 90) (layer Edge.Cuts) (width 0.381)) + (gr_line (start 87.94 126.74) (end 108.26 126.74) (layer Eco2.User) (width 0.1)) + (gr_line (start 108.26 126.74) (end 108.26 131.82) (layer Eco2.User) (width 0.1)) + (gr_line (start 108.26 131.82) (end 87.94 131.82) (layer Eco2.User) (width 0.1)) + (gr_line (start 87.94 131.82) (end 87.94 126.74) (layer Eco2.User) (width 0.1)) + + (segment (start 89.94958 132.6) (end 90.6 132.6) (width 0.4) (layer 4_bot) (net 1) (status 10)) + (via (at 90.6 132.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 1)) + (segment (start 90.6 132.6) (end 93.4 132.6) (width 0.2) (layer 4_bot) (net 1) (status 20)) + (segment (start 90.89916 125.7) (end 92 125.7) (width 0.4) (layer 4_bot) (net 1) (status 10)) + (via (at 92 125.7) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 1)) + (segment (start 90.89916 125.7) (end 90.6 125.99916) (width 0.4) (layer 4_bot) (net 1) (status 30)) + (via (at 90.6 126.9) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 1)) + (segment (start 90.6 125.99916) (end 90.6 126.9) (width 0.4) (layer 4_bot) (net 1) (tstamp 53B307A4) (status 10)) + (segment (start 90.89916 125.7) (end 90.6 125.40084) (width 0.4) (layer 4_bot) (net 1) (status 30)) + (via (at 90.6 124.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 1)) + (segment (start 90.6 125.40084) (end 90.6 124.5) (width 0.4) (layer 4_bot) (net 1) (tstamp 53B307A0) (status 10)) + (segment (start 90.89916 140.7) (end 90.6 140.99916) (width 0.4) (layer 4_bot) (net 1) (status 30)) + (via (at 90.6 141.9) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 1)) + (segment (start 90.6 140.99916) (end 90.6 141.9) (width 0.4) (layer 4_bot) (net 1) (tstamp 53B30742) (status 10)) + (segment (start 90.89916 140.7) (end 92 140.7) (width 0.4) (layer 4_bot) (net 1) (status 10)) + (via (at 92 140.7) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 1)) + (segment (start 90.89916 140.7) (end 90.6 140.40084) (width 0.4) (layer 4_bot) (net 1) (status 30)) + (via (at 90.6 139.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 1)) + (segment (start 90.6 140.40084) (end 90.6 139.5) (width 0.4) (layer 4_bot) (net 1) (tstamp 53B30737) (status 10)) + (segment (start 96.70084 144.8) (end 96.20084 145.3) (width 0.4) (layer 4_bot) (net 1) (status 30)) + (via (at 95.7 145.3) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 1)) + (segment (start 96.20084 145.3) (end 95.7 145.3) (width 0.4) (layer 4_bot) (net 1) (tstamp 53B305D4) (status 10)) + (segment (start 96.70084 144.8) (end 96.20084 144.3) (width 0.4) (layer 4_bot) (net 1) (status 30)) + (via (at 95.7 144.3) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 1)) + (segment (start 96.20084 144.3) (end 95.7 144.3) (width 0.4) (layer 4_bot) (net 1) (tstamp 53B305CD) (status 10)) + (segment (start 96.65126 146.85004) (end 96.65126 144.84958) (width 0.4) (layer 4_bot) (net 1) (status 30)) + (segment (start 96.65126 144.84958) (end 96.70084 144.8) (width 0.4) (layer 4_bot) (net 1) (tstamp 53AE1EC8) (status 30)) + (segment (start 97 126.4) (end 97 125.84958) (width 0.4) (layer 4_bot) (net 1) (status 20)) + (segment (start 97 125.84958) (end 97.2 125.64958) (width 0.4) (layer 4_bot) (net 1) (tstamp 53AB75C2) (status 30)) + (segment (start 97.4 128.6) (end 97.4 126.8) (width 0.2) (layer 4_bot) (net 1) (status 10)) + (via (at 97 126.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 1)) + (segment (start 97.4 126.8) (end 97 126.4) (width 0.2) (layer 4_bot) (net 1) (tstamp 53AB75B4)) + (segment (start 85.3 129.75) (end 84.45 129.75) (width 0.3) (layer 4_bot) (net 1) (status 10)) + (segment (start 84.45 129.75) (end 84.15 129.45) (width 0.3) (layer 4_bot) (net 1) (tstamp 53AA6CE3)) + (via (at 84.15 129.45) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 1)) + (segment (start 97 140.75042) (end 97 140) (width 0.4) (layer 4_bot) (net 1) (status 10)) + (segment (start 97.4 139.6) (end 97.4 137) (width 0.2) (layer 4_bot) (net 1) (status 20)) + (via (at 97 140) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 1)) + (segment (start 97.4 139.6) (end 97 140) (width 0.2) (layer 4_bot) (net 1) (tstamp 53AA6BB0)) + (segment (start 98.6 140.75042) (end 98.6 140) (width 0.4) (layer 4_bot) (net 1) (status 10)) + (segment (start 98.2 139.6) (end 98.6 140) (width 0.2) (layer 4_bot) (net 1) (tstamp 53AA6BFB)) + (via (at 98.6 140) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 1)) + (segment (start 98.2 139.6) (end 98.2 137) (width 0.2) (layer 4_bot) (net 1) (status 20)) + (segment (start 126.23 155.95) (end 126.23 156.98) (width 0.4) (layer 4_bot) (net 2)) + (via (at 126.25 157) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 126.23 156.98) (end 126.25 157) (width 0.4) (layer 4_bot) (net 2) (tstamp 53F39EBA)) + (segment (start 126.23 155.95) (end 128.4 155.95) (width 0.4) (layer 4_bot) (net 2)) + (via (at 128.4 155.95) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 126.23 155.95) (end 126.23 154.92) (width 0.4) (layer 4_bot) (net 2)) + (via (at 126.25 154.9) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 126.23 154.92) (end 126.25 154.9) (width 0.4) (layer 4_bot) (net 2) (tstamp 53F39EB2)) + (segment (start 174.49 153.41) (end 174.5 153.42) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (via (at 174.5 154.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 174.5 153.42) (end 174.5 154.5) (width 0.4) (layer 4_bot) (net 2) (tstamp 53F39D02) (status 10)) + (segment (start 174.49 153.41) (end 174.5 153.4) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (segment (start 174.5 153.4) (end 176.7 153.4) (width 0.4) (layer 4_bot) (net 2) (tstamp 53F39CFE) (status 10)) + (via (at 176.7 153.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (via (at 174.5 152.3) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 174.5 153.4) (end 174.5 152.3) (width 0.4) (layer 4_bot) (net 2) (tstamp 53F39CFA) (status 10)) + (segment (start 155.25 162.11) (end 156.39 162.11) (width 0.4) (layer 4_bot) (net 2) (status 10)) + (via (at 156.4 162.1) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 156.39 162.11) (end 156.4 162.1) (width 0.4) (layer 4_bot) (net 2) (tstamp 53F39C36)) + (segment (start 155.25 162.11) (end 154.11 162.11) (width 0.4) (layer 4_bot) (net 2) (status 10)) + (via (at 154.1 162.1) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 154.11 162.11) (end 154.1 162.1) (width 0.4) (layer 4_bot) (net 2) (tstamp 53F39C32)) + (segment (start 155.25 162.11) (end 155.25 159.95) (width 0.4) (layer 4_bot) (net 2) (status 10)) + (via (at 155.2 159.9) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 155.25 159.95) (end 155.2 159.9) (width 0.4) (layer 4_bot) (net 2) (tstamp 53F39C2E)) + (segment (start 85.3 146.75) (end 84.15 146.75) (width 0.3) (layer 4_bot) (net 2) (status 10)) + (via (at 84.15 146.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 64.075 115.375) (end 64.1 115.4) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (via (at 65 115.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 64.1 115.4) (end 65 115.4) (width 0.4) (layer 4_bot) (net 2) (tstamp 53BC7166) (status 10)) + (segment (start 64.075 115.375) (end 64.05 115.4) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (via (at 63.1 115.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 64.05 115.4) (end 63.1 115.4) (width 0.4) (layer 4_bot) (net 2) (tstamp 53BC7164) (status 10)) + (segment (start 97.89916 121.3) (end 99 121.3) (width 0.4) (layer 4_bot) (net 2) (status 10)) + (via (at 99 121.3) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 97.89916 121.3) (end 97.6 121.59916) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (via (at 97.6 122.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 97.6 121.59916) (end 97.6 122.5) (width 0.4) (layer 4_bot) (net 2) (tstamp 53B3081C) (status 10)) + (segment (start 97.89916 121.3) (end 97.6 121.00084) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (via (at 97.6 120.1) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 97.6 121.00084) (end 97.6 120.1) (width 0.4) (layer 4_bot) (net 2) (tstamp 53B30818) (status 10)) + (segment (start 99.34874 148.74996) (end 99.4 148.80122) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (via (at 99.4 149.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 99.4 148.80122) (end 99.4 149.5) (width 0.4) (layer 4_bot) (net 2) (tstamp 53B30626) (status 10)) + (segment (start 99.34874 146.85004) (end 99.39954 146.90084) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (segment (start 99.39954 146.90084) (end 101.4 146.90084) (width 0.4) (layer 4_bot) (net 2) (tstamp 53B3060D) (status 30)) + (segment (start 101.4 146.90084) (end 101.69916 147.2) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (via (at 102.6 147.2) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 101.69916 147.2) (end 102.6 147.2) (width 0.4) (layer 4_bot) (net 2) (tstamp 53B30601) (status 10)) + (segment (start 101.4 146.90084) (end 101.4 145.9) (width 0.4) (layer 4_bot) (net 2) (status 10)) + (via (at 101.4 145.9) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 124.39916 158.9) (end 124.1 159.19916) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (via (at 124.1 160.1) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 124.1 159.19916) (end 124.1 160.1) (width 0.4) (layer 4_bot) (net 2) (tstamp 53B304F6) (status 10)) + (segment (start 124.39916 158.9) (end 125.5 158.9) (width 0.4) (layer 4_bot) (net 2) (status 10)) + (via (at 125.5 158.9) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 124.39916 158.9) (end 124.1 158.60084) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (via (at 124.1 157.7) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 124.1 158.60084) (end 124.1 157.7) (width 0.4) (layer 4_bot) (net 2) (tstamp 53B304EC) (status 10)) + (segment (start 75.30084 123.2) (end 75.6 123.49916) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (via (at 75.6 124.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 75.6 123.49916) (end 75.6 124.4) (width 0.4) (layer 4_bot) (net 2) (tstamp 53B30349) (status 10)) + (segment (start 75.30084 123.2) (end 75.6 122.90084) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (via (at 75.6 122) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 75.6 122.90084) (end 75.6 122) (width 0.4) (layer 4_bot) (net 2) (tstamp 53B30345) (status 10)) + (segment (start 165.2 153.50084) (end 165.2 152.4) (width 0.4) (layer 4_bot) (net 2) (status 10)) + (via (at 165.2 152.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 165.2 153.50084) (end 165.49916 153.8) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (via (at 166.4 153.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 165.49916 153.8) (end 166.4 153.8) (width 0.4) (layer 4_bot) (net 2) (tstamp 53B195B1) (status 10)) + (segment (start 165.2 153.50084) (end 164.90084 153.8) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (via (at 164 153.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 164.90084 153.8) (end 164 153.8) (width 0.4) (layer 4_bot) (net 2) (tstamp 53B195AD) (status 10)) + (segment (start 154.30084 157.8) (end 153.1 157.8) (width 0.4) (layer 4_bot) (net 2) (status 10)) + (via (at 153.1 157.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 154.30084 157.8) (end 154.6 157.50084) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (via (at 154.6 156.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 154.6 157.50084) (end 154.6 156.5) (width 0.4) (layer 4_bot) (net 2) (tstamp 53B193C8) (status 10)) + (segment (start 154.30084 157.8) (end 154.6 158.09916) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (via (at 154.6 159.1) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 154.6 158.09916) (end 154.6 159.1) (width 0.4) (layer 4_bot) (net 2) (tstamp 53B193B8) (status 10)) + (segment (start 105.55042 132.2) (end 104.8 132.2) (width 0.4) (layer 4_bot) (net 2) (status 10)) + (via (at 104.8 132.2) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 104.8 132.2) (end 102.4 132.2) (width 0.2) (layer 4_bot) (net 2) (status 20)) + (segment (start 71.75042 122.8) (end 71.75042 123.54958) (width 0.4) (layer 4_bot) (net 2) (status 10)) + (via (at 71.7 123.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 71.75042 123.54958) (end 71.7 123.6) (width 0.4) (layer 4_bot) (net 2) (tstamp 53AE3577)) + (segment (start 71.75042 122.8) (end 71.75042 122.05042) (width 0.4) (layer 4_bot) (net 2) (status 10)) + (via (at 71.7 122) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 71.75042 122.05042) (end 71.7 122) (width 0.4) (layer 4_bot) (net 2) (tstamp 53AE3563)) + (segment (start 71.75042 122.8) (end 70.9 122.8) (width 0.4) (layer 4_bot) (net 2) (status 10)) + (via (at 70.9 122.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 75.30084 123.2) (end 74.2 123.2) (width 0.4) (layer 4_bot) (net 2) (status 10)) + (via (at 74.2 123.2) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 96 125.64958) (end 96 126.4) (width 0.4) (layer 4_bot) (net 2) (status 10)) + (segment (start 96.6 127) (end 96.6 128.6) (width 0.2) (layer 4_bot) (net 2) (status 20)) + (via (at 96 126.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 96.6 127) (end 96 126.4) (width 0.2) (layer 4_bot) (net 2) (tstamp 53AB759B)) + (segment (start 85.3 145.75) (end 84.15 145.75) (width 0.3) (layer 4_bot) (net 2) (status 10)) + (via (at 84.15 145.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 135.89916 122) (end 137 122) (width 0.4) (layer 4_bot) (net 2) (status 10)) + (via (at 137 122) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 135.89916 122) (end 135.6 121.70084) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (via (at 135.6 120.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 135.6 121.70084) (end 135.6 120.8) (width 0.4) (layer 4_bot) (net 2) (tstamp 53B30424) (status 10)) + (segment (start 133.15042 119.8) (end 133 119.64958) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (via (at 133 119) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 133 119.64958) (end 133 119) (width 0.4) (layer 4_bot) (net 2) (tstamp 53B3041C) (status 10)) + (segment (start 142.44958 119.8) (end 142.4 119.75042) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (via (at 142.4 119) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 142.4 119.75042) (end 142.4 119) (width 0.4) (layer 4_bot) (net 2) (tstamp 53B30401) (status 10)) + (segment (start 144.6 117.49916) (end 144.30084 117.2) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (via (at 143.4 117.2) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 144.30084 117.2) (end 143.4 117.2) (width 0.4) (layer 4_bot) (net 2) (tstamp 53B303F7) (status 10)) + (segment (start 144.6 117.49916) (end 144.89916 117.2) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (via (at 145.8 117.2) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 144.89916 117.2) (end 145.8 117.2) (width 0.4) (layer 4_bot) (net 2) (tstamp 53B303F3) (status 10)) + (segment (start 144.6 110.50084) (end 144.30084 110.8) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (via (at 143.4 110.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 144.30084 110.8) (end 143.4 110.8) (width 0.4) (layer 4_bot) (net 2) (tstamp 53B303DF) (status 10)) + (segment (start 144.6 110.50084) (end 144.89916 110.8) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (via (at 145.8 110.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 144.89916 110.8) (end 145.8 110.8) (width 0.4) (layer 4_bot) (net 2) (tstamp 53B303DB) (status 10)) + (segment (start 141.55042 108.2) (end 141.4 108.35042) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (via (at 141.4 109) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 141.4 108.35042) (end 141.4 109) (width 0.4) (layer 4_bot) (net 2) (tstamp 53B303D0) (status 10)) + (segment (start 130.2 117.49916) (end 130.49916 117.2) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (via (at 131.4 117.2) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 130.49916 117.2) (end 131.4 117.2) (width 0.4) (layer 4_bot) (net 2) (tstamp 53B2F3E6) (status 10)) + (segment (start 130.2 117.49916) (end 129.90084 117.2) (width 0.4) (layer 4_bot) (net 2) (status 30)) + (via (at 129 117.2) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 129.90084 117.2) (end 129 117.2) (width 0.4) (layer 4_bot) (net 2) (tstamp 53B2F3E0) (status 10)) + (segment (start 130.2 117.49916) (end 130.2 118.6) (width 0.4) (layer 4_bot) (net 2) (status 10)) + (via (at 130.2 118.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 137.07488 117.50012) (end 137.07488 118.97488) (width 0.4) (layer 4_bot) (net 2) (status 10)) + (segment (start 137.07488 118.97488) (end 137.1 119) (width 0.4) (layer 4_bot) (net 2) (tstamp 53AE215A)) + (via (at 137.1 119) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 137.04958 119.05042) (end 137.04958 119.8) (width 0.4) (layer 4_bot) (net 2) (status 20)) + (segment (start 137.04958 119.05042) (end 137.1 119) (width 0.4) (layer 4_bot) (net 2) (tstamp 53ADF367)) + (via (at 141 112) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (via (at 132.4 117.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (via (at 142.4 117.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 2)) + (segment (start 140.97378 110.49988) (end 140.97378 111.97378) (width 0.4) (layer 4_bot) (net 2) (status 10)) + (segment (start 140.97378 111.97378) (end 141 112) (width 0.4) (layer 4_bot) (net 2) (tstamp 53ADF184)) + (segment (start 133.17598 117.50012) (end 132.40012 117.50012) (width 0.4) (layer 4_bot) (net 2) (status 10)) + (segment (start 132.40012 117.50012) (end 132.4 117.5) (width 0.4) (layer 4_bot) (net 2) (tstamp 53ADF172)) + (segment (start 141.62402 117.50012) (end 142.39988 117.50012) (width 0.4) (layer 4_bot) (net 2) (status 10)) + (segment (start 142.39988 117.50012) (end 142.4 117.5) (width 0.4) (layer 4_bot) (net 2) (tstamp 53ADF16E)) + (segment (start 148 159.35) (end 148 161.7) (width 0.2) (layer 4_bot) (net 3) (status 30)) + (segment (start 147.6 162.1) (end 147.63 162.11) (width 0.2) (layer 4_bot) (net 3) (tstamp 53F39CA0) (status 30)) + (segment (start 148 161.7) (end 147.6 162.1) (width 0.2) (layer 4_bot) (net 3) (tstamp 53F39C9F) (status 30)) + (segment (start 140 112) (end 140 114.5) (width 0.2) (layer 1_top) (net 4)) + (segment (start 140 114.5) (end 138.9 115.6) (width 0.2) (layer 1_top) (net 4) (tstamp 53AE06E3)) + (segment (start 147.1 156.5) (end 142.8 152.2) (width 0.2) (layer 1_top) (net 4)) + (segment (start 148 157.65) (end 147.35 157.65) (width 0.2) (layer 4_bot) (net 4) (status 10)) + (via (at 147.1 156.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 4)) + (segment (start 147.1 157.4) (end 147.1 156.5) (width 0.2) (layer 4_bot) (net 4) (tstamp 53ADE1E0)) + (segment (start 147.35 157.65) (end 147.1 157.4) (width 0.2) (layer 4_bot) (net 4) (tstamp 53ADE1D6)) + (segment (start 139.67584 111.67584) (end 140 112) (width 0.2) (layer 4_bot) (net 4) (tstamp 53AE03F8)) + (via (at 140 112) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 4)) + (segment (start 138.9 115.6) (end 138.9 122.6) (width 0.2) (layer 1_top) (net 4) (tstamp 53AE06F0)) + (segment (start 139.67584 111.67584) (end 139.67584 110.49988) (width 0.2) (layer 4_bot) (net 4) (status 20)) + (segment (start 142.8 126.5) (end 138.9 122.6) (width 0.2) (layer 1_top) (net 4) (tstamp 53AE0612)) + (segment (start 142.8 152.2) (end 142.8 126.5) (width 0.2) (layer 1_top) (net 4) (tstamp 53AE060C)) + (segment (start 138.37536 117.50012) (end 138.37536 119.97526) (width 0.2) (layer 4_bot) (net 5) (status 30)) + (segment (start 138.37536 119.97526) (end 138.5 120.0999) (width 0.2) (layer 4_bot) (net 5) (tstamp 53AE2A50) (status 30)) + (segment (start 148.9 159.35) (end 148.9 164.1) (width 0.2) (layer 4_bot) (net 6) (status 10)) + (segment (start 150.17 165.37) (end 150.17 167.365) (width 0.2) (layer 4_bot) (net 6) (tstamp 53ACCBE6) (status 20)) + (segment (start 148.9 164.1) (end 150.17 165.37) (width 0.2) (layer 4_bot) (net 6) (tstamp 53ACCBE4)) + (segment (start 140.3 116) (end 139.5 116.8) (width 0.2) (layer 1_top) (net 7)) + (segment (start 139.5 116.8) (end 139.5 122.1) (width 0.2) (layer 1_top) (net 7) (tstamp 53AE08D2)) + (segment (start 140.32608 117.50012) (end 140.32608 116.02608) (width 0.2) (layer 4_bot) (net 7) (status 10)) + (via (at 140.3 116) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 7)) + (segment (start 140.32608 116.02608) (end 140.3 116) (width 0.2) (layer 4_bot) (net 7) (tstamp 53AE0508)) + (segment (start 145.8 153.8) (end 148.5 156.5) (width 0.2) (layer 1_top) (net 7) (tstamp 53AE0607)) + (segment (start 145.8 128.4) (end 145.8 153.8) (width 0.2) (layer 1_top) (net 7) (tstamp 53AE0601)) + (segment (start 139.5 122.1) (end 145.8 128.4) (width 0.2) (layer 1_top) (net 7) (tstamp 53AE05FC)) + (segment (start 148.5 156.5) (end 148.5 156.4) (width 0.2) (layer 1_top) (net 7)) + (segment (start 148.9 156.9) (end 148.5 156.5) (width 0.2) (layer 4_bot) (net 7) (tstamp 53ACCC06)) + (via (at 148.5 156.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 7)) + (segment (start 148.9 157.65) (end 148.9 156.9) (width 0.2) (layer 4_bot) (net 7) (status 10)) + (segment (start 150.6 159.35) (end 152.05 159.35) (width 0.2) (layer 4_bot) (net 8) (status 10)) + (segment (start 152.71 160.01) (end 152.71 162.315) (width 0.2) (layer 4_bot) (net 8) (tstamp 53ACCBF5) (status 20)) + (segment (start 152.05 159.35) (end 152.71 160.01) (width 0.2) (layer 4_bot) (net 8) (tstamp 53ACCBF3)) + (segment (start 140.3 119.3) (end 141.6 120.6) (width 0.2) (layer 1_top) (net 9)) + (segment (start 151.25 157.65) (end 151.5 157.4) (width 0.2) (layer 4_bot) (net 9) (tstamp 53ADE1E6)) + (segment (start 151.5 157.4) (end 151.5 156.5) (width 0.2) (layer 4_bot) (net 9) (tstamp 53ADE1EA)) + (via (at 151.5 156.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 9)) + (segment (start 150.6 157.65) (end 151.25 157.65) (width 0.2) (layer 4_bot) (net 9) (status 10)) + (segment (start 139.67584 118.67584) (end 139.67584 117.50012) (width 0.2) (layer 4_bot) (net 9) (status 20)) + (via (at 140.3 119.3) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 9)) + (segment (start 139.67584 118.67584) (end 140.3 119.3) (width 0.2) (layer 4_bot) (net 9) (tstamp 53AE0538)) + (segment (start 153.2 154.8) (end 153.2 133.6) (width 0.2) (layer 1_top) (net 9) (tstamp 53AE081F)) + (segment (start 151.5 156.5) (end 153.2 154.8) (width 0.2) (layer 1_top) (net 9)) + (segment (start 141.6 122) (end 153.2 133.6) (width 0.2) (layer 1_top) (net 9) (tstamp 53AE084D)) + (segment (start 141.6 120.6) (end 141.6 122) (width 0.2) (layer 1_top) (net 9) (tstamp 53AE0849)) + (segment (start 149.7 159.35) (end 149.7 160.1) (width 0.2) (layer 4_bot) (net 10) (status 10)) + (segment (start 150.2 162.1) (end 150.17 162.11) (width 0.2) (layer 4_bot) (net 10) (tstamp 53F39C9D) (status 30)) + (segment (start 149.8 161.7) (end 150.2 162.1) (width 0.2) (layer 4_bot) (net 10) (tstamp 53F39C9C) (status 30)) + (segment (start 149.8 160.2) (end 149.8 161.7) (width 0.2) (layer 4_bot) (net 10) (tstamp 53F39C9B) (status 20)) + (segment (start 149.7 160.1) (end 149.8 160.2) (width 0.2) (layer 4_bot) (net 10) (tstamp 53F39C9A)) + (segment (start 149 155.4) (end 149 141.8) (width 0.2) (layer 1_top) (net 11)) + (segment (start 149 141.8) (end 146.4 139.2) (width 0.2) (layer 1_top) (net 11) (tstamp 53AE0866)) + (segment (start 150.1 156.5) (end 149 155.4) (width 0.2) (layer 1_top) (net 11)) + (segment (start 139.0256 119.0256) (end 139.0256 117.50012) (width 0.2) (layer 4_bot) (net 11) (status 20)) + (via (at 140.3 120.3) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 11)) + (segment (start 139.0256 119.0256) (end 140.3 120.3) (width 0.2) (layer 4_bot) (net 11) (tstamp 53AE054B)) + (segment (start 140.3 121.8) (end 140.3 120.3) (width 0.2) (layer 1_top) (net 11)) + (segment (start 146.4 127.9) (end 140.3 121.8) (width 0.2) (layer 1_top) (net 11) (tstamp 53AE05F4)) + (segment (start 146.4 139.2) (end 146.4 127.9) (width 0.2) (layer 1_top) (net 11) (tstamp 53AE0870)) + (segment (start 137.72512 117.50012) (end 137.72512 116.27488) (width 0.2) (layer 4_bot) (net 11) (status 10)) + (segment (start 137.72512 116.27488) (end 138 116) (width 0.2) (layer 4_bot) (net 11) (tstamp 53AE0542)) + (segment (start 138 116) (end 138.7 116) (width 0.2) (layer 4_bot) (net 11) (tstamp 53AE0543)) + (segment (start 138.7 116) (end 139.0256 116.3256) (width 0.2) (layer 4_bot) (net 11) (tstamp 53AE0544)) + (segment (start 139.0256 116.3256) (end 139.0256 117.50012) (width 0.2) (layer 4_bot) (net 11) (tstamp 53AE0548) (status 20)) + (segment (start 150.1 156.5) (end 150.1 156.4) (width 0.2) (layer 1_top) (net 11) (tstamp 53AE05F0)) + (segment (start 149.7 156.9) (end 150.1 156.5) (width 0.2) (layer 4_bot) (net 11) (tstamp 53ACCC13)) + (via (at 150.1 156.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 11)) + (segment (start 149.7 157.65) (end 149.7 156.9) (width 0.2) (layer 4_bot) (net 11) (status 10)) + (segment (start 151.0504 120) (end 149.8 120) (width 0.4) (layer 4_bot) (net 12) (status 30)) + (segment (start 148.5 116.7) (end 146.2 114.4) (width 0.4) (layer 4_bot) (net 12) (tstamp 53AE0081)) + (segment (start 146.2 114.4) (end 137.5 114.4) (width 0.4) (layer 4_bot) (net 12) (tstamp 53AE004D)) + (segment (start 137.5 114.4) (end 136.42464 115.47536) (width 0.4) (layer 4_bot) (net 12) (tstamp 53AE0050)) + (segment (start 136.42464 115.47536) (end 136.42464 117.50012) (width 0.4) (layer 4_bot) (net 12) (tstamp 53AE0052) (status 20)) + (segment (start 149.8 120) (end 148.5 118.7) (width 0.4) (layer 4_bot) (net 12) (tstamp 53AE0078) (status 10)) + (segment (start 148.5 118.7) (end 148.5 116.7) (width 0.4) (layer 4_bot) (net 12) (tstamp 53AE007C)) + (segment (start 135.5999 104.4) (end 135.5999 106.10094) (width 0.4) (layer 4_bot) (net 13) (status 30)) + (segment (start 135.5999 106.10094) (end 135.30084 106.4) (width 0.4) (layer 4_bot) (net 13) (tstamp 53AE01C9) (status 30)) + (segment (start 135.30084 106.4) (end 134.95042 106.75042) (width 0.4) (layer 4_bot) (net 13) (status 30)) + (segment (start 134.95042 106.75042) (end 134.95042 108.2) (width 0.4) (layer 4_bot) (net 13) (tstamp 53ADF19E) (status 30)) + (segment (start 134.95042 108.2) (end 134.47392 108.6765) (width 0.4) (layer 4_bot) (net 13) (status 10)) + (segment (start 134.47392 108.6765) (end 134.47392 110.49988) (width 0.4) (layer 4_bot) (net 13) (tstamp 53ADF192) (status 20)) + (segment (start 135.12416 110.49988) (end 135.12416 109.27584) (width 0.2) (layer 4_bot) (net 14) (status 10)) + (segment (start 137.7999 109) (end 138.5999 108.2) (width 0.2) (layer 4_bot) (net 14) (tstamp 53ADF668) (status 20)) + (segment (start 135.4 109) (end 137.7999 109) (width 0.2) (layer 4_bot) (net 14) (tstamp 53ADF667)) + (segment (start 135.12416 109.27584) (end 135.4 109) (width 0.2) (layer 4_bot) (net 14) (tstamp 53ADF664)) + (segment (start 151.0504 110) (end 149.8 110) (width 0.4) (layer 4_bot) (net 15) (status 30)) + (segment (start 149.8 110) (end 146.1 113.7) (width 0.4) (layer 4_bot) (net 15) (tstamp 53AE006E) (status 10)) + (segment (start 137.3 113.7) (end 135.7744 115.2256) (width 0.4) (layer 4_bot) (net 15) (tstamp 53AE0022)) + (segment (start 146.1 113.7) (end 137.3 113.7) (width 0.4) (layer 4_bot) (net 15) (tstamp 53AE0075)) + (segment (start 135.7744 117.50012) (end 135.7744 115.2256) (width 0.4) (layer 4_bot) (net 15) (status 10)) + (segment (start 138.8 166.8) (end 139.4 166.8) (width 0.2) (layer 1_top) (net 16)) + (segment (start 140.3 165.9) (end 140.3 146.2) (width 0.2) (layer 1_top) (net 16) (tstamp 53F39016)) + (segment (start 139.4 166.8) (end 140.3 165.9) (width 0.2) (layer 1_top) (net 16) (tstamp 53F39015)) + (segment (start 138.235 167.365) (end 138.8 166.8) (width 0.2) (layer 4_bot) (net 16) (tstamp 53ADEF58)) + (segment (start 137.47 167.365) (end 138.235 167.365) (width 0.2) (layer 4_bot) (net 16) (status 10)) + (segment (start 138.3 114.4) (end 138.3 123.1) (width 0.2) (layer 1_top) (net 16)) + (segment (start 138.9 144.8) (end 140.3 146.2) (width 0.2) (layer 1_top) (net 16) (tstamp 53AE075D)) + (segment (start 138.9 130.3) (end 138.9 144.8) (width 0.2) (layer 1_top) (net 16) (tstamp 53AE075B)) + (segment (start 140.5 128.7) (end 138.9 130.3) (width 0.2) (layer 1_top) (net 16) (tstamp 53AE0759)) + (segment (start 140.5 125.3) (end 140.5 128.7) (width 0.2) (layer 1_top) (net 16) (tstamp 53AE0757)) + (segment (start 138.3 123.1) (end 140.5 125.3) (width 0.2) (layer 1_top) (net 16) (tstamp 53AE0749)) + (segment (start 139.0256 110.49988) (end 139.0256 111.9256) (width 0.2) (layer 4_bot) (net 16) (status 10)) + (segment (start 139.1 113.6) (end 138.3 114.4) (width 0.2) (layer 1_top) (net 16) (tstamp 53AE0714)) + (segment (start 139.1 112) (end 139.1 113.6) (width 0.2) (layer 1_top) (net 16) (tstamp 53AE0713)) + (via (at 139.1 112) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 16)) + (segment (start 139.0256 111.9256) (end 139.1 112) (width 0.2) (layer 4_bot) (net 16) (tstamp 53AE0703)) + (via (at 138.8 166.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 16)) + (segment (start 138.8 167.8) (end 137.1 166.1) (width 0.2) (layer 1_top) (net 17)) + (segment (start 137.1 164.2) (end 139.6 161.7) (width 0.2) (layer 1_top) (net 17) (tstamp 53F3900F)) + (segment (start 137.1 166.1) (end 137.1 164.2) (width 0.2) (layer 1_top) (net 17) (tstamp 53F3900D)) + (segment (start 139.235 167.365) (end 140.01 167.365) (width 0.2) (layer 4_bot) (net 17) (status 20)) + (segment (start 139.235 167.365) (end 138.8 167.8) (width 0.2) (layer 4_bot) (net 17) (tstamp 53ADEF53)) + (segment (start 137.9 144.9) (end 137.9 130.1) (width 0.2) (layer 1_top) (net 17)) + (segment (start 139.6 146.6) (end 139.6 161.7) (width 0.2) (layer 1_top) (net 17) (tstamp 53AE07E2)) + (segment (start 137.9 144.9) (end 139.6 146.6) (width 0.2) (layer 1_top) (net 17) (tstamp 53AE2494)) + (segment (start 138.37536 112.32464) (end 137.8 112.9) (width 0.2) (layer 4_bot) (net 17) (tstamp 53AE08FF)) + (via (at 137.8 112.9) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 17)) + (segment (start 138.37536 110.49988) (end 138.37536 112.32464) (width 0.2) (layer 4_bot) (net 17) (status 10)) + (segment (start 137.9 130.1) (end 139.7 128.3) (width 0.2) (layer 1_top) (net 17) (tstamp 53AE2496)) + (segment (start 139.7 128.3) (end 139.7 125.6) (width 0.2) (layer 1_top) (net 17) (tstamp 53AE249C)) + (segment (start 139.7 125.6) (end 137.8 123.7) (width 0.2) (layer 1_top) (net 17) (tstamp 53AE249F)) + (segment (start 137.8 123.7) (end 137.8 112.9) (width 0.2) (layer 1_top) (net 17) (tstamp 53AE24A3)) + (via (at 138.8 167.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 17)) + (segment (start 133.82622 110.49988) (end 133.82622 109.22622) (width 0.4) (layer 4_bot) (net 18) (status 10)) + (segment (start 133.64958 109.04958) (end 133.64958 108.6) (width 0.4) (layer 4_bot) (net 18) (tstamp 53B303A3) (status 20)) + (segment (start 133.82622 109.22622) (end 133.64958 109.04958) (width 0.4) (layer 4_bot) (net 18) (tstamp 53B303A2)) + (segment (start 133.29916 106.8) (end 133.64958 107.15042) (width 0.4) (layer 4_bot) (net 18) (status 30)) + (segment (start 133.64958 107.15042) (end 133.64958 108.6) (width 0.4) (layer 4_bot) (net 18) (tstamp 53ADF19C) (status 30)) + (segment (start 94.6 147.4999) (end 94.6 142.8) (width 0.2) (layer 4_bot) (net 19) (status 10)) + (segment (start 95.8 127.2) (end 95.8 128.6) (width 0.2) (layer 4_bot) (net 19) (tstamp 53C5B96D) (status 20)) + (segment (start 95 126.4) (end 95.8 127.2) (width 0.2) (layer 4_bot) (net 19) (tstamp 53C5B96C)) + (segment (start 95 125.8) (end 95 126.4) (width 0.2) (layer 4_bot) (net 19) (tstamp 53C5B96B)) + (via (at 95 125.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 19)) + (segment (start 93 125.8) (end 95 125.8) (width 0.2) (layer 1_top) (net 19) (tstamp 53C5B968)) + (segment (start 92 126.8) (end 93 125.8) (width 0.2) (layer 1_top) (net 19) (tstamp 53C5B966)) + (segment (start 92 129) (end 92 126.8) (width 0.2) (layer 1_top) (net 19) (tstamp 53C5B964)) + (segment (start 94.6 131.6) (end 92 129) (width 0.2) (layer 1_top) (net 19) (tstamp 53C5B962)) + (segment (start 94.6 142.8) (end 94.6 131.6) (width 0.2) (layer 1_top) (net 19) (tstamp 53C5B961)) + (via (at 94.6 142.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 19)) + (segment (start 94.6 147.4999) (end 92.7999 147.4999) (width 0.2) (layer 4_bot) (net 19) (status 30)) + (segment (start 92.75 147.45) (end 92.75062 147.45004) (width 0.2) (layer 4_bot) (net 19) (tstamp 53C5B959) (status 30)) + (segment (start 92.7999 147.4999) (end 92.75 147.45) (width 0.2) (layer 4_bot) (net 19) (tstamp 53C5B958) (status 30)) + (segment (start 93.4 130.6) (end 92 130.6) (width 0.2) (layer 4_bot) (net 20) (status 10)) + (segment (start 86.15 131.25) (end 85.3 131.25) (width 0.2) (layer 4_bot) (net 20) (tstamp 53AA68F1) (status 20)) + (segment (start 87.198002 130.201998) (end 86.15 131.25) (width 0.2) (layer 4_bot) (net 20) (tstamp 53AA68EF)) + (segment (start 91.601998 130.201998) (end 87.198002 130.201998) (width 0.2) (layer 4_bot) (net 20) (tstamp 53AA68EE)) + (segment (start 92 130.6) (end 91.601998 130.201998) (width 0.2) (layer 4_bot) (net 20) (tstamp 53AA68ED)) + (segment (start 93.4 131) (end 91.8 131) (width 0.2) (layer 4_bot) (net 21) (status 10)) + (segment (start 86.25 131.75) (end 85.3 131.75) (width 0.2) (layer 4_bot) (net 21) (tstamp 53AA68EA) (status 20)) + (segment (start 87.4 130.6) (end 86.25 131.75) (width 0.2) (layer 4_bot) (net 21) (tstamp 53AA68E8)) + (segment (start 91.4 130.6) (end 87.4 130.6) (width 0.2) (layer 4_bot) (net 21) (tstamp 53AA68E7)) + (segment (start 91.8 131) (end 91.4 130.6) (width 0.2) (layer 4_bot) (net 21) (tstamp 53AA68E6)) + (segment (start 93.4 135) (end 92.2 135) (width 0.2) (layer 4_bot) (net 22) (status 10)) + (segment (start 90.95 136.25) (end 85.3 136.25) (width 0.2) (layer 4_bot) (net 22) (tstamp 53AA6AE9) (status 20)) + (segment (start 92.2 135) (end 90.95 136.25) (width 0.2) (layer 4_bot) (net 22) (tstamp 53AA6AE7)) + (segment (start 93.4 135.4) (end 92.4 135.4) (width 0.2) (layer 4_bot) (net 23) (status 10)) + (segment (start 91.05 136.75) (end 85.3 136.75) (width 0.2) (layer 4_bot) (net 23) (tstamp 53AA6B4A) (status 20)) + (segment (start 92.4 135.4) (end 91.05 136.75) (width 0.2) (layer 4_bot) (net 23) (tstamp 53AA6B48)) + (segment (start 93.4 135.8) (end 93.4 136.2) (width 0.2) (layer 4_bot) (net 24) (status 10)) + (segment (start 92.35 137.25) (end 85.3 137.25) (width 0.2) (layer 4_bot) (net 24) (tstamp 53AA6B4E) (status 20)) + (segment (start 93.4 136.2) (end 92.35 137.25) (width 0.2) (layer 4_bot) (net 24) (tstamp 53AA6B4D)) + (segment (start 85.3 137.75) (end 93.45 137.75) (width 0.2) (layer 4_bot) (net 25) (status 10)) + (segment (start 94.2 137) (end 94.6 137) (width 0.2) (layer 4_bot) (net 25) (tstamp 53AA6B55) (status 20)) + (segment (start 93.45 137.75) (end 94.2 137) (width 0.2) (layer 4_bot) (net 25) (tstamp 53AA6B53)) + (segment (start 85.3 138.25) (end 94.75 138.25) (width 0.2) (layer 4_bot) (net 26) (status 10)) + (segment (start 95 138) (end 95 137) (width 0.2) (layer 4_bot) (net 26) (tstamp 53AA6B58) (status 20)) + (segment (start 94.75 138.25) (end 95 138) (width 0.2) (layer 4_bot) (net 26) (tstamp 53AA6B57)) + (segment (start 95.4 137) (end 95.4 138.2) (width 0.2) (layer 4_bot) (net 27) (status 10)) + (segment (start 94.85 138.75) (end 85.3 138.75) (width 0.2) (layer 4_bot) (net 27) (status 20)) + (segment (start 95.4 138.2) (end 94.85 138.75) (width 0.2) (layer 4_bot) (net 27) (tstamp 53AE60BF)) + (segment (start 93.4 131.4) (end 91.6 131.4) (width 0.2) (layer 4_bot) (net 28) (status 10)) + (segment (start 86.35 132.25) (end 85.3 132.25) (width 0.2) (layer 4_bot) (net 28) (tstamp 53AA68E3) (status 20)) + (segment (start 87.596004 131.003996) (end 86.35 132.25) (width 0.2) (layer 4_bot) (net 28) (tstamp 53AA68E1)) + (segment (start 91.203996 131.003996) (end 87.596004 131.003996) (width 0.2) (layer 4_bot) (net 28) (tstamp 53AA68E0)) + (segment (start 91.6 131.4) (end 91.203996 131.003996) (width 0.2) (layer 4_bot) (net 28) (tstamp 53AA68DF)) + (segment (start 85.3 132.75) (end 86.45 132.75) (width 0.2) (layer 4_bot) (net 29) (status 10)) + (segment (start 91.4 131.8) (end 93.4 131.8) (width 0.2) (layer 4_bot) (net 29) (tstamp 53AA69D4) (status 20)) + (segment (start 91.001998 131.401998) (end 91.4 131.8) (width 0.2) (layer 4_bot) (net 29) (tstamp 53AA69D3)) + (segment (start 87.798002 131.401998) (end 91.001998 131.401998) (width 0.2) (layer 4_bot) (net 29) (tstamp 53AA69D1)) + (segment (start 86.45 132.75) (end 87.798002 131.401998) (width 0.2) (layer 4_bot) (net 29) (tstamp 53AA69CF)) + (segment (start 93.4 132.2) (end 91.2 132.2) (width 0.2) (layer 4_bot) (net 30) (status 10)) + (segment (start 91.2 132.2) (end 90.8 131.8) (width 0.2) (layer 4_bot) (net 30) (tstamp 53AA68D2)) + (segment (start 90.8 131.8) (end 88 131.8) (width 0.2) (layer 4_bot) (net 30) (tstamp 53AA68D3)) + (segment (start 88 131.8) (end 86.55 133.25) (width 0.2) (layer 4_bot) (net 30) (tstamp 53AA68D4)) + (segment (start 86.55 133.25) (end 85.3 133.25) (width 0.2) (layer 4_bot) (net 30) (tstamp 53AA68D5) (status 20)) + (segment (start 93.4 133) (end 91.2 133) (width 0.2) (layer 4_bot) (net 31) (status 10)) + (segment (start 90.45 133.75) (end 85.3 133.75) (width 0.2) (layer 4_bot) (net 31) (tstamp 53AA6AD1) (status 20)) + (segment (start 91.2 133) (end 90.45 133.75) (width 0.2) (layer 4_bot) (net 31) (tstamp 53AA6AD0)) + (segment (start 93.4 133.4) (end 91.4 133.4) (width 0.2) (layer 4_bot) (net 32) (status 10)) + (segment (start 90.55 134.25) (end 85.3 134.25) (width 0.2) (layer 4_bot) (net 32) (tstamp 53AA6AD5) (status 20)) + (segment (start 91.4 133.4) (end 90.55 134.25) (width 0.2) (layer 4_bot) (net 32) (tstamp 53AA6AD3)) + (segment (start 93.4 133.8) (end 91.6 133.8) (width 0.2) (layer 4_bot) (net 33) (status 10)) + (segment (start 90.65 134.75) (end 85.3 134.75) (width 0.2) (layer 4_bot) (net 33) (tstamp 53AA6ADA) (status 20)) + (segment (start 91.6 133.8) (end 90.65 134.75) (width 0.2) (layer 4_bot) (net 33) (tstamp 53AA6AD8)) + (segment (start 93.4 134.2) (end 91.8 134.2) (width 0.2) (layer 4_bot) (net 34) (status 10)) + (segment (start 90.75 135.25) (end 85.3 135.25) (width 0.2) (layer 4_bot) (net 34) (tstamp 53AA6ADF) (status 20)) + (segment (start 91.8 134.2) (end 90.75 135.25) (width 0.2) (layer 4_bot) (net 34) (tstamp 53AA6ADD)) + (segment (start 93.4 134.6) (end 92 134.6) (width 0.2) (layer 4_bot) (net 35) (status 10)) + (segment (start 90.85 135.75) (end 85.3 135.75) (width 0.2) (layer 4_bot) (net 35) (tstamp 53AA6AE4) (status 20)) + (segment (start 92 134.6) (end 90.85 135.75) (width 0.2) (layer 4_bot) (net 35) (tstamp 53AA6AE2)) + (segment (start 85.3 144.25) (end 90.55 144.25) (width 0.2) (layer 4_bot) (net 36) (status 10)) + (segment (start 96.198002 137.003996) (end 96.2 137) (width 0.2) (layer 4_bot) (net 36) (tstamp 53AB3F5C) (status 30)) + (segment (start 96.198002 138.601998) (end 96.198002 137.003996) (width 0.2) (layer 4_bot) (net 36) (tstamp 53AB3F5A) (status 20)) + (segment (start 90.55 144.25) (end 96.198002 138.601998) (width 0.2) (layer 4_bot) (net 36) (tstamp 53AB3F56)) + (segment (start 87.8 145.5999) (end 86.9999 145.5999) (width 0.2) (layer 4_bot) (net 37) (status 10)) + (segment (start 86.65 145.25) (end 85.3 145.25) (width 0.2) (layer 4_bot) (net 37) (tstamp 53AB4AEC) (status 20)) + (segment (start 86.9999 145.5999) (end 86.65 145.25) (width 0.2) (layer 4_bot) (net 37) (tstamp 53AB4AEA)) + (segment (start 87.8 145.5999) (end 87.7999 145.6) (width 0.2) (layer 4_bot) (net 37) (status 30)) + (via (at 95.4 141) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 37)) + (segment (start 95.4 141) (end 99.6 141) (width 0.2) (layer 1_top) (net 37) (tstamp 53AB499D)) + (via (at 99.6 141) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 37)) + (segment (start 99.6 141) (end 99.6 140) (width 0.2) (layer 4_bot) (net 37) (tstamp 53AB49A5)) + (segment (start 99.6 140) (end 98.6 139) (width 0.2) (layer 4_bot) (net 37) (tstamp 53AB49A6)) + (segment (start 98.6 139) (end 98.6 137) (width 0.2) (layer 4_bot) (net 37) (tstamp 53AB49A8) (status 20)) + (segment (start 90.8 145.6) (end 95.4 141) (width 0.2) (layer 4_bot) (net 37) (tstamp 53AB4A23)) + (segment (start 87.7999 145.6) (end 90.8 145.6) (width 0.2) (layer 4_bot) (net 37) (tstamp 53AB4A17) (status 10)) + (segment (start 96.6 137) (end 96.6 138.8) (width 0.2) (layer 4_bot) (net 38) (status 10)) + (segment (start 90.65 144.75) (end 85.3 144.75) (width 0.2) (layer 4_bot) (net 38) (tstamp 53AB3F93) (status 20)) + (segment (start 96.6 138.8) (end 90.65 144.75) (width 0.2) (layer 4_bot) (net 38) (tstamp 53AB3F8F)) + (segment (start 85.3 130.75) (end 86.05 130.75) (width 0.2) (layer 4_bot) (net 39) (status 10)) + (segment (start 92.2 130.2) (end 93.4 130.2) (width 0.2) (layer 4_bot) (net 39) (tstamp 53AA68F8) (status 20)) + (segment (start 91.8 129.8) (end 92.2 130.2) (width 0.2) (layer 4_bot) (net 39) (tstamp 53AA68F7)) + (segment (start 87 129.8) (end 91.8 129.8) (width 0.2) (layer 4_bot) (net 39) (tstamp 53AA68F5)) + (segment (start 86.05 130.75) (end 87 129.8) (width 0.2) (layer 4_bot) (net 39) (tstamp 53AA68F4)) + (segment (start 95.8 137) (end 95.8 138.4) (width 0.2) (layer 4_bot) (net 40) (status 10)) + (segment (start 91.45 142.75) (end 95.8 138.4) (width 0.2) (layer 4_bot) (net 40) (tstamp 53AB3F4C)) + (segment (start 91.45 142.75) (end 85.3 142.75) (width 0.2) (layer 4_bot) (net 40) (status 20)) + (segment (start 134.45 163.6) (end 135.4 163.6) (width 0.2) (layer 4_bot) (net 41) (status 10)) + (segment (start 140.01 160.11) (end 140.01 162.315) (width 0.2) (layer 4_bot) (net 41) (tstamp 53ADA943) (status 20)) + (segment (start 139.8 159.9) (end 140.01 160.11) (width 0.2) (layer 4_bot) (net 41) (tstamp 53ADA940)) + (segment (start 136.6 159.9) (end 139.8 159.9) (width 0.2) (layer 4_bot) (net 41) (tstamp 53ADA93F)) + (segment (start 136 160.5) (end 136.6 159.9) (width 0.2) (layer 4_bot) (net 41) (tstamp 53ADA93D)) + (segment (start 136 163) (end 136 160.5) (width 0.2) (layer 4_bot) (net 41) (tstamp 53ADA93C)) + (segment (start 135.4 163.6) (end 136 163) (width 0.2) (layer 4_bot) (net 41) (tstamp 53ADA938)) + (segment (start 132.75 163.6) (end 123.4 163.6) (width 0.2) (layer 4_bot) (net 42) (status 10)) + (segment (start 100.2 138) (end 100.2 137) (width 0.2) (layer 4_bot) (net 42) (tstamp 53ADAA39) (status 20)) + (segment (start 102.6 140.4) (end 100.2 138) (width 0.2) (layer 4_bot) (net 42) (tstamp 53ADAA37)) + (segment (start 102.6 142.8) (end 102.6 140.4) (width 0.2) (layer 4_bot) (net 42) (tstamp 53ADAA35)) + (segment (start 123.4 163.6) (end 102.6 142.8) (width 0.2) (layer 4_bot) (net 42) (tstamp 53ADAA32)) + (segment (start 121.8 153.8) (end 117.7 149.7) (width 0.2) (layer 1_top) (net 43)) + (segment (start 165.41 158.21) (end 159.2 152) (width 0.2) (layer 4_bot) (net 43) (tstamp 53ADAB6D)) + (segment (start 134 152) (end 159.2 152) (width 0.2) (layer 4_bot) (net 43) (tstamp 53ADBDAC)) + (segment (start 133 151) (end 134 152) (width 0.2) (layer 4_bot) (net 43) (tstamp 53ADBDAB)) + (via (at 133 151) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 43)) + (segment (start 129.4 154.6) (end 133 151) (width 0.2) (layer 1_top) (net 43) (tstamp 53ADBDA4)) + (segment (start 127.6 154.6) (end 129.4 154.6) (width 0.2) (layer 1_top) (net 43) (tstamp 53ADBDA2)) + (segment (start 165.41 162.315) (end 165.41 158.21) (width 0.2) (layer 4_bot) (net 43) (status 10)) + (segment (start 121.8 155.4) (end 122.8 156.4) (width 0.2) (layer 1_top) (net 43) (tstamp 53F39021)) + (segment (start 122.8 156.4) (end 124.6 156.4) (width 0.2) (layer 1_top) (net 43) (tstamp 53F39023)) + (segment (start 124.6 156.4) (end 125.2 155.8) (width 0.2) (layer 1_top) (net 43) (tstamp 53F39025)) + (segment (start 125.2 155.8) (end 126.4 155.8) (width 0.2) (layer 1_top) (net 43) (tstamp 53F39026)) + (segment (start 126.4 155.8) (end 127.6 154.6) (width 0.2) (layer 1_top) (net 43) (tstamp 53F39027)) + (segment (start 121.8 153.8) (end 121.8 155.4) (width 0.2) (layer 1_top) (net 43)) + (segment (start 117.2 148.2) (end 116.8 148.2) (width 0.2) (layer 4_bot) (net 43) (tstamp 53F39E34)) + (segment (start 117.7 148.7) (end 117.2 148.2) (width 0.2) (layer 4_bot) (net 43) (tstamp 53F39E33)) + (via (at 117.7 148.7) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 43)) + (segment (start 117.7 149.7) (end 117.7 148.7) (width 0.2) (layer 1_top) (net 43) (tstamp 53F39E31)) + (segment (start 103.2 134.6) (end 101.8 134.6) (width 0.2) (layer 4_bot) (net 43) (status 20)) + (segment (start 103.2 134.6) (end 116.8 148.2) (width 0.2) (layer 4_bot) (net 43)) + (segment (start 75.9 110.8) (end 102.8 110.8) (width 0.2) (layer 1_top) (net 44)) + (segment (start 129.2 133.3) (end 129.2 152.6) (width 0.2) (layer 1_top) (net 44)) + (segment (start 102.8 110.8) (end 120.9 128.9) (width 0.2) (layer 1_top) (net 44)) + (segment (start 120.9 128.9) (end 124.8 128.9) (width 0.2) (layer 1_top) (net 44)) + (segment (start 124.8 128.9) (end 129.2 133.3) (width 0.2) (layer 1_top) (net 44)) + (segment (start 129.2 152.6) (end 128.4 153.4) (width 0.2) (layer 1_top) (net 44)) + (segment (start 126.23 153.41) (end 126.24 153.4) (width 0.2) (layer 4_bot) (net 44) (status 30)) + (segment (start 75.875 110.825) (end 75.9 110.8) (width 0.2) (layer 4_bot) (net 44) (tstamp 53BC71D9)) + (via (at 75.9 110.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 44)) + (segment (start 75.875 110.825) (end 75.875 111.725) (width 0.2) (layer 4_bot) (net 44) (status 20)) + (via (at 128.4 153.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 44)) + (segment (start 126.24 153.4) (end 128.4 153.4) (width 0.2) (layer 4_bot) (net 44) (tstamp 53F39D26) (status 10)) + (segment (start 66.8 116.4) (end 64.1 116.4) (width 0.2) (layer 4_bot) (net 45) (status 20)) + (segment (start 123.8 135.4) (end 104.8 116.4) (width 0.2) (layer 1_top) (net 45) (tstamp 53ADB89C)) + (segment (start 104.8 116.4) (end 66.8 116.4) (width 0.2) (layer 1_top) (net 45)) + (segment (start 126.025 143.25) (end 123.85 143.25) (width 0.2) (layer 4_bot) (net 45) (status 10)) + (via (at 123.8 143.2) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 45)) + (segment (start 123.85 143.25) (end 123.8 143.2) (width 0.2) (layer 4_bot) (net 45) (tstamp 53ADB7D9)) + (segment (start 123.8 143.2) (end 123.8 135.4) (width 0.2) (layer 1_top) (net 45)) + (via (at 66.8 116.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 45)) + (segment (start 64.1 116.4) (end 64.075 116.375) (width 0.2) (layer 4_bot) (net 45) (tstamp 53BC7193) (status 30)) + (segment (start 126.23 145.79) (end 124.11 145.79) (width 0.2) (layer 4_bot) (net 46) (status 10)) + (segment (start 64.1 114.4) (end 64.075 114.375) (width 0.2) (layer 4_bot) (net 46) (tstamp 53BC7190) (status 30)) + (segment (start 124.6 145.3) (end 124.6 135.3) (width 0.2) (layer 1_top) (net 46) (tstamp 53ADB7CE)) + (via (at 66.8 114.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 46)) + (segment (start 66.8 114.4) (end 103.7 114.4) (width 0.2) (layer 1_top) (net 46)) + (segment (start 124.6 135.3) (end 103.7 114.4) (width 0.2) (layer 1_top) (net 46) (tstamp 53ADB8A5)) + (segment (start 66.8 114.4) (end 64.1 114.4) (width 0.2) (layer 4_bot) (net 46) (status 20)) + (segment (start 124.1 145.8) (end 124.6 145.3) (width 0.2) (layer 1_top) (net 46) (tstamp 53F39E8B)) + (via (at 124.1 145.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 46)) + (segment (start 124.11 145.79) (end 124.1 145.8) (width 0.2) (layer 4_bot) (net 46) (tstamp 53F39E89)) + (segment (start 126.23 148.33) (end 126.2 148.3) (width 0.2) (layer 4_bot) (net 47) (status 30)) + (segment (start 124 148.3) (end 123 147.3) (width 0.2) (layer 1_top) (net 47) (tstamp 53F39E41)) + (via (at 124 148.3) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 47)) + (segment (start 126.2 148.3) (end 124 148.3) (width 0.2) (layer 4_bot) (net 47) (tstamp 53F39E3F) (status 10)) + (segment (start 66.8 118.4) (end 64.1 118.4) (width 0.2) (layer 4_bot) (net 47) (status 20)) + (segment (start 123 135.5) (end 105.9 118.4) (width 0.2) (layer 1_top) (net 47) (tstamp 53ADB482)) + (segment (start 105.9 118.4) (end 66.8 118.4) (width 0.2) (layer 1_top) (net 47)) + (segment (start 123 147.3) (end 123 135.5) (width 0.2) (layer 1_top) (net 47) (tstamp 53F39E44)) + (via (at 66.8 118.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 47)) + (segment (start 64.1 118.4) (end 64.075 118.375) (width 0.2) (layer 4_bot) (net 47) (tstamp 53BC7197) (status 30)) + (segment (start 120.77 150.87) (end 122.83 150.87) (width 0.2) (layer 4_bot) (net 48) (status 10)) + (segment (start 64.1 119.4) (end 64.075 119.375) (width 0.2) (layer 4_bot) (net 48) (tstamp 53BC719A) (status 30)) + (via (at 66.8 119.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 48)) + (segment (start 122.2 150.1) (end 122.2 135.6) (width 0.2) (layer 1_top) (net 48)) + (segment (start 106 119.4) (end 66.8 119.4) (width 0.2) (layer 1_top) (net 48)) + (segment (start 122.2 135.6) (end 106 119.4) (width 0.2) (layer 1_top) (net 48) (tstamp 53ADB882)) + (segment (start 66.8 119.4) (end 64.1 119.4) (width 0.2) (layer 4_bot) (net 48) (status 20)) + (segment (start 122.9 150.8) (end 122.2 150.1) (width 0.2) (layer 1_top) (net 48) (tstamp 53F39D37)) + (via (at 122.9 150.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 48)) + (segment (start 122.83 150.87) (end 122.9 150.8) (width 0.2) (layer 4_bot) (net 48) (tstamp 53F39D35)) + (segment (start 126.23 150.87) (end 128.33 150.87) (width 0.2) (layer 4_bot) (net 49) (status 10)) + (segment (start 128.4 150.8) (end 126.2 148.6) (width 0.2) (layer 1_top) (net 49) (tstamp 53F39E7C)) + (via (at 128.4 150.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 49)) + (segment (start 128.33 150.87) (end 128.4 150.8) (width 0.2) (layer 4_bot) (net 49) (tstamp 53F39E7A)) + (segment (start 124.5 129.5) (end 126.2 131.2) (width 0.2) (layer 1_top) (net 49)) + (segment (start 66.8 112.4) (end 64.1 112.4) (width 0.2) (layer 4_bot) (net 49) (status 20)) + (via (at 66.8 112.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 49)) + (segment (start 120.6 129.5) (end 103.5 112.4) (width 0.2) (layer 1_top) (net 49) (tstamp 53F39D98)) + (segment (start 66.8 112.4) (end 103.5 112.4) (width 0.2) (layer 1_top) (net 49)) + (segment (start 64.075 112.375) (end 64.1 112.4) (width 0.2) (layer 4_bot) (net 49) (tstamp 53BC718A) (status 30)) + (segment (start 124.5 129.5) (end 120.6 129.5) (width 0.2) (layer 1_top) (net 49) (tstamp 53F39D95)) + (segment (start 126.2 131.2) (end 126.2 148.6) (width 0.2) (layer 1_top) (net 49) (tstamp 53F39DA0)) + (segment (start 125.4 151) (end 125.4 131.3) (width 0.2) (layer 1_top) (net 50)) + (segment (start 124.2 130.1) (end 120.3 130.1) (width 0.2) (layer 1_top) (net 50) (tstamp 53F39DA5)) + (segment (start 125.4 131.3) (end 124.2 130.1) (width 0.2) (layer 1_top) (net 50) (tstamp 53F39DA3)) + (segment (start 123.5 152.9) (end 122.4 152.9) (width 0.2) (layer 4_bot) (net 50)) + (segment (start 64.075 113.375) (end 64.1 113.4) (width 0.2) (layer 4_bot) (net 50) (tstamp 53BC718D) (status 30)) + (segment (start 66.8 113.4) (end 103.6 113.4) (width 0.2) (layer 1_top) (net 50)) + (segment (start 120.3 130.1) (end 103.6 113.4) (width 0.2) (layer 1_top) (net 50) (tstamp 53F39DA8)) + (via (at 66.8 113.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 50)) + (segment (start 66.8 113.4) (end 64.1 113.4) (width 0.2) (layer 4_bot) (net 50) (status 20)) + (via (at 123.5 152.9) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 50)) + (segment (start 123.5 152.9) (end 125.4 151) (width 0.2) (layer 1_top) (net 50) (tstamp 53F39031)) + (segment (start 121.89 153.41) (end 120.77 153.41) (width 0.2) (layer 4_bot) (net 50) (tstamp 53F39D2F) (status 30)) + (segment (start 122.4 152.9) (end 121.89 153.41) (width 0.2) (layer 4_bot) (net 50) (tstamp 53F39D2D) (status 20)) + (segment (start 120.975 153.41) (end 122.09 153.41) (width 0.2) (layer 4_bot) (net 50) (status 30)) + (segment (start 98.2 128.6) (end 98.2 126.6) (width 0.2) (layer 4_bot) (net 51) (status 10)) + (segment (start 100.2 124.6) (end 130.4 124.6) (width 0.2) (layer 4_bot) (net 51) (tstamp 53AB3CC3)) + (segment (start 98.2 126.6) (end 100.2 124.6) (width 0.2) (layer 4_bot) (net 51) (tstamp 53AB3CB8)) + (segment (start 154.8 128.6) (end 139.6 128.6) (width 0.2) (layer 4_bot) (net 51)) + (segment (start 135.4 129.6) (end 130.4 124.6) (width 0.2) (layer 4_bot) (net 51) (tstamp 53AB3B14)) + (segment (start 138.6 129.6) (end 135.4 129.6) (width 0.2) (layer 4_bot) (net 51) (tstamp 53AB3B12)) + (segment (start 139.6 128.6) (end 138.6 129.6) (width 0.2) (layer 4_bot) (net 51) (tstamp 53AB3B10)) + (segment (start 162.604 129.75) (end 155.95 129.75) (width 0.2) (layer 4_bot) (net 51) (status 10)) + (segment (start 155.95 129.75) (end 154.8 128.6) (width 0.2) (layer 4_bot) (net 51) (tstamp 53AB3846)) + (segment (start 101.8 134.2) (end 103.4 134.2) (width 0.2) (layer 4_bot) (net 52) (status 10)) + (segment (start 134.45 153.65) (end 151.106 153.65) (width 0.2) (layer 4_bot) (net 52) (tstamp 53ADA641) (status 20)) + (segment (start 128.2 147.4) (end 134.45 153.65) (width 0.2) (layer 4_bot) (net 52) (tstamp 53ADA63F)) + (segment (start 116.6 147.4) (end 128.2 147.4) (width 0.2) (layer 4_bot) (net 52) (tstamp 53ADA63C)) + (segment (start 103.4 134.2) (end 116.6 147.4) (width 0.2) (layer 4_bot) (net 52) (tstamp 53ADA636)) + (segment (start 100.3 123.9) (end 141.344 123.9) (width 0.2) (layer 4_bot) (net 53)) + (segment (start 141.344 123.9) (end 143.894 121.35) (width 0.2) (layer 4_bot) (net 53) (tstamp 53ADFA7C) (status 20)) + (segment (start 97.8 128.6) (end 97.8 126.4) (width 0.2) (layer 4_bot) (net 53) (status 10)) + (segment (start 97.8 126.4) (end 100.3 123.9) (width 0.2) (layer 4_bot) (net 53) (tstamp 53AB4BE6)) + (segment (start 98.6 128.6) (end 98.6 126.8) (width 0.2) (layer 4_bot) (net 54) (status 10)) + (segment (start 130.1 125.3) (end 100.1 125.3) (width 0.2) (layer 4_bot) (net 54) (tstamp 53AB3AFB)) + (segment (start 135 130.2) (end 130.1 125.3) (width 0.2) (layer 4_bot) (net 54) (tstamp 53AB3AF9)) + (segment (start 139 130.2) (end 135 130.2) (width 0.2) (layer 4_bot) (net 54) (tstamp 53AB3AF6)) + (segment (start 140 129.2) (end 139 130.2) (width 0.2) (layer 4_bot) (net 54) (tstamp 53AB3AF4)) + (segment (start 152.296 129.2) (end 140 129.2) (width 0.2) (layer 4_bot) (net 54) (tstamp 53AB3B47)) + (segment (start 152.296 129.2) (end 154.048 130.952) (width 0.2) (layer 4_bot) (net 54) (status 20)) + (segment (start 98.6 126.8) (end 100.1 125.3) (width 0.2) (layer 4_bot) (net 54) (tstamp 53AB3C61)) + (segment (start 99 128.6) (end 99 127) (width 0.2) (layer 4_bot) (net 55) (status 10)) + (segment (start 134.752 130.952) (end 129.8 126) (width 0.2) (layer 4_bot) (net 55) (tstamp 53AB3ADB)) + (segment (start 129.8 126) (end 100 126) (width 0.2) (layer 4_bot) (net 55) (tstamp 53AB3ADE)) + (segment (start 134.752 130.952) (end 140.952 130.952) (width 0.2) (layer 4_bot) (net 55) (status 20)) + (segment (start 99 127) (end 100 126) (width 0.2) (layer 4_bot) (net 55) (tstamp 53AB3C5B)) + (segment (start 111.6 130.2) (end 117 130.2) (width 0.2) (layer 4_bot) (net 56)) + (segment (start 128.3 129.5) (end 134.7 135.9) (width 0.2) (layer 4_bot) (net 56) (tstamp 53F39D61)) + (segment (start 117.7 129.5) (end 128.3 129.5) (width 0.2) (layer 4_bot) (net 56) (tstamp 53F39D5E)) + (segment (start 117 130.2) (end 117.7 129.5) (width 0.2) (layer 4_bot) (net 56) (tstamp 53F39D5C)) + (segment (start 148.61 138.61) (end 145.9 135.9) (width 0.2) (layer 4_bot) (net 56) (status 10)) + (segment (start 145.9 135.9) (end 134.7 135.9) (width 0.2) (layer 4_bot) (net 56) (tstamp 53AB6448)) + (segment (start 99.398002 128.6) (end 99.4 128.6) (width 0.2) (layer 4_bot) (net 56) (tstamp 53AB645D) (status 30)) + (segment (start 99.398002 127.2) (end 99.398002 128.6) (width 0.2) (layer 4_bot) (net 56) (tstamp 53AB645C) (status 20)) + (segment (start 100 126.598002) (end 99.398002 127.2) (width 0.2) (layer 4_bot) (net 56) (tstamp 53AB6459)) + (segment (start 107.998002 126.598002) (end 100 126.598002) (width 0.2) (layer 4_bot) (net 56) (tstamp 53AB6452)) + (segment (start 111.6 130.2) (end 107.998002 126.598002) (width 0.2) (layer 4_bot) (net 56) (tstamp 53F39D5A)) + (segment (start 101.8 133) (end 104 133) (width 0.2) (layer 4_bot) (net 57) (status 10)) + (segment (start 131.396 144.25) (end 132.396 145.25) (width 0.2) (layer 4_bot) (net 57) (tstamp 53ACD18C) (status 20)) + (segment (start 115.25 144.25) (end 131.396 144.25) (width 0.2) (layer 4_bot) (net 57) (tstamp 53ACD188)) + (segment (start 104 133) (end 115.25 144.25) (width 0.2) (layer 4_bot) (net 57) (tstamp 53ACD183)) + (segment (start 101.8 132.998002) (end 101.8 133) (width 0.2) (layer 4_bot) (net 57) (tstamp 53AB7833) (status 30)) + (segment (start 101.8 133.001998) (end 101.8 133) (width 0.2) (layer 4_bot) (net 57) (tstamp 53AB195A) (status 30)) + (segment (start 135.1 134.3) (end 128.9 128.1) (width 0.2) (layer 4_bot) (net 58)) + (segment (start 111.5 128.1) (end 111 128.6) (width 0.2) (layer 4_bot) (net 58) (tstamp 53F39D55)) + (segment (start 128.9 128.1) (end 111.5 128.1) (width 0.2) (layer 4_bot) (net 58) (tstamp 53F39D54)) + (segment (start 164 136.6) (end 165.57 138.17) (width 0.2) (layer 4_bot) (net 58)) + (segment (start 94.6 128.6) (end 111 128.6) (width 0.2) (layer 1_top) (net 58) (tstamp 53ADE4DE)) + (segment (start 93.4 128.2) (end 94.2 128.2) (width 0.2) (layer 1_top) (net 58)) + (segment (start 94.2 128.2) (end 94.6 128.6) (width 0.2) (layer 1_top) (net 58) (tstamp 53ADE4DA)) + (via (at 111 128.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 58)) + (via (at 93.4 128.2) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 58)) + (segment (start 147.5 134.3) (end 135.1 134.3) (width 0.2) (layer 4_bot) (net 58) (tstamp 53AB6CF0)) + (segment (start 149.8 136.6) (end 147.5 134.3) (width 0.2) (layer 4_bot) (net 58) (tstamp 53ADE82D)) + (segment (start 149.8 136.6) (end 164 136.6) (width 0.2) (layer 4_bot) (net 58)) + (segment (start 165.57 138.17) (end 169.235 138.17) (width 0.2) (layer 4_bot) (net 58) (tstamp 53ADE854) (status 20)) + (segment (start 94.6 128.6) (end 93.8 128.6) (width 0.2) (layer 4_bot) (net 58) (status 10)) + (segment (start 92.85 128.75) (end 85.3 128.75) (width 0.2) (layer 4_bot) (net 58) (tstamp 53ADE30E) (status 20)) + (segment (start 93.4 128.2) (end 92.85 128.75) (width 0.2) (layer 4_bot) (net 58) (tstamp 53ADE30D)) + (segment (start 93.8 128.6) (end 93.4 128.2) (width 0.2) (layer 4_bot) (net 58) (tstamp 53ADE2FE)) + (segment (start 135.298002 133.498002) (end 129.2 127.4) (width 0.2) (layer 4_bot) (net 59)) + (segment (start 110.6 127.4) (end 110.2 127.8) (width 0.2) (layer 4_bot) (net 59) (tstamp 53F39D52)) + (segment (start 129.2 127.4) (end 110.6 127.4) (width 0.2) (layer 4_bot) (net 59) (tstamp 53F39D51)) + (segment (start 169.235 135.63) (end 169.065 135.8) (width 0.2) (layer 4_bot) (net 59) (status 30)) + (segment (start 95 127.8) (end 94.6 127.4) (width 0.2) (layer 1_top) (net 59) (tstamp 53ADE371)) + (segment (start 94.6 127.4) (end 92.8 127.4) (width 0.2) (layer 1_top) (net 59) (tstamp 53ADE375)) + (via (at 92.8 127.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 59)) + (via (at 110.2 127.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 59)) + (segment (start 147.698002 133.498002) (end 135.298002 133.498002) (width 0.2) (layer 4_bot) (net 59) (tstamp 53AB681E)) + (segment (start 150 135.8) (end 147.698002 133.498002) (width 0.2) (layer 4_bot) (net 59) (tstamp 53AB681A)) + (segment (start 110.2 127.8) (end 95 127.8) (width 0.2) (layer 1_top) (net 59)) + (segment (start 169.065 135.8) (end 150 135.8) (width 0.2) (layer 4_bot) (net 59) (tstamp 53B2FB54) (status 10)) + (segment (start 95 128.6) (end 95 127.6) (width 0.2) (layer 4_bot) (net 59) (status 10)) + (segment (start 91.95 128.25) (end 85.3 128.25) (width 0.2) (layer 4_bot) (net 59) (tstamp 53ADE33D) (status 20)) + (segment (start 92.8 127.4) (end 91.95 128.25) (width 0.2) (layer 4_bot) (net 59) (tstamp 53ADE33C)) + (segment (start 94.8 127.4) (end 92.8 127.4) (width 0.2) (layer 4_bot) (net 59) (tstamp 53ADE331)) + (segment (start 95 127.6) (end 94.8 127.4) (width 0.2) (layer 4_bot) (net 59) (tstamp 53ADE32C)) + (segment (start 134.9 135.1) (end 128.6 128.8) (width 0.2) (layer 4_bot) (net 60)) + (segment (start 112.4 128.8) (end 111.8 129.4) (width 0.2) (layer 4_bot) (net 60) (tstamp 53F39D58)) + (segment (start 128.6 128.8) (end 112.4 128.8) (width 0.2) (layer 4_bot) (net 60) (tstamp 53F39D57)) + (segment (start 93.4 129.2) (end 94 129.2) (width 0.2) (layer 1_top) (net 60)) + (segment (start 166.71 140.71) (end 163.4 137.4) (width 0.2) (layer 4_bot) (net 60) (tstamp 53AB6CFA)) + (segment (start 163.4 137.4) (end 149.6 137.4) (width 0.2) (layer 4_bot) (net 60) (tstamp 53AB6CFC)) + (segment (start 149.6 137.4) (end 147.3 135.1) (width 0.2) (layer 4_bot) (net 60) (tstamp 53AB6CFE)) + (segment (start 147.3 135.1) (end 134.9 135.1) (width 0.2) (layer 4_bot) (net 60) (tstamp 53AB6D00)) + (via (at 111.8 129.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 60)) + (segment (start 166.71 140.71) (end 169.235 140.71) (width 0.2) (layer 4_bot) (net 60) (status 20)) + (via (at 93.4 129.2) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 60)) + (segment (start 94.2 129.4) (end 111.8 129.4) (width 0.2) (layer 1_top) (net 60) (tstamp 53ADE2E9)) + (segment (start 94 129.2) (end 94.2 129.4) (width 0.2) (layer 1_top) (net 60) (tstamp 53ADE2E5)) + (segment (start 93.4 129.8) (end 93.4 129.2) (width 0.2) (layer 4_bot) (net 60) (status 10)) + (segment (start 92.75 129.25) (end 85.3 129.25) (width 0.2) (layer 4_bot) (net 60) (tstamp 53ADE2DA) (status 20)) + (segment (start 92.8 129.2) (end 92.75 129.25) (width 0.2) (layer 4_bot) (net 60) (tstamp 53ADE2D9)) + (segment (start 93.4 129.2) (end 92.8 129.2) (width 0.2) (layer 4_bot) (net 60) (tstamp 53ADE2D8)) + (segment (start 135.5 132.7) (end 129.5 126.7) (width 0.2) (layer 4_bot) (net 61)) + (segment (start 110.3 126.7) (end 110 127) (width 0.2) (layer 4_bot) (net 61) (tstamp 53F39D4D)) + (segment (start 129.5 126.7) (end 110.3 126.7) (width 0.2) (layer 4_bot) (net 61) (tstamp 53F39D4C)) + (segment (start 93.4 126.6) (end 95 126.6) (width 0.2) (layer 1_top) (net 61)) + (segment (start 152.69 133.09) (end 152.3 132.7) (width 0.2) (layer 4_bot) (net 61) (tstamp 53AB67FE)) + (segment (start 152.3 132.7) (end 135.5 132.7) (width 0.2) (layer 4_bot) (net 61) (tstamp 53AB6803)) + (segment (start 110 127) (end 109.4 127) (width 0.2) (layer 4_bot) (net 61) (tstamp 53F39D4F)) + (via (at 109.4 127) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 61)) + (segment (start 152.69 133.09) (end 169.235 133.09) (width 0.2) (layer 4_bot) (net 61) (status 20)) + (via (at 93.4 126.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 61)) + (segment (start 97.6 127) (end 109.4 127) (width 0.2) (layer 1_top) (net 61) (tstamp 53ADE393)) + (segment (start 97.4 127.2) (end 97.6 127) (width 0.2) (layer 1_top) (net 61) (tstamp 53ADE391)) + (segment (start 95.6 127.2) (end 97.4 127.2) (width 0.2) (layer 1_top) (net 61) (tstamp 53ADE38E)) + (segment (start 95 126.6) (end 95.6 127.2) (width 0.2) (layer 1_top) (net 61) (tstamp 53ADE38C)) + (segment (start 95.4 128.6) (end 95.4 127.4) (width 0.2) (layer 4_bot) (net 61) (status 10)) + (segment (start 91.45 127.75) (end 85.3 127.75) (width 0.2) (layer 4_bot) (net 61) (tstamp 53ADE354) (status 20)) + (segment (start 92.6 126.6) (end 91.45 127.75) (width 0.2) (layer 4_bot) (net 61) (tstamp 53ADE352)) + (segment (start 93.4 126.6) (end 92.6 126.6) (width 0.2) (layer 4_bot) (net 61) (tstamp 53ADE351)) + (segment (start 94.6 126.6) (end 93.4 126.6) (width 0.2) (layer 4_bot) (net 61) (tstamp 53ADE34A)) + (segment (start 95.4 127.4) (end 94.6 126.6) (width 0.2) (layer 4_bot) (net 61) (tstamp 53ADE347)) + (segment (start 174.49 155.95) (end 174.29916 156.14084) (width 0.4) (layer 4_bot) (net 62) (status 30)) + (segment (start 174.29916 156.14084) (end 174.29916 159) (width 0.4) (layer 4_bot) (net 62) (tstamp 53F39CF6) (status 30)) + (segment (start 172.4 166.4) (end 172.4 163) (width 0.4) (layer 4_bot) (net 62)) + (segment (start 172.4 163) (end 174.29916 161.10084) (width 0.4) (layer 4_bot) (net 62) (tstamp 53B2EF70)) + (segment (start 111.65 160) (end 113.8 160) (width 0.4) (layer 4_bot) (net 62) (status 10)) + (segment (start 113.8 160) (end 125.05 171.25) (width 0.4) (layer 4_bot) (net 62) (tstamp 53AE5889)) + (segment (start 174.29916 159) (end 174.29916 161.10084) (width 0.4) (layer 4_bot) (net 62) (status 10)) + (segment (start 172.4 166.4) (end 167.55 171.25) (width 0.4) (layer 4_bot) (net 62) (tstamp 53B2EF6D)) + (segment (start 167.55 171.25) (end 125.05 171.25) (width 0.4) (layer 4_bot) (net 62) (tstamp 53AE1D44)) + (segment (start 174.285 158.98584) (end 174.29916 159) (width 0.4) (layer 4_bot) (net 62) (tstamp 53AE1D3A) (status 30)) + (segment (start 86 101.25) (end 89 101.25) (width 0.4) (layer 4_bot) (net 63)) + (segment (start 83 101.25) (end 86 101.25) (width 0.4) (layer 4_bot) (net 63)) + (via (at 86 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 110 101.25) (end 113 101.25) (width 0.4) (layer 4_bot) (net 63)) + (segment (start 107 101.25) (end 110 101.25) (width 0.4) (layer 4_bot) (net 63)) + (via (at 110 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 120.77 155.95) (end 120.77 156.98) (width 0.4) (layer 4_bot) (net 63)) + (via (at 120.75 157) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 120.77 156.98) (end 120.75 157) (width 0.4) (layer 4_bot) (net 63) (tstamp 53F39EAE)) + (segment (start 120.77 155.95) (end 118.6 155.95) (width 0.4) (layer 4_bot) (net 63)) + (via (at 118.6 155.95) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 120.77 155.95) (end 120.77 154.92) (width 0.4) (layer 4_bot) (net 63)) + (via (at 120.75 154.9) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 120.77 154.92) (end 120.75 154.9) (width 0.4) (layer 4_bot) (net 63) (tstamp 53F39EA6)) + (segment (start 120.77 143.25) (end 118.6 143.25) (width 0.4) (layer 4_bot) (net 63)) + (via (at 118.6 143.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 174.49 140.71) (end 174.49 141.79) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 174.5 141.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 174.49 141.79) (end 174.5 141.8) (width 0.4) (layer 4_bot) (net 63) (tstamp 53F39CF1)) + (segment (start 174.49 140.71) (end 176.69 140.71) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 176.7 140.7) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 176.69 140.71) (end 176.7 140.7) (width 0.4) (layer 4_bot) (net 63) (tstamp 53F39CED)) + (segment (start 174.49 140.71) (end 172.31 140.71) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 172.3 140.7) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 172.31 140.71) (end 172.3 140.7) (width 0.4) (layer 4_bot) (net 63) (tstamp 53F39CE9)) + (segment (start 174.49 138.17) (end 174.49 139.39) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (segment (start 174.5 140.7) (end 174.49 140.71) (width 0.4) (layer 4_bot) (net 63) (tstamp 53F39CE8) (status 30)) + (segment (start 174.5 139.4) (end 174.5 140.7) (width 0.4) (layer 4_bot) (net 63) (tstamp 53F39CE6) (status 20)) + (via (at 174.5 139.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 174.49 139.39) (end 174.5 139.4) (width 0.4) (layer 4_bot) (net 63) (tstamp 53F39CE4)) + (segment (start 174.49 138.17) (end 174.49 137.11) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 174.5 137.1) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 174.49 137.11) (end 174.5 137.1) (width 0.4) (layer 4_bot) (net 63) (tstamp 53F39CE0)) + (segment (start 174.49 138.17) (end 176.67 138.17) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 176.7 138.2) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 176.67 138.17) (end 176.7 138.2) (width 0.4) (layer 4_bot) (net 63) (tstamp 53F39CDC)) + (segment (start 174.49 138.17) (end 172.33 138.17) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 172.3 138.2) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 172.33 138.17) (end 172.3 138.2) (width 0.4) (layer 4_bot) (net 63) (tstamp 53F39CD8)) + (segment (start 174.49 133.09) (end 174.49 134.19) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 174.5 134.2) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 174.49 134.19) (end 174.5 134.2) (width 0.4) (layer 4_bot) (net 63) (tstamp 53F39CCF)) + (segment (start 174.49 133.09) (end 176.69 133.09) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 176.7 133.1) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 176.69 133.09) (end 176.7 133.1) (width 0.4) (layer 4_bot) (net 63) (tstamp 53F39CCB)) + (segment (start 174.49 133.09) (end 174.49 132.01) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 174.5 132) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 174.49 132.01) (end 174.5 132) (width 0.4) (layer 4_bot) (net 63) (tstamp 53F39CC7)) + (segment (start 147.63 167.57) (end 146.53 167.57) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 146.5 167.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 146.53 167.57) (end 146.5 167.6) (width 0.4) (layer 4_bot) (net 63) (tstamp 53F39C60)) + (segment (start 147.63 167.57) (end 147.63 165.43) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 147.6 165.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 147.63 165.43) (end 147.6 165.4) (width 0.4) (layer 4_bot) (net 63) (tstamp 53F39C58)) + (segment (start 147.63 167.57) (end 148.67 167.57) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 148.7 167.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 148.67 167.57) (end 148.7 167.6) (width 0.4) (layer 4_bot) (net 63) (tstamp 53F39C54)) + (segment (start 165.41 167.57) (end 165.41 169.79) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 165.4 169.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 165.41 169.79) (end 165.4 169.8) (width 0.4) (layer 4_bot) (net 63) (tstamp 53F39C4E)) + (segment (start 165.41 167.57) (end 166.47 167.57) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 166.5 167.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 166.47 167.57) (end 166.5 167.6) (width 0.4) (layer 4_bot) (net 63) (tstamp 53F39C4A)) + (segment (start 165.41 167.57) (end 164.33 167.57) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 164.3 167.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 164.33 167.57) (end 164.3 167.6) (width 0.4) (layer 4_bot) (net 63) (tstamp 53F39C46)) + (segment (start 157.79 167.57) (end 156.73 167.57) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 156.7 167.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 156.73 167.57) (end 156.7 167.6) (width 0.4) (layer 4_bot) (net 63) (tstamp 53F39C42)) + (segment (start 157.79 167.57) (end 158.87 167.57) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 158.9 167.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 158.87 167.57) (end 158.9 167.6) (width 0.4) (layer 4_bot) (net 63) (tstamp 53F39C3E)) + (segment (start 157.79 167.57) (end 157.79 165.41) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 157.8 165.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 157.79 165.41) (end 157.8 165.4) (width 0.4) (layer 4_bot) (net 63) (tstamp 53F39C3A)) + (segment (start 94.6 149.1001) (end 94.6 150.1) (width 0.2) (layer 4_bot) (net 63) (status 10)) + (via (at 94.6 150.1) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 92.75062 149.34996) (end 92.75062 150.19938) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 92.75 150.2) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 92.75062 150.19938) (end 92.75 150.2) (width 0.4) (layer 4_bot) (net 63) (tstamp 53C5B94F)) + (segment (start 92.75062 149.34996) (end 91.70004 149.34996) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 91.7 149.35) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 91.70004 149.34996) (end 91.7 149.35) (width 0.4) (layer 4_bot) (net 63) (tstamp 53C5B94B)) + (segment (start 92.75062 149.34996) (end 92.75062 148.50062) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 92.75 148.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 92.75062 148.50062) (end 92.75 148.5) (width 0.4) (layer 4_bot) (net 63) (tstamp 53C5B947)) + (segment (start 75.825 119.325) (end 75.9 119.4) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 75.9 120.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 75.9 119.4) (end 75.9 120.4) (width 0.4) (layer 4_bot) (net 63) (tstamp 53BC7205) (status 10)) + (segment (start 75.875 118.075) (end 75.9 118.05) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 75.9 117.3) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 75.9 118.05) (end 75.9 117.3) (width 0.4) (layer 4_bot) (net 63) (tstamp 53BC71FD) (status 10)) + (segment (start 75.825 108.575) (end 75.9 108.65) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 75.9 109.7) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 75.9 108.65) (end 75.9 109.7) (width 0.4) (layer 4_bot) (net 63) (tstamp 53BC71ED) (status 10)) + (segment (start 75.825 108.575) (end 75.8 108.6) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 75 108.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 75.8 108.6) (end 75 108.6) (width 0.4) (layer 4_bot) (net 63) (tstamp 53BC71E2) (status 10)) + (segment (start 62.575 117.875) (end 62.6 117.85) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 62.6 117.1) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 62.6 117.85) (end 62.6 117.1) (width 0.4) (layer 4_bot) (net 63) (tstamp 53BC7159) (status 10)) + (segment (start 64.075 117.375) (end 64.1 117.4) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 65 117.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 64.1 117.4) (end 65 117.4) (width 0.4) (layer 4_bot) (net 63) (tstamp 53BC713A) (status 10)) + (segment (start 62.575 117.875) (end 62.6 117.9) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 62.6 118.7) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 62.6 117.9) (end 62.6 118.7) (width 0.4) (layer 4_bot) (net 63) (tstamp 53BC7138) (status 10)) + (segment (start 62.575 113.875) (end 62.6 113.85) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 62.6 113.1) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 62.6 113.85) (end 62.6 113.1) (width 0.4) (layer 4_bot) (net 63) (tstamp 53BC7136) (status 10)) + (segment (start 87.8 147.2001) (end 88.8999 147.2001) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 88.9 147.2) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 88.8999 147.2001) (end 88.9 147.2) (width 0.4) (layer 4_bot) (net 63) (tstamp 53BC2152)) + (segment (start 69.25 122.25) (end 68.9 122.6) (width 0.4) (layer 4_bot) (net 63)) + (via (at 69.25 122.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 69.25 125.25) (end 69.25 122.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE519E)) + (via (at 69.25 125.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 69.25 128.25) (end 69.25 125.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE519B)) + (via (at 69.25 128.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 69.25 131.25) (end 69.25 128.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5192)) + (via (at 69.25 131.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 69.25 134.25) (end 69.25 131.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE518F)) + (via (at 62.7 122.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 65.7 122.6) (end 62.7 122.6) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B190FD)) + (via (at 65.7 122.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 68.9 122.6) (end 65.7 122.6) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B190FB)) + (via (at 89 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (via (at 83 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (via (at 107 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (via (at 113 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 113 101.25) (end 116 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5439)) + (via (at 116 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 116 101.25) (end 119 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE543C)) + (via (at 119 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 119 101.25) (end 122 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE543F)) + (via (at 122 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 122 101.25) (end 122 104.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5443)) + (via (at 122 104.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 122 104.25) (end 122 105.5) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5446)) + (segment (start 122 105.5) (end 123 106.5) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5447)) + (via (at 123 106.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 123 106.5) (end 124.5 108) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE544E)) + (segment (start 124.5 108) (end 126 108) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE544F)) + (via (at 126 108) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 126 108) (end 127.5 108) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE545D)) + (segment (start 127.5 108) (end 128.75 106.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE545E)) + (via (at 128.75 106.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 128.75 106.75) (end 130 105.5) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5466)) + (segment (start 130 105.5) (end 130 104.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5467)) + (via (at 130 104.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 130 104.25) (end 130 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE546D)) + (via (at 130 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 130 101.25) (end 133 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5471)) + (via (at 133 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 133 101.25) (end 136 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5476)) + (via (at 136 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 136 101.25) (end 139 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5479)) + (via (at 139 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 139 101.25) (end 142 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE547C)) + (via (at 142 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 142 101.25) (end 145 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE547F)) + (via (at 145 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 145 101.25) (end 148 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5482)) + (via (at 148 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 148 101.25) (end 151 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5486)) + (via (at 151 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 151 101.25) (end 154 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5489)) + (via (at 154 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 154 101.25) (end 157 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE548D)) + (via (at 157 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 157 101.25) (end 160 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5490)) + (via (at 160 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 160 101.25) (end 163 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5493)) + (via (at 163 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 163 101.25) (end 166 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5496)) + (via (at 166 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 166 101.25) (end 169 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5499)) + (via (at 169 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 169 101.25) (end 172 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE549C)) + (via (at 178.75 108) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (via (at 172 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 172 104.25) (end 172 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4B91)) + (via (at 172 104.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 172 105.5) (end 172 104.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4B8A)) + (segment (start 173.25 106.75) (end 172 105.5) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4B89)) + (via (at 173.25 106.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 174.5 108) (end 173.25 106.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4B83)) + (segment (start 175.75 108) (end 174.5 108) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4B82)) + (via (at 175.75 108) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 178.75 108) (end 175.75 108) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4B7A)) + (via (at 68 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 62.75 108) (end 61.25 109.5) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE53E6)) + (via (at 61.25 109.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 61.25 109.5) (end 61.25 112.5) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE53EE)) + (via (at 61.25 112.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 61.25 112.5) (end 61.25 115.5) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE53F2)) + (via (at 61.25 115.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 61.25 115.5) (end 61.25 118.5) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE53F5)) + (via (at 61.25 118.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (via (at 64 108) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 65.5 108) (end 64 108) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE53C7)) + (segment (start 66.75 106.75) (end 65.5 108) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE53C6)) + (via (at 66.75 106.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 68 105.5) (end 66.75 106.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE53BC)) + (segment (start 68 104.25) (end 68 105.5) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE53BB)) + (via (at 68 104.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 68 101.25) (end 68 104.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE53B7)) + (segment (start 64 108) (end 62.75 108) (width 0.4) (layer 4_bot) (net 63)) + (segment (start 64 104) (end 66.75 101.25) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (segment (start 66.75 101.25) (end 68 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE53A4)) + (segment (start 71 101.25) (end 68 101.25) (width 0.4) (layer 4_bot) (net 63)) + (segment (start 71 101.25) (end 74 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5403)) + (via (at 71 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 74 101.25) (end 77 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5407)) + (via (at 74 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 77 101.25) (end 80 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5411)) + (via (at 77 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 80 101.25) (end 83 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5414)) + (via (at 80 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 89 101.25) (end 92 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE541F)) + (segment (start 92 101.25) (end 95 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5423)) + (via (at 92 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (via (at 95 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 104 101.25) (end 107 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5430)) + (via (at 104 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 101 101.25) (end 104 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE542D)) + (via (at 101 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 98 101.25) (end 101 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5429)) + (via (at 98 101.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 95 101.25) (end 98 101.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5426)) + (segment (start 178.75 108) (end 178.75 111) (width 0.4) (layer 4_bot) (net 63)) + (via (at 178.75 114) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 178.75 111) (end 178.75 114) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4B9D)) + (via (at 178.75 111) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 176 104) (end 178.75 106.75) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (segment (start 178.75 106.75) (end 178.75 108) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4B53)) + (segment (start 69.25 140.25) (end 69.25 137.5) (width 0.4) (layer 1_top) (net 63)) + (via (at 69.25 140.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 69.25 137.5) (end 69.25 134.25) (width 0.4) (layer 1_top) (net 63) (tstamp 53AE5681)) + (via (at 69.25 134.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 68 173.75) (end 68 170.75) (width 0.4) (layer 4_bot) (net 63)) + (via (at 68 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 61.5 158.5) (end 61.75 158.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE553E)) + (via (at 61.5 158.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 61.25 158.75) (end 61.5 158.5) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5535)) + (segment (start 61.25 161) (end 61.25 158.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5534)) + (via (at 61.25 161) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 61.25 164) (end 61.25 161) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5530)) + (via (at 61.25 164) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 61.25 167) (end 61.25 164) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE552C)) + (via (at 61.25 167) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 64.25 167) (end 61.25 167) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5529)) + (via (at 64.25 167) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 65.5 167) (end 64.25 167) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5526)) + (segment (start 66.75 168.25) (end 65.5 167) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5525)) + (via (at 66.75 168.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 68 169.5) (end 66.75 168.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5520)) + (segment (start 68 170.75) (end 68 169.5) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE551F)) + (via (at 68 170.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 64 171) (end 66.75 173.75) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 74 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 71 173.75) (end 74 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE54F3)) + (via (at 71 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 68 173.75) (end 71 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE54EF)) + (segment (start 66.75 173.75) (end 68 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE54E4)) + (via (at 69.25 137.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 69.25 137.5) (end 69.25 134.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE518B)) + (segment (start 69.25 143.25) (end 69.25 140.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4A06)) + (via (at 69.25 143.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 69.25 146.25) (end 69.25 143.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4A03)) + (via (at 69.25 146.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 69.25 149.25) (end 69.25 146.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE49F7)) + (via (at 69.25 149.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 69.25 152.25) (end 69.25 149.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE49F4)) + (via (at 69.25 152.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 69.25 155.25) (end 69.25 152.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE49EB)) + (via (at 69.25 155.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 69.25 158.25) (end 69.25 155.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE49E8)) + (via (at 69.25 158.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 66.75 158.25) (end 69.25 158.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE49E2)) + (via (at 66.75 158.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 63.75 158.25) (end 66.75 158.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE49DF)) + (via (at 63.75 158.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 61.75 158.25) (end 63.75 158.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE5541)) + (segment (start 79 173.75) (end 76 173.75) (width 0.4) (layer 4_bot) (net 63)) + (via (at 169 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 169 173.75) (end 166 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C07)) + (via (at 166 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 166 173.75) (end 163 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C0B)) + (via (at 163 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 163 173.75) (end 160 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C0E)) + (via (at 160 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 160 173.75) (end 157 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C12)) + (via (at 157 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 157 173.75) (end 154 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C15)) + (via (at 154 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 154 173.75) (end 151 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C18)) + (via (at 151 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 151 173.75) (end 148 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C1C)) + (via (at 148 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 148 173.75) (end 145 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C1F)) + (via (at 145 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 145 173.75) (end 142 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C29)) + (via (at 142 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 142 173.75) (end 139 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C2C)) + (via (at 139 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 139 173.75) (end 136 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C35)) + (via (at 136 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 136 173.75) (end 133 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C38)) + (via (at 133 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 133 173.75) (end 130 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C3B)) + (via (at 130 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 130 173.75) (end 127 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C43)) + (via (at 127 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 127 173.75) (end 124 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C47)) + (via (at 124 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 124 173.75) (end 121 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C4A)) + (via (at 121 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 121 173.75) (end 118 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C4E)) + (via (at 118 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 118 173.75) (end 115 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C52)) + (via (at 115 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 115 173.75) (end 112 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C56)) + (via (at 112 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 112 173.75) (end 109 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C59)) + (via (at 109 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 109 173.75) (end 106 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C5D)) + (via (at 106 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 106 173.75) (end 103 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C60)) + (via (at 103 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 103 173.75) (end 100 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C63)) + (via (at 100 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 100 173.75) (end 97 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C67)) + (via (at 97 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 97 173.75) (end 94 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C6B)) + (via (at 94 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 94 173.75) (end 91 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C6E)) + (via (at 91 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 91 173.75) (end 88 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C71)) + (via (at 88 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 88 173.75) (end 85 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C75)) + (via (at 85 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 85 173.75) (end 82 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C78)) + (via (at 82 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 82 173.75) (end 79 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4C7B)) + (via (at 79 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (via (at 172 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 172 173.75) (end 169 173.75) (width 0.4) (layer 4_bot) (net 63)) + (via (at 76 173.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 176 171) (end 173.25 173.75) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 178.75 122) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 178.75 125) (end 178.75 122) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4B31)) + (via (at 178.75 125) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 178.75 128) (end 178.75 125) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4B2D)) + (via (at 178.75 128) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 178.75 131) (end 178.75 128) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4B29)) + (via (at 178.75 131) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 178.75 134) (end 178.75 131) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4B1E)) + (via (at 178.75 134) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 178.75 137) (end 178.75 134) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4B1A)) + (via (at 178.75 137) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 178.75 140) (end 178.75 137) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4B16)) + (via (at 178.75 140) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 178.75 143) (end 178.75 140) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4B12)) + (via (at 178.75 143) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 178.75 146) (end 178.75 143) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4B0E)) + (via (at 178.75 146) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 178.75 149) (end 178.75 146) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4B0A)) + (via (at 178.75 149) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 178.75 152) (end 178.75 149) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4B04)) + (via (at 178.75 152) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 178.75 155) (end 178.75 152) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4AF5)) + (via (at 178.75 155) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 178.75 158) (end 178.75 155) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4AF0)) + (via (at 178.75 158) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 178.75 161) (end 178.75 158) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4ADF)) + (via (at 178.75 161) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 178.75 164) (end 178.75 161) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4ADB)) + (via (at 178.75 164) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 178.75 167) (end 178.75 164) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4AD7)) + (via (at 178.75 167) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 175.75 167) (end 178.75 167) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4AD3)) + (via (at 175.75 167) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 174.5 167) (end 175.75 167) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4ACA)) + (segment (start 173.25 168.25) (end 174.5 167) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4AC9)) + (via (at 173.25 168.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 172 169.5) (end 173.25 168.25) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4ABB)) + (segment (start 172 170.75) (end 172 169.5) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4ABA)) + (via (at 172 170.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 172 173.75) (end 172 170.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4AB5)) + (segment (start 173.25 173.75) (end 172 173.75) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4A9D)) + (segment (start 89.05042 132.6) (end 88.3 132.6) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 88.3 132.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 96.10084 121.3) (end 95 121.3) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 95 121.3) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 96.10084 121.3) (end 96.4 121.00084) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 96.4 120.1) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 96.4 121.00084) (end 96.4 120.1) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B30810) (status 10)) + (segment (start 96.10084 121.3) (end 96.4 121.59916) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 96.4 122.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 96.4 121.59916) (end 96.4 122.5) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B3080B) (status 10)) + (segment (start 97.2 124.75042) (end 97.25042 124.7) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 98 124.7) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 97.25042 124.7) (end 98 124.7) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B307F2) (status 10)) + (segment (start 97.2 124.75042) (end 97.2 124) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 97.2 124) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 96 124.75042) (end 96 124) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 96 124) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 89.10084 125.7) (end 88 125.7) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 88 125.7) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 89.10084 125.7) (end 89.4 125.99916) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 89.4 126.9) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 89.4 125.99916) (end 89.4 126.9) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B30795) (status 10)) + (segment (start 89.10084 125.7) (end 89.4 125.40084) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 89.4 124.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 89.4 125.40084) (end 89.4 124.5) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B3078F) (status 10)) + (segment (start 89.10084 140.7) (end 89.4 140.40084) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 89.4 139.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 89.4 140.40084) (end 89.4 139.5) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B3074E) (status 10)) + (segment (start 89.10084 140.7) (end 88 140.7) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 88 140.7) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 89.10084 140.7) (end 89.4 140.99916) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 89.4 141.9) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 89.4 140.99916) (end 89.4 141.9) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B30746) (status 10)) + (segment (start 101.4 148.69916) (end 101.4 149.7) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 101.4 149.7) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 101.4 148.69916) (end 101.69916 148.4) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 102.6 148.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 101.69916 148.4) (end 102.6 148.4) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B30605) (status 10)) + (segment (start 98.49916 144.8) (end 98.99916 145.3) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 99.5 145.3) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 98.99916 145.3) (end 99.5 145.3) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B305B1) (status 10)) + (segment (start 98.49916 144.8) (end 98.99916 144.3) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 99.5 144.3) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 98.99916 144.3) (end 99.5 144.3) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B305AA) (status 10)) + (segment (start 106.44958 132.2) (end 107.2 132.2) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 107.2 132.2) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 106.44958 132.2) (end 106.4 132.24958) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 106.4 133) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 106.4 132.24958) (end 106.4 133) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B30566) (status 10)) + (segment (start 122.60084 158.9) (end 121.5 158.9) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 121.5 158.9) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 122.60084 158.9) (end 122.9 158.60084) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 122.9 157.7) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 122.9 158.60084) (end 122.9 157.7) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B304FE) (status 10)) + (segment (start 122.60084 158.9) (end 122.9 159.19916) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 122.9 160.1) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 122.9 159.19916) (end 122.9 160.1) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B304FA) (status 10)) + (segment (start 172.50084 159) (end 171.4 159) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 171.4 159) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 172.50084 159) (end 172.8 159.29916) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 172.8 160.2) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 172.8 159.29916) (end 172.8 160.2) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B30486) (status 10)) + (segment (start 172.50084 159) (end 172.8 158.70084) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 172.8 157.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 172.8 158.70084) (end 172.8 157.8) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B30482) (status 10)) + (segment (start 134.10084 122) (end 133 122) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 133 122) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 134.10084 122) (end 134.4 121.70084) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 134.4 120.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 134.4 121.70084) (end 134.4 120.8) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B30428) (status 10)) + (segment (start 134.04958 119.8) (end 134 119.75042) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 134 119) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 134 119.75042) (end 134 119) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B30418) (status 10)) + (segment (start 141.55042 119.8) (end 141.4 119.64958) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 141.4 119) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 141.4 119.64958) (end 141.4 119) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B30405) (status 10)) + (segment (start 144.6 115.70084) (end 144.30084 116) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 143.4 116) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 144.30084 116) (end 143.4 116) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B303FB) (status 10)) + (segment (start 144.6 115.70084) (end 144.89916 116) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 145.8 116) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 144.89916 116) (end 145.8 116) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B303EF) (status 10)) + (segment (start 144.6 112.29916) (end 144.89916 112) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 145.8 112) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 144.89916 112) (end 145.8 112) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B303E7) (status 10)) + (segment (start 144.6 112.29916) (end 144.30084 112) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 143.4 112) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 144.30084 112) (end 143.4 112) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B303E3) (status 10)) + (segment (start 142.44958 108.2) (end 142.4 108.24958) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 142.4 109) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 142.4 108.24958) (end 142.4 109) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B303CC) (status 10)) + (segment (start 137.09916 106.4) (end 138.2 106.4) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 138.2 106.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 137.09916 106.4) (end 137.4 106.70084) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 137.4 107.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 137.4 106.70084) (end 137.4 107.6) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B303B7) (status 10)) + (segment (start 135.84958 108.2) (end 136.6 108.2) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 136.6 108.2) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 131.50084 106.8) (end 131.2 107.10084) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 131.2 108) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 131.2 107.10084) (end 131.2 108) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B30397) (status 10)) + (segment (start 132.75042 108.6) (end 132 108.6) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 132 108.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 131.50084 106.8) (end 131.8 106.50084) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 131.8 105.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 131.8 106.50084) (end 131.8 105.6) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B3038C) (status 10)) + (segment (start 77.09916 123.2) (end 76.8 123.49916) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 76.8 124.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 76.8 123.49916) (end 76.8 124.4) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B30358) (status 10)) + (segment (start 77.09916 123.2) (end 78.2 123.2) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 78.2 123.2) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 77.09916 123.2) (end 76.8 122.90084) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 76.8 122) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 76.8 122.90084) (end 76.8 122) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B30350) (status 10)) + (segment (start 72.64958 122.8) (end 72.6 122.84958) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 72.6 123.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 72.6 122.84958) (end 72.6 123.6) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B30335) (status 10)) + (segment (start 72.64958 122.8) (end 72.6 122.75042) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 72.6 122) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 72.6 122.75042) (end 72.6 122) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B30331) (status 10)) + (segment (start 130.2 115.70084) (end 129.90084 116) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 129 116) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 129.90084 116) (end 129 116) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B2F3D7) (status 10)) + (segment (start 130.2 115.70084) (end 130.49916 116) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 131.4 116) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 130.49916 116) (end 131.4 116) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B2F3C4) (status 10)) + (segment (start 82.35 160) (end 82.35 157.4) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 82.35 157.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 165.2 155.29916) (end 165.2 156.4) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 165.2 156.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 165.2 155.29916) (end 165.49916 155) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 166.4 155) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 165.49916 155) (end 166.4 155) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B195B9) (status 10)) + (segment (start 165.2 155.29916) (end 164.90084 155) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 164 155) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 164.90084 155) (end 164 155) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B195B5) (status 10)) + (segment (start 156.09916 157.8) (end 155.8 157.50084) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 155.8 156.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 155.8 157.50084) (end 155.8 156.5) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B193C4) (status 10)) + (segment (start 156.09916 157.8) (end 157.2 157.8) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 157.2 157.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 156.09916 157.8) (end 155.8 158.09916) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 155.8 159.1) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 155.8 158.09916) (end 155.8 159.1) (width 0.4) (layer 4_bot) (net 63) (tstamp 53B193BC) (status 10)) + (segment (start 173.9999 121.6) (end 173.9999 120.6001) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (segment (start 173.9999 120.6001) (end 174 120.6) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE36D8)) + (via (at 174 120.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (via (at 169 122.2) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 169.9999 122.2) (end 169 122.2) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (segment (start 169.9999 121.1001) (end 170 121.1) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE4607)) + (via (at 170 121.1) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 169.9999 122.2) (end 169.9999 121.1001) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 132.4 110.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 132.40012 110.49988) (end 132.4 110.5) (width 0.4) (layer 4_bot) (net 63) (tstamp 53ADF166)) + (segment (start 133.17598 110.49988) (end 132.40012 110.49988) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (segment (start 161 107.4) (end 161 108.3999) (width 0.4) (layer 4_bot) (net 63) (status 20)) + (via (at 161 107.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 162.8 108.3999) (end 162.8 107.4) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 162.8 107.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 169.9999 124) (end 169.9999 125.0999) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 170 125.1) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 169.9999 125.0999) (end 170 125.1) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE45FF)) + (segment (start 169.9999 124) (end 169 124) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 169 124) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 82.2 125.65) (end 82.2 127.35) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 82.2 127.35) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 83.4 126.05) (end 83.4 127.35) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 83.4 127.35) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 83.4 126.05) (end 84.3 126.05) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 84.3 126.05) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 83.4 126.05) (end 83.4 124.85) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (segment (start 83.4 124.85) (end 83.55 124.7) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE3897)) + (via (at 83.55 124.7) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 82.2 125.65) (end 80.9 125.65) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 80.9 125.65) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 82.2 125.65) (end 82.2 123.95) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 82.2 123.95) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 83.4 148.95) (end 83.4 147.65) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 83.4 147.65) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 82.2 149.35) (end 80.9 149.35) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 80.9 149.35) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 82.2 149.35) (end 82.2 147.65) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 82.2 147.65) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 82.2 149.35) (end 82.2 151.05) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 82.2 151.05) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 83.4 148.95) (end 83.4 150.15) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (segment (start 83.4 150.15) (end 83.55 150.3) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE3855)) + (via (at 83.55 150.3) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 83.4 148.95) (end 84.3 148.95) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 84.3 148.95) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 82.35 160) (end 82.35 162.6) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 82.35 162.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 82.35 160) (end 80.2 160) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 80.2 160) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 82.35 160) (end 84.5 160) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 84.5 160) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 162.8 121.6001) (end 162.8 122.6) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 162.8 122.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 161 121.6001) (end 161 122.6) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 161 122.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 161 121.6001) (end 160.0001 121.6001) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (segment (start 160.0001 121.6001) (end 160 121.6) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE37BE)) + (via (at 160 121.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 161 108.3999) (end 160.0001 108.3999) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (segment (start 160.0001 108.3999) (end 160 108.4) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE3795)) + (via (at 160 108.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 162.8 108.3999) (end 163.7999 108.3999) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (segment (start 163.7999 108.3999) (end 163.8 108.4) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE3778)) + (via (at 163.8 108.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 173.9999 121.6) (end 173.9999 122.5999) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (segment (start 173.9999 122.5999) (end 174 122.6) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE36E1)) + (via (at 174 122.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 173.9999 121.6) (end 173 121.6) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 173 121.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 98.2001 150.6) (end 99.2 150.6) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 99.2 150.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 98 147.8) (end 98 149) (width 0.4) (layer 4_bot) (net 63)) + (via (at 98 147.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (via (at 98 149) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 99.34874 147.8) (end 98 147.8) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 98 146.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 98 147.8) (end 98 146.6) (width 0.4) (layer 4_bot) (net 63) (tstamp 53AE1EBF)) + (via (at 136 119) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 136 119.64958) (end 136 119) (width 0.4) (layer 4_bot) (net 63) (tstamp 53ADF26A) (status 10)) + (segment (start 136.15042 119.8) (end 136 119.64958) (width 0.4) (layer 4_bot) (net 63) (status 30)) + (via (at 135.1 119) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 135.12416 118.97584) (end 135.1 119) (width 0.4) (layer 4_bot) (net 63) (tstamp 53ADF236)) + (segment (start 135.12416 117.50012) (end 135.12416 118.97584) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 137.4 112) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (via (at 142.4 110.5) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 142.39988 110.49988) (end 142.4 110.5) (width 0.4) (layer 4_bot) (net 63) (tstamp 53ADF16A)) + (segment (start 141.62402 110.49988) (end 142.39988 110.49988) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (segment (start 137.72512 110.49988) (end 137.72512 111.67488) (width 0.2) (layer 4_bot) (net 63) (status 10)) + (segment (start 137.07488 111.67488) (end 137.4 112) (width 0.2) (layer 4_bot) (net 63) (tstamp 53ADF17E)) + (segment (start 137.07488 111.67488) (end 137.07488 110.49988) (width 0.2) (layer 4_bot) (net 63) (status 20)) + (segment (start 137.72512 111.67488) (end 137.4 112) (width 0.2) (layer 4_bot) (net 63) (tstamp 53ADF182)) + (via (at 97.6 132.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63) (status 30)) + (segment (start 97.6 132.8) (end 97.6 135) (width 0.2) (layer 4_bot) (net 63) (status 30)) + (via (at 97.6 135) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63) (status 30)) + (segment (start 97.6 132.8) (end 99.8 132.8) (width 0.2) (layer 4_bot) (net 63) (status 30)) + (via (at 99.8 132.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63) (status 30)) + (segment (start 97.6 132.8) (end 95.4 132.8) (width 0.2) (layer 4_bot) (net 63) (status 30)) + (via (at 95.4 132.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63) (status 30)) + (segment (start 97.6 132.8) (end 97.6 130.6) (width 0.2) (layer 4_bot) (net 63) (status 30)) + (via (at 97.6 130.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63) (status 30)) + (segment (start 97.6 132.8) (end 99.8 135) (width 0.2) (layer 4_bot) (net 63) (status 30)) + (via (at 99.8 135) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63) (status 30)) + (segment (start 97.6 132.8) (end 95.4 135) (width 0.2) (layer 4_bot) (net 63) (status 30)) + (via (at 95.4 135) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63) (status 30)) + (segment (start 97.6 132.8) (end 99.8 130.6) (width 0.2) (layer 4_bot) (net 63) (status 30)) + (via (at 99.8 130.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63) (status 30)) + (segment (start 97.6 132.8) (end 95.4 130.6) (width 0.2) (layer 4_bot) (net 63) (status 30)) + (via (at 95.4 130.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63) (status 30)) + (segment (start 85.3 143.75) (end 86.1 143.75) (width 0.3) (layer 4_bot) (net 63) (status 10)) + (segment (start 86.1 143.75) (end 86.45 143.4) (width 0.3) (layer 4_bot) (net 63) (tstamp 53AB3F31)) + (via (at 86.45 143.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 85.3 143.25) (end 84.15 143.25) (width 0.3) (layer 4_bot) (net 63) (status 10)) + (via (at 84.15 143.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 85.3 139.75) (end 86.45 139.75) (width 0.3) (layer 4_bot) (net 63) (status 10)) + (via (at 86.45 139.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 85.3 139.25) (end 84.15 139.25) (width 0.3) (layer 4_bot) (net 63) (status 10)) + (via (at 84.15 139.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 85.3 130.25) (end 84.45 130.25) (width 0.3) (layer 4_bot) (net 63) (status 10)) + (segment (start 84.45 130.25) (end 84.15 130.55) (width 0.3) (layer 4_bot) (net 63) (tstamp 53AA6CDF)) + (via (at 84.15 130.55) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 85.3 146.25) (end 86.45 146.25) (width 0.3) (layer 4_bot) (net 63) (status 10)) + (via (at 86.45 146.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 85.3 141.75) (end 86.45 141.75) (width 0.3) (layer 4_bot) (net 63) (status 10)) + (via (at 86.45 141.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 85.3 140.75) (end 86.45 140.75) (width 0.3) (layer 4_bot) (net 63) (status 10)) + (via (at 86.45 140.75) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 85.3 142.25) (end 84.15 142.25) (width 0.3) (layer 4_bot) (net 63) (status 10)) + (via (at 84.15 142.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 85.3 141.25) (end 84.15 141.25) (width 0.3) (layer 4_bot) (net 63) (status 10)) + (via (at 84.15 141.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 85.3 140.25) (end 84.15 140.25) (width 0.3) (layer 4_bot) (net 63) (status 10)) + (via (at 84.15 140.25) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 97 141.64958) (end 97 142.4) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 97 142.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 98.6 141.64958) (end 98.6 142.4) (width 0.4) (layer 4_bot) (net 63) (status 10)) + (via (at 98.6 142.4) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 63)) + (segment (start 162.8 119.9999) (end 163.7999 119.9999) (width 0.4) (layer 4_bot) (net 64) (status 10)) + (segment (start 163.7999 119.9999) (end 164.5999 120.7999) (width 0.4) (layer 4_bot) (net 64) (tstamp 53AE0179)) + (segment (start 164.5999 120.7999) (end 164.5999 121.6) (width 0.4) (layer 4_bot) (net 64) (tstamp 53AE017B) (status 20)) + (segment (start 162.8 119.9999) (end 161 119.9999) (width 0.4) (layer 4_bot) (net 64) (status 30)) + (segment (start 161 119.9999) (end 157.3497 119.9999) (width 0.4) (layer 4_bot) (net 64) (status 30)) + (segment (start 157.3497 119.9999) (end 157.3496 120) (width 0.4) (layer 4_bot) (net 64) (tstamp 53AE0130) (status 30)) + (segment (start 164.5999 110) (end 162.8001 110) (width 0.4) (layer 4_bot) (net 65) (status 30)) + (segment (start 162.8001 110) (end 162.8 110.0001) (width 0.4) (layer 4_bot) (net 65) (tstamp 53AE012D) (status 30)) + (segment (start 162.8 110.0001) (end 161 110.0001) (width 0.4) (layer 4_bot) (net 65) (status 30)) + (segment (start 161 110.0001) (end 157.3497 110.0001) (width 0.4) (layer 4_bot) (net 65) (status 30)) + (segment (start 157.3497 110.0001) (end 157.3496 110) (width 0.4) (layer 4_bot) (net 65) (tstamp 53AE0127) (status 30)) + (segment (start 140.2001 108.2) (end 140.2001 107.1999) (width 0.4) (layer 4_bot) (net 66) (status 10)) + (segment (start 140.2001 107.1999) (end 143 104.4) (width 0.4) (layer 4_bot) (net 66) (tstamp 53AE01D6) (status 20)) + (segment (start 143 104.4) (end 143.55006 104.4) (width 0.4) (layer 4_bot) (net 66) (tstamp 53AE01D9) (status 30)) + (segment (start 171.6001 122.2) (end 171.6001 119.8) (width 0.4) (layer 4_bot) (net 67)) + (segment (start 171.6001 119.8) (end 171.6 119.8) (width 0.4) (layer 4_bot) (net 67)) + (segment (start 171.6 119.8) (end 168.1 116.3) (width 0.4) (layer 4_bot) (net 67)) + (segment (start 168.1 116.3) (end 157.9 116.3) (width 0.4) (layer 4_bot) (net 67)) + (segment (start 157.9 116.3) (end 154.2 112.6) (width 0.4) (layer 4_bot) (net 67)) + (segment (start 154.2 112.6) (end 154.2 108.8) (width 0.4) (layer 4_bot) (net 67)) + (segment (start 154.2 108.8) (end 148.4 103) (width 0.4) (layer 4_bot) (net 67)) + (segment (start 148.4 103) (end 145.4 103) (width 0.4) (layer 4_bot) (net 67)) + (segment (start 142 103) (end 145.4 103) (width 0.4) (layer 4_bot) (net 67)) + (segment (start 140.04994 104.4) (end 140.6 104.4) (width 0.4) (layer 4_bot) (net 67) (tstamp 53AE01C4) (status 30)) + (segment (start 142 103) (end 140.6 104.4) (width 0.4) (layer 4_bot) (net 67) (tstamp 53AE01C0) (status 20)) + (segment (start 173.3999 124) (end 171.6001 124) (width 0.4) (layer 4_bot) (net 67) (status 30)) + (segment (start 171.6001 124) (end 171.6001 122.2) (width 0.4) (layer 4_bot) (net 67) (tstamp 53AE45E8) (status 30)) + (segment (start 140.04994 104.4) (end 137.2001 104.4) (width 0.4) (layer 4_bot) (net 67) (status 30)) + (segment (start 96.65126 148.74996) (end 96.65126 150.54864) (width 0.2) (layer 4_bot) (net 68) (status 30)) + (segment (start 96.65126 150.54864) (end 96.5999 150.6) (width 0.2) (layer 4_bot) (net 68) (tstamp 53AE1EEA) (status 30)) + (segment (start 85.3 147.25) (end 85.3 147.75) (width 0.3) (layer 4_bot) (net 69) (status 10)) + (segment (start 85.3 147.75) (end 85.95 148.4) (width 0.4) (layer 4_bot) (net 69) (tstamp 53C5B93F)) + (segment (start 85.95 148.4) (end 90.4 148.4) (width 0.4) (layer 4_bot) (net 69) (tstamp 53C5B940) (status 20)) + (segment (start 90.4 148.4) (end 90.44938 148.4) (width 0.4) (layer 4_bot) (net 69) (tstamp 53C5B941) (status 30)) + (segment (start 166.2001 121.6) (end 166.2001 118.5999) (width 0.4) (layer 4_bot) (net 70) (status 30)) + (segment (start 166.2001 118.5999) (end 166.3 118.5) (width 0.4) (layer 4_bot) (net 70) (tstamp 53B18C8E) (status 30)) + (segment (start 173.8 111.1) (end 168.3 111.1) (width 0.4) (layer 4_bot) (net 71) (status 10)) + (segment (start 167.2 110) (end 168.3 111.1) (width 0.4) (layer 4_bot) (net 71) (tstamp 53AE0174)) + (segment (start 167.2 110) (end 166.2001 110) (width 0.4) (layer 4_bot) (net 71) (status 20)) + (segment (start 175.6001 121.6) (end 175.6001 118.5999) (width 0.4) (layer 4_bot) (net 72) (status 30)) + (segment (start 175.6001 118.5999) (end 175.7 118.5) (width 0.4) (layer 4_bot) (net 72) (tstamp 53B18C88) (status 30)) + (segment (start 178.5 118.5) (end 177.6 119.4) (width 0.4) (layer 4_bot) (net 73) (status 30)) + (segment (start 177.6 122.2) (end 175.8 124) (width 0.4) (layer 4_bot) (net 73) (tstamp 53AE45C2)) + (segment (start 175.8 124) (end 175.0001 124) (width 0.4) (layer 4_bot) (net 73) (tstamp 53AE45C3) (status 20)) + (segment (start 177.6 119.4) (end 177.6 122.2) (width 0.4) (layer 4_bot) (net 73) (tstamp 53B18C82) (status 10)) + (segment (start 165.45 150.9) (end 169.205 150.9) (width 0.2) (layer 4_bot) (net 78) (status 30)) + (segment (start 169.205 150.9) (end 169.235 150.87) (width 0.2) (layer 4_bot) (net 78) (tstamp 53AB1836) (status 30)) + (segment (start 165.45 150) (end 166.9 150) (width 0.2) (layer 4_bot) (net 79) (status 10)) + (segment (start 172.27 150.87) (end 174.285 150.87) (width 0.2) (layer 4_bot) (net 79) (tstamp 53AB1831) (status 20)) + (segment (start 171.3 149.9) (end 172.27 150.87) (width 0.2) (layer 4_bot) (net 79) (tstamp 53AB182F)) + (segment (start 167 149.9) (end 171.3 149.9) (width 0.2) (layer 4_bot) (net 79) (tstamp 53AB182E)) + (segment (start 166.9 150) (end 167 149.9) (width 0.2) (layer 4_bot) (net 79) (tstamp 53AB182D)) + (segment (start 165.45 148.3) (end 169.205 148.3) (width 0.2) (layer 4_bot) (net 80) (status 30)) + (segment (start 169.205 148.3) (end 169.235 148.33) (width 0.2) (layer 4_bot) (net 80) (tstamp 53AB1834) (status 30)) + (segment (start 165.45 149.2) (end 166.9 149.2) (width 0.2) (layer 4_bot) (net 81) (status 10)) + (segment (start 172.27 148.33) (end 174.285 148.33) (width 0.2) (layer 4_bot) (net 81) (tstamp 53AB182A) (status 20)) + (segment (start 171.3 149.3) (end 172.27 148.33) (width 0.2) (layer 4_bot) (net 81) (tstamp 53AB1828)) + (segment (start 167 149.3) (end 171.3 149.3) (width 0.2) (layer 4_bot) (net 81) (tstamp 53AB1827)) + (segment (start 166.9 149.2) (end 167 149.3) (width 0.2) (layer 4_bot) (net 81) (tstamp 53AB1826)) + (segment (start 165.45 145.8) (end 169.225 145.8) (width 0.2) (layer 4_bot) (net 82) (status 30)) + (segment (start 169.225 145.8) (end 169.235 145.79) (width 0.2) (layer 4_bot) (net 82) (tstamp 53AB1824) (status 30)) + (segment (start 165.45 144.9) (end 166.9 144.9) (width 0.2) (layer 4_bot) (net 83) (status 10)) + (segment (start 172.29 145.79) (end 174.285 145.79) (width 0.2) (layer 4_bot) (net 83) (tstamp 53AB181F) (status 20)) + (segment (start 171.3 144.8) (end 172.29 145.79) (width 0.2) (layer 4_bot) (net 83) (tstamp 53AB181D)) + (segment (start 167 144.8) (end 171.3 144.8) (width 0.2) (layer 4_bot) (net 83) (tstamp 53AB181C)) + (segment (start 166.9 144.9) (end 167 144.8) (width 0.2) (layer 4_bot) (net 83) (tstamp 53AB181B)) + (segment (start 165.45 143.2) (end 169.185 143.2) (width 0.2) (layer 4_bot) (net 84) (status 30)) + (segment (start 169.185 143.2) (end 169.235 143.25) (width 0.2) (layer 4_bot) (net 84) (tstamp 53AB1822) (status 30)) + (segment (start 165.45 144.1) (end 166.9 144.1) (width 0.2) (layer 4_bot) (net 85) (status 10)) + (segment (start 172.25 143.25) (end 174.285 143.25) (width 0.2) (layer 4_bot) (net 85) (tstamp 53AB1818) (status 20)) + (segment (start 171.3 144.2) (end 172.25 143.25) (width 0.2) (layer 4_bot) (net 85) (tstamp 53AB1816)) + (segment (start 167 144.2) (end 171.3 144.2) (width 0.2) (layer 4_bot) (net 85) (tstamp 53AB1815)) + (segment (start 166.9 144.1) (end 167 144.2) (width 0.2) (layer 4_bot) (net 85) (tstamp 53AB1814)) + (segment (start 161 159.0001) (end 161 159.8) (width 0.2) (layer 4_bot) (net 91) (status 10)) + (segment (start 162.87 165.27) (end 162.87 167.365) (width 0.2) (layer 4_bot) (net 91) (tstamp 53ACF435) (status 20)) + (segment (start 161.6 164) (end 162.87 165.27) (width 0.2) (layer 4_bot) (net 91) (tstamp 53ACF431)) + (segment (start 161.6 160.4) (end 161.6 164) (width 0.2) (layer 4_bot) (net 91) (tstamp 53ACF42F)) + (segment (start 161 159.8) (end 161.6 160.4) (width 0.2) (layer 4_bot) (net 91) (tstamp 53ACF42C)) + (segment (start 162.8 159.0001) (end 162.8 162.245) (width 0.2) (layer 4_bot) (net 92) (status 30)) + (segment (start 162.8 162.245) (end 162.87 162.315) (width 0.2) (layer 4_bot) (net 92) (tstamp 53ACF42A) (status 30)) + (segment (start 146.0001 158.2) (end 146.0001 159.2001) (width 0.2) (layer 4_bot) (net 98) (status 10)) + (segment (start 146.4 159.6) (end 146.4 164) (width 0.2) (layer 4_bot) (net 98) (tstamp 53ADE5E8)) + (segment (start 146.0001 159.2001) (end 146.4 159.6) (width 0.2) (layer 4_bot) (net 98) (tstamp 53ADE5E7)) + (segment (start 145.09 167.365) (end 145.09 165.31) (width 0.2) (layer 4_bot) (net 98) (status 10)) + (segment (start 145.09 165.31) (end 146.4 164) (width 0.2) (layer 4_bot) (net 98) (tstamp 53ADAA05)) + (segment (start 134.45 162.7) (end 134.45 161.25) (width 0.2) (layer 4_bot) (net 99) (status 10)) + (segment (start 145.09 159.99) (end 145.09 162.315) (width 0.2) (layer 4_bot) (net 99) (tstamp 53ADA9F8) (status 20)) + (segment (start 144.4 159.3) (end 145.09 159.99) (width 0.2) (layer 4_bot) (net 99) (tstamp 53ADA9F6)) + (segment (start 136.4 159.3) (end 144.4 159.3) (width 0.2) (layer 4_bot) (net 99) (tstamp 53ADA9F4)) + (segment (start 134.45 161.25) (end 136.4 159.3) (width 0.2) (layer 4_bot) (net 99) (tstamp 53ADA9F1)) + (segment (start 142.55 167.365) (end 142.55 169.65) (width 0.2) (layer 4_bot) (net 100) (status 10)) + (segment (start 134.4 165.3) (end 134.45 165.3) (width 0.2) (layer 4_bot) (net 100) (tstamp 53F38FE6) (status 30)) + (segment (start 134.4 168.3) (end 134.4 165.3) (width 0.2) (layer 4_bot) (net 100) (tstamp 53F38FE4) (status 20)) + (segment (start 136.4 170.3) (end 134.4 168.3) (width 0.2) (layer 4_bot) (net 100) (tstamp 53F38FE2)) + (segment (start 141.9 170.3) (end 136.4 170.3) (width 0.2) (layer 4_bot) (net 100) (tstamp 53F38FE0)) + (segment (start 142.55 169.65) (end 141.9 170.3) (width 0.2) (layer 4_bot) (net 100) (tstamp 53F38FDE)) + (segment (start 142.55 162.315) (end 142.55 164.45) (width 0.2) (layer 4_bot) (net 101) (status 10)) + (segment (start 134.5 164.4) (end 134.45 164.4) (width 0.2) (layer 4_bot) (net 101) (tstamp 53F38FF4) (status 30)) + (segment (start 135.4 164.4) (end 134.5 164.4) (width 0.2) (layer 4_bot) (net 101) (tstamp 53F38FF3) (status 20)) + (segment (start 135.7 164.7) (end 135.4 164.4) (width 0.2) (layer 4_bot) (net 101) (tstamp 53F38FF2)) + (segment (start 135.7 168.7) (end 135.7 164.7) (width 0.2) (layer 4_bot) (net 101) (tstamp 53F38FF0)) + (segment (start 136.7 169.7) (end 135.7 168.7) (width 0.2) (layer 4_bot) (net 101) (tstamp 53F38FEE)) + (segment (start 140.8 169.7) (end 136.7 169.7) (width 0.2) (layer 4_bot) (net 101) (tstamp 53F38FED)) + (segment (start 141.3 169.2) (end 140.8 169.7) (width 0.2) (layer 4_bot) (net 101) (tstamp 53F38FEB)) + (segment (start 141.3 165.7) (end 141.3 169.2) (width 0.2) (layer 4_bot) (net 101) (tstamp 53F38FE9)) + (segment (start 142.55 164.45) (end 141.3 165.7) (width 0.2) (layer 4_bot) (net 101) (tstamp 53F38FE7)) + (segment (start 120.77 148.33) (end 118.63 148.33) (width 0.2) (layer 4_bot) (net 103) (status 10)) + (segment (start 99.8 127.396004) (end 99.8 128.6) (width 0.2) (layer 4_bot) (net 103) (status 20)) + (segment (start 114 133.2) (end 117 133.2) (width 0.2) (layer 4_bot) (net 103) (tstamp 53AB7418)) + (segment (start 107.8 127) (end 114 133.2) (width 0.2) (layer 4_bot) (net 103) (tstamp 53AB740F)) + (segment (start 100.196004 127) (end 107.8 127) (width 0.2) (layer 4_bot) (net 103) (tstamp 53AB740B)) + (segment (start 99.8 127.396004) (end 100.196004 127) (width 0.2) (layer 4_bot) (net 103) (tstamp 53AB7405)) + (via (at 117 133.2) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 103)) + (segment (start 117 146.7) (end 117 133.2) (width 0.2) (layer 1_top) (net 103)) + (segment (start 118.6 148.3) (end 117 146.7) (width 0.2) (layer 1_top) (net 103) (tstamp 53F39E2C)) + (via (at 118.6 148.3) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 103)) + (segment (start 118.63 148.33) (end 118.6 148.3) (width 0.2) (layer 4_bot) (net 103) (tstamp 53F39E2A)) + (segment (start 120.77 145.79) (end 118.61 145.79) (width 0.2) (layer 4_bot) (net 104) (status 10)) + (segment (start 108.2 129.2) (end 114.6 135.6) (width 0.2) (layer 4_bot) (net 104)) + (segment (start 101.8 129.4) (end 101.8 129.8) (width 0.2) (layer 4_bot) (net 104) (status 20)) + (segment (start 101.8 129.4) (end 102 129.2) (width 0.2) (layer 4_bot) (net 104) (tstamp 53AB7382)) + (segment (start 102 129.2) (end 108.2 129.2) (width 0.2) (layer 4_bot) (net 104) (tstamp 53AB7384)) + (segment (start 114.6 135.6) (end 117.8 135.6) (width 0.2) (layer 4_bot) (net 104) (tstamp 53ACCDD8)) + (via (at 117.8 135.6) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 104)) + (segment (start 117.8 145) (end 117.8 135.6) (width 0.2) (layer 1_top) (net 104)) + (segment (start 118.6 145.8) (end 117.8 145) (width 0.2) (layer 1_top) (net 104) (tstamp 53F39E94)) + (via (at 118.6 145.8) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 104)) + (segment (start 118.61 145.79) (end 118.6 145.8) (width 0.2) (layer 4_bot) (net 104) (tstamp 53F39E92)) + (segment (start 120.965 145.8) (end 120.975 145.79) (width 0.2) (layer 4_bot) (net 104) (tstamp 53AB765C) (status 30)) + (segment (start 121 145.765) (end 120.975 145.79) (width 0.2) (layer 4_bot) (net 104) (tstamp 53AB73A7) (status 30)) + (segment (start 126.025 135.63) (end 123.83 135.63) (width 0.2) (layer 4_bot) (net 110) (status 10)) + (segment (start 108.2 128.6) (end 100.6 128.6) (width 0.2) (layer 4_bot) (net 110) (tstamp 53AB7347) (status 20)) + (segment (start 114.25 134.65) (end 108.2 128.6) (width 0.2) (layer 4_bot) (net 110) (tstamp 53AB7345)) + (segment (start 122.85 134.65) (end 114.25 134.65) (width 0.2) (layer 4_bot) (net 110) (tstamp 53AB7343)) + (segment (start 123.83 135.63) (end 122.85 134.65) (width 0.2) (layer 4_bot) (net 110) (tstamp 53AB733F)) + (segment (start 126.23 133.09) (end 125.11 133.09) (width 0.2) (layer 4_bot) (net 112) (status 30)) + (segment (start 124.1 134.1) (end 114.3 134.1) (width 0.2) (layer 4_bot) (net 112) (tstamp 53AB7335)) + (segment (start 114.3 134.1) (end 107.6 127.4) (width 0.2) (layer 4_bot) (net 112) (tstamp 53AB7337)) + (segment (start 107.6 127.4) (end 100.4 127.4) (width 0.2) (layer 4_bot) (net 112) (tstamp 53AB7339)) + (segment (start 100.4 127.4) (end 100.2 127.6) (width 0.2) (layer 4_bot) (net 112) (tstamp 53AB733C)) + (segment (start 100.2 127.6) (end 100.2 128.6) (width 0.2) (layer 4_bot) (net 112) (tstamp 53AB733D) (status 20)) + (segment (start 125.11 133.09) (end 124.1 134.1) (width 0.2) (layer 4_bot) (net 112) (tstamp 53F39E10) (status 10)) + (segment (start 130.9 133.1) (end 126.2 133.1) (width 0.2) (layer 4_bot) (net 112) (status 20)) + (segment (start 138.5 121.7001) (end 138.5 122.6) (width 0.2) (layer 4_bot) (net 112) (status 10)) + (segment (start 138.3 123.2) (end 130.9 123.2) (width 0.2) (layer 4_bot) (net 112) (tstamp 53AE2874)) + (segment (start 138.5 122.6) (end 138.3 123.2) (width 0.2) (layer 4_bot) (net 112) (tstamp 53AE2871)) + (via (at 130.9 133.1) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 112)) + (segment (start 130.9 133.1) (end 130.9 123.2) (width 0.2) (layer 1_top) (net 112) (tstamp 53F39D68)) + (via (at 130.9 123.2) (size 0.6858) (drill 0.3302) (layers 1_top 4_bot) (net 112)) + (segment (start 126.2 133.1) (end 126.23 133.09) (width 0.2) (layer 4_bot) (net 112) (tstamp 53F39D73) (status 30)) + (segment (start 101.8 135) (end 103 135) (width 0.2) (layer 4_bot) (net 115) (status 10)) + (segment (start 162.8 156.6) (end 161.4 155.2) (width 0.2) (layer 4_bot) (net 115) (tstamp 53ACF47E)) + (segment (start 162.8 156.6) (end 162.8 157.3999) (width 0.2) (layer 4_bot) (net 115) (status 20)) + (segment (start 134.9 155.2) (end 161.4 155.2) (width 0.2) (layer 4_bot) (net 115) (tstamp 53ADA619)) + (segment (start 129.101998 149.401998) (end 134.9 155.2) (width 0.2) (layer 4_bot) (net 115) (tstamp 53ADA608)) + (segment (start 117.401998 149.401998) (end 129.101998 149.401998) (width 0.2) (layer 4_bot) (net 115) (tstamp 53ADA5F7)) + (segment (start 103 135) (end 117.401998 149.401998) (width 0.2) (layer 4_bot) (net 115) (tstamp 53ADA5F4)) + (segment (start 101.8 135.4) (end 102.8 135.4) (width 0.2) (layer 4_bot) (net 116) (status 10)) + (segment (start 159.9999 157.3999) (end 158.4 155.8) (width 0.2) (layer 4_bot) (net 116) (tstamp 53ACF476)) + (segment (start 159.9999 157.3999) (end 161 157.3999) (width 0.2) (layer 4_bot) (net 116) (status 20)) + (segment (start 134.4 155.8) (end 158.4 155.8) (width 0.2) (layer 4_bot) (net 116) (tstamp 53ADA5DD)) + (segment (start 128.4 149.8) (end 134.4 155.8) (width 0.2) (layer 4_bot) (net 116) (tstamp 53ADA5DA)) + (segment (start 117.2 149.8) (end 128.4 149.8) (width 0.2) (layer 4_bot) (net 116) (tstamp 53ADA5D7)) + (segment (start 102.8 135.4) (end 117.2 149.8) (width 0.2) (layer 4_bot) (net 116) (tstamp 53ADA5D4)) + (segment (start 144.3999 158.2) (end 135 158.2) (width 0.2) (layer 4_bot) (net 117) (status 10)) + (segment (start 101.8 136.2) (end 101.8 135.8) (width 0.2) (layer 4_bot) (net 117) (tstamp 53ADAA1D) (status 20)) + (segment (start 117.8 152.2) (end 101.8 136.2) (width 0.2) (layer 4_bot) (net 117) (tstamp 53ADAA1C)) + (segment (start 129 152.2) (end 117.8 152.2) (width 0.2) (layer 4_bot) (net 117) (tstamp 53ADAA10)) + (segment (start 135 158.2) (end 129 152.2) (width 0.2) (layer 4_bot) (net 117) (tstamp 53ADAA0E)) + (segment (start 97.2 143.6) (end 101 143.6) (width 0.2) (layer 4_bot) (net 118)) + (segment (start 97 137) (end 97 139) (width 0.2) (layer 4_bot) (net 118) (status 10)) + (segment (start 96.2 142.6) (end 97.2 143.6) (width 0.2) (layer 4_bot) (net 118) (tstamp 53AB45A4)) + (segment (start 96.2 139.8) (end 96.2 142.6) (width 0.2) (layer 4_bot) (net 118) (tstamp 53AB45A2)) + (segment (start 97 139) (end 96.2 139.8) (width 0.2) (layer 4_bot) (net 118) (tstamp 53AB45A0)) + (segment (start 122.7 165.3) (end 132.75 165.3) (width 0.2) (layer 4_bot) (net 118) (tstamp 53ACCCAC) (status 20)) + (segment (start 101 143.6) (end 122.7 165.3) (width 0.2) (layer 4_bot) (net 118) (tstamp 53ACCCA7)) + (segment (start 98.4 143.2) (end 101.8 143.2) (width 0.2) (layer 4_bot) (net 119)) + (segment (start 97.8 142.6) (end 98.4 143.2) (width 0.2) (layer 4_bot) (net 119) (tstamp 53AB45D3)) + (segment (start 97.8 137) (end 97.8 142.6) (width 0.2) (layer 4_bot) (net 119) (status 10)) + (segment (start 123 164.4) (end 132.75 164.4) (width 0.2) (layer 4_bot) (net 119) (tstamp 53ACCC9F) (status 20)) + (segment (start 101.8 143.2) (end 123 164.4) (width 0.2) (layer 4_bot) (net 119) (tstamp 53ACCC9C)) + (segment (start 103.4 142.4) (end 103.4 139.4) (width 0.2) (layer 4_bot) (net 120)) + (segment (start 101 137) (end 100.6 137) (width 0.2) (layer 4_bot) (net 120) (tstamp 53ADE06B) (status 20)) + (segment (start 103.4 139.4) (end 101 137) (width 0.2) (layer 4_bot) (net 120) (tstamp 53ADE067)) + (segment (start 132.75 162.7) (end 123.7 162.7) (width 0.2) (layer 4_bot) (net 120) (status 10)) + (segment (start 123.7 162.7) (end 103.4 142.4) (width 0.2) (layer 4_bot) (net 120) (tstamp 53ADAA3C)) + (segment (start 100.598002 137) (end 100.6 137) (width 0.2) (layer 4_bot) (net 120) (tstamp 53ADAA43) (status 30)) + (segment (start 139.3 139.7) (end 143 143.4) (width 0.2) (layer 4_bot) (net 121)) + (segment (start 103.8 131) (end 107.6 131) (width 0.2) (layer 4_bot) (net 121) (tstamp 53AB6D30)) + (segment (start 101.8 131.4) (end 103.4 131.4) (width 0.2) (layer 4_bot) (net 121) (status 10)) + (segment (start 116.3 139.7) (end 107.6 131) (width 0.2) (layer 4_bot) (net 121) (tstamp 53AB198A)) + (segment (start 116.3 139.7) (end 139.3 139.7) (width 0.2) (layer 4_bot) (net 121)) + (segment (start 103.4 131.4) (end 103.8 131) (width 0.2) (layer 4_bot) (net 121)) + (segment (start 161.8 145.8) (end 163.75 145.8) (width 0.2) (layer 4_bot) (net 121) (tstamp 53ACCFBA) (status 20)) + (segment (start 159.4 143.4) (end 161.8 145.8) (width 0.2) (layer 4_bot) (net 121) (tstamp 53ACCFB8)) + (segment (start 143 143.4) (end 159.4 143.4) (width 0.2) (layer 4_bot) (net 121) (tstamp 53ACCFB3)) + (segment (start 101.8 131.398002) (end 101.8 131.4) (width 0.2) (layer 4_bot) (net 121) (tstamp 53AB250F) (status 30)) + (segment (start 101.801998 131.4) (end 101.8 131.398002) (width 0.2) (layer 4_bot) (net 121) (tstamp 53AB250E) (status 30)) + (segment (start 139.95 139.15) (end 143.2 142.4) (width 0.2) (layer 4_bot) (net 122)) + (segment (start 101.8 131) (end 103.2 131) (width 0.2) (layer 4_bot) (net 122) (status 10)) + (segment (start 103.2 131) (end 103.6 130.6) (width 0.2) (layer 4_bot) (net 122) (tstamp 53AB662D)) + (segment (start 139.95 139.15) (end 116.35 139.15) (width 0.2) (layer 4_bot) (net 122) (tstamp 53AB199E)) + (segment (start 116.35 139.15) (end 107.8 130.6) (width 0.2) (layer 4_bot) (net 122) (tstamp 53AB19A1)) + (segment (start 103.6 130.6) (end 107.8 130.6) (width 0.2) (layer 4_bot) (net 122)) + (segment (start 162.1 144.9) (end 163.75 144.9) (width 0.2) (layer 4_bot) (net 122) (tstamp 53ACCFAB) (status 20)) + (segment (start 159.6 142.4) (end 162.1 144.9) (width 0.2) (layer 4_bot) (net 122) (tstamp 53ACCFA9)) + (segment (start 143.2 142.4) (end 159.6 142.4) (width 0.2) (layer 4_bot) (net 122) (tstamp 53ACCFA5)) + (segment (start 143.4 137.2) (end 147.6 141.4) (width 0.2) (layer 4_bot) (net 123)) + (segment (start 103.401998 130.198002) (end 107.998002 130.198002) (width 0.2) (layer 4_bot) (net 123) (tstamp 53AB6D23)) + (segment (start 101.8 130.6) (end 103 130.6) (width 0.2) (layer 4_bot) (net 123) (status 10)) + (segment (start 115 137.2) (end 143.4 137.2) (width 0.2) (layer 4_bot) (net 123) (tstamp 53AB6414)) + (segment (start 107.998002 130.198002) (end 115 137.2) (width 0.2) (layer 4_bot) (net 123) (tstamp 53AB6411)) + (segment (start 103 130.6) (end 103.401998 130.198002) (width 0.2) (layer 4_bot) (net 123)) + (segment (start 162.5 144.1) (end 163.75 144.1) (width 0.2) (layer 4_bot) (net 123) (tstamp 53ACCF98) (status 20)) + (segment (start 159.8 141.4) (end 162.5 144.1) (width 0.2) (layer 4_bot) (net 123) (tstamp 53ACCF96)) + (segment (start 147.6 141.4) (end 159.8 141.4) (width 0.2) (layer 4_bot) (net 123) (tstamp 53ACCF8F)) + (segment (start 101.8 130.598002) (end 101.8 130.6) (width 0.2) (layer 4_bot) (net 123) (tstamp 53AB2508) (status 30)) + (segment (start 101.801998 130.6) (end 101.8 130.598002) (width 0.2) (layer 4_bot) (net 123) (tstamp 53AB2507) (status 30)) + (segment (start 101.8 130.601998) (end 101.8 130.6) (width 0.2) (layer 4_bot) (net 123) (tstamp 53AB19B4) (status 30)) + (segment (start 147.8 140.4) (end 160 140.4) (width 0.2) (layer 4_bot) (net 124)) + (segment (start 160 140.4) (end 162.8 143.2) (width 0.2) (layer 4_bot) (net 124) (tstamp 53ACCF7E)) + (segment (start 102.8 130.2) (end 103.2 129.8) (width 0.2) (layer 4_bot) (net 124)) + (segment (start 147.8 140.4) (end 144.05 136.65) (width 0.2) (layer 4_bot) (net 124) (tstamp 53ACCF7C)) + (segment (start 144.05 136.65) (end 115.05 136.65) (width 0.2) (layer 4_bot) (net 124) (tstamp 53AB63D9)) + (segment (start 115.05 136.65) (end 108.2 129.8) (width 0.2) (layer 4_bot) (net 124) (tstamp 53AB63DE)) + (segment (start 163.75 143.2) (end 162.8 143.2) (width 0.2) (layer 4_bot) (net 124) (status 10)) + (segment (start 102.8 130.2) (end 101.8 130.2) (width 0.2) (layer 4_bot) (net 124) (status 20)) + (segment (start 103.2 129.8) (end 108.2 129.8) (width 0.2) (layer 4_bot) (net 124) (tstamp 53AB6D1D)) + (segment (start 101.8 133.8) (end 103.6 133.8) (width 0.2) (layer 4_bot) (net 125) (status 10)) + (segment (start 161.7 150.9) (end 163.75 150.9) (width 0.2) (layer 4_bot) (net 125) (tstamp 53ACEBB4) (status 20)) + (segment (start 161.2 151.4) (end 161.7 150.9) (width 0.2) (layer 4_bot) (net 125) (tstamp 53ACEBAE)) + (segment (start 134.6 151.4) (end 161.2 151.4) (width 0.2) (layer 4_bot) (net 125) (tstamp 53ACEBAC)) + (segment (start 130 146.8) (end 134.6 151.4) (width 0.2) (layer 4_bot) (net 125) (tstamp 53ACEBAA)) + (segment (start 116.6 146.8) (end 130 146.8) (width 0.2) (layer 4_bot) (net 125) (tstamp 53ACEBA8)) + (segment (start 103.6 133.8) (end 116.6 146.8) (width 0.2) (layer 4_bot) (net 125) (tstamp 53ACEBA3)) + (segment (start 101.8 133.4) (end 103.8 133.4) (width 0.2) (layer 4_bot) (net 126) (status 10)) + (segment (start 161.2 150) (end 163.75 150) (width 0.2) (layer 4_bot) (net 126) (tstamp 53ACD1A6) (status 20)) + (segment (start 160.4 150.8) (end 161.2 150) (width 0.2) (layer 4_bot) (net 126) (tstamp 53ACD1A4)) + (segment (start 135.2 150.8) (end 160.4 150.8) (width 0.2) (layer 4_bot) (net 126) (tstamp 53ACD19E)) + (segment (start 129.2 144.8) (end 135.2 150.8) (width 0.2) (layer 4_bot) (net 126) (tstamp 53ACD19B)) + (segment (start 115.2 144.8) (end 129.2 144.8) (width 0.2) (layer 4_bot) (net 126) (tstamp 53ACD198)) + (segment (start 103.8 133.4) (end 115.2 144.8) (width 0.2) (layer 4_bot) (net 126) (tstamp 53ACD192)) + (segment (start 140 147) (end 142.2 147) (width 0.2) (layer 4_bot) (net 127)) + (segment (start 163 149.2) (end 163.75 149.2) (width 0.2) (layer 4_bot) (net 127) (tstamp 53ACEC9C) (status 20)) + (segment (start 159.2 145.4) (end 163 149.2) (width 0.2) (layer 4_bot) (net 127) (tstamp 53ACEC8E)) + (segment (start 143.8 145.4) (end 159.2 145.4) (width 0.2) (layer 4_bot) (net 127) (tstamp 53ACEC8C)) + (segment (start 142.2 147) (end 143.8 145.4) (width 0.2) (layer 4_bot) (net 127) (tstamp 53ACEC89)) + (segment (start 135.25 142.25) (end 113.85 142.25) (width 0.2) (layer 4_bot) (net 127)) + (segment (start 104.2 132.6) (end 101.8 132.6) (width 0.2) (layer 4_bot) (net 127) (tstamp 53ACD0FF) (status 20)) + (segment (start 113.85 142.25) (end 104.2 132.6) (width 0.2) (layer 4_bot) (net 127) (tstamp 53ACD0FA)) + (segment (start 140 147) (end 135.25 142.25) (width 0.2) (layer 4_bot) (net 127) (tstamp 53ACEC87)) + (segment (start 135.9 141.7) (end 117.7 141.7) (width 0.2) (layer 4_bot) (net 128)) + (segment (start 163.1 148.3) (end 159.2 144.4) (width 0.2) (layer 4_bot) (net 128) (tstamp 53ACCFC4)) + (segment (start 159.2 144.4) (end 143.6 144.4) (width 0.2) (layer 4_bot) (net 128) (tstamp 53ACCFC6)) + (segment (start 143.6 144.4) (end 142 146) (width 0.2) (layer 4_bot) (net 128) (tstamp 53ACCFC8)) + (segment (start 142 146) (end 140.2 146) (width 0.2) (layer 4_bot) (net 128) (tstamp 53ACCFCE)) + (segment (start 140.2 146) (end 135.9 141.7) (width 0.2) (layer 4_bot) (net 128) (tstamp 53ACCFD0)) + (segment (start 163.75 148.3) (end 163.1 148.3) (width 0.2) (layer 4_bot) (net 128) (status 10)) + (segment (start 101.8 131.798002) (end 101.8 131.8) (width 0.2) (layer 4_bot) (net 128) (tstamp 53ACD04E) (status 30)) + (segment (start 103.603996 131.798002) (end 101.8 131.798002) (width 0.2) (layer 4_bot) (net 128) (tstamp 53ACD04B) (status 20)) + (segment (start 104.003996 131.398002) (end 103.603996 131.798002) (width 0.2) (layer 4_bot) (net 128) (tstamp 53ACD047)) + (segment (start 107.398002 131.398002) (end 104.003996 131.398002) (width 0.2) (layer 4_bot) (net 128) (tstamp 53ACD045)) + (segment (start 117.7 141.7) (end 107.398002 131.398002) (width 0.2) (layer 4_bot) (net 128) (tstamp 53ACD03B)) + + (zone (net 0) (net_name "") (layer 2_pwr) (tstamp 53AA1C68) (hatch edge 0.508) + (connect_pads (clearance 0.2)) + (min_thickness 0.2) + (keepout (tracks not_allowed) (vias not_allowed) (copperpour not_allowed)) + (fill (arc_segments 16) (thermal_gap 0.2) (thermal_bridge_width 0.3)) + (polygon + (pts + (xy 75.2 140) (xy 75.2 135) (xy 77.8 135) (xy 77.8 140) + ) + ) + ) + (zone (net 0) (net_name "") (layer 3_gnd) (tstamp 53AA1C69) (hatch edge 0.508) + (connect_pads (clearance 0.2)) + (min_thickness 0.2) + (keepout (tracks not_allowed) (vias not_allowed) (copperpour not_allowed)) + (fill (arc_segments 16) (thermal_gap 0.2) (thermal_bridge_width 0.3)) + (polygon + (pts + (xy 75.2 140) (xy 75.2 135) (xy 77.8 135) (xy 77.8 140) + ) + ) + ) + (zone (net 2) (net_name +3.3V) (layer 2_pwr) (tstamp 53AA6D6C) (hatch edge 0.508) + (priority 1) + (connect_pads (clearance 0.2)) + (min_thickness 0.2) + (fill (arc_segments 16) (thermal_gap 0.2) (thermal_bridge_width 0.3)) + (polygon + (pts + (xy 62 109) (xy 66 109) (xy 69 106) (xy 69 102) (xy 121 102) + (xy 121 106) (xy 124 109) (xy 128 109) (xy 131 106) (xy 131 102) + (xy 171 102) (xy 171 106) (xy 174 109) (xy 178 109) (xy 178 166) + (xy 174 166) (xy 171 169) (xy 171 173) (xy 69 173) (xy 69 169) + (xy 66 166) (xy 62 166) (xy 62 159) (xy 70 159) (xy 70 121.4) + (xy 62 121.4) + ) + ) + ) + (zone (net 1) (net_name +1.8V) (layer 2_pwr) (tstamp 53AE109F) (hatch edge 0.508) + (priority 2) + (connect_pads (clearance 0.2)) + (min_thickness 0.2) + (fill (arc_segments 16) (thermal_gap 0.2) (thermal_bridge_width 0.3)) + (polygon + (pts + (xy 70 125) (xy 86 125) (xy 88 123) (xy 98 123) (xy 98 126.8) + (xy 96.6 126.8) (xy 96.6 125.8) (xy 92.7 125.8) (xy 92.7 130) (xy 100.4 130) + (xy 100.4 145.8) (xy 98 145.8) (xy 98 147.8) (xy 95 147.8) (xy 92.4 145.2) + (xy 83.6 145.2) (xy 83.6 155.6) (xy 70 155.6) + ) + ) + ) + (zone (net 63) (net_name GND) (layer 3_gnd) (tstamp 53AA6EAC) (hatch edge 0.508) + (connect_pads (clearance 0.2)) + (min_thickness 0.2) + (fill (arc_segments 16) (thermal_gap 0.2) (thermal_bridge_width 0.3)) + (polygon + (pts + (xy 60 100) (xy 180 100) (xy 180 175) (xy 60 175) + ) + ) + ) + (zone (net 0) (net_name "") (layer B.Mask) (tstamp 53B195FF) (hatch edge 0.508) + (connect_pads (clearance 0.2)) + (min_thickness 0.1524) + (fill (arc_segments 16) (thermal_gap 0.508) (thermal_bridge_width 0.508)) + (polygon + (pts + (xy 75.2 140) (xy 75.2 135) (xy 77.8 135) (xy 77.8 140) + ) + ) + ) + (zone (net 0) (net_name "") (layer F.Mask) (tstamp 53B19601) (hatch edge 0.508) + (connect_pads (clearance 0.2)) + (min_thickness 0.1524) + (fill (arc_segments 16) (thermal_gap 0.508) (thermal_bridge_width 0.508)) + (polygon + (pts + (xy 75.2 140) (xy 75.2 135) (xy 77.8 135) (xy 77.8 140) + ) + ) + ) + (zone (net 63) (net_name GND) (layer 4_bot) (tstamp 53B315F1) (hatch edge 0.508) + (connect_pads (clearance 0.2)) + (min_thickness 0.2) + (fill (arc_segments 16) (thermal_gap 0.2) (thermal_bridge_width 0.3)) + (polygon + (pts + (xy 60 100) (xy 180 100) (xy 180 175) (xy 60 175) + ) + ) + ) + (zone (net 0) (net_name "") (layer 4_bot) (tstamp 53B3161C) (hatch edge 0.508) + (connect_pads (clearance 0.2)) + (min_thickness 0.2) + (keepout (tracks allowed) (vias allowed) (copperpour not_allowed)) + (fill (arc_segments 16) (thermal_gap 0.2) (thermal_bridge_width 0.3)) + (polygon + (pts + (xy 69 102) (xy 121 102) (xy 121 106) (xy 124 109) (xy 128 109) + (xy 131 106) (xy 131 102) (xy 171 102) (xy 171 105.8) (xy 171 106) + (xy 174 109) (xy 178 109) (xy 178 166) (xy 174 166) (xy 171 169) + (xy 171 173) (xy 69 173) (xy 69 169) (xy 66 166) (xy 62 166) + (xy 62 159) (xy 70 159) (xy 70 121.4) (xy 62 121.4) (xy 62 109) + (xy 66 109) (xy 69 106) + ) + ) + ) + (zone (net 63) (net_name GND) (layer 2_pwr) (tstamp 53B317F9) (hatch edge 0.508) + (connect_pads (clearance 0.2)) + (min_thickness 0.2) + (fill (arc_segments 16) (thermal_gap 0.2) (thermal_bridge_width 0.3)) + (polygon + (pts + (xy 60 100) (xy 180 100) (xy 180 175) (xy 60 175) + ) + ) + ) + (zone (net 0) (net_name "") (layer 1_top) (tstamp 53B3161C) (hatch edge 0.508) + (connect_pads (clearance 0.2)) + (min_thickness 0.2) + (keepout (tracks allowed) (vias allowed) (copperpour not_allowed)) + (fill (arc_segments 16) (thermal_gap 0.2) (thermal_bridge_width 0.3)) + (polygon + (pts + (xy 69 102) (xy 121 102) (xy 121 106) (xy 124 109) (xy 128 109) + (xy 131 106) (xy 131 102) (xy 171 102) (xy 171 105.8) (xy 171 106) + (xy 174 109) (xy 178 109) (xy 178 166) (xy 174 166) (xy 171 169) + (xy 171 173) (xy 69 173) (xy 69 169) (xy 66 166) (xy 62 166) + (xy 62 159) (xy 70 159) (xy 70 121.4) (xy 62 121.4) (xy 62 109) + (xy 66 109) (xy 69 106) + ) + ) + ) + (zone (net 63) (net_name GND) (layer 1_top) (tstamp 53B315F1) (hatch edge 0.508) + (connect_pads (clearance 0.2)) + (min_thickness 0.2) + (fill (arc_segments 16) (thermal_gap 0.2) (thermal_bridge_width 0.3)) + (polygon + (pts + (xy 60 100) (xy 180 100) (xy 180 175) (xy 60 175) + ) + ) + ) + (zone (net 0) (net_name "") (layer B.SilkS) (tstamp 53C7F92D) (hatch edge 0.508) + (connect_pads (clearance 0.2)) + (min_thickness 0.1524) + (fill (arc_segments 16) (thermal_gap 0.508) (thermal_bridge_width 0.508)) + (polygon + (pts + (xy 119 172) (xy 118 173) (xy 108 173) (xy 107 172) (xy 107 168) + (xy 108 167) (xy 118 167) (xy 119 168) + ) + ) + ) +) diff --git a/hardware/portapack_h1/portapack_h1.net b/hardware/portapack_h1/portapack_h1.net new file mode 100644 index 000000000..40e54ccb3 --- /dev/null +++ b/hardware/portapack_h1/portapack_h1.net @@ -0,0 +1,1685 @@ +(export (version D) + (design + (source /Users/jboone/src/portapack-hackrf/hardware/portapack_h1/portapack_h1.sch) + (date "Friday, August 21, 2015 'PMt' 04:27:19 PM") + (tool "Eeschema (2015-08-20 BZR 6109)-product") + (sheet (number 1) (name /) (tstamps /) + (title_block + (title "PortaPack H1") + (company "ShareBrained Technology, Inc.") + (rev 20150821) + (date "21 Aug 2015") + (source portapack_h1.sch) + (comment (number 1) (value "Copyright © 2014, 2015 Jared Boone")) + (comment (number 2) (value "License: GNU General Public License, version 2")) + (comment (number 3) (value "")) + (comment (number 4) (value "")))) + (sheet (number 2) (name /audio/) (tstamps /53A8BFC3/) + (title_block + (title "PortaPack H1") + (company "ShareBrained Technology, Inc.") + (rev 20150821) + (date "21 Aug 2015") + (source audio.sch) + (comment (number 1) (value "Copyright © 2014, 2015 Jared Boone")) + (comment (number 2) (value "License: GNU General Public License, version 2")) + (comment (number 3) (value "")) + (comment (number 4) (value "")))) + (sheet (number 3) (name /lcd_sw_sd/) (tstamps /53A9129D/) + (title_block + (title "PortaPack H1") + (company "ShareBrained Technology, Inc.") + (rev 20150821) + (date "21 Aug 2015") + (source lcd_sw_sd.sch) + (comment (number 1) (value "Copyright © 2014, 2015 Jared Boone")) + (comment (number 2) (value "License: GNU General Public License, version 2")) + (comment (number 3) (value "")) + (comment (number 4) (value "")))) + (sheet (number 4) (name /hackrf_if/) (tstamps /53A8C780/) + (title_block + (title "PortaPack H1") + (company "ShareBrained Technology, Inc.") + (rev 20150821) + (date "21 Aug 2015") + (source hackrf_if.sch) + (comment (number 1) (value "Copyright © 2014, 2015 Jared Boone")) + (comment (number 2) (value "License: GNU General Public License, version 2")) + (comment (number 3) (value "")) + (comment (number 4) (value ""))))) + (components + (comp (ref H1) + (value HOLE1) + (footprint hole:HOLE_3200UM_VIAS) + (libsource (lib hole) (part HOLE1)) + (sheetpath (names /) (tstamps /)) + (tstamp 5369BBC4)) + (comp (ref H2) + (value HOLE1) + (footprint hole:HOLE_3200UM_VIAS) + (libsource (lib hole) (part HOLE1)) + (sheetpath (names /) (tstamps /)) + (tstamp 5369BBD8)) + (comp (ref H3) + (value HOLE1) + (footprint hole:HOLE_3200UM_VIAS) + (libsource (lib hole) (part HOLE1)) + (sheetpath (names /) (tstamps /)) + (tstamp 5369BBEC)) + (comp (ref H4) + (value HOLE1) + (footprint hole:HOLE_3200UM_VIAS) + (libsource (lib hole) (part HOLE1)) + (sheetpath (names /) (tstamps /)) + (tstamp 5369BC00)) + (comp (ref H5) + (value HOLE1) + (footprint hole:HOLE_3200UM_VIAS) + (libsource (lib hole) (part HOLE1)) + (sheetpath (names /) (tstamps /)) + (tstamp 5369BC14)) + (comp (ref LOGO1) + (value SHAREBRAINED) + (footprint sharebrained:sharebrained_text_300) + (libsource (lib sharebrained) (part SHAREBRAINED)) + (sheetpath (names /) (tstamps /)) + (tstamp 53B1AE0D)) + (comp (ref LOGO2) + (value PORTAPACK_H1) + (footprint sharebrained:portapack_text_300) + (libsource (lib sharebrained) (part PORTAPACK_H1)) + (sheetpath (names /) (tstamps /)) + (tstamp 53B1B509)) + (comp (ref FID1) + (value FIDUCIAL) + (footprint fiducial:FIDUCIAL_65MIL) + (libsource (lib fiducial) (part FIDUCIAL)) + (sheetpath (names /) (tstamps /)) + (tstamp 53B309AC)) + (comp (ref FID2) + (value FIDUCIAL) + (footprint fiducial:FIDUCIAL_65MIL) + (libsource (lib fiducial) (part FIDUCIAL)) + (sheetpath (names /) (tstamps /)) + (tstamp 53B30B4C)) + (comp (ref FID3) + (value FIDUCIAL) + (footprint fiducial:FIDUCIAL_65MIL) + (libsource (lib fiducial) (part FIDUCIAL)) + (sheetpath (names /) (tstamps /)) + (tstamp 53B30CEC)) + (comp (ref FID4) + (value FIDUCIAL) + (footprint fiducial:FIDUCIAL_65MIL) + (libsource (lib fiducial) (part FIDUCIAL)) + (sheetpath (names /) (tstamps /)) + (tstamp 53B30E8C)) + (comp (ref C18) + (value 220U) + (footprint ipc_capae:IPC_CAPAE830X620N) + (fields + (field (name Mfr) Nichicon) + (field (name Part) UWX1A221MCL1GB)) + (libsource (lib passive) (part CP)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C256)) + (comp (ref C19) + (value 220U) + (footprint ipc_capae:IPC_CAPAE830X620N) + (fields + (field (name Mfr) Nichicon) + (field (name Part) UWX1A221MCL1GB)) + (libsource (lib passive) (part CP)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C25E)) + (comp (ref R11) + (value 47K) + (footprint ipc_resc:IPC_RESC1608X55N) + (fields + (field (name Mfr) Yageo) + (field (name Part) RC0603FR-0747KL)) + (libsource (lib passive) (part R)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C264)) + (comp (ref R12) + (value 47K) + (footprint ipc_resc:IPC_RESC1608X55N) + (fields + (field (name Mfr) Yageo) + (field (name Part) RC0603FR-0747KL)) + (libsource (lib passive) (part R)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C26A)) + (comp (ref C22) + (value 220P) + (footprint ipc_capc:IPC_CAPC1608X95N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM1885C1H221JA01)) + (libsource (lib passive) (part C)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C27E)) + (comp (ref C23) + (value 220P) + (footprint ipc_capc:IPC_CAPC1608X95N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM1885C1H221JA01)) + (libsource (lib passive) (part C)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C284)) + (comp (ref R17) + (value 47K) + (footprint ipc_resc:IPC_RESC1608X55N) + (fields + (field (name Mfr) Yageo) + (field (name Part) RC0603FR-0747KL)) + (libsource (lib passive) (part R)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C296)) + (comp (ref R18) + (value 680R) + (footprint ipc_resc:IPC_RESC1608X55N) + (fields + (field (name Mfr) Yageo) + (field (name Part) RC0603FR-07681RL)) + (libsource (lib passive) (part R)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C29C)) + (comp (ref C25) + (value 220P) + (footprint ipc_capc:IPC_CAPC1608X95N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM1885C1H221JA01)) + (libsource (lib passive) (part C)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C2A2)) + (comp (ref C24) + (value 1U) + (footprint ipc_capae:IPC_CAPAE430X540N) + (fields + (field (name Mfr) Kemet) + (field (name Part) EDK105M050A9BAA)) + (libsource (lib passive) (part CP)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C2AA)) + (comp (ref R10) + (value 0R) + (footprint ipc_resc:IPC_RESC1608X55N) + (fields + (field (name Mfr) Yageo) + (field (name Part) RC0603JR-070RL)) + (libsource (lib passive) (part R)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C2B0)) + (comp (ref P2) + (value TRRS_SW_JACK) + (footprint cui:CUI_SJ-43516-SMT) + (fields + (field (name Mfr) CUI) + (field (name Part) SJ-43514-SMT)) + (libsource (lib trs_jack) (part TRRS_SW_JACK)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C2C6)) + (comp (ref L4) + (value L) + (footprint ipc_indc:IPC_INDC1608X95N) + (fields + (field (name Mfr) Murata) + (field (name Part) BLM18HE152SN1D)) + (libsource (lib passive) (part L)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C2E2)) + (comp (ref L5) + (value L) + (footprint ipc_indc:IPC_INDC1608X95N) + (fields + (field (name Mfr) Murata) + (field (name Part) BLM18HE152SN1D)) + (libsource (lib passive) (part L)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C2E8)) + (comp (ref L6) + (value L) + (footprint ipc_indc:IPC_INDC1608X95N) + (fields + (field (name Mfr) Murata) + (field (name Part) BLM18HE152SN1D)) + (libsource (lib passive) (part L)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C2EE)) + (comp (ref L9) + (value L) + (footprint ipc_indc:IPC_INDC1608X95N) + (fields + (field (name Mfr) Murata) + (field (name Part) BLM18HE152SN1D)) + (libsource (lib passive) (part L)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C2F4)) + (comp (ref U1) + (value WM8731SEDS) + (footprint ipc_sop:IPC_SOP65P780X200-28N) + (fields + (field (name Mfr) Wolfson) + (field (name Part) WM8731SEDS/V)) + (libsource (lib wolfson) (part WM8731SEDS)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C66D)) + (comp (ref C6) + (value 100N) + (footprint ipc_capc:IPC_CAPC1005X55N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM155R61A104KA01)) + (libsource (lib passive) (part C)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C687)) + (comp (ref C10) + (value 100N) + (footprint ipc_capc:IPC_CAPC1005X55N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM155R61A104KA01)) + (libsource (lib passive) (part C)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C68D)) + (comp (ref C3) + (value 100N) + (footprint ipc_capc:IPC_CAPC1005X55N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM155R61A104KA01)) + (libsource (lib passive) (part C)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C69F)) + (comp (ref C2) + (value 100N) + (footprint ipc_capc:IPC_CAPC1005X55N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM155R61A104KA01)) + (libsource (lib passive) (part C)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C6A5)) + (comp (ref C5) + (value 100N) + (footprint ipc_capc:IPC_CAPC1005X55N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM155R61A104KA01)) + (libsource (lib passive) (part C)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C6AB)) + (comp (ref C4) + (value 100N) + (footprint ipc_capc:IPC_CAPC1005X55N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM155R61A104KA01)) + (libsource (lib passive) (part C)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C6B1)) + (comp (ref C12) + (value 10U) + (footprint ipc_capc:IPC_CAPC2012X140N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM21BR61A106KE19)) + (libsource (lib passive) (part C)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C6F0)) + (comp (ref C8) + (value 10U) + (footprint ipc_capc:IPC_CAPC2012X140N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM21BR61A106KE19)) + (libsource (lib passive) (part C)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C6F6)) + (comp (ref C9) + (value 10U) + (footprint ipc_capc:IPC_CAPC2012X140N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM21BR61A106KE19)) + (libsource (lib passive) (part C)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C708)) + (comp (ref C7) + (value 10U) + (footprint ipc_capc:IPC_CAPC2012X140N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM21BR61A106KE19)) + (libsource (lib passive) (part C)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C70E)) + (comp (ref C13) + (value 10U) + (footprint ipc_capc:IPC_CAPC2012X140N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM21BR61A106KE19)) + (libsource (lib passive) (part C)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C720)) + (comp (ref C11) + (value 10U) + (footprint ipc_capc:IPC_CAPC2012X140N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM21BR61A106KE19)) + (libsource (lib passive) (part C)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53A8C72C)) + (comp (ref RP1) + (value 220R) + (footprint ipc_resc:IPC_RESCAXS80P160X320X60-8N) + (fields + (field (name Mfr) Panasonic) + (field (name Part) EXB-38V221JV)) + (libsource (lib passive) (part RPACK4)) + (sheetpath (names /audio/) (tstamps /53A8BFC3/)) + (tstamp 53AB09AD)) + (comp (ref R20) + (value 47K) + (footprint ipc_resc:IPC_RESC1608X55N) + (fields + (field (name Mfr) Yageo) + (field (name Part) RC0603FR-0747KL)) + (libsource (lib passive) (part R)) + (sheetpath (names /lcd_sw_sd/) (tstamps /53A9129D/)) + (tstamp 53A91635)) + (comp (ref J3) + (value KINGTECH_DW0240A2BZ_FPC) + (footprint molex:MOLEX_54132-40XX_LR) + (fields + (field (name Mfr) FCI) + (field (name Part) 62684-401100ALF)) + (libsource (lib lcd_kingtech) (part KINGTECH_DW0240A2BZ_FPC)) + (sheetpath (names /lcd_sw_sd/) (tstamps /53A9129D/)) + (tstamp 53A91651)) + (comp (ref R19) + (value 47K) + (footprint ipc_resc:IPC_RESC1608X55N) + (fields + (field (name Mfr) Yageo) + (field (name Part) RC0603FR-0747KL)) + (libsource (lib passive) (part R)) + (sheetpath (names /lcd_sw_sd/) (tstamps /53A9129D/)) + (tstamp 53A91657)) + (comp (ref J2) + (value MICROSD_DETSW) + (footprint alps:ALPS_SCHA4B0100) + (fields + (field (name Mfr) ALPS) + (field (name Part) SCHA4B0415)) + (libsource (lib sd) (part MICROSD_DETSW)) + (sheetpath (names /lcd_sw_sd/) (tstamps /53A9129D/)) + (tstamp 53A8C6D0)) + (comp (ref C27) + (value 100N) + (footprint ipc_capc:IPC_CAPC1005X55N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM155R61A104KA01)) + (libsource (lib passive) (part C)) + (sheetpath (names /lcd_sw_sd/) (tstamps /53A9129D/)) + (tstamp 53AA73CE)) + (comp (ref SW1) + (value CK_TSWB-3N-CB) + (footprint ck:CK_TSWB-3N-CB222_LFS) + (fields + (field (name Mfr) C&K) + (field (name Part) "TSWB-3N-CB111 LFS")) + (libsource (lib ck) (part CK_TSWB-3N-CB)) + (sheetpath (names /lcd_sw_sd/) (tstamps /53A9129D/)) + (tstamp 53A8C6FD)) + (comp (ref C26) + (value 10U) + (footprint ipc_capc:IPC_CAPC2012X140N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM21BR61A106KE19)) + (libsource (lib passive) (part C)) + (sheetpath (names /lcd_sw_sd/) (tstamps /53A9129D/)) + (tstamp 53A8C71C)) + (comp (ref LCD1) + (value KINGTECH_DW0240A2BZ_PANEL) + (footprint lcd_kingtech:KINGTECH_DW0240A2BZ_PANEL) + (libsource (lib lcd_kingtech) (part KINGTECH_DW0240A2BZ_PANEL)) + (sheetpath (names /lcd_sw_sd/) (tstamps /53A9129D/)) + (tstamp 53A8C752)) + (comp (ref Q1) + (value MOSFET_N) + (footprint ipc_sot:IPC_SOT95P230X110-3N) + (fields + (field (name Mfr) NXP) + (field (name Part) 2N7002P,215)) + (libsource (lib mosfet) (part MOSFET_N)) + (sheetpath (names /lcd_sw_sd/) (tstamps /53A9129D/)) + (tstamp 53C5B6EB)) + (comp (ref P20) + (value HACKRF_ONE_P20) + (footprint header:HEADER_11X2_REV_SM_254_AP) + (fields + (field (name Mfr) MLE) + (field (name Part) TSHSM-111-D-06-T-V-S-P-TR-AP-LF)) + (libsource (lib hackrf_expansion) (part HACKRF_ONE_P20)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53A8CDAE)) + (comp (ref P22) + (value HACKRF_ONE_P22) + (footprint header:HEADER_13X2_REV_SM_254_AP) + (fields + (field (name Mfr) MLE) + (field (name Part) TSHSM-113-D-06-T-V-S-P-TR-AP-LF)) + (libsource (lib hackrf_expansion) (part HACKRF_ONE_P22)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53A8CDB6)) + (comp (ref P28) + (value HACKRF_ONE_P28) + (footprint header:HEADER_11X2_REV_SM_254_AP) + (fields + (field (name Mfr) MLE) + (field (name Part) TSHSM-111-D-06-T-V-S-P-TR-AP-LF)) + (libsource (lib hackrf_expansion) (part HACKRF_ONE_P28)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53A8CDBE)) + (comp (ref U3) + (value 5M40ZE64) + (footprint ipc_qfp:IPC_QFP40P900X900X120-65N) + (fields + (field (name Mfr) Altera) + (field (name Part) 5M40ZE64C5N)) + (libsource (lib altera) (part 5M40ZE64)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53A8D11B)) + (comp (ref C28) + (value 100N) + (footprint ipc_capc:IPC_CAPC1005X55N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM155R61A104KA01)) + (libsource (lib passive) (part C)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53A8D527)) + (comp (ref BT1) + (value BATTERY) + (footprint bat_coin:MPD_BU2032SM-BT-G) + (fields + (field (name Mfr) MPD) + (field (name Part) BU2032SM-BT-GTR)) + (libsource (lib battery) (part BATTERY)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53A8D535)) + (comp (ref C30) + (value 100N) + (footprint ipc_capc:IPC_CAPC1005X55N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM155R61A104KA01)) + (libsource (lib passive) (part C)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53A8D542)) + (comp (ref C29) + (value 100N) + (footprint ipc_capc:IPC_CAPC1005X55N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM155R61A104KA01)) + (libsource (lib passive) (part C)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53A8D548)) + (comp (ref C31) + (value 100N) + (footprint ipc_capc:IPC_CAPC1005X55N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM155R61A104KA01)) + (libsource (lib passive) (part C)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53A8D54E)) + (comp (ref C33) + (value 100N) + (footprint ipc_capc:IPC_CAPC1005X55N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM155R61A104KA01)) + (libsource (lib passive) (part C)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53A8D56C)) + (comp (ref C35) + (value 100N) + (footprint ipc_capc:IPC_CAPC1005X55N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM155R61A104KA01)) + (libsource (lib passive) (part C)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53A8D572)) + (comp (ref U2) + (value REGULATOR_SOT23_5) + (footprint ipc_sot:IPC_SOT95P280X110-5N) + (fields + (field (name Mfr) Toshiba) + (field (name Part) TCR2EF18,LM)) + (libsource (lib regulator) (part REGULATOR_SOT23_5)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53A8D586)) + (comp (ref C38) + (value 10U) + (footprint ipc_capc:IPC_CAPC2012X140N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM21BR61A106KE19)) + (libsource (lib passive) (part C)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53A8D58C)) + (comp (ref C40) + (value 10U) + (footprint ipc_capc:IPC_CAPC2012X140N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM21BR61A106KE19)) + (libsource (lib passive) (part C)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53A8D592)) + (comp (ref C39) + (value DNI) + (footprint ipc_capc:IPC_CAPC1608X90N) + (libsource (lib passive) (part C)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53A8D5AA)) + (comp (ref C32) + (value 10U) + (footprint ipc_capc:IPC_CAPC2012X140N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM21BR61A106KE19)) + (libsource (lib passive) (part C)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53A8D5C2)) + (comp (ref C34) + (value 10U) + (footprint ipc_capc:IPC_CAPC2012X140N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM21BR61A106KE19)) + (libsource (lib passive) (part C)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53A8D5C8)) + (comp (ref C36) + (value 10U) + (footprint ipc_capc:IPC_CAPC2012X140N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM21BR61A106KE19)) + (libsource (lib passive) (part C)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53A8D5DA)) + (comp (ref C37) + (value 10U) + (footprint ipc_capc:IPC_CAPC2012X140N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM21BR61A106KE19)) + (libsource (lib passive) (part C)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53A8D5E0)) + (comp (ref C41) + (value DNI) + (footprint ipc_capc:IPC_CAPC2012X140N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM21BR61A106KE19)) + (libsource (lib passive) (part C)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53A8D62C)) + (comp (ref R22) + (value 220R) + (footprint ipc_resc:IPC_RESC1608X55N) + (fields + (field (name Mfr) Yageo) + (field (name Part) RC0603FR-07220RL)) + (libsource (lib passive) (part R)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53A915E9)) + (comp (ref RP4) + (value 220R) + (footprint ipc_resc:IPC_RESCAXS80P160X320X60-8N) + (fields + (field (name Mfr) Panasonic) + (field (name Part) EXB-38V221JV)) + (libsource (lib passive) (part RPACK4)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53AB047A)) + (comp (ref RP6) + (value 220R) + (footprint ipc_resc:IPC_RESCAXS80P160X320X60-8N) + (fields + (field (name Mfr) Panasonic) + (field (name Part) EXB-38V221JV)) + (libsource (lib passive) (part RPACK4)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53AB04B9)) + (comp (ref RP7) + (value 220R) + (footprint ipc_resc:IPC_RESCAXS80P160X320X60-8N) + (fields + (field (name Mfr) Panasonic) + (field (name Part) EXB-38V221JV)) + (libsource (lib passive) (part RPACK4)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53AB04D6)) + (comp (ref R1) + (value 220R) + (footprint ipc_resc:IPC_RESC1608X55N) + (fields + (field (name Mfr) Yageo) + (field (name Part) RC0603FR-07220RL)) + (libsource (lib passive) (part R)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53AB79CA)) + (comp (ref R2) + (value 220R) + (footprint ipc_resc:IPC_RESC1608X55N) + (fields + (field (name Mfr) Yageo) + (field (name Part) RC0603FR-07220RL)) + (libsource (lib passive) (part R)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53AB79D5)) + (comp (ref R3) + (value 220R) + (footprint ipc_resc:IPC_RESC1608X55N) + (fields + (field (name Mfr) Yageo) + (field (name Part) RC0603FR-07220RL)) + (libsource (lib passive) (part R)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53AB79EA)) + (comp (ref C42) + (value 10U) + (footprint ipc_capc:IPC_CAPC2012X140N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM21BR61A106KE19)) + (libsource (lib passive) (part C)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53B1911F)) + (comp (ref C43) + (value 10U) + (footprint ipc_capc:IPC_CAPC2012X140N) + (fields + (field (name Mfr) Murata) + (field (name Part) GRM21BR61A106KE19)) + (libsource (lib passive) (part C)) + (sheetpath (names /hackrf_if/) (tstamps /53A8C780/)) + (tstamp 53B1A065))) + (libparts + (libpart (lib altera) (part 5M40ZE64) + (footprints + (fp IPC_QFP40P900X900X120-65N)) + (fields + (field (name Reference) U) + (field (name Value) 5M40ZE64)) + (pins + (pin (num 1) (name IO/DIFFIO_L1n) (type BiDi)) + (pin (num 2) (name IO) (type BiDi)) + (pin (num 3) (name IO/DIFFIO_L2p) (type BiDi)) + (pin (num 4) (name IO/DIFFIO_L2n) (type BiDi)) + (pin (num 5) (name IO) (type BiDi)) + (pin (num 6) (name VCCIO1) (type power_in)) + (pin (num 7) (name IO/CLK0) (type BiDi)) + (pin (num 8) (name VCCINT) (type power_in)) + (pin (num 9) (name IO/CLK1) (type BiDi)) + (pin (num 10) (name IO) (type BiDi)) + (pin (num 11) (name IO/DIFFIO_L3p) (type BiDi)) + (pin (num 12) (name IO/DIFFIO_L3n) (type BiDi)) + (pin (num 13) (name IO) (type BiDi)) + (pin (num 14) (name TMS) (type input)) + (pin (num 15) (name TDI) (type input)) + (pin (num 16) (name TCK) (type input)) + (pin (num 17) (name TDO) (type output)) + (pin (num 18) (name IO/DIFFIO_B1p) (type BiDi)) + (pin (num 19) (name IO/DIFFIO_B1n) (type BiDi)) + (pin (num 20) (name IO/DIFFIO_B2p) (type BiDi)) + (pin (num 21) (name IO/DIFFIO_B2n) (type BiDi)) + (pin (num 22) (name IO/DIFFIO_B3p) (type BiDi)) + (pin (num 23) (name VCCIO1) (type power_in)) + (pin (num 24) (name IO/DIFFIO_B3n) (type BiDi)) + (pin (num 25) (name IO) (type BiDi)) + (pin (num 26) (name IO/DIFFIO_B4p) (type BiDi)) + (pin (num 27) (name IO/DIFFIO_B4n) (type BiDi)) + (pin (num 28) (name IO/DEV_OE/DIFFIO_B5p) (type BiDi)) + (pin (num 29) (name IO/DEV_CLRn/DIFFIO_B5n) (type BiDi)) + (pin (num 30) (name IO/DIFFIO_B6p) (type BiDi)) + (pin (num 31) (name IO/DIFFIO_B6n) (type BiDi)) + (pin (num 32) (name IO/DIFFIO_B7p) (type BiDi)) + (pin (num 33) (name IO/DIFFIO_B7n) (type BiDi)) + (pin (num 34) (name IO/DIFFIO_R4n) (type BiDi)) + (pin (num 35) (name IO/DIFFIO_R4p) (type BiDi)) + (pin (num 36) (name IO/DIFFIO_R3n) (type BiDi)) + (pin (num 37) (name IO/DIFFIO_R3p) (type BiDi)) + (pin (num 38) (name IO) (type BiDi)) + (pin (num 39) (name VCCIO2) (type power_in)) + (pin (num 40) (name IO/CLK2) (type BiDi)) + (pin (num 41) (name VCCINT) (type power_in)) + (pin (num 42) (name IO/CLK3) (type BiDi)) + (pin (num 43) (name IO/DIFFIO_R2n) (type BiDi)) + (pin (num 44) (name IO/DIFFIO_R2p) (type BiDi)) + (pin (num 45) (name IO) (type BiDi)) + (pin (num 46) (name IO/DIFFIO_R1n) (type BiDi)) + (pin (num 47) (name IO/DIFFIO_R1p) (type BiDi)) + (pin (num 48) (name IO) (type BiDi)) + (pin (num 49) (name IO/DIFFIO_T6n) (type BiDi)) + (pin (num 50) (name IO/DIFFIO_T6p) (type BiDi)) + (pin (num 51) (name IO) (type BiDi)) + (pin (num 52) (name IO/DIFFIO_T5n) (type BiDi)) + (pin (num 53) (name IO/DIFFIO_T5p) (type BiDi)) + (pin (num 54) (name IO/DIFFIO_T4n) (type BiDi)) + (pin (num 55) (name IO/DIFFIO_T4p) (type BiDi)) + (pin (num 56) (name IO/DIFFIO_T3n) (type BiDi)) + (pin (num 57) (name VCCIO2) (type power_in)) + (pin (num 58) (name IO/DIFFIO_T3p) (type BiDi)) + (pin (num 59) (name IO/DIFFIO_T2n) (type BiDi)) + (pin (num 60) (name IO/DIFFIO_T2p) (type BiDi)) + (pin (num 61) (name IO/DIFFIO_T1n) (type BiDi)) + (pin (num 62) (name IO) (type BiDi)) + (pin (num 63) (name IO/DIFFIO_T1p) (type BiDi)) + (pin (num 64) (name IO/DIFFIO_L1p) (type BiDi)) + (pin (num 65) (name GND) (type power_in)))) + (libpart (lib ck) (part CK_TSWB-3N-CB) + (footprints + (fp CK_TSWB-3N-CB*)) + (fields + (field (name Reference) SW) + (field (name Value) CK_TSWB-3N-CB)) + (pins + (pin (num A) (name ROT_A) (type BiDi)) + (pin (num B) (name ROT_B) (type BiDi)) + (pin (num CA) (name COM_A) (type BiDi)) + (pin (num CB) (name COM_B) (type BiDi)) + (pin (num S1) (name SEL) (type BiDi)) + (pin (num S2) (name D) (type BiDi)) + (pin (num S3) (name R) (type BiDi)) + (pin (num S4) (name U) (type BiDi)) + (pin (num S5) (name L) (type BiDi)))) + (libpart (lib battery) (part BATTERY) + (footprints + (fp MPD_BU2032SM-BT-G)) + (fields + (field (name Reference) BT) + (field (name Value) BATTERY)) + (pins + (pin (num 1) (name +) (type passive)) + (pin (num 2) (name -) (type passive)))) + (libpart (lib trs_jack) (part TRRS_SW_JACK) + (footprints + (fp CUI_SJ-43516-SMT)) + (fields + (field (name Reference) P) + (field (name Value) TRRS_SW_JACK)) + (pins + (pin (num 1) (name S) (type passive)) + (pin (num 2) (name T) (type passive)) + (pin (num 3) (name R1) (type passive)) + (pin (num 4) (name R2) (type passive)) + (pin (num 5) (name TSW) (type passive)) + (pin (num 6) (name RSW) (type passive)))) + (libpart (lib hackrf_expansion) (part HACKRF_ONE_P28) + (footprints + (fp HEADER_11X2_*_254)) + (fields + (field (name Reference) J) + (field (name Value) HACKRF_ONE_P28)) + (pins + (pin (num 1) (name VCC) (type power_out)) + (pin (num 2) (name GND) (type power_in)) + (pin (num 3) (name SD_CD) (type BiDi)) + (pin (num 4) (name SD_DAT3) (type BiDi)) + (pin (num 5) (name SD_DAT2) (type BiDi)) + (pin (num 6) (name SD_DAT1) (type BiDi)) + (pin (num 7) (name SD_DAT0) (type BiDi)) + (pin (num 8) (name SD_VOLT0) (type BiDi)) + (pin (num 9) (name SD_CMD) (type BiDi)) + (pin (num 10) (name SD_POW) (type BiDi)) + (pin (num 11) (name SD_CLK) (type BiDi)) + (pin (num 12) (name GND) (type power_in)) + (pin (num 13) (name GCLK2) (type output)) + (pin (num 14) (name GCK1) (type output)) + (pin (num 15) (name B1AUX14) (type BiDi)) + (pin (num 16) (name B1AUX13) (type BiDi)) + (pin (num 17) (name CPLD_TCK) (type output)) + (pin (num 18) (name BANK2F3M2) (type BiDi)) + (pin (num 19) (name CPLD_TDI) (type input)) + (pin (num 20) (name BANK2F3M6) (type BiDi)) + (pin (num 21) (name BANK2F3M12) (type BiDi)) + (pin (num 22) (name BANK2F3M4) (type BiDi)))) + (libpart (lib hackrf_expansion) (part HACKRF_ONE_P22) + (footprints + (fp HEADER_13X2_*_254)) + (fields + (field (name Reference) J) + (field (name Value) HACKRF_ONE_P22)) + (pins + (pin (num 1) (name CLKOUT) (type output)) + (pin (num 2) (name CLKIN) (type input)) + (pin (num 3) (name RESET#) (type output)) + (pin (num 4) (name GND) (type power_in)) + (pin (num 5) (name I2C1_SCL) (type output)) + (pin (num 6) (name I2C1_SDA) (type BiDi)) + (pin (num 7) (name SPIFI_MISO) (type input)) + (pin (num 8) (name SPIFI_SCK) (type output)) + (pin (num 9) (name SPIFI_MOSI) (type output)) + (pin (num 10) (name GND) (type power_in)) + (pin (num 11) (name VCC) (type power_out)) + (pin (num 12) (name I2S0_RX_SCK) (type output)) + (pin (num 13) (name I2S0_RX_SDA) (type input)) + (pin (num 14) (name I2S0_RX_MCLK) (type output)) + (pin (num 15) (name I2S0_RX_WS) (type output)) + (pin (num 16) (name I2S0_TX_SCK) (type output)) + (pin (num 17) (name I2S0_TX_MCLK) (type output)) + (pin (num 18) (name GND) (type power_in)) + (pin (num 19) (name U0_RXD) (type input)) + (pin (num 20) (name U0_TXD) (type output)) + (pin (num 21) (name P2_9) (type BiDi)) + (pin (num 22) (name P2_13) (type BiDi)) + (pin (num 23) (name P2_8) (type BiDi)) + (pin (num 24) (name SDA) (type BiDi)) + (pin (num 25) (name CLK6) (type output)) + (pin (num 26) (name SCL) (type output)))) + (libpart (lib hackrf_expansion) (part HACKRF_ONE_P20) + (footprints + (fp HEADER_11X2_*_254)) + (fields + (field (name Reference) J) + (field (name Value) HACKRF_ONE_P20)) + (pins + (pin (num 1) (name VBAT) (type power_in)) + (pin (num 2) (name RTC_ALARM) (type output)) + (pin (num 3) (name VCC) (type power_out)) + (pin (num 4) (name WAKEUP) (type input)) + (pin (num 5) (name GPIO3_8) (type BiDi)) + (pin (num 6) (name GPIO3_9) (type BiDi)) + (pin (num 7) (name GPIO3_10) (type BiDi)) + (pin (num 8) (name GPIO3_11) (type BiDi)) + (pin (num 9) (name GPIO3_12) (type BiDi)) + (pin (num 10) (name GPIO3_13) (type BiDi)) + (pin (num 11) (name GPIO3_14) (type BiDi)) + (pin (num 12) (name GPIO3_15) (type BiDi)) + (pin (num 13) (name GND) (type power_in)) + (pin (num 14) (name ADC0_6) (type input)) + (pin (num 15) (name GND) (type power_in)) + (pin (num 16) (name ADC0_2) (type input)) + (pin (num 17) (name VBUSCTRL) (type input)) + (pin (num 18) (name ADC0_5) (type input)) + (pin (num 19) (name GND) (type power_in)) + (pin (num 20) (name ADC0_0) (type input)) + (pin (num 21) (name VBUS) (type output)) + (pin (num 22) (name VIN) (type power_in)))) + (libpart (lib wolfson) (part WM8731SEDS) + (footprints + (fp IPC_SOP65P780X200-28N)) + (fields + (field (name Reference) U) + (field (name Value) WM8731SEDS)) + (pins + (pin (num 1) (name DBVDD) (type power_in)) + (pin (num 2) (name CLKOUT) (type output)) + (pin (num 3) (name BCLK) (type BiDi)) + (pin (num 4) (name DACDAT) (type input)) + (pin (num 5) (name DACLRC) (type BiDi)) + (pin (num 6) (name ADCDAT) (type output)) + (pin (num 7) (name ADCLRC) (type BiDi)) + (pin (num 8) (name HPVDD) (type power_in)) + (pin (num 9) (name LHPOUT) (type output)) + (pin (num 10) (name RHPOUT) (type output)) + (pin (num 11) (name HPGND) (type power_in)) + (pin (num 12) (name LOUT) (type output)) + (pin (num 13) (name ROUT) (type output)) + (pin (num 14) (name AVDD) (type power_in)) + (pin (num 15) (name AGND) (type power_in)) + (pin (num 16) (name VMID) (type output)) + (pin (num 17) (name MICBIAS) (type output)) + (pin (num 18) (name MICIN) (type input)) + (pin (num 19) (name RLINEIN) (type input)) + (pin (num 20) (name LLINEIN) (type input)) + (pin (num 21) (name MODE) (type input)) + (pin (num 22) (name CSB) (type input)) + (pin (num 23) (name SDIN) (type BiDi)) + (pin (num 24) (name SCLK) (type input)) + (pin (num 25) (name XTI/MCLK) (type input)) + (pin (num 26) (name XTO) (type output)) + (pin (num 27) (name DCVDD) (type power_in)) + (pin (num 28) (name DGND) (type power_in)))) + (libpart (lib mosfet) (part MOSFET_N) + (footprints + (fp IPC_SOT95P230X110-3N)) + (fields + (field (name Reference) Q) + (field (name Value) MOSFET_N)) + (pins + (pin (num 1) (name G) (type passive)) + (pin (num 2) (name S) (type passive)) + (pin (num 3) (name D) (type passive)))) + (libpart (lib regulator) (part REGULATOR_SOT23_5) + (footprints + (fp IPC_SOT95P280X110-5N)) + (fields + (field (name Reference) U) + (field (name Value) REGULATOR_SOT23_5)) + (pins + (pin (num 1) (name VIN) (type power_in)) + (pin (num 2) (name GND) (type power_in)) + (pin (num 3) (name EN) (type input)) + (pin (num 4) (name BP) (type input)) + (pin (num 5) (name VOUT) (type power_out)))) + (libpart (lib hole) (part HOLE1) + (footprints + (fp *HOLE*)) + (fields + (field (name Reference) H) + (field (name Value) HOLE1)) + (pins + (pin (num 1) (name ~) (type passive)))) + (libpart (lib sharebrained) (part PORTAPACK_H1) + (footprints + (fp portapack_text_300)) + (fields + (field (name Reference) LOGO) + (field (name Value) PORTAPACK_H1))) + (libpart (lib sharebrained) (part SHAREBRAINED) + (footprints + (fp sharebrained_text_300)) + (fields + (field (name Reference) LOGO) + (field (name Value) SHAREBRAINED))) + (libpart (lib passive) (part C) + (footprints + (fp IPC_CAPC*)) + (fields + (field (name Reference) C) + (field (name Value) C)) + (pins + (pin (num 1) (name ~) (type passive)) + (pin (num 2) (name ~) (type passive)))) + (libpart (lib sd) (part MICROSD_DETSW) + (footprints + (fp HIROSE_DM3D) + (fp ALPS_SCHA4B0400)) + (fields + (field (name Reference) J) + (field (name Value) MICROSD_DETSW)) + (pins + (pin (num 0) (name GND) (type power_in)) + (pin (num 1) (name DAT2) (type BiDi)) + (pin (num 2) (name DAT3/CD) (type BiDi)) + (pin (num 3) (name CMD) (type BiDi)) + (pin (num 4) (name VDD) (type power_in)) + (pin (num 5) (name CLK) (type input)) + (pin (num 6) (name VSS) (type power_in)) + (pin (num 7) (name DAT0) (type BiDi)) + (pin (num 8) (name DAT1) (type BiDi)) + (pin (num A) (name DETA) (type passive)) + (pin (num B) (name DETB) (type passive)) + (pin (num SH) (name SHIELD) (type passive)))) + (libpart (lib lcd_kingtech) (part KINGTECH_DW0240A2BZ_PANEL) + (footprints + (fp KINGTECH_DW0240A2BZ_PANEL)) + (fields + (field (name Reference) LCD) + (field (name Value) KINGTECH_DW0240A2BZ_PANEL))) + (libpart (lib passive) (part CP) + (aliases + (alias CAPAPOL)) + (footprints + (fp IPC_CAPCP*) + (fp IPC_CAPAE*) + (fp IPC_CAPMP*)) + (fields + (field (name Reference) C) + (field (name Value) CP)) + (pins + (pin (num 1) (name ~) (type passive)) + (pin (num 2) (name ~) (type passive)))) + (libpart (lib passive) (part L) + (footprints + (fp IPC_INDC*)) + (fields + (field (name Reference) L) + (field (name Value) L)) + (pins + (pin (num 1) (name 1) (type passive)) + (pin (num 2) (name 2) (type passive)))) + (libpart (lib passive) (part R) + (footprints + (fp IPC_RESC*)) + (fields + (field (name Reference) R) + (field (name Value) R)) + (pins + (pin (num 1) (name ~) (type passive)) + (pin (num 2) (name ~) (type passive)))) + (libpart (lib passive) (part RPACK4) + (footprints + (fp IPC_RESCAXS80P160X320X60-8N)) + (fields + (field (name Reference) RP) + (field (name Value) RPACK4)) + (pins + (pin (num 1) (name ~) (type passive)) + (pin (num 2) (name ~) (type passive)) + (pin (num 3) (name ~) (type passive)) + (pin (num 4) (name ~) (type passive)) + (pin (num 5) (name ~) (type passive)) + (pin (num 6) (name ~) (type passive)) + (pin (num 7) (name ~) (type passive)) + (pin (num 8) (name ~) (type passive)))) + (libpart (lib lcd_kingtech) (part KINGTECH_DW0240A2BZ_FPC) + (footprints + (fp MOLEX_54132-40XX_LR)) + (fields + (field (name Reference) J) + (field (name Value) KINGTECH_DW0240A2BZ_FPC)) + (pins + (pin (num 1) (name LEDK) (type power_in)) + (pin (num 2) (name LEDA) (type power_in)) + (pin (num 3) (name GND) (type power_in)) + (pin (num 4) (name VCI) (type power_in)) + (pin (num 5) (name RESET#) (type input)) + (pin (num 6) (name RS/SCL) (type input)) + (pin (num 7) (name RD#) (type input)) + (pin (num 8) (name CS#) (type input)) + (pin (num 9) (name SDA) (type BiDi)) + (pin (num 10) (name WR#/DC) (type input)) + (pin (num 11) (name VSYNC) (type input)) + (pin (num 12) (name HSYNC) (type input)) + (pin (num 13) (name DOTCLK) (type input)) + (pin (num 14) (name DE) (type input)) + (pin (num 15) (name GND) (type power_in)) + (pin (num 16) (name DB17) (type BiDi)) + (pin (num 17) (name DB16) (type BiDi)) + (pin (num 18) (name DB15) (type BiDi)) + (pin (num 19) (name DB14) (type BiDi)) + (pin (num 20) (name DB13) (type BiDi)) + (pin (num 21) (name DB12) (type BiDi)) + (pin (num 22) (name DB11) (type BiDi)) + (pin (num 23) (name DB10) (type BiDi)) + (pin (num 24) (name DB9) (type BiDi)) + (pin (num 25) (name DB8) (type BiDi)) + (pin (num 26) (name DB7) (type BiDi)) + (pin (num 27) (name DB6) (type BiDi)) + (pin (num 28) (name DB5) (type BiDi)) + (pin (num 29) (name DB4) (type BiDi)) + (pin (num 30) (name DB3) (type BiDi)) + (pin (num 31) (name DB2) (type BiDi)) + (pin (num 32) (name DB1) (type BiDi)) + (pin (num 33) (name DB0) (type BiDi)) + (pin (num 34) (name TE) (type output)) + (pin (num 35) (name GND) (type power_in)) + (pin (num 36) (name IOVCC) (type power_in)) + (pin (num 37) (name TP_R) (type passive)) + (pin (num 38) (name TP_D) (type passive)) + (pin (num 39) (name TP_L) (type passive)) + (pin (num 40) (name TP_U) (type passive)) + (pin (num SHLD) (name ~) (type passive)))) + (libpart (lib fiducial) (part FIDUCIAL) + (footprints + (fp FIDUCIAL_65MIL)) + (fields + (field (name Reference) FID) + (field (name Value) FIDUCIAL)))) + (libraries + (library (logical hackrf_expansion) + (uri /Users/jboone/src/library-kicad/hackrf_expansion.lib)) + (library (logical battery) + (uri /Users/jboone/src/library-kicad/battery.lib)) + (library (logical ck) + (uri /Users/jboone/src/library-kicad/ck.lib)) + (library (logical altera) + (uri /Users/jboone/src/library-kicad/altera.lib)) + (library (logical lcd_kingtech) + (uri /Users/jboone/src/library-kicad/lcd_kingtech.lib)) + (library (logical regulator) + (uri /Users/jboone/src/library-kicad/regulator.lib)) + (library (logical trs_jack) + (uri /Users/jboone/src/library-kicad/trs_jack.lib)) + (library (logical fiducial) + (uri /Users/jboone/src/library-kicad/fiducial.lib)) + (library (logical wolfson) + (uri /Users/jboone/src/library-kicad/wolfson.lib)) + (library (logical mosfet) + (uri /Users/jboone/src/library-kicad/mosfet.lib)) + (library (logical sharebrained) + (uri /Users/jboone/src/library-kicad/sharebrained.lib)) + (library (logical sd) + (uri /Users/jboone/src/library-kicad/sd.lib)) + (library (logical hole) + (uri /Users/jboone/src/library-kicad/hole.lib)) + (library (logical passive) + (uri /Users/jboone/src/library-kicad/passive.lib))) + (nets + (net (code 1) (name /hackrf_if/LCD_BACKLIGHT) + (node (ref Q1) (pin 1)) + (node (ref R20) (pin 2)) + (node (ref U3) (pin 4))) + (net (code 2) (name /hackrf_if/LCD_RESET#) + (node (ref J3) (pin 5)) + (node (ref U3) (pin 38)) + (node (ref R19) (pin 1))) + (net (code 3) (name /hackrf_if/LCD_RS) + (node (ref J3) (pin 6)) + (node (ref U3) (pin 43))) + (net (code 4) (name /hackrf_if/LCD_RD#) + (node (ref U3) (pin 44)) + (node (ref J3) (pin 7))) + (net (code 5) (name /audio/I2S0_TX_SDA) + (node (ref P22) (pin 13)) + (node (ref RP1) (pin 1))) + (net (code 6) (name /audio/I2S0_WS) + (node (ref RP1) (pin 2)) + (node (ref P22) (pin 15))) + (net (code 7) (name /audio/I2S0_MCLK) + (node (ref RP1) (pin 4)) + (node (ref P22) (pin 17))) + (net (code 8) (name /audio/I2S0_SCK) + (node (ref P22) (pin 16)) + (node (ref RP1) (pin 3))) + (net (code 9) (name /audio/SDA) + (node (ref U1) (pin 23)) + (node (ref P22) (pin 24))) + (net (code 10) (name /audio/SCL) + (node (ref P22) (pin 26)) + (node (ref U1) (pin 24))) + (net (code 11) (name /hackrf_if/SD_CD) + (node (ref P28) (pin 3)) + (node (ref J2) (pin B))) + (net (code 12) (name /hackrf_if/SD_DAT2) + (node (ref J2) (pin 1)) + (node (ref P28) (pin 5))) + (net (code 13) (name /hackrf_if/SD_DAT0) + (node (ref J2) (pin 7)) + (node (ref P28) (pin 7))) + (net (code 14) (name /hackrf_if/SD_CMD) + (node (ref P28) (pin 9)) + (node (ref J2) (pin 3))) + (net (code 15) (name /hackrf_if/SD_CLK) + (node (ref P28) (pin 11)) + (node (ref J2) (pin 5))) + (net (code 16) (name /hackrf_if/SD_DAT3) + (node (ref J2) (pin 2)) + (node (ref P28) (pin 4))) + (net (code 17) (name /hackrf_if/SD_DAT1) + (node (ref J2) (pin 8)) + (node (ref P28) (pin 6))) + (net (code 18) (name /audio/I2S0_RX_SDA) + (node (ref R22) (pin 2)) + (node (ref U1) (pin 6))) + (net (code 19) (name /hackrf_if/LCD_WR#) + (node (ref J3) (pin 10)) + (node (ref U3) (pin 45))) + (net (code 20) (name /hackrf_if/LCD_TE) + (node (ref J3) (pin 34)) + (node (ref U3) (pin 63))) + (net (code 21) (name /hackrf_if/TP_U) + (node (ref J3) (pin 40)) + (node (ref U3) (pin 3)) + (node (ref P20) (pin 20))) + (net (code 22) (name /hackrf_if/TP_R) + (node (ref J3) (pin 37)) + (node (ref P20) (pin 14)) + (node (ref U3) (pin 64))) + (net (code 23) (name /hackrf_if/TP_D) + (node (ref P20) (pin 16)) + (node (ref J3) (pin 38)) + (node (ref U3) (pin 1))) + (net (code 24) (name /hackrf_if/TP_L) + (node (ref U3) (pin 2)) + (node (ref J3) (pin 39)) + (node (ref P20) (pin 18))) + (net (code 25) (name /hackrf_if/SW_U) + (node (ref U3) (pin 25)) + (node (ref SW1) (pin S4))) + (net (code 26) (name /hackrf_if/SW_R) + (node (ref SW1) (pin S3)) + (node (ref U3) (pin 9))) + (net (code 27) (name /hackrf_if/SW_D) + (node (ref U3) (pin 10)) + (node (ref SW1) (pin S2))) + (net (code 28) (name /hackrf_if/SW_L) + (node (ref SW1) (pin S5)) + (node (ref U3) (pin 28))) + (net (code 29) (name /hackrf_if/SW_ROT_A) + (node (ref U3) (pin 11)) + (node (ref SW1) (pin A))) + (net (code 30) (name /hackrf_if/SW_ROT_B) + (node (ref SW1) (pin B)) + (node (ref U3) (pin 12))) + (net (code 31) (name /hackrf_if/SW_SEL) + (node (ref SW1) (pin S1)) + (node (ref U3) (pin 13))) + (net (code 32) (name GND) + (node (ref U3) (pin 65)) + (node (ref C43) (pin 2)) + (node (ref C41) (pin 2)) + (node (ref U2) (pin 2)) + (node (ref C38) (pin 2)) + (node (ref C40) (pin 2)) + (node (ref C31) (pin 2)) + (node (ref C37) (pin 2)) + (node (ref C36) (pin 2)) + (node (ref C34) (pin 2)) + (node (ref C32) (pin 2)) + (node (ref C42) (pin 2)) + (node (ref C35) (pin 2)) + (node (ref C33) (pin 2)) + (node (ref C39) (pin 2)) + (node (ref Q1) (pin 2)) + (node (ref J3) (pin 12)) + (node (ref J3) (pin 11)) + (node (ref J3) (pin 9)) + (node (ref J3) (pin 8)) + (node (ref J3) (pin 3)) + (node (ref J3) (pin 13)) + (node (ref J3) (pin 14)) + (node (ref J3) (pin 15)) + (node (ref J3) (pin 35)) + (node (ref J3) (pin 16)) + (node (ref J3) (pin 17)) + (node (ref J2) (pin A)) + (node (ref J2) (pin SH)) + (node (ref C27) (pin 2)) + (node (ref SW1) (pin CA)) + (node (ref SW1) (pin CB)) + (node (ref C26) (pin 2)) + (node (ref P20) (pin 15)) + (node (ref P20) (pin 19)) + (node (ref P22) (pin 4)) + (node (ref P22) (pin 10)) + (node (ref P20) (pin 13)) + (node (ref R20) (pin 1)) + (node (ref J2) (pin 0)) + (node (ref J2) (pin 6)) + (node (ref J3) (pin SHLD)) + (node (ref R19) (pin 2)) + (node (ref P22) (pin 18)) + (node (ref P28) (pin 2)) + (node (ref P28) (pin 12)) + (node (ref C13) (pin 2)) + (node (ref C12) (pin 2)) + (node (ref R17) (pin 2)) + (node (ref C25) (pin 2)) + (node (ref R11) (pin 1)) + (node (ref R12) (pin 2)) + (node (ref C22) (pin 1)) + (node (ref C23) (pin 2)) + (node (ref U1) (pin 11)) + (node (ref C3) (pin 2)) + (node (ref C10) (pin 2)) + (node (ref C6) (pin 2)) + (node (ref C2) (pin 2)) + (node (ref C5) (pin 2)) + (node (ref C4) (pin 2)) + (node (ref U1) (pin 15)) + (node (ref U1) (pin 28)) + (node (ref C8) (pin 2)) + (node (ref C9) (pin 2)) + (node (ref C7) (pin 2)) + (node (ref H5) (pin 1)) + (node (ref H4) (pin 1)) + (node (ref H3) (pin 1)) + (node (ref H2) (pin 1)) + (node (ref H1) (pin 1)) + (node (ref U1) (pin 21)) + (node (ref U1) (pin 22)) + (node (ref L6) (pin 2)) + (node (ref C28) (pin 2)) + (node (ref BT1) (pin 2)) + (node (ref C11) (pin 2)) + (node (ref C29) (pin 2)) + (node (ref C30) (pin 2))) + (net (code 33) (name "Net-(C24-Pad1)") + (node (ref R10) (pin 1)) + (node (ref C24) (pin 1))) + (net (code 34) (name "Net-(C24-Pad2)") + (node (ref C24) (pin 2)) + (node (ref R18) (pin 2)) + (node (ref L9) (pin 2)) + (node (ref R17) (pin 1)) + (node (ref C25) (pin 1))) + (net (code 35) (name /audio/VMID) + (node (ref C8) (pin 1)) + (node (ref C6) (pin 1)) + (node (ref U1) (pin 16))) + (net (code 36) (name /audio/MICBIAS) + (node (ref C10) (pin 1)) + (node (ref C12) (pin 1)) + (node (ref U1) (pin 17)) + (node (ref R18) (pin 1))) + (net (code 37) (name "Net-(L5-Pad1)") + (node (ref L5) (pin 1)) + (node (ref P2) (pin 3))) + (net (code 38) (name "Net-(L4-Pad1)") + (node (ref L4) (pin 1)) + (node (ref P2) (pin 2))) + (net (code 39) (name "Net-(L6-Pad1)") + (node (ref P2) (pin 4)) + (node (ref L6) (pin 1))) + (net (code 40) (name "Net-(L9-Pad1)") + (node (ref P2) (pin 1)) + (node (ref L9) (pin 1))) + (net (code 41) (name /audio/I2S0_TX_SDA_R) + (node (ref RP1) (pin 8)) + (node (ref U1) (pin 4))) + (net (code 42) (name /audio/I2S0_WS_R) + (node (ref RP1) (pin 7)) + (node (ref U1) (pin 7)) + (node (ref U1) (pin 5))) + (net (code 43) (name /audio/I2S0_SCK_R) + (node (ref U1) (pin 3)) + (node (ref RP1) (pin 6))) + (net (code 44) (name /audio/I2S0_MCLK_R) + (node (ref RP1) (pin 5)) + (node (ref U1) (pin 25))) + (net (code 45) (name +3.3V) + (node (ref C30) (pin 1)) + (node (ref U1) (pin 8)) + (node (ref J2) (pin 4)) + (node (ref U2) (pin 1)) + (node (ref C13) (pin 1)) + (node (ref U3) (pin 23)) + (node (ref J3) (pin 2)) + (node (ref U1) (pin 14)) + (node (ref C11) (pin 1)) + (node (ref U3) (pin 6)) + (node (ref C2) (pin 1)) + (node (ref C38) (pin 1)) + (node (ref C28) (pin 1)) + (node (ref P22) (pin 11)) + (node (ref C3) (pin 1)) + (node (ref C26) (pin 1)) + (node (ref C27) (pin 1)) + (node (ref C34) (pin 1)) + (node (ref C32) (pin 1)) + (node (ref P28) (pin 1)) + (node (ref C43) (pin 1)) + (node (ref C7) (pin 1)) + (node (ref C42) (pin 1)) + (node (ref C9) (pin 1)) + (node (ref J3) (pin 4)) + (node (ref C5) (pin 1)) + (node (ref C4) (pin 1)) + (node (ref P20) (pin 3)) + (node (ref U1) (pin 27)) + (node (ref U2) (pin 3)) + (node (ref U1) (pin 1))) + (net (code 46) (name "Net-(P2-Pad6)") + (node (ref P2) (pin 6))) + (net (code 47) (name "Net-(P2-Pad5)") + (node (ref P2) (pin 5))) + (net (code 48) (name "Net-(C18-Pad2)") + (node (ref C22) (pin 2)) + (node (ref R11) (pin 2)) + (node (ref L4) (pin 2)) + (node (ref C18) (pin 2))) + (net (code 49) (name "Net-(C19-Pad2)") + (node (ref L5) (pin 2)) + (node (ref C19) (pin 2)) + (node (ref R12) (pin 1)) + (node (ref C23) (pin 1))) + (net (code 50) (name "Net-(U1-Pad13)") + (node (ref U1) (pin 13))) + (net (code 51) (name "Net-(U1-Pad12)") + (node (ref U1) (pin 12))) + (net (code 52) (name "Net-(U1-Pad19)") + (node (ref U1) (pin 19))) + (net (code 53) (name "Net-(U1-Pad20)") + (node (ref U1) (pin 20))) + (net (code 54) (name /audio/MICIN) + (node (ref R10) (pin 2)) + (node (ref U1) (pin 18))) + (net (code 55) (name "Net-(U1-Pad2)") + (node (ref U1) (pin 2))) + (net (code 56) (name /audio/RHPOUT) + (node (ref C19) (pin 1)) + (node (ref U1) (pin 10))) + (net (code 57) (name /audio/LHPOUT) + (node (ref U1) (pin 9)) + (node (ref C18) (pin 1))) + (net (code 58) (name "Net-(U1-Pad26)") + (node (ref U1) (pin 26))) + (net (code 59) (name /hackrf_if/H1_CPLD_TCK) + (node (ref U3) (pin 16)) + (node (ref P28) (pin 17))) + (net (code 60) (name "Net-(C39-Pad1)") + (node (ref U2) (pin 4)) + (node (ref C39) (pin 1))) + (net (code 61) (name "Net-(U3-Pad36)") + (node (ref U3) (pin 36))) + (net (code 62) (name /hackrf_if/PP_CPLD_TDO) + (node (ref P28) (pin 10)) + (node (ref U3) (pin 17))) + (net (code 63) (name "Net-(U3-Pad37)") + (node (ref U3) (pin 37))) + (net (code 64) (name "Net-(U3-Pad35)") + (node (ref U3) (pin 35))) + (net (code 65) (name /hackrf_if/MCU_LCD_RD_R) + (node (ref R1) (pin 1)) + (node (ref U3) (pin 30))) + (net (code 66) (name /hackrf_if/H1_CPLD_TDI) + (node (ref P28) (pin 19)) + (node (ref R22) (pin 1)) + (node (ref U3) (pin 15))) + (net (code 67) (name /hackrf_if/MCU_ADDR_R) + (node (ref RP4) (pin 8)) + (node (ref U3) (pin 33))) + (net (code 68) (name /hackrf_if/MCU_IO_STBX_R) + (node (ref U3) (pin 32)) + (node (ref R3) (pin 1))) + (net (code 69) (name /hackrf_if/MCU_D0) + (node (ref P20) (pin 5)) + (node (ref RP7) (pin 3))) + (net (code 70) (name /hackrf_if/MCU_D1) + (node (ref RP7) (pin 4)) + (node (ref P20) (pin 6))) + (net (code 71) (name /hackrf_if/MCU_D2) + (node (ref RP7) (pin 2)) + (node (ref P20) (pin 7))) + (net (code 72) (name /hackrf_if/MCU_D3) + (node (ref P20) (pin 8)) + (node (ref RP7) (pin 1))) + (net (code 73) (name /hackrf_if/MCU_D4) + (node (ref P20) (pin 9)) + (node (ref RP6) (pin 3))) + (net (code 74) (name /hackrf_if/MCU_D5) + (node (ref RP6) (pin 4)) + (node (ref P20) (pin 10))) + (net (code 75) (name /hackrf_if/MCU_D6) + (node (ref RP6) (pin 2)) + (node (ref P20) (pin 11))) + (net (code 76) (name /hackrf_if/MCU_D7) + (node (ref P20) (pin 12)) + (node (ref RP6) (pin 1))) + (net (code 77) (name /hackrf_if/MCU_DIR) + (node (ref P22) (pin 22)) + (node (ref RP4) (pin 4))) + (net (code 78) (name /hackrf_if/PP_CPLD_TMS) + (node (ref P28) (pin 8)) + (node (ref U3) (pin 14))) + (net (code 79) (name /hackrf_if/RESET#) + (node (ref P22) (pin 3)) + (node (ref U3) (pin 29))) + (net (code 80) (name /hackrf_if/MCU_LCD_WR) + (node (ref P22) (pin 21)) + (node (ref RP4) (pin 3))) + (net (code 81) (name "Net-(U3-Pad7)") + (node (ref U3) (pin 7))) + (net (code 82) (name "Net-(U3-Pad5)") + (node (ref U3) (pin 5))) + (net (code 83) (name /hackrf_if/P2_8) + (node (ref RP4) (pin 2)) + (node (ref P22) (pin 23))) + (net (code 84) (name /hackrf_if/P2_8_R) + (node (ref U3) (pin 34)) + (node (ref RP4) (pin 7))) + (net (code 85) (name /hackrf_if/VBAT) + (node (ref C41) (pin 1)) + (node (ref BT1) (pin 1)) + (node (ref P20) (pin 1))) + (net (code 86) (name /hackrf_if/MCU_LCD_TE_R) + (node (ref R2) (pin 1)) + (node (ref U3) (pin 31))) + (net (code 87) (name +1.8V) + (node (ref C40) (pin 1)) + (node (ref C31) (pin 1)) + (node (ref U2) (pin 5)) + (node (ref J3) (pin 36)) + (node (ref C33) (pin 1)) + (node (ref C29) (pin 1)) + (node (ref C35) (pin 1)) + (node (ref U3) (pin 41)) + (node (ref U3) (pin 57)) + (node (ref U3) (pin 8)) + (node (ref U3) (pin 39)) + (node (ref C36) (pin 1)) + (node (ref C37) (pin 1))) + (net (code 88) (name /hackrf_if/MCU_D7_R) + (node (ref U3) (pin 18)) + (node (ref RP6) (pin 8))) + (net (code 89) (name /hackrf_if/MCU_D6_R) + (node (ref U3) (pin 19)) + (node (ref RP6) (pin 7))) + (net (code 90) (name /hackrf_if/MCU_D4_R) + (node (ref U3) (pin 20)) + (node (ref RP6) (pin 6))) + (net (code 91) (name /hackrf_if/MCU_D5_R) + (node (ref RP6) (pin 5)) + (node (ref U3) (pin 21))) + (net (code 92) (name /hackrf_if/MCU_D3_R) + (node (ref U3) (pin 22)) + (node (ref RP7) (pin 8))) + (net (code 93) (name /hackrf_if/MCU_D2_R) + (node (ref RP7) (pin 7)) + (node (ref U3) (pin 24))) + (net (code 94) (name /hackrf_if/MCU_D0_R) + (node (ref RP7) (pin 6)) + (node (ref U3) (pin 26))) + (net (code 95) (name /hackrf_if/MCU_D1_R) + (node (ref RP7) (pin 5)) + (node (ref U3) (pin 27))) + (net (code 96) (name /hackrf_if/MCU_DIR_R) + (node (ref U3) (pin 42)) + (node (ref RP4) (pin 5))) + (net (code 97) (name /hackrf_if/MCU_LCD_WR_R) + (node (ref U3) (pin 40)) + (node (ref RP4) (pin 6))) + (net (code 98) (name /hackrf_if/MCU_LCD_RD) + (node (ref R1) (pin 2)) + (node (ref P22) (pin 5))) + (net (code 99) (name /hackrf_if/MCU_ADDR) + (node (ref P22) (pin 19)) + (node (ref RP4) (pin 1))) + (net (code 100) (name /hackrf_if/MCU_IO_STBX) + (node (ref R3) (pin 2)) + (node (ref P22) (pin 20))) + (net (code 101) (name "Net-(P20-Pad22)") + (node (ref P20) (pin 22))) + (net (code 102) (name "Net-(P20-Pad21)") + (node (ref P20) (pin 21))) + (net (code 103) (name "Net-(P20-Pad4)") + (node (ref P20) (pin 4))) + (net (code 104) (name "Net-(P20-Pad2)") + (node (ref P20) (pin 2))) + (net (code 105) (name "Net-(P22-Pad14)") + (node (ref P22) (pin 14))) + (net (code 106) (name "Net-(P22-Pad12)") + (node (ref P22) (pin 12))) + (net (code 107) (name "Net-(P22-Pad9)") + (node (ref P22) (pin 9))) + (net (code 108) (name "Net-(P22-Pad8)") + (node (ref P22) (pin 8))) + (net (code 109) (name "Net-(P22-Pad7)") + (node (ref P22) (pin 7))) + (net (code 110) (name /hackrf_if/MCU_LCD_TE) + (node (ref R2) (pin 2)) + (node (ref P22) (pin 6))) + (net (code 111) (name "Net-(P22-Pad2)") + (node (ref P22) (pin 2))) + (net (code 112) (name "Net-(P22-Pad1)") + (node (ref P22) (pin 1))) + (net (code 113) (name "Net-(P20-Pad17)") + (node (ref P20) (pin 17))) + (net (code 114) (name "Net-(P28-Pad13)") + (node (ref P28) (pin 13))) + (net (code 115) (name "Net-(P28-Pad14)") + (node (ref P28) (pin 14))) + (net (code 116) (name "Net-(P28-Pad16)") + (node (ref P28) (pin 16))) + (net (code 117) (name "Net-(P28-Pad15)") + (node (ref P28) (pin 15))) + (net (code 118) (name "Net-(P28-Pad21)") + (node (ref P28) (pin 21))) + (net (code 119) (name "Net-(P28-Pad22)") + (node (ref P28) (pin 22))) + (net (code 120) (name "Net-(P28-Pad20)") + (node (ref P28) (pin 20))) + (net (code 121) (name "Net-(P28-Pad18)") + (node (ref P28) (pin 18))) + (net (code 122) (name "Net-(P22-Pad25)") + (node (ref P22) (pin 25))) + (net (code 123) (name "Net-(J3-Pad1)") + (node (ref Q1) (pin 3)) + (node (ref J3) (pin 1))) + (net (code 124) (name /hackrf_if/LCD_DB4) + (node (ref J3) (pin 29)) + (node (ref U3) (pin 58))) + (net (code 125) (name /hackrf_if/LCD_DB5) + (node (ref J3) (pin 28)) + (node (ref U3) (pin 56))) + (net (code 126) (name /hackrf_if/LCD_DB6) + (node (ref J3) (pin 27)) + (node (ref U3) (pin 55))) + (net (code 127) (name /hackrf_if/LCD_DB7) + (node (ref J3) (pin 26)) + (node (ref U3) (pin 54))) + (net (code 128) (name /hackrf_if/LCD_DB8) + (node (ref U3) (pin 53)) + (node (ref J3) (pin 25))) + (net (code 129) (name /hackrf_if/LCD_DB9) + (node (ref U3) (pin 52)) + (node (ref J3) (pin 24))) + (net (code 130) (name /hackrf_if/LCD_DB10) + (node (ref J3) (pin 23)) + (node (ref U3) (pin 51))) + (net (code 131) (name /hackrf_if/LCD_DB11) + (node (ref U3) (pin 50)) + (node (ref J3) (pin 22))) + (net (code 132) (name /hackrf_if/LCD_DB12) + (node (ref U3) (pin 49)) + (node (ref J3) (pin 21))) + (net (code 133) (name /hackrf_if/LCD_DB13) + (node (ref U3) (pin 48)) + (node (ref J3) (pin 20))) + (net (code 134) (name /hackrf_if/LCD_DB14) + (node (ref J3) (pin 19)) + (node (ref U3) (pin 47))) + (net (code 135) (name /hackrf_if/LCD_DB15) + (node (ref J3) (pin 18)) + (node (ref U3) (pin 46))) + (net (code 136) (name /hackrf_if/LCD_DB0) + (node (ref U3) (pin 62)) + (node (ref J3) (pin 33))) + (net (code 137) (name /hackrf_if/LCD_DB1) + (node (ref U3) (pin 61)) + (node (ref J3) (pin 32))) + (net (code 138) (name /hackrf_if/LCD_DB2) + (node (ref U3) (pin 60)) + (node (ref J3) (pin 31))) + (net (code 139) (name /hackrf_if/LCD_DB3) + (node (ref U3) (pin 59)) + (node (ref J3) (pin 30))))) \ No newline at end of file diff --git a/hardware/portapack_h1/portapack_h1.pdf b/hardware/portapack_h1/portapack_h1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..417982eae181082c436f5a410bf526703dba68e2 GIT binary patch literal 241466 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 nFsqW5y5Di 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

05ZW+;$#4N{Z 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 Q&&AG$LP;qqFNX4e0L!>