| /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 |