AJA NTV2 SDK  18.1.0.2149
NTV2 SDK 18.1.0.2149
ntv2registerexpert.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
7 #include "ntv2registerexpert.h"
8 #include "ntv2devicefeatures.hh"
9 #include "ntv2utils.h"
10 #include "ntv2debug.h"
11 #include "ntv2endian.h"
12 #include "ntv2vpid.h"
13 #include "ntv2bitfile.h"
14 #include "ntv2signalrouter.h"
15 #include "ajabase/common/common.h"
16 #include "ajabase/system/lock.h"
18 #include "ajabase/system/debug.h"
19 #include <algorithm>
20 #include <sstream>
21 #include <iterator>
22 #include <iomanip>
23 #include <map>
24 #include <math.h>
25 #include <ctype.h> // for isprint()
26 #if !defined(AJA_WINDOWS)
27 #include <unistd.h>
28 #endif
29 
30 
31 using namespace std;
32 
33 #define LOGGING_MAPPINGS (AJADebug::IsActive(AJA_DebugUnit_Enumeration))
34 #define HEX16(__x__) "0x" << hex << setw(16) << setfill('0') << uint64_t(__x__) << dec
35 #define INSTP(_p_) HEX16(uint64_t(_p_))
36 #define REiFAIL(__x__) AJA_sERROR (AJA_DebugUnit_Enumeration, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
37 #define REiWARN(__x__) AJA_sWARNING(AJA_DebugUnit_Enumeration, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
38 #define REiNOTE(__x__) AJA_sNOTICE (AJA_DebugUnit_Enumeration, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
39 #define REiINFO(__x__) AJA_sINFO (AJA_DebugUnit_Enumeration, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
40 #define REiDBG(__x__) AJA_sDEBUG (AJA_DebugUnit_Enumeration, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
41 
42 #define DEF_REGNAME(_num_) DefineRegName(_num_, #_num_)
43 #define DEF_REG(_num_, _dec_, _rw_, _c1_, _c2_, _c3_) DefineRegister((_num_), #_num_, _dec_, _rw_, _c1_, _c2_, _c3_)
44 
45 
48 static const string sSpace(" ");
49 static const string sNull;
50 
51 typedef enum
52 {
54  regNTV4FS_LineLengthPitch = regNTV4FS_FIRST, // Reg 0 - Raster bytes/line[31:16] & pitch[15:0]
55  regNTV4FS_ROIVHSize, // Reg 1 - ROI size: vert[27:16] horz[11:0]
56  regNTV4FS_ROIF1StartAddr, // Reg 2 - ROI F1 start address [31:0]
57  regNTV4FS_ROIF2StartAddr, // Reg 3 - ROI F2 end address [31:0]
58  regNTV4FS_ROIF1VHOffsets, // Reg 4 - ROI F1 byte offsets: vert[26:16] horz[11:0]
59  regNTV4FS_ROIF2VHOffsets, // Reg 5 - ROI F2 byte offsets: vert[26:16] horz[11:0]
60  regNTV4FS_DisplayHorzPixelsPerLine, // Reg 6 - Horiz display: total[27:16] active[11:0]
61  regNTV4FS_DisplayFID, // Reg 7 - FID bit transition lines: FID lo[26:16] hi[10:0]
62  regNTV4FS_F1ActiveLines, // Reg 8 - Disp F1 active lines: end[26:16] start[10:0]
63  regNTV4FS_F2ActiveLines, // Reg 9 - Disp F2 active lines: end[26:16] start[10:0]
64  regNTV4FS_RasterControl, // Reg 10 - Control: sync[21:20] pixclk[18:16] pixfmt[12:8] p[6] rgb8cvt[5] dither[4] fill[3] DRT[2] disable[1] capture[0]
65  regNTV4FS_RasterPixelSkip, // Reg 11 - Raster pixel skip (or unpacker H offset?)
66  regNTV4FS_RasterVideoFill_YCb_GB, // Reg 12 - Raster video fill YorG[31:16] CbOrB[15:0]
67  regNTV4FS_RasterVideoFill_Cr_AR, // Reg 13 - Raster video fill A[31:16] CrOrR[15:0]
68  regNTV4FS_RasterROIFillAlpha, // Reg 14 - ROI Fill Alpha[15:0]
69  regNTV4FS_Status, // Reg 15 - Status lineCount[31:16] oddField[0]
70  regNTV4FS_RasterOutputTimingPreset, // Reg 16 - Output timing preset[23:0]
71  regNTV4FS_RasterVTotalLines, // Reg 17 - Total lines
72  regNTV4FS_RasterSmpteFramePulse, // Reg 18 - SMPTE frame pulse
73  regNTV4FS_RasterOddLineStartAddress, // Reg 19 - UHD odd line start addr | Green playback component offset (int12_t)
74  regNTV4FS_RasterOffsetBlue, // Reg 20 - Blue playback component offset[12:0] (int12_t)
75  regNTV4FS_RasterOffsetRed, // Reg 21 - Red playback component offset[12:0] (int12_t)
76  regNTV4FS_RasterOffsetAlpha, // Reg 22 - Alpha playback component offset[12:0] (int12_t)
77  regNTV4FS_InputSourceSelect = 63, // Reg 63 - Input source select[7:0]
81 
82 static const std::string sNTV4FrameStoreRegNames[] = { "LineLengthPitch",
83  "ROIVHSize",
84  "ROIF1StartAddr",
85  "ROIF2StartAddr",
86  "ROIF1VHOffsets",
87  "ROIF2VHOffsets",
88  "DisplayHorzPixelsPerLine",
89  "DisplayFID",
90  "F1ActiveLines",
91  "F2ActiveLines",
92  "RasterControl",
93  "RasterPixelSkip",
94  "RasterVideoFill_YCb_GB",
95  "RasterVideoFill_Cr_AR",
96  "RasterROIFillAlpha",
97  "Status",
98  "RasterOutputTimingPreset",
99  "RasterVTotalLines",
100  "RasterSmpteFramePulse",
101  "RasterOddLineStartAddress",
102  "RasterOffsetBlue",
103  "RasterOffsetRed",
104  "RasterOffsetAlpha"};
105 static const ULWord kNTV4FrameStoreFirstRegNum (0x0000D000 / sizeof(ULWord)); // First FS reg num 13,312
106 static const ULWord kNumNTV4FrameStoreRegisters(regNTV4FS_REGISTER_COUNT); // 64 registers
107 
108 
111 static uint32_t gInstanceTally(0);
112 static uint32_t gLivingInstances(0);
113 
114 
123 {
124 public:
125  static RegisterExpertPtr GetInstance(const bool inCreateIfNecessary = true);
126  static bool DisposeInstance(void);
127 
128 private:
130  {
131  AJAAutoLock lock(&mGuardMutex);
134  // Name "Classic" registers using NTV2RegisterNameString...
135  for (ULWord regNum (0); regNum < kRegNumRegisters; regNum++)
136  DefineRegName (regNum, ::NTV2RegisterNameString(regNum));
137  // Now the rest...
138  SetupBasicRegs(); // Basic registers
139  SetupVPIDRegs(); // VPIDs
140  SetupAncInsExt(); // Anc Ins/Ext
141  SetupAuxInsExt(); // Aux Ins/Ext
142  SetupXptSelect(); // Xpt Select
143  SetupDMARegs(); // DMA
144  SetupTimecodeRegs(); // Timecode
145  SetupAudioRegs(); // Audio
146  SetupMRRegs(); // MultiViewer/MultiRaster
147  SetupMixerKeyerRegs(); // Mixer/Keyer
148  SetupHDMIRegs(); // HDMI
149  SetupSDIErrorRegs(); // SDIError
150  SetupCSCRegs(); // CSCs
151  SetupLUTRegs(); // LUTs
152  SetupBOBRegs(); // Break Out Board
153  SetupLEDRegs(); // Bracket LEDs
154  SetupCMWRegs(); // Clock Monitor Out
155  SetupNTV4FrameStoreRegs(); // NTV4 FrameStores
156  SetupVRegs(); // Virtuals
157  REiNOTE(DEC(gLivingInstances) << " extant, " << DEC(gInstanceTally) << " total");
158  if (LOGGING_MAPPINGS)
159  {
160  REiDBG("RegsToStrsMap=" << mRegNumToStringMap.size()
161  << " RegsToDecodersMap=" << mRegNumToDecoderMap.size()
162  << " ClassToRegsMMap=" << mRegClassToRegNumMMap.size()
163  << " StrToRegsMMap=" << mStringToRegNumMMap.size()
164  << " InpXptsToXptRegInfoMap=" << mInputXpt2XptRegNumMaskIndexMap.size()
165  << " XptRegInfoToInpXptsMap=" << mXptRegNumMaskIndex2InputXptMap.size()
166  << " RegClasses=" << mAllRegClasses.size());
167  }
168  } // constructor
169 public:
171  {
173  REiNOTE(DEC(gLivingInstances) << " extant, " << DEC(gInstanceTally) << " total");
174  } // destructor
175 
176 private:
177  // This class implements a functor that returns a string that contains a human-readable decoding
178  // of a register value, given its number and the ID of the device it came from.
179  struct Decoder
180  {
181  // The default reg decoder functor returns an empty string.
182  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
183  {
184  (void) inRegNum;
185  (void) inRegValue;
186  (void) inDeviceID;
187  return string();
188  }
189  } mDefaultRegDecoder;
190 
191  void DefineRegName(const uint32_t regNumber, const string & regName)
192  {
193  if (!regName.empty())
194  {
195  AJAAutoLock lock(&mGuardMutex);
196  if (mRegNumToStringMap.find(regNumber) == mRegNumToStringMap.end())
197  {
198  mRegNumToStringMap.insert (RegNumToStringPair(regNumber, regName));
199  string lowerCaseRegName(regName);
200  mStringToRegNumMMap.insert (StringToRegNumPair(aja::lower(lowerCaseRegName), regNumber));
201  }
202  }
203  }
204  inline void DefineRegDecoder(const uint32_t inRegNum, const Decoder & dec)
205  {
206  AJAAutoLock lock(&mGuardMutex);
207  mRegNumToDecoderMap.insert (RegNumToDecoderPair(inRegNum, &dec));
208  }
209  inline void DefineRegClass (const uint32_t inRegNum, const string & className)
210  {
211  if (!className.empty())
212  {
213  AJAAutoLock lock(&mGuardMutex);
214  mRegClassToRegNumMMap.insert(StringToRegNumPair(className, inRegNum));
215  }
216  }
217  void DefineRegReadWrite(const uint32_t inRegNum, const int rdWrt)
218  {
219  AJAAutoLock lock(&mGuardMutex);
220  if (rdWrt == READONLY)
221  {
222  NTV2_ASSERT (!IsRegisterWriteOnly(inRegNum));
223  DefineRegClass (inRegNum, kRegClass_ReadOnly);
224  }
225  if (rdWrt == WRITEONLY)
226  {
227  NTV2_ASSERT (!IsRegisterReadOnly(inRegNum));
228  DefineRegClass (inRegNum, kRegClass_WriteOnly);
229  }
230  }
231  void DefineRegister(const uint32_t inRegNum, const string & regName, const Decoder & dec, const int rdWrt, const string & className1, const string & className2, const string & className3)
232  {
233  DefineRegName (inRegNum, regName);
234  DefineRegDecoder (inRegNum, dec);
235  DefineRegReadWrite (inRegNum, rdWrt);
236  DefineRegClass (inRegNum, className1);
237  DefineRegClass (inRegNum, className2);
238  DefineRegClass (inRegNum, className3);
239  }
240  void DefineXptReg(const uint32_t inRegNum, const NTV2InputXptID xpt0, const NTV2InputXptID xpt1, const NTV2InputXptID xpt2, const NTV2InputXptID xpt3)
241  {
242  DefineRegister (inRegNum, sNull, mDecodeXptGroupReg, READWRITE, kRegClass_Routing, kRegClass_NULL, kRegClass_NULL);
243  const NTV2InputCrosspointID indexes [4] = {xpt0, xpt1, xpt2, xpt3};
244  for (int ndx(0); ndx < 4; ndx++)
245  {
246  if (indexes[ndx] == NTV2_INPUT_CROSSPOINT_INVALID)
247  continue;
248  const XptRegNumAndMaskIndex regNumAndNdx(inRegNum, ndx);
249  if (mXptRegNumMaskIndex2InputXptMap.find(regNumAndNdx) == mXptRegNumMaskIndex2InputXptMap.end())
250  mXptRegNumMaskIndex2InputXptMap [regNumAndNdx] = indexes[ndx];
251  if (mInputXpt2XptRegNumMaskIndexMap.find(indexes[ndx]) == mInputXpt2XptRegNumMaskIndexMap.end())
252  mInputXpt2XptRegNumMaskIndexMap[indexes[ndx]] = regNumAndNdx;
253  }
254  }
255 
256  void SetupBasicRegs(void)
257  {
258  AJAAutoLock lock(&mGuardMutex);
259  DefineRegister (kRegGlobalControl, "", mDecodeGlobalControlReg, READWRITE, kRegClass_NULL, kRegClass_Channel1, kRegClass_NULL);
260  DefineRegister (kRegGlobalControl2, "", mDecodeGlobalControl2, READWRITE, kRegClass_NULL, kRegClass_Channel1, kRegClass_NULL);
261  DefineRegister (kRegGlobalControl3, "", mDecodeGlobalControl3, READWRITE, kRegClass_NULL, kRegClass_Channel1, kRegClass_NULL);
262  DefineRegister (kRegGlobalControlCh2, "", mDecodeGlobalControlChanRegs,READWRITE, kRegClass_NULL, kRegClass_Channel2, kRegClass_NULL);
263  DefineRegister (kRegGlobalControlCh3, "", mDecodeGlobalControlChanRegs,READWRITE, kRegClass_NULL, kRegClass_Channel3, kRegClass_NULL);
264  DefineRegister (kRegGlobalControlCh4, "", mDecodeGlobalControlChanRegs,READWRITE, kRegClass_NULL, kRegClass_Channel4, kRegClass_NULL);
265  DefineRegister (kRegGlobalControlCh5, "", mDecodeGlobalControlChanRegs,READWRITE, kRegClass_NULL, kRegClass_Channel5, kRegClass_NULL);
266  DefineRegister (kRegGlobalControlCh6, "", mDecodeGlobalControlChanRegs,READWRITE, kRegClass_NULL, kRegClass_Channel6, kRegClass_NULL);
267  DefineRegister (kRegGlobalControlCh7, "", mDecodeGlobalControlChanRegs,READWRITE, kRegClass_NULL, kRegClass_Channel7, kRegClass_NULL);
268  DefineRegister (kRegGlobalControlCh8, "", mDecodeGlobalControlChanRegs,READWRITE, kRegClass_NULL, kRegClass_Channel8, kRegClass_NULL);
269  DefineRegister (kRegCh1Control, "", mDecodeChannelControl, READWRITE, kRegClass_NULL, kRegClass_Channel1, kRegClass_NULL);
270  DefineRegister (kRegCh2Control, "", mDecodeChannelControl, READWRITE, kRegClass_NULL, kRegClass_Channel2, kRegClass_NULL);
271  DefineRegister (kRegCh3Control, "", mDecodeChannelControl, READWRITE, kRegClass_NULL, kRegClass_Channel3, kRegClass_NULL);
272  DefineRegister (kRegCh4Control, "", mDecodeChannelControl, READWRITE, kRegClass_NULL, kRegClass_Channel4, kRegClass_NULL);
273  DefineRegister (kRegCh5Control, "", mDecodeChannelControl, READWRITE, kRegClass_NULL, kRegClass_Channel5, kRegClass_NULL);
274  DefineRegister (kRegCh6Control, "", mDecodeChannelControl, READWRITE, kRegClass_NULL, kRegClass_Channel6, kRegClass_NULL);
275  DefineRegister (kRegCh7Control, "", mDecodeChannelControl, READWRITE, kRegClass_NULL, kRegClass_Channel7, kRegClass_NULL);
276  DefineRegister (kRegCh8Control, "", mDecodeChannelControl, READWRITE, kRegClass_NULL, kRegClass_Channel8, kRegClass_NULL);
277  #if 1 // PCIAccessFrame regs are obsolete
278  DefineRegister (kRegCh1PCIAccessFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_Channel1, kRegClass_NULL);
279  DefineRegister (kRegCh2PCIAccessFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_Channel2, kRegClass_NULL);
280  DefineRegister (kRegCh3PCIAccessFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_Channel3, kRegClass_NULL);
281  DefineRegister (kRegCh4PCIAccessFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_Channel4, kRegClass_NULL);
282  DefineRegister (kRegCh5PCIAccessFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_Channel5, kRegClass_NULL);
283  DefineRegister (kRegCh6PCIAccessFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_Channel6, kRegClass_NULL);
284  DefineRegister (kRegCh7PCIAccessFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_Channel7, kRegClass_NULL);
285  DefineRegister (kRegCh8PCIAccessFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_Channel8, kRegClass_NULL);
286  #endif // PCIAccessFrame regs are obsolete
287  DefineRegister (kRegCh1InputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Input, kRegClass_Channel1, kRegClass_NULL);
288  DefineRegister (kRegCh2InputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Input, kRegClass_Channel2, kRegClass_NULL);
289  DefineRegister (kRegCh3InputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Input, kRegClass_Channel3, kRegClass_NULL);
290  DefineRegister (kRegCh4InputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Input, kRegClass_Channel4, kRegClass_NULL);
291  DefineRegister (kRegCh5InputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Input, kRegClass_Channel5, kRegClass_NULL);
292  DefineRegister (kRegCh6InputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Input, kRegClass_Channel6, kRegClass_NULL);
293  DefineRegister (kRegCh7InputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Input, kRegClass_Channel7, kRegClass_NULL);
294  DefineRegister (kRegCh8InputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Input, kRegClass_Channel8, kRegClass_NULL);
295  DefineRegister (kRegCh1OutputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Output, kRegClass_Channel1, kRegClass_NULL);
296  DefineRegister (kRegCh2OutputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Output, kRegClass_Channel2, kRegClass_NULL);
297  DefineRegister (kRegCh3OutputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Output, kRegClass_Channel3, kRegClass_NULL);
298  DefineRegister (kRegCh4OutputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Output, kRegClass_Channel4, kRegClass_NULL);
299  DefineRegister (kRegCh5OutputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Output, kRegClass_Channel5, kRegClass_NULL);
300  DefineRegister (kRegCh6OutputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Output, kRegClass_Channel6, kRegClass_NULL);
301  DefineRegister (kRegCh7OutputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Output, kRegClass_Channel7, kRegClass_NULL);
302  DefineRegister (kRegCh8OutputFrame, "", mDefaultRegDecoder, READWRITE, kRegClass_Output, kRegClass_Channel8, kRegClass_NULL);
303  DefineRegister (kRegSDIOut1Control, "", mDecodeSDIOutputControl, READWRITE, kRegClass_Output, kRegClass_Channel1, kRegClass_NULL);
304  DefineRegister (kRegSDIOut2Control, "", mDecodeSDIOutputControl, READWRITE, kRegClass_Output, kRegClass_Channel2, kRegClass_NULL);
305  DefineRegister (kRegSDIOut3Control, "", mDecodeSDIOutputControl, READWRITE, kRegClass_Output, kRegClass_Channel3, kRegClass_NULL);
306  DefineRegister (kRegSDIOut4Control, "", mDecodeSDIOutputControl, READWRITE, kRegClass_Output, kRegClass_Channel4, kRegClass_NULL);
307  DefineRegister (kRegSDIOut5Control, "", mDecodeSDIOutputControl, READWRITE, kRegClass_Output, kRegClass_Channel5, kRegClass_NULL);
308  DefineRegister (kRegSDIOut6Control, "", mDecodeSDIOutputControl, READWRITE, kRegClass_Output, kRegClass_Channel6, kRegClass_NULL);
309  DefineRegister (kRegSDIOut7Control, "", mDecodeSDIOutputControl, READWRITE, kRegClass_Output, kRegClass_Channel7, kRegClass_NULL);
310  DefineRegister (kRegSDIOut8Control, "", mDecodeSDIOutputControl, READWRITE, kRegClass_Output, kRegClass_Channel8, kRegClass_NULL);
311  DefineRegister (kRegSDIOut6Control, "", mDecodeSDIOutputControl, READWRITE, kRegClass_Output, kRegClass_Channel6, kRegClass_NULL);
312  DefineRegister (kRegSDIOut7Control, "", mDecodeSDIOutputControl, READWRITE, kRegClass_Output, kRegClass_Channel7, kRegClass_NULL);
313  DefineRegister (kRegSDIOut8Control, "", mDecodeSDIOutputControl, READWRITE, kRegClass_Output, kRegClass_Channel8, kRegClass_NULL);
314 
315  DefineRegister (kRegOutputTimingControl, "", mDecodeSDIOutTimingCtrl,READWRITE, kRegClass_Output, kRegClass_Channel1, kRegClass_NULL);
316  DefineRegister (kRegOutputTimingControlch2, "", mDecodeSDIOutTimingCtrl,READWRITE, kRegClass_Output, kRegClass_Channel2, kRegClass_NULL);
317  DefineRegister (kRegOutputTimingControlch3, "", mDecodeSDIOutTimingCtrl,READWRITE, kRegClass_Output, kRegClass_Channel3, kRegClass_NULL);
318  DefineRegister (kRegOutputTimingControlch4, "", mDecodeSDIOutTimingCtrl,READWRITE, kRegClass_Output, kRegClass_Channel4, kRegClass_NULL);
319  DefineRegister (kRegOutputTimingControlch5, "", mDecodeSDIOutTimingCtrl,READWRITE, kRegClass_Output, kRegClass_Channel5, kRegClass_NULL);
320  DefineRegister (kRegOutputTimingControlch6, "", mDecodeSDIOutTimingCtrl,READWRITE, kRegClass_Output, kRegClass_Channel6, kRegClass_NULL);
321  DefineRegister (kRegOutputTimingControlch7, "", mDecodeSDIOutTimingCtrl,READWRITE, kRegClass_Output, kRegClass_Channel7, kRegClass_NULL);
322 
323  DefineRegister (kRegCh1ControlExtended, "", mDecodeChannelControlExt, READWRITE, kRegClass_NULL, kRegClass_Channel1, kRegClass_NULL);
324  DefineRegister (kRegCh2ControlExtended, "", mDecodeChannelControlExt, READWRITE, kRegClass_NULL, kRegClass_Channel2, kRegClass_NULL);
325  DefineRegister (kRegBoardID, "", mDecodeBoardID, READONLY, kRegClass_Info, kRegClass_NULL, kRegClass_NULL);
326  DefineRegister (kRegFirmwareUserID, "", mDecodeFirmwareUserID, READONLY, kRegClass_Info, kRegClass_NULL, kRegClass_NULL);
327 
328  DefineRegister (kRegCanDoStatus, "", mDecodeCanDoStatus, READONLY, kRegClass_Info, kRegClass_NULL, kRegClass_NULL);
329  DefineRegister (kRegBitfileDate, "", mDecodeBitfileDateTime, READONLY, kRegClass_Info, kRegClass_NULL, kRegClass_NULL);
330  DefineRegister (kRegBitfileTime, "", mDecodeBitfileDateTime, READONLY, kRegClass_Info, kRegClass_NULL, kRegClass_NULL);
331  DefineRegister (kRegCPLDVersion, "", mDecodeCPLDVersion, READONLY, kRegClass_Info, kRegClass_NULL, kRegClass_NULL);
332 
333  DefineRegister (kRegVidIntControl, "", mDecodeVidIntControl, READWRITE, kRegClass_Interrupt, kRegClass_Channel1, kRegClass_Channel2);
334  DefineRegClass (kRegVidIntControl, kRegClass_Channel3);
335  DefineRegClass (kRegVidIntControl, kRegClass_Channel4);
336  DefineRegister (kRegStatus, "", mDecodeStatusReg, READWRITE, kRegClass_Interrupt, kRegClass_Channel1, kRegClass_Channel2);
337  DefineRegClass (kRegStatus, kRegClass_Timecode);
338  DefineRegister (kRegVidIntControl2, "", mDecodeVidIntControl2, READWRITE, kRegClass_Interrupt, kRegClass_Channel5, kRegClass_Channel5);
339  DefineRegClass (kRegVidIntControl2, kRegClass_Channel7);
340  DefineRegClass (kRegVidIntControl2, kRegClass_Channel8);
341  DefineRegister (kRegStatus2, "", mDecodeStatus2Reg, READWRITE, kRegClass_Interrupt, kRegClass_Channel3, kRegClass_Channel4);
342  DefineRegClass (kRegStatus2, kRegClass_Channel5);
343  DefineRegClass (kRegStatus2, kRegClass_Channel6);
344  DefineRegClass (kRegStatus2, kRegClass_Channel7);
345  DefineRegClass (kRegStatus2, kRegClass_Channel8);
346  DefineRegister (kRegInputStatus, "", mDecodeInputStatusReg, READONLY, kRegClass_Input, kRegClass_Channel1, kRegClass_Channel2);
347  DefineRegClass (kRegInputStatus, kRegClass_Audio);
348  DefineRegister (kRegSDIInput3GStatus, "", mDecodeSDIInputStatusReg, READWRITE, kRegClass_Input, kRegClass_Channel1, kRegClass_Channel2);
349  DefineRegister (kRegSDIInput3GStatus2, "", mDecodeSDIInputStatusReg, READWRITE, kRegClass_Input, kRegClass_Channel3, kRegClass_Channel4);
350  DefineRegister (kRegSDI5678Input3GStatus,"",mDecodeSDIInputStatusReg, READWRITE, kRegClass_Input, kRegClass_Channel5, kRegClass_Channel6);
353  DefineRegister (kRegInputStatus2, "", mDecodeSDIInputStatus2Reg, READONLY, kRegClass_Input, kRegClass_Channel3, kRegClass_Channel4); // 288
354  DefineRegister (kRegInput56Status, "", mDecodeSDIInputStatus2Reg, READONLY, kRegClass_Input, kRegClass_Channel5, kRegClass_Channel6); // 458
355  DefineRegister (kRegInput78Status, "", mDecodeSDIInputStatus2Reg, READONLY, kRegClass_Input, kRegClass_Channel7, kRegClass_Channel8); // 459
356 
357  DefineRegister (kRegFS1ReferenceSelect, "", mDecodeFS1RefSelectReg, READWRITE, kRegClass_Input, kRegClass_Timecode, kRegClass_NULL);
358  DefineRegister (kRegSysmonVccIntDieTemp,"", mDecodeSysmonVccIntDieTemp, READONLY, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
359  DefineRegister (kRegSDITransmitControl, "", mDecodeSDITransmitCtrl, READWRITE, kRegClass_Channel1, kRegClass_Channel2, kRegClass_Channel3);
360  DefineRegClass (kRegSDITransmitControl, kRegClass_Channel4);
361  DefineRegClass (kRegSDITransmitControl, kRegClass_Channel5);
362  DefineRegClass (kRegSDITransmitControl, kRegClass_Channel6);
363  DefineRegClass (kRegSDITransmitControl, kRegClass_Channel7);
364  DefineRegClass (kRegSDITransmitControl, kRegClass_Channel8);
365 
366  DefineRegister (kRegConversionControl, "", mConvControlRegDecoder, READWRITE, kRegClass_NULL, kRegClass_Channel1, kRegClass_Channel2);
367  DefineRegister (kRegSDIWatchdogControlStatus, "", mDecodeRelayCtrlStat, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
368  DefineRegister (kRegSDIWatchdogTimeout, "", mDecodeWatchdogTimeout, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
369  DefineRegister (kRegSDIWatchdogKick1, "", mDecodeWatchdogKick, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
370  DefineRegister (kRegSDIWatchdogKick2, "", mDecodeWatchdogKick, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
371  DefineRegister (kRegIDSwitch, "kRegIDSwitch", mDecodeIDSwitchStatus, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
372  DefineRegister (kRegPWMFanControl, "kRegPWMFanControl", mDecodePWMFanControl, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
373  DefineRegister (kRegPWMFanStatus, "kRegPWMFanStatus", mDecodePWMFanMonitor, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
374  }
375  void SetupBOBRegs(void)
376  {
377  AJAAutoLock lock(&mGuardMutex);
378  DefineRegister (kRegBOBStatus, "kRegBOBStatus", mDecodeBOBStatus, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
379  DefineRegister (kRegBOBGPIInData, "kRegBOBGPIInData", mDecodeBOBGPIIn, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
380  DefineRegister (kRegBOBGPIInterruptControl, "kRegBOBGPIInterruptControl", mDecodeBOBGPIInInterruptControl, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
381  DefineRegister (kRegBOBGPIOutData, "kRegBOBGPIOutData", mDecodeBOBGPIOut, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
382  DefineRegister (kRegBOBAudioControl, "kRegBOBAudioControl", mDecodeBOBAudioControl, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
383  }
384  void SetupLEDRegs(void)
385  {
386  AJAAutoLock lock(&mGuardMutex);
387  DefineRegister (kRegLEDReserved0, "kRegLEDReserved0", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
388  DefineRegister (kRegLEDClockDivide, "kRegLEDClockDivide", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
389  DefineRegister (kRegLEDReserved2, "kRegLEDReserved2", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
390  DefineRegister (kRegLEDReserved3, "kRegLEDReserved3", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
391  DefineRegister (kRegLEDSDI1Control, "kRegLEDSDI1Control", mDecodeLEDControl, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
392  DefineRegister (kRegLEDSDI2Control, "kRegLEDSDI2Control", mDecodeLEDControl, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
393  DefineRegister (kRegLEDHDMIInControl, "kRegLEDHDMIInControl", mDecodeLEDControl, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
394  DefineRegister (kRegLEDHDMIOutControl, "kRegLEDHDMIOutControl", mDecodeLEDControl, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
395  }
396  void SetupCMWRegs(void)
397  {
398  AJAAutoLock lock(&mGuardMutex);
399  DefineRegister (kRegCMWControl, "kRegCMWControl", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
400  DefineRegister (kRegCMW1485Out, "kRegCMW1485Out", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
401  DefineRegister (kRegCMW14835Out, "kRegCMW14835Out", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
402  DefineRegister (kRegCMW27Out, "kRegCMW27Out", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
403  DefineRegister (kRegCMW12288Out, "kRegCMW12288Out", mDecodeLEDControl, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
404  DefineRegister (kRegCMWHDMIOut, "kRegCMWHDMIOut", mDecodeLEDControl, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
405  }
406  void SetupVPIDRegs(void)
407  {
408  AJAAutoLock lock(&mGuardMutex);
409  DefineRegister (kRegSDIIn1VPIDA, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel1);
410  DefineRegister (kRegSDIIn1VPIDB, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel1);
411  DefineRegister (kRegSDIOut1VPIDA, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel1);
412  DefineRegister (kRegSDIOut1VPIDB, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel1);
413  DefineRegister (kRegSDIOut2VPIDA, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel1);
414  DefineRegister (kRegSDIOut2VPIDB, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel1);
415  DefineRegister (kRegSDIIn2VPIDA, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel2);
416  DefineRegister (kRegSDIIn2VPIDB, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel2);
417  DefineRegister (kRegSDIOut3VPIDA, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel3);
418  DefineRegister (kRegSDIOut3VPIDB, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel3);
419  DefineRegister (kRegSDIOut4VPIDA, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel4);
420  DefineRegister (kRegSDIOut4VPIDB, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel4);
421  DefineRegister (kRegSDIIn3VPIDA, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel3);
422  DefineRegister (kRegSDIIn3VPIDB, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel3);
423  DefineRegister (kRegSDIIn4VPIDA, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel4);
424  DefineRegister (kRegSDIIn4VPIDB, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel4);
425  DefineRegister (kRegSDIOut5VPIDA, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel5);
426  DefineRegister (kRegSDIOut5VPIDB, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel5);
427  DefineRegister (kRegSDIIn5VPIDA, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel5);
428  DefineRegister (kRegSDIIn5VPIDB, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel5);
429  DefineRegister (kRegSDIIn6VPIDA, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel6);
430  DefineRegister (kRegSDIIn6VPIDB, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel6);
431  DefineRegister (kRegSDIOut6VPIDA, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel6);
432  DefineRegister (kRegSDIOut6VPIDB, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel6);
433  DefineRegister (kRegSDIIn7VPIDA, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel7);
434  DefineRegister (kRegSDIIn7VPIDB, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel7);
435  DefineRegister (kRegSDIOut7VPIDA, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel7);
436  DefineRegister (kRegSDIOut7VPIDB, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel7);
437  DefineRegister (kRegSDIIn8VPIDA, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel8);
438  DefineRegister (kRegSDIIn8VPIDB, "", mVPIDInpRegDecoder, READONLY, kRegClass_VPID, kRegClass_Input, kRegClass_Channel8);
439  DefineRegister (kRegSDIOut8VPIDA, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel8);
440  DefineRegister (kRegSDIOut8VPIDB, "", mVPIDOutRegDecoder, READWRITE, kRegClass_VPID, kRegClass_Output, kRegClass_Channel8);
441  }
442  void SetupTimecodeRegs(void)
443  {
444  AJAAutoLock lock(&mGuardMutex);
445  DefineRegister (kRegRP188InOut1DBB, "", mRP188InOutDBBRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel1, kRegClass_NULL);
446  DefineRegister (kRegRP188InOut1Bits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel1, kRegClass_NULL);
447  DefineRegister (kRegRP188InOut1Bits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel1, kRegClass_NULL);
448  DefineRegister (kRegRP188InOut2DBB, "", mRP188InOutDBBRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel2, kRegClass_NULL);
449  DefineRegister (kRegRP188InOut2Bits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel2, kRegClass_NULL);
450  DefineRegister (kRegRP188InOut2Bits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel2, kRegClass_NULL);
451  DefineRegister (kRegLTCOutBits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel1, kRegClass_Output);
452  DefineRegister (kRegLTCOutBits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel1, kRegClass_Output);
453  DefineRegister (kRegLTCInBits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel1, kRegClass_Input);
454  DefineRegister (kRegLTCInBits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel1, kRegClass_Input);
455  DefineRegister (kRegRP188InOut1Bits0_31_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel1, kRegClass_NULL);
456  DefineRegister (kRegRP188InOut1Bits32_63_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel1, kRegClass_NULL);
457  DefineRegister (kRegRP188InOut2Bits0_31_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel2, kRegClass_NULL);
458  DefineRegister (kRegRP188InOut2Bits32_63_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel2, kRegClass_NULL);
459  DefineRegister (kRegRP188InOut3Bits0_31_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel3, kRegClass_NULL);
460  DefineRegister (kRegRP188InOut3Bits32_63_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel3, kRegClass_NULL);
461  DefineRegister (kRegRP188InOut4Bits0_31_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel4, kRegClass_NULL);
462  DefineRegister (kRegRP188InOut4Bits32_63_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel4, kRegClass_NULL);
463  DefineRegister (kRegRP188InOut5Bits0_31_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel5, kRegClass_NULL);
464  DefineRegister (kRegRP188InOut5Bits32_63_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel5, kRegClass_NULL);
465  DefineRegister (kRegRP188InOut6Bits0_31_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel6, kRegClass_NULL);
466  DefineRegister (kRegRP188InOut6Bits32_63_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel6, kRegClass_NULL);
467  DefineRegister (kRegRP188InOut7Bits0_31_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel7, kRegClass_NULL);
468  DefineRegister (kRegRP188InOut7Bits32_63_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel7, kRegClass_NULL);
469  DefineRegister (kRegRP188InOut8Bits0_31_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel8, kRegClass_NULL);
470  DefineRegister (kRegRP188InOut8Bits32_63_2, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel8, kRegClass_NULL);
471  DefineRegister (kRegLTCStatusControl, "", mLTCStatusControlDecoder, READWRITE, kRegClass_Timecode, kRegClass_NULL, kRegClass_NULL);
472  DefineRegister (kRegLTC2EmbeddedBits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel2, kRegClass_NULL);
473  DefineRegister (kRegLTC2EmbeddedBits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel2, kRegClass_NULL);
474  DefineRegister (kRegLTC2AnalogBits0_31, "", mDefaultRegDecoder, READONLY, kRegClass_Timecode, kRegClass_NULL, kRegClass_NULL);
475  DefineRegister (kRegLTC2AnalogBits32_63, "", mDefaultRegDecoder, READONLY, kRegClass_Timecode, kRegClass_NULL, kRegClass_NULL);
476  DefineRegister (kRegRP188InOut3DBB, "", mRP188InOutDBBRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel3, kRegClass_NULL);
477  DefineRegister (kRegRP188InOut3Bits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel3, kRegClass_NULL);
478  DefineRegister (kRegRP188InOut3Bits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel3, kRegClass_NULL);
479  DefineRegister (kRegRP188InOut4DBB, "", mRP188InOutDBBRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel4, kRegClass_NULL);
480  DefineRegister (kRegRP188InOut4Bits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel4, kRegClass_NULL);
481  DefineRegister (kRegRP188InOut4Bits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel4, kRegClass_NULL);
482  DefineRegister (kRegLTC3EmbeddedBits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel3, kRegClass_NULL);
483  DefineRegister (kRegLTC3EmbeddedBits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel3, kRegClass_NULL);
484  DefineRegister (kRegLTC4EmbeddedBits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel4, kRegClass_NULL);
485  DefineRegister (kRegLTC4EmbeddedBits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel4, kRegClass_NULL);
486  DefineRegister (kRegRP188InOut5Bits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel5, kRegClass_NULL);
487  DefineRegister (kRegRP188InOut5Bits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel5, kRegClass_NULL);
488  DefineRegister (kRegRP188InOut5DBB, "", mRP188InOutDBBRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel5, kRegClass_NULL);
489  DefineRegister (kRegLTC5EmbeddedBits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel5, kRegClass_NULL);
490  DefineRegister (kRegLTC5EmbeddedBits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel5, kRegClass_NULL);
491  DefineRegister (kRegRP188InOut6Bits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel6, kRegClass_NULL);
492  DefineRegister (kRegRP188InOut6Bits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel6, kRegClass_NULL);
493  DefineRegister (kRegRP188InOut6DBB, "", mRP188InOutDBBRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel6, kRegClass_NULL);
494  DefineRegister (kRegLTC6EmbeddedBits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel6, kRegClass_NULL);
495  DefineRegister (kRegLTC6EmbeddedBits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel6, kRegClass_NULL);
496  DefineRegister (kRegRP188InOut7Bits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel7, kRegClass_NULL);
497  DefineRegister (kRegRP188InOut7Bits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel7, kRegClass_NULL);
498  DefineRegister (kRegRP188InOut7DBB, "", mRP188InOutDBBRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel7, kRegClass_NULL);
499  DefineRegister (kRegLTC7EmbeddedBits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel7, kRegClass_NULL);
500  DefineRegister (kRegLTC7EmbeddedBits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel7, kRegClass_NULL);
501  DefineRegister (kRegRP188InOut8Bits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel8, kRegClass_NULL);
502  DefineRegister (kRegRP188InOut8Bits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel8, kRegClass_NULL);
503  DefineRegister (kRegRP188InOut8DBB, "", mRP188InOutDBBRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel8, kRegClass_NULL);
504  DefineRegister (kRegLTC8EmbeddedBits0_31, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel8, kRegClass_NULL);
505  DefineRegister (kRegLTC8EmbeddedBits32_63, "", mDefaultRegDecoder, READWRITE, kRegClass_Timecode, kRegClass_Channel8, kRegClass_NULL);
506  } // SetupTimecodeRegs
507 
508  void SetupAudioRegs(void)
509  {
510  AJAAutoLock lock(&mGuardMutex);
511  DefineRegister (kRegAud1Control, "", mDecodeAudControlReg, READWRITE, kRegClass_Audio, kRegClass_Channel1, kRegClass_NULL);
512  DefineRegister (kRegAud2Control, "", mDecodeAudControlReg, READWRITE, kRegClass_Audio, kRegClass_Channel2, kRegClass_NULL);
513  DefineRegister (kRegAud3Control, "", mDecodeAudControlReg, READWRITE, kRegClass_Audio, kRegClass_Channel3, kRegClass_NULL);
514  DefineRegister (kRegAud4Control, "", mDecodeAudControlReg, READWRITE, kRegClass_Audio, kRegClass_Channel4, kRegClass_NULL);
515  DefineRegister (kRegAud5Control, "", mDecodeAudControlReg, READWRITE, kRegClass_Audio, kRegClass_Channel5, kRegClass_NULL);
516  DefineRegister (kRegAud6Control, "", mDecodeAudControlReg, READWRITE, kRegClass_Audio, kRegClass_Channel6, kRegClass_NULL);
517  DefineRegister (kRegAud7Control, "", mDecodeAudControlReg, READWRITE, kRegClass_Audio, kRegClass_Channel7, kRegClass_NULL);
518  DefineRegister (kRegAud8Control, "", mDecodeAudControlReg, READWRITE, kRegClass_Audio, kRegClass_Channel8, kRegClass_NULL);
519  DefineRegister (kRegAud1Detect, "", mDecodeAudDetectReg, READONLY, kRegClass_Audio, kRegClass_Channel1, kRegClass_Channel2);
520  DefineRegister (kRegAudDetect2, "", mDecodeAudDetectReg, READONLY, kRegClass_Audio, kRegClass_Channel3, kRegClass_Channel4);
521  DefineRegister (kRegAudioDetect5678, "", mDecodeAudDetectReg, READONLY, kRegClass_Audio, kRegClass_Channel8, kRegClass_Channel7);
522  DefineRegClass (kRegAudioDetect5678, kRegClass_Channel6);
523  DefineRegClass (kRegAudioDetect5678, kRegClass_Channel5);
524  DefineRegister (kRegAud1SourceSelect, "", mDecodeAudSourceSelectReg, READWRITE, kRegClass_Audio, kRegClass_Channel1, kRegClass_NULL);
525  DefineRegister (kRegAud2SourceSelect, "", mDecodeAudSourceSelectReg, READWRITE, kRegClass_Audio, kRegClass_Channel2, kRegClass_NULL);
526  DefineRegister (kRegAud3SourceSelect, "", mDecodeAudSourceSelectReg, READWRITE, kRegClass_Audio, kRegClass_Channel3, kRegClass_NULL);
527  DefineRegister (kRegAud4SourceSelect, "", mDecodeAudSourceSelectReg, READWRITE, kRegClass_Audio, kRegClass_Channel4, kRegClass_NULL);
528  DefineRegister (kRegAud5SourceSelect, "", mDecodeAudSourceSelectReg, READWRITE, kRegClass_Audio, kRegClass_Channel5, kRegClass_NULL);
529  DefineRegister (kRegAud6SourceSelect, "", mDecodeAudSourceSelectReg, READWRITE, kRegClass_Audio, kRegClass_Channel6, kRegClass_NULL);
530  DefineRegister (kRegAud7SourceSelect, "", mDecodeAudSourceSelectReg, READWRITE, kRegClass_Audio, kRegClass_Channel7, kRegClass_NULL);
531  DefineRegister (kRegAud8SourceSelect, "", mDecodeAudSourceSelectReg, READWRITE, kRegClass_Audio, kRegClass_Channel8, kRegClass_NULL);
532  DefineRegister (kRegAud1Delay, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel1, kRegClass_NULL);
533  DefineRegister (kRegAud2Delay, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel2, kRegClass_NULL);
534  DefineRegister (kRegAud3Delay, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel3, kRegClass_NULL);
535  DefineRegister (kRegAud4Delay, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel4, kRegClass_NULL);
536  DefineRegister (kRegAud5Delay, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel5, kRegClass_NULL);
537  DefineRegister (kRegAud6Delay, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel6, kRegClass_NULL);
538  DefineRegister (kRegAud7Delay, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel7, kRegClass_NULL);
539  DefineRegister (kRegAud8Delay, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel8, kRegClass_NULL);
540  DefineRegister (kRegAud1OutputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel1, kRegClass_Output);
541  DefineRegister (kRegAud2OutputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel2, kRegClass_Output);
542  DefineRegister (kRegAud3OutputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel3, kRegClass_Output);
543  DefineRegister (kRegAud4OutputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel4, kRegClass_Output);
544  DefineRegister (kRegAud5OutputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel5, kRegClass_Output);
545  DefineRegister (kRegAud6OutputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel6, kRegClass_Output);
546  DefineRegister (kRegAud7OutputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel7, kRegClass_Output);
547  DefineRegister (kRegAud8OutputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel8, kRegClass_Output);
548  DefineRegister (kRegAud1InputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel1, kRegClass_Input);
549  DefineRegister (kRegAud2InputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel2, kRegClass_Input);
550  DefineRegister (kRegAud3InputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel3, kRegClass_Input);
551  DefineRegister (kRegAud4InputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel4, kRegClass_Input);
552  DefineRegister (kRegAud5InputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel5, kRegClass_Input);
553  DefineRegister (kRegAud6InputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel6, kRegClass_Input);
554  DefineRegister (kRegAud7InputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel7, kRegClass_Input);
555  DefineRegister (kRegAud8InputLastAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_Channel8, kRegClass_Input);
556  DefineRegister (kRegPCMControl4321, "", mDecodePCMControlReg, READWRITE, kRegClass_Audio, kRegClass_Channel1, kRegClass_Channel2);
557  DefineRegClass (kRegPCMControl4321, kRegClass_Channel3);
558  DefineRegClass (kRegPCMControl4321, kRegClass_Channel4);
559  DefineRegister (kRegPCMControl8765, "", mDecodePCMControlReg, READWRITE, kRegClass_Audio, kRegClass_Channel5, kRegClass_Channel6);
560  DefineRegClass (kRegPCMControl8765, kRegClass_Channel7);
561  DefineRegClass (kRegPCMControl8765, kRegClass_Channel8);
562  DefineRegister (kRegAud1Counter, "", mDefaultRegDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
563  DefineRegister (kRegAudioOutputSourceMap,"",mDecodeAudOutputSrcMap, READWRITE, kRegClass_Audio, kRegClass_Output, kRegClass_AES);
564  DefineRegClass (kRegAudioOutputSourceMap, kRegClass_HDMI);
565 
566  DefineRegister (kRegAudioMixerInputSelects, "kRegAudioMixerInputSelects", mAudMxrInputSelDecoder, READWRITE, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
567  DefineRegister (kRegAudioMixerMainGain, "kRegAudioMixerMainGain", mAudMxrGainDecoder, READWRITE, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
568  DefineRegister (kRegAudioMixerAux1GainCh1, "kRegAudioMixerAux1GainCh1", mAudMxrGainDecoder, READWRITE, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
569  DefineRegister (kRegAudioMixerAux2GainCh1, "kRegAudioMixerAux2GainCh1", mAudMxrGainDecoder, READWRITE, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
570  DefineRegister (kRegAudioMixerChannelSelect, "kRegAudioMixerChannelSelect", mAudMxrChanSelDecoder, READWRITE, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
571  DefineRegister (kRegAudioMixerMutes, "kRegAudioMixerMutes", mAudMxrMutesDecoder, READWRITE, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
572  DefineRegister (kRegAudioMixerAux1GainCh2, "kRegAudioMixerAux1GainCh2", mAudMxrGainDecoder, READWRITE, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
573  DefineRegister (kRegAudioMixerAux2GainCh2, "kRegAudioMixerAux2GainCh2", mAudMxrGainDecoder, READWRITE, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
574  DefineRegister (kRegAudioMixerAux1InputLevels, "kRegAudioMixerAux1InputLevels", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
575  DefineRegister (kRegAudioMixerAux2InputLevels, "kRegAudioMixerAux2InputLevels", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
576  DefineRegister (kRegAudioMixerMainInputLevelsPair0, "kRegAudioMixerMainInputLevelsPair0", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
577  DefineRegister (kRegAudioMixerMainInputLevelsPair1, "kRegAudioMixerMainInputLevelsPair1", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
578  DefineRegister (kRegAudioMixerMainInputLevelsPair2, "kRegAudioMixerMainInputLevelsPair2", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
579  DefineRegister (kRegAudioMixerMainInputLevelsPair3, "kRegAudioMixerMainInputLevelsPair3", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
580  DefineRegister (kRegAudioMixerMainInputLevelsPair4, "kRegAudioMixerMainInputLevelsPair4", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
581  DefineRegister (kRegAudioMixerMainInputLevelsPair5, "kRegAudioMixerMainInputLevelsPair5", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
582  DefineRegister (kRegAudioMixerMainInputLevelsPair6, "kRegAudioMixerMainInputLevelsPair6", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
583  DefineRegister (kRegAudioMixerMainInputLevelsPair7, "kRegAudioMixerMainInputLevelsPair7", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
584  DefineRegister (kRegAudioMixerMainOutputLevelsPair0, "kRegAudioMixerMainOutputLevelsPair0", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
585  DefineRegister (kRegAudioMixerMainOutputLevelsPair1, "kRegAudioMixerMainOutputLevelsPair1", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
586  DefineRegister (kRegAudioMixerMainOutputLevelsPair2, "kRegAudioMixerMainOutputLevelsPair2", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
587  DefineRegister (kRegAudioMixerMainOutputLevelsPair3, "kRegAudioMixerMainOutputLevelsPair3", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
588  DefineRegister (kRegAudioMixerMainOutputLevelsPair4, "kRegAudioMixerMainOutputLevelsPair4", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
589  DefineRegister (kRegAudioMixerMainOutputLevelsPair5, "kRegAudioMixerMainOutputLevelsPair5", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
590  DefineRegister (kRegAudioMixerMainOutputLevelsPair6, "kRegAudioMixerMainOutputLevelsPair6", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
591  DefineRegister (kRegAudioMixerMainOutputLevelsPair7, "kRegAudioMixerMainOutputLevelsPair7", mAudMxrLevelDecoder, READONLY, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
592  }
593 
594  void SetupMRRegs(void)
595  {
596  AJAAutoLock lock(&mGuardMutex);
597  DefineRegister (kRegMRQ1Control, "kRegMRQ1Control", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
598  DefineRegister (kRegMRQ2Control, "kRegMRQ2Control", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
599  DefineRegister (kRegMRQ3Control, "kRegMRQ3Control", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
600  DefineRegister (kRegMRQ4Control, "kRegMRQ4Control", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
601  DefineRegister (kRegMROutControl, "kRegMROutControl", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
602  DefineRegister (kRegMRSupport, "kRegMRSupport", mDefaultRegDecoder, READWRITE, kRegClass_NULL, kRegClass_NULL, kRegClass_NULL);
603  }
604 
605  void SetupDMARegs(void)
606  {
607  AJAAutoLock lock(&mGuardMutex);
608  DefineRegister (kRegDMA1HostAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
609  DefineRegister (kRegDMA1HostAddrHigh, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
610  DefineRegister (kRegDMA1LocalAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
611  DefineRegister (kRegDMA1XferCount, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
612  DefineRegister (kRegDMA1NextDesc, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
613  DefineRegister (kRegDMA1NextDescHigh, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
614  DefineRegister (kRegDMA2HostAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
615  DefineRegister (kRegDMA2HostAddrHigh, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
616  DefineRegister (kRegDMA2LocalAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
617  DefineRegister (kRegDMA2XferCount, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
618  DefineRegister (kRegDMA2NextDesc, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
619  DefineRegister (kRegDMA2NextDescHigh, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
620  DefineRegister (kRegDMA3HostAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
621  DefineRegister (kRegDMA3HostAddrHigh, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
622  DefineRegister (kRegDMA3LocalAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
623  DefineRegister (kRegDMA3XferCount, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
624  DefineRegister (kRegDMA3NextDesc, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
625  DefineRegister (kRegDMA3NextDescHigh, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
626  DefineRegister (kRegDMA4HostAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
627  DefineRegister (kRegDMA4HostAddrHigh, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
628  DefineRegister (kRegDMA4LocalAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
629  DefineRegister (kRegDMA4XferCount, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
630  DefineRegister (kRegDMA4NextDesc, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
631  DefineRegister (kRegDMA4NextDescHigh, "", mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
632  DefineRegister (kRegDMAControl, "", mDMAControlRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
633  DefineRegister (kRegDMAIntControl, "", mDMAIntControlRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
634  }
635 
636  void SetupXptSelect(void)
637  {
638  AJAAutoLock lock(&mGuardMutex);
639  // RegNum 0-7 8-15 16-23 24-31
646  { // An additional input Xpt for kRegXptSelectGroup6 in mask index 2...
647  const XptRegNumAndMaskIndex regNumAndNdx (kRegXptSelectGroup6, 2);
648  if (mXptRegNumMaskIndex2InputXptMap.find (regNumAndNdx) == mXptRegNumMaskIndex2InputXptMap.end())
649  mXptRegNumMaskIndex2InputXptMap [regNumAndNdx] = NTV2_XptHDMIOutQ1Input;
650  if (mInputXpt2XptRegNumMaskIndexMap.find (NTV2_XptHDMIOutQ1Input) == mInputXpt2XptRegNumMaskIndexMap.end())
651  mInputXpt2XptRegNumMaskIndexMap[NTV2_XptHDMIOutQ1Input] = regNumAndNdx;
652  }
682 
683 
684  // Expose the CanConnect ROM registers:
686  { ostringstream regName; // used to synthesize reg name
687  const ULWord rawInputXpt ((regNum - ULWord(kRegFirstValidXptROMRegister)) / 4UL + ULWord(NTV2_FIRST_INPUT_CROSSPOINT));
688  const ULWord ndx ((regNum - ULWord(kRegFirstValidXptROMRegister)) % 4UL);
689  const NTV2InputXptID inputXpt (NTV2InputXptID(rawInputXpt+0));
690  if (NTV2_IS_VALID_InputCrosspointID(inputXpt))
691  {
692  string inputXptEnumName (::NTV2InputCrosspointIDToString(inputXpt,false)); // e.g. "NTV2_XptFrameBuffer1Input"
693  if (inputXptEnumName.empty())
694  regName << "kRegXptValid" << DEC0N(rawInputXpt,3) << "N" << DEC(ndx);
695  else
696  regName << "kRegXptValid" << aja::replace(inputXptEnumName, "NTV2_Xpt", "") << DEC(ndx);
697  }
698  else
699  regName << "kRegXptValue" << HEX0N(regNum,4);
700  DefineRegister (regNum, regName.str(), mDecodeXptValidReg, READONLY, kRegClass_XptROM, kRegClass_NULL, kRegClass_NULL);
701  }
702  } // SetupXptSelect
703 
704  void SetupAncInsExt(void)
705  {
706  static const string AncExtRegNames [] = { "Control", "F1 Start Address", "F1 End Address",
707  "F2 Start Address", "F2 End Address", "Field Cutoff Lines",
708  "Memory Total", "F1 Memory Usage", "F2 Memory Usage",
709  "V Blank Lines", "Lines Per Frame", "Field ID Lines",
710  "Ignore DID 1-4", "Ignore DID 5-8", "Ignore DID 9-12",
711  "Ignore DID 13-16", "Ignore DID 17-20", "Analog Start Line",
712  "Analog F1 Y Filter", "Analog F2 Y Filter", "Analog F1 C Filter",
713  "Analog F2 C Filter", "", "",
714  "", "", "",
715  "Analog Act Line Len"};
716  static const string AncInsRegNames [] = { "Field Bytes", "Control", "F1 Start Address",
717  "F2 Start Address", "Pixel Delay", "Active Start",
718  "Pixels Per Line", "Lines Per Frame", "Field ID Lines",
719  "Payload ID Control", "Payload ID", "Chroma Blank Lines",
720  "F1 C Blanking Mask", "F2 C Blanking Mask", "Field Bytes High",
721  "Reserved 15", "RTP Payload ID", "RTP SSRC",
722  "IP Channel"};
723  static const uint32_t AncExtPerChlRegBase [] = { 0x1000, 0x1040, 0x1080, 0x10C0, 0x1100, 0x1140, 0x1180, 0x11C0 };
724  static const uint32_t AncInsPerChlRegBase [] = { 0x1200, 0x1240, 0x1280, 0x12C0, 0x1300, 0x1340, 0x1380, 0x13C0 };
725 
726  NTV2_ASSERT(sizeof(AncExtRegNames[0]) == sizeof(AncExtRegNames[1]));
727  NTV2_ASSERT(size_t(regAncExt_LAST) == sizeof(AncExtRegNames)/sizeof(AncExtRegNames[0]));
728  NTV2_ASSERT(size_t(regAncIns_LAST) == sizeof(AncInsRegNames)/sizeof(string));
729 
730  AJAAutoLock lock(&mGuardMutex);
731  for (ULWord offsetNdx (0); offsetNdx < 8; offsetNdx++)
732  {
733  for (ULWord reg(regAncExtControl); reg < regAncExt_LAST; reg++)
734  {
735  if (AncExtRegNames[reg].empty()) continue;
736  ostringstream oss; oss << "Extract " << (offsetNdx+1) << " " << AncExtRegNames[reg];
737  DefineRegName (AncExtPerChlRegBase[offsetNdx] + reg, oss.str());
738  }
739  for (ULWord reg(regAncInsFieldBytes); reg < regAncIns_LAST; reg++)
740  {
741  ostringstream oss; oss << "Insert " << (offsetNdx+1) << " " << AncInsRegNames[reg];
742  DefineRegName (AncInsPerChlRegBase[offsetNdx] + reg, oss.str());
743  }
744  }
745  for (ULWord ndx (0); ndx < 8; ndx++)
746  {
747  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtControl, "", mDecodeAncExtControlReg, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
748  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtField1StartAddress, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
749  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtField1EndAddress, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
750  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtField2StartAddress, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
751  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtField2EndAddress, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
752  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtFieldCutoffLine, "", mDecodeAncExtFieldLines, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
753  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtTotalStatus, "", mDecodeAncExtStatus, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
754  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtField1Status, "", mDecodeAncExtStatus, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
755  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtField2Status, "", mDecodeAncExtStatus, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
756  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtFieldVBLStartLine, "", mDecodeAncExtFieldLines, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
757  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtTotalFrameLines, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
758  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtFID, "", mDecodeAncExtFieldLines, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
759  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtIgnorePacketReg_1_2_3_4, "", mDecodeAncExtIgnoreDIDs, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
760  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtIgnorePacketReg_5_6_7_8, "", mDecodeAncExtIgnoreDIDs, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
761  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtIgnorePacketReg_9_10_11_12, "", mDecodeAncExtIgnoreDIDs, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
762  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtIgnorePacketReg_13_14_15_16, "", mDecodeAncExtIgnoreDIDs, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
763  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtIgnorePacketReg_17_18_19_20, "", mDecodeAncExtIgnoreDIDs, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
764  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtAnalogStartLine, "", mDecodeAncExtFieldLines, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
765  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtField1AnalogYFilter, "", mDecodeAncExtAnalogFilter, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
766  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtField2AnalogYFilter, "", mDecodeAncExtAnalogFilter, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
767  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtField1AnalogCFilter, "", mDecodeAncExtAnalogFilter, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
768  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtField2AnalogCFilter, "", mDecodeAncExtAnalogFilter, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
769  DefineRegister (AncExtPerChlRegBase[ndx] + regAncExtAnalogActiveLineLength, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Input, gChlClasses[ndx]);
770 
771  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsFieldBytes, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
772  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsControl, "", mDecodeAncInsControlReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
773  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsField1StartAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
774  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsField2StartAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
775  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsPixelDelay, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
776  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsActiveStart, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
777  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsLinePixels, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
778  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsFrameLines, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
779  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsFieldIDLines, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
780  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsPayloadIDControl, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
781  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsPayloadID, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
782  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsBlankCStartLine, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
783  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsBlankField1CLines, "", mDecodeAncInsChromaBlankReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
784  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsBlankField2CLines, "", mDecodeAncInsChromaBlankReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
785  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsFieldBytesHigh, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
786  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsRtpPayloadID, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
787  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsRtpSSRC, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
788  DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsIpChannel, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
789  }
790  } // SetupAncInsExt
791 
792  void SetupAuxInsExt(void)
793  {
794  static const string AuxExtRegNames [] = { "Control", "F1 Start Address", "F1 End Address",
795  "F2 Start Address", "", "",
796  "Memory Total", "F1 Memory Usage", "F2 Memory Usage",
797  "V Blank Lines", "Lines Per Frame", "Field ID Lines",
798  "Ignore DID 1-4", "Ignore DID 5-8", "Ignore DID 9-12",
799  "Ignore DID 13-16", "Buffer Fill"};
800  // static const string AncInsRegNames [] = { "Field Bytes", "Control", "F1 Start Address",
801  // "F2 Start Address", "Pixel Delay", "Active Start",
802  // "Pixels Per Line", "Lines Per Frame", "Field ID Lines",
803  // "Payload ID Control", "Payload ID", "Chroma Blank Lines",
804  // "F1 C Blanking Mask", "F2 C Blanking Mask", "Field Bytes High",
805  // "Reserved 15", "RTP Payload ID", "RTP SSRC",
806  // "IP Channel"};
807  static const uint32_t AuxExtPerChlRegBase [] = { 7616, 7680, 7744, 7808 };
808  static const uint32_t AuxInsPerChlRegBase [] = { 4608, 4672, 4736, 4800 };
809  NTV2_UNUSED(AuxInsPerChlRegBase);
810 
811  NTV2_ASSERT(sizeof(AuxExtRegNames[0]) == sizeof(AuxExtRegNames[1]));
812  NTV2_ASSERT(size_t(regAuxExt_LAST) == sizeof(AuxExtRegNames)/sizeof(AuxExtRegNames[0]));
813  //NTV2_ASSERT(size_t(regAncIns_LAST) == sizeof(AncInsRegNames)/sizeof(string));
814 
815  AJAAutoLock lock(&mGuardMutex);
816  for (ULWord offsetNdx (0); offsetNdx < 4; offsetNdx++)
817  {
818  for (ULWord reg(regAuxExtControl); reg < regAuxExt_LAST; reg++)
819  {
820  if (AuxExtRegNames[reg].empty()) continue;
821  ostringstream oss; oss << "Extract " << (offsetNdx+1) << " " << AuxExtRegNames[reg];
822  DefineRegName (AuxExtPerChlRegBase[offsetNdx] + reg, oss.str());
823  }
824  // for (ULWord reg(regAncInsFieldBytes); reg < regAncIns_LAST; reg++)
825  // {
826  // ostringstream oss; oss << "Insert " << (offsetNdx+1) << " " << AncInsRegNames[reg];
827  // DefineRegName (AncInsPerChlRegBase[offsetNdx] + reg, oss.str());
828  // }
829  }
830  for (ULWord ndx (0); ndx < 4; ndx++)
831  {
832  // Some of the decoders are shared with Anc
833  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtControl, "", mDecodeAuxExtControlReg, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
834  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtField1StartAddress, "", mDefaultRegDecoder, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
835  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtField1EndAddress, "", mDefaultRegDecoder, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
836  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtField2StartAddress, "", mDefaultRegDecoder, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
837  // DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExt4, "", mDefaultRegDecoder, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
838  // DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExt5, "", mDefaultRegDecoder, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
839  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtTotalStatus, "", mDecodeAncExtStatus, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
840  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtField1Status, "", mDecodeAncExtStatus, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
841  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtField2Status, "", mDecodeAncExtStatus, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
842  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtFieldVBLStartLine, "", mDecodeAncExtFieldLines, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
843  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtTotalFrameLines, "", mDefaultRegDecoder, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
844  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtFID, "", mDecodeAncExtFieldLines, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
845  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtPacketMask0, "", mDecodeAncExtIgnoreDIDs, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
846  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtPacketMask1, "", mDecodeAncExtIgnoreDIDs, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
847  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtPacketMask2, "", mDecodeAncExtIgnoreDIDs, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
848  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtPacketMask3, "", mDecodeAncExtIgnoreDIDs, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
849  DefineRegister (AuxExtPerChlRegBase[ndx] + regAuxExtFillData, "", mDefaultRegDecoder, READWRITE, kRegClass_Aux, kRegClass_Input, gChlClasses[ndx]);
850 
851 
852  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsFieldBytes, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
853  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsControl, "", mDecodeAncInsControlReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
854  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsField1StartAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
855  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsField2StartAddr, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
856  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsPixelDelay, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
857  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsActiveStart, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
858  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsLinePixels, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
859  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsFrameLines, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
860  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsFieldIDLines, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
861  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsPayloadIDControl, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
862  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsPayloadID, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
863  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsBlankCStartLine, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
864  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsBlankField1CLines, "", mDecodeAncInsChromaBlankReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
865  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsBlankField2CLines, "", mDecodeAncInsChromaBlankReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
866  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsFieldBytesHigh, "", mDecodeAncInsValuePairReg, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
867  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsRtpPayloadID, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
868  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsRtpSSRC, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
869  // DefineRegister (AncInsPerChlRegBase[ndx] + regAncInsIpChannel, "", mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_Output, gChlClasses[ndx]);
870  }
871  } // SetupAuxInsExt
872 
873  void SetupHDMIRegs(void)
874  {
875  AJAAutoLock lock(&mGuardMutex);
876  DefineRegister (kRegHDMIOutControl, "", mDecodeHDMIOutputControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
877  DefineRegister (kRegHDMIInputStatus, "", mDecodeHDMIInputStatus, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
878  DefineRegister (kRegHDMIInputControl, "", mDecodeHDMIInputControl, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
879  DefineRegister (kRegHDMIHDRGreenPrimary, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
880  DefineRegister (kRegHDMIHDRBluePrimary, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
881  DefineRegister (kRegHDMIHDRRedPrimary, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
882  DefineRegister (kRegHDMIHDRWhitePoint, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
883  DefineRegister (kRegHDMIHDRMasteringLuminence, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
884  DefineRegister (kRegHDMIHDRLightLevel, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
885  DefineRegister (kRegHDMIHDRControl, "", mDecodeHDMIOutHDRControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
886  DefineRegister (kRegMRQ1Control, "", mDecodeHDMIOutMRControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
887  DefineRegister (kRegMRQ2Control, "", mDecodeHDMIOutMRControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
888  DefineRegister (kRegMRQ3Control, "", mDecodeHDMIOutMRControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
889  DefineRegister (kRegMRQ4Control, "", mDecodeHDMIOutMRControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
890  DefineRegister (kRegHDMIV2I2C1Control, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
891  DefineRegister (kRegHDMIV2I2C1Data, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
892  DefineRegister (kRegHDMIV2VideoSetup, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
893  DefineRegister (kRegHDMIV2HSyncDurationAndBackPorch, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
894  DefineRegister (kRegHDMIV2HActive, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
895  DefineRegister (kRegHDMIV2VSyncDurationAndBackPorchField1, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
896  DefineRegister (kRegHDMIV2VSyncDurationAndBackPorchField2, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
897  DefineRegister (kRegHDMIV2VActiveField1, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
898  DefineRegister (kRegHDMIV2VActiveField2, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
899  DefineRegister (kRegHDMIV2VideoStatus, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
900  DefineRegister (kRegHDMIV2HorizontalMeasurements, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
901  DefineRegister (kRegHDMIV2HBlankingMeasurements, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
902  DefineRegister (kRegHDMIV2HBlankingMeasurements1, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
903  DefineRegister (kRegHDMIV2VerticalMeasurementsField0, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
904  DefineRegister (kRegHDMIV2VerticalMeasurementsField1, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
905  DefineRegister (kRegHDMIV2i2c2Control, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
906  DefineRegister (kRegHDMIV2i2c2Data, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
907 
908  DefineRegister (kVRegHDMIOutControl1, "", mDecodeHDMIOutputControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
909  DefineRegister (kVRegHDMIInputStatus1, "", mDecodeHDMIInputStatus, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
910  DefineRegister (kVRegHDMIInputControl1, "", mDecodeHDMIInputControl, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
911  DefineRegister (kVRegHDMIOutStatus1, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
912  DefineRegister (kVRegHDMIOutHDRGreenPrimary1, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
913  DefineRegister (kVRegHDMIOutHDRBluePrimary1, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
914  DefineRegister (kVRegHDMIOutHDRRedPrimary1, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
915  DefineRegister (kVRegHDMIOutHDRWhitePoint1, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
916  DefineRegister (kVRegHDMIOutHDRMasterLuminance1, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
917  DefineRegister (kVRegHDMIOutHDRLightLevel1, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
918  DefineRegister (kVRegHDMIOutHDRControl1, "", mDecodeHDMIOutHDRControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
919 
920  DefineRegister (kVRegHDMIOutControl2, "", mDecodeHDMIOutputControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
921  DefineRegister (kVRegHDMIInputStatus2, "", mDecodeHDMIInputStatus, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
922  DefineRegister (kVRegHDMIInputControl2, "", mDecodeHDMIInputControl, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
923  DefineRegister (kVRegHDMIOutStatus2, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
924  DefineRegister (kVRegHDMIOutHDRGreenPrimary2, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
925  DefineRegister (kVRegHDMIOutHDRBluePrimary2, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
926  DefineRegister (kVRegHDMIOutHDRRedPrimary2, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
927  DefineRegister (kVRegHDMIOutHDRWhitePoint2, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
928  DefineRegister (kVRegHDMIOutHDRMasterLuminance2, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
929  DefineRegister (kVRegHDMIOutHDRLightLevel2, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
930  DefineRegister (kVRegHDMIOutHDRControl2, "", mDecodeHDMIOutHDRControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
931 
932  DefineRegister (kVRegHDMIOutControl3, "", mDecodeHDMIOutputControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
933  DefineRegister (kVRegHDMIInputStatus3, "", mDecodeHDMIInputStatus, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
934  DefineRegister (kVRegHDMIInputControl3, "", mDecodeHDMIInputControl, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
935  DefineRegister (kVRegHDMIOutStatus3, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
936  DefineRegister (kVRegHDMIOutHDRGreenPrimary3, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
937  DefineRegister (kVRegHDMIOutHDRBluePrimary3, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
938  DefineRegister (kVRegHDMIOutHDRRedPrimary3, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
939  DefineRegister (kVRegHDMIOutHDRWhitePoint3, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
940  DefineRegister (kVRegHDMIOutHDRMasterLuminance3, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
941  DefineRegister (kVRegHDMIOutHDRLightLevel3, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
942  DefineRegister (kVRegHDMIOutHDRControl3, "", mDecodeHDMIOutHDRControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
943 
944  DefineRegister (kVRegHDMIOutControl4, "", mDecodeHDMIOutputControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
945  DefineRegister (kVRegHDMIInputStatus4, "", mDecodeHDMIInputStatus, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
946  DefineRegister (kVRegHDMIInputControl4, "", mDecodeHDMIInputControl, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
947  DefineRegister (kVRegHDMIOutStatus4, "", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
948  DefineRegister (kVRegHDMIOutHDRGreenPrimary4, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
949  DefineRegister (kVRegHDMIOutHDRBluePrimary4, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
950  DefineRegister (kVRegHDMIOutHDRRedPrimary4, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
951  DefineRegister (kVRegHDMIOutHDRWhitePoint4, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
952  DefineRegister (kVRegHDMIOutHDRMasterLuminance4, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
953  DefineRegister (kVRegHDMIOutHDRLightLevel4, "", mDecodeHDMIOutHDRPrimary, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
954  DefineRegister (kVRegHDMIOutHDRControl4, "", mDecodeHDMIOutHDRControl, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_HDR);
955 
956  DefineRegister (0x1d00, "reg_hdmiin4_videocontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
957  DefineRegister (0x1d01, "reg_hdmiin4_videodetect0", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
958  DefineRegister (0x1d02, "reg_hdmiin4_videodetect1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
959  DefineRegister (0x1d03, "reg_hdmiin4_videodetect2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
960  DefineRegister (0x1d04, "reg_hdmiin4_videodetect3", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
961  DefineRegister (0x1d05, "reg_hdmiin4_videodetect4", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
962  DefineRegister (0x1d06, "reg_hdmiin4_videodetect5", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
963  DefineRegister (0x1d07, "reg_hdmiin4_videodetect6", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
964  DefineRegister (0x1d08, "reg_hdmiin4_videodetect7", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
965  DefineRegister (0x1d09, "reg_hdmiin4_auxcontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
966  DefineRegister (0x1d0a, "reg_hdmiin4_receiverstatus", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
967  DefineRegister (0x1d0b, "reg_hdmiin4_auxpacketignore0", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
968  DefineRegister (0x1d0c, "reg_hdmiin4_auxpacketignore1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
969  DefineRegister (0x1d0d, "reg_hdmiin4_auxpacketignore2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
970  DefineRegister (0x1d0e, "reg_hdmiin4_auxpacketignore3", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
971  DefineRegister (0x1d0f, "reg_hdmiin4_redrivercontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
972  DefineRegister (0x1d10, "reg_hdmiin4_refclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
973  DefineRegister (0x1d11, "reg_hdmiin4_tmdsclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
974  DefineRegister (0x1d12, "reg_hdmiin4_rxclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
975  DefineRegister (0x1d13, "reg_hdmiin4_rxoversampling", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
976  DefineRegister (0x1d14, "reg_hdmiin4_output_config", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
977  DefineRegister (0x1d15, "reg_hdmiin4_input_status", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
978  DefineRegister (0x1d16, "reg_hdmiin4_control", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
979  DefineRegister (0x1d1e, "reg_hdmiin4_croplocation", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
980  DefineRegister (0x1d1f, "reg_hdmiin4_pixelcontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel1);
981 
982  DefineRegister (0x2500, "reg_hdmiin4_videocontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
983  DefineRegister (0x2501, "reg_hdmiin4_videodetect0", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
984  DefineRegister (0x2502, "reg_hdmiin4_videodetect1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
985  DefineRegister (0x2503, "reg_hdmiin4_videodetect2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
986  DefineRegister (0x2504, "reg_hdmiin4_videodetect3", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
987  DefineRegister (0x2505, "reg_hdmiin4_videodetect4", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
988  DefineRegister (0x2506, "reg_hdmiin4_videodetect5", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
989  DefineRegister (0x2507, "reg_hdmiin4_videodetect6", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
990  DefineRegister (0x2508, "reg_hdmiin4_videodetect7", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
991  DefineRegister (0x2509, "reg_hdmiin4_auxcontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
992  DefineRegister (0x250a, "reg_hdmiin4_receiverstatus", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
993  DefineRegister (0x250b, "reg_hdmiin4_auxpacketignore0", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
994  DefineRegister (0x250c, "reg_hdmiin4_auxpacketignore1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
995  DefineRegister (0x250d, "reg_hdmiin4_auxpacketignore2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
996  DefineRegister (0x250e, "reg_hdmiin4_auxpacketignore3", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
997  DefineRegister (0x250f, "reg_hdmiin4_redrivercontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
998  DefineRegister (0x2510, "reg_hdmiin4_refclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
999  DefineRegister (0x2511, "reg_hdmiin4_tmdsclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
1000  DefineRegister (0x2512, "reg_hdmiin4_rxclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
1001  DefineRegister (0x2513, "reg_hdmiin4_rxoversampling", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
1002  DefineRegister (0x2514, "reg_hdmiin4_output_config", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
1003  DefineRegister (0x2515, "reg_hdmiin4_input_status", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
1004  DefineRegister (0x2516, "reg_hdmiin4_control", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
1005  DefineRegister (0x251e, "reg_hdmiin4_croplocation", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
1006  DefineRegister (0x251f, "reg_hdmiin4_pixelcontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel2);
1007 
1008  DefineRegister (0x2c00, "reg_hdmiin_i2c_control", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1009  DefineRegister (0x2c01, "reg_hdmiin_i2c_data", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1010  DefineRegister (0x2c02, "reg_hdmiin_video_setup", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1011  DefineRegister (0x2c03, "reg_hdmiin_hsync_duration", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1012  DefineRegister (0x2c04, "reg_hdmiin_h_active", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1013  DefineRegister (0x2c05, "reg_hdmiin_vsync_duration_fld1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1014  DefineRegister (0x2c06, "reg_hdmiin_vsync_duration_fld2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1015  DefineRegister (0x2c07, "reg_hdmiin_v_active_fld1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1016  DefineRegister (0x2c08, "reg_hdmiin_v_active_fld2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1017  DefineRegister (0x2c09, "reg_hdmiin_video_status", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1018  DefineRegister (0x2c0a, "reg_hdmiin_horizontal_data", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1019  DefineRegister (0x2c0b, "reg_hdmiin_hblank_data0", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1020  DefineRegister (0x2c0c, "reg_hdmiin_hblank_data1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1021  DefineRegister (0x2c0d, "reg_hdmiin_vertical_data_fld1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1022  DefineRegister (0x2c0e, "reg_hdmiin_vertical_data_fld2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1023  DefineRegister (0x2c0f, "reg_hdmiin_color_depth", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1024  DefineRegister (0x2c12, "reg_hdmiin_output_config", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1025  DefineRegister (0x2c13, "reg_hdmiin_input_status", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1026  DefineRegister (0x2c14, "reg_hdmiin_control", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel3);
1027 
1028  DefineRegister (0x3000, "reg_hdmiin_i2c_control", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1029  DefineRegister (0x3001, "reg_hdmiin_i2c_data", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1030  DefineRegister (0x3002, "reg_hdmiin_video_setup", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1031  DefineRegister (0x3003, "reg_hdmiin_hsync_duration", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1032  DefineRegister (0x3004, "reg_hdmiin_h_active", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1033  DefineRegister (0x3005, "reg_hdmiin_vsync_duration_fld1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1034  DefineRegister (0x3006, "reg_hdmiin_vsync_duration_fld2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1035  DefineRegister (0x3007, "reg_hdmiin_v_active_fld1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1036  DefineRegister (0x3008, "reg_hdmiin_v_active_fld2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1037  DefineRegister (0x3009, "reg_hdmiin_video_status", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1038  DefineRegister (0x300a, "reg_hdmiin_horizontal_data", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1039  DefineRegister (0x300b, "reg_hdmiin_hblank_data0", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1040  DefineRegister (0x300c, "reg_hdmiin_hblank_data1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1041  DefineRegister (0x300d, "reg_hdmiin_vertical_data_fld1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1042  DefineRegister (0x300e, "reg_hdmiin_vertical_data_fld2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1043  DefineRegister (0x300f, "reg_hdmiin_color_depth", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1044  DefineRegister (0x3012, "reg_hdmiin_output_config", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1045  DefineRegister (0x3013, "reg_hdmiin_input_status", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1046  DefineRegister (0x3014, "reg_hdmiin_control", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_Channel4);
1047 
1048  DefineRegister (0x1d40, "reg_hdmiout4_videocontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1049  DefineRegister (0x1d41, "reg_hdmiout4_videosetup0", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1050  DefineRegister (0x1d42, "reg_hdmiout4_videosetup1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1051  DefineRegister (0x1d43, "reg_hdmiout4_videosetup2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1052  DefineRegister (0x1d44, "reg_hdmiout4_videosetup3", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1053  DefineRegister (0x1d45, "reg_hdmiout4_videosetup4", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1054  DefineRegister (0x1d46, "reg_hdmiout4_videosetup5", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1055  DefineRegister (0x1d47, "reg_hdmiout4_videosetup6", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1056  DefineRegister (0x1d48, "reg_hdmiout4_videosetup7", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1057  DefineRegister (0x1d49, "reg_hdmiout4_auxcontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1058  DefineRegister (0x1d4b, "reg_hdmiout4_audiocontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1059  DefineRegister (0x1d4f, "reg_hdmiout4_redrivercontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1060  DefineRegister (0x1d50, "reg_hdmiout4_refclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1061  DefineRegister (0x1d51, "reg_hdmiout4_tmdsclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1062  DefineRegister (0x1d52, "reg_hdmiout4_txclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1063  DefineRegister (0x1d53, "reg_hdmiout4_fpllclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1064  DefineRegister (0x1d54, "reg_hdmiout4_audio_cts1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1065  DefineRegister (0x1d55, "reg_hdmiout4_audio_cts2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1066  DefineRegister (0x1d56, "reg_hdmiout4_audio_cts3", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1067  DefineRegister (0x1d57, "reg_hdmiout4_audio_cts4", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1068  DefineRegister (0x1d58, "reg_hdmiout4_audio_n", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1069  DefineRegister (0x1d5e, "reg_hdmiout4_croplocation", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1070  DefineRegister (0x1d5f, "reg_hdmiout4_pixelcontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1071  DefineRegister (0x1d60, "reg_hdmiout4_i2ccontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1072  DefineRegister (0x1d61, "reg_hdmiout4_i2cedid", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel1);
1073 
1074  DefineRegister (0x1d80, "reg_hdmiout4_videocontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1075  DefineRegister (0x1d81, "reg_hdmiout4_videosetup0", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1076  DefineRegister (0x1d82, "reg_hdmiout4_videosetup1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1077  DefineRegister (0x1d83, "reg_hdmiout4_videosetup2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1078  DefineRegister (0x1d84, "reg_hdmiout4_videosetup3", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1079  DefineRegister (0x1d85, "reg_hdmiout4_videosetup4", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1080  DefineRegister (0x1d86, "reg_hdmiout4_videosetup5", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1081  DefineRegister (0x1d87, "reg_hdmiout4_videosetup6", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1082  DefineRegister (0x1d88, "reg_hdmiout4_videosetup7", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1083  DefineRegister (0x1d89, "reg_hdmiout4_auxcontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1084  DefineRegister (0x1d8b, "reg_hdmiout4_audiocontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1085  DefineRegister (0x1d8f, "reg_hdmiout4_redrivercontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1086  DefineRegister (0x1d90, "reg_hdmiout4_refclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1087  DefineRegister (0x1d91, "reg_hdmiout4_tmdsclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1088  DefineRegister (0x1d92, "reg_hdmiout4_txclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1089  DefineRegister (0x1d93, "reg_hdmiout4_fpllclockfrequency", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1090  DefineRegister (0x1d94, "reg_hdmiout4_audio_cts1", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1091  DefineRegister (0x1d95, "reg_hdmiout4_audio_cts2", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1092  DefineRegister (0x1d96, "reg_hdmiout4_audio_cts3", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1093  DefineRegister (0x1d97, "reg_hdmiout4_audio_cts4", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1094  DefineRegister (0x1d98, "reg_hdmiout4_audio_n", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1095  DefineRegister (0x1d9e, "reg_hdmiout4_croplocation", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1096  DefineRegister (0x1d9f, "reg_hdmiout4_pixelcontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1097  DefineRegister (0x1da0, "reg_hdmiout4_i2ccontrol", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1098  DefineRegister (0x1da1, "reg_hdmiout4_i2cedid", mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_Channel2);
1099  }
1100 
1101  void SetupSDIErrorRegs(void)
1102  {
1104  static const string suffixes [] = {"Status", "CRCErrorCount", "FrameCountLow", "FrameCountHigh", "FrameRefCountLow", "FrameRefCountHigh"};
1105  static const int perms [] = {READWRITE, READWRITE, READWRITE, READWRITE, READONLY, READONLY};
1106 
1107  AJAAutoLock lock(&mGuardMutex);
1108  for (ULWord chan (0); chan < 8; chan++)
1109  for (UWord ndx(0); ndx < 6; ndx++)
1110  {
1111  ostringstream ossName; ossName << "kRegRXSDI" << DEC(chan+1) << suffixes[ndx];
1112  const string & regName (ossName.str());
1113  const uint32_t regNum (baseNum[chan] + ndx);
1114  const int perm (perms[ndx]);
1115  if (ndx == 0)
1116  DefineRegister (regNum, regName, mSDIErrorStatusRegDecoder, perm, kRegClass_SDIError, gChlClasses[chan], kRegClass_Input);
1117  else if (ndx == 1)
1118  DefineRegister (regNum, regName, mSDIErrorCountRegDecoder, perm, kRegClass_SDIError, gChlClasses[chan], kRegClass_Input);
1119  else
1120  DefineRegister (regNum, regName, mDefaultRegDecoder, perm, kRegClass_SDIError, gChlClasses[chan], kRegClass_Input);
1121  }
1122  DefineRegister (kRegRXSDIFreeRunningClockLow, "kRegRXSDIFreeRunningClockLow", mDefaultRegDecoder, READONLY, kRegClass_SDIError, kRegClass_NULL, kRegClass_NULL);
1123  DefineRegister (kRegRXSDIFreeRunningClockHigh, "kRegRXSDIFreeRunningClockHigh", mDefaultRegDecoder, READONLY, kRegClass_SDIError, kRegClass_NULL, kRegClass_NULL);
1124  } // SetupSDIErrorRegs
1125 
1126  void SetupLUTRegs (void)
1127  {
1128  AJAAutoLock lock(&mGuardMutex);
1129  }
1130 
1131  void SetupCSCRegs(void)
1132  {
1134 
1135  AJAAutoLock lock(&mGuardMutex);
1136  for (unsigned num(0); num < 8; num++)
1137  {
1138  ostringstream ossRegName; ossRegName << "kRegEnhancedCSC" << (num+1);
1139  const string & chanClass (sChan[num]); const string rootName (ossRegName.str());
1140  const string modeName (rootName + "Mode"); const string inOff01Name (rootName + "InOffset0_1"); const string inOff2Name (rootName + "InOffset2");
1141  const string coeffA0Name (rootName + "CoeffA0"); const string coeffA1Name (rootName + "CoeffA1"); const string coeffA2Name (rootName + "CoeffA2");
1142  const string coeffB0Name (rootName + "CoeffB0"); const string coeffB1Name (rootName + "CoeffB1"); const string coeffB2Name (rootName + "CoeffB2");
1143  const string coeffC0Name (rootName + "CoeffC0"); const string coeffC1Name (rootName + "CoeffC1"); const string coeffC2Name (rootName + "CoeffC2");
1144  const string outOffABName(rootName + "OutOffsetA_B"); const string outOffCName (rootName + "OutOffsetC");
1145  const string keyModeName (rootName + "KeyMode"); const string keyClipOffName (rootName + "KeyClipOffset"); const string keyGainName (rootName + "KeyGain");
1146  DefineRegister (64*num + kRegEnhancedCSC1Mode, modeName, mEnhCSCModeDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1147  DefineRegister (64*num + kRegEnhancedCSC1InOffset0_1, inOff01Name, mEnhCSCOffsetDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1148  DefineRegister (64*num + kRegEnhancedCSC1InOffset2, inOff2Name, mEnhCSCOffsetDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1149  DefineRegister (64*num + kRegEnhancedCSC1CoeffA0, coeffA0Name, mEnhCSCCoeffDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1150  DefineRegister (64*num + kRegEnhancedCSC1CoeffA1, coeffA1Name, mEnhCSCCoeffDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1151  DefineRegister (64*num + kRegEnhancedCSC1CoeffA2, coeffA2Name, mEnhCSCCoeffDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1152  DefineRegister (64*num + kRegEnhancedCSC1CoeffB0, coeffB0Name, mEnhCSCCoeffDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1153  DefineRegister (64*num + kRegEnhancedCSC1CoeffB1, coeffB1Name, mEnhCSCCoeffDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1154  DefineRegister (64*num + kRegEnhancedCSC1CoeffB2, coeffB2Name, mEnhCSCCoeffDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1155  DefineRegister (64*num + kRegEnhancedCSC1CoeffC0, coeffC0Name, mEnhCSCCoeffDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1156  DefineRegister (64*num + kRegEnhancedCSC1CoeffC1, coeffC1Name, mEnhCSCCoeffDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1157  DefineRegister (64*num + kRegEnhancedCSC1CoeffC2, coeffC2Name, mEnhCSCCoeffDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1158  DefineRegister (64*num + kRegEnhancedCSC1OutOffsetA_B, outOffABName, mEnhCSCOffsetDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1159  DefineRegister (64*num + kRegEnhancedCSC1OutOffsetC, outOffCName, mEnhCSCOffsetDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1160  DefineRegister (64*num + kRegEnhancedCSC1KeyMode, keyModeName, mEnhCSCKeyModeDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1161  DefineRegister (64*num + kRegEnhancedCSC1KeyClipOffset, keyClipOffName, mEnhCSCOffsetDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1162  DefineRegister (64*num + kRegEnhancedCSC1KeyGain, keyGainName, mEnhCSCCoeffDecoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1163  }
1172  for (unsigned chan(0); chan < 8; chan++)
1173  {
1174  const string & chanClass (sChan[chan]);
1175  DefineRegister (sECSCRegs[chan][0], "", mCSCoeff1234Decoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1176  DefineRegister (sECSCRegs[chan][1], "", mCSCoeff1234Decoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1177  DefineRegister (sECSCRegs[chan][2], "", mCSCoeff567890Decoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1178  DefineRegister (sECSCRegs[chan][3], "", mCSCoeff567890Decoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1179  DefineRegister (sECSCRegs[chan][4], "", mCSCoeff567890Decoder, READWRITE, kRegClass_CSC, chanClass, kRegClass_NULL);
1180  }
1181 
1182  // LUT/ColorCorrection Registers...
1183  DefineRegister (kRegCh1ColorCorrectionControl, "", mLUTV1ControlRegDecoder, READWRITE, kRegClass_LUT, kRegClass_NULL, kRegClass_NULL);
1184  DefineRegister (kRegCh2ColorCorrectionControl, "", mLUTV1ControlRegDecoder, READWRITE, kRegClass_LUT, kRegClass_NULL, kRegClass_NULL);
1185  DefineRegister (kRegLUTV2Control, "", mLUTV2ControlRegDecoder, READWRITE, kRegClass_LUT, kRegClass_NULL, kRegClass_NULL);
1186  // LUT tables...
1187 #if 1 // V2 tables need the appropriate Enable & Bank bits set in kRegLUTV2Control, otherwise they'll always readback zero!
1188  // So it's kinda pointless to read/decode them unless we do the "bank-select" dance immediately before reading them...
1190  for (ULWord ndx(0); ndx < 512; ndx++)
1191  {
1192  ostringstream regNameR, regNameG, regNameB;
1193  regNameR << "kRegLUTRed" << DEC0N(ndx,3); regNameG << "kRegLUTGreen" << DEC0N(ndx,3); regNameB << "kRegLUTBlue" << DEC0N(ndx,3);
1194  DefineRegister (REDreg + ndx, regNameR.str(), mLUTDecoder, READWRITE, kRegClass_LUT, kRegClass_NULL, kRegClass_NULL);
1195  DefineRegister (GRNreg + ndx, regNameG.str(), mLUTDecoder, READWRITE, kRegClass_LUT, kRegClass_NULL, kRegClass_NULL);
1196  DefineRegister (BLUreg + ndx, regNameB.str(), mLUTDecoder, READWRITE, kRegClass_LUT, kRegClass_NULL, kRegClass_NULL);
1197  }
1198 #endif
1199  } // SetupCSCRegs
1200 
1201  void SetupMixerKeyerRegs(void)
1202  {
1203  AJAAutoLock lock(&mGuardMutex);
1204  // VidProc/Mixer/Keyer
1205  DefineRegister (kRegVidProc1Control, "", mVidProcControlRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel1, kRegClass_Channel2);
1206  DefineRegister (kRegVidProc2Control, "", mVidProcControlRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel3, kRegClass_Channel4);
1207  DefineRegister (kRegVidProc3Control, "", mVidProcControlRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel5, kRegClass_Channel6);
1208  DefineRegister (kRegVidProc4Control, "", mVidProcControlRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel7, kRegClass_Channel8);
1209  DefineRegister (kRegSplitControl, "", mSplitControlRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel1, kRegClass_NULL);
1210  DefineRegister (kRegFlatMatteValue, "", mFlatMatteValueRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel1, kRegClass_Channel2);
1211  DefineRegister (kRegFlatMatte2Value, "", mFlatMatteValueRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel3, kRegClass_Channel4);
1212  DefineRegister (kRegFlatMatte3Value, "", mFlatMatteValueRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel5, kRegClass_Channel6);
1213  DefineRegister (kRegFlatMatte4Value, "", mFlatMatteValueRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel7, kRegClass_Channel8);
1214  DefineRegister (kRegMixer1Coefficient, "", mDefaultRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel1, kRegClass_Channel2);
1215  DefineRegister (kRegMixer2Coefficient, "", mDefaultRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel3, kRegClass_Channel4);
1216  DefineRegister (kRegMixer3Coefficient, "", mDefaultRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel5, kRegClass_Channel6);
1217  DefineRegister (kRegMixer4Coefficient, "", mDefaultRegDecoder, READWRITE, kRegClass_Mixer, kRegClass_Channel7, kRegClass_Channel8);
1218  }
1219 
1220  void SetupNTV4FrameStoreRegs(void)
1221  {
1222  for (ULWord fsNdx(0); fsNdx < 4; fsNdx++)
1223  {
1224  for (ULWord regNdx(0); regNdx < ULWord(regNTV4FS_LAST); regNdx++)
1225  {
1226  ostringstream regName; regName << "kRegNTV4FS" << DEC(fsNdx+1) << "_";
1227  const ULWord registerNumber (kNTV4FrameStoreFirstRegNum + fsNdx * kNumNTV4FrameStoreRegisters + regNdx);
1228  switch (NTV4FrameStoreRegs(regNdx))
1229  {
1231  case regNTV4FS_ROIVHSize:
1237  case regNTV4FS_DisplayFID:
1245  case regNTV4FS_Status:
1253  regName << sNTV4FrameStoreRegNames[regNdx];
1254  DefineRegister(registerNumber, regName.str(), mDecodeNTV4FSReg, READWRITE, kRegClass_NTV4FrameStore, gChlClasses[fsNdx], kRegClass_NULL);
1255  break;
1257  regName << "InputSourceSelect";
1258  DefineRegister(registerNumber, regName.str(), mDecodeNTV4FSReg, READWRITE, kRegClass_NTV4FrameStore, gChlClasses[fsNdx], kRegClass_NULL);
1259  break;
1260  default:
1261  regName << DEC(regNdx);
1262  DefineRegister(registerNumber, regName.str(), mDefaultRegDecoder, READWRITE, kRegClass_NTV4FrameStore, gChlClasses[fsNdx], kRegClass_NULL);
1263  break;
1264  }
1265  } // for each FrameStore register
1266  } // for each FrameStore widget
1267  }
1268 
1269  void SetupVRegs(void)
1270  {
1271  AJAAutoLock lock(&mGuardMutex);
1272  DEF_REG (kVRegDriverVersion, mDriverVersionDecoder, READWRITE, kRegClass_Virtual, kRegClass_NULL, kRegClass_NULL);
1278  DEF_REG (kVRegDriverType, mDecodeDriverType, READWRITE, kRegClass_Virtual, kRegClass_NULL, kRegClass_NULL);
1519  DEF_REG (kVRegAncField1Offset, mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_NULL, kRegClass_NULL);
1520  DEF_REG (kVRegAncField2Offset, mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_NULL, kRegClass_NULL);
1523  DEF_REG (kVRegCustomAncInputSelect, mDefaultRegDecoder, READWRITE, kRegClass_Anc, kRegClass_NULL, kRegClass_NULL);
1535 
1536  DEF_REG (kVRegIPAddrEth0, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1537  DEF_REG (kVRegSubnetEth0, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1538  DEF_REG (kVRegGatewayEth0, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1539  DEF_REG (kVRegIPAddrEth1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1540  DEF_REG (kVRegSubnetEth1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1541  DEF_REG (kVRegGatewayEth1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1542  DEF_REG (kVRegRxcEnable1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1543  DEF_REG (kVRegRxcSfp1RxMatch1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1544  DEF_REG (kVRegRxcSfp1SourceIp1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1545  DEF_REG (kVRegRxcSfp1DestIp1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1546  DEF_REG (kVRegRxcSfp1SourcePort1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1547  DEF_REG (kVRegRxcSfp1DestPort1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1548  DEF_REG (kVRegRxcSfp1Vlan1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1549  DEF_REG (kVRegRxcSfp2RxMatch1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1550  DEF_REG (kVRegRxcSfp2SourceIp1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1551  DEF_REG (kVRegRxcSfp2DestIp1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1552  DEF_REG (kVRegRxcSfp2SourcePort1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1553  DEF_REG (kVRegRxcSfp2DestPort1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1554  DEF_REG (kVRegRxcSfp2Vlan1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1555  DEF_REG (kVRegRxcSsrc1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1556  DEF_REG (kVRegRxcPlayoutDelay1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1557  DEF_REG (kVRegRxcEnable2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1558  DEF_REG (kVRegRxcSfp1RxMatch2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1559  DEF_REG (kVRegRxcSfp1SourceIp2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1560  DEF_REG (kVRegRxcSfp1DestIp2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1561  DEF_REG (kVRegRxcSfp1SourcePort2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1562  DEF_REG (kVRegRxcSfp1DestPort2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1563  DEF_REG (kVRegRxcSfp1Vlan2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1564  DEF_REG (kVRegRxcSfp2RxMatch2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1565  DEF_REG (kVRegRxcSfp2SourceIp2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1566  DEF_REG (kVRegRxcSfp2DestIp2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1567  DEF_REG (kVRegRxcSfp2SourcePort2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1568  DEF_REG (kVRegRxcSfp2DestPort2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1569  DEF_REG (kVRegRxcSfp2Vlan2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1570  DEF_REG (kVRegRxcSsrc2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1571  DEF_REG (kVRegRxcPlayoutDelay2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Input, kRegClass_NULL);
1572  DEF_REG (kVRegTxcEnable3, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1573  DEF_REG (kVRegTxcSfp1LocalPort3, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1574  DEF_REG (kVRegTxcSfp1RemoteIp3, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1575  DEF_REG (kVRegTxcSfp1RemotePort3, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1576  DEF_REG (kVRegTxcSfp2LocalPort3, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1577  DEF_REG (kVRegTxcSfp2RemoteIp3, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1578  DEF_REG (kVRegTxcSfp2RemotePort3, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1579  DEF_REG (kVRegTxcEnable4, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1580  DEF_REG (kVRegTxcSfp1LocalPort4, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1581  DEF_REG (kVRegTxcSfp1RemoteIp4, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1582  DEF_REG (kVRegTxcSfp1RemotePort4, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1583  DEF_REG (kVRegTxcSfp2LocalPort4, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1584  DEF_REG (kVRegTxcSfp2RemoteIp4, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1585  DEF_REG (kVRegTxcSfp2RemotePort4, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1586  DEF_REG (kVRegMailBoxAcquire, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1587  DEF_REG (kVRegMailBoxRelease, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1588  DEF_REG (kVRegMailBoxAbort, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1589  DEF_REG (kVRegMailBoxTimeoutNS, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1599  DEF_REG (kVRegTxc_2EncodeUllMode1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1602  DEF_REG (kVRegTxc_2EncodeMbps1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1607  DEF_REG (kVRegTxc_2EncodePcrPid1, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1610  DEF_REG (kVRegTxc_2EncodeUllMode2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1613  DEF_REG (kVRegTxc_2EncodeMbps2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1618  DEF_REG (kVRegTxc_2EncodePcrPid2, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_Output, kRegClass_NULL);
1620  DEF_REG (kVReg2022_7Enable, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1621  DEF_REG (kVReg2022_7NetworkPathDiff, mDefaultRegDecoder, READWRITE, kRegClass_IP, kRegClass_NULL, kRegClass_NULL);
1627  DEF_REG (kVRegUseHDMI420Mode, mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_NULL, kRegClass_NULL);
1655 
1662 
1666 
1670 
1674 
1678 
1682 
1686 
1690 
1691  DEF_REG (kVRegUserColorimetry, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1692  DEF_REG (kVRegUserTransfer, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1693  DEF_REG (kVRegUserLuminance, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1694 
1695  DEF_REG (kVRegHdrColorimetryCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1696  DEF_REG (kVRegHdrTransferCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1697  DEF_REG (kVRegHdrLuminanceCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1698  DEF_REG (kVRegHdrGreenXCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1699  DEF_REG (kVRegHdrGreenYCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1700  DEF_REG (kVRegHdrBlueXCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1701  DEF_REG (kVRegHdrBlueYCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1702  DEF_REG (kVRegHdrRedXCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1703  DEF_REG (kVRegHdrRedYCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1704  DEF_REG (kVRegHdrWhiteXCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1705  DEF_REG (kVRegHdrWhiteYCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1706  DEF_REG (kVRegHdrMasterLumMaxCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1707  DEF_REG (kVRegHdrMasterLumMinCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1708  DEF_REG (kVRegHdrMaxCLLCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1709  DEF_REG (kVRegHdrMaxFALLCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1710  DEF_REG (kVRegHDROverrideState, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_NULL, kRegClass_NULL);
1712  DEF_REG (kVRegPCILinkSpeed, mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1713  DEF_REG (kVRegPCILinkWidth, mDefaultRegDecoder, READWRITE, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1714  DEF_REG (kVRegUserInColorimetry, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1715  DEF_REG (kVRegUserInTransfer, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1716  DEF_REG (kVRegUserInLuminance, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1718  DEF_REG (kVRegHdrInTransferCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1719  DEF_REG (kVRegHdrInLuminanceCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1720  DEF_REG (kVRegHdrInGreenXCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1721  DEF_REG (kVRegHdrInGreenYCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1722  DEF_REG (kVRegHdrInBlueXCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1723  DEF_REG (kVRegHdrInBlueYCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1724  DEF_REG (kVRegHdrInRedXCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1725  DEF_REG (kVRegHdrInRedYCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1726  DEF_REG (kVRegHdrInWhiteXCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1727  DEF_REG (kVRegHdrInWhiteYCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1730  DEF_REG (kVRegHdrInMaxCLLCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1731  DEF_REG (kVRegHdrInMaxFALLCh1, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1732  DEF_REG (kVRegHDRInOverrideState, mDefaultRegDecoder, READWRITE, kRegClass_HDR, kRegClass_Input,kRegClass_NULL);
1733  DEF_REG (kVRegNTV2VPIDRGBRange1, mDefaultRegDecoder, READWRITE, kRegClass_VPID, kRegClass_NULL, kRegClass_NULL);
1734  DEF_REG (kVRegNTV2VPIDRGBRange2, mDefaultRegDecoder, READWRITE, kRegClass_VPID, kRegClass_NULL, kRegClass_NULL);
1735  DEF_REG (kVRegNTV2VPIDRGBRange3, mDefaultRegDecoder, READWRITE, kRegClass_VPID, kRegClass_NULL, kRegClass_NULL);
1736  DEF_REG (kVRegNTV2VPIDRGBRange4, mDefaultRegDecoder, READWRITE, kRegClass_VPID, kRegClass_NULL, kRegClass_NULL);
1737  DEF_REG (kVRegNTV2VPIDRGBRange5, mDefaultRegDecoder, READWRITE, kRegClass_VPID, kRegClass_NULL, kRegClass_NULL);
1738  DEF_REG (kVRegNTV2VPIDRGBRange6, mDefaultRegDecoder, READWRITE, kRegClass_VPID, kRegClass_NULL, kRegClass_NULL);
1739  DEF_REG (kVRegNTV2VPIDRGBRange7, mDefaultRegDecoder, READWRITE, kRegClass_VPID, kRegClass_NULL, kRegClass_NULL);
1740  DEF_REG (kVRegNTV2VPIDRGBRange8, mDefaultRegDecoder, READWRITE, kRegClass_VPID, kRegClass_NULL, kRegClass_NULL);
1741 
1744  DEF_REG (kVRegAudioHeadphoneGain, mDefaultRegDecoder, READWRITE, kRegClass_Audio, kRegClass_NULL, kRegClass_NULL);
1749 
1750  DEF_REG (kVRegDmaTransferRateC2H1, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1751  DEF_REG (kVRegDmaHardwareRateC2H1, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1752  DEF_REG (kVRegDmaTransferRateH2C1, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1753  DEF_REG (kVRegDmaHardwareRateH2C1, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1754  DEF_REG (kVRegDmaTransferRateC2H2, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1755  DEF_REG (kVRegDmaHardwareRateC2H2, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1756  DEF_REG (kVRegDmaTransferRateH2C2, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1757  DEF_REG (kVRegDmaHardwareRateH2C2, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1758  DEF_REG (kVRegDmaTransferRateC2H3, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1759  DEF_REG (kVRegDmaHardwareRateC2H3, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1760  DEF_REG (kVRegDmaTransferRateH2C3, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1761  DEF_REG (kVRegDmaHardwareRateH2C3, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1762  DEF_REG (kVRegDmaTransferRateC2H4, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1763  DEF_REG (kVRegDmaHardwareRateC2H4, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1764  DEF_REG (kVRegDmaTransferRateH2C4, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1765  DEF_REG (kVRegDmaHardwareRateH2C4, mDMAXferRateRegDecoder, READONLY, kRegClass_DMA, kRegClass_NULL, kRegClass_NULL);
1766 
1767  DEF_REG (kVRegHDMIInAviInfo1, mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
1768  DEF_REG (kVRegHDMIInDrmInfo1, mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
1775 
1776  DEF_REG (kVRegHDMIInAviInfo2, mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_NULL);
1777  DEF_REG (kVRegHDMIInDrmInfo2, mDefaultRegDecoder, READWRITE, kRegClass_HDMI, kRegClass_Input, kRegClass_HDR);
1784 
1786 
1787  DEF_REG (kVRegHDMIOutStatus1, mDecodeHDMIOutputStatus,READWRITE, kRegClass_HDMI, kRegClass_Output, kRegClass_NULL);
1790 
1793 
1794  for (ULWord ndx(1); ndx < 1024; ndx++) // <== Start at 1, kVRegDriverVersion already done
1795  {
1796  ostringstream oss; oss << "VIRTUALREG_START+" << ndx;
1797  const string regName (oss.str());
1798  const ULWord regNum (VIRTUALREG_START + ndx);
1799  if (mRegNumToStringMap.find(regNum) == mRegNumToStringMap.end())
1800  {
1801  mRegNumToStringMap.insert (RegNumToStringPair(regNum, regName));
1802  mStringToRegNumMMap.insert (StringToRegNumPair(ToLower(regName), regNum));
1803  }
1804  DefineRegDecoder (regNum, mDefaultRegDecoder);
1805  DefineRegReadWrite (regNum, READWRITE);
1806  DefineRegClass (regNum, kRegClass_Virtual);
1807  }
1808  DefineRegClass (kVRegAudioOutputToneSelect, kRegClass_Audio);
1809  DefineRegClass (kVRegMonAncField1Offset, kRegClass_Anc);
1810  DefineRegClass (kVRegMonAncField2Offset, kRegClass_Anc);
1811  DefineRegClass (kVRegAncField1Offset, kRegClass_Anc);
1812  DefineRegClass (kVRegAncField2Offset, kRegClass_Anc);
1813  } // SetupVRegs
1814 
1815 public:
1816  static ostream & PrintLabelValuePairs (ostream & oss, const AJALabelValuePairs & inLabelValuePairs)
1817  {
1818  for (AJALabelValuePairsConstIter it(inLabelValuePairs.begin()); it != inLabelValuePairs.end(); )
1819  {
1820  const string & label (it->first);
1821  const string & value (it->second);
1822  if (label.empty())
1823  ;
1824  else if (label.at(label.length()-1) != ' ' && label.at(label.length()-1) != ':') // C++11 "label.back()" would be better
1825  oss << label << ": " << value;
1826  else if (label.at(label.length()-1) == ':') // C++11 "label.back()" would be better
1827  oss << label << " " << value;
1828  else
1829  oss << label << value;
1830  if (++it != inLabelValuePairs.end())
1831  oss << endl;
1832  }
1833  return oss;
1834  }
1835 
1836  string RegNameToString (const uint32_t inRegNum) const
1837  {
1838  AJAAutoLock lock(&mGuardMutex);
1839  RegNumToStringMap::const_iterator iter (mRegNumToStringMap.find (inRegNum));
1840  if (iter != mRegNumToStringMap.end())
1841  return iter->second;
1842 
1843  ostringstream oss; oss << "Reg ";
1844  if (inRegNum <= kRegNumRegisters)
1845  oss << DEC(inRegNum);
1846  else if (inRegNum <= 0x0000FFFF)
1847  oss << xHEX0N(inRegNum,4);
1848  else
1849  oss << xHEX0N(inRegNum,8);
1850  return oss.str();
1851  }
1852 
1853  string RegValueToString (const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
1854  {
1855  AJAAutoLock lock(&mGuardMutex);
1856  RegNumToDecoderMap::const_iterator iter(mRegNumToDecoderMap.find(inRegNum));
1857  ostringstream oss;
1858  if (iter != mRegNumToDecoderMap.end() && iter->second)
1859  {
1860  const Decoder * pDecoder (iter->second);
1861  oss << (*pDecoder)(inRegNum, inRegValue, inDeviceID);
1862  }
1863  return oss.str();
1864  }
1865 
1866  bool IsRegInClass (const uint32_t inRegNum, const string & inClassName) const
1867  {
1868  AJAAutoLock lock(&mGuardMutex);
1869  for (RegClassToRegNumConstIter it(mRegClassToRegNumMMap.find(inClassName)); it != mRegClassToRegNumMMap.end() && it->first == inClassName; ++it)
1870  if (it->second == inRegNum)
1871  return true;
1872  return false;
1873  }
1874 
1875  inline bool IsRegisterWriteOnly (const uint32_t inRegNum) const {return IsRegInClass (inRegNum, kRegClass_WriteOnly);}
1876  inline bool IsRegisterReadOnly (const uint32_t inRegNum) const {return IsRegInClass (inRegNum, kRegClass_ReadOnly);}
1877 
1879  {
1880  AJAAutoLock lock(&mGuardMutex);
1881  if (mAllRegClasses.empty())
1882  for (RegClassToRegNumConstIter it(mRegClassToRegNumMMap.begin()); it != mRegClassToRegNumMMap.end(); ++it)
1883  if (mAllRegClasses.find(it->first) == mAllRegClasses.end())
1884  mAllRegClasses.insert(it->first);
1885  return mAllRegClasses;
1886  }
1887 
1888  NTV2StringSet GetRegisterClasses (const uint32_t inRegNum, const bool inRemovePrefix) const
1889  {
1890  AJAAutoLock lock(&mGuardMutex);
1891  NTV2StringSet result;
1892  NTV2StringSet allClasses (GetAllRegisterClasses());
1893  for (NTV2StringSetConstIter it(allClasses.begin()); it != allClasses.end(); ++it)
1894  if (IsRegInClass (inRegNum, *it))
1895  {
1896  string str(*it);
1897  if (inRemovePrefix)
1898  str.erase(0, 10); // Remove "kRegClass_" prefix
1899  if (result.find(str) == result.end())
1900  result.insert(str);
1901  }
1902  return result;
1903  }
1904 
1905  NTV2RegNumSet GetRegistersForClass (const string & inClassName) const
1906  {
1907  AJAAutoLock lock(&mGuardMutex);
1908  NTV2RegNumSet result;
1909  for (RegClassToRegNumConstIter it(mRegClassToRegNumMMap.find(inClassName)); it != mRegClassToRegNumMMap.end() && it->first == inClassName; ++it)
1910  if (result.find(it->second) == result.end())
1911  result.insert(it->second);
1912  return result;
1913  }
1914 
1915  NTV2RegNumSet GetRegistersForDevice (const NTV2DeviceID inDeviceID, const int inOtherRegsToInclude) const
1916  {
1917  NTV2RegNumSet result;
1918  const uint32_t maxRegNum (::NTV2DeviceGetMaxRegisterNumber(inDeviceID));
1919 
1920  for (uint32_t regNum (0); regNum <= maxRegNum; regNum++)
1921  result.insert(regNum);
1922 
1923  AJAAutoLock lock(&mGuardMutex);
1924 
1925  if (::NTV2DeviceCanDoCustomAnc(inDeviceID))
1926  {
1927  const NTV2RegNumSet ancRegs (GetRegistersForClass(kRegClass_Anc));
1928  const UWord numVideoInputs (::NTV2DeviceGetNumVideoInputs(inDeviceID));
1929  const UWord numVideoOutputs (::NTV2DeviceGetNumVideoOutputs(inDeviceID));
1930  const UWord numSpigots(numVideoInputs > numVideoOutputs ? numVideoInputs : numVideoOutputs);
1931  NTV2RegNumSet allChanRegs; // For just those channels it supports
1932  for (UWord num(0); num < numSpigots; num++)
1933  {
1934  const NTV2RegNumSet chRegs (GetRegistersForClass(gChlClasses[num]));
1935  allChanRegs.insert(chRegs.begin(), chRegs.end());
1936  }
1937  std::set_intersection (ancRegs.begin(), ancRegs.end(), allChanRegs.begin(), allChanRegs.end(), std::inserter(result, result.begin()));
1938  }
1939 
1940  if (::NTV2DeviceCanDoCustomAux(inDeviceID))
1941  {
1942  const NTV2RegNumSet auxRegs (GetRegistersForClass(kRegClass_Aux));
1943  const UWord numVideoInputs (::NTV2DeviceGetNumHDMIVideoInputs(inDeviceID));
1944  const UWord numVideoOutputs (::NTV2DeviceGetNumHDMIVideoOutputs(inDeviceID));
1945  const UWord numSpigots(numVideoInputs > numVideoOutputs ? numVideoInputs : numVideoOutputs);
1946  NTV2RegNumSet allChanRegs; // For just those channels it supports
1947  for (UWord num(0); num < numSpigots; num++)
1948  {
1949  const NTV2RegNumSet chRegs (GetRegistersForClass(gChlClasses[num]));
1950  allChanRegs.insert(chRegs.begin(), chRegs.end());
1951  }
1952  std::set_intersection (auxRegs.begin(), auxRegs.end(), allChanRegs.begin(), allChanRegs.end(), std::inserter(result, result.begin()));
1953  }
1954 
1955  if (::NTV2DeviceCanDoSDIErrorChecks(inDeviceID))
1956  {
1957  const NTV2RegNumSet sdiErrRegs (GetRegistersForClass(kRegClass_SDIError));
1958  result.insert(sdiErrRegs.begin(), sdiErrRegs.end());
1959  }
1960 
1961  if (::NTV2DeviceCanDoAudioMixer(inDeviceID))
1962  {
1963  for (ULWord regNum(kRegAudioMixerInputSelects); regNum <= kRegAudioMixerAux2GainCh2; regNum++)
1964  result.insert(regNum);
1966  result.insert(regNum);
1967  }
1968 
1969  if (::NTV2DeviceHasXilinxDMA(inDeviceID))
1970  {
1971  }
1972 
1973  if (::NTV2DeviceCanDoEnhancedCSC(inDeviceID))
1974  {
1975  const NTV2RegNumSet ecscRegs (GetRegistersForClass(kRegClass_CSC));
1976  const UWord numCSCs (::NTV2DeviceGetNumCSCs(inDeviceID));
1977  NTV2RegNumSet allChanRegs; // For just those CSCs it supports
1978  for (UWord num(0); num < numCSCs; num++)
1979  {
1980  const NTV2RegNumSet chRegs (GetRegistersForClass(gChlClasses[num]));
1981  allChanRegs.insert(chRegs.begin(), chRegs.end());
1982  }
1983  std::set_intersection (ecscRegs.begin(), ecscRegs.end(), allChanRegs.begin(), allChanRegs.end(), std::inserter(result, result.begin()));
1984  }
1985 
1986  if (::NTV2DeviceGetNumLUTs(inDeviceID))
1987  {
1988  const NTV2RegNumSet LUTRegs (GetRegistersForClass(kRegClass_LUT));
1989  result.insert(LUTRegs.begin(), LUTRegs.end());
1990  }
1991 
1992  if (::NTV2DeviceGetNumHDMIVideoInputs(inDeviceID) > 1) // KonaHDMI
1993  {
1994  for (ULWord regNum = 0x1d00; regNum <= 0x1d1f; regNum++)
1995  result.insert(regNum);
1996  for (ULWord regNum = 0x2500; regNum <= 0x251f; regNum++)
1997  result.insert(regNum);
1998  for (ULWord regNum = 0x2c00; regNum <= 0x2c1f; regNum++)
1999  result.insert(regNum);
2000  for (ULWord regNum = 0x3000; regNum <= 0x301f; regNum++)
2001  result.insert(regNum);
2002  }
2003  else if (NTV2DeviceGetHDMIVersion(inDeviceID) > 3) // Io4KPlus, IoIP2022, IoIP2110, Kona5, KonaHDMI
2004  { // v4 HDMI: Io4K+, IoIP2022, IoIP2110, Kona5, KonaHDMI...
2005  for (ULWord regNum = 0x1d00; regNum <= 0x1d1f; regNum++)
2006  result.insert(regNum);
2007  for (ULWord regNum = 0x1d40; regNum <= 0x1d5f; regNum++)
2008  result.insert(regNum);
2009  for (ULWord regNum = 0x3C00; regNum <= 0x3C0A; regNum++)
2010  result.insert(regNum);
2011  }
2012 
2013  if (inDeviceID == DEVICE_ID_IOX3 || inDeviceID == DEVICE_ID_KONA5_8K_MV_TX)
2014  { // IoX3 and some Kona5 support MultiViewer/MultiRaster
2015  result.insert(ULWord(kRegMRQ1Control));
2016  result.insert(ULWord(kRegMRQ2Control));
2017  result.insert(ULWord(kRegMRQ3Control));
2018  result.insert(ULWord(kRegMRQ4Control));
2019  result.insert(ULWord(kRegMROutControl));
2020  result.insert(ULWord(kRegMRSupport));
2021  }
2022 
2023  if (NTV2DeviceHasNTV4FrameStores(inDeviceID))
2024  {
2025  const NTV2RegNumSet ntv4FSRegs (GetRegistersForClass(kRegClass_NTV4FrameStore));
2026  const UWord numFrameStores (::NTV2DeviceGetNumFrameStores(inDeviceID));
2027  NTV2RegNumSet chanRegs; // Just the supported NTV4 FrameStores
2028  for (UWord num(0); num < numFrameStores; num++)
2029  {
2030  const NTV2RegNumSet chRegs (GetRegistersForClass(gChlClasses[num]));
2031  chanRegs.insert(chRegs.begin(), chRegs.end());
2032  }
2033  std::set_intersection (ntv4FSRegs.begin(), ntv4FSRegs.end(), chanRegs.begin(), chanRegs.end(), std::inserter(result, result.begin()));
2034  }
2035 
2036  if (NTV2DeviceCanDoIDSwitch(inDeviceID))
2037  {
2038  result.insert(ULWord(kRegIDSwitch));
2039  }
2040 
2041  if (NTV2DeviceHasPWMFanControl(inDeviceID))
2042  {
2043  result.insert(ULWord(kRegPWMFanControl));
2044  result.insert(ULWord(kRegPWMFanStatus));
2045  }
2046 
2047  if (NTV2DeviceCanDoBreakoutBoard(inDeviceID))
2048  {
2049  result.insert(ULWord(kRegBOBStatus));
2050  result.insert(ULWord(kRegBOBGPIInData));
2051  result.insert(ULWord(kRegBOBGPIInterruptControl));
2052  result.insert(ULWord(kRegBOBGPIOutData));
2053  result.insert(ULWord(kRegBOBAudioControl));
2054  }
2055 
2056  if (NTV2DeviceHasBracketLED(inDeviceID))
2057  {
2058  result.insert(ULWord(kRegLEDReserved0));
2059  result.insert(ULWord(kRegLEDClockDivide));
2060  result.insert(ULWord(kRegLEDReserved2));
2061  result.insert(ULWord(kRegLEDReserved3));
2062  result.insert(ULWord(kRegLEDSDI1Control));
2063  result.insert(ULWord(kRegLEDSDI2Control));
2064  result.insert(ULWord(kRegLEDHDMIInControl));
2065  result.insert(ULWord(kRegLEDHDMIOutControl));
2066  }
2067 
2068  if (NTV2DeviceCanDoClockMonitor(inDeviceID))
2069  {
2070  result.insert(ULWord(kRegCMWControl));
2071  result.insert(ULWord(kRegCMW1485Out));
2072  result.insert(ULWord(kRegCMW14835Out));
2073  result.insert(ULWord(kRegCMW27Out));
2074  result.insert(ULWord(kRegCMW12288Out));
2075  result.insert(ULWord(kRegCMWHDMIOut));
2076  }
2077 
2078  if (inOtherRegsToInclude & kIncludeOtherRegs_VRegs)
2079  {
2080  const NTV2RegNumSet vRegs (GetRegistersForClass(kRegClass_Virtual));
2081  result.insert(vRegs.begin(), vRegs.end());
2082  }
2083 
2084  if (inOtherRegsToInclude & kIncludeOtherRegs_XptROM)
2085  {
2086  const NTV2RegNumSet xptMapRegs (GetRegistersForClass(kRegClass_XptROM));
2087  result.insert(xptMapRegs.begin(), xptMapRegs.end());
2088  }
2089  return result;
2090  }
2091 
2092 
2093  NTV2RegNumSet GetRegistersWithName (const string & inName, const int inMatchStyle = EXACTMATCH) const
2094  {
2095  NTV2RegNumSet result;
2096  string nameStr(inName);
2097  const size_t nameStrLen(aja::lower(nameStr).length());
2098  StringToRegNumConstIter it;
2099  AJAAutoLock lock(&mGuardMutex);
2100  if (inMatchStyle == EXACTMATCH)
2101  {
2102  it = mStringToRegNumMMap.find(nameStr);
2103  if (it != mStringToRegNumMMap.end())
2104  result.insert(it->second);
2105  return result;
2106  }
2107  // Inexact match...
2108  for (it = mStringToRegNumMMap.begin(); it != mStringToRegNumMMap.end(); ++it)
2109  {
2110  const size_t pos(it->first.find(nameStr));
2111  if (pos == string::npos)
2112  continue;
2113  switch (inMatchStyle)
2114  {
2115  case CONTAINS: result.insert(it->second); break;
2116  case STARTSWITH: if (pos == 0)
2117  {result.insert(it->second);}
2118  break;
2119  case ENDSWITH: if (pos+nameStrLen == it->first.length())
2120  {result.insert(it->second);}
2121  break;
2122  default: break;
2123  }
2124  }
2125  return result;
2126  }
2127 
2128  bool GetXptRegNumAndMaskIndex (const NTV2InputCrosspointID inInputXpt, uint32_t & outXptRegNum, uint32_t & outMaskIndex) const
2129  {
2130  AJAAutoLock lock(&mGuardMutex);
2131  outXptRegNum = 0xFFFFFFFF;
2132  outMaskIndex = 0xFFFFFFFF;
2133  InputXpt2XptRegNumMaskIndexMapConstIter iter (mInputXpt2XptRegNumMaskIndexMap.find (inInputXpt));
2134  if (iter == mInputXpt2XptRegNumMaskIndexMap.end())
2135  return false;
2136  outXptRegNum = iter->second.first;
2137  outMaskIndex = iter->second.second;
2138  return true;
2139  }
2140 
2141  NTV2InputCrosspointID GetInputCrosspointID (const uint32_t inXptRegNum, const uint32_t inMaskIndex) const
2142  {
2143  AJAAutoLock lock(&mGuardMutex);
2144  const XptRegNumAndMaskIndex key (inXptRegNum, inMaskIndex);
2145  XptRegNumMaskIndex2InputXptMapConstIter iter (mXptRegNumMaskIndex2InputXptMap.find (key));
2146  if (iter != mXptRegNumMaskIndex2InputXptMap.end())
2147  return iter->second;
2149  }
2150 
2151  ostream & Print (ostream & inOutStream) const
2152  {
2153  AJAAutoLock lock(&mGuardMutex);
2154  static const string sLineBreak (96, '=');
2155  static const uint32_t sMasks[4] = {0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000};
2156 
2157  inOutStream << endl << sLineBreak << endl << "RegisterExpert: Dump of RegNumToStringMap: " << mRegNumToStringMap.size() << " mappings:" << endl << sLineBreak << endl;
2158  for (RegNumToStringMap::const_iterator it (mRegNumToStringMap.begin()); it != mRegNumToStringMap.end(); ++it)
2159  inOutStream << "reg " << setw(5) << it->first << "(" << HEX0N(it->first,8) << dec << ") => '" << it->second << "'" << endl;
2160 
2161  inOutStream << endl << sLineBreak << endl << "RegisterExpert: Dump of RegNumToDecoderMap: " << mRegNumToDecoderMap.size() << " mappings:" << endl << sLineBreak << endl;
2162  for (RegNumToDecoderMap::const_iterator it (mRegNumToDecoderMap.begin()); it != mRegNumToDecoderMap.end(); ++it)
2163  inOutStream << "reg " << setw(5) << it->first << "(" << HEX0N(it->first,8) << dec << ") => " << (it->second == &mDefaultRegDecoder ? "(default decoder)" : "Custom Decoder") << endl;
2164 
2165  inOutStream << endl << sLineBreak << endl << "RegisterExpert: Dump of RegClassToRegNumMMap: " << mRegClassToRegNumMMap.size() << " mappings:" << endl << sLineBreak << endl;
2166  for (RegClassToRegNumMMap::const_iterator it (mRegClassToRegNumMMap.begin()); it != mRegClassToRegNumMMap.end(); ++it)
2167  inOutStream << setw(32) << it->first << " => reg " << setw(5) << it->second << "(" << HEX0N(it->second,8) << dec << ") " << RegNameToString(it->second) << endl;
2168 
2169  inOutStream << endl << sLineBreak << endl << "RegisterExpert: Dump of StringToRegNumMMap: " << mStringToRegNumMMap.size() << " mappings:" << endl << sLineBreak << endl;
2170  for (StringToRegNumMMap::const_iterator it (mStringToRegNumMMap.begin()); it != mStringToRegNumMMap.end(); ++it)
2171  inOutStream << setw(32) << it->first << " => reg " << setw(5) << it->second << "(" << HEX0N(it->second,8) << dec << ") " << RegNameToString(it->second) << endl;
2172 
2173  inOutStream << endl << sLineBreak << endl << "RegisterExpert: Dump of InputXpt2XptRegNumMaskIndexMap: " << mInputXpt2XptRegNumMaskIndexMap.size() << " mappings:" << endl << sLineBreak << endl;
2174  for (InputXpt2XptRegNumMaskIndexMap::const_iterator it (mInputXpt2XptRegNumMaskIndexMap.begin()); it != mInputXpt2XptRegNumMaskIndexMap.end(); ++it)
2175  inOutStream << setw(32) << ::NTV2InputCrosspointIDToString(it->first) << "(" << HEX0N(it->first,2)
2176  << ") => reg " << setw(3) << it->second.first << "(" << HEX0N(it->second.first,3) << dec << "|" << setw(20) << RegNameToString(it->second.first)
2177  << ") mask " << it->second.second << "(" << HEX0N(sMasks[it->second.second],8) << ")" << endl;
2178 
2179  inOutStream << endl << sLineBreak << endl << "RegisterExpert: Dump of XptRegNumMaskIndex2InputXptMap: " << mXptRegNumMaskIndex2InputXptMap.size() << " mappings:" << endl << sLineBreak << endl;
2180  for (XptRegNumMaskIndex2InputXptMap::const_iterator it (mXptRegNumMaskIndex2InputXptMap.begin()); it != mXptRegNumMaskIndex2InputXptMap.end(); ++it)
2181  inOutStream << "reg " << setw(3) << it->first.first << "(" << HEX0N(it->first.first,4) << "|" << setw(20) << RegNameToString(it->first.first)
2182  << ") mask " << it->first.second << "(" << HEX0N(sMasks[it->first.second],8) << ") => "
2183  << setw(27) << ::NTV2InputCrosspointIDToString(it->second) << "(" << HEX0N(it->second,2) << ")" << endl;
2184  return inOutStream;
2185  }
2186 
2187 private:
2188  typedef std::map<uint32_t, string> RegNumToStringMap;
2189  typedef std::pair<uint32_t, string> RegNumToStringPair;
2190 
2191  static string ToLower (const string & inStr)
2192  {
2193  string result (inStr);
2194  std::transform (result.begin (), result.end (), result.begin (), ::tolower);
2195  return result;
2196  }
2197 
2198  struct DecodeGlobalControlReg : public Decoder
2199  {
2200  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2201  {
2202  (void) inRegNum;
2203  (void) inDeviceID;
2204  const NTV2FrameGeometry frameGeometry (NTV2FrameGeometry (((inRegValue & kRegMaskGeometry ) >> 3)));
2205  const NTV2Standard videoStandard (NTV2Standard ((inRegValue & kRegMaskStandard ) >> 7));
2206  const NTV2ReferenceSource referenceSource (NTV2ReferenceSource ((inRegValue & kRegMaskRefSource ) >> 10));
2207  const NTV2RegisterWriteMode registerWriteMode (NTV2RegisterWriteMode ((inRegValue & kRegMaskRegClocking ) >> 20));
2208  const NTV2FrameRate frameRate (NTV2FrameRate (((inRegValue & kRegMaskFrameRate ) >> kRegShiftFrameRate)
2209  | ((inRegValue & kRegMaskFrameRateHiBit) >> (kRegShiftFrameRateHiBit - 3))));
2210  ostringstream oss;
2211  oss << "Frame Rate: " << ::NTV2FrameRateToString (frameRate, true) << endl
2212  << "Frame Geometry: " << ::NTV2FrameGeometryToString (frameGeometry, true) << endl
2213  << "Standard: " << ::NTV2StandardToString (videoStandard, true) << endl
2214  << "Reference Source: " << ::NTV2ReferenceSourceToString (referenceSource, true) << endl
2215  << "Ch 2 link B 1080p 50/60: " << ((inRegValue & kRegMaskSmpte372Enable) ? "On" : "Off") << endl
2216  << "LEDs ";
2217  for (int led(0); led < 4; ++led)
2218  oss << (((inRegValue & kRegMaskLED) >> (16 + led)) ? "*" : ".");
2219  oss << endl
2220  << "Register Clocking: " << ::NTV2RegisterWriteModeToString (registerWriteMode, true).c_str() << endl
2221  << "Ch 1 RP-188 output: " << EnabDisab(inRegValue & kRegMaskRP188ModeCh1) << endl
2222  << "Ch 2 RP-188 output: " << EnabDisab(inRegValue & kRegMaskRP188ModeCh2) << endl
2223  << "Color Correction: " << "Channel: " << ((inRegValue & BIT(31)) ? "2" : "1")
2224  << " Bank " << ((inRegValue & BIT (30)) ? "1" : "0");
2225  return oss.str();
2226  }
2227  } mDecodeGlobalControlReg;
2228 
2229  // reg 267 aka kRegGlobalControl2
2230  struct DecodeGlobalControl2 : public Decoder
2231  {
2232  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2233  {
2234  (void) inRegNum;
2235  (void) inDeviceID;
2239  static const ULWord k425Masks[] = { kRegMask425FB12, kRegMask425FB34, kRegMask425FB56, kRegMask425FB78};
2241  ostringstream oss;
2242  oss << "Reference source bit 4: " << SetNotset(inRegValue & kRegMaskRefSource2) << endl
2243  << "Quad Mode Channel 1-4: " << SetNotset(inRegValue & kRegMaskQuadMode) << endl
2244  << "Quad Mode Channel 5-8: " << SetNotset(inRegValue & kRegMaskQuadMode2) << endl
2245  << "Independent Channel Mode: " << SetNotset(inRegValue & kRegMaskIndependentMode) << endl
2246  << "2MB Frame Support: " << SuppNotsupp(inRegValue & kRegMask2MFrameSupport) << endl
2247  << "Audio Mixer: " << PresNotPres(inRegValue & kRegMaskAudioMixerPresent) << endl
2248  << "Is DNXIV Product: " << YesNo(inRegValue & kRegMaskIsDNXIV) << endl;
2249  for (unsigned ch(0); ch < 8; ch++)
2250  oss << "Audio " << DEC(ch+1) << " Play/Capture Mode: " << OnOff(inRegValue & playCaptModes[ch]) << endl;
2251  for (unsigned ch(2); ch < 8; ch++)
2252  oss << "Ch " << DEC(ch+1) << " RP188 Output: " << EnabDisab(inRegValue & rp188Modes[ch]) << endl;
2253  for (unsigned ch(0); ch < 3; ch++)
2254  oss << "Ch " << DEC(2*(ch+2)) << " 1080p50/p60 Link-B Mode: " << EnabDisab(inRegValue & BLinkModes[ch]) << endl;
2255  for (unsigned ch(0); ch < 4; ch++)
2256  oss << "Ch " << DEC(ch*2+1) << "/" << DEC(ch*2+2) << " 2SI Mode: " << EnabDisab(inRegValue & k425Masks[ch]) << endl;
2257  oss << "2SI Min Align Delay 1-4: " << EnabDisab(inRegValue & BIT(24)) << endl
2258  << "2SI Min Align Delay 5-8: " << EnabDisab(inRegValue & BIT(25));
2259  return oss.str();
2260  }
2261  } mDecodeGlobalControl2;
2262 
2263  // reg 108 aka kRegGlobalControl3
2264  struct DecodeGlobalControl3 : public Decoder
2265  {
2266  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2267  {
2268  (void) inRegNum;
2269  (void) inDeviceID;
2270  ostringstream oss;
2271  oss << "Bidirectional analog audio 1-4: " << (inRegValue & kRegMaskAnalogIOControl_14 ? "Receive" : "Transmit") << endl
2272  << "Bidirectional analog audio 5-8: " << (inRegValue & kRegMaskAnalogIOControl_58 ? "Receive" : "Transmit") << endl
2273  << "VU Meter Audio Select: " << (inRegValue & kRegMaskVUMeterSelect ? "AudMixer" : "AudSys1") << endl
2274  << "Quad Quad Mode FrameStores 1-2: " << EnabDisab(inRegValue & kRegMaskQuadQuadMode) << endl
2275  << "Quad Quad Mode FrameStores 3-4: " << EnabDisab(inRegValue & kRegMaskQuadQuadMode2) << endl
2276  << "Quad Quad Squares Mode 1-4: " << EnabDisab(inRegValue & kRegMaskQuadQuadSquaresMode) << endl
2277  << "Frame Pulse Enable: " << EnabDisab(inRegValue & kRegMaskFramePulseEnable);
2278  if (inRegValue & kRegMaskFramePulseEnable)
2279  oss << endl
2280  << "Frame Pulse Ref Src: " << DEC((inRegValue & kRegMaskFramePulseRefSelect) >> kRegShiftFramePulseRefSelect);
2281  return oss.str();
2282  }
2283  } mDecodeGlobalControl3;
2284 
2285  // Regs 377,378,379,380,381,382,383 aka kRegGlobalControlCh2,kRegGlobalControlCh3,kRegGlobalControlCh4,kRegGlobalControlCh5,kRegGlobalControlCh6,kRegGlobalControlCh7,kRegGlobalControlCh8
2286  struct DecodeGlobalControlChanReg : public Decoder
2287  {
2288  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2289  {
2290  (void) inRegNum;
2291  (void) inDeviceID;
2292  ostringstream oss;
2293  const NTV2FrameGeometry frameGeometry = NTV2FrameGeometry((inRegValue & kRegMaskGeometry) >> 3);
2294  const NTV2Standard videoStandard = NTV2Standard((inRegValue & kRegMaskStandard) >> 7);
2295  const NTV2FrameRate frameRate = NTV2FrameRate(((inRegValue & kRegMaskFrameRate) >> kRegShiftFrameRate) | ((inRegValue & kRegMaskFrameRateHiBit) >> (kRegShiftFrameRateHiBit - 3)));
2296  oss << "Frame Rate: " << ::NTV2FrameRateToString (frameRate) << endl
2297  << "Frame Geometry: " << ::NTV2FrameGeometryToString (frameGeometry) << endl
2298  << "Standard: " << ::NTV2StandardToString (videoStandard);
2299  return oss.str();
2300  }
2301  } mDecodeGlobalControlChanRegs;
2302 
2303  // Regs 1/5/257/260/384/388/392/396 aka kRegCh1Control,kRegCh2Control,kRegCh3Control,kRegCh4Control,kRegCh5Control,kRegCh6Control,kRegCh7Control,kRegCh8Control
2304  struct DecodeChannelControlReg : public Decoder
2305  {
2306  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2307  {
2308  (void) inRegNum;
2309  (void) inDeviceID;
2310  ostringstream oss;
2311  const ULWord fbfUpper ((inRegValue & kRegMaskFrameFormatHiBit) >> 2);
2312  const ULWord fbfLower ((inRegValue & kRegMaskFrameFormat) >> 1);
2313  oss << "Mode: " << (inRegValue & kRegMaskMode ? "Capture" : "Display") << endl
2314  << "Format: " << ::NTV2FrameBufferFormatToString(NTV2PixelFormat(fbfUpper | fbfLower),false) << endl
2315  << "Channel: " << DisabEnab(inRegValue & kRegMaskChannelDisable) << endl
2316  << "Viper Squeeze: " << (inRegValue & BIT(9) ? "Squeeze" : "Normal") << endl
2317  << "Flip Vertical: " << (inRegValue & kRegMaskFrameOrientation ? "Upside Down" : "Normal") << endl
2318  << "DRT Display: " << OnOff(inRegValue & kRegMaskQuarterSizeMode) << endl
2319  << "Frame Buffer Mode: " << (inRegValue & kRegMaskFrameBufferMode ? "Field" : "Frame") << endl
2320  << "Dither: " << (inRegValue & kRegMaskDitherOn8BitInput ? "Dither 8-bit inputs" : "No dithering") << endl
2321  << "Frame Size: " << (1 << (((inRegValue & kK2RegMaskFrameSize) >> 20) + 1)) << " MB" << endl;
2322  if (inRegNum == kRegCh1Control && ::NTV2DeviceSoftwareCanChangeFrameBufferSize(inDeviceID))
2323  oss << "Frame Size Override: " << EnabDisab(inRegValue & kRegMaskFrameSizeSetBySW) << endl;
2324  oss << "RGB Range: " << (inRegValue & BIT(24) ? "Black = 0x40" : "Black = 0") << endl
2325  << "VANC Data Shift: " << (inRegValue & kRegMaskVidProcVANCShift ? "Enabled" : "Normal 8 bit conversion");
2326  return oss.str();
2327  }
2328  } mDecodeChannelControl;
2329 
2330  struct DecodeFBControlReg : public Decoder
2331  {
2332  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2333  {
2334  (void) inRegNum;
2335  (void) inDeviceID;
2336  const bool isOn ((inRegValue & (1 << 29)) != 0);
2337  const uint16_t format ((inRegValue >> 15) & 0x1F);
2338  ostringstream oss;
2339  oss << OnOff(isOn) << endl
2340  << "Format: " << xHEX0N(format,4) << " (" << DEC(format) << ")";
2341  return oss.str();
2342  }
2343  } mDecodeFBControlReg;
2344 
2345  struct DecodeChannelControlExtReg : public Decoder
2346  {
2347  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2348  {
2349  (void) inRegNum;
2350  (void) inDeviceID;
2351  ostringstream oss;
2352  oss << "Input Video 2:1 Decimate: " << EnabDisab(inRegValue & BIT(0)) << endl
2353  << "HDMI Rx Direct: " << EnabDisab(inRegValue & BIT(1)) << endl
2354  << "3:2 Pulldown Mode: " << EnabDisab(inRegValue & BIT(2));
2355  return oss.str();
2356  }
2357  } mDecodeChannelControlExt;
2358 
2359  struct DecodeSysmonVccIntDieTemp : public Decoder
2360  {
2361  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2362  {
2363  (void) inRegNum;
2364  (void) inDeviceID;
2365  UWord rawDieTemp (0);
2366  double dieTempC (0);
2367  if (NTV2DeviceCanDoVersalSysMon(inDeviceID))
2368  {
2369  rawDieTemp = (inRegValue & 0x0000FFFF);
2370  dieTempC = double(rawDieTemp) / 128.0;
2371  }
2372  else
2373  {
2374  rawDieTemp = ((inRegValue & 0x0000FFFF) >> 6);
2375  dieTempC = ((double(rawDieTemp)) * 503.975 / 1024.0 - 273.15 );
2376  }
2377  const UWord rawVoltage ((inRegValue >> 22) & 0x3FF);
2378  const double dieTempF (dieTempC * 9.0 / 5.0 + 32.0);
2379  const double voltage (double(rawVoltage)/ 1024.0 * 3.0);
2380  ostringstream oss;
2381  oss << "Die Temperature: " << fDEC(dieTempC,5,2) << " Celcius (" << fDEC(dieTempF,5,2) << " Fahrenheit)" << endl
2382  << "Core Voltage: " << fDEC(voltage,5,2) << " Volts DC";
2383  return oss.str();
2384  }
2385  } mDecodeSysmonVccIntDieTemp;
2386 
2387  struct DecodeSDITransmitCtrl : public Decoder
2388  {
2389  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2390  {
2391  (void) inRegNum;
2392  const UWord numInputs (::NTV2DeviceGetNumVideoInputs(inDeviceID));
2393  const UWord numOutputs (::NTV2DeviceGetNumVideoOutputs(inDeviceID));
2394  const UWord numSpigots (numInputs > numOutputs ? numInputs : numOutputs);
2395  ostringstream oss;
2396  if (::NTV2DeviceHasBiDirectionalSDI(inDeviceID))
2397  {
2398  const uint32_t txEnableBits (((inRegValue & 0x0F000000) >> 20) | ((inRegValue & 0xF0000000) >> 28));
2399  if (numSpigots)
2400  for (UWord spigot(0); spigot < numSpigots; )
2401  {
2402  const uint32_t txEnabled (txEnableBits & BIT(spigot));
2403  oss << "SDI " << DEC(++spigot) << ": " << (txEnabled ? "Output/Transmit" : "Input/Receive");
2404  if (spigot < numSpigots)
2405  oss << endl;
2406  }
2407  else
2408  oss << "(No SDI inputs or outputs)";
2409  }
2410  else
2411  oss << "(Bi-directional SDI not supported)";
2412  // CRC checking
2413  return oss.str();
2414  }
2415  } mDecodeSDITransmitCtrl;
2416 
2417  struct DecodeConversionCtrl : public Decoder
2418  {
2419  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2420  { (void) inRegNum;
2421  ostringstream oss;
2422  if (!::NTV2DeviceGetUFCVersion(inDeviceID))
2423  {
2424  const ULWord bitfileID((inRegValue & kK2RegMaskConverterInRate) >> kK2RegShiftConverterInRate);
2425  oss << "Bitfile ID: " << xHEX0N(bitfileID, 2) << endl
2426  << "Memory Test: Start: " << YesNo(inRegValue & BIT(28)) << endl
2427  << "Memory Test: Done: " << YesNo(inRegValue & BIT(29)) << endl
2428  << "Memory Test: Passed: " << YesNo(inRegValue & BIT(30));
2429  }
2430  else
2431  {
2432  const NTV2Standard inStd ( NTV2Standard( inRegValue & kK2RegMaskConverterInStandard ));
2439  oss << "Input Video Standard: " << ::NTV2StandardToString(inStd, true) << endl
2440  << "Input Video Frame Rate: " << ::NTV2FrameRateToString(inRate, true) << endl
2441  << "Output Video Standard: " << ::NTV2StandardToString(outStd, true) << endl
2442  << "Output Video Frame Rate: " << ::NTV2FrameRateToString(outRate, true) << endl
2443  << "Up Convert Mode: " << ::NTV2UpConvertModeToString(upCvtMode, true) << endl
2444  << "Down Convert Mode: " << ::NTV2DownConvertModeToString(dnCvtMode, true) << endl
2445  << "SD Anamorphic ISO Convert Mode: " << ::NTV2IsoConvertModeToString(isoCvtMode, true) << endl
2446  << "DownCvt 2-3 Pulldown: " << EnabDisab(inRegValue & kK2RegMaskConverterPulldown) << endl
2447  << "Vert Filter Preload: " << DisabEnab(inRegValue & BIT(7)) << endl
2448  << "Output Vid Std PsF (Deint Mode): " << EnabDisab(inRegValue & kK2RegMaskDeinterlaceMode) << endl
2449  << "Up Conv Line21 Pass|Blank Mode: " << DEC(ULWord(inRegValue & kK2RegMaskUCPassLine21) >> kK2RegShiftUCAutoLine21) << endl
2450  << "UFC Clock: " << EnabDisab(inRegValue & kK2RegMaskEnableConverter);
2451  }
2452  return oss.str();
2453  }
2454  } mConvControlRegDecoder;
2455 
2456  struct DecodeRelayCtrlStat : public Decoder
2457  {
2458  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2459  {
2460  (void) inRegNum;
2461  ostringstream oss;
2462  if (::NTV2DeviceHasSDIRelays(inDeviceID))
2463  {
2464  oss << "SDI1-SDI2 Relay Control: " << ThruDeviceOrBypassed(inRegValue & kRegMaskSDIRelayControl12) << endl
2465  << "SDI3-SDI4 Relay Control: " << ThruDeviceOrBypassed(inRegValue & kRegMaskSDIRelayControl34) << endl
2466  << "SDI1-SDI2 Relay Watchdog: " << EnabDisab(inRegValue & kRegMaskSDIWatchdogEnable12) << endl
2467  << "SDI3-SDI4 Relay Watchdog: " << EnabDisab(inRegValue & kRegMaskSDIWatchdogEnable34) << endl
2468  << "SDI1-SDI2 Relay Position: " << ThruDeviceOrBypassed(inRegValue & kRegMaskSDIRelayPosition12) << endl
2469  << "SDI3-SDI4 Relay Position: " << ThruDeviceOrBypassed(inRegValue & kRegMaskSDIRelayPosition34) << endl
2470  << "Watchdog Timer Status: " << ThruDeviceOrBypassed(inRegValue & kRegMaskSDIWatchdogStatus);
2471  }
2472  else
2473  oss << "(SDI bypass relays not supported)";
2474  return oss.str();
2475  }
2476  } mDecodeRelayCtrlStat;
2477 
2478  struct DecodeWatchdogTimeout : public Decoder
2479  {
2480  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2481  {
2482  (void) inRegNum;
2483  ostringstream oss;
2484  if (::NTV2DeviceHasSDIRelays(inDeviceID))
2485  {
2486  const uint32_t ticks8nanos (inRegValue); // number of 8-nanosecond ticks
2487  const double microsecs (double(ticks8nanos) * 8.0 / 1000.0);
2488  const double millisecs (microsecs / 1000.0);
2489  oss << "Watchdog Timeout [8-ns ticks]: " << xHEX0N(ticks8nanos,8) << " (" << DEC(ticks8nanos) << ")" << endl
2490  << "Watchdog Timeout [usec]: " << microsecs << endl
2491  << "Watchdog Timeout [msec]: " << millisecs;
2492  }
2493  else
2494  oss << "(SDI bypass relays not supported)";
2495  return oss.str();
2496  }
2497  } mDecodeWatchdogTimeout;
2498 
2499  struct DecodeWatchdogKick : public Decoder
2500  {
2501  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2502  {
2503  (void) inRegNum;
2504  ostringstream oss;
2505  if (::NTV2DeviceHasSDIRelays(inDeviceID))
2506  {
2507  const uint32_t whichReg(inRegNum - kRegSDIWatchdogKick1);
2508  NTV2_ASSERT(whichReg < 2);
2509  const uint32_t expectedValue(whichReg ? 0x01234567 : 0xA5A55A5A);
2510  oss << xHEX0N(inRegValue,8);
2511  if (inRegValue == expectedValue)
2512  oss << " (Normal)";
2513  else
2514  oss << " (Not expected, should be " << xHEX0N(expectedValue,8) << ")";
2515  }
2516  else
2517  oss << "(SDI bypass relays not supported)";
2518  return oss.str();
2519  }
2520  } mDecodeWatchdogKick;
2521 
2522  struct DecodeInputVPID: public Decoder
2523  {
2524  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2525  {
2526  (void) inRegNum;
2527  (void) inDeviceID;
2528  const uint32_t regValue (NTV2EndianSwap32(inRegValue)); // Input VPID register values require endian-swap
2529  ostringstream oss;
2530  AJALabelValuePairs info;
2531  const CNTV2VPID ntv2vpid(regValue);
2532  PrintLabelValuePairs(oss, ntv2vpid.GetInfo(info));
2533  return oss.str();
2534  }
2535  } mVPIDInpRegDecoder;
2536 
2537  struct DecodeOutputVPID: public Decoder
2538  {
2539  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2540  {
2541  (void) inRegNum;
2542  (void) inDeviceID;
2543  ostringstream oss;
2544  AJALabelValuePairs info;
2545  const CNTV2VPID ntv2vpid(inRegValue);
2546  PrintLabelValuePairs(oss, ntv2vpid.GetInfo(info));
2547  return oss.str();
2548  }
2549  } mVPIDOutRegDecoder;
2550 
2551  struct DecodeBitfileDateTime : public Decoder
2552  {
2553  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2554  {
2555  (void) inDeviceID;
2556  ostringstream oss;
2557  if (inRegNum == kRegBitfileDate)
2558  {
2559  const UWord yyyy ((inRegValue & 0xFFFF0000) >> 16);
2560  const UWord mm ((inRegValue & 0x0000FF00) >> 8);
2561  const UWord dd (inRegValue & 0x000000FF);
2562  if (yyyy > 0x2015 && mm > 0 && mm < 0x13 && dd > 0 && dd < 0x32)
2563  oss << "Bitfile Date: " << HEX0N(mm,2) << "/" << HEX0N(dd,2) << "/" << HEX0N(yyyy,4);
2564  else
2565  oss << "Bitfile Date: " << xHEX0N(inRegValue, 8);
2566  }
2567  else if (inRegNum == kRegBitfileTime)
2568  {
2569  const UWord hh ((inRegValue & 0x00FF0000) >> 16);
2570  const UWord mm ((inRegValue & 0x0000FF00) >> 8);
2571  const UWord ss (inRegValue & 0x000000FF);
2572  if (hh < 0x24 && mm < 0x60 && ss < 0x60)
2573  oss << "Bitfile Time: " << HEX0N(hh,2) << ":" << HEX0N(mm,2) << ":" << HEX0N(ss,2);
2574  else
2575  oss << "Bitfile Time: " << xHEX0N(inRegValue, 8);
2576  }
2577  else NTV2_ASSERT(false); // impossible
2578  return oss.str();
2579  }
2580  } mDecodeBitfileDateTime;
2581 
2582  struct DecodeBoardID : public Decoder
2583  {
2584  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2585  { (void) inRegNum; (void) inDeviceID;
2586  const string str1 (::NTV2DeviceIDToString(NTV2DeviceID(inRegValue), false));
2587  const string str2 (::NTV2DeviceIDToString(NTV2DeviceID(inRegValue), true));
2588  ostringstream oss;
2589  oss << "NTV2DeviceID: " << ::NTV2DeviceIDString(NTV2DeviceID(inRegValue)) << endl
2590  << "Device Name: '" << str1 << "'";
2591  if (str1 != str2)
2592  oss << endl
2593  << "Retail Device Name: '" << str2 << "'";
2594  return oss.str();
2595  }
2596  } mDecodeBoardID;
2597 
2598  struct DecodeDynFWUpdateCounts : public Decoder
2599  {
2600  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2601  { (void) inRegNum; (void) inDeviceID;
2602  ostringstream oss;
2603  oss << "# attempts: " << DEC(inRegValue >> 16) << endl
2604  << "# successes: " << DEC(inRegValue & 0x0000FFFF);
2605  return oss.str();
2606  }
2607  } mDecodeDynFWUpdateCounts;
2608 
2609  struct DecodeFWUserID : public Decoder
2610  {
2611  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2612  { (void) inRegNum; (void) inDeviceID;
2613  ostringstream oss;
2614  if (inRegValue)
2615  oss << "Current Design ID: " << xHEX0N(NTV2BitfileHeaderParser::GetDesignID(inRegValue),4) << endl
2616  << "Current Design Version: " << xHEX0N(NTV2BitfileHeaderParser::GetDesignVersion(inRegValue),4) << endl
2617  << "Current Bitfile ID: " << xHEX0N(NTV2BitfileHeaderParser::GetBitfileID(inRegValue),4) << endl
2618  << "Current Bitfile Version: " << xHEX0N(NTV2BitfileHeaderParser::GetBitfileVersion(inRegValue),4);
2619  return oss.str();
2620  }
2621  } mDecodeFirmwareUserID;
2622 
2623  struct DecodeCanDoStatus : public Decoder
2624  {
2625  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2626  { (void) inRegNum; (void) inDeviceID;
2627  ostringstream oss;
2628  oss << "Has CanConnect Xpt Route ROM: " << YesNo(inRegValue & BIT(0)) << endl
2629  << "AudioSystems can start on VBI: " << YesNo(inRegValue & BIT(1)) << endl
2630  << "Main Flash SPI Controller: " << YesNo(inRegValue & BIT(2)) << endl
2631  << "MB Flash SPI Controller: " << YesNo(inRegValue & BIT(3)) << endl
2632  << "Has Enhanced (NTV4) FrameStores: " << YesNo(inRegValue & BIT(4)) << endl
2633  << "Can report Mixer delay: " << YesNo(inRegValue & BIT(5)) << endl
2634  << "AncIns supports HANC insertion: " << YesNo(inRegValue & BIT(6));
2635  return oss.str();
2636  }
2637  } mDecodeCanDoStatus;
2638 
2639  struct DecodeVidControlReg : public Decoder // Bit31=Is16x9 | Bit30=IsMono
2640  {
2641  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2642  {
2643  (void) inRegNum;
2644  (void) inDeviceID;
2645  const bool is16x9 ((inRegValue & BIT(31)) != 0);
2646  const bool isMono ((inRegValue & BIT(30)) != 0);
2647  ostringstream oss;
2648  oss << "Aspect Ratio: " << (is16x9 ? "16x9" : "4x3") << endl
2649  << "Depth: " << (isMono ? "Monochrome" : "Color");
2650  return oss.str();
2651  }
2652  } mDecodeVidControlReg;
2653 
2654  struct DecodeVidIntControl : public Decoder
2655  {
2656  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2657  {
2658  (void) inRegNum;
2659  (void) inDeviceID;
2660  ostringstream oss;
2661  oss << "Output 1 Vertical Enable: " << YesNo(inRegValue & BIT(0)) << endl
2662  << "Input 1 Vertical Enable: " << YesNo(inRegValue & BIT(1)) << endl
2663  << "Input 2 Vertical Enable: " << YesNo(inRegValue & BIT(2)) << endl
2664  << "Audio Out Wrap Interrupt Enable: " << YesNo(inRegValue & BIT(4)) << endl
2665  << "Audio In Wrap Interrupt Enable: " << YesNo(inRegValue & BIT(5)) << endl
2666  << "Wrap Rate Interrupt Enable: " << YesNo(inRegValue & BIT(6)) << endl
2667  << "UART Tx Interrupt Enable" << YesNo(inRegValue & BIT(7)) << endl
2668  << "UART Rx Interrupt Enable" << YesNo(inRegValue & BIT(8)) << endl
2669  << "UART Rx Interrupt Clear" << ActInact(inRegValue & BIT(15)) << endl
2670  << "UART 2 Tx Interrupt Enable" << YesNo(inRegValue & BIT(17)) << endl
2671  << "Output 2 Vertical Enable: " << YesNo(inRegValue & BIT(18)) << endl
2672  << "Output 3 Vertical Enable: " << YesNo(inRegValue & BIT(19)) << endl
2673  << "Output 4 Vertical Enable: " << YesNo(inRegValue & BIT(20)) << endl
2674  << "Output 4 Vertical Clear: " << ActInact(inRegValue & BIT(21)) << endl
2675  << "Output 3 Vertical Clear: " << ActInact(inRegValue & BIT(22)) << endl
2676  << "Output 2 Vertical Clear: " << ActInact(inRegValue & BIT(23)) << endl
2677  << "UART Tx Interrupt Clear" << ActInact(inRegValue & BIT(24)) << endl
2678  << "Wrap Rate Interrupt Clear" << ActInact(inRegValue & BIT(25)) << endl
2679  << "UART 2 Tx Interrupt Clear" << ActInact(inRegValue & BIT(26)) << endl
2680  << "Audio Out Wrap Interrupt Clear" << ActInact(inRegValue & BIT(27)) << endl
2681  << "Input 2 Vertical Clear: " << ActInact(inRegValue & BIT(29)) << endl
2682  << "Input 1 Vertical Clear: " << ActInact(inRegValue & BIT(30)) << endl
2683  << "Output 1 Vertical Clear: " << ActInact(inRegValue & BIT(31));
2684  return oss.str();
2685  }
2686  } mDecodeVidIntControl;
2687 
2688  struct DecodeVidIntControl2 : public Decoder
2689  {
2690  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2691  {
2692  (void) inRegNum;
2693  (void) inDeviceID;
2694  ostringstream oss;
2695  oss << "Input 3 Vertical Enable: " << YesNo(inRegValue & BIT(1)) << endl
2696  << "Input 4 Vertical Enable: " << YesNo(inRegValue & BIT(2)) << endl
2697  << "Input 5 Vertical Enable: " << YesNo(inRegValue & BIT(8)) << endl
2698  << "Input 6 Vertical Enable: " << YesNo(inRegValue & BIT(9)) << endl
2699  << "Input 7 Vertical Enable: " << YesNo(inRegValue & BIT(10)) << endl
2700  << "Input 8 Vertical Enable: " << YesNo(inRegValue & BIT(11)) << endl
2701  << "Output 5 Vertical Enable: " << YesNo(inRegValue & BIT(12)) << endl
2702  << "Output 6 Vertical Enable: " << YesNo(inRegValue & BIT(13)) << endl
2703  << "Output 7 Vertical Enable: " << YesNo(inRegValue & BIT(14)) << endl
2704  << "Output 8 Vertical Enable: " << YesNo(inRegValue & BIT(15)) << endl
2705  << "Output 8 Vertical Clear: " << ActInact(inRegValue & BIT(16)) << endl
2706  << "Output 7 Vertical Clear: " << ActInact(inRegValue & BIT(17)) << endl
2707  << "Output 6 Vertical Clear: " << ActInact(inRegValue & BIT(18)) << endl
2708  << "Output 5 Vertical Clear: " << ActInact(inRegValue & BIT(19)) << endl
2709  << "Input 8 Vertical Clear: " << ActInact(inRegValue & BIT(25)) << endl
2710  << "Input 7 Vertical Clear: " << ActInact(inRegValue & BIT(26)) << endl
2711  << "Input 6 Vertical Clear: " << ActInact(inRegValue & BIT(27)) << endl
2712  << "Input 5 Vertical Clear: " << ActInact(inRegValue & BIT(28)) << endl
2713  << "Input 4 Vertical Clear: " << ActInact(inRegValue & BIT(29)) << endl
2714  << "Input 3 Vertical Clear: " << ActInact(inRegValue & BIT(30));
2715  return oss.str();
2716  }
2717  } mDecodeVidIntControl2;
2718 
2719  struct DecodeStatusReg : public Decoder
2720  {
2721  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2722  {
2723  (void) inRegNum;
2724  (void) inDeviceID;
2725  ostringstream oss;
2726  oss << "Input 1 Vertical Blank: " << ActInact(inRegValue & BIT(20)) << endl
2727  << "Input 1 Field ID: " << (inRegValue & BIT(21) ? "1" : "0") << endl
2728  << "Input 1 Vertical Interrupt: " << ActInact(inRegValue & BIT(30)) << endl
2729  << "Input 2 Vertical Blank: " << ActInact(inRegValue & BIT(18)) << endl
2730  << "Input 2 Field ID: " << (inRegValue & BIT(19) ? "1" : "0") << endl
2731  << "Input 2 Vertical Interrupt: " << ActInact(inRegValue & BIT(29)) << endl
2732  << "Output 1 Vertical Blank: " << ActInact(inRegValue & BIT(22)) << endl
2733  << "Output 1 Field ID: " << (inRegValue & BIT(23) ? "1" : "0") << endl
2734  << "Output 1 Vertical Interrupt: " << ActInact(inRegValue & BIT(31)) << endl
2735  << "Output 2 Vertical Blank: " << ActInact(inRegValue & BIT(4)) << endl
2736  << "Output 2 Field ID: " << (inRegValue & BIT(5) ? "1" : "0") << endl
2737  << "Output 2 Vertical Interrupt: " << ActInact(inRegValue & BIT(8)) << endl;
2738  if (::NTV2DeviceGetNumVideoOutputs(inDeviceID) > 2)
2739  oss << "Output 3 Vertical Blank: " << ActInact(inRegValue & BIT(2)) << endl
2740  << "Output 3 Field ID: " << (inRegValue & BIT(3) ? "1" : "0") << endl
2741  << "Output 3 Vertical Interrupt: " << ActInact(inRegValue & BIT(7)) << endl
2742  << "Output 4 Vertical Blank: " << ActInact(inRegValue & BIT(0)) << endl
2743  << "Output 4 Field ID: " << (inRegValue & BIT(1) ? "1" : "0") << endl
2744  << "Output 4 Vertical Interrupt: " << ActInact(inRegValue & BIT(6)) << endl;
2745  oss << "Aux Vertical Interrupt: " << ActInact(inRegValue & BIT(12)) << endl
2746  << "I2C 1 Interrupt: " << ActInact(inRegValue & BIT(14)) << endl
2747  << "I2C 2 Interrupt: " << ActInact(inRegValue & BIT(13)) << endl
2748  << "Chunk Rate Interrupt: " << ActInact(inRegValue & BIT(16)) << endl;
2749  if (::NTV2DeviceGetNumSerialPorts(inDeviceID))
2750  oss << "Generic UART Interrupt: " << ActInact(inRegValue & BIT(9)) << endl
2751  << "Uart 1 Rx Interrupt: " << ActInact(inRegValue & BIT(15)) << endl
2752  << "Uart 1 Tx Interrupt: " << ActInact(inRegValue & BIT(24)) << endl;
2753  if (::NTV2DeviceGetNumSerialPorts(inDeviceID) > 1)
2754  oss << "Uart 2 Tx Interrupt: " << ActInact(inRegValue & BIT(26)) << endl;
2755  if (::NTV2DeviceGetNumLTCInputs(inDeviceID))
2756  oss << "LTC In 1 Present: " << YesNo(inRegValue & BIT(17)) << endl;
2757  oss << "Wrap Rate Interrupt: " << ActInact(inRegValue & BIT(25)) << endl
2758  << "Audio Out Wrap Interrupt: " << ActInact(inRegValue & BIT(27)) << endl
2759  << "Audio 50Hz Interrupt: " << ActInact(inRegValue & BIT(28));
2760  return oss.str();
2761  }
2762  } mDecodeStatusReg;
2763 
2764  struct DecodeCPLDVersion : public Decoder
2765  {
2766  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2767  {
2768  (void) inRegNum;
2769  (void) inDeviceID;
2770  ostringstream oss;
2771  oss << "CPLD Version: " << DEC(inRegValue & (BIT(0)|BIT(1))) << endl
2772  << "Failsafe Bitfile Loaded: " << (inRegValue & BIT(4) ? "Yes" : "No") << endl
2773  << "Force Reload: " << YesNo(inRegValue & BIT(8));
2774  ULWord pcbRev ((inRegValue & 0xF0000000) >> 28);
2775  if (pcbRev) oss << endl
2776  << "PCB Version: " << xHEX0N(pcbRev,2);
2777  return oss.str();
2778  }
2779  } mDecodeCPLDVersion;
2780 
2781  struct DecodeStatus2Reg : public Decoder
2782  {
2783  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2784  {
2785  (void) inRegNum;
2786  (void) inDeviceID;
2787  static const uint8_t bitNumsInputVBlank[] = {20, 18, 16, 14, 12, 10}; // Input 3/4/5/6/7/8 Vertical Blank
2788  static const uint8_t bitNumsInputFieldID[] = {21, 19, 17, 15, 13, 11}; // Input 3/4/5/6/7/8 Field ID
2789  static const uint8_t bitNumsInputVertInt[] = {30, 29, 28, 27, 26, 25}; // Input 3/4/5/6/7/8 Vertical Interrupt
2790  static const uint8_t bitNumsOutputVBlank[] = { 8, 6, 4, 2}; // Output 5/6/7/8 Vertical Blank
2791  static const uint8_t bitNumsOutputFieldID[] = { 9, 7, 5, 3}; // Output 5/6/7/8 Field ID
2792  static const uint8_t bitNumsOutputVertInt[] = {31, 24, 23, 22}; // Output 5/6/7/8 Vertical Interrupt
2793  ostringstream oss;
2794  for (unsigned ndx(0); ndx < 6; ndx++)
2795  oss << "Input " << (ndx+3) << " Vertical Blank: " << ActInact(inRegValue & BIT(bitNumsInputVBlank[ndx])) << endl
2796  << "Input " << (ndx+3) << " Field ID: " << (inRegValue & BIT(bitNumsInputFieldID[ndx]) ? "1" : "0") << endl
2797  << "Input " << (ndx+3) << " Vertical Interrupt: " << ActInact(inRegValue & BIT(bitNumsInputVertInt[ndx])) << endl;
2798  for (unsigned ndx(0); ndx < 4; ndx++)
2799  oss << "Output " << (ndx+5) << " Vertical Blank: " << ActInact(inRegValue & BIT(bitNumsOutputVBlank[ndx])) << endl
2800  << "Output " << (ndx+5) << " Field ID: " << (inRegValue & BIT(bitNumsOutputFieldID[ndx]) ? "1" : "0") << endl
2801  << "Output " << (ndx+5) << " Vertical Interrupt: " << ActInact(inRegValue & BIT(bitNumsOutputVertInt[ndx])) << endl;
2802  oss << "HDMI In Hot-Plug Detect Interrupt: " << ActInact(inRegValue & BIT(0)) << endl
2803  << "HDMI In Chip Interrupt: " << ActInact(inRegValue & BIT(1));
2804  return oss.str();
2805  }
2806  } mDecodeStatus2Reg;
2807 
2808  struct DecodeInputStatusReg : public Decoder
2809  {
2810  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2811  {
2812  (void) inRegNum;
2813  (void) inDeviceID;
2814  NTV2FrameRate fRate1 (NTV2FrameRate( (inRegValue & (BIT( 0)|BIT( 1)|BIT( 2) )) | ((inRegValue & BIT(28)) >> (28-3)) ));
2815  NTV2FrameRate fRate2 (NTV2FrameRate(((inRegValue & (BIT( 8)|BIT( 9)|BIT(10) )) >> 8) | ((inRegValue & BIT(29)) >> (29-3)) ));
2816  NTV2FrameRate fRateRf (NTV2FrameRate(((inRegValue & (BIT(16)|BIT(17)|BIT(18)|BIT(19))) >> 16) ));
2817  ostringstream oss;
2818  oss << "Input 1 Frame Rate: " << ::NTV2FrameRateToString(fRate1, true) << endl
2819  << "Input 1 Geometry: ";
2820  if (BIT(30) & inRegValue)
2821  switch (((BIT(4)|BIT(5)|BIT(6)) & inRegValue) >> 4)
2822  {
2823  case 0: oss << "2K x 1080"; break;
2824  case 1: oss << "2K x 1556"; break;
2825  default: oss << "Invalid HI"; break;
2826  }
2827  else
2828  switch (((BIT(4)|BIT(5)|BIT(6)) & inRegValue) >> 4)
2829  {
2830  case 0: oss << "Unknown"; break;
2831  case 1: oss << "525"; break;
2832  case 2: oss << "625"; break;
2833  case 3: oss << "750"; break;
2834  case 4: oss << "1125"; break;
2835  case 5: oss << "1250"; break;
2836  case 6: case 7: oss << "Reserved"; break;
2837  default: oss << "Invalid LO"; break;
2838  }
2839  oss << endl
2840  << "Input 1 Scan Mode: " << ((BIT(7) & inRegValue) ? "Progressive" : "Interlaced") << endl
2841  << "Input 2 Frame Rate: " << ::NTV2FrameRateToString(fRate2, true) << endl
2842  << "Input 2 Geometry: ";
2843  if (BIT(31) & inRegValue)
2844  switch (((BIT(12)|BIT(13)|BIT(14)) & inRegValue) >> 12)
2845  {
2846  case 0: oss << "2K x 1080"; break;
2847  case 1: oss << "2K x 1556"; break;
2848  default: oss << "Invalid HI"; break;
2849  }
2850  else
2851  switch (((BIT(12)|BIT(13)|BIT(14)) & inRegValue) >> 12)
2852  {
2853  case 0: oss << "Unknown"; break;
2854  case 1: oss << "525"; break;
2855  case 2: oss << "625"; break;
2856  case 3: oss << "750"; break;
2857  case 4: oss << "1125"; break;
2858  case 5: oss << "1250"; break;
2859  case 6: case 7: oss << "Reserved"; break;
2860  default: oss << "Invalid LO"; break;
2861  }
2862  oss << endl
2863  << "Input 2 Scan Mode: " << ((BIT(15) & inRegValue) ? "Progressive" : "Interlaced") << endl
2864  << "Reference Frame Rate: " << ::NTV2FrameRateToString(fRateRf, true) << endl
2865  << "Reference Geometry: ";
2866  switch (((BIT(20)|BIT(21)|BIT(22)) & inRegValue) >> 20) // Ref scan geometry
2867  {
2868  case 0: oss << "NTV2_SG_UNKNOWN"; break;
2869  case 1: oss << "NTV2_SG_525"; break;
2870  case 2: oss << "NTV2_SG_625"; break;
2871  case 3: oss << "NTV2_SG_750"; break;
2872  case 4: oss << "NTV2_SG_1125"; break;
2873  case 5: oss << "NTV2_SG_1250"; break;
2874  default: oss << "Invalid"; break;
2875  }
2876  oss << endl
2877  << "Reference Scan Mode: " << ((BIT(23) & inRegValue) ? "Progressive" : "Interlaced") << endl
2878  << "AES Channel 1-2: " << ((BIT(24) & inRegValue) ? "Invalid" : "Valid") << endl
2879  << "AES Channel 3-4: " << ((BIT(25) & inRegValue) ? "Invalid" : "Valid") << endl
2880  << "AES Channel 5-6: " << ((BIT(26) & inRegValue) ? "Invalid" : "Valid") << endl
2881  << "AES Channel 7-8: " << ((BIT(27) & inRegValue) ? "Invalid" : "Valid");
2882  return oss.str();
2883  }
2884  } mDecodeInputStatusReg;
2885 
2886  struct DecodeSDIInputStatusReg : public Decoder
2887  {
2888  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2889  {
2890  (void) inDeviceID;
2891  uint16_t numSpigots(0), startSpigot(0), doTsiMuxSync(0);
2892  ostringstream oss;
2893  switch (inRegNum)
2894  {
2895  case kRegSDIInput3GStatus: numSpigots = 2; startSpigot = 1; doTsiMuxSync = 1; break;
2896  case kRegSDIInput3GStatus2: numSpigots = 2; startSpigot = 3; break;
2897  case kRegSDI5678Input3GStatus: numSpigots = 4; startSpigot = 5; break;
2898  }
2899  if ((startSpigot-1) >= ::NTV2DeviceGetNumVideoInputs(inDeviceID))
2900  return oss.str(); // Skip if no such SDI inputs
2901 
2902  for (uint16_t spigotNdx(0); spigotNdx < numSpigots; )
2903  {
2904  const uint16_t spigotNum (spigotNdx + startSpigot);
2905  const uint8_t statusBits ((inRegValue >> (spigotNdx*8)) & 0xFF);
2906  const uint8_t speedBits (statusBits & 0xC1);
2907  ostringstream ossSpeed, ossSpigot;
2908  ossSpigot << "SDI In " << spigotNum << " ";
2909  const string spigotLabel (ossSpigot.str());
2910  if (speedBits & 0x01) ossSpeed << " 3G";
2911  if (::NTV2DeviceCanDo12GSDI(inDeviceID))
2912  {
2913  if (speedBits & 0x40) ossSpeed << " 6G";
2914  if (speedBits & 0x80) ossSpeed << " 12G";
2915  }
2916  if (speedBits == 0) ossSpeed << " 1.5G";
2917  oss << spigotLabel << "Link Speed:" << ossSpeed.str() << endl
2918  << spigotLabel << "SMPTE Level B: " << YesNo(statusBits & 0x02) << endl
2919  << spigotLabel << "Link A VPID Valid: " << YesNo(statusBits & 0x10) << endl
2920  << spigotLabel << "Link B VPID Valid: " << YesNo(statusBits & 0x20) << endl;
2921  if (::NTV2DeviceCanDo3GLevelConversion(inDeviceID))
2922  oss << spigotLabel << "3Gb-to-3Ga Conversion: " << EnabDisab(statusBits & 0x04);
2923  else
2924  oss << spigotLabel << "3Gb-to-3Ga Conversion: n/a";
2925  if (++spigotNdx < numSpigots)
2926  oss << endl;
2927  } // for each spigot
2928  if (doTsiMuxSync && ::NTV2DeviceCanDo425Mux(inDeviceID))
2929  for (UWord tsiMux(0); tsiMux < 4; ++tsiMux)
2930  oss << endl
2931  << "TsiMux" << DEC(tsiMux+1) << " Sync Fail: " << ((inRegValue & (0x00010000UL << tsiMux)) ? "FAILED" : "OK");
2932  return oss.str();
2933  }
2934  } mDecodeSDIInputStatusReg;
2935 
2936  struct DecodeSDIInputStatus2Reg : public Decoder
2937  {
2938  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2939  {
2940  (void) inDeviceID;
2941  const string sOdd (inRegNum == kRegInputStatus2 ? "Input 3" : (inRegNum == kRegInput56Status ? "Input 5" : "Input 7"));
2942  const string sEven (inRegNum == kRegInputStatus2 ? "Input 4" : (inRegNum == kRegInput56Status ? "Input 6" : "Input 8"));
2943  const NTV2FrameRate fRate1 (NTV2FrameRate( (inRegValue & (BIT( 0)|BIT( 1)|BIT( 2) )) | ((inRegValue & BIT(28)) >> (28-3)) ));
2944  const NTV2FrameRate fRate2 (NTV2FrameRate(((inRegValue & (BIT( 8)|BIT( 9)|BIT(10) )) >> 8) | ((inRegValue & BIT(29)) >> (29-3)) ));
2945  ostringstream oss;
2946  oss << sOdd << " Scan Mode: " << ((BIT(7) & inRegValue) ? "Progressive" : "Interlaced") << endl
2947  << sOdd << " Frame Rate: " << ::NTV2FrameRateToString(fRate1, true) << endl
2948  << sOdd << " Geometry: ";
2949  if (BIT(30) & inRegValue) switch (((BIT(4)|BIT(5)|BIT(6)) & inRegValue) >> 4)
2950  {
2951  case 0: oss << "2K x 1080"; break;
2952  case 1: oss << "2K x 1556"; break;
2953  default: oss << "Invalid HI"; break;
2954  }
2955  else switch (((BIT(4)|BIT(5)|BIT(6)) & inRegValue) >> 4)
2956  {
2957  case 0: oss << "Unknown"; break;
2958  case 1: oss << "525"; break;
2959  case 2: oss << "625"; break;
2960  case 3: oss << "750"; break;
2961  case 4: oss << "1125"; break;
2962  case 5: oss << "1250"; break;
2963  case 6: case 7: oss << "Reserved"; break;
2964  default: oss << "Invalid LO"; break;
2965  }
2966  oss << endl
2967  << sEven << " Scan Mode: " << ((BIT(15) & inRegValue) ? "Progressive" : "Interlaced") << endl
2968  << sEven << " Frame Rate: " << ::NTV2FrameRateToString(fRate2, true) << endl
2969  << sEven << " Geometry: ";
2970  if (BIT(31) & inRegValue) switch (((BIT(12)|BIT(13)|BIT(14)) & inRegValue) >> 12)
2971  {
2972  case 0: oss << "2K x 1080"; break;
2973  case 1: oss << "2K x 1556"; break;
2974  default: oss << "Invalid HI"; break;
2975  }
2976  else switch (((BIT(12)|BIT(13)|BIT(14)) & inRegValue) >> 12)
2977  {
2978  case 0: oss << "Unknown"; break;
2979  case 1: oss << "525"; break;
2980  case 2: oss << "625"; break;
2981  case 3: oss << "750"; break;
2982  case 4: oss << "1125"; break;
2983  case 5: oss << "1250"; break;
2984  case 6: case 7: oss << "Reserved"; break;
2985  default: oss << "Invalid LO"; break;
2986  }
2987  return oss.str();
2988  }
2989  } mDecodeSDIInputStatus2Reg;
2990 
2991  struct DecodeFS1RefSelectReg : public Decoder
2992  {
2993  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2994  {
2995  (void) inDeviceID; (void) inRegNum; // kRegFS1ReferenceSelect
2996  ostringstream oss;
2997  oss << "BNC Select(LHi): " << (inRegValue & 0x00000010 ? "LTCIn1" : "Ref") << endl
2998  << "Ref BNC (Corvid): " << EnabDisab(inRegValue & 0x00000020) << endl
2999  << "LTC Present (also Reg 21): " << YesNo(inRegValue & 0x00000040) << endl
3000  << "LTC Emb Out Enable: " << YesNo(inRegValue & 0x00000080) << endl
3001  << "LTC Emb In Enable: " << YesNo(inRegValue & 0x00000100) << endl
3002  << "LTC Emb In Received: " << YesNo(inRegValue & 0x00000200) << endl
3003  << "LTC BNC Out Source: " << (inRegValue & 0x00000400 ? "E-E" : "Reg112/113");
3004  return oss.str();
3005  }
3006  } mDecodeFS1RefSelectReg;
3007 
3008  struct DecodeLTCStatusControlReg : public Decoder
3009  {
3010  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3011  {
3012  (void) inDeviceID; (void) inRegNum; // kRegLTCStatusControl
3013  const uint16_t LTC1InTimingSelect ((inRegValue >> 1) & 0x0000007);
3014  const uint16_t LTC2InTimingSelect ((inRegValue >> 9) & 0x0000007);
3015  const uint16_t LTC1OutTimingSelect ((inRegValue >> 16) & 0x0000007);
3016  const uint16_t LTC2OutTimingSelect ((inRegValue >> 20) & 0x0000007);
3017  ostringstream oss;
3018  oss << "LTC 1 Input Present: " << YesNo(inRegValue & 0x00000001) << endl
3019  << "LTC 1 Input FB Timing Select): " << xHEX0N(LTC1InTimingSelect,2) << " (" << DEC(LTC1InTimingSelect) << ")" << endl
3020  << "LTC 1 Bypass: " << EnabDisab(inRegValue & 0x00000010) << endl
3021  << "LTC 1 Bypass Select: " << DEC(ULWord((inRegValue >> 5) & 0x00000001)) << endl
3022  << "LTC 2 Input Present: " << YesNo(inRegValue & 0x00000100) << endl
3023  << "LTC 2 Input FB Timing Select): " << xHEX0N(LTC2InTimingSelect,2) << " (" << DEC(LTC2InTimingSelect) << ")" << endl
3024  << "LTC 2 Bypass: " << EnabDisab(inRegValue & 0x00001000) << endl
3025  << "LTC 2 Bypass Select: " << DEC(ULWord((inRegValue >> 13) & 0x00000001)) << endl
3026  << "LTC 1 Output FB Timing Select): " << xHEX0N(LTC1OutTimingSelect,2) << " (" << DEC(LTC1OutTimingSelect) << ")" << endl
3027  << "LTC 2 Output FB Timing Select): " << xHEX0N(LTC2OutTimingSelect,2) << " (" << DEC(LTC2OutTimingSelect) << ")";
3028  return oss.str();
3029  }
3030  } mLTCStatusControlDecoder;
3031 
3032  struct DecodeAudDetectReg : public Decoder
3033  {
3034  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3035  {
3036  (void) inDeviceID;
3037  ostringstream oss;
3038  switch (inRegNum)
3039  {
3040  case kRegAud1Detect:
3041  case kRegAudDetect2:
3042  for (uint16_t num(0); num < 8; )
3043  {
3044  const uint16_t group (num / 2);
3045  const bool isChan34 (num & 1);
3046  oss << "Group " << group << " CH " << (isChan34 ? "3-4: " : "1-2: ") << (inRegValue & BIT(num) ? "Present" : "Absent");
3047  if (++num < 8)
3048  oss << endl;
3049  }
3050  break;
3051 
3052  case kRegAudioDetect5678:
3053  break;
3054  }
3055  return oss.str();
3056  }
3057  } mDecodeAudDetectReg;
3058 
3059  struct DecodeAudControlReg : public Decoder
3060  {
3061  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3062  {
3063  (void) inRegNum;
3064  (void) inDeviceID;
3065  static const string ChStrs [] = { "Ch 1/2", "Ch 3/4", "Ch 5/6", "Ch 7/8" };
3066  uint16_t sdiOutput (0);
3067  switch (inRegNum)
3068  { case kRegAud1Control: sdiOutput = 1; break;
3069  case kRegAud3Control: sdiOutput = 3; break;
3070  case kRegAud5Control: sdiOutput = 5; break;
3071  case kRegAud7Control: sdiOutput = 7; break;
3072  default: break;
3073  }
3074 
3075  ostringstream oss;
3076  oss << "Audio Capture: " << EnabDisab(BIT(0) & inRegValue) << endl
3077  << "Audio Loopback: " << EnabDisab(BIT(3) & inRegValue) << endl
3078  << "Audio Input: " << DisabEnab(BIT(8) & inRegValue) << endl
3079  << "Audio Output: " << DisabEnab(BIT(9) & inRegValue) << endl
3080  << "Output Paused: " << YesNo(BIT(11) & inRegValue) << endl;
3081  if (sdiOutput)
3082  oss << "Audio Embedder SDIOut" << sdiOutput << ": " << DisabEnab(BIT(13) & inRegValue) << endl
3083  << "Audio Embedder SDIOut" << (sdiOutput+1) << ": " << DisabEnab(BIT(15) & inRegValue) << endl;
3084 
3085  oss << "A/V Sync Mode: " << EnabDisab(BIT(15) & inRegValue) << endl
3086  << "AES Rate Converter: " << DisabEnab(BIT(19) & inRegValue) << endl
3087  << "Audio Buffer Format: " << (BIT(20) & inRegValue ? "16-Channel " : (BIT(16) & inRegValue ? "8-Channel " : "6-Channel ")) << endl
3088  << (BIT(18) & inRegValue ? "96kHz" : "48kHz") << endl
3089  << (BIT(18) & inRegValue ? "96kHz Support" : "48kHz Support") << endl
3090  // << (BIT(22) & inRegValue ? "Embedded Support" : "No Embedded Support") << endl // JeffL says this bit is obsolete
3091  << "Slave Mode (64-chl): " << EnabDisab(BIT(23) & inRegValue) << endl // Redeployed in 16.2 for 64-ch audio
3092  << "K-box, Monitor: " << ChStrs [(BIT(24) & BIT(25) & inRegValue) >> 24] << endl
3093  << "K-Box Input: " << (BIT(26) & inRegValue ? "XLR" : "BNC") << endl
3094  << "K-Box: " << (BIT(27) & inRegValue ? "Present" : "Absent") << endl
3095  << "Cable: " << (BIT(28) & inRegValue ? "XLR" : "BNC") << endl
3096  << "Audio Buffer Size: " << (BIT(31) & inRegValue ? "4 MB" : "1 MB");
3097  return oss.str();
3098  }
3099  } mDecodeAudControlReg;
3100 
3101  struct DecodeAudSourceSelectReg : public Decoder
3102  {
3103  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3104  {
3105  (void) inRegNum;
3106  (void) inDeviceID;
3107  static const string SrcStrs [] = { "AES Input", "Embedded Groups 1 and 2", "" };
3108  static const unsigned SrcStrMap [] = { 0, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 };
3109  const uint16_t vidInput = (inRegValue & BIT(23) ? 2 : 0) + (inRegValue & BIT(16) ? 1 : 0);
3110  // WARNING! BIT(23) had better be clear on 0 & 1-input boards!!
3111  ostringstream oss;
3112  oss << "Audio Source: " << SrcStrs [SrcStrMap [(BIT(0) | BIT(1) | BIT(2) | BIT(3)) & inRegValue]] << endl
3113  << "Embedded Source Select: Video Input " << (1 + vidInput) << endl
3114  << "AES Sync Mode bit (fib): " << EnabDisab(inRegValue & BIT(18)) << endl
3115  << "PCM disabled: " << YesNo(inRegValue & BIT(17)) << endl
3116  << "Erase head enable: " << YesNo(inRegValue & BIT(19)) << endl
3117  << "Embedded Clock Select: " << (inRegValue & BIT(22) ? "Video Input" : "Board Reference") << endl
3118  << "3G audio source: " << (inRegValue & BIT(21) ? "Data stream 2" : "Data stream 1");
3119  return oss.str();
3120  }
3121  } mDecodeAudSourceSelectReg;
3122 
3123  struct DecodeAudOutputSrcMap : public Decoder
3124  {
3125  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3126  {
3127  (void) inRegNum;
3128  (void) inDeviceID;
3129  static const string AESOutputStrs[] = { "AES Outputs 1-4", "AES Outputs 5-8", "AES Outputs 9-12", "AES Outputs 13-16", ""};
3130  static const string SrcStrs[] = { "AudSys1, Audio Channels 1-4", "AudSys1, Audio Channels 5-8",
3131  "AudSys1, Audio Channels 9-12", "AudSys1, Audio Channels 13-16",
3132  "AudSys2, Audio Channels 1-4", "AudSys2, Audio Channels 5-8",
3133  "AudSys2, Audio Channels 9-12", "AudSys2, Audio Channels 13-16",
3134  "AudSys3, Audio Channels 1-4", "AudSys3, Audio Channels 5-8",
3135  "AudSys3, Audio Channels 9-12", "AudSys3, Audio Channels 13-16",
3136  "AudSys4, Audio Channels 1-4", "AudSys4, Audio Channels 5-8",
3137  "AudSys4, Audio Channels 9-12", "AudSys4, Audio Channels 13-16", ""};
3138  static const unsigned AESChlMappingShifts [4] = {0, 4, 8, 12};
3139 
3140  ostringstream oss;
3141  const uint32_t AESOutMapping (inRegValue & 0x0000FFFF);
3142  const uint32_t AnlgMonInfo ((inRegValue & kRegMaskMonitorSource) >> kRegShiftMonitorSource);
3143  const NTV2AudioSystem AnlgMonAudSys (NTV2AudioSystem(AnlgMonInfo >> 4));
3144  const NTV2AudioChannelPair AnlgMonChlPair (NTV2AudioChannelPair(AnlgMonInfo & 0xF));
3145  for (unsigned AESOutputQuad(0); AESOutputQuad < 4; AESOutputQuad++)
3146  oss << AESOutputStrs[AESOutputQuad] << " Source: " << SrcStrs[(AESOutMapping >> AESChlMappingShifts[AESOutputQuad]) & 0x0000000F] << endl;
3147  oss << "Analog Audio Monitor Output Source: " << ::NTV2AudioSystemToString(AnlgMonAudSys,true) << ", Channels " << ::NTV2AudioChannelPairToString(AnlgMonChlPair,true) << endl;
3148 
3149  // HDMI Audio Output Mapping -- interpretation depends on bit 29 of register 125 kRegHDMIOutControl MULTIREG_SPARSE_BITS
3150  const uint32_t HDMIMonInfo ((inRegValue & kRegMaskHDMIOutAudioSource) >> kRegShiftHDMIOutAudioSource);
3151  {
3152  // HDMI Audio 2-channel Mode:
3153  const NTV2AudioSystem HDMIMonAudSys (NTV2AudioSystem(HDMIMonInfo >> 4));
3154  const NTV2AudioChannelPair HDMIMonChlPair (NTV2AudioChannelPair(HDMIMonInfo & 0xF));
3155  oss << "HDMI 2-Chl Audio Output Source: " << ::NTV2AudioSystemToString(HDMIMonAudSys,true) << ", Channels " << ::NTV2AudioChannelPairToString(HDMIMonChlPair,true) << endl;
3156  }
3157  {
3158  // HDMI Audio 8-channel Mode:
3159  const uint32_t HDMIMon1234Info (HDMIMonInfo & 0x0F);
3160  const NTV2AudioSystem HDMIMon1234AudSys (NTV2AudioSystem(HDMIMon1234Info >> 2));
3161  const NTV2Audio4ChannelSelect HDMIMon1234SrcPairs (NTV2Audio4ChannelSelect(HDMIMon1234Info & 0x3));
3162  const uint32_t HDMIMon5678Info ((HDMIMonInfo >> 4) & 0x0F);
3163  const NTV2AudioSystem HDMIMon5678AudSys (NTV2AudioSystem(HDMIMon5678Info >> 2));
3164  const NTV2Audio4ChannelSelect HDMIMon5678SrcPairs (NTV2Audio4ChannelSelect(HDMIMon5678Info & 0x3));
3165  oss << "or HDMI 8-Chl Audio Output 1-4 Source: " << ::NTV2AudioSystemToString(HDMIMon1234AudSys,true) << ", Channels " << ::NTV2AudioChannelQuadToString(HDMIMon1234SrcPairs,true) << endl
3166  << "or HDMI 8-Chl Audio Output 5-8 Source: " << ::NTV2AudioSystemToString(HDMIMon5678AudSys,true) << ", Channels " << ::NTV2AudioChannelQuadToString(HDMIMon5678SrcPairs,true);
3167  }
3168  return oss.str();
3169  }
3170  } mDecodeAudOutputSrcMap;
3171 
3172  struct DecodePCMControlReg : public Decoder
3173  {
3174  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3175  {
3176  (void) inDeviceID;
3177  ostringstream oss;
3178  const UWord startAudioSystem (inRegNum == kRegPCMControl4321 ? 1 : 5);
3179  for (uint8_t audChan (0); audChan < 4; audChan++)
3180  {
3181  oss << "Audio System " << (startAudioSystem + audChan) << ": ";
3182  const uint8_t pcmBits (uint32_t(inRegValue >> (audChan * 8)) & 0x000000FF);
3183  if (pcmBits == 0x00)
3184  oss << "normal";
3185  else
3186  {
3187  oss << "non-PCM channels";
3188  for (uint8_t chanPair (0); chanPair < 8; chanPair++)
3189  if (pcmBits & (0x01 << chanPair))
3190  oss << " " << (chanPair*2+1) << "-" << (chanPair*2+2);
3191  }
3192  if (audChan < 3)
3193  oss << endl;
3194  }
3195  return oss.str();
3196  }
3197  } mDecodePCMControlReg;
3198 
3199  struct DecodeAudioMixerInputSelectReg : public Decoder
3200  { // kRegAudioMixerInputSelects
3201  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3202  { (void) inDeviceID; (void) inRegNum;
3203  const UWord mainInputSrc((inRegValue ) & 0x0000000F);
3204  const UWord aux1InputSrc((inRegValue >> 4) & 0x0000000F);
3205  const UWord aux2InputSrc((inRegValue >> 8) & 0x0000000F);
3206  ostringstream oss;
3207  oss << "Main Input Source: " << ::NTV2AudioSystemToString(NTV2AudioSystem(mainInputSrc)) << " (bits 0-3)" << endl
3208  << "Aux Input 1 Source: " << ::NTV2AudioSystemToString(NTV2AudioSystem(aux1InputSrc)) << " (bits 4-7)" << endl
3209  << "Aux Input 2 Source: " << ::NTV2AudioSystemToString(NTV2AudioSystem(aux2InputSrc)) << " (bits 8-11)";
3210  return oss.str();
3211  }
3212  } mAudMxrInputSelDecoder;
3213 
3214  struct DecodeAudioMixerGainRegs : public Decoder
3215  { // kRegAudioMixerMainGain,
3216  // kRegAudioMixerAux1GainCh1, kRegAudioMixerAux1GainCh2,
3217  // kRegAudioMixerAux2GainCh1, kRegAudioMixerAux2GainCh2
3218  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3219  { (void)inRegNum; (void)inDeviceID;
3220  static const double kUnityGain (0x00010000);
3221  const bool atUnity (inRegValue == 0x00010000);
3222  ostringstream oss;
3223  if (atUnity)
3224  oss << "Gain: 0 dB (Unity)";
3225  else
3226  {
3227  const double dValue (inRegValue);
3228  const bool aboveUnity (inRegValue >= 0x00010000);
3229  const string plusMinus (atUnity ? "" : (aboveUnity ? "+" : "-"));
3230  const string aboveBelow (atUnity ? "at" : (aboveUnity ? "above" : "below"));
3231  const uint32_t unityDiff (aboveUnity ? inRegValue - 0x00010000 : 0x00010000 - inRegValue);
3232  const double dB (double(20.0) * ::log10(dValue/kUnityGain));
3233  oss << "Gain: " << dB << " dB, " << plusMinus << xHEX0N(unityDiff,6)
3234  << " (" << plusMinus << DEC(unityDiff) << ") " << aboveBelow << " unity gain";
3235  }
3236  return oss.str();
3237  }
3238  } mAudMxrGainDecoder;
3239 
3240  struct DecodeAudioMixerChannelSelectReg : public Decoder
3241  { // kRegAudioMixerChannelSelect
3242  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3243  { (void) inRegNum; (void) inDeviceID;
3244  ostringstream oss;
3245  const uint32_t mainChanPair((inRegValue & kRegMaskAudioMixerChannelSelect ) >> kRegShiftAudioMixerChannelSelect );
3246  const uint32_t powerOfTwo ((inRegValue & kRegMaskAudioMixerLevelSampleCount) >> kRegShiftAudioMixerLevelSampleCount);
3247  oss << "Main Input Source Channel Pair: " << ::NTV2AudioChannelPairToString(NTV2AudioChannelPair(mainChanPair)) << " (bits 0-2)" << endl
3248  << "Level Measurement Sample Count: " << DEC(ULWord(1 << powerOfTwo)) << " (bits 8-15)";
3249  return oss.str();
3250  }
3251  } mAudMxrChanSelDecoder;
3252 
3253 
3254  struct DecodeAudioMixerMutesReg : public Decoder
3255  { // kRegAudioMixerMutes
3256  protected:
3257  typedef std::bitset<16> AudioChannelSet16;
3258  typedef std::bitset<2> AudioChannelSet2;
3259  static void SplitAudioChannelSet16(const AudioChannelSet16 & inChSet, NTV2StringList & outSet, NTV2StringList & outClear)
3260  {
3261  outSet.clear(); outClear.clear();
3262  for (size_t ndx(0); ndx < 16; ndx++)
3263  { ostringstream oss; oss << DEC(ndx+1);
3264  if (inChSet.test(ndx))
3265  outSet.push_back(oss.str());
3266  else
3267  outClear.push_back(oss.str());
3268  }
3269  if (outSet.empty()) outSet.push_back("<none>");
3270  if (outClear.empty()) outClear.push_back("<none>");
3271  }
3272  static void SplitAudioChannelSet2(const AudioChannelSet2 & inChSet, NTV2StringList & outSet, NTV2StringList & outClear)
3273  {
3274  outSet.clear(); outClear.clear(); static const string LR[] = {"L", "R"};
3275  for (size_t ndx(0); ndx < 2; ndx++)
3276  if (inChSet.test(ndx))
3277  outSet.push_back(LR[ndx]);
3278  else
3279  outClear.push_back(LR[ndx]);
3280  if (outSet.empty()) outSet.push_back("<none>");
3281  if (outClear.empty()) outClear.push_back("<none>");
3282  }
3283  public:
3284  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3285  { (void) inRegNum; (void) inDeviceID;
3286  uint32_t mainOutputMuteBits ((inRegValue & kRegMaskAudioMixerOutputChannelsMute) >> kRegShiftAudioMixerOutputChannelsMute); // Bits 0-15
3287  uint32_t mainInputMuteBits ((inRegValue & kRegMaskAudioMixerMainInputEnable ) >> kRegShiftAudioMixerMainInputEnable ); // Bits 16-17
3288  uint32_t aux1InputMuteBits ((inRegValue & kRegMaskAudioMixerAux1InputEnable ) >> kRegShiftAudioMixerAux1InputEnable ); // Bits 18-19
3289  uint32_t aux2InputMuteBits ((inRegValue & kRegMaskAudioMixerAux2InputEnable ) >> kRegShiftAudioMixerAux2InputEnable ); // Bits 20-21
3290  ostringstream oss;
3291  NTV2StringList mutedMainOut, unmutedMainOut, mutedMain, unmutedMain, mutedAux1, unmutedAux1, mutedAux2, unmutedAux2;
3292  SplitAudioChannelSet16(AudioChannelSet16(mainOutputMuteBits), mutedMainOut, unmutedMainOut);
3293  SplitAudioChannelSet2(AudioChannelSet2(mainInputMuteBits), mutedMain, unmutedMain);
3294  SplitAudioChannelSet2(AudioChannelSet2(aux1InputMuteBits), mutedAux1, unmutedAux1);
3295  SplitAudioChannelSet2(AudioChannelSet2(aux2InputMuteBits), mutedAux2, unmutedAux2);
3296  oss << "Main Output Muted/Disabled Channels: " << mutedMainOut << endl // bits[0:15]
3297  << "Main Output Unmuted/Enabled Channels: " << unmutedMainOut << endl;
3298  oss << "Main Input Muted/Disabled Channels: " << mutedMain << endl // bits[16:17]
3299  << "Main Input Unmuted/Enabled Channels: " << unmutedMain << endl;
3300  oss << "Aux Input 1 Muted/Disabled Channels: " << mutedAux1 << endl // bits[18:19]
3301  << "Aux Input 1 Unmuted/Enabled Channels: " << unmutedAux1 << endl;
3302  oss << "Aux Input 2 Muted/Disabled Channels: " << mutedAux2 << endl // bits[20-21]
3303  << "Aux Input 2 Unmuted/Enabled Channels: " << unmutedAux2;
3304  return oss.str();
3305  }
3306  } mAudMxrMutesDecoder;
3307 
3308  struct DecodeAudioMixerLevelsReg : public Decoder
3309  { // kRegAudioMixerAux1InputLevels, kRegAudioMixerAux2InputLevels,
3310  // kRegAudioMixerMainInputLevelsPair0 thru kRegAudioMixerMainInputLevelsPair7,
3311  // kRegAudioMixerMixedChannelOutputLevels
3312  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3313  { (void) inDeviceID;
3314  static const string sLabels[] = { "Aux Input 1", "Aux Input 2", "Main Input Audio Channels 1|2", "Main Input Audio Channels 3|4",
3315  "Main Input Audio Channels 5|6", "Main Input Audio Channels 7|8", "Main Input Audio Channels 9|10",
3316  "Main Input Audio Channels 11|12", "Main Input Audio Channels 13|14", "Main Input Audio Channels 15|16",
3317  "Main Output Audio Channels 1|2", "Main Output Audio Channels 3|4", "Main Output Audio Channels 5|6",
3318  "Main Output Audio Channels 7|8", "Main Output Audio Channels 9|10", "Main Output Audio Channels 11|12",
3319  "Main Output Audio Channels 13|14", "Main Output Audio Channels 15|16"};
3321  const uint32_t labelOffset(inRegNum - kRegAudioMixerAux1InputLevels);
3322  NTV2_ASSERT(labelOffset < 18);
3323  const string & label(sLabels[labelOffset]);
3324  const uint16_t leftLevel ((inRegValue & kRegMaskAudioMixerInputLeftLevel) >> kRegShiftAudioMixerInputLeftLevel);
3325  const uint16_t rightLevel ((inRegValue & kRegMaskAudioMixerInputRightLevel) >> kRegShiftAudioMixerInputRightLevel);
3326  ostringstream oss;
3327  oss << label << " Left Level:" << xHEX0N(leftLevel, 4) << " (" << DEC(leftLevel) << ")" << endl // bits[0:15]
3328  << label << " Right Level:" << xHEX0N(rightLevel,4) << " (" << DEC(rightLevel) << ")"; // bits[16:31]
3329  return oss.str();
3330  }
3331  } mAudMxrLevelDecoder;
3332 
3333  struct DecodeAncExtControlReg : public Decoder
3334  {
3335  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3336  {
3337  (void) inRegNum;
3338  (void) inDeviceID;
3339  ostringstream oss;
3340  static const string SyncStrs [] = { "field", "frame", "immediate", "unknown" };
3341  oss << "HANC Y enable: " << YesNo(inRegValue & BIT( 0)) << endl
3342  << "VANC Y enable: " << YesNo(inRegValue & BIT( 4)) << endl
3343  << "HANC C enable: " << YesNo(inRegValue & BIT( 8)) << endl
3344  << "VANC C enable: " << YesNo(inRegValue & BIT(12)) << endl
3345  << "Progressive video: " << YesNo(inRegValue & BIT(16)) << endl
3346  << "Synchronize: " << SyncStrs [(inRegValue & (BIT(24) | BIT(25))) >> 24] << endl
3347  << "Memory writes: " << EnabDisab(!(inRegValue & BIT(28))) << endl
3348  << "SD Y+C Demux: " << EnabDisab(inRegValue & BIT(30)) << endl
3349  << "Metadata from: " << (inRegValue & BIT(31) ? "LSBs" : "MSBs");
3350  return oss.str();
3351  }
3352  } mDecodeAncExtControlReg;
3353 
3354  struct DecodeAuxExtControlReg : public Decoder
3355  {
3356  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3357  {
3358  (void) inRegNum;
3359  (void) inDeviceID;
3360  ostringstream oss;
3361  static const string SyncStrs [] = { "field", "frame", "immediate", "unknown" };
3362  oss << "Progressive video: " << YesNo(inRegValue & BIT(16)) << endl
3363  << "Synchronize: " << SyncStrs [(inRegValue & (BIT(24) | BIT(25))) >> 24] << endl
3364  << "Memory writes: " << EnabDisab(!(inRegValue & BIT(28))) << endl
3365  << "Filter inclusion: " << EnabDisab(inRegValue & BIT(29));
3366  return oss.str();
3367  }
3368  } mDecodeAuxExtControlReg;
3369 
3370  // Also used for HDMI Aux regs: regAuxExtFieldVBLStartLine, regAuxExtFID
3371  struct DecodeAncExtFieldLinesReg : public Decoder
3372  {
3373  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3374  {
3375  (void) inDeviceID;
3376  ostringstream oss;
3377  const uint32_t which (inRegNum & 0x1F);
3378  const uint32_t valueLow (inRegValue & 0xFFF);
3379  const uint32_t valueHigh ((inRegValue >> 16) & 0xFFF);
3380  switch (which)
3381  {
3382  case 5: oss << "F1 cutoff line: " << valueLow << endl // regAncExtFieldCutoffLine
3383  << "F2 cutoff line: " << valueHigh;
3384  break;
3385  case 9: oss << "F1 VBL start line: " << valueLow << endl // regAncExtFieldVBLStartLine
3386  << "F2 VBL start line: " << valueHigh;
3387  break;
3388  case 11: oss << "Field ID high on line: " << valueLow << endl // regAncExtFID
3389  << "Field ID low on line: " << valueHigh;
3390  break;
3391  case 17: oss << "F1 analog start line: " << valueLow << endl // regAncExtAnalogStartLine
3392  << "F2 analog start line: " << valueHigh;
3393  break;
3394  default:
3395  oss << "Invalid register type";
3396  break;
3397  }
3398  return oss.str();
3399  }
3400  } mDecodeAncExtFieldLines;
3401 
3402  // Also used for HDMI Aux regs: regAuxExtTotalStatus, regAuxExtField1Status, regAuxExtField2Status
3403  struct DecodeAncExtStatusReg : public Decoder
3404  {
3405  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3406  {
3407  (void) inDeviceID;
3408  ostringstream oss;
3409  const uint32_t which (inRegNum & 0x1F);
3410  const uint32_t byteTotal (inRegValue & 0xFFFFFF);
3411  const bool overrun ((inRegValue & BIT(28)) ? true : false);
3412  switch (which)
3413  {
3414  case 6: oss << "Total bytes: "; break;
3415  case 7: oss << "Total F1 bytes: "; break;
3416  case 8: oss << "Total F2 bytes: "; break;
3417  default: oss << "Invalid register type"; break;
3418  }
3419  oss << DEC(byteTotal) << endl
3420  << "Overrun: " << YesNo(overrun);
3421  return oss.str();
3422  }
3423  } mDecodeAncExtStatus;
3424 
3425  // Also used for HDMI Aux Packet filtering
3426  struct DecodeAncExtIgnoreDIDReg : public Decoder
3427  {
3428  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3429  {
3430  (void) inRegNum;
3431  (void) inDeviceID;
3432  ostringstream oss;
3433  oss << "Ignoring DIDs " << HEX0N((inRegValue >> 0) & 0xFF, 2)
3434  << ", " << HEX0N((inRegValue >> 8) & 0xFF, 2)
3435  << ", " << HEX0N((inRegValue >> 16) & 0xFF, 2)
3436  << ", " << HEX0N((inRegValue >> 24) & 0xFF, 2);
3437  return oss.str();
3438  }
3439  } mDecodeAncExtIgnoreDIDs;
3440 
3441  struct DecodeAncExtAnalogFilterReg : public Decoder
3442  {
3443  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3444  {
3445  (void) inRegValue;
3446  (void) inDeviceID;
3447  ostringstream oss;
3448  uint32_t which (inRegNum & 0x1F);
3449  oss << "Each 1 bit specifies capturing ";
3450  switch (which)
3451  {
3452  case 18: oss << "F1 Y"; break;
3453  case 19: oss << "F2 Y"; break;
3454  case 20: oss << "F1 C"; break;
3455  case 21: oss << "F2 C"; break;
3456  default: return "Invalid register type";
3457  }
3458  oss << " line as analog, else digital";
3459  return oss.str();
3460  }
3461  } mDecodeAncExtAnalogFilter;
3462 
3463  struct DecodeAncInsValuePairReg : public Decoder
3464  {
3465  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3466  {
3467  (void) inDeviceID;
3468  ostringstream oss;
3469  const uint32_t which (inRegNum & 0x1F);
3470  const uint32_t valueLow (inRegValue & 0xFFFF);
3471  const uint32_t valueHigh ((inRegValue >> 16) & 0xFFFF);
3472 
3473  switch (which)
3474  {
3475  case 0: oss << "F1 byte count low: " << valueLow << endl
3476  << "F2 byte count low: " << valueHigh;
3477  break;
3478  case 4: oss << "HANC pixel delay: " << (valueLow & 0x3FF) << endl
3479  << "VANC pixel delay: " << (valueHigh & 0x7FF);
3480  break;
3481  case 5: oss << "F1 first active line: " << (valueLow & 0x7FF) << endl
3482  << "F2 first active line: " << (valueHigh & 0x7FF);
3483  break;
3484  case 6: oss << "Active line length: " << (valueLow & 0x7FF) << endl
3485  << "Total line length: " << (valueHigh & 0xFFF);
3486  break;
3487  case 8: oss << "Field ID high on line: " << (valueLow & 0x7FF) << endl
3488  << "Field ID low on line: " << (valueHigh & 0x7FF);
3489  break;
3490  case 11: oss << "F1 chroma blnk start line: " << (valueLow & 0x7FF) << endl
3491  << "F2 chroma blnk start line: " << (valueHigh & 0x7FF);
3492  break;
3493  case 14: oss << "F1 byte count high: " << valueLow << endl
3494  << "F2 byte count high: " << valueHigh;
3495  break;
3496  default: return "Invalid register type";
3497  }
3498  return oss.str();
3499  }
3500  } mDecodeAncInsValuePairReg;
3501 
3502  struct DecodeAncInsControlReg : public Decoder
3503  {
3504  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3505  {
3506  (void) inRegNum;
3507  (void) inDeviceID;
3508  ostringstream oss;
3509  oss << "HANC Y enable: " << YesNo(inRegValue & BIT( 0)) << endl
3510  << "VANC Y enable: " << YesNo(inRegValue & BIT( 4)) << endl
3511  << "HANC C enable: " << YesNo(inRegValue & BIT( 8)) << endl
3512  << "VANC C enable: " << YesNo(inRegValue & BIT(12)) << endl
3513  << "Payload Y insert: " << YesNo(inRegValue & BIT(16)) << endl
3514  << "Payload C insert: " << YesNo(inRegValue & BIT(17)) << endl
3515  << "Payload F1 insert: " << YesNo(inRegValue & BIT(20)) << endl
3516  << "Payload F2 insert: " << YesNo(inRegValue & BIT(21)) << endl
3517  << "Progressive video: " << YesNo(inRegValue & BIT(24)) << endl
3518  << "Memory reads: " << EnabDisab(!(inRegValue & BIT(28))) << endl
3519  << "SD Packet Split: " << EnabDisab(inRegValue & BIT(31));
3520  return oss.str();
3521  }
3522  } mDecodeAncInsControlReg;
3523 
3524  struct DecodeAncInsChromaBlankReg : public Decoder
3525  {
3526  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3527  {
3528  (void) inRegValue;
3529  (void) inDeviceID;
3530  ostringstream oss;
3531  uint32_t which (inRegNum & 0x1F);
3532 
3533  oss << "Each 1 bit specifies if chroma in ";
3534  switch (which)
3535  {
3536  case 12: oss << "F1"; break;
3537  case 13: oss << "F2"; break;
3538  default: return "Invalid register type";
3539  }
3540  oss << " should be blanked or passed thru";
3541  return oss.str();
3542  }
3543  } mDecodeAncInsChromaBlankReg;
3544 
3545  struct DecodeXptGroupReg : public Decoder
3546  { // Every byte in the reg value is an NTV2OutputXptID
3547  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3548  { (void) inRegNum;
3549  static unsigned sShifts[4] = {0, 8, 16, 24};
3550  NTV2StringList strs;
3551  for (unsigned ndx(0); ndx < 4; ndx++)
3552  {
3553  const NTV2InputCrosspointID inputXpt (CNTV2RegisterExpert::GetInputCrosspointID (inRegNum, ndx));
3554  const NTV2OutputCrosspointID outputXpt (NTV2OutputCrosspointID((inRegValue >> sShifts[ndx]) & 0xFF));
3555  if (NTV2_IS_VALID_InputCrosspointID(inputXpt))
3556  {
3557  if (outputXpt != NTV2_XptBlack)
3558  {
3560  ostringstream oss;
3561  oss << ::NTV2InputCrosspointIDToString(inputXpt, false);
3562  /* Don't bother with inputXpt check, since wgtID guaranteed valid for every inputXpt seen here:
3563  if (!CNTV2SignalRouter::GetWidgetForInput (inputXpt, wgtID, inDeviceID))
3564  oss << " (unimpl)";
3565  */
3566  oss << " <== " << ::NTV2OutputCrosspointIDToString(outputXpt, false);
3567  if (!CNTV2SignalRouter::GetWidgetForOutput (outputXpt, wgtID, inDeviceID))
3568  oss << " (unimpl)";
3569  strs.push_back(oss.str());
3570  }
3571  }
3572  }
3573  return aja::join(strs, "\n");
3574  }
3575  } mDecodeXptGroupReg;
3576 
3577  struct DecodeXptValidReg : public Decoder
3578  {
3579  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3580  {
3581  NTV2_ASSERT(inRegNum >= uint32_t(kRegFirstValidXptROMRegister));
3582  NTV2_ASSERT(inRegNum < uint32_t(kRegInvalidValidXptROMRegister));
3583  ostringstream oss;
3584  NTV2InputXptID inputXpt;
3585  NTV2OutputXptIDSet outputXpts;
3586  if (CNTV2SignalRouter::GetRouteROMInfoFromReg (inRegNum, inRegValue, inputXpt, outputXpts)
3587  && NTV2_IS_VALID_InputCrosspointID(inputXpt))
3588  {
3589  NTV2StringList outputXptNames;
3590  for (NTV2OutputXptIDSetConstIter it(outputXpts.begin()); it != outputXpts.end(); ++it)
3591  {
3592  const NTV2OutputXptID outputXpt(*it);
3593  const string name(::NTV2OutputCrosspointIDToString(outputXpt,true));
3594  ostringstream ss;
3595  if (name.empty())
3596  ss << xHEX0N(outputXpt,2) << "(" << DEC(outputXpt) << ")";
3597  else
3598  ss << "'" << name << "'";
3599  outputXptNames.push_back(ss.str());
3600  }
3601  if (!outputXptNames.empty())
3602  oss << "Valid Xpts: " << outputXptNames;
3603  return oss.str();
3604  }
3605  else
3606  return Decoder::operator()(inRegNum, inRegValue, inDeviceID);
3607  }
3608  } mDecodeXptValidReg;
3609 
3610  struct DecodeNTV4FSReg : public Decoder
3611  {
3612  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3613  { (void) inDeviceID;
3614  static const string sPixClkSelects[] = {"27", "74.1758", "74.25", "148.3516", "148.5", "inv5", "inv6", "inv7"};
3615  static const string sSyncs[] = {"Sync to Frame", "Sync to Field", "Immediate", "Sync to External"};
3616  const ULWord ntv4RegNum ((inRegNum - kNTV4FrameStoreFirstRegNum) % kNumNTV4FrameStoreRegisters);
3617  ostringstream oss;
3618  switch (NTV4FrameStoreRegs(ntv4RegNum))
3619  {
3621  { const ULWord disabled (inRegValue & BIT(1));
3622  const ULWord sync ((inRegValue & (BIT(20)|BIT(21))) >> 20);
3623  const ULWord pixClkSel((inRegValue & (BIT(16)|BIT(17)|BIT(18))) >> 16);
3624  const ULWord pixFmt((inRegValue & (BIT(8)|BIT(9)|BIT(10)|BIT(11)|BIT(12))) >> 8);
3625  if (!disabled)
3626  oss << "Enabled: " << YesNo(!disabled) << endl
3627  << "Mode: " << ((inRegValue & BIT( 0)) ? "Capture" : "Display") << endl
3628  << "DRT_DISP: " << OnOff(inRegValue & BIT( 2)) << endl
3629  << "Fill Bit: " << DEC((inRegValue & BIT( 3)) ? 1 : 0) << endl
3630  << "Dither: " << EnabDisab(inRegValue & BIT( 4)) << endl
3631  << "RGB8 Convert: " << ((inRegValue & BIT( 5)) ? "Use '00'" : "Copy MSBs") << endl
3632  << "Progressive: " << YesNo(inRegValue & BIT( 6)) << endl
3633  << "Pixel Format: " << DEC(pixFmt) << " " << ::NTV2FrameBufferFormatToString(NTV2PixelFormat(pixFmt)) << endl
3634  << "Pix Clk Sel: " << sPixClkSelects[pixClkSel] << " MHz" << endl
3635  << "Sync: " << sSyncs[sync];
3636  else
3637  oss << "Enabled: " << YesNo(!disabled);
3638  break;
3639  }
3640  case regNTV4FS_Status:
3641  { const ULWord lineCnt ((inRegValue & (0xFFFF0000)) >> 16);
3642  oss << "Field ID: " << OddEven(inRegValue & BIT( 0)) << endl
3643  << "Line Count: " << DEC(lineCnt);
3644  break;
3645  }
3647  { const int32_t xferByteCnt((inRegValue & 0xFFFF0000) >> 16), linePitch(inRegValue & 0x0000FFFF);
3648  oss << "Line Pitch: " << linePitch << (linePitch < 0 ? " (flipped)" : "") << endl
3649  << "Xfer Byte Count: " << xferByteCnt << " [bytes/line]" << (linePitch < 0 ? " (flipped)" : "");
3650  break;
3651  }
3652  case regNTV4FS_ROIVHSize:
3653  { const ULWord ROIVSize((inRegValue & (0x0FFF0000)) >> 16), ROIHSize(inRegValue & 0x00000FFF);
3654  oss << "ROI Horz Size: " << DEC(ROIHSize) << " [pixels]" << endl
3655  << "ROI Vert Size: " << DEC(ROIVSize) << " [lines]";
3656  break;
3657  }
3660  { const ULWord ROIVOff((inRegValue & (0x0FFF0000)) >> 16), ROIHOff(inRegValue & 0x00000FFF);
3661  const string fld(ntv4RegNum == regNTV4FS_ROIF1VHOffsets ? "F1" : "F2");
3662  oss << "ROI " << fld << " Horz Offset: " << DEC(ROIHOff) << endl
3663  << "ROI " << fld << " Vert Offset: " << DEC(ROIVOff);
3664  break;
3665  }
3667  { const ULWord tot((inRegValue & (0x0FFF0000)) >> 16), act(inRegValue & 0x00000FFF);
3668  oss << "Disp Horz Active: " << DEC(act) << endl
3669  << "Disp Horz Total: " << DEC(tot);
3670  break;
3671  }
3672  case regNTV4FS_DisplayFID:
3673  { const ULWord lo((inRegValue & (0x07FF0000)) >> 16), hi(inRegValue & 0x000007FF);
3674  oss << "Disp FID Lo: " << DEC(lo) << endl
3675  << "Disp FID Hi: " << DEC(hi);
3676  break;
3677  }
3680  { const ULWord actEnd((inRegValue & (0x07FF0000)) >> 16), actStart(inRegValue & 0x000007FF);
3681  const string fld(ntv4RegNum == regNTV4FS_F1ActiveLines ? "F1" : "F2");
3682  oss << "Disp " << fld << " Active Start: " << DEC(actStart) << endl
3683  << "Disp " << fld << " Active End: " << DEC(actEnd);
3684  break;
3685  }
3687  oss << "Unpacker Horz Offset: " << DEC(inRegValue & 0x0000FFFF);
3688  break;
3691  { const ULWord hi((inRegValue & (0xFFFF0000)) >> 16), lo(inRegValue & 0x0000FFFF);
3692  const string YGorA(ntv4RegNum == regNTV4FS_RasterVideoFill_YCb_GB ? "Y|G" : "A");
3693  const string CbBorCrR(ntv4RegNum == regNTV4FS_RasterVideoFill_YCb_GB ? "Cb|B" : "Cr|R");
3694  oss << "Disp Fill " << CbBorCrR << ": " << DEC(lo) << " " << xHEX0N(lo,4) << endl
3695  << "Disp Fill " << YGorA << ": " << DEC(hi) << " " << xHEX0N(hi,4);
3696  break;
3697  }
3699  { const ULWord lo(inRegValue & 0x0000FFFF);
3700  oss << "ROI Fill Alpha: " << DEC(lo) << " " << xHEX0N(lo,4);
3701  break;
3702  }
3704  oss << "Output Timing Frame Pulse Preset: " << DEC(inRegValue & 0x00FFFFFF) << " "
3705  << xHEX0N(inRegValue & 0x00FFFFFF,6);
3706  break;
3710  { const int32_t lo (inRegValue & 0x00001FFF);
3711  oss << "Output Video Offset: " << lo << " " << xHEX0N(lo,6);
3712  break;
3713  }
3714  default:
3715  return Decoder::operator()(inRegNum, inRegValue, inDeviceID);
3716  }
3717  return oss.str();
3718  }
3719  } mDecodeNTV4FSReg;
3720 
3721  struct DecodeHDMIOutputControl : public Decoder
3722  {
3723  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3724  {
3725  (void) inRegNum;
3726  ostringstream oss;
3727  static const string sHDMIStdV1[] = { "1080i", "720p", "480i", "576i", "1080p", "SXGA", "", "", "", "", "", "", "", "", "", "" };
3728  static const string sHDMIStdV2V3[] = { "1080i", "720p", "480i", "576i", "1080p", "1556i", "2Kx1080p", "2Kx1080i", "UHD", "4K", "", "", "", "", "", "" };
3729  static const string sVidRates[] = { "", "60.00", "59.94", "30.00", "29.97", "25.00", "24.00", "23.98", "50.00", "48.00", "47.95", "", "", "", "", "" };
3730  static const string sSrcSampling[] = { "YC422", "RGB", "YC420", "Unknown/invalid" };
3731  static const string sBitDepth[] = { "8", "10", "12", "Unknown/invalid" };
3732  const ULWord hdmiVers (::NTV2DeviceGetHDMIVersion(inDeviceID));
3733  const ULWord rawVideoStd (inRegValue & kRegMaskHDMIOutV2VideoStd);
3734  const string hdmiVidStdStr (hdmiVers > 1 ? sHDMIStdV2V3[rawVideoStd] : (hdmiVers == 1 ? sHDMIStdV1[rawVideoStd] : ""));
3735  const string vidStdStr (::NTV2StandardToString (NTV2Standard(rawVideoStd), true));
3736  const uint32_t srcSampling ((inRegValue & kRegMaskHDMISampling) >> kRegShiftHDMISampling);
3737  const uint32_t srcBPC ((inRegValue & (BIT(16)|BIT(17))) >> 16);
3738  const uint32_t txBitDepth ((inRegValue & (BIT(20)|BIT(21))) >> 20);
3739  oss << "Video Standard: " << hdmiVidStdStr;
3740  if (hdmiVidStdStr != vidStdStr)
3741  oss << " (" << vidStdStr << ")";
3742  oss << endl
3743  << "Color Mode: " << ((inRegValue & BIT( 8)) ? "RGB" : "YCbCr") << endl
3744  << "Video Rate: " << sVidRates[(inRegValue & kLHIRegMaskHDMIOutFPS) >> kLHIRegShiftHDMIOutFPS] << endl
3745  << "Scan Mode: " << ((inRegValue & BIT(13)) ? "Progressive" : "Interlaced") << endl
3746  << "Bit Depth: " << ((inRegValue & BIT(14)) ? "10-bit" : "8-bit") << endl
3747  << "Output Color Sampling: " << ((inRegValue & BIT(15)) ? "4:4:4" : "4:2:2") << endl
3748  << "Output Bit Depth: " << sBitDepth[txBitDepth] << endl
3749  << "Src Color Sampling: " << sSrcSampling[srcSampling] << endl
3750  << "Src Bits Per Component: " << sBitDepth[srcBPC] << endl
3751  << "Output Range: " << ((inRegValue & BIT(28)) ? "Full" : "SMPTE") << endl
3752  << "Audio Channels: " << ((inRegValue & BIT(29)) ? "8" : "2") << endl
3753  << "Output: " << ((inRegValue & BIT(30)) ? "DVI" : "HDMI");
3754  if (::NTV2DeviceGetNumHDMIVideoInputs(inDeviceID) && ::NTV2DeviceGetNumHDMIVideoOutputs(inDeviceID))
3755  oss << endl
3756  << "Audio Loopback: " << OnOff(inRegValue & BIT(31));
3757  return oss.str();
3758  }
3759  } mDecodeHDMIOutputControl;
3760 
3761  struct DecodeHDMIInputStatus : public Decoder
3762  {
3763  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3764  {
3765  (void) inRegNum;
3766  ostringstream oss;
3767  const ULWord hdmiVers(::NTV2DeviceGetHDMIVersion (inDeviceID));
3768  const uint32_t vidStd (hdmiVers >= 2 ? (inRegValue & kRegMaskHDMIInV2VideoStd) >> kRegShiftHDMIInV2VideoStd : (inRegValue & kRegMaskInputStatusStd) >> kRegShiftInputStatusStd);
3769  const uint32_t rate ((inRegValue & kRegMaskInputStatusFPS) >> kRegShiftInputStatusFPS);
3770  static const string sStds[32] = {"1080i", "720p", "480i", "576i", "1080p", "SXGA", "2K1080p", "2K1080i", "3840p", "4096p"};
3771  static const string sRates[32] = {"invalid", "60.00", "59.94", "30.00", "29.97", "25.00", "24.00", "23.98", "50.00", "48.00", "47.95" };
3772  oss << "HDMI Input: " << (inRegValue & BIT(0) ? "Locked" : "Unlocked") << endl
3773  << "HDMI Input: " << (inRegValue & BIT(1) ? "Stable" : "Unstable") << endl
3774  << "Color Mode: " << (inRegValue & BIT(2) ? "RGB" : "YCbCr") << endl
3775  << "Bitdepth: " << (inRegValue & BIT(3) ? "10-bit" : "8-bit") << endl
3776  << "Audio Channels: " << (inRegValue & BIT(12) ? 2 : 8) << endl
3777  << "Scan Mode: " << (inRegValue & BIT(13) ? "Progressive" : "Interlaced") << endl
3778  << "Standard: " << (inRegValue & BIT(14) ? "SD" : "HD") << endl
3779  << "Video Standard: " << sStds[vidStd] << endl
3780  << "Protocol: " << (inRegValue & BIT(27) ? "DVI" : "HDMI") << endl
3781  << "Video Rate : " << (rate < 11 ? sRates[rate] : string("invalid"));
3782  return oss.str();
3783  }
3784  } mDecodeHDMIInputStatus;
3785 
3786  struct DecodeHDMIInputControl : public Decoder
3787  {
3788  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3789  {
3790  (void) inRegNum; (void) inDeviceID;
3791  ostringstream oss;
3792  const UWord chanPair ((inRegValue & (BIT(2) | BIT(3))) >> 2);
3793  const UWord txSrcSel ((inRegValue & (BIT(20)|BIT(21)|BIT(22)|BIT(23))) >> 20);
3794  const UWord txCh12Sel ((inRegValue & (BIT(29)|BIT(30))) >> 29);
3796  oss << "HDMI In EDID Write-Enable: " << EnabDisab(inRegValue & BIT(0)) << endl
3797  << "HDMI Force Output Params: " << SetNotset(inRegValue & BIT(1)) << endl
3798  << "HDMI In Audio Chan Select: " << ::NTV2AudioChannelPairToString(pairs[chanPair], true) << endl
3799  << "hdmi_rx_8ch_src_off: " << YesNo(inRegValue & BIT(4)) << endl
3800  << "Swap HDMI In Audio Ch. 3/4: " << YesNo(inRegValue & BIT(5)) << endl
3801  << "Swap HDMI Out Audio Ch. 3/4: " << YesNo(inRegValue & BIT(6)) << endl
3802  << "HDMI Prefer 420: " << SetNotset(inRegValue & BIT(7)) << endl
3803  << "hdmi_rx_spdif_err: " << SetNotset(inRegValue & BIT(8)) << endl
3804  << "hdmi_rx_afifo_under: " << SetNotset(inRegValue & BIT(9)) << endl
3805  << "hdmi_rx_afifo_empty: " << SetNotset(inRegValue & BIT(10)) << endl
3806  << "H polarity: " << (inRegValue & BIT(16) ? "Inverted" : "Normal") << endl
3807  << "V polarity: " << (inRegValue & BIT(17) ? "Inverted" : "Normal") << endl
3808  << "F polarity: " << (inRegValue & BIT(18) ? "Inverted" : "Normal") << endl
3809  << "DE polarity: " << (inRegValue & BIT(19) ? "Inverted" : "Normal") << endl
3810  << "Tx Src Sel: " << DEC(txSrcSel) << " (" << xHEX0N(txSrcSel,4) << ")" << endl
3811  << "Tx Center Cut: " << SetNotset(inRegValue & BIT(24)) << endl
3812  << "Tx 12 bit: " << SetNotset(inRegValue & BIT(26)) << endl
3813  << "RGB Input Gamut: " << (inRegValue & BIT(28) ? "Full Range" : "Narrow Range (SMPTE)") << endl
3814  << "Tx_ch12_sel: " << DEC(txCh12Sel) << " (" << xHEX0N(txCh12Sel,4) << ")" << endl
3815  << "Input AVI Gamut: " << (inRegValue & BIT(31) ? "Full Range" : "Narrow Range (SMPTE)") << endl
3816  << "EDID: " << SetNotset(inRegValue & BIT(31));
3817  return oss.str();
3818  }
3819  } mDecodeHDMIInputControl;
3820 
3821  struct DecodeHDMIOutputStatus : public Decoder
3822  {
3823  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3824  { (void) inRegNum; (void) inDeviceID;
3825  const NTV2HDMIOutputStatus stat (inRegValue);
3826  ostringstream oss;
3827  stat.Print(oss);
3828  return oss.str();
3829  }
3830  } mDecodeHDMIOutputStatus;
3831 
3832  struct DecodeHDMIOutHDRPrimary : public Decoder
3833  {
3834  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3835  {
3836  (void) inRegNum;
3837  ostringstream oss;
3838  if (::NTV2DeviceCanDoHDMIHDROut (inDeviceID))
3839  switch (inRegNum)
3840  {
3843  case kRegHDMIHDRRedPrimary:
3844  case kRegHDMIHDRWhitePoint:
3861  { // Asserts to validate this one code block will handle all cases:
3868  const uint16_t xPrimary ((inRegValue & kRegMaskHDMIHDRRedPrimaryX) >> kRegShiftHDMIHDRRedPrimaryX);
3869  const uint16_t yPrimary ((inRegValue & kRegMaskHDMIHDRRedPrimaryY) >> kRegShiftHDMIHDRRedPrimaryY);
3870  const double xFloat (double(xPrimary) * 0.00002);
3871  const double yFloat (double(yPrimary) * 0.00002);
3872  if (NTV2_IS_VALID_HDR_PRIMARY (xPrimary))
3873  oss << "X: " << fDEC(xFloat,7,5) << endl;
3874  else
3875  oss << "X: " << HEX0N(xPrimary, 4) << "(invalid)" << endl;
3876  if (NTV2_IS_VALID_HDR_PRIMARY (yPrimary))
3877  oss << "Y: " << fDEC(yFloat,7,5);
3878  else
3879  oss << "Y: " << HEX0N(yPrimary, 4) << "(invalid)";
3880  break;
3881  }
3887  {
3888  const uint16_t minValue ((inRegValue & kRegMaskHDMIHDRMinMasteringLuminance) >> kRegShiftHDMIHDRMinMasteringLuminance);
3889  const uint16_t maxValue ((inRegValue & kRegMaskHDMIHDRMaxMasteringLuminance) >> kRegShiftHDMIHDRMaxMasteringLuminance);
3890  const double minFloat (double(minValue) * 0.00001);
3891  const double maxFloat (maxValue);
3892  oss << "Min: " << fDEC(minFloat,7,5) << endl
3893  << "Max: " << fDEC(maxFloat,7,5);
3894  break;
3895  }
3896  case kRegHDMIHDRLightLevel:
3901  {
3902  const uint16_t cntValue ((inRegValue & kRegMaskHDMIHDRMaxContentLightLevel) >> kRegShiftHDMIHDRMaxContentLightLevel);
3903  const uint16_t frmValue ((inRegValue & kRegMaskHDMIHDRMaxFrameAverageLightLevel) >> kRegShiftHDMIHDRMaxFrameAverageLightLevel);
3904  const double cntFloat (cntValue);
3905  const double frmFloat (frmValue);
3906  oss << "Max Content Light Level: " << fDEC(cntFloat,7,5) << endl
3907  << "Max Frame Light Level: " << fDEC(frmFloat,7,5);
3908  break;
3909  }
3910  default: NTV2_ASSERT(false);
3911  }
3912  return oss.str();
3913  }
3914  } mDecodeHDMIOutHDRPrimary;
3915 
3916  struct DecodeHDMIOutHDRControl : public Decoder
3917  {
3918  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3919  {
3920  (void) inRegNum;
3921  static const string sEOTFs[] = {"Trad Gamma SDR", "Trad Gamma HDR", "SMPTE ST 2084", "HLG"};
3922  ostringstream oss;
3923  if (::NTV2DeviceCanDoHDMIHDROut (inDeviceID))
3924  {
3925  const uint16_t EOTFvalue ((inRegValue & kRegMaskElectroOpticalTransferFunction) >> kRegShiftElectroOpticalTransferFunction);
3926  const uint16_t staticMetaDataDescID ((inRegValue & kRegMaskHDRStaticMetadataDescriptorID) >> kRegShiftHDRStaticMetadataDescriptorID);
3927  oss << "HDMI Out Dolby Vision Enabled: " << YesNo(inRegValue & kRegMaskHDMIHDRDolbyVisionEnable) << endl
3928  << "HDMI HDR Out Enabled: " << YesNo(inRegValue & kRegMaskHDMIHDREnable) << endl
3929  << "Constant Luminance: " << YesNo(inRegValue & kRegMaskHDMIHDRNonContantLuminance) << endl
3930  << "EOTF: " << sEOTFs[(EOTFvalue < 3) ? EOTFvalue : 3] << endl
3931  << "Static MetaData Desc ID: " << HEX0N(staticMetaDataDescID, 2) << " (" << DEC(staticMetaDataDescID) << ")";
3932  }
3933  return oss.str();
3934  }
3935  } mDecodeHDMIOutHDRControl;
3936 
3937  struct DecodeHDMIOutMRControl : public Decoder
3938  {
3939  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3940  { (void) inRegNum; (void) inDeviceID;
3941  ostringstream oss;
3942  static const string sMRStandard[] = { "1080i", "720p", "480i", "576i", "1080p", "1556i", "2Kx1080p", "2Kx1080i", "UHD", "4K", "", "", "", "", "", "" };
3943  const ULWord rawVideoStd (inRegValue & kRegMaskMRStandard);
3944  const string hdmiVidStdStr (sMRStandard[rawVideoStd]);
3945  const string vidStdStr (::NTV2StandardToString (NTV2Standard(rawVideoStd), true));
3946  oss << "Video Standard: " << hdmiVidStdStr;
3947  if (hdmiVidStdStr != vidStdStr)
3948  oss << " (" << vidStdStr << ")";
3949  oss << endl
3950  << "Capture Mode: " << ((inRegValue & kRegMaskMREnable) ? "Enabled" : "Disabled");
3951  return oss.str();
3952  }
3953  } mDecodeHDMIOutMRControl;
3954 
3955  struct DecodeSDIOutputControl : public Decoder
3956  {
3957  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3958  {
3959  (void) inRegNum;
3960  (void) inDeviceID;
3961  ostringstream oss;
3962  const uint32_t vidStd (inRegValue & (BIT(0)|BIT(1)|BIT(2)));
3963  static const string sStds[32] = {"1080i", "720p", "480i", "576i", "1080p", "1556i", "6", "7"};
3964  oss << "Video Standard: " << sStds[vidStd] << endl
3965  << "2Kx1080 mode: " << (inRegValue & BIT(3) ? "2048x1080" : "1920x1080") << endl
3966  << "HBlank RGB Range: Black=" << (inRegValue & BIT(7) ? "0x40" : "0x04") << endl
3967  << "12G enable: " << YesNo(inRegValue & BIT(17)) << endl
3968  << "6G enable: " << YesNo(inRegValue & BIT(16)) << endl
3969  << "3G enable: " << YesNo(inRegValue & BIT(24)) << endl
3970  << "3G mode: " << (inRegValue & BIT(25) ? "b" : "a") << endl
3971  << "VPID insert enable: " << YesNo(inRegValue & BIT(26)) << endl
3972  << "VPID overwrite enable: " << YesNo(inRegValue & BIT(27)) << endl
3973  << "DS 1 audio source: " "AudSys";
3974  switch ((inRegValue & (BIT(28)|BIT(30))) >> 28)
3975  {
3976  case 0: oss << (inRegValue & BIT(18) ? 5 : 1); break;
3977  case 1: oss << (inRegValue & BIT(18) ? 7 : 3); break;
3978  case 4: oss << (inRegValue & BIT(18) ? 6 : 2); break;
3979  case 5: oss << (inRegValue & BIT(18) ? 8 : 4); break;
3980  }
3981  oss << endl << "DS 2 audio source: AudSys";
3982  switch ((inRegValue & (BIT(29)|BIT(31))) >> 29)
3983  {
3984  case 0: oss << (inRegValue & BIT(19) ? 5 : 1); break;
3985  case 1: oss << (inRegValue & BIT(19) ? 7 : 3); break;
3986  case 4: oss << (inRegValue & BIT(19) ? 6 : 2); break;
3987  case 5: oss << (inRegValue & BIT(19) ? 8 : 4); break;
3988  }
3989  return oss.str();
3990  }
3991  } mDecodeSDIOutputControl;
3992 
3993  struct DecodeSDIOutTimingCtrl : public Decoder
3994  {
3995  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3996  { (void)inRegNum; (void)inDeviceID;
3997  ostringstream oss;
3998  const uint32_t hMask(0x00001FFF), vMask(0x1FFF0000);
3999  const uint32_t hOffset(inRegValue & hMask), vOffset((inRegValue & vMask) >> 16);
4000  oss << "Horz Offset: " << xHEX0N(UWord(hOffset),4) << endl
4001  << "Vert Offset: " << xHEX0N(UWord(vOffset),4) << endl
4002  << "E-E Timing Override: " << EnabDisab(inRegValue & BIT(31));
4003  return oss.str();
4004  }
4005  } mDecodeSDIOutTimingCtrl;
4006 
4007  struct DecodeDMAControl : public Decoder
4008  {
4009  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4010  {
4011  (void) inRegNum;
4012  (void) inDeviceID;
4013  const uint16_t gen ((inRegValue & (BIT(20)|BIT(21)|BIT(22)|BIT(23))) >> 20);
4014  const uint16_t lanes ((inRegValue & (BIT(16)|BIT(17)|BIT(18)|BIT(19))) >> 16);
4015  const uint16_t fwRev ((inRegValue & 0x0000FF00) >> 8);
4016  ostringstream oss;
4017  for (uint16_t engine(0); engine < 4; engine++)
4018  oss << "DMA " << (engine+1) << " Int Active?: " << YesNo(inRegValue & BIT(27+engine)) << endl;
4019  oss << "Bus Error Int Active?: " << YesNo(inRegValue & BIT(31)) << endl;
4020  for (uint16_t engine(0); engine < 4; engine++)
4021  oss << "DMA " << (engine+1) << " Busy?: " << YesNo(inRegValue & BIT(27+engine)) << endl;
4022  oss << "Strap: " << ((inRegValue & BIT(7)) ? "Installed" : "Not Installed") << endl
4023  << "Firmware Rev: " << xHEX0N(fwRev, 2) << " (" << DEC(fwRev) << ")" << endl
4024  << "Gen: " << gen << ((gen > 0 && gen < 4) ? "" : " <invalid>") << endl
4025  << "Lanes: " << DEC(lanes) << ((lanes < 9) ? "" : " <invalid>");
4026  return oss.str();
4027  }
4028  } mDMAControlRegDecoder;
4029 
4030  struct DecodeDMAIntControl : public Decoder
4031  {
4032  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4033  {
4034  (void) inRegNum;
4035  (void) inDeviceID;
4036  ostringstream oss;
4037  for (uint16_t eng(0); eng < 4; eng++)
4038  oss << "DMA " << (eng+1) << " Enabled?: " << YesNo(inRegValue & BIT(eng)) << endl;
4039  oss << "Bus Error Enabled?: " << YesNo(inRegValue & BIT(4)) << endl;
4040  for (uint16_t eng(0); eng < 4; eng++)
4041  oss << "DMA " << (eng+1) << " Active?: " << YesNo(inRegValue & BIT(27+eng)) << endl;
4042  oss << "Bus Error: " << YesNo(inRegValue & BIT(31));
4043  return oss.str();
4044  }
4045  } mDMAIntControlRegDecoder;
4046 
4047  struct DecodeDMAXferRate : public Decoder
4048  {
4049  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4050  { (void) inRegNum; (void) inDeviceID;
4051  ostringstream oss;
4052  oss << DEC(inRegValue) << " [MB/sec] [kB/ms] [B/us]";
4053  return oss.str();
4054  }
4055  } mDMAXferRateRegDecoder;
4056 
4057  struct DecodeRP188InOutDBB : public Decoder
4058  {
4059  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4060  {
4061  (void) inRegNum;
4062  (void) inDeviceID;
4063  const bool isReceivingRP188 (inRegValue & BIT(16));
4064  const bool isReceivingSelectedRP188 (inRegValue & BIT(17));
4065  const bool isReceivingLTC (inRegValue & BIT(18));
4066  const bool isReceivingVITC (inRegValue & BIT(19));
4067  ostringstream oss;
4068  oss << "RP188: " << (isReceivingRP188 ? (isReceivingSelectedRP188 ? "Selected" : "Unselected") : "No") << " RP-188 received"
4069  << (isReceivingLTC ? " +LTC" : "") << (isReceivingVITC ? " +VITC" : "") << endl
4070  << "Bypass: " << (inRegValue & BIT(23) ? (inRegValue & BIT(22) ? "SDI In 2" : "SDI In 1") : "Disabled") << endl
4071  << "Filter: " << HEX0N((inRegValue & 0xFF000000) >> 24, 2) << endl
4072  << "DBB: " << HEX0N((inRegValue & 0x0000FF00) >> 8, 2) << " " << HEX0N(inRegValue & 0x000000FF, 2);
4073  return oss.str();
4074  }
4075  } mRP188InOutDBBRegDecoder;
4076 
4077  struct DecodeVidProcControl : public Decoder
4078  {
4079  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4080  {
4081  (void) inRegNum;
4082  (void) inDeviceID;
4083  ostringstream oss;
4084  static const string sSplitStds [8] = {"1080i", "720p", "480i", "576i", "1080p", "1556i", "?6?", "?7?"};
4085  oss << "Mode: " << (inRegValue & kRegMaskVidProcMode ? ((inRegValue & BIT(24)) ? "Shaped" : "Unshaped") : "Full Raster") << endl
4086  << "FG Control: " << (inRegValue & kRegMaskVidProcFGControl ? ((inRegValue & BIT(20)) ? "Shaped" : "Unshaped") : "Full Raster") << endl
4087  << "BG Control: " << (inRegValue & kRegMaskVidProcBGControl ? ((inRegValue & BIT(22)) ? "Shaped" : "Unshaped") : "Full Raster") << endl
4088  << "VANC Pass-Thru: " << ((inRegValue & BIT(13)) ? "Background" : "Foreground") << endl
4089  << "FG Matte: " << EnabDisab(inRegValue & kRegMaskVidProcFGMatteEnable) << endl
4090  << "BG Matte: " << EnabDisab(inRegValue & kRegMaskVidProcBGMatteEnable) << endl
4091  << "Input Sync: " << (inRegValue & kRegMaskVidProcSyncFail ? "not in sync" : "in sync") << endl
4092  << "Limiting: " << ((inRegValue & BIT(11)) ? "Off" : ((inRegValue & BIT(12)) ? "Legal Broadcast" : "Legal SDI")) << endl
4093  << "Split Video Std: " << sSplitStds[inRegValue & kRegMaskVidProcSplitStd];
4094  return oss.str();
4095  }
4096  } mVidProcControlRegDecoder;
4097 
4098  struct DecodeSplitControl : public Decoder
4099  {
4100  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4101  {
4102  (void) inRegNum;
4103  (void) inDeviceID;
4104  ostringstream oss;
4105  const uint32_t startmask (0x0000FFFF); // 16 bits
4106  const uint32_t slopemask (0x3FFF0000); // 14 bits / high order byte
4107  const uint32_t fractionmask(0x00000007); // 3 bits for fractions
4108  oss << "Split Start: " << HEX0N((inRegValue & startmask) & ~fractionmask, 4) << " "
4109  << HEX0N((inRegValue & startmask) & fractionmask, 4) << endl
4110  << "Split Slope: " << HEX0N(((inRegValue & slopemask) >> 16) & ~fractionmask, 4) << " "
4111  << HEX0N(((inRegValue & slopemask) >> 16) & fractionmask, 4) << endl
4112  << "Split Type: " << ((inRegValue & BIT(30)) ? "Vertical" : "Horizontal");
4113  return oss.str();
4114  }
4115  } mSplitControlRegDecoder;
4116 
4117  struct DecodeFlatMatteValue : public Decoder
4118  {
4119  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4120  {
4121  (void) inRegNum;
4122  (void) inDeviceID;
4123  ostringstream oss;
4124  const uint32_t mask (0x000003FF); // 10 bits
4125  oss << "Flat Matte Cb: " << HEX0N(inRegValue & mask, 3) << endl
4126  << "Flat Matte Y: " << HEX0N(((inRegValue >> 10) & mask) - 0x40, 3) << endl
4127  << "Flat Matte Cr: " << HEX0N((inRegValue >> 20) & mask, 3);
4128  return oss.str();
4129  }
4130  } mFlatMatteValueRegDecoder;
4131 
4132  struct DecodeEnhancedCSCMode : public Decoder
4133  {
4134  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4135  {
4136  (void) inRegNum;
4137  (void) inDeviceID;
4138  static const string sFiltSel[] = {"Full", "Simple", "None", "?"};
4139  static const string sEdgeCtrl[] = {"black", "extended pixels"};
4140  static const string sPixFmts[] = {"RGB 4:4:4", "YCbCr 4:4:4", "YCbCr 4:2:2", "?"};
4141  const uint32_t filterSelect ((inRegValue >> 12) & 0x3);
4142  const uint32_t edgeControl ((inRegValue >> 8) & 0x1);
4143  const uint32_t outPixFmt ((inRegValue >> 4) & 0x3);
4144  const uint32_t inpPixFmt (inRegValue & 0x3);
4145  ostringstream oss;
4146  oss << "Filter select: " << sFiltSel[filterSelect] << endl
4147  << "Filter edge control: " << "Filter to " << sEdgeCtrl[edgeControl] << endl
4148  << "Output pixel format: " << sPixFmts[outPixFmt] << endl
4149  << "Input pixel format: " << sPixFmts[inpPixFmt];
4150  return oss.str();
4151  }
4152  } mEnhCSCModeDecoder;
4153 
4154  struct DecodeEnhancedCSCOffset : public Decoder
4155  {
4156  static string U10Dot6ToFloat (const uint32_t inOffset)
4157  {
4158  double result (double((inOffset >> 6) & 0x3FF));
4159  result += double(inOffset & 0x3F) / 64.0;
4160  ostringstream oss; oss << fDEC(result,12,5); string resultStr(oss.str());
4161  return aja::replace (resultStr, sSpace, sNull);
4162  }
4163  static string U12Dot4ToFloat (const uint32_t inOffset)
4164  {
4165  double result (double((inOffset >> 4) & 0xFFF));
4166  result += double(inOffset & 0xF) / 16.0;
4167  ostringstream oss; oss << fDEC(result,12,4); string resultStr(oss.str());
4168  return aja::replace (resultStr, sSpace, sNull);
4169  }
4170  static string S13Dot2ToFloat (const uint32_t inOffset)
4171  {
4172  double result (double((inOffset >> 2) & 0x1FFF));
4173  result += double(inOffset & 0x3) / 4.0;
4174  if (inOffset & BIT(15))
4175  result = -result;
4176  ostringstream oss; oss << fDEC(result,12,2); string resultStr(oss.str());
4177  return aja::replace (resultStr, sSpace, sNull);
4178  }
4179  static string S11Dot4ToFloat (const uint32_t inOffset)
4180  {
4181  double result (double((inOffset >> 4) & 0x7FF));
4182  result += double(inOffset & 0xF) / 16.0;
4183  if (inOffset & BIT(15))
4184  result = -result;
4185  ostringstream oss; oss << fDEC(result,12,4); string resultStr(oss.str());
4186  return aja::replace (resultStr, sSpace, sNull);
4187  }
4188  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4189  {
4190  (void) inDeviceID;
4191  const uint32_t regNum (inRegNum & 0x1F);
4192  const uint32_t lo (inRegValue & 0x0000FFFF);
4193  const uint32_t hi ((inRegValue >> 16) & 0xFFFF);
4194  ostringstream oss;
4195  switch (regNum)
4196  {
4197  case 1: oss << "Component 0 input offset: " << U12Dot4ToFloat(lo) << " (12-bit), " << U10Dot6ToFloat(lo) << " (10-bit)" << endl
4198  << "Component 1 input offset: " << U12Dot4ToFloat(hi) << " (12-bit), " << U10Dot6ToFloat(hi) << " (10-bit)";
4199  break;
4200  case 2: oss << "Component 2 input offset: " << U12Dot4ToFloat(lo) << " (12-bit), " << U10Dot6ToFloat(lo) << " (10-bit)";
4201  break;
4202  case 12: oss << "Component A output offset: " << U12Dot4ToFloat(lo) << " (12-bit), " << U10Dot6ToFloat(lo) << " (10-bit)" << endl
4203  << "Component B output offset: " << U12Dot4ToFloat(hi) << " (12-bit), " << U10Dot6ToFloat(hi) << " (10-bit)";
4204  break;
4205  case 13: oss << "Component C output offset: " << U12Dot4ToFloat(lo) << " (12-bit), " << U10Dot6ToFloat(lo) << " (10-bit)";
4206  break;
4207  case 15: oss << "Key input offset: " << S13Dot2ToFloat(lo) << " (12-bit), " << S11Dot4ToFloat(lo) << " (10-bit)" << endl
4208  << "Key output offset: " << U12Dot4ToFloat(hi) << " (12-bit), " << U10Dot6ToFloat(hi) << " (10-bit)";
4209  break;
4210  default: break;
4211  }
4212  return oss.str();
4213  }
4214  } mEnhCSCOffsetDecoder;
4215 
4216  struct DecodeEnhancedCSCKeyMode : public Decoder
4217  {
4218  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4219  {
4220  (void) inRegNum;
4221  (void) inDeviceID;
4222  static const string sSrcSel[] = {"Key Input", "Video Y Input"};
4223  static const string sRange[] = {"Full Range", "SMPTE Range"};
4224  const uint32_t keySrcSelect (inRegValue & 0x1);
4225  const uint32_t keyOutRange ((inRegValue >> 4) & 0x1);
4226  ostringstream oss;
4227  oss << "Key Source Select: " << sSrcSel[keySrcSelect] << endl
4228  << "Key Output Range: " << sRange[keyOutRange];
4229  return oss.str();
4230  }
4231  } mEnhCSCKeyModeDecoder;
4232 
4233  struct DecodeEnhancedCSCCoefficient : public Decoder
4234  {
4235  static string S2Dot15ToFloat (const uint32_t inCoefficient)
4236  {
4237  double result = (double((inCoefficient >> 15) & 0x3));
4238  result += double(inCoefficient & 0x7FFF) / 32768.0;
4239  if (inCoefficient & BIT(17))
4240  result = -result;
4241  ostringstream oss; oss << fDEC(result,12,10); string resultStr(oss.str());
4242  return aja::replace(resultStr, sSpace, sNull);
4243  }
4244  static string S12Dot12ToFloat (const uint32_t inCoefficient)
4245  {
4246  double result(double((inCoefficient >> 12) & 0xFFF));
4247  result += double(inCoefficient & 0xFFF) / 4096.0;
4248  if (inCoefficient & BIT(24))
4249  result = -result;
4250  ostringstream oss; oss << fDEC(result,12,6); string resultStr(oss.str());
4251  return aja::replace(resultStr, sSpace, sNull);
4252  }
4253  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4254  {
4255  (void) inDeviceID;
4256  uint32_t regNum (inRegNum & 0x1F);
4257  ostringstream oss;
4258  if (regNum > 2 && regNum < 12)
4259  {
4260  regNum -= 3;
4261  static const string sCoeffNames[] = {"A0", "A1", "A2", "B0", "B1", "B2", "C0", "C1", "C2"};
4262  const uint32_t coeff ((inRegValue >> 9) & 0x0003FFFF);
4263  oss << sCoeffNames[regNum] << " coefficient: " << S2Dot15ToFloat(coeff) << " (" << xHEX0N(coeff,8) << ")";
4264  }
4265  else if (regNum == 16)
4266  {
4267  const uint32_t gain ((inRegValue >> 4) & 0x01FFFFFF);
4268  oss << "Key gain: " << S12Dot12ToFloat(gain) << " (" << HEX0N(gain,8) << ")";
4269  }
4270  return oss.str();
4271  }
4272  } mEnhCSCCoeffDecoder;
4273 
4274  struct DecodeCSCoeff1234 : public Decoder
4275  {
4276  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4277  {
4278  (void) inDeviceID;
4279  const uint32_t coeff1 (((inRegValue >> 11) & 0x00000003) | uint32_t(inRegValue & 0x000007FF));
4280  const uint32_t coeff2 ((inRegValue >> 14) & 0x00001FFF);
4281  uint16_t nCoeff1(1), nCoeff2(2);
4282  switch(inRegNum)
4283  {
4286  nCoeff1 = 3; nCoeff2 = 4; break;
4287  }
4288  // kRegCS?Coefficients1_2 kRegCS?Coefficients3_4
4289  // CSC 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
4290  // RegNum 142 147 291 296 347 460 465 470 143 148 292 297 348 461 466 471
4291  // kRegCS?Coefficients1_2: kK2RegMaskVidKeySyncStatus = BIT(28) 0=OK 1=SyncFail GetColorSpaceVideoKeySyncFail
4292  // kRegCS?Coefficients1_2: kK2RegMaskMakeAlphaFromKeySelect = BIT(29) 0=No 1=Yes GetColorSpaceMakeAlphaFromKey
4293  // kRegCS?Coefficients1_2: kK2RegMaskColorSpaceMatrixSelect = BIT(30) 0=Rec709 1=Rec601 GetColorSpaceMatrixSelect
4294  // kRegCS?Coefficients1_2: kK2RegMaskUseCustomCoefSelect = BIT(31) 0=No 1=Yes GetColorSpaceUseCustomCoefficient
4295  // kRegCS?Coefficients3_4: kK2RegMaskXena2RGBRange = BIT(31) 0=Full 1=SMPTE GetColorSpaceRGBBlackRange
4296  // kK2RegMaskCustomCoefficientLow = BITS(0-10) CSCCustomCoeffs.Coefficient1 GetColorSpaceCustomCoefficients
4297  // kK2RegMaskCustomCoefficientHigh = BITS(16-26) CSCCustomCoeffs.Coefficient2 GetColorSpaceCustomCoefficients
4298  // kK2RegMaskCustomCoefficient12BitLow = BITS(0-12) CSCCustomCoeffs.Coefficient1 GetColorSpaceCustomCoefficients12Bit
4299  // kK2RegMaskCustomCoefficient12BitHigh= BITS(14-26) CSCCustomCoeffs.Coefficient2 GetColorSpaceCustomCoefficients12Bit
4300  ostringstream oss;
4301  if (nCoeff1 == 1)
4302  oss << "Video Key Sync Status: " << (inRegValue & BIT(28) ? "SyncFail" : "OK") << endl
4303  << "Make Alpha From Key Input: " << EnabDisab(inRegValue & BIT(29)) << endl
4304  << "Matrix Select: " << (inRegValue & BIT(30) ? "Rec601" : "Rec709") << endl
4305  << "Use Custom Coeffs: " << YesNo(inRegValue & BIT(31)) << endl;
4306  else
4307  oss << "RGB Range: " << (inRegValue & BIT(31) ? "SMPTE (0x040-0x3C0)" : "Full (0x000-0x3FF)") << endl;
4308  oss << "Coefficient" << DEC(nCoeff1) << ": " << xHEX0N(coeff1, 4) << endl
4309  << "Coefficient" << DEC(nCoeff2) << ": " << xHEX0N(coeff2, 4);
4310  return oss.str();
4311  }
4312  } mCSCoeff1234Decoder;
4313 
4314  struct DecodeCSCoeff567890 : public Decoder
4315  {
4316  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4317  {
4318  (void) inDeviceID;
4319  const uint32_t coeff5 (((inRegValue >> 11) & 0x00000003) | uint32_t(inRegValue & 0x000007FF));
4320  const uint32_t coeff6 ((inRegValue >> 14) & 0x00001FFF);
4321  uint16_t nCoeff5(5), nCoeff6(6);
4322  switch(inRegNum)
4323  {
4326  nCoeff5 = 7; nCoeff6 = 8; break;
4329  nCoeff5 = 9; nCoeff6 = 10; break;
4330  }
4331  // kRegCS?Coefficients5_6 kRegCS?Coefficients7_8 kRegCS?Coefficients9_10
4332  // CSC 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
4333  // RegNum 143 148 292 297 348 461 466 471 144 149 293 298 349 462 467 472 145 150 294 299 350 463 468 473
4334  // kK2RegMaskCustomCoefficientLow = BITS(0-10) CSCCustomCoeffs.Coefficient5 GetColorSpaceCustomCoefficients
4335  // kK2RegMaskCustomCoefficientHigh = BITS(16-26) CSCCustomCoeffs.Coefficient6 GetColorSpaceCustomCoefficients
4336  // kK2RegMaskCustomCoefficient12BitLow = BITS(0-12) CSCCustomCoeffs.Coefficient5 GetColorSpaceCustomCoefficients12Bit
4337  // kK2RegMaskCustomCoefficient12BitHigh= BITS(14-26) CSCCustomCoeffs.Coefficient6 GetColorSpaceCustomCoefficients12Bit
4338  ostringstream oss;
4339  oss << "Coefficient" << DEC(nCoeff5) << ": " << xHEX0N(coeff5, 4) << endl
4340  << "Coefficient" << DEC(nCoeff6) << ": " << xHEX0N(coeff6, 4);
4341  return oss.str();
4342  }
4343  } mCSCoeff567890Decoder;
4344 
4345  struct DecodeLUTV1ControlReg : public Decoder // kRegCh1ColorCorrectionControl (68), kRegCh2ColorCorrectionControl (69)
4346  {
4347  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4348  { static const string sModes[] = {"Off", "RGB", "YCbCr", "3-Way", "Invalid"};
4349  const ULWord lutVersion (::NTV2DeviceGetLUTVersion(inDeviceID));
4350  const UWord saturation (UWord(inRegValue & kRegMaskSaturationValue));
4351  const UWord mode (UWord((inRegValue & kRegMaskCCMode) >> kRegShiftCCMode));
4352  const bool outBankSelect (((inRegValue & kRegMaskCCOutputBankSelect) >> kRegShiftCCOutputBankSelect) ? true : false);
4353  const bool cc5HostBank (((inRegValue & kRegMaskCC5HostAccessBankSelect) >> kRegShiftCC5HostAccessBankSelect) ? true : false);
4354  const bool cc5OutputBank (((inRegValue & kRegMaskCC5OutputBankSelect) >> kRegShiftCC5OutputBankSelect) ? true : false);
4355  const bool cc5Select (((inRegValue & kRegMaskLUT5Select) >> kRegShiftLUT5Select) ? true : false);
4356  const bool ccConfig2 (((inRegValue & kRegMaskLUTSelect) >> kRegShiftLUTSelect) ? true : false);
4357  const bool cc3BankSel (((inRegValue & kRegMaskCC3OutputBankSelect) >> kRegShiftCC3OutputBankSelect) ? true : false);
4358  const bool cc4BankSel (((inRegValue & kRegMaskCC4OutputBankSelect) >> kRegShiftCC4OutputBankSelect) ? true : false);
4359  NTV2_ASSERT(mode < 4);
4360  ostringstream oss;
4361  if (lutVersion != 1)
4362  oss << "(Register data relevant for V1 LUT, this device has V" << DEC(lutVersion) << " LUT)";
4363  else
4364  {
4365  oss << "LUT Saturation Value: " << xHEX0N(saturation,4) << " (" << DEC(saturation) << ")" << endl
4366  << "LUT Output Bank Select: " << SetNotset(outBankSelect) << endl
4367  << "LUT Mode: " << sModes[mode] << " (" << DEC(mode) << ")";
4368  if (inRegNum == kRegCh1ColorCorrectionControl)
4369  oss << endl
4370  << "LUT5 Host Bank Select: " << SetNotset(cc5HostBank) << endl
4371  << "LUT5 Output Bank Select: " << SetNotset(cc5OutputBank) << endl
4372  << "LUT5 Select: " << SetNotset(cc5Select) << endl
4373  << "Config 2nd LUT Set: " << YesNo(ccConfig2);
4374  }
4375  oss << endl
4376  << "LUT3 Bank Select: " << SetNotset(cc3BankSel) << endl
4377  << "LUT4 Bank Select: " << SetNotset(cc4BankSel);
4378  return oss.str();
4379  }
4380  } mLUTV1ControlRegDecoder;
4381 
4382  struct DecodeLUTV2ControlReg : public Decoder // kRegLUTV2Control 376
4383  {
4384  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4385  { (void) inRegNum;
4386  const ULWord lutVersion (::NTV2DeviceGetLUTVersion(inDeviceID));
4387  ostringstream oss;
4388  if (lutVersion != 2)
4389  oss << "(Register data relevant for V2 LUT, this device has V" << DEC(lutVersion) << "LUT)";
4390  else
4391  {
4392  for (UWord lutNum(0); lutNum < 8; lutNum++)
4393  oss << "LUT" << DEC(lutNum+1) << " Enabled: " << (YesNo(inRegValue & (1<<lutNum))) << endl
4394  << "LUT" << DEC(lutNum+1) << " Host Access Bank Select: " << (inRegValue & (1<<(lutNum+8)) ? '1' : '0') << endl
4395  << "LUT" << DEC(lutNum+1) << " Output Bank Select: " << (inRegValue & (1<<(lutNum+16)) ? '1' : '0') << endl;
4396  oss << "12-Bit LUT mode: " << ((inRegValue & BIT(28)) ? "12-bit" : "10-bit") << endl
4397  << "12-Bit LUT page reg: " << DEC(UWord((inRegValue & (BIT(24)|BIT(25))) >> 24));
4398  }
4399  return oss.str();
4400  }
4401  } mLUTV2ControlRegDecoder;
4402 
4403  struct DecodeLUT : public Decoder
4404  {
4405  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4406  {
4407  (void) inDeviceID;
4409  const bool isRed(inRegNum >= RedReg && inRegNum < GreenReg), isGreen(inRegNum >= GreenReg && inRegNum < BlueReg), isBlue(inRegNum>=BlueReg);
4410  NTV2_ASSERT(isRed||isGreen||isBlue);
4411  ostringstream oss;
4412  // Within each 32-bit LUT word are stored two 10-bit values:
4413  // - bits <31:22> ==> LUT[2i+1]
4414  // - bits <15:6> ==> LUT[2i]
4415  const string label(isRed ? "Red[" : (isGreen ? "Green[" : "Blue["));
4416  const ULWord ndx((inRegNum - (isRed ? RedReg : (isGreen ? GreenReg : BlueReg))) * 2);
4417  const ULWord lo((inRegValue >> kRegColorCorrectionLUTEvenShift) & 0x000003FF);
4418  const ULWord hi((inRegValue >> kRegColorCorrectionLUTOddShift) & 0x000003FF);
4419  oss << label << DEC0N(ndx+0,3) << "]: " << DEC0N(lo,3) << endl
4420  << label << DEC0N(ndx+1,3) << "]: " << DEC0N(hi,3);
4421  return oss.str();
4422  }
4423  } mLUTDecoder;
4424 
4425  struct DecodeSDIErrorStatus : public Decoder
4426  {
4427  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4428  {
4429  (void) inRegNum;
4430  (void) inDeviceID;
4431  ostringstream oss;
4432  if (::NTV2DeviceCanDoSDIErrorChecks(inDeviceID))
4433  oss << "Unlock Tally: " << DEC(inRegValue & 0x7FFF) << endl
4434  << "Locked: " << YesNo(inRegValue & BIT(16)) << endl
4435  << "Link A VPID Valid: " << YesNo(inRegValue & BIT(20)) << endl
4436  << "Link B VPID Valid: " << YesNo(inRegValue & BIT(21)) << endl
4437  << "TRS Error Detected: " << YesNo(inRegValue & BIT(24));
4438  return oss.str();
4439  }
4440  } mSDIErrorStatusRegDecoder;
4441 
4442  struct DecodeSDIErrorCount : public Decoder
4443  {
4444  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4445  {
4446  (void) inRegNum;
4447  (void) inDeviceID;
4448  ostringstream oss;
4449  if (::NTV2DeviceCanDoSDIErrorChecks(inDeviceID))
4450  oss << "Link A: " << DEC(inRegValue & 0x0000FFFF) << endl
4451  << "Link B: " << DEC((inRegValue & 0xFFFF0000) >> 16);
4452  return oss.str();
4453  }
4454  } mSDIErrorCountRegDecoder;
4455 
4456  struct DecodeDriverVersion : public Decoder
4457  {
4458  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4459  { (void) inDeviceID;
4460  NTV2_ASSERT(inRegNum == kVRegDriverVersion);
4461  ULWord vMaj(NTV2DriverVersionDecode_Major(inRegValue)), vMin(NTV2DriverVersionDecode_Minor(inRegValue));
4462  ULWord vDot(NTV2DriverVersionDecode_Point(inRegValue)), vBld(NTV2DriverVersionDecode_Build(inRegValue));
4463  ULWord buildType((inRegValue >> 30) & 0x00000003);
4464  static const string sBuildTypes[] = { "Release", "Beta", "Alpha", "Development"};
4465  static const string sBldTypes[] = { "", "b", "a", "d"};
4466  ostringstream oss;
4467  oss << "Driver Version: " << DEC(vMaj) << "." << DEC(vMin) << "." << DEC(vDot);
4468  if (buildType) oss << sBldTypes[buildType] << DEC(vBld);
4469  oss << endl
4470  << "Major Version: " << DEC(vMaj) << endl
4471  << "Minor Version: " << DEC(vMin) << endl
4472  << "Point Version: " << DEC(vDot) << endl
4473  << "Build Type: " << sBuildTypes[buildType] << endl
4474  << "Build Number: " << DEC(vBld);
4475  return oss.str();
4476  }
4477  } mDriverVersionDecoder;
4478 
4479  struct DecodeFourCC : public Decoder
4480  {
4481  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4482  { (void) inDeviceID; (void) inRegNum;
4483  char ch; string str4cc;
4484  ch = char((inRegValue & 0xFF000000) >> 24);
4485  str4cc += ::isprint(ch) ? ch : '?';
4486  ch = char((inRegValue & 0x00FF0000) >> 16);
4487  str4cc += ::isprint(ch) ? ch : '?';
4488  ch = char((inRegValue & 0x0000FF00) >> 8);
4489  str4cc += ::isprint(ch) ? ch : '?';
4490  ch = char((inRegValue & 0x000000FF) >> 0);
4491  str4cc += ::isprint(ch) ? ch : '?';
4492 
4493  ostringstream oss;
4494  oss << "'" << str4cc << "'";
4495  return oss.str();
4496  }
4497  } mDecodeFourCC;
4498 
4499  struct DecodeDriverType : public Decoder
4500  {
4501  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4502  { (void) inDeviceID; (void) inRegNum;
4503  ostringstream oss;
4504  #if defined(AJAMac)
4505  if (inRegValue == 0x44455854) // 'DEXT'
4506  oss << "DriverKit ('DEXT')";
4507  else if (inRegValue)
4508  oss << "(Unknown/Invalid " << xHEX0N(inRegValue,8) << ")";
4509  else
4510  oss << "Kernel Extension ('KEXT')";
4511  #else
4512  (void) inRegValue;
4513  oss << "(Normal)";
4514  #endif
4515  return oss.str();
4516  }
4517  } mDecodeDriverType;
4518  struct DecodeVDevReady : public Decoder
4519  {
4520  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4521  { (void) inDeviceID; (void) inRegNum;
4522  ostringstream oss;
4523  if (inRegValue)
4524  { string s (CNTV2RegisterExpert::GetDisplayName (inRegValue));
4525  oss << "VDev will set ";
4526  if (s.empty())
4527  oss << "register " << DEC(inRegValue);
4528  else
4529  oss << s;
4530  oss << " when 'IsReady'";
4531  }
4532  return oss.str();
4533  }
4534  } mDecodeVDevReady;
4535 
4536  struct DecodeIDSwitchStatus : public Decoder
4537  {
4538  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4539  { (void) inRegNum;
4540  ostringstream oss;
4541  if (::NTV2DeviceCanDoIDSwitch(inDeviceID))
4542  {
4543  const uint32_t switchEnableBits (((inRegValue & 0x0F000000) >> 20) | ((inRegValue & 0xF0000000) >> 28));
4544  for (UWord idSwitch(0); idSwitch < 4; )
4545  {
4546  const uint32_t switchEnabled (switchEnableBits & BIT(idSwitch));
4547  oss << "Switch " << DEC(++idSwitch) << ": " << (switchEnabled ? "Enabled" : "Disabled");
4548  if (idSwitch < 4)
4549  oss << endl;
4550  }
4551  }
4552  else
4553  {
4554  oss << "(ID Switch not supported)";
4555  }
4556 
4557  return oss.str();
4558  }
4559  } mDecodeIDSwitchStatus;
4560 
4561  struct DecodePWMFanControl : public Decoder
4562  {
4563  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4564  { (void) inRegNum;
4565  ostringstream oss;
4566  if (::NTV2DeviceHasPWMFanControl(inDeviceID))
4567  oss << "Fan Speed: " << DEC(inRegValue & kRegMaskPWMFanSpeed) << endl
4568  << "Fan Control Enabled: " << ((inRegValue & kRegMaskPWMFanSpeedControl) ? "Enabled" : "Disabled");
4569  return oss.str();
4570  }
4571  } mDecodePWMFanControl;
4572 
4573  struct DecodePWMFanMonitor : public Decoder
4574  {
4575  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4576  { (void) inRegNum;
4577  ostringstream oss;
4578  if (::NTV2DeviceHasPWMFanControl(inDeviceID))
4579  oss << "Tach Period: " << DEC(inRegValue & kRegMaskPWMFanTachPeriodStatus) << endl
4580  << "Fan Status: " << ((inRegValue & kRegMaskPWMFanStatus) ? "Stopped" : "Running");
4581  return oss.str();
4582  }
4583  } mDecodePWMFanMonitor;
4584 
4585  struct DecodeBOBStatus : public Decoder
4586  {
4587  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4588  { (void) inRegNum;
4589  ostringstream oss;
4590  if (::NTV2DeviceCanDoBreakoutBoard(inDeviceID))
4591  oss << "Break Out Board: " << ((inRegValue & kRegMaskBOBAbsent) ? "Disconnected" : "Connected") << endl
4592  << "ADAV801 Initialization: " << ((inRegValue & kRegMaskBOBADAV801UpdateStatus) ? "Complete" : "In Progress") << endl
4593  << "ADAV801 DIR Locked(Debug): " << DEC(inRegValue & kRegMaskBOBADAV801DIRLocked);
4594  else
4595  oss << "Device does not support a breakout board";
4596  return oss.str();
4597  }
4598  } mDecodeBOBStatus;
4599 
4600  struct DecodeBOBGPIIn : public Decoder
4601  {
4602  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4603  { (void) inRegNum;
4604  ostringstream oss;
4605  if (::NTV2DeviceCanDoBreakoutBoard(inDeviceID))
4606  oss << "GPI In 1: " << DEC(inRegValue & kRegMaskBOBGPIIn1Data) << endl
4607  << "GPI In 2: " << DEC(inRegValue & kRegMaskBOBGPIIn2Data) << endl
4608  << "GPI In 3: " << DEC(inRegValue & kRegMaskBOBGPIIn3Data) << endl
4609  << "GPI In 4: " << DEC(inRegValue & kRegMaskBOBGPIIn4Data) ;
4610  else
4611  oss << "Device does not support a breakout board";
4612  return oss.str();
4613  }
4614  } mDecodeBOBGPIIn;
4615 
4616  struct DecodeBOBGPIInInterruptControl : public Decoder
4617  {
4618  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4619  { (void) inRegNum;
4620  ostringstream oss;
4621  if (::NTV2DeviceCanDoBreakoutBoard(inDeviceID))
4622  oss << "GPI In 1 Int: " << DEC(inRegValue & kRegMaskBOBGPIIn1InterruptControl) << endl
4623  << "GPI In 2 Int: " << DEC(inRegValue & kRegMaskBOBGPIIn2InterruptControl) << endl
4624  << "GPI In 3 Int: " << DEC(inRegValue & kRegMaskBOBGPIIn3InterruptControl) << endl
4625  << "GPI In 4 Int: " << DEC(inRegValue & kRegMaskBOBGPIIn4InterruptControl) ;
4626  else
4627  oss << "Device does not support a breakout board";
4628  return oss.str();
4629  }
4630  } mDecodeBOBGPIInInterruptControl;
4631 
4632  struct DecodeBOBGPIOut : public Decoder
4633  {
4634  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4635  { (void) inRegNum;
4636  ostringstream oss;
4637  if (::NTV2DeviceCanDoBreakoutBoard(inDeviceID))
4638  oss << "GPI Out 1 Int: " << DEC(inRegValue & kRegMaskBOBGPIOut1Data) << endl
4639  << "GPI Out 2 Int: " << DEC(inRegValue & kRegMaskBOBGPIOut2Data) << endl
4640  << "GPI Out 3 Int: " << DEC(inRegValue & kRegMaskBOBGPIOut3Data) << endl
4641  << "GPI Out 4 Int: " << DEC(inRegValue & kRegMaskBOBGPIOut4Data) ;
4642  else
4643  oss << "Device does not support a breakout board";
4644  return oss.str();
4645  }
4646  } mDecodeBOBGPIOut;
4647 
4648  struct DecodeBOBAudioControl : public Decoder
4649  {
4650  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4651  { (void) inRegNum;
4652  ostringstream oss;
4653  if (::NTV2DeviceCanDoBreakoutBoard(inDeviceID))
4654  {
4655  string dBuLabel;
4656  switch(inRegValue & kRegMaskBOBAnalogLevelControl)
4657  {
4658  case 0:
4659  dBuLabel = "+24dBu";
4660  break;
4661  case 1:
4662  dBuLabel = "+18dBu";
4663  break;
4664  case 2:
4665  dBuLabel = "+12dBu";
4666  break;
4667  case 3:
4668  dBuLabel = "+15dBu";
4669  break;
4670 
4671  }
4672  oss << "ADC/DAC Re-init: " << DEC(inRegValue & kRegMaskBOBADAV801Reset) << endl
4673  << "Analog Level Control: " << dBuLabel << endl
4674  << "Analog Select: " << DEC(inRegValue & kRegMaskBOBAnalogInputSelect);
4675  }
4676  else
4677  oss << "Device does not support a breakout board";
4678  return oss.str();
4679  }
4680  } mDecodeBOBAudioControl;
4681 
4682  struct DecodeLEDControl : public Decoder
4683  {
4684  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4685  { (void) inRegNum;
4686  ostringstream oss;
4687  if (::NTV2DeviceHasBracketLED(inDeviceID))
4688  oss << "Blue: " << DEC(inRegValue & kRegMaskLEDBlueControl) << endl
4689  << "Green: " << DEC(inRegValue & kRegMaskLEDGreenControl) << endl
4690  << "Red: " << DEC(inRegValue & kRegMaskLEDRedControl);
4691  else
4692  oss << "Device does not support a breakout board";
4693  return oss.str();
4694  }
4695  } mDecodeLEDControl;
4696 
4697  static const int NOREADWRITE = 0;
4698  static const int READONLY = 1;
4699  static const int WRITEONLY = 2;
4700  static const int READWRITE = 3;
4701 
4702  static const int CONTAINS = 0;
4703  static const int STARTSWITH = 1;
4704  static const int ENDSWITH = 2;
4705  static const int EXACTMATCH = 3;
4706 
4707  typedef map <uint32_t, const Decoder *> RegNumToDecoderMap;
4708  typedef pair <uint32_t, const Decoder *> RegNumToDecoderPair;
4709  typedef multimap <string, uint32_t> RegClassToRegNumMMap, StringToRegNumMMap;
4710  typedef pair <string, uint32_t> StringToRegNumPair;
4711  typedef RegClassToRegNumMMap::const_iterator RegClassToRegNumConstIter;
4712  typedef StringToRegNumMMap::const_iterator StringToRegNumConstIter;
4713 
4714  typedef pair <uint32_t, uint32_t> XptRegNumAndMaskIndex; // First: register number; second: mask index (0=0x000000FF, 1=0x0000FF00, 2=0x00FF0000, 3=0xFF000000)
4715  typedef map <NTV2InputCrosspointID, XptRegNumAndMaskIndex> InputXpt2XptRegNumMaskIndexMap;
4716  typedef map <XptRegNumAndMaskIndex, NTV2InputCrosspointID> XptRegNumMaskIndex2InputXptMap;
4717  typedef InputXpt2XptRegNumMaskIndexMap::const_iterator InputXpt2XptRegNumMaskIndexMapConstIter;
4718  typedef XptRegNumMaskIndex2InputXptMap::const_iterator XptRegNumMaskIndex2InputXptMapConstIter;
4719 
4720 private: // INSTANCE DATA
4721  mutable AJALock mGuardMutex;
4722  RegNumToStringMap mRegNumToStringMap;
4723  RegNumToDecoderMap mRegNumToDecoderMap;
4724  RegClassToRegNumMMap mRegClassToRegNumMMap;
4725  StringToRegNumMMap mStringToRegNumMMap;
4726  mutable NTV2StringSet mAllRegClasses; // Mutable -- caches results from 'const' method GetAllRegisterClasses
4727  InputXpt2XptRegNumMaskIndexMap mInputXpt2XptRegNumMaskIndexMap;
4728  XptRegNumMaskIndex2InputXptMap mXptRegNumMaskIndex2InputXptMap;
4729 
4730 }; // RegisterExpert
4731 
4732 
4733 static RegisterExpertPtr gpRegExpert; // Points to Register Expert Singleton
4735 
4736 
4737 RegisterExpertPtr RegisterExpert::GetInstance(const bool inCreateIfNecessary)
4738 {
4740  if (!gpRegExpert && inCreateIfNecessary)
4742  return gpRegExpert;
4743 }
4744 
4746 {
4748  if (!gpRegExpert)
4749  return false;
4751  return true;
4752 }
4753 
4755 {
4758  return pInst ? true : false;
4759 }
4760 
4762 {
4765  return pInst ? true : false;
4766 }
4767 
4769 {
4772  return pInst ? pInst->DisposeInstance() : false;
4773 }
4774 
4775 string CNTV2RegisterExpert::GetDisplayName (const uint32_t inRegNum)
4776 {
4779  if (pRegExpert)
4780  return pRegExpert->RegNameToString(inRegNum);
4781 
4782  ostringstream oss; oss << "Reg ";
4783  if (inRegNum <= kRegNumRegisters)
4784  oss << DEC(inRegNum);
4785  else if (inRegNum <= 0x0000FFFF)
4786  oss << xHEX0N(inRegNum,4);
4787  else
4788  oss << xHEX0N(inRegNum,8);
4789  return oss.str();
4790 }
4791 
4792 string CNTV2RegisterExpert::GetDisplayValue (const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID)
4793 {
4796  return pRegExpert ? pRegExpert->RegValueToString(inRegNum, inRegValue, inDeviceID) : string();
4797 }
4798 
4799 bool CNTV2RegisterExpert::IsRegisterInClass (const uint32_t inRegNum, const string & inClassName)
4800 {
4803  return pRegExpert ? pRegExpert->IsRegInClass(inRegNum, inClassName) : false;
4804 }
4805 
4807 {
4810  return pRegExpert ? pRegExpert->GetAllRegisterClasses() : NTV2StringSet();
4811 }
4812 
4813 NTV2StringSet CNTV2RegisterExpert::GetRegisterClasses (const uint32_t inRegNum, const bool inRemovePrefix)
4814 {
4817  return pRegExpert ? pRegExpert->GetRegisterClasses(inRegNum, inRemovePrefix) : NTV2StringSet();
4818 }
4819 
4821 {
4824  return pRegExpert ? pRegExpert->GetRegistersForClass(inClassName) : NTV2RegNumSet();
4825 }
4826 
4828 {
4831  return NTV2_IS_VALID_CHANNEL(inChannel) ? (pRegExpert ? pRegExpert->GetRegistersForClass(gChlClasses[inChannel]):NTV2RegNumSet()) : NTV2RegNumSet();
4832 }
4833 
4834 NTV2RegNumSet CNTV2RegisterExpert::GetRegistersForDevice (const NTV2DeviceID inDeviceID, const int inOtherRegsToInclude)
4835 {
4838  return pRegExpert ? pRegExpert->GetRegistersForDevice(inDeviceID, inOtherRegsToInclude) : NTV2RegNumSet();
4839 }
4840 
4841 NTV2RegNumSet CNTV2RegisterExpert::GetRegistersWithName (const string & inName, const int inSearchStyle)
4842 {
4845  return pRegExpert ? pRegExpert->GetRegistersWithName(inName, inSearchStyle) : NTV2RegNumSet();
4846 }
4847 
4848 NTV2InputCrosspointID CNTV2RegisterExpert::GetInputCrosspointID (const uint32_t inXptRegNum, const uint32_t inMaskIndex)
4849 {
4852  return pRegExpert ? pRegExpert->GetInputCrosspointID(inXptRegNum, inMaskIndex) : NTV2_INPUT_CROSSPOINT_INVALID;
4853 }
4854 
4855 bool CNTV2RegisterExpert::GetCrosspointSelectGroupRegisterInfo (const NTV2InputCrosspointID inInputXpt, uint32_t & outXptRegNum, uint32_t & outMaskIndex)
4856 {
4859  return pRegExpert ? pRegExpert->GetXptRegNumAndMaskIndex(inInputXpt, outXptRegNum, outMaskIndex) : false;
4860 }
Anc Field2 byte offset from end of frame buffer (GUMP on all boards except RTP for SMPTE2022/IP) ...
std::string NTV2FrameGeometryToString(const NTV2FrameGeometry inValue, const bool inForRetailDisplay=false)
defined(NTV2_DEPRECATE_17_6)
Definition: ntv2utils.cpp:7318
std::string NTV2AudioSystemToString(const NTV2AudioSystem inValue, const bool inCompactDisplay=false)
Definition: ntv2utils.cpp:5747
static bool DisposeInstance(void)
NTV2AudioSystem
Used to identify an Audio System on an NTV2 device. See Audio System Operation for more information...
Definition: ntv2enums.h:3898
Declares the AJALock class.
UWord NTV2DeviceGetNumLTCInputs(const NTV2DeviceID inDeviceID)
#define kRegColorCorrectionLUTOddShift
#define ActInact(__x__)
#define kRegClass_Channel2
static const ULWord kNumNTV4FrameStoreRegisters(regNTV4FS_REGISTER_COUNT)
#define kRegClass_VPID
NTV2InputCrosspointID GetInputCrosspointID(const uint32_t inXptRegNum, const uint32_t inMaskIndex) const
#define DEC0N(__x__, __n__)
Declares CNTV2SignalRouter class.
#define BIT(_x_)
Definition: ajatypes.h:596
#define kRegColorCorrectionLUTEvenShift
NTV2StringSet::const_iterator NTV2StringSetConstIter
Declares the AJADebug class.
#define kRegClass_AES
Declares the CNTV2VPID class. See SMPTE 352 standard for details.
#define EnabDisab(__x__)
#define kRegClass_Output
bool NTV2DeviceHasNTV4FrameStores(const NTV2DeviceID inDeviceID)
#define kRegClass_NULL
#define kColorCorrectionLUTOffset_Green
ULWord NTV2DeviceGetLUTVersion(const NTV2DeviceID inDeviceID)
bool NTV2DeviceCanDo425Mux(const NTV2DeviceID inDeviceID)
static int32_t Decrement(int32_t volatile *pTarget)
Definition: atomic.cpp:95
#define kRegClass_Info
bool NTV2DeviceCanDo12GSDI(const NTV2DeviceID inDeviceID)
static NTV2RegNumSet GetRegistersForClass(const std::string &inClassName)
#define kColorCorrectionLUTOffset_Blue
#define kRegClass_Input
bool NTV2DeviceCanDoEnhancedCSC(const NTV2DeviceID inDeviceID)
UWord NTV2DeviceGetNumSerialPorts(const NTV2DeviceID inDeviceID)
static const std::string sNTV4FrameStoreRegNames[]
This selects audio channels 5 and 6 (Group 2 channels 1 and 2)
Definition: ntv2enums.h:3138
std::vector< AJALabelValuePair > AJALabelValuePairs
An ordered sequence of label/value pairs.
Definition: info.h:71
static const ULWord kNTV4FrameStoreFirstRegNum(0x0000D000/sizeof(ULWord))
#define kRegClass_IP
std::string NTV2DownConvertModeToString(const NTV2DownConvertMode inValue, const bool inCompactDisplay=false)
Definition: ntv2utils.cpp:6607
UWord NTV2DeviceGetNumCSCs(const NTV2DeviceID inDeviceID)
if(!(riid==IID_IUnknown) &&!(riid==IID_IClassFactory))
Definition: dllentry.cpp:196
I am a reference-counted pointer template class. I am intended to be a proxy for an underlying object...
Definition: ajarefptr.h:89
Definition: lock.h:28
Defines a number of handy byte-swapping macros.
static bool Deallocate(void)
Explicitly deallocates the Register Expert singleton.
This selects audio channels 7 and 8 (Group 2 channels 3 and 4)
Definition: ntv2enums.h:3139
#define kRegClass_Timecode
Defines the AJARefPtr template class.
Definition: json.hpp:5362
AJALabelValuePairs::const_iterator AJALabelValuePairsConstIter
Definition: info.h:72
The last AJA virtual register slot.
uint32_t ULWord
Definition: ajatypes.h:236
NTV2Channel
These enum values are mostly used to identify a specific widget_framestore. They&#39;re also commonly use...
Definition: ntv2enums.h:1359
bool NTV2DeviceCanDoAudioMixer(const NTV2DeviceID inDeviceID)
NTV2OutputXptIDSet::const_iterator NTV2OutputXptIDSetConstIter
A const iterator for iterating over an NTV2OutputXptIDSet.
#define DEF_REGNAME(_num_)
#define NTV2DriverVersionDecode_Major(__vers__)
static ULWord GetDesignVersion(const ULWord userID)
Definition: ntv2bitfile.h:55
#define kRegClass_SDIError
#define NTV2DriverVersionDecode_Point(__vers__)
#define NTV2_ASSERT(_expr_)
Definition: ajatypes.h:489
#define SetNotset(__x__)
bool NTV2DeviceSoftwareCanChangeFrameBufferSize(const NTV2DeviceID inDeviceID)
NTV2FrameBufferFormat NTV2PixelFormat
An alias for NTV2FrameBufferFormat.
Definition: ntv2enums.h:262
#define kRegClass_Mixer
Anc Field1 byte offset from end of frame buffer (GUMP on all boards except RTP for SMPTE2022/IP) ...
AJARefPtr< RegisterExpert > RegisterExpertPtr
UWord NTV2DeviceGetNumHDMIVideoOutputs(const NTV2DeviceID inDeviceID)
static ULWord GetBitfileID(const ULWord userID)
Definition: ntv2bitfile.h:56
NTV2FrameRate
Identifies a particular video frame rate.
Definition: ntv2enums.h:414
std::string NTV2StandardToString(const NTV2Standard inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:6912
std::string NTV2InputCrosspointIDToString(const NTV2InputCrosspointID inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:5816
#define true
std::string NTV2AudioChannelQuadToString(const NTV2Audio4ChannelSelect inValue, const bool inCompactDisplay=false)
Definition: ntv2utils.cpp:6445
NTV2Standard
Identifies a particular video standard.
Definition: ntv2enums.h:167
static bool GetRouteROMInfoFromReg(const ULWord inROMRegNum, const ULWord inROMRegValue, NTV2InputXptID &outInputXpt, NTV2OutputXptIDSet &outOutputXpts, const bool inAppendOutputXpts=false)
Answers with the NTV2InputXptID and NTV2OutputXptIDSet for the given ROM register value...
NTV2DeviceID
Identifies a specific AJA NTV2 device model number. The NTV2DeviceID is actually the PROM part number...
Definition: ntv2enums.h:20
#define YesNo(__x__)
The first virtual register slot available for general use.
Monitor Anc Field2 byte offset from end of frame buffer (IoIP only, GUMP)
std::set< std::string > NTV2StringSet
NTV2ReferenceSource
These enum values identify a specific source for the device&#39;s (output) reference clock.
Definition: ntv2enums.h:1457
static uint32_t gInstanceTally(0)
static const string gChlClasses[]
UWord NTV2DeviceGetNumFrameStores(const NTV2DeviceID inDeviceID)
#define AJA_NULL
Definition: ajatypes.h:180
static NTV2StringSet GetAllRegisterClasses(void)
#define kRegClass_XptROM
#define PresNotPres(__x__)
bool NTV2DeviceHasPWMFanControl(const NTV2DeviceID inDeviceID)
Reports HDMI output status information.
#define kRegClass_Channel1
#define OnOff(__x__)
This selects audio channels 1 and 2 (Group 1 channels 1 and 2)
Definition: ntv2enums.h:3136
#define NTV2_IS_VALID_InputCrosspointID(__s__)
Definition: ntv2enums.h:2903
bool GetXptRegNumAndMaskIndex(const NTV2InputCrosspointID inInputXpt, uint32_t &outXptRegNum, uint32_t &outMaskIndex) const
#define kRegClass_NTV4FrameStore
static RegisterExpertPtr gpRegExpert
#define kRegClass_Channel5
NTV2RegisterNumberSet NTV2RegNumSet
A set of distinct NTV2RegisterNumbers.
NTV2AudioChannelPair
Identifies a pair of audio channels.
Definition: ntv2enums.h:3134
static const ULWord sMasks[]
#define kRegClass_Routing
NTV2UpConvertMode
Definition: ntv2enums.h:2222
bool NTV2DeviceCanDo3GLevelConversion(const NTV2DeviceID inDeviceID)
#define kRegClass_Channel8
#define kRegClass_Virtual
static ULWord GetBitfileVersion(const ULWord userID)
Definition: ntv2bitfile.h:57
bool NTV2DeviceHasBiDirectionalSDI(const NTV2DeviceID inDeviceID)
ULWord NTV2DeviceGetHDMIVersion(const NTV2DeviceID inDeviceID)
#define NTV2_IS_VALID_HDR_PRIMARY(__val__)
ostream & Print(ostream &inOutStream) const
#define DisabEnab(__x__)
static int32_t Increment(int32_t volatile *pTarget)
Definition: atomic.cpp:82
static bool GetCrosspointSelectGroupRegisterInfo(const NTV2InputCrosspointID inInputXpt, uint32_t &outXptRegNum, uint32_t &outMaskIndex)
Answers with the crosspoint select register and mask information for a given widget input...
bool NTV2DeviceCanDoClockMonitor(const NTV2DeviceID inDeviceID)
ULWord NTV2DeviceGetUFCVersion(const NTV2DeviceID inDeviceID)
NTV2DownConvertMode
Definition: ntv2enums.h:2245
std::string NTV2IsoConvertModeToString(const NTV2IsoConvertMode inValue, const bool inCompactDisplay=false)
Definition: ntv2utils.cpp:6632
Declares NTV2DeviceCanDo... and NTV2DeviceGetNum... functions. This module is included at compile tim...
bool NTV2DeviceHasSDIRelays(const NTV2DeviceID inDeviceID)
static bool IsRegisterInClass(const uint32_t inRegNum, const std::string &inClassName)
#define kColorCorrectionLUTOffset_Red
UWord NTV2DeviceGetNumVideoInputs(const NTV2DeviceID inDeviceID)
#define LOGGING_MAPPINGS
std::string NTV2AudioChannelPairToString(const NTV2AudioChannelPair inValue, const bool inCompactDisplay=false)
Definition: ntv2utils.cpp:6433
static const string sNull
NTV2StringSet GetRegisterClasses(const uint32_t inRegNum, const bool inRemovePrefix) const
std::string NTV2UpConvertModeToString(const NTV2UpConvertMode inValue, const bool inCompactDisplay=false)
Definition: ntv2utils.cpp:6593
NTV2StringSet GetAllRegisterClasses(void) const
#define kIncludeOtherRegs_XptROM
bool IsRegisterWriteOnly(const uint32_t inRegNum) const
string RegNameToString(const uint32_t inRegNum) const
static NTV2InputCrosspointID GetInputCrosspointID(const uint32_t inXptRegNum, const uint32_t inMaskIndex)
#define VIRTUALREG_START
#define NTV2_IS_VALID_CHANNEL(__x__)
Definition: ntv2enums.h:1373
#define OddEven(__x__)
std::string NTV2DeviceIDToString(const NTV2DeviceID inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:4608
static bool IsAllocated(void)
Monitor Anc Field1 byte offset from end of frame buffer (IoIP only, GUMP)
Originally 0x01. Changed to 0x00 in SDK 17.1.
Definition: ntv2enums.h:2757
bool NTV2DeviceCanDoIDSwitch(const NTV2DeviceID inDeviceID)
#define kRegClass_DMA
bool NTV2DeviceCanDoSDIErrorChecks(const NTV2DeviceID inDeviceID)
const char * NTV2RegisterNameString(const ULWord inRegNum)
Definition: ntv2debug.cpp:1170
bool IsRegisterReadOnly(const uint32_t inRegNum) const
static bool GetWidgetForOutput(const NTV2OutputXptID inOutputXpt, NTV2WidgetID &outWidgetID, const NTV2DeviceID inDeviceID=DEVICE_ID_NOTFOUND)
Returns the widget that "owns" the specified output crosspoint.
#define kRegClass_Channel6
#define kRegClass_Anc
static std::string GetDisplayValue(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID=DEVICE_ID_NOTFOUND)
#define kRegClass_Channel7
#define DEC(__x__)
NTV2RegisterNumber
NTV2FrameGeometry
Identifies a particular video frame geometry.
Definition: ntv2enums.h:350
static uint32_t gLivingInstances(0)
static RegisterExpertPtr GetInstance(const bool inCreateIfNecessary=true)
UWord NTV2DeviceGetNumLUTs(const NTV2DeviceID inDeviceID)
Declares numerous NTV2 utility functions.
#define kRegClass_CSC
string RegValueToString(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
ULWord NTV2DeviceGetMaxRegisterNumber(const NTV2DeviceID inDeviceID)
New in SDK 16.0.
Definition: ntv2enums.h:2876
NTV2OutputCrosspointID
Identifies a widget output, a signal source, that potentially can drive another widget&#39;s input (ident...
Definition: ntv2enums.h:2530
NTV2IsoConvertMode
Definition: ntv2enums.h:2256
NTV2InputCrosspointID
Identifies a widget input that potentially can accept a signal emitted from another widget&#39;s output (...
Definition: ntv2enums.h:2755
NTV2RegNumSet GetRegistersForDevice(const NTV2DeviceID inDeviceID, const int inOtherRegsToInclude) const
static NTV2StringSet GetRegisterClasses(const uint32_t inRegNum, const bool inRemovePrefix=false)
#define NTV2_UNUSED(__p__)
Definition: ajatypes.h:145
Declares the CNTV2Bitfile class.
See Io X3.
Definition: ntv2enums.h:43
NTV2WidgetID
Definition: ntv2enums.h:2912
New in SDK 16.0.
Definition: ntv2enums.h:2798
uint16_t UWord
Definition: ajatypes.h:234
#define NTV2DriverVersionDecode_Build(__vers__)
std::string NTV2RegisterWriteModeToString(const NTV2RegisterWriteMode inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:7451
std::string NTV2ReferenceSourceToString(const NTV2ReferenceSource inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:7422
#define kRegClass_HDR
#define xHEX0N(__x__, __n__)
static NTV2RegNumSet GetRegistersForDevice(const NTV2DeviceID inDeviceID, const int inOtherRegsToInclude=0)
static std::string GetDisplayName(const uint32_t inRegNum)
#define SuppNotsupp(__x__)
NTV2RegNumSet GetRegistersForClass(const string &inClassName) const
A convenience class that simplifies encoding or decoding the 4-byte VPID payload that can be read or ...
Definition: ntv2vpid.h:23
#define REiDBG(__x__)
std::string NTV2FrameBufferFormatToString(const NTV2FrameBufferFormat inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:6938
NTV2RegisterWriteMode
These values are used to determine when certain register writes actually take effect. See CNTV2Card::SetRegisterWriteMode or Field/Frame Interrupts.
Definition: ntv2enums.h:1682
#define kRegClass_ReadOnly
#define kRegClass_Aux
#define NTV2DriverVersionDecode_Minor(__vers__)
static NTV2RegNumSet GetRegistersWithName(const std::string &inName, const int inSearchStyle=EXACTMATCH)
bool NTV2DeviceCanDoHDMIHDROut(const NTV2DeviceID inDeviceID)
static bool Allocate(void)
Explicitly allocates the Register Expert singleton.
bool NTV2DeviceCanDoBreakoutBoard(const NTV2DeviceID inDeviceID)
#define kRegClass_Interrupt
enum NTV2InputCrosspointID NTV2InputXptID
static NTV2RegNumSet GetRegistersForChannel(const NTV2Channel inChannel)
UWord NTV2DeviceGetNumVideoOutputs(const NTV2DeviceID inDeviceID)
Private include file for all ajabase sources.
#define fDEC(__x__, __w__, __p__)
bool NTV2DeviceCanDoCustomAnc(const NTV2DeviceID inDeviceID)
#define DEF_REG(_num_, _dec_, _rw_, _c1_, _c2_, _c3_)
static const string sSpace(" ")
std::string join(const std::vector< std::string > &parts, const std::string &delim)
Definition: common.cpp:468
std::string NTV2OutputCrosspointIDToString(const NTV2OutputCrosspointID inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:5959
const char * NTV2DeviceIDString(const NTV2DeviceID id)
Definition: ntv2debug.cpp:15
bool NTV2DeviceHasXilinxDMA(const NTV2DeviceID inDeviceID)
NTV2Audio4ChannelSelect
Identifies a contiguous, adjacent group of four audio channels.
Definition: ntv2enums.h:3274
#define ThruDeviceOrBypassed(__x__)
std::vector< std::string > NTV2StringList
#define HEX0N(__x__, __n__)
Definition: debug.cpp:1175
#define REiNOTE(__x__)
static AJALock gRegExpertGuardMutex
bool NTV2DeviceCanDoVersalSysMon(const NTV2DeviceID inDeviceID)
#define kRegClass_HDMI
static ostream & PrintLabelValuePairs(ostream &oss, const AJALabelValuePairs &inLabelValuePairs)
std::string & lower(std::string &str)
Definition: common.cpp:436
bool NTV2DeviceHasBracketLED(const NTV2DeviceID inDeviceID)
static ULWord GetDesignID(const ULWord userID)
Definition: ntv2bitfile.h:54
UWord NTV2DeviceGetNumHDMIVideoInputs(const NTV2DeviceID inDeviceID)
std::string & replace(std::string &str, const std::string &from, const std::string &to)
Definition: common.cpp:110
#define kRegClass_WriteOnly
std::set< NTV2OutputXptID > NTV2OutputXptIDSet
A collection of distinct NTV2OutputXptID values.
#define kRegClass_Audio
#define kRegClass_Channel3
#define kRegClass_LUT
#define NTV2EndianSwap32(__val__)
Definition: ntv2endian.h:19
enum NTV2OutputCrosspointID NTV2OutputXptID
This selects audio channels 3 and 4 (Group 1 channels 3 and 4)
Definition: ntv2enums.h:3137
bool NTV2DeviceCanDoCustomAux(const NTV2DeviceID inDeviceID)
Packed driver version – use NTV2DriverVersionEncode, NTV2DriverVersionDecode* macros to encode/decod...
#define kRegClass_Channel4
std::string NTV2FrameRateToString(const NTV2FrameRate inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:7348
#define kIncludeOtherRegs_VRegs
NTV2RegNumSet GetRegistersWithName(const string &inName, const int inMatchStyle=EXACTMATCH) const
static const ULWord sShifts[]
Declares the CNTV2RegisterExpert class.
bool IsRegInClass(const uint32_t inRegNum, const string &inClassName) const
NTV4FrameStoreRegs