AJA NTV2 SDK  18.0.0.2122
NTV2 SDK 18.0.0.2122
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));
2630  return oss.str();
2631  }
2632  } mDecodeCanDoStatus;
2633 
2634  struct DecodeVidControlReg : public Decoder // Bit31=Is16x9 | Bit30=IsMono
2635  {
2636  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2637  {
2638  (void) inRegNum;
2639  (void) inDeviceID;
2640  const bool is16x9 ((inRegValue & BIT(31)) != 0);
2641  const bool isMono ((inRegValue & BIT(30)) != 0);
2642  ostringstream oss;
2643  oss << "Aspect Ratio: " << (is16x9 ? "16x9" : "4x3") << endl
2644  << "Depth: " << (isMono ? "Monochrome" : "Color");
2645  return oss.str();
2646  }
2647  } mDecodeVidControlReg;
2648 
2649  struct DecodeVidIntControl : public Decoder
2650  {
2651  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2652  {
2653  (void) inRegNum;
2654  (void) inDeviceID;
2655  ostringstream oss;
2656  oss << "Output 1 Vertical Enable: " << YesNo(inRegValue & BIT(0)) << endl
2657  << "Input 1 Vertical Enable: " << YesNo(inRegValue & BIT(1)) << endl
2658  << "Input 2 Vertical Enable: " << YesNo(inRegValue & BIT(2)) << endl
2659  << "Audio Out Wrap Interrupt Enable: " << YesNo(inRegValue & BIT(4)) << endl
2660  << "Audio In Wrap Interrupt Enable: " << YesNo(inRegValue & BIT(5)) << endl
2661  << "Wrap Rate Interrupt Enable: " << YesNo(inRegValue & BIT(6)) << endl
2662  << "UART Tx Interrupt Enable" << YesNo(inRegValue & BIT(7)) << endl
2663  << "UART Rx Interrupt Enable" << YesNo(inRegValue & BIT(8)) << endl
2664  << "UART Rx Interrupt Clear" << ActInact(inRegValue & BIT(15)) << endl
2665  << "UART 2 Tx Interrupt Enable" << YesNo(inRegValue & BIT(17)) << endl
2666  << "Output 2 Vertical Enable: " << YesNo(inRegValue & BIT(18)) << endl
2667  << "Output 3 Vertical Enable: " << YesNo(inRegValue & BIT(19)) << endl
2668  << "Output 4 Vertical Enable: " << YesNo(inRegValue & BIT(20)) << endl
2669  << "Output 4 Vertical Clear: " << ActInact(inRegValue & BIT(21)) << endl
2670  << "Output 3 Vertical Clear: " << ActInact(inRegValue & BIT(22)) << endl
2671  << "Output 2 Vertical Clear: " << ActInact(inRegValue & BIT(23)) << endl
2672  << "UART Tx Interrupt Clear" << ActInact(inRegValue & BIT(24)) << endl
2673  << "Wrap Rate Interrupt Clear" << ActInact(inRegValue & BIT(25)) << endl
2674  << "UART 2 Tx Interrupt Clear" << ActInact(inRegValue & BIT(26)) << endl
2675  << "Audio Out Wrap Interrupt Clear" << ActInact(inRegValue & BIT(27)) << endl
2676  << "Input 2 Vertical Clear: " << ActInact(inRegValue & BIT(29)) << endl
2677  << "Input 1 Vertical Clear: " << ActInact(inRegValue & BIT(30)) << endl
2678  << "Output 1 Vertical Clear: " << ActInact(inRegValue & BIT(31));
2679  return oss.str();
2680  }
2681  } mDecodeVidIntControl;
2682 
2683  struct DecodeVidIntControl2 : public Decoder
2684  {
2685  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2686  {
2687  (void) inRegNum;
2688  (void) inDeviceID;
2689  ostringstream oss;
2690  oss << "Input 3 Vertical Enable: " << YesNo(inRegValue & BIT(1)) << endl
2691  << "Input 4 Vertical Enable: " << YesNo(inRegValue & BIT(2)) << endl
2692  << "Input 5 Vertical Enable: " << YesNo(inRegValue & BIT(8)) << endl
2693  << "Input 6 Vertical Enable: " << YesNo(inRegValue & BIT(9)) << endl
2694  << "Input 7 Vertical Enable: " << YesNo(inRegValue & BIT(10)) << endl
2695  << "Input 8 Vertical Enable: " << YesNo(inRegValue & BIT(11)) << endl
2696  << "Output 5 Vertical Enable: " << YesNo(inRegValue & BIT(12)) << endl
2697  << "Output 6 Vertical Enable: " << YesNo(inRegValue & BIT(13)) << endl
2698  << "Output 7 Vertical Enable: " << YesNo(inRegValue & BIT(14)) << endl
2699  << "Output 8 Vertical Enable: " << YesNo(inRegValue & BIT(15)) << endl
2700  << "Output 8 Vertical Clear: " << ActInact(inRegValue & BIT(16)) << endl
2701  << "Output 7 Vertical Clear: " << ActInact(inRegValue & BIT(17)) << endl
2702  << "Output 6 Vertical Clear: " << ActInact(inRegValue & BIT(18)) << endl
2703  << "Output 5 Vertical Clear: " << ActInact(inRegValue & BIT(19)) << endl
2704  << "Input 8 Vertical Clear: " << ActInact(inRegValue & BIT(25)) << endl
2705  << "Input 7 Vertical Clear: " << ActInact(inRegValue & BIT(26)) << endl
2706  << "Input 6 Vertical Clear: " << ActInact(inRegValue & BIT(27)) << endl
2707  << "Input 5 Vertical Clear: " << ActInact(inRegValue & BIT(28)) << endl
2708  << "Input 4 Vertical Clear: " << ActInact(inRegValue & BIT(29)) << endl
2709  << "Input 3 Vertical Clear: " << ActInact(inRegValue & BIT(30));
2710  return oss.str();
2711  }
2712  } mDecodeVidIntControl2;
2713 
2714  struct DecodeStatusReg : public Decoder
2715  {
2716  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2717  {
2718  (void) inRegNum;
2719  (void) inDeviceID;
2720  ostringstream oss;
2721  oss << "Input 1 Vertical Blank: " << ActInact(inRegValue & BIT(20)) << endl
2722  << "Input 1 Field ID: " << (inRegValue & BIT(21) ? "1" : "0") << endl
2723  << "Input 1 Vertical Interrupt: " << ActInact(inRegValue & BIT(30)) << endl
2724  << "Input 2 Vertical Blank: " << ActInact(inRegValue & BIT(18)) << endl
2725  << "Input 2 Field ID: " << (inRegValue & BIT(19) ? "1" : "0") << endl
2726  << "Input 2 Vertical Interrupt: " << ActInact(inRegValue & BIT(29)) << endl
2727  << "Output 1 Vertical Blank: " << ActInact(inRegValue & BIT(22)) << endl
2728  << "Output 1 Field ID: " << (inRegValue & BIT(23) ? "1" : "0") << endl
2729  << "Output 1 Vertical Interrupt: " << ActInact(inRegValue & BIT(31)) << endl
2730  << "Output 2 Vertical Blank: " << ActInact(inRegValue & BIT(4)) << endl
2731  << "Output 2 Field ID: " << (inRegValue & BIT(5) ? "1" : "0") << endl
2732  << "Output 2 Vertical Interrupt: " << ActInact(inRegValue & BIT(8)) << endl;
2733  if (::NTV2DeviceGetNumVideoOutputs(inDeviceID) > 2)
2734  oss << "Output 3 Vertical Blank: " << ActInact(inRegValue & BIT(2)) << endl
2735  << "Output 3 Field ID: " << (inRegValue & BIT(3) ? "1" : "0") << endl
2736  << "Output 3 Vertical Interrupt: " << ActInact(inRegValue & BIT(7)) << endl
2737  << "Output 4 Vertical Blank: " << ActInact(inRegValue & BIT(0)) << endl
2738  << "Output 4 Field ID: " << (inRegValue & BIT(1) ? "1" : "0") << endl
2739  << "Output 4 Vertical Interrupt: " << ActInact(inRegValue & BIT(6)) << endl;
2740  oss << "Aux Vertical Interrupt: " << ActInact(inRegValue & BIT(12)) << endl
2741  << "I2C 1 Interrupt: " << ActInact(inRegValue & BIT(14)) << endl
2742  << "I2C 2 Interrupt: " << ActInact(inRegValue & BIT(13)) << endl
2743  << "Chunk Rate Interrupt: " << ActInact(inRegValue & BIT(16)) << endl;
2744  if (::NTV2DeviceGetNumSerialPorts(inDeviceID))
2745  oss << "Generic UART Interrupt: " << ActInact(inRegValue & BIT(9)) << endl
2746  << "Uart 1 Rx Interrupt: " << ActInact(inRegValue & BIT(15)) << endl
2747  << "Uart 1 Tx Interrupt: " << ActInact(inRegValue & BIT(24)) << endl;
2748  if (::NTV2DeviceGetNumSerialPorts(inDeviceID) > 1)
2749  oss << "Uart 2 Tx Interrupt: " << ActInact(inRegValue & BIT(26)) << endl;
2750  if (::NTV2DeviceGetNumLTCInputs(inDeviceID))
2751  oss << "LTC In 1 Present: " << YesNo(inRegValue & BIT(17)) << endl;
2752  oss << "Wrap Rate Interrupt: " << ActInact(inRegValue & BIT(25)) << endl
2753  << "Audio Out Wrap Interrupt: " << ActInact(inRegValue & BIT(27)) << endl
2754  << "Audio 50Hz Interrupt: " << ActInact(inRegValue & BIT(28));
2755  return oss.str();
2756  }
2757  } mDecodeStatusReg;
2758 
2759  struct DecodeCPLDVersion : public Decoder
2760  {
2761  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2762  {
2763  (void) inRegNum;
2764  (void) inDeviceID;
2765  ostringstream oss;
2766  oss << "CPLD Version: " << DEC(inRegValue & (BIT(0)|BIT(1))) << endl
2767  << "Failsafe Bitfile Loaded: " << (inRegValue & BIT(4) ? "Yes" : "No") << endl
2768  << "Force Reload: " << YesNo(inRegValue & BIT(8));
2769  ULWord pcbRev ((inRegValue & 0xF0000000) >> 28);
2770  if (pcbRev) oss << endl
2771  << "PCB Version: " << xHEX0N(pcbRev,2);
2772  return oss.str();
2773  }
2774  } mDecodeCPLDVersion;
2775 
2776  struct DecodeStatus2Reg : public Decoder
2777  {
2778  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2779  {
2780  (void) inRegNum;
2781  (void) inDeviceID;
2782  static const uint8_t bitNumsInputVBlank[] = {20, 18, 16, 14, 12, 10}; // Input 3/4/5/6/7/8 Vertical Blank
2783  static const uint8_t bitNumsInputFieldID[] = {21, 19, 17, 15, 13, 11}; // Input 3/4/5/6/7/8 Field ID
2784  static const uint8_t bitNumsInputVertInt[] = {30, 29, 28, 27, 26, 25}; // Input 3/4/5/6/7/8 Vertical Interrupt
2785  static const uint8_t bitNumsOutputVBlank[] = { 8, 6, 4, 2}; // Output 5/6/7/8 Vertical Blank
2786  static const uint8_t bitNumsOutputFieldID[] = { 9, 7, 5, 3}; // Output 5/6/7/8 Field ID
2787  static const uint8_t bitNumsOutputVertInt[] = {31, 24, 23, 22}; // Output 5/6/7/8 Vertical Interrupt
2788  ostringstream oss;
2789  for (unsigned ndx(0); ndx < 6; ndx++)
2790  oss << "Input " << (ndx+3) << " Vertical Blank: " << ActInact(inRegValue & BIT(bitNumsInputVBlank[ndx])) << endl
2791  << "Input " << (ndx+3) << " Field ID: " << (inRegValue & BIT(bitNumsInputFieldID[ndx]) ? "1" : "0") << endl
2792  << "Input " << (ndx+3) << " Vertical Interrupt: " << ActInact(inRegValue & BIT(bitNumsInputVertInt[ndx])) << endl;
2793  for (unsigned ndx(0); ndx < 4; ndx++)
2794  oss << "Output " << (ndx+5) << " Vertical Blank: " << ActInact(inRegValue & BIT(bitNumsOutputVBlank[ndx])) << endl
2795  << "Output " << (ndx+5) << " Field ID: " << (inRegValue & BIT(bitNumsOutputFieldID[ndx]) ? "1" : "0") << endl
2796  << "Output " << (ndx+5) << " Vertical Interrupt: " << ActInact(inRegValue & BIT(bitNumsOutputVertInt[ndx])) << endl;
2797  oss << "HDMI In Hot-Plug Detect Interrupt: " << ActInact(inRegValue & BIT(0)) << endl
2798  << "HDMI In Chip Interrupt: " << ActInact(inRegValue & BIT(1));
2799  return oss.str();
2800  }
2801  } mDecodeStatus2Reg;
2802 
2803  struct DecodeInputStatusReg : public Decoder
2804  {
2805  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2806  {
2807  (void) inRegNum;
2808  (void) inDeviceID;
2809  NTV2FrameRate fRate1 (NTV2FrameRate( (inRegValue & (BIT( 0)|BIT( 1)|BIT( 2) )) | ((inRegValue & BIT(28)) >> (28-3)) ));
2810  NTV2FrameRate fRate2 (NTV2FrameRate(((inRegValue & (BIT( 8)|BIT( 9)|BIT(10) )) >> 8) | ((inRegValue & BIT(29)) >> (29-3)) ));
2811  NTV2FrameRate fRateRf (NTV2FrameRate(((inRegValue & (BIT(16)|BIT(17)|BIT(18)|BIT(19))) >> 16) ));
2812  ostringstream oss;
2813  oss << "Input 1 Frame Rate: " << ::NTV2FrameRateToString(fRate1, true) << endl
2814  << "Input 1 Geometry: ";
2815  if (BIT(30) & inRegValue)
2816  switch (((BIT(4)|BIT(5)|BIT(6)) & inRegValue) >> 4)
2817  {
2818  case 0: oss << "2K x 1080"; break;
2819  case 1: oss << "2K x 1556"; break;
2820  default: oss << "Invalid HI"; break;
2821  }
2822  else
2823  switch (((BIT(4)|BIT(5)|BIT(6)) & inRegValue) >> 4)
2824  {
2825  case 0: oss << "Unknown"; break;
2826  case 1: oss << "525"; break;
2827  case 2: oss << "625"; break;
2828  case 3: oss << "750"; break;
2829  case 4: oss << "1125"; break;
2830  case 5: oss << "1250"; break;
2831  case 6: case 7: oss << "Reserved"; break;
2832  default: oss << "Invalid LO"; break;
2833  }
2834  oss << endl
2835  << "Input 1 Scan Mode: " << ((BIT(7) & inRegValue) ? "Progressive" : "Interlaced") << endl
2836  << "Input 2 Frame Rate: " << ::NTV2FrameRateToString(fRate2, true) << endl
2837  << "Input 2 Geometry: ";
2838  if (BIT(31) & inRegValue)
2839  switch (((BIT(12)|BIT(13)|BIT(14)) & inRegValue) >> 12)
2840  {
2841  case 0: oss << "2K x 1080"; break;
2842  case 1: oss << "2K x 1556"; break;
2843  default: oss << "Invalid HI"; break;
2844  }
2845  else
2846  switch (((BIT(12)|BIT(13)|BIT(14)) & inRegValue) >> 12)
2847  {
2848  case 0: oss << "Unknown"; break;
2849  case 1: oss << "525"; break;
2850  case 2: oss << "625"; break;
2851  case 3: oss << "750"; break;
2852  case 4: oss << "1125"; break;
2853  case 5: oss << "1250"; break;
2854  case 6: case 7: oss << "Reserved"; break;
2855  default: oss << "Invalid LO"; break;
2856  }
2857  oss << endl
2858  << "Input 2 Scan Mode: " << ((BIT(15) & inRegValue) ? "Progressive" : "Interlaced") << endl
2859  << "Reference Frame Rate: " << ::NTV2FrameRateToString(fRateRf, true) << endl
2860  << "Reference Geometry: ";
2861  switch (((BIT(20)|BIT(21)|BIT(22)) & inRegValue) >> 20) // Ref scan geometry
2862  {
2863  case 0: oss << "NTV2_SG_UNKNOWN"; break;
2864  case 1: oss << "NTV2_SG_525"; break;
2865  case 2: oss << "NTV2_SG_625"; break;
2866  case 3: oss << "NTV2_SG_750"; break;
2867  case 4: oss << "NTV2_SG_1125"; break;
2868  case 5: oss << "NTV2_SG_1250"; break;
2869  default: oss << "Invalid"; break;
2870  }
2871  oss << endl
2872  << "Reference Scan Mode: " << ((BIT(23) & inRegValue) ? "Progressive" : "Interlaced") << endl
2873  << "AES Channel 1-2: " << ((BIT(24) & inRegValue) ? "Invalid" : "Valid") << endl
2874  << "AES Channel 3-4: " << ((BIT(25) & inRegValue) ? "Invalid" : "Valid") << endl
2875  << "AES Channel 5-6: " << ((BIT(26) & inRegValue) ? "Invalid" : "Valid") << endl
2876  << "AES Channel 7-8: " << ((BIT(27) & inRegValue) ? "Invalid" : "Valid");
2877  return oss.str();
2878  }
2879  } mDecodeInputStatusReg;
2880 
2881  struct DecodeSDIInputStatusReg : public Decoder
2882  {
2883  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2884  {
2885  (void) inDeviceID;
2886  uint16_t numSpigots(0), startSpigot(0), doTsiMuxSync(0);
2887  ostringstream oss;
2888  switch (inRegNum)
2889  {
2890  case kRegSDIInput3GStatus: numSpigots = 2; startSpigot = 1; doTsiMuxSync = 1; break;
2891  case kRegSDIInput3GStatus2: numSpigots = 2; startSpigot = 3; break;
2892  case kRegSDI5678Input3GStatus: numSpigots = 4; startSpigot = 5; break;
2893  }
2894  if ((startSpigot-1) >= ::NTV2DeviceGetNumVideoInputs(inDeviceID))
2895  return oss.str(); // Skip if no such SDI inputs
2896 
2897  for (uint16_t spigotNdx(0); spigotNdx < numSpigots; )
2898  {
2899  const uint16_t spigotNum (spigotNdx + startSpigot);
2900  const uint8_t statusBits ((inRegValue >> (spigotNdx*8)) & 0xFF);
2901  const uint8_t speedBits (statusBits & 0xC1);
2902  ostringstream ossSpeed, ossSpigot;
2903  ossSpigot << "SDI In " << spigotNum << " ";
2904  const string spigotLabel (ossSpigot.str());
2905  if (speedBits & 0x01) ossSpeed << " 3G";
2906  if (::NTV2DeviceCanDo12GSDI(inDeviceID))
2907  {
2908  if (speedBits & 0x40) ossSpeed << " 6G";
2909  if (speedBits & 0x80) ossSpeed << " 12G";
2910  }
2911  if (speedBits == 0) ossSpeed << " 1.5G";
2912  oss << spigotLabel << "Link Speed:" << ossSpeed.str() << endl
2913  << spigotLabel << "SMPTE Level B: " << YesNo(statusBits & 0x02) << endl
2914  << spigotLabel << "Link A VPID Valid: " << YesNo(statusBits & 0x10) << endl
2915  << spigotLabel << "Link B VPID Valid: " << YesNo(statusBits & 0x20) << endl;
2916  if (::NTV2DeviceCanDo3GLevelConversion(inDeviceID))
2917  oss << spigotLabel << "3Gb-to-3Ga Conversion: " << EnabDisab(statusBits & 0x04);
2918  else
2919  oss << spigotLabel << "3Gb-to-3Ga Conversion: n/a";
2920  if (++spigotNdx < numSpigots)
2921  oss << endl;
2922  } // for each spigot
2923  if (doTsiMuxSync && ::NTV2DeviceCanDo425Mux(inDeviceID))
2924  for (UWord tsiMux(0); tsiMux < 4; ++tsiMux)
2925  oss << endl
2926  << "TsiMux" << DEC(tsiMux+1) << " Sync Fail: " << ((inRegValue & (0x00010000UL << tsiMux)) ? "FAILED" : "OK");
2927  return oss.str();
2928  }
2929  } mDecodeSDIInputStatusReg;
2930 
2931  struct DecodeSDIInputStatus2Reg : public Decoder
2932  {
2933  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2934  {
2935  (void) inDeviceID;
2936  const string sOdd (inRegNum == kRegInputStatus2 ? "Input 3" : (inRegNum == kRegInput56Status ? "Input 5" : "Input 7"));
2937  const string sEven (inRegNum == kRegInputStatus2 ? "Input 4" : (inRegNum == kRegInput56Status ? "Input 6" : "Input 8"));
2938  const NTV2FrameRate fRate1 (NTV2FrameRate( (inRegValue & (BIT( 0)|BIT( 1)|BIT( 2) )) | ((inRegValue & BIT(28)) >> (28-3)) ));
2939  const NTV2FrameRate fRate2 (NTV2FrameRate(((inRegValue & (BIT( 8)|BIT( 9)|BIT(10) )) >> 8) | ((inRegValue & BIT(29)) >> (29-3)) ));
2940  ostringstream oss;
2941  oss << sOdd << " Scan Mode: " << ((BIT(7) & inRegValue) ? "Progressive" : "Interlaced") << endl
2942  << sOdd << " Frame Rate: " << ::NTV2FrameRateToString(fRate1, true) << endl
2943  << sOdd << " Geometry: ";
2944  if (BIT(30) & inRegValue) switch (((BIT(4)|BIT(5)|BIT(6)) & inRegValue) >> 4)
2945  {
2946  case 0: oss << "2K x 1080"; break;
2947  case 1: oss << "2K x 1556"; break;
2948  default: oss << "Invalid HI"; break;
2949  }
2950  else switch (((BIT(4)|BIT(5)|BIT(6)) & inRegValue) >> 4)
2951  {
2952  case 0: oss << "Unknown"; break;
2953  case 1: oss << "525"; break;
2954  case 2: oss << "625"; break;
2955  case 3: oss << "750"; break;
2956  case 4: oss << "1125"; break;
2957  case 5: oss << "1250"; break;
2958  case 6: case 7: oss << "Reserved"; break;
2959  default: oss << "Invalid LO"; break;
2960  }
2961  oss << endl
2962  << sEven << " Scan Mode: " << ((BIT(15) & inRegValue) ? "Progressive" : "Interlaced") << endl
2963  << sEven << " Frame Rate: " << ::NTV2FrameRateToString(fRate2, true) << endl
2964  << sEven << " Geometry: ";
2965  if (BIT(31) & inRegValue) switch (((BIT(12)|BIT(13)|BIT(14)) & inRegValue) >> 12)
2966  {
2967  case 0: oss << "2K x 1080"; break;
2968  case 1: oss << "2K x 1556"; break;
2969  default: oss << "Invalid HI"; break;
2970  }
2971  else switch (((BIT(12)|BIT(13)|BIT(14)) & inRegValue) >> 12)
2972  {
2973  case 0: oss << "Unknown"; break;
2974  case 1: oss << "525"; break;
2975  case 2: oss << "625"; break;
2976  case 3: oss << "750"; break;
2977  case 4: oss << "1125"; break;
2978  case 5: oss << "1250"; break;
2979  case 6: case 7: oss << "Reserved"; break;
2980  default: oss << "Invalid LO"; break;
2981  }
2982  return oss.str();
2983  }
2984  } mDecodeSDIInputStatus2Reg;
2985 
2986  struct DecodeFS1RefSelectReg : public Decoder
2987  {
2988  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
2989  {
2990  (void) inDeviceID; (void) inRegNum; // kRegFS1ReferenceSelect
2991  ostringstream oss;
2992  oss << "BNC Select(LHi): " << (inRegValue & 0x00000010 ? "LTCIn1" : "Ref") << endl
2993  << "Ref BNC (Corvid): " << EnabDisab(inRegValue & 0x00000020) << endl
2994  << "LTC Present (also Reg 21): " << YesNo(inRegValue & 0x00000040) << endl
2995  << "LTC Emb Out Enable: " << YesNo(inRegValue & 0x00000080) << endl
2996  << "LTC Emb In Enable: " << YesNo(inRegValue & 0x00000100) << endl
2997  << "LTC Emb In Received: " << YesNo(inRegValue & 0x00000200) << endl
2998  << "LTC BNC Out Source: " << (inRegValue & 0x00000400 ? "E-E" : "Reg112/113");
2999  return oss.str();
3000  }
3001  } mDecodeFS1RefSelectReg;
3002 
3003  struct DecodeLTCStatusControlReg : public Decoder
3004  {
3005  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3006  {
3007  (void) inDeviceID; (void) inRegNum; // kRegLTCStatusControl
3008  const uint16_t LTC1InTimingSelect ((inRegValue >> 1) & 0x0000007);
3009  const uint16_t LTC2InTimingSelect ((inRegValue >> 9) & 0x0000007);
3010  const uint16_t LTC1OutTimingSelect ((inRegValue >> 16) & 0x0000007);
3011  const uint16_t LTC2OutTimingSelect ((inRegValue >> 20) & 0x0000007);
3012  ostringstream oss;
3013  oss << "LTC 1 Input Present: " << YesNo(inRegValue & 0x00000001) << endl
3014  << "LTC 1 Input FB Timing Select): " << xHEX0N(LTC1InTimingSelect,2) << " (" << DEC(LTC1InTimingSelect) << ")" << endl
3015  << "LTC 1 Bypass: " << EnabDisab(inRegValue & 0x00000010) << endl
3016  << "LTC 1 Bypass Select: " << DEC(ULWord((inRegValue >> 5) & 0x00000001)) << endl
3017  << "LTC 2 Input Present: " << YesNo(inRegValue & 0x00000100) << endl
3018  << "LTC 2 Input FB Timing Select): " << xHEX0N(LTC2InTimingSelect,2) << " (" << DEC(LTC2InTimingSelect) << ")" << endl
3019  << "LTC 2 Bypass: " << EnabDisab(inRegValue & 0x00001000) << endl
3020  << "LTC 2 Bypass Select: " << DEC(ULWord((inRegValue >> 13) & 0x00000001)) << endl
3021  << "LTC 1 Output FB Timing Select): " << xHEX0N(LTC1OutTimingSelect,2) << " (" << DEC(LTC1OutTimingSelect) << ")" << endl
3022  << "LTC 2 Output FB Timing Select): " << xHEX0N(LTC2OutTimingSelect,2) << " (" << DEC(LTC2OutTimingSelect) << ")";
3023  return oss.str();
3024  }
3025  } mLTCStatusControlDecoder;
3026 
3027  struct DecodeAudDetectReg : public Decoder
3028  {
3029  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3030  {
3031  (void) inDeviceID;
3032  ostringstream oss;
3033  switch (inRegNum)
3034  {
3035  case kRegAud1Detect:
3036  case kRegAudDetect2:
3037  for (uint16_t num(0); num < 8; )
3038  {
3039  const uint16_t group (num / 2);
3040  const bool isChan34 (num & 1);
3041  oss << "Group " << group << " CH " << (isChan34 ? "3-4: " : "1-2: ") << (inRegValue & BIT(num) ? "Present" : "Absent");
3042  if (++num < 8)
3043  oss << endl;
3044  }
3045  break;
3046 
3047  case kRegAudioDetect5678:
3048  break;
3049  }
3050  return oss.str();
3051  }
3052  } mDecodeAudDetectReg;
3053 
3054  struct DecodeAudControlReg : public Decoder
3055  {
3056  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3057  {
3058  (void) inRegNum;
3059  (void) inDeviceID;
3060  static const string ChStrs [] = { "Ch 1/2", "Ch 3/4", "Ch 5/6", "Ch 7/8" };
3061  uint16_t sdiOutput (0);
3062  switch (inRegNum)
3063  { case kRegAud1Control: sdiOutput = 1; break;
3064  case kRegAud3Control: sdiOutput = 3; break;
3065  case kRegAud5Control: sdiOutput = 5; break;
3066  case kRegAud7Control: sdiOutput = 7; break;
3067  default: break;
3068  }
3069 
3070  ostringstream oss;
3071  oss << "Audio Capture: " << EnabDisab(BIT(0) & inRegValue) << endl
3072  << "Audio Loopback: " << EnabDisab(BIT(3) & inRegValue) << endl
3073  << "Audio Input: " << DisabEnab(BIT(8) & inRegValue) << endl
3074  << "Audio Output: " << DisabEnab(BIT(9) & inRegValue) << endl
3075  << "Output Paused: " << YesNo(BIT(11) & inRegValue) << endl;
3076  if (sdiOutput)
3077  oss << "Audio Embedder SDIOut" << sdiOutput << ": " << DisabEnab(BIT(13) & inRegValue) << endl
3078  << "Audio Embedder SDIOut" << (sdiOutput+1) << ": " << DisabEnab(BIT(15) & inRegValue) << endl;
3079 
3080  oss << "A/V Sync Mode: " << EnabDisab(BIT(15) & inRegValue) << endl
3081  << "AES Rate Converter: " << DisabEnab(BIT(19) & inRegValue) << endl
3082  << "Audio Buffer Format: " << (BIT(20) & inRegValue ? "16-Channel " : (BIT(16) & inRegValue ? "8-Channel " : "6-Channel ")) << endl
3083  << (BIT(18) & inRegValue ? "96kHz" : "48kHz") << endl
3084  << (BIT(18) & inRegValue ? "96kHz Support" : "48kHz Support") << endl
3085  // << (BIT(22) & inRegValue ? "Embedded Support" : "No Embedded Support") << endl // JeffL says this bit is obsolete
3086  << "Slave Mode (64-chl): " << EnabDisab(BIT(23) & inRegValue) << endl // Redeployed in 16.2 for 64-ch audio
3087  << "K-box, Monitor: " << ChStrs [(BIT(24) & BIT(25) & inRegValue) >> 24] << endl
3088  << "K-Box Input: " << (BIT(26) & inRegValue ? "XLR" : "BNC") << endl
3089  << "K-Box: " << (BIT(27) & inRegValue ? "Present" : "Absent") << endl
3090  << "Cable: " << (BIT(28) & inRegValue ? "XLR" : "BNC") << endl
3091  << "Audio Buffer Size: " << (BIT(31) & inRegValue ? "4 MB" : "1 MB");
3092  return oss.str();
3093  }
3094  } mDecodeAudControlReg;
3095 
3096  struct DecodeAudSourceSelectReg : public Decoder
3097  {
3098  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3099  {
3100  (void) inRegNum;
3101  (void) inDeviceID;
3102  static const string SrcStrs [] = { "AES Input", "Embedded Groups 1 and 2", "" };
3103  static const unsigned SrcStrMap [] = { 0, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 };
3104  const uint16_t vidInput = (inRegValue & BIT(23) ? 2 : 0) + (inRegValue & BIT(16) ? 1 : 0);
3105  // WARNING! BIT(23) had better be clear on 0 & 1-input boards!!
3106  ostringstream oss;
3107  oss << "Audio Source: " << SrcStrs [SrcStrMap [(BIT(0) | BIT(1) | BIT(2) | BIT(3)) & inRegValue]] << endl
3108  << "Embedded Source Select: Video Input " << (1 + vidInput) << endl
3109  << "AES Sync Mode bit (fib): " << EnabDisab(inRegValue & BIT(18)) << endl
3110  << "PCM disabled: " << YesNo(inRegValue & BIT(17)) << endl
3111  << "Erase head enable: " << YesNo(inRegValue & BIT(19)) << endl
3112  << "Embedded Clock Select: " << (inRegValue & BIT(22) ? "Video Input" : "Board Reference") << endl
3113  << "3G audio source: " << (inRegValue & BIT(21) ? "Data stream 2" : "Data stream 1");
3114  return oss.str();
3115  }
3116  } mDecodeAudSourceSelectReg;
3117 
3118  struct DecodeAudOutputSrcMap : public Decoder
3119  {
3120  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3121  {
3122  (void) inRegNum;
3123  (void) inDeviceID;
3124  static const string AESOutputStrs[] = { "AES Outputs 1-4", "AES Outputs 5-8", "AES Outputs 9-12", "AES Outputs 13-16", ""};
3125  static const string SrcStrs[] = { "AudSys1, Audio Channels 1-4", "AudSys1, Audio Channels 5-8",
3126  "AudSys1, Audio Channels 9-12", "AudSys1, Audio Channels 13-16",
3127  "AudSys2, Audio Channels 1-4", "AudSys2, Audio Channels 5-8",
3128  "AudSys2, Audio Channels 9-12", "AudSys2, Audio Channels 13-16",
3129  "AudSys3, Audio Channels 1-4", "AudSys3, Audio Channels 5-8",
3130  "AudSys3, Audio Channels 9-12", "AudSys3, Audio Channels 13-16",
3131  "AudSys4, Audio Channels 1-4", "AudSys4, Audio Channels 5-8",
3132  "AudSys4, Audio Channels 9-12", "AudSys4, Audio Channels 13-16", ""};
3133  static const unsigned AESChlMappingShifts [4] = {0, 4, 8, 12};
3134 
3135  ostringstream oss;
3136  const uint32_t AESOutMapping (inRegValue & 0x0000FFFF);
3137  const uint32_t AnlgMonInfo ((inRegValue & kRegMaskMonitorSource) >> kRegShiftMonitorSource);
3138  const NTV2AudioSystem AnlgMonAudSys (NTV2AudioSystem(AnlgMonInfo >> 4));
3139  const NTV2AudioChannelPair AnlgMonChlPair (NTV2AudioChannelPair(AnlgMonInfo & 0xF));
3140  for (unsigned AESOutputQuad(0); AESOutputQuad < 4; AESOutputQuad++)
3141  oss << AESOutputStrs[AESOutputQuad] << " Source: " << SrcStrs[(AESOutMapping >> AESChlMappingShifts[AESOutputQuad]) & 0x0000000F] << endl;
3142  oss << "Analog Audio Monitor Output Source: " << ::NTV2AudioSystemToString(AnlgMonAudSys,true) << ", Channels " << ::NTV2AudioChannelPairToString(AnlgMonChlPair,true) << endl;
3143 
3144  // HDMI Audio Output Mapping -- interpretation depends on bit 29 of register 125 kRegHDMIOutControl MULTIREG_SPARSE_BITS
3145  const uint32_t HDMIMonInfo ((inRegValue & kRegMaskHDMIOutAudioSource) >> kRegShiftHDMIOutAudioSource);
3146  {
3147  // HDMI Audio 2-channel Mode:
3148  const NTV2AudioSystem HDMIMonAudSys (NTV2AudioSystem(HDMIMonInfo >> 4));
3149  const NTV2AudioChannelPair HDMIMonChlPair (NTV2AudioChannelPair(HDMIMonInfo & 0xF));
3150  oss << "HDMI 2-Chl Audio Output Source: " << ::NTV2AudioSystemToString(HDMIMonAudSys,true) << ", Channels " << ::NTV2AudioChannelPairToString(HDMIMonChlPair,true) << endl;
3151  }
3152  {
3153  // HDMI Audio 8-channel Mode:
3154  const uint32_t HDMIMon1234Info (HDMIMonInfo & 0x0F);
3155  const NTV2AudioSystem HDMIMon1234AudSys (NTV2AudioSystem(HDMIMon1234Info >> 2));
3156  const NTV2Audio4ChannelSelect HDMIMon1234SrcPairs (NTV2Audio4ChannelSelect(HDMIMon1234Info & 0x3));
3157  const uint32_t HDMIMon5678Info ((HDMIMonInfo >> 4) & 0x0F);
3158  const NTV2AudioSystem HDMIMon5678AudSys (NTV2AudioSystem(HDMIMon5678Info >> 2));
3159  const NTV2Audio4ChannelSelect HDMIMon5678SrcPairs (NTV2Audio4ChannelSelect(HDMIMon5678Info & 0x3));
3160  oss << "or HDMI 8-Chl Audio Output 1-4 Source: " << ::NTV2AudioSystemToString(HDMIMon1234AudSys,true) << ", Channels " << ::NTV2AudioChannelQuadToString(HDMIMon1234SrcPairs,true) << endl
3161  << "or HDMI 8-Chl Audio Output 5-8 Source: " << ::NTV2AudioSystemToString(HDMIMon5678AudSys,true) << ", Channels " << ::NTV2AudioChannelQuadToString(HDMIMon5678SrcPairs,true);
3162  }
3163  return oss.str();
3164  }
3165  } mDecodeAudOutputSrcMap;
3166 
3167  struct DecodePCMControlReg : public Decoder
3168  {
3169  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3170  {
3171  (void) inDeviceID;
3172  ostringstream oss;
3173  const UWord startAudioSystem (inRegNum == kRegPCMControl4321 ? 1 : 5);
3174  for (uint8_t audChan (0); audChan < 4; audChan++)
3175  {
3176  oss << "Audio System " << (startAudioSystem + audChan) << ": ";
3177  const uint8_t pcmBits (uint32_t(inRegValue >> (audChan * 8)) & 0x000000FF);
3178  if (pcmBits == 0x00)
3179  oss << "normal";
3180  else
3181  {
3182  oss << "non-PCM channels";
3183  for (uint8_t chanPair (0); chanPair < 8; chanPair++)
3184  if (pcmBits & (0x01 << chanPair))
3185  oss << " " << (chanPair*2+1) << "-" << (chanPair*2+2);
3186  }
3187  if (audChan < 3)
3188  oss << endl;
3189  }
3190  return oss.str();
3191  }
3192  } mDecodePCMControlReg;
3193 
3194  struct DecodeAudioMixerInputSelectReg : public Decoder
3195  { // kRegAudioMixerInputSelects
3196  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3197  { (void) inDeviceID; (void) inRegNum;
3198  const UWord mainInputSrc((inRegValue ) & 0x0000000F);
3199  const UWord aux1InputSrc((inRegValue >> 4) & 0x0000000F);
3200  const UWord aux2InputSrc((inRegValue >> 8) & 0x0000000F);
3201  ostringstream oss;
3202  oss << "Main Input Source: " << ::NTV2AudioSystemToString(NTV2AudioSystem(mainInputSrc)) << " (bits 0-3)" << endl
3203  << "Aux Input 1 Source: " << ::NTV2AudioSystemToString(NTV2AudioSystem(aux1InputSrc)) << " (bits 4-7)" << endl
3204  << "Aux Input 2 Source: " << ::NTV2AudioSystemToString(NTV2AudioSystem(aux2InputSrc)) << " (bits 8-11)";
3205  return oss.str();
3206  }
3207  } mAudMxrInputSelDecoder;
3208 
3209  struct DecodeAudioMixerGainRegs : public Decoder
3210  { // kRegAudioMixerMainGain,
3211  // kRegAudioMixerAux1GainCh1, kRegAudioMixerAux1GainCh2,
3212  // kRegAudioMixerAux2GainCh1, kRegAudioMixerAux2GainCh2
3213  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3214  { (void)inRegNum; (void)inDeviceID;
3215  static const double kUnityGain (0x00010000);
3216  const bool atUnity (inRegValue == 0x00010000);
3217  ostringstream oss;
3218  if (atUnity)
3219  oss << "Gain: 0 dB (Unity)";
3220  else
3221  {
3222  const double dValue (inRegValue);
3223  const bool aboveUnity (inRegValue >= 0x00010000);
3224  const string plusMinus (atUnity ? "" : (aboveUnity ? "+" : "-"));
3225  const string aboveBelow (atUnity ? "at" : (aboveUnity ? "above" : "below"));
3226  const uint32_t unityDiff (aboveUnity ? inRegValue - 0x00010000 : 0x00010000 - inRegValue);
3227  const double dB (double(20.0) * ::log10(dValue/kUnityGain));
3228  oss << "Gain: " << dB << " dB, " << plusMinus << xHEX0N(unityDiff,6)
3229  << " (" << plusMinus << DEC(unityDiff) << ") " << aboveBelow << " unity gain";
3230  }
3231  return oss.str();
3232  }
3233  } mAudMxrGainDecoder;
3234 
3235  struct DecodeAudioMixerChannelSelectReg : public Decoder
3236  { // kRegAudioMixerChannelSelect
3237  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3238  { (void) inRegNum; (void) inDeviceID;
3239  ostringstream oss;
3240  const uint32_t mainChanPair((inRegValue & kRegMaskAudioMixerChannelSelect ) >> kRegShiftAudioMixerChannelSelect );
3241  const uint32_t powerOfTwo ((inRegValue & kRegMaskAudioMixerLevelSampleCount) >> kRegShiftAudioMixerLevelSampleCount);
3242  oss << "Main Input Source Channel Pair: " << ::NTV2AudioChannelPairToString(NTV2AudioChannelPair(mainChanPair)) << " (bits 0-2)" << endl
3243  << "Level Measurement Sample Count: " << DEC(ULWord(1 << powerOfTwo)) << " (bits 8-15)";
3244  return oss.str();
3245  }
3246  } mAudMxrChanSelDecoder;
3247 
3248 
3249  struct DecodeAudioMixerMutesReg : public Decoder
3250  { // kRegAudioMixerMutes
3251  protected:
3252  typedef std::bitset<16> AudioChannelSet16;
3253  typedef std::bitset<2> AudioChannelSet2;
3254  static void SplitAudioChannelSet16(const AudioChannelSet16 & inChSet, NTV2StringList & outSet, NTV2StringList & outClear)
3255  {
3256  outSet.clear(); outClear.clear();
3257  for (size_t ndx(0); ndx < 16; ndx++)
3258  { ostringstream oss; oss << DEC(ndx+1);
3259  if (inChSet.test(ndx))
3260  outSet.push_back(oss.str());
3261  else
3262  outClear.push_back(oss.str());
3263  }
3264  if (outSet.empty()) outSet.push_back("<none>");
3265  if (outClear.empty()) outClear.push_back("<none>");
3266  }
3267  static void SplitAudioChannelSet2(const AudioChannelSet2 & inChSet, NTV2StringList & outSet, NTV2StringList & outClear)
3268  {
3269  outSet.clear(); outClear.clear(); static const string LR[] = {"L", "R"};
3270  for (size_t ndx(0); ndx < 2; ndx++)
3271  if (inChSet.test(ndx))
3272  outSet.push_back(LR[ndx]);
3273  else
3274  outClear.push_back(LR[ndx]);
3275  if (outSet.empty()) outSet.push_back("<none>");
3276  if (outClear.empty()) outClear.push_back("<none>");
3277  }
3278  public:
3279  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3280  { (void) inRegNum; (void) inDeviceID;
3281  uint32_t mainOutputMuteBits ((inRegValue & kRegMaskAudioMixerOutputChannelsMute) >> kRegShiftAudioMixerOutputChannelsMute); // Bits 0-15
3282  uint32_t mainInputMuteBits ((inRegValue & kRegMaskAudioMixerMainInputEnable ) >> kRegShiftAudioMixerMainInputEnable ); // Bits 16-17
3283  uint32_t aux1InputMuteBits ((inRegValue & kRegMaskAudioMixerAux1InputEnable ) >> kRegShiftAudioMixerAux1InputEnable ); // Bits 18-19
3284  uint32_t aux2InputMuteBits ((inRegValue & kRegMaskAudioMixerAux2InputEnable ) >> kRegShiftAudioMixerAux2InputEnable ); // Bits 20-21
3285  ostringstream oss;
3286  NTV2StringList mutedMainOut, unmutedMainOut, mutedMain, unmutedMain, mutedAux1, unmutedAux1, mutedAux2, unmutedAux2;
3287  SplitAudioChannelSet16(AudioChannelSet16(mainOutputMuteBits), mutedMainOut, unmutedMainOut);
3288  SplitAudioChannelSet2(AudioChannelSet2(mainInputMuteBits), mutedMain, unmutedMain);
3289  SplitAudioChannelSet2(AudioChannelSet2(aux1InputMuteBits), mutedAux1, unmutedAux1);
3290  SplitAudioChannelSet2(AudioChannelSet2(aux2InputMuteBits), mutedAux2, unmutedAux2);
3291  oss << "Main Output Muted/Disabled Channels: " << mutedMainOut << endl // bits[0:15]
3292  << "Main Output Unmuted/Enabled Channels: " << unmutedMainOut << endl;
3293  oss << "Main Input Muted/Disabled Channels: " << mutedMain << endl // bits[16:17]
3294  << "Main Input Unmuted/Enabled Channels: " << unmutedMain << endl;
3295  oss << "Aux Input 1 Muted/Disabled Channels: " << mutedAux1 << endl // bits[18:19]
3296  << "Aux Input 1 Unmuted/Enabled Channels: " << unmutedAux1 << endl;
3297  oss << "Aux Input 2 Muted/Disabled Channels: " << mutedAux2 << endl // bits[20-21]
3298  << "Aux Input 2 Unmuted/Enabled Channels: " << unmutedAux2;
3299  return oss.str();
3300  }
3301  } mAudMxrMutesDecoder;
3302 
3303  struct DecodeAudioMixerLevelsReg : public Decoder
3304  { // kRegAudioMixerAux1InputLevels, kRegAudioMixerAux2InputLevels,
3305  // kRegAudioMixerMainInputLevelsPair0 thru kRegAudioMixerMainInputLevelsPair7,
3306  // kRegAudioMixerMixedChannelOutputLevels
3307  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3308  { (void) inDeviceID;
3309  static const string sLabels[] = { "Aux Input 1", "Aux Input 2", "Main Input Audio Channels 1|2", "Main Input Audio Channels 3|4",
3310  "Main Input Audio Channels 5|6", "Main Input Audio Channels 7|8", "Main Input Audio Channels 9|10",
3311  "Main Input Audio Channels 11|12", "Main Input Audio Channels 13|14", "Main Input Audio Channels 15|16",
3312  "Main Output Audio Channels 1|2", "Main Output Audio Channels 3|4", "Main Output Audio Channels 5|6",
3313  "Main Output Audio Channels 7|8", "Main Output Audio Channels 9|10", "Main Output Audio Channels 11|12",
3314  "Main Output Audio Channels 13|14", "Main Output Audio Channels 15|16"};
3316  const uint32_t labelOffset(inRegNum - kRegAudioMixerAux1InputLevels);
3317  NTV2_ASSERT(labelOffset < 18);
3318  const string & label(sLabels[labelOffset]);
3319  const uint16_t leftLevel ((inRegValue & kRegMaskAudioMixerInputLeftLevel) >> kRegShiftAudioMixerInputLeftLevel);
3320  const uint16_t rightLevel ((inRegValue & kRegMaskAudioMixerInputRightLevel) >> kRegShiftAudioMixerInputRightLevel);
3321  ostringstream oss;
3322  oss << label << " Left Level:" << xHEX0N(leftLevel, 4) << " (" << DEC(leftLevel) << ")" << endl // bits[0:15]
3323  << label << " Right Level:" << xHEX0N(rightLevel,4) << " (" << DEC(rightLevel) << ")"; // bits[16:31]
3324  return oss.str();
3325  }
3326  } mAudMxrLevelDecoder;
3327 
3328  struct DecodeAncExtControlReg : public Decoder
3329  {
3330  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3331  {
3332  (void) inRegNum;
3333  (void) inDeviceID;
3334  ostringstream oss;
3335  static const string SyncStrs [] = { "field", "frame", "immediate", "unknown" };
3336  oss << "HANC Y enable: " << YesNo(inRegValue & BIT( 0)) << endl
3337  << "VANC Y enable: " << YesNo(inRegValue & BIT( 4)) << endl
3338  << "HANC C enable: " << YesNo(inRegValue & BIT( 8)) << endl
3339  << "VANC C enable: " << YesNo(inRegValue & BIT(12)) << endl
3340  << "Progressive video: " << YesNo(inRegValue & BIT(16)) << endl
3341  << "Synchronize: " << SyncStrs [(inRegValue & (BIT(24) | BIT(25))) >> 24] << endl
3342  << "Memory writes: " << EnabDisab(!(inRegValue & BIT(28))) << endl
3343  << "SD Y+C Demux: " << EnabDisab(inRegValue & BIT(30)) << endl
3344  << "Metadata from: " << (inRegValue & BIT(31) ? "LSBs" : "MSBs");
3345  return oss.str();
3346  }
3347  } mDecodeAncExtControlReg;
3348 
3349  struct DecodeAuxExtControlReg : public Decoder
3350  {
3351  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3352  {
3353  (void) inRegNum;
3354  (void) inDeviceID;
3355  ostringstream oss;
3356  static const string SyncStrs [] = { "field", "frame", "immediate", "unknown" };
3357  oss << "Progressive video: " << YesNo(inRegValue & BIT(16)) << endl
3358  << "Synchronize: " << SyncStrs [(inRegValue & (BIT(24) | BIT(25))) >> 24] << endl
3359  << "Memory writes: " << EnabDisab(!(inRegValue & BIT(28))) << endl
3360  << "Filter inclusion: " << EnabDisab(inRegValue & BIT(29));
3361  return oss.str();
3362  }
3363  } mDecodeAuxExtControlReg;
3364 
3365  // Also used for HDMI Aux regs: regAuxExtFieldVBLStartLine, regAuxExtFID
3366  struct DecodeAncExtFieldLinesReg : public Decoder
3367  {
3368  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3369  {
3370  (void) inDeviceID;
3371  ostringstream oss;
3372  const uint32_t which (inRegNum & 0x1F);
3373  const uint32_t valueLow (inRegValue & 0xFFF);
3374  const uint32_t valueHigh ((inRegValue >> 16) & 0xFFF);
3375  switch (which)
3376  {
3377  case 5: oss << "F1 cutoff line: " << valueLow << endl // regAncExtFieldCutoffLine
3378  << "F2 cutoff line: " << valueHigh;
3379  break;
3380  case 9: oss << "F1 VBL start line: " << valueLow << endl // regAncExtFieldVBLStartLine
3381  << "F2 VBL start line: " << valueHigh;
3382  break;
3383  case 11: oss << "Field ID high on line: " << valueLow << endl // regAncExtFID
3384  << "Field ID low on line: " << valueHigh;
3385  break;
3386  case 17: oss << "F1 analog start line: " << valueLow << endl // regAncExtAnalogStartLine
3387  << "F2 analog start line: " << valueHigh;
3388  break;
3389  default:
3390  oss << "Invalid register type";
3391  break;
3392  }
3393  return oss.str();
3394  }
3395  } mDecodeAncExtFieldLines;
3396 
3397  // Also used for HDMI Aux regs: regAuxExtTotalStatus, regAuxExtField1Status, regAuxExtField2Status
3398  struct DecodeAncExtStatusReg : public Decoder
3399  {
3400  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3401  {
3402  (void) inDeviceID;
3403  ostringstream oss;
3404  const uint32_t which (inRegNum & 0x1F);
3405  const uint32_t byteTotal (inRegValue & 0xFFFFFF);
3406  const bool overrun ((inRegValue & BIT(28)) ? true : false);
3407  switch (which)
3408  {
3409  case 6: oss << "Total bytes: "; break;
3410  case 7: oss << "Total F1 bytes: "; break;
3411  case 8: oss << "Total F2 bytes: "; break;
3412  default: oss << "Invalid register type"; break;
3413  }
3414  oss << DEC(byteTotal) << endl
3415  << "Overrun: " << YesNo(overrun);
3416  return oss.str();
3417  }
3418  } mDecodeAncExtStatus;
3419 
3420  // Also used for HDMI Aux Packet filtering
3421  struct DecodeAncExtIgnoreDIDReg : public Decoder
3422  {
3423  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3424  {
3425  (void) inRegNum;
3426  (void) inDeviceID;
3427  ostringstream oss;
3428  oss << "Ignoring DIDs " << HEX0N((inRegValue >> 0) & 0xFF, 2)
3429  << ", " << HEX0N((inRegValue >> 8) & 0xFF, 2)
3430  << ", " << HEX0N((inRegValue >> 16) & 0xFF, 2)
3431  << ", " << HEX0N((inRegValue >> 24) & 0xFF, 2);
3432  return oss.str();
3433  }
3434  } mDecodeAncExtIgnoreDIDs;
3435 
3436  struct DecodeAncExtAnalogFilterReg : public Decoder
3437  {
3438  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3439  {
3440  (void) inRegValue;
3441  (void) inDeviceID;
3442  ostringstream oss;
3443  uint32_t which (inRegNum & 0x1F);
3444  oss << "Each 1 bit specifies capturing ";
3445  switch (which)
3446  {
3447  case 18: oss << "F1 Y"; break;
3448  case 19: oss << "F2 Y"; break;
3449  case 20: oss << "F1 C"; break;
3450  case 21: oss << "F2 C"; break;
3451  default: return "Invalid register type";
3452  }
3453  oss << " line as analog, else digital";
3454  return oss.str();
3455  }
3456  } mDecodeAncExtAnalogFilter;
3457 
3458  struct DecodeAncInsValuePairReg : public Decoder
3459  {
3460  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3461  {
3462  (void) inDeviceID;
3463  ostringstream oss;
3464  const uint32_t which (inRegNum & 0x1F);
3465  const uint32_t valueLow (inRegValue & 0xFFFF);
3466  const uint32_t valueHigh ((inRegValue >> 16) & 0xFFFF);
3467 
3468  switch (which)
3469  {
3470  case 0: oss << "F1 byte count low: " << valueLow << endl
3471  << "F2 byte count low: " << valueHigh;
3472  break;
3473  case 4: oss << "HANC pixel delay: " << (valueLow & 0x3FF) << endl
3474  << "VANC pixel delay: " << (valueHigh & 0x7FF);
3475  break;
3476  case 5: oss << "F1 first active line: " << (valueLow & 0x7FF) << endl
3477  << "F2 first active line: " << (valueHigh & 0x7FF);
3478  break;
3479  case 6: oss << "Active line length: " << (valueLow & 0x7FF) << endl
3480  << "Total line length: " << (valueHigh & 0xFFF);
3481  break;
3482  case 8: oss << "Field ID high on line: " << (valueLow & 0x7FF) << endl
3483  << "Field ID low on line: " << (valueHigh & 0x7FF);
3484  break;
3485  case 11: oss << "F1 chroma blnk start line: " << (valueLow & 0x7FF) << endl
3486  << "F2 chroma blnk start line: " << (valueHigh & 0x7FF);
3487  break;
3488  case 14: oss << "F1 byte count high: " << valueLow << endl
3489  << "F2 byte count high: " << valueHigh;
3490  break;
3491  default: return "Invalid register type";
3492  }
3493  return oss.str();
3494  }
3495  } mDecodeAncInsValuePairReg;
3496 
3497  struct DecodeAncInsControlReg : public Decoder
3498  {
3499  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3500  {
3501  (void) inRegNum;
3502  (void) inDeviceID;
3503  ostringstream oss;
3504  oss << "HANC Y enable: " << YesNo(inRegValue & BIT( 0)) << endl
3505  << "VANC Y enable: " << YesNo(inRegValue & BIT( 4)) << endl
3506  << "HANC C enable: " << YesNo(inRegValue & BIT( 8)) << endl
3507  << "VANC C enable: " << YesNo(inRegValue & BIT(12)) << endl
3508  << "Payload Y insert: " << YesNo(inRegValue & BIT(16)) << endl
3509  << "Payload C insert: " << YesNo(inRegValue & BIT(17)) << endl
3510  << "Payload F1 insert: " << YesNo(inRegValue & BIT(20)) << endl
3511  << "Payload F2 insert: " << YesNo(inRegValue & BIT(21)) << endl
3512  << "Progressive video: " << YesNo(inRegValue & BIT(24)) << endl
3513  << "Memory reads: " << EnabDisab(!(inRegValue & BIT(28))) << endl
3514  << "SD Packet Split: " << EnabDisab(inRegValue & BIT(31));
3515  return oss.str();
3516  }
3517  } mDecodeAncInsControlReg;
3518 
3519  struct DecodeAncInsChromaBlankReg : public Decoder
3520  {
3521  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3522  {
3523  (void) inRegValue;
3524  (void) inDeviceID;
3525  ostringstream oss;
3526  uint32_t which (inRegNum & 0x1F);
3527 
3528  oss << "Each 1 bit specifies if chroma in ";
3529  switch (which)
3530  {
3531  case 12: oss << "F1"; break;
3532  case 13: oss << "F2"; break;
3533  default: return "Invalid register type";
3534  }
3535  oss << " should be blanked or passed thru";
3536  return oss.str();
3537  }
3538  } mDecodeAncInsChromaBlankReg;
3539 
3540  struct DecodeXptGroupReg : public Decoder
3541  { // Every byte in the reg value is an NTV2OutputXptID
3542  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3543  { (void) inRegNum;
3544  static unsigned sShifts[4] = {0, 8, 16, 24};
3545  NTV2StringList strs;
3546  for (unsigned ndx(0); ndx < 4; ndx++)
3547  {
3548  const NTV2InputCrosspointID inputXpt (CNTV2RegisterExpert::GetInputCrosspointID (inRegNum, ndx));
3549  const NTV2OutputCrosspointID outputXpt (NTV2OutputCrosspointID((inRegValue >> sShifts[ndx]) & 0xFF));
3550  if (NTV2_IS_VALID_InputCrosspointID(inputXpt))
3551  {
3552  if (outputXpt != NTV2_XptBlack)
3553  {
3555  ostringstream oss;
3556  oss << ::NTV2InputCrosspointIDToString(inputXpt, false);
3557  /* Don't bother with inputXpt check, since wgtID guaranteed valid for every inputXpt seen here:
3558  if (!CNTV2SignalRouter::GetWidgetForInput (inputXpt, wgtID, inDeviceID))
3559  oss << " (unimpl)";
3560  */
3561  oss << " <== " << ::NTV2OutputCrosspointIDToString(outputXpt, false);
3562  if (!CNTV2SignalRouter::GetWidgetForOutput (outputXpt, wgtID, inDeviceID))
3563  oss << " (unimpl)";
3564  strs.push_back(oss.str());
3565  }
3566  }
3567  }
3568  return aja::join(strs, "\n");
3569  }
3570  } mDecodeXptGroupReg;
3571 
3572  struct DecodeXptValidReg : public Decoder
3573  {
3574  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3575  {
3576  NTV2_ASSERT(inRegNum >= uint32_t(kRegFirstValidXptROMRegister));
3577  NTV2_ASSERT(inRegNum < uint32_t(kRegInvalidValidXptROMRegister));
3578  ostringstream oss;
3579  NTV2InputXptID inputXpt;
3580  NTV2OutputXptIDSet outputXpts;
3581  if (CNTV2SignalRouter::GetRouteROMInfoFromReg (inRegNum, inRegValue, inputXpt, outputXpts)
3582  && NTV2_IS_VALID_InputCrosspointID(inputXpt))
3583  {
3584  NTV2StringList outputXptNames;
3585  for (NTV2OutputXptIDSetConstIter it(outputXpts.begin()); it != outputXpts.end(); ++it)
3586  {
3587  const NTV2OutputXptID outputXpt(*it);
3588  const string name(::NTV2OutputCrosspointIDToString(outputXpt,true));
3589  ostringstream ss;
3590  if (name.empty())
3591  ss << xHEX0N(outputXpt,2) << "(" << DEC(outputXpt) << ")";
3592  else
3593  ss << "'" << name << "'";
3594  outputXptNames.push_back(ss.str());
3595  }
3596  if (!outputXptNames.empty())
3597  oss << "Valid Xpts: " << outputXptNames;
3598  return oss.str();
3599  }
3600  else
3601  return Decoder::operator()(inRegNum, inRegValue, inDeviceID);
3602  }
3603  } mDecodeXptValidReg;
3604 
3605  struct DecodeNTV4FSReg : public Decoder
3606  {
3607  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3608  { (void) inDeviceID;
3609  static const string sPixClkSelects[] = {"27", "74.1758", "74.25", "148.3516", "148.5", "inv5", "inv6", "inv7"};
3610  static const string sSyncs[] = {"Sync to Frame", "Sync to Field", "Immediate", "Sync to External"};
3611  const ULWord ntv4RegNum ((inRegNum - kNTV4FrameStoreFirstRegNum) % kNumNTV4FrameStoreRegisters);
3612  ostringstream oss;
3613  switch (NTV4FrameStoreRegs(ntv4RegNum))
3614  {
3616  { const ULWord disabled (inRegValue & BIT(1));
3617  const ULWord sync ((inRegValue & (BIT(20)|BIT(21))) >> 20);
3618  const ULWord pixClkSel((inRegValue & (BIT(16)|BIT(17)|BIT(18))) >> 16);
3619  const ULWord pixFmt((inRegValue & (BIT(8)|BIT(9)|BIT(10)|BIT(11)|BIT(12))) >> 8);
3620  if (!disabled)
3621  oss << "Enabled: " << YesNo(!disabled) << endl
3622  << "Mode: " << ((inRegValue & BIT( 0)) ? "Capture" : "Display") << endl
3623  << "DRT_DISP: " << OnOff(inRegValue & BIT( 2)) << endl
3624  << "Fill Bit: " << DEC((inRegValue & BIT( 3)) ? 1 : 0) << endl
3625  << "Dither: " << EnabDisab(inRegValue & BIT( 4)) << endl
3626  << "RGB8 Convert: " << ((inRegValue & BIT( 5)) ? "Use '00'" : "Copy MSBs") << endl
3627  << "Progressive: " << YesNo(inRegValue & BIT( 6)) << endl
3628  << "Pixel Format: " << DEC(pixFmt) << " " << ::NTV2FrameBufferFormatToString(NTV2PixelFormat(pixFmt)) << endl
3629  << "Pix Clk Sel: " << sPixClkSelects[pixClkSel] << " MHz" << endl
3630  << "Sync: " << sSyncs[sync];
3631  else
3632  oss << "Enabled: " << YesNo(!disabled);
3633  break;
3634  }
3635  case regNTV4FS_Status:
3636  { const ULWord lineCnt ((inRegValue & (0xFFFF0000)) >> 16);
3637  oss << "Field ID: " << OddEven(inRegValue & BIT( 0)) << endl
3638  << "Line Count: " << DEC(lineCnt);
3639  break;
3640  }
3642  { const int32_t xferByteCnt((inRegValue & 0xFFFF0000) >> 16), linePitch(inRegValue & 0x0000FFFF);
3643  oss << "Line Pitch: " << linePitch << (linePitch < 0 ? " (flipped)" : "") << endl
3644  << "Xfer Byte Count: " << xferByteCnt << " [bytes/line]" << (linePitch < 0 ? " (flipped)" : "");
3645  break;
3646  }
3647  case regNTV4FS_ROIVHSize:
3648  { const ULWord ROIVSize((inRegValue & (0x0FFF0000)) >> 16), ROIHSize(inRegValue & 0x00000FFF);
3649  oss << "ROI Horz Size: " << DEC(ROIHSize) << " [pixels]" << endl
3650  << "ROI Vert Size: " << DEC(ROIVSize) << " [lines]";
3651  break;
3652  }
3655  { const ULWord ROIVOff((inRegValue & (0x0FFF0000)) >> 16), ROIHOff(inRegValue & 0x00000FFF);
3656  const string fld(ntv4RegNum == regNTV4FS_ROIF1VHOffsets ? "F1" : "F2");
3657  oss << "ROI " << fld << " Horz Offset: " << DEC(ROIHOff) << endl
3658  << "ROI " << fld << " Vert Offset: " << DEC(ROIVOff);
3659  break;
3660  }
3662  { const ULWord tot((inRegValue & (0x0FFF0000)) >> 16), act(inRegValue & 0x00000FFF);
3663  oss << "Disp Horz Active: " << DEC(act) << endl
3664  << "Disp Horz Total: " << DEC(tot);
3665  break;
3666  }
3667  case regNTV4FS_DisplayFID:
3668  { const ULWord lo((inRegValue & (0x07FF0000)) >> 16), hi(inRegValue & 0x000007FF);
3669  oss << "Disp FID Lo: " << DEC(lo) << endl
3670  << "Disp FID Hi: " << DEC(hi);
3671  break;
3672  }
3675  { const ULWord actEnd((inRegValue & (0x07FF0000)) >> 16), actStart(inRegValue & 0x000007FF);
3676  const string fld(ntv4RegNum == regNTV4FS_F1ActiveLines ? "F1" : "F2");
3677  oss << "Disp " << fld << " Active Start: " << DEC(actStart) << endl
3678  << "Disp " << fld << " Active End: " << DEC(actEnd);
3679  break;
3680  }
3682  oss << "Unpacker Horz Offset: " << DEC(inRegValue & 0x0000FFFF);
3683  break;
3686  { const ULWord hi((inRegValue & (0xFFFF0000)) >> 16), lo(inRegValue & 0x0000FFFF);
3687  const string YGorA(ntv4RegNum == regNTV4FS_RasterVideoFill_YCb_GB ? "Y|G" : "A");
3688  const string CbBorCrR(ntv4RegNum == regNTV4FS_RasterVideoFill_YCb_GB ? "Cb|B" : "Cr|R");
3689  oss << "Disp Fill " << CbBorCrR << ": " << DEC(lo) << " " << xHEX0N(lo,4) << endl
3690  << "Disp Fill " << YGorA << ": " << DEC(hi) << " " << xHEX0N(hi,4);
3691  break;
3692  }
3694  { const ULWord lo(inRegValue & 0x0000FFFF);
3695  oss << "ROI Fill Alpha: " << DEC(lo) << " " << xHEX0N(lo,4);
3696  break;
3697  }
3699  oss << "Output Timing Frame Pulse Preset: " << DEC(inRegValue & 0x00FFFFFF) << " "
3700  << xHEX0N(inRegValue & 0x00FFFFFF,6);
3701  break;
3705  { const int32_t lo (inRegValue & 0x00001FFF);
3706  oss << "Output Video Offset: " << lo << " " << xHEX0N(lo,6);
3707  break;
3708  }
3709  default:
3710  return Decoder::operator()(inRegNum, inRegValue, inDeviceID);
3711  }
3712  return oss.str();
3713  }
3714  } mDecodeNTV4FSReg;
3715 
3716  struct DecodeHDMIOutputControl : public Decoder
3717  {
3718  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3719  {
3720  (void) inRegNum;
3721  ostringstream oss;
3722  static const string sHDMIStdV1[] = { "1080i", "720p", "480i", "576i", "1080p", "SXGA", "", "", "", "", "", "", "", "", "", "" };
3723  static const string sHDMIStdV2V3[] = { "1080i", "720p", "480i", "576i", "1080p", "1556i", "2Kx1080p", "2Kx1080i", "UHD", "4K", "", "", "", "", "", "" };
3724  static const string sVidRates[] = { "", "60.00", "59.94", "30.00", "29.97", "25.00", "24.00", "23.98", "50.00", "48.00", "47.95", "", "", "", "", "" };
3725  static const string sSrcSampling[] = { "YC422", "RGB", "YC420", "Unknown/invalid" };
3726  static const string sBitDepth[] = { "8", "10", "12", "Unknown/invalid" };
3727  const ULWord hdmiVers (::NTV2DeviceGetHDMIVersion(inDeviceID));
3728  const ULWord rawVideoStd (inRegValue & kRegMaskHDMIOutV2VideoStd);
3729  const string hdmiVidStdStr (hdmiVers > 1 ? sHDMIStdV2V3[rawVideoStd] : (hdmiVers == 1 ? sHDMIStdV1[rawVideoStd] : ""));
3730  const string vidStdStr (::NTV2StandardToString (NTV2Standard(rawVideoStd), true));
3731  const uint32_t srcSampling ((inRegValue & kRegMaskHDMISampling) >> kRegShiftHDMISampling);
3732  const uint32_t srcBPC ((inRegValue & (BIT(16)|BIT(17))) >> 16);
3733  const uint32_t txBitDepth ((inRegValue & (BIT(20)|BIT(21))) >> 20);
3734  oss << "Video Standard: " << hdmiVidStdStr;
3735  if (hdmiVidStdStr != vidStdStr)
3736  oss << " (" << vidStdStr << ")";
3737  oss << endl
3738  << "Color Mode: " << ((inRegValue & BIT( 8)) ? "RGB" : "YCbCr") << endl
3739  << "Video Rate: " << sVidRates[(inRegValue & kLHIRegMaskHDMIOutFPS) >> kLHIRegShiftHDMIOutFPS] << endl
3740  << "Scan Mode: " << ((inRegValue & BIT(13)) ? "Progressive" : "Interlaced") << endl
3741  << "Bit Depth: " << ((inRegValue & BIT(14)) ? "10-bit" : "8-bit") << endl
3742  << "Output Color Sampling: " << ((inRegValue & BIT(15)) ? "4:4:4" : "4:2:2") << endl
3743  << "Output Bit Depth: " << sBitDepth[txBitDepth] << endl
3744  << "Src Color Sampling: " << sSrcSampling[srcSampling] << endl
3745  << "Src Bits Per Component: " << sBitDepth[srcBPC] << endl
3746  << "Output Range: " << ((inRegValue & BIT(28)) ? "Full" : "SMPTE") << endl
3747  << "Audio Channels: " << ((inRegValue & BIT(29)) ? "8" : "2") << endl
3748  << "Output: " << ((inRegValue & BIT(30)) ? "DVI" : "HDMI");
3749  if (::NTV2DeviceGetNumHDMIVideoInputs(inDeviceID) && ::NTV2DeviceGetNumHDMIVideoOutputs(inDeviceID))
3750  oss << endl
3751  << "Audio Loopback: " << OnOff(inRegValue & BIT(31));
3752  return oss.str();
3753  }
3754  } mDecodeHDMIOutputControl;
3755 
3756  struct DecodeHDMIInputStatus : public Decoder
3757  {
3758  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3759  {
3760  (void) inRegNum;
3761  ostringstream oss;
3762  const ULWord hdmiVers(::NTV2DeviceGetHDMIVersion (inDeviceID));
3763  const uint32_t vidStd (hdmiVers >= 2 ? (inRegValue & kRegMaskHDMIInV2VideoStd) >> kRegShiftHDMIInV2VideoStd : (inRegValue & kRegMaskInputStatusStd) >> kRegShiftInputStatusStd);
3764  const uint32_t rate ((inRegValue & kRegMaskInputStatusFPS) >> kRegShiftInputStatusFPS);
3765  static const string sStds[32] = {"1080i", "720p", "480i", "576i", "1080p", "SXGA", "2K1080p", "2K1080i", "3840p", "4096p"};
3766  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" };
3767  oss << "HDMI Input: " << (inRegValue & BIT(0) ? "Locked" : "Unlocked") << endl
3768  << "HDMI Input: " << (inRegValue & BIT(1) ? "Stable" : "Unstable") << endl
3769  << "Color Mode: " << (inRegValue & BIT(2) ? "RGB" : "YCbCr") << endl
3770  << "Bitdepth: " << (inRegValue & BIT(3) ? "10-bit" : "8-bit") << endl
3771  << "Audio Channels: " << (inRegValue & BIT(12) ? 2 : 8) << endl
3772  << "Scan Mode: " << (inRegValue & BIT(13) ? "Progressive" : "Interlaced") << endl
3773  << "Standard: " << (inRegValue & BIT(14) ? "SD" : "HD") << endl
3774  << "Video Standard: " << sStds[vidStd] << endl
3775  << "Protocol: " << (inRegValue & BIT(27) ? "DVI" : "HDMI") << endl
3776  << "Video Rate : " << (rate < 11 ? sRates[rate] : string("invalid"));
3777  return oss.str();
3778  }
3779  } mDecodeHDMIInputStatus;
3780 
3781  struct DecodeHDMIInputControl : public Decoder
3782  {
3783  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3784  {
3785  (void) inRegNum; (void) inDeviceID;
3786  ostringstream oss;
3787  const UWord chanPair ((inRegValue & (BIT(2) | BIT(3))) >> 2);
3788  const UWord txSrcSel ((inRegValue & (BIT(20)|BIT(21)|BIT(22)|BIT(23))) >> 20);
3789  const UWord txCh12Sel ((inRegValue & (BIT(29)|BIT(30))) >> 29);
3791  oss << "HDMI In EDID Write-Enable: " << EnabDisab(inRegValue & BIT(0)) << endl
3792  << "HDMI Force Output Params: " << SetNotset(inRegValue & BIT(1)) << endl
3793  << "HDMI In Audio Chan Select: " << ::NTV2AudioChannelPairToString(pairs[chanPair], true) << endl
3794  << "hdmi_rx_8ch_src_off: " << YesNo(inRegValue & BIT(4)) << endl
3795  << "Swap HDMI In Audio Ch. 3/4: " << YesNo(inRegValue & BIT(5)) << endl
3796  << "Swap HDMI Out Audio Ch. 3/4: " << YesNo(inRegValue & BIT(6)) << endl
3797  << "HDMI Prefer 420: " << SetNotset(inRegValue & BIT(7)) << endl
3798  << "hdmi_rx_spdif_err: " << SetNotset(inRegValue & BIT(8)) << endl
3799  << "hdmi_rx_afifo_under: " << SetNotset(inRegValue & BIT(9)) << endl
3800  << "hdmi_rx_afifo_empty: " << SetNotset(inRegValue & BIT(10)) << endl
3801  << "H polarity: " << (inRegValue & BIT(16) ? "Inverted" : "Normal") << endl
3802  << "V polarity: " << (inRegValue & BIT(17) ? "Inverted" : "Normal") << endl
3803  << "F polarity: " << (inRegValue & BIT(18) ? "Inverted" : "Normal") << endl
3804  << "DE polarity: " << (inRegValue & BIT(19) ? "Inverted" : "Normal") << endl
3805  << "Tx Src Sel: " << DEC(txSrcSel) << " (" << xHEX0N(txSrcSel,4) << ")" << endl
3806  << "Tx Center Cut: " << SetNotset(inRegValue & BIT(24)) << endl
3807  << "Tx 12 bit: " << SetNotset(inRegValue & BIT(26)) << endl
3808  << "RGB Input Gamut: " << (inRegValue & BIT(28) ? "Full Range" : "Narrow Range (SMPTE)") << endl
3809  << "Tx_ch12_sel: " << DEC(txCh12Sel) << " (" << xHEX0N(txCh12Sel,4) << ")" << endl
3810  << "Input AVI Gamut: " << (inRegValue & BIT(31) ? "Full Range" : "Narrow Range (SMPTE)") << endl
3811  << "EDID: " << SetNotset(inRegValue & BIT(31));
3812  return oss.str();
3813  }
3814  } mDecodeHDMIInputControl;
3815 
3816  struct DecodeHDMIOutputStatus : public Decoder
3817  {
3818  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3819  { (void) inRegNum; (void) inDeviceID;
3820  const NTV2HDMIOutputStatus stat (inRegValue);
3821  ostringstream oss;
3822  stat.Print(oss);
3823  return oss.str();
3824  }
3825  } mDecodeHDMIOutputStatus;
3826 
3827  struct DecodeHDMIOutHDRPrimary : public Decoder
3828  {
3829  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3830  {
3831  (void) inRegNum;
3832  ostringstream oss;
3833  if (::NTV2DeviceCanDoHDMIHDROut (inDeviceID))
3834  switch (inRegNum)
3835  {
3838  case kRegHDMIHDRRedPrimary:
3839  case kRegHDMIHDRWhitePoint:
3856  { // Asserts to validate this one code block will handle all cases:
3863  const uint16_t xPrimary ((inRegValue & kRegMaskHDMIHDRRedPrimaryX) >> kRegShiftHDMIHDRRedPrimaryX);
3864  const uint16_t yPrimary ((inRegValue & kRegMaskHDMIHDRRedPrimaryY) >> kRegShiftHDMIHDRRedPrimaryY);
3865  const double xFloat (double(xPrimary) * 0.00002);
3866  const double yFloat (double(yPrimary) * 0.00002);
3867  if (NTV2_IS_VALID_HDR_PRIMARY (xPrimary))
3868  oss << "X: " << fDEC(xFloat,7,5) << endl;
3869  else
3870  oss << "X: " << HEX0N(xPrimary, 4) << "(invalid)" << endl;
3871  if (NTV2_IS_VALID_HDR_PRIMARY (yPrimary))
3872  oss << "Y: " << fDEC(yFloat,7,5);
3873  else
3874  oss << "Y: " << HEX0N(yPrimary, 4) << "(invalid)";
3875  break;
3876  }
3882  {
3883  const uint16_t minValue ((inRegValue & kRegMaskHDMIHDRMinMasteringLuminance) >> kRegShiftHDMIHDRMinMasteringLuminance);
3884  const uint16_t maxValue ((inRegValue & kRegMaskHDMIHDRMaxMasteringLuminance) >> kRegShiftHDMIHDRMaxMasteringLuminance);
3885  const double minFloat (double(minValue) * 0.00001);
3886  const double maxFloat (maxValue);
3887  oss << "Min: " << fDEC(minFloat,7,5) << endl
3888  << "Max: " << fDEC(maxFloat,7,5);
3889  break;
3890  }
3891  case kRegHDMIHDRLightLevel:
3896  {
3897  const uint16_t cntValue ((inRegValue & kRegMaskHDMIHDRMaxContentLightLevel) >> kRegShiftHDMIHDRMaxContentLightLevel);
3898  const uint16_t frmValue ((inRegValue & kRegMaskHDMIHDRMaxFrameAverageLightLevel) >> kRegShiftHDMIHDRMaxFrameAverageLightLevel);
3899  const double cntFloat (cntValue);
3900  const double frmFloat (frmValue);
3901  oss << "Max Content Light Level: " << fDEC(cntFloat,7,5) << endl
3902  << "Max Frame Light Level: " << fDEC(frmFloat,7,5);
3903  break;
3904  }
3905  default: NTV2_ASSERT(false);
3906  }
3907  return oss.str();
3908  }
3909  } mDecodeHDMIOutHDRPrimary;
3910 
3911  struct DecodeHDMIOutHDRControl : public Decoder
3912  {
3913  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3914  {
3915  (void) inRegNum;
3916  static const string sEOTFs[] = {"Trad Gamma SDR", "Trad Gamma HDR", "SMPTE ST 2084", "HLG"};
3917  ostringstream oss;
3918  if (::NTV2DeviceCanDoHDMIHDROut (inDeviceID))
3919  {
3920  const uint16_t EOTFvalue ((inRegValue & kRegMaskElectroOpticalTransferFunction) >> kRegShiftElectroOpticalTransferFunction);
3921  const uint16_t staticMetaDataDescID ((inRegValue & kRegMaskHDRStaticMetadataDescriptorID) >> kRegShiftHDRStaticMetadataDescriptorID);
3922  oss << "HDMI Out Dolby Vision Enabled: " << YesNo(inRegValue & kRegMaskHDMIHDRDolbyVisionEnable) << endl
3923  << "HDMI HDR Out Enabled: " << YesNo(inRegValue & kRegMaskHDMIHDREnable) << endl
3924  << "Constant Luminance: " << YesNo(inRegValue & kRegMaskHDMIHDRNonContantLuminance) << endl
3925  << "EOTF: " << sEOTFs[(EOTFvalue < 3) ? EOTFvalue : 3] << endl
3926  << "Static MetaData Desc ID: " << HEX0N(staticMetaDataDescID, 2) << " (" << DEC(staticMetaDataDescID) << ")";
3927  }
3928  return oss.str();
3929  }
3930  } mDecodeHDMIOutHDRControl;
3931 
3932  struct DecodeHDMIOutMRControl : public Decoder
3933  {
3934  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3935  { (void) inRegNum; (void) inDeviceID;
3936  ostringstream oss;
3937  static const string sMRStandard[] = { "1080i", "720p", "480i", "576i", "1080p", "1556i", "2Kx1080p", "2Kx1080i", "UHD", "4K", "", "", "", "", "", "" };
3938  const ULWord rawVideoStd (inRegValue & kRegMaskMRStandard);
3939  const string hdmiVidStdStr (sMRStandard[rawVideoStd]);
3940  const string vidStdStr (::NTV2StandardToString (NTV2Standard(rawVideoStd), true));
3941  oss << "Video Standard: " << hdmiVidStdStr;
3942  if (hdmiVidStdStr != vidStdStr)
3943  oss << " (" << vidStdStr << ")";
3944  oss << endl
3945  << "Capture Mode: " << ((inRegValue & kRegMaskMREnable) ? "Enabled" : "Disabled");
3946  return oss.str();
3947  }
3948  } mDecodeHDMIOutMRControl;
3949 
3950  struct DecodeSDIOutputControl : public Decoder
3951  {
3952  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3953  {
3954  (void) inRegNum;
3955  (void) inDeviceID;
3956  ostringstream oss;
3957  const uint32_t vidStd (inRegValue & (BIT(0)|BIT(1)|BIT(2)));
3958  static const string sStds[32] = {"1080i", "720p", "480i", "576i", "1080p", "1556i", "6", "7"};
3959  oss << "Video Standard: " << sStds[vidStd] << endl
3960  << "2Kx1080 mode: " << (inRegValue & BIT(3) ? "2048x1080" : "1920x1080") << endl
3961  << "HBlank RGB Range: Black=" << (inRegValue & BIT(7) ? "0x40" : "0x04") << endl
3962  << "12G enable: " << YesNo(inRegValue & BIT(17)) << endl
3963  << "6G enable: " << YesNo(inRegValue & BIT(16)) << endl
3964  << "3G enable: " << YesNo(inRegValue & BIT(24)) << endl
3965  << "3G mode: " << (inRegValue & BIT(25) ? "b" : "a") << endl
3966  << "VPID insert enable: " << YesNo(inRegValue & BIT(26)) << endl
3967  << "VPID overwrite enable: " << YesNo(inRegValue & BIT(27)) << endl
3968  << "DS 1 audio source: " "AudSys";
3969  switch ((inRegValue & (BIT(28)|BIT(30))) >> 28)
3970  {
3971  case 0: oss << (inRegValue & BIT(18) ? 5 : 1); break;
3972  case 1: oss << (inRegValue & BIT(18) ? 7 : 3); break;
3973  case 4: oss << (inRegValue & BIT(18) ? 6 : 2); break;
3974  case 5: oss << (inRegValue & BIT(18) ? 8 : 4); break;
3975  }
3976  oss << endl << "DS 2 audio source: AudSys";
3977  switch ((inRegValue & (BIT(29)|BIT(31))) >> 29)
3978  {
3979  case 0: oss << (inRegValue & BIT(19) ? 5 : 1); break;
3980  case 1: oss << (inRegValue & BIT(19) ? 7 : 3); break;
3981  case 4: oss << (inRegValue & BIT(19) ? 6 : 2); break;
3982  case 5: oss << (inRegValue & BIT(19) ? 8 : 4); break;
3983  }
3984  return oss.str();
3985  }
3986  } mDecodeSDIOutputControl;
3987 
3988  struct DecodeSDIOutTimingCtrl : public Decoder
3989  {
3990  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
3991  { (void)inRegNum; (void)inDeviceID;
3992  ostringstream oss;
3993  const uint32_t hMask(0x00001FFF), vMask(0x1FFF0000);
3994  const uint32_t hOffset(inRegValue & hMask), vOffset((inRegValue & vMask) >> 16);
3995  oss << "Horz Offset: " << xHEX0N(UWord(hOffset),4) << endl
3996  << "Vert Offset: " << xHEX0N(UWord(vOffset),4) << endl
3997  << "E-E Timing Override: " << EnabDisab(inRegValue & BIT(31));
3998  return oss.str();
3999  }
4000  } mDecodeSDIOutTimingCtrl;
4001 
4002  struct DecodeDMAControl : public Decoder
4003  {
4004  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4005  {
4006  (void) inRegNum;
4007  (void) inDeviceID;
4008  const uint16_t gen ((inRegValue & (BIT(20)|BIT(21)|BIT(22)|BIT(23))) >> 20);
4009  const uint16_t lanes ((inRegValue & (BIT(16)|BIT(17)|BIT(18)|BIT(19))) >> 16);
4010  const uint16_t fwRev ((inRegValue & 0x0000FF00) >> 8);
4011  ostringstream oss;
4012  for (uint16_t engine(0); engine < 4; engine++)
4013  oss << "DMA " << (engine+1) << " Int Active?: " << YesNo(inRegValue & BIT(27+engine)) << endl;
4014  oss << "Bus Error Int Active?: " << YesNo(inRegValue & BIT(31)) << endl;
4015  for (uint16_t engine(0); engine < 4; engine++)
4016  oss << "DMA " << (engine+1) << " Busy?: " << YesNo(inRegValue & BIT(27+engine)) << endl;
4017  oss << "Strap: " << ((inRegValue & BIT(7)) ? "Installed" : "Not Installed") << endl
4018  << "Firmware Rev: " << xHEX0N(fwRev, 2) << " (" << DEC(fwRev) << ")" << endl
4019  << "Gen: " << gen << ((gen > 0 && gen < 4) ? "" : " <invalid>") << endl
4020  << "Lanes: " << DEC(lanes) << ((lanes < 9) ? "" : " <invalid>");
4021  return oss.str();
4022  }
4023  } mDMAControlRegDecoder;
4024 
4025  struct DecodeDMAIntControl : public Decoder
4026  {
4027  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4028  {
4029  (void) inRegNum;
4030  (void) inDeviceID;
4031  ostringstream oss;
4032  for (uint16_t eng(0); eng < 4; eng++)
4033  oss << "DMA " << (eng+1) << " Enabled?: " << YesNo(inRegValue & BIT(eng)) << endl;
4034  oss << "Bus Error Enabled?: " << YesNo(inRegValue & BIT(4)) << endl;
4035  for (uint16_t eng(0); eng < 4; eng++)
4036  oss << "DMA " << (eng+1) << " Active?: " << YesNo(inRegValue & BIT(27+eng)) << endl;
4037  oss << "Bus Error: " << YesNo(inRegValue & BIT(31));
4038  return oss.str();
4039  }
4040  } mDMAIntControlRegDecoder;
4041 
4042  struct DecodeDMAXferRate : public Decoder
4043  {
4044  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4045  { (void) inRegNum; (void) inDeviceID;
4046  ostringstream oss;
4047  oss << DEC(inRegValue) << " [MB/sec] [kB/ms] [B/us]";
4048  return oss.str();
4049  }
4050  } mDMAXferRateRegDecoder;
4051 
4052  struct DecodeRP188InOutDBB : public Decoder
4053  {
4054  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4055  {
4056  (void) inRegNum;
4057  (void) inDeviceID;
4058  const bool isReceivingRP188 (inRegValue & BIT(16));
4059  const bool isReceivingSelectedRP188 (inRegValue & BIT(17));
4060  const bool isReceivingLTC (inRegValue & BIT(18));
4061  const bool isReceivingVITC (inRegValue & BIT(19));
4062  ostringstream oss;
4063  oss << "RP188: " << (isReceivingRP188 ? (isReceivingSelectedRP188 ? "Selected" : "Unselected") : "No") << " RP-188 received"
4064  << (isReceivingLTC ? " +LTC" : "") << (isReceivingVITC ? " +VITC" : "") << endl
4065  << "Bypass: " << (inRegValue & BIT(23) ? (inRegValue & BIT(22) ? "SDI In 2" : "SDI In 1") : "Disabled") << endl
4066  << "Filter: " << HEX0N((inRegValue & 0xFF000000) >> 24, 2) << endl
4067  << "DBB: " << HEX0N((inRegValue & 0x0000FF00) >> 8, 2) << " " << HEX0N(inRegValue & 0x000000FF, 2);
4068  return oss.str();
4069  }
4070  } mRP188InOutDBBRegDecoder;
4071 
4072  struct DecodeVidProcControl : public Decoder
4073  {
4074  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4075  {
4076  (void) inRegNum;
4077  (void) inDeviceID;
4078  ostringstream oss;
4079  static const string sSplitStds [8] = {"1080i", "720p", "480i", "576i", "1080p", "1556i", "?6?", "?7?"};
4080  oss << "Mode: " << (inRegValue & kRegMaskVidProcMode ? ((inRegValue & BIT(24)) ? "Shaped" : "Unshaped") : "Full Raster") << endl
4081  << "FG Control: " << (inRegValue & kRegMaskVidProcFGControl ? ((inRegValue & BIT(20)) ? "Shaped" : "Unshaped") : "Full Raster") << endl
4082  << "BG Control: " << (inRegValue & kRegMaskVidProcBGControl ? ((inRegValue & BIT(22)) ? "Shaped" : "Unshaped") : "Full Raster") << endl
4083  << "VANC Pass-Thru: " << ((inRegValue & BIT(13)) ? "Background" : "Foreground") << endl
4084  << "FG Matte: " << EnabDisab(inRegValue & kRegMaskVidProcFGMatteEnable) << endl
4085  << "BG Matte: " << EnabDisab(inRegValue & kRegMaskVidProcBGMatteEnable) << endl
4086  << "Input Sync: " << (inRegValue & kRegMaskVidProcSyncFail ? "not in sync" : "in sync") << endl
4087  << "Limiting: " << ((inRegValue & BIT(11)) ? "Off" : ((inRegValue & BIT(12)) ? "Legal Broadcast" : "Legal SDI")) << endl
4088  << "Split Video Std: " << sSplitStds[inRegValue & kRegMaskVidProcSplitStd];
4089  return oss.str();
4090  }
4091  } mVidProcControlRegDecoder;
4092 
4093  struct DecodeSplitControl : public Decoder
4094  {
4095  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4096  {
4097  (void) inRegNum;
4098  (void) inDeviceID;
4099  ostringstream oss;
4100  const uint32_t startmask (0x0000FFFF); // 16 bits
4101  const uint32_t slopemask (0x3FFF0000); // 14 bits / high order byte
4102  const uint32_t fractionmask(0x00000007); // 3 bits for fractions
4103  oss << "Split Start: " << HEX0N((inRegValue & startmask) & ~fractionmask, 4) << " "
4104  << HEX0N((inRegValue & startmask) & fractionmask, 4) << endl
4105  << "Split Slope: " << HEX0N(((inRegValue & slopemask) >> 16) & ~fractionmask, 4) << " "
4106  << HEX0N(((inRegValue & slopemask) >> 16) & fractionmask, 4) << endl
4107  << "Split Type: " << ((inRegValue & BIT(30)) ? "Vertical" : "Horizontal");
4108  return oss.str();
4109  }
4110  } mSplitControlRegDecoder;
4111 
4112  struct DecodeFlatMatteValue : public Decoder
4113  {
4114  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4115  {
4116  (void) inRegNum;
4117  (void) inDeviceID;
4118  ostringstream oss;
4119  const uint32_t mask (0x000003FF); // 10 bits
4120  oss << "Flat Matte Cb: " << HEX0N(inRegValue & mask, 3) << endl
4121  << "Flat Matte Y: " << HEX0N(((inRegValue >> 10) & mask) - 0x40, 3) << endl
4122  << "Flat Matte Cr: " << HEX0N((inRegValue >> 20) & mask, 3);
4123  return oss.str();
4124  }
4125  } mFlatMatteValueRegDecoder;
4126 
4127  struct DecodeEnhancedCSCMode : public Decoder
4128  {
4129  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4130  {
4131  (void) inRegNum;
4132  (void) inDeviceID;
4133  static const string sFiltSel[] = {"Full", "Simple", "None", "?"};
4134  static const string sEdgeCtrl[] = {"black", "extended pixels"};
4135  static const string sPixFmts[] = {"RGB 4:4:4", "YCbCr 4:4:4", "YCbCr 4:2:2", "?"};
4136  const uint32_t filterSelect ((inRegValue >> 12) & 0x3);
4137  const uint32_t edgeControl ((inRegValue >> 8) & 0x1);
4138  const uint32_t outPixFmt ((inRegValue >> 4) & 0x3);
4139  const uint32_t inpPixFmt (inRegValue & 0x3);
4140  ostringstream oss;
4141  oss << "Filter select: " << sFiltSel[filterSelect] << endl
4142  << "Filter edge control: " << "Filter to " << sEdgeCtrl[edgeControl] << endl
4143  << "Output pixel format: " << sPixFmts[outPixFmt] << endl
4144  << "Input pixel format: " << sPixFmts[inpPixFmt];
4145  return oss.str();
4146  }
4147  } mEnhCSCModeDecoder;
4148 
4149  struct DecodeEnhancedCSCOffset : public Decoder
4150  {
4151  static string U10Dot6ToFloat (const uint32_t inOffset)
4152  {
4153  double result (double((inOffset >> 6) & 0x3FF));
4154  result += double(inOffset & 0x3F) / 64.0;
4155  ostringstream oss; oss << fDEC(result,12,5); string resultStr(oss.str());
4156  return aja::replace (resultStr, sSpace, sNull);
4157  }
4158  static string U12Dot4ToFloat (const uint32_t inOffset)
4159  {
4160  double result (double((inOffset >> 4) & 0xFFF));
4161  result += double(inOffset & 0xF) / 16.0;
4162  ostringstream oss; oss << fDEC(result,12,4); string resultStr(oss.str());
4163  return aja::replace (resultStr, sSpace, sNull);
4164  }
4165  static string S13Dot2ToFloat (const uint32_t inOffset)
4166  {
4167  double result (double((inOffset >> 2) & 0x1FFF));
4168  result += double(inOffset & 0x3) / 4.0;
4169  if (inOffset & BIT(15))
4170  result = -result;
4171  ostringstream oss; oss << fDEC(result,12,2); string resultStr(oss.str());
4172  return aja::replace (resultStr, sSpace, sNull);
4173  }
4174  static string S11Dot4ToFloat (const uint32_t inOffset)
4175  {
4176  double result (double((inOffset >> 4) & 0x7FF));
4177  result += double(inOffset & 0xF) / 16.0;
4178  if (inOffset & BIT(15))
4179  result = -result;
4180  ostringstream oss; oss << fDEC(result,12,4); string resultStr(oss.str());
4181  return aja::replace (resultStr, sSpace, sNull);
4182  }
4183  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4184  {
4185  (void) inDeviceID;
4186  const uint32_t regNum (inRegNum & 0x1F);
4187  const uint32_t lo (inRegValue & 0x0000FFFF);
4188  const uint32_t hi ((inRegValue >> 16) & 0xFFFF);
4189  ostringstream oss;
4190  switch (regNum)
4191  {
4192  case 1: oss << "Component 0 input offset: " << U12Dot4ToFloat(lo) << " (12-bit), " << U10Dot6ToFloat(lo) << " (10-bit)" << endl
4193  << "Component 1 input offset: " << U12Dot4ToFloat(hi) << " (12-bit), " << U10Dot6ToFloat(hi) << " (10-bit)";
4194  break;
4195  case 2: oss << "Component 2 input offset: " << U12Dot4ToFloat(lo) << " (12-bit), " << U10Dot6ToFloat(lo) << " (10-bit)";
4196  break;
4197  case 12: oss << "Component A output offset: " << U12Dot4ToFloat(lo) << " (12-bit), " << U10Dot6ToFloat(lo) << " (10-bit)" << endl
4198  << "Component B output offset: " << U12Dot4ToFloat(hi) << " (12-bit), " << U10Dot6ToFloat(hi) << " (10-bit)";
4199  break;
4200  case 13: oss << "Component C output offset: " << U12Dot4ToFloat(lo) << " (12-bit), " << U10Dot6ToFloat(lo) << " (10-bit)";
4201  break;
4202  case 15: oss << "Key input offset: " << S13Dot2ToFloat(lo) << " (12-bit), " << S11Dot4ToFloat(lo) << " (10-bit)" << endl
4203  << "Key output offset: " << U12Dot4ToFloat(hi) << " (12-bit), " << U10Dot6ToFloat(hi) << " (10-bit)";
4204  break;
4205  default: break;
4206  }
4207  return oss.str();
4208  }
4209  } mEnhCSCOffsetDecoder;
4210 
4211  struct DecodeEnhancedCSCKeyMode : public Decoder
4212  {
4213  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4214  {
4215  (void) inRegNum;
4216  (void) inDeviceID;
4217  static const string sSrcSel[] = {"Key Input", "Video Y Input"};
4218  static const string sRange[] = {"Full Range", "SMPTE Range"};
4219  const uint32_t keySrcSelect (inRegValue & 0x1);
4220  const uint32_t keyOutRange ((inRegValue >> 4) & 0x1);
4221  ostringstream oss;
4222  oss << "Key Source Select: " << sSrcSel[keySrcSelect] << endl
4223  << "Key Output Range: " << sRange[keyOutRange];
4224  return oss.str();
4225  }
4226  } mEnhCSCKeyModeDecoder;
4227 
4228  struct DecodeEnhancedCSCCoefficient : public Decoder
4229  {
4230  static string S2Dot15ToFloat (const uint32_t inCoefficient)
4231  {
4232  double result = (double((inCoefficient >> 15) & 0x3));
4233  result += double(inCoefficient & 0x7FFF) / 32768.0;
4234  if (inCoefficient & BIT(17))
4235  result = -result;
4236  ostringstream oss; oss << fDEC(result,12,10); string resultStr(oss.str());
4237  return aja::replace(resultStr, sSpace, sNull);
4238  }
4239  static string S12Dot12ToFloat (const uint32_t inCoefficient)
4240  {
4241  double result(double((inCoefficient >> 12) & 0xFFF));
4242  result += double(inCoefficient & 0xFFF) / 4096.0;
4243  if (inCoefficient & BIT(24))
4244  result = -result;
4245  ostringstream oss; oss << fDEC(result,12,6); string resultStr(oss.str());
4246  return aja::replace(resultStr, sSpace, sNull);
4247  }
4248  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4249  {
4250  (void) inDeviceID;
4251  uint32_t regNum (inRegNum & 0x1F);
4252  ostringstream oss;
4253  if (regNum > 2 && regNum < 12)
4254  {
4255  regNum -= 3;
4256  static const string sCoeffNames[] = {"A0", "A1", "A2", "B0", "B1", "B2", "C0", "C1", "C2"};
4257  const uint32_t coeff ((inRegValue >> 9) & 0x0003FFFF);
4258  oss << sCoeffNames[regNum] << " coefficient: " << S2Dot15ToFloat(coeff) << " (" << xHEX0N(coeff,8) << ")";
4259  }
4260  else if (regNum == 16)
4261  {
4262  const uint32_t gain ((inRegValue >> 4) & 0x01FFFFFF);
4263  oss << "Key gain: " << S12Dot12ToFloat(gain) << " (" << HEX0N(gain,8) << ")";
4264  }
4265  return oss.str();
4266  }
4267  } mEnhCSCCoeffDecoder;
4268 
4269  struct DecodeCSCoeff1234 : public Decoder
4270  {
4271  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4272  {
4273  (void) inDeviceID;
4274  const uint32_t coeff1 (((inRegValue >> 11) & 0x00000003) | uint32_t(inRegValue & 0x000007FF));
4275  const uint32_t coeff2 ((inRegValue >> 14) & 0x00001FFF);
4276  uint16_t nCoeff1(1), nCoeff2(2);
4277  switch(inRegNum)
4278  {
4281  nCoeff1 = 3; nCoeff2 = 4; break;
4282  }
4283  // kRegCS?Coefficients1_2 kRegCS?Coefficients3_4
4284  // CSC 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
4285  // RegNum 142 147 291 296 347 460 465 470 143 148 292 297 348 461 466 471
4286  // kRegCS?Coefficients1_2: kK2RegMaskVidKeySyncStatus = BIT(28) 0=OK 1=SyncFail GetColorSpaceVideoKeySyncFail
4287  // kRegCS?Coefficients1_2: kK2RegMaskMakeAlphaFromKeySelect = BIT(29) 0=No 1=Yes GetColorSpaceMakeAlphaFromKey
4288  // kRegCS?Coefficients1_2: kK2RegMaskColorSpaceMatrixSelect = BIT(30) 0=Rec709 1=Rec601 GetColorSpaceMatrixSelect
4289  // kRegCS?Coefficients1_2: kK2RegMaskUseCustomCoefSelect = BIT(31) 0=No 1=Yes GetColorSpaceUseCustomCoefficient
4290  // kRegCS?Coefficients3_4: kK2RegMaskXena2RGBRange = BIT(31) 0=Full 1=SMPTE GetColorSpaceRGBBlackRange
4291  // kK2RegMaskCustomCoefficientLow = BITS(0-10) CSCCustomCoeffs.Coefficient1 GetColorSpaceCustomCoefficients
4292  // kK2RegMaskCustomCoefficientHigh = BITS(16-26) CSCCustomCoeffs.Coefficient2 GetColorSpaceCustomCoefficients
4293  // kK2RegMaskCustomCoefficient12BitLow = BITS(0-12) CSCCustomCoeffs.Coefficient1 GetColorSpaceCustomCoefficients12Bit
4294  // kK2RegMaskCustomCoefficient12BitHigh= BITS(14-26) CSCCustomCoeffs.Coefficient2 GetColorSpaceCustomCoefficients12Bit
4295  ostringstream oss;
4296  if (nCoeff1 == 1)
4297  oss << "Video Key Sync Status: " << (inRegValue & BIT(28) ? "SyncFail" : "OK") << endl
4298  << "Make Alpha From Key Input: " << EnabDisab(inRegValue & BIT(29)) << endl
4299  << "Matrix Select: " << (inRegValue & BIT(30) ? "Rec601" : "Rec709") << endl
4300  << "Use Custom Coeffs: " << YesNo(inRegValue & BIT(31)) << endl;
4301  else
4302  oss << "RGB Range: " << (inRegValue & BIT(31) ? "SMPTE (0x040-0x3C0)" : "Full (0x000-0x3FF)") << endl;
4303  oss << "Coefficient" << DEC(nCoeff1) << ": " << xHEX0N(coeff1, 4) << endl
4304  << "Coefficient" << DEC(nCoeff2) << ": " << xHEX0N(coeff2, 4);
4305  return oss.str();
4306  }
4307  } mCSCoeff1234Decoder;
4308 
4309  struct DecodeCSCoeff567890 : public Decoder
4310  {
4311  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4312  {
4313  (void) inDeviceID;
4314  const uint32_t coeff5 (((inRegValue >> 11) & 0x00000003) | uint32_t(inRegValue & 0x000007FF));
4315  const uint32_t coeff6 ((inRegValue >> 14) & 0x00001FFF);
4316  uint16_t nCoeff5(5), nCoeff6(6);
4317  switch(inRegNum)
4318  {
4321  nCoeff5 = 7; nCoeff6 = 8; break;
4324  nCoeff5 = 9; nCoeff6 = 10; break;
4325  }
4326  // kRegCS?Coefficients5_6 kRegCS?Coefficients7_8 kRegCS?Coefficients9_10
4327  // 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
4328  // 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
4329  // kK2RegMaskCustomCoefficientLow = BITS(0-10) CSCCustomCoeffs.Coefficient5 GetColorSpaceCustomCoefficients
4330  // kK2RegMaskCustomCoefficientHigh = BITS(16-26) CSCCustomCoeffs.Coefficient6 GetColorSpaceCustomCoefficients
4331  // kK2RegMaskCustomCoefficient12BitLow = BITS(0-12) CSCCustomCoeffs.Coefficient5 GetColorSpaceCustomCoefficients12Bit
4332  // kK2RegMaskCustomCoefficient12BitHigh= BITS(14-26) CSCCustomCoeffs.Coefficient6 GetColorSpaceCustomCoefficients12Bit
4333  ostringstream oss;
4334  oss << "Coefficient" << DEC(nCoeff5) << ": " << xHEX0N(coeff5, 4) << endl
4335  << "Coefficient" << DEC(nCoeff6) << ": " << xHEX0N(coeff6, 4);
4336  return oss.str();
4337  }
4338  } mCSCoeff567890Decoder;
4339 
4340  struct DecodeLUTV1ControlReg : public Decoder // kRegCh1ColorCorrectionControl (68), kRegCh2ColorCorrectionControl (69)
4341  {
4342  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4343  { static const string sModes[] = {"Off", "RGB", "YCbCr", "3-Way", "Invalid"};
4344  const ULWord lutVersion (::NTV2DeviceGetLUTVersion(inDeviceID));
4345  const UWord saturation (UWord(inRegValue & kRegMaskSaturationValue));
4346  const UWord mode (UWord((inRegValue & kRegMaskCCMode) >> kRegShiftCCMode));
4347  const bool outBankSelect (((inRegValue & kRegMaskCCOutputBankSelect) >> kRegShiftCCOutputBankSelect) ? true : false);
4348  const bool cc5HostBank (((inRegValue & kRegMaskCC5HostAccessBankSelect) >> kRegShiftCC5HostAccessBankSelect) ? true : false);
4349  const bool cc5OutputBank (((inRegValue & kRegMaskCC5OutputBankSelect) >> kRegShiftCC5OutputBankSelect) ? true : false);
4350  const bool cc5Select (((inRegValue & kRegMaskLUT5Select) >> kRegShiftLUT5Select) ? true : false);
4351  const bool ccConfig2 (((inRegValue & kRegMaskLUTSelect) >> kRegShiftLUTSelect) ? true : false);
4352  const bool cc3BankSel (((inRegValue & kRegMaskCC3OutputBankSelect) >> kRegShiftCC3OutputBankSelect) ? true : false);
4353  const bool cc4BankSel (((inRegValue & kRegMaskCC4OutputBankSelect) >> kRegShiftCC4OutputBankSelect) ? true : false);
4354  NTV2_ASSERT(mode < 4);
4355  ostringstream oss;
4356  if (lutVersion != 1)
4357  oss << "(Register data relevant for V1 LUT, this device has V" << DEC(lutVersion) << " LUT)";
4358  else
4359  {
4360  oss << "LUT Saturation Value: " << xHEX0N(saturation,4) << " (" << DEC(saturation) << ")" << endl
4361  << "LUT Output Bank Select: " << SetNotset(outBankSelect) << endl
4362  << "LUT Mode: " << sModes[mode] << " (" << DEC(mode) << ")";
4363  if (inRegNum == kRegCh1ColorCorrectionControl)
4364  oss << endl
4365  << "LUT5 Host Bank Select: " << SetNotset(cc5HostBank) << endl
4366  << "LUT5 Output Bank Select: " << SetNotset(cc5OutputBank) << endl
4367  << "LUT5 Select: " << SetNotset(cc5Select) << endl
4368  << "Config 2nd LUT Set: " << YesNo(ccConfig2);
4369  }
4370  oss << endl
4371  << "LUT3 Bank Select: " << SetNotset(cc3BankSel) << endl
4372  << "LUT4 Bank Select: " << SetNotset(cc4BankSel);
4373  return oss.str();
4374  }
4375  } mLUTV1ControlRegDecoder;
4376 
4377  struct DecodeLUTV2ControlReg : public Decoder // kRegLUTV2Control 376
4378  {
4379  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4380  { (void) inRegNum;
4381  const ULWord lutVersion (::NTV2DeviceGetLUTVersion(inDeviceID));
4382  ostringstream oss;
4383  if (lutVersion != 2)
4384  oss << "(Register data relevant for V2 LUT, this device has V" << DEC(lutVersion) << "LUT)";
4385  else
4386  {
4387  for (UWord lutNum(0); lutNum < 8; lutNum++)
4388  oss << "LUT" << DEC(lutNum+1) << " Enabled: " << (YesNo(inRegValue & (1<<lutNum))) << endl
4389  << "LUT" << DEC(lutNum+1) << " Host Access Bank Select: " << (inRegValue & (1<<(lutNum+8)) ? '1' : '0') << endl
4390  << "LUT" << DEC(lutNum+1) << " Output Bank Select: " << (inRegValue & (1<<(lutNum+16)) ? '1' : '0') << endl;
4391  oss << "12-Bit LUT mode: " << ((inRegValue & BIT(28)) ? "12-bit" : "10-bit") << endl
4392  << "12-Bit LUT page reg: " << DEC(UWord((inRegValue & (BIT(24)|BIT(25))) >> 24));
4393  }
4394  return oss.str();
4395  }
4396  } mLUTV2ControlRegDecoder;
4397 
4398  struct DecodeLUT : public Decoder
4399  {
4400  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4401  {
4402  (void) inDeviceID;
4404  const bool isRed(inRegNum >= RedReg && inRegNum < GreenReg), isGreen(inRegNum >= GreenReg && inRegNum < BlueReg), isBlue(inRegNum>=BlueReg);
4405  NTV2_ASSERT(isRed||isGreen||isBlue);
4406  ostringstream oss;
4407  // Within each 32-bit LUT word are stored two 10-bit values:
4408  // - bits <31:22> ==> LUT[2i+1]
4409  // - bits <15:6> ==> LUT[2i]
4410  const string label(isRed ? "Red[" : (isGreen ? "Green[" : "Blue["));
4411  const ULWord ndx((inRegNum - (isRed ? RedReg : (isGreen ? GreenReg : BlueReg))) * 2);
4412  const ULWord lo((inRegValue >> kRegColorCorrectionLUTEvenShift) & 0x000003FF);
4413  const ULWord hi((inRegValue >> kRegColorCorrectionLUTOddShift) & 0x000003FF);
4414  oss << label << DEC0N(ndx+0,3) << "]: " << DEC0N(lo,3) << endl
4415  << label << DEC0N(ndx+1,3) << "]: " << DEC0N(hi,3);
4416  return oss.str();
4417  }
4418  } mLUTDecoder;
4419 
4420  struct DecodeSDIErrorStatus : public Decoder
4421  {
4422  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4423  {
4424  (void) inRegNum;
4425  (void) inDeviceID;
4426  ostringstream oss;
4427  if (::NTV2DeviceCanDoSDIErrorChecks(inDeviceID))
4428  oss << "Unlock Tally: " << DEC(inRegValue & 0x7FFF) << endl
4429  << "Locked: " << YesNo(inRegValue & BIT(16)) << endl
4430  << "Link A VPID Valid: " << YesNo(inRegValue & BIT(20)) << endl
4431  << "Link B VPID Valid: " << YesNo(inRegValue & BIT(21)) << endl
4432  << "TRS Error Detected: " << YesNo(inRegValue & BIT(24));
4433  return oss.str();
4434  }
4435  } mSDIErrorStatusRegDecoder;
4436 
4437  struct DecodeSDIErrorCount : public Decoder
4438  {
4439  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4440  {
4441  (void) inRegNum;
4442  (void) inDeviceID;
4443  ostringstream oss;
4444  if (::NTV2DeviceCanDoSDIErrorChecks(inDeviceID))
4445  oss << "Link A: " << DEC(inRegValue & 0x0000FFFF) << endl
4446  << "Link B: " << DEC((inRegValue & 0xFFFF0000) >> 16);
4447  return oss.str();
4448  }
4449  } mSDIErrorCountRegDecoder;
4450 
4451  struct DecodeDriverVersion : public Decoder
4452  {
4453  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4454  { (void) inDeviceID;
4455  NTV2_ASSERT(inRegNum == kVRegDriverVersion);
4456  ULWord vMaj(NTV2DriverVersionDecode_Major(inRegValue)), vMin(NTV2DriverVersionDecode_Minor(inRegValue));
4457  ULWord vDot(NTV2DriverVersionDecode_Point(inRegValue)), vBld(NTV2DriverVersionDecode_Build(inRegValue));
4458  ULWord buildType((inRegValue >> 30) & 0x00000003);
4459  static const string sBuildTypes[] = { "Release", "Beta", "Alpha", "Development"};
4460  static const string sBldTypes[] = { "", "b", "a", "d"};
4461  ostringstream oss;
4462  oss << "Driver Version: " << DEC(vMaj) << "." << DEC(vMin) << "." << DEC(vDot);
4463  if (buildType) oss << sBldTypes[buildType] << DEC(vBld);
4464  oss << endl
4465  << "Major Version: " << DEC(vMaj) << endl
4466  << "Minor Version: " << DEC(vMin) << endl
4467  << "Point Version: " << DEC(vDot) << endl
4468  << "Build Type: " << sBuildTypes[buildType] << endl
4469  << "Build Number: " << DEC(vBld);
4470  return oss.str();
4471  }
4472  } mDriverVersionDecoder;
4473 
4474  struct DecodeFourCC : public Decoder
4475  {
4476  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4477  { (void) inDeviceID; (void) inRegNum;
4478  char ch; string str4cc;
4479  ch = char((inRegValue & 0xFF000000) >> 24);
4480  str4cc += ::isprint(ch) ? ch : '?';
4481  ch = char((inRegValue & 0x00FF0000) >> 16);
4482  str4cc += ::isprint(ch) ? ch : '?';
4483  ch = char((inRegValue & 0x0000FF00) >> 8);
4484  str4cc += ::isprint(ch) ? ch : '?';
4485  ch = char((inRegValue & 0x000000FF) >> 0);
4486  str4cc += ::isprint(ch) ? ch : '?';
4487 
4488  ostringstream oss;
4489  oss << "'" << str4cc << "'";
4490  return oss.str();
4491  }
4492  } mDecodeFourCC;
4493 
4494  struct DecodeDriverType : public Decoder
4495  {
4496  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4497  { (void) inDeviceID; (void) inRegNum;
4498  ostringstream oss;
4499  #if defined(AJAMac)
4500  if (inRegValue == 0x44455854) // 'DEXT'
4501  oss << "DriverKit ('DEXT')";
4502  else if (inRegValue)
4503  oss << "(Unknown/Invalid " << xHEX0N(inRegValue,8) << ")";
4504  else
4505  oss << "Kernel Extension ('KEXT')";
4506  #else
4507  (void) inRegValue;
4508  oss << "(Normal)";
4509  #endif
4510  return oss.str();
4511  }
4512  } mDecodeDriverType;
4513  struct DecodeVDevReady : public Decoder
4514  {
4515  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4516  { (void) inDeviceID; (void) inRegNum;
4517  ostringstream oss;
4518  if (inRegValue)
4519  { string s (CNTV2RegisterExpert::GetDisplayName (inRegValue));
4520  oss << "VDev will set ";
4521  if (s.empty())
4522  oss << "register " << DEC(inRegValue);
4523  else
4524  oss << s;
4525  oss << " when 'IsReady'";
4526  }
4527  return oss.str();
4528  }
4529  } mDecodeVDevReady;
4530 
4531  struct DecodeIDSwitchStatus : public Decoder
4532  {
4533  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4534  { (void) inRegNum;
4535  ostringstream oss;
4536  if (::NTV2DeviceCanDoIDSwitch(inDeviceID))
4537  {
4538  const uint32_t switchEnableBits (((inRegValue & 0x0F000000) >> 20) | ((inRegValue & 0xF0000000) >> 28));
4539  for (UWord idSwitch(0); idSwitch < 4; )
4540  {
4541  const uint32_t switchEnabled (switchEnableBits & BIT(idSwitch));
4542  oss << "Switch " << DEC(++idSwitch) << ": " << (switchEnabled ? "Enabled" : "Disabled");
4543  if (idSwitch < 4)
4544  oss << endl;
4545  }
4546  }
4547  else
4548  {
4549  oss << "(ID Switch not supported)";
4550  }
4551 
4552  return oss.str();
4553  }
4554  } mDecodeIDSwitchStatus;
4555 
4556  struct DecodePWMFanControl : public Decoder
4557  {
4558  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4559  { (void) inRegNum;
4560  ostringstream oss;
4561  if (::NTV2DeviceHasPWMFanControl(inDeviceID))
4562  oss << "Fan Speed: " << DEC(inRegValue & kRegMaskPWMFanSpeed) << endl
4563  << "Fan Control Enabled: " << ((inRegValue & kRegMaskPWMFanSpeedControl) ? "Enabled" : "Disabled");
4564  return oss.str();
4565  }
4566  } mDecodePWMFanControl;
4567 
4568  struct DecodePWMFanMonitor : public Decoder
4569  {
4570  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4571  { (void) inRegNum;
4572  ostringstream oss;
4573  if (::NTV2DeviceHasPWMFanControl(inDeviceID))
4574  oss << "Tach Period: " << DEC(inRegValue & kRegMaskPWMFanTachPeriodStatus) << endl
4575  << "Fan Status: " << ((inRegValue & kRegMaskPWMFanStatus) ? "Stopped" : "Running");
4576  return oss.str();
4577  }
4578  } mDecodePWMFanMonitor;
4579 
4580  struct DecodeBOBStatus : public Decoder
4581  {
4582  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4583  { (void) inRegNum;
4584  ostringstream oss;
4585  if (::NTV2DeviceCanDoBreakoutBoard(inDeviceID))
4586  oss << "Break Out Board: " << ((inRegValue & kRegMaskBOBAbsent) ? "Disconnected" : "Connected") << endl
4587  << "ADAV801 Initialization: " << ((inRegValue & kRegMaskBOBADAV801UpdateStatus) ? "Complete" : "In Progress") << endl
4588  << "ADAV801 DIR Locked(Debug): " << DEC(inRegValue & kRegMaskBOBADAV801DIRLocked);
4589  else
4590  oss << "Device does not support a breakout board";
4591  return oss.str();
4592  }
4593  } mDecodeBOBStatus;
4594 
4595  struct DecodeBOBGPIIn : public Decoder
4596  {
4597  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4598  { (void) inRegNum;
4599  ostringstream oss;
4600  if (::NTV2DeviceCanDoBreakoutBoard(inDeviceID))
4601  oss << "GPI In 1: " << DEC(inRegValue & kRegMaskBOBGPIIn1Data) << endl
4602  << "GPI In 2: " << DEC(inRegValue & kRegMaskBOBGPIIn2Data) << endl
4603  << "GPI In 3: " << DEC(inRegValue & kRegMaskBOBGPIIn3Data) << endl
4604  << "GPI In 4: " << DEC(inRegValue & kRegMaskBOBGPIIn4Data) ;
4605  else
4606  oss << "Device does not support a breakout board";
4607  return oss.str();
4608  }
4609  } mDecodeBOBGPIIn;
4610 
4611  struct DecodeBOBGPIInInterruptControl : public Decoder
4612  {
4613  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4614  { (void) inRegNum;
4615  ostringstream oss;
4616  if (::NTV2DeviceCanDoBreakoutBoard(inDeviceID))
4617  oss << "GPI In 1 Int: " << DEC(inRegValue & kRegMaskBOBGPIIn1InterruptControl) << endl
4618  << "GPI In 2 Int: " << DEC(inRegValue & kRegMaskBOBGPIIn2InterruptControl) << endl
4619  << "GPI In 3 Int: " << DEC(inRegValue & kRegMaskBOBGPIIn3InterruptControl) << endl
4620  << "GPI In 4 Int: " << DEC(inRegValue & kRegMaskBOBGPIIn4InterruptControl) ;
4621  else
4622  oss << "Device does not support a breakout board";
4623  return oss.str();
4624  }
4625  } mDecodeBOBGPIInInterruptControl;
4626 
4627  struct DecodeBOBGPIOut : public Decoder
4628  {
4629  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4630  { (void) inRegNum;
4631  ostringstream oss;
4632  if (::NTV2DeviceCanDoBreakoutBoard(inDeviceID))
4633  oss << "GPI Out 1 Int: " << DEC(inRegValue & kRegMaskBOBGPIOut1Data) << endl
4634  << "GPI Out 2 Int: " << DEC(inRegValue & kRegMaskBOBGPIOut2Data) << endl
4635  << "GPI Out 3 Int: " << DEC(inRegValue & kRegMaskBOBGPIOut3Data) << endl
4636  << "GPI Out 4 Int: " << DEC(inRegValue & kRegMaskBOBGPIOut4Data) ;
4637  else
4638  oss << "Device does not support a breakout board";
4639  return oss.str();
4640  }
4641  } mDecodeBOBGPIOut;
4642 
4643  struct DecodeBOBAudioControl : public Decoder
4644  {
4645  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4646  { (void) inRegNum;
4647  ostringstream oss;
4648  if (::NTV2DeviceCanDoBreakoutBoard(inDeviceID))
4649  {
4650  string dBuLabel;
4651  switch(inRegValue & kRegMaskBOBAnalogLevelControl)
4652  {
4653  case 0:
4654  dBuLabel = "+24dBu";
4655  break;
4656  case 1:
4657  dBuLabel = "+18dBu";
4658  break;
4659  case 2:
4660  dBuLabel = "+12dBu";
4661  break;
4662  case 3:
4663  dBuLabel = "+15dBu";
4664  break;
4665 
4666  }
4667  oss << "ADC/DAC Re-init: " << DEC(inRegValue & kRegMaskBOBADAV801Reset) << endl
4668  << "Analog Level Control: " << dBuLabel << endl
4669  << "Analog Select: " << DEC(inRegValue & kRegMaskBOBAnalogInputSelect);
4670  }
4671  else
4672  oss << "Device does not support a breakout board";
4673  return oss.str();
4674  }
4675  } mDecodeBOBAudioControl;
4676 
4677  struct DecodeLEDControl : public Decoder
4678  {
4679  virtual string operator()(const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID) const
4680  { (void) inRegNum;
4681  ostringstream oss;
4682  if (::NTV2DeviceHasBracketLED(inDeviceID))
4683  oss << "Blue: " << DEC(inRegValue & kRegMaskLEDBlueControl) << endl
4684  << "Green: " << DEC(inRegValue & kRegMaskLEDGreenControl) << endl
4685  << "Red: " << DEC(inRegValue & kRegMaskLEDRedControl);
4686  else
4687  oss << "Device does not support a breakout board";
4688  return oss.str();
4689  }
4690  } mDecodeLEDControl;
4691 
4692  static const int NOREADWRITE = 0;
4693  static const int READONLY = 1;
4694  static const int WRITEONLY = 2;
4695  static const int READWRITE = 3;
4696 
4697  static const int CONTAINS = 0;
4698  static const int STARTSWITH = 1;
4699  static const int ENDSWITH = 2;
4700  static const int EXACTMATCH = 3;
4701 
4702  typedef map <uint32_t, const Decoder *> RegNumToDecoderMap;
4703  typedef pair <uint32_t, const Decoder *> RegNumToDecoderPair;
4704  typedef multimap <string, uint32_t> RegClassToRegNumMMap, StringToRegNumMMap;
4705  typedef pair <string, uint32_t> StringToRegNumPair;
4706  typedef RegClassToRegNumMMap::const_iterator RegClassToRegNumConstIter;
4707  typedef StringToRegNumMMap::const_iterator StringToRegNumConstIter;
4708 
4709  typedef pair <uint32_t, uint32_t> XptRegNumAndMaskIndex; // First: register number; second: mask index (0=0x000000FF, 1=0x0000FF00, 2=0x00FF0000, 3=0xFF000000)
4710  typedef map <NTV2InputCrosspointID, XptRegNumAndMaskIndex> InputXpt2XptRegNumMaskIndexMap;
4711  typedef map <XptRegNumAndMaskIndex, NTV2InputCrosspointID> XptRegNumMaskIndex2InputXptMap;
4712  typedef InputXpt2XptRegNumMaskIndexMap::const_iterator InputXpt2XptRegNumMaskIndexMapConstIter;
4713  typedef XptRegNumMaskIndex2InputXptMap::const_iterator XptRegNumMaskIndex2InputXptMapConstIter;
4714 
4715 private: // INSTANCE DATA
4716  mutable AJALock mGuardMutex;
4717  RegNumToStringMap mRegNumToStringMap;
4718  RegNumToDecoderMap mRegNumToDecoderMap;
4719  RegClassToRegNumMMap mRegClassToRegNumMMap;
4720  StringToRegNumMMap mStringToRegNumMMap;
4721  mutable NTV2StringSet mAllRegClasses; // Mutable -- caches results from 'const' method GetAllRegisterClasses
4722  InputXpt2XptRegNumMaskIndexMap mInputXpt2XptRegNumMaskIndexMap;
4723  XptRegNumMaskIndex2InputXptMap mXptRegNumMaskIndex2InputXptMap;
4724 
4725 }; // RegisterExpert
4726 
4727 
4728 static RegisterExpertPtr gpRegExpert; // Points to Register Expert Singleton
4730 
4731 
4732 RegisterExpertPtr RegisterExpert::GetInstance(const bool inCreateIfNecessary)
4733 {
4735  if (!gpRegExpert && inCreateIfNecessary)
4737  return gpRegExpert;
4738 }
4739 
4741 {
4743  if (!gpRegExpert)
4744  return false;
4746  return true;
4747 }
4748 
4750 {
4753  return pInst ? true : false;
4754 }
4755 
4757 {
4760  return pInst ? true : false;
4761 }
4762 
4764 {
4767  return pInst ? pInst->DisposeInstance() : false;
4768 }
4769 
4770 string CNTV2RegisterExpert::GetDisplayName (const uint32_t inRegNum)
4771 {
4774  if (pRegExpert)
4775  return pRegExpert->RegNameToString(inRegNum);
4776 
4777  ostringstream oss; oss << "Reg ";
4778  if (inRegNum <= kRegNumRegisters)
4779  oss << DEC(inRegNum);
4780  else if (inRegNum <= 0x0000FFFF)
4781  oss << xHEX0N(inRegNum,4);
4782  else
4783  oss << xHEX0N(inRegNum,8);
4784  return oss.str();
4785 }
4786 
4787 string CNTV2RegisterExpert::GetDisplayValue (const uint32_t inRegNum, const uint32_t inRegValue, const NTV2DeviceID inDeviceID)
4788 {
4791  return pRegExpert ? pRegExpert->RegValueToString(inRegNum, inRegValue, inDeviceID) : string();
4792 }
4793 
4794 bool CNTV2RegisterExpert::IsRegisterInClass (const uint32_t inRegNum, const string & inClassName)
4795 {
4798  return pRegExpert ? pRegExpert->IsRegInClass(inRegNum, inClassName) : false;
4799 }
4800 
4802 {
4805  return pRegExpert ? pRegExpert->GetAllRegisterClasses() : NTV2StringSet();
4806 }
4807 
4808 NTV2StringSet CNTV2RegisterExpert::GetRegisterClasses (const uint32_t inRegNum, const bool inRemovePrefix)
4809 {
4812  return pRegExpert ? pRegExpert->GetRegisterClasses(inRegNum, inRemovePrefix) : NTV2StringSet();
4813 }
4814 
4816 {
4819  return pRegExpert ? pRegExpert->GetRegistersForClass(inClassName) : NTV2RegNumSet();
4820 }
4821 
4823 {
4826  return NTV2_IS_VALID_CHANNEL(inChannel) ? (pRegExpert ? pRegExpert->GetRegistersForClass(gChlClasses[inChannel]):NTV2RegNumSet()) : NTV2RegNumSet();
4827 }
4828 
4829 NTV2RegNumSet CNTV2RegisterExpert::GetRegistersForDevice (const NTV2DeviceID inDeviceID, const int inOtherRegsToInclude)
4830 {
4833  return pRegExpert ? pRegExpert->GetRegistersForDevice(inDeviceID, inOtherRegsToInclude) : NTV2RegNumSet();
4834 }
4835 
4836 NTV2RegNumSet CNTV2RegisterExpert::GetRegistersWithName (const string & inName, const int inSearchStyle)
4837 {
4840  return pRegExpert ? pRegExpert->GetRegistersWithName(inName, inSearchStyle) : NTV2RegNumSet();
4841 }
4842 
4843 NTV2InputCrosspointID CNTV2RegisterExpert::GetInputCrosspointID (const uint32_t inXptRegNum, const uint32_t inMaskIndex)
4844 {
4847  return pRegExpert ? pRegExpert->GetInputCrosspointID(inXptRegNum, inMaskIndex) : NTV2_INPUT_CROSSPOINT_INVALID;
4848 }
4849 
4850 bool CNTV2RegisterExpert::GetCrosspointSelectGroupRegisterInfo (const NTV2InputCrosspointID inInputXpt, uint32_t & outXptRegNum, uint32_t & outMaskIndex)
4851 {
4854  return pRegExpert ? pRegExpert->GetXptRegNumAndMaskIndex(inInputXpt, outXptRegNum, outMaskIndex) : false;
4855 }
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:7316
std::string NTV2AudioSystemToString(const NTV2AudioSystem inValue, const bool inCompactDisplay=false)
Definition: ntv2utils.cpp:5745
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:3895
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:578
#define kRegColorCorrectionLUTEvenShift
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:3135
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:6605
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:3136
#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:223
NTV2Channel
These enum values are mostly used to identify a specific widget_framestore. They&#39;re also commonly use...
Definition: ntv2enums.h:1357
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:476
#define SetNotset(__x__)
bool NTV2DeviceSoftwareCanChangeFrameBufferSize(const NTV2DeviceID inDeviceID)
NTV2FrameBufferFormat NTV2PixelFormat
An alias for NTV2FrameBufferFormat.
Definition: ntv2enums.h:260
#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:412
std::string NTV2StandardToString(const NTV2Standard inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:6910
std::string NTV2InputCrosspointIDToString(const NTV2InputCrosspointID inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:5814
#define true
std::string NTV2AudioChannelQuadToString(const NTV2Audio4ChannelSelect inValue, const bool inCompactDisplay=false)
Definition: ntv2utils.cpp:6443
NTV2Standard
Identifies a particular video standard.
Definition: ntv2enums.h:165
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)
NTV2ReferenceSource
These enum values identify a specific source for the device&#39;s (output) reference clock.
Definition: ntv2enums.h:1454
static uint32_t gInstanceTally(0)
static const string gChlClasses[]
UWord NTV2DeviceGetNumFrameStores(const NTV2DeviceID inDeviceID)
#define AJA_NULL
Definition: ajatypes.h:167
static NTV2StringSet GetAllRegisterClasses(void)
#define kRegClass_XptROM
NTV2StringSet::const_iterator NTV2StringSetConstIter
Definition: ntv2utils.h:1159
#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:3133
#define NTV2_IS_VALID_InputCrosspointID(__s__)
Definition: ntv2enums.h:2900
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:3131
std::vector< std::string > NTV2StringList
Definition: ntv2utils.h:1155
static const ULWord sMasks[]
#define kRegClass_Routing
NTV2UpConvertMode
Definition: ntv2enums.h:2219
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:2242
std::string NTV2IsoConvertModeToString(const NTV2IsoConvertMode inValue, const bool inCompactDisplay=false)
Definition: ntv2utils.cpp:6630
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:6431
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:6591
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:1371
#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:2754
bool NTV2DeviceCanDoIDSwitch(const NTV2DeviceID inDeviceID)
#define kRegClass_DMA
bool NTV2DeviceCanDoSDIErrorChecks(const NTV2DeviceID inDeviceID)
const char * NTV2RegisterNameString(const ULWord inRegNum)
Definition: ntv2debug.cpp:1166
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:348
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:2873
NTV2OutputCrosspointID
Identifies a widget output, a signal source, that potentially can drive another widget&#39;s input (ident...
Definition: ntv2enums.h:2527
NTV2IsoConvertMode
Definition: ntv2enums.h:2253
NTV2InputCrosspointID
Identifies a widget input that potentially can accept a signal emitted from another widget&#39;s output (...
Definition: ntv2enums.h:2752
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:132
Declares the CNTV2Bitfile class.
See Io X3.
Definition: ntv2enums.h:43
NTV2WidgetID
Definition: ntv2enums.h:2909
New in SDK 16.0.
Definition: ntv2enums.h:2795
uint16_t UWord
Definition: ajatypes.h:221
#define NTV2DriverVersionDecode_Build(__vers__)
std::string NTV2RegisterWriteModeToString(const NTV2RegisterWriteMode inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:7449
std::string NTV2ReferenceSourceToString(const NTV2ReferenceSource inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:7420
#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:6936
NTV2RegisterWriteMode
These values are used to determine when certain register writes actually take effect. See CNTV2Card::SetRegisterWriteMode or Field/Frame Interrupts.
Definition: ntv2enums.h:1679
#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:5957
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:3271
#define ThruDeviceOrBypassed(__x__)
#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:3134
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:7346
#define kIncludeOtherRegs_VRegs
std::set< std::string > NTV2StringSet
Definition: ntv2utils.h:1158
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