mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-26 09:48:45 -05:00
On Android, list USB devices by VID/PID and open using file descriptor.
This commit is contained in:
parent
897ecc4d88
commit
7aea12e6fe
@ -58,6 +58,7 @@ target_link_libraries(${TARGET_NAME}
|
|||||||
${TARGET_LIB_GUI}
|
${TARGET_LIB_GUI}
|
||||||
swagger
|
swagger
|
||||||
${LIBAIRSPY_LIBRARIES}
|
${LIBAIRSPY_LIBRARIES}
|
||||||
|
${LIBUSB_LIBRARIES}
|
||||||
)
|
)
|
||||||
|
|
||||||
install(TARGETS ${TARGET_NAME} DESTINATION ${INSTALL_FOLDER})
|
install(TARGETS ${TARGET_NAME} DESTINATION ${INSTALL_FOLDER})
|
||||||
|
@ -37,6 +37,9 @@
|
|||||||
#include "dsp/dspengine.h"
|
#include "dsp/dspengine.h"
|
||||||
#include "airspysettings.h"
|
#include "airspysettings.h"
|
||||||
#include "airspyworker.h"
|
#include "airspyworker.h"
|
||||||
|
#ifdef ANDROID
|
||||||
|
#include "util/android.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
MESSAGE_CLASS_DEFINITION(AirspyInput::MsgConfigureAirspy, Message)
|
MESSAGE_CLASS_DEFINITION(AirspyInput::MsgConfigureAirspy, Message)
|
||||||
MESSAGE_CLASS_DEFINITION(AirspyInput::MsgStartStop, Message)
|
MESSAGE_CLASS_DEFINITION(AirspyInput::MsgStartStop, Message)
|
||||||
@ -110,6 +113,20 @@ bool AirspyInput::openDevice()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ANDROID
|
||||||
|
int fd;
|
||||||
|
QString serial = m_deviceAPI->getSamplingDeviceSerial();
|
||||||
|
if ((fd = Android::openUSBDevice(serial)) < 0)
|
||||||
|
{
|
||||||
|
qCritical("AirspyInput::openDevice: could not open USB device %s", qPrintable(serial));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (airspy_open_fd(&m_dev, fd) != AIRSPY_SUCCESS)
|
||||||
|
{
|
||||||
|
qCritical("AirspyInput::openDevice: could not open Airspy: %s", qPrintable(serial));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#else
|
||||||
int device = m_deviceAPI->getSamplingDeviceSequence();
|
int device = m_deviceAPI->getSamplingDeviceSequence();
|
||||||
|
|
||||||
if ((m_dev = open_airspy_from_sequence(device)) == 0)
|
if ((m_dev = open_airspy_from_sequence(device)) == 0)
|
||||||
@ -117,6 +134,7 @@ bool AirspyInput::openDevice()
|
|||||||
qCritical("AirspyInput::start: could not open Airspy #%d", device);
|
qCritical("AirspyInput::start: could not open Airspy #%d", device);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef LIBAIRSPY_DEFAULT_RATES
|
#ifdef LIBAIRSPY_DEFAULT_RATES
|
||||||
qDebug("AirspyInput::start: detault rates");
|
qDebug("AirspyInput::start: detault rates");
|
||||||
|
@ -28,6 +28,9 @@
|
|||||||
|
|
||||||
#include "plugin/pluginapi.h"
|
#include "plugin/pluginapi.h"
|
||||||
#include "util/simpleserializer.h"
|
#include "util/simpleserializer.h"
|
||||||
|
#ifdef ANDROID
|
||||||
|
#include "util/android.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
const int AirspyPlugin::m_maxDevices = 32;
|
const int AirspyPlugin::m_maxDevices = 32;
|
||||||
|
|
||||||
@ -65,6 +68,29 @@ void AirspyPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& or
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ANDROID
|
||||||
|
|
||||||
|
QStringList serialStrings = Android::listUSBDeviceSerials(0x1d50, 0x60a1);
|
||||||
|
int deviceNo = 0;
|
||||||
|
for (const auto serialString : serialStrings)
|
||||||
|
{
|
||||||
|
QString displayableName(QString("Airspy[%1] %2").arg(deviceNo).arg(serialString));
|
||||||
|
|
||||||
|
originDevices.append(OriginDevice(
|
||||||
|
displayableName,
|
||||||
|
m_hardwareID,
|
||||||
|
serialString,
|
||||||
|
deviceNo,
|
||||||
|
1,
|
||||||
|
0
|
||||||
|
));
|
||||||
|
deviceNo++;
|
||||||
|
}
|
||||||
|
|
||||||
|
listedHwIds.append(m_hardwareID);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
airspy_read_partid_serialno_t read_partid_serialno;
|
airspy_read_partid_serialno_t read_partid_serialno;
|
||||||
struct airspy_device *devinfo;
|
struct airspy_device *devinfo;
|
||||||
uint32_t serial_msb = 0;
|
uint32_t serial_msb = 0;
|
||||||
@ -130,6 +156,8 @@ void AirspyPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& or
|
|||||||
qDebug("AirspyPlugin::enumOriginDevices: airspy_exit: %s", airspy_error_name(rc));
|
qDebug("AirspyPlugin::enumOriginDevices: airspy_exit: %s", airspy_error_name(rc));
|
||||||
|
|
||||||
listedHwIds.append(m_hardwareID);
|
listedHwIds.append(m_hardwareID);
|
||||||
|
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
PluginInterface::SamplingDevices AirspyPlugin::enumSampleSources(const OriginDevices& originDevices)
|
PluginInterface::SamplingDevices AirspyPlugin::enumSampleSources(const OriginDevices& originDevices)
|
||||||
|
@ -36,6 +36,9 @@
|
|||||||
#include "airspyhfplugin.h"
|
#include "airspyhfplugin.h"
|
||||||
#include "airspyhfsettings.h"
|
#include "airspyhfsettings.h"
|
||||||
#include "airspyhfworker.h"
|
#include "airspyhfworker.h"
|
||||||
|
#ifdef ANDROID
|
||||||
|
#include "util/android.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
MESSAGE_CLASS_DEFINITION(AirspyHFInput::MsgConfigureAirspyHF, Message)
|
MESSAGE_CLASS_DEFINITION(AirspyHFInput::MsgConfigureAirspyHF, Message)
|
||||||
MESSAGE_CLASS_DEFINITION(AirspyHFInput::MsgStartStop, Message)
|
MESSAGE_CLASS_DEFINITION(AirspyHFInput::MsgStartStop, Message)
|
||||||
@ -581,7 +584,13 @@ airspyhf_device_t *AirspyHFInput::open_airspyhf_from_serial(const QString& seria
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
#ifdef ANDROID
|
||||||
|
QString serialString = QString("AIRSPYHF SN:%1").arg(serial, 0, 16).toUpper();
|
||||||
|
int fd = Android::openUSBDevice(serialString);
|
||||||
|
rc = (airspyhf_error) airspyhf_open_fd(&devinfo, fd);
|
||||||
|
#else
|
||||||
rc = (airspyhf_error) airspyhf_open_sn(&devinfo, serial);
|
rc = (airspyhf_error) airspyhf_open_sn(&devinfo, serial);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (rc == AIRSPYHF_SUCCESS) {
|
if (rc == AIRSPYHF_SUCCESS) {
|
||||||
return devinfo;
|
return devinfo;
|
||||||
|
@ -27,7 +27,9 @@
|
|||||||
#else
|
#else
|
||||||
#include "airspyhfgui.h"
|
#include "airspyhfgui.h"
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef ANDROID
|
||||||
|
#include "util/android.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
const PluginDescriptor AirspyHFPlugin::m_pluginDescriptor = {
|
const PluginDescriptor AirspyHFPlugin::m_pluginDescriptor = {
|
||||||
QStringLiteral("AirspyHF"),
|
QStringLiteral("AirspyHF"),
|
||||||
@ -67,7 +69,35 @@ void AirspyHFPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices&
|
|||||||
int nbDevices;
|
int nbDevices;
|
||||||
uint64_t deviceSerials[m_maxDevices];
|
uint64_t deviceSerials[m_maxDevices];
|
||||||
|
|
||||||
|
#ifdef ANDROID
|
||||||
|
QStringList serialStrings = Android::listUSBDeviceSerials(0x03EB, 0x800C);
|
||||||
|
nbDevices = 0;
|
||||||
|
for (const auto serialString : serialStrings)
|
||||||
|
{
|
||||||
|
// Serials are of the form: "AIRSPYHF SN:12345678ABCDEF00"
|
||||||
|
int idx = serialString.indexOf(':');
|
||||||
|
if (idx != -1)
|
||||||
|
{
|
||||||
|
bool ok;
|
||||||
|
uint64_t serialInt = serialString.mid(idx+1).toULongLong(&ok, 16);
|
||||||
|
if (ok)
|
||||||
|
{
|
||||||
|
deviceSerials[nbDevices] = serialInt;
|
||||||
|
nbDevices++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qDebug() << "AirspyHFPlugin::enumOriginDevices: Couldn't convert " << serialString.mid(idx+1) << " to integer";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qDebug() << "AirspyHFPlugin::enumOriginDevices: No : in serial " << serialString;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
nbDevices = airspyhf_list_devices(deviceSerials, m_maxDevices);
|
nbDevices = airspyhf_list_devices(deviceSerials, m_maxDevices);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (nbDevices < 0)
|
if (nbDevices < 0)
|
||||||
{
|
{
|
||||||
|
@ -73,6 +73,7 @@ void AudioInputPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices
|
|||||||
1, // nb Rx
|
1, // nb Rx
|
||||||
0 // nb Tx
|
0 // nb Tx
|
||||||
));
|
));
|
||||||
|
listedHwIds.append(m_hardwareID);
|
||||||
}
|
}
|
||||||
|
|
||||||
PluginInterface::SamplingDevices AudioInputPlugin::enumSampleSources(const OriginDevices& originDevices)
|
PluginInterface::SamplingDevices AudioInputPlugin::enumSampleSources(const OriginDevices& originDevices)
|
||||||
|
@ -54,6 +54,7 @@ target_link_libraries(${TARGET_NAME}
|
|||||||
${TARGET_LIB_GUI}
|
${TARGET_LIB_GUI}
|
||||||
swagger
|
swagger
|
||||||
${LIBRTLSDR_LIBRARIES}
|
${LIBRTLSDR_LIBRARIES}
|
||||||
|
${LIBUSB_LIBRARIES}
|
||||||
)
|
)
|
||||||
|
|
||||||
install(TARGETS ${TARGET_NAME} DESTINATION ${INSTALL_FOLDER})
|
install(TARGETS ${TARGET_NAME} DESTINATION ${INSTALL_FOLDER})
|
||||||
|
@ -35,6 +35,9 @@
|
|||||||
#include "rtlsdrthread.h"
|
#include "rtlsdrthread.h"
|
||||||
#include "dsp/dspcommands.h"
|
#include "dsp/dspcommands.h"
|
||||||
#include "dsp/dspengine.h"
|
#include "dsp/dspengine.h"
|
||||||
|
#ifdef ANDROID
|
||||||
|
#include "util/android.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
MESSAGE_CLASS_DEFINITION(RTLSDRInput::MsgConfigureRTLSDR, Message)
|
MESSAGE_CLASS_DEFINITION(RTLSDRInput::MsgConfigureRTLSDR, Message)
|
||||||
MESSAGE_CLASS_DEFINITION(RTLSDRInput::MsgStartStop, Message)
|
MESSAGE_CLASS_DEFINITION(RTLSDRInput::MsgStartStop, Message)
|
||||||
@ -115,6 +118,19 @@ bool RTLSDRInput::openDevice()
|
|||||||
|
|
||||||
int device;
|
int device;
|
||||||
|
|
||||||
|
#ifdef ANDROID
|
||||||
|
int fd;
|
||||||
|
if ((fd = Android::openUSBDevice(m_deviceAPI->getSamplingDeviceSerial())) < 0)
|
||||||
|
{
|
||||||
|
qCritical("RTLSDRInput::openDevice: could not open USB device %s", qPrintable(m_deviceAPI->getSamplingDeviceSerial()));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ((res = rtlsdr_open_fd(&m_dev, fd)) < 0)
|
||||||
|
{
|
||||||
|
qCritical("RTLSDRInput::openDevice: could not open RTLSDR: %s", strerror(errno));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#else
|
||||||
if ((device = rtlsdr_get_index_by_serial(qPrintable(m_deviceAPI->getSamplingDeviceSerial()))) < 0)
|
if ((device = rtlsdr_get_index_by_serial(qPrintable(m_deviceAPI->getSamplingDeviceSerial()))) < 0)
|
||||||
{
|
{
|
||||||
qCritical("RTLSDRInput::openDevice: could not get RTLSDR serial number");
|
qCritical("RTLSDRInput::openDevice: could not get RTLSDR serial number");
|
||||||
@ -126,6 +142,7 @@ bool RTLSDRInput::openDevice()
|
|||||||
qCritical("RTLSDRInput::openDevice: could not open RTLSDR #%d: %s", device, strerror(errno));
|
qCritical("RTLSDRInput::openDevice: could not open RTLSDR #%d: %s", device, strerror(errno));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
vendor[0] = '\0';
|
vendor[0] = '\0';
|
||||||
product[0] = '\0';
|
product[0] = '\0';
|
||||||
|
@ -11,6 +11,9 @@
|
|||||||
#endif
|
#endif
|
||||||
#include "rtlsdrplugin.h"
|
#include "rtlsdrplugin.h"
|
||||||
#include "rtlsdrwebapiadapter.h"
|
#include "rtlsdrwebapiadapter.h"
|
||||||
|
#ifdef ANDROID
|
||||||
|
#include "util/android.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
const PluginDescriptor RTLSDRPlugin::m_pluginDescriptor = {
|
const PluginDescriptor RTLSDRPlugin::m_pluginDescriptor = {
|
||||||
QStringLiteral("RTLSDR"),
|
QStringLiteral("RTLSDR"),
|
||||||
@ -46,6 +49,83 @@ void RTLSDRPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& or
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ANDROID
|
||||||
|
typedef struct rtlsdr_dongle {
|
||||||
|
uint16_t vid;
|
||||||
|
uint16_t pid;
|
||||||
|
const char *name;
|
||||||
|
} rtlsdr_dongle_t;
|
||||||
|
|
||||||
|
// This list comes from librtlsdr.c
|
||||||
|
rtlsdr_dongle_t known_devices[] = {
|
||||||
|
{ 0x0bda, 0x2832, "Generic RTL2832U" },
|
||||||
|
{ 0x0bda, 0x2838, "Generic RTL2832U OEM" },
|
||||||
|
{ 0x0413, 0x6680, "DigitalNow Quad DVB-T PCI-E card" },
|
||||||
|
{ 0x0413, 0x6f0f, "Leadtek WinFast DTV Dongle mini D" },
|
||||||
|
{ 0x0458, 0x707f, "Genius TVGo DVB-T03 USB dongle (Ver. B)" },
|
||||||
|
{ 0x0ccd, 0x00a9, "Terratec Cinergy T Stick Black (rev 1)" },
|
||||||
|
{ 0x0ccd, 0x00b3, "Terratec NOXON DAB/DAB+ USB dongle (rev 1)" },
|
||||||
|
{ 0x0ccd, 0x00b4, "Terratec Deutschlandradio DAB Stick" },
|
||||||
|
{ 0x0ccd, 0x00b5, "Terratec NOXON DAB Stick - Radio Energy" },
|
||||||
|
{ 0x0ccd, 0x00b7, "Terratec Media Broadcast DAB Stick" },
|
||||||
|
{ 0x0ccd, 0x00b8, "Terratec BR DAB Stick" },
|
||||||
|
{ 0x0ccd, 0x00b9, "Terratec WDR DAB Stick" },
|
||||||
|
{ 0x0ccd, 0x00c0, "Terratec MuellerVerlag DAB Stick" },
|
||||||
|
{ 0x0ccd, 0x00c6, "Terratec Fraunhofer DAB Stick" },
|
||||||
|
{ 0x0ccd, 0x00d3, "Terratec Cinergy T Stick RC (Rev.3)" },
|
||||||
|
{ 0x0ccd, 0x00d7, "Terratec T Stick PLUS" },
|
||||||
|
{ 0x0ccd, 0x00e0, "Terratec NOXON DAB/DAB+ USB dongle (rev 2)" },
|
||||||
|
{ 0x1554, 0x5020, "PixelView PV-DT235U(RN)" },
|
||||||
|
{ 0x15f4, 0x0131, "Astrometa DVB-T/DVB-T2" },
|
||||||
|
{ 0x15f4, 0x0133, "HanfTek DAB+FM+DVB-T" },
|
||||||
|
{ 0x185b, 0x0620, "Compro Videomate U620F"},
|
||||||
|
{ 0x185b, 0x0650, "Compro Videomate U650F"},
|
||||||
|
{ 0x185b, 0x0680, "Compro Videomate U680F"},
|
||||||
|
{ 0x1b80, 0xd393, "GIGABYTE GT-U7300" },
|
||||||
|
{ 0x1b80, 0xd394, "DIKOM USB-DVBT HD" },
|
||||||
|
{ 0x1b80, 0xd395, "Peak 102569AGPK" },
|
||||||
|
{ 0x1b80, 0xd397, "KWorld KW-UB450-T USB DVB-T Pico TV" },
|
||||||
|
{ 0x1b80, 0xd398, "Zaapa ZT-MINDVBZP" },
|
||||||
|
{ 0x1b80, 0xd39d, "SVEON STV20 DVB-T USB & FM" },
|
||||||
|
{ 0x1b80, 0xd3a4, "Twintech UT-40" },
|
||||||
|
{ 0x1b80, 0xd3a8, "ASUS U3100MINI_PLUS_V2" },
|
||||||
|
{ 0x1b80, 0xd3af, "SVEON STV27 DVB-T USB & FM" },
|
||||||
|
{ 0x1b80, 0xd3b0, "SVEON STV21 DVB-T USB & FM" },
|
||||||
|
{ 0x1d19, 0x1101, "Dexatek DK DVB-T Dongle (Logilink VG0002A)" },
|
||||||
|
{ 0x1d19, 0x1102, "Dexatek DK DVB-T Dongle (MSI DigiVox mini II V3.0)" },
|
||||||
|
{ 0x1d19, 0x1103, "Dexatek Technology Ltd. DK 5217 DVB-T Dongle" },
|
||||||
|
{ 0x1d19, 0x1104, "MSI DigiVox Micro HD" },
|
||||||
|
{ 0x1f4d, 0xa803, "Sweex DVB-T USB" },
|
||||||
|
{ 0x1f4d, 0xb803, "GTek T803" },
|
||||||
|
{ 0x1f4d, 0xc803, "Lifeview LV5TDeluxe" },
|
||||||
|
{ 0x1f4d, 0xd286, "MyGica TD312" },
|
||||||
|
{ 0x1f4d, 0xd803, "PROlectrix DV107669" },
|
||||||
|
};
|
||||||
|
|
||||||
|
int deviceNo = 0;
|
||||||
|
for (int i = 0; i < sizeof(known_devices)/sizeof(rtlsdr_dongle_t); i++)
|
||||||
|
{
|
||||||
|
QStringList serialStrings = Android::listUSBDeviceSerials(known_devices[i].vid, known_devices[i].pid);
|
||||||
|
|
||||||
|
for (const auto serial : serialStrings)
|
||||||
|
{
|
||||||
|
QString displayableName(QString("RTL-SDR[%1] %2").arg(deviceNo).arg(serial));
|
||||||
|
|
||||||
|
originDevices.append(OriginDevice(
|
||||||
|
displayableName,
|
||||||
|
m_hardwareID,
|
||||||
|
serial,
|
||||||
|
deviceNo, // sequence
|
||||||
|
1, // Nb Rx
|
||||||
|
0 // Nb Tx
|
||||||
|
));
|
||||||
|
|
||||||
|
deviceNo++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
listedHwIds.append(m_hardwareID);
|
||||||
|
#else
|
||||||
int count = rtlsdr_get_device_count();
|
int count = rtlsdr_get_device_count();
|
||||||
char vendor[256];
|
char vendor[256];
|
||||||
char product[256];
|
char product[256];
|
||||||
@ -72,6 +152,7 @@ void RTLSDRPlugin::enumOriginDevices(QStringList& listedHwIds, OriginDevices& or
|
|||||||
}
|
}
|
||||||
|
|
||||||
listedHwIds.append(m_hardwareID);
|
listedHwIds.append(m_hardwareID);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
PluginInterface::SamplingDevices RTLSDRPlugin::enumSampleSources(const OriginDevices& originDevices)
|
PluginInterface::SamplingDevices RTLSDRPlugin::enumSampleSources(const OriginDevices& originDevices)
|
||||||
|
Loading…
Reference in New Issue
Block a user