diff options
Diffstat (limited to 'gr-fcd/lib/fcd')
-rw-r--r-- | gr-fcd/lib/fcd/CMakeLists.txt | 32 | ||||
-rw-r--r-- | gr-fcd/lib/fcd/COPYRIGHT | 23 | ||||
-rw-r--r-- | gr-fcd/lib/fcd/fcd.c | 904 | ||||
-rw-r--r-- | gr-fcd/lib/fcd/fcd.h | 79 | ||||
-rw-r--r-- | gr-fcd/lib/fcd/fcdhidcmd.h | 305 |
5 files changed, 0 insertions, 1343 deletions
diff --git a/gr-fcd/lib/fcd/CMakeLists.txt b/gr-fcd/lib/fcd/CMakeLists.txt deleted file mode 100644 index 416a7507e..000000000 --- a/gr-fcd/lib/fcd/CMakeLists.txt +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright 2012 Free Software Foundation, Inc. -# -# This file is part of GNU Radio -# -# GNU Radio 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, or (at your option) -# any later version. -# -# GNU Radio 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 GNU Radio; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, -# Boston, MA 02110-1301, USA. - -######################################################################## -# This file included, use CMake directory variables -######################################################################## - -include_directories(APPEND ${USB_INCLUDES}) - -set(fcd_sources ${CMAKE_CURRENT_SOURCE_DIR}/fcd.c) - - -######################################################################## -# Append gnuradio-fcd library sources -######################################################################## -list(APPEND gr_fcd_sources ${fcd_sources}) diff --git a/gr-fcd/lib/fcd/COPYRIGHT b/gr-fcd/lib/fcd/COPYRIGHT deleted file mode 100644 index f176590e9..000000000 --- a/gr-fcd/lib/fcd/COPYRIGHT +++ /dev/null @@ -1,23 +0,0 @@ -For convenience, GNU Radio includes the contents of this directory -in its distribution, but they are not considered part of GNU Radio. - -These files are licensed and redistributed using the terms of the -GPLv3. -------------------------------------------------------------------- -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/>. - diff --git a/gr-fcd/lib/fcd/fcd.c b/gr-fcd/lib/fcd/fcd.c deleted file mode 100644 index 011d77be9..000000000 --- a/gr-fcd/lib/fcd/fcd.c +++ /dev/null @@ -1,904 +0,0 @@ -/*************************************************************************** - * 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> -#ifdef WIN32 - #include <malloc.h> -#else - #include <stdlib.h> -#endif -#include "hidapi.h" -#include "fcd.h" -#include "fcdhidcmd.h" -#include <stdio.h> - - -#define FALSE 0 -#define TRUE 1 -typedef int BOOL; - - -const unsigned short _usVID=0x04D8; /*!< USB vendor ID. */ -const unsigned short _usPID=0xFB56; /*!< USB product ID. */ - - - -/** \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); - 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_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_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) { - 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_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_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_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_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_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_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_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_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_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_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_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_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; -} - diff --git a/gr-fcd/lib/fcd/fcd.h b/gr-fcd/lib/fcd/fcd.h deleted file mode 100644 index 7cfe9b7ed..000000000 --- a/gr-fcd/lib/fcd/fcd.h +++ /dev/null @@ -1,79 +0,0 @@ -/*************************************************************************** - * 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 - -#include <fcd_api.h> - -#ifdef FCD -#define EXTERN -#define ASSIGN (x) =x -#else -#define EXTERN extern -#define ASSIGN(x) -#endif - -#include <inttypes.h> - -/** \brief FCD mode enumeration. */ -typedef enum { - FCD_MODE_NONE, /*!< No FCD detected. */ - 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 FCD_MODE_ENUM fcdGetMode(void); -EXTERN FCD_API FCD_MODE_ENUM fcdGetFwVerStr(char *str); -EXTERN FCD_API FCD_MODE_ENUM fcdGetCaps(FCD_CAPS_STRUCT *fcd_caps); -EXTERN FCD_API FCD_MODE_ENUM fcdGetCapsStr(char *caps_str); -EXTERN FCD_API FCD_MODE_ENUM fcdAppReset(void); -EXTERN FCD_API FCD_MODE_ENUM fcdAppSetFreqkHz(int nFreq); -EXTERN FCD_API FCD_MODE_ENUM fcdAppSetFreq(int nFreq); - -EXTERN FCD_API FCD_MODE_ENUM fcdAppSetParam(uint8_t u8Cmd, uint8_t *pu8Data, uint8_t u8len); -EXTERN FCD_API FCD_MODE_ENUM fcdAppGetParam(uint8_t u8Cmd, uint8_t *pu8Data, uint8_t u8len); - - -/* Bootloader functions */ -EXTERN FCD_API FCD_MODE_ENUM fcdBlReset(void); -EXTERN FCD_API FCD_MODE_ENUM fcdBlErase(void); -EXTERN FCD_API FCD_MODE_ENUM fcdBlWriteFirmware(char *pc, int64_t n64Size); -EXTERN FCD_API FCD_MODE_ENUM fcdBlVerifyFirmware(char *pc, int64_t n64Size); - - -#ifdef __cplusplus -} -#endif - -#endif // FCD_H diff --git a/gr-fcd/lib/fcd/fcdhidcmd.h b/gr-fcd/lib/fcd/fcdhidcmd.h deleted file mode 100644 index 1741ede30..000000000 --- a/gr-fcd/lib/fcd/fcdhidcmd.h +++ /dev/null @@ -1,305 +0,0 @@ -/*************************************************************************** - * 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 |