Subversion Repositories f9daq

Compare Revisions

No changes between revisions

Ignore whitespace Rev 18 → Rev 19

/wiener_pcivme/pcivme Package/pcivme Package.vcxproj.filters
0,0 → 1,9
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Driver Files">
<UniqueIdentifier>{8E41214B-6785-4CFE-B992-037D68949A14}</UniqueIdentifier>
<Extensions>inf;inv;inx;mof;mc;</Extensions>
</Filter>
</ItemGroup>
</Project>
/wiener_pcivme/pcivme Package/Win7Release/pcivme Package.log
0,0 → 1,5
Build started 10.2.2014 10:02:12.
 
Build succeeded.
 
Time Elapsed 00:00:00.01
/wiener_pcivme/pcivme Package/Win7Release/pcivmePackage.Build.CppClean.log
0,0 → 1,10
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win7release\pcivme package\pcivme.cat
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win7release\inf2cat-expand.1444.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win7release\inf2cat-expand.1444.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win7release\inf2cat-expand.960.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win7release\inf2cat-expand.960.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win7release\inf2cat-expand.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win7release\inf2cat-expand.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win7release\inf2cat.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win7release\inf2cat.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win7release\inf2cat.write.1.tlog
/wiener_pcivme/pcivme Package/Win8.1Release/pcivme Package.log
0,0 → 1,5
Build started 10.2.2014 10:02:12.
 
Build succeeded.
 
Time Elapsed 00:00:00.01
/wiener_pcivme/pcivme Package/Win8.1Release/pcivmePackage.Build.CppClean.log
0,0 → 1,10
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win8.1release\pcivme package\pcivme.cat
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8.1release\inf2cat-expand.4252.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8.1release\inf2cat-expand.4252.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8.1release\inf2cat-expand.5104.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8.1release\inf2cat-expand.5104.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8.1release\inf2cat-expand.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8.1release\inf2cat-expand.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8.1release\inf2cat.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8.1release\inf2cat.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8.1release\inf2cat.write.1.tlog
/wiener_pcivme/pcivme Package/Win8Release/pcivme Package.log
0,0 → 1,5
Build started 10.2.2014 10:02:12.
 
Build succeeded.
 
Time Elapsed 00:00:00.02
/wiener_pcivme/pcivme Package/Win8Release/pcivmePackage.Build.CppClean.log
0,0 → 1,10
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win8release\pcivme package\pcivme.cat
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8release\inf2cat-expand.2972.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8release\inf2cat-expand.2972.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8release\inf2cat-expand.548.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8release\inf2cat-expand.548.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8release\inf2cat-expand.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8release\inf2cat-expand.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8release\inf2cat.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8release\inf2cat.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8release\inf2cat.write.1.tlog
/wiener_pcivme/pcivme Package/pcivme Package.vcxproj.user
0,0 → 1,4
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
</Project>
/wiener_pcivme/pcivme Package/pcivme Package.vcxproj
0,0 → 1,334
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Win8.1 Debug|Win32">
<Configuration>Win8.1 Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Win8.1 Release|Win32">
<Configuration>Win8.1 Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Win8 Debug|Win32">
<Configuration>Win8 Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Win8 Release|Win32">
<Configuration>Win8 Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Win7 Debug|Win32">
<Configuration>Win7 Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Win7 Release|Win32">
<Configuration>Win7 Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Win8.1 Debug|x64">
<Configuration>Win8.1 Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Win8.1 Release|x64">
<Configuration>Win8.1 Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Win8 Debug|x64">
<Configuration>Win8 Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Win8 Release|x64">
<Configuration>Win8 Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Win7 Debug|x64">
<Configuration>Win7 Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Win7 Release|x64">
<Configuration>Win7 Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{48C072A6-A36E-4090-B208-F0084AC06272}</ProjectGuid>
<TemplateGuid>{4605da2c-74a5-4865-98e1-152ef136825f}</TemplateGuid>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<MinimumVisualStudioVersion>11.0</MinimumVisualStudioVersion>
<Configuration>Win8.1 Debug</Configuration>
<Platform Condition="'$(Platform)' == ''">Win32</Platform>
<RootNamespace>pcivme_Package</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'" Label="Configuration">
<TargetVersion>WindowsV6.3</TargetVersion>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
<ConfigurationType>Utility</ConfigurationType>
<DriverType>Package</DriverType>
<DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'" Label="Configuration">
<TargetVersion>WindowsV6.3</TargetVersion>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
<ConfigurationType>Utility</ConfigurationType>
<DriverType>Package</DriverType>
<DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'" Label="Configuration">
<TargetVersion>Windows8</TargetVersion>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
<ConfigurationType>Utility</ConfigurationType>
<DriverType>Package</DriverType>
<DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'" Label="Configuration">
<TargetVersion>Windows8</TargetVersion>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
<ConfigurationType>Utility</ConfigurationType>
<DriverType>Package</DriverType>
<DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'" Label="Configuration">
<TargetVersion>Windows7</TargetVersion>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
<ConfigurationType>Utility</ConfigurationType>
<DriverType>Package</DriverType>
<DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'" Label="Configuration">
<TargetVersion>Windows7</TargetVersion>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
<ConfigurationType>Utility</ConfigurationType>
<DriverType>Package</DriverType>
<DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'" Label="Configuration">
<TargetVersion>WindowsV6.3</TargetVersion>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
<ConfigurationType>Utility</ConfigurationType>
<DriverType>Package</DriverType>
<DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'" Label="Configuration">
<TargetVersion>WindowsV6.3</TargetVersion>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
<ConfigurationType>Utility</ConfigurationType>
<DriverType>Package</DriverType>
<DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'" Label="Configuration">
<TargetVersion>Windows8</TargetVersion>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
<ConfigurationType>Utility</ConfigurationType>
<DriverType>Package</DriverType>
<DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'" Label="Configuration">
<TargetVersion>Windows8</TargetVersion>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
<ConfigurationType>Utility</ConfigurationType>
<DriverType>Package</DriverType>
<DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'" Label="Configuration">
<TargetVersion>Windows7</TargetVersion>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
<ConfigurationType>Utility</ConfigurationType>
<DriverType>Package</DriverType>
<DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'" Label="Configuration">
<TargetVersion>Windows7</TargetVersion>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
<ConfigurationType>Utility</ConfigurationType>
<DriverType>Package</DriverType>
<DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
<EnableDeployment>False</EnableDeployment>
<RemoveDriver>True</RemoveDriver>
<HardwareIdString />
<CommandLine />
<DeployFiles />
<EnableVerifier>False</EnableVerifier>
<AllDrivers>False</AllDrivers>
<VerifyProjectOutput>True</VerifyProjectOutput>
<VerifyDrivers />
<VerifyFlags>133563</VerifyFlags>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
<EnableDeployment>False</EnableDeployment>
<RemoveDriver>True</RemoveDriver>
<HardwareIdString />
<CommandLine />
<DeployFiles />
<EnableVerifier>False</EnableVerifier>
<AllDrivers>False</AllDrivers>
<VerifyProjectOutput>True</VerifyProjectOutput>
<VerifyDrivers />
<VerifyFlags>133563</VerifyFlags>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
<EnableDeployment>False</EnableDeployment>
<RemoveDriver>True</RemoveDriver>
<HardwareIdString />
<CommandLine />
<DeployFiles />
<EnableVerifier>False</EnableVerifier>
<AllDrivers>False</AllDrivers>
<VerifyProjectOutput>True</VerifyProjectOutput>
<VerifyDrivers />
<VerifyFlags>133563</VerifyFlags>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
<EnableDeployment>False</EnableDeployment>
<RemoveDriver>True</RemoveDriver>
<HardwareIdString />
<CommandLine />
<DeployFiles />
<EnableVerifier>False</EnableVerifier>
<AllDrivers>False</AllDrivers>
<VerifyProjectOutput>True</VerifyProjectOutput>
<VerifyDrivers />
<VerifyFlags>133563</VerifyFlags>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
<EnableDeployment>False</EnableDeployment>
<RemoveDriver>True</RemoveDriver>
<HardwareIdString />
<CommandLine />
<DeployFiles />
<EnableVerifier>False</EnableVerifier>
<AllDrivers>False</AllDrivers>
<VerifyProjectOutput>True</VerifyProjectOutput>
<VerifyDrivers />
<VerifyFlags>133563</VerifyFlags>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
<EnableDeployment>False</EnableDeployment>
<RemoveDriver>True</RemoveDriver>
<HardwareIdString />
<CommandLine />
<DeployFiles />
<EnableVerifier>False</EnableVerifier>
<AllDrivers>False</AllDrivers>
<VerifyProjectOutput>True</VerifyProjectOutput>
<VerifyDrivers />
<VerifyFlags>133563</VerifyFlags>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
<EnableDeployment>False</EnableDeployment>
<RemoveDriver>True</RemoveDriver>
<HardwareIdString />
<CommandLine />
<DeployFiles />
<EnableVerifier>False</EnableVerifier>
<AllDrivers>False</AllDrivers>
<VerifyProjectOutput>True</VerifyProjectOutput>
<VerifyDrivers />
<VerifyFlags>133563</VerifyFlags>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
<EnableDeployment>False</EnableDeployment>
<RemoveDriver>True</RemoveDriver>
<HardwareIdString />
<CommandLine />
<DeployFiles />
<EnableVerifier>False</EnableVerifier>
<AllDrivers>False</AllDrivers>
<VerifyProjectOutput>True</VerifyProjectOutput>
<VerifyDrivers />
<VerifyFlags>133563</VerifyFlags>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
<EnableDeployment>False</EnableDeployment>
<RemoveDriver>True</RemoveDriver>
<HardwareIdString />
<CommandLine />
<DeployFiles />
<EnableVerifier>False</EnableVerifier>
<AllDrivers>False</AllDrivers>
<VerifyProjectOutput>True</VerifyProjectOutput>
<VerifyDrivers />
<VerifyFlags>133563</VerifyFlags>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
<EnableDeployment>False</EnableDeployment>
<RemoveDriver>True</RemoveDriver>
<HardwareIdString />
<CommandLine />
<DeployFiles />
<EnableVerifier>False</EnableVerifier>
<AllDrivers>False</AllDrivers>
<VerifyProjectOutput>True</VerifyProjectOutput>
<VerifyDrivers />
<VerifyFlags>133563</VerifyFlags>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
<EnableDeployment>False</EnableDeployment>
<RemoveDriver>True</RemoveDriver>
<HardwareIdString />
<CommandLine />
<DeployFiles />
<EnableVerifier>False</EnableVerifier>
<AllDrivers>False</AllDrivers>
<VerifyProjectOutput>True</VerifyProjectOutput>
<VerifyDrivers />
<VerifyFlags>133563</VerifyFlags>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
<EnableDeployment>False</EnableDeployment>
<RemoveDriver>True</RemoveDriver>
<HardwareIdString />
<CommandLine />
<DeployFiles />
<EnableVerifier>False</EnableVerifier>
<AllDrivers>False</AllDrivers>
<VerifyProjectOutput>True</VerifyProjectOutput>
<VerifyDrivers />
<VerifyFlags>133563</VerifyFlags>
</PropertyGroup>
<ItemGroup>
<FilesToPackage Include="@(Inf->'%(CopyOutput)')" Condition="'@(Inf)'!=''" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\pcivme\pcivme.vcxproj">
<Project>{2ac3560d-0575-4214-a7aa-04f7a8de84be}</Project>
</ProjectReference>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
/wiener_pcivme/pcivme Package/Win7Debug/pcivme Package.log
0,0 → 1,5
Build started 10.2.2014 10:02:12.
 
Build succeeded.
 
Time Elapsed 00:00:00.02
/wiener_pcivme/pcivme Package/Win7Debug/pcivmePackage.Build.CppClean.log
0,0 → 1,14
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win7debug\pcivme package\pcivme.cat
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win7debug\pcivmepackage.cer
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win7debug\inf2cat-expand.3180.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win7debug\inf2cat-expand.3180.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win7debug\inf2cat-expand.6020.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win7debug\inf2cat-expand.6020.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win7debug\inf2cat-expand.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win7debug\inf2cat-expand.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win7debug\inf2cat.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win7debug\inf2cat.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win7debug\inf2cat.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win7debug\signtool.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win7debug\signtool.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win7debug\signtool.write.1.tlog
/wiener_pcivme/pcivme Package/Win8.1Debug/pcivme Package.log
0,0 → 1,5
Build started 10.2.2014 10:02:12.
 
Build succeeded.
 
Time Elapsed 00:00:00.01
/wiener_pcivme/pcivme Package/Win8.1Debug/pcivmePackage.Build.CppClean.log
0,0 → 1,14
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win8.1debug\pcivme package\pcivme.cat
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win8.1debug\pcivmepackage.cer
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8.1debug\inf2cat-expand.3084.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8.1debug\inf2cat-expand.3084.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8.1debug\inf2cat-expand.5916.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8.1debug\inf2cat-expand.5916.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8.1debug\inf2cat-expand.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8.1debug\inf2cat-expand.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8.1debug\inf2cat.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8.1debug\inf2cat.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8.1debug\inf2cat.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8.1debug\signtool.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8.1debug\signtool.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8.1debug\signtool.write.1.tlog
/wiener_pcivme/pcivme Package/Win8Debug/pcivme Package.log
0,0 → 1,5
Build started 10.2.2014 10:02:12.
 
Build succeeded.
 
Time Elapsed 00:00:00.01
/wiener_pcivme/pcivme Package/Win8Debug/pcivmePackage.Build.CppClean.log
0,0 → 1,14
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win8debug\pcivme package\pcivme.cat
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win8debug\pcivmepackage.cer
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8debug\inf2cat-expand.1500.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8debug\inf2cat-expand.1500.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8debug\inf2cat-expand.5664.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8debug\inf2cat-expand.5664.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8debug\inf2cat-expand.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8debug\inf2cat-expand.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8debug\inf2cat.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8debug\inf2cat.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8debug\inf2cat.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8debug\signtool.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8debug\signtool.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme package\win8debug\signtool.write.1.tlog
/wiener_pcivme/pcivme.v12.suo
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/wiener_pcivme/pcivme/SOURCE/pcivme_drv.c
0,0 → 1,1147
//-------------------------------------------------------------------------
// WINNT driver for PCIVME interface from ARW Elektronik, Germany ---------
// the main body of the driver
//
// (c) 1999-2004 ARW Elektronik
//
// this source code is published under GPL (Open Source). You can use, redistrubute and
// modify it unless this header is not modified or deleted. No warranty is given that
// this software will work like expected.
// This product is not authorized for use as critical component in life support systems
// wihout the express written approval of ARW Elektronik Germany.
//
// Please announce changes and hints to ARW Elektronik
//
// $Log: pcivme_drv.c,v $
// Revision 1.3 2004/07/24 07:07:26 klaus
// Update copyright to 2004
//
//
// what who when
// started AR 15.06.1999
// first release 1.0 AR 17.10.1999
// fixed error in PLX9050Bug AR 28.02.2000
// PLX9050Bugfix bug fixed AR 03.03.2000
// PCICC32 CAMAC Interface conflict solved AR 03.03.2000
// Version 1.1 released AR 03.03.2000
// register all used resources, the idle too AR 25.11.2001
// changed resource allocation caused by WIN2000 AR 08.06.2002
//
 
//-------------------------------------------------------------------------
// INCLUDES
//
#include <ntddk.h>
#include <devioctl.h>
#include <pcivme_drv.h>
#include <pcivme_v.h>
#include <pcivme_io.h>
#include <pcivme_i.h>
#include <pcivme.h>
#include <pciif.h>
#include <pcivme_fifo.h>
 
//------------------------------------------------------------------------
// DEFINES
//
#ifndef DWORD
#define DWORD ULONG
#endif
 
#ifndef WORD
#define WORD USHORT
#endif
 
#define CTL_INDEX(x) ((x >> 2) & 0x7FF) // get user control code as index
#define IRQ_LIST_LENGTH 128 // max count of irqs in FIFO for each file_obj
 
#define RESOURCE_ENTRY_COUNT 6 // WIN2000 forces to claim all entries
 
#define DOS_DEVICE_NAME L"\\DosDevices\\PCIVME:"
 
//------------------------------------------------------------------------
// GLOBALS
//
 
//------------------------------------------------------------------------
// FUNCTIONS
//
 
//------------------------------------------------------------------------
// exchange the pointer to Bus Error
//
PBOOLEAN ExchangePointer(PBOOLEAN *current, PBOOLEAN next)
{
PBOOLEAN pb;
 
pb = *current;
*current = next;
 
return pb;
}
 
//------------------------------------------------------------------------
// get the vmemm number out of the filename
//
NTSTATUS InterpreteFileName(PCHAR name, int *nVmemm)
{
char *ptr = name;
char *n = "vmemm";
int h = -1; // high part
int l = -1; // low part
 
if (*ptr == '\\') ptr++; // jump over leading ...
 
while (*n) // compare the basename
if (*n == tolower(*ptr))
{
n++;
ptr++;
}
else
return STATUS_NO_SUCH_FILE;
 
h = *ptr - '0'; // get the number
ptr++;
l = *ptr - '0';
 
if (*ptr == 0) // still over the end ??
{
l = h;
h = 0;
}
else
ptr++;
 
if ((h < 0) || (l < 0) || (*ptr != 0)) // anything wrong ??
return STATUS_NO_SUCH_FILE;
 
*nVmemm = (h * 10) + l; // calculate number
 
if (*nVmemm >= PCIVME_MAX_VMEMM) // out of range ??
return STATUS_NO_SUCH_FILE;
 
return STATUS_SUCCESS;
}
 
//------------------------------------------------------------------------
// the ultimate driver unload
VOID PCIVMEUnload(PDRIVER_OBJECT driverObj)
{
int i;
UNICODE_STRING symbol_name;
DEVICE_EXT *ext = (DEVICE_EXT*)(driverObj->DeviceObject->DeviceExtension);
int nPCIADAs = ext->nPCIADAs;
PCIADA *pciada;
 
KdPrint(("PCIVMEUnload()\n"));
 
switch (ext->nInitState)
{
case 8:
case 7:
// stop interrupts and shut off
PCIVMEDeInitPCIADAs(driverObj->DeviceObject);
PCIVMEDisConnectInterrupt(driverObj->DeviceObject);
 
// remove interrupt lists
for (i = 0; i < nPCIADAs; i++)
{
pciada = &ext->pciada[i];
 
// removeQueueFromList(...)
while (IsListEmpty(&pciada->IrqListList) == FALSE)
{
PLIST_ENTRY pList;
FIFO_LIST *next;
KdPrint(("RemoveHeadList(0x%08x)\n", &pciada->IrqListList));
pList = RemoveHeadList(&pciada->IrqListList);
next = CONTAINING_RECORD(pList, FIFO_LIST, entry);
 
ExFreePool((PVOID)next);
}
}
case 6:
// InitializeIRPQueue has no counterpart
case 5:
// KeInitializeDpc has no counterpart
case 4:
// release io spaces
for (i = 0; i < nPCIADAs; i++)
{
pciada = &ext->pciada[i];
 
if (pciada->pvVirtLcr != NULL)
MmUnmapIoSpace(pciada->pvVirtLcr, LCR_SPACE);
if (pciada->pvVirtIfr != NULL)
MmUnmapIoSpace(pciada->pvVirtIfr, IFR_SPACE);
}
case 3:
// HalGetInterruptVector has no counterpart
case 2:
// HalTranslateBusAddress has no counterpart
case 1:
PCIVMEFreeResources(driverObj->DeviceObject);
default:
case 0:
RtlInitUnicodeString(&symbol_name, DOS_DEVICE_NAME);
 
// delete the symbolicLink in the registry
IoDeleteSymbolicLink( &symbol_name);
 
// delete the deviceObject
IoDeleteDevice(driverObj->DeviceObject);
}
 
KdPrint(("PCIVMEUnload() OK.\n"));
}
 
 
//------------------------------------------------------------------------
// called at CreateFile()
NTSTATUS PCIVMEOpen(PDEVICE_OBJECT deviceObj, PIRP Irp)
{
NTSTATUS result = STATUS_SUCCESS;
ANSI_STRING name;
int nVmemm;
int i;
DEVICE_EXT *pDevExt = (DEVICE_EXT *)(deviceObj->DeviceExtension);
PCIADA *pciada;
FILE_OBJ *file_obj = (FILE_OBJ *)NULL;
 
name.Buffer = NULL;
name.MaximumLength = 80;
 
result = RtlUnicodeStringToAnsiString(&name, &(Irp->Tail.Overlay.OriginalFileObject->FileName), TRUE);
if (result != STATUS_SUCCESS) goto fin;
 
result = InterpreteFileName(name.Buffer, &nVmemm);
if (result != STATUS_SUCCESS) goto fin;
 
KdPrint(("PCIVMEOpen(%d)\n", nVmemm));
RtlFreeAnsiString(&name);
 
file_obj = (FILE_OBJ *)ExAllocatePoolWithTag(NonPagedPool, sizeof(FILE_OBJ),'nepo');
if (file_obj == (FILE_OBJ *)NULL)
{
result = STATUS_NO_MEMORY;
goto fin;
}
 
file_obj->uwAssociatedVMEMM = (USHORT) nVmemm;
file_obj->bAddressModifier = 0x39;
file_obj->bAccessType = BYTE_ACCESS;
file_obj->bIncrement = BYTE_ACCESS; // increments each byte
file_obj->dwAccessBase = 0; // normal setting for all but extended
 
file_obj->bQueueIrq = FALSE;
result = InitializeFIFO(IRQ_LIST_LENGTH, &file_obj->pIrqListHandle);
if (result != STATUS_SUCCESS) goto fin;
 
Irp->Tail.Overlay.OriginalFileObject->FsContext = (PVOID)file_obj;
 
result = PCIVMEScanVMEMM(deviceObj);
if (result != STATUS_SUCCESS) goto fin;
 
for (i = 0; i < pDevExt->nPCIADAs; i++)
{
pciada = &pDevExt->pciada[i];
 
if (pciada->wModuleNumber == nVmemm)
{
pDevExt->vmemm[nVmemm] = pciada; // create association
pciada->dwLinkCount++;
break;
}
}
 
if (i >= pDevExt->nPCIADAs)
{
result = STATUS_NO_SUCH_FILE;
goto fin;
}
 
fin:
Irp->IoStatus.Status = result;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
// be careful when releasing allocated memory !
if (result != STATUS_SUCCESS)
if (file_obj != (FILE_OBJ *)NULL)
if (file_obj->pIrqListHandle != (PVOID)NULL)
DestroyFIFO(file_obj->pIrqListHandle);
 
return result;
}
 
//------------------------------------------------------------------------
// called at close()
NTSTATUS PCIVMEClose(PDEVICE_OBJECT deviceObj, PIRP Irp)
{
DEVICE_EXT *pDevExt = (DEVICE_EXT *)(deviceObj->DeviceExtension);
FILE_OBJ *file_obj = (FILE_OBJ *)NULL;
PCIADA *pciada;
 
file_obj = (FILE_OBJ *)Irp->Tail.Overlay.OriginalFileObject->FsContext;
 
KdPrint(("PCIVMEClose(%d)\n", file_obj->uwAssociatedVMEMM));
 
if (file_obj != (FILE_OBJ *)NULL)
{
pciada = pDevExt->vmemm[file_obj->uwAssociatedVMEMM];
pciada->dwLinkCount--;
 
// remove the ListEntry(s) associated with this path
removeQueueFromList(file_obj, pciada);
 
// empty and remove the interrupt queue (if there is anything stored)
DestroyFIFO(file_obj->pIrqListHandle);
ExFreePool(file_obj);
Irp->Tail.Overlay.OriginalFileObject->FsContext = (FILE_OBJ *)NULL;
}
KdPrint(("PCIVMEClose OK\n"));
 
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
return STATUS_SUCCESS;
}
 
//------------------------------------------------------------------------
// called at
NTSTATUS PCIVMEShutdown(PDEVICE_OBJECT deviceObj, PIRP irp )
{
UNREFERENCED_PARAMETER(irp);
 
KdPrint(("PCIVMEShutdown()\n"));
 
// deinit interfaces and interrupts
PCIVMEDeInitPCIADAs(deviceObj);
 
KdPrint(("PCIVMEShutdown() OK\n"));
 
return STATUS_SUCCESS;
}
 
//------------------------------------------------------------------------
// called at ioctl()
NTSTATUS PCIVMEDeviceControl(PDEVICE_OBJECT deviceObj, PIRP Irp)
{
PIO_STACK_LOCATION IrpStack;
int nIndex;
 
IrpStack = IoGetCurrentIrpStackLocation(Irp);
nIndex = CTL_INDEX(IrpStack->Parameters.DeviceIoControl.IoControlCode);
 
KdPrint(("PCIVMEDeviceControl(%d / 0x%08x)\n", nIndex, Irp->Tail.Overlay.OriginalFileObject));
 
if (nIndex > CTL_INDEX(PCIVME_LAST_CTL_CODE))
{
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp,IO_NO_INCREMENT);
 
KdPrint(("PCIVMEDeviceControl() FAIL.\n"));
 
return STATUS_UNSUCCESSFUL;
}
 
return ioctl[nIndex](deviceObj, Irp, IrpStack);
}
 
 
//------------------------------------------------------------------------
// called at read()
NTSTATUS PCIVMERead(PDEVICE_OBJECT device_Obj, PIRP Irp)
{
NTSTATUS Status = STATUS_SUCCESS;
PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
PVOID pOutputBuffer = ((void *)(MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority)));
LARGE_INTEGER *fileOffset = (LARGE_INTEGER *)&Irp->Tail.Overlay.OriginalFileObject->CurrentByteOffset;
FILE_OBJ *file_obj = (FILE_OBJ *)Irp->Tail.Overlay.OriginalFileObject->FsContext;
DEVICE_EXT *pDevExt = (DEVICE_EXT *)(device_Obj->DeviceExtension);
PCIADA *pciada = pDevExt->vmemm[file_obj->uwAssociatedVMEMM];
register ULONG Address = IrpStack->Parameters.Read.ByteOffset.LowPart + file_obj->dwAccessBase;
ULONG storeLength = 0;
PBOOLEAN pbPrevBusError;
 
