obs-studio/build_dependencies/aja/include/ajalibraries/ajantv2/includes/ntv2konaflashprogram.h
Ward Nakchbandi b48576284b first commit
2023-03-04 20:33:16 +03:00

218 lines
6.6 KiB
C++

/* 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 <fstream>
#include <vector>
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <iostream>
#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<uint8_t> & 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<uint8_t> _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