/* SPDX-License-Identifier: MIT */ /** @file ntv2konaflashprogram.h @brief Declares the CNTV2KonaFlashProgram class. @copyright (C) 2010-2021 AJA Video Systems, Inc. All rights reserved. **/ #ifndef NTV2KONAFLASHPROGRAM_H #define NTV2KONAFLASHPROGRAM_H #include "ntv2card.h" #include #include #include #include #include #include #include #include "ntv2debug.h" #include "ntv2mcsfile.h" #include "ntv2spiinterface.h" #include "ntv2bitfile.h" #define MAXBITFILE_HEADERSIZE 512 #define MAXMCSINFOSIZE 256 #define MAXMCSLICENSESIZE 256 #define MCS_STEPS 6 typedef enum { MAIN_FLASHBLOCK, FAILSAFE_FLASHBLOCK, AUTO_FLASHBLOCK, SOC1_FLASHBLOCK, SOC2_FLASHBLOCK, MAC_FLASHBLOCK, MCS_INFO_BLOCK, LICENSE_BLOCK } FlashBlockID; typedef enum { BANK_0, BANK_1, BANK_2, BANK_3 } BankSelect; struct MacAddr { uint8_t mac[6]; std::string AsString(void) const; }; class AJAExport CNTV2FlashProgress { public: static CNTV2FlashProgress & nullUpdater; CNTV2FlashProgress() {} virtual ~CNTV2FlashProgress() {} virtual bool UpdatePercentage (const size_t inPercentage) {(void) inPercentage; return true;} }; // CNTV2PercentUpdater class AJAExport CNTV2KonaFlashProgram : public CNTV2Card { public: CNTV2KonaFlashProgram(); CNTV2KonaFlashProgram (const UWord boardNumber); virtual ~CNTV2KonaFlashProgram(); static std::string FlashBlockIDToString (const FlashBlockID inID, const bool inShortDisplay = false); // New in SDK 16.0 public: virtual bool SetBoard (UWord boardNumber, uint32_t index = 0); bool ReadHeader (FlashBlockID flashBlock); bool ReadInfoString(); bool SetBitFile (const std::string & inBitfileName, std::ostream & outMsgs, const FlashBlockID blockNumber = AUTO_FLASHBLOCK); // New in SDK 16.0 bool SetMCSFile (const std::string & sMCSFileName); std::string Program (bool fullVerify = false); bool ProgramFromMCS(bool verify); bool ProgramSOC(bool verify = true); bool ProgramCustom (const std::string & sCustomFileName, const uint32_t addr, std::ostream & outMsgs); bool EraseBlock (FlashBlockID blockNumber); bool EraseChip (UWord chip = 0); bool CreateSRecord (bool bChangeEndian); bool CreateEDIDIntelRecord (); void SetQuietMode (); bool VerifyFlash (FlashBlockID flashBlockNumber, bool fullVerify = false); bool ReadFlash (NTV2_POINTER & outBuffer, const FlashBlockID flashID, CNTV2FlashProgress & inFlashProgress = CNTV2FlashProgress::nullUpdater); // New in SDK 16.0 bool SetBankSelect (BankSelect bankNumber); bool SetFlashBlockIDBank(FlashBlockID blockID); bool ROMHasBankSelect(); uint32_t ReadBankSelect (); bool SetMBReset(); bool IsInstalledFWRunning (bool & outIsRunning, std::ostream & outErrorMsgs); std::string GetDesignName (void) const {return _parser.DesignName();} std::string GetPartName (void) const {return _parser.PartName();} std::string GetDate (void) const {return _parser.Date();} std::string GetTime (void) const {return _parser.Time();} const NTV2BitfileHeaderParser & Parser (void) const {return _parser;} uint32_t GetNumBytes(void) const {return _numBytes;} const std::string & GetMCSInfo (void) const {return _mcsInfo;} void ParsePartitionFromFileLines(uint32_t address, uint16_t & partitionOffset); bool CreateBankRecord(BankSelect bankID); bool ProgramMACAddresses(MacAddr * mac1, MacAddr * mac2); bool ReadMACAddresses(MacAddr & mac1, MacAddr & mac2); bool ProgramLicenseInfo(const std::string & licenseString); bool ReadLicenseInfo(std::string & licenseString); void DisplayData(uint32_t address, uint32_t len); bool ProgramInfoFromString(std::string infoString); bool FullProgram(std::vector & dataBuffer); int32_t NextMcsStep() {return ++_mcsStep;} bool WaitForFlashNOTBusy(); bool ProgramFlashValue(uint32_t address, uint32_t value); bool FastProgramFlash256(uint32_t address, uint32_t* buffer); bool EraseSector(uint32_t sectorAddress); bool CheckFlashErasedWithBlockID(FlashBlockID flashBlockNumber); uint32_t ReadDeviceID(); bool SetDeviceProperties(); void DetermineFlashTypeAndBlockNumberFromFileName(const std::string & bitFileName); static void SRecordOutput (const char *pSRecord); uint32_t GetSectorAddressForSector(FlashBlockID flashBlockNumber,uint32_t sectorNumber) { return GetBaseAddressForProgramming(flashBlockNumber)+(sectorNumber*_sectorSize); } uint32_t GetBaseAddressForProgramming(FlashBlockID flashBlockNumber) { switch ( flashBlockNumber ) { default: case MAIN_FLASHBLOCK: return _mainOffset; case FAILSAFE_FLASHBLOCK: return _failSafeOffset; case SOC1_FLASHBLOCK: return _soc1Offset; case SOC2_FLASHBLOCK: return _soc2Offset; case MAC_FLASHBLOCK: return _macOffset; case MCS_INFO_BLOCK: return _mcsInfoOffset; case LICENSE_BLOCK: return _licenseOffset; } } uint32_t GetNumberOfSectors(FlashBlockID flashBlockNumber) { switch ( flashBlockNumber ) { default: case MAIN_FLASHBLOCK: return _numSectorsMain; case FAILSAFE_FLASHBLOCK: return _numSectorsFailSafe; case SOC1_FLASHBLOCK: return _numSectorsSOC1; case SOC2_FLASHBLOCK: return _numSectorsSOC2; case MAC_FLASHBLOCK: return 1; case MCS_INFO_BLOCK: return 1; case LICENSE_BLOCK: return 1; } } bool VerifySOCPartition(FlashBlockID flashID, uint32_t FlashBlockOffset); bool CheckAndFixMACs(); bool MakeMACsFromSerial( const char *sSerialNumber, MacAddr *pMac1, MacAddr *pMac2 ); protected: NTV2_POINTER _bitFileBuffer; uint8_t * _customFileBuffer; uint32_t _bitFileSize; NTV2BitfileHeaderParser _parser; std::string _bitFileName; std::string _mcsInfo; uint32_t _spiDeviceID; uint32_t _flashSize; uint32_t _bankSize; uint32_t _sectorSize; uint32_t _mainOffset; uint32_t _failSafeOffset; uint32_t _macOffset; uint32_t _mcsInfoOffset; uint32_t _licenseOffset; uint32_t _soc1Offset; uint32_t _soc2Offset; uint32_t _numSectorsMain; uint32_t _numSectorsSOC1; uint32_t _numSectorsSOC2; uint32_t _numSectorsFailSafe; uint32_t _numBytes; FlashBlockID _flashID; uint32_t _deviceID; bool _bQuiet; int32_t _mcsStep; CNTV2MCSfile _mcsFile; std::vector _partitionBuffer; uint32_t _failSafePadding; CNTV2SpiFlash * _spiFlash; typedef enum { READID_COMMAND = 0x9F, WRITEENABLE_COMMAND = 0x06, WRITEDISABLE_COMMAND = 0x04, READSTATUS_COMMAND = 0x05, WRITESTATUS_COMMAND = 0x01, READFAST_COMMAND = 0x0B, PAGEPROGRAM_COMMAND = 0x02, SECTORERASE_COMMAND = 0xD8, CHIPERASE_COMMAND = 0xC7, BANKSELECT_COMMMAND = 0x17, READBANKSELECT_COMMAND = 0x16 } _FLASH_STUFF; }; // CNTV2KonaFlashProgram #endif // NTV2KONAFLASHPROGRAM_H