diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/Device/Device.h | 254 | ||||
-rw-r--r-- | include/Fpga/Fpga.h | 74 | ||||
-rw-r--r-- | include/General.h | 87 | ||||
-rw-r--r-- | include/Utility/Utility.h | 43 |
4 files changed, 290 insertions, 168 deletions
diff --git a/include/Device/Device.h b/include/Device/Device.h index 198cc67..5f2bf12 100644 --- a/include/Device/Device.h +++ b/include/Device/Device.h @@ -1,113 +1,163 @@ #ifndef DEVICE_H_ #define DEVICE_H_ +#include "Fpga.h" #include "General.h" #include "Utility.h" #include "Version.h" +#include <math.h> /* ceil */ + +class Mtac15Fpga; class Device { - private: - bool verbose ; - bool isRoot; - rapidjson::Document capabilities; - rapidjson::Document ethSwitch; - rapidjson::Document deviceInfo; - static const std::vector<std::string> apIdentifiers; - rapidjson::Document accessoryCards; - rapidjson::Value accessoryCard; - rapidjson::Document::AllocatorType& alloc = deviceInfo.GetAllocator(); - rapidjson::Document::AllocatorType& accessoryCardsAlloc = accessoryCards.GetAllocator(); - static std::map<std::string, bool> capabilityList; - static std::map<std::string, std::string> ethSwitchList; - static std::map<std::string, std::string> deviceInfoList; - - static const std::regex apFilters; - static const std::regex lora15Filters; - static const std::regex loraG16Filters; - static const std::regex loraG64Filters; - static const std::regex gpiobFilters; - static const std::regex mfserFilters; - static const std::regex serialModeFilter; - static const std::regex storeFilters; - static const std::regex showFilters; - - class AccessoryCard { - protected: - Device& device; - const std::string productId; - const std::string port; - public: - AccessoryCard(Device& d, const std::string ProductId, const std::string Port); - }; - - class LoraCard : public AccessoryCard { - protected: - std::string spiPath; - uint8_t fpgaVersion = 255; - public: - LoraCard(Device& d, const std::string ProductId, const std::string Port); - void setCapabilities(); - }; - - class Lora15Card : public LoraCard { - private: - void *spi_target_ptr = NULL; - public: - Lora15Card(Device& d, const std::string ProductId, const std::string Port); - int spiOpen(const char *spidev); - int spiRead(uint8_t address, uint8_t *data); - int spiClose(); - }; - - class Lora21Card : public LoraCard { - private: - std::string cmdFpgaVersion; - public: - Lora21Card(Device& d, const std::string ProductId, const std::string Port); - }; - - class Lora21ExtCard : public Lora21Card { - private: - std::string cmdFpgaVersion2; - public: - Lora21ExtCard(Device& d, const std::string ProductId, const std::string Port); - }; - - class Gpiob : public AccessoryCard { - public: - Gpiob(Device& d, const std::string ProductId, const std::string Port); - }; - - class Mfser : public AccessoryCard { - public: - Mfser(Device& d, const std::string ProductId, const std::string Port); - }; - - public: - Device(); - void getSystemTreeJson(const char * dir_name); - void init(); - bool isAccessoryCard(const char * d_name, const char * dir_name); - bool isValidDirectory(const struct dirent * entry, std::string fullPath, const char * d_name); - void load(); - void logInfo(std::string info); - void logError(std::string info); - void json(); - void mapFileToCapability(); - void mapFirmware(); - void mapMacAddress2(); - void printDir(const std::string dir_name, std::vector<std::string> &results); - void printJson(); - void printVersion (std::string name); - void printUsage(std::string program); - void show(std::string program); - void showTrigger(std::string name); - void sortAccessoryCards(); - void store(std::string name, std::string value); - void storeTrigger(std::string name, std::string value); - void Verbose(bool val); - bool Verbose(); - void writeJson(); + private: + bool isRoot; + rapidjson::Document capabilities; + rapidjson::Document ethSwitch; + rapidjson::Document deviceInfo; + static const std::vector<std::string> apIdentifiers; + rapidjson::Document accessoryCards; + rapidjson::Value accessoryCard; + rapidjson::Document::AllocatorType &alloc = deviceInfo.GetAllocator(); + rapidjson::Document::AllocatorType &acAlloc = accessoryCards.GetAllocator(); + static std::map<std::string, bool> capabilityList; + static std::map<std::string, std::string> ethSwitchList; + static std::map<std::string, std::string> deviceInfoList; + + static const std::regex apFilters; + static const std::regex serialModeFilter; + static const std::regex storeFilters; + static const std::regex showFilters; + static const std::regex mtcdt3Filters; + static const std::regex mtrFilters; + + const unsigned int accessoryCardsListSize = 7; + + class AccessoryCard { + protected: + Device &device; + std::regex name; + + public: + AccessoryCard(Device &d, const std::regex Name); + virtual void AddToDeviceInfo(const std::string Port, + const std::string ProductID); + const std::regex GetName(); + }; + + class LoraCard : public AccessoryCard { + protected: + std::string spiPath; + uint8_t fpgaVersion; + + public: + LoraCard(Device &d, const std::regex Name); + void AddToDeviceInfo(const std::string Port, + const std::string ProductID); + }; + + class Lora03Card : public LoraCard { + private: + std::string spiPath1261; + uint8_t tmp102; + + public: + Lora03Card(Device &d); + void AddToDeviceInfo(const std::string Port, + const std::string ProductID); + }; + + class Lora10Card : public LoraCard { + public: + Lora10Card(Device &d); + void AddToDeviceInfo(const std::string Port, + const std::string ProductID); + }; + + class Lora15Card : public LoraCard { + private: + Lora15Card(); + void *spi_target_ptr = NULL; + const char pin_high = '1'; + const char pin_low = '0'; + + public: + Lora15Card(Device &d); + void AddToDeviceInfo(const std::string Port, + const std::string ProductID); + }; + + class Lora21Card : public LoraCard { + private: + std::string cmdFpgaVersion; + + public: + Lora21Card(Device &d); + Lora21Card(Device &d, const std::regex Name); + void AddToDeviceInfo(const std::string Port, + const std::string ProductID); + }; + + class Lora21ExtCard : public Lora21Card { + private: + std::string cmdFpgaVersion2; + + public: + Lora21ExtCard(Device &d); + void AddToDeviceInfo(const std::string Port, + const std::string ProductID); + }; + + class Lora2G4Card : public LoraCard { + public: + Lora2G4Card(Device &d); + void AddToDeviceInfo(const std::string Port, + const std::string ProductID); + }; + + class Gpiob : public AccessoryCard { + public: + Gpiob(Device &d); + void AddToDeviceInfo(const std::string Port, + const std::string ProductID); + }; + + class Mfser : public AccessoryCard { + public: + Mfser(Device &d); + void AddToDeviceInfo(const std::string Port, + const std::string ProductID); + }; + + std::vector<std::unique_ptr<AccessoryCard>> accessoryCardsList; + + public: + Device(); + void getSystemTreeJson(const char *dir_name); + void init(); + bool isAccessoryCard(const char *d_name, const char *dir_name); + bool isValidDirectory(const struct dirent *entry, std::string fullPath, + const char *d_name); + void load(); + void logInfo(std::string info); + void logError(std::string info); + void json(); + void mapFileToCapability(); + void mapFirmware(); + void mapMacAddress2(); + void printDir(const std::string dir_name, + std::vector<std::string> &results); + void printJson(); + void printVersion(std::string name); + void printUsage(std::string program); + void show(std::string program); + void showTrigger(std::string name); + void sortAccessoryCards(); + void store(std::string name, std::string value); + void storeTrigger(std::string name, std::string value); + void Verbose(bool val); + bool Verbose(); + void writeJson(); }; #endif /* DEVICE_H_ */ diff --git a/include/Fpga/Fpga.h b/include/Fpga/Fpga.h new file mode 100644 index 0000000..986a269 --- /dev/null +++ b/include/Fpga/Fpga.h @@ -0,0 +1,74 @@ +#ifndef FPGA_H_ +#define FPGA_H_ + +#include "General.h" +#include "Utility.h" +#include "Version.h" +#include <math.h> /* ceil */ +#include <openssl/sha.h> /* generate hash */ + +#define MTAC_SX1301 0x0 +#define MTAC_FPGA 0x1 + +#define MTAC_FPGA_ADDRESS 0x1 +#define READ_ACCESS 0x00 +#define WRITE_ACCESS 0x80 +#define SPI_SPEED 8000000 + +#define MTAC_PAGE_REG 0 +#define MTAC_SOFT_RESET 1 +#define MTAC_VERSION 2 + +#define MTCDT_DEFAULT_FILE "/usr/lib/mts-flash-binaries/mtcdt-fpga-v31.hex" +#define MTCAP_DEFAULT_FILE "/usr/lib/mts-flash-binaries/mtcap-fpga-v31.hex" + +struct mtac_reg_s { + int8_t page; /*!< page containing the register (-1 for all pages) */ + uint8_t addr; /*!< base address of the register (7 bit) */ + uint8_t offs; /*!< position of the register LSB (between 0 to 7) */ + bool sign; /*!< 1 indicates the register is signed (2 complem.) */ + uint8_t leng; /*!< number of bits in the register */ + bool rdon; /*!< 1 indicates a read-only register */ + int32_t dflt; /*!< register default value */ +}; + +class Mtac15Fpga { + private: + HardwareType hardwareType = HARDWARE_INVALID; + void *spi_target_ptr = NULL; + const char pin_high = '1'; + const char pin_low = '0'; + std::string port; + std::string spiPath; + std::string input_file; + uint8_t fpgaVersion; + rapidjson::Document deviceInfo; + rapidjson::Document::AllocatorType &alloc = deviceInfo.GetAllocator(); + + void sha256_hash_string(unsigned char hash[SHA256_DIGEST_LENGTH], + char outputBuffer[65]); + void sha256(char *string, char outputBuffer[65]); + int sha256_file(const char *path); + int spiOpen(); + int spiRead(uint8_t spi_mux_target, uint8_t address, uint8_t *data); + int spiWrite(uint8_t spi_mux_target, uint8_t address, uint8_t data); + int spiClose(); + int busContention(); + int cresetWrite(char num); + int releaseDevice(); + int writeEnable(); + int chipEraseVerify(); + int chipErase(); + int mtacErase(); + int pageProgram(uint8_t adr_lower, uint8_t adr_higher, uint32_t data[256]); + int mtacProgram(const char input_file[]); + + public: + Mtac15Fpga(std::string inputFile, std::string forcedPath); + Mtac15Fpga(std::string path); + int getFpgaVersion(); + int FpgaVersion(); + int upgradeFpga(); +}; + +#endif /* FPGA_H_ */ diff --git a/include/General.h b/include/General.h index c5be2ff..e45f06a 100644 --- a/include/General.h +++ b/include/General.h @@ -2,7 +2,7 @@ #define GENERAL_HPP #ifdef _MSC_VER -#pragma warning ( disable : 4514 4512 4710 4355) +#pragma warning(disable : 4514 4512 4710 4355) #endif typedef signed char sint8; @@ -13,71 +13,68 @@ typedef signed int sint32; typedef unsigned int uint32; typedef signed long long sint64; typedef unsigned long long uint64; -typedef signed int sint; //32 bit - even on 64 bit machines -typedef unsigned int uint; //32 bit - even on 64 bit machines +typedef signed int sint; // 32 bit - even on 64 bit machines +typedef unsigned int uint; // 32 bit - even on 64 bit machines -#define memzero(ptr) memset(ptr,0,sizeof(*(ptr))) -#define ArrayZero(ptr,elements) memset(ptr,0,sizeof(*(ptr)) * (elements)) +#define memzero(ptr) memset(ptr, 0, sizeof(*(ptr))) +#define ArrayZero(ptr, elements) memset(ptr, 0, sizeof(*(ptr)) * (elements)) +#include <mts/MTS_Logger.h> #include <mts/MTS_System.h> #include <mts/MTS_Text.h> +#include <dirent.h> +#include <fcntl.h> /* open */ #include <fstream> #include <iostream> -#include <stdlib.h> -#include <stdio.h> /* printf fprintf */ -#include <fcntl.h> /* open */ #include <linux/spi/spidev.h> -#include <sys/ioctl.h> -#include <unistd.h> /* lseek, close */ -#include <dirent.h> #include <regex> +#include <stdio.h> /* printf fprintf */ +#include <stdlib.h> +#include <sys/ioctl.h> #include <sys/stat.h> - +#include <unistd.h> /* lseek, close */ +#include <getopt.h> /* command line parser */ #include "rapidjson/document.h" -#include "rapidjson/writer.h" -#include "rapidjson/stringbuffer.h" +#include "rapidjson/filereadstream.h" #include "rapidjson/istreamwrapper.h" +#include "rapidjson/stringbuffer.h" +#include "rapidjson/writer.h" -#define MAX_ACC_CARDS 4 - -#define VERBOSE false -#define MTS_IO_CONTROLS_STATUS_LED false -#define MTS_IO_CONTROLS_LS_LED false - -#define FIRMWARE_VERSION "Version" -#define FIRMWARE_DATE "Date" - -#define SYSFS_PLATFORM "/sys/devices/platform/mts-io/" -#define HW_VERSION_PATH "/sys/devices/platform/mts-io/hw-version" -#define LEDS_GPIO_DIR "/sys/devices/platform/leds-gpio/leds/" -#define FIRMWARE_FILE "/etc/issue" - -#define LORA_1_5_AP1_FPGA_VERSION "mts-fpga-loader -p 1 -c | grep version | awk '{printf $4}'" -#define LORA_1_5_AP2_FPGA_VERSION "mts-fpga-loader -p 2 -c | grep version | awk '{printf $4}'" -#define LORA_2_1_FPGA_VERSION "mts-fpga-loader -g | grep version | awk '{printf $4}'" -#define LORA_2_1_EXT_FPGA_VERSION "mts-fpga-loader -b 1 -g | grep version | awk '{printf $4}'" +#define MAX_ACC_CARDS 4 +#define VERBOSE false +#define MTS_IO_CONTROLS_STATUS_LED false +#define MTS_IO_CONTROLS_LS_LED false -#define MTAC_SX1301 0x0 -#define MTAC_FPGA 0x1 +#define FIRMWARE_VERSION "Version" +#define FIRMWARE_DATE "Date" +#define FIRMWARE_RELEASE "Release" -#define MTAC_FPGA_ADDRESS 0x1 +#define SYSFS_PLATFORM "/sys/devices/platform/mts-io/" +#define HW_VERSION_PATH "/sys/devices/platform/mts-io/hw-version" +#define LEDS_GPIO_DIR "/sys/devices/platform/leds-gpio/leds/" +#define FIRMWARE_FILE "/etc/issue" +#define CRESET "/creset" -#define READ_ACCESS 0x00 -#define SPI_SPEED 8000000 +#define LORA_2_1_FPGA_VERSION \ + "mts-fpga-loader -g | grep version | awk '{printf $4}'" +#define LORA_2_1_EXT_FPGA_VERSION \ + "mts-fpga-loader -b 1 -g | grep version | awk '{printf $4}'" -#define DEVICE_INFO_FILE "/var/run/config/device_info.json" -#define RESET_SHORT_CMD "reset_short_handler" -#define RESET_LONG_CMD "reset_long_handler" -#define KILL_SIGNAL "kill -l " +#define DEVICE_INFO_FILE "/var/run/config/device_info.json" +#define RESET_SHORT_CMD "reset_short_handler" +#define RESET_LONG_CMD "reset_long_handler" +#define KILL_SIGNAL "kill -l " +enum HardwareType { + HARDWARE_MTCDT, + HARDWARE_MTCDT3, + HARDWARE_MTCAP, + HARDWARE_INVALID +}; #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) - #endif - - - diff --git a/include/Utility/Utility.h b/include/Utility/Utility.h index 8d68baa..caf5661 100644 --- a/include/Utility/Utility.h +++ b/include/Utility/Utility.h @@ -6,34 +6,35 @@ #include <glob.h> /********************************************************************** -* COPYRIGHT 2020 MULTI-TECH SYSTEMS, INC. -* -* ALL RIGHTS RESERVED BY AND FOR THE EXCLUSIVE BENEFIT OF -* MULTI-TECH SYSTEMS, INC. -* -* MULTI-TECH SYSTEMS, INC. - CONFIDENTIAL AND PROPRIETARY -* INFORMATION AND/OR TRADE SECRET. -* -* NOTICE: ALL CODE, PROGRAM, INFORMATION, SCRIPT, INSTRUCTION, -* DATA, AND COMMENT HEREIN IS AND SHALL REMAIN THE CONFIDENTIAL -* INFORMATION AND PROPERTY OF MULTI-TECH SYSTEMS, INC. -* USE AND DISCLOSURE THEREOF, EXCEPT AS STRICTLY AUTHORIZED IN A -* WRITTEN AGREEMENT SIGNED BY MULTI-TECH SYSTEMS, INC. IS PROHIBITED. -* -***********************************************************************/ + * COPYRIGHT 2020 MULTI-TECH SYSTEMS, INC. + * + * ALL RIGHTS RESERVED BY AND FOR THE EXCLUSIVE BENEFIT OF + * MULTI-TECH SYSTEMS, INC. + * + * MULTI-TECH SYSTEMS, INC. - CONFIDENTIAL AND PROPRIETARY + * INFORMATION AND/OR TRADE SECRET. + * + * NOTICE: ALL CODE, PROGRAM, INFORMATION, SCRIPT, INSTRUCTION, + * DATA, AND COMMENT HEREIN IS AND SHALL REMAIN THE CONFIDENTIAL + * INFORMATION AND PROPERTY OF MULTI-TECH SYSTEMS, INC. + * USE AND DISCLOSURE THEREOF, EXCEPT AS STRICTLY AUTHORIZED IN A + * WRITTEN AGREEMENT SIGNED BY MULTI-TECH SYSTEMS, INC. IS PROHIBITED. + * + ***********************************************************************/ inline bool fileExists(std::string file) { struct stat buffer = {}; - return (stat (file.c_str(), &buffer) == 0) ? true : false; + return (stat(file.c_str(), &buffer) == 0) ? true : false; } -inline std::string toCamelCase(const char * d_name) { +inline std::string toCamelCase(const char *d_name) { std::string camelString = strdup(d_name); std::string tempString = ""; - for (size_t x = 0; x < camelString.length(); x++){ - if (camelString[x] == '-' || camelString[x] == '_'){ + for (size_t x = 0; x < camelString.length(); x++) { + if (camelString[x] == '-' || camelString[x] == '_') { tempString = camelString.substr(x + 1, 1); - transform(tempString.begin(), tempString.end(), tempString.begin(), toupper); + transform(tempString.begin(), tempString.end(), tempString.begin(), + toupper); camelString.erase(x, 2); camelString.insert(x, tempString); } @@ -50,7 +51,7 @@ inline void exitHandler(int code) { inline mode_t fileType(std::string file) { struct stat buf = {}; - if (stat (file.c_str(), &buf) == 0) { + if (stat(file.c_str(), &buf) == 0) { return buf.st_mode & S_IFMT; } else { return -1; |