mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-11-03 13:11:20 -05:00 
			
		
		
		
	Merge fcdctl.
This commit is contained in:
		
							parent
							
								
									21578a555e
								
							
						
					
					
						commit
						f10a0b778d
					
				@ -5,7 +5,7 @@ For Ubuntu:
 | 
			
		||||
 | 
			
		||||
"librtlsdr-dev" is in the "universe" repo. (utopic 14.10 amd64.)
 | 
			
		||||
 | 
			
		||||
Funcube Dongle Pro+ support needs package "libasound2-dev"
 | 
			
		||||
Funcube Dongle Pro+ support needs packages "libasound2-dev libhidapi-dev"
 | 
			
		||||
 | 
			
		||||
Use "cmake ../ -DKERNEL=ON" to build the Linux kernel driver (Experimental). Needs a recent kernel and libv4l2. Will need extra work to support Airspy and Hackrf. Needs "cp KERNEL_SOURCE/include/linux/compiler.h /usr/include/linux/" and "cp KERNEL_SOURCE/include/uapi/linux/videodev2.h /usr/include/uapi/linux/" and package "libv4l-dev".
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -22,9 +22,14 @@ if(LIBUSB_FOUND AND UNIX)
 | 
			
		||||
	FIND_LIBRARY (LIBASOUND asound)
 | 
			
		||||
endif()
 | 
			
		||||
if(LIBASOUND AND ASOUNDH)
 | 
			
		||||
	FIND_PATH (HIDAPIH hidapi/hidapi.h)
 | 
			
		||||
	FIND_LIBRARY(LIBHIDAPI hidapi-libusb)
 | 
			
		||||
endif()
 | 
			
		||||
if(LIBHIDAPI AND HIDAPIH)
 | 
			
		||||
	add_subdirectory(fcd)
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
if(LIBUSB_FOUND AND LIBRTLSDR_FOUND)
 | 
			
		||||
	add_subdirectory(rtlsdr)
 | 
			
		||||