KdPrint(("PCIVMERead(%d)\n", file_obj->uwAssociatedVMEMM));
 
// do here in between what has to be done -----------------
if (Address & file_obj->dwAddressMask) // don't do unaligned transfers
Status = STATUS_DATATYPE_MISALIGNMENT;
else
{
register ULONG Length = IrpStack->Parameters.Read.Length;
register ULONG blockLength;
register ULONG pageAddress;
register ULONG toNextPage;
KIRQL oldIrql;
 
Length &= ~file_obj->dwAddressMask; // align to integer increments
storeLength = Length;
// lock other users out
KeAcquireSpinLock(&pciada->AccessLock, &oldIrql);
 
// check for modifier
if (pciada->bModifier != file_obj->bAddressModifier)
{
WRITE_REGISTER_UCHAR(pciada->pbModifier, file_obj->bAddressModifier);
pciada->bModifier = file_obj->bAddressModifier;
}
// do the read ---
file_obj->bBusError = FALSE;
pbPrevBusError = ExchangePointer(&pciada->pbBusError, &file_obj->bBusError);
while (Length)
{
pageAddress = Address & ~VME_ADR_MASK;
if (pageAddress != pciada->dwVMEPage)
{
WRITE_REGISTER_ULONG(pciada->pdwVMEAdr, pageAddress);
pciada->dwVMEPage = pageAddress;
}
 
toNextPage = (pageAddress + VME_ADR_MASK + 1) - Address;
blockLength = (toNextPage < Length) ? toNextPage : Length;
 
KdPrint(("Address 0x%08x, blockLength %d, Length %d\n",
Address, blockLength, Length));
 
file_obj->fRead(pOutputBuffer , blockLength, (PVOID)((PUCHAR)pciada->pvVME + (Address & VME_ADR_MASK)));
 
Length -= blockLength;
Address += blockLength;
pOutputBuffer = (PVOID)((PUCHAR)pOutputBuffer + blockLength);
}
 
// release the lock
KeReleaseSpinLock(&pciada->AccessLock, oldIrql);
ExchangePointer(&pciada->pbBusError, pbPrevBusError);
if (file_obj->bBusError) Status = STATUS_ACCESS_VIOLATION;
if (file_obj->bIncrement) // only when increment to next is on
*fileOffset =
RtlLargeIntegerAdd(*fileOffset, RtlConvertUlongToLargeInteger(storeLength));
}
// do here in between what has to be done end -------------
 
Irp->IoStatus.Status = Status;
Irp->IoStatus.Information = storeLength;
IoCompleteRequest(Irp,IO_NO_INCREMENT);
 
KdPrint(("PCIVMERead(), Status = 0x%08x\n", Status));
 
return Status;
}
 
 
//------------------------------------------------------------------------
// called at write()
NTSTATUS PCIVMEWrite(PDEVICE_OBJECT device_Obj, PIRP Irp)
{
NTSTATUS Status = STATUS_SUCCESS;
PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
PVOID pInputBuffer = ((void *)(MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority)));
LARGE_INTEGER *fileOffset = (LARGE_INTEGER *)&Irp->Tail.Overlay.OriginalFileObject->CurrentByteOffset;
FILE_OBJ *file_obj = (FILE_OBJ *)Irp->Tail.Overlay.OriginalFileObject->FsContext;
DEVICE_EXT *pDevExt = (DEVICE_EXT *)(device_Obj->DeviceExtension);
PCIADA *pciada = pDevExt->vmemm[file_obj->uwAssociatedVMEMM];
register ULONG Address = IrpStack->Parameters.Write.ByteOffset.LowPart + file_obj->dwAccessBase;
ULONG storeLength = 0;
PBOOLEAN pbPrevBusError;
 
KdPrint(("PCIVMEWrite(%d)\n", file_obj->uwAssociatedVMEMM));
 
// do here in between what has to be done -----------------
if (Address & file_obj->dwAddressMask) // don't do unaligned transfers
Status = STATUS_DATATYPE_MISALIGNMENT;
else
{
register ULONG Length = IrpStack->Parameters.Write.Length;
register ULONG blockLength;
register ULONG pageAddress;
register ULONG toNextPage;
KIRQL oldIrql;
 
Length &= ~file_obj->dwAddressMask; // align to integer increments
storeLength = Length;
// check for modifier
// lock other users out
KeAcquireSpinLock(&pciada->AccessLock, &oldIrql);
 
if (pciada->bModifier != file_obj->bAddressModifier)
{
WRITE_REGISTER_UCHAR(pciada->pbModifier, file_obj->bAddressModifier);
pciada->bModifier = file_obj->bAddressModifier;
}
// do the read ---
file_obj->bBusError = FALSE;
pbPrevBusError = ExchangePointer(&pciada->pbBusError, &file_obj->bBusError);
while (Length)
{
pageAddress = Address & ~VME_ADR_MASK;
if (pageAddress != pciada->dwVMEPage)
{
WRITE_REGISTER_ULONG(pciada->pdwVMEAdr, pageAddress);
pciada->dwVMEPage = pageAddress;
}
 
toNextPage = (pageAddress + VME_ADR_MASK + 1) - Address;
blockLength = (toNextPage < Length) ? toNextPage : Length;
 
KdPrint(("Address 0x%08x, blockLength %d, Length %d\n",
Address, blockLength, Length));
 
file_obj->fWrite((PVOID)((PUCHAR)pciada->pvVME + (Address & VME_ADR_MASK)) , blockLength, pInputBuffer);
 
Length -= blockLength;
Address += blockLength;
pInputBuffer = (PVOID)((PUCHAR)pInputBuffer + blockLength);
}
 
// release the lock
KeReleaseSpinLock(&pciada->AccessLock, oldIrql);
ExchangePointer(&pciada->pbBusError, pbPrevBusError);
if (file_obj->bBusError) Status = STATUS_ACCESS_VIOLATION;
 
if (file_obj->bIncrement) // only when increment to next is on
*fileOffset = RtlLargeIntegerAdd(*fileOffset, RtlConvertUlongToLargeInteger(storeLength));
}
// do here in between what has to be done end -------------
 
Irp->IoStatus.Status = Status;
Irp->IoStatus.Information = storeLength;
IoCompleteRequest(Irp,IO_NO_INCREMENT);
 
KdPrint(("PCIVMEWrite(), Status = 0x%08x\n", Status));
 
return Status;
}
 
#ifdef DO_CLEANUP
//------------------------------------------------------------------------
// called at cancel of a path
NTSTATUS PCIVMECancel(PDEVICE_OBJECT device_Obj, PIRP Irp)
{
FILE_OBJ *file_obj = (FILE_OBJ *)Irp->Tail.Overlay.OriginalFileObject->FsContext;
PIRP pIrpCancel;
 
KdPrint(("PCIVMECancel()\n"));
 
// remove all queued IRPs of this file_obj
do
{
pIrpCancel = RemoveIRPfromQueue(device_Obj, file_obj);
 
if (pIrpCancel == (PIRP)NULL)
{
IoReleaseCancelSpinLock(pIrpCancel->CancelIrql);
break;
}
else
{
IoAcquireCancelSpinLock(pIrpCancel->CancelIrql);
 
// mark irp as not pending
IoSetCancelRoutine(pIrpCancel, NULL);
 
IoReleaseCancelSpinLock(pIrpCancel->CancelIrql);
 
pIrpCancel->IoStatus.Status = STATUS_CANCELLED;
pIrpCancel->IoStatus.Information = 0;
}
} while (pIrpCancel != (PIRP)NULL);
 
IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
KdPrint(("PCIVMECancel(OK)\n"));
 
return STATUS_SUCCESS;
}
#endif
 
//------------------------------------------------------------------------
// search for pciada's
//
NTSTATUS SearchDevices(PDEVICE_OBJECT device_Obj)
{
PCI_SLOT_NUMBER SlotNumber;
PCI_COMMON_CONFIG pci_config;
PCIADA *pciada;
ULONG length;
int *found;
int i,j,k;
 
KdPrint(("SearchDevices()\n"));
 
// prepare structures ----------------------------------------
found = &((DEVICE_EXT*)(device_Obj->DeviceExtension))->nPCIADAs;
*found = 0;
for (i = 0; i < PCIVME_MAX_PCIADA; i++)
{
pciada = &((DEVICE_EXT*)(device_Obj->DeviceExtension))->pciada[i];
 
pciada->Bus = -1;
pciada->Slot.u.AsULONG = 0xFFFFFFFF;
}
 
// search for pciada's ---------------------------------------
SlotNumber.u.bits.Reserved = 0;
for (j = 0; j < PCI_MAX_BUSES; j++)
{
for (i = 0; i < PCI_MAX_DEVICES; i++)
{
SlotNumber.u.bits.DeviceNumber = i;
for (k = 0; k < PCI_MAX_FUNCTION; k++)
{
SlotNumber.u.bits.FunctionNumber = k;
length = HalGetBusData( PCIConfiguration, // Bustype
j, // PCI-Busnumber
SlotNumber.u.AsULONG, // Slotnumber
(PVOID) &(pci_config), // Pointer for the PCI-Information
sizeof(PCI_COMMON_CONFIG) );
 
if ((pci_config.VendorID == PCIVME_VENDOR_ID) &&
(pci_config.DeviceID == PCIVME_DEVICE_ID) &&
(pci_config.u.type0.SubSystemID == PCIVME_SUBSYS_ID) &&
(pci_config.u.type0.SubVendorID == PCIVME_SUBVEN_ID) &&
(pci_config.u.type0.BaseAddresses[2]))
{
pciada = &((DEVICE_EXT*)(device_Obj->DeviceExtension))->pciada[*found];
 
memcpy(&pciada->PCIDevice, &pci_config, sizeof(pci_config));
pciada->Slot = SlotNumber;
pciada->Bus = j;
 
KdPrint(("PCIADA found @ Bus/Slot %d/%d.\n", pciada->Bus, pciada->Slot.u.AsULONG));
 
(*found)++;
if (*found >= PCIVME_MAX_PCIADA) return STATUS_SUCCESS;
}
}
}
}
 
return STATUS_SUCCESS;
}
 
//---------------------------------------------------------------
// function to call for bug fix of PLX9050 build in bug
//
NTSTATUS PLX9050BugFix(PDEVICE_OBJECT device_Obj)
{
DEVICE_EXT *DeviceExtension = (DEVICE_EXT*)device_Obj->DeviceExtension;
int i;
ULONG dwData;
PCIADA *pciada;
 
KdPrint(("PLX9050BugFix()\n"));
 
for (i = 0; i < DeviceExtension->nPCIADAs; i++)
{
pciada = &DeviceExtension->pciada[i];
 
if ((dwData = pciada->PCIDevice.u.type0.BaseAddresses[0]) & 0x80)
{
KdPrint(("Changing address 0:0x%p with 4:0x%p\n",
pciada->PCIDevice.u.type0.BaseAddresses[0],
pciada->PCIDevice.u.type0.BaseAddresses[4]));
 
pciada->PCIDevice.u.type0.BaseAddresses[0] = // exchange
pciada->PCIDevice.u.type0.BaseAddresses[4];
pciada->PCIDevice.u.type0.BaseAddresses[4] = dwData;
 
if (HalSetBusDataByOffset(PCIConfiguration, pciada->Bus,
pciada->Slot.u.AsULONG,
(PVOID)&pciada->PCIDevice.u.type0.BaseAddresses[0],
0x10, 4) != 4)
return STATUS_UNSUCCESSFUL;
 
if (HalSetBusDataByOffset(PCIConfiguration, pciada->Bus,
pciada->Slot.u.AsULONG,
(PVOID)&pciada->PCIDevice.u.type0.BaseAddresses[4],
0x20, 4) != 4)
return STATUS_UNSUCCESSFUL;
}
if ((dwData = pciada->PCIDevice.u.type0.BaseAddresses[1]) & 0x80)
{
KdPrint(("Changing address 1:0x%p with 5:0x%p\n",
pciada->PCIDevice.u.type0.BaseAddresses[1],
pciada->PCIDevice.u.type0.BaseAddresses[5]));
 
pciada->PCIDevice.u.type0.BaseAddresses[1] = // exchange
pciada->PCIDevice.u.type0.BaseAddresses[5];
pciada->PCIDevice.u.type0.BaseAddresses[5] = dwData;
 
if (HalSetBusDataByOffset(PCIConfiguration, pciada->Bus,
pciada->Slot.u.AsULONG,
(PVOID)&pciada->PCIDevice.u.type0.BaseAddresses[1],
0x14, 4) != 4)
return STATUS_UNSUCCESSFUL;
 
if (HalSetBusDataByOffset(PCIConfiguration, pciada->Bus,
pciada->Slot.u.AsULONG,
(PVOID)&pciada->PCIDevice.u.type0.BaseAddresses[5],
0x24, 4) != 4)
return STATUS_UNSUCCESSFUL;
}
}
 
return STATUS_SUCCESS;
}
 
 
//------------------------------------------------------------------------
// reserve resources for PCIADAs
//
NTSTATUS PCIVMEExtractResources(PCIADA *pciada, PCM_RESOURCE_LIST pList)
{
PCM_RESOURCE_LIST pResourceList;
PCM_FULL_RESOURCE_DESCRIPTOR pFullDescriptor;
PCM_PARTIAL_RESOURCE_LIST pPartialList;
PCM_PARTIAL_RESOURCE_DESCRIPTOR pPartialDescriptor;
int i;
int bug = 0;
 
KdPrint(("PCIVMEExtractResources()\n"));
 
pResourceList = pList;
pFullDescriptor = pResourceList->List;
pPartialList = &pFullDescriptor->PartialResourceList;
 
for (i=0; i<(int)pPartialList->Count; i++)
{
pPartialDescriptor = &pPartialList->PartialDescriptors[i];
switch (pPartialDescriptor->Type)
{
case CmResourceTypeInterrupt:
pciada->Irql = (KIRQL)pPartialDescriptor->u.Interrupt.Level;
pciada->Vector = pPartialDescriptor->u.Interrupt.Vector;
pciada->Affinity = pPartialDescriptor->u.Interrupt.Affinity;
 
KdPrint(("Irq : Irql: %d, Vector: %d, Affinity: %d\n",
pciada->Irql, pciada->Vector, pciada->Affinity));
break;
case CmResourceTypeDma:
KdPrint(("Dma : \n"));
break;
case CmResourceTypePort:
 
KdPrint(("Port : 0x%p\n", pPartialDescriptor->u.Port.Start));
break;
case CmResourceTypeMemory:
// special handling of PLXBUG here because of WIN2000
// WIN2000 doesn't recognize late address changes
if (!bug)
{
if (i == 0)
{
pciada->pvPhysLcr = pPartialDescriptor->u.Memory.Start;
 
if (pciada->pvPhysLcr.LowPart & 0x80)
bug = 1;
}
}
else
{
if (i == 3)
pciada->pvPhysLcr = pPartialDescriptor->u.Memory.Start;
}
 
if (i == 2)
pciada->pvPhysIfr = pPartialDescriptor->u.Memory.Start;
 
KdPrint(("Memory : 0x%p\n", (PUCHAR)pPartialDescriptor->u.Memory.Start.LowPart));
break;
}
}
 
if (pciada->Irql == 0)
return STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT;
 
KdPrint(("PCIVMEExtractResources() OK.\n"));
 
return STATUS_SUCCESS;
}
 
NTSTATUS PCIVMEReserveResources(PDEVICE_OBJECT device_Obj)
{
PCM_RESOURCE_LIST pList = NULL;
NTSTATUS result = STATUS_SUCCESS;
int i;
DEVICE_EXT *pDevExt = (DEVICE_EXT*)(device_Obj->DeviceExtension);
int nPCIADAs = pDevExt->nPCIADAs;
PCIADA *pciada;
UNICODE_STRING DriverClassName;
KdPrint(("PCIVMEReserveResources()\n"));
 
// prepare resource claiming
RtlInitUnicodeString(&DriverClassName, L"PCICC32");
 
// cycle through all busses and slots assigned to PCIADAs
for (i = 0; i < nPCIADAs; i++)
{
pciada = &pDevExt->pciada[i];
 
result = HalAssignSlotResources(NULL, &DriverClassName, device_Obj->DriverObject, device_Obj,
PCIBus, pciada->Bus, pciada->Slot.u.AsULONG, &pList);
 
if (result != STATUS_SUCCESS)
break;
 
result = PCIVMEExtractResources(pciada, pList);
 
if (result != STATUS_SUCCESS)
break;
}
 
// its my part to free allocated resources
if (pList != NULL) ExFreePoolWithTag(pList,'nepo');
 
KdPrint(("PCIVMEReserveResources(0x%08x)\n", result));
 
return result;
};
 
 
//------------------------------------------------------------------------
// free resources from PCIADAs
//
NTSTATUS PCIVMEFreeResources(PDEVICE_OBJECT device_Obj)
{
CM_RESOURCE_LIST ResList;
BOOLEAN bConflict;
UNICODE_STRING DriverClassName;
 
KdPrint(("PCIVMEFreeResources()\n"));
 
RtlInitUnicodeString(&DriverClassName, L"PCIVME");
 
ResList.Count = 0;
 
IoReportResourceUsage(&DriverClassName, device_Obj->DriverObject,
&ResList, sizeof(ResList), device_Obj,
NULL, 0, FALSE, &bConflict);
return STATUS_SUCCESS;
};
 
 
//------------------------------------------------------------------------
// translate memory resources to neutral for PCIADAs
//
NTSTATUS PCIVMETranslateBusAddresses(PDEVICE_OBJECT device_Obj)
{
int i;
NTSTATUS result = STATUS_SUCCESS;
int nPCIADAs = ((DEVICE_EXT*)(device_Obj->DeviceExtension))->nPCIADAs;
ULONG memType0, memType2;
PCIADA *pciada;
 
KdPrint(("TranslateBusAddresseses()\n"));
for (i = 0; i < nPCIADAs; i++)
{
pciada = &((DEVICE_EXT*)(device_Obj->DeviceExtension))->pciada[i];
 
memType0 = memType2 = 0;
 
if (!(HalTranslateBusAddress(PCIBus, pciada->Bus, pciada->pvPhysLcr, &memType0,
&pciada->pvPhysLcr)) ||
!(HalTranslateBusAddress(PCIBus, pciada->Bus, pciada->pvPhysIfr, &memType2,
&pciada->pvPhysIfr)))
{
result = STATUS_UNSUCCESSFUL;
break;
}
 
if ((memType0) || (memType2))
{
result = STATUS_UNSUCCESSFUL;
break;
}
}
return result;
}
 
//------------------------------------------------------------------------
// map address spaces to virtual addresses
//
NTSTATUS PCIVMEMapIOspace(PDEVICE_OBJECT device_Obj)
{
int i;
DEVICE_EXT *pDevExt = (DEVICE_EXT*)device_Obj->DeviceExtension;
int nPCIADAs = pDevExt->nPCIADAs;
PCIADA *pciada;
 
KdPrint(("PCIVMEMapIOspace()\n"));
 
for (i = 0; i < nPCIADAs; i++)
{
pciada = &pDevExt->pciada[i];
 
if ((pciada->pvVirtLcr = MmMapIoSpace(pciada->pvPhysLcr, LCR_SPACE, FALSE)) == NULL)
return STATUS_UNSUCCESSFUL;
if ((pciada->pvVirtIfr = MmMapIoSpace(pciada->pvPhysIfr, IFR_SPACE, FALSE)) == NULL)
return STATUS_UNSUCCESSFUL;
 
KdPrint(("PCIADA %d: LCR 0x%08x IFR 0x%08x\n",
i, pciada->pvVirtLcr, pciada->pvVirtIfr));
 
pciada->pwIntCSR = (PUSHORT)((PUCHAR)pciada->pvVirtLcr + 0x4C);
pciada->pwCntrl = (PUSHORT)((PUCHAR)pciada->pvVirtLcr + 0x50);
}
 
return STATUS_SUCCESS;
}
 
 
//------------------------------------------------------------------------
// initializes and registers a DPC routine for each pciada
//
NTSTATUS InitializeCustomDPCObjects(PDEVICE_OBJECT device_object)
{
int i;
int nPCIADAs = ((DEVICE_EXT*)(device_object->DeviceExtension))->nPCIADAs;
PCIADA *pciada;
 
KdPrint(("InitializeCustomDPCObject()\n"));
 
for (i = 0; i < nPCIADAs; i++)
{
pciada = &((DEVICE_EXT*)(device_object->DeviceExtension))->pciada[i];
KeInitializeDpc(&pciada->kDPCobj, fMyDefferedRoutine, (PVOID)device_object);
}
 
return STATUS_SUCCESS;
}
 
//------------------------------------------------------------------------
// initializes the queue for storing IRPs waiting for vectors
//
NTSTATUS InitializeIRPQueue(PDEVICE_OBJECT device_Obj)
{
DEVICE_EXT *pDevExt = ((DEVICE_EXT*)(device_Obj->DeviceExtension));
 
KdPrint(("InitializeIRPQueue()\n"));
 
KeInitializeSpinLock(&pDevExt->IRPLock);
InitializeListHead(&pDevExt->IRPList);
 
return STATUS_SUCCESS;
}
 
//------------------------------------------------------------------------
// init structures a.s.o.
//
VOID PCIVMESoftInit(PDEVICE_OBJECT device_Obj)
{
int i;
PCIADA *pciada;
 
for (i = 0; i < PCIVME_MAX_PCIADA; i++)
{
pciada = &((DEVICE_EXT*)(device_Obj->DeviceExtension))->pciada[i];
 
pciada->pvPhysLcr.QuadPart = pciada->pvPhysIfr.QuadPart = 0;
pciada->pvVirtLcr = pciada->pvVirtIfr = NULL;
 
pciada->bConnected = FALSE; // connection still not verified
pciada->bWordMode = TRUE;
pciada->bSysControl = FALSE;
pciada->wModuleNumber = 0xFFFF;
pciada->wFPGAVersion = 0xFFFF;
pciada->wModuleType = 1; // always VMEMM
 
pciada->InterruptObject = NULL;
pciada->Irql = 0;
pciada->Vector = 0;
pciada->Affinity = 0;
 
pciada->dwLinkCount = 0;
KeInitializeSpinLock(&pciada->IrqListLock);
KeInitializeSpinLock(&pciada->AccessLock);
InitializeListHead(&pciada->IrqListList); // start of list of irq fifos
 
pciada->nInterruptHandlers = 0;
}
// no vmemm associated to any PCIADA
for (i = 0; i < PCIVME_MAX_VMEMM; i++)
((DEVICE_EXT*)(device_Obj->DeviceExtension))->vmemm[i] = NULL;
}
 
