/*
     File:       DriverFamilyMatching.h
 
     Contains:   Interfaces for create native drivers NDRV
 
     Version:    Technology: 
                 Release:    Universal Interfaces 3.4
 
     Copyright:  © 1995-2001 by Apple Computer, Inc., all rights reserved.
 
     Bugs?:      For bug reports, consult the following page on
                 the World Wide Web:
 
                     http://developer.apple.com/bugreporter/
 
*/
#ifndef __DRIVERFAMILYMATCHING__
#define __DRIVERFAMILYMATCHING__

#ifndef __MACTYPES__
#include <MacTypes.h>
#endif

#ifndef __NAMEREGISTRY__
#include <NameRegistry.h>
#endif

#ifndef __CODEFRAGMENTS__
#include <CodeFragments.h>
#endif




#if PRAGMA_ONCE
#pragma once
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if PRAGMA_IMPORT
#pragma import on
#endif

#if PRAGMA_STRUCT_ALIGN
    #pragma options align=mac68k
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(push, 2)
#elif PRAGMA_STRUCT_PACK
    #pragma pack(2)
#endif

/*
  ##############################################
   Well known properties in the Name Registry
  ##############################################
*/

#define kPropertyName                   "name"
#define kPropertyCompatible             "compatible"
#define kPropertyDriverPtr              "driver-ptr"
#define kPropertyDriverDesc             "driver-description"
#define kPropertyReg                    "reg"
#define kPropertyAAPLAddress            "AAPL,address"
#define kPropertyMatching               "matching"
#define kPropertyAAPLDriverName         "AAPL,driver-name"

/* CPassThru */
/*
  #########################################################
   Descriptor for Drivers and NDRVs
  #########################################################
*/
/* 
    QuickTime 3.0: "DriverType" has a name collision with cross-platform code.
    Use Mac prefix to avoid collision 
*/
/* Driver Typing Information Used to Match Drivers With Devices */
struct MacDriverType {
  Str31               nameInfoStr;            /* Driver Name/Info String*/
  NumVersion          version;                /* Driver Version Number*/
};
typedef struct MacDriverType            MacDriverType;
#if TARGET_OS_MAC
typedef MacDriverType                   DriverType;
#endif  /* TARGET_OS_MAC */

typedef MacDriverType *                 DriverTypePtr;
/* OS Runtime Information Used to Setup and Maintain a Driver's Runtime Environment */
typedef OptionBits                      RuntimeOptions;
enum {
  kDriverIsLoadedUponDiscovery  = 0x00000001, /* auto-load driver when discovered*/
  kDriverIsOpenedUponLoad       = 0x00000002, /* auto-open driver when loaded*/
  kDriverIsUnderExpertControl   = 0x00000004, /* I/O expert handles loads/opens*/
  kDriverIsConcurrent           = 0x00000008, /* supports concurrent requests*/
  kDriverQueuesIOPB             = 0x00000010, /* device manager doesn't queue IOPB*/
  kDriverIsLoadedAtBoot         = 0x00000020, /* Driver is loaded at the boot time */
  kDriverIsForVirtualDevice     = 0x00000040, /* Driver is for a virtual Device */
  kDriverSupportDMSuspendAndResume = 0x00000080 /* Driver supports Device Manager Suspend and Resume command */
};