endif(LIBUSB_FOUND AND LIBRTLSDR_FOUND)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -8,11 +8,13 @@ set(fcd_SOURCES
 | 
			
		||||
	fcdsource.cpp
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
set(rtlsdr_HEADERS
 | 
			
		||||
set(fcd_HEADERS
 | 
			
		||||
	fcdgui.h
 | 
			
		||||
	fcdinput.h
 | 
			
		||||
	fcdplugin.h
 | 
			
		||||
	fcdthread.h
 | 
			
		||||
	qthid.h
 | 
			
		||||
	hid-libusb.h
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
set(fcd_FORMS
 | 
			
		||||
@ -43,6 +45,7 @@ add_library(inputfcd SHARED
 | 
			
		||||
target_link_libraries(inputfcd
 | 
			
		||||
	${QT_LIBRARIES}
 | 
			
		||||
	asound
 | 
			
		||||
	hidapi-libusb
 | 
			
		||||
	sdrbase
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										88
									
								
								plugins/samplesource/fcd/fcd.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								plugins/samplesource/fcd/fcd.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,88 @@
 | 
			
		||||
/***************************************************************************
 | 
			
		||||
 *  This file is part of Qthid.
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2010  Howard Long, G6LVB
 | 
			
		||||
 *  CopyRight (C) 2011  Alexandru Csete, OZ9AEC
 | 
			
		||||
 *                      Mario Lorenz, DL5MLO
 | 
			
		||||
 *
 | 
			
		||||
 *  Qthid 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.
 | 
			
		||||
 *
 | 
			
		||||
 *  Qthid 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 Qthid.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 ***************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef FCD_H
 | 
			
		||||
#define FCD_H 1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef FCD
 | 
			
		||||
#define EXTERN
 | 
			
		||||
#define ASSIGN (x) =x
 | 
			
		||||
#else
 | 
			
		||||
#define EXTERN extern
 | 
			
		||||
#define ASSIGN(x)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef _WIN32
 | 
			
		||||
#define FCD_API_EXPORT __declspec(dllexport)
 | 
			
		||||
#define FCD_API_CALL  _stdcall
 | 
			
		||||
#else
 | 
			
		||||
#define FCD_API_EXPORT
 | 
			
		||||
#define FCD_API_CALL
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <inttypes.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** \brief FCD mode enumeration. */
 | 
			
		||||
typedef enum {
 | 
			
		||||
    FCD_MODE_NONE,  /*!< No FCD detected. */
 | 
			
		||||
    FCD_MODE_DEAD,
 | 
			
		||||
    FCD_MODE_BL,    /*!< FCD present in bootloader mode. */
 | 
			
		||||
    FCD_MODE_APP    /*!< FCD present in aplpication mode. */
 | 
			
		||||
} FCD_MODE_ENUM; // The current mode of the FCD: none inserted, in bootloader mode or in normal application mode
 | 
			
		||||
 | 
			
		||||
/** \brief FCD capabilities that depend on both hardware and firmware. */
 | 
			
		||||
typedef struct {
 | 
			
		||||
    unsigned char hasBiasT;     /*!< Whether FCD has hardware bias tee (1=yes, 0=no) */
 | 
			
		||||
    unsigned char hasCellBlock; /*!< Whether FCD has cellular blocking. */
 | 
			
		||||
} FCD_CAPS_STRUCT;
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Application functions */
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdGetMode(void);
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdGetFwVerStr(char *str);
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdGetCaps(FCD_CAPS_STRUCT *fcd_caps);
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdGetCapsStr(char *caps_str);
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdAppReset(void);
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdAppSetFreqkHz(int nFreq);
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdAppSetFreq(int nFreq);
 | 
			
		||||
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdAppSetParam(uint8_t u8Cmd, uint8_t *pu8Data, uint8_t u8len);
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdAppGetParam(uint8_t u8Cmd, uint8_t *pu8Data, uint8_t u8len);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Bootloader functions */
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdBlReset(void);
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdBlErase(void);
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdBlWriteFirmware(char *pc, int64_t n64Size);
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdBlVerifyFirmware(char *pc, int64_t n64Size);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif // FCD_H
 | 
			
		||||
							
								
								
									
										305
									
								
								plugins/samplesource/fcd/fcdhidcmd.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										305
									
								
								plugins/samplesource/fcd/fcdhidcmd.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,305 @@
 | 
			
		||||
/***************************************************************************
 | 
			
		||||
 *  This file is part of Qthid.
 | 
			
		||||
 *
 | 
			
		||||
 *  Copyright (C) 2010  Howard Long, G6LVB
 | 
			
		||||
 *  CopyRight (C) 2011  Alexandru Csete, OZ9AEC
 | 
			
		||||
 *                      Mario Lorenz, DL5MLO
 | 
			
		||||
 *
 | 
			
		||||
 *  Qthid 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.
 | 
			
		||||
 *
 | 
			
		||||
 *  Qthid 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 Qthid.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 ***************************************************************************/
 | 
			
		||||
#ifndef FCDHIDCMD_H
 | 
			
		||||
#define FCD_HID_CMD_H 1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Commands applicable in bootloader mode */
 | 
			
		||||
#define FCD_CMD_BL_QUERY                1  /*!< Returns string with "FCDAPP version". */
 | 
			
		||||
#define FCD_CMD_BL_RESET                8  /*!< Reset to application mode. */
 | 
			
		||||
#define FCD_CMD_BL_ERASE               24  /*!< Erase firmware from FCD flash. */
 | 
			
		||||
#define FCD_CMD_BL_SET_BYTE_ADDR       25  /*!< TBD */
 | 
			
		||||
#define FCD_CMD_BL_GET_BYTE_ADDR_RANGE 26  /*!< Get address range. */
 | 
			
		||||
#define FCD_CMD_BL_WRITE_FLASH_BLOCK   27  /*!< Write flash block. */
 | 
			
		||||
#define FCD_CMD_BL_READ_FLASH_BLOCK    28  /*!< Read flash block. */
 | 
			
		||||
 | 
			
		||||
/* Commands applicable in application mode */
 | 
			
		||||
#define FCD_CMD_APP_SET_FREQ_KHZ     100 /*!< Send with 3 byte unsigned little endian frequency in kHz. */
 | 
			
		||||
#define FCD_CMD_APP_SET_FREQ_HZ      101 /*!< Send with 4 byte unsigned little endian frequency in Hz, returns with actual frequency set in Hz */
 | 
			
		||||
#define FCD_CMD_APP_GET_FREQ_HZ      102 /*!< Returns 4 byte unsigned little endian frequency in Hz. */
 | 
			
		||||
 | 
			
		||||
#define FCD_CMD_APP_GET_IF_RSSI      104 /*!< Supposed to return 1 byte unsigned IF RSSI (-35dBm=0, -10dBm=70) but it is not functional. */
 | 
			
		||||
#define FCD_CMD_APP_GET_PLL_LOCK     105 /*!< Returns 1 bit, true if locked. */
 | 
			
		||||
 | 
			
		||||
#define FCD_CMD_APP_SET_DC_CORR      106 /*!< Send with 2 byte unsigned I DC correction followed by 2 byte unsigned Q DC correction. 32768 is the default centre value. */
 | 
			
		||||
#define FCD_CMD_APP_GET_DC_CORR      107 /*!< Returns 2 byte unsigned I DC correction followed by 2 byte unsigned Q DC correction. 32768 is the default centre value. */
 | 
			
		||||
#define FCD_CMD_APP_SET_IQ_CORR      108 /*!< Send with 2 byte signed phase correction followed by 2 byte unsigned gain correction. 0 is the default centre value for phase correction, 32768 is the default centre value for gain. */
 | 
			
		||||
#define FCD_CMD_APP_GET_IQ_CORR      109 /*!< Returns 2 byte signed phase correction followed by 2 byte unsigned gain correction. 0 is the default centre value for phase correction, 32768 is the default centre value for gain. */
 | 
			
		||||
 | 
			
		||||
#define FCD_CMD_APP_SET_LNA_GAIN     110 /*!< Send a 1 byte value, see enums for reference. */
 | 
			
		||||
#define FCD_CMD_APP_SET_LNA_ENHANCE  111
 | 
			
		||||
#define FCD_CMD_APP_SET_BAND         112
 | 
			
		||||
#define FCD_CMD_APP_SET_RF_FILTER    113
 | 
			
		||||
#define FCD_CMD_APP_SET_MIXER_GAIN   114
 | 
			
		||||
#define FCD_CMD_APP_SET_BIAS_CURRENT 115
 | 
			
		||||
#define FCD_CMD_APP_SET_MIXER_FILTER 116
 | 
			
		||||
#define FCD_CMD_APP_SET_IF_GAIN1     117
 | 
			
		||||
#define FCD_CMD_APP_SET_IF_GAIN_MODE 118
 | 
			
		||||
#define FCD_CMD_APP_SET_IF_RC_FILTER 119
 | 
			
		||||
#define FCD_CMD_APP_SET_IF_GAIN2     120
 | 
			
		||||
#define FCD_CMD_APP_SET_IF_GAIN3     121
 | 
			
		||||
#define FCD_CMD_APP_SET_IF_FILTER    122
 | 
			
		||||
#define FCD_CMD_APP_SET_IF_GAIN4     123
 | 
			
		||||
#define FCD_CMD_APP_SET_IF_GAIN5     124
 | 
			
		||||
#define FCD_CMD_APP_SET_IF_GAIN6     125
 | 
			
		||||
#define FCD_CMD_APP_SET_BIAS_TEE     126 /*!< Bias T for ext LNA. Send with one byte: 1=ON, 0=OFF. */
 | 
			
		||||
 | 
			
		||||
#define FCD_CMD_APP_GET_LNA_GAIN     150 // Retrieve a 1 byte value, see enums for reference
 | 
			
		||||
#define FCD_CMD_APP_GET_LNA_ENHANCE  151
 | 
			
		||||
#define FCD_CMD_APP_GET_BAND         152
 | 
			
		||||
#define FCD_CMD_APP_GET_RF_FILTER    153
 | 
			
		||||
#define FCD_CMD_APP_GET_MIXER_GAIN   154
 | 
			
		||||
#define FCD_CMD_APP_GET_BIAS_CURRENT 155
 | 
			
		||||
#define FCD_CMD_APP_GET_MIXER_FILTER 156
 | 
			
		||||
#define FCD_CMD_APP_GET_IF_GAIN1     157
 | 
			
		||||
#define FCD_CMD_APP_GET_IF_GAIN_MODE 158
 | 
			
		||||
#define FCD_CMD_APP_GET_IF_RC_FILTER 159
 | 
			
		||||
#define FCD_CMD_APP_GET_IF_GAIN2     160
 | 
			
		||||
#define FCD_CMD_APP_GET_IF_GAIN3     161
 | 
			
		||||
#define FCD_CMD_APP_GET_IF_FILTER    162
 | 
			
		||||
#define FCD_CMD_APP_GET_IF_GAIN4     163
 | 
			
		||||
#define FCD_CMD_APP_GET_IF_GAIN5     164
 | 
			
		||||
#define FCD_CMD_APP_GET_IF_GAIN6     165
 | 
			
		||||
#define FCD_CMD_APP_GET_BIAS_TEE     166 /*!< Bias T. 1=ON, 0=OFF. */
 | 
			
		||||
 | 
			
		||||
#define FCD_CMD_APP_SEND_I2C_BYTE    200
 | 
			
		||||
#define FCD_CMD_APP_RECV_I2C_BYTE    201
 | 
			
		||||
 | 
			
		||||
#define FCD_CMD_APP_RESET            255 // Reset to bootloader
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef enum 
 | 
			
		||||
{
 | 
			
		||||
	TLGE_N5_0DB=0,
 | 
			
		||||
	TLGE_N2_5DB=1,
 | 
			
		||||
	TLGE_P0_0DB=4,
 | 
			
		||||
	TLGE_P2_5DB=5,
 | 
			
		||||
	TLGE_P5_0DB=6,
 | 
			
		||||
	TLGE_P7_5DB=7,
 | 
			
		||||
	TLGE_P10_0DB=8,
 | 
			
		||||
	TLGE_P12_5DB=9,
 | 
			
		||||
	TLGE_P15_0DB=10,
 | 
			
		||||
	TLGE_P17_5DB=11,
 | 
			
		||||
	TLGE_P20_0DB=12,
 | 
			
		||||
	TLGE_P25_0DB=13,
 | 
			
		||||
	TLGE_P30_0DB=14
 | 
			
		||||
} TUNER_LNA_GAIN_ENUM;
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
  TLEE_OFF=0,
 | 
			
		||||
  TLEE_0=1,
 | 
			
		||||
  TLEE_1=3,
 | 
			
		||||
  TLEE_2=5,
 | 
			
		||||
  TLEE_3=7
 | 
			
		||||
} TUNER_LNA_ENHANCE_ENUM;
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
  TBE_VHF2,
 | 
			
		||||
  TBE_VHF3,
 | 
			
		||||
  TBE_UHF,
 | 
			
		||||
  TBE_LBAND
 | 
			
		||||
} TUNER_BAND_ENUM;
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
  // Band 0, VHF II
 | 
			
		||||
  TRFE_LPF268MHZ=0,
 | 
			
		||||
  TRFE_LPF299MHZ=8,
 | 
			
		||||
  // Band 1, VHF III
 | 
			
		||||
  TRFE_LPF509MHZ=0,
 | 
			
		||||
  TRFE_LPF656MHZ=8,
 | 
			
		||||
  // Band 2, UHF
 | 
			
		||||
  TRFE_BPF360MHZ=0,
 | 
			
		||||
  TRFE_BPF380MHZ=1,
 | 
			
		||||
  TRFE_BPF405MHZ=2,
 | 
			
		||||
  TRFE_BPF425MHZ=3,
 | 
			
		||||
  TRFE_BPF450MHZ=4,
 | 
			
		||||
  TRFE_BPF475MHZ=5,
 | 
			
		||||
  TRFE_BPF505MHZ=6,
 | 
			
		||||
  TRFE_BPF540MHZ=7,
 | 
			
		||||
  TRFE_BPF575MHZ=8,
 | 
			
		||||
  TRFE_BPF615MHZ=9,
 | 
			
		||||
  TRFE_BPF670MHZ=10,
 | 
			
		||||
  TRFE_BPF720MHZ=11,
 | 
			
		||||
  TRFE_BPF760MHZ=12,
 | 
			
		||||
  TRFE_BPF840MHZ=13,
 | 
			
		||||
  TRFE_BPF890MHZ=14,
 | 
			
		||||
  TRFE_BPF970MHZ=15,
 | 
			
		||||
  // Band 2, L band
 | 
			
		||||
  TRFE_BPF1300MHZ=0,
 | 
			
		||||
  TRFE_BPF1320MHZ=1,
 | 
			
		||||
  TRFE_BPF1360MHZ=2,
 | 
			
		||||
  TRFE_BPF1410MHZ=3,
 | 
			
		||||
  TRFE_BPF1445MHZ=4,
 | 
			
		||||
  TRFE_BPF1460MHZ=5,
 | 
			
		||||
  TRFE_BPF1490MHZ=6,
 | 
			
		||||
  TRFE_BPF1530MHZ=7,
 | 
			
		||||
  TRFE_BPF1560MHZ=8,
 | 
			
		||||
  TRFE_BPF1590MHZ=9,
 | 
			
		||||
  TRFE_BPF1640MHZ=10,
 | 
			
		||||
  TRFE_BPF1660MHZ=11,
 | 
			
		||||
  TRFE_BPF1680MHZ=12,
 | 
			
		||||
  TRFE_BPF1700MHZ=13,
 | 
			
		||||
  TRFE_BPF1720MHZ=14,
 | 
			
		||||
  TRFE_BPF1750MHZ=15
 | 
			
		||||
} TUNER_RF_FILTER_ENUM;
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
  TMGE_P4_0DB=0,
 | 
			
		||||
  TMGE_P12_0DB=1
 | 
			
		||||
} TUNER_MIXER_GAIN_ENUM;
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
  TBCE_LBAND=0,
 | 
			
		||||
  TBCE_1=1,
 | 
			
		||||
  TBCE_2=2,
 | 
			
		||||
  TBCE_VUBAND=3
 | 
			
		||||
} TUNER_BIAS_CURRENT_ENUM;
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
  TMFE_27_0MHZ=0,
 | 
			
		||||
  TMFE_4_6MHZ=8,
 | 
			
		||||
  TMFE_4_2MHZ=9,
 | 
			
		||||
  TMFE_3_8MHZ=10,
 | 
			
		||||
  TMFE_3_4MHZ=11,
 | 
			
		||||
  TMFE_3_0MHZ=12,
 | 
			
		||||
  TMFE_2_7MHZ=13,
 | 
			
		||||
  TMFE_2_3MHZ=14,
 | 
			
		||||
  TMFE_1_9MHZ=15
 | 
			
		||||
} TUNER_MIXER_FILTER_ENUM;
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
  TIG1E_N3_0DB=0,
 | 
			
		||||
  TIG1E_P6_0DB=1
 | 
			
		||||
} TUNER_IF_GAIN1_ENUM;
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
  TIGME_LINEARITY=0,
 | 
			
		||||
  TIGME_SENSITIVITY=1
 | 
			
		||||
} TUNER_IF_GAIN_MODE_ENUM;
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
  TIRFE_21_4MHZ=0,
 | 
			
		||||
  TIRFE_21_0MHZ=1,
 | 
			
		||||
  TIRFE_17_6MHZ=2,
 | 
			
		||||
  TIRFE_14_7MHZ=3,
 | 
			
		||||
  TIRFE_12_4MHZ=4,
 | 
			
		||||
  TIRFE_10_6MHZ=5,
 | 
			
		||||
  TIRFE_9_0MHZ=6,
 | 
			
		||||
  TIRFE_7_7MHZ=7,
 | 
			
		||||
  TIRFE_6_4MHZ=8,
 | 
			
		||||
  TIRFE_5_3MHZ=9,
 | 
			
		||||
  TIRFE_4_4MHZ=10,
 | 
			
		||||
  TIRFE_3_4MHZ=11,
 | 
			
		||||
  TIRFE_2_6MHZ=12,
 | 
			
		||||
  TIRFE_1_8MHZ=13,
 | 
			
		||||
  TIRFE_1_2MHZ=14,
 | 
			
		||||
  TIRFE_1_0MHZ=15
 | 
			
		||||
} TUNER_IF_RC_FILTER_ENUM;
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
  TIG2E_P0_0DB=0,
 | 
			
		||||
  TIG2E_P3_0DB=1,
 | 
			
		||||
  TIG2E_P6_0DB=2,
 | 
			
		||||
  TIG2E_P9_0DB=3
 | 
			
		||||
} TUNER_IF_GAIN2_ENUM;
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
  TIG3E_P0_0DB=0,
 | 
			
		||||
  TIG3E_P3_0DB=1,
 | 
			
		||||
  TIG3E_P6_0DB=2,
 | 
			
		||||
  TIG3E_P9_0DB=3
 | 
			
		||||
} TUNER_IF_GAIN3_ENUM;
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
  TIG4E_P0_0DB=0,
 | 
			
		||||
  TIG4E_P1_0DB=1,
 | 
			
		||||
  TIG4E_P2_0DB=2
 | 
			
		||||
} TUNER_IF_GAIN4_ENUM;
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
  TIFE_5_50MHZ=0,
 | 
			
		||||
  TIFE_5_30MHZ=1,
 | 
			
		||||
  TIFE_5_00MHZ=2,
 | 
			
		||||
  TIFE_4_80MHZ=3,
 | 
			
		||||
  TIFE_4_60MHZ=4,
 | 
			
		||||
  TIFE_4_40MHZ=5,
 | 
			
		||||
  TIFE_4_30MHZ=6,
 | 
			
		||||
  TIFE_4_10MHZ=7,
 | 
			
		||||
  TIFE_3_90MHZ=8,
 | 
			
		||||
  TIFE_3_80MHZ=9,
 | 
			
		||||
  TIFE_3_70MHZ=10,
 | 
			
		||||
  TIFE_3_60MHZ=11,
 | 
			
		||||
  TIFE_3_40MHZ=12,
 | 
			
		||||
  TIFE_3_30MHZ=13,
 | 
			
		||||
  TIFE_3_20MHZ=14,
 | 
			
		||||
  TIFE_3_10MHZ=15,
 | 
			
		||||
  TIFE_3_00MHZ=16,
 | 
			
		||||
  TIFE_2_95MHZ=17,
 | 
			
		||||
  TIFE_2_90MHZ=18,
 | 
			
		||||
  TIFE_2_80MHZ=19,
 | 
			
		||||
  TIFE_2_75MHZ=20,
 | 
			
		||||
  TIFE_2_70MHZ=21,
 | 
			
		||||
  TIFE_2_60MHZ=22,
 | 
			
		||||
  TIFE_2_55MHZ=23,
 | 
			
		||||
  TIFE_2_50MHZ=24,
 | 
			
		||||
  TIFE_2_45MHZ=25,
 | 
			
		||||
  TIFE_2_40MHZ=26,
 | 
			
		||||
  TIFE_2_30MHZ=27,
 | 
			
		||||
  TIFE_2_28MHZ=28,
 | 
			
		||||
  TIFE_2_24MHZ=29,
 | 
			
		||||
  TIFE_2_20MHZ=30,
 | 
			
		||||
  TIFE_2_15MHZ=31
 | 
			
		||||
} TUNER_IF_FILTER_ENUM;
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
  TIG5E_P3_0DB=0,
 | 
			
		||||
  TIG5E_P6_0DB=1,
 | 
			
		||||
  TIG5E_P9_0DB=2,
 | 
			
		||||
  TIG5E_P12_0DB=3,
 | 
			
		||||
  TIG5E_P15_0DB=4
 | 
			
		||||
} TUNER_IF_GAIN5_ENUM;
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
  TIG6E_P3_0DB=0,
 | 
			
		||||
  TIG6E_P6_0DB=1,
 | 
			
		||||
  TIG6E_P9_0DB=2,
 | 
			
		||||
  TIG6E_P12_0DB=3,
 | 
			
		||||
  TIG6E_P15_0DB=4
 | 
			
		||||
} TUNER_IF_GAIN6_ENUM;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif // FCDHIDCMD_H
 | 
			
		||||