//------------------------------------------------------------------------
// the ultimate starting point of a driver
NTSTATUS DriverEntry(PDRIVER_OBJECT driverObj, PUNICODE_STRING regPath )
{
UNREFERENCED_PARAMETER(regPath);
PDEVICE_OBJECT device_object; // pointer to the device object
UNICODE_STRING device_name;
UNICODE_STRING symbol_name;
NTSTATUS result = STATUS_SUCCESS;
int nPCIADAs; // count of PCIADAs
DEVICE_EXT *DeviceExtension = NULL;
 
KdPrint(("DriverEntry() ---%d.%d---------------------------------\n", (DRIVER_VERSION >> 16) & 0xff, DRIVER_VERSION & 0xff));
 
driverObj->DriverUnload = PCIVMEUnload;
driverObj->MajorFunction[IRP_MJ_CREATE] = PCIVMEOpen;
driverObj->MajorFunction[IRP_MJ_CLOSE] = PCIVMEClose;
driverObj->MajorFunction[IRP_MJ_READ] = PCIVMERead;
driverObj->MajorFunction[IRP_MJ_WRITE] = PCIVMEWrite;
driverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = PCIVMEDeviceControl;
#ifdef DO_CLEANUP
driverObj->MajorFunction[IRP_MJ_CLEANUP] = PCIVMECancel;
#endif
driverObj->MajorFunction[IRP_MJ_SHUTDOWN] = PCIVMEShutdown;
 
RtlInitUnicodeString(&device_name, L"\\Device\\PCIVME");
 
/* DeviceObject durch IO-Manager erzeugen */
result = IoCreateDevice( driverObj, // DriverObject received by the DriverEntry Call
sizeof(DEVICE_EXT), // required Memory for the DeviceExtension
&device_name, // Name of the device in the device-Directory
FILE_DEVICE_UNKNOWN, // Device-ID
0, // Device-Characteristics normal 0
FALSE, // TRUE : one Thread can open the driver
&device_object); // DeviceObject returned from the IO-Manager
 
// defines how the data are handled between user / kernel Adress-Space
device_object->Flags |= DO_DIRECT_IO;
 
#if 0
// register the shutdown notification entry
IoRegisterShutdownNotification(device_object);
#endif
 
// anounce driver as symbolic device ---------------------------------
if (result == STATUS_SUCCESS)
{
/* now the symbolic Link is created. If there is no S.L. a program cannot connect to the driver */
RtlInitUnicodeString(&symbol_name, DOS_DEVICE_NAME);
result = IoCreateSymbolicLink(&symbol_name,&device_name);
if (result != STATUS_SUCCESS)
{
IoDeleteDevice(device_object);
return result;
}
}
else
return result;
 
DeviceExtension = (DEVICE_EXT*)device_object->DeviceExtension;
 
DeviceExtension->actualIrp = NULL;
DeviceExtension->driverObj = driverObj;
DeviceExtension->nInitState = 0;
 
// init pciada structures ------------------------------------
PCIVMESoftInit(device_object);
 
// search for PCIADAs ----------------------------------------
result = SearchDevices(device_object);
nPCIADAs = DeviceExtension->nPCIADAs;
 
if ((result != STATUS_SUCCESS) || !(nPCIADAs))
{
PCIVMEUnload(driverObj);
return STATUS_DEVICE_DOES_NOT_EXIST;
}
 
// request exclusive ownership of .. ---------------------------------
if ((result = PCIVMEReserveResources(device_object)) != STATUS_SUCCESS)
{
PCIVMEUnload(driverObj);
return result;
}
else
DeviceExtension->nInitState++;
// fix PLX9050 Bug -------------------------------------------
if ((result = PLX9050BugFix(device_object)) != STATUS_SUCCESS)
{
PCIVMEUnload(driverObj);
return result;
}
 
 
// translate BUS relative addresses ----------------------------------
if ((result = PCIVMETranslateBusAddresses(device_object)) != STATUS_SUCCESS)
{
PCIVMEUnload(driverObj);
return STATUS_DEVICE_DOES_NOT_EXIST;
}
else
DeviceExtension->nInitState++;
 
// translate Interrupt Resources used --------------------------------
if ((result = PCIVMETranslateInterrupts(device_object)) != STATUS_SUCCESS)
{
PCIVMEUnload(driverObj);
return STATUS_DEVICE_DOES_NOT_EXIST;
}
else
DeviceExtension->nInitState++;
// map address spaces to virtual addresses ---------------------------
if ((result = PCIVMEMapIOspace(device_object)) != STATUS_SUCCESS)
{
PCIVMEUnload(driverObj);
return STATUS_DEVICE_DOES_NOT_EXIST;
}
else
DeviceExtension->nInitState++;
 
// initialze my custom DPC objects -----------------------------------
if ((result = InitializeCustomDPCObjects(device_object)) != STATUS_SUCCESS)
{
PCIVMEUnload(driverObj);
return result;
}
else
DeviceExtension->nInitState++;
// initialze the queue for IRPs waiting for vectors ------------------
if ((result = InitializeIRPQueue(device_object)) != STATUS_SUCCESS)
{
PCIVMEUnload(driverObj);
return result;
}
else
DeviceExtension->nInitState++;
 
// connect interrupts to service routines ----------------------------
if ((result = PCIVMEConnectInterrupt(device_object)) != STATUS_SUCCESS)
{
PCIVMEUnload(driverObj);
return STATUS_DEVICE_DOES_NOT_EXIST;
}
else
DeviceExtension->nInitState++;
 
// scan all connected VMEMM for info and later use -------------------
if ((result = PCIVMEScanVMEMM(device_object)) != STATUS_SUCCESS)
{
PCIVMEUnload(driverObj);
return STATUS_DEVICE_DOES_NOT_EXIST;
}
 
device_object->Flags &= ~DO_DEVICE_INITIALIZING;
 
KdPrint(("DriverEntry() OK.\n"));
 
return result;
}
 
/wiener_pcivme/pcivme/SOURCE/pciif.h
0,0 → 1,88
#ifndef __PCIIF_H__
//-----------------------------------------------------------------------
// Address definitions of PCI-VME interface designed by A.Rausch
//
// (c) 1999-2004 ARW Elektronik
//
// this source code is published under GPL (Open Source). You can use, redistrubute and
// modify it unless this header is not modified or deleted. No warranty is given that
// this software will work like expected.
// This product is not authorized for use as critical component in life support systems
// wihout the express written approval of ARW Elektronik Germany.
//
// Please announce changes and hints to ARW Elektronik
//
// $Log: pciif.h,v $
// Revision 1.3 2004/07/24 07:07:26 klaus
// Update copyright to 2004
//
// Revision 1.2 2003/11/15 19:12:26 klaus
// Update copyright to 2003
//
// Revision 1.1.1.1 2003/11/14 23:16:33 klaus
// First put into repository
//
// Revision 1.3 2002/10/27 16:17:48 klaus
// Typing bug fixed caused at log addition
//
// Revision 1.2 2002/10/27 16:11:02 klaus
// Added CVS log into header
//
// what who when
// first parts AR 24.11.1997
// converted to new address layout AR 18.05.1998
// next address layout conversion AR 27.06.1998
// no pointer usage at definitions AR 20.02.1999
// first release AR 20.02.1999
// corrected global and local reset AR 18.04.1999
//
 
#include <vic.h>
 
/*-----------------------------------------------------------------------*/
/* all addresses relative to PCI-Window */
 
/*------------- addresses of vmemm local devices ------------------------*/
#define CSR (DWORD)0x0000 /* control status register */
#define VICRES (DWORD)0x0004 /* VIC reset register / interrupt status */
#define ADRHL (DWORD)0x0008 /* AdrH and AdrL as long */
#define VICBASE (DWORD)0x0400 /* base of VIC68A */
#define VECBASE (DWORD)0x0800 /* base of vector registers */
#define VMEBASE (DWORD)0x1000 /* base of 4k VME-BUS window */
 
/*---------- parts of addresses derived from above ----------------------*/
#define IVEC1 (DWORD)(VECBASE + 3) /* IACK 1 vector */
#define IVEC2 (DWORD)(VECBASE + 5) /* IACK 2 vector */
#define IVEC3 (DWORD)(VECBASE + 7) /* IACK 3 vector */
#define IVEC4 (DWORD)(VECBASE + 9) /* IACK 4 vector */
#define IVEC5 (DWORD)(VECBASE + b) /* IACK 5 vector */
#define IVEC6 (DWORD)(VECBASE + d) /* IACK 6 vector */
#define IVEC7 (DWORD)(VECBASE + f) /* IACK 7 vector */
 
#define ADRL (DWORD)ADRHL /* word access addr. VME-addr */
#define ADRH (DWORD)(ADRHL + 2)
 
/*--------- address mask ------------------------------------------------*/
#define VME_ADR_MASK (DWORD)0x00000FFF /* masks lower part of address */
 
/*--------- some masks in CSR -------------------------------------------*/
#define FLAG_RMC (WORD)0x0001 /* set = next cycle is RMC */
#define FLAG_BLT (WORD)0x0002 /* don't use it. must be 0 */
#define FLAG_WORD (WORD)0x0004 /* it is a word wide interface */
#define FLAG_SYSCTL (WORD)0x0008 /* the system contrl. is enabled */
#define MASK_MODNR (WORD)0x00F0 /* the mask to get the module No */
#define MASK_FPGA (WORD)0x0F00 /* the mask to get the FPGA rev. */
#define MASK_MODTYPE (WORD)0xF000 /* the mask to get type of module*/
 
/*---------- action commands in VICRES -----------------------------------*/
#define GLOBAL_RESET (WORD)0x000A /* write this to reset the intrfc */
#define LOCAL_RESET (WORD)0x0005 /* generate a local reset */
 
/*---------- release und inhibit into 0x50 of PLX ------------------------*/
#define RELEASE_VMEMM (WORD)0x4180 /* write this to release access ..*/
#define INHIBIT_VMEMM (WORD)0x4080 /* write this to inhibit access ..*/
#define ENABLE_PCIADA_IRQS (WORD)0x0049 /* enable PCIADA IRQs */
#define DISABLE_PCIADA_IRQS (WORD)0x0009 /* disable PCIADA IRQs */
 
#define __PCIIF_H__
#endif
/wiener_pcivme/pcivme/SOURCE/pcivme_i.h
0,0 → 1,70
#ifndef __PCIVME_I_H__
#define __PCIVME_I_H__
 
//-------------------------------------------------------------------------
// WINNT driver for PCIVME interface from ARW Elektronik, Germany ---------
// the header file to pcivme_i.c - all around interrupt handling
//
// (c) 1999-2004 ARW Elektronik
//
// this source code is published under GPL (Open Source). You can use, redistrubute and
// modify it unless this header is not modified or deleted. No warranty is given that
// this software will work like expected.
// This product is not authorized for use as critical component in life support systems
// wihout the express written approval of ARW Elektronik Germany.
//
// Please announce changes and hints to ARW Elektronik
//
// $Log: pcivme_i.h,v $
// Revision 1.3 2004/07/24 07:07:26 klaus
// Update copyright to 2004
//
// Revision 1.2 2003/11/15 19:12:51 klaus
// Update copyright to 2003
//
// Revision 1.1.1.1 2003/11/14 23:16:33 klaus
// First put into repository
//
// Revision 1.3 2002/10/27 16:17:48 klaus
// Typing bug fixed caused at log addition
//
// Revision 1.2 2002/10/27 16:11:02 klaus
// Added CVS log into header
//
// what who when
// started AR 15.06.99
// changed resource allocation caused by WIN2000 AR 08.06.2002
//
 
//-------------------------------------------------------------------------
// INCLUDES
//
#include <ntddk.h>
#include <pcivme_drv.h>
 
//------------------------------------------------------------------------
// DEFINES
//
 
//------------------------------------------------------------------------
// PROTOTYPES
//
void globalInterruptEnable(PCIADA *pciada);
void globalInterruptDisable(PCIADA *pciada);
NTSTATUS PCIVMETranslateInterrupts(PDEVICE_OBJECT device_Obj);
NTSTATUS PCIVMEConnectInterrupt(PDEVICE_OBJECT device_Obj);
NTSTATUS PCIVMEDisConnectInterrupt(PDEVICE_OBJECT device_Obj);
 
 
/* release all this procedures after init of the driver */
#ifdef ALLOC_PRAGMA
#pragma alloc_text (init, PCIVMEConnectInterrupt)
#pragma alloc_text (init, PCIVMETranslateInterrupts)
#endif
 
/* put all this procedures in the paged memory-pool, all called at passiv Level */
#ifdef ALLOC_PRAGMA
#pragma alloc_text (page, PCIVMEDisConnectInterrupt)
#endif
 
#endif //__PCIVME_I_H__
/wiener_pcivme/pcivme/SOURCE/sources
0,0 → 1,12
TARGETNAME=pcivme
 
#VisualStudio 5
#TARGETPATH=d:\Programme\DevStudio\MyProjects\pcivme
#VisualStudio 6
TARGETPATH=d:\Programme\VisualStudio\MyProjects\pcivme
 
TARGETTYPE=DRIVER
TARGETLIBS=
 
INCLUDES=$(BASEDIR)\inc
SOURCES=pcivme_drv.c pcivme_v.c pcivme_io.c pcivme_i.c pcivme_fifo.c
/wiener_pcivme/pcivme/SOURCE/pcivme.ncb
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/wiener_pcivme/pcivme/SOURCE/pcivme.opt
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/wiener_pcivme/pcivme/SOURCE/pcivme_drv.h
0,0 → 1,220
#ifndef __PCIVME_DRV_H__
#define __PCIVME_DRV_H__
//-------------------------------------------------------------------------
// WINNT driver for PCIVME interface from ARW Elektronik, Germany ---------
// the main header file of the driver
//
// (c) 1999-2004 ARW Elektronik
//
// this source code is published under GPL (Open Source). You can use, redistrubute and
// modify it unless this header is not modified or deleted. No warranty is given that
// this software will work like expected.
// This product is not authorized for use as critical component in life support systems
// wihout the express written approval of ARW Elektronik Germany.
//
// Please announce changes and hints to ARW Elektronik
//
// $Log: pcivme_drv.h,v $
// Revision 1.3 2004/07/24 07:07:26 klaus
// Update copyright to 2004
//
// Revision 1.2 2003/11/15 19:12:50 klaus
// Update copyright to 2003
//
// Revision 1.1.1.1 2003/11/14 23:16:33 klaus
// First put into repository
//
// Revision 1.5 2002/10/27 18:41:21 klaus
// changed driver version to 2.0 (not 'inf' version)
//
// Revision 1.4 2002/10/27 17:02:30 klaus
// File addressing bug > 2 Gbtye circumvent
//
// Revision 1.3 2002/10/27 16:17:48 klaus
// Typing bug fixed caused at log addition
//
// Revision 1.2 2002/10/27 16:11:02 klaus
// Added CVS log into header
//
// what who when
// started AR 15.06.1999
// version 1.0 released AR 20.10.1ß99
// version 1.2 released AR 25.11.2001
// changed to VisualStudio 6.0 AR 30.09.2001
// compiled with DDK 1/2001 AR 20.11.2001
// removed alloc_text cause of WIN2000 problems AR 25.11.2001
// version 1.3 released AR 25.11.2001
// changed resource allocation caused by WIN2000 AR 08.06.2002
//
 
//-------------------------------------------------------------------------
#define DRIVER_VERSION ((2 << 16) | 0) // the only place for version info
#define DRIVER_VARIANT 0 // mark customisation here
//-------------------------------------------------------------------------
 
//-------------------------------------------------------------------------
// precautions for debug compile
#define PCIVME_DEBUG
 
#ifndef PCIVME_DEBUG
#ifdef KdPrint()
#undef KdPrint()
#define KdPrint(x)
#endif
#endif
//-------------------------------------------------------------------------
 
//-------------------------------------------------------------------------
// INCLUDES
//
#define PCI_MAX_BUSES 4 // buses to search for pciada
 
#define PCIVME_MAX_PCIADA 4 // maximum of PCIADA to search for
#define PCIVME_MAX_VMEMM 16 // maximum number of VMEMMs
 
//-------------------------------------------------------------------------
// DEFINES
//
#define PCIVME_VENDOR_ID 0x10B5
#define PCIVME_DEVICE_ID 0x9050
#define PCIVME_SUBSYS_ID 0x1167
#define PCIVME_SUBVEN_ID 0x9050
 
#define LCR_SPACE 256 // space in bytes of LCR
#define IFR_SPACE 8192 // space in bytes of IFR
 
//-------------------------------------------------------------------------
// TYPEDEFS
//
typedef struct _FILE_OBJ
{
USHORT uwAssociatedVMEMM; // which VMEMM it belongs
UCHAR bAddressModifier; // this is the current modifier
UCHAR bAccessType; // this is the current access type (1,2,4)
UCHAR bIncrement; // set 0 if no increment of address
ULONG dwAddressMask; // mask for aligned transfers
ULONG dwAccessBase;
void (*fRead)(void *to, ULONG length, void *from); // resulting read
void (*fWrite)(void *to, ULONG length, void *from); // resulting write
 
BOOLEAN bQueueIrq; // queue interrupt vectors belonging to this
PVOID pIrqListHandle; // pointer to the irq FIFO
 
BOOLEAN bBusError; // marks current access as responsible
} FILE_OBJ, *PFILE_OBJ;
 
typedef struct
{
int Bus; // bus number of pciada
PCI_SLOT_NUMBER Slot; // slot + function number encoded
PCI_COMMON_CONFIG PCIDevice; // content of pcr
 
PHYSICAL_ADDRESS pvPhysLcr; // local config register
PHYSICAL_ADDRESS pvPhysIfr; // interface registers
PVOID pvVirtLcr; // virtual LCR space
PVOID pvVirtIfr; // virtual IFR space
 
KIRQL Irql; // virtual Irq level
ULONG Vector; // mapped system vector
KAFFINITY Affinity; // which processor uses this irq
 
PKINTERRUPT InterruptObject; // points to the associated irq obj
 
PUSHORT pwCntrl; // LCR Cntrl Offset @ LCR + 0x50
PUSHORT pwIntCSR; // LCR IntCSR Offset @ LCR + 0x4C
 
ULONG dwLinkCount; // how often this interface is requested
BOOLEAN bConnected; // VMEMM is connected and powered
BOOLEAN bWordMode; // WordMode Jumper set
BOOLEAN bSysControl; // SystemController enabled
USHORT wModuleNumber; // Number (Jumper) of VMEMM
USHORT wFPGAVersion; // Revision of (VMEMM) FPGA
USHORT wModuleType; // Type of (VMEMM) module
 
PUSHORT pwCSR; // pointer to csr register
PUSHORT pwIRQStat; // pointer to irq status
PUCHAR pbVector; // pointer to vector read register
PULONG pdwVMEAdr; // pointer to VME adress register
PUCHAR pbModifier; // pointer to address modifier register
PVOID pvVME; // pointer into VME window
 
ULONG dwVMEPage; // current page to VME
UCHAR bModifier; // current Modifier
 
KSPIN_LOCK AccessLock; // a lock for Access to VMEMM registers
KSPIN_LOCK IrqListLock; // a lock to guard access to List
LIST_ENTRY IrqListList; // start of list of IRQ FIFOs
 
KDPC kDPCobj; // custom DPC object for irq tunneling
 
PBOOLEAN pbBusError; // points to the responsible party
 
int nInterruptHandlers; // counts the controlling interrupt handlers
} PCIADA;
 
typedef struct _DEVICE_EXT
{
PDEVICE_OBJECT DeviceObject; // points to myself
PDRIVER_OBJECT driverObj; // points to my driver */
PIRP actualIrp; // points to ..
 
KSPIN_LOCK IRPLock; // a lock to guard access to List
LIST_ENTRY IRPList; // List of queued IRPs
 
int nPCIADAs; // how many PCIADAs are found
 
PCIADA pciada[PCIVME_MAX_PCIADA]; // for each PCIADA a descriptor
 
PCIADA *vmemm[PCIVME_MAX_VMEMM]; // points to PCIADA to which it belongs
 
int nInitState; // tracks the state of initialisation
} DEVICE_EXT;
 
typedef struct
{
LIST_ENTRY entry; // doubly linked list
PFILE_OBJ pFile_obj; // the owner
PVOID pIrqListHandle; // the irq FIFO of this owner
} FIFO_LIST;
 
// Prototypes to support following pragmas
NTSTATUS DriverEntry(PDRIVER_OBJECT driverObj, PUNICODE_STRING regPath);
NTSTATUS PCIVMEOpen(PDEVICE_OBJECT deviceObj, PIRP irp);
NTSTATUS PCIVMEClose(PDEVICE_OBJECT deviceObj, PIRP irp);
VOID PCIVMEUnload(PDRIVER_OBJECT driverObj);
NTSTATUS SearchDevices(PDEVICE_OBJECT device_Obj);
NTSTATUS PLX9050BugFix(PDEVICE_OBJECT device_Obj);
NTSTATUS PCIVMEExtractResources(PCIADA *pciada, PCM_RESOURCE_LIST pList);
NTSTATUS PCIVMEReserveResources(PDEVICE_OBJECT device_Obj);
NTSTATUS PCIVMEFreeResources(PDEVICE_OBJECT device_Obj);
NTSTATUS PCIVMETranslateBusAddresses(PDEVICE_OBJECT device_Obj);
NTSTATUS PCIVMETranslateInterrupt(PDEVICE_OBJECT device_Obj);
NTSTATUS PCIVMEMapIOspace(PDEVICE_OBJECT device_object);
VOID PCIVMESoftInit(PDEVICE_OBJECT device_Obj);
PBOOLEAN ExchangePointer(PBOOLEAN *current, PBOOLEAN next);
 
/* release all this procedures after init of the driver */
#if 0 // WIN2000 change versus WINNT?
#ifdef ALLOC_PRAGMA
#pragma alloc_text (init, DriverEntry)
#pragma alloc_text (init, SearchDevices)
#pragma alloc_text (init, PLX9050BugFix)
#pragma alloc_text (init, PCIVMEExtractResources)
#pragma alloc_text (init, PCIVMEReserveResources)
#pragma alloc_text (init, PCIVMETranslateBusAddresses)
#pragma alloc_text (init, PCIVMETranslateInterrupt)
#pragma alloc_text (init, PCIVMEMapIOspace)
#pragma alloc_text (init, PCIVMESoftInit)
#endif
 
/* put all this procedures in the paged memory-pool, all called at passiv Level */
#ifdef ALLOC_PRAGMA
#pragma alloc_text (page, PCIVMEOpen)
#pragma alloc_text (page, PCIVMEClose)
#pragma alloc_text (page, PCIVMEUnload)
#pragma alloc_text (page, PCIVMEFreeResources)
#endif
#endif // WIN2000 change versus WINNT?
 
#endif // __PCIVME_DRV_H__
 
/wiener_pcivme/pcivme/SOURCE/pcivme_v.c
0,0 → 1,203
//-------------------------------------------------------------------------
// WINNT driver for PCIVME interface from ARW Elektronik, Germany ---------
// all around recognition and basic services of VMEMM
//
// (c) 1999-2004 ARW Elektronik
//
// this source code is published under GPL (Open Source). You can use, redistrubute and
// modify it unless this header is not modified or deleted. No warranty is given that
// this software will work like expected.
// This product is not authorized for use as critical component in life support systems
// wihout the express written approval of ARW Elektronik Germany.
//
// Please announce changes and hints to ARW Elektronik
//
// $Log: pcivme_v.c,v $
// Revision 1.3 2004/07/24 07:07:26 klaus
// Update copyright to 2004
//
// Revision 1.2 2003/11/15 19:12:51 klaus
// Update copyright to 2003
//
// Revision 1.1.1.1 2003/11/14 23:16:33 klaus
// First put into repository
//
// Revision 1.3 2002/10/27 16:17:48 klaus
// Typing bug fixed caused at log addition
//
// Revision 1.2 2002/10/27 16:11:02 klaus
// Added CVS log into header
//
// what who when
// started AR 02.07.1999
// first release 1.0 AR 17.10.1999
// changed resource allocation caused by WIN2000 AR 08.06.2002
//
 
//-------------------------------------------------------------------------
// INCLUDES
//
#include <ntddk.h>
#include <pcivme_drv.h>
#include <pcivme_v.h>
#include <pciif.h> // all around the pci interface
 
#ifndef WORD // don't touch include files of WIN95 driver
#define WORD USHORT
#endif
 
#ifndef DWORD
#define DWORD ULONG
#endif
 
//------------------------------------------------------------------------
// PROTOTYPES
//
 
//------------------------------------------------------------------------
// GLOBALS
//
 
//------------------------------------------------------------------------
// FUNCTIONS
//
 
//------------------------------------------------------------------------
// test connection to VMEMM devices without disturbing anything
//
NTSTATUS TestConnection(PCIADA *pciada)
{
USHORT *pwADRH = (USHORT *)((ULONG)(pciada->pvVirtIfr) + (ULONG)ADRH);
USHORT *pwADRL = (USHORT *)((ULONG)(pciada->pvVirtIfr) + (ULONG)ADRL);
int i;
USHORT wRet;
USHORT wADRHContent;
USHORT wADRLContent;
 
KdPrint(("TestConnection()\n"));
wADRHContent = READ_REGISTER_USHORT(pwADRH); // save previous content
wADRLContent = READ_REGISTER_USHORT(pwADRL);
 
for (i = 0; i < 10000; i++)
{
WRITE_REGISTER_USHORT(pwADRH, 0x5555);
WRITE_REGISTER_USHORT(pwADRL, 0xAAAA);
wRet = READ_REGISTER_USHORT(pwADRH);
if (wRet != 0x5555) return STATUS_UNSUCCESSFUL;
WRITE_REGISTER_USHORT(pwADRH, 0xAAAA);
WRITE_REGISTER_USHORT(pwADRL, 0x5555);
wRet = READ_REGISTER_USHORT(pwADRH);
if (wRet != 0xAAAA) return STATUS_UNSUCCESSFUL;
 
WRITE_REGISTER_USHORT(pwADRH, 0x0000);
WRITE_REGISTER_USHORT(pwADRL, 0xFFFF);
wRet = READ_REGISTER_USHORT(pwADRH);
if (wRet != 0x0000) return STATUS_UNSUCCESSFUL;
 
WRITE_REGISTER_USHORT(pwADRH, 0xFFFF);
WRITE_REGISTER_USHORT(pwADRL, 0x0000);
wRet = READ_REGISTER_USHORT(pwADRH);
if (wRet != 0xFFFF) return STATUS_UNSUCCESSFUL;
}
 
WRITE_REGISTER_USHORT(pwADRH, wADRHContent); // restore previous content
WRITE_REGISTER_USHORT(pwADRL, wADRLContent);
 
KdPrint(("TestConnection() OK.\n"));
 
return STATUS_SUCCESS;
}
//------------------------------------------------------------------------
// scan VMEMM devices without disturbing anything
//
NTSTATUS PCIVMEScanVMEMM(PDEVICE_OBJECT deviceObj)
{
int i;
int nPCIADAs = ((DEVICE_EXT*)(deviceObj->DeviceExtension))->nPCIADAs;
PCIADA *pciada;
USHORT wCntrl;
USHORT wIntCSR;
USHORT wVMEMMStatus;
 
KdPrint(("PCIVMEScanVMEMM()\n"));
 
for (i = 0; i < nPCIADAs; i++)
{
pciada = &((DEVICE_EXT*)(deviceObj->DeviceExtension))->pciada[i];
wCntrl = READ_REGISTER_USHORT(pciada->pwCntrl); // save it for later use
wIntCSR = READ_REGISTER_USHORT(pciada->pwIntCSR);
 
WRITE_REGISTER_USHORT(pciada->pwIntCSR, DISABLE_PCIADA_IRQS);
WRITE_REGISTER_USHORT(pciada->pwCntrl, RELEASE_VMEMM); // open it for test
 
if (wCntrl & 0x0800)
{
if (TestConnection(pciada) == STATUS_SUCCESS)
{
wVMEMMStatus = READ_REGISTER_USHORT(pciada->pvVirtIfr);
 
pciada->bConnected = TRUE;
 
// interpret the content
pciada->bWordMode = (wVMEMMStatus & FLAG_WORD) ? TRUE : FALSE;
pciada->bSysControl = (wVMEMMStatus & FLAG_SYSCTL) ? TRUE : FALSE;
pciada->wModuleNumber = (wVMEMMStatus & MASK_MODNR) >> 4;
pciada->wFPGAVersion = (wVMEMMStatus & MASK_FPGA) >> 8;
pciada->wModuleType = (wVMEMMStatus & MASK_MODTYPE) >> 12;
 
// calculate some heavy used addresses
pciada->pwCSR = (PUSHORT)((ULONG)(pciada->pvVirtIfr) + CSR);
pciada->pbModifier = (PUCHAR) ((ULONG)(pciada->pvVirtIfr) + VICBASE + AMSR);
pciada->pdwVMEAdr = (PULONG) ((ULONG)(pciada->pvVirtIfr) + ADRHL);
pciada->pwIRQStat = (PUSHORT)((ULONG)(pciada->pvVirtIfr) + VICRES);
pciada->pbVector = (PUCHAR) ((ULONG)(pciada->pvVirtIfr) + VECBASE);
pciada->pvVME = (PVOID) ((ULONG)(pciada->pvVirtIfr) + VMEBASE);
 
KdPrint(("PCIADA %d <-> VMEMM %d\n", i, pciada->wModuleNumber));
}
else
pciada->wModuleNumber = 0xFFFF; // not recognized, take it out
}
else
pciada->wModuleNumber = 0xFFFF; // not recognized, take it out
 
if (pciada->wModuleNumber != 0xFFFF)
WRITE_REGISTER_USHORT(pciada->pwCntrl, wCntrl); // restore state
else
WRITE_REGISTER_USHORT(pciada->pwCntrl, INHIBIT_VMEMM);
 
WRITE_REGISTER_USHORT(pciada->pwIntCSR, wIntCSR); // restore interrupt masks
}
 
return STATUS_SUCCESS;
}
 
