Subversion Repositories f9daq

Rev

Rev 41 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. #ifndef __PCIVME_DRV_H__
  2. #define __PCIVME_DRV_H__
  3. //-------------------------------------------------------------------------
  4. // WINNT driver for PCIVME interface from ARW Elektronik, Germany ---------
  5. // the main header file of the driver
  6. //
  7. // (c) 1999-2004 ARW Elektronik
  8. //
  9. // this source code is published under GPL (Open Source). You can use, redistrubute and
  10. // modify it unless this header   is not modified or deleted. No warranty is given that
  11. // this software will work like expected.
  12. // This product is not authorized for use as critical component in life support systems
  13. // wihout the express written approval of ARW Elektronik Germany.
  14. //
  15. // Please announce changes and hints to ARW Elektronik
  16. //
  17. // $Log: pcivme_drv.h,v $
  18. // Revision 1.3  2004/07/24 07:07:26  klaus
  19. // Update copyright to 2004
  20. //
  21. // Revision 1.2  2003/11/15 19:12:50  klaus
  22. // Update copyright to 2003
  23. //
  24. // Revision 1.1.1.1  2003/11/14 23:16:33  klaus
  25. // First put into repository
  26. //
  27. // Revision 1.5  2002/10/27 18:41:21  klaus
  28. // changed driver version to 2.0 (not 'inf' version)
  29. //
  30. // Revision 1.4  2002/10/27 17:02:30  klaus
  31. // File addressing bug > 2 Gbtye circumvent
  32. //
  33. // Revision 1.3  2002/10/27 16:17:48  klaus
  34. // Typing bug fixed caused at log addition
  35. //
  36. // Revision 1.2  2002/10/27 16:11:02  klaus
  37. // Added CVS log into header
  38. //
  39. // what                                            who          when
  40. // started                                         AR           15.06.1999
  41. // version 1.0 released                                                    AR                   20.10.1ß99
  42. // version 1.2 released                            AR           25.11.2001
  43. // changed to VisualStudio 6.0                     AR           30.09.2001
  44. // compiled with DDK 1/2001                        AR           20.11.2001
  45. // removed alloc_text cause of WIN2000 problems    AR           25.11.2001
  46. // version 1.3 released                            AR           25.11.2001
  47. // changed resource allocation caused by WIN2000   AR           08.06.2002
  48. //
  49.  
  50. //-------------------------------------------------------------------------
  51. #define DRIVER_VERSION ((2 << 16) | 0)  // the only place for version info
  52. #define DRIVER_VARIANT 0                // mark customisation here
  53. //-------------------------------------------------------------------------
  54.  
  55. //-------------------------------------------------------------------------
  56. // precautions for debug compile
  57. #define PCIVME_DEBUG
  58.  
  59. #ifndef PCIVME_DEBUG
  60. #ifdef  KdPrint()
  61. #undef  KdPrint()
  62. #define KdPrint(x)
  63. #endif
  64. #endif
  65. //-------------------------------------------------------------------------
  66.  
  67. //-------------------------------------------------------------------------
  68. // INCLUDES
  69. //
  70. #define PCI_MAX_BUSES     4   // buses to search for pciada
  71.  
  72. #define PCIVME_MAX_PCIADA 4   // maximum of PCIADA to search for  
  73. #define PCIVME_MAX_VMEMM  16  // maximum number of VMEMMs
  74.  
  75. //-------------------------------------------------------------------------
  76. // DEFINES
  77. //
  78. #define PCIVME_VENDOR_ID  0x10B5  
  79. #define PCIVME_DEVICE_ID  0x9050
  80. #define PCIVME_SUBSYS_ID  0x1167
  81. #define PCIVME_SUBVEN_ID  0x9050
  82.  
  83. #define LCR_SPACE         256  // space in bytes of LCR
  84. #define IFR_SPACE         8192 // space in bytes of IFR
  85.  
  86. //-------------------------------------------------------------------------
  87. // TYPEDEFS
  88. //
  89. typedef struct _FILE_OBJ
  90. {
  91.         USHORT uwAssociatedVMEMM;                  // which VMEMM it belongs
  92.         UCHAR  bAddressModifier;                   // this is the current modifier
  93.         UCHAR  bAccessType;                            // this is the current access type (1,2,4)
  94.         UCHAR  bIncrement;                                   // set 0 if no increment of address
  95.         ULONG  dwAddressMask;          // mask for aligned transfers
  96.         ULONG  dwAccessBase;
  97.         void   (*fRead)(void *to, ULONG length, void *from);  // resulting read
  98.         void   (*fWrite)(void *to, ULONG length, void *from); // resulting write
  99.  
  100.         BOOLEAN bQueueIrq;                                 // queue interrupt vectors belonging to this
  101.         PVOID   pIrqListHandle;                    // pointer to the irq FIFO
  102.  
  103.         BOOLEAN bBusError;                 // marks current access as responsible
  104. } FILE_OBJ, *PFILE_OBJ;
  105.  
  106. typedef struct
  107. {
  108.         int               Bus;             // bus number of pciada
  109.         PCI_SLOT_NUMBER   Slot;            // slot + function number encoded
  110.         PCI_COMMON_CONFIG PCIDevice;       // content of pcr
  111.  
  112.     PHYSICAL_ADDRESS  pvPhysLcr;       // local config register
  113.         PHYSICAL_ADDRESS  pvPhysIfr;       // interface registers
  114.         PVOID             pvVirtLcr;       // virtual LCR space
  115.         PVOID             pvVirtIfr;       // virtual IFR space
  116.  
  117.         KIRQL                     Irql;                    // virtual Irq level
  118.         ULONG                     Vector;              // mapped system vector
  119.         KAFFINITY                 Affinity;        // which processor uses this irq
  120.  
  121.         PKINTERRUPT               InterruptObject; // points to the associated irq obj
  122.  
  123.         PUSHORT           pwCntrl;         // LCR Cntrl Offset @ LCR + 0x50
  124.         PUSHORT           pwIntCSR;        // LCR IntCSR Offset @ LCR + 0x4C
  125.  
  126.         ULONG                     dwLinkCount;     // how often this interface is requested
  127.     BOOLEAN                       bConnected;      // VMEMM is connected and powered
  128.         BOOLEAN                   bWordMode;       // WordMode Jumper set
  129.         BOOLEAN                   bSysControl;     // SystemController enabled
  130.         USHORT                    wModuleNumber;   // Number (Jumper) of VMEMM
  131.         USHORT                    wFPGAVersion;    // Revision of (VMEMM) FPGA
  132.         USHORT                    wModuleType;     // Type of (VMEMM) module
  133.  
  134.         PUSHORT                   pwCSR;           // pointer to csr register
  135.         PUSHORT                   pwIRQStat;       // pointer to irq status
  136.         PUCHAR                    pbVector;        // pointer to vector read register
  137.         PULONG                    pdwVMEAdr;       // pointer to VME adress register
  138.         PUCHAR                    pbModifier;      // pointer to address modifier register
  139.         PVOID                     pvVME;           // pointer into VME window
  140.  
  141.         ULONG                     dwVMEPage;       // current page to VME
  142.         UCHAR                     bModifier;       // current Modifier
  143.  
  144.         KSPIN_LOCK                AccessLock;      // a lock for Access to VMEMM registers
  145.         KSPIN_LOCK                IrqListLock;     // a lock to guard access to List
  146.         LIST_ENTRY                IrqListList;     // start of list of IRQ FIFOs
  147.  
  148.         KDPC                      kDPCobj;                 // custom DPC object for irq tunneling
  149.  
  150.         PBOOLEAN                  pbBusError;      // points to the responsible party
  151.  
  152.         int               nInterruptHandlers; // counts the controlling interrupt handlers
  153. } PCIADA;
  154.  
  155. typedef struct _DEVICE_EXT
  156. {
  157.         PDEVICE_OBJECT DeviceObject;       // points to myself
  158.         PDEVICE_OBJECT LowerDeviceObject;
  159.     PDRIVER_OBJECT driverObj;          // points to my driver                               */
  160.         PIRP actualIrp;                                    // points to ..
  161.  
  162.         KSPIN_LOCK      IRPLock;                           // a lock to guard access to List
  163.         LIST_ENTRY  IRPList;                       // List of queued IRPs
  164.  
  165.         int    nPCIADAs;                   // how many PCIADAs are found
  166.  
  167.         PCIADA pciada[PCIVME_MAX_PCIADA];  // for each PCIADA a descriptor
  168.  
  169.         PCIADA *vmemm[PCIVME_MAX_VMEMM];   // points to PCIADA to which it belongs
  170.  
  171.         int    nInitState;                 // tracks the state of initialisation
  172.         PBUS_INTERFACE_STANDARD busInterface;
  173. } DEVICE_EXT, *PDEVICE_EXT;
  174.  
  175. typedef struct
  176. {
  177.         LIST_ENTRY entry;                                  // doubly linked list
  178.         PFILE_OBJ  pFile_obj;                      // the owner
  179.         PVOID      pIrqListHandle;                 // the irq FIFO of this owner
  180. } FIFO_LIST;
  181.  
  182. // Prototypes to support following pragmas
  183. NTSTATUS DriverEntry(PDRIVER_OBJECT driverObj, PUNICODE_STRING regPath);
  184. NTSTATUS HandleStartDevice(PDEVICE_OBJECT fdo, PIRP Irp);
  185. NTSTATUS HandleStopDevice(PDEVICE_OBJECT fdo, PIRP Irp);
  186. NTSTATUS DefaultPnpHandler(PDEVICE_OBJECT fdo, PIRP Irp);
  187. NTSTATUS PCIVMEStartDevice(PDEVICE_OBJECT device_object, PIRP irp);
  188. NTSTATUS PCIVMEAddDevice( PDRIVER_OBJECT driverObj,  PDEVICE_OBJECT  pdo);
  189. NTSTATUS PCIVMEDispatchPnp(PDEVICE_OBJECT deviceObj, PIRP irp);
  190. NTSTATUS PCIVMEOpen(PDEVICE_OBJECT deviceObj, PIRP irp);
  191. NTSTATUS PCIVMEClose(PDEVICE_OBJECT deviceObj, PIRP irp);
  192. VOID     PCIVMEUnload(PDRIVER_OBJECT driverObj);
  193. NTSTATUS QueryBusInterface(IN PDEVICE_OBJECT DeviceObject, OUT PBUS_INTERFACE_STANDARD BusInterface);
  194. NTSTATUS SearchDevices(PDEVICE_OBJECT device_Obj);
  195. NTSTATUS PLX9050BugFix(PDEVICE_OBJECT device_Obj);
  196. NTSTATUS PCIVMEExtractResources(PCIADA *pciada, PIRP irp);
  197. NTSTATUS PCIVMEReserveResources(PDEVICE_OBJECT device_Obj, PIRP irp);
  198. NTSTATUS PCIVMEFreeResources(PDEVICE_OBJECT device_Obj);
  199. NTSTATUS PCIVMETranslateBusAddresses(PDEVICE_OBJECT device_Obj, PIRP irp);
  200. NTSTATUS PCIVMETranslateInterrupt(PDEVICE_OBJECT device_Obj);
  201. NTSTATUS PCIVMEMapIOspace(PDEVICE_OBJECT device_object);
  202. VOID     PCIVMESoftInit(PDEVICE_OBJECT device_Obj);
  203. PBOOLEAN ExchangePointer(PBOOLEAN *current, PBOOLEAN next);
  204.  
  205. /* release all this procedures after init of the driver */
  206. #if 0 // WIN2000 change versus WINNT?
  207. #ifdef ALLOC_PRAGMA
  208. #pragma alloc_text (init, DriverEntry)
  209. #pragma alloc_text (page, PCIVMEStartDevice)
  210. #pragma alloc_text (page, PCIVMEAddDevice)
  211. #pragma alloc_text (page, QueryBusInterface)
  212. #pragma alloc_text (page, SearchDevices)
  213. #pragma alloc_text (page, PLX9050BugFix)
  214. #pragma alloc_text (page, PCIVMEExtractResources)
  215. #pragma alloc_text (page, PCIVMEReserveResources)
  216. #pragma alloc_text (page, PCIVMETranslateBusAddresses)
  217. #pragma alloc_text (page, PCIVMETranslateInterrupt)
  218. #pragma alloc_text (page, PCIVMEMapIOspace)
  219. #pragma alloc_text (page, PCIVMESoftInit)
  220. #endif
  221.  
  222. /* put all this procedures in the paged memory-pool, all called at passiv Level */
  223. #ifdef ALLOC_PRAGMA
  224. #pragma alloc_text (page, HandleStartDevice)
  225. #pragma alloc_text (page, HandleStopDevice)
  226. #pragma alloc_text (page, PCIVMEOpen)
  227. #pragma alloc_text (page, PCIVMEClose)
  228. #pragma alloc_text (page, PCIVMEUnload)
  229. #pragma alloc_text (page, PCIVMEFreeResources)
  230. #pragma alloc_text (page, PCIVMEDispatchPnp)
  231. #pragma alloc_text (page, DefaultPnpHandler)
  232. #endif
  233. #endif // WIN2000 change versus WINNT?
  234.  
  235. #endif // __PCIVME_DRV_H__
  236.  
  237.