@ -1,9 +1,17 @@
 | 
			
		||||
/* (C)2015 John Greb
 | 
			
		||||
 *
 | 
			
		||||
 * Funcube Dongle command line interface
 | 
			
		||||
 * Copyright 2011 David Pello EA1IDZ
 | 
			
		||||
 * Copyright 2011 Pieter-Tjerk de Boer PA3FWM
 | 
			
		||||
 * Copyright 2012-2014 Alexandru Csete OZ9AEC
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public Licence version 3.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "fcdthread.h"
 | 
			
		||||
#include "hid-libusb.h"
 | 
			
		||||
#include "qthid.h"
 | 
			
		||||
 | 
			
		||||
bool FCDThread::OpenSource(const char* cardname)
 | 
			
		||||
{
 | 
			
		||||
@ -40,7 +48,8 @@ void FCDThread::CloseSource()
 | 
			
		||||
 | 
			
		||||
void FCDThread::set_center_freq(double freq)
 | 
			
		||||
{
 | 
			
		||||
	//TODO
 | 
			
		||||
        if (fcdAppSetFreq(freq) == FCD_MODE_NONE)
 | 
			
		||||
		qCritical("No FCD HID found for frquency change");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int FCDThread::work(int n_items)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										1426
									
								
								plugins/samplesource/fcd/hid-libusb.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1426
									
								
								plugins/samplesource/fcd/hid-libusb.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										913
									
								
								plugins/samplesource/fcd/qthid.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										913
									
								
								plugins/samplesource/fcd/qthid.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,913 @@
 | 
			
		||||
/***************************************************************************
 | 
			
		||||
 *  This file is part of Qthid.
 | 
			
		||||
 * 
 | 
			
		||||
 *  Copyright (C) 2010  Howard Long, G6LVB
 | 
			
		||||
 *  CopyRight (C) 2011  Alexandru Csete, OZ9AEC
 | 
			
		||||
 *                      Mario Lorenz, DL5MLO
 | 
			
		||||
 * 
 | 
			
		||||
 *  Qthid 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.
 | 
			
		||||
 *
 | 
			
		||||
 *  Qthid 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 Qthid.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 ***************************************************************************/
 | 
			
		||||
 | 
			
		||||