//------------------------------------------------------------------------
// deinit all PCIADAs in a passive state
//
NTSTATUS PCIVMEDeInitPCIADAs(PDEVICE_OBJECT deviceObj)
{
int i;
DEVICE_EXT *pDevExt = (DEVICE_EXT*)deviceObj->DeviceExtension;
int nPCIADAs = pDevExt->nPCIADAs;
PCIADA *pciada;
 
KdPrint(("PCIVMEDeInitPCIADAs()\n"));
 
// dis connect the interrupts to service routines
for (i = 0; i < nPCIADAs; i++)
{
pciada = &pDevExt->pciada[i];
 
WRITE_REGISTER_USHORT(pciada->pwIntCSR, DISABLE_PCIADA_IRQS);
WRITE_REGISTER_USHORT(pciada->pwCntrl, INHIBIT_VMEMM);
}
return STATUS_SUCCESS;
}
/wiener_pcivme/pcivme/SOURCE/pcivme_io.c
0,0 → 1,1461
//-------------------------------------------------------------------------
// WINNT driver for PCIVME interface from ARW Elektronik, Germany ---------
// the ioctl functions
//
// (c) 1999-2004 ARW Elektronik
//
// this source code is published under GPL (Open Source). You can use, redistrubute and
// modify it unless this header is not modified or deleted. No warranty is given that
// this software will work like expected.
// This product is not authorized for use as critical component in life support systems
// wihout the express written approval of ARW Elektronik Germany.
//
// Please announce changes and hints to ARW Elektronik
//
// $Log: pcivme_io.c,v $
// Revision 1.3 2004/07/24 07:07:26 klaus
// Update copyright to 2004
//
// Revision 1.2 2003/11/15 19:12:51 klaus
// Update copyright to 2003
//
// Revision 1.1.1.1 2003/11/14 23:16:33 klaus
// First put into repository
//
// Revision 1.6 2002/10/27 18:30:57 klaus
// simpel typing correction
//
// Revision 1.5 2002/10/27 18:29:56 klaus
// honor backward compatibilty with non-extended modifier addressing
//
// Revision 1.4 2002/10/27 17:02:30 klaus
// File addressing bug > 2 Gbtye circumvent
//
// Revision 1.3 2002/10/27 16:17:48 klaus
// Typing bug fixed caused at log addition
//
// Revision 1.2 2002/10/27 16:11:02 klaus
// Added CVS log into header
//
// what who when
// started AR 03.07.1999
// first release 1.0 AR 17.10.1999
// changed resource allocation caused by WIN2000 AR 08.06.2002
//
 
//-------------------------------------------------------------------------
// INCLUDES
//
#include <ntddk.h>
#include <devioctl.h>
#include <pcivme_drv.h>
#include <pcivme.h>
#include <pcivme_v.h>
#include <pcivme_io.h>
#include <pciif.h>
#include <pcivme_i.h>
#include <pcivme_fifo.h>
 
//------------------------------------------------------------------------
// DEFINES
//
 
// buffers usage must match the corresponding ioctl code!
#define SET_BUFFERS_METHOD_OUT_DIRECT \
{\
InputLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength;\
OutputLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;\
pInputBuffer = ((void *)(Irp->AssociatedIrp.SystemBuffer));\
pOutputBuffer = ((void *)(MmGetSystemAddressForMdl(Irp->MdlAddress)));\
}
 
#define SET_BUFFERS_METHOD_IN_DIRECT \
{\
InputLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength;\
OutputLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;\
pInputBuffer = ((void *)(MmGetSystemAddressForMdl(Irp->MdlAddress)));\
pOutputBuffer = ((void *)(Irp->AssociatedIrp.SystemBuffer));\
}
 
#define SET_BUFFERS_METHOD_BUFFERED \
{\
InputLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength;\
OutputLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;\
pInputBuffer = pOutputBuffer = ((void *)(Irp->AssociatedIrp.SystemBuffer));\
}
 
#define COMPLETE_REQUEST \
{\
if (Status != STATUS_PENDING)\
{\
Irp->IoStatus.Status = Status; \
Irp->IoStatus.Information = irp_info; \
IoCompleteRequest(Irp,IO_NO_INCREMENT); \
}\
}
 
// compatibilty issues to WIN95 driver calls
#ifndef WORD
#define WORD USHORT
#endif
 
#ifndef DWORD
#define DWORD ULONG
#endif
 
#ifndef BYTE
#define BYTE UCHAR
#endif
 
#ifndef BOOL
#define BOOL BOOLEAN
#endif
 
#define MODIFIER_MASK 0x3F // mask for address modifier
 
//-------------------------------------------------------------------------
// GLOBALS
//
const PCIVME_INIT_ELEMENT init_element[] =
{{LCR, WORD_ACCESS, 0x4c, DISABLE_PCIADA_IRQS}, // disable interrupts
{LCR, WORD_ACCESS, 0x50, RELEASE_VMEMM}, // enable interface
 
{VIC, BYTE_ACCESS, (WORD)0x03, 0xf8+1}, // VIICR
 
{VIC, BYTE_ACCESS, (WORD)0x07, 0x78+1}, // VICR1
{VIC, BYTE_ACCESS, (WORD)0x0b, 0x78+2},
{VIC, BYTE_ACCESS, (WORD)0x0f, 0x78+3},
{VIC, BYTE_ACCESS, (WORD)0x13, 0x78+4},
{VIC, BYTE_ACCESS, (WORD)0x17, 0x78+5},
{VIC, BYTE_ACCESS, (WORD)0x1b, 0x78+6},
{VIC, BYTE_ACCESS, (WORD)0x1f, 0x78+7}, // VICR7
 
{VIC, BYTE_ACCESS, (WORD)0x23, 0xf8+0}, // DSICR
 
{VIC, BYTE_ACCESS, (WORD)0x27, 0xf8+1}, // LICR1
{VIC, BYTE_ACCESS, (WORD)0x2b, 0xf8+2},
{VIC, BYTE_ACCESS, (WORD)0x2f, 0xf8+3},
{VIC, BYTE_ACCESS, (WORD)0x33, 0xf8+4},
{VIC, BYTE_ACCESS, (WORD)0x37, 0xf8+5},
{VIC, BYTE_ACCESS, (WORD)0x3b, 0x38+6},
{VIC, BYTE_ACCESS, (WORD)0x3f, 0x38+7}, // LICR7
 
{VIC, BYTE_ACCESS, (WORD)0x43, 0xf8+2}, // ICGS
{VIC, BYTE_ACCESS, (WORD)0x47, 0xf8+3}, // ICMS
 
{VIC, BYTE_ACCESS, (WORD)0x4b, 0xf8+6}, // EGICR
 
{VIC, BYTE_ACCESS, (WORD)0x4f, 0x08}, // ICGS-IVBR (!)
{VIC, BYTE_ACCESS, (WORD)0x53, 0x0c}, // ICMS-IVBR (!)
 
{VIC, BYTE_ACCESS, (WORD)0x57, 0x00}, // LIVBR (!)
 
{VIC, BYTE_ACCESS, (WORD)0x5b, 0x10}, // EGIVBR (!)
 
{VIC, BYTE_ACCESS, (WORD)0x5f, 0x00}, // ICSR
 
{VIC, BYTE_ACCESS, (WORD)0x63, 0x00}, // ICR0
{VIC, BYTE_ACCESS, (WORD)0x67, 0x00},
{VIC, BYTE_ACCESS, (WORD)0x6b, 0x00},
{VIC, BYTE_ACCESS, (WORD)0x6f, 0x00},
{VIC, BYTE_ACCESS, (WORD)0x73, 0x00}, // ICR4
 
{VIC, BYTE_ACCESS, (WORD)0x83, 0xfe}, // VIRSR
 
{VIC, BYTE_ACCESS, (WORD)0x87, 0x0f}, // VIVR1
{VIC, BYTE_ACCESS, (WORD)0x8b, 0x0f},
{VIC, BYTE_ACCESS, (WORD)0x8f, 0x0f},
{VIC, BYTE_ACCESS, (WORD)0x93, 0x0f},
{VIC, BYTE_ACCESS, (WORD)0x97, 0x0f},
{VIC, BYTE_ACCESS, (WORD)0x9b, 0x0f},
{VIC, BYTE_ACCESS, (WORD)0x9f, 0x0f}, // VIVR7
 
{VIC, BYTE_ACCESS, (WORD)0xa3, 0x3c}, // TTR
 
{VIC, BYTE_ACCESS, (WORD)0xb3, 0x40}, // ARCR
{VIC, BYTE_ACCESS, (WORD)0xb7, 0x29}, // AMSR
{VIC, BYTE_ACCESS, (WORD)0xd3, 0x00}, // RCR
 
{IFR, LONG_ACCESS, (WORD)ADRHL, 0xF0F0F0F0}, // ADR-H, ADR-L
{IFR, WORD_ACCESS, (WORD)CSR , 0x0000}, // Contr-Reg
 
{VIC, BYTE_ACCESS, (WORD)0x7f, 0x80}, // ICR7
 
{LCR, WORD_ACCESS, 0x4c, DISABLE_PCIADA_IRQS},// disable interrupts
{STOP, WORD_ACCESS, 0, 0}};
 
const PCIVME_INIT_ELEMENT deinit_element_pre[] =
{{VIC, BYTE_ACCESS, (WORD)0x7f, 0x00}, // ICR7 - sysfail
{LCR, WORD_ACCESS, 0x4c, DISABLE_PCIADA_IRQS},// disable interrupts
{STOP, WORD_ACCESS, 0, 0}};
 
const PCIVME_INIT_ELEMENT deinit_element_post[] =
{{LCR, WORD_ACCESS, 0x50, INHIBIT_VMEMM}, // disable interface
{STOP, WORD_ACCESS, 0, 0}};
 
 
//--------------------------------------------------------------------------
// LOCAL FUNCTIONS
//
 
//--------------------------------------------------------------------------
// fast read or write functions - portable -
static void readByte(void *to, ULONG dwLength, void *from)
{
READ_REGISTER_BUFFER_UCHAR((PUCHAR)from, (PUCHAR)to, dwLength);
}
 
static void readWord(void *to, ULONG dwLength, void *from)
{
dwLength >>= 1;
READ_REGISTER_BUFFER_USHORT((PUSHORT)from, (PUSHORT)to, dwLength);
}
 
static void readLong(void *to, ULONG dwLength, void *from)
{
dwLength >>= 2;
READ_REGISTER_BUFFER_ULONG((PULONG)from, (PULONG)to, dwLength);
}
 
static void writeByte(void *to, ULONG dwLength, void *from)
{
WRITE_REGISTER_BUFFER_UCHAR((PUCHAR)to, (PUCHAR)from, dwLength);
}
 
static void writeWord(void *to, ULONG dwLength, void *from)
{
dwLength >>= 1;
WRITE_REGISTER_BUFFER_USHORT((PUSHORT)to, (PUSHORT)from, dwLength);
}
 
static void writeLong(void *to, ULONG dwLength, void *from)
{
dwLength >>= 2;
WRITE_REGISTER_BUFFER_ULONG((PULONG)to, (PULONG)from, dwLength);
}
 
//------------------------------------------------------------------------
// insert the irq queue into the linked list of queues
static NTSTATUS insertQueueInList(PFILE_OBJ pFile_obj, PCIADA *pciada)
{
NTSTATUS Status = STATUS_SUCCESS;
FIFO_LIST *next;
KIRQL OldIrql;
 
KdPrint(("insertQueueInList()\n"));
 
if (pFile_obj->bQueueIrq) // still enabled and in list
return Status;
 
// allocate memory to hold the list and its container
next = (FIFO_LIST *)ExAllocatePool(NonPagedPool, sizeof(FIFO_LIST));
if(next == (FIFO_LIST *)NULL)
return STATUS_INSUFFICIENT_RESOURCES;
else
{
// fill contents in entry
next->pFile_obj = pFile_obj;
next->pIrqListHandle = pFile_obj->pIrqListHandle;
 
// insert the entry in the list
KeAcquireSpinLock(&pciada->IrqListLock, &OldIrql);
KdPrint(("InsertHeadList(0x%08x, 0x%08x)\n", &pciada->IrqListList, &next->entry));
InsertHeadList(&pciada->IrqListList, &next->entry);
KeReleaseSpinLock(&pciada->IrqListLock, OldIrql);
 
// show and mark it
pFile_obj->bQueueIrq = TRUE;
}
 
return Status;
}
 
//------------------------------------------------------------------------
// remove the irq queue from the linked list of queues
NTSTATUS removeQueueFromList(PFILE_OBJ pFile_obj, PCIADA *pciada)
{
NTSTATUS Status = STATUS_SUCCESS;
FIFO_LIST *next;
PLIST_ENTRY pList;
KIRQL OldIrql;
 
KdPrint(("removeQueueFromList(0x%08x, 0x%08x)\n", pFile_obj, pciada));
 
pList = &pciada->IrqListList;
 
if ((pFile_obj == (FILE_OBJ *)NULL) || (pciada == (PCIADA *)NULL)) return Status;
 
// search for coincidence of pFile_obj in the list
KeAcquireSpinLock(&pciada->IrqListLock, &OldIrql);
while (pList->Flink != &pciada->IrqListList)
{
pList = pList->Flink;
next = CONTAINING_RECORD(pList, FIFO_LIST, entry);
if (next->pFile_obj == pFile_obj) // found
{
KdPrint(("RemoveEntryList(0%08x)\n", pList));
RemoveEntryList(pList);
ExFreePool((PVOID)next);
break;
}
}
KeReleaseSpinLock(&pciada->IrqListLock, OldIrql);
 
// in every case switch it off (again)
pFile_obj->bQueueIrq = FALSE;
 
KdPrint(("removeQueueFromList OK\n"));
return Status;
}
 
//--------------------------------------------------------------------------
// parsing of user supplied input for validy
static BOOLEAN check_command(const PCIVME_INIT_ELEMENT *psInitElement)
{
USHORT range;
USHORT access_size;
switch (psInitElement->range)
{
case LCR: range = 0x54; break;
case IFR: range = 0x0c; break;
case VIC: range = 0xe4;
if ((psInitElement->offset & 3) != 3)
return FALSE;
break;
default: range = 0; break;
}
 
switch (psInitElement->type)
{
case LONG_ACCESS: if (psInitElement->offset & 3)
return FALSE;
access_size = sizeof(ULONG);
break;
case WORD_ACCESS: if (psInitElement->offset & 1)
return FALSE;
access_size = sizeof( USHORT);
break;
case BYTE_ACCESS: access_size = sizeof( UCHAR); break;
default : access_size = 0xFFFF; break;
}
 
if ((psInitElement->offset + access_size) > range)
return FALSE; // ignore it
return TRUE;
}
 
//------------------------------------------------------------------------
// iterate through all commands
static VOID CmdMachine(const PCIVME_INIT_ELEMENT *psInitElement,
PVOID pvLcr, PVOID pvIfr)
{
PVOID adr;
// standard initialisierungen
while (psInitElement->range != STOP)
{
/*
KdPrint(("CmdMachine: %d %d 0x%02x 0x%02x\n",
psInitElement->range, psInitElement->type,
psInitElement->offset, psInitElement->value));
*/
 
if (check_command(psInitElement))
{
switch (psInitElement->range)
{
case LCR: adr = pvLcr; break;
case VIC: adr = (PVOID)((ULONG)pvIfr + (USHORT)VICBASE); break;
case IFR:
default: adr = pvIfr; break;
}
 
switch (psInitElement->type)
{
case LONG_ACCESS:
WRITE_REGISTER_ULONG((ULONG *)((UCHAR *)adr + psInitElement->offset),
psInitElement->value);
break;
case WORD_ACCESS:
WRITE_REGISTER_USHORT((USHORT *)((UCHAR *)adr + psInitElement->offset),
(USHORT)psInitElement->value);
break;
case BYTE_ACCESS:
default:
WRITE_REGISTER_UCHAR((UCHAR *)((UCHAR *)adr + psInitElement->offset),
(UCHAR)psInitElement->value);
break;
}
}
psInitElement++;
}
}
 
//------------------------------------------------------------------------
// init the interface with build in and user supplied constants
static BOOLEAN InitInterface(const PCIVME_INIT_COMMAND *psInitCmd,
PVOID pvLcr, PVOID pvIfr)
{
PCIVME_INIT_ELEMENT *psVie;
if ((psInitCmd == (PCIVME_INIT_COMMAND *)BOGUSADDRESS) ||
(psInitCmd == (PCIVME_INIT_COMMAND *)NULL) ||
(pvLcr == (PVOID)BOGUSADDRESS) ||
(pvLcr == (PVOID)NULL) ||
(pvIfr == (PVOID)BOGUSADDRESS) ||
(pvIfr == (PVOID)NULL))
return FALSE;
 
psVie = (PCIVME_INIT_ELEMENT *)psInitCmd->sVie;
CmdMachine(init_element , pvLcr, pvIfr); // standard initialisierungen
CmdMachine(psVie, pvLcr, pvIfr); // benutzer initialisierungen
return TRUE;
}
 
// deinit the interface with user supplied and build in constants
static BOOLEAN DeInitInterface(const PCIVME_INIT_COMMAND *psDeInitCmd,
PVOID pvLcr, PVOID pvIfr)
{
PCIVME_INIT_ELEMENT *psVie;
 
if ((psDeInitCmd == (PCIVME_INIT_COMMAND *)BOGUSADDRESS) ||
(psDeInitCmd == (PCIVME_INIT_COMMAND *)NULL) ||
(pvLcr == (PVOID)BOGUSADDRESS) ||
(pvLcr == (PVOID)NULL) ||
(pvIfr == (PVOID)BOGUSADDRESS) ||
(pvIfr == (PVOID)NULL))
return FALSE;
 
psVie = (PCIVME_INIT_ELEMENT *)psDeInitCmd->sVie;
CmdMachine(deinit_element_pre, pvLcr, pvIfr); // standard de-initialisierungen
CmdMachine(psVie, pvLcr, pvIfr); // benutzer de-initialisierungen
CmdMachine(deinit_element_post , pvLcr, pvIfr); // disable interface
return TRUE;
}
 
//------------------------------------------------------------------------
// a inserter into a user managed queue of IRPs
//
void InsertIRPtoQueue(PDEVICE_OBJECT device_Obj, PIRP Irp)
{
DEVICE_EXT *pDevExt = (DEVICE_EXT *)(device_Obj->DeviceExtension);
KIRQL oldIrql;
 
KdPrint(("InsertIRPtoQueue(0x%08x)\n", Irp));
 
KeAcquireSpinLock(&pDevExt->IRPLock, &oldIrql);
InsertHeadList(&pDevExt->IRPList, &Irp->Tail.Overlay.ListEntry);
KeReleaseSpinLock(&pDevExt->IRPLock, oldIrql);
}
 
//------------------------------------------------------------------------
// a remover out of a user managed queue of IRPs
//
PIRP RemoveIRPfromQueue(PDEVICE_OBJECT device_Obj, FILE_OBJ *pFile_obj)
{
DEVICE_EXT *pDevExt = (DEVICE_EXT *)(device_Obj->DeviceExtension);
KIRQL oldIrql;
register PLIST_ENTRY pList = &pDevExt->IRPList;
PIRP Irp;
PIRP pIrp = (PIRP)NULL;
FILE_OBJ *file_obj;
 
KdPrint(("RemoveIRPfromQueue()\n"));
 
KeAcquireSpinLock(&pDevExt->IRPLock, &oldIrql);
while (pList->Flink != &pDevExt->IRPList) // until the end is reached
{
pList = pList->Flink;
Irp = CONTAINING_RECORD(pList, IRP, Tail.Overlay.ListEntry);
file_obj = (FILE_OBJ *)Irp->Tail.Overlay.OriginalFileObject->FsContext;
 
KdPrint(("pList 0x%08x, pList->Flink 0x%08x, Irp 0x%08x, file_obj 0x%08x\n", pList, pList->Flink, Irp, file_obj));
 
if ((file_obj == pFile_obj) && (pFile_obj != (FILE_OBJ *)NULL))
{
RemoveEntryList(pList);
pIrp = Irp;
break;
}
}
 
KeReleaseSpinLock(&pDevExt->IRPLock, oldIrql);
 
KdPrint(("return RemoveIRPfromQueue(0x%08x)\n", pIrp));
 
return pIrp;
}
 
//------------------------------------------------------------------------
// a remover out of a user managed queue of IRPs
//
PIRP RemoveIRPfromQueueByIrp(PDEVICE_OBJECT device_Obj, PIRP pIrpIn)
{
DEVICE_EXT *pDevExt = (DEVICE_EXT *)(device_Obj->DeviceExtension);
KIRQL oldIrql;
register PLIST_ENTRY pList = &pDevExt->IRPList;
PIRP Irp;
PIRP pIrp = (PIRP)NULL;
 
KdPrint(("RemoveIRPfromQueueByIrp()\n"));
 
KeAcquireSpinLock(&pDevExt->IRPLock, &oldIrql);
 
while (pList->Flink != &pDevExt->IRPList) // until the end is reached
{
pList = pList->Flink;
Irp = CONTAINING_RECORD(pList, IRP, Tail.Overlay.ListEntry);
 
KdPrint(("pList 0x%08x, pList->Flink 0x%08x, Irp 0x%08x\n", pList, pList->Flink, Irp));
 
if (pIrpIn == Irp)
{
RemoveEntryList(pList);
pIrp = Irp;
break;
}
}
 
KeReleaseSpinLock(&pDevExt->IRPLock, oldIrql);
 
KdPrint(("return RemoveIRPfromQueueByIrp(0x%08x)\n", pIrp));
 
return pIrp;
}
 
//------------------------------------------------------------------------
// the default cancel routine for an queued Irp
//
void CancelRequest(PDEVICE_OBJECT device_Obj, PIRP Irp)
{
PIRP pIrpCancel = RemoveIRPfromQueueByIrp(device_Obj, Irp);
 
if (pIrpCancel == (PIRP)NULL)
{
IoReleaseCancelSpinLock(Irp->CancelIrql);
KdPrint(("Nothing to do: CancelRequest(0x%08x)\n", Irp));
return;
}
else
{
IoReleaseCancelSpinLock(Irp->CancelIrql);
 
KdPrint(("Done: CancelRequest(0x%08x)\n", Irp));
 
Irp->IoStatus.Status = STATUS_CANCELLED;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
}
}
 
//------------------------------------------------------------------------
// the custom deffered routine to finish blocking io on read_vector
void fMyDefferedRoutine(PKDPC Dpc, PVOID pvDevice_object,
PVOID pvPciada, PVOID pvVector)
{
NTSTATUS Status = STATUS_SUCCESS;
ULONG irp_info = sizeof(PCIVME_VECTOR_RESPONSE);
PIRP Irp = (PIRP)NULL;
PDEVICE_OBJECT device_Obj = (PDEVICE_OBJECT)pvDevice_object;
PCIADA *pciada = (PCIADA *)pvPciada;
FIFO_LIST *next;
KIRQL oldIrqlCancel;
KIRQL oldIrqlList;
register PLIST_ENTRY pList = &pciada->IrqListList;
UNREFERENCED_PARAMETER(pvVector);
UNREFERENCED_PARAMETER(Dpc);
KdPrint(("fMyDefferedRoutine()\n"));
 
// beware off damage due to intercept with cancel of thread
IoAcquireCancelSpinLock(&oldIrqlCancel);
KeAcquireSpinLock(&pciada->IrqListLock, &oldIrqlList);
while (pList->Flink != &pciada->IrqListList) // until the end is reached
{
pList = pList->Flink;
KeReleaseSpinLock(&pciada->IrqListLock, oldIrqlList); // shorten block
next = CONTAINING_RECORD(pList, FIFO_LIST, entry);
 
// get my associated packet
Irp = RemoveIRPfromQueue(device_Obj, next->pFile_obj);
 
if (Irp != (PIRP)NULL)
{
PCIVME_VECTOR_REQUEST *pVectorRequest = (PCIVME_VECTOR_REQUEST *)(Irp->AssociatedIrp.SystemBuffer);
PCIVME_VECTOR_RESPONSE *pVectorResponse = (PCIVME_VECTOR_RESPONSE *)pVectorRequest;
USHORT wRequestCount = pVectorRequest->wRequestCount;
UCHAR *pbVector = &pVectorResponse->bStatusID;
FILE_OBJ *file_obj = (FILE_OBJ *)Irp->Tail.Overlay.OriginalFileObject->FsContext;
UCHAR bNumberOfElements = (UCHAR) NumberOfElements(file_obj->pIrqListHandle);
// pull the vectors off the fifo
pVectorResponse->wCount = 0;
while ((bNumberOfElements) && (wRequestCount--))
{
bNumberOfElements = (UCHAR) PullElement(file_obj->pIrqListHandle,
(void *)pbVector);
pbVector++;
pVectorResponse->wCount++;
}
pVectorResponse->wPendingCount = bNumberOfElements;
pVectorResponse->bOverflow = CheckAndClearOverflow(file_obj->pIrqListHandle);
irp_info = sizeof(PCIVME_VECTOR_RESPONSE) +
sizeof(UCHAR) * (pVectorResponse->wCount - 1);
 
// release the cancel routine from this Irp
IoSetCancelRoutine(Irp, NULL);
 
COMPLETE_REQUEST;
}
KeAcquireSpinLock(&pciada->IrqListLock, &oldIrqlList);
}
 
// release the spin locks
KeReleaseSpinLock(&pciada->IrqListLock, oldIrqlList);
IoReleaseCancelSpinLock(oldIrqlCancel);
}
 
