AJA NTV2 SDK  18.1.0.2439
NTV2 SDK 18.1.0.2439
ntv2macdriverinterface.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
9 #include "ntv2nubaccess.h"
10 #include "ntv2utils.h"
11 #include <time.h>
12 #include <syslog.h>
13 #include <iostream>
14 #include <sstream>
15 #include <string>
16 #include <map>
17 #include <iomanip>
18 #include "ntv2devicefeatures.h"
19 #include "ajabase/system/lock.h"
20 #include "ajabase/system/debug.h"
21 #include "ajabase/system/atomic.h"
23 
24 #if !defined (NTV2_NULL_DEVICE)
25  extern "C"
26  {
27  #include <mach/mach.h>
28  }
29 #endif // !defined (NTV2_NULL_DEVICE)
30 
31 using namespace std;
32 
33 
34 static const char * GetKernErrStr (const kern_return_t inError);
37 static const string sNTV2PCIKEXTClassName ("com_aja_iokit_ntv2"); // AJA NTV2 KEXT's IOService class name
38 static const string sNTV2PCIDEXTName ("AJANTV2"); // AJA NTV2 DEXT's IOService name
39 
40 
41 // MacDriverInterface-specific Logging Macros
42 
43 #define HEX2(__x__) xHEX0N(0xFF & uint8_t (__x__),2)
44 #define HEX4(__x__) xHEX0N(0xFFFF & uint16_t(__x__),4)
45 #define HEX8(__x__) xHEX0N(0xFFFFFFFF & uint32_t(__x__),8)
46 #define HEX16(__x__) xHEX0N(uint64_t(__x__),16)
47 #define KR(_kr_) "kernResult=" << HEX8(_kr_) << "(" << GetKernErrStr(_kr_) << ")"
48 #define INSTP(_p_) HEX0N(uint64_t(_p_),16)
49 
50 #define DIFAIL(__x__) AJA_sERROR (AJA_DebugUnit_DriverInterface, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
51 #define DIWARN(__x__) AJA_sWARNING(AJA_DebugUnit_DriverInterface, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
52 #define DINOTE(__x__) AJA_sNOTICE (AJA_DebugUnit_DriverInterface, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
53 #define DIINFO(__x__) AJA_sINFO (AJA_DebugUnit_DriverInterface, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
54 #define DIDBG(__x__) AJA_sDEBUG (AJA_DebugUnit_DriverInterface, INSTP(this) << "::" << AJAFUNC << ": " << __x__)
55 
56 #define MDIFAIL(__x__) AJA_sERROR (AJA_DebugUnit_DriverInterface, AJAFUNC << ": " << __x__)
57 #define MDIWARN(__x__) AJA_sWARNING(AJA_DebugUnit_DriverInterface, AJAFUNC << ": " << __x__)
58 #define MDINOTE(__x__) AJA_sNOTICE (AJA_DebugUnit_DriverInterface, AJAFUNC << ": " << __x__)
59 #define MDIINFO(__x__) AJA_sINFO (AJA_DebugUnit_DriverInterface, AJAFUNC << ": " << __x__)
60 #define MDIDBG(__x__) AJA_sDEBUG (AJA_DebugUnit_DriverInterface, AJAFUNC << ": " << __x__)
61 
62 
63 #if !defined (NTV2_NULL_DEVICE)
64  // This section builds 'libajantv2.a' with the normal linkage to the IOKit...
65  #define OS_IOMasterPort(_x_,_y_) ::IOMasterPort ((_x_), (_y_))
66  #define OS_IOServiceOpen(_w_,_x_,_y_,_z_) ::IOServiceOpen((_w_), (_x_), (_y_), (_z_))
67  #define OS_IOServiceClose(_x_) ::IOServiceClose ((_x_))
68  #define OS_IOServiceMatching(_x_) ::IOServiceMatching ((_x_))
69  #define OS_IOServiceNameMatching(_x_) ::IOServiceNameMatching((_x_))
70  #define OS_IOServiceGetMatchingServices(_x_,_y_,_z_) ::IOServiceGetMatchingServices ((_x_), (_y_), (_z_))
71  #define OS_IOIteratorNext(_x_) ::IOIteratorNext ((_x_))
72  #define OS_IOObjectRelease(_x_) ::IOObjectRelease ((_x_))
73  #define OS_IORegistryEntryCreateCFProperty(_w_,_x_,_y_,_z_) ::IORegistryEntryCreateCFProperty ((_w_), (_x_), (_y_), (_z_))
74  #define OS_IOConnectCallMethod(_q_,_r_,_s_,_t_,_u_,_v_,_w_,_x_,_y_,_z_) ::IOConnectCallMethod ((_q_), (_r_), (_s_), (_t_), (_u_), (_v_), (_w_), (_x_), (_y_), (_z_))
75  #define OS_IOConnectCallScalarMethod(_u_,_v_,_w_,_x_,_y_,_z_) ::IOConnectCallScalarMethod ((_u_), (_v_), (_w_), (_x_), (_y_), (_z_))
76  #define OS_IOConnectCallStructMethod(_u_,_v_,_w_,_x_,_y_,_z_) ::IOConnectCallStructMethod ((_u_), (_v_), (_w_), (_x_), (_y_), (_z_))
77  #define OS_IOConnectMapMemory(_u_,_v_,_w_,_x_,_y_,_z_) ::IOConnectMapMemory ((_u_), (_v_), (_w_), (_x_), (_y_), (_z_))
78  #define OS_IOKitGetBusyState(_x_,_y_) ::IOKitGetBusyState ((_x_), (_y_))
79  #define OS_IOKitWaitQuiet(_x_,_y_) ::IOKitWaitQuiet ((_x_), (_y_))
80 #else // NTV2_NULL_DEVICE defined
81  // STUB FUNCTIONS TO REPLACE IOKIT CALLS
82  // Eliminates all linkage to IOKit.
83  static IOReturn OS_IOMasterPort (const mach_port_t inPort, mach_port_t * pOutPort)
84  { (void)inPort;
85  MDIWARN("NTV2_NULL_DEVICE -- will not connect to IOKit");
86  if (pOutPort)
87  *pOutPort = 1;
88  return KERN_SUCCESS;
89  }
90  static kern_return_t OS_IOServiceOpen (const io_service_t inSvc, const task_port_t inTask, const uint32_t inType, io_connect_t * pOutConn)
91  { (void)inSvc; (void)inTask; (void)inType;
92  if (pOutConn) *pOutConn = 0;
93  return KERN_SUCCESS;
94  }
95  static IOReturn OS_IOServiceClose (const io_connect_t inConnection)
96  { (void)inConnection;
97  return KERN_SUCCESS;
98  }
99  static CFMutableDictionaryRef OS_IOServiceMatching (const char * pInName)
100  { (void)pInName;
101  return AJA_NULL;
102  }
103  static IOReturn OS_IOServiceGetMatchingServices (const mach_port_t inPort, const CFDictionaryRef inMatch, io_iterator_t * pOutIter)
104  { (void)inPort; (void)inMatch;
105  if (pOutIter)
106  *pOutIter = 0;
107  return KERN_SUCCESS;
108  }
109  static io_object_t OS_IOIteratorNext (io_iterator_t inIter)
110  { (void)inIter;
111  return 0;
112  }
113  static IOReturn OS_IOObjectRelease (io_object_t inObj)
114  { (void)inObj;
115  return KERN_SUCCESS;
116  }
117  static CFTypeRef OS_IORegistryEntryCreateCFProperty (const io_registry_entry_t inEntry, const CFStringRef inKey, const CFAllocatorRef inAllocator, const IOOptionBits inOptions)
118  { (void)inEntry; (void)inKey; (void)inAllocator; (void)inOptions;
119  return AJA_NULL;
120  }
121  static IOReturn OS_IOConnectCallScalarMethod (const mach_port_t inConnect, const uint32_t inSelector, const uint64_t * pInput, const uint32_t inCount, uint64_t * pOutput, uint32_t * pOutCount)
122  { (void)inConnect; (void)inSelector; (void)pInput; (void)inCount;
123  if (pOutput) *pOutput = 0;
124  if (pOutCount) *pOutCount = 0;
125  return KERN_SUCCESS;
126  }
127  static kern_return_t OS_IOConnectCallMethod (const mach_port_t inConnect, const uint32_t inSelector, const uint64_t * pInput, uint32_t inputCnt, const void * pInStruct, const size_t inStructCnt, uint64_t * pOutput, uint32_t * pOutputCnt, void * pOutStruct, size_t * pOutStructCnt)
128  { (void)inConnect; (void)inSelector; (void)pInput; (void)inputCnt; (void)pInStruct; (void)inStructCnt; (void)pOutput; (void)pOutputCnt; (void)pOutStruct; (void)pOutStructCnt;
129  return KERN_SUCCESS;
130  }
131  static IOReturn OS_IOKitGetBusyState (const mach_port_t inPort, uint32_t * pOutState)
132  { (void)inPort;
133  if (pOutState)
134  *pOutState = 0;
135  return KERN_SUCCESS;
136  }
137  static IOReturn OS_IOKitWaitQuiet (const mach_port_t inPort, const mach_timespec_t * pInOutWait)
138  { (void)inPort; (void)pInOutWait;
139  return KERN_SUCCESS;
140  }
141  static IOReturn OS_IOConnectCallStructMethod (const io_connect_t inPort, const uint32_t inSelector, const void *inputStruct, size_t inputStructCnt, void *pOutStruct, size_t *pOutStructCnt)
142  { (void)inPort; (void)inSelector; (void)inputStruct; (void)inputStructCnt; (void)pOutStruct; (void)pOutStructCnt;
143  return KERN_SUCCESS;
144  }
145  static kern_return_t OS_IOConnectMapMemory (const io_connect_t inPort, const uint32_t inMemType, const task_port_t inTask, mach_vm_address_t * pAddr, mach_vm_size_t * pOutSize, const IOOptionBits inOpts)
146  { (void)inPort; (void)inMemType; (void)inTask; (void)pAddr; (void)pOutSize; (void)inOpts;
147  return KERN_SUCCESS;
148  }
149 #endif // NTV2_NULL_DEVICE defined
150 
151 //--------------------------------------------------------------------------------------------------------------------
152 // CNTV2MacDriverInterface
153 //
154 // Constructor
155 //--------------------------------------------------------------------------------------------------------------------
157 {
158  mIsDEXT = false;
159  mConnection = 0;
160 }
161 
162 
163 //--------------------------------------------------------------------------------------------------------------------
164 // ~CNTV2MacDriverInterface
165 //--------------------------------------------------------------------------------------------------------------------
167 {
168  if (IsOpen())
169  Close();
170 }
171 
172 #if !defined(NTV2_NULL_DEVICE)
173  //--------------------------------------------------------------------------------------------------------------------
174  // Open
175  //--------------------------------------------------------------------------------------------------------------------
177  {
178  // Make a new connection...
179  io_iterator_t ioIterator (0);
180  IOReturn error (kIOReturnSuccess);
181  io_object_t ioObject (0);
182  #if defined(NTV2_MACOS_SANDBOX)
183  static const string kSvcNames[] = {sNTV2PCIDEXTName, ""}; // DEXT only, no KEXT
184  static const size_t kNumSvcNames = 1;
185  #else
186  static const string kSvcNames[] = {sNTV2PCIDEXTName, sNTV2PCIKEXTClassName, ""}; // Try DEXT first, then KEXT
187  static const size_t kNumSvcNames = 2;
188  #endif
189 
190  for (size_t svcNdx(0); svcNdx < kNumSvcNames && !mConnection; svcNdx++)
191  {
192  const string & svcName (kSvcNames[svcNdx]);
193  const char * pSvcName(svcName.c_str());
194  #if !defined(NTV2_MACOS_SANDBOX)
195  const bool tryKEXT (svcName.find("com_aja_iokit") != string::npos);
196  #endif
197 
198  // Create an iterator to search for our driver instances...
199  error = OS_IOServiceGetMatchingServices (kIOMasterPortDefault,
200  #if defined(NTV2_MACOS_SANDBOX)
201  OS_IOServiceNameMatching(pSvcName),
202  #else
203  tryKEXT ? OS_IOServiceMatching(pSvcName) : OS_IOServiceNameMatching(pSvcName),
204  #endif
205  &ioIterator);
206  if (error != kIOReturnSuccess)
207  {DIWARN(KR(error) << ": No '" << svcName << "' driver"); continue;}
208 
209  // Find nth device -- and only use that one...
210  for (UWord ndx(inDeviceIndex); (ioObject = OS_IOIteratorNext(ioIterator)); OS_IOObjectRelease(ioObject))
211  if (ndx == 0)
212  break; // Found a match!
213  else
214  --ndx;
215 
216  if (ioIterator)
217  OS_IOObjectRelease(ioIterator);
218  if (!ioObject)
219  {
220  if (!inDeviceIndex) // Warn only if requesting first device, to show "no devices"
221  DIWARN("No '" << svcName << "' devices");
222  continue; // No service object
223  }
224 
225  // Found the device we want -- open it...
226  error = OS_IOServiceOpen (ioObject, ::mach_task_self(), 0, &mConnection);
227  OS_IOObjectRelease(ioObject);
228  if (error != kIOReturnSuccess)
229  {DIWARN(KR(error) << ": IOServiceOpen failed for '" << svcName << "' ndx=" << inDeviceIndex); continue;}
230 
231  #if defined(NTV2_MACOS_SANDBOX)
232  mIsDEXT = true;
233  #else
234  mIsDEXT = !tryKEXT;
235  #endif
236  } // for each in kServiceNames
237 
238  _boardOpened = mConnection != 0;
239  if (IsOpen())
240  DIDBG((mIsDEXT ? "DEXT" : "KEXT") << " ndx=" << inDeviceIndex << " conn=" << HEX8(GetIOConnect()) << " opened");
241  else
242  {DIFAIL(INSTP(this) << ": No connection: ndx=" << inDeviceIndex); return false;}
243 
244  setDeviceIndexNumber (inDeviceIndex);
246  {
247  DIFAIL("ReadRegister(kRegBoardID) failed: ndx=" << inDeviceIndex << " con=" << HEX8(GetIOConnect()) << " boardID=" << HEX8(_boardID));
248  Close();
249  return false;
250  }
251 
252  // Good to go...
253  DIDBG("Opened ndx=" << GetIndexNumber() << " con=" << HEX8(GetIOConnect()) << " id=" << ::NTV2DeviceIDToString(_boardID));
254  return true;
255 
256  } // OpenLocalPhysical
257 
258 
260  {
261  NTV2_ASSERT(!IsRemote());
262  DIDBG("Closed " << (mIsDEXT ? "DEXT" : "KEXT") << " ndx=" << GetIndexNumber() << " con=" << HEX8(GetIOConnect()) << " id=" << ::NTV2DeviceIDToString(_boardID));
263  _boardOpened = false;
264 // leave as-is _boardNumber = 0;
265  if (mConnection)
266  OS_IOServiceClose(mConnection);
267  mConnection = 0;
268  mIsDEXT = false;
269  return true;
270 
271  } // CloseLocalPhysical
272 #endif // !defined(NTV2_NULL_DEVICE)
273 
274 
275 #if !defined(NTV2_DEPRECATE_16_0)
276  //--------------------------------------------------------------------------------------------------------------------
277  // GetPCISlotNumber
278  //
279  // Returns my PCI slot number, if known; otherwise returns zero.
280  //--------------------------------------------------------------------------------------------------------------------
282  {
283  // TBD: Determine where in the IORegistry the io_connect_t is, then navigate up to the io_registry_entry
284  // for our driver that contains the "AJAPCISlot" property. Then proceed as before...
285  return 0; // FINISH THIS
286  } // GetPCISlotNumber
287 
288  //--------------------------------------------------------------------------------------------------------------------
289  // MapFrameBuffers
290  //
291  // Return a pointer and size of either the register map or frame buffer memory.
292  //--------------------------------------------------------------------------------------------------------------------
294  {
295  UByte *baseAddr;
296  if (!MapMemory (kFrameBufferMemory, reinterpret_cast<void**>(&baseAddr)))
297  {
298  _pFrameBaseAddress = AJA_NULL;
299  _pCh1FrameBaseAddress = _pCh2FrameBaseAddress = AJA_NULL; // DEPRECATE!
300  return false;
301  }
302  _pFrameBaseAddress = reinterpret_cast<ULWord*>(baseAddr);
303  return true;
304  }
305 
307  {
308  _pFrameBaseAddress = AJA_NULL;
309  _pCh1FrameBaseAddress = _pCh2FrameBaseAddress = AJA_NULL; // DEPRECATE!
310  return true;
311  }
312 
313  //--------------------------------------------------------------------------------------------------------------------
314  // MapRegisters
315  //--------------------------------------------------------------------------------------------------------------------
317  {
318  ULWord *baseAddr;
319  if (!MapMemory (kRegisterMemory, reinterpret_cast<void**>(&baseAddr)))
320  {
321  _pRegisterBaseAddress = AJA_NULL;
322  return false;
323  }
324  _pRegisterBaseAddress = reinterpret_cast<ULWord*>(baseAddr);
325  return true;
326  }
327 
329  {
330  _pRegisterBaseAddress = AJA_NULL;
331  return true;
332  }
333 
334  //--------------------------------------------------------------------------------------------------------------------
335  // Map / Unmap Xena2Flash
336  //--------------------------------------------------------------------------------------------------------------------
338  {
339  ULWord *baseAddr;
340  if (!MapMemory (kXena2FlashMemory, reinterpret_cast<void**>(&baseAddr)))
341  {
342  _pXena2FlashBaseAddress = AJA_NULL;
343  return false;
344  }
345  _pXena2FlashBaseAddress = reinterpret_cast<ULWord*>(baseAddr);
346  return true;
347  }
348 
350  {
351  _pXena2FlashBaseAddress = AJA_NULL;
352  return true;
353  }
354 
355  //--------------------------------------------------------------------------------------------------------------------
356  // MapMemory
357  //--------------------------------------------------------------------------------------------------------------------
358  bool CNTV2MacDriverInterface::MapMemory (const MemoryType memType, void **memPtr)
359  {
360 #ifndef __LP64__
361  return false;
362 #endif
363  if (GetIOConnect())
364  {
365  mach_vm_size_t size(0);
366  OS_IOConnectMapMemory ( GetIOConnect(), memType, mach_task_self(),
367  reinterpret_cast<mach_vm_address_t*>(memPtr),
368  &size, kIOMapDefaultCache | kIOMapAnywhere);
369  return size > 0;
370  }
371  return false;
372  }
373 
374  //--------------------------------------------------------------------------------------------------------------------
375  // SystemControl
376  //--------------------------------------------------------------------------------------------------------------------
378  {
379  kern_return_t kernResult = KERN_FAILURE;
380  uint64_t scalarI_64[2] = {uint64_t(dataPtr), controlCode};
381  uint32_t outputCount = 0;
382  if (controlCode != SCC_Test)
383  kernResult = KERN_INVALID_ARGUMENT;
384  else if (GetIOConnect())
385  kernResult = OS_IOConnectCallScalarMethod ( GetIOConnect(), // an io_connect_t returned from IOServiceOpen().
386  kDriverSystemControl, // selector of the function to be called via the user client.
387  scalarI_64, // array of scalar (64-bit) input values.
388  2, // the number of scalar input values.
389  AJA_NULL, // array of scalar (64-bit) output values.
390  &outputCount); // pointer to the number of scalar output values.
391  if (kernResult == KERN_SUCCESS)
392  return true;
393  DIFAIL (KR(kernResult) << ", con=" << HEX8(GetIOConnect()));
394  return false;
395  }
396 #endif // !defined(NTV2_DEPRECATE_16_0)
397 
398 #pragma mark - New Driver Calls
399 
400 //--------------------------------------------------------------------------------------------------------------------
401 // ReadRegister
402 //
403 // Return the value of specified register after masking and shifting the value.
404 //--------------------------------------------------------------------------------------------------------------------
405 bool CNTV2MacDriverInterface::ReadRegister (const ULWord inRegNum, ULWord & outValue, const ULWord inMask, const ULWord inShift)
406 {
407  if (inShift >= 32)
408  {
409  DIFAIL("Shift " << DEC(inShift) << " > 31, reg=" << DEC(inRegNum) << " msk=" << xHEX0N(inMask,8));
410  return false;
411  }
412 #if defined (NTV2_NUB_CLIENT_SUPPORT)
413  if (IsRemote())
414  return CNTV2DriverInterface::ReadRegister(inRegNum, outValue, inMask, inShift);
415 #endif // defined (NTV2_NUB_CLIENT_SUPPORT)
416  kern_return_t kernResult(KERN_FAILURE);
417  uint64_t scalarI_64[3] = {inRegNum, inMask, inShift};
418  uint64_t scalarO_64 = outValue;
419  uint32_t outputCount = 1;
420  if (GetIOConnect())
421  {
423  kernResult = OS_IOConnectCallScalarMethod ( GetIOConnect(), // an io_connect_t returned from IOServiceOpen().
424  kDriverReadRegister, // selector of the function to be called via the user client.
425  scalarI_64, // array of scalar (64-bit) input values.
426  mIsDEXT ? 3 : 2, // the number of scalar input values.
427  &scalarO_64, // array of scalar (64-bit) output values.
428  &outputCount); // pointer to the number of scalar output values.
430  }
431  if (kernResult != KERN_SUCCESS)
432  {
433  DIFAIL(KR(kernResult) << ": ndx=" << GetIndexNumber() << ", con=" << HEX8(GetIOConnect())
434  << " -- reg=" << DEC(inRegNum) << ", mask=" << HEX8(inMask) << ", shift=" << HEX8(inShift));
435  return false;
436  }
437  outValue = uint32_t(scalarO_64);
438 #if defined(NTV2_PRETEND_DEVICE)
439  if (inRegNum == kRegBoardID && outValue == NTV2_PRETEND_DEVICE_FROM)
440  outValue = ULWord(NTV2_PRETEND_DEVICE_TO);
441 // else if (inRegNum == kRegReserved83 || inRegNum == kRegLPRJ45IP)
442 // outValue = 0x0A03FAD9; // Local IPv4 10.3.250.217
443 #endif // NTV2_PRETEND_DEVICE
444  return true;
445 }
446 
447 
448 //--------------------------------------------------------------------------------------------------------------------
449 // WriteRegister
450 //
451 // Set the specified register value taking into accout the bit mask.
452 // If the bit mask is not 0xFFFFFFFF (default) or 0, then this does a read-modify-write.
453 //--------------------------------------------------------------------------------------------------------------------
454 bool CNTV2MacDriverInterface::WriteRegister (const ULWord inRegNum, const ULWord inValue, const ULWord inMask, const ULWord inShift)
455 {
456  if (inShift >= 32)
457  {
458  DIFAIL("Shift " << DEC(inShift) << " > 31, reg=" << DEC(inRegNum) << " msk=" << xHEX0N(inMask,8));
459  return false;
460  }
461 #if defined(NTV2_WRITEREG_PROFILING) // Register Write Profiling
462  if (mRecordRegWrites)
463  {
464  AJAAutoLock autoLock(&mRegWritesLock);
465  mRegWrites.push_back(NTV2RegInfo(inRegNum, inValue, inMask, inShift));
466  if (mSkipRegWrites)
467  return true;
468  }
469 #endif // defined(NTV2_WRITEREG_PROFILING) // Register Write Profiling
470 #if defined(NTV2_NUB_CLIENT_SUPPORT)
471  if (IsRemote())
472  return CNTV2DriverInterface::WriteRegister(inRegNum, inValue, inMask, inShift);
473 #endif // defined (NTV2_NUB_CLIENT_SUPPORT)
474  kern_return_t kernResult(KERN_FAILURE);
475  uint64_t scalarI_64[4] = {inRegNum, inValue, inMask, inShift};
476  uint32_t outputCount = 0;
477  if (GetIOConnect())
478  {
480  kernResult = OS_IOConnectCallScalarMethod ( GetIOConnect(), // an io_connect_t returned from IOServiceOpen().
481  kDriverWriteRegister, // selector of the function to be called via the user client.
482  scalarI_64, // array of scalar (64-bit) input values.
483  mIsDEXT ? 4 : 3, // the number of scalar input values.
484  AJA_NULL, // array of scalar (64-bit) output values.
485  &outputCount); // pointer to the number of scalar output values.
487  }
488  if (kernResult == KERN_SUCCESS)
489  return true;
490  DIFAIL (KR(kernResult) << ": con=" << HEX8(GetIOConnect()) << " -- reg=" << inRegNum
491  << ", val=" << HEX8(inValue) << ", mask=" << HEX8(inMask) << ", shift=" << HEX8(inShift));
492  return false;
493 }
494 
495 
496 const uint32_t kAgentAppFcc (NTV2_FOURCC('A','j','a','A'));
497 //--------------------------------------------------------------------------------------------------------------------
498 // AcquireStreamForApplication
499 //
500 // Aquire board by by waiting for current board to release its resources
501 //
502 // Note: When quicktime is using the board, desktop output on the board is disabled
503 // by the driver.
504 //--------------------------------------------------------------------------------------------------------------------
506 {
507 #if defined(NTV2_NUB_CLIENT_SUPPORT)
508  if (IsRemote())
510 #endif // defined (NTV2_NUB_CLIENT_SUPPORT)
511  ULWord svcInitialized(0);
512  if (ReadRegister(kVRegServicesInitialized, svcInitialized))
513  if (!svcInitialized) // if services have never initialized the device
514  if (appType != kAgentAppFcc) // if not AJA Agent
515  DIWARN(::NTV2DeviceIDToString(GetDeviceID()) << "-" << DEC(GetIndexNumber())
516  << " uninitialized by AJAAgent, requesting app " << xHEX0N(appType,8) << ", pid=" << DEC(pid));
517 
518  kern_return_t kernResult = KERN_FAILURE;
519  uint64_t scalarI_64[2] = {uint64_t(appType), uint64_t(pid)};
520  uint32_t outputCount = 0;
521  if (GetIOConnect())
522  {
523  kernResult = OS_IOConnectCallScalarMethod ( GetIOConnect(), // an io_connect_t returned from IOServiceOpen().
524  kDriverAcquireStreamForApplication, // selector of the function to be called via the user client.
525  scalarI_64, // array of scalar (64-bit) input values.
526  2, // the number of scalar input values.
527  AJA_NULL, // array of scalar (64-bit) output values.
528  &outputCount); // pointer to the number of scalar output values.
529  }
530  if (kernResult == KERN_SUCCESS)
531  return true;
532  DIFAIL(KR(kernResult) << ": con=" << HEX8(GetIOConnect()));
533  return false;
534 }
535 
536 
537 //--------------------------------------------------------------------------------------------------------------------
538 // ReleaseStreamForApplication
539 //--------------------------------------------------------------------------------------------------------------------
541 {
542 #if defined(NTV2_NUB_CLIENT_SUPPORT)
543  if (IsRemote())
545 #endif // defined (NTV2_NUB_CLIENT_SUPPORT)
546  kern_return_t kernResult = KERN_FAILURE;
547  uint64_t scalarI_64[2] = {uint64_t(appType), uint64_t(pid)};
548  uint32_t outputCount = 0;
549  if (GetIOConnect())
550  {
551  kernResult = OS_IOConnectCallScalarMethod ( GetIOConnect(), // an io_connect_t returned from IOServiceOpen().
552  kDriverReleaseStreamForApplication, // selector of the function to be called via the user client.
553  scalarI_64, // array of scalar (64-bit) input values.
554  2, // the number of scalar input values.
555  AJA_NULL, // array of scalar (64-bit) output values.
556  &outputCount); // pointer to the number of scalar output values.
557  }
558  if (kernResult == KERN_SUCCESS)
559  return true;
560  DIFAIL (KR(kernResult) << ": con=" << HEX8(GetIOConnect()));
561  return false;
562 }
563 
564 
565 //--------------------------------------------------------------------------------------------------------------------
566 // AcquireStreamForApplicationWithReference
567 //
568 // Do a reference counted acquire
569 // Use this call ONLY with ReleaseStreamForApplicationWithReference
570 // Aquire board by by waiting for current board to release its resources
571 //
572 // Note: When quicktime is using the board, desktop output on the board is disabled
573 // by the driver.
574 //--------------------------------------------------------------------------------------------------------------------
576 {
577 #if defined(NTV2_NUB_CLIENT_SUPPORT)
578  if (IsRemote())
580 #endif // defined (NTV2_NUB_CLIENT_SUPPORT)
581  ULWord svcInitialized(0);
582  if (ReadRegister(kVRegServicesInitialized, svcInitialized))
583  if (!svcInitialized) // if services have never initialized the device
584  if (appType != kAgentAppFcc) // if not AJA Agent
585  DIWARN(::NTV2DeviceIDToString(GetDeviceID()) << "-" << DEC(GetIndexNumber())
586  << " uninitialized by AJAAgent, requesting app " << xHEX0N(appType,8) << ", pid=" << DEC(pid));
587 
588  kern_return_t kernResult = KERN_FAILURE;
589  uint64_t scalarI_64[2] = {uint64_t(appType), uint64_t(pid)};
590  uint32_t outputCount = 0;
591  if (GetIOConnect())
592  {
593  kernResult = OS_IOConnectCallScalarMethod ( GetIOConnect(), // an io_connect_t returned from IOServiceOpen().
594  kDriverAcquireStreamForApplicationWithReference, // selector of the function to be called via the user client.
595  scalarI_64, // array of scalar (64-bit) input values.
596  2, // the number of scalar input values.
597  AJA_NULL, // array of scalar (64-bit) output values.
598  &outputCount); // pointer to the number of scalar output values.
599  }
600  if (kernResult == KERN_SUCCESS)
601  return true;
602  DIFAIL (KR(kernResult) << ": con=" << HEX8(GetIOConnect()));
603  return false;
604 }
605 
606 
607 //--------------------------------------------------------------------------------------------------------------------
608 // ReleaseStreamForApplicationWithReference
609 //
610 // Do a reference counted release
611 // Use this call ONLY with AcquireStreamForApplicationWithReference
612 //--------------------------------------------------------------------------------------------------------------------
614 {
615 #if defined(NTV2_NUB_CLIENT_SUPPORT)
616  if (IsRemote())
618 #endif // defined (NTV2_NUB_CLIENT_SUPPORT)
619  kern_return_t kernResult = KERN_FAILURE;
620  uint64_t scalarI_64[2] = {uint64_t(appType), uint64_t(pid)};
621  uint32_t outputCount = 0;
622  if (GetIOConnect())
623  {
624  kernResult = OS_IOConnectCallScalarMethod ( GetIOConnect(), // an io_connect_t returned from IOServiceOpen().
625  kDriverReleaseStreamForApplicationWithReference, // selector of the function to be called via the user client.
626  scalarI_64, // array of scalar (64-bit) input values.
627  2, // the number of scalar input values.
628  AJA_NULL, // array of scalar (64-bit) output values.
629  &outputCount); // pointer to the number of scalar output values.
630  }
631  if (kernResult == KERN_SUCCESS)
632  return true;
633  DIFAIL (KR(kernResult) << ": con=" << HEX8(GetIOConnect()));
634  return false;
635 }
636 
637 
638 //--------------------------------------------------------------------------------------------------------------------
639 // Get/Set Streaming Application
640 //
641 // Forced aquisition of board for exclusive use by app
642 // Use with care - better to use AcquireStreamForApplication
643 //
644 // Note: When quicktime is using the board, desktop output on the board is disabled
645 // by the driver.
646 //--------------------------------------------------------------------------------------------------------------------
648 {
649 #if defined(NTV2_NUB_CLIENT_SUPPORT)
650  if (IsRemote())
651  return CNTV2DriverInterface::SetStreamingApplication (appType, pid);
652 #endif // defined (NTV2_NUB_CLIENT_SUPPORT)
653  kern_return_t kernResult = KERN_FAILURE;
654  uint64_t scalarI_64[2] = {uint64_t(appType), uint64_t(pid)};
655  uint32_t outputCount = 0;
656  if (GetIOConnect())
657  {
658  kernResult = OS_IOConnectCallScalarMethod ( GetIOConnect(), // an io_connect_t returned from IOServiceOpen().
659  kDriverSetStreamForApplication, // selector of the function to be called via the user client.
660  scalarI_64, // array of scalar (64-bit) input values.
661  2, // the number of scalar input values.
662  AJA_NULL, // array of scalar (64-bit) output values.
663  &outputCount); // pointer to the number of scalar output values.
664  }
665  if (kernResult == KERN_SUCCESS)
666  return true;
667  DIFAIL (KR(kernResult) << ": con=" << HEX8(GetIOConnect()));
668  return false;
669 }
670 
671 
672 //--------------------------------------------------------------------------------------------------------------------
673 // GetStreamingApplication
674 //--------------------------------------------------------------------------------------------------------------------
675 bool CNTV2MacDriverInterface::GetStreamingApplication (ULWord & outAppType, int32_t & outProcessID)
676 {
677 #if defined(NTV2_NUB_CLIENT_SUPPORT)
678  if (IsRemote())
679  return CNTV2DriverInterface::GetStreamingApplication (outAppType, outProcessID);
680 #endif // defined (NTV2_NUB_CLIENT_SUPPORT)
681  kern_return_t kernResult = KERN_FAILURE;
682  uint64_t scalarO_64[2] = {0, 0};
683  uint32_t outputCount(2);
684  if (GetIOConnect())
685  {
686  kernResult = OS_IOConnectCallScalarMethod ( GetIOConnect(), // an io_connect_t returned from IOServiceOpen().
687  kDriverGetStreamForApplication, // selector of the function to be called via the user client.
688  AJA_NULL, // array of scalar (64-bit) input values.
689  0, // the number of scalar input values.
690  scalarO_64, // array of scalar (64-bit) output values.
691  &outputCount); // pointer to the number of scalar output values.
692  }
693  outAppType = ULWord(scalarO_64[0]);
694  outProcessID = int32_t(scalarO_64[1]);
695  if (kernResult == KERN_SUCCESS)
696  return true;
697  DIFAIL (KR(kernResult) << ": con=" << HEX8(GetIOConnect()));
698  return false;
699 }
700 
701 
702 //--------------------------------------------------------------------------------------------------------------------
703 // KernelLog
704 //--------------------------------------------------------------------------------------------------------------------
705 bool CNTV2MacDriverInterface::KernelLog (void * dataPtr, UInt32 dataSize)
706 {
707  kern_return_t kernResult = KERN_FAILURE;
708  uint64_t scalarI_64[2] = {uint64_t(dataPtr), dataSize};
709  uint32_t outputCount = 0;
710  if (GetIOConnect())
711  kernResult = OS_IOConnectCallScalarMethod ( GetIOConnect(), // an io_connect_t returned from IOServiceOpen().
712  kDriverKernelLog, // selector of the function to be called via the user client.
713  scalarI_64, // array of scalar (64-bit) input values.
714  2, // the number of scalar input values.
715  AJA_NULL, // array of scalar (64-bit) output values.
716  &outputCount); // pointer to the number of scalar output values.
717  if (kernResult == KERN_SUCCESS)
718  return true;
719  DIFAIL (KR(kernResult) << ": con=" << HEX8(GetIOConnect()));
720  return false;
721 }
722 
723 
724 static const uint32_t sIntEnumToStatKeys[] = { AJA_DebugStat_WaitForInterruptOut1, // eOutput1 // 0
726  AJA_DebugStat_WaitForInterruptIn1, // eInput1 // 2
727  AJA_DebugStat_WaitForInterruptIn2, // eInput2 // 3
729  AJA_DebugStat_WaitForInterruptUartTx1, // eUart1Tx // 14
730  AJA_DebugStat_WaitForInterruptUartRx1, // eUart1Rx // 15
732  AJA_DebugStat_WaitForInterruptIn3, // eInput3 // 24
733  AJA_DebugStat_WaitForInterruptIn4, // eInput4 // 25
734  AJA_DebugStat_WaitForInterruptUartTx2, // eUartTx2 // 26
735  AJA_DebugStat_WaitForInterruptUartRx2, // eUartRx2 // 27
737  AJA_DebugStat_WaitForInterruptIn5, // eInput5 // 29
738  AJA_DebugStat_WaitForInterruptIn6, // eInput6 // 30
739  AJA_DebugStat_WaitForInterruptIn7, // eInput7 // 31
740  AJA_DebugStat_WaitForInterruptIn8, // eInput8 // 32
742 
743 //--------------------------------------------------------------------------------------------------------------------
744 // WaitForInterrupt
745 //
746 // Block the current thread until the specified interrupt occurs.
747 // Supply a timeout in milliseconds - if 0 (default), then never time out.
748 // Returns true if interrupt occurs, false if timeout.
749 //--------------------------------------------------------------------------------------------------------------------
751 {
752  if (!IsOpen())
753  {DIWARN("Cannot wait for '" << NTV2CfgInterrupt::IntName(type) << "' -- device not open"); return false;}
754  if (!NTV2_IS_VALID_INTERRUPT_ENUM(type))
755  {DIWARN("Cannot wait for '" << NTV2CfgInterrupt::IntName(type) << "' -- bad interrupt id"); return false;}
756 #if defined(NTV2_NUB_CLIENT_SUPPORT)
757  if (IsRemote())
758  return CNTV2DriverInterface::WaitForInterrupt(type, timeout);
759 #endif // defined(NTV2_NUB_CLIENT_SUPPORT)
760  if (type == eChangeEvent)
761  return WaitForChangeEvent(timeout);
762 
763  kern_return_t kernResult = KERN_FAILURE;
764  uint64_t scalarI_64[2] = {type, timeout};
765  uint64_t scalarO_64 = 0;
766  uint32_t outputCount = 1;
767 
768  if (!NTV2_IS_VALID_INTERRUPT_ENUM(type))
769  kernResult = KERN_INVALID_VALUE;
770  else if (GetIOConnect())
771  {
773  kernResult = OS_IOConnectCallScalarMethod ( GetIOConnect(), // an io_connect_t returned from IOServiceOpen().
774  kDriverWaitForInterrupt,// selector of the function to be called via the user client.
775  scalarI_64, // array of scalar (64-bit) input values.
776  2, // the number of scalar input values.
777  &scalarO_64, // array of scalar (64-bit) output values.
778  &outputCount); // pointer to the number of scalar output values.
780  }
781  UInt32 interruptOccurred = uint32_t(scalarO_64);
782  if (kernResult != KERN_SUCCESS)
783  {DIFAIL(KR(kernResult) << ": con=" << HEX8(GetIOConnect()) << " for '" << NTV2CfgInterrupt::IntName(type) << "'"); return false;}
784  if (interruptOccurred)
785  { BumpEventCount(type);
786  DIDBG("Interrupt '" << NTV2CfgInterrupt::IntName(type) << "' triggered, count=" << mEventCounts.at(type));
787  }
788  return interruptOccurred;
789 }
790 
791 //--------------------------------------------------------------------------------------------------------------------
792 // GetInterruptCount
793 //
794 // Returns the number of interrupts that have occured for the specified interrupt type.
795 //--------------------------------------------------------------------------------------------------------------------
797 {
798  if (!IsOpen())
799  {DIFAIL("Failed for '" << NTV2CfgInterrupt::IntName(eInterrupt) << "': device not open"); return false;}
800  if (!NTV2_IS_VALID_INTERRUPT_ENUM(eInterrupt))
801  {DIFAIL("Failed for '" << NTV2CfgInterrupt::IntName(eInterrupt) << "': bad interrupt ID"); return false;}
802 #if defined(NTV2_NUB_CLIENT_SUPPORT)
803  if (IsRemote())
804  return CNTV2DriverInterface::GetInterruptCount(eInterrupt, outCount);
805 #endif // defined(NTV2_NUB_CLIENT_SUPPORT)
806 
807  kern_return_t kernResult = KERN_FAILURE;
808  uint64_t scalarI_64[1] = {eInterrupt};
809  uint64_t scalarO_64 = 0;
810  uint32_t outputCount = 1;
811  if (GetIOConnect())
812  {
814  kernResult = OS_IOConnectCallScalarMethod ( GetIOConnect(), // an io_connect_t returned from IOServiceOpen().
815  kDriverGetInterruptCount, // selector of the function to be called via the user client.
816  scalarI_64, // array of scalar (64-bit) input values.
817  1, // the number of scalar input values.
818  &scalarO_64, // array of scalar (64-bit) output values.
819  &outputCount); // pointer to the number of scalar output values.
821  }
822  outCount = ULWord(scalarO_64);
823  if (kernResult == KERN_SUCCESS)
824  return true;
825  DIFAIL(KR(kernResult) << ": con=" << HEX8(GetIOConnect()));
826  return false;
827 }
828 
829 //--------------------------------------------------------------------------------------------------------------------
830 // WaitForChangeEvent
831 //
832 // Block the current thread until a register changes.
833 // Supply a timeout in milliseconds - if 0 (default), then never time out.
834 // Returns true if change occurs, false if timeout.
835 //--------------------------------------------------------------------------------------------------------------------
837 {
838  kern_return_t kernResult = KERN_FAILURE;
839  uint64_t scalarI_64[1] = {timeout};
840  uint64_t scalarO_64 = 0;
841  uint32_t outputCount = 1;
842  if (GetIOConnect())
843  kernResult = OS_IOConnectCallScalarMethod ( GetIOConnect(), // an io_connect_t returned from IOServiceOpen().
844  kDriverWaitForChangeEvent, // selector of the function to be called via the user client.
845  scalarI_64, // array of scalar (64-bit) input values.
846  1, // the number of scalar input values.
847  &scalarO_64, // array of scalar (64-bit) output values.
848  &outputCount); // pointer to the number of scalar output values.
849  if (kernResult != KERN_SUCCESS)
850  DIFAIL(KR(kernResult) << ": con=" << HEX8(GetIOConnect()));
851  return bool(scalarO_64);
852 }
853 
854 
855 //--------------------------------------------------------------------------------------------------------------------
856 // DmaTransfer
857 //
858 // Start a memory transfer using the specified DMA engine.
859 // Optional - call PrepareDMAMemory on the dataPtr before the first use of memory block
860 // for DMA and CompleteDMAMemory when done. This will speed up the DMA by not requiring
861 // memory to be prepared for each DMA. Otherwise, it takes about 2 to 5 ms (sometimes
862 // much more) for the memory block to be prepared.
863 // This function will sleep (block) until the DMA finishes.
864 //--------------------------------------------------------------------------------------------------------------------
866  const bool inIsRead,
867  const ULWord inFrameNumber,
868  ULWord * pFrameBuffer,
869  const ULWord inOffsetBytes,
870  const ULWord inByteCount,
871  const bool inSynchronous)
872 {
873  if (IsRemote())
874  return CNTV2DriverInterface::DmaTransfer(inDMAEngine, inIsRead, inFrameNumber, pFrameBuffer,
875  inOffsetBytes, inByteCount, inSynchronous);
876  if (!IsOpen())
877  return false;
878  kern_return_t kernResult = KERN_FAILURE;
879  uint64_t scalarI_64[6] = {inDMAEngine, uint64_t(pFrameBuffer), inFrameNumber, inOffsetBytes, inByteCount, !inIsRead};
880  uint32_t outputCount = 0;
881  if (GetIOConnect())
882  {
884  kernResult = OS_IOConnectCallScalarMethod ( GetIOConnect(), // an io_connect_t returned from IOServiceOpen().
885  kDriverDMATransfer, // selector of the function to be called via the user client.
886  scalarI_64, // array of scalar (64-bit) input values.
887  6, // the number of scalar input values.
888  AJA_NULL, // array of scalar (64-bit) output values.
889  &outputCount); // pointer to the number of scalar output values.
891  }
892  if (kernResult == KERN_SUCCESS)
893  return true;
894  DIFAIL(KR(kernResult) << ": con=" << HEX8(GetIOConnect()) << ", eng=" << inDMAEngine << ", frm=" << inFrameNumber
895  << ", off=" << HEX8(inOffsetBytes) << ", len=" << HEX8(inByteCount) << ", " << (inIsRead ? "R" : "W"));
896  return false;
897 }
898 
899 
900 //--------------------------------------------------------------------------------------------------------------------
901 // DmaTransfer
902 //
903 // Start a memory transfer using the specified DMA engine.
904 // Optional - call PrepareDMAMemory on the dataPtr before the first use of memory block
905 // for DMA and CompleteDMAMemory when done. This will speed up the DMA by not requiring
906 // memory to be prepared for each DMA. Otherwise, it takes about 2 to 5 ms (sometimes
907 // much more) for the memory block to be prepared.
908 // This function will sleep (block) until the DMA finishes.
909 //--------------------------------------------------------------------------------------------------------------------
911  const bool inIsRead,
912  const ULWord inFrameNumber,
913  ULWord * pFrameBuffer,
914  const ULWord inCardOffsetBytes,
915  const ULWord inByteCount,
916  const ULWord inNumSegments,
917  const ULWord inSegmentHostPitch,
918  const ULWord inSegmentCardPitch,
919  const bool inSynchronous)
920 {
921  if (IsRemote())
922  return CNTV2DriverInterface::DmaTransfer (inDMAEngine, inIsRead, inFrameNumber, pFrameBuffer, inCardOffsetBytes, inByteCount,
923  inNumSegments, inSegmentHostPitch, inSegmentCardPitch, inSynchronous);
924  if (!IsOpen())
925  return false;
926  kern_return_t kernResult = KERN_FAILURE;
927  size_t outputStructSize = 0;
928  const ULWord numSegments = inNumSegments ? inNumSegments : 1; // Prevent divide-by-zero exception: zero segment count == single segment
929 
930  DMA_TRANSFER_STRUCT_64 dmaTransfer64;
931  dmaTransfer64.dmaEngine = inDMAEngine;
932  dmaTransfer64.dmaFlags = 0;
933  dmaTransfer64.dmaHostBuffer = Pointer64(pFrameBuffer); // virtual address of host buffer
934  dmaTransfer64.dmaSize = inByteCount; // total number of bytes to DMA
935  dmaTransfer64.dmaCardFrameNumber = inFrameNumber; // card frame number
936  dmaTransfer64.dmaCardFrameOffset = inCardOffsetBytes; // offset (in bytes) into card frame to begin DMA
937  dmaTransfer64.dmaNumberOfSegments = numSegments; // number of segments of size videoBufferSize to DMA
938  dmaTransfer64.dmaSegmentSize = (inByteCount / numSegments); // size of each segment (if videoNumSegments > 1)
939  dmaTransfer64.dmaSegmentHostPitch = inSegmentHostPitch; // offset between the beginning of one host-memory segment and the next host-memory segment
940  dmaTransfer64.dmaSegmentCardPitch = inSegmentCardPitch; // offset between the beginning of one Kona-memory segment and the next Kona-memory segment
941  dmaTransfer64.dmaToCard = !inIsRead; // direction of DMA transfer
942 
943  if (GetIOConnect())
944  {
946  kernResult = OS_IOConnectCallStructMethod (GetIOConnect(), // an io_connect_t returned from IOServiceOpen().
947  kDriverDMATransferEx, // selector of the function to be called via the user client.
948  &dmaTransfer64, // pointer to the input structure
949  sizeof(DMA_TRANSFER_STRUCT_64), // size of input structure
950  AJA_NULL, // pointer to the output structure
951  &outputStructSize); // size of output structure
953  }
954  if (kernResult == KERN_SUCCESS)
955  return true;
956  DIFAIL (KR(kernResult) << ": con=" << HEX8(GetIOConnect()));
957  return false;
958 }
959 
960 
962  const NTV2Channel inDMAChannel,
963  const bool inIsTarget,
964  const ULWord inFrameNumber,
965  const ULWord inCardOffsetBytes,
966  const ULWord inByteCount,
967  const ULWord inNumSegments,
968  const ULWord inSegmentHostPitch,
969  const ULWord inSegmentCardPitch,
970  const PCHANNEL_P2P_STRUCT & inP2PData)
971 {
972  if (IsRemote())
973  return CNTV2DriverInterface::DmaTransfer (inDMAEngine, inDMAChannel, inIsTarget, inFrameNumber, inCardOffsetBytes, inByteCount,
974  inNumSegments, inSegmentHostPitch, inSegmentCardPitch, inP2PData);
975  return false;
976 }
977 
978 #if 0
979 //--------------------------------------------------------------------------------------------------------------------
980 // RestoreHardwareProcampRegisters
981 //--------------------------------------------------------------------------------------------------------------------
982 bool CNTV2MacDriverInterface::RestoreHardwareProcampRegisters (void)
983 {
984  kern_return_t kernResult = KERN_FAILURE;
985  uint32_t outputCount = 0;
986  if (GetIOConnect())
987  kernResult = OS_IOConnectCallScalarMethod ( GetIOConnect(), // an io_connect_t returned from IOServiceOpen().
988  kDriverRestoreProcAmpRegisters, // selector of the function to be called via the user client.
989  AJA_NULL, // array of scalar (64-bit) input values.
990  0, // the number of scalar input values.
991  AJA_NULL, // array of scalar (64-bit) output values.
992  &outputCount); // pointer to the number of scalar output values.
993  if (kernResult == KERN_SUCCESS)
994  return true;
995  DIFAIL (KR(kernResult) << ": con=" << HEX8(GetIOConnect()));
996  return false;
997 }
998 
999 #endif
1000 
1001 #if 0
1002 //--------------------------------------------------------------------------------------------------------------------
1003 // SystemStatus
1004 //--------------------------------------------------------------------------------------------------------------------
1005 bool CNTV2MacDriverInterface::SystemStatus ( void* dataPtr, SystemStatusCode statusCode)
1006 {
1007  kern_return_t kernResult = KERN_FAILURE;
1008  uint64_t scalarI_64[2] = {uint64_t(dataPtr), statusCode};
1009  uint32_t outputCount = 0;
1010  if (GetIOConnect())
1011  kernResult = OS_IOConnectCallScalarMethod ( GetIOConnect(), // an io_connect_t returned from IOServiceOpen().
1012  kDriverSystemStatus, // selector of the function to be called via the user client.
1013  scalarI_64, // array of scalar (64-bit) input values.
1014  2, // the number of scalar input values.
1015  AJA_NULL, // array of scalar (64-bit) output values.
1016  &outputCount); // pointer to the number of scalar output values.
1017  if (statusCode != SSC_GetFirmwareProgress)
1018  return false;
1019  if (kernResult == KERN_SUCCESS)
1020  return true;
1021  MDIFAIL (KR(kernResult) << INSTP(this) << ", con=" << HEX8(GetIOConnect()));
1022  return false;
1023 }
1024 #endif
1025 
1026 
1027 //--------------------------------------------------------------------------------------------------------------------
1028 // AutoCirculate
1029 //--------------------------------------------------------------------------------------------------------------------
1031 {
1032  bool success = true;
1033  if (IsRemote())
1034  return CNTV2DriverInterface::AutoCirculate(autoCircData);
1035 
1036  kern_return_t kernResult = KERN_FAILURE;
1037  io_connect_t conn(GetIOConnect());
1038  if (!conn)
1039  return false;
1040 
1041  switch (autoCircData.eCommand)
1042  {
1043  case eInitAutoCirc:
1044  case eStartAutoCirc:
1045  case eStopAutoCirc:
1046  case eAbortAutoCirc:
1047  case ePauseAutoCirc:
1048  case eFlushAutoCirculate:
1049  case ePrerollAutoCirculate:
1050  case eSetActiveFrame:
1051  case eStartAutoCircAtTime:
1052  {
1053  // Pass the autoCircData structure to the driver. The driver knows the implicit meanings of the
1054  // members of the structure based on the the command contained within it.
1055  size_t outputStructSize = 0;
1056  AUTOCIRCULATE_DATA_64 autoCircData64;
1057  CopyTo_AUTOCIRCULATE_DATA_64 (&autoCircData, &autoCircData64);
1058 
1060  kernResult = OS_IOConnectCallStructMethod ( conn, // an io_connect_t returned from IOServiceOpen().
1061  kDriverAutoCirculateControl, // selector of the function to be called via the user client.
1062  &autoCircData64, // pointer to the input structure
1063  sizeof(AUTOCIRCULATE_DATA_64), // size of input structure
1064  AJA_NULL, // pointer to the output structure
1065  &outputStructSize); // size of output structure
1067  break;
1068  } // eInit, eStart, eStop, eAbort, etc...
1069 #if 0
1070  case eGetAutoCirc:
1071  {
1072  uint64_t scalarI_64[1];
1073  uint32_t outputCount = 0;
1074  size_t outputStructSize = sizeof(AUTOCIRCULATE_STATUS_STRUCT);
1075  scalarI_64[0] = autoCircData.channelSpec;
1077  kernResult = OS_IOConnectCallMethod ( conn, // an io_connect_t returned from IOServiceOpen().
1078  kDriverAutoCirculateStatus, // selector of the function to be called via the user client.
1079  scalarI_64, // array of scalar (64-bit) input values.
1080  1, // the number of scalar input values.
1081  AJA_NULL, // pointer to the input structure
1082  0, // size of input structure
1083  AJA_NULL, // array of scalar (64-bit) output values.
1084  &outputCount, // the number of scalar output values.
1085  autoCircData.pvVal1, // pointer to the output structure
1086  &outputStructSize); // size of output structure
1088  break;
1089  } // eGetAutoCirc
1090 
1091  case eGetFrameStamp:
1092  case eGetFrameStampEx2:
1093  {
1094  // Make sure task structure does not get passed in with eGetFrameStamp call.
1095  if ( autoCircData.eCommand == eGetFrameStamp)
1096  autoCircData.pvVal2 = AJA_NULL;
1097 
1098  size_t outputStructSize = sizeof(AUTOCIRCULATE_DATA_64);
1099 
1100  // promote base data structure
1101  AUTOCIRCULATE_DATA_64 autoCircData64;
1102  CopyTo_AUTOCIRCULATE_DATA_64 (&autoCircData, &autoCircData64);
1103 
1105  kernResult = OS_IOConnectCallStructMethod ( conn, // an io_connect_t returned from IOServiceOpen().
1106  kDriverAutoCirculateFramestamp, // selector of the function to be called via the user client.
1107  &autoCircData64, // pointer to the input structure
1108  sizeof(AUTOCIRCULATE_DATA_64), // size of input structure
1109  &autoCircData64, // pointer to the output structure
1110  &outputStructSize); // size of output structure
1112  break;
1113  } // eGetFrameStamp, eGetFrameStampEx2
1114 
1118  {
1119  // Pass the autoCircData structure to the driver. The driver knows the implicit meanings of the
1120  // members of the structure based on the the command contained within it.
1121  // Make sure routing table and task structure does not get passed in with eTransferAutoCirculate call.
1122  if (autoCircData.eCommand == eTransferAutoCirculate)
1123  {
1124  autoCircData.pvVal3 = AJA_NULL;
1125  autoCircData.pvVal4 = AJA_NULL;
1126  }
1127 
1128  // Make sure task structure does not get passed in with eTransferAutoCirculateEx call.
1129  if (autoCircData.eCommand == eTransferAutoCirculateEx)
1130  autoCircData.pvVal4 = AJA_NULL;
1131 
1132  size_t outputStructSize = sizeof(AUTOCIRCULATE_TRANSFER_STATUS_STRUCT);
1133 
1134  // promote base data structure
1135  AUTOCIRCULATE_DATA_64 autoCircData64;
1136  CopyTo_AUTOCIRCULATE_DATA_64 (&autoCircData, &autoCircData64);
1137 
1138  // promote AUTOCIRCULATE_TRANSFER_STRUCT
1139  AUTOCIRCULATE_TRANSFER_STRUCT_64 autoCircTransfer64;
1140  CopyTo_AUTOCIRCULATE_TRANSFER_STRUCT_64 (reinterpret_cast<AUTOCIRCULATE_TRANSFER_STRUCT*>(autoCircData.pvVal1), &autoCircTransfer64);
1141  autoCircData64.pvVal1 = Pointer64(&autoCircTransfer64);
1142 
1143  AUTOCIRCULATE_TASK_STRUCT_64 autoCircTask64;
1144  if (autoCircData.pvVal4 != AJA_NULL)
1145  {
1146  CopyTo_AUTOCIRCULATE_TASK_STRUCT_64 (reinterpret_cast<AUTOCIRCULATE_TASK_STRUCT*>(autoCircData.pvVal4), &autoCircTask64);
1147  autoCircData64.pvVal4 = Pointer64(&autoCircTask64);
1148  }
1149 
1151  kernResult = OS_IOConnectCallStructMethod ( conn, // an io_connect_t returned from IOServiceOpen().
1152  kDriverAutoCirculateTransfer, // selector of the function to be called via the user client.
1153  &autoCircData64, // pointer to the input structure
1154  sizeof(AUTOCIRCULATE_DATA_64), // size of input structure
1155  autoCircData.pvVal2, // pointer to the output structure
1156  &outputStructSize); // size of output structure
1158  break;
1159  } // eTransferAutoCirculate, eTransferAutoCirculateEx, eTransferAutoCirculateEx2
1160 #endif
1161 
1162  default:
1163  //DisplayNTV2Error("Unsupported AC command type in AutoCirculate()\n");
1164  kernResult = KERN_INVALID_ARGUMENT;
1165  break;
1166  } // switch
1167 
1168  success = (kernResult == KERN_SUCCESS);
1169  if (kernResult != KERN_SUCCESS && kernResult != kIOReturnOffline)
1170  MDIFAIL (KR(kernResult) << INSTP(this) << ", con=" << HEX8(conn) << ", eCmd=" << autoCircData.eCommand);
1171  return success;
1172 } // AutoCirculate
1173 
1174 
1176 {
1177  if (!pInOutMessage)
1178  return false;
1179  if (!pInOutMessage->IsValid())
1180  return false;
1181  if (!pInOutMessage->GetSizeInBytes())
1182  return false;
1183  if (IsRemote())
1184  return CNTV2DriverInterface::NTV2Message (pInOutMessage);
1185 
1186  // Force fOperation = 0 in SDK 16.3, to allow RPCs from 16.3 or later clients to work on servers running 16.2 or earlier drivers:
1187  ULWord* pU32 = reinterpret_cast<ULWord*>(pInOutMessage); pU32[6] = 0;
1188 
1189  kern_return_t kernResult (KERN_FAILURE);
1190  io_connect_t connection (GetIOConnect ());
1191  uint64_t scalarI_64 [2] = {uint64_t(pInOutMessage), pInOutMessage->GetSizeInBytes()};
1192  uint32_t numScalarOutputs(0);
1193  if (connection)
1194  {
1196  kernResult = OS_IOConnectCallScalarMethod ( connection, // an io_connect_t returned from IOServiceOpen
1197  kDriverNTV2Message, // selector of the function to be called via the user client
1198  scalarI_64, // array of scalar (64-bit) input values
1199  2, // the number of scalar input values
1200  AJA_NULL, // array of scalar (64-bit) output values
1201  &numScalarOutputs); // pointer (in: number of scalar output values capable of receiving; out: actual number of scalar output values)
1203  }
1204  if (kernResult != KERN_SUCCESS && kernResult != kIOReturnOffline)
1205  MDIFAIL (KR(kernResult) << INSTP(this) << ", con=" << HEX8(connection) << endl << *pInOutMessage);
1206  return kernResult == KERN_SUCCESS;
1207 
1208 } // NTV2Message
1209 
1210 
1211 
1212 #pragma mark Old Driver Calls
1213 
1215 {
1216  return WriteRegister(kVRegGlobalAudioPlaybackMode,mode);
1217 }
1218 
1220 {
1222 }
1223 
1224 
1225 //-------------------------------------------------------------------------------------------------------
1226 // CopyTo_AUTOCIRCULATE_DATA_64
1227 //-------------------------------------------------------------------------------------------------------
1228 void CNTV2MacDriverInterface::CopyTo_AUTOCIRCULATE_DATA_64 (AUTOCIRCULATE_DATA *p, AUTOCIRCULATE_DATA_64 *p64)
1229 {
1230  // note that p is native structure, either 64 or 32 bit
1231  p64->eCommand = p->eCommand;
1232  p64->channelSpec = p->channelSpec;
1233 
1234  p64->lVal1 = p->lVal1;
1235  p64->lVal2 = p->lVal2;
1236  p64->lVal3 = p->lVal3;
1237  p64->lVal4 = p->lVal4;
1238  p64->lVal5 = p->lVal5;
1239  p64->lVal6 = p->lVal6;
1240 
1241  p64->bVal1 = p->bVal1;
1242  p64->bVal2 = p->bVal2;
1243  p64->bVal3 = p->bVal3;
1244  p64->bVal4 = p->bVal4;
1245  p64->bVal5 = p->bVal5;
1246  p64->bVal6 = p->bVal6;
1247  p64->bVal7 = p->bVal7;
1248  p64->bVal8 = p->bVal8;
1249 
1250  p64->pvVal1 = Pointer64(p->pvVal1); // native to 64 bit
1251  p64->pvVal2 = Pointer64(p->pvVal2); // native to 64 bit
1252  p64->pvVal3 = Pointer64(p->pvVal3); // native to 64 bit
1253  p64->pvVal4 = Pointer64(p->pvVal4); // native to 64 bit
1254 }
1255 
1256 
1257 //-------------------------------------------------------------------------------------------------------
1258 // CopyTo_AUTOCIRCULATE_DATA
1259 //-------------------------------------------------------------------------------------------------------
1260 void CNTV2MacDriverInterface::CopyTo_AUTOCIRCULATE_DATA (AUTOCIRCULATE_DATA_64 *p64, AUTOCIRCULATE_DATA *p)
1261 {
1262  // note that p is native structure, either 64 or 32 bit
1263  p->eCommand = p64->eCommand;
1264  p->channelSpec = p64->channelSpec;
1265 
1266  p->lVal1 = p64->lVal1;
1267  p->lVal2 = p64->lVal2;
1268  p->lVal3 = p64->lVal3;
1269  p->lVal4 = p64->lVal4;
1270  p->lVal5 = p64->lVal5;
1271  p->lVal6 = p64->lVal6;
1272 
1273  p->bVal1 = p64->bVal1;
1274  p->bVal2 = p64->bVal2;
1275  p->bVal3 = p64->bVal3;
1276  p->bVal4 = p64->bVal4;
1277  p->bVal5 = p64->bVal5;
1278  p->bVal6 = p64->bVal6;
1279  p->bVal7 = p64->bVal7;
1280  p->bVal8 = p64->bVal8;
1281 
1282  p->pvVal1 = reinterpret_cast<void*>(p64->pvVal1); // 64 bit to native
1283  p->pvVal2 = reinterpret_cast<void*>(p64->pvVal2); // 64 bit to native
1284  p->pvVal3 = reinterpret_cast<void*>(p64->pvVal3); // 64 bit to native
1285  p->pvVal4 = reinterpret_cast<void*>(p64->pvVal4); // 64 bit to native
1286 }
1287 
1288 
1289 //-------------------------------------------------------------------------------------------------------
1290 // CopyTo_AUTOCIRCULATE_TRANSFER_STRUCT_64
1291 //-------------------------------------------------------------------------------------------------------
1292 void CNTV2MacDriverInterface::CopyTo_AUTOCIRCULATE_TRANSFER_STRUCT_64 (AUTOCIRCULATE_TRANSFER_STRUCT *p, AUTOCIRCULATE_TRANSFER_STRUCT_64 *p64)
1293 {
1294  // note that p is native structure, either 64 or 32 bit
1295  p64->channelSpec = p->channelSpec;
1296  p64->videoBuffer = Pointer64(p->videoBuffer); // native to 64 bit
1297  p64->videoBufferSize = p->videoBufferSize;
1298  p64->videoDmaOffset = p->videoDmaOffset;
1299  p64->audioBuffer = Pointer64(p->audioBuffer); // native to 64 bit
1300  p64->audioBufferSize = p->audioBufferSize;
1304 
1305  p64->rp188.DBB = p->rp188.DBB;
1306  p64->rp188.Low = p->rp188.Low;
1307  p64->rp188.High = p->rp188.High;
1308 
1309  p64->desiredFrame = p->desiredFrame;
1310  p64->hUser = p->hUser;
1311  p64->transferFlags = p->transferFlags;
1315 
1319 
1320  p64->vidProcInfo.mode = p->vidProcInfo.mode;
1327 
1332 
1336 
1338 
1339 #if 0
1340  printf("----------------------\n");
1341  printf("sizeof = %d\n", (int)sizeof(AUTOCIRCULATE_TRANSFER_STRUCT_64));
1342 
1343  uint8_t * ptr = (uint8_t *)p64;
1344  for (int i = 0; i < (int)sizeof(AUTOCIRCULATE_TRANSFER_STRUCT_64); i++)
1345  {
1346  if ((i % 4) == 0)
1347  printf("\n");
1348  printf("%x ", *ptr++);
1349  }
1350  printf("\n\n", *ptr++);
1351 
1352 #endif
1353 
1354  #if 0
1355  printf("----------------------\n");
1356  printf("sizeof = %d\n", (int)sizeof(AUTOCIRCULATE_TRANSFER_STRUCT_64));
1357 
1358  // note that p is native structure, either 64 or 32 bit
1359  printf("channelSpec %x\n", p64->channelSpec);
1360  printf("videoBuffer %lx\n",p64->videoBuffer);
1361  printf("videoBufferSize %x\n",p64->videoBufferSize);
1362  printf("videoDmaOffset %x\n",p64->videoDmaOffset);
1363  printf("audioBuffer %lx\n",p64->audioBuffer);
1364  printf("audioBufferSize %x\n",p64->audioBufferSize);
1365  printf("audioStartSample %x\n",p64->audioStartSample);
1366  printf("audioNumChannels %x\n",p64->audioNumChannels);
1367  printf("frameRepeatCount %x\n",p64->frameRepeatCount);
1368 
1369  printf("rp188.DBB %x\n",p64->rp188.DBB);
1370  printf("rp188.Low %x\n",p64->rp188.Low);
1371  printf("rp188.High %x\n",p64->rp188.High);
1372 
1373  printf("desiredFrame %x\n",p64->desiredFrame);
1374  printf("hUser %x\n",p64->hUser);
1375  printf("transferFlags %x\n",p64->transferFlags);
1376  printf("bDisableExtraAudioInfo %x\n",p64->bDisableExtraAudioInfo);
1377  printf("frameBufferFormat %x\n",p64->frameBufferFormat);
1378  printf("frameBufferOrientation %x\n",p64->frameBufferOrientation);
1379 
1380  printf("colorCorrectionInfo.mode %x\n",p64->colorCorrectionInfo.mode);
1381  printf("colorCorrectionInfo.saturationValue %x\n",p64->colorCorrectionInfo.saturationValue);
1382  printf("colorCorrectionInfo.ccLookupTables %x\n",p64->colorCorrectionInfo.ccLookupTables);
1383 
1384  printf("vidProcInfo.mode %x\n",p64->vidProcInfo.mode);
1385  printf("vidProcInfo.foregroundVideoCrosspoint %x\n",p64->vidProcInfo.foregroundVideoCrosspoint);
1386  printf("vidProcInfo.backgroundVideoCrosspoint %x\n",p64->vidProcInfo.backgroundVideoCrosspoint);
1387  printf("vidProcInfo.foregroundKeyCrosspoint %x\n",p64->vidProcInfo.foregroundKeyCrosspoint);
1388  printf("vidProcInfo.backgroundKeyCrosspoint %x\n",p64->vidProcInfo.backgroundKeyCrosspoint);
1389  printf("vidProcInfo.transitionCoefficient %x\n",p64->vidProcInfo.transitionCoefficient);
1390  printf("vidProcInfo.transitionSoftness %x\n",p64->vidProcInfo.transitionSoftness);
1391 
1392  printf("customAncInfo.Group1 %x\n",p64->customAncInfo.Group1);
1393  printf("customAncInfo.Group2 %x\n",p64->customAncInfo.Group2);
1394  printf("customAncInfo.Group3 %x\n",p64->customAncInfo.Group3);
1395  printf("customAncInfo.Group4 %x\n",p64->customAncInfo.Group4);
1396 
1397  printf("videoNumSegments %x\n",p64->videoNumSegments);
1398  printf("videoSegmentHostPitch %x\n",p64->videoSegmentHostPitch);
1399  printf("videoSegmentCardPitch %x\n",p64->videoSegmentCardPitch);
1400 
1401  printf("videoQuarterSizeExpand %x\n",p64->videoQuarterSizeExpand);
1402  #endif
1403 }
1404 
1405 
1406 //-------------------------------------------------------------------------------------------------------
1407 // CopyTo_AUTOCIRCULATE_TRANSFER_STRUCT
1408 //-------------------------------------------------------------------------------------------------------
1409 void CNTV2MacDriverInterface::CopyTo_AUTOCIRCULATE_TRANSFER_STRUCT (AUTOCIRCULATE_TRANSFER_STRUCT_64 *p64, AUTOCIRCULATE_TRANSFER_STRUCT *p)
1410 {
1411  // note that p is native structure, either 64 or 32 bit
1412  p->channelSpec = p64->channelSpec;
1413  p->videoBuffer = reinterpret_cast<ULWord*>(p64->videoBuffer); // 64 bit to native
1414  p->videoBufferSize = p64->videoBufferSize;
1415  p->videoDmaOffset = p64->videoDmaOffset;
1416  p->audioBuffer = reinterpret_cast<ULWord*>(p64->audioBuffer); // 64 bit to native
1417  p->audioBufferSize = p64->audioBufferSize;
1421 
1422  p->rp188.DBB = p64->rp188.DBB;
1423  p->rp188.Low = p64->rp188.Low;
1424  p->rp188.High = p64->rp188.High;
1425 
1426  p->desiredFrame = p64->desiredFrame;
1427  p->hUser = p64->hUser;
1428  p->transferFlags = p64->transferFlags;
1432 
1436 
1437  p->vidProcInfo.mode = p64->vidProcInfo.mode;
1444 
1449 
1453 
1455 }
1456 
1457 
1458 //-------------------------------------------------------------------------------------------------------
1459 // CopyTo_AUTOCIRCULATE_TASK_STRUCT_64
1460 //-------------------------------------------------------------------------------------------------------
1461 void CNTV2MacDriverInterface::CopyTo_AUTOCIRCULATE_TASK_STRUCT_64 (AUTOCIRCULATE_TASK_STRUCT *p, AUTOCIRCULATE_TASK_STRUCT_64 *p64)
1462 {
1463  p64->taskVersion = p->taskVersion;
1464  p64->taskSize = p->taskSize;
1465  p64->numTasks = p->numTasks;
1466  p64->maxTasks = p->maxTasks;
1467  p64->taskArray = Pointer64(p->taskArray);
1468  p64->reserved0 = p->reserved0;
1469  p64->reserved1 = p->reserved1;
1470  p64->reserved2 = p->reserved2;
1471  p64->reserved3 = p->reserved3;
1472 }
1473 
1474 
1475 static const char * GetKernErrStr (const kern_return_t inError)
1476 {
1477  switch (inError)
1478  {
1479  case kIOReturnError: return "general error";
1480  case kIOReturnNoMemory: return "can't allocate memory";
1481  case kIOReturnNoResources: return "resource shortage";
1482  case kIOReturnIPCError: return "error during IPC";
1483  case kIOReturnNoDevice: return "no such device";
1484  case kIOReturnNotPrivileged: return "privilege violation";
1485  case kIOReturnBadArgument: return "invalid argument";
1486  case kIOReturnLockedRead: return "device read locked";
1487  case kIOReturnLockedWrite: return "device write locked";
1488  case kIOReturnExclusiveAccess: return "exclusive access and device already open";
1489  case kIOReturnBadMessageID: return "sent/received messages had different msg_id";
1490  case kIOReturnUnsupported: return "unsupported function";
1491  case kIOReturnVMError: return "misc. VM failure";
1492  case kIOReturnInternalError: return "internal error";
1493  case kIOReturnIOError: return "General I/O error";
1494  case kIOReturnCannotLock: return "can't acquire lock";
1495  case kIOReturnNotOpen: return "device not open";
1496  case kIOReturnNotReadable: return "read not supported";
1497  case kIOReturnNotWritable: return "write not supported";
1498  case kIOReturnNotAligned: return "alignment error";
1499  case kIOReturnBadMedia: return "Media Error";
1500  case kIOReturnStillOpen: return "device(s) still open";
1501  case kIOReturnRLDError: return "rld failure";
1502  case kIOReturnDMAError: return "DMA failure";
1503  case kIOReturnBusy: return "Device Busy";
1504  case kIOReturnTimeout: return "I/O Timeout";
1505  case kIOReturnOffline: return "device offline";
1506  case kIOReturnNotReady: return "not ready";
1507  case kIOReturnNotAttached: return "device not attached";
1508  case kIOReturnNoChannels: return "no DMA channels left";
1509  case kIOReturnNoSpace: return "no space for data";
1510  case kIOReturnPortExists: return "port already exists";
1511  case kIOReturnCannotWire: return "can't wire down physical memory";
1512  case kIOReturnNoInterrupt: return "no interrupt attached";
1513  case kIOReturnNoFrames: return "no DMA frames enqueued";
1514  case kIOReturnMessageTooLarge: return "oversized msg received on interrupt port";
1515  case kIOReturnNotPermitted: return "not permitted";
1516  case kIOReturnNoPower: return "no power to device";
1517  case kIOReturnNoMedia: return "media not present";
1518  case kIOReturnUnformattedMedia: return "media not formatted";
1519  case kIOReturnUnsupportedMode: return "no such mode";
1520  case kIOReturnUnderrun: return "data underrun";
1521  case kIOReturnOverrun: return "data overrun";
1522  case kIOReturnDeviceError: return "the device is not working properly!";
1523  case kIOReturnNoCompletion: return "a completion routine is required";
1524  case kIOReturnAborted: return "operation aborted";
1525  case kIOReturnNoBandwidth: return "bus bandwidth would be exceeded";
1526  case kIOReturnNotResponding: return "device not responding";
1527  case kIOReturnIsoTooOld: return "isochronous I/O request for distant past!";
1528  case kIOReturnIsoTooNew: return "isochronous I/O request for distant future";
1529  case kIOReturnNotFound: return "data was not found";
1530  case MACH_SEND_INVALID_DEST: return "MACH_SEND_INVALID_DEST";
1531  case kNTV2DriverBadDMA: return "bad dma engine num";
1532  case kNTV2DriverDMABusy: return "dma engine busy, or none available";
1533  case kNTV2DriverParamErr: return "bad aja parameter (out of range)";
1534  case kNTV2DriverPgmXilinxErr: return "xilinx programming error";
1535  case kNTV2DriverNotReadyErr: return "xilinx not yet programmed";
1536  case kNTV2DriverPrepMemErr: return "error preparing memory (no room?)";
1537  case kNTV2DriverDMATooLarge: return "dma xfer too large, or out of range";
1538  case kNTV2DriverBadHeaderTag: return "bad NTV2 header";
1539  case kNTV2UnknownStructType: return "unknown NTV2 struct type";
1540  case kNTV2HeaderVersionErr: return "bad or unsupported NTV2 header version";
1541  case kNTV2DriverBadTrailerTag: return "bad NTV2 trailer";
1542  case kNTV2DriverMapperErr: return "failure while mapping NTV2 struct ptrs";
1543  case kNTV2DriverUnmapperErr: return "failure while unmapping NTV2 struct ptrs";
1544  default: return "";
1545  }
1546 } // GetKernErrStr
virtual bool ReleaseStreamForApplicationWithReference(ULWord inApplicationType, int32_t inProcessID)
A reference-counted version of CNTV2DriverInterface::ReleaseStreamForApplication useful for process g...
NTV2VideoFrameBufferOrientation frameBufferOrientation
Everything needed to call CNTV2Card::ReadRegister or CNTV2Card::WriteRegister functions.
#define KR(_kr_)
const IOReturn kNTV2DriverParamErr
const IOReturn kNTV2DriverBadDMA
virtual bool AcquireStreamForApplicationWithReference(const ULWord inAppType, const int32_t inProcessID)
A reference-counted version of CNTV2DriverInterface::AcquireStreamForApplication useful for process g...
struct AUTOCIRCULATE_STATUS_STRUCT AUTOCIRCULATE_STATUS_STRUCT
const IOReturn kNTV2HeaderVersionErr
Declares the AJALock class.
static const string sNTV2PCIKEXTClassName("com_aja_iokit_ntv2")
#define OS_IOKitWaitQuiet(_x_, _y_)
#define DIDBG(__x__)
#define OS_IOObjectRelease(_x_)
virtual bool ReleaseStreamForApplication(ULWord inApplicationType, int32_t inProcessID)
Releases exclusive use of the AJA device for the given process, permitting other processes to acquire...
#define OS_IOMasterPort(_x_, _y_)
CUSTOM_ANC_STRUCT customAncInfo
This field is obsolete. Do not use.
const IOReturn kNTV2DriverDMABusy
const IOReturn kNTV2DriverMapperErr
Declares the AJADebug class.
#define INSTP(_p_)
#define OS_IOServiceOpen(_w_, _x_, _y_, _z_)
#define NTV2_IS_VALID_INTERRUPT_ENUM(__e__)
virtual bool GetAudioOutputMode(NTV2_GlobalAudioPlaybackMode *mode)
const IOReturn kNTV2DriverBadHeaderTag
Declares the AJATime class.
NTV2VideoFrameBufferOrientation frameBufferOrientation
#define NTV2_FOURCC(_a_, _b_, _c_, _d_)
const IOReturn kNTV2DriverPrepMemErr
const IOReturn kNTV2DriverDMATooLarge
Definition: lock.h:28
virtual ULWord GetPCISlotNumber(void) const
CNTV2MacDriverInterface()
My default constructor.
AUTO_CIRC_COMMAND eCommand
virtual bool ReleaseStreamForApplication(const ULWord inAppType, const int32_t inProcessID)
Releases exclusive use of the AJA device for the given process, permitting other processes to acquire...
Definition: json.hpp:5362
uint32_t ULWord
Definition: ajatypes.h:236
virtual ~CNTV2MacDriverInterface()
My destructor.
virtual bool DmaTransfer(const NTV2DMAEngine inDMAEngine, const bool inIsRead, const ULWord inFrameNumber, ULWord *pFrameBuffer, const ULWord inCardOffsetBytes, const ULWord inTotalByteCount, const bool inSynchronous=(!(0)))
Transfers data between the AJA device and the host. This function will block and not return to the ca...
NTV2Channel
These enum values are mostly used to identify a specific widget_framestore. They&#39;re also commonly use...
Definition: ntv2enums.h:1361
Declares NTV2 "nub" client functions.
#define DIFAIL(__x__)
uint64_t Pointer64
Definition: ajatypes.h:240
#define NTV2_ASSERT(_expr_)
Definition: ajatypes.h:489
virtual bool SetAudioOutputMode(NTV2_GlobalAudioPlaybackMode mode)
static AJAStatus StatTimerStop(const uint32_t inKey)
Definition: debug.cpp:1161
#define OS_IOServiceMatching(_x_)
AutoCircGenericTask * taskArray
virtual bool AcquireStreamForApplication(const ULWord inAppType, const int32_t inProcessID)
Reserves exclusive use of the AJA device for a given process, preventing other processes on the host ...
#define OS_IOConnectMapMemory(_u_, _v_, _w_, _x_, _y_, _z_)
virtual bool SetStreamingApplication(const ULWord appType, const int32_t pid)
Forcibly sets the four-CC type and process ID of the application that should "own" the AJA device (i...
virtual bool WaitForChangeEvent(UInt32 timeout=0)
virtual bool GetStreamingApplication(ULWord &outAppType, int32_t &outProcessID)
Answers with the four-CC type and process ID of the application that currently "owns" the AJA device ...
AutoCircVidProcMode mode
#define OS_IOConnectCallScalarMethod(_u_, _v_, _w_, _x_, _y_, _z_)
virtual bool CloseLocalPhysical(void)
Releases host resources associated with the local/physical device connection.
#define OS_IOConnectCallMethod(_q_, _r_, _s_, _t_, _u_, _v_, _w_, _x_, _y_, _z_)
ULWord GetSizeInBytes(void) const
My total size, in bytes, including header, body and trailer (but excluding embedded NTV2Buffer data) ...
virtual bool SetStreamingApplication(const ULWord inAppType, const int32_t inProcessID)
Forcibly sets the four-CC type and process ID of the application that should "own" the AJA device (i...
#define MDIFAIL(__x__)
virtual bool MapMemory(const MemoryType memType, void **memPtr)
static NTV2DeviceIDSet gLegalDeviceIDs
virtual bool AcquireStreamForApplication(ULWord inApplicationType, int32_t inProcessID)
Reserves exclusive use of the AJA device for a given process, preventing other processes on the host ...
const IOReturn kNTV2DriverBadTrailerTag
NTV2DMAEngine
Definition: ntv2enums.h:1861
#define AJA_NULL
Definition: ajatypes.h:180
virtual bool ReadRegister(const ULWord inRegNum, ULWord &outValue, const ULWord inMask=0xFFFFFFFF, const ULWord inShift=0)
Reads all or part of the 32-bit contents of a specific register (real or virtual) on the AJA device...
enum _INTERRUPT_ENUMS_ INTERRUPT_ENUMS
NTV2ColorCorrectionInfo colorCorrectionInfo
#define OS_IOIteratorNext(_x_)
#define MDIWARN(__x__)
NTV2ColorCorrectionInfo_64 colorCorrectionInfo
static const uint32_t sIntEnumToStatKeys[]
All new NTV2 structs start with this common header.
#define OS_IOServiceGetMatchingServices(_x_, _y_, _z_)
static AJALock gLegalDevIDsLock
virtual bool AcquireStreamForApplicationWithReference(ULWord inApplicationType, int32_t inProcessID)
A reference-counted version of CNTV2DriverInterface::AcquireStreamForApplication useful for process g...
virtual bool GetInterruptCount(const INTERRUPT_ENUMS eInterrupt, ULWord &outCount)
Answers with the current total number of interrupts of the given type processed by the driver&#39;s inter...
NTV2_GlobalAudioPlaybackMode
Definition: ntv2enums.h:2111
virtual bool ReleaseStreamForApplicationWithReference(const ULWord inAppType, const int32_t inProcessID)
A reference-counted version of CNTV2DriverInterface::ReleaseStreamForApplication useful for process g...
NTV2FrameBufferFormat frameBufferFormat
virtual bool DmaTransfer(const NTV2DMAEngine inDMAEngine, const bool inIsRead, const ULWord inFrameNumber, ULWord *pFrameBuffer, const ULWord inCardOffsetBytes, const ULWord inByteCount, const bool inSynchronous=(!(0)))
Transfers data between the AJA device and the host. This function will block and not return to the ca...
uint8_t UByte
Definition: ajatypes.h:231
NTV2Crosspoint channelSpec
NTV2ColorCorrectionMode mode
NTV2Crosspoint backgroundVideoCrosspoint
virtual bool WriteRegister(const ULWord inRegNum, const ULWord inValue, const ULWord inMask=0xFFFFFFFF, const ULWord inShift=0)
Updates or replaces all or part of the 32-bit contents of a specific register (real or virtual) on th...
virtual bool NTV2Message(NTV2_HEADER *pInMessage)
Sends a message to the NTV2 driver (the new, improved, preferred way).
virtual bool ReadRegister(const ULWord inRegNum, ULWord &outValue, const ULWord inMask=0xFFFFFFFF, const ULWord inShift=0)
Reads all or part of the 32-bit contents of a specific register (real or virtual) on the AJA device...
bool IsValid(void) const
static AJAStatus StatTimerStart(const uint32_t inKey)
Definition: debug.cpp:1141
#define HEX8(__x__)
std::string NTV2DeviceIDToString(const NTV2DeviceID inValue, const bool inForRetailDisplay=false)
Definition: ntv2utils.cpp:4608
Declares the AJAAtomic class.
virtual bool NTV2Message(NTV2_HEADER *pInMessage)
Sends a message to the NTV2 driver (the new, improved, preferred way).
#define DIWARN(__x__)
virtual bool KernelLog(void *dataPtr, UInt32 dataSize)
#define DEC(__x__)
static const char * GetKernErrStr(const kern_return_t inError)
SystemStatusCode
Declares numerous NTV2 utility functions.
SystemControlCode
NTV2Crosspoint foregroundKeyCrosspoint
virtual bool GetInterruptCount(const INTERRUPT_ENUMS eInterrupt, ULWord &outCount)
Answers with the current total number of interrupts of the given type processed by the driver&#39;s inter...
Pointer64 ccLookupTables
only used in 3way color correction mode.
AUTO_CIRC_COMMAND eCommand
NTV2ColorCorrectionMode mode
uint16_t UWord
Definition: ajatypes.h:234
const IOReturn kNTV2UnknownStructType
virtual bool WriteRegister(const ULWord inRegNum, const ULWord inValue, const ULWord inMask=0xFFFFFFFF, const ULWord inShift=0)
Updates or replaces all or part of the 32-bit contents of a specific register (real or virtual) on th...
#define OS_IOKitGetBusyState(_x_, _y_)
virtual bool OpenLocalPhysical(const UWord inDeviceIndex)
Opens the local/physical device connection.
const IOReturn kNTV2DriverNotReadyErr
static const string sNTV2PCIDEXTName("AJANTV2")
virtual bool AutoCirculate(AUTOCIRCULATE_DATA &autoCircData)
Sends an AutoCirculate command to the NTV2 driver.
#define xHEX0N(__x__, __n__)
virtual bool WaitForInterrupt(const INTERRUPT_ENUMS type, const ULWord timeout=50)
Efficiently waits for the next given interrupt to be signaled on the device.
virtual bool WaitForInterrupt(const INTERRUPT_ENUMS eInterrupt, const ULWord timeOutMs=68)
Efficiently waits for the next given interrupt to be signaled on the device.
#define OS_IOServiceClose(_x_)
ULWord * ccLookupTables
only used in 3way color correction mode.
#define OS_IORegistryEntryCreateCFProperty(_w_, _x_, _y_, _z_)
const IOReturn kNTV2DriverPgmXilinxErr
std::set< NTV2DeviceID > NTV2DeviceIDSet
A set of NTV2DeviceIDs.
Definition: ntv2utils.h:1098
CUSTOM_ANC_STRUCT customAncInfo
This field is obsolete. Do not use.
const IOReturn kNTV2DriverUnmapperErr
const uint32_t kAgentAppFcc(((((uint32_t)( 'A'))<< 24)|(((uint32_t)( 'j'))<< 16)|(((uint32_t)( 'a'))<< 8)|(((uint32_t)( 'A'))<< 0)))
static std::string IntName(const INTERRUPT_ENUMS id)
virtual bool SystemControl(void *dataPtr, SystemControlCode systemControlCode)
#define OS_IOConnectCallStructMethod(_u_, _v_, _w_, _x_, _y_, _z_)
#define OS_IOServiceNameMatching(_x_)
NTV2Crosspoint backgroundKeyCrosspoint
NTV2QuarterSizeExpandMode videoQuarterSizeExpand
virtual bool GetStreamingApplication(ULWord &outAppType, int32_t &outProcessID)
Answers with the four-CC type and process ID of the application that currently "owns" the AJA device ...
NTV2Crosspoint foregroundVideoCrosspoint
Implements the MacOS-specific flavor of CNTV2DriverInterface.
virtual bool AutoCirculate(AUTOCIRCULATE_DATA &pAutoCircData)
Sends an AutoCirculate command to the NTV2 driver.
Declares device capability functions.
virtual bool UnmapFrameBuffers(void)
NTV2QuarterSizeExpandMode videoQuarterSizeExpand