struct DriverOSRuntime {
  RuntimeOptions      driverRuntime;          /* Options for OS Runtime*/
  Str31               driverName;             /* Driver's name to the OS*/
  UInt32              driverDescReserved[8];  /* Reserved area*/
};
typedef struct DriverOSRuntime          DriverOSRuntime;
typedef DriverOSRuntime *               DriverOSRuntimePtr;
/* OS Service Information Used To Declare What APIs a Driver Supports */
typedef UInt32                          ServiceCount;
struct DriverServiceInfo {
  OSType              serviceCategory;        /* Service Category Name*/
  OSType              serviceType;            /* Type within Category*/
  NumVersion          serviceVersion;         /* Version of service*/
};
typedef struct DriverServiceInfo        DriverServiceInfo;
typedef DriverServiceInfo *             DriverServiceInfoPtr;
struct DriverOSService {
  ServiceCount        nServices;              /* Number of Services Supported*/
  DriverServiceInfo   service[1];             /* The List of Services (at least one)*/
};
typedef struct DriverOSService          DriverOSService;
typedef DriverOSService *               DriverOSServicePtr;
/* Categories */
enum {
  kServiceCategoryDisplay       = FOUR_CHAR_CODE('disp'), /* Display Manager*/
  kServiceCategoryOpenTransport = FOUR_CHAR_CODE('otan'), /* Open Transport*/
  kServiceCategoryBlockStorage  = FOUR_CHAR_CODE('blok'), /* Block Storage*/
  kServiceCategoryNdrvDriver    = FOUR_CHAR_CODE('ndrv'), /* Generic Native Driver*/
  kServiceCategoryScsiSIM       = FOUR_CHAR_CODE('scsi'), /* SCSI */
  kServiceCategoryFileManager   = FOUR_CHAR_CODE('file'), /* File Manager */
  kServiceCategoryIDE           = FOUR_CHAR_CODE('ide-'), /* ide */
  kServiceCategoryADB           = FOUR_CHAR_CODE('adb-'), /* adb */
  kServiceCategoryPCI           = FOUR_CHAR_CODE('pci-'), /* pci bus */
                                        /* Nu Bus */
  kServiceCategoryDFM           = FOUR_CHAR_CODE('dfm-'), /* DFM */
  kServiceCategoryMotherBoard   = FOUR_CHAR_CODE('mrbd'), /* mother Board */
  kServiceCategoryKeyboard      = FOUR_CHAR_CODE('kybd'), /* Keyboard */
  kServiceCategoryPointing      = FOUR_CHAR_CODE('poit'), /* Pointing */
  kServiceCategoryRTC           = FOUR_CHAR_CODE('rtc-'), /* RTC */
  kServiceCategoryNVRAM         = FOUR_CHAR_CODE('nram'), /* NVRAM */
  kServiceCategorySound         = FOUR_CHAR_CODE('sond'), /* Sound (1/3/96 MCS) */
  kServiceCategoryPowerMgt      = FOUR_CHAR_CODE('pgmt'), /* Power Management */
  kServiceCategoryGeneric       = FOUR_CHAR_CODE('genr') /* Generic Service Category to receive general Events */
};

/* Ndrv ServiceCategory Types */
enum {
  kNdrvTypeIsGeneric            = FOUR_CHAR_CODE('genr'), /* generic*/
  kNdrvTypeIsVideo              = FOUR_CHAR_CODE('vido'), /* video*/
  kNdrvTypeIsBlockStorage       = FOUR_CHAR_CODE('blok'), /* block storage*/
  kNdrvTypeIsNetworking         = FOUR_CHAR_CODE('netw'), /* networking*/
  kNdrvTypeIsSerial             = FOUR_CHAR_CODE('serl'), /* serial*/
  kNdrvTypeIsParallel           = FOUR_CHAR_CODE('parl'), /* parallel */
  kNdrvTypeIsSound              = FOUR_CHAR_CODE('sond'), /* sound*/
  kNdrvTypeIsBusBridge          = FOUR_CHAR_CODE('brdg'),
  kNdrvTypeIsFWConference       = FOUR_CHAR_CODE('crsh'), /* FireWire conference camera */
  kNdrvTypeIsAVC                = FOUR_CHAR_CODE('avc ') /* FireWire AVC devices (DV cameras) */
};

typedef UInt32                          DriverDescVersion;
/*  The Driver Description */
enum {
  kTheDescriptionSignature      = FOUR_CHAR_CODE('mtej'),
  kDriverDescriptionSignature   = FOUR_CHAR_CODE('pdes')
};

enum {
  kInitialDriverDescriptor      = 0,
  kVersionOneDriverDescriptor   = 1
};

struct DriverDescription {
  OSType              driverDescSignature;    /* Signature field of this structure*/
  DriverDescVersion   driverDescVersion;      /* Version of this data structure*/
  MacDriverType       driverType;             /* Type of Driver*/
  DriverOSRuntime     driverOSRuntimeInfo;    /* OS Runtime Requirements of Driver*/
  DriverOSService     driverServices;         /* Apple Service API Membership*/
};
typedef struct DriverDescription        DriverDescription;
typedef DriverDescription *             DriverDescriptionPtr;



#if PRAGMA_STRUCT_ALIGN
    #pragma options align=reset
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(pop)
#elif PRAGMA_STRUCT_PACK
    #pragma pack()
#endif

#ifdef PRAGMA_IMPORT_OFF
#pragma import off
#elif PRAGMA_IMPORT
#pragma import reset
#endif

#ifdef __cplusplus
}
#endif

#endif /* __DRIVERFAMILYMATCHING__ */