//------------------------------------------------------------------------
// all functions called from ioctl jump table
//
 
//------------------------------------------------------------------------
// initialize all hardware associated to a given wModuleNumber
static NTSTATUS ioctl_init_hardware(PDEVICE_OBJECT device_Obj, PIRP Irp, PIO_STACK_LOCATION IrpStack)
{
NTSTATUS Status = STATUS_SUCCESS;
ULONG irp_info = 0;
PVOID pInputBuffer,pOutputBuffer;
ULONG InputLength, OutputLength;
DEVICE_EXT *pDevExt;
PCIVME_INIT_COMMAND *pInitCommand;
PCIADA *pciada;
FILE_OBJ *file_obj = (FILE_OBJ *)Irp->Tail.Overlay.OriginalFileObject->FsContext;
 
pDevExt = (DEVICE_EXT *)(device_Obj->DeviceExtension);
 
SET_BUFFERS_METHOD_BUFFERED;
 
// do what must be here in between --- start ---
pInitCommand = (PCIVME_INIT_COMMAND *)pInputBuffer;
 
KdPrint(("ioctl_init_hardware(%d)\n", file_obj->uwAssociatedVMEMM));
 
pciada = pDevExt->vmemm[file_obj->uwAssociatedVMEMM];
 
if (pciada != NULL)
{
KIRQL oldIrql;
 
if (pciada->dwLinkCount == 1)
{
// lock other users out
KeAcquireSpinLock(&pciada->AccessLock, &oldIrql);
 
if (InitInterface(pInitCommand, pciada->pvVirtLcr, pciada->pvVirtIfr))
{
// fill cache for page and modifier
pciada->dwVMEPage = READ_REGISTER_ULONG(pciada->pdwVMEAdr) & ~VME_ADR_MASK;
pciada->bModifier = READ_REGISTER_UCHAR(pciada->pbModifier) & MODIFIER_MASK;
}
else
Status = STATUS_UNSUCCESSFUL;
 
// release the lock
KeReleaseSpinLock(&pciada->AccessLock, oldIrql);
}
else
Status = STATUS_UNSUCCESSFUL;
}
else
Status = STATUS_UNSUCCESSFUL;
 
// do what must be here in between --- end ---
 
COMPLETE_REQUEST;
 
KdPrint(("ioctl_init_hardware(), Status = 0x%08x\n", Status));
 
return Status;
}
 
//------------------------------------------------------------------------
// De-initialise all hardware associated to a given wModuleNumber
static NTSTATUS ioctl_deinit_hardware(PDEVICE_OBJECT device_Obj, PIRP Irp, PIO_STACK_LOCATION IrpStack)
{
NTSTATUS Status = STATUS_SUCCESS;
ULONG irp_info = 0;
PVOID pInputBuffer,pOutputBuffer;
ULONG InputLength, OutputLength;
DEVICE_EXT *pDevExt;
PCIVME_INIT_COMMAND *pInitCommand;
PCIADA *pciada;
FILE_OBJ *file_obj = (FILE_OBJ *)Irp->Tail.Overlay.OriginalFileObject->FsContext;
KdPrint(("ioctl_deinit_hardware()\n"));
 
pDevExt = (DEVICE_EXT *)(device_Obj->DeviceExtension);
 
SET_BUFFERS_METHOD_BUFFERED;
 
// do what must be hier in between --- start ---
pInitCommand = (PCIVME_INIT_COMMAND *)pInputBuffer;
 
KdPrint(("ioctl_deinit_hardware(%d)\n", file_obj->uwAssociatedVMEMM));
 
pciada = pDevExt->vmemm[file_obj->uwAssociatedVMEMM];
 
if (pciada != NULL)
{
KIRQL oldIrql;
 
if (pciada->dwLinkCount == 1)
{
// lock other users out
KeAcquireSpinLock(&pciada->AccessLock, &oldIrql);
 
if (DeInitInterface(pInitCommand, pciada->pvVirtLcr, pciada->pvVirtIfr))
globalInterruptDisable(pciada);
else
Status = STATUS_UNSUCCESSFUL;
 
// everyone likes to have PCIVME
KeReleaseSpinLock(&pciada->AccessLock, oldIrql);
}
else
Status = STATUS_UNSUCCESSFUL;
}
else
Status = STATUS_UNSUCCESSFUL;
// do what must be hier in between --- end ---
 
COMPLETE_REQUEST;
 
KdPrint(("ioctl_deinit_hardware(), Status = 0x%08x\n", Status));
 
return Status;
}
 
//------------------------------------------------------------------------
// a dummy entry because of compatibiltiy (near) WIN95 driver
static NTSTATUS ioctl_dummy(PDEVICE_OBJECT device_Obj, PIRP Irp, PIO_STACK_LOCATION IrpStack)
{
NTSTATUS Status = STATUS_SUCCESS;
ULONG irp_info = 0;
PVOID pInputBuffer,pOutputBuffer;
ULONG InputLength, OutputLength;
PCIVME_INIT_COMMAND *pInitCommand;
FILE_OBJ *file_obj = (FILE_OBJ *)Irp->Tail.Overlay.OriginalFileObject->FsContext;
 
SET_BUFFERS_METHOD_BUFFERED;
UNREFERENCED_PARAMETER(device_Obj);
#ifndef _DEBUG
UNREFERENCED_PARAMETER(file_obj);
#endif
pInitCommand = (PCIVME_INIT_COMMAND *)pInputBuffer;
 
KdPrint(("ioctl_dummy(%d)\n", file_obj->uwAssociatedVMEMM));
 
// do what must be here in between -----------
// do what must be here in between --- end ---
 
COMPLETE_REQUEST;
 
KdPrint(("ioctl_dummy(), Status = 0x%08x\n", Status));
 
return Status;
}
 
//------------------------------------------------------------------------
// requests fixed unchangeable information - not compatible to WIN95 driver
static NTSTATUS ioctl_get_static_status(PDEVICE_OBJECT device_Obj, PIRP Irp, PIO_STACK_LOCATION IrpStack)
{
NTSTATUS Status = STATUS_SUCCESS;
ULONG irp_info = sizeof(PCIVME_STATIC_STATUS);
PVOID pInputBuffer,pOutputBuffer;
ULONG InputLength, OutputLength;
PCIADA *pciada;
DEVICE_EXT *pDevExt;
PCIVME_STATIC_STATUS *pStaticStatus;
FILE_OBJ *file_obj = (FILE_OBJ *)Irp->Tail.Overlay.OriginalFileObject->FsContext;
 
pDevExt = (DEVICE_EXT *)(device_Obj->DeviceExtension);
 
SET_BUFFERS_METHOD_BUFFERED;
 
KdPrint(("ioctl_get_static_status(%d)\n", file_obj->uwAssociatedVMEMM));
 
// do what must be here in between -----------
if (OutputLength >= sizeof(PCIVME_STATIC_STATUS))
{
pStaticStatus = (PCIVME_STATIC_STATUS *)pOutputBuffer;
 
pciada = pDevExt->vmemm[file_obj->uwAssociatedVMEMM];
 
pStaticStatus->dwInterface = file_obj->uwAssociatedVMEMM;
 
pStaticStatus->wNumMemWindows = 3;
pStaticStatus->wNumIOPorts = 2;
pStaticStatus->wNumIRQs = 1;
pStaticStatus->wNumDMAs = 0;
pStaticStatus->dwLinkCount = pciada->dwLinkCount;
 
pStaticStatus->wModuleType = pciada->wModuleType;
pStaticStatus->wFPGAVersion = pciada->wFPGAVersion;
pStaticStatus->wModuleNumber = pciada->wModuleNumber;
pStaticStatus->wWordMode = pciada->bWordMode;
 
pStaticStatus->wSysControl = pciada->bSysControl;
pStaticStatus->wConnected = pciada->bConnected;
pStaticStatus->pvLcr = pciada->pvPhysLcr;
pStaticStatus->pvIfr = pciada->pvPhysIfr;
pStaticStatus->dwDriverVersion = DRIVER_VERSION;
pStaticStatus->dwDriverVariant = DRIVER_VARIANT;
}
else
Status = STATUS_BUFFER_TOO_SMALL;
// do what must be here in between --- end ---
 
COMPLETE_REQUEST;
 
KdPrint(("ioctl_get_static_status(), Status = 0x%08x\n", Status));
 
return Status;
}
 
//------------------------------------------------------------------------
// requests changeable status
static NTSTATUS ioctl_get_dynamic_status(PDEVICE_OBJECT device_Obj, PIRP Irp, PIO_STACK_LOCATION IrpStack)
{
NTSTATUS Status = STATUS_SUCCESS;
ULONG irp_info = sizeof(PCIVME_DYNAMIC_STATUS);
PVOID pInputBuffer,pOutputBuffer;
ULONG InputLength, OutputLength;
PCIADA *pciada;
DEVICE_EXT *pDevExt;
PCIVME_DYNAMIC_STATUS *pDynamicStatus;
FILE_OBJ *file_obj = (FILE_OBJ *)Irp->Tail.Overlay.OriginalFileObject->FsContext;
 
SET_BUFFERS_METHOD_BUFFERED;
 
KdPrint(("ioctl_get_dynamic_status(%d)\n", file_obj->uwAssociatedVMEMM));
 
// do what must be here in between -----------
pDevExt = (DEVICE_EXT *)(device_Obj->DeviceExtension);
 
SET_BUFFERS_METHOD_BUFFERED;
 
KdPrint(("ioctl_get_static_status(%d)\n", file_obj->uwAssociatedVMEMM));
 
// do what must be here in between -----------
if (OutputLength >= sizeof(PCIVME_DYNAMIC_STATUS))
{
USHORT temp;
 
pDynamicStatus = (PCIVME_DYNAMIC_STATUS *)pOutputBuffer;
 
pciada = pDevExt->vmemm[file_obj->uwAssociatedVMEMM];
 
pDynamicStatus->dwInterface = file_obj->uwAssociatedVMEMM;
temp = READ_REGISTER_USHORT(pciada->pwCntrl);
pDynamicStatus->wVMEMM_enable = ((temp & 0x0180) == 0x0180) ? 1 : 0;
pDynamicStatus->wVMEMM_connected = ((temp & 0x0c00) == 0x0800) ? 1 : 0;
temp = READ_REGISTER_USHORT(pciada->pwIntCSR);
pDynamicStatus->wPCIADAIrq = (temp & 0x0004) ? 1 : 0;
pDynamicStatus->wVMEMMIrq = (temp & 0x0020) ? 1 : 0;
}
else
Status = STATUS_BUFFER_TOO_SMALL;
 
// do what must be here in between --- end ---
 
COMPLETE_REQUEST;
 
KdPrint(("ioctl_get_dynamic_status(), Status = 0x%08x\n", Status));
 
return Status;
}
 
//------------------------------------------------------------------------
// get the next vector out of the vector queue
static NTSTATUS ioctl_read_vector(PDEVICE_OBJECT device_Obj, PIRP Irp, PIO_STACK_LOCATION IrpStack)
{
NTSTATUS Status = STATUS_SUCCESS;
ULONG irp_info = sizeof(PCIVME_VECTOR_RESPONSE);
PVOID pInputBuffer,pOutputBuffer;
ULONG InputLength, OutputLength;
PCIVME_VECTOR_RESPONSE *pVectorResponse;
PCIVME_VECTOR_REQUEST *pVectorRequest;
FILE_OBJ *file_obj = (FILE_OBJ *)Irp->Tail.Overlay.OriginalFileObject->FsContext;
KIRQL oldIrql;
BOOLEAN bPoll;
USHORT wRequestCount;
 
SET_BUFFERS_METHOD_BUFFERED;
 
KdPrint(("ioctl_read_vector(%d)\n", file_obj->uwAssociatedVMEMM));
 
pVectorRequest = (PCIVME_VECTOR_REQUEST *)pInputBuffer;
pVectorResponse = (PCIVME_VECTOR_RESPONSE *)pOutputBuffer;
 
// check the available room for vectors and correct if too less
if (OutputLength <
(sizeof(PCIVME_VECTOR_RESPONSE) +
(pVectorRequest->wRequestCount - 1) * sizeof(UCHAR)))
pVectorRequest->wRequestCount =
(USHORT)OutputLength - sizeof(PCIVME_VECTOR_RESPONSE) + sizeof(UCHAR);
// empty the inputbuffer as early as possible
wRequestCount = pVectorRequest->wRequestCount;
bPoll = pVectorRequest->bPoll;
 
// do what must be here in between -----------
if (OutputLength >= sizeof(PCIVME_VECTOR_RESPONSE)) // at least room for one
{
UCHAR bNumberOfElements;
UCHAR *pbVector = &pVectorResponse->bStatusID;
 
pVectorResponse->dwInterface = file_obj->uwAssociatedVMEMM;
 
bNumberOfElements = (UCHAR) NumberOfElements(file_obj->pIrqListHandle);
 
if ((bNumberOfElements) || (bPoll))
{
KdPrint(("Direct return (%d)\n", bNumberOfElements));
 
pVectorResponse->wCount = 0;
while ((bNumberOfElements) && (wRequestCount--))
{
bNumberOfElements = (UCHAR) PullElement(file_obj->pIrqListHandle,
(void *)pbVector);
pbVector++;
pVectorResponse->wCount++;
}
pVectorResponse->wPendingCount = bNumberOfElements;
pVectorResponse->bOverflow = CheckAndClearOverflow(file_obj->pIrqListHandle);
irp_info = sizeof(PCIVME_VECTOR_RESPONSE) +
sizeof(UCHAR) * (pVectorResponse->wCount - 1);
}
else // go in wait queue for an irq
{
IoAcquireCancelSpinLock(&oldIrql);
 
if (Irp->Cancel) // cancel while doing
{
KdPrint(("Canceld return (%d)\n", bNumberOfElements));
Status = STATUS_CANCELLED;
}
else
{
KdPrint(("Blocking return (%d)\n", bNumberOfElements));
 
InsertIRPtoQueue(device_Obj, Irp);
 
Status = STATUS_PENDING;
 
// mark irp as pending and return
IoMarkIrpPending(Irp);
IoSetCancelRoutine(Irp, CancelRequest);
} // if (Irp->Cancel) ...
IoReleaseCancelSpinLock(oldIrql);
}
}
else
Status = STATUS_BUFFER_TOO_SMALL;
// do what must be here in between --- end ---
 
COMPLETE_REQUEST;
 
KdPrint(("ioctl_read_vector(), Status = 0x%08x\n", Status));
 
return Status;
}
 
//------------------------------------------------------------------------
// control or read the VIC68A on the VMEMM
static NTSTATUS ioctl_access_VIC68A(PDEVICE_OBJECT device_Obj, PIRP Irp, PIO_STACK_LOCATION IrpStack)
{
NTSTATUS Status = STATUS_SUCCESS;
ULONG irp_info = sizeof(PCIVME_VIC68A_ACTION);
PVOID pInputBuffer,pOutputBuffer;
ULONG InputLength, OutputLength;
PCIADA *pciada;
DEVICE_EXT *pDevExt;
PCIVME_VIC68A_ACTION *pVIC68A_action_in;
PCIVME_VIC68A_ACTION *pVIC68A_action_out;
FILE_OBJ *file_obj = (FILE_OBJ *)Irp->Tail.Overlay.OriginalFileObject->FsContext;
 
pDevExt = (DEVICE_EXT *)(device_Obj->DeviceExtension);
 
SET_BUFFERS_METHOD_BUFFERED;
 
KdPrint(("ioctl_access_VIC68A(%d)\n", file_obj->uwAssociatedVMEMM));
 
// do what must be here in between -----------
pVIC68A_action_in = (PCIVME_VIC68A_ACTION *)pInputBuffer;
pVIC68A_action_out = (PCIVME_VIC68A_ACTION *)pOutputBuffer;
 
if ((pVIC68A_action_in->wRegisterAddress <= (USHORT)SRR) &&
((pVIC68A_action_in->wRegisterAddress & 0x03) == 3) &&
(OutputLength >= sizeof(PCIVME_VIC68A_ACTION)))
{
PUCHAR pbAddress;
UCHAR bByte=0;
KIRQL oldIrql;
 
pciada = pDevExt->vmemm[file_obj->uwAssociatedVMEMM];
 
pVIC68A_action_out = pVIC68A_action_in; // copy it
pbAddress = (PUCHAR)((ULONG)(pciada->pvVirtIfr) + VICBASE + pVIC68A_action_in->wRegisterAddress);
// lock other users out
KeAcquireSpinLock(&pciada->AccessLock, &oldIrql);
 
switch(pVIC68A_action_in->wAccessMode)
{
case VIC68A_WRITE: WRITE_REGISTER_UCHAR(pbAddress, pVIC68A_action_in->bContent);
bByte = READ_REGISTER_UCHAR(pbAddress);
break;
case VIC68A_WRITE_ONLY:
WRITE_REGISTER_UCHAR(pbAddress, pVIC68A_action_in->bContent);
break;
case VIC68A_OR: bByte = READ_REGISTER_UCHAR(pbAddress);
bByte |= pVIC68A_action_in->bContent;
WRITE_REGISTER_UCHAR(pbAddress, bByte);
bByte = READ_REGISTER_UCHAR(pbAddress);
break;
case VIC68A_AND: bByte = READ_REGISTER_UCHAR(pbAddress);
bByte &= pVIC68A_action_in->bContent;
WRITE_REGISTER_UCHAR(pbAddress, bByte);
bByte = READ_REGISTER_UCHAR(pbAddress);
break;
default: Status = STATUS_ILLEGAL_INSTRUCTION;
case VIC68A_READ: bByte = READ_REGISTER_UCHAR(pbAddress);
break;
}
// free lock
KeReleaseSpinLock(&pciada->AccessLock, oldIrql);
 
pVIC68A_action_out->bContent = bByte;
}
else
Status = STATUS_ILLEGAL_INSTRUCTION;
// do what must be here in between --- end ---
 
COMPLETE_REQUEST;
 
KdPrint(("ioctl_access_VIC68A(), Status = 0x%08x\n", Status));
 
return Status;
}
 
 
//------------------------------------------------------------------------
// if the interrupt is disabled for a blocking path, cancel the block
static void ReleaseBlockingIrp(PDEVICE_OBJECT device_Obj, PCIADA *pciada, PFILE_OBJ pFile_obj)
{
NTSTATUS Status = STATUS_CANCELLED;
PIRP Irp;
KIRQL oldIrqlCancel;
KIRQL oldIrqlList;
 
// beware off damage due to intercept with cancel of thread
IoAcquireCancelSpinLock(&oldIrqlCancel);
KeAcquireSpinLock(&pciada->IrqListLock, &oldIrqlList);
 
// get my associated packet
Irp = RemoveIRPfromQueue(device_Obj, pFile_obj);
 
if (Irp != (PIRP)NULL)
{
PCIVME_VECTOR_REQUEST *pVectorRequest = (PCIVME_VECTOR_REQUEST *)(Irp->AssociatedIrp.SystemBuffer);
PCIVME_VECTOR_RESPONSE *pVectorResponse = (PCIVME_VECTOR_RESPONSE *)pVectorRequest;
ULONG irp_info = sizeof(PCIVME_VECTOR_RESPONSE);
 
// pull the vectors off the fifo
pVectorResponse->wCount = 0;
pVectorResponse->wPendingCount = 0;
pVectorResponse->bOverflow = FALSE;
irp_info = sizeof(PCIVME_VECTOR_RESPONSE);
 
// release the cancel routine from this Irp
IoSetCancelRoutine(Irp, NULL);
 
COMPLETE_REQUEST;
}
 
// release the spin locks
KeReleaseSpinLock(&pciada->IrqListLock, oldIrqlList);
IoReleaseCancelSpinLock(oldIrqlCancel);
}
 
 
//------------------------------------------------------------------------
// switch the filling of the interrupt vector queue on or off, check the queue
static NTSTATUS ioctl_control_interrupts(PDEVICE_OBJECT device_Obj, PIRP Irp, PIO_STACK_LOCATION IrpStack)
{
NTSTATUS Status = STATUS_SUCCESS;
ULONG irp_info = sizeof(PCIVME_IRQ_CONTROL);
PVOID pInputBuffer,pOutputBuffer;
ULONG InputLength, OutputLength;
PCIADA *pciada;
DEVICE_EXT *pDevExt;
PCIVME_IRQ_CONTROL *pIrqControlIn;
PCIVME_IRQ_CONTROL *pIrqControlOut;
PFILE_OBJ pFile_obj = (PFILE_OBJ)Irp->Tail.Overlay.OriginalFileObject->FsContext;
 
pDevExt = (DEVICE_EXT *)(device_Obj->DeviceExtension);
 
SET_BUFFERS_METHOD_BUFFERED;
 
KdPrint(("ioctl_control_interrupts(%d)\n", pFile_obj->uwAssociatedVMEMM));
 
pIrqControlIn = (PCIVME_IRQ_CONTROL *)pInputBuffer;
pIrqControlOut = (PCIVME_IRQ_CONTROL *)pOutputBuffer;
 
pciada = pDevExt->vmemm[pFile_obj->uwAssociatedVMEMM];
 
// do what must be here in between -----------
if (pIrqControlIn->wEnable)
{
Status = insertQueueInList(pFile_obj, pciada);
if (!pciada->nInterruptHandlers)
{
KdPrint(("Interrupts enabled.\n"));
 
globalInterruptEnable(pciada);
pciada->nInterruptHandlers++;
}
}
else
{
if (pciada->nInterruptHandlers <= 1)
{
KdPrint(("Interrupts disabled.\n"));
 
globalInterruptDisable(pciada);
pciada->nInterruptHandlers = 0;
}
 
Status = removeQueueFromList(pFile_obj, pciada);
ReleaseBlockingIrp(device_Obj, pciada, pFile_obj);
}
 
// give back if the user grants space
if (OutputLength >= sizeof(PCIVME_IRQ_CONTROL))
{
pIrqControlOut->dwInterface = pFile_obj->uwAssociatedVMEMM;
pIrqControlOut->wEnable = pFile_obj->bQueueIrq;
}
// do what must be here in between --- end ---
 
COMPLETE_REQUEST;
 
KdPrint(("ioctl_control_interrupts(), Status = 0x%08x\n", Status));
 
return Status;
}
 
//------------------------------------------------------------------------
// generate a uninterruptible read-modify-write cycle
static NTSTATUS ioctl_TAS(PDEVICE_OBJECT device_Obj, PIRP Irp, PIO_STACK_LOCATION IrpStack)
{
NTSTATUS Status = STATUS_SUCCESS;
ULONG irp_info = sizeof(PCIVME_TAS_STRUCT);
PVOID pInputBuffer,pOutputBuffer;
ULONG InputLength, OutputLength;
PCIADA *pciada;
DEVICE_EXT *pDevExt;
FILE_OBJ *file_obj = (FILE_OBJ *)Irp->Tail.Overlay.OriginalFileObject->FsContext;
KIRQL oldIrql;
UCHAR tempContent;
PBOOLEAN pbPrevBusError;
PVOID pvPartialAdr;
 
pDevExt = (DEVICE_EXT *)(device_Obj->DeviceExtension);
 
SET_BUFFERS_METHOD_BUFFERED;
KdPrint(("ioctl_TAS(%d)\n", file_obj->uwAssociatedVMEMM));
 
// do what must be here in between -----------
if (OutputLength >= sizeof(PCIVME_TAS_STRUCT))
{
PCIVME_TAS_STRUCT *pTAS_struct_in;
PCIVME_TAS_STRUCT *pTAS_struct_out;
USHORT csr; // storage for old csr content
ULONG pageAddress; // intermediate for the page register content
UCHAR bAddressModifier;
 
pTAS_struct_in = (PCIVME_TAS_STRUCT *)pInputBuffer;
pTAS_struct_out = (PCIVME_TAS_STRUCT *)pOutputBuffer;
 
pTAS_struct_out = pTAS_struct_in;
pTAS_struct_out->dwInterface = file_obj->uwAssociatedVMEMM;
pciada = pDevExt->vmemm[file_obj->uwAssociatedVMEMM];
 
// take the file_obj associated modifier if greater than ...
bAddressModifier = (pTAS_struct_in->wModifier > 63) ?
file_obj->bAddressModifier : (UCHAR)pTAS_struct_in->wModifier;
// lock other users out
KeAcquireSpinLock(&pciada->AccessLock, &oldIrql);
 
// check for modifier (and set if needed)
if (pciada->bModifier != bAddressModifier)
{
WRITE_REGISTER_UCHAR(pciada->pbModifier, bAddressModifier);
pciada->bModifier = bAddressModifier;
}
// check for page address (and set if needed)
pageAddress = pTAS_struct_in->dwAddress & ~VME_ADR_MASK;
if (pageAddress != pciada->dwVMEPage)
{
WRITE_REGISTER_ULONG(pciada->pdwVMEAdr, pageAddress);
pciada->dwVMEPage = pageAddress;
}
// save VMEMM csr register and prepare for read modify write
csr = READ_REGISTER_USHORT(pciada->pwCSR);
WRITE_REGISTER_USHORT(pciada->pwCSR, (USHORT)(csr | FLAG_RMC));
 
// prepare the TAS
tempContent = pTAS_struct_in->bContent; // in and out point to same buffer
pvPartialAdr = (PVOID)((PUCHAR)pciada->pvVME + (pTAS_struct_in->dwAddress & VME_ADR_MASK));
 
// get prepared for bus errors
file_obj->bBusError = FALSE;
pbPrevBusError = ExchangePointer(&pciada->pbBusError, &file_obj->bBusError);
 
// do the TAS
readByte(&pTAS_struct_out->bContent , 1, pvPartialAdr);
writeByte(pvPartialAdr , 1, &tempContent);
readByte(&tempContent , 1, pvPartialAdr); // to overcome write on ..
 
// restore csr
WRITE_REGISTER_USHORT(pciada->pwCSR, csr);
 
// release the lock
KeReleaseSpinLock(&pciada->AccessLock, oldIrql);
ExchangePointer(&pciada->pbBusError, pbPrevBusError);
if (file_obj->bBusError) Status = STATUS_ACCESS_VIOLATION;
}
else
Status = STATUS_BUFFER_TOO_SMALL;
 
// do what must be here in between --- end ---
 
COMPLETE_REQUEST;
 
KdPrint(("ioctl_TAS(), Status = 0x%08x\n", Status));
 
return Status;
}
 
