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; | 
