AJA NTV2 SDK  17.1.1.1245
NTV2 SDK 17.1.1.1245
ntv2dynamicdevice.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
8 #include "ntv2card.h"
9 #include "ntv2devicefeatures.h"
10 #include "ntv2utils.h"
11 #include "ntv2bitfile.h"
12 #include "ntv2bitfilemanager.h"
13 #include "ajabase/system/debug.h"
14 
15 using namespace std;
16 
17 #define DDFAIL(__x__) AJA_sERROR (AJA_DebugUnit_Firmware, AJAFUNC << ": " << __x__)
18 #define DDWARN(__x__) AJA_sWARNING(AJA_DebugUnit_Firmware, AJAFUNC << ": " << __x__)
19 #define DDNOTE(__x__) AJA_sNOTICE (AJA_DebugUnit_Firmware, AJAFUNC << ": " << __x__)
20 #define DDINFO(__x__) AJA_sINFO (AJA_DebugUnit_Firmware, AJAFUNC << ": " << __x__)
21 #define DDDBG(__x__) AJA_sDEBUG (AJA_DebugUnit_Firmware, AJAFUNC << ": " << __x__)
22 
23 
25 
26 
28 {
29  NTV2ULWordVector reg;
30 
31  if (!IsOpen())
32  return false; // device not open
33 
34  if (!BitstreamStatus(reg))
35  return false; // can't get bitstream status
36 
37  if (!reg[BITSTREAM_VERSION])
38  return false; // Bitstream version is zero
39 
40  return true;
41 }
42 
44 {
45  if (!IsDynamicDevice())
46  return false;
47 
48  ULWord counts(0);
49  ReadRegister(kVRegDynFirmwareUpdateCounts, counts);
50  const ULWord successes(counts & 0x0000FFFF);
51  if (!successes)
52  return false;
53  // At least 1 successful dynamic firmware load/update done
54  return true;
55 }
56 
58 {
59  if (!IsDynamicDevice())
60  return DEVICE_ID_INVALID;
61 
62  ULWord value(0);
63  if (!ReadRegister(kVRegBaseFirmwareDeviceID, value))
64  return DEVICE_ID_INVALID;
65  return NTV2DeviceID(value);
66 }
67 
69 {
70  NTV2DeviceIDList result;
71  const NTV2DeviceIDSet devs(GetDynamicDeviceIDs());
72  for (NTV2DeviceIDSetConstIter it(devs.begin()); it != devs.end(); ++it)
73  result.push_back(*it);
74  return result;
75 }
76 
78 {
79  NTV2DeviceIDSet result;
80  if (!IsOpen())
81  return result;
82 
83  const NTV2DeviceID currentDeviceID (GetDeviceID());
84  if (currentDeviceID == 0)
85  return result;
86 
87  // Get current design ID and version...
88  NTV2ULWordVector reg;
89  if (!BitstreamStatus(reg))
90  return result;
91 
92  if (reg[BITSTREAM_VERSION] == 0)
93  return result;
94 
95  ULWord currentUserID(0), currentDesignID(0), currentDesignVersion(0), currentBitfileID(0), currentBitfileVersion(0);
96 
97  if (GetRunningFirmwareUserID(currentUserID) && currentUserID)
98  { // The new way
99  currentDesignID = NTV2BitfileHeaderParser::GetDesignID(currentUserID);
100  currentDesignVersion = NTV2BitfileHeaderParser::GetDesignVersion(currentUserID);
101  currentBitfileID = NTV2BitfileHeaderParser::GetBitfileID(currentUserID);
102  currentBitfileVersion = NTV2BitfileHeaderParser::GetBitfileVersion(currentUserID);
103  }
104  else
105  { // The old way
108  currentBitfileID = CNTV2Bitfile::ConvertToBitfileID(currentDeviceID);
109  currentBitfileVersion = 0xff; // ignores bitfile version
110  }
111 
112  if (!currentDesignID)
113  return result;
114 
115  // Get the clear file matching current bitfile...
116  NTV2Buffer clearStream;
117  if (!s_BitfileManager.GetBitStream (clearStream,
118  currentDesignID,
119  currentDesignVersion,
120  currentBitfileID,
121  currentBitfileVersion,
122  NTV2_BITFILE_FLAG_CLEAR) || !clearStream)
123  return result;
124 
125  // Build the deviceID set...
127  for (NTV2BitfileInfoListConstIter it(infoList.begin()); it != infoList.end(); ++it)
128  if (it->designID == currentDesignID)
129  if (it->designVersion == currentDesignVersion)
130  if (it->bitfileFlags & NTV2_BITFILE_FLAG_PARTIAL)
131  {
132  const NTV2DeviceID devID (CNTV2Bitfile::ConvertToDeviceID(it->designID, it->bitfileID));
133  if (result.find(devID) == result.end())
134  result.insert(devID);
135  }
136  return result;
137 }
138 
140 {
141  const NTV2DeviceIDSet devices(GetDynamicDeviceIDs());
142  return devices.find(inDeviceID) != devices.end();
143 }
144 
146 {
147  if (!IsOpen())
148  {DDFAIL("Device not open"); return false;}
149 
150  const NTV2DeviceID currentDeviceID (GetDeviceID());
151  if (!currentDeviceID)
152  {DDFAIL("Current device ID is zero"); return false;}
153 
154  const string oldDevName (GetDisplayName());
155 
156  // Get current design ID and version...
157  NTV2ULWordVector regs;
158  if (!BitstreamStatus(regs))
159  {DDFAIL("Unable to read current bitstream status for " << oldDevName); return false;}
160 
161  if (!regs[BITSTREAM_VERSION])
162  {DDFAIL("Bitstream version is zero for " << oldDevName); return false;}
163 
164  ULWord currentUserID(0), currentDesignID(0), currentDesignVersion(0), currentBitfileID(0), currentBitfileVersion(0);
165 
166  if (GetRunningFirmwareUserID(currentUserID) && currentUserID)
167  { // the new way:
168  currentDesignID = NTV2BitfileHeaderParser::GetDesignID(currentUserID);
169  currentDesignVersion = NTV2BitfileHeaderParser::GetDesignVersion(currentUserID);
170  currentBitfileID = NTV2BitfileHeaderParser::GetBitfileID(currentUserID);
171  currentBitfileVersion = NTV2BitfileHeaderParser::GetBitfileVersion(currentUserID);
172  }
173  else
174  { // the old way:
176  currentDesignVersion = NTV2BitfileHeaderParser::GetDesignVersion(regs[BITSTREAM_VERSION]);
177  currentBitfileID = CNTV2Bitfile::ConvertToBitfileID(currentDeviceID);
178  currentBitfileVersion = 0xff; // ignores bitfile version
179  }
180 
181  if (!currentDesignID)
182  {DDFAIL("Current design ID is zero for " << oldDevName); return false;}
183 
184  // Get the clear file matching current bitfile...
185  NTV2Buffer clearStream;
186  if (!s_BitfileManager.GetBitStream (clearStream,
187  currentDesignID,
188  currentDesignVersion,
189  currentBitfileID,
190  currentBitfileVersion,
191  NTV2_BITFILE_FLAG_CLEAR) || !clearStream)
192  {DDFAIL("GetBitStream 'clear' failed for " << oldDevName); return false;}
193 
194  // Get the partial file matching the inDeviceID...
195  NTV2Buffer partialStream;
196  if (!s_BitfileManager.GetBitStream (partialStream,
197  currentDesignID,
198  currentDesignVersion,
200  0xff,
201  NTV2_BITFILE_FLAG_PARTIAL) || !partialStream)
202  {DDFAIL("GetBitStream 'partial' failed for " << oldDevName); return false;}
203 
204  // Load the clear bitstream...
205  if (!BitstreamWrite (clearStream, true, true))
206  {DDFAIL("BitstreamWrite failed writing 'clear' bitstream for " << oldDevName); return false;}
207  // Load the partial bitstream...
208  if (!BitstreamWrite (partialStream, false, true))
209  {DDFAIL("BitstreamWrite failed writing 'partial' bitstream for " << oldDevName); return false;}
210 
211  DDNOTE(oldDevName << " dynamically changed to '" << ::NTV2DeviceIDToString(inDeviceID) << "' (" << xHEX0N(inDeviceID,8) << ")");
212  return true;
213 } // LoadDynamicDevice
214 
215 bool CNTV2Card::AddDynamicBitfile (const string & inBitfilePath)
216 {
217  return s_BitfileManager.AddFile(inBitfilePath);
218 }
219 
220 bool CNTV2Card::AddDynamicDirectory (const string & inDirectory)
221 {
222  return s_BitfileManager.AddDirectory(inDirectory);
223 }
NTV2BitfileHeaderParser::GetDesignID
static ULWord GetDesignID(const ULWord userID)
Definition: ntv2bitfile.h:54
CNTV2Card::LoadDynamicDevice
virtual bool LoadDynamicDevice(const NTV2DeviceID inDeviceID)
Quickly, dynamically loads the given device ID firmware.
Definition: ntv2dynamicdevice.cpp:145
ntv2devicefeatures.h
Declares device capability functions.
NTV2Buffer
A generic user-space buffer object that has an address and a length. Used most often to share an arbi...
Definition: ntv2publicinterface.h:5993
CNTV2Bitfile::ConvertToBitfileID
static ULWord ConvertToBitfileID(const NTV2DeviceID inDeviceID)
Definition: ntv2bitfile.cpp:797
NTV2_BITFILE_FLAG_CLEAR
#define NTV2_BITFILE_FLAG_CLEAR
This is a clear bitfile.
Definition: ntv2bitfilemanager.h:25
CNTV2Card::GetBaseDeviceID
virtual NTV2DeviceID GetBaseDeviceID()
Definition: ntv2dynamicdevice.cpp:57
NTV2DeviceID
NTV2DeviceID
Identifies a specific AJA NTV2 device model number. The NTV2DeviceID is actually the PROM part number...
Definition: ntv2enums.h:20
CNTV2Card::AddDynamicDirectory
virtual bool AddDynamicDirectory(const std::string &inDirectory)
Adds all bitfiles found in the given host file directory to the list of available dynamic bitfiles.
Definition: ntv2dynamicdevice.cpp:220
NTV2DeviceIDSetConstIter
NTV2DeviceIDSet::const_iterator NTV2DeviceIDSetConstIter
A convenient const iterator for NTV2DeviceIDSet.
Definition: ntv2utils.h:1033
NTV2_BITFILE_FLAG_PARTIAL
#define NTV2_BITFILE_FLAG_PARTIAL
This is a partial bitfile.
Definition: ntv2bitfilemanager.h:24
BITSTREAM_VERSION
#define BITSTREAM_VERSION
Bitstream version register.
Definition: ntv2publicinterface.h:5567
NTV2BitfileHeaderParser::GetDesignVersion
static ULWord GetDesignVersion(const ULWord userID)
Definition: ntv2bitfile.h:55
CNTV2BitfileManager::AddDirectory
virtual bool AddDirectory(const std::string &inDirectory)
Add the bitfile(s) at the given path to the list of bitfiles.
Definition: ntv2bitfilemanager.cpp:87
CNTV2BitfileManager
I manage and cache any number of bitfiles for any number of NTV2 devices/designs.
Definition: ntv2bitfilemanager.h:52
CNTV2BitfileManager::GetBitfileInfoList
virtual const NTV2BitfileInfoList & GetBitfileInfoList(void) const
Returns an NTV2BitfileInfoList standard C++ vector.
Definition: ntv2bitfilemanager.h:94
NTV2BitfileHeaderParser::GetBitfileID
static ULWord GetBitfileID(const ULWord userID)
Definition: ntv2bitfile.h:56
CNTV2Bitfile::ConvertToDeviceID
static NTV2DeviceID ConvertToDeviceID(const ULWord inDesignID, const ULWord inBitfileID)
Definition: ntv2bitfile.cpp:787
CNTV2Card::IsDynamicFirmwareLoaded
virtual bool IsDynamicFirmwareLoaded(void)
Definition: ntv2dynamicdevice.cpp:43
ULWord
uint32_t ULWord
Definition: ajatypes.h:253
CNTV2Card::GetDynamicDeviceIDs
virtual NTV2DeviceIDSet GetDynamicDeviceIDs(void)
Definition: ntv2dynamicdevice.cpp:77
CNTV2Card::GetDynamicDeviceList
virtual NTV2DeviceIDList GetDynamicDeviceList(void)
Definition: ntv2dynamicdevice.cpp:68
NTV2BitfileHeaderParser::GetBitfileVersion
static ULWord GetBitfileVersion(const ULWord userID)
Definition: ntv2bitfile.h:57
NTV2DeviceIDToString
std::string NTV2DeviceIDToString(const NTV2DeviceID inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:4673
ntv2card.h
Declares the CNTV2Card class.
ntv2utils.h
Declares numerous NTV2 utility functions.
NTV2BitfileInfoList
std::vector< NTV2BitfileInfo > NTV2BitfileInfoList
Definition: ntv2bitfilemanager.h:43
CNTV2Card::CanLoadDynamicDevice
virtual bool CanLoadDynamicDevice(const NTV2DeviceID inDeviceID)
Definition: ntv2dynamicdevice.cpp:139
s_BitfileManager
static CNTV2BitfileManager s_BitfileManager
Definition: ntv2dynamicdevice.cpp:24
NTV2ULWordVector
std::vector< ULWord > NTV2ULWordVector
An ordered sequence of ULWords.
Definition: ntv2publicinterface.h:3825
DEVICE_ID_INVALID
@ DEVICE_ID_INVALID
Definition: ntv2enums.h:91
CNTV2BitfileManager::GetBitStream
virtual bool GetBitStream(NTV2Buffer &outBitstream, const ULWord inDesignID, const ULWord inDesignVersion, const ULWord inBitfileID, const ULWord inBitfileVersion, const ULWord inBitfileFlags)
Retrieves the bitstream specified by design ID & version, and bitfile ID & version....
Definition: ntv2bitfilemanager.cpp:123
ntv2bitfile.h
Declares the CNTV2Bitfile class.
NTV2BitfileInfoListConstIter
NTV2BitfileInfoList::const_iterator NTV2BitfileInfoListConstIter
Definition: ntv2bitfilemanager.h:45
CNTV2Card::AddDynamicBitfile
virtual bool AddDynamicBitfile(const std::string &inBitfilePath)
Adds the given bitfile to the list of available dynamic bitfiles.
Definition: ntv2dynamicdevice.cpp:215
std
Definition: json.hpp:5362
NTV2DeviceIDSet
std::set< NTV2DeviceID > NTV2DeviceIDSet
A set of NTV2DeviceIDs.
Definition: ntv2utils.h:1031
DDNOTE
#define DDNOTE(__x__)
Definition: ntv2dynamicdevice.cpp:19
kVRegDynFirmwareUpdateCounts
@ kVRegDynFirmwareUpdateCounts
Definition: ntv2virtualregisters.h:627
kVRegBaseFirmwareDeviceID
@ kVRegBaseFirmwareDeviceID
Definition: ntv2virtualregisters.h:624
CNTV2BitfileManager::AddFile
virtual bool AddFile(const std::string &inBitfilePath)
Add the bitfile at the given path to the list of bitfiles.
Definition: ntv2bitfilemanager.cpp:38
ntv2bitfilemanager.h
Declares the CNTV2BitfileManager class that manages Xilinx bitfiles.
NTV2DeviceIDList
std::vector< NTV2DeviceID > NTV2DeviceIDList
An ordered list of NTV2DeviceIDs.
Definition: ntv2utils.h:1024
xHEX0N
#define xHEX0N(__x__, __n__)
Definition: ntv2publicinterface.h:5604
CNTV2Card::IsDynamicDevice
virtual bool IsDynamicDevice(void)
Definition: ntv2dynamicdevice.cpp:27
DDFAIL
#define DDFAIL(__x__)
Definition: ntv2dynamicdevice.cpp:17
debug.h
Declares the AJADebug class.