//------------------------------------------------------------------------
// make a VME reset
static NTSTATUS ioctl_reset(PDEVICE_OBJECT device_Obj, PIRP Irp, PIO_STACK_LOCATION IrpStack)
{
NTSTATUS Status = STATUS_SUCCESS;
ULONG irp_info = sizeof(PCIVME_RESET_RESULT);
PVOID pInputBuffer,pOutputBuffer;
ULONG InputLength, OutputLength;
DEVICE_EXT *pDevExt;
FILE_OBJ *file_obj = (FILE_OBJ *)Irp->Tail.Overlay.OriginalFileObject->FsContext;
 
pDevExt = (DEVICE_EXT *)(device_Obj->DeviceExtension);
 
SET_BUFFERS_METHOD_BUFFERED;
 
KdPrint(("ioctl_reset(%d)\n", file_obj->uwAssociatedVMEMM));
 
// do what must be here in between -----------
if (OutputLength >= sizeof(PCIVME_RESET_RESULT))
{
PCIVME_RESET_RESULT *pResetResult = (PCIVME_RESET_RESULT *)pOutputBuffer;
PCIVME_RESET_COMMAND *pResetCommand = (PCIVME_RESET_COMMAND *)pInputBuffer;
PCIADA *pciada = pDevExt->vmemm[file_obj->uwAssociatedVMEMM];
USHORT wIRQStatus;
USHORT wControl;
UCHAR *pbReset;
KIRQL oldIrql;
 
// set default result return size and contents
pResetResult->dwInterface = file_obj->uwAssociatedVMEMM;
if (pciada->dwLinkCount == 1)
{
// lock other users out
KeAcquireSpinLock(&pciada->AccessLock, &oldIrql);
 
// am I connected and switched on??
if ((READ_REGISTER_USHORT(pciada->pwCntrl) & 0x0980) == 0x0980)
{
// do command
switch (pResetCommand->wCommand)
{
case POLL_RESET_CMD:
break;
case VME_RESET_CMD:
WRITE_REGISTER_UCHAR(pciada->pbModifier, 0);
pbReset = (UCHAR *)((UCHAR *)pciada->pvVirtIfr +
(ULONG)VICBASE + (ULONG)SRR);
WRITE_REGISTER_UCHAR(pbReset, 0xf0); // make VME reset
break;
case LOCAL_RESET_CMD:
WRITE_REGISTER_UCHAR(pciada->pbModifier, 0);
WRITE_REGISTER_USHORT(pciada->pwIRQStat, LOCAL_RESET);
break;
case GLOBAL_RESET_CMD:
WRITE_REGISTER_UCHAR(pciada->pbModifier, 0);
WRITE_REGISTER_USHORT(pciada->pwIRQStat, GLOBAL_RESET);
break;
 
default: Status = STATUS_ILLEGAL_INSTRUCTION;
}
 
// save IRQ status of PCIADA and switch off PCIADA interrupts
wIRQStatus = READ_REGISTER_USHORT(pciada->pwIntCSR);
WRITE_REGISTER_USHORT(pciada->pwIntCSR, (USHORT)(wIRQStatus & ~0x0040));
// always poll reset status - access will sometimes generate PCIADA #2 interrupt
pResetResult->wResult = READ_REGISTER_UCHAR(pciada->pbModifier);
 
// reset any pending PCIADA interrupt #2
wControl = READ_REGISTER_USHORT(pciada->pwCntrl);
WRITE_REGISTER_USHORT(pciada->pwCntrl, (USHORT)(wControl & ~0x0100));
WRITE_REGISTER_USHORT(pciada->pwCntrl, wControl);
// restore IRQStatus
WRITE_REGISTER_USHORT(pciada->pwIntCSR, wIRQStatus);
 
}
else
Status = STATUS_ALREADY_DISCONNECTED;
 
// get other users free entry
KeReleaseSpinLock(&pciada->AccessLock, oldIrql);
}
else
Status = STATUS_UNSUCCESSFUL;
}
else
Status = STATUS_BUFFER_TOO_SMALL;
// do what must be here in between --- end ---
 
COMPLETE_REQUEST;
 
KdPrint(("ioctl_reset(), Status = 0x%08x\n", Status));
 
return Status;
}
 
//------------------------------------------------------------------------
// set parameter for this path for future access to VME
static NTSTATUS ioctl_access_para(PDEVICE_OBJECT device_Obj, PIRP Irp, PIO_STACK_LOCATION IrpStack)
{
NTSTATUS Status = STATUS_SUCCESS;
ULONG irp_info = 0;
PVOID pInputBuffer,pOutputBuffer;
ULONG InputLength, OutputLength;
PCIVME_ACCESS_COMMAND *pAccessPara;
FILE_OBJ *file_obj = (FILE_OBJ *)Irp->Tail.Overlay.OriginalFileObject->FsContext;
DEVICE_EXT *pDevExt = (DEVICE_EXT *)(device_Obj->DeviceExtension);
PCIADA *pciada = pDevExt->vmemm[file_obj->uwAssociatedVMEMM];
 
SET_BUFFERS_METHOD_BUFFERED;
 
KdPrint(("ioctl_access_para(%d)\n", file_obj->uwAssociatedVMEMM));
pAccessPara = (PCIVME_ACCESS_COMMAND *)pInputBuffer;
 
// do here in between what has to be done -----------------
file_obj->bAddressModifier = pAccessPara->bAddressModifier & MODIFIER_MASK;
file_obj->bAccessType = pAccessPara->bAccessType;
file_obj->bIncrement = pAccessPara->bIncrement;
file_obj->dwAddressMask = pAccessPara->bAccessType - 1;
 
// honor backward compatibility
if (file_obj->bAddressModifier & 0x30)
file_obj->dwAccessBase = 0;
else
file_obj->dwAccessBase = pAccessPara->dwAccessBase;
 
// access_type increment
// 1 0,1,2,3,4
// 2 0,2,4
// 4 0,4
 
if (pAccessPara->bIncrement % pAccessPara->bAccessType)
Status = STATUS_DATATYPE_MISALIGNMENT;
 
switch (pAccessPara->bAccessType)
{
case BYTE_ACCESS: file_obj->fRead = readByte;
file_obj->fWrite = writeByte;
break;
case WORD_ACCESS: file_obj->fRead = readWord;
file_obj->fWrite = writeWord;
break;
case LONG_ACCESS: if (pciada->bWordMode)
{
file_obj->fRead = readWord;
file_obj->fWrite = writeWord;
}
else
{
file_obj->fRead = readLong;
file_obj->fWrite = writeLong;
}
break;
default: Status = STATUS_UNSUCCESSFUL; break;
}
// do here in between what has to be done end -------------
 
COMPLETE_REQUEST;
 
KdPrint(("ioctl_access_para(), Status = 0x%08x\n", Status));
 
return Status;
}
 
//------------------------------------------------------------------------
// the ultimate jumptable for ioctl
//
NTSTATUS (*ioctl[])(PDEVICE_OBJECT device_Obj, PIRP Irp, PIO_STACK_LOCATION IrpStack) =
{
ioctl_init_hardware, // 0
ioctl_deinit_hardware, // 1
ioctl_dummy, // 2
ioctl_dummy, // 3
ioctl_get_static_status, // 4
ioctl_get_dynamic_status, // 5
ioctl_read_vector, // 6
ioctl_access_VIC68A, // 7
ioctl_dummy, // 8
ioctl_control_interrupts, // 9
ioctl_TAS, // 10
ioctl_dummy, // 11
ioctl_reset, // 12
ioctl_access_para // 13
};
 
/wiener_pcivme/pcivme/SOURCE/pcivme_v.h
0,0 → 1,48
#ifndef __PCIVME_V_H__
#define __PCIVME_V_H__
//-------------------------------------------------------------------------
// WINNT driver for PCIVME interface from ARW Elektronik, Germany ---------
// header file belonging to pcivme_v.c
//
// (c) 1999-2004 ARW Elektronik
//
// this source code is published under GPL (Open Source). You can use, redistrubute and
// modify it unless this header is not modified or deleted. No warranty is given that
// this software will work like expected.
// This product is not authorized for use as critical component in life support systems
// wihout the express written approval of ARW Elektronik Germany.
//
// Please announce changes and hints to ARW Elektronik
//
// $Log: pcivme_v.h,v $
// Revision 1.3 2004/07/24 07:07:26 klaus
// Update copyright to 2004
//
// Revision 1.2 2003/11/15 19:12:51 klaus
// Update copyright to 2003
//
// Revision 1.1.1.1 2003/11/14 23:16:33 klaus
// First put into repository
//
// Revision 1.3 2002/10/27 16:17:48 klaus
// Typing bug fixed caused at log addition
//
// Revision 1.2 2002/10/27 16:11:03 klaus
// Added CVS log into header
//
// what who when
// started AR 02.07.99
// changed resource allocation caused by WIN2000 AR 08.06.2002
//
 
//-------------------------------------------------------------------------
// DEFINES
//
 
//-------------------------------------------------------------------------
// PROTOTYPES
//
NTSTATUS PCIVMEScanVMEMM(PDEVICE_OBJECT deviceObj);
NTSTATUS PCIVMEDeInitPCIADAs(PDEVICE_OBJECT deviceObj);
 
#endif // __PCIVME_V_H__
/wiener_pcivme/pcivme/SOURCE/pcivme_io.h
0,0 → 1,53
#ifndef __PCIVME_IO_H__
#define __PCIVME_IO_H__
//-------------------------------------------------------------------------
// WINNT driver for PCIVME interface from ARW Elektronik, Germany ---------
// the ioctl functions header file
//
// (c) 1999-2004 ARW Elektronik
//
// this source code is published under GPL (Open Source). You can use, redistrubute and
// modify it unless this header is not modified or deleted. No warranty is given that
// this software will work like expected.
// This product is not authorized for use as critical component in life support systems
// wihout the express written approval of ARW Elektronik Germany.
//
// Please announce changes and hints to ARW Elektronik
// ntddk.h must included first!
//
// $Log: pcivme_io.h,v $
// Revision 1.3 2004/07/24 07:07:26 klaus
// Update copyright to 2004
//
// Revision 1.2 2003/11/15 19:12:51 klaus
// Update copyright to 2003
//
// Revision 1.1.1.1 2003/11/14 23:16:33 klaus
// First put into repository
//
// Revision 1.3 2002/10/27 16:17:48 klaus
// Typing bug fixed caused at log addition
//
// Revision 1.2 2002/10/27 16:11:02 klaus
// Added CVS log into header
//
// what who when
// started AR 03.07.99
// changed resource allocation caused by WIN2000 AR 08.06.2002
//
 
 
//------------------------------------------------------------------------
// FUNCTIONS + EXTERNALS
//
NTSTATUS (*ioctl[])(PDEVICE_OBJECT device_Obj, PIRP irp, PIO_STACK_LOCATION IrpStack);
void fMyDefferedRoutine(PKDPC Dpc, PVOID pvDevice_object, PVOID pvPciada, PVOID Nothing);
void CancelRequest(PDEVICE_OBJECT device_Obj, PIRP Irp);
NTSTATUS removeQueueFromList(PFILE_OBJ pFile_obj, PCIADA *pciada);
 
void InsertIRPtoQueue(PDEVICE_OBJECT device_Obj, PIRP Irp);
PIRP RemoveIRPfromQueue(PDEVICE_OBJECT device_Obj, FILE_OBJ *pFile_obj);
PIRP RemoveIRPfromQueueByIrp(PDEVICE_OBJECT device_Obj, PIRP pIrpIn);
 
 
#endif // __PCIVME_IO_H__
/wiener_pcivme/pcivme/SOURCE/pcivme.plg
0,0 → 1,52
<html>
<body>
<pre>
<h1>Erstellungsprotokoll</h1>
<h3>
--------------------Konfiguration: pcivme - Win32 Release--------------------
</h3>
<h3>Befehlszeilen</h3>
Erstellen der temporären Datei "E:\DOKUME~1\klaus\LOKALE~1\Temp\RSP73.tmp" mit Inhalten
[
/nologo /Gz /ML /W3 /Gi /O2 /I "D:\DDK\inc" /I "." /D "NDEBUG" /D DBG=0 /D "_X86_" /D _WIN32_WINNT=0x500 /FR"Release/" /Fp"Release/pcivme.pch" /YX /Fo"Release/" /Fd"Release/" /FD /Gs -GF /c
"E:\Work\projects\pcivme\pcivme_drv.c"
"E:\Work\projects\pcivme\pcivme_fifo.c"
"E:\Work\projects\pcivme\pcivme_i.c"
"E:\Work\projects\pcivme\pcivme_io.c"
"E:\Work\projects\pcivme\pcivme_v.c"
]
Creating command line "cl.exe @E:\DOKUME~1\klaus\LOKALE~1\Temp\RSP73.tmp"
Erstellen der temporären Datei "E:\DOKUME~1\klaus\LOKALE~1\Temp\RSP74.tmp" mit Inhalten
[
int64.lib ntoskrnl.lib hal.lib /nologo /base:"0x10000" /entry:"DriverEntry" /incremental:no /pdb:"Release/pcivme.pdb" /machine:I386 /nodefaultlib /out:"Release\pcivme.SYS" /libpath:"D:\DDK\lib\i386\free" -driver -subsystem:NATIVE,4.00
.\Release\pcivme_drv.obj
.\Release\pcivme_fifo.obj
.\Release\pcivme_i.obj
.\Release\pcivme_io.obj
.\Release\pcivme_v.obj
]
Erstellen der Befehlzeile "link.exe @E:\DOKUME~1\klaus\LOKALE~1\Temp\RSP74.tmp"
Erstellen der temporären Datei "E:\DOKUME~1\klaus\LOKALE~1\Temp\RSP75.bat" mit Inhalten
[
@echo off
copy .\Release\pcivme.SYS E:\WINNT\System32\Drivers\*.*
]
Erstellen der Befehlzeile "E:\DOKUME~1\klaus\LOKALE~1\Temp\RSP75.bat"
Kompilierung läuft...
pcivme_drv.c
pcivme_fifo.c
pcivme_i.c
pcivme_io.c
pcivme_v.c
Linker-Vorgang läuft...
<h3>Ausgabefenster</h3>
Copying Driver to System32\Drivers
1 Datei(en) kopiert.
 
 
 
<h3>Ergebnisse</h3>
pcivme.SYS - 0 Fehler, 0 Warnung(en)
</pre>
</body>
</html>
/wiener_pcivme/pcivme/SOURCE/Vic.h
0,0 → 1,116
#ifndef __VIC_H__
#define __VIC_H__
 
//------------------------------------------------------------------------------------------
// vic.h - some constants about the VIC68A chip from cypress semiconductor
//
// (c) 1999-2004 ARW Elektronik
//
// this source code is published under GPL (Open Source). You can use, redistrubute and
// modify it unless this header is not modified or deleted. No warranty is given that
// this software will work like expected.
// This product is not authorized for use as critical component in life support systems
// wihout the express written approval of ARW Elektronik Germany.
//
// Please announce changes and hints to ARW Elektronik
//
//
// $Log: Vic.h,v $
// Revision 1.3 2004/07/24 07:07:26 klaus
// Update copyright to 2004
//
// Revision 1.2 2003/11/15 19:12:51 klaus
// Update copyright to 2003
//
// Revision 1.1.1.1 2003/11/14 23:16:33 klaus
// First put into repository
//
// Revision 1.3 2002/10/27 16:17:48 klaus
// Typing bug fixed caused at log addition
//
// Revision 1.2 2002/10/27 16:11:03 klaus
// Added CVS log into header
//
// what who when
// finished first release to use with the PCIVME interface of ARW AR 24.11.1997
// SRR corrected from SSR AR 18.04.1999
//
 
/* all address offsets relative to vic base */
 
#define VICR1 (WORD)0x07 /* VMEbus Interrupt Control Register #.. */
#define VICR2 (WORD)0x0b
#define VICR3 (WORD)0x0f
#define VICR4 (WORD)0x13
#define VICR5 (WORD)0x17
#define VICR6 (WORD)0x1b
#define VICR7 (WORD)0x1f
 
#define LICR1 (WORD)0x27 /* Local interrupt control register .. */
#define LICR2 (WORD)0x2b
#define LICR3 (WORD)0x2f
#define LICR4 (WORD)0x33
#define LICR5 (WORD)0x37
#define LICR6 (WORD)0x3b
#define LICR7 (WORD)0x3f
#define LIVBR (WORD)0x57 /* Local interrupt vector base register */
 
#define ICGSICR (WORD)0x43 /* ICGS interrupt control register */
#define ICGSVBR (WORD)0x4f /* ICGS vector base register */
 
#define ICMSICR (WORD)0x47 /* ICMS interrupt control register */
#define ICMSVBR (WORD)0x53 /* ICMS vector base register */
 
#define EGICR (WORD)0x4b /* Error group interrupt control register */
#define EGIVBR (WORD)0x5b /* Error group interrupt vector base rg */
 
#define ICSR (WORD)0x5f /* Interprozessor communication switch rg */
#define ICR0 (WORD)0x63
#define ICR1 (WORD)0x67
#define ICR2 (WORD)0x6b
#define ICR3 (WORD)0x6f
#define ICR4 (WORD)0x73
#define ICR5 (WORD)0x77
#define ICR6 (WORD)0x7b
#define ICR7 (WORD)0x7f
 
#define VIICR (WORD)0x03 /* VMEbus Interrupter Interrupt Control */
#define VIRSR (WORD)0x83 /* VMEbus interrupt request status reg */
#define VIVR1 (WORD)0x87 /* VMEbus interrupt vector register .. */
#define VIVR2 (WORD)0x8b
#define VIVR3 (WORD)0x8f
#define VIVR4 (WORD)0x93
#define VIVR5 (WORD)0x97
#define VIVR6 (WORD)0x9b
#define VIVR7 (WORD)0x9f
 
#define TTR (WORD)0xa3 /* transfer timeout register */
#define LTR (WORD)0xa7 /* local timing register */
#define ICR (WORD)0xaf /* interface configuration register */
 
#define ARCR (WORD)0xb3 /* arbiter/requester configuration register*/
#define AMSR (WORD)0xb7 /* address modifier source register */
#define BESR (WORD)0xbb /* bus error source register */
 
#define DSICR (WORD)0x23 /* DMA status interrupt control register */
#define DSR (WORD)0xbf /* DMA status register */
 
#define SSCR00 (WORD)0xc3 /* slave select 0 control register 0 */
#define SSCR01 (WORD)0xc7 /* slave select 0 control register 1 */
#define SSCR10 (WORD)0xcb /* slave select 1 control register 0 */
#define SSCR11 (WORD)0xcf /* slave select 1 control register 1 */
 
#define RCR (WORD)0xd3 /* release control register */
 
#define BTDR (WORD)0xab /* block transfer definition register */
#define BTCR (WORD)0xd7 /* block transfer control register */
#define BTLR0 (WORD)0xdb /* block transfer length register 0 */
#define BTLR1 (WORD)0xdf /* block transfer length register 1 */
 
#define SRR (WORD)0xe3 /* system reset register */
 
#endif
 
//-------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------
/wiener_pcivme/pcivme/SOURCE/pcivme_fifo.c
0,0 → 1,188
//-------------------------------------------------------------------------
// WINNT driver for PCIVME interface from ARW Elektronik, Germany ---------
// functions for a fast fifo (first in first out) implementation
//
// (c) 1999-2004 ARW Elektronik
//
// this source code is published under GPL (Open Source). You can use, redistrubute and
// modify it unless this header is not modified or deleted. No warranty is given that
// this software will work like expected.
// This product is not authorized for use as critical component in life support systems
// wihout the express written approval of ARW Elektronik Germany.
//
// Please announce changes and hints to ARW Elektronik
//
// $Log: pcivme_fifo.c,v $
// Revision 1.3 2004/07/24 07:07:26 klaus
// Update copyright to 2004
//
// Revision 1.2 2003/11/15 19:12:50 klaus
// Update copyright to 2003
//
// Revision 1.1.1.1 2003/11/14 23:16:33 klaus
// First put into repository
//
// Revision 1.3 2002/10/27 16:17:48 klaus
// Typing bug fixed caused at log addition
//
// Revision 1.2 2002/10/27 16:11:02 klaus
// Added CVS log into header
//
// what who when
// started AR 06.10.1999
// first release 1.0 AR 17.10.1999
//
 
//-------------------------------------------------------------------------
// INCLUDES
//
#include <ntddk.h>
#include <pcivme_fifo.h>
 
//------------------------------------------------------------------------
// DEFINES
//
 
//------------------------------------------------------------------------
// TYPEDEFS
//
typedef struct
{
USHORT wLevel; // actual Number of Elements
UCHAR *pbBegin; // points to begin of the buffer
UCHAR *pbEnd; // points to the (end of the buffer + 1)
UCHAR *pbWrite; // next write here
UCHAR *pbRead; // next read (if any) here
KSPIN_LOCK Lock; // to guard access to the fifo
BOOLEAN bOverflow; // indicates a overflow to that FIFO
} FIFO_MANAGER;
 
 
//------------------------------------------------------------------------
// FUNCTIONS
//
 
// the global functions to manage the fifo
// first: init the fifo and allocate nonpaged memory
NTSTATUS InitializeFIFO(USHORT CountOfElements, PVOID *pHandle)
{
ULONG allocSize;
register FIFO_MANAGER *fifo_manager;
*pHandle = NULL;
allocSize = sizeof(FIFO_MANAGER) + sizeof(UCHAR) * CountOfElements + 16; // cause alignment
 
*pHandle = ExAllocatePool(NonPagedPool, allocSize);
if(*pHandle == NULL) return STATUS_NO_MEMORY;
RtlZeroMemory(*pHandle, allocSize);
 
fifo_manager = (FIFO_MANAGER *)*pHandle;
 
// init the fifo_manager
KeInitializeSpinLock(&fifo_manager->Lock);
fifo_manager->wLevel = 0;
fifo_manager->bOverflow = FALSE;
fifo_manager->pbBegin = (UCHAR *)(((ULONG)(fifo_manager + 1) + 8) & ~7); //align
fifo_manager->pbEnd = (UCHAR *)((ULONG)fifo_manager->pbBegin + sizeof(UCHAR) * CountOfElements);
fifo_manager->pbWrite =
fifo_manager->pbRead = fifo_manager->pbBegin;
 
// KdPrint(("fifo_manager: 0x%08x, begin: 0x%08x, end: 0x%08x\n",
// fifo_manager, fifo_manager->pbBegin, fifo_manager->pbEnd));
 
return STATUS_SUCCESS;
}
 
// second: push elements to the FIFO
int PushElement(PVOID Handle, UCHAR bElement)
{
register FIFO_MANAGER *fifo_manager = (FIFO_MANAGER *)Handle;
KIRQL oldIrql;
 
KeAcquireSpinLock(&fifo_manager->Lock, &oldIrql);
if ((fifo_manager->wLevel) && (fifo_manager->pbWrite == fifo_manager->pbRead))
{
KeReleaseSpinLock(&fifo_manager->Lock, oldIrql);
return fifo_manager->wLevel;
}
 
*(fifo_manager->pbWrite)++ = bElement;
 
// wrap around
if (fifo_manager->pbWrite >= fifo_manager->pbEnd)
fifo_manager->pbWrite = fifo_manager->pbBegin;
 
// check for overflow - indicate - and reset pointer to same before
if (fifo_manager->pbWrite == fifo_manager->pbRead)
{
fifo_manager->bOverflow = TRUE;
fifo_manager->pbWrite--;
if (fifo_manager->pbWrite < fifo_manager->pbBegin)
fifo_manager->pbWrite = fifo_manager->pbEnd - 1;
}
else
(fifo_manager->wLevel)++;
 
KeReleaseSpinLock(&fifo_manager->Lock, oldIrql);
 
return fifo_manager->wLevel;
}
 