#define FCD
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <hidapi/hidapi.h>
 | 
			
		||||
#include "fcd.h"
 | 
			
		||||
#include "fcdhidcmd.h"
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#define TRUE true
 | 
			
		||||
#define FALSE false
 | 
			
		||||
typedef bool BOOL;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define FCDPP
 | 
			
		||||
const unsigned short _usVID=0x04D8;  /*!< USB vendor ID. */
 | 
			
		||||
#ifdef FCDPP
 | 
			
		||||
const unsigned short _usPID=0xFB31;  /*!< USB product ID. */
 | 
			
		||||
#else
 | 
			
		||||
const unsigned short _usPID=0xFB56;  /*!< USB product ID. */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
int whichdongle=0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** \brief Open FCD device.
 | 
			
		||||
 * \return Pointer to the FCD HID device or NULL if none found
 | 
			
		||||
 *
 | 
			
		||||
 * This function looks for FCD devices connected to the computer and
 | 
			
		||||
 * opens the first one found.
 | 
			
		||||
 */
 | 
			
		||||
static hid_device *fcdOpen(void)
 | 
			
		||||
{
 | 
			
		||||
    struct hid_device_info *phdi=NULL;
 | 
			
		||||
    hid_device *phd=NULL;
 | 
			
		||||
    char *pszPath=NULL;
 | 
			
		||||
 | 
			
		||||
    phdi=hid_enumerate(_usVID,_usPID);
 | 
			
		||||
 | 
			
		||||
    int which=whichdongle;
 | 
			
		||||
    while (phdi && which) {
 | 
			
		||||
        phdi=phdi->next;    
 | 
			
		||||
        which--;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (phdi==NULL)
 | 
			
		||||
    {
 | 
			
		||||
        return NULL; // No FCD device found
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pszPath=strdup(phdi->path);
 | 
			
		||||
    if (pszPath==NULL)
 | 
			
		||||
    {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    hid_free_enumeration(phdi);
 | 
			
		||||
    phdi=NULL;
 | 
			
		||||
 | 
			
		||||
    if ((phd=hid_open_path(pszPath)) == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        free(pszPath);
 | 
			
		||||
        pszPath=NULL;
 | 
			
		||||
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    free(pszPath);
 | 
			
		||||
    pszPath=NULL;
 | 
			
		||||
 | 
			
		||||
    return phd;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** \brief Close FCD HID device. */
 | 
			
		||||
static void fcdClose(hid_device *phd)
 | 
			
		||||
{
 | 
			
		||||
    hid_close(phd);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** \brief Get FCD mode.
 | 
			
		||||
 * \return The current FCD mode.
 | 
			
		||||
 * \sa FCD_MODE_ENUM
 | 
			
		||||
 */
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdGetMode(void)
 | 
			
		||||
{
 | 
			
		||||
    hid_device *phd=NULL;
 | 
			
		||||
    unsigned char aucBufIn[65];
 | 
			
		||||
    unsigned char aucBufOut[65];
 | 
			
		||||
    FCD_MODE_ENUM fcd_mode = FCD_MODE_NONE;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    phd = fcdOpen();
 | 
			
		||||
 | 
			
		||||
    if (phd == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        return FCD_MODE_DEAD;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Send a BL Query Command */
 | 
			
		||||
    aucBufOut[0] = 0; // Report ID, ignored
 | 
			
		||||
    aucBufOut[1] = FCD_CMD_BL_QUERY;
 | 
			
		||||
    hid_write(phd, aucBufOut, 65);
 | 
			
		||||
    memset(aucBufIn, 0xCC, 65); // Clear out the response buffer
 | 
			
		||||
    hid_read(phd, aucBufIn, 65);
 | 
			
		||||
 | 
			
		||||
    fcdClose(phd);
 | 
			
		||||
    phd = NULL;
 | 
			
		||||
 | 
			
		||||
    /* first check status bytes then check which mode */
 | 
			
		||||
    if (aucBufIn[0]==FCD_CMD_BL_QUERY && aucBufIn[1]==1) {
 | 
			
		||||
 | 
			
		||||
        /* In bootloader mode we have the string "FCDBL" starting at acBufIn[2] **/
 | 
			
		||||
        if (strncmp((char *)(aucBufIn+2), "FCDBL", 5) == 0) {
 | 
			
		||||
            fcd_mode = FCD_MODE_BL;
 | 
			
		||||
        }
 | 
			
		||||
        /* In application mode we have "FCDAPP_18.06" where the number is the FW version */
 | 
			
		||||
        else if (strncmp((char *)(aucBufIn+2), "FCDAPP", 6) == 0) {
 | 
			
		||||
            fcd_mode = FCD_MODE_APP;
 | 
			
		||||
        }
 | 
			
		||||
        /* either no FCD or firmware less than 18f */
 | 
			
		||||
        else {
 | 
			
		||||
            fcd_mode = FCD_MODE_NONE;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return fcd_mode;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** \brief Get FCD firmware version as string.
 | 
			
		||||
 * \param str The returned vesion number as a 0 terminated string (must be pre-allocated)
 | 
			
		||||
 * \return The current FCD mode.
 | 
			
		||||
 * \sa FCD_MODE_ENUM
 | 
			
		||||
 */
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdGetFwVerStr(char *str)
 | 
			
		||||
{
 | 
			
		||||
    hid_device *phd=NULL;
 | 
			
		||||
    unsigned char aucBufIn[65];
 | 
			
		||||
    unsigned char aucBufOut[65];
 | 
			
		||||
    FCD_MODE_ENUM fcd_mode = FCD_MODE_NONE;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    phd = fcdOpen();
 | 
			
		||||
 | 
			
		||||
    if (phd == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        return FCD_MODE_NONE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Send a BL Query Command */
 | 
			
		||||
    aucBufOut[0] = 0; // Report ID, ignored
 | 
			
		||||
    aucBufOut[1] = FCD_CMD_BL_QUERY;
 | 
			
		||||
    hid_write(phd, aucBufOut, 65);
 | 
			
		||||
    memset(aucBufIn, 0xCC, 65); // Clear out the response buffer
 | 
			
		||||
    hid_read(phd, aucBufIn, 65);
 | 
			
		||||
 | 
			
		||||
    fcdClose(phd);
 | 
			
		||||
    phd = NULL;
 | 
			
		||||
 | 
			
		||||
    /* first check status bytes then check which mode */
 | 
			
		||||
    if (aucBufIn[0]==FCD_CMD_BL_QUERY && aucBufIn[1]==1) {
 | 
			
		||||
 | 
			
		||||
        /* In bootloader mode we have the string "FCDBL" starting at acBufIn[2] **/
 | 
			
		||||
        if (strncmp((char *)(aucBufIn+2), "FCDBL", 5) == 0) {
 | 
			
		||||
            fcd_mode = FCD_MODE_BL;
 | 
			
		||||
        }
 | 
			
		||||
        /* In application mode we have "FCDAPP_18.06" where the number is the FW version */
 | 
			
		||||
        else if (strncmp((char *)(aucBufIn+2), "FCDAPP", 6) == 0) {
 | 
			
		||||
            strncpy(str, (char *)(aucBufIn+9), 5);
 | 
			
		||||
            str[5] = 0;
 | 
			
		||||
            fcd_mode = FCD_MODE_APP;
 | 
			
		||||
        }
 | 
			
		||||
        /* either no FCD or firmware less than 18f */
 | 
			
		||||
        else {
 | 
			
		||||
            fcd_mode = FCD_MODE_NONE;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return fcd_mode;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** \brief Get hardware and firmware dependent FCD capabilities.
 | 
			
		||||
 * \param fcd_caps Pointer to an FCD_CAPS_STRUCT
 | 
			
		||||
 * \return The current FCD mode.
 | 
			
		||||
 *
 | 
			
		||||
 * This function queries the FCD and extracts the hardware and firmware dependent
 | 
			
		||||
 * capabilities. Currently these capabilities are:
 | 
			
		||||
 *  - Bias T (available since S/N TBD)
 | 
			
		||||
 *  - Cellular block (the certified version of the FCD)
 | 
			
		||||
 * When the FCD is in application mode, the string returned by the query command is
 | 
			
		||||
 * (starting at index 2):
 | 
			
		||||
 *    FCDAPP 18.08 Brd 1.0 No blk
 | 
			
		||||
 * 1.0 means no bias tee, 1.1 means there is a bias tee
 | 
			
		||||
 * 'No blk' means it is not cellular blocked.
 | 
			
		||||
 *
 | 
			
		||||
 * Ref: http://uk.groups.yahoo.com/group/FCDevelopment/message/303
 | 
			
		||||
 */
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdGetCaps(FCD_CAPS_STRUCT *fcd_caps)
 | 
			
		||||
{
 | 
			
		||||
    hid_device *phd=NULL;
 | 
			
		||||
    unsigned char aucBufIn[65];
 | 
			
		||||
    unsigned char aucBufOut[65];
 | 
			
		||||
    FCD_MODE_ENUM fcd_mode = FCD_MODE_NONE;
 | 
			
		||||
 | 
			
		||||
    /* clear output buffer */
 | 
			
		||||
    fcd_caps->hasBiasT = 0;
 | 
			
		||||
    fcd_caps->hasCellBlock = 0;
 | 
			
		||||
 | 
			
		||||
    phd = fcdOpen();
 | 
			
		||||
 | 
			
		||||
    if (phd == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        return FCD_MODE_NONE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Send a BL Query Command */
 | 
			
		||||
    aucBufOut[0] = 0; // Report ID, ignored
 | 
			
		||||
    aucBufOut[1] = FCD_CMD_BL_QUERY;
 | 
			
		||||
    hid_write(phd, aucBufOut, 65);
 | 
			
		||||
    memset(aucBufIn, 0xCC, 65); // Clear out the response buffer
 | 
			
		||||
    hid_read(phd, aucBufIn, 65);
 | 
			
		||||
 | 
			
		||||
    fcdClose(phd);
 | 
			
		||||
    phd = NULL;
 | 
			
		||||
 | 
			
		||||
    /* first check status bytes then check which mode */
 | 
			
		||||
    if (aucBufIn[0]==FCD_CMD_BL_QUERY && aucBufIn[1]==1) {
 | 
			
		||||
 | 
			
		||||
        /* In bootloader mode we have the string "FCDBL" starting at acBufIn[2] **/
 | 
			
		||||
        if (strncmp((char *)(aucBufIn+2), "FCDBL", 5) == 0) {
 | 
			
		||||
            fcd_mode = FCD_MODE_BL;
 | 
			
		||||
        }
 | 
			
		||||
        /* In application mode we have "FCDAPP 18.08 Brd 1.0 No blk" (see API doc) */
 | 
			
		||||
        else if (strncmp((char *)(aucBufIn+2), "FCDAPP", 6) == 0) {
 | 
			
		||||
 | 
			
		||||
            /* Bias T */
 | 
			
		||||
            fcd_caps->hasBiasT = (aucBufIn[21] == '1') ? 1 : 0;
 | 
			
		||||
 | 
			
		||||
            /* cellular block */
 | 
			
		||||
            if (strncmp((char *)(aucBufIn+23), "No blk", 6) == 0) {
 | 
			
		||||
                fcd_caps->hasCellBlock = 0;
 | 
			
		||||
            } else {
 | 
			
		||||
                fcd_caps->hasCellBlock = 1;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            fcd_mode = FCD_MODE_APP;
 | 
			
		||||
        }
 | 
			
		||||
        /* either no FCD or firmware less than 18f */
 | 
			
		||||
        else {
 | 
			
		||||
            fcd_mode = FCD_MODE_NONE;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return fcd_mode;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** \brief Get hardware and firmware dependent FCD capabilities as string.
 | 
			
		||||
 * \param caps_str Pointer to a pre-allocated string buffer where the info will be copied.
 | 
			
		||||
 * \return The current FCD mode.
 | 
			
		||||
 *
 | 
			
		||||
 * This function queries the FCD and copies the returned string into the caps_str parameter.
 | 
			
		||||
 * THe return buffer must be at least 28 characters.
 | 
			
		||||
 * When the FCD is in application mode, the string returned by the query command is
 | 
			
		||||
 * (starting at index 2):
 | 
			
		||||
 *    FCDAPP 18.08 Brd 1.0 No blk
 | 
			
		||||
 * 1.0 means no bias tee, 1.1 means there is a bias tee
 | 
			
		||||
 * 'No blk' means it is not cellular blocked.
 | 
			
		||||
 *
 | 
			
		||||
 * Ref: http://uk.groups.yahoo.com/group/FCDevelopment/message/303
 | 
			
		||||
 */
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdGetCapsStr(char *caps_str)
 | 
			
		||||
{
 | 
			
		||||
    hid_device *phd=NULL;
 | 
			
		||||
    unsigned char aucBufIn[65];
 | 
			
		||||
    unsigned char aucBufOut[65];
 | 
			
		||||
    FCD_MODE_ENUM fcd_mode = FCD_MODE_NONE;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    phd = fcdOpen();
 | 
			
		||||
 | 
			
		||||
    if (phd == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        return FCD_MODE_NONE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Send a BL Query Command */
 | 
			
		||||
    aucBufOut[0] = 0; // Report ID, ignored
 | 
			
		||||
    aucBufOut[1] = FCD_CMD_BL_QUERY;
 | 
			
		||||
    hid_write(phd, aucBufOut, 65);
 | 
			
		||||
    memset(aucBufIn, 0xCC, 65); // Clear out the response buffer
 | 
			
		||||
    hid_read(phd, aucBufIn, 65);
 | 
			
		||||
 | 
			
		||||
    fcdClose(phd);
 | 
			
		||||
    phd = NULL;
 | 
			
		||||
 | 
			
		||||
    /* first check status bytes then check which mode */
 | 
			
		||||
    if (aucBufIn[0]==FCD_CMD_BL_QUERY && aucBufIn[1]==1) {
 | 
			
		||||
 | 
			
		||||
        /* In bootloader mode we have the string "FCDBL" starting at acBufIn[2] **/
 | 
			
		||||
        if (strncmp((char *)(aucBufIn+2), "FCDBL", 5) == 0) {
 | 
			
		||||
            fcd_mode = FCD_MODE_BL;
 | 
			
		||||
        }
 | 
			
		||||
        /* In application mode we have "FCDAPP 18.08 Brd 1.0 No blk" (see API doc) */
 | 
			
		||||
        else if (strncmp((char *)(aucBufIn+2), "FCDAPP", 6) == 0) {
 | 
			
		||||
 | 
			
		||||
            strncpy(caps_str, (char *)(aucBufIn+2), 27);
 | 
			
		||||
            caps_str[27] = 0;
 | 
			
		||||
 | 
			
		||||
            fcd_mode = FCD_MODE_APP;
 | 
			
		||||
        }
 | 
			
		||||
        /* either no FCD or firmware less than 18f */
 | 
			
		||||
        else {
 | 
			
		||||
            fcd_mode = FCD_MODE_NONE;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return fcd_mode;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** \brief Reset FCD to bootloader mode.
 | 
			
		||||
 * \return FCD_MODE_NONE
 | 
			
		||||
 *
 | 
			
		||||
 * This function is used to switch the FCD into bootloader mode in which
 | 
			
		||||
 * various firmware operations can be performed.
 | 
			
		||||
 */
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdAppReset(void)
 | 
			
		||||
{
 | 
			
		||||
    hid_device *phd=NULL;
 | 
			
		||||
    //unsigned char aucBufIn[65];
 | 
			
		||||
    unsigned char aucBufOut[65];
 | 
			
		||||
 | 
			
		||||
    phd = fcdOpen();
 | 
			
		||||
 | 
			
		||||
    if (phd == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        return FCD_MODE_NONE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Send an App reset command
 | 
			
		||||
    aucBufOut[0] = 0; // Report ID, ignored
 | 
			
		||||
    aucBufOut[1] = FCD_CMD_APP_RESET;
 | 
			
		||||
    hid_write(phd, aucBufOut, 65);
 | 
			
		||||
 | 
			
		||||
    /** FIXME: hid_read() will occasionally hang due to a pthread_cond_wait() never returning.
 | 
			
		||||
      It seems that the read_callback() in hid-libusb.c will never receive any
 | 
			
		||||
      data during the reconfiguration. Since the same logic works in the native
 | 
			
		||||
      windows application, it could be a libusb thing. Anyhow, since the value
 | 
			
		||||
      returned by this function is not used, we may as well just skip the hid_read()
 | 
			
		||||
      and return FME_NONE.
 | 
			
		||||
      Correct switch from APP to BL mode can be observed in /var/log/messages (linux)
 | 
			
		||||
      (when in bootloader mode the device version includes 'BL')
 | 
			
		||||
      */
 | 
			
		||||
    /*
 | 
			
		||||
       memset(aucBufIn,0xCC,65); // Clear out the response buffer
 | 
			
		||||
       hid_read(phd,aucBufIn,65);
 | 
			
		||||
 | 
			
		||||
       if (aucBufIn[0]==FCDCMDAPPRESET && aucBufIn[1]==1)
 | 
			
		||||
       {
 | 
			
		||||
       FCDClose(phd);
 | 
			
		||||
       phd=NULL;
 | 
			
		||||
       return FME_APP;
 | 
			
		||||
       }
 | 
			
		||||
       FCDClose(phd);
 | 
			
		||||
       phd=NULL;
 | 
			
		||||
       return FME_BL;
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
    fcdClose(phd);
 | 
			
		||||
    phd = NULL;
 | 
			
		||||
 | 
			
		||||
    return FCD_MODE_NONE;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** \brief Set FCD frequency with kHz resolution.
 | 
			
		||||
 * \param nFreq The new frequency in kHz.
 | 
			
		||||
 * \return The FCD mode.
 | 
			
		||||
 *
 | 
			
		||||
 * This function sets the frequency of the FCD with 1 kHz resolution. The parameter
 | 
			
		||||
 * nFreq must already contain any necessary frequency correction.
 | 
			
		||||
 *
 | 
			
		||||
 * \sa fcdAppSetFreq
 | 
			
		||||
 */
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdAppSetFreqkHz(int nFreq)
 | 
			
		||||
{
 | 
			
		||||
    hid_device *phd=NULL;
 | 
			
		||||
    unsigned char aucBufIn[65];
 | 
			
		||||
    unsigned char aucBufOut[65];
 | 
			
		||||
 | 
			
		||||
    phd = fcdOpen();
 | 
			
		||||
 | 
			
		||||
    if (phd == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        return FCD_MODE_NONE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Send an App reset command
 | 
			
		||||
    aucBufOut[0] = 0; // Report ID, ignored
 | 
			
		||||
    aucBufOut[1] = FCD_CMD_APP_SET_FREQ_KHZ;
 | 
			
		||||
    aucBufOut[2] = (unsigned char)nFreq;
 | 
			
		||||
    aucBufOut[3] = (unsigned char)(nFreq>>8);
 | 
			
		||||
    aucBufOut[4] = (unsigned char)(nFreq>>16);
 | 
			
		||||
    hid_write(phd, aucBufOut, 65);
 | 
			
		||||
    memset(aucBufIn, 0xCC, 65); // Clear out the response buffer
 | 
			
		||||
    hid_read(phd, aucBufIn, 65);
 | 
			
		||||
 | 
			
		||||
    if (aucBufIn[0]==FCD_CMD_APP_SET_FREQ_KHZ && aucBufIn[1]==1)
 | 
			
		||||
    {
 | 
			
		||||
        fcdClose(phd);
 | 
			
		||||
        phd = NULL;
 | 
			
		||||
 | 
			
		||||
        return FCD_MODE_APP;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fcdClose(phd);
 | 
			
		||||
    phd = NULL;
 | 
			
		||||
 | 
			
		||||
    return FCD_MODE_BL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** \brief Set FCD frequency with Hz resolution.
 | 
			
		||||
 * \param nFreq The new frequency in Hz.
 | 
			
		||||
 * \return The FCD mode.
 | 
			
		||||
 *
 | 
			
		||||
 * This function sets the frequency of the FCD with 1 Hz resolution. The parameter
 | 
			
		||||
 * nFreq must already contain any necessary frequency correction.
 | 
			
		||||
 *
 | 
			
		||||
 * \sa fcdAppSetFreq
 | 
			
		||||
 */
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdAppSetFreq(int nFreq)
 | 
			
		||||
{
 | 
			
		||||
    hid_device *phd=NULL;
 | 
			
		||||
    unsigned char aucBufIn[65];
 | 
			
		||||
    unsigned char aucBufOut[65];
 | 
			
		||||
 | 
			
		||||
    phd = fcdOpen();
 | 
			
		||||
 | 
			
		||||
    if (phd == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        return FCD_MODE_NONE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Send an App reset command
 | 
			
		||||
    aucBufOut[0] = 0; // Report ID, ignored
 | 
			
		||||
    aucBufOut[1] = FCD_CMD_APP_SET_FREQ_HZ;
 | 
			
		||||
    aucBufOut[2] = (unsigned char)nFreq;
 | 
			
		||||
    aucBufOut[3] = (unsigned char)(nFreq>>8);
 | 
			
		||||
    aucBufOut[4] = (unsigned char)(nFreq>>16);
 | 
			
		||||
    aucBufOut[5] = (unsigned char)(nFreq>>24);
 | 
			
		||||
    hid_write(phd, aucBufOut, 65);
 | 
			
		||||
    memset(aucBufIn, 0xCC, 65); // Clear out the response buffer
 | 
			
		||||
    hid_read(phd, aucBufIn, 65);
 | 
			
		||||
 | 
			
		||||
    if (aucBufIn[0]==FCD_CMD_APP_SET_FREQ_HZ && aucBufIn[1]==1)
 | 
			
		||||
    {
 | 
			
		||||
        fcdClose(phd);
 | 
			
		||||
        phd = NULL;
 | 
			
		||||
 | 
			
		||||
        return FCD_MODE_APP;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fcdClose(phd);
 | 
			
		||||
    phd = NULL;
 | 
			
		||||
 | 
			
		||||
    return FCD_MODE_BL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** \brief Reset FCD to application mode.
 | 
			
		||||
 * \return FCD_MODE_NONE
 | 
			
		||||
 *
 | 
			
		||||
 * This function is used to switch the FCD from bootloader mode
 | 
			
		||||
 * into application mode.
 | 
			
		||||
 */
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdBlReset(void)
 | 
			
		||||
{
 | 
			
		||||
    hid_device *phd=NULL;
 | 
			
		||||
    //    unsigned char aucBufIn[65];
 | 
			
		||||
    unsigned char aucBufOut[65];
 | 
			
		||||
 | 
			
		||||
    phd = fcdOpen();
 | 
			
		||||
 | 
			
		||||
    if (phd == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        return FCD_MODE_NONE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Send an BL reset command
 | 
			
		||||
    aucBufOut[0] = 0; // Report ID, ignored
 | 
			
		||||
    aucBufOut[1] = FCD_CMD_BL_RESET;
 | 
			
		||||
    hid_write(phd, aucBufOut, 65);
 | 
			
		||||
 | 
			
		||||
    /** FIXME: hid_read() will hang due to a pthread_cond_wait() never returning.
 | 
			
		||||
      It seems that the read_callback() in hid-libusb.c will never receive any
 | 
			
		||||
      data during the reconfiguration. Since the same logic works in the native
 | 
			
		||||
      windows application, it could be a libusb thing. Anyhow, since the value
 | 
			
		||||
      returned by this function is not used, we may as well jsut skip the hid_read()
 | 
			
		||||
      and return FME_NONE.
 | 
			
		||||
      Correct switch from BL to APP mode can be observed in /var/log/messages (linux)
 | 
			
		||||
      (when in bootloader mode the device version includes 'BL')
 | 
			
		||||
      */
 | 
			
		||||
    /*
 | 
			
		||||
       memset(aucBufIn,0xCC,65); // Clear out the response buffer
 | 
			
		||||
       hid_read(phd,aucBufIn,65);
 | 
			
		||||
 | 
			
		||||
       if (aucBufIn[0]==FCDCMDBLRESET && aucBufIn[1]==1)
 | 
			
		||||
       {
 | 
			
		||||
       FCDClose(phd);
 | 
			
		||||
       phd=NULL;
 | 
			
		||||
       return FME_BL;
 | 
			
		||||
       }
 | 
			
		||||
       FCDClose(phd);
 | 
			
		||||
       phd=NULL;
 | 
			
		||||
       return FME_APP;
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
    fcdClose(phd);
 | 
			
		||||
    phd = NULL;
 | 
			
		||||
 | 
			
		||||
    return FCD_MODE_NONE;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** \brief Erase firmware from FCD.
 | 
			
		||||
 * \return The FCD mode
 | 
			
		||||
 *
 | 
			
		||||
 * This function deletes the firmware from the FCD. This is required
 | 
			
		||||
 * before writing new firmware into the FCD.
 | 
			
		||||
 *
 | 
			
		||||
 * \sa fcdBlWriteFirmware
 | 
			
		||||
 */
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdBlErase(void)
 | 
			
		||||
{
 | 
			
		||||
    hid_device *phd=NULL;
 | 
			
		||||
    unsigned char aucBufIn[65];
 | 
			
		||||
    unsigned char aucBufOut[65];
 | 
			
		||||
 | 
			
		||||
    phd = fcdOpen();
 | 
			
		||||
 | 
			
		||||
    if (phd == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        return FCD_MODE_NONE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Send an App reset command
 | 
			
		||||
    aucBufOut[0] = 0; // Report ID, ignored
 | 
			
		||||
    aucBufOut[1] = FCD_CMD_BL_ERASE;
 | 
			
		||||
    hid_write(phd, aucBufOut, 65);
 | 
			
		||||
    memset(aucBufIn, 0xCC, 65); // Clear out the response buffer
 | 
			
		||||
    hid_read(phd, aucBufIn, 65);
 | 
			
		||||
 | 
			
		||||
    if (aucBufIn[0]==FCD_CMD_BL_ERASE && aucBufIn[1]==1)
 | 
			
		||||
    {
 | 
			
		||||
        fcdClose(phd);
 | 
			
		||||
        phd = NULL;
 | 
			
		||||
 | 
			
		||||
        return FCD_MODE_BL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fcdClose(phd);
 | 
			
		||||
    phd = NULL;
 | 
			
		||||
 | 
			
		||||
    return FCD_MODE_APP;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** \brief Write new firmware into the FCD.
 | 
			
		||||
 * \param pc Pointer to the new firmware data
 | 
			
		||||
 * \param n64size The number of bytes in the data
 | 
			
		||||
 * \return The FCD mode
 | 
			
		||||
 *
 | 
			
		||||
 * This function is used to upload new firmware into the FCD flash.
 | 
			
		||||
 *
 | 
			
		||||
 * \sa fcdBlErase
 | 
			
		||||
 */
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdBlWriteFirmware(char *pc, int64_t n64Size)
 | 
			
		||||
{
 | 
			
		||||
    hid_device *phd=NULL;
 | 
			
		||||
    unsigned char aucBufIn[65];
 | 
			
		||||
    unsigned char aucBufOut[65];
 | 
			
		||||
    uint32_t u32AddrStart;
 | 
			
		||||
    uint32_t u32AddrEnd;
 | 
			
		||||
    uint32_t u32Addr;
 | 
			
		||||
    BOOL bFinished=FALSE;
 | 
			
		||||
 | 
			
		||||
    phd = fcdOpen();
 | 
			
		||||
 | 
			
		||||
    if (phd==NULL)
 | 
			
		||||
    {
 | 
			
		||||
        return FCD_MODE_NONE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Get the valid flash address range
 | 
			
		||||
    aucBufOut[0] = 0; // Report ID, ignored
 | 
			
		||||
    aucBufOut[1] = FCD_CMD_BL_GET_BYTE_ADDR_RANGE;
 | 
			
		||||
    hid_write(phd, aucBufOut, 65);
 | 
			
		||||
    memset(aucBufIn, 0xCC, 65); // Clear out the response buffer
 | 
			
		||||
    hid_read(phd, aucBufIn, 65);
 | 
			
		||||
 | 
			
		||||
    if (aucBufIn[0]!=FCD_CMD_BL_GET_BYTE_ADDR_RANGE || aucBufIn[1]!=1)
 | 
			
		||||
    {
 | 
			
		||||
        fcdClose(phd);
 | 
			
		||||
        phd = NULL;
 | 
			
		||||
 | 
			
		||||
        return FCD_MODE_APP;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    u32AddrStart=
 | 
			
		||||
        aucBufIn[2]+
 | 
			
		||||
        (((uint32_t)aucBufIn[3])<<8)+
 | 
			
		||||
        (((uint32_t)aucBufIn[4])<<16)+
 | 
			
		||||
        (((uint32_t)aucBufIn[5])<<24);
 | 
			
		||||
    u32AddrEnd=
 | 
			
		||||
        aucBufIn[6]+
 | 
			
		||||
        (((uint32_t)aucBufIn[7])<<8)+
 | 
			
		||||
        (((uint32_t)aucBufIn[8])<<16)+
 | 
			
		||||
        (((uint32_t)aucBufIn[9])<<24);
 | 
			
		||||
 | 
			
		||||
    // Set start address for flash
 | 
			
		||||
    aucBufOut[0] = 0; // Report ID, ignored
 | 
			
		||||
    aucBufOut[1] = FCD_CMD_BL_SET_BYTE_ADDR;
 | 
			
		||||
    aucBufOut[2] = ((unsigned char)u32AddrStart);
 | 
			
		||||
    aucBufOut[3] = ((unsigned char)(u32AddrStart>>8));
 | 
			
		||||
    aucBufOut[4] = ((unsigned char)(u32AddrStart>>16));
 | 
			
		||||
    aucBufOut[5] = ((unsigned char)(u32AddrStart>>24));
 | 
			
		||||
    hid_write(phd, aucBufOut, 65);
 | 
			
		||||
    memset(aucBufIn, 0xCC, 65); // Clear out the response buffer
 | 
			
		||||
    hid_read(phd, aucBufIn, 65);
 | 
			
		||||
 | 
			
		||||
    if (aucBufIn[0]!=FCD_CMD_BL_SET_BYTE_ADDR || aucBufIn[1]!=1)
 | 
			
		||||
    {
 | 
			
		||||
        fcdClose(phd);
 | 
			
		||||
        phd = NULL;
 | 
			
		||||
 | 
			
		||||
        return FCD_MODE_APP;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Write blocks
 | 
			
		||||
    aucBufOut[0] = 0; // Report ID, ignored
 | 
			
		||||
    aucBufOut[1] = FCD_CMD_BL_WRITE_FLASH_BLOCK;
 | 
			
		||||
    for (u32Addr=u32AddrStart; u32Addr+47<u32AddrEnd && u32Addr+47<n64Size && !bFinished; u32Addr+=48)
 | 
			
		||||
    {
 | 
			
		||||
        memcpy(&aucBufOut[3], &pc[u32Addr], 48);
 | 
			
		||||
 | 
			
		||||
        hid_write(phd, aucBufOut, 65);
 | 
			
		||||
        memset(aucBufIn, 0xCC, 65); // Clear out the response buffer
 | 
			
		||||
        hid_read(phd, aucBufIn, 65);
 | 
			
		||||
 | 
			
		||||
        if (aucBufIn[0]!=FCD_CMD_BL_WRITE_FLASH_BLOCK || aucBufIn[1]!=1)
 | 
			
		||||
        {
 | 
			
		||||
            bFinished = TRUE;
 | 
			
		||||
            fcdClose(phd);
 | 
			
		||||
            phd = NULL;
 | 
			
		||||
 | 
			
		||||
            return FCD_MODE_APP;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fcdClose(phd);
 | 
			
		||||
    phd = NULL;
 | 
			
		||||
 | 
			
		||||
    return FCD_MODE_BL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** \brief Verify firmware in FCd flash.
 | 
			
		||||
 * \param pc Pointer to firmware data to verify against.
 | 
			
		||||
 * \param n64Size Size of the data in pc.
 | 
			
		||||
 * \return The FCD_MODE_BL if verification was succesful.
 | 
			
		||||
 *
 | 
			
		||||
 * This function verifies the firmware currently in the FCd flash against the firmware
 | 
			
		||||
 * image pointed to by pc. The function return FCD_MODE_BL if the verification is OK and
 | 
			
		||||
 * FCD_MODE_APP otherwise.
 | 
			
		||||
 */
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdBlVerifyFirmware(char *pc, int64_t n64Size)
 | 
			
		||||
{
 | 
			
		||||
    hid_device *phd=NULL;
 | 
			
		||||
    unsigned char aucBufIn[65];
 | 
			
		||||
    unsigned char aucBufOut[65];
 | 
			
		||||
    uint32_t u32AddrStart;
 | 
			
		||||
    uint32_t u32AddrEnd;
 | 
			
		||||
    uint32_t u32Addr;
 | 
			
		||||
    BOOL bFinished=FALSE;
 | 
			
		||||
 | 
			
		||||
    phd = fcdOpen();
 | 
			
		||||
 | 
			
		||||
    if (phd==NULL)
 | 
			
		||||
    {
 | 
			
		||||
        return FCD_MODE_NONE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Get the valid flash address range
 | 
			
		||||
    aucBufOut[0] = 0; // Report ID, ignored
 | 
			
		||||
    aucBufOut[1] = FCD_CMD_BL_GET_BYTE_ADDR_RANGE;
 | 
			
		||||
    hid_write(phd, aucBufOut, 65);
 | 
			
		||||
    memset(aucBufIn, 0xCC, 65); // Clear out the response buffer
 | 
			
		||||
    hid_read(phd, aucBufIn, 65);
 | 
			
		||||
 | 
			
		||||
    if (aucBufIn[0]!=FCD_CMD_BL_GET_BYTE_ADDR_RANGE || aucBufIn[1]!=1)
 | 
			
		||||
    {
 | 
			
		||||
        fcdClose(phd);
 | 
			
		||||
        phd = NULL;
 | 
			
		||||
 | 
			
		||||
        return FCD_MODE_APP;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    u32AddrStart=
 | 
			
		||||
        aucBufIn[2]+
 | 
			
		||||
        (((uint32_t)aucBufIn[3])<<8)+
 | 
			
		||||
        (((uint32_t)aucBufIn[4])<<16)+
 | 
			
		||||
        (((uint32_t)aucBufIn[5])<<24);
 | 
			
		||||
 | 
			
		||||
    u32AddrEnd=
 | 
			
		||||
        aucBufIn[6]+
 | 
			
		||||
        (((uint32_t)aucBufIn[7])<<8)+
 | 
			
		||||
        (((uint32_t)aucBufIn[8])<<16)+
 | 
			
		||||
        (((uint32_t)aucBufIn[9])<<24);
 | 
			
		||||
 | 
			
		||||
    // Set start address for flash
 | 
			
		||||
    aucBufOut[0] = 0; // Report ID, ignored
 | 
			
		||||
    aucBufOut[1] = FCD_CMD_BL_SET_BYTE_ADDR;
 | 
			
		||||
    aucBufOut[2] = ((unsigned char)u32AddrStart);
 | 
			
		||||
    aucBufOut[3] = ((unsigned char)(u32AddrStart>>8));
 | 
			
		||||
    aucBufOut[4] = ((unsigned char)(u32AddrStart>>16));
 | 
			
		||||
    aucBufOut[5] = ((unsigned char)(u32AddrStart>>24));
 | 
			
		||||
    hid_write(phd, aucBufOut, 65);
 | 
			
		||||
    memset(aucBufIn, 0xCC, 65); // Clear out the response buffer
 | 
			
		||||
    hid_read(phd, aucBufIn, 65);
 | 
			
		||||
 | 
			
		||||
    if (aucBufIn[0]!=FCD_CMD_BL_SET_BYTE_ADDR || aucBufIn[1]!=1)
 | 
			
		||||
    {
 | 
			
		||||
        fcdClose(phd);
 | 
			
		||||
        phd = NULL;
 | 
			
		||||
 | 
			
		||||
        return FCD_MODE_APP;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Read blocks
 | 
			
		||||
    aucBufOut[0] = 0; // Report ID, ignored
 | 
			
		||||
    aucBufOut[1] = FCD_CMD_BL_READ_FLASH_BLOCK;
 | 
			
		||||
    for (u32Addr=u32AddrStart; u32Addr+47<u32AddrEnd && u32Addr+47<n64Size && !bFinished; u32Addr+=48)
 | 
			
		||||
    {
 | 
			
		||||
        hid_write(phd, aucBufOut, 65);
 | 
			
		||||
        memset(aucBufIn, 0xCC, 65); // Clear out the response buffer
 | 
			
		||||
        hid_read(phd, aucBufIn, 65);
 | 
			
		||||
 | 
			
		||||
        if (aucBufIn[0]!=FCD_CMD_BL_READ_FLASH_BLOCK || aucBufIn[1]!=1)
 | 
			
		||||
        {
 | 
			
		||||
            bFinished = TRUE;
 | 
			
		||||
            fcdClose(phd);
 | 
			
		||||
            phd = NULL;
 | 
			
		||||
 | 
			
		||||
            return FCD_MODE_APP;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (memcmp(&aucBufIn[2],&pc[u32Addr],48)!=0)
 | 
			
		||||
        {
 | 
			
		||||
            bFinished = TRUE;
 | 
			
		||||
            fcdClose(phd);
 | 
			
		||||
            phd = NULL;
 | 
			
		||||
 | 
			
		||||
            return FCD_MODE_APP;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fcdClose(phd);
 | 
			
		||||
    phd = NULL;
 | 
			
		||||
 | 
			
		||||
    return FCD_MODE_BL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** \brief Write FCD parameter (e.g. gain or filter)
 | 
			
		||||
 * \param u8Cmd The command byte / parameter ID, see FCD_CMD_APP_SET_*
 | 
			
		||||
 * \param pu8Data The parameter value to be written
 | 
			
		||||
 * \param u8len Length of pu8Data in bytes
 | 
			
		||||
 * \return One of FCD_MODE_NONE, FCD_MODE_APP or FCD_MODE_BL (see description)
 | 
			
		||||
 *
 | 
			
		||||
 * This function can be used to set the value of a parameter in the FCD for which there is no
 | 
			
		||||
 * high level API call. It gives access to the low level API of the FCD and the caller is expected
 | 
			
		||||
 * to be aware of the various FCD commands, since they are required to be supplied as parameter
 | 
			
		||||
 * to this function.
 | 
			
		||||
 *
 | 
			
		||||
 * The return value can be used to determine the success or failure of the command execution:
 | 
			
		||||
 * - FCD_MODE_APP : Reply from FCD was as expected (nominal case).
 | 
			
		||||
 * - FCD_MODE_BL : Reply from FCD was not as expected.
 | 
			
		||||
 * - FCD_MODE_NONE : No FCD was found
 | 
			
		||||
 */
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdAppSetParam(uint8_t u8Cmd, uint8_t *pu8Data, uint8_t u8len)
 | 
			
		||||
{
 | 
			
		||||
    hid_device *phd=NULL;
 | 
			
		||||
    unsigned char aucBufOut[65];
 | 
			
		||||
    unsigned char aucBufIn[65];
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    phd = fcdOpen();
 | 
			
		||||
 | 
			
		||||
    if (phd == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        return FCD_MODE_NONE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    aucBufOut[0]=0; // Report ID, ignored
 | 
			
		||||
    aucBufOut[1]=u8Cmd;
 | 
			
		||||
    memcpy(aucBufOut+2, pu8Data,u8len);
 | 
			
		||||
    hid_write(phd,aucBufOut,65);
 | 
			
		||||
 | 
			
		||||
    /* we must read after each write in order to empty FCD/HID buffer */
 | 
			
		||||
    memset(aucBufIn,0xCC,65); // Clear out the response buffer
 | 
			
		||||
    hid_read(phd,aucBufIn,65);
 | 
			
		||||
 | 
			
		||||
    /* Check the response, if OK return FCD_MODE_APP */
 | 
			
		||||
    if (aucBufIn[0]==u8Cmd && aucBufIn[1]==1) {
 | 
			
		||||
        fcdClose(phd);
 | 
			
		||||
        phd = NULL;
 | 
			
		||||
 | 
			
		||||
        return FCD_MODE_APP;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Response did not contain the expected bytes */
 | 
			
		||||
    fcdClose(phd);
 | 
			
		||||
    phd = NULL;
 | 
			
		||||
 | 
			
		||||
    return FCD_MODE_BL;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** \brief Read FCD parameter (e.g. gain or filter)
 | 
			
		||||
 * \param u8Cmd The command byte / parameter ID, see FCD_CMD_APP_GET_*
 | 
			
		||||
 * \param pu8Data TPointer to buffer where the parameter value(s) will be written
 | 
			
		||||
 * \param u8len Length of pu8Data in bytes
 | 
			
		||||
 * \return One of FCD_MODE_NONE, FCD_MODE_APP or FCD_MODE_BL (see description)
 | 
			
		||||
 *
 | 
			
		||||
 * This function can be used to read the value of a parameter in the FCD for which there is no
 | 
			
		||||
 * high level API call. It gives access to the low level API of the FCD and the caller is expected
 | 
			
		||||
 * to be aware of the various FCD commands, since they are required to be supplied as parameter
 | 
			
		||||
 * to this function.
 | 
			
		||||
 *
 | 
			
		||||
 * The return value can be used to determine the success or failure of the command execution:
 | 
			
		||||
 * - FCD_MODE_APP : Reply from FCD was as expected (nominal case).
 | 
			
		||||
 * - FCD_MODE_BL : Reply from FCD was not as expected.
 | 
			
		||||
 * - FCD_MODE_NONE : No FCD was found
 | 
			
		||||
 */
 | 
			
		||||
EXTERN FCD_API_EXPORT FCD_API_CALL FCD_MODE_ENUM fcdAppGetParam(uint8_t u8Cmd, uint8_t *pu8Data, uint8_t u8len)
 | 
			
		||||
{
 | 
			
		||||
    hid_device *phd=NULL;
 | 
			
		||||
    unsigned char aucBufOut[65];
 | 
			
		||||
    unsigned char aucBufIn[65];
 | 
			
		||||
 | 
			
		||||
    phd = fcdOpen();
 | 
			
		||||
    if (phd == NULL)
 | 
			
		||||
    {
 | 
			
		||||
        return FCD_MODE_NONE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    aucBufOut[0]=0; // Report ID, ignored
 | 
			
		||||
    aucBufOut[1]=u8Cmd;
 | 
			
		||||
    hid_write(phd,aucBufOut,65);
 | 
			
		||||
 | 
			
		||||
    memset(aucBufIn,0xCC,65); // Clear out the response buffer
 | 
			
		||||
    hid_read(phd,aucBufIn,65);
 | 
			
		||||
    /* Copy return data to output buffer (even if cmd exec failed) */
 | 
			
		||||
    memcpy(pu8Data,aucBufIn+2,u8len);
 | 
			
		||||
 | 
			
		||||
    /* Check status bytes in returned data */
 | 
			
		||||
    if (aucBufIn[0]==u8Cmd && aucBufIn[1]==1) {
 | 
			
		||||
        fcdClose(phd);
 | 
			
		||||
        phd = NULL;
 | 
			
		||||
 | 
			
		||||
        return FCD_MODE_APP;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Response did not contain the expected bytes */
 | 
			
		||||
    fcdClose(phd);
 | 
			
		||||
    phd = NULL;
 | 
			
		||||
 | 
			
		||||
    return FCD_MODE_BL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -8,7 +8,7 @@ set(v4l_SOURCES
 | 
			
		||||
	v4lsource.cpp
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
set(rtlsdr_HEADERS
 | 
			
		||||
set(v4l_HEADERS
 | 
			
		||||
	v4lgui.h
 | 
			
		||||
	v4linput.h
 | 
			
		||||
	v4lplugin.h
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user