diff --git a/debian/changelog b/CHANGELOG similarity index 100% rename from debian/changelog rename to CHANGELOG diff --git a/CMakeLists.txt b/CMakeLists.txt index e6f4703f0..22212fee1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,6 +18,29 @@ set(sdrangel_VERSION_MINOR "6") set(sdrangel_VERSION_PATCH "0") set(sdrangel_VERSION_SUFFIX "") +# SDRAngel cmake options +option(DEBUG_OUTPUT "Print debug messages" OFF) +option(SANITIZE_ADDRESS "Activate memory address sanitization" OFF) +option(RX_SAMPLE_24BIT "Internal 24 bit Rx DSP" ON) +option(BUILD_SERVER "Build Server" ON) +option(BUILD_GUI "Build GUI" ON) +option(BUNDLE "Enable distribution bundle" OFF) +option(FORCE_SSSE3 "Compile with SSSE3 instruction only" OFF) +option(FORCE_SSE41 "Compile with SSE4.1 instruction only" OFF) +option(ENABLE_EXTERNAL_LIBRARIES "Build external libraries" OFF) +option(ENABLE_AIRSPY "Enable AirSpy support" ON) +option(ENABLE_AIRSPYHF "Enable AirSpyHF support" ON) +option(ENABLE_BLADERF "Enable bladeRF support" ON) +option(ENABLE_FUNCUBE "Enable FUNcube support" ON) +option(ENABLE_HACKRF "Enable HackRF support" ON) +option(ENABLE_IIO "Enable liniio support like PlutoSDR" ON) +option(ENABLE_LIMESUITE "Enable limesuite support" ON) +option(ENABLE_MIRISDR "Enable LibMiri for old SDRPlay" ON) +option(ENABLE_PERSEUS "Enable perseus support" ON) +option(ENABLE_RTLSDR "Enable rtl-sdr support" ON) +option(ENABLE_SOAPYSDR "Enable SoapySDR support" ON) +option(ENABLE_XTRX "Enable XTRX support" ON) + # Set additional project information set(COMPANY "f4exb") add_definitions("-DCOMPANY=\"${COMPANY}\"") @@ -48,7 +71,7 @@ add_definitions("-DSDRANGEL_LIB_VERSION=\"${sdrangel_VERSION_MAJOR}.${sdrangel_V add_definitions("-DSDRANGEL_VERSION=\"${sdrangel_VERSION}\"") # configure CPACK infomation -set(CPACK_PACKAGE_NAME "${CMAKE_PACKAGE_NAME}") +set(CPACK_PACKAGE_NAME "${CMAKE_PROJECT_NAME}") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "SDR Rx/Tx software for Airspy, Airspy HF+, BladeRF, HackRF, LimeSDR, PlutoSDR, RTL-SDR, SDRplay RSP1 and FunCube") set(CPACK_PACKAGE_VENDOR "${COMPANY}") set(CPACK_PACKAGE_CONTACT "https://github.com/f4exb/sdrangel") @@ -65,33 +88,6 @@ set(CPACK_SOURCE_IGNORE_FILES "${PROJECT_BINARY_DIR};/.git/;.gitignore;menu.yml; set(CPACK_SOURCE_GENERATOR "ZIP;TGZ") set(CPACK_GENERATOR "ZIP;TGZ") -if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") - set(LINUX TRUE) -endif() - -# SDRAngel cmake options -option(DEBUG_OUTPUT "Print debug messages" OFF) -option(SANITIZE_ADDRESS "Activate memory address sanitization" OFF) -option(RX_SAMPLE_24BIT "Internal 24 bit Rx DSP" ON) -option(BUILD_SERVER "Build Server" ON) -option(BUILD_GUI "Build GUI" ON) -option(BUNDLE "Enable distribution bundle" OFF) -option(FORCE_SSSE3 "Compile with SSSE3 instruction only" OFF) -option(FORCE_SSE41 "Compile with SSE4.1 instruction only" OFF) -option(ENABLE_EXTERNAL_LIBRARIES "Build external libraries" OFF) -option(ENABLE_AIRSPY "Enable AirSpy support" ON) -option(ENABLE_AIRSPYHF "Enable AirSpyHF support" ON) -option(ENABLE_BLADERF "Enable bladeRF support" ON) -option(ENABLE_FUNCUBE "Enable FUNcube support" ON) -option(ENABLE_HACKRF "Enable HackRF support" ON) -option(ENABLE_IIO "Enable liniio support like PlutoSDR" ON) -option(ENABLE_LIMESUITE "Enable limesuite support" ON) -option(ENABLE_MIRISDR "Enable LibMiri for old SDRPlay" ON) -option(ENABLE_PERSEUS "Enable perseus support" ON) -option(ENABLE_RTLSDR "Enable rtl-sdr support" ON) -option(ENABLE_SOAPYSDR "Enable SoapySDR support" ON) -option(ENABLE_XTRX "Enable XTRX support" ON) - # if we don't set build_type if(NOT DEFINED CMAKE_BUILD_TYPE OR "${CMAKE_BUILD_TYPE}" STREQUAL "") set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE) @@ -106,9 +102,9 @@ endif() # declare build structures # !! change sdrbase/plugin/pluginmanager.cpp too !! if(WIN32) - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) else() - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/) endif() set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) @@ -126,14 +122,23 @@ set(INSTALL_PLUGINSSRV_DIR ${INSTALL_LIB_DIR}/pluginssrv) set(EXTERNAL_BUILD_LIBRARIES "${CMAKE_BINARY_DIR}/external_build") set(EXTERNAL_INSTALL_LIBRARIES "${CMAKE_BINARY_DIR}/external") -if(APPLE) +if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") + set(LINUX TRUE) + # populate distribution name + # LSB_CODENAME will hold trusty + find_program(LSB_RELEASE_EXECUTABLE lsb_release) + if(LSB_RELEASE_EXECUTABLE) + execute_process(COMMAND ${LSB_RELEASE_EXECUTABLE} -cs + OUTPUT_VARIABLE LSB_CODENAME + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + endif() +elseif(APPLE) # check set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9") message(STATUS "Build for macOS version: ${CMAKE_OSX_DEPLOYMENT_TARGET}") set(CMAKE_MACOSX_RPATH ON) -endif() - -if (WIN32) +elseif (WIN32) set(EXTERNAL_LIBRARY_FOLDER "${CMAKE_SOURCE_DIR}/external/windows") set(BOOST_ROOT "${EXTERNAL_LIBRARY_FOLDER}/boot") set(FFTW3F_INCLUDE_DIRS="${EXTERNAL_LIBRARY_FOLDER}/fftw-3/include") @@ -369,11 +374,6 @@ endif() if(APPLE AND BUNDLE AND BUILD_GUI) - install(TARGETS sdrangelbench) - if (BUILD_SERVER) - install(TARGETS sdrangelsrv) - endif() - configure_file("${CMAKE_SOURCE_DIR}/custom/desktop/MacOSXBundleInfo.plist.in" "${CMAKE_BINARY_DIR}/Info.plist" @ONLY) @@ -397,16 +397,35 @@ if(APPLE AND BUNDLE AND BUILD_GUI) elseif(LINUX AND BUNDLE) - # see https://gitlab.kitware.com/cmake/community/wikis/doc/cpack/PackageGenerators - list(APPEND CPACK_GENERATOR "DEB") + # TODO: + # - perseus package + # - CHANGELOG see https://github.com/xbmc/xbmc/pull/9987/commits/0152e8f50c0f11c8bddcfdc65e1596851fe8b310 + # - verify dpkg info + # - Boost seems used through Qt + + # needs dpkg + set(CPACK_GENERATOR "DEB") + set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${CPACK_PACKAGE_VERSION}_${LSB_CODENAME}_${CMAKE_SYSTEM_PROCESSOR}") set(CPACK_DEBIAN_PACKAGE_MAINTAINER "${APPLICATION_MAINTAINER}") set(CPACK_DEBIAN_PACKAGE_SECTION "hamradio") - set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6, libasound2, libfftw3-single3, libgcc1, libgl1-mesa-glx, libqt5core5a, libqt5gui5, libqt5multimedia5, libqt5network5, libqt5opengl5, libqt5widgets5, libqt5multimedia5-plugins, libstdc++6, libusb-1.0-0, libopencv, pulseaudio, libxml2, ffmpeg, libavcodec, libavformat, libopus, libcodec2") + set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6, libasound2, libfftw3-single3, libgcc1, libgl1-mesa-glx, libqt5core5a, libqt5gui5, libqt5multimedia5, libqt5network5, libqt5opengl5, libqt5widgets5, libqt5multimedia5-plugins, libstdc++6, libusb-1.0-0, pulseaudio, libxml2, ffmpeg, libopus0, codec2, libairspy0, libhackrf0, librtlsdr0, libbladerf1, libmirisdr0, libiio0, soapysdr-tools") - list(APPEND CPACK_GENERATOR "RPM") - set(CPACK_RPM_PACKAGE_RELEASE "1") - set(CPACK_RPM_PACKAGE_LICENSE "GPL-3.0") - set(CPACK_RPM_PACKAGE_REQUIRES "libusb") + if ("${LSB_CODENAME}" STREQUAL "buster") # Debian 10 + set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, libavcodec58, libavformat58, libairspyhf1, libopencv-imgproc3.2, libopencv-highgui3.2, limesuite") + elseif("${LSB_CODENAME}" STREQUAL "stretch") # Debian 9 + set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, libavcodec57, libavformat57, libopencv-imgproc2.45v5, libopencv-highgu2.4-deb0, limesuite") + elseif("${LSB_CODENAME}" STREQUAL "bionic") # Ubuntu 18.04 + set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, libavcodec57, libavformat57, libairspyhf0, libopencv-imgproc3.2, libopencv-highgui3.2, limesuite") + elseif("${LSB_CODENAME}" STREQUAL "xenial") # Ubuntu 16.04 + set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}, libavcodec-ffmpeg56, libavformat-ffmpeg56, libopencv-imgproc2.4v5, libopencv-highgui2.4v5") + endif() + + # TODO + # needs rpmbuild (rpm on debian) + #list(APPEND CPACK_GENERATOR "RPM") + #set(CPACK_RPM_PACKAGE_RELEASE "1") + #set(CPACK_RPM_PACKAGE_LICENSE "GPL-3.0") + #set(CPACK_RPM_PACKAGE_REQUIRES "libusb") elseif((WIN32 OR MINGW) AND BUNDLE) @@ -418,9 +437,6 @@ elseif((WIN32 OR MINGW) AND BUNDLE) set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON) set(CPACK_NSIS_MODIFY_PATH ON) - # from https://blog.nathanosman.com/2017/11/24/using-windeployqt-with-cpack.html - # DeployQt.cmake - else() if(NOT CMAKE_INSTALL_RPATH) @@ -436,23 +452,20 @@ else() PATH "Library Install Name Destination Directory" FORCE) endif() - install(TARGETS sdrangelbench DESTINATION ${INSTALL_BIN_DIR}) - if (BUILD_GUI) +endif(APPLE AND BUNDLE AND BUILD_GUI) + +install(TARGETS sdrangelbench DESTINATION ${INSTALL_BIN_DIR}) +if (BUILD_GUI AND NOT (APPLE AND BUNDLE)) install(TARGETS sdrangel DESTINATION ${INSTALL_BIN_DIR}) - endif() - if (BUILD_SERVER) - install(TARGETS sdrangelsrv DESTINATION ${INSTALL_BIN_DIR}) - endif() - - #install files and directories (linux specific) - if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") - # TODO remove useless udev - #install(DIRECTORY custom/udev-rules DESTINATION share/sdrangel) - #install(FILES custom/udev-rules/install.sh DESTINATION share/sdrangel/udev-rules PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) - install(FILES custom/desktop/sdrangel.desktop DESTINATION share/applications) - install(FILES custom/desktop/sdrangel_icon.png DESTINATION share/pixmaps) - endif() +endif() +if (BUILD_SERVER) + install(TARGETS sdrangelsrv DESTINATION ${INSTALL_BIN_DIR}) +endif() +#install files and directories (linux specific) +if (LINUX) + install(FILES custom/desktop/sdrangel.desktop DESTINATION share/applications) + install(FILES custom/desktop/sdrangel_icon.png DESTINATION share/pixmaps) endif() message(STATUS "CPack generators: ${CPACK_GENERATOR}") diff --git a/custom/udev-rules/50-xtrx-usb3380.rules b/custom/udev-rules/50-xtrx-usb3380.rules deleted file mode 100644 index cee3eb52d..000000000 --- a/custom/udev-rules/50-xtrx-usb3380.rules +++ /dev/null @@ -1 +0,0 @@ -SUBSYSTEMS=="usb", ATTRS{idVendor}=="0525", ATTRS{idProduct}=="3380", GROUP="usb", MODE="0666" diff --git a/custom/udev-rules/52-airspy.rules b/custom/udev-rules/52-airspy.rules deleted file mode 100644 index 5b99532fc..000000000 --- a/custom/udev-rules/52-airspy.rules +++ /dev/null @@ -1 +0,0 @@ -ATTR{idVendor}=="1d50", ATTR{idProduct}=="60a1", SYMLINK+="airspy-%k", MODE="666", GROUP="plugdev" diff --git a/custom/udev-rules/52-airspyhf.rules b/custom/udev-rules/52-airspyhf.rules deleted file mode 100644 index d7dee4578..000000000 --- a/custom/udev-rules/52-airspyhf.rules +++ /dev/null @@ -1 +0,0 @@ -ATTR{idVendor}=="03eb", ATTR{idProduct}=="800c", SYMLINK+="airspyhf-%k", MODE="660", GROUP="plugdev" diff --git a/custom/udev-rules/53-adi-plutosdr-usb.rules b/custom/udev-rules/53-adi-plutosdr-usb.rules deleted file mode 100644 index c3f576400..000000000 --- a/custom/udev-rules/53-adi-plutosdr-usb.rules +++ /dev/null @@ -1,8 +0,0 @@ -# allow "plugdev" group read/write access to ADI PlutoSDR devices -# DFU Device -SUBSYSTEM=="usb", ATTRS{idVendor}=="0456", ATTRS{idProduct}=="b674", MODE="0666", GROUP="plugdev" -# SDR Device -SUBSYSTEM=="usb", ATTRS{idVendor}=="0456", ATTRS{idProduct}=="b673", MODE="0666", GROUP="plugdev" -# tell the ModemManager (part of the NetworkManager suite) that the device is not a modem, -# and don't send AT commands to it -SUBSYSTEM=="usb", ATTRS{idVendor}=="0456", ATTRS{idProduct}=="b673", ENV{ID_MM_DEVICE_IGNORE}="1" diff --git a/custom/udev-rules/53-hackrf.rules b/custom/udev-rules/53-hackrf.rules deleted file mode 100644 index d76ada6d3..000000000 --- a/custom/udev-rules/53-hackrf.rules +++ /dev/null @@ -1,13 +0,0 @@ -# HackRF Jawbreaker -ATTR{idVendor}=="1d50", ATTR{idProduct}=="604b", SYMLINK+="hackrf-jawbreaker-%k", MODE="666", GROUP="plugdev" -# HackRF One -ATTR{idVendor}=="1d50", ATTR{idProduct}=="6089", SYMLINK+="hackrf-one-%k", MODE="666", GROUP="plugdev" -# rad1o -ATTR{idVendor}=="1d50", ATTR{idProduct}=="cc15", SYMLINK+="rad1o-%k", MODE="666", GROUP="plugdev" -# NXP Semiconductors DFU mode (HackRF and rad1o) -ATTR{idVendor}=="1fc9", ATTR{idProduct}=="000c", SYMLINK+="nxp-dfu-%k", MODE="666", GROUP="plugdev" -# rad1o "full flash" mode -KERNEL=="sd?", SUBSYSTEM=="block", ENV{ID_VENDOR_ID}=="1fc9", ENV{ID_MODEL_ID}=="0042", SYMLINK+="rad1o-flash-%k", MODE="666", GROUP="plugdev" -# rad1o flash disk -KERNEL=="sd?", SUBSYSTEM=="block", ENV{ID_VENDOR_ID}=="1fc9", ENV{ID_MODEL_ID}=="0082", SYMLINK+="rad1o-msc-%k", MODE="666", GROUP="plugdev" -# diff --git a/custom/udev-rules/64-limesuite.rules b/custom/udev-rules/64-limesuite.rules deleted file mode 100644 index 9050b76b7..000000000 --- a/custom/udev-rules/64-limesuite.rules +++ /dev/null @@ -1,5 +0,0 @@ -SUBSYSTEM=="usb", ATTR{idVendor}=="04b4", ATTR{idProduct}=="8613", SYMLINK+="stream-%k", MODE="666", GROUP="plugdev" -SUBSYSTEM=="usb", ATTR{idVendor}=="04b4", ATTR{idProduct}=="00f1", SYMLINK+="stream-%k", MODE="666", GROUP="plugdev" -SUBSYSTEM=="usb", ATTR{idVendor}=="0403", ATTR{idProduct}=="601f", SYMLINK+="stream-%k", MODE="666", GROUP="plugdev" -SUBSYSTEM=="usb", ATTR{idVendor}=="1d50", ATTR{idProduct}=="6108", SYMLINK+="stream-%k", MODE="666", GROUP="plugdev" -SUBSYSTEM=="xillybus", MODE="666", OPTIONS="last_rule" diff --git a/custom/udev-rules/88-nuand.rules b/custom/udev-rules/88-nuand.rules deleted file mode 100644 index 44add41f7..000000000 --- a/custom/udev-rules/88-nuand.rules +++ /dev/null @@ -1,11 +0,0 @@ -# Nuand bladeRF -ATTR{idVendor}=="2cf0", ATTR{idProduct}=="5246", MODE="666", GROUP="plugdev" - -# Nuand bladeRF2 -ATTR{idVendor}=="2cf0", ATTR{idProduct}=="5250", MODE="666", GROUP="plugdev" - -# Nuand bladeRF, legacy VID/PID -ATTR{idVendor}=="1d50", ATTR{idProduct}=="6066", MODE="666", GROUP="plugdev" - -# Cypress Bootloader -ATTR{idVendor}=="04b4", ATTR{idProduct}=="00f3", MODE="666", GROUP="plugdev" diff --git a/custom/udev-rules/95-perseus.rules b/custom/udev-rules/95-perseus.rules deleted file mode 100644 index 3cf1f885d..000000000 --- a/custom/udev-rules/95-perseus.rules +++ /dev/null @@ -1 +0,0 @@ -ATTR{idVendor}=="04b4", ATTR{idProduct}=="325c", MODE="666", GROUP="plugdev" diff --git a/custom/udev-rules/fcd.rules b/custom/udev-rules/fcd.rules deleted file mode 100644 index 3dace445c..000000000 --- a/custom/udev-rules/fcd.rules +++ /dev/null @@ -1,6 +0,0 @@ -# Udev rules for the Funcube Dongle Pro+ (0xfb31) - -# HIDAPI/libusb: -SUBSYSTEMS=="usb", ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="fb56", MODE:="0666" -SUBSYSTEMS=="usb", ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="fb31", MODE:="0666" - diff --git a/custom/udev-rules/install.sh b/custom/udev-rules/install.sh deleted file mode 100755 index 6ad83c128..000000000 --- a/custom/udev-rules/install.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh - -cp 50-xtrx-usb3380.rules /etc/udev/rules.d/ -cp 52-airspy.rules /etc/udev/rules.d/ -cp 52-airspyhf.rules /etc/udev/rules.d/ -cp 88-nuand.rules /etc/udev/rules.d/ -cp fcd.rules /etc/udev/rules.d/ -cp 53-hackrf.rules /etc/udev/rules.d/ -cp 64-limesuite.rules /etc/udev/rules.d/ -cp 53-adi-plutosdr-usb.rules /etc/udev/rules.d/ -cp rtl-sdr.rules /etc/udev/rules.d/ -cp mirisdr.rules /etc/udev/rules.d/ -cp 95-perseus.rules /etc/udev/rules.d/ - -udevadm control --reload-rules -udevadm trigger diff --git a/custom/udev-rules/mirisdr.rules b/custom/udev-rules/mirisdr.rules deleted file mode 100644 index 2b35cb78a..000000000 --- a/custom/udev-rules/mirisdr.rules +++ /dev/null @@ -1,25 +0,0 @@ -# -# Copyright 2012 Osmocom MiriSDR project -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# - -# Mirics MSi2500 default (e.g. VTX3D card) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="1df7", ATTRS{idProduct}=="2500", MODE:="0666" - -# IO-DATA GV-TV100 stick -SUBSYSTEMS=="usb", ATTRS{idVendor}=="04bb", ATTRS{idProduct}=="0537", MODE:="0666" - -# SDRplay RSP1A -SUBSYSTEMS=="usb", ATTRS{idVendor}=="1df7", ATTRS{idProduct}=="3000", MODE:="0666" diff --git a/custom/udev-rules/rtl-sdr.rules b/custom/udev-rules/rtl-sdr.rules deleted file mode 100644 index 421345461..000000000 --- a/custom/udev-rules/rtl-sdr.rules +++ /dev/null @@ -1,139 +0,0 @@ -# -# Copyright 2012-2013 Osmocom rtl-sdr project -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# - -# original RTL2832U vid/pid (hama nano, for example) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="2832", MODE:="0666" - -# RTL2832U OEM vid/pid, e.g. ezcap EzTV668 (E4000), Newsky TV28T (E4000/R820T) etc. -SUBSYSTEMS=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="2838", MODE:="0666" - -# DigitalNow Quad DVB-T PCI-E card (4x FC0012?) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="0413", ATTRS{idProduct}=="6680", MODE:="0666" - -# Leadtek WinFast DTV Dongle mini D (FC0012) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="0413", ATTRS{idProduct}=="6f0f", MODE:="0666" - -# Genius TVGo DVB-T03 USB dongle (Ver. B) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="0458", ATTRS{idProduct}=="707f", MODE:="0666" - -# Terratec Cinergy T Stick Black (rev 1) (FC0012) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00a9", MODE:="0666" - -# Terratec NOXON rev 1 (FC0013) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00b3", MODE:="0666" - -# Terratec Deutschlandradio DAB Stick (FC0013) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00b4", MODE:="0666" - -# Terratec NOXON DAB Stick - Radio Energy (FC0013) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00b5", MODE:="0666" - -# Terratec Media Broadcast DAB Stick (FC0013) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00b7", MODE:="0666" - -# Terratec BR DAB Stick (FC0013) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00b8", MODE:="0666" - -# Terratec WDR DAB Stick (FC0013) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00b9", MODE:="0666" - -# Terratec MuellerVerlag DAB Stick (FC0013) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00c0", MODE:="0666" - -# Terratec Fraunhofer DAB Stick (FC0013) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00c6", MODE:="0666" - -# Terratec Cinergy T Stick RC (Rev.3) (E4000) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00d3", MODE:="0666" - -# Terratec T Stick PLUS (E4000) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00d7", MODE:="0666" - -# Terratec NOXON rev 2 (E4000) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00e0", MODE:="0666" - -# PixelView PV-DT235U(RN) (FC0012) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="1554", ATTRS{idProduct}=="5020", MODE:="0666" - -# Astrometa DVB-T/DVB-T2 (R828D) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="15f4", ATTRS{idProduct}=="0131", MODE:="0666" - -# Compro Videomate U620F (E4000) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="185b", ATTRS{idProduct}=="0620", MODE:="0666" - -# Compro Videomate U650F (E4000) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="185b", ATTRS{idProduct}=="0650", MODE:="0666" - -# Compro Videomate U680F (E4000) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="185b", ATTRS{idProduct}=="0680", MODE:="0666" - -# GIGABYTE GT-U7300 (FC0012) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d393", MODE:="0666" - -# DIKOM USB-DVBT HD -SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d394", MODE:="0666" - -# Peak 102569AGPK (FC0012) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d395", MODE:="0666" - -# KWorld KW-UB450-T USB DVB-T Pico TV (TUA9001) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d397", MODE:="0666" - -# Zaapa ZT-MINDVBZP (FC0012) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d398", MODE:="0666" - -# SVEON STV20 DVB-T USB & FM (FC0012) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d39d", MODE:="0666" - -# Twintech UT-40 (FC0013) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d3a4", MODE:="0666" - -# ASUS U3100MINI_PLUS_V2 (FC0013) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d3a8", MODE:="0666" - -# SVEON STV27 DVB-T USB & FM (FC0013) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d3af", MODE:="0666" - -# SVEON STV21 DVB-T USB & FM -SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d3b0", MODE:="0666" - -# Dexatek DK DVB-T Dongle (Logilink VG0002A) (FC2580) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="1d19", ATTRS{idProduct}=="1101", MODE:="0666" - -# Dexatek DK DVB-T Dongle (MSI DigiVox mini II V3.0) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="1d19", ATTRS{idProduct}=="1102", MODE:="0666" - -# Dexatek DK 5217 DVB-T Dongle (FC2580) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="1d19", ATTRS{idProduct}=="1103", MODE:="0666" - -# MSI DigiVox Micro HD (FC2580) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="1d19", ATTRS{idProduct}=="1104", MODE:="0666" - -# Sweex DVB-T USB (FC0012) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="1f4d", ATTRS{idProduct}=="a803", MODE:="0666" - -# GTek T803 (FC0012) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="1f4d", ATTRS{idProduct}=="b803", MODE:="0666" - -# Lifeview LV5TDeluxe (FC0012) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="1f4d", ATTRS{idProduct}=="c803", MODE:="0666" - -# MyGica TD312 (FC0012) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="1f4d", ATTRS{idProduct}=="d286", MODE:="0666" - -# PROlectrix DV107669 (FC0012) -SUBSYSTEMS=="usb", ATTRS{idVendor}=="1f4d", ATTRS{idProduct}=="d803", MODE:="0666"