// third: pull elements from the FIFO
int PullElement(PVOID Handle, UCHAR *pbElement)
{
register FIFO_MANAGER *fifo_manager = (FIFO_MANAGER *)Handle;
KIRQL oldIrql;
 
if (!(fifo_manager->wLevel)) return 0;
 
KeAcquireSpinLock(&fifo_manager->Lock, &oldIrql);
 
if (fifo_manager->wLevel)
{
*pbElement = *(fifo_manager->pbRead)++;
(fifo_manager->wLevel)--;
}
else
*pbElement = 0; // the caller tries to get more than available?
 
// wrap around
if (fifo_manager->pbRead >= fifo_manager->pbEnd)
fifo_manager->pbRead = fifo_manager->pbBegin;
 
KeReleaseSpinLock(&fifo_manager->Lock, oldIrql);
 
return fifo_manager->wLevel;
}
 
// test how many elements are in the FIFO
int NumberOfElements(PVOID Handle)
{
register FIFO_MANAGER *fifo_manager = (FIFO_MANAGER *)Handle;
 
return fifo_manager->wLevel;
}
 
// check and clear the overflow flag
BOOLEAN CheckAndClearOverflow(PVOID Handle)
{
register FIFO_MANAGER *fifo_manager = (FIFO_MANAGER *)Handle;
KIRQL oldIrql;
BOOLEAN helper;
KeAcquireSpinLock(&fifo_manager->Lock, &oldIrql);
helper = fifo_manager->bOverflow;
fifo_manager->bOverflow = FALSE;
KeReleaseSpinLock(&fifo_manager->Lock, oldIrql);
 
return helper;
}
 
// close the FIFO and free the allocated memory
void DestroyFIFO(PVOID Handle)
{
if (Handle != NULL) ExFreePool(Handle);
}
 
 
/wiener_pcivme/pcivme/SOURCE/pcivme.h
0,0 → 1,289
#ifndef __PCIVME_H__
#define __PCIVME_H__
//-------------------------------------------------------------------------
// WINNT driver for PCIVME interface from ARW Elektronik, Germany ---------
// IO definitions and common data structures between application and driver
//
// (c) 1999-2004 ARW Elektronik
//
// this source code is published under GPL (Open Source). You can use, redistrubute and
// modify it unless this header is not modified or deleted. No warranty is given that
// this software will work like expected.
// This product is not authorized for use as critical component in life support systems
// wihout the express written approval of ARW Elektronik Germany.
//
// Please announce changes and hints to ARW Elektronik
//
// $Log: pcivme.h,v $
// Revision 1.3 2004/07/24 07:07:26 klaus
// Update copyright to 2004
//
// Revision 1.2 2003/11/15 19:12:50 klaus
// Update copyright to 2003
//
// Revision 1.1.1.1 2003/11/14 23:16:33 klaus
// First put into repository
//
// Revision 1.4 2002/10/27 17:02:30 klaus
// File addressing bug > 2 Gbtye circumvent
//
// Revision 1.3 2002/10/27 16:17:48 klaus
// Typing bug fixed caused at log addition
//
// Revision 1.2 2002/10/27 16:11:02 klaus
// Added CVS log into header
//
// what who when
// started AR 15.06.99
//
 
//-------------------------------------------------------------------------
// INCLUDES
//
// #include <devioctl.h> must be declared before inclusion when used for driver
// #include <winioctl.h> must be declared before inclusion when used for applications
 
//-------------------------------------------------------------------------
// DEFINES
//
 
// to get a compatible view to WIN95 driver
#define USER_CONTROL_CODE(x) (0x800 + x)
// initialise a dedicated VMEMM hardware
#define PCIVME_INIT_HARDWARE CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(0),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
 
// de-initialise a dedicated VMEMM hardware
#define PCIVME_DEINIT_HARDWARE CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(1),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
 
// get a static status info from a dedicted VMEMM+PCIADA hardware
#define PCIVME_GET_STATIC_STATUS CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(4),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
 
// get dynamically changing status from PCIADA+VMEMM
#define PCIVME_GET_DYNAMIC_STATUS CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(5),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
 
// read a vector in case of interrupt from VMEMM or PCIADA
#define PCIVME_READ_VECTOR CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(6),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
 
// access VIC68A registers direct
#define PCIVME_ACCESS_VIC68A CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(7),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
 
// enable or disable interrupts from user space
#define PCIVME_CONTROL_INTERRUPTS CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(9),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
 
// generate a (undivisible) test-and-set instruction
#define PCIVME_TAS CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(10),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
// generate a reset on VME BUS for a dedicated VMEMM interface
#define PCIVME_RESET CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(12),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
 
// set the access parameter for this file (vmemm)
#define PCIVME_SET_ACCESS_PARA CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(13),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
 
// my last usefull control code - change each time you add a ctl_code
#define PCIVME_LAST_CTL_CODE PCIVME_SET_ACCESS_PARA
 
// to make standard entries for not compatible WIN95 call codes
#define PCIVME_INCOMPATIBLE CTL_CODE(\
FILE_DEVICE_UNKNOWN,\
USER_CONTROL_CODE(255),\
METHOD_BUFFERED,\
FILE_ANY_ACCESS)
 
// to get a compatible view to WIN95 driver
#define VPCIVMED_INIT_HARDWARE PCIVME_INIT_HARDWARE
#define VPCIVMED_DEINIT_HARDWARE PCIVME_DEINIT_HARDWARE
#define VPCIVMED_ATTACH_WINDOW PCIVME_INCOMPATIBLE // no compatibility!
#define VPCIVMED_DETACH_WINDOW PCIVME_INCOMPATIBLE // no compatibility!
#define VPCIVMED_GET_STATIC_STATUS PCIVME_GET_STATIC_STATUS
#define VPCIVMED_GET_DYNAMIC_STATUS PCIVME_GET_DYNAMIC_STATUS
#define VPCIVMED_READ_VECTOR PCIVME_READ_VECTOR
#define VPCIVMED_ACCESS_VIC68A PCIVME_ACCESS_VIC68A
#define VPCIVMED_CONTROL_INTERRUPTS PCIVME_CONTROL_INTERRUPTS
#define VPCIVMED_TAS PCIVME_TAS
#define VPCIVMED_GET_PCIADA_STATUS PCIVME_GET_PCIADA_STATUS
#define VPCIVMED_RESET PCIVME_RESET
 
// switches for PCIVME_(DE)INIT_HARDWARE ------------------------
#define LCR (UCHAR)0 // destination is LCR register
#define IFR (UCHAR)1 // destination is VME-Interface register
#define VIC (UCHAR)2 // destination is VIC68A register
#define STOP (UCHAR)255 // this command stops the init machine
 
#define BYTE_ACCESS (UCHAR)1 // write byte wise
#define WORD_ACCESS (UCHAR)2 // word
#define LONG_ACCESS (UCHAR)4 // long
 
// switches for PCIVME_ACCESS_VIC68A --------------------------
#define VIC68A_READ 0 // read only access
#define VIC68A_WRITE 1 // write and read back access
#define VIC68A_OR 2 // read, bitwise 'or' content and read back access
#define VIC68A_AND 3 // read, bitwise 'and' content and read back access
#define VIC68A_WRITE_ONLY 4 // do not read back after write
 
// switches for the PCIVME_RESET ------------------------------
#define VME_RESET_CMD 0 // raise a VME reset only
#define LOCAL_RESET_CMD 1 // raise a local reset only
#define GLOBAL_RESET_CMD 2 // raise a global reset
#define POLL_RESET_CMD 3 // ask if reset is finished
 
#define BOGUSADDRESS 0xFFFFFFFF // compatibilty to WIN95
 
#ifndef PHYSICAL_ADDRESS
#define PHYSICAL_ADDRESS LARGE_INTEGER
#endif
 
//-------------------------------------------------------------------------
// TYPEDEFS
//
typedef struct // one command element to initialize interface or deinitialize
{
UCHAR range; // 0 = lcr, 1 = vme-interface, -1 = stop, default = vme-if
UCHAR type; // 1 = byte access, 2 = word access, 4 = dword access, default byte
USHORT offset; // offset into interface address range for initialisation
ULONG value; // value to initialize
} PCIVME_INIT_ELEMENT;
 
typedef struct
{
ULONG dwInterface; // here dummy 'cause of compatibility to WIN95
PCIVME_INIT_ELEMENT sVie[8]; // at least one zero element must be the last
} PCIVME_INIT_COMMAND;
 
typedef struct
{
ULONG dwInterface; // here dummy 'cause of compatibility to WIN95
UCHAR bAddressModifier; // set the current modifier
UCHAR bAccessType; // set the current access type (1,2,4)
UCHAR bIncrement; // set the current byte increment count
ULONG dwAccessBase; // base address of seek operation (extended modifiers only, else must = 0)
} PCIVME_ACCESS_COMMAND;
 
typedef struct
{
ULONG dwInterface; // here dummy 'cause of compatibility to WIN95
USHORT wRegisterAddress; // address offset of vic68a register
USHORT wAccessMode; // read, write, or, and
UCHAR bContent; // content to write, and, or
} PCIVME_VIC68A_ACTION;
 
// includes static information about driver parameters ------
typedef struct
{
ULONG dwInterface; // here dummy 'cause of compatibility to WIN95
ULONG dwLinkCount; // how often this interface is requested
 
USHORT wNumMemWindows; // aus der aktuellen konfiguration
USHORT wNumIOPorts;
USHORT wNumIRQs;
USHORT wNumDMAs;
USHORT wModuleType; // von der angeschlossenen hardware gelesen
USHORT wFPGAVersion;
USHORT wModuleNumber;
USHORT wWordMode;
 
USHORT wSysControl; // if the associated VMEMM has slot 1 function
USHORT wConnected; // is the VMEMM connected (obsolete sometimes)
PHYSICAL_ADDRESS pvLcr; // physikalische adresse des lcr
PHYSICAL_ADDRESS pvIfr; // physikalische adresse des interfaces ohne vme
 
ULONG dwDriverVersion; // highWord.lowWord
ULONG dwDriverVariant; // show customized variants here
} PCIVME_STATIC_STATUS;
 
typedef struct
{
ULONG dwInterface; // here dummy 'cause of compatibility to WIN95
USHORT wVMEMM_connected; // status: VMEMM is connected and powered
USHORT wVMEMM_enable; // status: VMEMM access is enabled
USHORT wPCIADAIrq; // status: PCIADA timeout IRQ pending
USHORT wVMEMMIrq; // status: VMEMM IRQ pending
} PCIVME_DYNAMIC_STATUS;
 
typedef struct
{
ULONG dwInterface; // here dummy 'cause of compatibility to WIN95
ULONG dwAddress; // tas to address
USHORT wModifier; // VME address modifier for this window
UCHAR bContent; // byte content to store and get back
} PCIVME_TAS_STRUCT;
 
typedef struct
{
ULONG dwInterface; // here dummy 'cause of compatibility to WIN95
USHORT wCommand; // the appropriate reset command
} PCIVME_RESET_COMMAND;
 
typedef struct
{
ULONG dwInterface; // here dummy 'cause of compatibility to WIN95
USHORT wResult;
} PCIVME_RESET_RESULT; // polling result: in progress if (wResult != 0)
 
typedef struct
{
ULONG dwInterface; // here dummy 'cause of compatibility to WIN95..
USHORT wEnable; // a 1 enables the queue filling, a 0 disables
} PCIVME_IRQ_CONTROL;
 
typedef struct // to request vectors from a interface
{
ULONG dwInterface; // here dummy 'cause of compatibility to WIN95..
USHORT wRequestCount; // maximum number of vectors to requests
BOOLEAN bPoll; // no blocking allowed - poll always
} PCIVME_VECTOR_REQUEST;
 
typedef struct // the response to the above request
{
ULONG dwInterface; // here dummy 'cause of compatibility to WIN95..
USHORT wPendingCount; // represents the number of vectors pending
USHORT wCount; // actual delivered count of vectors
BOOLEAN bOverflow; // there was a irq overflow @ this channel
UCHAR bStatusID; // base of following vector array
} PCIVME_VECTOR_RESPONSE;
 
#endif // __PCIVME_H__
/wiener_pcivme/pcivme/SOURCE/pcivme_i.c
0,0 → 1,299
//-------------------------------------------------------------------------
// WINNT driver for PCIVME interface from ARW Elektronik, Germany ---------
// all around irq handling
//
// (c) 1999-2004 ARW Elektronik
//
// this source code is published under GPL (Open Source). You can use, redistrubute and
// modify it unless this header is not modified or deleted. No warranty is given that
// this software will work like expected.
// This product is not authorized for use as critical component in life support systems
// wihout the express written approval of ARW Elektronik Germany.
//
// Please announce changes and hints to ARW Elektronik
//
// $Log: pcivme_i.c,v $
// Revision 1.3 2004/07/24 07:07:26 klaus
// Update copyright to 2004
//
// Revision 1.2 2003/11/15 19:12:50 klaus
// Update copyright to 2003
//
// Revision 1.1.1.1 2003/11/14 23:16:33 klaus
// First put into repository
//
// Revision 1.3 2002/10/27 16:17:48 klaus
// Typing bug fixed caused at log addition
//
// Revision 1.2 2002/10/27 16:11:02 klaus
// Added CVS log into header
//
// what who when
// started AR 01.08.1999
// first release 1.0 AR 17.10.1999
// IoConnectInterrupt, share vector now true AR 04.03.2000
// changed resource allocation caused by WIN2000 AR 08.06.2002
//
//-------------------------------------------------------------------------
// COMMENTS
//
// Each path (file_obj) maintains its own FIFO to hold incoming vector from
// hardware acknowledged interrupts. These FIFOs are always accessible for read
// while the path is open. In case a path enables its interrupts the link to
// its FIFO is included in a list of "interrupt enabled" FIFOs. The opposite
// happens when a path disables its interrupts.
// There are up to MAX_PCIADA lists of "interrupt enabled" FIFOs, each list is
// associated to a PCIADA (pciada).
// Each time a pciada receives a interrupt request the software first checks
// for a bus error interrupt. This kind of requests are directly associated with
// a user initiated access and put forward to the accessor. (Excluding spurious
// interrupts). If the request is no bus error request the vector is pushed
// into all FIFOs queued for this PCIADA.
// After this a DPC call is fired to wake up queued IRPs waiting for a vector.
// The DPC call iterates through the list of FIFOs and looks if a queued IRP
// exists for this path. If so the vector is pulled off the FIFO and the IRP
// is released.
// If a IRP arrives to request a vector the driver checks if there is a vector
// stored in the path associated FIFO. If so the IRP returns immediately with
// the pulled vector from the FIFO. If not the IRP is queued in a PCIADA
// associated queue of pending IRPs.
// When the interrupts for a path are disabled all pending vectors in the FIFO
// associated with this path are still available. But if the FIFO is empty
// request to get the next vector will block.
 
//-------------------------------------------------------------------------
// INCLUDES
//
#include <ntddk.h>
#include <pcivme_drv.h>
#include <pcivme_i.h>
#include <pcivme.h>
#include <pciif.h>
#include <pcivme_fifo.h>
 
//------------------------------------------------------------------------
// DEFINES
//
#ifndef DWORD
#define DWORD ULONG
#endif
 
#ifndef WORD
#define WORD USHORT
#endif
 
//------------------------------------------------------------------------
// GLOBALS
//
 
//------------------------------------------------------------------------
// FUNCTIONS
//
 
//------------------------------------------------------------------------
// determine which interrupt and evaluates vector
//
static UCHAR evaluate_vector(PCIADA *pciada)
{
USHORT wIntCSR = READ_REGISTER_USHORT(pciada->pwIntCSR);
USHORT offset;
USHORT wCntrl = READ_REGISTER_USHORT(pciada->pwCntrl);
 
if (wCntrl & 0x100) // pciada switched on ?
{
if ((wIntCSR & 0x68) == 0x68)
{
// it's the pci interrupt # 2
 
// get current Cntrl - and clear interrupt
wCntrl &= ~0x0100; // disable
WRITE_REGISTER_USHORT(pciada->pwCntrl, wCntrl);
wCntrl |= 0x0100; // enable again
WRITE_REGISTER_USHORT(pciada->pwCntrl, wCntrl);
return 1;
}
 
if ((wIntCSR & 0x45) == 0x45)
{
// it's the interrupt # 1
offset = READ_REGISTER_USHORT(pciada->pwIRQStat);
 
if (offset & 1)
return 0xff & READ_REGISTER_UCHAR((PUCHAR)pciada->pbVector + offset);
}
}
return 0;
}
 
//------------------------------------------------------------------------
// enable and disable of interrupts
//
void globalInterruptEnable(PCIADA *pciada)
{
WRITE_REGISTER_USHORT(pciada->pwIntCSR, ENABLE_PCIADA_IRQS);
}
 
void globalInterruptDisable(PCIADA *pciada)
{
WRITE_REGISTER_USHORT(pciada->pwIntCSR, DISABLE_PCIADA_IRQS);
}
//------------------------------------------------------------------------
// insert the vector in a queue of interrupts (and rescue waiting IRPs)
//
static void InsertInIrqQueues(PCIADA *pciada, UCHAR vector)
{
FIFO_LIST *next;
KIRQL oldIrqlList;
register PLIST_ENTRY pList = &pciada->IrqListList;
 
KdPrint(("InsertInIrqQueues\n"));
// iterate all fifos and insert the vector in each fifo
KeAcquireSpinLock(&pciada->IrqListLock, &oldIrqlList);
while (pList->Flink != &pciada->IrqListList)
{
pList = pList->Flink;
next = CONTAINING_RECORD(pList, FIFO_LIST, entry);
 
KdPrint(("Vector %d pushed\n", vector));
// push the vector into the fifo
PushElement(next->pIrqListHandle, vector);
}
KeReleaseSpinLock(&pciada->IrqListLock, oldIrqlList);
 
// more handling in the deffered procedure call
KeInsertQueueDpc(&pciada->kDPCobj, (PVOID)pciada, (PVOID)&vector);
}
//------------------------------------------------------------------------
// main interrupt handler function
//
BOOLEAN irq_service(PKINTERRUPT Interrupt, PVOID ServiceContext)
{
PCIADA *pciada = (PCIADA *)ServiceContext;
UCHAR vector;
UNREFERENCED_PARAMETER(Interrupt);
vector = evaluate_vector(pciada);
if (!(vector)) return FALSE;
KdPrint(("irq_service: %d\n", vector & 0xff));
 
if ((pciada->pbBusError) && ((vector == 7) || (vector == 1)))
*pciada->pbBusError = TRUE;
else
InsertInIrqQueues(pciada, vector); // insert at top of the queues
 
return TRUE;
}
 
//------------------------------------------------------------------------
// translate interrupt resources for PCIADAs to neutral ones
//
NTSTATUS PCIVMETranslateInterrupts(PDEVICE_OBJECT device_Obj)
{
int i;
NTSTATUS result = STATUS_SUCCESS;
DEVICE_EXT *pDevExt = (DEVICE_EXT*)device_Obj->DeviceExtension;
int nPCIADAs = pDevExt->nPCIADAs;
PCIADA *pciada = (PCIADA *) NULL;
 
KdPrint(("TranslateInterrupt()\n"));
 
for (i = 0; i < nPCIADAs; i++)
{
pciada = &pDevExt->pciada[i];
 
KdPrint(("In - Bus:%d, IrqLine:%d\n", pciada->Bus, pciada->Irql));
 
if (pciada->Irql)
{
pciada->Vector = HalGetInterruptVector(PCIBus, pciada->Bus,
pciada->Irql,
pciada->Vector,
&pciada->Irql, &pciada->Affinity);
}
else
result = STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT;
}
 
KdPrint(("Out - Irql:%d, Vector: %d, Affinity:%d\n", pciada->Irql, pciada->Vector, pciada->Affinity));
 
return result;
}
 
//------------------------------------------------------------------------
// connect service routines to all PCIADA interrupts
//
NTSTATUS PCIVMEConnectInterrupt(PDEVICE_OBJECT device_Obj)
{
int i;
NTSTATUS result = STATUS_SUCCESS;
DEVICE_EXT *pDevExt = (DEVICE_EXT*)device_Obj->DeviceExtension;
int nPCIADAs = pDevExt->nPCIADAs;
PCIADA *pciada;
 
KdPrint(("ConnectInterrupt()\n"));
 
// connect the interrupts to service routines
for (i = 0; i < nPCIADAs; i++)
{
pciada = &pDevExt->pciada[i];
 
pciada->InterruptObject = NULL;
if (pciada->Vector)
result = IoConnectInterrupt(&pciada->InterruptObject,
irq_service,
(PVOID)pciada,
NULL,
pciada->Vector,
pciada->Irql,
pciada->Irql,
LevelSensitive,
TRUE,
pciada->Affinity,
FALSE);
 
KdPrint(("pIrqObj:0x%08x, VirtVect:%d, Irql:%d, hIrql:%d, Aff:0x%08x, Status:0x%08x\n",
pciada->InterruptObject,
pciada->Vector, pciada->Irql, pciada->Irql, pciada->Affinity, result));
 
if (result != STATUS_SUCCESS) break;
}
 
return result;
}
 
//------------------------------------------------------------------------
// dis-connect service routines to all PCIADA interrupts
//
NTSTATUS PCIVMEDisConnectInterrupt(PDEVICE_OBJECT device_Obj)
{
int i;
DEVICE_EXT *pDevExt = (DEVICE_EXT*)device_Obj->DeviceExtension;
int nPCIADAs = pDevExt->nPCIADAs;
PCIADA *pciada;
 
KdPrint(("DisConnectInterrupt()\n"));
 
// dis connect the interrupts to service routines
for (i = 0; i < nPCIADAs; i++)
{
pciada = &pDevExt->pciada[i];
 
KdPrint(("IrqObj:0x%08x\n", pciada->InterruptObject));
 
if (pciada->InterruptObject)
IoDisconnectInterrupt(pciada->InterruptObject);
}
 
return STATUS_SUCCESS;
}
 
 
/wiener_pcivme/pcivme/SOURCE/pcivme_fifo.h
0,0 → 1,46
#ifndef __PCIVME_FIFO_H__
#define __PCIVME_FIFO_H__
 
//-------------------------------------------------------------------------
// WINNT driver for PCIVME interface from ARW Elektronik, Germany ---------
// header for functions for a fast fifo (first in first out) implementation
//
// (c) 1999-2004 ARW Elektronik
//
// this source code is published under GPL (Open Source). You can use, redistrubute and
// modify it unless this header is not modified or deleted. No warranty is given that
// this software will work like expected.
// This product is not authorized for use as critical component in life support systems
// wihout the express written approval of ARW Elektronik Germany.
//
// Please announce changes and hints to ARW Elektronik
//
// $Log: pcivme_fifo.h,v $
// Revision 1.3 2004/07/24 07:07:26 klaus
// Update copyright to 2004
//
// Revision 1.2 2003/11/15 19:12:50 klaus
// Update copyright to 2003
//
// Revision 1.1.1.1 2003/11/14 23:16:33 klaus
// First put into repository
//
// Revision 1.3 2002/10/27 16:17:48 klaus
// Typing bug fixed caused at log addition
//
// Revision 1.2 2002/10/27 16:11:02 klaus
// Added CVS log into header
//
// what who when
// started AR 06.10.99
//
 
NTSTATUS InitializeFIFO(USHORT CountOfElements, PVOID *pHandle);
int PushElement(PVOID Handle, UCHAR bElement);
int PullElement(PVOID Handle, UCHAR *pbElement);
int NumberOfElements(PVOID Handle);
BOOLEAN CheckAndClearOverflow(PVOID Handle);
void DestroyFIFO(PVOID Handle);
 
#endif // __PCIVME_FIFO_H__
/wiener_pcivme/pcivme/SOURCE/Vme.h
0,0 → 1,57
#ifndef __VME_H__
#define __VME_H__
 
//------------------------------------------------------------------------------------------
// vme.h - some constants about VME address modifiers in a more readable kind
//
// (c) 1999-2004 ARW Elektronik
//
// this source code is published under GPL (Open Source). You can use, redistrubute and
// modify it unless this header is not modified or deleted. No warranty is given that
// this software will work like expected.
// This product is not authorized for use as critical component in life support systems
// wihout the express written approval of ARW Elektronik Germany.
//
// Please announce changes and hints to ARW Elektronik
//
//
// $Log: Vme.h,v $
// Revision 1.3 2004/07/24 07:07:26 klaus
// Update copyright to 2004
//
// Revision 1.2 2003/11/15 19:12:51 klaus
// Update copyright to 2003
//
// Revision 1.1.1.1 2003/11/14 23:16:33 klaus
// First put into repository
//
// Revision 1.3 2002/10/27 16:17:48 klaus
// Typing bug fixed caused at log addition
//
// Revision 1.2 2002/10/27 16:11:03 klaus
// Added CVS log into header
//
// what who when
// finished first release to use with the PCIVME interface of ARW AR 22.03.1999
//
 
typedef WORD ADDRESS_MODIFIER;
 
#define Std_Sup_Data (ADDRESS_MODIFIER)0x3d
#define Std_Sup_Prog (ADDRESS_MODIFIER)0x3e
#define Std_NoPriv_Data (ADDRESS_MODIFIER)0x39
#define Std_NoPriv_Prog (ADDRESS_MODIFIER)0x3a
 
#define Short_Sup (ADDRESS_MODIFIER)0x2d
#define Short_NoPriv (ADDRESS_MODIFIER)0x29
 
#define Ext_Sup_Data (ADDRESS_MODIFIER)0x0d
#define Ext_Sup_Prog (ADDRESS_MODIFIER)0x0e
#define Ext_NoPriv_Data (ADDRESS_MODIFIER)0x09
#define Ext_NoPriv_Prog (ADDRESS_MODIFIER)0x0a
 
#endif
 
//-------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------
/wiener_pcivme/pcivme/SOURCE/guid.h
0,0 → 1,6
INTERFACENAME = { /* c4ad1dfa-3e35-4659-bf2b-c83cda6833e1 */
0xc4ad1dfa,
0x3e35,
0x4659,
{0xbf, 0x2b, 0xc8, 0x3c, 0xda, 0x68, 0x33, 0xe1}
};
/wiener_pcivme/pcivme/pcivme.vcxproj.filters
0,0 → 1,26
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="Driver Files">
<UniqueIdentifier>{8E41214B-6785-4CFE-B992-037D68949A14}</UniqueIdentifier>
<Extensions>inf;inv;inx;mof;mc;</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<Inf Include="pcivme.inf">
<Filter>Driver Files</Filter>
</Inf>
</ItemGroup>
</Project>
/wiener_pcivme/pcivme/Win7Release/pcivme.log
0,0 → 1,5
Build started 10.2.2014 10:02:12.
 
Build succeeded.
 
Time Elapsed 00:00:00.01
/wiener_pcivme/pcivme/Win7Release/pcivme.Build.CppClean.log
0,0 → 1,19
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7release\pcivme.inf
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7release\vc120.pdb
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7release\pcivme_v.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7release\pcivme_io.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7release\pcivme_i.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7release\pcivme_fifo.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7release\pcivme_drv.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win7release\pcivme.sys
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win7release\pcivme.pdb
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win7release\pcivme.inf
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7release\stampinf.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7release\stampinf.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7release\stampinf.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7release\pcivme.tlog\cl.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7release\pcivme.tlog\cl.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7release\pcivme.tlog\cl.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7release\pcivme.tlog\link.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7release\pcivme.tlog\link.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7release\pcivme.tlog\link.write.1.tlog
/wiener_pcivme/pcivme/Win8.1Release/pcivme.log
0,0 → 1,5
Build started 10.2.2014 10:02:12.
 
Build succeeded.
 
Time Elapsed 00:00:00.22
/wiener_pcivme/pcivme/Win8.1Release/pcivme.Build.CppClean.log
0,0 → 1,19
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1release\pcivme.inf
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1release\vc120.pdb
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1release\pcivme_v.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1release\pcivme_io.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1release\pcivme_i.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1release\pcivme_fifo.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1release\pcivme_drv.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win8.1release\pcivme.sys
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win8.1release\pcivme.pdb
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win8.1release\pcivme.inf
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1release\stampinf.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1release\stampinf.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1release\stampinf.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1release\pcivme.tlog\cl.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1release\pcivme.tlog\cl.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1release\pcivme.tlog\cl.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1release\pcivme.tlog\link.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1release\pcivme.tlog\link.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1release\pcivme.tlog\link.write.1.tlog
/wiener_pcivme/pcivme/Win8Release/pcivme.log
0,0 → 1,5
Build started 10.2.2014 10:02:12.
 
Build succeeded.
 
Time Elapsed 00:00:00.01
/wiener_pcivme/pcivme/Win8Release/pcivme.Build.CppClean.log
0,0 → 1,19
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8release\pcivme.inf
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8release\vc120.pdb
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8release\pcivme_v.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8release\pcivme_io.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8release\pcivme_i.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8release\pcivme_fifo.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8release\pcivme_drv.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win8release\pcivme.sys
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win8release\pcivme.pdb
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win8release\pcivme.inf
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8release\stampinf.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8release\stampinf.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8release\stampinf.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8release\pcivme.tlog\cl.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8release\pcivme.tlog\cl.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8release\pcivme.tlog\cl.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8release\pcivme.tlog\link.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8release\pcivme.tlog\link.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8release\pcivme.tlog\link.write.1.tlog
/wiener_pcivme/pcivme/pcivme.vcxproj.user
0,0 → 1,4
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
</Project>
/wiener_pcivme/pcivme/Win7Debug/pcivme.log
0,0 → 1,5
Build started 10.2.2014 10:02:12.
 
Build succeeded.
 
Time Elapsed 00:00:00.01
/wiener_pcivme/pcivme/Win7Debug/pcivme.Build.CppClean.log
0,0 → 1,23
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win7debug\pcivme.sys
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7debug\pcivme.inf
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7debug\vc120.pdb
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7debug\pcivme_v.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7debug\pcivme_io.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7debug\pcivme_i.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7debug\pcivme_fifo.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7debug\pcivme_drv.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win7debug\pcivme.pdb
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win7debug\pcivme.cer
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win7debug\pcivme.inf
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7debug\signtool.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7debug\signtool.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7debug\signtool.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7debug\stampinf.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7debug\stampinf.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7debug\stampinf.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7debug\pcivme.tlog\cl.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7debug\pcivme.tlog\cl.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7debug\pcivme.tlog\cl.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7debug\pcivme.tlog\link.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7debug\pcivme.tlog\link.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win7debug\pcivme.tlog\link.write.1.tlog
/wiener_pcivme/pcivme/Win8.1Debug/pcivme.log
0,0 → 1,5
Build started 10.2.2014 10:02:12.
 
Build succeeded.
 
Time Elapsed 00:00:00.01
/wiener_pcivme/pcivme/Win8.1Debug/pcivme.Build.CppClean.log
0,0 → 1,23
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win8.1debug\pcivme.sys
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1debug\pcivme.inf
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1debug\vc120.pdb
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1debug\pcivme_v.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1debug\pcivme_io.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1debug\pcivme_i.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1debug\pcivme_fifo.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1debug\pcivme_drv.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win8.1debug\pcivme.pdb
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win8.1debug\pcivme.cer
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win8.1debug\pcivme.inf
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1debug\signtool.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1debug\signtool.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1debug\signtool.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1debug\stampinf.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1debug\stampinf.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1debug\stampinf.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1debug\pcivme.tlog\cl.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1debug\pcivme.tlog\cl.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1debug\pcivme.tlog\cl.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1debug\pcivme.tlog\link.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1debug\pcivme.tlog\link.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8.1debug\pcivme.tlog\link.write.1.tlog
/wiener_pcivme/pcivme/Win8Debug/pcivme.log
0,0 → 1,5
Build started 10.2.2014 10:02:12.
 
Build succeeded.
 
Time Elapsed 00:00:00.01
/wiener_pcivme/pcivme/Win8Debug/pcivme.Build.CppClean.log
0,0 → 1,23
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win8debug\pcivme.sys
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8debug\pcivme.inf
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8debug\vc120.pdb
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8debug\pcivme_v.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8debug\pcivme_io.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8debug\pcivme_i.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8debug\pcivme_fifo.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8debug\pcivme_drv.obj
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win8debug\pcivme.pdb
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win8debug\pcivme.cer
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\win8debug\pcivme.inf
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8debug\signtool.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8debug\signtool.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8debug\signtool.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8debug\stampinf.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8debug\stampinf.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8debug\stampinf.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8debug\pcivme.tlog\cl.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8debug\pcivme.tlog\cl.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8debug\pcivme.tlog\cl.write.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8debug\pcivme.tlog\link.command.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8debug\pcivme.tlog\link.read.1.tlog
c:\users\f9daq\rok\wienerpciada\pcivme\win2000-xp\driver\pcivme\pcivme\win8debug\pcivme.tlog\link.write.1.tlog
/wiener_pcivme/pcivme/pcivme.vcxproj
0,0 → 1,310
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Win8.1 Debug|Win32">
<Configuration>Win8.1 Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Win8.1 Release|Win32">
<Configuration>Win8.1 Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Win8 Debug|Win32">
<Configuration>Win8 Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Win8 Release|Win32">
<Configuration>Win8 Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Win7 Debug|Win32">
<Configuration>Win7 Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Win7 Release|Win32">
<Configuration>Win7 Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Win8.1 Debug|x64">
<Configuration>Win8.1 Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Win8.1 Release|x64">
<Configuration>Win8.1 Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Win8 Debug|x64">
<Configuration>Win8 Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Win8 Release|x64">
<Configuration>Win8 Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Win7 Debug|x64">
<Configuration>Win7 Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Win7 Release|x64">
<Configuration>Win7 Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}</ProjectGuid>
<TemplateGuid>{1bc93793-694f-48fe-9372-81e2b05556fd}</TemplateGuid>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<MinimumVisualStudioVersion>11.0</MinimumVisualStudioVersion>
<Configuration>Win8.1 Debug</Configuration>
<Platform Condition="'$(Platform)' == ''">Win32</Platform>
<RootNamespace>pcivme</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'" Label="Configuration">
<TargetVersion>WindowsV6.3</TargetVersion>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
<ConfigurationType>Driver</ConfigurationType>
<DriverType>KMDF</DriverType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'" Label="Configuration">
<TargetVersion>WindowsV6.3</TargetVersion>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
<ConfigurationType>Driver</ConfigurationType>
<DriverType>KMDF</DriverType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'" Label="Configuration">
<TargetVersion>Windows8</TargetVersion>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
<ConfigurationType>Driver</ConfigurationType>
<DriverType>KMDF</DriverType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'" Label="Configuration">
<TargetVersion>Windows8</TargetVersion>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
<ConfigurationType>Driver</ConfigurationType>
<DriverType>KMDF</DriverType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'" Label="Configuration">
<TargetVersion>Windows7</TargetVersion>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
<ConfigurationType>Driver</ConfigurationType>
<DriverType>KMDF</DriverType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'" Label="Configuration">
<TargetVersion>Windows7</TargetVersion>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
<ConfigurationType>Driver</ConfigurationType>
<DriverType>KMDF</DriverType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'" Label="Configuration">
<TargetVersion>WindowsV6.3</TargetVersion>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
<ConfigurationType>Driver</ConfigurationType>
<DriverType>KMDF</DriverType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'" Label="Configuration">
<TargetVersion>WindowsV6.3</TargetVersion>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
<ConfigurationType>Driver</ConfigurationType>
<DriverType>KMDF</DriverType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'" Label="Configuration">
<TargetVersion>Windows8</TargetVersion>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
<ConfigurationType>Driver</ConfigurationType>
<DriverType>KMDF</DriverType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'" Label="Configuration">
<TargetVersion>Windows8</TargetVersion>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
<ConfigurationType>Driver</ConfigurationType>
<DriverType>KMDF</DriverType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'" Label="Configuration">
<TargetVersion>Windows7</TargetVersion>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
<ConfigurationType>Driver</ConfigurationType>
<DriverType>KMDF</DriverType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'" Label="Configuration">
<TargetVersion>Windows7</TargetVersion>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset>
<ConfigurationType>Driver</ConfigurationType>
<DriverType>KMDF</DriverType>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
<IncludePath>$(ProjectDir);$(IncludePath);$(ProjectDir)\SOURCE</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
<IncludePath>$(ProjectDir);$(IncludePath);$(ProjectDir)\SOURCE</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
<IncludePath>$(ProjectDir);$(IncludePath);$(ProjectDir)\SOURCE</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
<IncludePath>$(ProjectDir);$(IncludePath);$(ProjectDir)\SOURCE</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
<IncludePath>$(ProjectDir);$(IncludePath);$(ProjectDir)\SOURCE</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
<IncludePath>$(ProjectDir);$(IncludePath);$(ProjectDir)\SOURCE</IncludePath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'">
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'">
<ClCompile>
<WppEnabled>false</WppEnabled>
<WppScanConfigurationData Condition="'%(ClCompile. ScanConfigurationData)' == ''">trace.h</WppScanConfigurationData>
<WppKernelMode>true</WppKernelMode>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'">
<ClCompile>
<WppEnabled>false</WppEnabled>
<WppScanConfigurationData Condition="'%(ClCompile. ScanConfigurationData)' == ''">trace.h</WppScanConfigurationData>
<WppKernelMode>true</WppKernelMode>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'">
<ClCompile>
<WppEnabled>false</WppEnabled>
<WppScanConfigurationData Condition="'%(ClCompile. ScanConfigurationData)' == ''">trace.h</WppScanConfigurationData>
<WppKernelMode>true</WppKernelMode>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'">
<ClCompile>
<WppEnabled>false</WppEnabled>
<WppScanConfigurationData Condition="'%(ClCompile. ScanConfigurationData)' == ''">trace.h</WppScanConfigurationData>
<WppKernelMode>true</WppKernelMode>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'">
<ClCompile>
<WppEnabled>false</WppEnabled>
<WppScanConfigurationData Condition="'%(ClCompile. ScanConfigurationData)' == ''">trace.h</WppScanConfigurationData>
<WppKernelMode>true</WppKernelMode>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'">
<ClCompile>
<WppEnabled>false</WppEnabled>
<WppScanConfigurationData Condition="'%(ClCompile. ScanConfigurationData)' == ''">trace.h</WppScanConfigurationData>
<WppKernelMode>true</WppKernelMode>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'">
<ClCompile>
<WppEnabled>true</WppEnabled>
<WppScanConfigurationData Condition="'%(ClCompile. ScanConfigurationData)' == ''">trace.h</WppScanConfigurationData>
<WppKernelMode>true</WppKernelMode>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'">
<ClCompile>
<WppEnabled>true</WppEnabled>
<WppScanConfigurationData Condition="'%(ClCompile. ScanConfigurationData)' == ''">trace.h</WppScanConfigurationData>
<WppKernelMode>true</WppKernelMode>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'">
<ClCompile>
<WppEnabled>true</WppEnabled>
<WppScanConfigurationData Condition="'%(ClCompile. ScanConfigurationData)' == ''">trace.h</WppScanConfigurationData>
<WppKernelMode>true</WppKernelMode>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'">
<ClCompile>
<WppEnabled>true</WppEnabled>
<WppScanConfigurationData Condition="'%(ClCompile. ScanConfigurationData)' == ''">trace.h</WppScanConfigurationData>
<WppKernelMode>true</WppKernelMode>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'">
<ClCompile>
<WppEnabled>true</WppEnabled>
<WppScanConfigurationData Condition="'%(ClCompile. ScanConfigurationData)' == ''">trace.h</WppScanConfigurationData>
<WppKernelMode>true</WppKernelMode>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'">
<ClCompile>
<WppEnabled>true</WppEnabled>
<WppScanConfigurationData Condition="'%(ClCompile. ScanConfigurationData)' == ''">trace.h</WppScanConfigurationData>
<WppKernelMode>true</WppKernelMode>
</ClCompile>
</ItemDefinitionGroup>
<ItemGroup>
<Inf Include="pcivme.inf" />
</ItemGroup>
<ItemGroup>
<FilesToPackage Include="$(TargetPath)" />
<FilesToPackage Include="@(Inf->'%(CopyOutput)')" Condition="'@(Inf)'!=''" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="SOURCE\guid.h" />
<ClInclude Include="SOURCE\pciif.h" />
<ClInclude Include="SOURCE\pcivme.h" />
<ClInclude Include="SOURCE\pcivme_drv.h" />
<ClInclude Include="SOURCE\pcivme_fifo.h" />
<ClInclude Include="SOURCE\pcivme_i.h" />
<ClInclude Include="SOURCE\pcivme_io.h" />
<ClInclude Include="SOURCE\pcivme_v.h" />
<ClInclude Include="SOURCE\Vic.h" />
<ClInclude Include="SOURCE\Vme.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="SOURCE\pcivme_drv.c" />
<ClCompile Include="SOURCE\pcivme_fifo.c" />
<ClCompile Include="SOURCE\pcivme_i.c" />
<ClCompile Include="SOURCE\pcivme_io.c" />
<ClCompile Include="SOURCE\pcivme_v.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
/wiener_pcivme/pcivme/pcivme.inf
0,0 → 1,97
;
; pcivme.inf
;
 
[Version]
Signature="$WINDOWS NT$"
Provider = %ManufacturerName%
Class = %PCIVME_class_name%
ClassGUID = {c4ad1dfa-3e35-4659-bf2b-c83cda6833e1}
DriverVer = 02/10/2014, 4.0.0.0
 
CatalogFile=pcivme.cat
;DriverVer= ; TODO: set DriverVer in stampinf property pages
 
[DestinationDirs]
DefaultDestDir = 12
 
; ================= Class section =====================
 
[ClassInstall32]
Addreg=SampleClassReg
 
[SampleClassReg]
HKR,,,0,%ClassName%
HKR,,Icon,,-5
 
[SourceDisksNames]
1 = %DiskName%,,,""
 
[SourceDisksFiles]
pcivme.sys = 1,,
 
;*****************************************
; Install Section
;*****************************************
 
[Manufacturer]
%ManufacturerName%=Standard,NT$ARCH$
 
[Standard.NT$ARCH$]
;%pcivme.DeviceDesc%=pcivme_Device, Root\pcivme ; TODO: edit hw-id
%pcivme.DeviceDesc%=pcivme_Device, PCI\VEN_10B5&DEV_9050
%pcivme.DeviceDesc%=pcivme_Device, PCI\VEN_10B5&DEV_9050&SUBSYS_11679050
%pcivme.DeviceDesc%=pcivme_Device, PCI\VEN_10B5&DEV_9050&SUBSYS_11679050&REV_01
%pcivme.DeviceDesc%=pcivme_Device, PCI\VEN_10B5&DEV_9050&SUBSYS_11679050&REV_02
 
[pcivme_Device.NT]
CopyFiles=Drivers_Dir
 
[Drivers_Dir]
pcivme.sys
 
;-------------- Service installation
[pcivme_Device.NT.Services]
AddService = pcivme,%SPSVCINST_ASSOCSERVICE%, pcivme_Service_Inst
 
; -------------- pcivme driver install sections
[pcivme_Service_Inst]
DisplayName = %pcivme.SVCDESC%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 0 ; SERVICE_ERROR_IGNORE
ServiceBinary = %12%\pcivme.sys
LoadOrderGroup = Extended Base
 
;
;--- pcivme_Device Coinstaller installation ------
;
 
[DestinationDirs]
pcivme_Device_CoInstaller_CopyFiles = 11
 
[pcivme_Device.NT.CoInstallers]
AddReg=pcivme_Device_CoInstaller_AddReg
CopyFiles=pcivme_Device_CoInstaller_CopyFiles
 
[pcivme_Device_CoInstaller_AddReg]
HKR,,CoInstallers32,0x00010000, "WdfCoInstaller$KMDFCOINSTALLERVERSION$.dll,WdfCoInstaller"
 
[pcivme_Device_CoInstaller_CopyFiles]
WdfCoInstaller$KMDFCOINSTALLERVERSION$.dll
 
[SourceDisksFiles]
WdfCoInstaller$KMDFCOINSTALLERVERSION$.dll=1 ; make sure the number matches with SourceDisksNames
 
[pcivme_Device.NT.Wdf]
KmdfService = pcivme, pcivme_wdfsect
[pcivme_wdfsect]
KmdfLibraryVersion = $KMDFVERSION$
 
[Strings]
SPSVCINST_ASSOCSERVICE= 0x00000002
ManufacturerName="ARW Elektronik, Germany" ; TODO: add ManufacturerName
ClassName="ARW BUS Interfaces" ; TODO: edit ClassName
DiskName = "pcivme Installation Disk"
pcivme.DeviceDesc = "pcivme Device"
pcivme.SVCDESC = "pcivme Service"
/wiener_pcivme/pcivme.sdf
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/wiener_pcivme/pcivme.sln
0,0 → 1,105

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.30110.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pcivme", "pcivme\pcivme.vcxproj", "{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pcivme Package", "pcivme Package\pcivme Package.vcxproj", "{48C072A6-A36E-4090-B208-F0084AC06272}"
ProjectSection(ProjectDependencies) = postProject
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE} = {2AC3560D-0575-4214-A7AA-04F7A8DE84BE}
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Win7 Debug|Win32 = Win7 Debug|Win32
Win7 Debug|x64 = Win7 Debug|x64
Win7 Release|Win32 = Win7 Release|Win32
Win7 Release|x64 = Win7 Release|x64
Win8 Debug|Win32 = Win8 Debug|Win32
Win8 Debug|x64 = Win8 Debug|x64
Win8 Release|Win32 = Win8 Release|Win32
Win8 Release|x64 = Win8 Release|x64
Win8.1 Debug|Win32 = Win8.1 Debug|Win32
Win8.1 Debug|x64 = Win8.1 Debug|x64
Win8.1 Release|Win32 = Win8.1 Release|Win32
Win8.1 Release|x64 = Win8.1 Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win7 Debug|x64.Build.0 = Win7 Debug|x64
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win7 Release|Win32.Build.0 = Win7 Release|Win32
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win7 Release|x64.ActiveCfg = Win7 Release|x64
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win7 Release|x64.Build.0 = Win7 Release|x64
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win7 Release|x64.Deploy.0 = Win7 Release|x64
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win8 Debug|x64.Build.0 = Win8 Debug|x64
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win8 Release|Win32.Build.0 = Win8 Release|Win32
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win8 Release|x64.ActiveCfg = Win8 Release|x64
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win8 Release|x64.Build.0 = Win8 Release|x64
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win8 Release|x64.Deploy.0 = Win8 Release|x64
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64
{2AC3560D-0575-4214-A7AA-04F7A8DE84BE}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64
{48C072A6-A36E-4090-B208-F0084AC06272}.Win7 Debug|Win32.ActiveCfg = Win7 Debug|Win32
{48C072A6-A36E-4090-B208-F0084AC06272}.Win7 Debug|Win32.Build.0 = Win7 Debug|Win32
{48C072A6-A36E-4090-B208-F0084AC06272}.Win7 Debug|Win32.Deploy.0 = Win7 Debug|Win32
{48C072A6-A36E-4090-B208-F0084AC06272}.Win7 Debug|x64.ActiveCfg = Win7 Debug|x64
{48C072A6-A36E-4090-B208-F0084AC06272}.Win7 Debug|x64.Build.0 = Win7 Debug|x64
{48C072A6-A36E-4090-B208-F0084AC06272}.Win7 Debug|x64.Deploy.0 = Win7 Debug|x64
{48C072A6-A36E-4090-B208-F0084AC06272}.Win7 Release|Win32.ActiveCfg = Win7 Release|Win32
{48C072A6-A36E-4090-B208-F0084AC06272}.Win7 Release|Win32.Build.0 = Win7 Release|Win32
{48C072A6-A36E-4090-B208-F0084AC06272}.Win7 Release|Win32.Deploy.0 = Win7 Release|Win32
{48C072A6-A36E-4090-B208-F0084AC06272}.Win7 Release|x64.ActiveCfg = Win7 Release|x64
{48C072A6-A36E-4090-B208-F0084AC06272}.Win7 Release|x64.Build.0 = Win7 Release|x64
{48C072A6-A36E-4090-B208-F0084AC06272}.Win7 Release|x64.Deploy.0 = Win7 Release|x64
{48C072A6-A36E-4090-B208-F0084AC06272}.Win8 Debug|Win32.ActiveCfg = Win8 Debug|Win32
{48C072A6-A36E-4090-B208-F0084AC06272}.Win8 Debug|Win32.Build.0 = Win8 Debug|Win32
{48C072A6-A36E-4090-B208-F0084AC06272}.Win8 Debug|Win32.Deploy.0 = Win8 Debug|Win32
{48C072A6-A36E-4090-B208-F0084AC06272}.Win8 Debug|x64.ActiveCfg = Win8 Debug|x64
{48C072A6-A36E-4090-B208-F0084AC06272}.Win8 Debug|x64.Build.0 = Win8 Debug|x64
{48C072A6-A36E-4090-B208-F0084AC06272}.Win8 Debug|x64.Deploy.0 = Win8 Debug|x64
{48C072A6-A36E-4090-B208-F0084AC06272}.Win8 Release|Win32.ActiveCfg = Win8 Release|Win32
{48C072A6-A36E-4090-B208-F0084AC06272}.Win8 Release|Win32.Build.0 = Win8 Release|Win32
{48C072A6-A36E-4090-B208-F0084AC06272}.Win8 Release|Win32.Deploy.0 = Win8 Release|Win32
{48C072A6-A36E-4090-B208-F0084AC06272}.Win8 Release|x64.ActiveCfg = Win8 Release|x64
{48C072A6-A36E-4090-B208-F0084AC06272}.Win8 Release|x64.Build.0 = Win8 Release|x64
{48C072A6-A36E-4090-B208-F0084AC06272}.Win8 Release|x64.Deploy.0 = Win8 Release|x64
{48C072A6-A36E-4090-B208-F0084AC06272}.Win8.1 Debug|Win32.ActiveCfg = Win8.1 Debug|Win32
{48C072A6-A36E-4090-B208-F0084AC06272}.Win8.1 Debug|Win32.Build.0 = Win8.1 Debug|Win32
{48C072A6-A36E-4090-B208-F0084AC06272}.Win8.1 Debug|Win32.Deploy.0 = Win8.1 Debug|Win32
{48C072A6-A36E-4090-B208-F0084AC06272}.Win8.1 Debug|x64.ActiveCfg = Win8.1 Debug|x64
{48C072A6-A36E-4090-B208-F0084AC06272}.Win8.1 Debug|x64.Build.0 = Win8.1 Debug|x64
{48C072A6-A36E-4090-B208-F0084AC06272}.Win8.1 Debug|x64.Deploy.0 = Win8.1 Debug|x64
{48C072A6-A36E-4090-B208-F0084AC06272}.Win8.1 Release|Win32.ActiveCfg = Win8.1 Release|Win32
{48C072A6-A36E-4090-B208-F0084AC06272}.Win8.1 Release|Win32.Build.0 = Win8.1 Release|Win32
{48C072A6-A36E-4090-B208-F0084AC06272}.Win8.1 Release|Win32.Deploy.0 = Win8.1 Release|Win32
{48C072A6-A36E-4090-B208-F0084AC06272}.Win8.1 Release|x64.ActiveCfg = Win8.1 Release|x64
{48C072A6-A36E-4090-B208-F0084AC06272}.Win8.1 Release|x64.Build.0 = Win8.1 Release|x64
{48C072A6-A36E-4090-B208-F0084AC06272}.Win8.1 Release|x64.Deploy.0 = Win8.1 Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal